Параметры ZwCreateFile

Тема в разделе "WASM.NT.KERNEL", создана пользователем maxdiver, 13 апр 2007.

  1. maxdiver

    maxdiver Max

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    308
    Адрес:
    Саратов
    Помогите разобраться, почему функция ZwCreateFile всегда возвращает ошибку:
    Код (Text):
    1.     OBJECT_ATTRIBUTES attr;
    2.     IO_STATUS_BLOCK res;
    3.     UNICODE_STRING name;
    4.     wchar_t s[1000];
    5.     wcscpy (s, L"\\DEVICE\\HARDDISKVOLUME1\\HELLO_2.txt");
    6.     //или пробовал wcscpy (s, L"\\DOSDEVICES\\C:\\HELLO_2.txt");
    7.     name.Buffer = s;
    8.     name.Length = (uint16) wcslen (name.Buffer);
    9.     name.MaximumLength = 1000;
    10.     InitializeObjectAttributes (&attr, &name, OBJ_CASE_INSENSITIVE, 0, 0);
    11.     HANDLE hFile;
    12.     NTSTATUS stat = ZwCreateFile (&hFile, GENERIC_WRITE, &attr, &res, 0, FILE_ATTRIBUTE_NORMAL,
    13.         FILE_SHARE_READ, FILE_OPEN_IF, 0, 0, 0);
    В stat всегда ошибка: STATUS_OBJECT_NAME_INVALID, при других вариациях получалось STATUS_OBJECT_NAME_NOT_FOUND. Как нужно правильно задавать имя файла?
     
  2. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    пробуй
    Код (Text):
    1. name.MaximumLength = name.Length+2;
    и еще попробуй \\??\\C:\\HELLO_2.txt
     
  3. maxdiver

    maxdiver Max

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    308
    Адрес:
    Саратов
    Всё, разобрался.
    Во-первых, \??\C:\HELLO_2.txt работает.
    Во-вторых, в name.Length длину строки нужно указывать не в буквах, а в байтах.
     
  4. maxdiver

    maxdiver Max

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    308
    Адрес:
    Саратов
    Окончательный код выглядит так (если кому пригодится):
    Код (Text):
    1.     OBJECT_ATTRIBUTES attr;
    2.     IO_STATUS_BLOCK res;
    3.     UNICODE_STRING name;
    4.     wchar_t s[1000];
    5.     wcscpy (s, L"\\??\\C:\\Windows\\HELLO.txt");
    6.     name.Buffer = s;
    7.     name.Length = 2 * (uint16) wcslen (name.Buffer);
    8.     name.MaximumLength = 1000;
    9.     InitializeObjectAttributes (&attr, &name, OBJ_CASE_INSENSITIVE, 0, 0);
    10.     NTSTATUS stat;
    11.     HANDLE hFile;
    12.     stat = ZwCreateFile (&hFile, GENERIC_WRITE, &attr, &res, 0, FILE_ATTRIBUTE_NORMAL,
    13.         0, FILE_OPEN_IF, 0, 0, 0);
    14.     if (stat != STATUS_SUCCESS)
    15.         return 0;
     
  5. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    омфг, RtlInitUnicodeString уже не рулит из принципа чтоли?
     
  6. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    зачем лишний импорт :)
     
  7. maxdiver

    maxdiver Max

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    308
    Адрес:
    Саратов
    Серьёзно, для новой функции нужно объявить её тип вместе со всеми параметрами, объявить переменную, вызвать GetProcAddress Так что лучше wcscpy+wcslen :)