не могу создать папку, все перечитал все что мог, выпадает ошибка доступа Код (Text): RtlInitUnicodeString (&TempUS, L"\\??\\C:\\MFolder"); InitializeObjectAttributes( &DirObjectAttributes, &TempUS, OBJ_CASE_INSENSITIVE, NULL, NULL); rc2 = pNtCreateFile(&hDir, GENERIC_READ|GENERIC_WRITE|FILE_LIST_DIRECTORY, &DirObjectAttributes, &stb, 0, FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_CREATE, FILE_DIRECTORY_FILE, 0, 0); в чем моя проблема кроме рук?=)
Во-первых, что есть "ошибка доступа"? Во-вторых, какой статус возвращается если вообще возвращается? И что такое pNtCreateFile, откуда это?
Этот код, часть перехваченной NtCreateFile, а pNtCreateFile - сохраненный оригинальный обработчик. и сразу вопрос, для мониторинга обращения к файлам, какая из функций нужна NtCreateFile, или NtOpenFile. А ошибка - "Неверная попытка доступа к адресу памяти" Код (Text): NTSTATUS __stdcall MyNtCreateFile( __out PHANDLE FileHandle, __in ACCESS_MASK DesiredAccess, __in POBJECT_ATTRIBUTES ObjectAttributes, __out PIO_STATUS_BLOCK IoStatusBlock, __in_opt PLARGE_INTEGER AllocationSize, __in ULONG FileAttributes, __in ULONG ShareAccess, __in ULONG CreateDisposition, __in ULONG CreateOptions, __in PVOID EaBuffer, __in ULONG EaLength ) { NTSTATUS rc,rc2; HANDLE hDir; OBJECT_ATTRIBUTES DirObjectAttributes; UNICODE_STRING TempUS; IO_STATUS_BLOCK stb; rc = pNtCreateFile(FileHandle,DesiredAccess,ObjectAttributes,IoStatusBlock,AllocationSize,FileAttributes,ShareAccess,CreateDisposition,CreateOptions,EaBuffer,EaLength); if (IsGoodFormat(ObjectAttributes->ObjectName) == TRUE) { RtlInitUnicodeString (&TempUS, L"\\??\\C:\\MFolder"); InitializeObjectAttributes( &DirObjectAttributes, &TempUS, OBJ_CASE_INSENSITIVE, NULL, NULL); rc2 = pNtCreateFile(&hDir, GENERIC_READ|GENERIC_WRITE|FILE_LIST_DIRECTORY, &DirObjectAttributes, &stb, 0, FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_CREATE, FILE_DIRECTORY_FILE, 0, 0); DbgPrint("rc = 0x%X\n", rc2); DbgPrint("stb.Information = 0x%X\n", stb.Information); } return rc; }
эта функция для меня сейчас слишком.. мне надо при открытии файлов файлы определенных типов копировать в папку. вот какую из функций взять? и где ошибка?
Вот какого хрена из тебя всё клещами тянуть надо? Что было бы с моими проектами, если бы я по каждому долбанному поводу садился как припадошный посреди комнаты, хватался за голову и, раскачиваясь, повторял "где ошибка, где ошибка..."? Ещё раз дашь 10% ответа вместо 100% - обижусь и уйду. Надоело. Что такое "Неверная попытка доступа к адресу памяти"? Это код статуса в rc2? Или это код исключения, которое выбрасывается на этой строчке? Напиши точно, какой код статуса (шестнадцатеричное значение!) возвращает второй вызов. Во-вторых, что это такое - pNtCreateFile, откуда этот адрес? Из таблицы сервисов? С ним точно всё в порядке? Это вообще драйвер у тебя или режим пользователя? По поводу какая функция, перехватывать нужно обе, и NtCreateFile и NtOpenFile. Во избежание дальнейших проблем настоятельно рекомендую перейти, пока не поздно, на файловые (мини-)фильтры.
Это часть кода драйвера. я в таблице сервисов заменил адрес обработчика NtCreateFile, и сохранил старое значение в рNtCreateFile. Поставленый хук я проверил, он работает. Потом пока тестировал один раз вернул функцией не rc, а rc2 и оттуда узнал текст ошибки. rc = 0xC0000005 stb.Information = 0x0 вот такой код ошибки. stb Это соответственно io_status_block
Замени второй вызов на IoCreateFile() и всё будет работать, Nt-сервисы в таких случаях звать нельзя напрямую.
Да, забыл совсем, в IoCreateFile() в этом случае нужно указать флаг IO_NO_PARAMETER_CHECKING, иначе опять же не будет работать.
только что проверил, ни рекурсии, ни зависаний, нет проблем. Папка создалась, все нормально. Какой функцией можно узнать размер файла, из ring 0? GetFileSize естественно не сработал=(
Да ни хрена ты реально не проверил. Это временное явление ) Парень, ты сам всё знаешь и в советах не нуждаешься. Свободен. GetFileSize() у него, каково, а? Жжошь!