Заранее всех благодарю!!
// Псевдокод из IDA
HANDLE __stdcall PsGetProcessId(PEPROCESS Process)
{
return CONTAINING_RECORD(Process, _EPROCESS, Pcb)->UniqueProcessId;
}
NTSTATUS GetProcessIdByName(_In_ PUNICODE_STRING ProcessName, _Out_ PHANDLE ProcessId) {
NTSTATUS status = STATUS_UNSUCCESSFUL;
PEPROCESS process = NULL;
HANDLE pid = NULL;
ULONG bufferSize = 1024;
PVOID buffer = NULL;
buffer = ExAllocatePoolWithTag(NonPagedPool, bufferSize, 'Proc');
if (!buffer) {
return STATUS_INSUFFICIENT_RESOURCES;
}
status = ZwQuerySystemInformation(SystemProcessInformation, buffer, bufferSize, &bufferSize);
if (status == STATUS_INFO_LENGTH_MISMATCH) {
ExFreePool(buffer);
buffer = ExAllocatePoolWithTag(NonPagedPool, bufferSize, 'Proc');
if (!buffer) {
return STATUS_INSUFFICIENT_RESOURCES;
}
status = ZwQuerySystemInformation(SystemProcessInformation, buffer, bufferSize, &bufferSize);
}
if (NT_SUCCESS(status)) {
PSYSTEM_PROCESS_INFORMATION spi = (PSYSTEM_PROCESS_INFORMATION)buffer;
while (spi->NextEntryOffset) {
UNICODE_STRING currentProcessName;
RtlInitUnicodeString(¤tProcessName, spi->ImageName.Buffer);
if (RtlCompareUnicodeString(ProcessName, ¤tProcessName, TRUE) == 0) {
pid = spi->UniqueProcessId;
*ProcessId = pid;
status = STATUS_SUCCESS;
break;
}
spi = (PSYSTEM_PROCESS_INFORMATION)((PUCHAR)spi + spi->NextEntryOffset);
}
}
if (buffer) {
ExFreePool(buffer);
}
return status;
}