- Merge from trunk up to r45543
[reactos.git] / dll / win32 / kernel32 / process / proc.c
index 7fe90e6..6affdf8 100644 (file)
 #include <debug.h>
 
 
+typedef INT (WINAPI *MessageBoxW_Proc) (HWND, LPCWSTR, LPCWSTR, UINT);
+
 /* GLOBALS *******************************************************************/
 
 WaitForInputIdleType  lpfnGlobalRegisterWaitForInputIdle;
 
 LPSTARTUPINFOA lpLocalStartupInfo = NULL;
 
-VOID STDCALL
+VOID WINAPI
 RegisterWaitForInputIdle(WaitForInputIdleType lpfnRegisterWaitForInputIdle);
 
 /* FUNCTIONS ****************************************************************/
@@ -31,275 +33,286 @@ RegisterWaitForInputIdle(WaitForInputIdleType lpfnRegisterWaitForInputIdle);
 /*
  * @implemented
  */
-BOOL STDCALL
-GetProcessAffinityMask (HANDLE hProcess,
-                       LPDWORD lpProcessAffinityMask,
-                       LPDWORD lpSystemAffinityMask)
+BOOL
+WINAPI
+GetProcessAffinityMask(HANDLE hProcess,
+                       LPDWORD lpProcessAffinityMask,
+                       LPDWORD lpSystemAffinityMask)
 {
-  PROCESS_BASIC_INFORMATION ProcessInfo;
-  SYSTEM_BASIC_INFORMATION SystemInfo;
-  NTSTATUS Status;
+    PROCESS_BASIC_INFORMATION ProcessInfo;
+    SYSTEM_BASIC_INFORMATION SystemInfo;
+    NTSTATUS Status;
 
-  Status = NtQuerySystemInformation(SystemBasicInformation,
-                                    &SystemInfo,
-                                    sizeof(SystemInfo),
-                                    NULL);
-  if (!NT_SUCCESS(Status))
+    Status = NtQuerySystemInformation(SystemBasicInformation,
+                                      &SystemInfo,
+                                      sizeof(SystemInfo),
+                                      NULL);
+    if (!NT_SUCCESS(Status))
     {
-      SetLastErrorByStatus (Status);
-      return FALSE;
+        SetLastErrorByStatus(Status);
+        return FALSE;
     }
 
-  Status = NtQueryInformationProcess (hProcess,
-                                     ProcessBasicInformation,
-                                     (PVOID)&ProcessInfo,
-                                     sizeof(PROCESS_BASIC_INFORMATION),
-                                     NULL);
-  if (!NT_SUCCESS(Status))
+    Status = NtQueryInformationProcess(hProcess,
+                                       ProcessBasicInformation,
+                                       (PVOID)&ProcessInfo,
+                                       sizeof(PROCESS_BASIC_INFORMATION),
+                                       NULL);
+    if (!NT_SUCCESS(Status))
     {
-      SetLastErrorByStatus (Status);
-      return FALSE;
+        SetLastErrorByStatus(Status);
+        return FALSE;
     }
 
-  *lpProcessAffinityMask = (DWORD)ProcessInfo.AffinityMask;
-  *lpSystemAffinityMask = (DWORD)SystemInfo.ActiveProcessorsAffinityMask;
+    *lpProcessAffinityMask = (DWORD)ProcessInfo.AffinityMask;
+    *lpSystemAffinityMask = (DWORD)SystemInfo.ActiveProcessorsAffinityMask;
 
-  return TRUE;
+    return TRUE;
 }
 
 
 /*
  * @implemented
  */
-BOOL STDCALL
-SetProcessAffinityMask (HANDLE hProcess,
-                       DWORD dwProcessAffinityMask)
+BOOL
+WINAPI
+SetProcessAffinityMask(HANDLE hProcess,
+                       DWORD dwProcessAffinityMask)
 {
-  NTSTATUS Status;
+    NTSTATUS Status;
 
-  Status = NtSetInformationProcess (hProcess,
-                                   ProcessAffinityMask,
-                                   (PVOID)&dwProcessAffinityMask,
-                                   sizeof(DWORD));
-  if (!NT_SUCCESS(Status))
+    Status = NtSetInformationProcess(hProcess,
+                                     ProcessAffinityMask,
+                                     (PVOID)&dwProcessAffinityMask,
+                                     sizeof(DWORD));
+    if (!NT_SUCCESS(Status))
     {
-      SetLastErrorByStatus (Status);
-      return FALSE;
+        SetLastErrorByStatus(Status);
+        return FALSE;
     }
 
-  return TRUE;
+    return TRUE;
 }
 
 
 /*
  * @implemented
  */
-BOOL STDCALL
-GetProcessShutdownParameters (LPDWORD lpdwLevel,
-                             LPDWORD lpdwFlags)
+BOOL
+WINAPI
+GetProcessShutdownParameters(LPDWORD lpdwLevel,
+                             LPDWORD lpdwFlags)
 {
-  CSR_API_MESSAGE CsrRequest;
-  ULONG Request;
-  NTSTATUS Status;
+    CSR_API_MESSAGE CsrRequest;
+    ULONG Request;
+    NTSTATUS Status;
 
-  Request = GET_SHUTDOWN_PARAMETERS;
-  Status = CsrClientCallServer(&CsrRequest,
-                              NULL,
-                   MAKE_CSR_API(Request, CSR_NATIVE),
-                              sizeof(CSR_API_MESSAGE));
-  if (!NT_SUCCESS(Status) || !NT_SUCCESS(CsrRequest.Status))
+    Request = GET_SHUTDOWN_PARAMETERS;
+    Status = CsrClientCallServer(&CsrRequest,
+                                 NULL,
+                                 MAKE_CSR_API(Request, CSR_NATIVE),
+                                 sizeof(CSR_API_MESSAGE));
+    if (!NT_SUCCESS(Status) || !NT_SUCCESS(CsrRequest.Status))
     {
-      SetLastErrorByStatus (Status);
-      return(FALSE);
+        SetLastErrorByStatus(Status);
+        return FALSE;
     }
 
-  *lpdwLevel = CsrRequest.Data.GetShutdownParametersRequest.Level;
-  *lpdwFlags = CsrRequest.Data.GetShutdownParametersRequest.Flags;
+    *lpdwLevel = CsrRequest.Data.GetShutdownParametersRequest.Level;
+    *lpdwFlags = CsrRequest.Data.GetShutdownParametersRequest.Flags;
 
-  return(TRUE);
+    return TRUE;
 }
 
 
 /*
  * @implemented
  */
