Использование пути файла из реестра для ZwCreateFile

Тема в разделе "WASM.NT.KERNEL", создана пользователем WaterGhost, 10 окт 2009.

  1. WaterGhost

    WaterGhost New Member

    Публикаций:
    0
    Регистрация:
    15 июн 2007
    Сообщения:
    130
    Гугление не помогло, подобной проблемы в интернете не обнаружил =\
    У меня есть процедура, с помощью которой я получаю путь к файлу логов из реестра
    Код (Text):
    1. BOOLEAN GetLogDir(PUNICODE_STRING LogDir)
    2. {
    3.     HANDLE                         KeyHandle;
    4.     OBJECT_ATTRIBUTES              ObjectAttributes;
    5.     NTSTATUS                       ntStatus;
    6.     UNICODE_STRING                 KeyName   = RTL_CONSTANT_STRING(L"\\Registry\\Machine\\Software\\My software");
    7.     UNICODE_STRING                 ValueName = RTL_CONSTANT_STRING(L"DbgLogDir");
    8.     ULONG                          ValueLength;
    9.     UCHAR                          ValueBuffer[sizeof(KEY_VALUE_PARTIAL_INFORMATION) + 256];
    10.     PKEY_VALUE_PARTIAL_INFORMATION ValueInfo;
    11.     WCHAR                          ResBuffer[260] = L"\\??\\";
    12.  
    13.     ValueInfo = (PKEY_VALUE_PARTIAL_INFORMATION)ValueBuffer;
    14.     InitializeObjectAttributes(&ObjectAttributes, &KeyName, OBJ_CASE_INSENSITIVE, NULL, NULL);
    15.     ntStatus = ZwOpenKey(&KeyHandle, KEY_QUERY_VALUE, &ObjectAttributes);
    16.  
    17.     if( NT_SUCCESS( ntStatus ) )
    18.     {
    19.         RtlZeroMemory(ValueInfo, sizeof(KEY_VALUE_PARTIAL_INFORMATION));
    20.         ntStatus = ZwQueryValueKey(KeyHandle,
    21.                                    &ValueName,
    22.                                    KeyValuePartialInformation,
    23.                                    ValueInfo,
    24.                                    sizeof(KEY_VALUE_PARTIAL_INFORMATION) + 256,
    25.                                    &ValueLength);
    26.         if( (NT_SUCCESS(ntStatus)) && (ValueInfo->Type == REG_SZ) )
    27.         {
    28.             ZwClose(KeyHandle);
    29.             //wmemcpy(&ResBuffer[4], (PWCHAR)ValueInfo->Data, wcslen((PWCHAR)ValueInfo->Data));
    30.             wcscat(ResBuffer, (PWCHAR)ValueInfo->Data);
    31.             RtlInitUnicodeString(LogDir, ResBuffer);
    32.             return TRUE;
    33.         } else DPRINT("'ZwQueryValueKey' failed 0x%.8x\n", ntStatus);
    34.         ZwClose(KeyHandle);
    35.     } else DPRINT("'ZwOpenKey' failed 0x%.8x\n", ntStatus);
    36.  
    37.     return FALSE;
    38. }
    39.  
    40.  
    41. //====================
    42. // вызываю её так:
    43. UNICODE_STRING    FileName;
    44.  
    45. if( !GetLogDir(&FileName) )
    46.         return;
    После её вызова:
    DPRINT("FileName = '%ws'", FileName.Buffer);// (FileName = '\??\C:\Program Files\My soft\my_debug.txt')

    Вызываю ZwCreateFile, возвращает ошибку STATUS_OBJECT_PATH_SYNTAX_BAD(C000003B). Если не использовать GetLogDir, а просто вызвать
    Код (Text):
    1. RtlInitUnicodeString(&FileName, L"\\??\\C:\\Program Files\\My soft\\my_debug.txt");
    Функция завершается успешно.
    Прошу помощи, буду очень благодарен. Спасибо за внимание
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Покажи код в окрестноси вызова ZwCreateFile
     
  3. WaterGhost

    WaterGhost New Member

    Публикаций:
    0
    Регистрация:
    15 июн 2007
    Сообщения:
    130
    Код (Text):
    1. void LogToFile(char Msg[])
    2. {
    3.     IO_STATUS_BLOCK   IoStatus;
    4.     OBJECT_ATTRIBUTES objectAttributes;
    5.     HANDLE            FileHandle = NULL;
    6.     UNICODE_STRING    FileName;
    7.     NTSTATUS          ntStatus;
    8.     IO_STATUS_BLOCK   iosb;
    9.    
    10.     if( !GetLogDir(&FileName) )
    11.         return;
    12.  
    13.     DPRINT("FileName = '%ws'", FileName.Buffer);
    14.  
    15.     InitializeObjectAttributes( &objectAttributes,
    16.                                 &FileName,
    17.                                 OBJ_CASE_INSENSITIVE,
    18.                                 NULL,
    19.                                 NULL );
    20.  
    21.     ntStatus = ZwCreateFile( &FileHandle,
    22.                              FILE_APPEND_DATA,
    23.                              &objectAttributes,
    24.                              &IoStatus,
    25.                              0,
    26.                              FILE_ATTRIBUTE_NORMAL,
    27.                              FILE_SHARE_WRITE,
    28.                              FILE_OPEN_IF,
    29.                              FILE_SYNCHRONOUS_IO_NONALERT,
    30.                              NULL,
    31.                              0 );
    32.    
    33.     if( NT_SUCCESS( ntStatus ) )
    34.     {
    35.         ZwWriteFile( FileHandle,
    36.                      NULL,
    37.                      NULL,
    38.                      NULL,
    39.                      &IoStatus,
    40.                      Msg,
    41.                      strlen(Msg),
    42.                      NULL,
    43.                      NULL );
    44.         ZwWriteFile( FileHandle,
    45.                      NULL,
    46.                      NULL,
    47.                      NULL,
    48.                      &IoStatus,
    49.                      "\r\n",
    50.                      2,
    51.                      NULL,
    52.                      NULL );
    53.         NtFlushBuffersFiles(FileHandle, &iosb);
    54.         ZwClose(FileHandle);
    55.     } else DPRINT("'ZwCreateFile' failed 0x%.8x\n", ntStatus);
    56. }
     
  4. WaterGhost

    WaterGhost New Member

    Публикаций:
    0
    Регистрация:
    15 июн 2007
    Сообщения:
    130
    Нашёл в чем дело. Правильный участок кода для функции GetLogDir :
    Код (Text):
    1. if( (NT_SUCCESS(ntStatus)) && (ValueInfo->Type == REG_SZ) )
    2.         {
    3.             ZwClose(KeyHandle);
    4.  
    5.             DPRINT("ValueLength = %d; DataLength = %d; wcslen = %d\n", ValueLength, ValueInfo->DataLength, wcslen((PWCHAR)ValueInfo->Data));
    6.                         // ValueLength в данном случае - размер памяти, занимаемой буфером строки
    7.                         // Размер памяти занимаемый строкой = sizeof(WCHAR) * StrLen (StrLen - кол-во символов строки)
    8.                         // ValueLength =  sizeof(WCHAR) * StrLen
    9.             ResBuffer = ExAllocatePool( NonPagedPool, ValueLength + (4 * sizeof(WCHAR)) );
    10.             if( ResBuffer == NULL )
    11.             {
    12.                 DPRINT("'GetLogDir' Empty Non-Paged Pool\n");
    13.                 return FALSE;
    14.             }
    15.             wmemcpy(&ResBuffer[0], (PWCHAR)&(L"\\??\\"), 4);
    16.                         // Прибавляем к строке длину прочтённой строки.
    17.                         //Внимание! wcslen возвращает длину без \0 конца строки! Поэтому копируем и его! + 1
    18.             wmemcpy(&ResBuffer[4], (PWCHAR)ValueInfo->Data, wcslen((PWCHAR)ValueInfo->Data) + 1);
    19.             RtlInitUnicodeString(LogDir, ResBuffer);
    20.             return TRUE;
    21.         } else DPRINT("'ZwQueryValueKey' failed 0x%.8x\n", ntStatus);
    Благодарю за внимание