UVOD
Ovaj članak opisuje kako da otvorite datoteku diska iz upravljačkog programa za jezgreni način rada uređaj i kako da pročita ili pisati u datoteku.
Više informacija
Pogledajte datoteku po imenu objekta
Zaštićeni režim upravljačke programe uređaja pogledajte datoteku po imenu objekta. Ovo se zove \DosDevices uz punu putanju datoteke. Na primer, objekat C:\Windows\Example.txt datoteku zove \DosDevices\C:\Windows\Example.txt. Onda ime objekta je uhvacena u na OBJECT_ATTRIBUTES strukturu sa pozivom funkcije InitializeObjectAttributes . Napomena Ako upravljački program uređaja, pun je rano \DosDevices prostor za ime možda ne još postoji. Stoga, \DosDevices prostor za ime nepristupačan da upravljački program jer je izložen nema oznaku disk jedinice. Jedini deo datotečni sustav koji se sigurno dostupna je \SystemRoot prostor. \SystemRoot prostor je mapiran u fasciklu gde je instaliran sistem za operaciju. Na primer, ova fascikla C:\Windows ili da D:\Winnt.The prati primer koda ilustruje kako da se odnose na datoteke po imenu objekta.
UNICODE_STRING uniName; OBJECT_ATTRIBUTES objAttr; RtlInitUnicodeString(&uniName, L"\\DosDevices\\C:\\WINDOWS\\example.txt"); // or L"\\SystemRoot\\example.txt" InitializeObjectAttributes(&objAttr, &uniName, OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, NULL, NULL);
Nabavite regulator datoteke
Da biste nabavili regulator datoteke, mozete na OBJECT_ATTRIBUTES strukturu za ZwCreateFile funkciju. DesiredAccess parametar može biti postavljeno na GENERIC_READ, GENERIC_WRITEili GENERIC_ALL, zavisno od toga šta želite da radim. Ako je parametar CreateOptions postavite na FILE_SYNCHRONOUS_IO_NONALERT ili FILE_SYNCHRONOUS_IO_ALERT, sistem datoteka beleћi Trenutna pozicija u datoteci pomak. Zbog toga, uzastopno možete da čitate ili pišete u datoteci kasnije. Pored toga, možete pristupiti datoteci na slučajni lokaciji. Sledeći primer koda ilustruje kako nabaviti regulator datoteke.
HANDLE handle; NTSTATUS ntstatus; IO_STATUS_BLOCK ioStatusBlock; // Do not try to perform any file operations at higher IRQL levels. // Instead, you may use a work item or a system worker thread to perform file operations. if(KeGetCurrentIrql() != PASSIVE_LEVEL) return STATUS_INVALID_DEVICE_STATE; ntstatus = ZwCreateFile(&handle, GENERIC_WRITE, &objAttr, &ioStatusBlock, NULL, FILE_ATTRIBUTE_NORMAL, 0, FILE_OVERWRITE_IF, FILE_SYNCHRONOUS_IO_NONALERT, NULL, 0);
Čita iz ili u datoteku
Odmah zovi ZwReadFile funkciju ili funkciju ZwWriteFile . Kada završite menjanje datoteke, zatvorite regulator pomoću funkcije ZwClose . Sledeći primer koda ilustruje kako pisati u datoteku.
#define BUFFER_SIZE 30 CHAR buffer[BUFFER_SIZE]; size_t cb; if(NT_SUCCESS(ntstatus)) { ntstatus = RtlStringCbPrintfA(buffer, sizeof(buffer), "This is %d test\r\n", 0x0); if(NT_SUCCESS(ntstatus)) { ntstatus = RtlStringCbLengthA(buffer, sizeof(buffer), &cb); if(NT_SUCCESS(ntstatus)) { ntstatus = ZwWriteFile(handle, NULL, NULL, NULL, &ioStatusBlock, buffer, cb, NULL, NULL); } } ZwClose(handle); }
Sledeći primer koda ilustruje kako čitati iz datoteke.
LARGE_INTEGER byteOffset; ntstatus = ZwCreateFile(&handle, GENERIC_READ, &objAttr, &ioStatusBlock, NULL, FILE_ATTRIBUTE_NORMAL, 0, FILE_OPEN, FILE_SYNCHRONOUS_IO_NONALERT, NULL, 0); if(NT_SUCCESS(ntstatus)) { byteOffset.LowPart = byteOffset.HighPart = 0; ntstatus = ZwReadFile(handle, NULL, NULL, NULL, &ioStatusBlock, buffer, BUFFER_SIZE, &byteOffset, NULL); if(NT_SUCCESS(ntstatus)) { buffer[BUFFER_SIZE-1] = '\0'; DbgPrint("%s\n", buffer); } ZwClose(handle); }
Reference
Za više informacija o tome kako da koristite datoteke u upravljački program, pogledajte „Pomoću datoteke u A upravljački program” sekcija u Kit.For razvoja upravljačkog programa za Windows više informacija o Windows komplet upravljačkih programa razvoja, na Microsoftovu Web-mjestu: