Commit 2b7094e4 authored by Paul Vriens's avatar Paul Vriens Committed by Alexandre Julliard

Reduce our buffer by 1 SYSTEM_THREAD_INFORMATION per process.

Minimize some calculations.
parent c4056230
...@@ -674,6 +674,7 @@ NTSTATUS WINAPI NtQuerySystemInformation( ...@@ -674,6 +674,7 @@ NTSTATUS WINAPI NtQuerySystemInformation(
HANDLE hSnap = 0; HANDLE hSnap = 0;
WCHAR procname[1024]; WCHAR procname[1024];
DWORD wlen = 0; DWORD wlen = 0;
DWORD procstructlen = 0;
SERVER_START_REQ( create_snapshot ) SERVER_START_REQ( create_snapshot )
{ {
...@@ -694,7 +695,8 @@ NTSTATUS WINAPI NtQuerySystemInformation( ...@@ -694,7 +695,8 @@ NTSTATUS WINAPI NtQuerySystemInformation(
if (!(ret = wine_server_call( req ))) if (!(ret = wine_server_call( req )))
{ {
wlen = wine_server_reply_size(reply) + sizeof(WCHAR); wlen = wine_server_reply_size(reply) + sizeof(WCHAR);
if (Length >= len + sizeof(*spi)) procstructlen = sizeof(*spi) + wlen + ((reply->threads - 1) * sizeof(SYSTEM_THREAD_INFORMATION));
if (Length >= len + procstructlen)
{ {
/* ftCreationTime, ftUserTime, ftKernelTime; /* ftCreationTime, ftUserTime, ftKernelTime;
* vmCounters, ioCounters * vmCounters, ioCounters
...@@ -702,7 +704,7 @@ NTSTATUS WINAPI NtQuerySystemInformation( ...@@ -702,7 +704,7 @@ NTSTATUS WINAPI NtQuerySystemInformation(
memset(spi, 0, sizeof(*spi)); memset(spi, 0, sizeof(*spi));
spi->dwOffset = sizeof(*spi); spi->dwOffset = procstructlen - wlen;
spi->dwThreadCount = reply->threads; spi->dwThreadCount = reply->threads;
/* spi->pszProcessName will be set later on */ /* spi->pszProcessName will be set later on */
...@@ -714,24 +716,23 @@ NTSTATUS WINAPI NtQuerySystemInformation( ...@@ -714,24 +716,23 @@ NTSTATUS WINAPI NtQuerySystemInformation(
/* spi->ti will be set later on */ /* spi->ti will be set later on */
len += sizeof(*spi) - sizeof(spi->ti); len += procstructlen;
} }
else ret = STATUS_INFO_LENGTH_MISMATCH; else ret = STATUS_INFO_LENGTH_MISMATCH;
} }
} }
SERVER_END_REQ; SERVER_END_REQ;
if (ret != STATUS_SUCCESS) if (ret != STATUS_SUCCESS)
{ {
if (ret == STATUS_NO_MORE_FILES) ret = STATUS_SUCCESS; if (ret == STATUS_NO_MORE_FILES) ret = STATUS_SUCCESS;
break; break;
} }
if (Length >= len + wlen + spi->dwThreadCount * sizeof(SYSTEM_THREAD_INFORMATION)) else /* Length is already checked for */
{ {
int i, j; int i, j;
/* set thread info */ /* set thread info */
spi->dwOffset += spi->dwThreadCount * sizeof(SYSTEM_THREAD_INFORMATION);
len += spi->dwThreadCount * sizeof(SYSTEM_THREAD_INFORMATION);
i = j = 0; i = j = 0;
while (ret == STATUS_SUCCESS) while (ret == STATUS_SUCCESS)
{ {
...@@ -768,13 +769,11 @@ NTSTATUS WINAPI NtQuerySystemInformation( ...@@ -768,13 +769,11 @@ NTSTATUS WINAPI NtQuerySystemInformation(
spi->ProcessName.MaximumLength = wlen; spi->ProcessName.MaximumLength = wlen;
memcpy( spi->ProcessName.Buffer, procname, spi->ProcessName.Length ); memcpy( spi->ProcessName.Buffer, procname, spi->ProcessName.Length );
spi->ProcessName.Buffer[spi->ProcessName.Length / sizeof(WCHAR)] = 0; spi->ProcessName.Buffer[spi->ProcessName.Length / sizeof(WCHAR)] = 0;
len += wlen;
spi->dwOffset += wlen; spi->dwOffset += wlen;
last = spi; last = spi;
spi = (SYSTEM_PROCESS_INFORMATION*)((char*)spi + spi->dwOffset); spi = (SYSTEM_PROCESS_INFORMATION*)((char*)spi + spi->dwOffset);
} }
else ret = STATUS_INFO_LENGTH_MISMATCH;
} }
if (ret == STATUS_SUCCESS && last) last->dwOffset = 0; if (ret == STATUS_SUCCESS && last) last->dwOffset = 0;
if (hSnap) NtClose(hSnap); if (hSnap) NtClose(hSnap);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment