При записи ы файл столкнулся с ошибкой C000000D - Bad Argument, но я в упор не вижу где там ошибка=( откройте глаза Код (Text): NTSTATUS rc,rc2 = NULL; HANDLE hDir,hTempFile; OBJECT_ATTRIBUTES DirObjectAttributes, FileAttrib; UNICODE_STRING TempUS; IO_STATUS_BLOCK stb, ISBlock, Iostb; PVOID lpBuffer; PULONG BytesRead; UNICODE_STRING usFileName; WCHAR* TempString; WCHAR FolderName [200]=L"\\??\\C:\\MFolder"; FILE_STANDARD_INFORMATION FileInfo; IO_STATUS_BLOCK IoStat; NTSTATUS Status; rc = pNtCreateFile(FileHandle,DesiredAccess,ObjectAttributes,IoStatusBlock,AllocationSize,FileAttributes|FILE_SHARE_READ|FILE_SHARE_WRITE,ShareAccess,CreateDisposition,CreateOptions,EaBuffer,EaLength); if (IsGoodFormat(ObjectAttributes->ObjectName) == TRUE) { RtlInitUnicodeString (&TempUS, FolderName); InitializeObjectAttributes( &DirObjectAttributes, &TempUS, OBJ_CASE_INSENSITIVE, NULL, NULL); rc2 = IoCreateFile(&hDir, GENERIC_READ|GENERIC_WRITE|FILE_LIST_DIRECTORY|FILE_TRAVERSE, &DirObjectAttributes, &stb, 0, FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_CREATE, FILE_DIRECTORY_FILE, 0, 0,CreateFileTypeNone, NULL, IO_NO_PARAMETER_CHECKING); if (rc2==STATUS_SUCCESS) { ZwClose(hDir);//????????? } DbgPrint("%S\n",ObjectAttributes->ObjectName->Buffer); Status = ZwQueryInformationFile(*FileHandle, &IoStat, &FileInfo, sizeof(FILE_STANDARD_INFORMATION), FileStandardInformation); if (!NT_SUCCESS(Status)) { DbgPrint("File Information unsuccess\n"); //ZwClose(*FileHandle); return Status; } DbgPrint("File Information success\n"); lpBuffer = ExAllocatePool(NonPagedPool, FileInfo.EndOfFile.LowPart); if (!lpBuffer) { DbgPrint("ExAllocatePool ERROR\n"); //ZwClose(*hTempFile); return STATUS_NO_MEMORY; } DbgPrint("PoolSize = %d\n", FileInfo.EndOfFile.LowPart); DbgPrint("Pool Allocated\n"); Status = ZwReadFile(*FileHandle, 0, NULL, NULL, &IoStat, lpBuffer, FileInfo.EndOfFile.LowPart, NULL, NULL); if (!NT_SUCCESS(Status)) { DbgPrint("File Read ERROR\n"); ExFreePool(lpBuffer); //ZwClose(*FileHandle); return Status; } DbgPrint("File Readed\n"); TempString = wcsrchr(ObjectAttributes->ObjectName->Buffer,L'\\'); if (TempString!=NULL) { TempString++; DbgPrint("TempString = %S\n",TempString); wcscat(FolderName,"\\"); wcscat(FolderName,TempString); DbgPrint("FolderName = %S\n",FolderName); RtlInitUnicodeString(&usFileName, FolderName); InitializeObjectAttributes(&FileAttrib, &usFileName,OBJ_CASE_INSENSITIVE, NULL, NULL); DbgPrint("Object Attirutes Normal\n"); DbgPrint("usFileName = %S\n", usFileName.Buffer); rc2 = IoCreateFile(&hTempFile, GENERIC_ALL, &FileAttrib, &ISBlock, NULL, FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_OVERWRITE_IF, FILE_NON_DIRECTORY_FILE, NULL, 0,CreateFileTypeNone, NULL, IO_NO_PARAMETER_CHECKING); if (rc2 ==STATUS_SUCCESS) { DbgPrint("File Created\n"); rc2 = ZwWriteFile(hTempFile, NULL, NULL, NULL, &Iostb,lpBuffer,FileInfo.EndOfFile.LowPart,NULL,NULL); if (rc2 !=STATUS_SUCCESS) { DbgPrint("ZwWriteFile rc2 = %X\n",rc2); //C000000D DbgPrint("ZwWriteFile ISBlock.Status = %X\n",Iostb.Status); //ISBlock.Status = E15D2FB8 } ZwClose(hTempFile); } else { DbgPrint("rc2 = %X\n",rc2); //C000003B DbgPrint("ISBlock.Status = %X\n",ISBlock.Status); //ISBlock.Status = 68 DbgPrint("IoCreateFile Error\n"); } } ExFreePool(lpBuffer); } return rc;
Эта код перехваченной NtCreateFile, pNtCreateFile - старый обработчик из sst. Функция фильтруя файлы по некоторой маске сбрасывает их в папку. Для этого определяется размер файла, он считывается в буфер, создается в этой папке файл с таким же именем, и туда надо записать содержимое буфера, но этого не происходит. ZwWriteFile возвращает ошибку c000000d
вот такой код точно работает Код (Text): NTSTATUS Status; HANDLE TestFile; OBJECT_ATTRIBUTES ObjAttr; IO_STATUS_BLOCK IoStatus; UNICODE_STRING TestName; RtlInitUnicodeString(&TestName, L"\\??\\D:\\MaedByThread.file"); InitializeObjectAttributes(&ObjAttr, &TestName, OBJ_CASE_INSENSITIVE, 0, NULL); Status = NtCreateFile(&TestFile, FILE_WRITE_DATA + SYNCHRONIZE, &ObjAttr, &IoStatus, NULL, FILE_ATTRIBUTE_NORMAL, FILE_SHARE_WRITE, FILE_OPEN_IF, FILE_SYNCHRONOUS_IO_NONALERT, NULL, 0); if(Status == STATUS_SUCCESS) { Status = NtWriteFile(TestFile, 0, NULL, NULL, &IoStatus, (PCHAR)"Здесь был мой поток!!!", 22, NULL, NULL); } NtClose(TestFile);
Это из-за наличия флага FILE_SYNCHRONOUS_IO_NONALERT, если автор поставит этот флажок, то у него тоже заработает, скорее всего. Либо указать предпоследний параметр, как я написал выше. Плюс у автора не просто поток, а перехватчик, исполняющийся в режиме ядра с PreviousMode = UserMode, это немного отличается от твоей ситуации.
x64 я скоро стану твоим фанатом! xD Код (Text): LARGE_INTEGER liOffset = {0}; ZwWriteFile (..., &liOffset, ...); Спасибо!!!
Мне, конечно, приятно, но не сотвори себе кумира. Заходите в мой блог иногда, больше мне ничего не нужно. Это примитивнейшие знания, их можно получить, читая документацию, и ничего шибко нового или недокументированного я здесь не сообщил.