Сбой при разыменовании "char *", не может сравнивать строки - PullRequest
0 голосов
/ 27 мая 2019

Я весь день работал над выяснением проблемы с моим драйвером, проблема, похоже, заключается в том, что если я разыменую любую из моих строк (ProcessName, attachName), это приведет к сбою моего драйвера и операционной системы.

edit: я забыл опубликовать, что разыменование char * возвращает NULL или ничего в strcmp, поэтому он аварийно завершился или, похоже, потерпел крах. Это вызвано или было вызвано, STATUS_ACCESS_VIOLATION ntstatus. Надеюсь, это поможет.

Я просмотрел все, что смог найти в Google, связанное со сравнением строк, многобайтовой и Unicode-кодировкой, различием между типами строк, и в конечном итоге я понял, что если я разыменую переменные, это вызовет сбой.

// the callback, it is where I am trying to compare the strings
PCREATE_PROCESS_NOTIFY_ROUTINE Callback(HANDLE ParentId, HANDLE ProcessId, BOOLEAN Create) {
    if (Create == TRUE) {
        PEPROCESS Process;

        if (NT_SUCCESS(PsLookupProcessByProcessId(ProcessId, &Process))) {
            LPSTR ProcessName = (LPSTR)PsGetProcessImageFileName(Process);
            PVOID ProcessBase = PsGetProcessSectionBaseAddress(Process);
            UINT64 VirtualSize = (UINT64)((PCUCHAR)Process + 0x338);
            UINT64 PeakVirtualSize = (UINT64)((PCUCHAR)Process + 0x330);

            //if (attachedName) {
                //if (!strcmp(ProcessName, attachedName)) {
                    DbgPrintEx(0, 0, "ParentId: %i | ProcessId: %i | ProcessName: %s | ProcessBase: 0x%p | VirtualSize: 0x%X | PeakVirtualSize: 0x%X", ParentId, ProcessId, *ProcessName, ProcessBase, VirtualSize, PeakVirtualSize);
                //}
            //}

            ObDereferenceObject(Process);
        }
    }
}

// the case in a switch statement I call to be able to find a specific process in the callback

case IO_CTL_ATTACH:
    attachedName = sent->attach.exeName;
    DbgPrintEx(0, 0, "%s", attachedName);
        return STATUS_SUCCESS;

Предполагается, что ожидаемый результат будет одним символом или чем-то другим, напечатанным из разыменования «ProcessName», если я удалю разыменование, не произойдет сбой.

Я обнаружил все это с помощью отладочного сообщения, которое перенаправило меня на nt! Strcmp + 4C, где он разыменовывает String1 или первый ввод.

...