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:

http://www.microsoft.com/whdc/devtools/ddk/default.mspx

Da li vam je potrebna dodatna pomoć?

Želite još opcija?

Istražite pogodnosti pretplate, pregledajte kurseve za obuku, saznajte kako da obezbedite uređaj i još mnogo toga.

Zajednice vam pomažu da postavljate pitanja i odgovarate na pitanja, dajete povratne informacije i čujete mišljenje od stručnjaka sa bogatim znanjem.