Это мой код
Код: Выделить всё
`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