-BOOL STDCALL
-SetProcessShutdownParameters (DWORD dwLevel,
-                             DWORD dwFlags)
+BOOL
+WINAPI
+SetProcessShutdownParameters(DWORD dwLevel,
+                             DWORD dwFlags)
 {
-  CSR_API_MESSAGE CsrRequest;
-  ULONG Request;
-  NTSTATUS Status;
+    CSR_API_MESSAGE CsrRequest;
+    ULONG Request;
+    NTSTATUS Status;
 
-  CsrRequest.Data.SetShutdownParametersRequest.Level = dwLevel;
-  CsrRequest.Data.SetShutdownParametersRequest.Flags = dwFlags;
+    CsrRequest.Data.SetShutdownParametersRequest.Level = dwLevel;
+    CsrRequest.Data.SetShutdownParametersRequest.Flags = dwFlags;
 
-  Request = SET_SHUTDOWN_PARAMETERS;
-  Status = CsrClientCallServer(&CsrRequest,
-                              NULL,
-                              MAKE_CSR_API(Request, CSR_NATIVE),
-                              sizeof(CSR_API_MESSAGE));
-  if (!NT_SUCCESS(Status) || !NT_SUCCESS(CsrRequest.Status))
+    Request = SET_SHUTDOWN_PARAMETERS;
+    Status = CsrClientCallServer(&CsrRequest,
+                                 NULL,
+                                 MAKE_CSR_API(Request, CSR_NATIVE),
+                                 sizeof(CSR_API_MESSAGE));
+    if (!NT_SUCCESS(Status) || !NT_SUCCESS(CsrRequest.Status))
     {
-      SetLastErrorByStatus (Status);
-      return(FALSE);
+        SetLastErrorByStatus(Status);
+        return FALSE;
     }
 
-  return(TRUE);
+    return TRUE;
 }
 
 
 /*
  * @implemented
  */
-BOOL STDCALL
-GetProcessWorkingSetSize (HANDLE hProcess,
-                         PSIZE_T lpMinimumWorkingSetSize,
-                         PSIZE_T lpMaximumWorkingSetSize)
+BOOL
+WINAPI
+GetProcessWorkingSetSize(HANDLE hProcess,
+                         PSIZE_T lpMinimumWorkingSetSize,
+                         PSIZE_T lpMaximumWorkingSetSize)
 {
-  QUOTA_LIMITS QuotaLimits;
-  NTSTATUS Status;
+    QUOTA_LIMITS QuotaLimits;
+    NTSTATUS Status;
 
-  Status = NtQueryInformationProcess(hProcess,
-                                    ProcessQuotaLimits,
-                                    &QuotaLimits,
-                                    sizeof(QUOTA_LIMITS),
-                                    NULL);
-  if (!NT_SUCCESS(Status))
+    Status = NtQueryInformationProcess(hProcess,
+                                       ProcessQuotaLimits,
+                                       &QuotaLimits,
+                                       sizeof(QUOTA_LIMITS),
+                                       NULL);
+    if (!NT_SUCCESS(Status))
     {
-      SetLastErrorByStatus(Status);
-      return(FALSE);
+        SetLastErrorByStatus(Status);
+        return FALSE;
     }
 
-  *lpMinimumWorkingSetSize = QuotaLimits.MinimumWorkingSetSize;
-  *lpMaximumWorkingSetSize = QuotaLimits.MaximumWorkingSetSize;
+    *lpMinimumWorkingSetSize = QuotaLimits.MinimumWorkingSetSize;
+    *lpMaximumWorkingSetSize = QuotaLimits.MaximumWorkingSetSize;
 
-  return(TRUE);
+    return TRUE;
 }
 
 
 /*
  * @implemented
  */
-BOOL STDCALL
+BOOL
+WINAPI
 SetProcessWorkingSetSize(HANDLE hProcess,
-                        SIZE_T dwMinimumWorkingSetSize,
-                        SIZE_T dwMaximumWorkingSetSize)
+                         SIZE_T dwMinimumWorkingSetSize,
+                         SIZE_T dwMaximumWorkingSetSize)
 {
-  QUOTA_LIMITS QuotaLimits;
-  NTSTATUS Status;
+    QUOTA_LIMITS QuotaLimits;
+    NTSTATUS Status;
 
-  QuotaLimits.MinimumWorkingSetSize = dwMinimumWorkingSetSize;
-  QuotaLimits.MaximumWorkingSetSize = dwMaximumWorkingSetSize;
+    QuotaLimits.MinimumWorkingSetSize = dwMinimumWorkingSetSize;
+    QuotaLimits.MaximumWorkingSetSize = dwMaximumWorkingSetSize;
 
-  Status = NtSetInformationProcess(hProcess,
-                                  ProcessQuotaLimits,
-                                  &QuotaLimits,
-                                  sizeof(QUOTA_LIMITS));
-  if (!NT_SUCCESS(Status))
+    Status = NtSetInformationProcess(hProcess,
+                                     ProcessQuotaLimits,
+                                     &QuotaLimits,
+                                     sizeof(QUOTA_LIMITS));
+    if (!NT_SUCCESS(Status))
     {
-      SetLastErrorByStatus(Status);
-      return(FALSE);
+        SetLastErrorByStatus(Status);
+        return FALSE;
     }
 
-  return(TRUE);
+    return TRUE;
 }
 
 
 /*
  * @implemented
  */
-BOOL STDCALL
+BOOL
+WINAPI
 GetProcessTimes(HANDLE hProcess,
-               LPFILETIME lpCreationTime,
-               LPFILETIME lpExitTime,
-               LPFILETIME lpKernelTime,
-               LPFILETIME lpUserTime)
+                LPFILETIME lpCreationTime,
+                LPFILETIME lpExitTime,
+                LPFILETIME lpKernelTime,
+                LPFILETIME lpUserTime)
 {
-  KERNEL_USER_TIMES Kut;
-  NTSTATUS Status;
+    KERNEL_USER_TIMES Kut;
+    NTSTATUS Status;
 
-  Status = NtQueryInformationProcess(hProcess,
-                                    ProcessTimes,
-                                    &Kut,
-                                    sizeof(Kut),
-                                    NULL);
-  if (!NT_SUCCESS(Status))
+    Status = NtQueryInformationProcess(hProcess,
+                                       ProcessTimes,
+                                       &Kut,
+                                       sizeof(Kut),
+                                       NULL);
+    if (!NT_SUCCESS(Status))
     {
-      SetLastErrorByStatus(Status);
-      return(FALSE);
+        SetLastErrorByStatus(Status);
+        return FALSE;
     }
 
-  lpCreationTime->dwLowDateTime = Kut.CreateTime.u.LowPart;
-  lpCreationTime->dwHighDateTime = Kut.CreateTime.u.HighPart;
+    lpCreationTime->dwLowDateTime = Kut.CreateTime.u.LowPart;
+    lpCreationTime->dwHighDateTime = Kut.CreateTime.u.HighPart;
 
-  lpExitTime->dwLowDateTime = Kut.ExitTime.u.LowPart;
-  lpExitTime->dwHighDateTime = Kut.ExitTime.u.HighPart;
+    lpExitTime->dwLowDateTime = Kut.ExitTime.u.LowPart;
+    lpExitTime->dwHighDateTime = Kut.ExitTime.u.HighPart;
 
-  lpKernelTime->dwLowDateTime = Kut.KernelTime.u.LowPart;
-  lpKernelTime->dwHighDateTime = Kut.KernelTime.u.HighPart;
+    lpKernelTime->dwLowDateTime = Kut.KernelTime.u.LowPart;
+    lpKernelTime->dwHighDateTime = Kut.KernelTime.u.HighPart;
 
-  lpUserTime->dwLowDateTime = Kut.UserTime.u.LowPart;
-  lpUserTime->dwHighDateTime = Kut.UserTime.u.HighPart;
+    lpUserTime->dwLowDateTime = Kut.UserTime.u.LowPart;
+    lpUserTime->dwHighDateTime = Kut.UserTime.u.HighPart;
 
-  return(TRUE);
+    return TRUE;
 }
 
 
 /*
  * @implemented
  */
