Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
198
Добавлен:
20.02.2016
Размер:
75.78 Кб
Скачать

6. Работа с файлами на уровне драйвера

Описатель файла (HANDLE) имеет смысл только в контексте того адресного пространства, в котором он был создан. В нашем случае – нельзя вначале открыть файл, затем переключить адресное пространство с помощьюKeAttachProcess, а затем что-то в этот файл записать -

создание либо открытие файла (см. флаги в ZwCreateFile):

HANDLE MyCreateFile(WCHAR *fullfname)

{

UNICODE_STRING FullFileName;

OBJECT_ATTRIBUTES ObjectAttributes;

NTSTATUS ntStatus;

IO_STATUS_BLOCK IoStatus;

HANDLE NtFileHandle;

RtlInitUnicodeString(&FullFileName, fullfname);

InitializeObjectAttributes ( &ObjectAttributes,

&FullFileName,

OBJ_CASE_INSENSITIVE,

NULL,

NULL );

DbgPrint("DRV: opening file...\n");

ntStatus = ZwCreateFile( &NtFileHandle,

SYNCHRONIZE|GENERIC_WRITE, // либо SYNCHRONIZE|FILE_APPEND_DATA

&ObjectAttributes,

&IoStatus,

NULL, // alloc size = none

FILE_ATTRIBUTE_NORMAL,

FILE_SHARE_READ,

FILE_OVERWRITE_IF,

FILE_WRITE_THROUGH|FILE_SYNCHRONOUS_IO_NONALERT,

NULL, // eabuffer

0 ); // ealength

DbgPrint("DRV: create file trace.bin with status %lx\n", ntStatus);

returnNtFileHandle;

}

Запись в файл (чтение – по аналогии ZwReadFile):

void save(HANDLE NtFileHandle, void *buf, ULONG bsize)

{

NTSTATUS ntStatus;

IO_STATUS_BLOCK IoStatus;

DbgPrint("DRV: writing...\n");

ntStatus = ZwWriteFile( NtFileHandle,

NULL,

NULL,

NULL,

&IoStatus,

buf,

bsize,

NULL,

NULL );

DbgPrint("DRV: write file with status %lx\n", ntStatus);

}

Закрытие файла:

ZwClose(NtFileHandle);

9

Соседние файлы в папке Лабы по драйверам