diff --git a/dlls/kernel/kernel32.spec b/dlls/kernel/kernel32.spec index be98e8e2f72..cd74fb447e2 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 f01730fc144..36305f08a68 100644 --- a/dlls/kernel/process.c +++ b/dlls/kernel/process.c @@ -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.@) diff --git a/dlls/ntdll/Makefile.in b/dlls/ntdll/Makefile.in index a8205342cfc..03db1c9f83b 100644 --- a/dlls/ntdll/Makefile.in +++ b/dlls/ntdll/Makefile.in @@ -51,6 +51,7 @@ C_SRCS = \ 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 b1ef4af2a35..bb12cea9fd0 100644 --- a/dlls/ntdll/nt.c +++ b/dlls/ntdll/nt.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 */ diff --git a/dlls/ntdll/process.c b/dlls/ntdll/process.c new file mode 100644 index 00000000000..b85e4735e63 --- /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 +#include +#include +#include +#include +#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 4102b8904c4..6dba3e2510a 100644 --- a/include/winnt.h +++ b/include/winnt.h @@ -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 */