Я создал средство просмотра файлов и папок с помощью Журнала изменений, который хорошо работает на Windows 7. Я всегда могу получить изменения для этого действия:
- файл / папка создана / удалена
- файл / папка переименовывается
- файл / папка расширяется или перезаписывается, за исключением одной проблемы при расширении файла (я думаю, это означает, когда, например, кто-то открывает текстовый файл и добавляет некоторый текст в конец исохранить), я получил REASON для закрытия файла.
В Windows 10 он не обнаруживает созданные новые файлы.Это дает мне USN_REASON_OBJECT_ID_CHANGE 80000 (0x00080000).Это странно, потому что под Windows 7 это дает мне правильную причину.Для редактирования и сохранения текстового файла REASON равен 3, которого я не могу найти в документации MS.Под Windows 7 я получил вместо 3, REASON 6 (File Close).
Вот код, как я читаю USN Btw.под Windows10 я попробовал USN_RECORD_V3, но получил ту же ошибку.
void NTFS_WatchFiles::WatchFF(HANDLE Volume, DWORDLONG jID, USN usn, std::wstring fullPath
, std::chrono::system_clock::time_point * casPorovnaj
, bool * zalohuj
, std::wstring * ReasonMask
)
{
std::chrono::system_clock::time_point tp;
READ_USN_JOURNAL_DATA_V1 ReadData = { 0,
USN_REASON_FILE_CREATE |
USN_REASON_FILE_DELETE |
USN_REASON_DATA_EXTEND |
USN_REASON_BASIC_INFO_CHANGE |
USN_REASON_DATA_OVERWRITE |
USN_REASON_RENAME_NEW_NAME |
USN_REASON_RENAME_OLD_NAME
, FALSE, 0, 0, 0 };
ReadData.MinMajorVersion = 0;
ReadData.MaxMajorVersion = 2;
PUSN_RECORD UsnRecord; //_V2
DWORD dwBytes;
DWORD dwRetBytes;
CHAR Buffer[BUF_LEN] = {0};
ReadData.UsnJournalID = jID;
ReadData.StartUsn = usn;
std::wstring comparePath;
for (int i = 0; i < 3; i++)
{
//memset(Buffer, 0, BUF_LEN);
if (
!DeviceIoControl(
Volume
, FSCTL_READ_USN_JOURNAL
, &ReadData
, sizeof(ReadData)
, &Buffer
, BUF_LEN
, &dwBytes
, NULL
)
)
{
if (GetLastError() != (DWORD)1181)
{
wprintf(L"[ WatchFF ] Read journal failed (%d)\n", GetLastError());
}
return;
}
else
{
dwRetBytes = dwBytes - sizeof(USN);
// Find the first record
UsnRecord = (PUSN_RECORD)(((PUCHAR)Buffer) + sizeof(USN));
while (dwRetBytes > 0)
{
comparePath = GetPathFromUSN(Volume, UsnRecord->FileReferenceNumber);
if (fullPath == comparePath)
{
std::wcout << "USN: " << std::to_wstring(UsnRecord->Usn) << "\n";
std::wstring str(UsnRecord->FileName);
std::wstring fstr = str.substr(0, UsnRecord->FileNameLength / 2);
std::wcout << "File name: " << fstr << "\n";
std::wcout << "Reason: " << std::hex << UsnRecord->Reason << "\n";
GetTimeFromFiletime(UsnRecord->TimeStamp, std::tm(), &tp);
if (zalohuj != nullptr)
{
// here is code which is not related to Change Journal
}
std::wcout << "FULL PATH : " << comparePath << "\n";
std::wcout << "---------\n";
}
dwRetBytes -= UsnRecord->RecordLength;
// Find the next record
UsnRecord = (PUSN_RECORD)(((PCHAR)UsnRecord) +
UsnRecord->RecordLength);
}
// Update starting USN for next call
ReadData.StartUsn = *(USN *)&Buffer;
}
}
}
Я не знаю, что я делаю неправильно или что делать, для правильного чтения USN под Windows 10.
PS.Я редактирую свою проблему, это был оригинальный текст " Под Windows 10 я получил ОШИБКУ 1181 [ERROR_JOURNAL_ENTRY_DELETED Запись журнала была удалена из журнала] при создании нового файла или папки. ", но я забыл, что этоХорошо, потому что у этих файлов не было записи, потому что они, вероятно, слишком старые и записи для этих файлов не существует.И эта ошибка дает мне другую функцию, которая здесь не показана.