Added support for ANAT (Anadyr Standard Time) to TZ_INFO.
[wine] / dlls / ntdll / process.c
1 /*
2  * NT basis DLL
3  *
4  * This file contains the Nt* API functions of NTDLL.DLL.
5  * In the original ntdll.dll they all seem to just call int 0x2e (down to the NTOSKRNL)
6  *
7  * Copyright 1996-1998 Marcus Meissner
8  *
9  * This library is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Lesser General Public
11  * License as published by the Free Software Foundation; either
12  * version 2.1 of the License, or (at your option) any later version.
13  *
14  * This library is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17  * Lesser General Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public
20  * License along with this library; if not, write to the Free Software
21  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
22  */
23
24 #include <stdarg.h>
25 #include <stdio.h>
26 #include <stdlib.h>
27 #include <string.h>
28 #include <time.h>
29 #include "wine/debug.h"
30
31 #include "windef.h"
32 #include "winbase.h"
33 #include "winreg.h"
34 #include "winternl.h"
35 #include "ntdll_misc.h"
36 #include "wine/server.h"
37
38 WINE_DEFAULT_DEBUG_CHANNEL(ntdll);
39
40 /*
41  *      Process object
42  */
43
44 /******************************************************************************
45  *  NtTerminateProcess                  [NTDLL.@]
46  *
47  *  Native applications must kill themselves when done
48  */
49 NTSTATUS WINAPI NtTerminateProcess( HANDLE handle, LONG exit_code )
50 {
51     NTSTATUS ret;
52     BOOL self;
53     SERVER_START_REQ( terminate_process )
54     {
55         req->handle    = handle;
56         req->exit_code = exit_code;
57         ret = wine_server_call( req );
58         self = !ret && reply->self;
59     }
60     SERVER_END_REQ;
61     if (self) exit( exit_code );
62     return ret;
63 }
64
65 /******************************************************************************
66 *  NtQueryInformationProcess            [NTDLL.@]
67 *  ZwQueryInformationProcess            [NTDLL.@]
68 *
69 */
70 NTSTATUS WINAPI NtQueryInformationProcess(
71         IN HANDLE ProcessHandle,
72         IN PROCESSINFOCLASS ProcessInformationClass,
73         OUT PVOID ProcessInformation,
74         IN ULONG ProcessInformationLength,
75         OUT PULONG ReturnLength)
76 {
77     NTSTATUS ret = STATUS_SUCCESS;
78     ULONG len = 0;
79
80     switch (ProcessInformationClass) 
81     {
82     case ProcessBasicInformation:
83         if (ProcessInformationLength == sizeof(PROCESS_BASIC_INFORMATION))
84         {
85             SERVER_START_REQ(get_process_info)
86             {
87                 req->handle = ProcessHandle;
88                 if ((ret = wine_server_call( req )) == STATUS_SUCCESS)
89                 {
90                     PROCESS_BASIC_INFORMATION* pbi = (PROCESS_BASIC_INFORMATION*)ProcessInformation;
91                     pbi->ExitStatus = reply->exit_code;
92                     pbi->PebBaseAddress = (DWORD)reply->peb;
93                     pbi->AffinityMask = reply->process_affinity;
94                     pbi->BasePriority = reply->priority;
95                     pbi->UniqueProcessId = reply->pid;
96                     pbi->InheritedFromUniqueProcessId = reply->ppid;
97                 }
98             }
99             SERVER_END_REQ;
100         }
101         else ret = STATUS_INFO_LENGTH_MISMATCH;
102         break;
103     case ProcessIoCounters:
104         if (ProcessInformationLength == sizeof(IO_COUNTERS))
105         {
106             memset(ProcessInformation, 0, ProcessInformationLength);
107             len = sizeof(IO_COUNTERS);
108         }
109         else ret = STATUS_INFO_LENGTH_MISMATCH;
110         break;
111     case ProcessDebugPort:
112         /* "These are not the debuggers you are looking for." *
113          * set it to 0 aka "no debugger" to satisfy copy protections */
114         if (ProcessInformationLength == 4)
115         {
116             memset(ProcessInformation, 0, ProcessInformationLength);
117             len = 4;
118         }
119         else ret = STATUS_INFO_LENGTH_MISMATCH;
120         break;
121     case ProcessWow64Information:
122         if (ProcessInformationLength == 4)
123         {
124             memset(ProcessInformation, 0, ProcessInformationLength);
125             len = 4;
126         }
127         else ret = STATUS_INFO_LENGTH_MISMATCH;
128         break;
129     default:
130         FIXME("(%p,0x%08x,%p,0x%08lx,%p),stub!\n",
131               ProcessHandle,ProcessInformationClass,
132               ProcessInformation,ProcessInformationLength,
133               ReturnLength);
134         ret = STATUS_NOT_IMPLEMENTED;
135         break;
136     }
137
138     if (ReturnLength) *ReturnLength = len;
139     
140     return ret;
141 }
142
143 /******************************************************************************
144  * NtSetInformationProcess [NTDLL.@]
145  * ZwSetInformationProcess [NTDLL.@]
146  */
147 NTSTATUS WINAPI NtSetInformationProcess(
148         IN HANDLE ProcessHandle,
149         IN PROCESSINFOCLASS ProcessInformationClass,
150         IN PVOID ProcessInformation,
151         IN ULONG ProcessInformationLength)
152 {
153     FIXME("(%p,0x%08x,%p,0x%08lx) stub\n",
154           ProcessHandle,ProcessInformationClass,ProcessInformation,ProcessInformationLength);
155     return 0;
156 }
157
158 /******************************************************************************
159  * NtFlushInstructionCache [NTDLL.@]
160  * ZwFlushInstructionCache [NTDLL.@]
161  */
162 NTSTATUS WINAPI NtFlushInstructionCache(
163         IN HANDLE ProcessHandle,
164         IN LPCVOID BaseAddress,
165         IN ULONG Size)
166 {
167 #ifdef __i386__
168     TRACE("%p %p %ld - no-op on x86\n", ProcessHandle, BaseAddress, Size );
169 #else
170     FIXME("%p %p %ld\n", ProcessHandle, BaseAddress, Size );
171 #endif
172     return STATUS_SUCCESS;
173 }