Implemented kernel32.GetIoProcessCounters and stubbed
ntdll.NtQueryProcessInformation(ProcessIoCounters).
This commit is contained in:
parent
4df100cda6
commit
c3e6c095e1
|
@ -452,7 +452,7 @@
|
|||
@ stdcall GetProcessFlags(long)
|
||||
@ stdcall GetProcessHeap()
|
||||
@ stdcall GetProcessHeaps(long ptr)
|
||||
@ stub GetProcessIoCounters
|
||||
@ stdcall GetProcessIoCounters(long ptr)
|
||||
@ stdcall GetProcessShutdownParameters(ptr ptr)
|
||||
@ stdcall GetProcessTimes(long ptr ptr ptr ptr)
|
||||
@ stdcall GetProcessVersion(long)
|
||||
|
|
|
@ -2024,6 +2024,20 @@ BOOL WINAPI WriteProcessMemory( HANDLE process, LPVOID addr, LPCVOID buffer, SIZ
|
|||
return !status;
|
||||
}
|
||||
|
||||
/******************************************************************
|
||||
* GetProcessIoCounters (KERNEL32.@)
|
||||
*
|
||||
*
|
||||
*/
|
||||
BOOL WINAPI GetProcessIoCounters(HANDLE hProcess, PIO_COUNTERS ioc)
|
||||
{
|
||||
NTSTATUS status;
|
||||
|
||||
status = NtQueryInformationProcess(hProcess, ProcessIoCounters,
|
||||
ioc, sizeof(*ioc), NULL);
|
||||
if (status) SetLastError( RtlNtStatusToDosError(status) );
|
||||
return !status;
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
* ProcessIdToSessionId (KERNEL32.@)
|
||||
|
|
|
@ -51,6 +51,7 @@ C_SRCS = \
|
|||
nt.c \
|
||||
om.c \
|
||||
path.c \
|
||||
process.c \
|
||||
reg.c \
|
||||
resource.c \
|
||||
rtl.c \
|
||||
|
|
|
@ -72,98 +72,6 @@ typedef struct LpcMessage
|
|||
BYTE MessageData[MAX_MESSAGE_DATA];
|
||||
} LPCMESSAGE, *PLPCMESSAGE;
|
||||
|
||||
/*
|
||||
* Process object
|
||||
*/
|
||||
|
||||
/******************************************************************************
|
||||
* NtTerminateProcess [NTDLL.@]
|
||||
*
|
||||
* Native applications must kill themselves when done
|
||||
*/
|
||||
NTSTATUS WINAPI NtTerminateProcess( HANDLE handle, LONG exit_code )
|
||||
{
|
||||
NTSTATUS ret;
|
||||
BOOL self;
|
||||
SERVER_START_REQ( terminate_process )
|
||||
{
|
||||
req->handle = handle;
|
||||
req->exit_code = exit_code;
|
||||
ret = wine_server_call( req );
|
||||
self = !ret && reply->self;
|
||||
}
|
||||
SERVER_END_REQ;
|
||||
if (self) exit( exit_code );
|
||||
return ret;
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
* NtQueryInformationProcess [NTDLL.@]
|
||||
* ZwQueryInformationProcess [NTDLL.@]
|
||||
*
|
||||
*/
|
||||
NTSTATUS WINAPI NtQueryInformationProcess(
|
||||
IN HANDLE ProcessHandle,
|
||||
IN PROCESSINFOCLASS ProcessInformationClass,
|
||||
OUT PVOID ProcessInformation,
|
||||
IN ULONG ProcessInformationLength,
|
||||
OUT PULONG ReturnLength)
|
||||
{
|
||||
NTSTATUS ret = STATUS_SUCCESS;
|
||||
ULONG len = 0;
|
||||
|
||||
switch (ProcessInformationClass) {
|
||||
case ProcessDebugPort:
|
||||
/* "These are not the debuggers you are looking for." */
|
||||
/* set it to 0 aka "no debugger" to satisfy copy protections */
|
||||
if (ProcessInformationLength == 4)
|
||||
{
|
||||
memset(ProcessInformation,0,ProcessInformationLength);
|
||||
len = 4;
|
||||
}
|
||||
else
|
||||
ret = STATUS_INFO_LENGTH_MISMATCH;
|
||||
break;
|
||||
case ProcessWow64Information:
|
||||
if (ProcessInformationLength == 4)
|
||||
{
|
||||
memset(ProcessInformation,0,ProcessInformationLength);
|
||||
len = 4;
|
||||
}
|
||||
else
|
||||
ret = STATUS_INFO_LENGTH_MISMATCH;
|
||||
break;
|
||||
default:
|
||||
FIXME("(%p,0x%08x,%p,0x%08lx,%p),stub!\n",
|
||||
ProcessHandle,ProcessInformationClass,
|
||||
ProcessInformation,ProcessInformationLength,
|
||||
ReturnLength
|
||||
);
|
||||
ret = STATUS_NOT_IMPLEMENTED;
|
||||
break;
|
||||
}
|
||||
|
||||
if (ReturnLength)
|
||||
*ReturnLength = len;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
* NtSetInformationProcess [NTDLL.@]
|
||||
* ZwSetInformationProcess [NTDLL.@]
|
||||
*/
|
||||
NTSTATUS WINAPI NtSetInformationProcess(
|
||||
IN HANDLE ProcessHandle,
|
||||
IN PROCESSINFOCLASS ProcessInformationClass,
|
||||
IN PVOID ProcessInformation,
|
||||
IN ULONG ProcessInformationLength)
|
||||
{
|
||||
FIXME("(%p,0x%08x,%p,0x%08lx) stub\n",
|
||||
ProcessHandle,ProcessInformationClass,ProcessInformation,ProcessInformationLength);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Token
|
||||
*/
|
||||
|
|
|
@ -0,0 +1,135 @@
|
|||
/*
|
||||
* NT basis DLL
|
||||
*
|
||||
* This file contains the Nt* API functions of NTDLL.DLL.
|
||||
* In the original ntdll.dll they all seem to just call int 0x2e (down to the NTOSKRNL)
|
||||
*
|
||||
* Copyright 1996-1998 Marcus Meissner
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <time.h>
|
||||
#include "wine/debug.h"
|
||||
|
||||
#include "windef.h"
|
||||
#include "winbase.h"
|
||||
#include "winreg.h"
|
||||
#include "winternl.h"
|
||||
#include "ntdll_misc.h"
|
||||
#include "wine/server.h"
|
||||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(ntdll);
|
||||
|
||||
/*
|
||||
* Process object
|
||||
*/
|
||||
|
||||
/******************************************************************************
|
||||
* NtTerminateProcess [NTDLL.@]
|
||||
*
|
||||
* Native applications must kill themselves when done
|
||||
*/
|
||||
NTSTATUS WINAPI NtTerminateProcess( HANDLE handle, LONG exit_code )
|
||||
{
|
||||
NTSTATUS ret;
|
||||
BOOL self;
|
||||
SERVER_START_REQ( terminate_process )
|
||||
{
|
||||
req->handle = handle;
|
||||
req->exit_code = exit_code;
|
||||
ret = wine_server_call( req );
|
||||
self = !ret && reply->self;
|
||||
}
|
||||
SERVER_END_REQ;
|
||||
if (self) exit( exit_code );
|
||||
return ret;
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
* NtQueryInformationProcess [NTDLL.@]
|
||||
* ZwQueryInformationProcess [NTDLL.@]
|
||||
*
|
||||
*/
|
||||
NTSTATUS WINAPI NtQueryInformationProcess(
|
||||
IN HANDLE ProcessHandle,
|
||||
IN PROCESSINFOCLASS ProcessInformationClass,
|
||||
OUT PVOID ProcessInformation,
|
||||
IN ULONG ProcessInformationLength,
|
||||
OUT PULONG ReturnLength)
|
||||
{
|
||||
NTSTATUS ret = STATUS_SUCCESS;
|
||||
ULONG len = 0;
|
||||
|
||||
switch (ProcessInformationClass)
|
||||
{
|
||||
case ProcessIoCounters:
|
||||
if (ProcessInformationLength == sizeof(IO_COUNTERS))
|
||||
{
|
||||
memset(ProcessInformation, 0, ProcessInformationLength);
|
||||
len = sizeof(IO_COUNTERS);
|
||||
}
|
||||
else ret = STATUS_INFO_LENGTH_MISMATCH;
|
||||
break;
|
||||
case ProcessDebugPort:
|
||||
/* "These are not the debuggers you are looking for." *
|
||||
* set it to 0 aka "no debugger" to satisfy copy protections */
|
||||
if (ProcessInformationLength == 4)
|
||||
{
|
||||
memset(ProcessInformation, 0 ,ProcessInformationLength);
|
||||
len = 4;
|
||||
}
|
||||
else ret = STATUS_INFO_LENGTH_MISMATCH;
|
||||
break;
|
||||
case ProcessWow64Information:
|
||||
if (ProcessInformationLength == 4)
|
||||
{
|
||||
memset(ProcessInformation, 0, ProcessInformationLength);
|
||||
len = 4;
|
||||
}
|
||||
else ret = STATUS_INFO_LENGTH_MISMATCH;
|
||||
break;
|
||||
default:
|
||||
FIXME("(%p,0x%08x,%p,0x%08lx,%p),stub!\n",
|
||||
ProcessHandle,ProcessInformationClass,
|
||||
ProcessInformation,ProcessInformationLength,
|
||||
ReturnLength);
|
||||
ret = STATUS_NOT_IMPLEMENTED;
|
||||
break;
|
||||
}
|
||||
|
||||
if (ReturnLength) *ReturnLength = len;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
* NtSetInformationProcess [NTDLL.@]
|
||||
* ZwSetInformationProcess [NTDLL.@]
|
||||
*/
|
||||
NTSTATUS WINAPI NtSetInformationProcess(
|
||||
IN HANDLE ProcessHandle,
|
||||
IN PROCESSINFOCLASS ProcessInformationClass,
|
||||
IN PVOID ProcessInformation,
|
||||
IN ULONG ProcessInformationLength)
|
||||
{
|
||||
FIXME("(%p,0x%08x,%p,0x%08lx) stub\n",
|
||||
ProcessHandle,ProcessInformationClass,ProcessInformation,ProcessInformationLength);
|
||||
return 0;
|
||||
}
|
|
@ -3600,4 +3600,14 @@ typedef struct _RTL_CRITICAL_SECTION {
|
|||
|
||||
typedef VOID (NTAPI * WAITORTIMERCALLBACKFUNC) (PVOID, BOOLEAN );
|
||||
|
||||
typedef struct _IO_COUNTERS {
|
||||
ULONGLONG ReadOperationCount;
|
||||
ULONGLONG WriteOperationCount;
|
||||
ULONGLONG OtherOperationCount;
|
||||
ULONGLONG ReadTransferCount;
|
||||
ULONGLONG WriteTransferCount;
|
||||
ULONGLONG OtherTransferCount;
|
||||
} IO_COUNTERS;
|
||||
typedef IO_COUNTERS *PIO_COUNTERS;
|
||||
|
||||
#endif /* __WINE_WINNT_H */
|
||||
|
|
Loading…
Reference in New Issue