STATUS_INVALID_PARAMETER из NtCreateFile после обновления WindowsC++

Программы на C++. Форум разработчиков
Anonymous
 STATUS_INVALID_PARAMETER из NtCreateFile после обновления Windows

Сообщение Anonymous »

После недавних обновлений Windows я постоянно получаю сообщение об ошибке STATUS_INVALID_PARAMETER, хотя раньше все работало нормально. Стоит ли мне рассмотреть возможность перехода с NtCreateFile на CreateFile? Какие у вас есть предложения и что может быть причиной такого поведения? Возможно ли, что обновление является причиной этой проблемы?
Это мой код

Код: Выделить всё

`BOOLEAN ChgJournalFileNameFromID(DWORDLONG FileID, HANDLE hVol, WCHAR *buff, ULONG bufsize, ULONG *plenRet, ULONG *pLinkCntRet)
{
OBJECT_ATTRIBUTES ObjAttr;
UNICODE_STRING FileName;
HANDLE hFile;
IO_STATUS_BLOCK IoStatBlk;
LARGE_INTEGER fileid;
NTSTATUS ntStatus;
FILE_NAME_INFORMATION *pFileInfo;
FILE_STANDARD_INFORMATION stdFileInfo;
BOOLEAN bRet = FALSE;

fileid.QuadPart = FileID;

FileName.Length = sizeof(fileid);
FileName.MaximumLength = sizeof(fileid);
FileName.Buffer = (PWCH)&fileid;

if (g_pNtQueryInformationFile == NULL)
{
if (!ChgJournalInitFileOp()) {
return FALSE;
}
}

if (pLinkCntRet != NULL) {
*pLinkCntRet = 0;
}

InitializeObjectAttributes(&ObjAttr, &FileName, OBJ_CASE_INSENSITIVE, hVol, 0);

hFile = NULL;
ntStatus = g_pNtCreateFile(
&hFile,
SYNCHRONIZE,
&ObjAttr,
&IoStatBlk,
NULL,
FILE_ATTRIBUTE_NORMAL,
FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE,
FILE_OPEN,
FILE_SYNCHRONOUS_IO_NONALERT | FILE_OPEN_BY_FILE_ID | FILE_OPEN_FOR_BACKUP_INTENT | FILE_OPEN_REPARSE_POINT,
NULL,
0);

if (NT_SUCCESS(ntStatus))
{
memset(g_wFileInfoBuff, 0, sizeof(g_wFileInfoBuff));
ntStatus = g_pNtQueryInformationFile(hFile, &IoStatBlk, g_wFileInfoBuff, sizeof(g_wFileInfoBuff), FileNameInformation);
if (NT_SUCCESS(ntStatus))
{
pFileInfo = (FILE_NAME_INFORMATION *)g_wFileInfoBuff;
if ((bufsize * sizeof(wchar_t)) >= pFileInfo->FileNameLength)
{
wmemcpy_s(buff, bufsize, pFileInfo->FileName, pFileInfo->FileNameLength / 2);
*plenRet = pFileInfo->FileNameLength / 2;
bRet = TRUE;
}
else
{
LLOG0("CHG_JOURNAL : Buffer for filename is too small - %d, %d\n", bufsize, pFileInfo->FileNameLength);
}
}
else
{
ntStatus = IoStatBlk.Status;
LLOG0("CHG_JOURNAL : Failed to retrieve file data for journal file : error 0x%x\n", ntStatus);
loggerWin32Error(0, HRESULT_CODE(ntStatus), "ChgJournalFileNameFromID::g_pNtQueryInformationFile");
}

ntStatus = g_pNtQueryInformationFile(hFile, &IoStatBlk, &stdFileInfo, sizeof(stdFileInfo), FileStandardInformation);
if (NT_SUCCESS(ntStatus))
{
if (pLinkCntRet != NULL) {
*pLinkCntRet = stdFileInfo.NumberOfLinks;
}
}
else
{
ntStatus = IoStatBlk.Status;
LLOG5("CHG_JOURNAL : Failed to retrieve file data for journal file : error 0x%x\n", ntStatus);
loggerWin32Error(5, HRESULT_CODE(ntStatus), "ChgJournalFileNameFromID::g_pNtQueryInformationFile");
}

g_pNtClose(hFile);
}
else
{
LLOG0("CHG_JOURNAL : ntStatus is %#x  Failed to create file data for journal file: error %#x    IoStatBlk.Information is %llu \n", ntStatus, IoStatBlk.Status, (unsigned long long)IoStatBlk.Information);
loggerWin32Error(5, HRESULT_CODE(ntStatus), "ChgJournalFileNameFromID::g_pNtCreateFile");
}

return bRet;
}`
Я ожидал, что все будет работать так, как ожидалось, и не получил неверный параметр.
Я проверил FileName.Length равно 8, что достаточно. maxLength достаточно 8, hvol не равен нулю, поэтому каталог также установлен

Подробнее здесь: https://stackoverflow.com/questions/790 ... ows-update

Вернуться в «C++»