ntdll: Return the expected length in NtQueryInformationProcess.

oldstable
Alexandre Julliard 2009-08-27 19:46:28 +02:00
parent 2be006e497
commit 5e30947d0b
1 changed files with 37 additions and 22 deletions

View File

@ -181,7 +181,11 @@ NTSTATUS WINAPI NtQueryInformationProcess(
if (ProcessInformationLength > sizeof(PROCESS_BASIC_INFORMATION)) if (ProcessInformationLength > sizeof(PROCESS_BASIC_INFORMATION))
ret = STATUS_INFO_LENGTH_MISMATCH; ret = STATUS_INFO_LENGTH_MISMATCH;
} }
else ret = STATUS_INFO_LENGTH_MISMATCH; else
{
len = sizeof(PROCESS_BASIC_INFORMATION);
ret = STATUS_INFO_LENGTH_MISMATCH;
}
} }
break; break;
case ProcessIoCounters: case ProcessIoCounters:
@ -207,7 +211,11 @@ NTSTATUS WINAPI NtQueryInformationProcess(
if (ProcessInformationLength > sizeof(IO_COUNTERS)) if (ProcessInformationLength > sizeof(IO_COUNTERS))
ret = STATUS_INFO_LENGTH_MISMATCH; ret = STATUS_INFO_LENGTH_MISMATCH;
} }
else ret = STATUS_INFO_LENGTH_MISMATCH; else
{
len = sizeof(IO_COUNTERS);
ret = STATUS_INFO_LENGTH_MISMATCH;
}
} }
break; break;
case ProcessVmCounters: case ProcessVmCounters:
@ -236,7 +244,11 @@ NTSTATUS WINAPI NtQueryInformationProcess(
ProcessInformationLength != sizeof(VM_COUNTERS)) ProcessInformationLength != sizeof(VM_COUNTERS))
ret = STATUS_INFO_LENGTH_MISMATCH; ret = STATUS_INFO_LENGTH_MISMATCH;
} }
else ret = STATUS_INFO_LENGTH_MISMATCH; else
{
len = sizeof(pvmi);
ret = STATUS_INFO_LENGTH_MISMATCH;
}
} }
break; break;
case ProcessTimes: case ProcessTimes:
@ -266,25 +278,27 @@ NTSTATUS WINAPI NtQueryInformationProcess(
SERVER_END_REQ; SERVER_END_REQ;
memcpy(ProcessInformation, &pti, sizeof(KERNEL_USER_TIMES)); memcpy(ProcessInformation, &pti, sizeof(KERNEL_USER_TIMES));
len = sizeof(KERNEL_USER_TIMES); len = sizeof(KERNEL_USER_TIMES);
} }
if (ProcessInformationLength > sizeof(KERNEL_USER_TIMES)) if (ProcessInformationLength > sizeof(KERNEL_USER_TIMES))
ret = STATUS_INFO_LENGTH_MISMATCH; ret = STATUS_INFO_LENGTH_MISMATCH;
} }
else ret = STATUS_INFO_LENGTH_MISMATCH; else
{
len = sizeof(KERNEL_USER_TIMES);
ret = STATUS_INFO_LENGTH_MISMATCH;
}
} }
break; break;
case ProcessDebugPort: case ProcessDebugPort:
/* "These are not the debuggers you are looking for." * /* "These are not the debuggers you are looking for." *
* set it to 0 aka "no debugger" to satisfy copy protections */ * set it to 0 aka "no debugger" to satisfy copy protections */
if (ProcessInformationLength == 4) len = 4;
{ if (ProcessInformationLength == len)
memset(ProcessInformation, 0, ProcessInformationLength); memset(ProcessInformation, 0, ProcessInformationLength);
len = 4; else
} ret = STATUS_INFO_LENGTH_MISMATCH;
else ret = STATUS_INFO_LENGTH_MISMATCH;
break; break;
case ProcessHandleCount: case ProcessHandleCount:
if (ProcessInformationLength >= 4) if (ProcessInformationLength >= 4)
@ -296,18 +310,21 @@ NTSTATUS WINAPI NtQueryInformationProcess(
else else
{ {
memset(ProcessInformation, 0, 4); memset(ProcessInformation, 0, 4);
len = 4; len = 4;
} }
if (ProcessInformationLength > 4) if (ProcessInformationLength > 4)
ret = STATUS_INFO_LENGTH_MISMATCH; ret = STATUS_INFO_LENGTH_MISMATCH;
} }
else ret = STATUS_INFO_LENGTH_MISMATCH; else
break; {
len = 4;
ret = STATUS_INFO_LENGTH_MISMATCH;
}
break;
case ProcessWow64Information: case ProcessWow64Information:
if (ProcessInformationLength == sizeof(DWORD)) len = sizeof(DWORD);
if (ProcessInformationLength == len)
{ {
DWORD val = 0; DWORD val = 0;
@ -322,7 +339,6 @@ NTSTATUS WINAPI NtQueryInformationProcess(
SERVER_END_REQ; SERVER_END_REQ;
} }
*(DWORD *)ProcessInformation = val; *(DWORD *)ProcessInformation = val;
len = sizeof(DWORD);
} }
else ret = STATUS_INFO_LENGTH_MISMATCH; else ret = STATUS_INFO_LENGTH_MISMATCH;
break; break;
@ -350,12 +366,11 @@ NTSTATUS WINAPI NtQueryInformationProcess(
SERVER_END_REQ; SERVER_END_REQ;
break; break;
case ProcessExecuteFlags: case ProcessExecuteFlags:
if (ProcessInformationLength == sizeof(ULONG)) len = sizeof(ULONG);
{ if (ProcessInformationLength == len)
*(ULONG *)ProcessInformation = execute_flags; *(ULONG *)ProcessInformation = execute_flags;
len = sizeof(ULONG); else
} ret = STATUS_INFO_LENGTH_MISMATCH;
else ret = STATUS_INFO_LENGTH_MISMATCH;
break; break;
default: default:
FIXME("(%p,info_class=%d,%p,0x%08x,%p) Unknown information class\n", FIXME("(%p,info_class=%d,%p,0x%08x,%p) Unknown information class\n",