Kako da otvorim datoteku iz kernel mode upravljački program uređaja i kako iz nepismen u datoteku

Informacije o Microsoft interne podrške

BUBO #: 10485 (održavanje sadržaja)

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:

Potrebna vam je dodatna pomoć?

Unapredite veštine
Istražite obuku
Prvi nabavite nove funkcije
Pridružite se Microsoft insajdere

Da li su vam ove informacije koristile?

Hvala vam na povratnim informacijama!

Hvala za povratne informacije! Izgleda da će biti od pomoći ako vas povežemo sa našim agentima Office podrške.

×