NtCreateFile + WriteFile
От: MuPoB  
Дата: 12.07.20 19:42
Оценка:
Можно ли использовать хендл, который возвращает NtCreateFile в функции WriteFile?
WriteFile возвращает ERROR_INVALID_PARAMETER, если же попытаться записать через NtWriteFile — то всё ок. Как будто хендл NtCreateFile просто не может быть использован в WriteFile

NtCreateFile использую, чтобы решить проблему с ошибкой, когда существует папка с таким именем
Автор: MuPoB
Дата: 11.05.20


    QString nativePath = "\\??\\D:\\123";
    UNICODE_STRING unicodeString;
    RtlInitUnicodeString(&unicodeString, (PCWSTR)nativePath.utf16());
    OBJECT_ATTRIBUTES objAttribs = { 0 };
    InitializeObjectAttributes(&objAttribs, &unicodeString, 0, NULL, NULL);
    IO_STATUS_BLOCK ioStatusBlock = { 0 };
    HANDLE hFile = NULL;
    const NTSTATUS status = NtCreateFile(&hFile,
        FILE_GENERIC_WRITE,
        &objAttribs,
        &ioStatusBlock,
        NULL,
        FILE_ATTRIBUTE_NORMAL,
        0,
        FILE_CREATE,
        FILE_NON_DIRECTORY_FILE,
        NULL,
        NULL);
    
    if (status == STATUS_SUCCESS)
    {
        char buf[] = "123";
        DWORD numberOfBytesWritten = 0;
        BOOL res = WriteFile(hFile, buf, 3, &numberOfBytesWritten, NULL);
        DWORD err = GetLastError(); // ERROR_INVALID_PARAMETER
    }
Re: NtCreateFile + WriteFile
От: Alexander G Украина  
Дата: 13.07.20 07:50
Оценка: 12 (2)
Здравствуйте, MuPoB, Вы писали:

MPB> InitializeObjectAttributes(&objAttribs, &unicodeString, 0, NULL, NULL);


OBJ_CASE_INSENSITIVE нужно для Windows семантикиимён файлов
Русский военный корабль идёт ко дну!
Re: NtCreateFile + WriteFile
От: Alexander G Украина  
Дата: 13.07.20 07:54
Оценка: 17 (3)
Здравствуйте, MuPoB, Вы писали:

MPB> const NTSTATUS status = NtCreateFile(&hFile,

MPB> FILE_GENERIC_WRITE,
MPB> &objAttribs,
MPB> &ioStatusBlock,
MPB> NULL,
MPB> FILE_ATTRIBUTE_NORMAL,
MPB> 0,
MPB> FILE_CREATE,
MPB> FILE_NON_DIRECTORY_FILE,

Ещё FILE_SYNCHRONOUS_IO_NONALERT нужно для не-overlapped WriteFile
Русский военный корабль идёт ко дну!
Re: NtCreateFile + WriteFile
От: reversecode google
Дата: 13.07.20 13:04
Оценка: +1 -1
при проблемах гланд, обращаются к лору а не к проктологу
ваши потуги сломать систему намекают на создание зловреда
Re[2]: NtCreateFile + WriteFile
От: MuPoB  
Дата: 13.07.20 16:00
Оценка:
Здравствуйте, Alexander G, Вы писали:

AG>Ещё FILE_SYNCHRONOUS_IO_NONALERT нужно для не-overlapped WriteFile


FILE_SYNCHRONOUS_IO_NONALERT — этот флаг помог, спасибо!
Re[2]: NtCreateFile + WriteFile
От: MuPoB  
Дата: 13.07.20 16:03
Оценка:
Здравствуйте, reversecode, Вы писали:

R>при проблемах гланд, обращаются к лору а не к проктологу

R>ваши потуги сломать систему намекают на создание зловреда

Где вы увидели попытку сломать систему? Если WinAPI не позволяет понять, что происходит конфликт с именем папки, то это просто оно спроектировано неудачно, и единственный способ, это использовать NativeAPI
Re[3]: NtCreateFile + WriteFile
От: Alexander G Украина  
Дата: 13.07.20 16:47
Оценка: 1 (1)
Здравствуйте, MuPoB, Вы писали:

MPB>FILE_SYNCHRONOUS_IO_NONALERT — этот флаг помог, спасибо!


На всяк случай уточню, OBJ_CASE_INSENSITIVE тоже надо. А то можно создать файл с POSIX семантикой имеги, где "filename" и "FILENAME" — разные файлы. Я, кстати, не проверял, что будет, емли попытаться создать такой файл на системе, их не поддерживающей.

Вообще, если совсем чтоб без глупостей, то посмотреть через procmon, что именно CreateFile делает, и сделать ровно то же самое.
Русский военный корабль идёт ко дну!
Re[4]: NtCreateFile + WriteFile
От: MuPoB  
Дата: 13.07.20 16:56
Оценка:
Здравствуйте, Alexander G, Вы писали:

AG>На всяк случай уточню, OBJ_CASE_INSENSITIVE тоже надо. А то можно создать файл с POSIX семантикой имеги, где "filename" и "FILENAME" — разные файлы. Я, кстати, не проверял, что будет, емли попытаться создать такой файл на системе, их не поддерживающей.


AG>Вообще, если совсем чтоб без глупостей, то посмотреть через procmon, что именно CreateFile делает, и сделать ровно то же самое.


Да, OBJ_CASE_INSENSITIVE тоже буду использовать, спасибо) На своей винде пробовал создать без этого атрибута файлы AAA и aaa — второй файл не создался, ошибка STATUS_OBJECT_NAME_COLLISION. Но лучше чтобы всё правильно было.
Да, под отладчиком тоже надо пройтись для гарантии)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.