-HANDLE STDCALL
+HANDLE
+WINAPI
 GetCurrentProcess(VOID)
 {
-  return((HANDLE)NtCurrentProcess());
+    return (HANDLE)NtCurrentProcess();
 }
 
 
 /*
  * @implemented
  */
-HANDLE STDCALL
+HANDLE
+WINAPI
 GetCurrentThread(VOID)
 {
-  return((HANDLE)NtCurrentThread());
+    return (HANDLE)NtCurrentThread();
 }
 
 
 /*
  * @implemented
  */
-DWORD STDCALL
+DWORD
+WINAPI
 GetCurrentProcessId(VOID)
 {
-  return((DWORD)GetTeb()->ClientId.UniqueProcess);
+    return (DWORD)GetTeb()->ClientId.UniqueProcess;
 }
 
 
 /*
  * @implemented
  */
-BOOL STDCALL
+BOOL
+WINAPI
 GetExitCodeProcess(HANDLE hProcess,
-                  LPDWORD lpExitCode)
+                   LPDWORD lpExitCode)
 {
-  PROCESS_BASIC_INFORMATION ProcessBasic;
-  NTSTATUS Status;
+    PROCESS_BASIC_INFORMATION ProcessBasic;
+    NTSTATUS Status;
 
-  Status = NtQueryInformationProcess(hProcess,
-                                    ProcessBasicInformation,
-                                    &ProcessBasic,
-                                    sizeof(PROCESS_BASIC_INFORMATION),
-                                    NULL);
-  if (!NT_SUCCESS(Status))
+    Status = NtQueryInformationProcess(hProcess,
+                                       ProcessBasicInformation,
+                                       &ProcessBasic,
+                                       sizeof(PROCESS_BASIC_INFORMATION),
+                                       NULL);
+    if (!NT_SUCCESS(Status))
     {
-      SetLastErrorByStatus(Status);
-      return(FALSE);
-     }
+        SetLastErrorByStatus(Status);
+        return FALSE;
+    }
 
-  *lpExitCode = (DWORD)ProcessBasic.ExitStatus;
+    *lpExitCode = (DWORD)ProcessBasic.ExitStatus;
 
-  return(TRUE);
+    return TRUE;
 }
 
 
@@ -307,229 +320,233 @@ GetExitCodeProcess(HANDLE hProcess,
  * @implemented
  */
 DWORD
-STDCALL
+WINAPI
 GetProcessId(HANDLE Process)
 {
-  PROCESS_BASIC_INFORMATION ProcessBasic;
-  NTSTATUS Status;
+    PROCESS_BASIC_INFORMATION ProcessBasic;
+    NTSTATUS Status;
 
-  Status = NtQueryInformationProcess(Process,
-                                    ProcessBasicInformation,
-                                    &ProcessBasic,
-                                    sizeof(PROCESS_BASIC_INFORMATION),
-                                    NULL);
-  if (!NT_SUCCESS(Status))
-  {
-    SetLastErrorByStatus(Status);
-    return 0;
-  }
+    Status = NtQueryInformationProcess(Process,
+                                       ProcessBasicInformation,
+                                       &ProcessBasic,
+                                       sizeof(PROCESS_BASIC_INFORMATION),
+                                       NULL);
+    if (!NT_SUCCESS(Status))
+    {
+        SetLastErrorByStatus(Status);
+        return 0;
+    }
 
-  return (DWORD)ProcessBasic.UniqueProcessId;
+    return (DWORD)ProcessBasic.UniqueProcessId;
 }
 
 
 /*
  * @implemented
  */
-HANDLE STDCALL
+HANDLE
+WINAPI
 OpenProcess(DWORD dwDesiredAccess,
-           BOOL bInheritHandle,
-           DWORD dwProcessId)
+            BOOL bInheritHandle,
+            DWORD dwProcessId)
 {
-   NTSTATUS errCode;
-   HANDLE ProcessHandle;
-   OBJECT_ATTRIBUTES ObjectAttributes;
-   CLIENT_ID ClientId;
-
-   ClientId.UniqueProcess = (HANDLE)dwProcessId;
-   ClientId.UniqueThread = 0;
-
-   InitializeObjectAttributes(&ObjectAttributes,
-                              NULL,
-                              (bInheritHandle ? OBJ_INHERIT : 0),
-                              NULL,
-                              NULL);
+    NTSTATUS errCode;
+    HANDLE ProcessHandle;
+    OBJECT_ATTRIBUTES ObjectAttributes;
+    CLIENT_ID ClientId;
+
+    ClientId.UniqueProcess = (HANDLE)dwProcessId;
+    ClientId.UniqueThread = 0;
+
+    InitializeObjectAttributes(&ObjectAttributes,
+                               NULL,
+                               (bInheritHandle ? OBJ_INHERIT : 0),
+                               NULL,
+                               NULL);
+
+    errCode = NtOpenProcess(&ProcessHandle,
+                            dwDesiredAccess,
+                            &ObjectAttributes,
+                            &ClientId);
+    if (!NT_SUCCESS(errCode))
+    {
+        SetLastErrorByStatus(errCode);
+        return NULL;
+    }
 
-   errCode = NtOpenProcess(&ProcessHandle,
-                          dwDesiredAccess,
-                          &ObjectAttributes,
-                          &ClientId);
-   if (!NT_SUCCESS(errCode))
-     {
-       SetLastErrorByStatus (errCode);
-       return NULL;
-     }
-   return ProcessHandle;
+    return ProcessHandle;
 }
 
 
 /*
  * @implemented
  */
