Ошибка выравнивания буфера ReadDirectoryChanges 998 Windows - PullRequest
0 голосов
/ 17 апреля 2019

У меня есть следующий код для отслеживания изменений файлов в системе, но я получаю код ошибки 998 (INVALID MEMORY LOCATION).Что плохого в моем коде?Это должно быть что-то с выравниванием буфера, но я не могу найти свою ошибку кодирования?

Код, который я использую для мониторинга системных изменений, показан ниже:

#if _WIN32
    HANDLE hDir = NULL;
    int TryCount = 0;
    char filename[MAX_PATH];

    HANDLE DirHandle;
    while (hDir == NULL || hDir == INVALID_HANDLE_VALUE) {
        DirHandle = CreateFileA(
            Settings.Directory.c_str(),
            GENERIC_READ | FILE_LIST_DIRECTORY,
            FILE_SHARE_WRITE | FILE_SHARE_READ | FILE_SHARE_DELETE,
            NULL,
            OPEN_EXISTING,
            FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OVERLAPPED,
            NULL);
        if (DirHandle == INVALID_HANDLE_VALUE) {
            TryCount++;
            if (TryCount == 5) {
                string Message = "Failed to open directory: ";
                Message += Settings.Directory.Real;
                Message += ". Shutting down monitor";
                Log(Message, true, "Warning");
                SleepForSeconds(30);
                }
            }
        else {
            hDir = DirHandle;
            }
        }

    if (TryCount < 5) {
        int offset;
        string RenameOld;
        bool result = true;
        char buffer[65536]; //64kB
        DWORD dwBytesReturned = 0;
        FILE_NOTIFY_INFORMATION* pNotify;
        while (result) {
            result = ReadDirectoryChangesW(DirHandle, &buffer, sizeof(buffer), TRUE, FILE_NOTIFY_CHANGE_FILE_NAME | FILE_NOTIFY_CHANGE_LAST_WRITE, &dwBytesReturned, NULL, NULL);
            if (result) {
                offset = 0;
                do {
                    pNotify = (FILE_NOTIFY_INFORMATION*)((char*)buffer + offset);
                    strcpy(filename, "");
                    WideCharToMultiByte(CP_ACP, 0, pNotify->FileName, pNotify->FileNameLength/2, filename, sizeof(filename), NULL, NULL);
                    filename[pNotify->FileNameLength/2] = '\0';
                    string FilePath = Settings.Directory + PathSeparator + filename;

                    if (pNotify->Action == FILE_ACTION_ADDED || pNotify->Action == FILE_ACTION_MODIFIED) {
                        HandleMonitorAction("PROCESS", FilePath);
                        }
                    else if (pNotify->Action == FILE_ACTION_REMOVED) {
                        HandleMonitorAction("DELETE", FilePath);
                        }
                    else if (pNotify->Action == FILE_ACTION_RENAMED_OLD_NAME) {
                        RenameOld = FilePath;
                        }
                    else if (pNotify->Action == FILE_ACTION_RENAMED_NEW_NAME) {
                        HandleMonitorAction("RENAME", FilePath, RenameOld);
                        RenameOld = "";
                        }
                    else {
                        Log("Unknown monitor-action received for the file: " + FilePath, false, "Warning");
                        }
                    offset += pNotify->NextEntryOffset;
                    } while(pNotify->NextEntryOffset); //(offset != 0);
                }
            else {

                //THIS GIVES THE 998 INVALID MEMORY ERROR

                string Message = "Stopped monitor. Error: ";
                Message += GetLastErrorAsString();
                Log(Message, true, "Error");
                return;
                }
            }
        }

Пожалуйста, сообщите омоя ошибка

...