Я пробовал, че то не получилось, не помню че за ошибки были.....
Пример
NTSTATUS status;
UNICODE_STRING fullFileName;
HANDLE fileHandle;
IO_STATUS_BLOCK iostatus;
OBJECT_ATTRIBUTES oa;
RtlInitUnicodeString( &fullFileName,
L"\\??\\C:\\Example\\testfile.txt");
InitializeObjectAttributes( &oa,
&fullFileName, OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,
NULL,
NULL );
status = ZwCreateFile ( &fileHandle,
GENERIC_WRITE | SYNCHRONIZE,
&oa,
&iostatus,
0, // alloc size = none
FILE_ATTRIBUTE_NORMAL,
FILE_SHARE_WRITE,
FILE_OPEN_IF,
FILE_SYNCHRONOUS_IO_NONALERT,
NULL,
0);
// Здесь:
// GENERIC_WRITE равно STANDARD(0x40000000L)
//
// FILE_GENERIC_WRITE равно STANDARD_RIGHTS_WRITE|FILE_WRITE_DATA |
// FILE_WRITE_ATTRIBUTES | FILE_WRITE_EA | FILE_APPEND_DATA |
// SYNCHRONIZE, что можно увидеть в заголовочном файле winnt.h
if( NT_SUCCESS(status))
{
// Строка для записи в файл
char myString[100]="string : test write!\r\n";
// Структура, которая поможет определить длину файла:
FILE_STANDARD_INFORMATION fileInfo;
status = // Получаем информацию о файле
ZwQueryInformationFile( fileHandle,
&iostatus,
&fileInfo,
sizeof(FILE_STANDARD_INFORMATION),
FileStandardInformation
);
ULONG len = strlen(myString);
if( NT_SUCCESS(status) )
{
LARGE_INTEGER ByteOffset = fileInfo.EndOfFile;
status = ZwWriteFile(fileHandle,
NULL,
NULL,
NULL,
&iostatus,
myString, len, // Записываемая строка
&ByteOffset, // a если NULL? см. ниже
NULL);
if( !NT_SUCCESS(status) || iostatus.Information != len )
{
DbgPrint("Error on writing. Status = %x.", status);
}
}
ZwClose(fileHandle);
break;
}
==============================================================
NTSTATUS ZwCreateFile IRQL == PASSIVE_LEVEL
Параметры Предоставляет доступ к системным ресурсам (в том числе файлам) в режиме ядра
OUT PHANDLE pHandle Указатель на переменную, куда следует поместить дескриптор открытого объекта (файла, подраздела реестра и т.п.)
IN ACCESS_MASK DesiredAccess Характеристика доступа к объекту. Для файлов вполне приемлемы значения GENERIC_READ или GENERIC_WRITE, которые представляют сложные комбинации из более простых масок доступа (типа FILE_APPEND_DATA и т.п.)
IN POBJECT_ATTRIBUTES pObjAttributes Указатель на заполненную вызывающим кодом структуру данных, которая описывает имя, местоположение и некоторые другие характеристики открываемого объекта (см. ниже)
OUT PIO_STATUS_BLOCK
pIOStatus Указатель на буфер, в котором будет размещена информация об открытом объекте в формате структуры IO_STATUS_BLOCK
IN PLARGE_INTEGER
AllocationSize OPTIONAL Начальный размер файла в байтах. Ненулевое значение принимается во внимание только при создании и перезаписи файла
IN ULONG FileAttributes Атрибуты открываемого файла. Типовым является значение FILE_ATTRIBUTE_NORMAL
IN ULONG SharedAccessFlags Описывает, разрешен ли совместный доступ, например, FILE_SHARE_READ — для чтения
IN ULONG CreateDispositionFlags Способ открытия файла, например, FILE_OPEN_IF — если не существует, создать
IN ULONG CreateOptions Комбинация флагов создания, например, FILE_SYNCHRONOUS_IO_NONALERT — все операции над файлом выполняются как синхронные (DesiredAccess должен включать флаг SYNCHRONIZE)
IN PVOID EaBuffer OPTIONAL Для драйверов устройств и драйверов средних слоев следует указывать NULL
IN ULONG EaLength Для драйверов устройств и драйверов средних слоев следует указывать 0
Возвращаемое значение STATUS_SUCCESS или код ошибки (несколько более подробную информацию можно найти в структуре IO_STATUS_BLOCK)
хм... должно работать