-UINT STDCALL
+UINT
+WINAPI
 WinExec(LPCSTR lpCmdLine,
-       UINT uCmdShow)
-{
-   STARTUPINFOA StartupInfo;
-   PROCESS_INFORMATION  ProcessInformation;
-   DWORD dosErr;
-
-   RtlZeroMemory(&StartupInfo, sizeof(StartupInfo));
-   StartupInfo.cb = sizeof(STARTUPINFOA);
-   StartupInfo.wShowWindow = (WORD)uCmdShow;
-   StartupInfo.dwFlags = 0;
-
-   if (! CreateProcessA(NULL,
-                       (PVOID)lpCmdLine,
-                       NULL,
-                       NULL,
-                       FALSE,
-                       0,
-                       NULL,
-                       NULL,
-                       &StartupInfo,
-                       &ProcessInformation))
-     {
-       dosErr = GetLastError();
-       return dosErr < 32 ? dosErr : ERROR_BAD_FORMAT;
-     }
-   if (NULL != lpfnGlobalRegisterWaitForInputIdle)
-     {
-       lpfnGlobalRegisterWaitForInputIdle (
-         ProcessInformation.hProcess,
-          10000
-       );
-     }
-   NtClose(ProcessInformation.hProcess);
-   NtClose(ProcessInformation.hThread);
-
-   return 33; /* Something bigger than 31 means success. */
+        UINT uCmdShow)
+{
+    STARTUPINFOA StartupInfo;
+    PROCESS_INFORMATION  ProcessInformation;
+    DWORD dosErr;
+
+    RtlZeroMemory(&StartupInfo, sizeof(StartupInfo));
+    StartupInfo.cb = sizeof(STARTUPINFOA);
+    StartupInfo.wShowWindow = (WORD)uCmdShow;
+    StartupInfo.dwFlags = 0;
+
+    if (!CreateProcessA(NULL,
+                        (PVOID)lpCmdLine,
+                        NULL,
+                        NULL,
+                        FALSE,
+                        0,
+                        NULL,
+                        NULL,
+                        &StartupInfo,
+                        &ProcessInformation))
+    {
+        dosErr = GetLastError();
+        return dosErr < 32 ? dosErr : ERROR_BAD_FORMAT;
+    }
+
+    if (NULL != lpfnGlobalRegisterWaitForInputIdle)
+    {
+        lpfnGlobalRegisterWaitForInputIdle(ProcessInformation.hProcess,
+                                           10000);
+    }
+
+    NtClose(ProcessInformation.hProcess);
+    NtClose(ProcessInformation.hThread);
+
+    return 33; /* Something bigger than 31 means success. */
 }
 
 
 /*
  * @implemented
  */
-VOID STDCALL
-RegisterWaitForInputIdle (
-       WaitForInputIdleType    lpfnRegisterWaitForInputIdle
-       )
+VOID
+WINAPI
+RegisterWaitForInputIdle(WaitForInputIdleType lpfnRegisterWaitForInputIdle)
 {
-       lpfnGlobalRegisterWaitForInputIdle = lpfnRegisterWaitForInputIdle;
-       return;
+    lpfnGlobalRegisterWaitForInputIdle = lpfnRegisterWaitForInputIdle;
+    return;
 }
 
 /*
  * @implemented
  */
-VOID STDCALL
+VOID
+WINAPI
 GetStartupInfoW(LPSTARTUPINFOW lpStartupInfo)
 {
-  PRTL_USER_PROCESS_PARAMETERS Params;
+    PRTL_USER_PROCESS_PARAMETERS Params;
 
-  if (lpStartupInfo == NULL)
+    if (lpStartupInfo == NULL)
     {
-      SetLastError(ERROR_INVALID_PARAMETER);
-      return;
+        SetLastError(ERROR_INVALID_PARAMETER);
+        return;
     }
 
-  Params = NtCurrentPeb()->ProcessParameters;
-
-  lpStartupInfo->cb = sizeof(STARTUPINFOW);
-  lpStartupInfo->lpDesktop = Params->DesktopInfo.Buffer;
-  lpStartupInfo->lpTitle = Params->WindowTitle.Buffer;
-  lpStartupInfo->dwX = Params->StartingX;
-  lpStartupInfo->dwY = Params->StartingY;
-  lpStartupInfo->dwXSize = Params->CountX;
-  lpStartupInfo->dwYSize = Params->CountY;
-  lpStartupInfo->dwXCountChars = Params->CountCharsX;
-  lpStartupInfo->dwYCountChars = Params->CountCharsY;
-  lpStartupInfo->dwFillAttribute = Params->FillAttribute;
-  lpStartupInfo->dwFlags = Params->WindowFlags;
-  lpStartupInfo->wShowWindow = (WORD)Params->ShowWindowFlags;
-  lpStartupInfo->cbReserved2 = Params->RuntimeData.Length;
-  lpStartupInfo->lpReserved2 = (LPBYTE)Params->RuntimeData.Buffer;
-  
-  lpStartupInfo->hStdInput = Params->StandardInput;
-  lpStartupInfo->hStdOutput = Params->StandardOutput;
-  lpStartupInfo->hStdError = Params->StandardError;
+    Params = NtCurrentPeb()->ProcessParameters;
+
+    lpStartupInfo->cb = sizeof(STARTUPINFOW);
+    lpStartupInfo->lpDesktop = Params->DesktopInfo.Buffer;
+    lpStartupInfo->lpTitle = Params->WindowTitle.Buffer;
+    lpStartupInfo->dwX = Params->StartingX;
+    lpStartupInfo->dwY = Params->StartingY;
+    lpStartupInfo->dwXSize = Params->CountX;
+    lpStartupInfo->dwYSize = Params->CountY;
+    lpStartupInfo->dwXCountChars = Params->CountCharsX;
+    lpStartupInfo->dwYCountChars = Params->CountCharsY;
+    lpStartupInfo->dwFillAttribute = Params->FillAttribute;
+    lpStartupInfo->dwFlags = Params->WindowFlags;
+    lpStartupInfo->wShowWindow = (WORD)Params->ShowWindowFlags;
+    lpStartupInfo->cbReserved2 = Params->RuntimeData.Length;
+    lpStartupInfo->lpReserved2 = (LPBYTE)Params->RuntimeData.Buffer;
+
+    lpStartupInfo->hStdInput = Params->StandardInput;
+    lpStartupInfo->hStdOutput = Params->StandardOutput;
+    lpStartupInfo->hStdError = Params->StandardError;
 }
 
 
 /*
  * @implemented
  */
