Implemented kernel32.GetIoProcessCounters and stubbed
ntdll.NtQueryProcessInformation(ProcessIoCounters).
diff --git a/dlls/kernel/kernel32.spec b/dlls/kernel/kernel32.spec
index be98e8e..cd74fb4 100644
--- a/dlls/kernel/kernel32.spec
+++ b/dlls/kernel/kernel32.spec
@@ -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)
diff --git a/dlls/kernel/process.c b/dlls/kernel/process.c
index f01730f..36305f0 100644
--- a/dlls/kernel/process.c
+++ b/dlls/kernel/process.c
@@ -2024,6 +2024,20 @@
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.@)
diff --git a/dlls/ntdll/Makefile.in b/dlls/ntdll/Makefile.in
index a820534..03db1c9 100644
--- a/dlls/ntdll/Makefile.in
+++ b/dlls/ntdll/Makefile.in
@@ -51,6 +51,7 @@
nt.c \
om.c \
path.c \
+ process.c \
reg.c \
resource.c \
rtl.c \
diff --git a/dlls/ntdll/nt.c b/dlls/ntdll/nt.c
index b1ef4af..bb12cea 100644
--- a/dlls/ntdll/nt.c
+++ b/dlls/ntdll/nt.c
@@ -73,98 +73,6 @@
} 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
*/
diff --git a/dlls/ntdll/process.c b/dlls/ntdll/process.c
new file mode 100644
index 0000000..b85e473
--- /dev/null
+++ b/dlls/ntdll/process.c
@@ -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;
+}
diff --git a/include/winnt.h b/include/winnt.h
index 4102b89..6dba3e2 100644
--- a/include/winnt.h
+++ b/include/winnt.h
@@ -3600,4 +3600,14 @@
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 */