ZwWriteFile

Тема в разделе "WASM.NT.KERNEL", создана пользователем drem1lin, 22 ноя 2009.

  1. drem1lin

    drem1lin Member

    Публикаций:
    0
    Регистрация:
    17 мар 2009
    Сообщения:
    300
    При записи ы файл столкнулся с ошибкой C000000D - Bad Argument, но я в упор не вижу где там ошибка=( откройте глаза

    Код (Text):
    1. NTSTATUS rc,rc2 = NULL;
    2.     HANDLE hDir,hTempFile;
    3.     OBJECT_ATTRIBUTES DirObjectAttributes, FileAttrib;
    4.     UNICODE_STRING TempUS;
    5.     IO_STATUS_BLOCK stb, ISBlock, Iostb;
    6.     PVOID lpBuffer;
    7.     PULONG BytesRead;
    8.     UNICODE_STRING usFileName;
    9.     WCHAR* TempString;
    10.     WCHAR FolderName [200]=L"\\??\\C:\\MFolder";
    11.     FILE_STANDARD_INFORMATION FileInfo;
    12.     IO_STATUS_BLOCK IoStat;
    13.     NTSTATUS Status;
    14.  
    15.  
    16.     rc = pNtCreateFile(FileHandle,DesiredAccess,ObjectAttributes,IoStatusBlock,AllocationSize,FileAttributes|FILE_SHARE_READ|FILE_SHARE_WRITE,ShareAccess,CreateDisposition,CreateOptions,EaBuffer,EaLength);
    17.             if (IsGoodFormat(ObjectAttributes->ObjectName) == TRUE)
    18.             {
    19.                     RtlInitUnicodeString (&TempUS, FolderName);
    20.                    
    21.                     InitializeObjectAttributes( &DirObjectAttributes, &TempUS, OBJ_CASE_INSENSITIVE, NULL, NULL);
    22.                    
    23.                     rc2 = IoCreateFile(&hDir,
    24.                                     GENERIC_READ|GENERIC_WRITE|FILE_LIST_DIRECTORY|FILE_TRAVERSE,
    25.                                     &DirObjectAttributes,
    26.                                     &stb,
    27.                                     0,
    28.                                     FILE_ATTRIBUTE_NORMAL,
    29.                                     FILE_SHARE_READ|FILE_SHARE_WRITE,
    30.                                     FILE_CREATE,
    31.                                     FILE_DIRECTORY_FILE,
    32.                                     0,
    33.                                     0,CreateFileTypeNone, NULL, IO_NO_PARAMETER_CHECKING);
    34.                     if (rc2==STATUS_SUCCESS)
    35.                     {
    36.                         ZwClose(hDir);//?????????
    37.                     }
    38.                    
    39.                     DbgPrint("%S\n",ObjectAttributes->ObjectName->Buffer);
    40.                    
    41.                         Status = ZwQueryInformationFile(*FileHandle, &IoStat, &FileInfo,
    42.                             sizeof(FILE_STANDARD_INFORMATION), FileStandardInformation);
    43.                         if (!NT_SUCCESS(Status))
    44.                         {
    45.                             DbgPrint("File Information unsuccess\n");
    46.                             //ZwClose(*FileHandle);
    47.                             return Status;
    48.                         }
    49.                         DbgPrint("File Information success\n");
    50.                         lpBuffer = ExAllocatePool(NonPagedPool, FileInfo.EndOfFile.LowPart);
    51.                         if (!lpBuffer)
    52.                         {
    53.                             DbgPrint("ExAllocatePool ERROR\n");
    54.                             //ZwClose(*hTempFile);
    55.                             return STATUS_NO_MEMORY;
    56.                         }
    57.                         DbgPrint("PoolSize = %d\n", FileInfo.EndOfFile.LowPart);
    58.                         DbgPrint("Pool Allocated\n");
    59.  
    60.                         Status = ZwReadFile(*FileHandle, 0, NULL, NULL, &IoStat,
    61.                             lpBuffer, FileInfo.EndOfFile.LowPart, NULL, NULL);
    62.                         if (!NT_SUCCESS(Status))
    63.                         {
    64.                             DbgPrint("File Read ERROR\n");
    65.                             ExFreePool(lpBuffer);
    66.                             //ZwClose(*FileHandle);
    67.                             return Status;
    68.                         }
    69.                         DbgPrint("File Readed\n");
    70.  
    71.                         TempString = wcsrchr(ObjectAttributes->ObjectName->Buffer,L'\\');
    72.                         if (TempString!=NULL)
    73.                         {
    74.                             TempString++;
    75.                             DbgPrint("TempString = %S\n",TempString);
    76.                             wcscat(FolderName,"\\");
    77.                             wcscat(FolderName,TempString);
    78.                             DbgPrint("FolderName = %S\n",FolderName);
    79.                             RtlInitUnicodeString(&usFileName, FolderName);
    80.                             InitializeObjectAttributes(&FileAttrib, &usFileName,OBJ_CASE_INSENSITIVE, NULL, NULL);
    81.                             DbgPrint("Object Attirutes Normal\n");
    82.                             DbgPrint("usFileName = %S\n", usFileName.Buffer);
    83.                             rc2 = IoCreateFile(&hTempFile, GENERIC_ALL,
    84.                                 &FileAttrib, &ISBlock, NULL, FILE_ATTRIBUTE_NORMAL,
    85.                                 FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_OVERWRITE_IF, FILE_NON_DIRECTORY_FILE, NULL, 0,CreateFileTypeNone, NULL, IO_NO_PARAMETER_CHECKING);
    86.                            
    87.                             if (rc2 ==STATUS_SUCCESS)
    88.                             {
    89.                                 DbgPrint("File Created\n");
    90.                                 rc2 = ZwWriteFile(hTempFile, NULL, NULL, NULL, &Iostb,lpBuffer,FileInfo.EndOfFile.LowPart,NULL,NULL);
    91.                                 if (rc2 !=STATUS_SUCCESS)
    92.                                 {
    93.                                     DbgPrint("ZwWriteFile rc2 = %X\n",rc2); //C000000D
    94.                                     DbgPrint("ZwWriteFile ISBlock.Status = %X\n",Iostb.Status); //ISBlock.Status = E15D2FB8
    95.                                 }
    96.                                 ZwClose(hTempFile);
    97.                             }
    98.                             else
    99.                             {
    100.                                 DbgPrint("rc2 = %X\n",rc2); //C000003B
    101.                                 DbgPrint("ISBlock.Status = %X\n",ISBlock.Status); //ISBlock.Status = 68
    102.  
    103.                                 DbgPrint("IoCreateFile Error\n");  
    104.                             }
    105.                            
    106.                            
    107.                         }
    108.                     ExFreePool(lpBuffer);
    109.                    
    110.                    
    111.                    
    112.             }
    113.        
    114.     return rc;
     
  2. drem1lin

    drem1lin Member

    Публикаций:
    0
    Регистрация:
    17 мар 2009
    Сообщения:
    300
    Эта код перехваченной NtCreateFile, pNtCreateFile - старый обработчик из sst. Функция фильтруя файлы по некоторой маске сбрасывает их в папку. Для этого определяется размер файла, он считывается в буфер, создается в этой папке файл с таким же именем, и туда надо записать содержимое буфера, но этого не происходит. ZwWriteFile возвращает ошибку c000000d
     
  3. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Может быть всё таки Unicode?

    И в предпоследнем параметре в ZwWriteFile() вместо NULL сделай так:

     
  4. Klayd

    Klayd Степан

    Публикаций:
    0
    Регистрация:
    7 апр 2006
    Сообщения:
    59
    Адрес:
    Киев
    вот такой код точно работает
    Код (Text):
    1.     NTSTATUS            Status;
    2.     HANDLE              TestFile;
    3.     OBJECT_ATTRIBUTES   ObjAttr;
    4.     IO_STATUS_BLOCK     IoStatus;
    5.     UNICODE_STRING      TestName;
    6.  
    7.     RtlInitUnicodeString(&TestName, L"\\??\\D:\\MaedByThread.file");
    8.  
    9.     InitializeObjectAttributes(&ObjAttr, &TestName,
    10.                                 OBJ_CASE_INSENSITIVE,
    11.                                 0, NULL);
    12.  
    13.     Status = NtCreateFile(&TestFile,
    14.                          FILE_WRITE_DATA + SYNCHRONIZE,
    15.                          &ObjAttr,
    16.                          &IoStatus, NULL,
    17.                          FILE_ATTRIBUTE_NORMAL,
    18.                          FILE_SHARE_WRITE,
    19.                          FILE_OPEN_IF,
    20.                          FILE_SYNCHRONOUS_IO_NONALERT,
    21.                          NULL, 0);
    22.   if(Status == STATUS_SUCCESS)
    23.   {
    24.       Status = NtWriteFile(TestFile,
    25.                             0, NULL, NULL,
    26.                             &IoStatus,
    27.                             (PCHAR)"Здесь был мой поток!!!",
    28.                             22,
    29.                             NULL, NULL);
    30.   }
    31.   NtClose(TestFile);
     
  5. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Это из-за наличия флага FILE_SYNCHRONOUS_IO_NONALERT, если автор поставит этот флажок, то у него тоже заработает, скорее всего. Либо указать предпоследний параметр, как я написал выше. Плюс у автора не просто поток, а перехватчик, исполняющийся в режиме ядра с PreviousMode = UserMode, это немного отличается от твоей ситуации.
     
  6. drem1lin

    drem1lin Member

    Публикаций:
    0
    Регистрация:
    17 мар 2009
    Сообщения:
    300
    x64 я скоро стану твоим фанатом! xD
    Код (Text):
    1. LARGE_INTEGER liOffset = {0};
    2. ZwWriteFile (..., &liOffset, ...);
    Спасибо!!!
     
  7. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Мне, конечно, приятно, но не сотвори себе кумира. Заходите в мой блог иногда, больше мне ничего не нужно.

    Это примитивнейшие знания, их можно получить, читая документацию, и ничего шибко нового или недокументированного я здесь не сообщил.