-VOID STDCALL
+VOID
+WINAPI
 GetStartupInfoA(LPSTARTUPINFOA lpStartupInfo)
 {
-  PRTL_USER_PROCESS_PARAMETERS Params;
-  ANSI_STRING AnsiString;
+    PRTL_USER_PROCESS_PARAMETERS Params;
+    ANSI_STRING AnsiString;
 
-  if (lpStartupInfo == NULL)
+    if (lpStartupInfo == NULL)
     {
-       SetLastError(ERROR_INVALID_PARAMETER);
-       return;
+        SetLastError(ERROR_INVALID_PARAMETER);
+        return;
     }
 
-  Params = NtCurrentPeb ()->ProcessParameters;
+    Params = NtCurrentPeb ()->ProcessParameters;
 
-  RtlAcquirePebLock ();
+    RtlAcquirePebLock ();
 
-  /* FIXME - not thread-safe */
-  if (lpLocalStartupInfo == NULL)
+    /* FIXME - not thread-safe */
+    if (lpLocalStartupInfo == NULL)
     {
-       /* create new local startup info (ansi) */
-       lpLocalStartupInfo = RtlAllocateHeap (RtlGetProcessHeap (),
-                                             0,
-                                             sizeof(STARTUPINFOA));
+        /* create new local startup info (ansi) */
+        lpLocalStartupInfo = RtlAllocateHeap(RtlGetProcessHeap(),
+                                             0,
+                                             sizeof(STARTUPINFOA));
         if (lpLocalStartupInfo == NULL)
         {
-            RtlReleasePebLock ();
+            RtlReleasePebLock();
             SetLastError(ERROR_NOT_ENOUGH_MEMORY);
             return;
         }
 
-       lpLocalStartupInfo->cb = sizeof(STARTUPINFOA);
-
-       /* copy window title string */
-       RtlUnicodeStringToAnsiString (&AnsiString,
-                                     &Params->WindowTitle,
-                                     TRUE);
-       lpLocalStartupInfo->lpTitle = AnsiString.Buffer;
-
-       /* copy desktop info string */
-       RtlUnicodeStringToAnsiString (&AnsiString,
-                                     &Params->DesktopInfo,
-                                     TRUE);
-       lpLocalStartupInfo->lpDesktop = AnsiString.Buffer;
-
-       /* copy shell info string */
-       RtlUnicodeStringToAnsiString (&AnsiString,
-                                     &Params->ShellInfo,
-                                     TRUE);
-       lpLocalStartupInfo->lpReserved = AnsiString.Buffer;
-
-       lpLocalStartupInfo->dwX = Params->StartingX;
-       lpLocalStartupInfo->dwY = Params->StartingY;
-       lpLocalStartupInfo->dwXSize = Params->CountX;
-       lpLocalStartupInfo->dwYSize = Params->CountY;
-       lpLocalStartupInfo->dwXCountChars = Params->CountCharsX;
-       lpLocalStartupInfo->dwYCountChars = Params->CountCharsY;
-       lpLocalStartupInfo->dwFillAttribute = Params->FillAttribute;
-       lpLocalStartupInfo->dwFlags = Params->WindowFlags;
-       lpLocalStartupInfo->wShowWindow = (WORD)Params->ShowWindowFlags;
-       lpLocalStartupInfo->cbReserved2 = Params->RuntimeData.Length;
-       lpLocalStartupInfo->lpReserved2 = (LPBYTE)Params->RuntimeData.Buffer;
-
-       lpLocalStartupInfo->hStdInput = Params->StandardInput;
-       lpLocalStartupInfo->hStdOutput = Params->StandardOutput;
-       lpLocalStartupInfo->hStdError = Params->StandardError;
-     }
-
-   RtlReleasePebLock ();
-
-   /* copy local startup info data to external startup info */
-   memcpy (lpStartupInfo,
+        lpLocalStartupInfo->cb = sizeof(STARTUPINFOA);
+
+        /* copy window title string */
+        RtlUnicodeStringToAnsiString(&AnsiString,
+                                     &Params->WindowTitle,
+                                     TRUE);
+        lpLocalStartupInfo->lpTitle = AnsiString.Buffer;
+
+        /* copy desktop info string */
+        RtlUnicodeStringToAnsiString(&AnsiString,
+                                     &Params->DesktopInfo,
+                                     TRUE);
+        lpLocalStartupInfo->lpDesktop = AnsiString.Buffer;
+
+        /* copy shell info string */
+        RtlUnicodeStringToAnsiString(&AnsiString,
+                                     &Params->ShellInfo,
+                                     TRUE);
+        lpLocalStartupInfo->lpReserved = AnsiString.Buffer;
+
+        lpLocalStartupInfo->dwX = Params->StartingX;
+        lpLocalStartupInfo->dwY = Params->StartingY;
+        lpLocalStartupInfo->dwXSize = Params->CountX;
+        lpLocalStartupInfo->dwYSize = Params->CountY;
+        lpLocalStartupInfo->dwXCountChars = Params->CountCharsX;
+        lpLocalStartupInfo->dwYCountChars = Params->CountCharsY;
+        lpLocalStartupInfo->dwFillAttribute = Params->FillAttribute;
+        lpLocalStartupInfo->dwFlags = Params->WindowFlags;
+        lpLocalStartupInfo->wShowWindow = (WORD)Params->ShowWindowFlags;
+        lpLocalStartupInfo->cbReserved2 = Params->RuntimeData.Length;
+        lpLocalStartupInfo->lpReserved2 = (LPBYTE)Params->RuntimeData.Buffer;
+
+        lpLocalStartupInfo->hStdInput = Params->StandardInput;
+        lpLocalStartupInfo->hStdOutput = Params->StandardOutput;
+        lpLocalStartupInfo->hStdError = Params->StandardError;
+    }
+
+    RtlReleasePebLock();
+
+    /* copy local startup info data to external startup info */
+    memcpy(lpStartupInfo,
            lpLocalStartupInfo,
            sizeof(STARTUPINFOA));
 }
@@ -538,129 +555,157 @@ GetStartupInfoA(LPSTARTUPINFOA lpStartupInfo)
 /*
  * @implemented
  */
-BOOL STDCALL
-FlushInstructionCache (HANDLE  hProcess,
-                      LPCVOID  lpBaseAddress,
-                      DWORD    dwSize)
+BOOL
+WINAPI
+FlushInstructionCache(HANDLE hProcess,
+                      LPCVOID lpBaseAddress,
+                      DWORD dwSize)
 {
-  NTSTATUS Status;
+    NTSTATUS Status;
 
-  Status = NtFlushInstructionCache(hProcess,
-                                  (PVOID)lpBaseAddress,
-                                  dwSize);
-  if (!NT_SUCCESS(Status))
+    Status = NtFlushInstructionCache(hProcess,
+                                     (PVOID)lpBaseAddress,
+                                     dwSize);
+    if (!NT_SUCCESS(Status))
     {
-      SetLastErrorByStatus(Status);
-      return FALSE;
+        SetLastErrorByStatus(Status);
+        return FALSE;
     }
-  return TRUE;
+
+    return TRUE;
 }
 
 
 /*
  * @implemented
  */
-VOID STDCALL
+VOID
+WINAPI
 ExitProcess(UINT uExitCode)
 {
-  CSR_API_MESSAGE CsrRequest;
-  ULONG Request;
-  NTSTATUS Status;
+    CSR_API_MESSAGE CsrRequest;
+    ULONG Request;
+    NTSTATUS Status;
 
-  /* kill sibling threads ... we want to be alone at this point */
-  NtTerminateProcess (NULL, 0);
+    /* kill sibling threads ... we want to be alone at this point */
+    NtTerminateProcess(NULL, 0);
 
-  /* unload all dll's */
-  LdrShutdownProcess ();
+    /* unload all dll's */
+    LdrShutdownProcess();
 
-  /* notify csrss of process termination */
-  Request = TERMINATE_PROCESS;
-  Status = CsrClientCallServer(&CsrRequest,
-                              NULL,
-                   MAKE_CSR_API(Request, CSR_NATIVE),
-                              sizeof(CSR_API_MESSAGE));
-  if (!NT_SUCCESS(Status) || !NT_SUCCESS(CsrRequest.Status))
+    /* notify csrss of process termination */
+    Request = TERMINATE_PROCESS;
+    Status = CsrClientCallServer(&CsrRequest,
+                                 NULL,
+                                 MAKE_CSR_API(Request, CSR_NATIVE),
+                                 sizeof(CSR_API_MESSAGE));
+    if (!NT_SUCCESS(Status) || !NT_SUCCESS(CsrRequest.Status))
     {
-      DPRINT("Failed to tell csrss about terminating process\n");
+        DPRINT("Failed to tell csrss about terminating process\n");
     }
 
+    NtTerminateProcess(NtCurrentProcess (),
+                       uExitCode);
 
-  NtTerminateProcess (NtCurrentProcess (),
-                     uExitCode);
-
-  /* should never get here */
-  ASSERT(0);
-  while(1);
+    /* should never get here */
+    ASSERT(0);
+    while(1);
 }
 
 
 /*
  * @implemented
  */
