Помогите разобраться, почему функция ZwCreateFile всегда возвращает ошибку: Код (Text): OBJECT_ATTRIBUTES attr; IO_STATUS_BLOCK res; UNICODE_STRING name; wchar_t s[1000]; wcscpy (s, L"\\DEVICE\\HARDDISKVOLUME1\\HELLO_2.txt"); //или пробовал wcscpy (s, L"\\DOSDEVICES\\C:\\HELLO_2.txt"); name.Buffer = s; name.Length = (uint16) wcslen (name.Buffer); name.MaximumLength = 1000; InitializeObjectAttributes (&attr, &name, OBJ_CASE_INSENSITIVE, 0, 0); HANDLE hFile; NTSTATUS stat = ZwCreateFile (&hFile, GENERIC_WRITE, &attr, &res, 0, FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ, FILE_OPEN_IF, 0, 0, 0); В stat всегда ошибка: STATUS_OBJECT_NAME_INVALID, при других вариациях получалось STATUS_OBJECT_NAME_NOT_FOUND. Как нужно правильно задавать имя файла?
Всё, разобрался. Во-первых, \??\C:\HELLO_2.txt работает. Во-вторых, в name.Length длину строки нужно указывать не в буквах, а в байтах.
Окончательный код выглядит так (если кому пригодится): Код (Text): OBJECT_ATTRIBUTES attr; IO_STATUS_BLOCK res; UNICODE_STRING name; wchar_t s[1000]; wcscpy (s, L"\\??\\C:\\Windows\\HELLO.txt"); name.Buffer = s; name.Length = 2 * (uint16) wcslen (name.Buffer); name.MaximumLength = 1000; InitializeObjectAttributes (&attr, &name, OBJ_CASE_INSENSITIVE, 0, 0); NTSTATUS stat; HANDLE hFile; stat = ZwCreateFile (&hFile, GENERIC_WRITE, &attr, &res, 0, FILE_ATTRIBUTE_NORMAL, 0, FILE_OPEN_IF, 0, 0, 0); if (stat != STATUS_SUCCESS) return 0;
Серьёзно, для новой функции нужно объявить её тип вместе со всеми параметрами, объявить переменную, вызвать GetProcAddress Так что лучше wcscpy+wcslen