Kako otvoriti datoteku s jezgreni način rada upravljački program za uređaj i kako čitanja ili pisanja u datoteku

UVOD

Ovaj članak opisuje kako otvoriti datoteku disk iz upravljački program za jezgreni način rada uređaj i kako čitanja ili pisanja u datoteku.

Dodatne informacije

Upućuje na datoteku prema njezinu nazivu objekta

Upravljački programi uređaja u jezgrenom načinu rada potražite datoteku prema njezinu nazivu objekta. Ovaj naziv je \DosDevices s puni put datoteke. Na primjer, naziv objekta C:\Windows\Example.txt datoteka je \DosDevices\C:\Windows\Example.txt. Zatim je naziv objekta encapsulated u OBJECT_ATTRIBUTES strukturu po pozivanje funkcije InitializeObjectAttributes . Napomena Ako upravljački program uređaja je ranije učitan, naziva \DosDevices možda još ne postoji. Stoga, \DosDevices prostora naziva nije dostupan upravljački program uređaja jer izložen nema slovo pogona. Samo dio datotečni sustav koji se zajamčeno dostupna je u prostoru naziva \SystemRoot . \SystemRoot prostor naziva mapirati u mapu u kojoj je instaliran sustav operaciju. Ako, na primjer, ova mapa možda C:\Windows ili D:\Winnt.The sljedeći primjer koda ilustrira kako pozvati datoteku prema njezinu nazivu 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 pokazivač datoteke

Da biste nabavili pokazivač datoteke, možete proslijediti OBJECT_ATTRIBUTES strukturu za funkciju ZwCreateFile . Parametar DesiredAccess možete postaviti na GENERIC_READ, GENERIC_WRITEili GENERIC_ALL, ovisno o tome što želite učiniti. Ako postavite parametar CreateOptionsFILE_SYNCHRONOUS_IO_NONALERT ili FILE_SYNCHRONOUS_IO_ALERT, datotečni sustav evidentira pomak trenutnog položaja datoteke. Stoga možete slijedno čitanje ili pisanje u datoteku kasnije. Uz to, možete pristupiti datoteci slučajni lokaciji. Sljedeći primjer koda prikazuje kako nabaviti pokazivač 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);

Čitanje iz ili pisanje u datoteku

Sada možete nazvati funkcija ZwReadFile ili funkcija ZwWriteFile . Kada završite s izmjenom datoteke, zatvorite držač korištenjem funkcije ZwClose . Sljedeći primjer koda prikazuje 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);    }

Sljedeći primjer koda prikazuje 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

Dodatne informacije o korištenju datoteka upravljačkog programa potražite "Pomoću datoteke u A upravljački program" sekcije razvoj Kit.For upravljački program Windows više o razvojnom paketu upravljačkih programa Windows, posjetite sljedeće Microsoftovo Web-mjesto:

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

Potrebna vam je dodatna pomoć?

Proširite svoje vještine
Istražite osposobljavanje
Prvi koristite nove značajke
Pridružite se Microsoft Insidere

Jesu li ove informacije bile korisne?

Hvala vam na povratnim informacijama!

Hvala vam na povratnim informacijama! Čini se da bi vam pomoglo kad bismo vas povezali s nekim od naših agenata podrške za Office.

×