-BOOL STDCALL
-TerminateProcess (HANDLE       hProcess,
-                 UINT  uExitCode)
+BOOL
+WINAPI
+TerminateProcess(HANDLE hProcess,
+                 UINT uExitCode)
 {
-  NTSTATUS Status;
+    NTSTATUS Status;
 
-  Status = NtTerminateProcess (hProcess, uExitCode);
-  if (NT_SUCCESS(Status))
+    if (hProcess == NULL)
     {
-      return TRUE;
+      return FALSE;
     }
-  SetLastErrorByStatus (Status);
-  return FALSE;
+
+    Status = NtTerminateProcess(hProcess, uExitCode);
+    if (NT_SUCCESS(Status))
+    {
+        return TRUE;
+    }
+
+    SetLastErrorByStatus(Status);
+    return FALSE;
 }
 
 
 /*
  * @unimplemented
  */
-VOID STDCALL
-FatalAppExitA (UINT    uAction,
-              LPCSTR   lpMessageText)
+VOID
+WINAPI
+FatalAppExitA(UINT uAction,
+              LPCSTR lpMessageText)
 {
-  UNICODE_STRING MessageTextU;
-  ANSI_STRING MessageText;
+    UNICODE_STRING MessageTextU;
+    ANSI_STRING MessageText;
 
-  RtlInitAnsiString (&MessageText, (LPSTR) lpMessageText);
+    RtlInitAnsiString(&MessageText, (LPSTR)lpMessageText);
 
-  RtlAnsiStringToUnicodeString (&MessageTextU,
-                               &MessageText,
-                               TRUE);
+    RtlAnsiStringToUnicodeString(&MessageTextU,
+                                 &MessageText,
+                                 TRUE);
 
-  FatalAppExitW (uAction, MessageTextU.Buffer);
+    FatalAppExitW(uAction, MessageTextU.Buffer);
 
-  RtlFreeUnicodeString (&MessageTextU);
+    RtlFreeUnicodeString(&MessageTextU);
 }
 
 
 /*
  * @unimplemented
  */
-VOID STDCALL
+VOID
+WINAPI
 FatalAppExitW(UINT uAction,
-             LPCWSTR lpMessageText)
+              LPCWSTR lpMessageText)
 {
-  return;
+    static const WCHAR szUser32[] = L"user32.dll\0";
+
+    HMODULE hModule = GetModuleHandleW(szUser32);
+    MessageBoxW_Proc pMessageBoxW = NULL;
+
+    DPRINT1("AppExit\n");
+
+    if (hModule)
+        pMessageBoxW = (MessageBoxW_Proc)GetProcAddress(hModule, "MessageBoxW");
+
+    if (pMessageBoxW)
+        pMessageBoxW(0, lpMessageText, NULL, MB_SYSTEMMODAL | MB_OK);
+    else
+        DPRINT1("%s\n", lpMessageText);
+
+    ExitProcess(0);
 }
 
 
 /*
  * @implemented
  */
-VOID STDCALL
-FatalExit (int ExitCode)
+VOID
+WINAPI
+FatalExit(int ExitCode)
 {
-  ExitProcess(ExitCode);
+    ExitProcess(ExitCode);
 }
 
 
 /*
  * @implemented
  */
