Я весь день работал над выяснением проблемы с моим драйвером, проблема, похоже, заключается в том, что если я разыменую любую из моих строк (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 или первый ввод.