Изменить журнал под Windows 10, как исправить чтение USN?(Причина USN не такая, как в Windows 7) - PullRequest
0 голосов
/ 20 марта 2019

Я создал средство просмотра файлов и папок с помощью Журнала изменений, который хорошо работает на 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 Запись журнала была удалена из журнала] при создании нового файла или папки. ", но я забыл, что этоХорошо, потому что у этих файлов не было записи, потому что они, вероятно, слишком старые и записи для этих файлов не существует.И эта ошибка дает мне другую функцию, которая здесь не показана.

...