-DWORD STDCALL
-GetPriorityClass (HANDLE hProcess)
+DWORD
+WINAPI
+GetPriorityClass(HANDLE hProcess)
 {
   NTSTATUS Status;
   PROCESS_PRIORITY_CLASS PriorityClass;
@@ -705,89 +750,152 @@ GetPriorityClass (HANDLE hProcess)
 /*
  * @implemented
  */
-BOOL STDCALL
-SetPriorityClass (HANDLE hProcess,
-                 DWORD dwPriorityClass)
+BOOL
+WINAPI
+SetPriorityClass(HANDLE hProcess,
+                 DWORD dwPriorityClass)
 {
-  NTSTATUS Status;
-  PROCESS_PRIORITY_CLASS PriorityClass;
-
-  switch(dwPriorityClass)
-  {
-    case IDLE_PRIORITY_CLASS:
-      PriorityClass.PriorityClass = PROCESS_PRIORITY_CLASS_IDLE;
-      break;
+    NTSTATUS Status;
+    PROCESS_PRIORITY_CLASS PriorityClass;
 
-    case BELOW_NORMAL_PRIORITY_CLASS:
-      PriorityClass.PriorityClass = PROCESS_PRIORITY_CLASS_BELOW_NORMAL;
-      break;
+    switch (dwPriorityClass)
+    {
+        case IDLE_PRIORITY_CLASS:
+            PriorityClass.PriorityClass = PROCESS_PRIORITY_CLASS_IDLE;
+            break;
 
-    case NORMAL_PRIORITY_CLASS:
-      PriorityClass.PriorityClass = PROCESS_PRIORITY_CLASS_NORMAL;
-      break;
+        case BELOW_NORMAL_PRIORITY_CLASS:
+            PriorityClass.PriorityClass = PROCESS_PRIORITY_CLASS_BELOW_NORMAL;
+            break;
 
-    case ABOVE_NORMAL_PRIORITY_CLASS:
-      PriorityClass.PriorityClass = PROCESS_PRIORITY_CLASS_ABOVE_NORMAL;
-      break;
+        case NORMAL_PRIORITY_CLASS:
+            PriorityClass.PriorityClass = PROCESS_PRIORITY_CLASS_NORMAL;
+            break;
 
-    case HIGH_PRIORITY_CLASS:
-      PriorityClass.PriorityClass = PROCESS_PRIORITY_CLASS_HIGH;
-      break;
+        case ABOVE_NORMAL_PRIORITY_CLASS:
+            PriorityClass.PriorityClass = PROCESS_PRIORITY_CLASS_ABOVE_NORMAL;
+            break;
 
-    case REALTIME_PRIORITY_CLASS:
-      PriorityClass.PriorityClass = PROCESS_PRIORITY_CLASS_REALTIME;
-      break;
+        case HIGH_PRIORITY_CLASS:
+            PriorityClass.PriorityClass = PROCESS_PRIORITY_CLASS_HIGH;
+            break;
 
-    default:
-      SetLastError(ERROR_INVALID_PARAMETER);
-      return FALSE;
-  }
+        case REALTIME_PRIORITY_CLASS:
+            PriorityClass.PriorityClass = PROCESS_PRIORITY_CLASS_REALTIME;
+            break;
 
-  PriorityClass.Foreground = FALSE;
+        default:
+            SetLastError(ERROR_INVALID_PARAMETER);
+            return FALSE;
+    }
 
-  Status = NtSetInformationProcess(hProcess,
-                                   ProcessPriorityClass,
-                                   &PriorityClass,
-                                   sizeof(PROCESS_PRIORITY_CLASS));
+    PriorityClass.Foreground = FALSE;
 
-  if(!NT_SUCCESS(Status))
-  {
-    SetLastErrorByStatus(Status);
-    return FALSE;
-  }
+    Status = NtSetInformationProcess(hProcess,
+                                     ProcessPriorityClass,
+                                     &PriorityClass,
+                                     sizeof(PROCESS_PRIORITY_CLASS));
+    if (!NT_SUCCESS(Status))
+    {
+        SetLastErrorByStatus(Status);
+        return FALSE;
+    }
 
-  return TRUE;
+    return TRUE;
 }
 
 
 /*
  * @implemented
  */
-DWORD STDCALL
-GetProcessVersion (DWORD ProcessId)
+DWORD
+WINAPI
+GetProcessVersion(DWORD ProcessId)
 {
-  DWORD                        Version = 0;
-  PIMAGE_NT_HEADERS    NtHeader = NULL;
-  PVOID                        BaseAddress = NULL;
+    DWORD Version = 0;
+    PIMAGE_NT_HEADERS NtHeader = NULL;
+    IMAGE_NT_HEADERS NtHeaders;
+    IMAGE_DOS_HEADER DosHeader;
+    PROCESS_BASIC_INFORMATION ProcessBasicInfo;
+    PVOID BaseAddress = NULL;
+    HANDLE ProcessHandle = NULL;
+    NTSTATUS Status;
+    SIZE_T Count;
+    PEB Peb;
 
-  /* Caller's */
-  if (0 == ProcessId || GetCurrentProcessId() == ProcessId)
+    _SEH2_TRY
     {
-      BaseAddress = (PVOID) NtCurrentPeb()->ImageBaseAddress;
-      NtHeader = RtlImageNtHeader (BaseAddress);
-      if (NULL != NtHeader)
-       {
-         Version =
-           (NtHeader->OptionalHeader.MajorOperatingSystemVersion << 16) |
-           (NtHeader->OptionalHeader.MinorOperatingSystemVersion);
-       }
+        if (0 == ProcessId || GetCurrentProcessId() == ProcessId)
+        {
+            /* Caller's */
+            BaseAddress = (PVOID) NtCurrentPeb()->ImageBaseAddress;
+            NtHeader = RtlImageNtHeader(BaseAddress);
+
+            Version = (NtHeader->OptionalHeader.MajorOperatingSystemVersion << 16) |
+                      (NtHeader->OptionalHeader.MinorOperatingSystemVersion);
+        }
+        else
+        {
+            /* Other process */
+            ProcessHandle = OpenProcess(PROCESS_VM_READ | PROCESS_QUERY_INFORMATION,
+                                        FALSE,
+                                        ProcessId);
+
+            if (!ProcessHandle) return 0;
+
+            Status = NtQueryInformationProcess(ProcessHandle,
+                                               ProcessBasicInformation,
+                                               &ProcessBasicInfo,
+                                               sizeof(ProcessBasicInfo),
+                                               NULL);
+
+            if (!NT_SUCCESS(Status)) goto Error;
+
+            Status = NtReadVirtualMemory(ProcessHandle,
+                                         ProcessBasicInfo.PebBaseAddress,
+                                         &Peb,
+                                         sizeof(Peb),
+                                         &Count);
+
+            if (!NT_SUCCESS(Status) || Count != sizeof(Peb)) goto Error;
+
+            memset(&DosHeader, 0, sizeof(DosHeader));
+            Status = NtReadVirtualMemory(ProcessHandle,
+                                         Peb.ImageBaseAddress,
+                                         &DosHeader,
+                                         sizeof(DosHeader),
+                                         &Count);
+
+            if (!NT_SUCCESS(Status) || Count != sizeof(DosHeader)) goto Error;
+            if (DosHeader.e_magic != IMAGE_DOS_SIGNATURE) goto Error;
+
+            memset(&NtHeaders, 0, sizeof(NtHeaders));
+            Status = NtReadVirtualMemory(ProcessHandle,
+                                         (char *)Peb.ImageBaseAddress + DosHeader.e_lfanew,
+                                         &NtHeaders,
+                                         sizeof(NtHeaders),
+                                         &Count);
+
+            if (!NT_SUCCESS(Status) || Count != sizeof(NtHeaders)) goto Error;
+            if (NtHeaders.Signature != IMAGE_NT_SIGNATURE) goto Error;
+
+            Version = MAKELONG(NtHeaders.OptionalHeader.MinorSubsystemVersion,
+                               NtHeaders.OptionalHeader.MajorSubsystemVersion);
+
+Error:
+            if (!NT_SUCCESS(Status))
+            {
+                SetLastErrorByStatus(Status);
+            }
+        }
     }
-  else /* other process */
+    _SEH2_FINALLY
     {
-      /* FIXME: open the other process */
-      SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+        if (ProcessHandle) CloseHandle(ProcessHandle);
     }
-  return (Version);
+    _SEH2_END;
+
+    return Version;
 }
 
 
@@ -795,25 +903,24 @@ GetProcessVersion (DWORD ProcessId)
  * @implemented
  */
 BOOL
-STDCALL
-GetProcessIoCounters(
-  HANDLE hProcess,
-  PIO_COUNTERS lpIoCounters)
+WINAPI
+GetProcessIoCounters(HANDLE hProcess,
+                     PIO_COUNTERS lpIoCounters)
 {
-  NTSTATUS Status;
+    NTSTATUS Status;
 
-  Status = NtQueryInformationProcess(hProcess,
-                                    ProcessIoCounters,
-                                    lpIoCounters,
-                                    sizeof(IO_COUNTERS),
-                                    NULL);
-  if (!NT_SUCCESS(Status))
+    Status = NtQueryInformationProcess(hProcess,
+                                       ProcessIoCounters,
+                                       lpIoCounters,
+                                       sizeof(IO_COUNTERS),
+                                       NULL);
+    if (!NT_SUCCESS(Status))
     {
-      SetLastErrorByStatus(Status);
-      return(FALSE);
+        SetLastErrorByStatus(Status);
+        return FALSE;
     }
 
-  return TRUE;
+    return TRUE;
 }
 
 
@@ -821,26 +928,26 @@ GetProcessIoCounters(
  * @implemented
  */
 BOOL
-STDCALL
+WINAPI
 GetProcessPriorityBoost(HANDLE hProcess,
                         PBOOL pDisablePriorityBoost)
 {
-  NTSTATUS Status;
-  ULONG PriorityBoost;
+    NTSTATUS Status;
+    ULONG PriorityBoost;
 
-  Status = NtQueryInformationProcess(hProcess,
-                                    ProcessPriorityBoost,
-                                    &PriorityBoost,
-                                    sizeof(ULONG),
-                                    NULL);
-  if (NT_SUCCESS(Status))
+    Status = NtQueryInformationProcess(hProcess,
+                                       ProcessPriorityBoost,
+                                       &PriorityBoost,
+                                       sizeof(ULONG),
+                                       NULL);
+    if (NT_SUCCESS(Status))
     {
-      *pDisablePriorityBoost = PriorityBoost;
-      return TRUE;
+        *pDisablePriorityBoost = PriorityBoost;
+        return TRUE;
     }
 
-  SetLastErrorByStatus(Status);
-  return FALSE;
+    SetLastErrorByStatus(Status);
+    return FALSE;
 }
 
 
@@ -848,24 +955,24 @@ GetProcessPriorityBoost(HANDLE hProcess,
  * @implemented
  */
 BOOL
-STDCALL
+WINAPI
 SetProcessPriorityBoost(HANDLE hProcess,
                         BOOL bDisablePriorityBoost)
 {
-  NTSTATUS Status;
-  ULONG PriorityBoost = (bDisablePriorityBoost ? TRUE : FALSE); /* prevent setting values other than 1 and 0 */
+    NTSTATUS Status;
+    ULONG PriorityBoost = (bDisablePriorityBoost ? TRUE : FALSE); /* prevent setting values other than 1 and 0 */
 
-  Status = NtSetInformationProcess(hProcess,
-                                  ProcessPriorityBoost,
-                                  &PriorityBoost,
-                                  sizeof(ULONG));
-  if (!NT_SUCCESS(Status))
+    Status = NtSetInformationProcess(hProcess,
+                                     ProcessPriorityBoost,
+                                     &PriorityBoost,
+                                     sizeof(ULONG));
+    if (!NT_SUCCESS(Status))
     {
-      SetLastErrorByStatus(Status);
-      return FALSE;
+        SetLastErrorByStatus(Status);
+        return FALSE;
     }
 
-  return TRUE;
+    return TRUE;
 }
 
 
@@ -873,7 +980,7 @@ SetProcessPriorityBoost(HANDLE hProcess,
  * @implemented
  */
 BOOL
-STDCALL
+WINAPI
 GetProcessHandleCount(HANDLE hProcess,
                       PDWORD pdwHandleCount)
 {
@@ -895,4 +1002,136 @@ GetProcessHandleCount(HANDLE hProcess,
     return FALSE;
 }
 
+
+/*
+ * @implemented
+ */
+BOOL
+WINAPI
+IsWow64Process(HANDLE hProcess,
+               PBOOL Wow64Process)
+{
+    ULONG pbi;
+    NTSTATUS Status;
+
+    Status = NtQueryInformationProcess(hProcess,
+                                       ProcessWow64Information,
+                                       &pbi,
+                                       sizeof(pbi),
+                                       NULL);
+    if (!NT_SUCCESS(Status))
+    {
+        SetLastError(RtlNtStatusToDosError(Status));
+        return FALSE;
+    }
+
+    *Wow64Process = (pbi != 0);
+
+    return TRUE;
+}
+
+
+/*
+ * @implemented
+ */
+BOOL
+WINAPI
+QueryFullProcessImageNameW(HANDLE hProcess,
+                           DWORD dwFlags,
+                           LPWSTR lpExeName,
+                           PDWORD pdwSize)
+{
+    BYTE Buffer[sizeof(UNICODE_STRING) + MAX_PATH * sizeof(WCHAR)];
+    UNICODE_STRING *DynamicBuffer = NULL;
+    UNICODE_STRING *Result = NULL;
+    NTSTATUS Status;
+    DWORD Needed;
+
+    Status = NtQueryInformationProcess(hProcess,
+                                       ProcessImageFileName,
+                                       Buffer,
+                                       sizeof(Buffer) - sizeof(WCHAR),
+                                       &Needed);
+    if (Status == STATUS_INFO_LENGTH_MISMATCH)
+    {
+        DynamicBuffer = RtlAllocateHeap(RtlGetProcessHeap(), 0, Needed + sizeof(WCHAR));
+        if (!DynamicBuffer)
+        {
+            SetLastErrorByStatus(STATUS_NO_MEMORY);
+            return FALSE;
+        }
+
+        Status = NtQueryInformationProcess(hProcess,
+                                           ProcessImageFileName,
+                                           (LPBYTE)DynamicBuffer,
+                                           Needed,
+                                           &Needed);
+        Result = DynamicBuffer;
+    }
+    else Result = (PUNICODE_STRING)Buffer;
+
+    if (!NT_SUCCESS(Status)) goto Cleanup;
+
+    if (Result->Length / sizeof(WCHAR) + 1 > *pdwSize)
+    {
+        Status = STATUS_BUFFER_TOO_SMALL;
+        goto Cleanup;
+    }
+
+    *pdwSize = Result->Length / sizeof(WCHAR);
+    memcpy(lpExeName, Result->Buffer, Result->Length);
+    lpExeName[*pdwSize] = 0;
+
+Cleanup:
+    RtlFreeHeap(RtlGetProcessHeap(), 0, DynamicBuffer);
+
+    if (!NT_SUCCESS(Status))
+    {
+        SetLastErrorByStatus(Status);
+    }
+
+    return !Status;
+}
+
+
+/*
+ * @implemented
+ */
+BOOL
+WINAPI
+QueryFullProcessImageNameA(HANDLE hProcess,
+                           DWORD dwFlags,
+                           LPSTR lpExeName,
+                           PDWORD pdwSize)
+{
+    DWORD pdwSizeW = *pdwSize;
+    BOOL Result;
+    LPWSTR lpExeNameW;
+
+    lpExeNameW = RtlAllocateHeap(RtlGetProcessHeap(),
+                                 HEAP_ZERO_MEMORY,
+                                 *pdwSize * sizeof(WCHAR));
+    if (!lpExeNameW)
+    {
+        SetLastErrorByStatus(STATUS_NO_MEMORY);
+        return FALSE;
+    }
+
+    Result = QueryFullProcessImageNameW(hProcess, dwFlags, lpExeNameW, &pdwSizeW);
+
+    if (Result)
+        Result = (0 != WideCharToMultiByte(CP_ACP, 0,
+                                           lpExeNameW,
+                                           -1,
+                                           lpExeName,
+                                           *pdwSize,
+                                           NULL, NULL));
+
+    if (Result)
+        *pdwSize = strlen(lpExeName);
+
+    RtlFreeHeap(RtlGetProcessHeap(), 0, lpExeNameW);
+    return Result;
+}
+
 /* EOF */