커널 모드 드라이버로 FindProcessidByName을 시도했습니다. ImageName.Buffer가 NULL로 바뀌면 ImageName.Buffer가 NULL로 바뀌는 경우가 있습니다. 프로세스 ID를 찾을 수 없습니다. ImageName.Buffer가 때때로 NULL이되는 이유를 알고 있습니까? 당신은 ZwQuerySystemInformation를 호출하지 않아야ZwQuerySystemInformation이 제대로 작동하지 않습니다.
typedef struct _SYSTEM_PROCESS_INFO_L
{
ULONG NextEntryOffset;
ULONG NumberOfThreads;
LARGE_INTEGER Reserved[3];
LARGE_INTEGER CreateTime;
LARGE_INTEGER UserTime;
LARGE_INTEGER KernelTime;
UNICODE_STRING ImageName;
ULONG BasePriority;
HANDLE ProcessId;
HANDLE InheritedFromProcessId;
}_SYSTEM_PROCESS_INFO_L, *P_SYSTEM_PROCESS_INFO_L;
HANDLE LSFindProcess(LPSTR name)
{
NTSTATUS durum;
ULONG retsize;
HANDLE hProcid = -1;
P_SYSTEM_PROCESS_INFO_L pi;
durum = ZwQuerySystemInformation(SystemProcessInformation, NULL, NULL, &retsize); // request how much memory size we need.
if (!NT_SUCCESS(durum) && durum !=STATUS_INFO_LENGTH_MISMATCH)
{
DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_INFO_LEVEL, "LS : ZwQuerySystemInformation Failed 1 durum : %p \n",durum);
return -1;
}
PVOID memPtr;
memPtr = ExAllocatePool(PagedPool, retsize);
if (!memPtr)
{
DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_INFO_LEVEL, "LS : ExAllocatePool Failed \n");
return -1;
}
memset(memPtr, 0, retsize);// zero mem
durum = ZwQuerySystemInformation(SystemProcessInformation, memPtr, retsize, NULL);
pi = (P_SYSTEM_PROCESS_INFO_L)memPtr; // parselliyorz
if (!NT_SUCCESS(durum))
{
DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_INFO_LEVEL, "LS : ZwQuerySystemInformation Failed 2 durum : %p \n", durum);
return -1;
}
while (pi->NextEntryOffset)
{
if (pi->ImageName.Buffer) //some process null if I dont use this I am getting BSOD.
{
if (!_stricmp(pi->ImageName.Buffer, name))
{
DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_INFO_LEVEL, "LS : name %ws , pid : %d \n", pi->ImageName.Buffer, pi->ProcessId);
hProcid = pi->ProcessId; // pid
break; // foundedd
}
}
pi = (P_SYSTEM_PROCESS_INFO_L)((unsigned char*)pi + pi->NextEntryOffset);
}
DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_INFO_LEVEL, "LS : LSFindProcess bitti \n");
return hProcid;
}
[MCVE]를 참조하십시오. 질문은 프로그래밍 언어 관련 질문이 아니라 Windows API 질문입니다. – jwdonahue
처음에는 루프에서이 정보를 쿼리/크기 조정해야합니다. 요청 된 버퍼 크기를 얻은 후에 새로운 프로세스/스레드가 될 수 있고 두 번째 호출시 * ZwQuerySystemInformation * * retsize *는 이미 충분히 클 수 없습니다. 두 번째'while (pi-> NextEntryOffset)'오류입니다 - 당신은 항상 목록의 마지막 프로세스를 잃어 버렸습니다. do()는 while() 루프가 필요합니다. – RbMm
또한'ImageName'은'UNICODE_STRING'입니다. - 반드시 0으로 종료해야하는 것은 아닙니다. 예를 들어 여기에 'RtlEqualUnicodeString'을 사용해야합니다. – RbMm