Compare commits

...

35 Commits

Author SHA1 Message Date
Maj Soklič 1aa2d9e37b
Merge a1a00c8a79 into dcf9eb060a 2024-04-27 08:53:21 +08:00
Marcin Jabłoński dcf9eb060a
[SHELL32] Fix Control_RunDLLW (#5400)
This commit makes Control_RunDLLW pass all but one tests from rostests (the one test that fails is the first one, but it only fails if the path to the test program contains a space).

- Rework string parsing in the Control_DoLaunch routine
- Do not send the CPL_STARTWPARMSW message, if no extra parameters were specified (fixes the failing Got NULL lParam2! and some CPL_STARTWPARMSW: expected -1 got %d tests)
- Do not resolve invalid dialog names to index zero, unless the name is empty (fixes some of the failing CPL_DBLCLK: expected -1 got %d tests)
- Handle quotes in the second part of wszCmd

CORE-8981
2024-04-26 18:28:46 -06:00
Maj a1a00c8a79 Fix MSVC build with nameless unions 2024-04-26 20:41:14 +02:00
Timo Kreuzer 45aa8f8111 [CRT] Remove useless #undef abort from process.h 2024-04-26 15:16:31 +02:00
Timo Kreuzer 6beff505d7 [CRT] Add _Exit to process.h
This is already done this way in our stdlib.h. It is needed by GCC 13 C++ headers. The problem happens like this:
- telnet/precomp.h includes fstream from GCC
- fstream includes pthread.h from GCC
- pthread.h includes process.h from ReactOS
- process.h defines _CRT_TERMINATE_DEFINED, but doesn't declare _Exit
- fstream includes cstdlib from GCC
- cstdlib includes stdlib.h from GCC (#include_next)
- stdlib.h doesn't declare _Exit, because _CRT_TERMINATE_DEFINED is defined
- cstdlib uses _Exit
2024-04-26 15:16:31 +02:00
Thamatip Chitpong cd0bb1af07 [TASKMGR] Process page: Allow using "Open File Location" functionality without running Explorer shell
If Explorer shell is not available, use ReactOS's alternative file browser instead.
2024-04-26 07:16:00 +07:00
Thamatip Chitpong 6d16d27462 [TASKMGR] Process page: Improve readability of command line string formatting code 2024-04-26 07:16:00 +07:00
Thamatip Chitpong 018264f38f
[NTUSER] Release modifier keys when deactivating message queue (#6754)
CORE-14768
2024-04-26 07:12:02 +07:00
Katayama Hirofumi MZ 1331e2fb02
[KERNEL32_APITEST] Add LCMapString testcase (#6805)
@tkreuzer said he wants LCMapString testcase in chat.
JIRA issue: N/A
2024-04-26 08:39:45 +09:00
Doug Lyons 3693d55404
[SHELL32] Fix Desktop folder details view (#5743)
* [SHELL32] Fix Desktop Folder Details View

JIRA issue: [CORE-19177|https://jira.reactos.org/browse/CORE-19177]

* Remove Comments column from Desktop Folder Details View and simplify code.
* Revise date/time sort based on reviewer comments.
* Swap size and type column positions for desktop folder details view.

With help from Whindmar, most (hopefully all) of the magic number for the columns
have been removed in all of the shell folders.

Co-authored-by: Whindmar Saksit <whindsaks@proton.me>
Co-authored-by: Carl J. Bialorucki <cbialo2@outlook.com>
2024-04-25 17:20:28 -05:00
Timo Kreuzer 1f49173f82 [CRT] Massively improve performance of rand_s
Cache the pointer to RtlGenRandom instead of loading and unloading advapi32 every single time this function is called.
2024-04-25 05:25:12 +02:00
Timo Kreuzer 3c55252828 [CRT_APITEST] Add test for rand_s 2024-04-25 05:25:12 +02:00
Timo Kreuzer f319538d98 [CRT] Move rand_s into it's own file 2024-04-25 05:25:12 +02:00
Timo Kreuzer 0ea48e79fc [CRT] Move _invalid_parameter into its own file
As the author of the code, I changed to license to MIT.
2024-04-25 05:25:12 +02:00
Timo Kreuzer 43beb913da [CRT] Move rand to stdlib, where it belongs 2024-04-25 05:25:12 +02:00
Katayama Hirofumi MZ d55f49978d
Revert "[SHELL32] SHChangeNotify: Use tree for CDirectoryList (#6784)" (#6800)
Reverts #6784 that was a guilty commit of CORE-19531 that causing performance regression.

JIRA issue: CORE-19531
2024-04-25 09:01:21 +09:00
Katayama Hirofumi MZ 91acf823d8
[SHELL32] SHChangeNotify: Use tree for CDirectoryList (#6784)
Optimize for speed and memory.
JIRA issue: CORE-13950
CDirectoryList class exists just for remembering which file item is a directory or
not, in order to notify the filesystem item changes. This information can
become a tree data structure.

- Add CFSPathIterator and CFSNode helper classes.
- CFSNode is a class for tree nodes.
- Re-implement CDirectoryList class by using tree nodes.
- Delete CDirectoryItem class.
2024-04-24 19:44:30 +09:00
Katayama Hirofumi MZ c0c270e90e [SHELL32_APITEST] Delete obsolete "iexplore.exe" tests
Follow-up to 75cc5b2. CORE-13950
2024-04-24 19:06:48 +09:00
Katayama Hirofumi MZ 75cc5b2b1c [SHELL32_APITEST] Commonize FindSubProgram function
and delete obsolete "iexplore.exe" tests. CORE-13950
2024-04-24 19:03:10 +09:00
Katayama Hirofumi MZ 8337df2bd1
[SHELL32_APITEST] SHChangeNotify: Improve coverity (#6798)
Improve coverity and speed.
JIRA issue: CORE-13950
- Move NUM_STAGE to the header file.
- Add stages.
- Add DIRTYPE_DESKTOP_DIR and
  DIRTYPE_PRINTERS directory types.
- Improve speed more.
2024-04-24 18:25:15 +09:00
Oleg Dubinskiy 24e088daa8
[MMEBUDDY] Implement support for looped wave playback (#6761)
Fix playing wave header multiple times in case the caller requests to do it.
In Windows, it is supported by WHDR_BEGINLOOP and WHDR_ENDLOOP flags (specified together) and dwLoops member of WAVEHDR structure (ususally set to 0xFFFFFFFF (INFINITE constant)).
- Check whenther WHDR_BEGINLOOP | WHDR_ENDLOOP flags are set by the caller.
- If they are, get the amount of times to play the header from WAVEHDR.dwLoops.
- Perform wave header competion only when the loop count is equal to zero. Otherwise, don't do it.
- When the header is entirely committed, in case completion is not needed, reset committed bytes count to the starting value to allow the header play again.
- Decrement loop count in case it isn't set to INFINITE, to mark loop as played correctly. When this count becomes zero, then the playback is finished.
- Get rid from SOUND_OVERLAPPED.PerformCompletion member. Use SOUND_DEVICE_INSTANCE.LoopsRemaining == 0 condition instead.
- Do this only for WaveOut devices, since MSDN states it works only with output buffers. Hence, there is nothing changed for WaveIn.
- Update an appropriate statement about unimplemented functionality from mmebuddy notes.
TODO: handle the case when multiple headers are requested to be looped (WHDR_BEGINLOOP and WHDR_ENDLOOP are set separatedly: 1st flag - in the 1st header, and 2nd in the last header). Currently, only looping a single wave header is supported.
This fixes the playback in the apps those request looped wave playback of some audio data (e. g., BRD Demo app, which did play its sound only first 500 ms before, now it plays endlessly until closing it manually).
CORE-10118
2024-04-24 11:08:40 +02:00
Katayama Hirofumi MZ d23573beed [SHELL32_APITEST] Follow-up to #6796 (25e2f5f)
This change will massively improve speed.
JIRA issue: CORE-13950
- Set zero to INTERVAL.
- Remove SHCNF_FLUSHNOWAIT.
2024-04-24 10:22:42 +09:00
Katayama Hirofumi MZ 25e2f5f277
[SHELL32_APITEST] Make SHChangeNotify testcase more stable (#6796)
Make the testcase more stable and faster. Reduce code.
JIRA issue: CORE-13950
- Use WM_COPYDATA message to communicate with shell32_apitest_sub.exe.
- Use concept of "stage" and "step".
- Do multiple checks in one step.
- Flush notification by using (SHCNF_FLUSH | SHCNF_FLUSHNOWAIT) flags.
2024-04-24 09:10:29 +09:00
Timo Kreuzer 6ac260dcec [NTOS:KE/x64] Handle NMI vs swapgs race condition 2024-04-23 15:50:06 +02:00
Timo Kreuzer 72fd54a7f4 [NTOS:KE/x64] Implement Kd processor switching 2024-04-23 15:50:06 +02:00
Timo Kreuzer 9229709312 [NTOS:KE/x64] Implement processor freeze code 2024-04-23 15:50:06 +02:00
Timo Kreuzer af2ce4d08f [NTOS:KE/x64] Implement KiSaveProcessorState / KiRestoreProcessorState 2024-04-23 15:50:06 +02:00
Timo Kreuzer 1d289fec77 [NTOS:KE] Improve freeze code in KeBugCheckWithTf
- Don't wait 1 second for each processor
- Use AFFINITY_MASK
- Use Prcb->Number, which is more future proof than KeGetCurrentProcessorNumber
- Improve for loop
2024-04-23 15:50:06 +02:00
Timo Kreuzer d96f01b5dc [NTOS:KE/x64] Add KiNmiInterruptHandler
So far it only calls KiHandleNmi. It will also handle processor freeze later.

TODO: Pass TF_WITH_EF to directly generate a KEXCEPTION_FRAME
2024-04-23 15:50:06 +02:00
Katayama Hirofumi MZ 1dc8d80ca1
[SHELL32] SHChangeNotify: Add drive, remove drive (#6782)
Implementing missing features...
JIRA issue: CORE-13950
- Add WM_DEVICECHANGE message handler in the shell window to detect
  DBT_DEVICEARRIVAL and DBT_DEVICEREMOVECOMPLETE.
- Use GetLogicalDrives function to detect drives.
- Use SHChangeNotify to send SHCNE_DRIVEADD and
  SHCNE_DRIVEREMOVED notifications.
- Modify CDefView::OnChangeNotify.
2024-04-23 08:28:38 +09:00
Timo Kreuzer a8ece7e81a [EVTLIB] Fix size of event log record
The size is 32bit, don't read a SIZE_T. Fixes crashes of advapi32_winetest eventlog on x64.
2024-04-22 16:42:02 +02:00
Timo Kreuzer 565828127f [WIN32U_VISTA] Add win32u.dll for Vista 2024-04-22 10:15:40 +02:00
Serge Gautherie fd331f1494 [NTUSER] UserSetCursorPos(): Use an early return
Addendum to 76290a6 (0.4.15-dev-7889).
2024-04-20 13:57:35 -06:00
Serge Gautherie 8b9bf3369c
[DOC] 3rd Party Files.txt: Update 3 unknown versions (#6771) 2024-04-20 21:29:26 +02:00
Katayama Hirofumi MZ 0240a87618
[SHELL32] SHChangeNotify: SHCNF_DWORD and SHCNF_PRINTERA/W (#6777)
Implementing missing features...
JIRA issue: CORE-13950
- Add Shell_ParsePrinterName helper function.
- Implement SHCNF_DWORD, SHCNF_PRINTERA,
  and SHCNF_PRINTERW types of SHChangeNotify
  function.
2024-04-20 23:11:31 +09:00
70 changed files with 3976 additions and 7142 deletions

View File

@ -1222,6 +1222,7 @@ void ProcessPage_OnOpenFileLocation(void)
DWORD dwProcessId;
DWORD dwLength;
LPWSTR pszExePath;
static const WCHAR szCmdFormat[] = L"/select,\"%s\"";
LPWSTR pszCmdLine = NULL;
dwProcessId = GetSelectedProcessId();
@ -1240,14 +1241,18 @@ void ProcessPage_OnOpenFileLocation(void)
goto Cleanup;
/* Build the shell command line */
pszCmdLine = HeapAlloc(GetProcessHeap(), 0, (dwLength + CONST_STR_LEN(L"/select,\"\"")) * sizeof(WCHAR));
dwLength += CONST_STR_LEN(szCmdFormat) - CONST_STR_LEN(L"%s");
pszCmdLine = HeapAlloc(GetProcessHeap(), 0, dwLength * sizeof(WCHAR));
if (!pszCmdLine)
goto Cleanup;
StringCchPrintfW(pszCmdLine, dwLength + CONST_STR_LEN(L"/select,\"\""), L"/select,\"%s\"", pszExePath);
StringCchPrintfW(pszCmdLine, dwLength, szCmdFormat, pszExePath);
/* Call the shell to open the file location and select it */
ShellExecuteW(NULL, L"open", L"explorer.exe", pszCmdLine, NULL, SW_SHOWNORMAL);
/* Call the shell to open the file location and select it. If Explorer shell
* is not available, use ReactOS's alternative file browser instead. */
ShellExecuteW(NULL, L"open",
GetShellWindow() ? L"explorer.exe" : L"filebrowser.exe",
pszCmdLine, NULL, SW_SHOWNORMAL);
Cleanup:
HeapFree(GetProcessHeap(), 0, pszCmdLine);

View File

@ -14,7 +14,6 @@ list(APPEND SOURCE
gdiplus.c
graphics.c
graphicspath.c
image.c
imageattributes.c
matrix.c
metafile.c
@ -24,6 +23,7 @@ list(APPEND SOURCE
stringformat.c)
list(APPEND PCH_SKIP_SOURCE
image.c
guid.c
${CMAKE_CURRENT_BINARY_DIR}/gdiplus_stubs.c)

View File

@ -2287,6 +2287,7 @@ LRESULT CDefView::OnChangeNotify(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &
{
case SHCNE_MKDIR:
case SHCNE_CREATE:
case SHCNE_DRIVEADD:
if (bParent0)
{
if (LV_FindItemByPidl(ILFindLastID(Pidls[0])) == -1)
@ -2297,6 +2298,7 @@ LRESULT CDefView::OnChangeNotify(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &
break;
case SHCNE_RMDIR:
case SHCNE_DELETE:
case SHCNE_DRIVEREMOVED:
if (bParent0)
LV_DeleteItem(ILFindLastID(Pidls[0]));
break;

View File

@ -57,6 +57,32 @@ EXTERN_C void FreeChangeNotifications(void)
DeleteCriticalSection(&SHELL32_ChangenotifyCS);
}
static HRESULT
Shell_ParsePrinterName(
_In_ LPCWSTR pszName,
_Out_ LPITEMIDLIST *ppidl,
_In_ IBindCtx *pBindCtx)
{
*ppidl = NULL;
CComHeapPtr<ITEMIDLIST> pidlPrinters;
HRESULT hr = SHGetSpecialFolderLocation(NULL, CSIDL_PRINTERS, &pidlPrinters);
if (FAILED_UNEXPECTEDLY(hr))
return hr;
CComPtr<IShellFolder> pFolder;
hr = SHBindToObject(NULL, pidlPrinters, IID_PPV_ARG(IShellFolder, &pFolder));
if (FAILED_UNEXPECTEDLY(hr))
return hr;
CComHeapPtr<ITEMIDLIST> pidlTemp;
hr = pFolder->ParseDisplayName(NULL, pBindCtx, (LPWSTR)pszName, NULL, &pidlTemp, NULL);
if (FAILED_UNEXPECTEDLY(hr))
return hr;
return SHILCombine(pidlPrinters, pidlTemp, ppidl);
}
//////////////////////////////////////////////////////////////////////////////////////
// There are two delivery methods: "old delivery method" and "new delivery method".
//
@ -625,21 +651,48 @@ SHChangeNotifyTransmit(LONG lEvent, UINT uFlags, LPCITEMIDLIST pidl1, LPCITEMIDL
EXTERN_C void WINAPI
SHChangeNotify(LONG wEventId, UINT uFlags, LPCVOID dwItem1, LPCVOID dwItem2)
{
LPITEMIDLIST pidl1 = NULL, pidl2 = NULL, pidlTemp1 = NULL, pidlTemp2 = NULL;
DWORD dwTick = GetTickCount();
WCHAR szPath1[MAX_PATH], szPath2[MAX_PATH];
LPWSTR psz1, psz2;
TRACE("(0x%08x,0x%08x,%p,%p)\n", wEventId, uFlags, dwItem1, dwItem2);
switch (uFlags & SHCNF_TYPE)
if (!GetNotificationServer(FALSE))
return;
DWORD dwTick = GetTickCount();
WCHAR szPath1[MAX_PATH], szPath2[MAX_PATH];
LPITEMIDLIST pidl1 = NULL, pidl2 = NULL;
LPWSTR psz1, psz2;
SHChangeDWORDAsIDList dwidl;
DWORD dwType;
Retry:
dwType = (uFlags & SHCNF_TYPE);
switch (dwType)
{
case SHCNF_IDLIST:
{
if (wEventId == SHCNE_FREESPACE)
{
szPath1[0] = szPath2[0] = UNICODE_NULL;
if (dwItem1)
SHGetPathFromIDList((LPCITEMIDLIST)dwItem1, szPath1);
if (dwItem2)
SHGetPathFromIDList((LPCITEMIDLIST)dwItem2, szPath2);
uFlags = SHCNF_PATHW;
dwItem1 = (szPath1[0] ? szPath1 : NULL);
dwItem2 = (szPath2[0] ? szPath2 : NULL);
goto Retry;
}
pidl1 = (LPITEMIDLIST)dwItem1;
pidl2 = (LPITEMIDLIST)dwItem2;
break;
}
case SHCNF_PATHA:
case SHCNF_PRINTERA:
{
psz1 = psz2 = NULL;
szPath1[0] = szPath2[0] = UNICODE_NULL;
if (dwItem1)
{
SHAnsiToUnicode((LPCSTR)dwItem1, szPath1, _countof(szPath1));
@ -650,42 +703,90 @@ SHChangeNotify(LONG wEventId, UINT uFlags, LPCVOID dwItem1, LPCVOID dwItem2)
SHAnsiToUnicode((LPCSTR)dwItem2, szPath2, _countof(szPath2));
psz2 = szPath2;
}
uFlags &= ~SHCNF_TYPE;
uFlags |= SHCNF_PATHW;
SHChangeNotify(wEventId, uFlags, psz1, psz2);
return;
uFlags = ((dwType == SHCNF_PRINTERA) ? SHCNF_PRINTERW : SHCNF_PATHW);
dwItem1 = psz1;
dwItem2 = psz2;
goto Retry;
}
case SHCNF_PATHW:
{
if (wEventId == SHCNE_FREESPACE)
{
INT iDrive1 = -1, iDrive2 = -1;
if (dwItem1)
iDrive1 = PathGetDriveNumberW((LPCWSTR)dwItem1);
if (dwItem2)
iDrive2 = PathGetDriveNumberW((LPCWSTR)dwItem2);
DWORD dwValue = 0;
if (iDrive1 >= 0)
dwValue |= (1 << iDrive1);
if (iDrive2 >= 0)
dwValue |= (1 << iDrive2);
if (!dwValue)
return;
uFlags = SHCNF_DWORD;
dwItem1 = UlongToPtr(dwValue);
dwItem2 = NULL;
goto Retry;
}
if (dwItem1)
pidl1 = SHSimpleIDListFromPathW((LPCWSTR)dwItem1);
if (dwItem2)
pidl2 = SHSimpleIDListFromPathW((LPCWSTR)dwItem2);
break;
}
case SHCNF_PRINTERW:
{
if (dwItem1)
{
pidl1 = pidlTemp1 = SHSimpleIDListFromPathW((LPCWSTR)dwItem1);
HRESULT hr = Shell_ParsePrinterName((LPCWSTR)dwItem1, &pidl1, NULL);
if (FAILED_UNEXPECTEDLY(hr))
return;
}
if (dwItem2)
{
pidl2 = pidlTemp2 = SHSimpleIDListFromPathW((LPCWSTR)dwItem2);
HRESULT hr = Shell_ParsePrinterName((LPCWSTR)dwItem2, &pidl2, NULL);
if (FAILED_UNEXPECTEDLY(hr))
{
ILFree(pidl1);
return;
}
}
break;
case SHCNF_PRINTERA:
case SHCNF_PRINTERW:
FIXME("SHChangeNotify with (uFlags & SHCNF_PRINTER)\n");
return;
}
case SHCNF_DWORD:
{
dwidl.cb = offsetof(SHChangeDWORDAsIDList, cbZero);
dwidl.dwItem1 = PtrToUlong(dwItem1);
dwidl.dwItem2 = PtrToUlong(dwItem2);
dwidl.cbZero = 0;
pidl1 = (LPITEMIDLIST)&dwidl;
break;
}
default:
FIXME("unknown type %08x\n", uFlags & SHCNF_TYPE);
{
FIXME("Unknown type: 0x%X\n", dwType);
return;
}
}
if (wEventId == 0 || (wEventId & SHCNE_ASSOCCHANGED) || pidl1 != NULL)
if (pidl1 || !wEventId || (wEventId & SHCNE_ASSOCCHANGED))
{
TRACE("notifying event %s(%x)\n", DumpEvent(wEventId), wEventId);
SHChangeNotifyTransmit(wEventId, uFlags, pidl1, pidl2, dwTick);
}
if (pidlTemp1)
ILFree(pidlTemp1);
if (pidlTemp2)
ILFree(pidlTemp2);
if ((dwType == SHCNF_PATHW) || (dwType == SHCNF_PRINTERW))
{
ILFree(pidl1);
ILFree(pidl2);
}
}
/*************************************************************************

View File

@ -550,7 +550,7 @@ HRESULT WINAPI CControlPanelFolder::GetDefaultColumnState(UINT iColumn, DWORD *p
if (!pcsFlags || iColumn >= CONTROLPANEL_COL_COUNT)
return E_INVALIDARG;
*pcsFlags = ControlPanelSFHeader[iColumn].pcsFlags;
*pcsFlags = ControlPanelSFHeader[iColumn].colstate;
return S_OK;
}

View File

@ -21,6 +21,7 @@
*/
#include <precomp.h>
#include "CFSFolder.h" // Only for CFSFolder::*FSColumn* helpers!
WINE_DEFAULT_DEBUG_CHANNEL(shell);
@ -284,17 +285,6 @@ class CDesktopFolderEnum :
int SHELL_ConfirmMsgBox(HWND hWnd, LPWSTR lpszText, LPWSTR lpszCaption, HICON hIcon, BOOL bYesToAll);
static const shvheader DesktopSFHeader[] = {
{IDS_SHV_COLUMN_NAME, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_LEFT, 15},
{IDS_SHV_COLUMN_COMMENTS, SHCOLSTATE_TYPE_STR, LVCFMT_LEFT, 10},
{IDS_SHV_COLUMN_TYPE, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_LEFT, 10},
{IDS_SHV_COLUMN_SIZE, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 10},
{IDS_SHV_COLUMN_MODIFIED, SHCOLSTATE_TYPE_DATE | SHCOLSTATE_ONBYDEFAULT, LVCFMT_LEFT, 12},
{IDS_SHV_COLUMN_ATTRIBUTES, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_LEFT, 10}
};
#define DESKTOPSHELLVIEWCOLUMNS 6
static const DWORD dwDesktopAttributes =
SFGAO_HASSUBFOLDER | SFGAO_FILESYSTEM | SFGAO_FOLDER | SFGAO_FILESYSANCESTOR |
SFGAO_STORAGEANCESTOR | SFGAO_HASPROPSHEET | SFGAO_STORAGE;
@ -978,16 +968,25 @@ HRESULT WINAPI CDesktopFolder::GetDefaultColumn(DWORD dwRes, ULONG *pSort, ULONG
return S_OK;
}
HRESULT WINAPI CDesktopFolder::GetDefaultColumnState(UINT iColumn, DWORD *pcsFlags)
HRESULT WINAPI CDesktopFolder::GetDefaultColumnState(UINT iColumn, SHCOLSTATEF *pcsFlags)
{
HRESULT hr;
TRACE ("(%p)\n", this);
if (!pcsFlags || iColumn >= DESKTOPSHELLVIEWCOLUMNS)
if (!pcsFlags)
return E_INVALIDARG;
*pcsFlags = DesktopSFHeader[iColumn].pcsFlags;
return S_OK;
hr = CFSFolder::GetDefaultFSColumnState(iColumn, *pcsFlags);
/*
// CDesktopFolder may override the flags if desired (future)
switch(iColumn)
{
case SHFSF_COL_FATTS:
*pcsFlags &= ~SHCOLSTATE_ONBYDEFAULT;
break;
}
*/
return hr;
}
HRESULT WINAPI CDesktopFolder::GetDetailsEx(
@ -1000,19 +999,27 @@ HRESULT WINAPI CDesktopFolder::GetDetailsEx(
return E_NOTIMPL;
}
/*************************************************************************
* Column info functions.
* CFSFolder.h provides defaults for us.
*/
HRESULT CDesktopFolder::GetColumnDetails(UINT iColumn, SHELLDETAILS &sd)
{
/* CDesktopFolder may override the flags and/or name if desired */
return CFSFolder::GetFSColumnDetails(iColumn, sd);
}
HRESULT WINAPI CDesktopFolder::GetDetailsOf(
PCUITEMID_CHILD pidl,
UINT iColumn,
SHELLDETAILS *psd)
{
if (!psd || iColumn >= DESKTOPSHELLVIEWCOLUMNS)
if (!psd)
return E_INVALIDARG;
if (!pidl)
{
psd->fmt = DesktopSFHeader[iColumn].fmt;
psd->cxChar = DesktopSFHeader[iColumn].cxChar;
return SHSetStrRet(&psd->str, DesktopSFHeader[iColumn].colnameid);
return GetColumnDetails(iColumn, *psd);
}
CComPtr<IShellFolder2> psf;

View File

@ -42,6 +42,8 @@ class CDesktopFolder :
HRESULT _GetSFFromPidl(LPCITEMIDLIST pidl, IShellFolder2** psf);
static HRESULT GetColumnDetails(UINT iColumn, SHELLDETAILS &sd);
HRESULT _ParseDisplayNameByParent(
HWND hwndOwner,
LPBC pbc,

View File

@ -1168,13 +1168,13 @@ HRESULT WINAPI CDrivesFolder::GetDefaultColumn (DWORD dwRes, ULONG *pSort, ULONG
return S_OK;
}
HRESULT WINAPI CDrivesFolder::GetDefaultColumnState(UINT iColumn, DWORD * pcsFlags)
HRESULT WINAPI CDrivesFolder::GetDefaultColumnState(UINT iColumn, SHCOLSTATEF * pcsFlags)
{
TRACE("(%p)\n", this);
if (!pcsFlags || iColumn >= _countof(MyComputerSFHeader))
return E_INVALIDARG;
*pcsFlags = MyComputerSFHeader[iColumn].pcsFlags;
*pcsFlags = MyComputerSFHeader[iColumn].colstate;
return S_OK;
}

View File

@ -527,17 +527,35 @@ CFSFolder::~CFSFolder()
SHFree(m_sPathTarget);
}
static const shvheader GenericSFHeader[] = {
{IDS_SHV_COLUMN_NAME, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_LEFT, 15},
{IDS_SHV_COLUMN_SIZE, SHCOLSTATE_TYPE_INT | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 10},
{IDS_SHV_COLUMN_TYPE, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_LEFT, 10},
{IDS_SHV_COLUMN_SIZE, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 10},
{IDS_SHV_COLUMN_MODIFIED, SHCOLSTATE_TYPE_DATE | SHCOLSTATE_ONBYDEFAULT, LVCFMT_LEFT, 12},
{IDS_SHV_COLUMN_MODIFIED, SHCOLSTATE_TYPE_DATE | SHCOLSTATE_ONBYDEFAULT, LVCFMT_LEFT, 15},
{IDS_SHV_COLUMN_ATTRIBUTES, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_LEFT, 10},
{IDS_SHV_COLUMN_COMMENTS, SHCOLSTATE_TYPE_STR, LVCFMT_LEFT, 10}
{IDS_SHV_COLUMN_COMMENTS, SHCOLSTATE_TYPE_STR | SHCOLSTATE_SLOW, LVCFMT_LEFT, 10}, // We don't currently support comments but CRegFolder does
};
#define GENERICSHELLVIEWCOLUMNS 6
#define GENERICSHELLVIEWCOLUMNS _countof(GenericSFHeader)
HRESULT CFSFolder::GetFSColumnDetails(UINT iColumn, SHELLDETAILS &sd)
{
if (iColumn >= _countof(GenericSFHeader))
return E_INVALIDARG;
sd.fmt = GenericSFHeader[iColumn].fmt;
sd.cxChar = GenericSFHeader[iColumn].cxChar;
return SHSetStrRet(&sd.str, GenericSFHeader[iColumn].colnameid);
}
HRESULT CFSFolder::GetDefaultFSColumnState(UINT iColumn, SHCOLSTATEF &csFlags)
{
if (iColumn >= _countof(GenericSFHeader))
return E_INVALIDARG;
csFlags = GenericSFHeader[iColumn].colstate;
return S_OK;
}
static HRESULT SHELL32_GetCLSIDForDirectory(LPCWSTR pwszDir, LPCWSTR KeyName, CLSID* pclsidFolder)
{
@ -1021,18 +1039,13 @@ HRESULT WINAPI CFSFolder::CompareIDs(LPARAM lParam,
return MAKE_COMPARE_HRESULT(bIsFolder1 ? -1 : 1);
}
int result;
int result = 0;
switch (LOWORD(lParam))
{
case 0: /* Name */
case SHFSF_COL_NAME:
result = wcsicmp(pDataW1->wszName, pDataW2->wszName);
break;
case 1: /* Type */
pExtension1 = PathFindExtensionW(pDataW1->wszName);
pExtension2 = PathFindExtensionW(pDataW2->wszName);
result = wcsicmp(pExtension1, pExtension2);
break;
case 2: /* Size */
case SHFSF_COL_SIZE:
if (pData1->u.file.dwFileSize > pData2->u.file.dwFileSize)
result = 1;
else if (pData1->u.file.dwFileSize < pData2->u.file.dwFileSize)
@ -1040,16 +1053,26 @@ HRESULT WINAPI CFSFolder::CompareIDs(LPARAM lParam,
else
result = 0;
break;
case 3: /* Modified */
case SHFSF_COL_TYPE:
pExtension1 = PathFindExtensionW(pDataW1->wszName);
pExtension2 = PathFindExtensionW(pDataW2->wszName);
result = wcsicmp(pExtension1, pExtension2);
break;
case SHFSF_COL_MDATE:
result = pData1->u.file.uFileDate - pData2->u.file.uFileDate;
if (result == 0)
result = pData1->u.file.uFileTime - pData2->u.file.uFileTime;
break;
case 4: /* Attributes */
case SHFSF_COL_FATTS:
return SHELL32_CompareDetails(this, lParam, pidl1, pidl2);
case 5: /* Comments */
case SHFSF_COL_COMMENT:
result = 0;
break;
default:
if (_ILIsPidlSimple(pidl1) || _ILIsPidlSimple(pidl2))
ERR("Unknown column %u, can't compare\n", LOWORD(lParam));
else
TRACE("Unknown column %u, deferring to the subfolder\n", LOWORD(lParam));
}
if (result == 0)
@ -1543,16 +1566,14 @@ HRESULT WINAPI CFSFolder::GetDefaultColumn(DWORD dwRes,
}
HRESULT WINAPI CFSFolder::GetDefaultColumnState(UINT iColumn,
DWORD * pcsFlags)
SHCOLSTATEF *pcsFlags)
{
TRACE ("(%p)\n", this);
if (!pcsFlags || iColumn >= GENERICSHELLVIEWCOLUMNS)
if (!pcsFlags)
return E_INVALIDARG;
*pcsFlags = GenericSFHeader[iColumn].pcsFlags;
return S_OK;
else
return GetDefaultFSColumnState(iColumn, *pcsFlags);
}
HRESULT WINAPI CFSFolder::GetDetailsEx(PCUITEMID_CHILD pidl,
@ -1576,9 +1597,7 @@ HRESULT WINAPI CFSFolder::GetDetailsOf(PCUITEMID_CHILD pidl,
if (!pidl)
{
/* the header titles */
psd->fmt = GenericSFHeader[iColumn].fmt;
psd->cxChar = GenericSFHeader[iColumn].cxChar;
return SHSetStrRet(&psd->str, GenericSFHeader[iColumn].colnameid);
return GetFSColumnDetails(iColumn, *psd);
}
else
{
@ -1587,24 +1606,30 @@ HRESULT WINAPI CFSFolder::GetDetailsOf(PCUITEMID_CHILD pidl,
/* the data from the pidl */
switch (iColumn)
{
case 0: /* name */
case SHFSF_COL_NAME:
hr = GetDisplayNameOf (pidl, SHGDN_NORMAL | SHGDN_INFOLDER, &psd->str);
break;
case 1: /* type */
_ILGetFileType(pidl, psd->str.cStr, MAX_PATH);
break;
case 2: /* size */
case SHFSF_COL_SIZE:
_ILGetFileSize(pidl, psd->str.cStr, MAX_PATH);
break;
case 3: /* date */
case SHFSF_COL_TYPE:
_ILGetFileType(pidl, psd->str.cStr, MAX_PATH);
break;
case SHFSF_COL_MDATE:
_ILGetFileDate(pidl, psd->str.cStr, MAX_PATH);
break;
case 4: /* attributes */
case SHFSF_COL_FATTS:
_ILGetFileAttributes(pidl, psd->str.cStr, MAX_PATH);
break;
case 5: /* FIXME: comments */
psd->str.cStr[0] = 0;
case SHFSF_COL_COMMENT:
psd->str.cStr[0] = '\0'; // TODO: Extract comment from .lnk files? desktop.ini?
break;
#if DBG
default:
ERR("Missing case for column %d\n", iColumn);
#else
DEFAULT_UNREACHABLE;
#endif
}
}

View File

@ -125,6 +125,11 @@ class CFSFolder :
protected:
HRESULT WINAPI GetCustomViewInfo(ULONG unknown, SFVM_CUSTOMVIEWINFO_DATA *data);
public:
// Helper functions shared with CDesktopFolder
static HRESULT GetFSColumnDetails(UINT iColumn, SHELLDETAILS &sd);
static HRESULT GetDefaultFSColumnState(UINT iColumn, SHCOLSTATEF &csFlags);
};
#endif /* _CFSFOLDER_H_ */

View File

@ -510,13 +510,13 @@ HRESULT WINAPI CNetFolder::GetDefaultColumn (DWORD dwRes, ULONG *pSort, ULONG *p
return S_OK;
}
HRESULT WINAPI CNetFolder::GetDefaultColumnState(UINT iColumn, DWORD *pcsFlags)
HRESULT WINAPI CNetFolder::GetDefaultColumnState(UINT iColumn, SHCOLSTATEF *pcsFlags)
{
TRACE("(%p)\n", this);
if (!pcsFlags || iColumn >= NETWORKPLACESSHELLVIEWCOLUMNS)
return E_INVALIDARG;
*pcsFlags = NetworkPlacesSFHeader[iColumn].pcsFlags;
*pcsFlags = NetworkPlacesSFHeader[iColumn].colstate;
return S_OK;
}

View File

@ -432,11 +432,11 @@ HRESULT WINAPI CPrinterFolder::GetDefaultColumn(DWORD dwRes, ULONG *pSort, ULONG
return S_OK;
}
HRESULT WINAPI CPrinterFolder::GetDefaultColumnState(UINT iColumn, DWORD *pcsFlags)
HRESULT WINAPI CPrinterFolder::GetDefaultColumnState(UINT iColumn, SHCOLSTATEF *pcsFlags)
{
if (!pcsFlags || iColumn >= PrinterSHELLVIEWCOLUMNS)
return E_INVALIDARG;
*pcsFlags = PrinterSFHeader[iColumn].pcsFlags;
*pcsFlags = PrinterSFHeader[iColumn].colstate;
return S_OK;
}

View File

@ -233,14 +233,6 @@ class CRegFolderEnum :
END_COM_MAP()
};
enum registry_columns
{
REGISTRY_COL_NAME,
REGISTRY_COL_TYPE,
REGISTRY_COL_VALUE,
REGISTRY_COL_COUNT,
};
CRegFolderEnum::CRegFolderEnum()
{
}
@ -302,6 +294,18 @@ HRESULT CRegFolderEnum::AddItemsFromKey(HKEY hkey_root, LPCWSTR szRepPath)
return S_OK;
}
/*
* These columns try to map to CFSFolder's columns because the CDesktopFolder
* displays CFSFolder and CRegFolder items in the same view.
*/
enum REGFOLDERCOLUMNINDEX
{
COL_NAME = SHFSF_COL_NAME,
COL_TYPE = SHFSF_COL_TYPE,
COL_INFOTIP = SHFSF_COL_COMMENT,
REGFOLDERCOLUMNCOUNT = max(COL_INFOTIP, COL_TYPE) + 1
};
class CRegFolder :
public CComObjectRootEx<CComMultiThreadModelNoCS>,
public IShellFolder2
@ -808,7 +812,7 @@ HRESULT WINAPI CRegFolder::GetDefaultColumn(DWORD dwRes, ULONG *pSort, ULONG *pD
HRESULT WINAPI CRegFolder::GetDefaultColumnState(UINT iColumn, DWORD *pcsFlags)
{
if (iColumn >= REGISTRY_COL_COUNT)
if (iColumn >= REGFOLDERCOLUMNCOUNT)
return E_INVALIDARG;
*pcsFlags = SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT;
return S_OK;
@ -824,6 +828,12 @@ HRESULT WINAPI CRegFolder::GetDetailsOf(PCUITEMID_CHILD pidl, UINT iColumn, SHEL
if (!psd)
return E_INVALIDARG;
if (!pidl)
{
TRACE("CRegFolder has no column info\n");
return E_INVALIDARG;
}
GUID const *clsid = _ILGetGUIDPointer (pidl);
if (!clsid)
@ -834,11 +844,11 @@ HRESULT WINAPI CRegFolder::GetDetailsOf(PCUITEMID_CHILD pidl, UINT iColumn, SHEL
switch(iColumn)
{
case REGISTRY_COL_NAME:
case COL_NAME:
return GetDisplayNameOf(pidl, SHGDN_NORMAL | SHGDN_INFOLDER, &psd->str);
case REGISTRY_COL_TYPE:
case COL_TYPE:
return SHSetStrRet(&psd->str, IDS_SYSTEMFOLDER);
case REGISTRY_COL_VALUE:
case COL_INFOTIP:
HKEY hKey;
if (!HCR_RegOpenClassIDKey(*clsid, &hKey))
return SHSetStrRet(&psd->str, "");

View File

@ -26,6 +26,8 @@
#include <atlcoll.h>
#endif
#include <dbt.h>
WINE_DEFAULT_DEBUG_CHANNEL(desktop);
static const WCHAR szProgmanClassName[] = L"Progman";
@ -45,6 +47,7 @@ private:
CComPtr<IOleWindow> m_ChangeNotifyServer;
HWND m_hwndChangeNotifyServer;
DWORD m_dwDrives;
LRESULT _NotifyTray(UINT uMsg, WPARAM wParam, LPARAM lParam);
HRESULT _Resize();
@ -85,6 +88,7 @@ public:
LRESULT OnCommand(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
LRESULT OnSetFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
LRESULT OnGetChangeNotifyServer(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
LRESULT OnDeviceChange(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
LRESULT OnShowOptionsDlg(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
DECLARE_WND_CLASS_EX(szProgmanClassName, CS_DBLCLKS, COLOR_DESKTOP)
@ -99,6 +103,7 @@ BEGIN_MSG_MAP(CBaseBar)
MESSAGE_HANDLER(WM_COMMAND, OnCommand)
MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus)
MESSAGE_HANDLER(WM_DESKTOP_GET_CNOTIFY_SERVER, OnGetChangeNotifyServer)
MESSAGE_HANDLER(WM_DEVICECHANGE, OnDeviceChange)
MESSAGE_HANDLER(WM_PROGMAN_OPENSHELLSETTINGS, OnShowOptionsDlg)
END_MSG_MAP()
@ -112,7 +117,8 @@ END_COM_MAP()
CDesktopBrowser::CDesktopBrowser():
m_hAccel(NULL),
m_hWndShellView(NULL),
m_hwndChangeNotifyServer(NULL)
m_hwndChangeNotifyServer(NULL),
m_dwDrives(::GetLogicalDrives())
{
}
@ -460,6 +466,33 @@ LRESULT CDesktopBrowser::OnGetChangeNotifyServer(UINT uMsg, WPARAM wParam, LPARA
return (LRESULT)m_hwndChangeNotifyServer;
}
// Detect DBT_DEVICEARRIVAL and DBT_DEVICEREMOVECOMPLETE
LRESULT CDesktopBrowser::OnDeviceChange(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
{
if (wParam != DBT_DEVICEARRIVAL && wParam != DBT_DEVICEREMOVECOMPLETE)
return 0;
DWORD dwDrives = ::GetLogicalDrives();
for (INT iDrive = 0; iDrive <= 'Z' - 'A'; ++iDrive)
{
WCHAR szPath[MAX_PATH];
DWORD dwBit = (1 << iDrive);
if (!(m_dwDrives & dwBit) && (dwDrives & dwBit)) // The drive is added
{
PathBuildRootW(szPath, iDrive);
SHChangeNotify(SHCNE_DRIVEADD, SHCNF_PATHW, szPath, NULL);
}
else if ((m_dwDrives & dwBit) && !(dwDrives & dwBit)) // The drive is removed
{
PathBuildRootW(szPath, iDrive);
SHChangeNotify(SHCNE_DRIVEREMOVED, SHCNF_PATHW, szPath, NULL);
}
}
m_dwDrives = dwDrives;
return 0;
}
extern VOID WINAPI ShowFolderOptionsDialog(UINT Page, BOOL Async);
LRESULT CDesktopBrowser::OnShowOptionsDlg(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)

View File

@ -27,11 +27,25 @@
#define CHARS_IN_GUID 39
typedef struct {
int colnameid;
int pcsFlags;
int fmt;
int cxChar;
WORD colnameid; // Column title text resource id passed to LoadString
WORD colstate; // SHCOLSTATEF returned by IShellFolder2::GetDefaultColumnState
// HACK: SHCOLSTATEF truncated to WORD to reduce .rdata section size
WORD fmt; // LVCFMT_*
WORD cxChar; // Column width hint
} shvheader;
/*
* CFSFolder column indices. CDesktopFolder MUST use the same indices!
* According to the documentation for IShellFolder2::GetDetailsOf,
* the first 4 columns for SFGAO_FILESYSTEM items must be Name, Size, Type, Modified date
For Details See:
https://learn.microsoft.com/en-us/windows/win32/api/shobjidl_core/nf-shobjidl_core-ishellfolder2-getdetailsof
*/
#define SHFSF_COL_NAME 0
#define SHFSF_COL_SIZE 1
#define SHFSF_COL_TYPE 2 // SHGFI_TYPENAME
#define SHFSF_COL_MDATE 3 // Modified date
#define SHFSF_COL_FATTS 4 // File attributes
#define SHFSF_COL_COMMENT 5
#define GET_SHGDN_FOR(dwFlags) ((DWORD)dwFlags & (DWORD)0x0000FF00)
#define GET_SHGDN_RELATION(dwFlags) ((DWORD)dwFlags & (DWORD)0x000000FF)

View File

@ -873,6 +873,7 @@ static void Control_DoLaunch(CPanel* panel, HWND hWnd, LPCWSTR wszCmd)
* "a path\foo.cpl"
*/
{
#ifndef __REACTOS__
LPWSTR buffer;
LPWSTR beg = NULL;
LPWSTR end;
@ -952,14 +953,6 @@ static void Control_DoLaunch(CPanel* panel, HWND hWnd, LPCWSTR wszCmd)
applet = Control_LoadApplet(hWnd, buffer, panel);
if (applet)
{
#ifdef __REACTOS__
ULONG_PTR cookie;
BOOL bActivated;
ATOM aCPLName;
ATOM aCPLFlags;
ATOM aCPLPath;
AppDlgFindData findData;
#endif
/* we've been given a textual parameter (or none at all) */
if (sp == -1) {
while ((++sp) != applet->count) {
@ -975,65 +968,201 @@ static void Control_DoLaunch(CPanel* panel, HWND hWnd, LPCWSTR wszCmd)
sp = 0;
}
#ifdef __REACTOS__
bActivated = (applet->hActCtx != INVALID_HANDLE_VALUE ? ActivateActCtx(applet->hActCtx, &cookie) : FALSE);
aCPLPath = GlobalFindAtomW(applet->cmd);
if (!aCPLPath)
{
aCPLPath = GlobalAddAtomW(applet->cmd);
}
aCPLName = GlobalFindAtomW(L"CPLName");
if (!aCPLName)
{
aCPLName = GlobalAddAtomW(L"CPLName");
}
aCPLFlags = GlobalFindAtomW(L"CPLFlags");
if (!aCPLFlags)
{
aCPLFlags = GlobalAddAtomW(L"CPLFlags");
}
findData.szAppFile = applet->cmd;
findData.sAppletNo = (UINT_PTR)(sp + 1);
findData.aCPLName = aCPLName;
findData.aCPLFlags = aCPLFlags;
findData.hRunDLL = applet->hWnd;
findData.hDlgResult = NULL;
// Find the dialog of this applet in the first instance.
// Note: The simpler functions "FindWindow" or "FindWindowEx" does not find this type of dialogs.
EnumWindows(Control_EnumWinProc, (LPARAM)&findData);
if (findData.hDlgResult)
{
BringWindowToTop(findData.hDlgResult);
}
else
{
SetPropW(applet->hWnd, (LPTSTR)MAKEINTATOM(aCPLName), (HANDLE)MAKEINTATOM(aCPLPath));
SetPropW(applet->hWnd, (LPTSTR)MAKEINTATOM(aCPLFlags), UlongToHandle(sp + 1));
Control_ShowAppletInTaskbar(applet, sp);
#endif
if (!applet->proc(applet->hWnd, CPL_STARTWPARMSW, sp, (LPARAM)extraPmts))
applet->proc(applet->hWnd, CPL_DBLCLK, sp, applet->info[sp].data);
#ifdef __REACTOS__
RemovePropW(applet->hWnd, applet->cmd);
GlobalDeleteAtom(aCPLPath);
}
#endif
Control_UnloadApplet(applet);
#ifdef __REACTOS__
if (bActivated)
DeactivateActCtx(0, cookie);
#endif
}
HeapFree(GetProcessHeap(), 0, buffer);
#else
LPWSTR buffer;
LPWSTR ptr;
signed sp = -1;
LPCWSTR extraPmts = L"";
BOOL quoted = FALSE;
CPlApplet *applet;
LPCWSTR pchFirstComma = NULL, pchSecondComma = NULL;
LPCWSTR pchLastUnquotedSpace = NULL;
LPWSTR wszDialogBoxName;
int i = 0;
SIZE_T nLen = lstrlenW(wszCmd);
buffer = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*buffer) * (nLen + 1));
wszDialogBoxName = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*wszDialogBoxName) * (nLen + 1));
if (wszDialogBoxName == NULL || buffer == NULL)
{
if (buffer != NULL)
HeapFree(GetProcessHeap(), 0, buffer);
if (wszDialogBoxName != NULL)
HeapFree(GetProcessHeap(), 0, wszDialogBoxName);
return;
}
/* Search for unquoted commas and spaces. */
for (i = 0; i < nLen; i++)
{
if (quoted && wszCmd[i] != L'"')
continue;
switch (wszCmd[i])
{
case L'"':
quoted = !quoted;
break;
case L',':
if (!pchFirstComma)
pchFirstComma = &wszCmd[i];
else if (!pchSecondComma)
pchSecondComma = &wszCmd[i];
break;
case L' ':
pchLastUnquotedSpace = &wszCmd[i];
break;
}
}
/* If no unquoted commas are found, parameters are either space separated, or the entire string
* is a CPL path. */
if (!pchFirstComma)
{
/* An unquoted space was found in the string. Assume the last word is the dialog box
* name/number. */
if (pchLastUnquotedSpace)
{
int nSpaces = 0;
while (pchLastUnquotedSpace[nSpaces] == L' ')
nSpaces++;
StringCchCopyNW(buffer, nLen + 1, wszCmd, pchLastUnquotedSpace - wszCmd);
StringCchCopyW(wszDialogBoxName, nLen + 1, pchLastUnquotedSpace + nSpaces);
}
/* No parameters were passed, the entire string is the CPL path. */
else
{
StringCchCopyW(buffer, nLen + 1, wszCmd);
}
}
/* If an unquoted comma was found, there are at least two parts of the string:
* - the CPL path
* - either a dialog box number preceeded by @, or a dialog box name.
* If there was a second unqoted comma, there is another part of the string:
* - the rest of the parameters. */
else
{
/* If there was no second unquoted comma in the string, the CPL path ends at thes
* null terminator. */
if (!pchSecondComma)
pchSecondComma = wszCmd + nLen;
StringCchCopyNW(buffer, nLen + 1, wszCmd, pchFirstComma - wszCmd);
StringCchCopyNW(wszDialogBoxName,
nLen + 1,
pchFirstComma + 1,
pchSecondComma - pchFirstComma - 1);
if (pchSecondComma != wszCmd + nLen)
{
extraPmts = pchSecondComma + 1;
}
}
/* Remove the quotes from both buffers. */
while ((ptr = StrChrW(buffer, '"')))
memmove(ptr, ptr+1, lstrlenW(ptr)*sizeof(WCHAR));
while ((ptr = StrChrW(wszDialogBoxName, '"')))
memmove(ptr, ptr+1, lstrlenW(ptr)*sizeof(WCHAR));
if (wszDialogBoxName[0] == L'@')
{
sp = _wtoi(wszDialogBoxName + 1);
}
TRACE("cmd %s, extra %s, sp %d\n", debugstr_w(buffer), debugstr_w(extraPmts), sp);
applet = Control_LoadApplet(hWnd, buffer, panel);
if (applet)
{
ULONG_PTR cookie;
BOOL bActivated;
ATOM aCPLName;
ATOM aCPLFlags;
ATOM aCPLPath;
AppDlgFindData findData;
/* we've been given a textual parameter (or none at all) */
if (sp == -1)
{
while ((++sp) != applet->count)
{
TRACE("sp %d, name %s\n", sp, debugstr_w(applet->info[sp].name));
if (StrCmpIW(wszDialogBoxName, applet->info[sp].name) == 0)
break;
}
}
if (sp >= applet->count && wszDialogBoxName[0] == L'\0')
{
sp = 0;
}
bActivated = (applet->hActCtx != INVALID_HANDLE_VALUE ? ActivateActCtx(applet->hActCtx, &cookie) : FALSE);
if (sp < applet->count)
{
aCPLPath = GlobalFindAtomW(applet->cmd);
if (!aCPLPath)
aCPLPath = GlobalAddAtomW(applet->cmd);
aCPLName = GlobalFindAtomW(L"CPLName");
if (!aCPLName)
aCPLName = GlobalAddAtomW(L"CPLName");
aCPLFlags = GlobalFindAtomW(L"CPLFlags");
if (!aCPLFlags)
aCPLFlags = GlobalAddAtomW(L"CPLFlags");
findData.szAppFile = applet->cmd;
findData.sAppletNo = (UINT_PTR)(sp + 1);
findData.aCPLName = aCPLName;
findData.aCPLFlags = aCPLFlags;
findData.hRunDLL = applet->hWnd;
findData.hDlgResult = NULL;
// Find the dialog of this applet in the first instance.
// Note: The simpler functions "FindWindow" or "FindWindowEx" does not find this type of dialogs.
EnumWindows(Control_EnumWinProc, (LPARAM)&findData);
if (findData.hDlgResult)
{
BringWindowToTop(findData.hDlgResult);
}
else
{
SetPropW(applet->hWnd, (LPTSTR)MAKEINTATOM(aCPLName), (HANDLE)MAKEINTATOM(aCPLPath));
SetPropW(applet->hWnd, (LPTSTR)MAKEINTATOM(aCPLFlags), UlongToHandle(sp + 1));
Control_ShowAppletInTaskbar(applet, sp);
if (extraPmts[0] == L'\0' ||
!applet->proc(applet->hWnd, CPL_STARTWPARMSW, sp, (LPARAM)extraPmts))
{
applet->proc(applet->hWnd, CPL_DBLCLK, sp, applet->info[sp].data);
}
RemovePropW(applet->hWnd, applet->cmd);
GlobalDeleteAtom(aCPLPath);
}
}
Control_UnloadApplet(applet);
if (bActivated)
DeactivateActCtx(0, cookie);
}
HeapFree(GetProcessHeap(), 0, buffer);
HeapFree(GetProcessHeap(), 0, wszDialogBoxName);
#endif
}
/*************************************************************************

View File

@ -2467,7 +2467,7 @@ FinishDlgProc(HWND hwndDlg,
if (!SetupData->UnattendSetup || !SetupData->DisableGeckoInst)
{
/* Run the Wine Gecko prompt */
Control_RunDLLW(hwndDlg, 0, L"appwiz.cpl install_gecko", SW_SHOW);
Control_RunDLLW(hwndDlg, 0, L"appwiz.cpl,,install_gecko", SW_SHOW);
}
/* Set title font */

View File

@ -16,7 +16,7 @@ URL: https://github.com/rdesktop/rdesktop
Title: TreeList
Path: base/setup/reactos/treelist.c
Path: base/setup/reactos/treelist.h
Used Version: ???
Used Version: ??? (Imported on 2018.11.06: 2fdfb41 (0.4.11-dev-668))
License: GPL-3.0-or-later (https://spdx.org/licenses/GPL-3.0-or-later.html)
URL: https://github.com/sebkirche/treelist
@ -107,7 +107,7 @@ Path: base/services/nfsd
Path: dll/3rdparty/libtirpc
Path: dll/np/nfs
Path: drivers/filesystems/nfs
Used Version: ??? (Imported on 2017.06.18.)
Used Version: ??? (Imported on 2017.06.18-19: 4008c7e (r75096), 42e5eee (r75105) and f445db2 (r75114))
License: LGPL-2.1-or-later (https://spdx.org/licenses/LGPL-2.1-or-later.html)
URL: http://www.citi.umich.edu/projects/nfsv4/windows/readme.html
@ -272,7 +272,7 @@ URL: http://www.zlib.net
Title: chmc and lzxcomp
Path: sdk/tools/hhpcomp/chmc
Path: sdk/tools/hhpcomp/lzx_compress
Used Version: ??? (Imported on 2015.08.11.)
Used Version: ??? (Imported on 2015.08.11: 65780ec (r68685))
License: GPL-3.0-or-later (https://spdx.org/licenses/GPL-3.0-or-later.html)
URL: https://sourceforge.net/projects/chmc/

View File

@ -1137,7 +1137,7 @@ list(APPEND SOURCE_MSVCRT
# qsort_s
# raise.c
# rand.c
# rand_s.c
rand_s.c
# realloc.c
# remove.c
# rename.c

View File

@ -0,0 +1,61 @@
/*
* PROJECT: ReactOS API Tests
* LICENSE: MIT (https://spdx.org/licenses/MIT)
* PURPOSE: Tests for rand_s
* COPYRIGHT: Copyright 2024 Timo Kreuzer <timo.kreuzer@reactos.org>
*/
#include <apitest.h>
#include <stdio.h>
#ifdef TEST_STATIC_CRT
errno_t __cdecl rand_s(_Out_ unsigned int* _RandomValue);
#endif
typedef int __cdecl rand_s_t(unsigned int*);
rand_s_t *p_rand_s;
void test_rand_s_performance(void)
{
unsigned long long start, end;
unsigned int val;
int i;
start = __rdtsc();
for (i = 0; i < 10000; i++)
{
p_rand_s(&val);
}
end = __rdtsc();
printf("rand_s took %llu cycles\n", end - start);
}
START_TEST(rand_s)
{
unsigned int val;
int ret;
#ifndef TEST_STATIC_CRT
/* Dynamically load rand_s from mvcrt */
HMODULE msvcrt = GetModuleHandleA("msvcrt");
p_rand_s = (rand_s_t*)GetProcAddress(msvcrt, "rand_s");
if (!p_rand_s)
{
win_skip("rand_s is not available\n");
return;
}
#else
p_rand_s = rand_s;
#endif
/* Test performance */
test_rand_s_performance();
/* Test with NULL pointer */
ret = p_rand_s(NULL);
ok(ret == EINVAL, "Expected EINVAL, got %d\n", ret);
/* Test with valid pointer */
ret = p_rand_s(&val);
ok(ret == 0, "Expected 0, got %d\n", ret);
}

View File

@ -13,6 +13,7 @@ list(APPEND SOURCE_STATIC
fpcontrol.c
mbstowcs.c
mbtowc.c
rand_s.c
sprintf.c
strcpy.c
strlen.c

View File

@ -32,6 +32,7 @@ extern void func__vsnprintf(void);
extern void func__vsnwprintf(void);
extern void func_mbstowcs(void);
extern void func_mbtowc(void);
extern void func_rand_s(void);
extern void func_sprintf(void);
extern void func_strcpy(void);
extern void func_strlen(void);
@ -79,6 +80,7 @@ const struct test winetest_testlist[] =
{ "ceil", func_ceil },
{ "fabs", func_fabs },
{ "floor", func_floor },
{ "rand_s", func_rand_s },
#ifdef _M_AMD64 // x86 / arm need fixing
{ "fpcontrol", func_fpcontrol },
#endif

View File

@ -22,6 +22,7 @@ list(APPEND SOURCE
interlck.c
IsDBCSLeadByteEx.c
JapaneseCalendar.c
LCMapString.c
LoadLibraryExW.c
lstrcpynW.c
lstrlen.c

View File

@ -0,0 +1,60 @@
/*
* PROJECT: ReactOS api tests
* LICENSE: LGPL-2.0-or-later (https://spdx.org/licenses/LGPL-2.0-or-later)
* PURPOSE: Tests for LCMapString
* COPYRIGHT: Copyright 2024 Katayama Hirofumi MZ (katayama.hirofumi.mz@gmail.com)
*/
#include "precomp.h"
#undef ok_wstr_
static void
ok_wstr_(const char *file, int line, LPCWSTR x, LPCWSTR y)
{
char buf1[100], buf2[100];
lstrcpynA(buf1, wine_dbgstr_w(x), _countof(buf1));
lstrcpynA(buf2, wine_dbgstr_w(y), _countof(buf2));
ok_(file, line)(wcscmp(x, y) == 0, "Wrong string. Expected %s, got %s\n", buf2, buf1);
}
#undef ok_wstr
#define ok_wstr(x, y) ok_wstr_(__FILE__, __LINE__, x, y)
// "ABab12あアばバパ万萬" in UTF-16
static const WCHAR c_target[] =
L"ABab12\xff21\xff22\xff41\xff42\xff11\xff12\x3042\x30a2\x3070\x30d0\xff8a\xff9f\x4e07\x842c";
static void TEST_LCMapStringW(void)
{
WCHAR results[100];
LCMapStringW(0, LCMAP_FULLWIDTH, c_target, -1, results, _countof(results));
ok_wstr(results, L"\xff21\xff22\xff41\xff42\xff11\xff12\xff21\xff22\xff41\xff42\xff11\xff12\x3042\x30a2\x3070\x30d0\x30d1\x4e07\x842c");
LCMapStringW(0, LCMAP_HALFWIDTH, c_target, -1, results, _countof(results));
ok_wstr(results, L"ABab12ABab12\x3042\xff71\x3070\xff8a\xff9e\xff8a\xff9f\x4e07\x842c");
LCMapStringW(0, LCMAP_HIRAGANA, c_target, -1, results, _countof(results));
ok_wstr(results, L"ABab12\xff21\xff22\xff41\xff42\xff11\xff12\x3042\x3042\x3070\x3070\xff8a\xff9f\x4e07\x842c");
LCMapStringW(0, LCMAP_KATAKANA, c_target, -1, results, _countof(results));
ok_wstr(results, L"ABab12\xff21\xff22\xff41\xff42\xff11\xff12\x30a2\x30a2\x30d0\x30d0\xff8a\xff9f\x4e07\x842c");
LCMapStringW(0, LCMAP_LOWERCASE, c_target, -1, results, _countof(results));
ok_wstr(results, L"abab12\xff41\xff42\xff41\xff42\xff11\xff12\x3042\x30a2\x3070\x30d0\xff8a\xff9f\x4e07\x842c");
LCMapStringW(0, LCMAP_UPPERCASE, c_target, -1, results, _countof(results));
ok_wstr(results, L"ABAB12\xff21\xff22\xff21\xff22\xff11\xff12\x3042\x30a2\x3070\x30d0\xff8a\xff9f\x4e07\x842c");
LCMapStringW(0, LCMAP_SIMPLIFIED_CHINESE, c_target, -1, results, _countof(results));
ok_wstr(results, L"ABab12\xff21\xff22\xff41\xff42\xff11\xff12\x3042\x30a2\x3070\x30d0\xff8a\xff9f\x4e07\x4e07");
LCMapStringW(0, LCMAP_TRADITIONAL_CHINESE, c_target, -1, results, _countof(results));
ok_wstr(results, L"ABab12\xff21\xff22\xff41\xff42\xff11\xff12\x3042\x30a2\x3070\x30d0\xff8a\xff9f\x842c\x842c");
}
START_TEST(LCMapString)
{
TEST_LCMapStringW();
}

View File

@ -22,6 +22,7 @@ extern void func_InitOnce(void);
extern void func_interlck(void);
extern void func_IsDBCSLeadByteEx(void);
extern void func_JapaneseCalendar(void);
extern void func_LCMapString(void);
extern void func_LoadLibraryExW(void);
extern void func_lstrcpynW(void);
extern void func_lstrlen(void);
@ -59,6 +60,7 @@ const struct test winetest_testlist[] =
{ "interlck", func_interlck },
{ "IsDBCSLeadByteEx", func_IsDBCSLeadByteEx },
{ "JapaneseCalendar", func_JapaneseCalendar },
{ "LCMapString", func_LCMapString },
{ "LoadLibraryExW", func_LoadLibraryExW },
{ "lstrcpynW", func_lstrcpynW },
{ "lstrlen", func_lstrlen },

File diff suppressed because it is too large Load Diff

View File

@ -256,27 +256,6 @@ static WCHAR s_win_test_exe[MAX_PATH];
static WCHAR s_sys_bat_file[MAX_PATH];
static WCHAR s_cur_dir[MAX_PATH];
static BOOL
GetSubProgramPath(void)
{
GetModuleFileNameW(NULL, s_sub_program, _countof(s_sub_program));
PathRemoveFileSpecW(s_sub_program);
PathAppendW(s_sub_program, L"shell32_apitest_sub.exe");
if (!PathFileExistsW(s_sub_program))
{
PathRemoveFileSpecW(s_sub_program);
PathAppendW(s_sub_program, L"testdata\\shell32_apitest_sub.exe");
if (!PathFileExistsW(s_sub_program))
{
return FALSE;
}
}
return TRUE;
}
static const TEST_ENTRY s_entries_1[] =
{
// NULL
@ -462,11 +441,6 @@ static const TEST_ENTRY s_entries_1[] =
{ __LINE__, TRUE, TRUE, L"shell:::{450d8fba-ad25-11d0-98a8-0800361b1103}", NULL },
// shell:sendto
{ __LINE__, TRUE, TRUE, L"shell:sendto", NULL },
// iexplore.exe
{ __LINE__, TRUE, FALSE, L"iexplore", NULL },
{ __LINE__, TRUE, FALSE, L"iexplore.exe", NULL },
{ __LINE__, TRUE, TRUE, L"iexplore", NULL },
{ __LINE__, TRUE, TRUE, L"iexplore.exe", NULL },
// https://google.com
{ __LINE__, TRUE, FALSE, L"https://google.com", NULL },
{ __LINE__, TRUE, TRUE, L"https://google.com", NULL },
@ -677,7 +651,7 @@ START_TEST(ShellExecCmdLine)
}
}
if (!GetSubProgramPath())
if (!FindSubProgram(s_sub_program, _countof(s_sub_program)))
{
skip("shell32_apitest_sub.exe is not found\n");
return;
@ -747,6 +721,6 @@ START_TEST(ShellExecCmdLine)
ok(DeleteFileA("Test File 2.bat"), "failed to delete the test file\n");
free(s_wi0.phwnd);
DoWaitForWindow(CLASSNAME, CLASSNAME, TRUE, TRUE);
DoWaitForWindow(SUB_CLASSNAME, SUB_CLASSNAME, TRUE, TRUE);
Sleep(100);
}

View File

@ -2,150 +2,299 @@
* PROJECT: ReactOS api tests
* LICENSE: LGPL-2.0-or-later (https://spdx.org/licenses/LGPL-2.0-or-later)
* PURPOSE: Test for SHChangeNotify
* COPYRIGHT: Copyright 2020 Katayama Hirofumi MZ (katayama.hirofumi.mz@gmail.com)
* COPYRIGHT: Copyright 2020-2024 Katayama Hirofumi MZ (katayama.hirofumi.mz@gmail.com)
*/
// This program is used in SHChangeNotify and ShellExecCmdLine testcases.
#include "shelltest.h"
#include "shell32_apitest_sub.h"
#include <assert.h>
static HWND s_hwnd = NULL;
typedef enum DIRTYPE
{
DIRTYPE_DESKTOP = 0,
DIRTYPE_DESKTOP_DIR,
DIRTYPE_DRIVES,
DIRTYPE_PRINTERS,
DIRTYPE_DIR1,
DIRTYPE_MAX
} DIRTYPE;
static HWND s_hMainWnd = NULL, s_hSubWnd = NULL;
static LPITEMIDLIST s_pidl[DIRTYPE_MAX];
static UINT s_uRegID = 0;
static BOOL s_fRecursive = FALSE;
static DIRTYPE s_iWatchDir = DIRTYPE_NULL;
static INT s_nSources = 0;
static LPITEMIDLIST s_pidl = NULL;
static WCHAR s_path1[MAX_PATH], s_path2[MAX_PATH];
static BYTE s_counters[TYPE_MAX + 1];
static HANDLE s_hEvent = NULL;
static INT s_iStage = -1;
static BOOL
OnCreate(HWND hwnd)
#define EVENTS (SHCNE_CREATE | SHCNE_DELETE | SHCNE_MKDIR | SHCNE_RMDIR | \
SHCNE_RENAMEFOLDER | SHCNE_RENAMEITEM | SHCNE_UPDATEDIR | SHCNE_UPDATEITEM)
inline LPITEMIDLIST DoGetPidl(INT iDir)
{
s_hwnd = hwnd;
s_pidl = DoGetPidl(s_iWatchDir);
LPITEMIDLIST ret = NULL;
SHChangeNotifyEntry entry;
entry.pidl = s_pidl;
entry.fRecursive = s_fRecursive;
s_uRegID = SHChangeNotifyRegister(hwnd, s_nSources, SHCNE_ALLEVENTS, WM_SHELL_NOTIFY, 1, &entry);
return s_uRegID != 0;
}
static void
OnCommand(HWND hwnd, UINT id)
{
switch (id)
switch (iDir)
{
case IDOK:
case IDCANCEL:
DestroyWindow(hwnd);
case DIRTYPE_DESKTOP:
{
SHGetSpecialFolderLocation(NULL, CSIDL_DESKTOP, &ret);
break;
}
}
static void
OnDestroy(HWND hwnd)
{
SHChangeNotifyDeregister(s_uRegID);
s_uRegID = 0;
CoTaskMemFree(s_pidl);
s_pidl = NULL;
PostQuitMessage(0);
s_hwnd = NULL;
}
static BOOL DoPathes(PIDLIST_ABSOLUTE pidl1, PIDLIST_ABSOLUTE pidl2)
{
WCHAR path[MAX_PATH];
if (!SHGetPathFromIDListW(pidl1, path))
{
s_path1[0] = s_path2[0] = 0;
return FALSE;
}
case DIRTYPE_DESKTOP_DIR:
{
WCHAR szPath1[MAX_PATH];
SHGetSpecialFolderPathW(NULL, szPath1, CSIDL_DESKTOPDIRECTORY, FALSE);
ret = ILCreateFromPathW(szPath1);
break;
}
case DIRTYPE_DRIVES:
{
SHGetSpecialFolderLocation(NULL, CSIDL_DRIVES, &ret);
break;
}
case DIRTYPE_PRINTERS:
{
SHGetSpecialFolderLocation(NULL, CSIDL_PRINTERS, &ret);
break;
}
case DIRTYPE_DIR1:
{
WCHAR szPath1[MAX_PATH];
SHGetSpecialFolderPathW(NULL, szPath1, CSIDL_PERSONAL, FALSE); // My Documents
PathAppendW(szPath1, L"_TESTDIR_1_");
ret = ILCreateFromPathW(szPath1);
break;
}
default:
{
assert(0);
break;
}
}
if (wcsstr(path, L"Recent") != NULL)
return FALSE;
return ret;
}
StringCchCopyW(s_path1, _countof(s_path1), path);
static BOOL OnCreate(HWND hwnd)
{
s_hSubWnd = hwnd;
if (!SHGetPathFromIDListW(pidl2, s_path2))
s_path2[0] = 0;
for (INT i = 0; i < DIRTYPE_MAX; ++i)
s_pidl[i] = DoGetPidl(i);
return TRUE;
}
static VOID DoPathesAndFlags(UINT type, PIDLIST_ABSOLUTE pidl1, PIDLIST_ABSOLUTE pidl2)
static BOOL InitSHCN(HWND hwnd)
{
if (DoPathes(pidl1, pidl2))
{
s_counters[type] = 1;
SetEvent(s_hEvent);
}
}
assert(0 <= s_iStage);
assert(s_iStage < NUM_STAGE);
static void
DoShellNotify(HWND hwnd, PIDLIST_ABSOLUTE pidl1, PIDLIST_ABSOLUTE pidl2, LONG lEvent)
{
switch (lEvent)
SHChangeNotifyEntry entry;
INT sources;
LONG events;
switch (s_iStage)
{
case SHCNE_RENAMEITEM:
DoPathesAndFlags(TYPE_RENAMEITEM, pidl1, pidl2);
case 0:
{
entry.fRecursive = FALSE;
entry.pidl = NULL;
sources = SHCNRF_NewDelivery | SHCNRF_ShellLevel;
events = EVENTS;
break;
case SHCNE_CREATE:
DoPathesAndFlags(TYPE_CREATE, pidl1, pidl2);
}
case 1:
{
entry.fRecursive = TRUE;
entry.pidl = NULL;
sources = SHCNRF_NewDelivery | SHCNRF_ShellLevel;
events = EVENTS;
break;
case SHCNE_DELETE:
DoPathesAndFlags(TYPE_DELETE, pidl1, pidl2);
}
case 2:
{
entry.fRecursive = FALSE;
entry.pidl = s_pidl[DIRTYPE_DESKTOP];
sources = SHCNRF_NewDelivery | SHCNRF_ShellLevel;
events = EVENTS;
break;
case SHCNE_MKDIR:
DoPathesAndFlags(TYPE_MKDIR, pidl1, pidl2);
}
case 3:
{
entry.fRecursive = TRUE;
entry.pidl = s_pidl[DIRTYPE_DESKTOP];
sources = SHCNRF_NewDelivery | SHCNRF_ShellLevel;
events = EVENTS;
break;
case SHCNE_RMDIR:
DoPathesAndFlags(TYPE_RMDIR, pidl1, pidl2);
}
case 4:
{
entry.fRecursive = TRUE;
entry.pidl = s_pidl[DIRTYPE_DESKTOP_DIR];
sources = SHCNRF_NewDelivery | SHCNRF_ShellLevel;
events = EVENTS;
break;
case SHCNE_MEDIAINSERTED:
}
case 5:
{
entry.fRecursive = FALSE;
entry.pidl = s_pidl[DIRTYPE_DRIVES];
sources = SHCNRF_NewDelivery | SHCNRF_ShellLevel;
events = EVENTS;
break;
case SHCNE_MEDIAREMOVED:
}
case 6:
{
entry.fRecursive = TRUE;
entry.pidl = s_pidl[DIRTYPE_DRIVES];
sources = SHCNRF_NewDelivery | SHCNRF_ShellLevel;
events = EVENTS;
break;
case SHCNE_DRIVEREMOVED:
}
case 7:
{
entry.fRecursive = TRUE;
entry.pidl = s_pidl[DIRTYPE_PRINTERS];
sources = SHCNRF_NewDelivery | SHCNRF_ShellLevel;
events = EVENTS;
break;
case SHCNE_DRIVEADD:
}
case 8:
{
entry.fRecursive = FALSE;
entry.pidl = s_pidl[DIRTYPE_DIR1];
sources = SHCNRF_NewDelivery | SHCNRF_ShellLevel;
events = EVENTS;
break;
case SHCNE_NETSHARE:
break;
case SHCNE_NETUNSHARE:
break;
case SHCNE_ATTRIBUTES:
break;
case SHCNE_UPDATEDIR:
DoPathesAndFlags(TYPE_UPDATEDIR, pidl1, pidl2);
break;
case SHCNE_UPDATEITEM:
break;
case SHCNE_SERVERDISCONNECT:
break;
case SHCNE_UPDATEIMAGE:
break;
case SHCNE_DRIVEADDGUI:
break;
case SHCNE_RENAMEFOLDER:
DoPathesAndFlags(TYPE_RENAMEFOLDER, pidl1, pidl2);
break;
case SHCNE_FREESPACE:
break;
case SHCNE_EXTENDED_EVENT:
break;
case SHCNE_ASSOCCHANGED:
}
case 9:
{
entry.fRecursive = TRUE;
entry.pidl = s_pidl[DIRTYPE_DIR1];
sources = SHCNRF_NewDelivery | SHCNRF_ShellLevel | SHCNRF_InterruptLevel |
SHCNRF_RecursiveInterrupt;
events = EVENTS;
break;
}
default:
{
assert(0);
break;
}
}
s_uRegID = SHChangeNotifyRegister(hwnd, sources, events, WM_SHELL_NOTIFY, 1, &entry);
if (s_uRegID == 0)
return FALSE;
return TRUE;
}
static void UnInitSHCN(HWND hwnd)
{
if (s_uRegID)
{
SHChangeNotifyDeregister(s_uRegID);
s_uRegID = 0;
}
}
static INT_PTR
OnShellNotify(HWND hwnd, WPARAM wParam, LPARAM lParam)
static void OnCommand(HWND hwnd, UINT id)
{
switch (id)
{
case IDYES: // Start testing
{
s_hMainWnd = ::FindWindow(MAIN_CLASSNAME, MAIN_CLASSNAME);
if (!s_hMainWnd)
{
::DestroyWindow(hwnd);
break;
}
s_iStage = 0;
InitSHCN(hwnd);
::PostMessageW(s_hMainWnd, WM_COMMAND, IDYES, 0);
break;
}
case IDRETRY: // New stage
{
UnInitSHCN(hwnd);
++s_iStage;
InitSHCN(hwnd);
::PostMessageW(s_hMainWnd, WM_COMMAND, IDRETRY, 0);
break;
}
case IDNO: // Quit
{
s_iStage = -1;
UnInitSHCN(hwnd);
::DestroyWindow(hwnd);
break;
}
}
}
static void OnDestroy(HWND hwnd)
{
UnInitSHCN(hwnd);
for (auto& pidl : s_pidl)
{
CoTaskMemFree(pidl);
pidl = NULL;
}
::PostMessageW(s_hMainWnd, WM_COMMAND, IDNO, 0);
PostQuitMessage(0);
}
static BOOL DoSendData(LONG lEvent, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
{
DWORD cbPidl1 = ILGetSize(pidl1), cbPidl2 = ILGetSize(pidl2);
DWORD cbTotal = sizeof(lEvent) + sizeof(cbPidl1) + sizeof(cbPidl2) + cbPidl1 + cbPidl2;
LPBYTE pbData = (LPBYTE)::LocalAlloc(LPTR, cbTotal);
if (!pbData)
return FALSE;
LPBYTE pb = pbData;
*(LONG*)pb = lEvent;
pb += sizeof(lEvent);
*(DWORD*)pb = cbPidl1;
pb += sizeof(cbPidl1);
*(DWORD*)pb = cbPidl2;
pb += sizeof(cbPidl2);
CopyMemory(pb, pidl1, cbPidl1);
pb += cbPidl1;
CopyMemory(pb, pidl2, cbPidl2);
pb += cbPidl2;
assert(INT(pb - pbData) == INT(cbTotal));
COPYDATASTRUCT CopyData;
CopyData.dwData = 0xBEEFCAFE;
CopyData.cbData = cbTotal;
CopyData.lpData = pbData;
BOOL ret = (BOOL)::SendMessageW(s_hMainWnd, WM_COPYDATA, (WPARAM)s_hSubWnd, (LPARAM)&CopyData);
::LocalFree(pbData);
return ret;
}
static void DoShellNotify(HWND hwnd, PIDLIST_ABSOLUTE pidl1, PIDLIST_ABSOLUTE pidl2, LONG lEvent)
{
if (s_iStage < 0)
return;
DoSendData(lEvent, pidl1, pidl2);
}
static INT_PTR OnShellNotify(HWND hwnd, WPARAM wParam, LPARAM lParam)
{
LONG lEvent;
PIDLIST_ABSOLUTE *pidlAbsolute;
@ -163,40 +312,7 @@ OnShellNotify(HWND hwnd, WPARAM wParam, LPARAM lParam)
return TRUE;
}
static LRESULT
OnGetNotifyFlags(HWND hwnd)
{
if (s_uRegID == 0)
return 0xFFFFFFFF;
DWORD dwFlags = 0;
for (size_t i = 0; i < _countof(s_counters); ++i)
{
if (s_counters[i])
dwFlags |= (1 << i);
}
return dwFlags;
}
static void
DoSetPaths(HWND hwnd)
{
WCHAR szText[MAX_PATH * 2];
StringCchCopyW(szText, _countof(szText), s_path1);
StringCchCatW(szText, _countof(szText), L"|");
StringCchCatW(szText, _countof(szText), s_path2);
FILE *fp = _wfopen(TEMP_FILE, L"wb");
if (fp)
{
fwrite(szText, (wcslen(szText) + 1) * sizeof(WCHAR), 1, fp);
fflush(fp);
fclose(fp);
}
}
static LRESULT CALLBACK
WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
static LRESULT CALLBACK SubWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
@ -214,73 +330,42 @@ WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
OnDestroy(hwnd);
break;
case WM_GET_NOTIFY_FLAGS:
return OnGetNotifyFlags(hwnd);
case WM_CLEAR_FLAGS:
ZeroMemory(&s_counters, sizeof(s_counters));
s_path1[0] = s_path2[0] = 0;
break;
case WM_SET_PATHS:
DoSetPaths(hwnd);
break;
default:
return DefWindowProcW(hwnd, uMsg, wParam, lParam);
return ::DefWindowProcW(hwnd, uMsg, wParam, lParam);
}
return 0;
}
static BOOL ParseCommandLine(LPWSTR lpCmdLine)
{
LPWSTR pch = lpCmdLine; // fRecursive,iWatchDir,nSources
s_fRecursive = !!wcstoul(pch, NULL, 0);
pch = wcschr(pch, L',');
if (!pch)
return FALSE;
++pch;
s_iWatchDir = (DIRTYPE)wcstoul(pch, NULL, 0);
pch = wcschr(pch, L',');
if (!pch)
return FALSE;
++pch;
s_nSources = wcstoul(pch, NULL, 0);
return TRUE;
}
INT APIENTRY
wWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPWSTR lpCmdLine,
INT nCmdShow)
wWinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPWSTR lpCmdLine,
INT nCmdShow)
{
if (lstrcmpiW(lpCmdLine, L"") == 0 || lstrcmpiW(lpCmdLine, L"TEST") == 0)
return 0;
if (!ParseCommandLine(lpCmdLine))
return -1;
s_hEvent = OpenEventW(EVENT_ALL_ACCESS, TRUE, EVENT_NAME);
WNDCLASSW wc;
ZeroMemory(&wc, sizeof(wc));
wc.lpfnWndProc = WindowProc;
wc.hInstance = GetModuleHandleW(NULL);
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
WNDCLASSW wc = { 0, SubWindowProc };
wc.hInstance = hInstance;
wc.hIcon = LoadIconW(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursorW(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_3DFACE + 1);
wc.lpszClassName = CLASSNAME;
wc.lpszClassName = SUB_CLASSNAME;
if (!RegisterClassW(&wc))
{
assert(0);
return -1;
}
HWND hwnd = CreateWindowW(CLASSNAME, CLASSNAME, WS_OVERLAPPEDWINDOW,
HWND hwnd = CreateWindowW(SUB_CLASSNAME, SUB_CLASSNAME, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, 400, 100,
NULL, NULL, GetModuleHandleW(NULL), NULL);
NULL, NULL, hInstance, NULL);
if (!hwnd)
return -1;
{
assert(0);
return -2;
}
ShowWindow(hwnd, SW_SHOWNORMAL);
UpdateWindow(hwnd);
@ -292,7 +377,5 @@ wWinMain(HINSTANCE hInstance,
DispatchMessageW(&msg);
}
CloseHandle(s_hEvent);
return 0;
}

View File

@ -5,71 +5,29 @@
#include <stdio.h>
#include <strsafe.h>
#define TEMP_FILE L"shell-notify-temporary.txt"
#define CLASSNAME L"SHChangeNotify testcase window"
#define EVENT_NAME L"SHChangeNotify testcase event"
#define MAIN_CLASSNAME L"SHChangeNotify main window"
#define SUB_CLASSNAME L"SHChangeNotify sub-window"
#define WM_SHELL_NOTIFY (WM_USER + 100)
#define WM_GET_NOTIFY_FLAGS (WM_USER + 101)
#define WM_CLEAR_FLAGS (WM_USER + 102)
#define WM_SET_PATHS (WM_USER + 103)
typedef enum TYPE
#define NUM_STAGE 10
static inline BOOL FindSubProgram(LPWSTR pszSubProgram, DWORD cchSubProgram)
{
TYPE_RENAMEITEM,
TYPE_CREATE,
TYPE_DELETE,
TYPE_MKDIR,
TYPE_RMDIR,
TYPE_RENAMEFOLDER,
TYPE_UPDATEDIR,
TYPE_MAX = TYPE_UPDATEDIR
} TYPE;
GetModuleFileNameW(NULL, pszSubProgram, cchSubProgram);
PathRemoveFileSpecW(pszSubProgram);
PathAppendW(pszSubProgram, L"shell32_apitest_sub.exe");
typedef enum DIRTYPE
{
DIRTYPE_NULL = 0,
DIRTYPE_DESKTOP,
DIRTYPE_MYCOMPUTER,
DIRTYPE_MYDOCUMENTS
} DIRTYPE;
inline LPITEMIDLIST DoGetPidl(DIRTYPE iDir)
{
LPITEMIDLIST ret = NULL;
switch (iDir)
if (!PathFileExistsW(pszSubProgram))
{
case DIRTYPE_NULL:
break;
PathRemoveFileSpecW(pszSubProgram);
PathAppendW(pszSubProgram, L"testdata\\shell32_apitest_sub.exe");
case DIRTYPE_DESKTOP:
SHGetSpecialFolderLocation(NULL, CSIDL_DESKTOP, &ret);
break;
case DIRTYPE_MYCOMPUTER:
SHGetSpecialFolderLocation(NULL, CSIDL_DRIVES, &ret);
break;
case DIRTYPE_MYDOCUMENTS:
SHGetSpecialFolderLocation(NULL, CSIDL_PERSONAL, &ret);
break;
if (!PathFileExistsW(pszSubProgram))
return FALSE;
}
return ret;
}
static inline LPWSTR DoGetDir(DIRTYPE iDir)
{
static size_t s_index = 0;
static WCHAR s_pathes[3][MAX_PATH];
LPWSTR psz = s_pathes[s_index];
LPITEMIDLIST pidl = DoGetPidl(iDir);
psz[0] = 0;
SHGetPathFromIDListW(pidl, psz);
CoTaskMemFree(pidl);
s_index = (s_index + 1) % _countof(s_pathes);
return psz;
return TRUE;
}
static inline HWND DoWaitForWindow(LPCWSTR clsname, LPCWSTR text, BOOL bClosing, BOOL bForce)

View File

@ -2,4 +2,4 @@
add_subdirectory(win32u_ros)
add_subdirectory(win32u_xpsp2)
add_subdirectory(win32u_2k3sp2)
#add_subdirectory(win32u_vista)
add_subdirectory(win32u_vista)

View File

@ -1,6 +1,6 @@
spec2def(win32u_vista.spec win32u_vista.spec ADD_IMPORTLIB)
add_asm_files(win32u_vista_asm win32u_vista.S)
spec2def(win32u_vista.dll win32u_vista.spec ADD_IMPORTLIB)
add_asm_files(win32u_vista_asm sys-stubs.S)
add_library(win32u_vista MODULE
main.c
@ -9,3 +9,8 @@ add_library(win32u_vista MODULE
set_module_type(win32u_vista module)
add_dependencies(win32u_vista psdk)
add_rostests_file(TARGET win32u_vista)
if (STACK_PROTECTOR)
target_compile_options(win32u_vista PRIVATE -fno-stack-protector)
endif()

View File

@ -0,0 +1,29 @@
#include <syscalls.inc>
#ifdef _M_ARM
TEXTAREA
#define SVC_(name, argcount) STUB_U name
#include "w32ksvc32.h"
END
#else
.code
SyscallId = HEX(1000)
#define SVC_(name, argcount) STUB_U name, argcount
#ifdef _WIN64
#include "w32ksvc64.h"
#else
#include "w32ksvc32.h"
#endif
END
#endif

View File

@ -0,0 +1,777 @@
// SVC_(<NAME>, <ARG_COUNT>)
//
// Funcs order should match Windows Vista Service Pack 2 x86 Free
// Note: these MUST be indented for the ARM assembler!
//
SVC_(GdiAbortDoc, 1) //  0x1000 
SVC_(GdiAbortPath, 1) //  0x1001 
SVC_(GdiAddFontResourceW, 6) //  0x1002 
SVC_(GdiAddRemoteFontToDC, 4) //  0x1003 
SVC_(GdiAddFontMemResourceEx, 5) //  0x1004 
SVC_(GdiRemoveMergeFont, 2) //  0x1005 
SVC_(GdiAddRemoteMMInstanceToDC, 3) //  0x1006 
SVC_(GdiAlphaBlend, 12) //  0x1007 
SVC_(GdiAngleArc, 6) //  0x1008 
SVC_(GdiAnyLinkedFonts, 0) //  0x1009 
SVC_(GdiFontIsLinked, 1) //  0x100a 
SVC_(GdiArcInternal, 10) //  0x100b 
SVC_(GdiBeginPath, 1) //  0x100c 
SVC_(GdiBitBlt, 11) //  0x100d 
SVC_(GdiCancelDC, 1) //  0x100e 
SVC_(GdiCheckBitmapBits, 8) //  0x100f 
SVC_(GdiCloseFigure, 1) //  0x1010 
SVC_(GdiClearBitmapAttributes, 2) //  0x1011 
SVC_(GdiClearBrushAttributes, 2) //  0x1012 
SVC_(GdiColorCorrectPalette, 6) //  0x1013 
SVC_(GdiCombineRgn, 4) //  0x1014 
SVC_(GdiCombineTransform, 3) //  0x1015 
SVC_(GdiComputeXformCoefficients, 1) //  0x1016 
SVC_(GdiConfigureOPMProtectedOutput, 4) //  0x1017 
SVC_(GdiConsoleTextOut, 4) //  0x1018 
SVC_(GdiConvertMetafileRect, 2) //  0x1019 
SVC_(GdiCreateBitmap, 5) //  0x101a 
SVC_(GdiCreateClientObj, 1) //  0x101b 
SVC_(GdiCreateColorSpace, 1) //  0x101c 
SVC_(GdiCreateColorTransform, 8) //  0x101d 
SVC_(GdiCreateCompatibleBitmap, 3) //  0x101e 
SVC_(GdiCreateCompatibleDC, 1) //  0x101f 
SVC_(GdiCreateDIBBrush, 6) //  0x1020 
SVC_(GdiCreateDIBitmapInternal, 11) //  0x1021 
SVC_(GdiCreateDIBSection, 9) //  0x1022 
SVC_(GdiCreateEllipticRgn, 4) //  0x1023 
SVC_(GdiCreateHalftonePalette, 1) //  0x1024 
SVC_(GdiCreateHatchBrushInternal, 3) //  0x1025 
SVC_(GdiCreateMetafileDC, 1) //  0x1026 
SVC_(GdiCreateOPMProtectedOutputs, 5) //  0x1027 
SVC_(GdiCreatePaletteInternal, 2) //  0x1028 
SVC_(GdiCreatePatternBrushInternal, 3) //  0x1029 
SVC_(GdiCreatePen, 4) //  0x102a 
SVC_(GdiCreateRectRgn, 4) //  0x102b 
SVC_(GdiCreateRoundRectRgn, 6) //  0x102c 
SVC_(GdiCreateServerMetaFile, 6) //  0x102d 
SVC_(GdiCreateSolidBrush, 2) //  0x102e 
SVC_(GdiD3dContextCreate, 4) //  0x102f 
SVC_(GdiD3dContextDestroy, 1) //  0x1030 
SVC_(GdiD3dContextDestroyAll, 1) //  0x1031 
SVC_(GdiD3dValidateTextureStageState, 1) //  0x1032 
SVC_(GdiD3dDrawPrimitives2, 7) //  0x1033 
SVC_(GdiDdGetDriverState, 1) //  0x1034 
SVC_(GdiDdAddAttachedSurface, 3) //  0x1035 
SVC_(GdiDdAlphaBlt, 3) //  0x1036 
SVC_(GdiDdAttachSurface, 2) //  0x1037 
SVC_(GdiDdBeginMoCompFrame, 2) //  0x1038 
SVC_(GdiDdBlt, 3) //  0x1039 
SVC_(GdiDdCanCreateSurface, 2) //  0x103a 
SVC_(GdiDdCanCreateD3DBuffer, 2) //  0x103b 
SVC_(GdiDdColorControl, 2) //  0x103c 
SVC_(GdiDdCreateDirectDrawObject, 1) //  0x103d 
SVC_(GdiDdCreateSurface, 8) //  0x103e 
SVC_(GdiDdCreateD3DBuffer, 8) //  0x103f 
SVC_(GdiDdCreateMoComp, 2) //  0x1040 
SVC_(GdiDdCreateSurfaceObject, 6) //  0x1041 
SVC_(GdiDdDeleteDirectDrawObject, 1) //  0x1042 
SVC_(GdiDdDeleteSurfaceObject, 1) //  0x1043 
SVC_(GdiDdDestroyMoComp, 2) //  0x1044 
SVC_(GdiDdDestroySurface, 2) //  0x1045 
SVC_(GdiDdDestroyD3DBuffer, 1) //  0x1046 
SVC_(GdiDdEndMoCompFrame, 2) //  0x1047 
SVC_(GdiDdFlip, 5) //  0x1048 
SVC_(GdiDdFlipToGDISurface, 2) //  0x1049 
SVC_(GdiDdGetAvailDriverMemory, 2) //  0x104a 
SVC_(GdiDdGetBltStatus, 2) //  0x104b 
SVC_(GdiDdGetDC, 2) //  0x104c 
SVC_(GdiDdGetDriverInfo, 2) //  0x104d 
SVC_(GdiDdGetDxHandle, 3) //  0x104e 
SVC_(GdiDdGetFlipStatus, 2) //  0x104f 
SVC_(GdiDdGetInternalMoCompInfo, 2) //  0x1050 
SVC_(GdiDdGetMoCompBuffInfo, 2) //  0x1051 
SVC_(GdiDdGetMoCompGuids, 2) //  0x1052 
SVC_(GdiDdGetMoCompFormats, 2) //  0x1053 
SVC_(GdiDdGetScanLine, 2) //  0x1054 
SVC_(GdiDdLock, 3) //  0x1055 
SVC_(GdiDdLockD3D, 2) //  0x1056 
SVC_(GdiDdQueryDirectDrawObject, 11) //  0x1057 
SVC_(GdiDdQueryMoCompStatus, 2) //  0x1058 
SVC_(GdiDdReenableDirectDrawObject, 2) //  0x1059 
SVC_(GdiDdReleaseDC, 1) //  0x105a 
SVC_(GdiDdRenderMoComp, 2) //  0x105b 
SVC_(GdiDdResetVisrgn, 2) //  0x105c 
SVC_(GdiDdSetColorKey, 2) //  0x105d 
SVC_(GdiDdSetExclusiveMode, 2) //  0x105e 
SVC_(GdiDdSetGammaRamp, 3) //  0x105f 
SVC_(GdiDdCreateSurfaceEx, 3) //  0x1060 
SVC_(GdiDdSetOverlayPosition, 3) //  0x1061 
SVC_(GdiDdUnattachSurface, 2) //  0x1062 
SVC_(GdiDdUnlock, 2) //  0x1063 
SVC_(GdiDdUnlockD3D, 2) //  0x1064 
SVC_(GdiDdUpdateOverlay, 3) //  0x1065 
SVC_(GdiDdWaitForVerticalBlank, 2) //  0x1066 
SVC_(GdiDvpCanCreateVideoPort, 2) //  0x1067 
SVC_(GdiDvpColorControl, 2) //  0x1068 
SVC_(GdiDvpCreateVideoPort, 2) //  0x1069 
SVC_(GdiDvpDestroyVideoPort, 2) //  0x106a 
SVC_(GdiDvpFlipVideoPort, 4) //  0x106b 
SVC_(GdiDvpGetVideoPortBandwidth, 2) //  0x106c 
SVC_(GdiDvpGetVideoPortField, 2) //  0x106d 
SVC_(GdiDvpGetVideoPortFlipStatus, 2) //  0x106e 
SVC_(GdiDvpGetVideoPortInputFormats, 2) //  0x106f 
SVC_(GdiDvpGetVideoPortLine, 2) //  0x1070 
SVC_(GdiDvpGetVideoPortOutputFormats, 2) //  0x1071 
SVC_(GdiDvpGetVideoPortConnectInfo, 2) //  0x1072 
SVC_(GdiDvpGetVideoSignalStatus, 2) //  0x1073 
SVC_(GdiDvpUpdateVideoPort, 4) //  0x1074 
SVC_(GdiDvpWaitForVideoPortSync, 2) //  0x1075 
SVC_(GdiDvpAcquireNotification, 3) //  0x1076 
SVC_(GdiDvpReleaseNotification, 2) //  0x1077 
SVC_(GdiDxgGenericThunk, 6) //  0x1078 
SVC_(GdiDeleteClientObj, 1) //  0x1079 
SVC_(GdiDeleteColorSpace, 1) //  0x107a 
SVC_(GdiDeleteColorTransform, 2) //  0x107b 
SVC_(GdiDeleteObjectApp, 1) //  0x107c 
SVC_(GdiDescribePixelFormat, 4) //  0x107d 
SVC_(GdiDestroyOPMProtectedOutput, 1) //  0x107e 
SVC_(GdiGetPerBandInfo, 2) //  0x107f 
SVC_(GdiDoBanding, 4) //  0x1080 
SVC_(GdiDoPalette, 6) //  0x1081 
SVC_(GdiDrawEscape, 4) //  0x1082 
SVC_(GdiEllipse, 5) //  0x1083 
SVC_(GdiEnableEudc, 1) //  0x1084 
SVC_(GdiEndDoc, 1) //  0x1085 
SVC_(GdiEndPage, 1) //  0x1086 
SVC_(GdiEndPath, 1) //  0x1087 
SVC_(GdiEnumFontChunk, 5) //  0x1088 
SVC_(GdiEnumFontClose, 1) //  0x1089 
SVC_(GdiEnumFontOpen, 7) //  0x108a 
SVC_(GdiEnumObjects, 4) //  0x108b 
SVC_(GdiEqualRgn, 2) //  0x108c 
SVC_(GdiEudcLoadUnloadLink, 7) //  0x108d 
SVC_(GdiExcludeClipRect, 5) //  0x108e 
SVC_(GdiExtCreatePen, 11) //  0x108f 
SVC_(GdiExtCreateRegion, 3) //  0x1090 
SVC_(GdiExtEscape, 8) //  0x1091 
SVC_(GdiExtFloodFill, 5) //  0x1092 
SVC_(GdiExtGetObjectW, 3) //  0x1093 
SVC_(GdiExtSelectClipRgn, 3) //  0x1094 
SVC_(GdiExtTextOutW, 9) //  0x1095 
SVC_(GdiFillPath, 1) //  0x1096 
SVC_(GdiFillRgn, 3) //  0x1097 
SVC_(GdiFlattenPath, 1) //  0x1098 
SVC_(GdiFlush, 0) //  0x1099 
SVC_(GdiForceUFIMapping, 2) //  0x109a 
SVC_(GdiFrameRgn, 5) //  0x109b 
SVC_(GdiFullscreenControl, 5) //  0x109c 
SVC_(GdiGetAndSetDCDword, 4) //  0x109d 
SVC_(GdiGetAppClipBox, 2) //  0x109e 
SVC_(GdiGetBitmapBits, 3) //  0x109f 
SVC_(GdiGetBitmapDimension, 2) //  0x10a0 
SVC_(GdiGetBoundsRect, 3) //  0x10a1 
SVC_(GdiGetCertificate, 4) //  0x10a2 
SVC_(GdiGetCertificateSize, 3) //  0x10a3 
SVC_(GdiGetCharABCWidthsW, 6) //  0x10a4 
SVC_(GdiGetCharacterPlacementW, 6) //  0x10a5 
SVC_(GdiGetCharSet, 1) //  0x10a6 
SVC_(GdiGetCharWidthW, 6) //  0x10a7 
SVC_(GdiGetCharWidthInfo, 2) //  0x10a8 
SVC_(GdiGetColorAdjustment, 2) //  0x10a9 
SVC_(GdiGetColorSpaceforBitmap, 1) //  0x10aa 
SVC_(GdiGetCOPPCompatibleOPMInformation, 3) //  0x10ab 
SVC_(GdiGetDCDword, 3) //  0x10ac 
SVC_(GdiGetDCforBitmap, 1) //  0x10ad 
SVC_(GdiGetDCObject, 2) //  0x10ae 
SVC_(GdiGetDCPoint, 3) //  0x10af 
SVC_(GdiGetDeviceCaps, 2) //  0x10b0 
SVC_(GdiGetDeviceGammaRamp, 2) //  0x10b1 
SVC_(GdiGetDeviceCapsAll, 2) //  0x10b2 
SVC_(GdiGetDIBitsInternal, 9) //  0x10b3 
SVC_(GdiGetETM, 2) //  0x10b4 
SVC_(GdiGetEudcTimeStampEx, 3) //  0x10b5 
SVC_(GdiGetFontData, 5) //  0x10b6 
SVC_(GdiGetFontResourceInfoInternalW, 7) //  0x10b7 
SVC_(GdiGetGlyphIndicesW, 5) //  0x10b8 
SVC_(GdiGetGlyphIndicesWInternal, 6) //  0x10b9 
SVC_(GdiGetGlyphOutline, 8) //  0x10ba 
SVC_(GdiGetOPMInformation, 3) //  0x10bb 
SVC_(GdiGetKerningPairs, 3) //  0x10bc 
SVC_(GdiGetLinkedUFIs, 3) //  0x10bd 
SVC_(GdiGetMiterLimit, 2) //  0x10be 
SVC_(GdiGetMonitorID, 3) //  0x10bf 
SVC_(GdiGetNearestColor, 2) //  0x10c0 
SVC_(GdiGetNearestPaletteIndex, 2) //  0x10c1 
SVC_(GdiGetObjectBitmapHandle, 2) //  0x10c2 
SVC_(GdiGetOPMRandomNumber, 2) //  0x10c3 
SVC_(GdiGetOutlineTextMetricsInternalW, 4) //  0x10c4 
SVC_(GdiGetPath, 4) //  0x10c5 
SVC_(GdiGetPixel, 3) //  0x10c6 
SVC_(GdiGetRandomRgn, 3) //  0x10c7 
SVC_(GdiGetRasterizerCaps, 2) //  0x10c8 
SVC_(GdiGetRealizationInfo, 3) //  0x10c9 
SVC_(GdiGetRegionData, 3) //  0x10ca 
SVC_(GdiGetRgnBox, 2) //  0x10cb 
SVC_(GdiGetServerMetaFileBits, 7) //  0x10cc 
SVC_(GdiGetSpoolMessage, 4) //  0x10cd 
SVC_(GdiGetStats, 5) //  0x10ce 
SVC_(GdiGetStockObject, 1) //  0x10cf 
SVC_(GdiGetStringBitmapW, 5) //  0x10d0 
SVC_(GdiGetSuggestedOPMProtectedOutputArraySize, 2) //  0x10d1 
SVC_(GdiGetSystemPaletteUse, 1) //  0x10d2 
SVC_(GdiGetTextCharsetInfo, 3) //  0x10d3 
SVC_(GdiGetTextExtent, 5) //  0x10d4 
SVC_(GdiGetTextExtentExW, 8) //  0x10d5 
SVC_(GdiGetTextFaceW, 4) //  0x10d6 
SVC_(GdiGetTextMetricsW, 3) //  0x10d7 
SVC_(GdiGetTransform, 3) //  0x10d8 
SVC_(GdiGetUFI, 6) //  0x10d9 
SVC_(GdiGetEmbUFI, 7) //  0x10da 
SVC_(GdiGetUFIPathname, 10) //  0x10db 
SVC_(GdiGetEmbedFonts, 0) //  0x10dc 
SVC_(GdiChangeGhostFont, 2) //  0x10dd 
SVC_(GdiAddEmbFontToDC, 2) //  0x10de 
SVC_(GdiGetFontUnicodeRanges, 2) //  0x10df 
SVC_(GdiGetWidthTable, 7) //  0x10e0 
SVC_(GdiGradientFill, 6) //  0x10e1 
SVC_(GdiHfontCreate, 5) //  0x10e2 
SVC_(GdiIcmBrushInfo, 8) //  0x10e3 
SVC_(GdiInit, 0) //  0x10e4 
SVC_(GdiInitSpool, 0) //  0x10e5 
SVC_(GdiIntersectClipRect, 5) //  0x10e6 
SVC_(GdiInvertRgn, 2) //  0x10e7 
SVC_(GdiLineTo, 3) //  0x10e8 
SVC_(GdiMakeFontDir, 5) //  0x10e9 
SVC_(GdiMakeInfoDC, 2) //  0x10ea 
SVC_(GdiMaskBlt, 13) //  0x10eb 
SVC_(GdiModifyWorldTransform, 3) //  0x10ec 
SVC_(GdiMonoBitmap, 1) //  0x10ed 
SVC_(GdiMoveTo, 4) //  0x10ee 
SVC_(GdiOffsetClipRgn, 3) //  0x10ef 
SVC_(GdiOffsetRgn, 3) //  0x10f0 
SVC_(GdiOpenDCW, 7) //  0x10f1 
SVC_(GdiPatBlt, 6) //  0x10f2 
SVC_(GdiPolyPatBlt, 5) //  0x10f3 
SVC_(GdiPathToRegion, 1) //  0x10f4 
SVC_(GdiPlgBlt, 11) //  0x10f5 
SVC_(GdiPolyDraw, 4) //  0x10f6 
SVC_(GdiPolyPolyDraw, 5) //  0x10f7 
SVC_(GdiPolyTextOutW, 4) //  0x10f8 
SVC_(GdiPtInRegion, 3) //  0x10f9 
SVC_(GdiPtVisible, 3) //  0x10fa 
SVC_(GdiQueryFonts, 3) //  0x10fb 
SVC_(GdiQueryFontAssocInfo, 1) //  0x10fc 
SVC_(GdiRectangle, 5) //  0x10fd 
SVC_(GdiRectInRegion, 2) //  0x10fe 
SVC_(GdiRectVisible, 2) //  0x10ff 
SVC_(GdiRemoveFontResourceW, 6) //  0x1100 
SVC_(GdiRemoveFontMemResourceEx, 1) //  0x1101 
SVC_(GdiResetDC, 5) //  0x1102 
SVC_(GdiResizePalette, 2) //  0x1103 
SVC_(GdiRestoreDC, 2) //  0x1104 
SVC_(GdiRoundRect, 7) //  0x1105 
SVC_(GdiSaveDC, 1) //  0x1106 
SVC_(GdiScaleViewportExtEx, 6) //  0x1107 
SVC_(GdiScaleWindowExtEx, 6) //  0x1108 
SVC_(GdiSelectBitmap, 2) //  0x1109 
SVC_(GdiSelectBrush, 2) //  0x110a 
SVC_(GdiSelectClipPath, 2) //  0x110b 
SVC_(GdiSelectFont, 2) //  0x110c 
SVC_(GdiSelectPen, 2) //  0x110d 
SVC_(GdiSetBitmapAttributes, 2) //  0x110e 
SVC_(GdiSetBitmapBits, 3) //  0x110f 
SVC_(GdiSetBitmapDimension, 4) //  0x1110 
SVC_(GdiSetBoundsRect, 3) //  0x1111 
SVC_(GdiSetBrushAttributes, 2) //  0x1112 
SVC_(GdiSetBrushOrg, 4) //  0x1113 
SVC_(GdiSetColorAdjustment, 2) //  0x1114 
SVC_(GdiSetColorSpace, 2) //  0x1115 
SVC_(GdiSetDeviceGammaRamp, 2) //  0x1116 
SVC_(GdiSetDIBitsToDeviceInternal, 16) //  0x1117 
SVC_(GdiSetFontEnumeration, 1) //  0x1118 
SVC_(GdiSetFontXform, 3) //  0x1119 
SVC_(GdiSetIcmMode, 3) //  0x111a 
SVC_(GdiSetLinkedUFIs, 3) //  0x111b 
SVC_(GdiSetMagicColors, 3) //  0x111c 
SVC_(GdiSetMetaRgn, 1) //  0x111d 
SVC_(GdiSetMiterLimit, 3) //  0x111e 
SVC_(GdiGetDeviceWidth, 1) //  0x111f 
SVC_(GdiMirrorWindowOrg, 1) //  0x1120 
SVC_(GdiSetLayout, 3) //  0x1121 
SVC_(GdiSetOPMSigningKeyAndSequenceNumbers, 2) //  0x1122 
SVC_(GdiSetPixel, 4) //  0x1123 
SVC_(GdiSetPixelFormat, 2) //  0x1124 
SVC_(GdiSetRectRgn, 5) //  0x1125 
SVC_(GdiSetSystemPaletteUse, 2) //  0x1126 
SVC_(GdiSetTextJustification, 3) //  0x1127 
SVC_(GdiSetupPublicCFONT, 3) //  0x1128 
SVC_(GdiSetVirtualResolution, 5) //  0x1129 
SVC_(GdiSetSizeDevice, 3) //  0x112a 
SVC_(GdiStartDoc, 4) //  0x112b 
SVC_(GdiStartPage, 1) //  0x112c 
SVC_(GdiStretchBlt, 12) //  0x112d 
SVC_(GdiStretchDIBitsInternal, 16) //  0x112e 
SVC_(GdiStrokeAndFillPath, 1) //  0x112f 
SVC_(GdiStrokePath, 1) //  0x1130 
SVC_(GdiSwapBuffers, 1) //  0x1131 
SVC_(GdiTransformPoints, 5) //  0x1132 
SVC_(GdiTransparentBlt, 11) //  0x1133 
SVC_(GdiUnloadPrinterDriver, 2) //  0x1134 
SVC_(GdiUnmapMemFont, 1) //  0x1135 
SVC_(GdiUnrealizeObject, 1) //  0x1136 
SVC_(GdiUpdateColors, 1) //  0x1137 
SVC_(GdiWidenPath, 1) //  0x1138 
SVC_(UserActivateKeyboardLayout, 2) //  0x1139 
SVC_(UserAddClipboardFormatListener, 1) //  0x113a 
SVC_(UserAlterWindowStyle, 3) //  0x113b 
SVC_(UserAssociateInputContext, 3) //  0x113c 
SVC_(UserAttachThreadInput, 3) //  0x113d 
SVC_(UserBeginPaint, 2) //  0x113e 
SVC_(UserBitBltSysBmp, 8) //  0x113f 
SVC_(UserBlockInput, 1) //  0x1140 
SVC_(UserBuildHimcList, 4) //  0x1141 
SVC_(UserBuildHwndList, 7) //  0x1142 
SVC_(UserBuildNameList, 4) //  0x1143 
SVC_(UserBuildPropList, 4) //  0x1144 
SVC_(UserCallHwnd, 2) //  0x1145 
SVC_(UserCallHwndLock, 2) //  0x1146 
SVC_(UserCallHwndOpt, 2) //  0x1147 
SVC_(UserCallHwndParam, 3) //  0x1148 
SVC_(UserCallHwndParamLock, 3) //  0x1149 
SVC_(UserCallMsgFilter, 2) //  0x114a 
SVC_(UserCallNextHookEx, 4) //  0x114b 
SVC_(UserCallNoParam, 1) //  0x114c 
SVC_(UserCallOneParam, 2) //  0x114d 
SVC_(UserCallTwoParam, 3) //  0x114e 
SVC_(UserChangeClipboardChain, 2) //  0x114f 
SVC_(UserChangeDisplaySettings, 4) //  0x1150 
SVC_(UserCheckAccessForIntegrityLevel, 3) //  0x1151 
SVC_(UserCheckDesktopByThreadId, 1) //  0x1152 
SVC_(UserCheckWindowThreadDesktop, 3) //  0x1153 
SVC_(UserCheckImeHotKey, 2) //  0x1154 
SVC_(UserCheckMenuItem, 3) //  0x1155 
SVC_(UserChildWindowFromPointEx, 4) //  0x1156 
SVC_(UserClipCursor, 1) //  0x1157 
SVC_(UserCloseClipboard, 0) //  0x1158 
SVC_(UserCloseDesktop, 1) //  0x1159 
SVC_(UserCloseWindowStation, 1) //  0x115a 
SVC_(UserConsoleControl, 3) //  0x115b 
SVC_(UserConvertMemHandle, 2) //  0x115c 
SVC_(UserCopyAcceleratorTable, 3) //  0x115d 
SVC_(UserCountClipboardFormats, 0) //  0x115e 
SVC_(UserCreateAcceleratorTable, 2) //  0x115f 
SVC_(UserCreateCaret, 4) //  0x1160 
SVC_(UserCreateDesktopEx, 6) //  0x1161 
SVC_(UserCreateInputContext, 1) //  0x1162 
SVC_(UserCreateLocalMemHandle, 4) //  0x1163 
SVC_(UserCreateWindowEx, 15) //  0x1164 
SVC_(UserCreateWindowStation, 7) //  0x1165 
SVC_(UserDdeInitialize, 5) //  0x1166 
SVC_(UserDeferWindowPos, 8) //  0x1167 
SVC_(UserDefSetText, 2) //  0x1168 
SVC_(UserDeleteMenu, 3) //  0x1169 
SVC_(UserDestroyAcceleratorTable, 1) //  0x116a 
SVC_(UserDestroyCursor, 2) //  0x116b 
SVC_(UserDestroyInputContext, 1) //  0x116c 
SVC_(UserDestroyMenu, 1) //  0x116d 
SVC_(UserDestroyWindow, 1) //  0x116e 
SVC_(UserDisableThreadIme, 1) //  0x116f 
SVC_(UserDispatchMessage, 1) //  0x1170 
SVC_(UserDoSoundConnect, 0) //  0x1171 
SVC_(UserDoSoundDisconnect, 0) //  0x1172 
SVC_(UserDragDetect, 3) //  0x1173 
SVC_(UserDragObject, 5) //  0x1174 
SVC_(UserDrawAnimatedRects, 4) //  0x1175 
SVC_(UserDrawCaption, 4) //  0x1176 
SVC_(UserDrawCaptionTemp, 7) //  0x1177 
SVC_(UserDrawIconEx, 11) //  0x1178 
SVC_(UserDrawMenuBarTemp, 5) //  0x1179 
SVC_(UserEmptyClipboard, 0) //  0x117a 
SVC_(UserEnableMenuItem, 3) //  0x117b 
SVC_(UserEnableScrollBar, 3) //  0x117c 
SVC_(UserEndDeferWindowPosEx, 2) //  0x117d 
SVC_(UserEndMenu, 0) //  0x117e 
SVC_(UserEndPaint, 2) //  0x117f 
SVC_(UserEnumDisplayDevices, 4) //  0x1180 
SVC_(UserEnumDisplayMonitors, 4) //  0x1181 
SVC_(UserEnumDisplaySettings, 4) //  0x1182 
SVC_(UserEvent, 1) //  0x1183 
SVC_(UserExcludeUpdateRgn, 2) //  0x1184 
SVC_(UserFillWindow, 4) //  0x1185 
SVC_(UserFindExistingCursorIcon, 3) //  0x1186 
SVC_(UserFindWindowEx, 5) //  0x1187 
SVC_(UserFlashWindowEx, 1) //  0x1188 
SVC_(UserFrostCrashedWindow, 2) //  0x1189 
SVC_(UserGetAltTabInfo, 6) //  0x118a 
SVC_(UserGetAncestor, 2) //  0x118b 
SVC_(UserGetAppImeLevel, 1) //  0x118c 
SVC_(UserGetAsyncKeyState, 1) //  0x118d 
SVC_(UserGetAtomName, 2) //  0x118e 
SVC_(UserGetCaretBlinkTime, 0) //  0x118f 
SVC_(UserGetCaretPos, 1) //  0x1190 
SVC_(UserGetClassInfoEx, 5) //  0x1191 
SVC_(UserGetClassName, 3) //  0x1192 
SVC_(UserGetClipboardData, 2) //  0x1193 
SVC_(UserGetClipboardFormatName, 3) //  0x1194 
SVC_(UserGetClipboardOwner, 0) //  0x1195 
SVC_(UserGetClipboardSequenceNumber, 0) //  0x1196 
SVC_(UserGetClipboardViewer, 0) //  0x1197 
SVC_(UserGetClipCursor, 1) //  0x1198 
SVC_(UserGetComboBoxInfo, 2) //  0x1199 
SVC_(UserGetControlBrush, 3) //  0x119a 
SVC_(UserGetControlColor, 4) //  0x119b 
SVC_(UserGetCPD, 3) //  0x119c 
SVC_(UserGetCursorFrameInfo, 4) //  0x119d 
SVC_(UserGetCursorInfo, 1) //  0x119e 
SVC_(UserGetDC, 1) //  0x119f 
SVC_(UserGetDCEx, 3) //  0x11a0 
SVC_(UserGetDoubleClickTime, 0) //  0x11a1 
SVC_(UserGetForegroundWindow, 0) //  0x11a2 
SVC_(UserGetGuiResources, 2) //  0x11a3 
SVC_(UserGetGUIThreadInfo, 2) //  0x11a4 
SVC_(UserGetIconInfo, 6) //  0x11a5 
SVC_(UserGetIconSize, 4) //  0x11a6 
SVC_(UserGetImeHotKey, 4) //  0x11a7 
SVC_(UserGetImeInfoEx, 2) //  0x11a8 
SVC_(UserGetInternalWindowPos, 3) //  0x11a9 
SVC_(UserGetKeyboardLayoutList, 2) //  0x11aa 
SVC_(UserGetKeyboardLayoutName, 1) //  0x11ab 
SVC_(UserGetKeyboardState, 1) //  0x11ac 
SVC_(UserGetKeyNameText, 3) //  0x11ad 
SVC_(UserGetKeyState, 1) //  0x11ae 
SVC_(UserGetListBoxInfo, 1) //  0x11af 
SVC_(UserGetMenuBarInfo, 4) //  0x11b0 
SVC_(UserGetMenuIndex, 2) //  0x11b1 
SVC_(UserGetMenuItemRect, 4) //  0x11b2 
SVC_(UserGetMessage, 4) //  0x11b3 
SVC_(UserGetMouseMovePointsEx, 5) //  0x11b4 
SVC_(UserGetObjectInformation, 5) //  0x11b5 
SVC_(UserGetOpenClipboardWindow, 0) //  0x11b6 
SVC_(UserGetPriorityClipboardFormat, 2) //  0x11b7 
SVC_(UserGetProcessWindowStation, 0) //  0x11b8 
SVC_(UserGetRawInputBuffer, 3) //  0x11b9 
SVC_(UserGetRawInputData, 5) //  0x11ba 
SVC_(UserGetRawInputDeviceInfo, 4) //  0x11bb 
SVC_(UserGetRawInputDeviceList, 3) //  0x11bc 
SVC_(UserGetRegisteredRawInputDevices, 3) //  0x11bd 
SVC_(UserGetScrollBarInfo, 3) //  0x11be 
SVC_(UserGetSystemMenu, 2) //  0x11bf 
SVC_(UserGetThreadDesktop, 2) //  0x11c0 
SVC_(UserGetThreadState, 1) //  0x11c1 
SVC_(UserGetTitleBarInfo, 2) //  0x11c2 
SVC_(UserGetUpdatedClipboardFormats, 3) //  0x11c3 
SVC_(UserGetUpdateRect, 3) //  0x11c4 
SVC_(UserGetUpdateRgn, 3) //  0x11c5 
SVC_(UserGetWindowDC, 1) //  0x11c6 
SVC_(UserGetWindowPlacement, 2) //  0x11c7 
SVC_(UserGetWOWClass, 2) //  0x11c8 
SVC_(UserGhostWindowFromHungWindow, 1) //  0x11c9 
SVC_(UserHardErrorControl, 3) //  0x11ca 
SVC_(UserHideCaret, 1) //  0x11cb 
SVC_(UserHiliteMenuItem, 4) //  0x11cc 
SVC_(UserHungWindowFromGhostWindow, 1) //  0x11cd 
SVC_(UserImpersonateDdeClientWindow, 2) //  0x11ce 
SVC_(UserInitialize, 3) //  0x11cf 
SVC_(UserInitializeClientPfnArrays, 4) //  0x11d0 
SVC_(UserInitTask, 12) //  0x11d1 
SVC_(UserInternalGetWindowText, 3) //  0x11d2 
SVC_(UserInternalGetWindowIcon, 2) //  0x11d3 
SVC_(UserInvalidateRect, 3) //  0x11d4 
SVC_(UserInvalidateRgn, 3) //  0x11d5 
SVC_(UserIsClipboardFormatAvailable, 1) //  0x11d6 
SVC_(UserKillTimer, 2) //  0x11d7 
SVC_(UserLoadKeyboardLayoutEx, 7) //  0x11d8 
SVC_(UserLockWindowStation, 1) //  0x11d9 
SVC_(UserLockWindowUpdate, 1) //  0x11da 
SVC_(UserLockWorkStation, 0) //  0x11db 
SVC_(UserLogicalToPhysicalPoint, 2) //  0x11dc 
SVC_(UserMapVirtualKeyEx, 4) //  0x11dd 
SVC_(UserMenuItemFromPoint, 4) //  0x11de 
SVC_(UserMessageCall, 7) //  0x11df 
SVC_(UserMinMaximize, 3) //  0x11e0 
SVC_(UserMNDragLeave, 0) //  0x11e1 
SVC_(UserMNDragOver, 2) //  0x11e2 
SVC_(UserModifyUserStartupInfoFlags, 2) //  0x11e3 
SVC_(UserMoveWindow, 6) //  0x11e4 
SVC_(UserNotifyIMEStatus, 3) //  0x11e5 
SVC_(UserNotifyProcessCreate, 4) //  0x11e6 
SVC_(UserNotifyWinEvent, 4) //  0x11e7 
SVC_(UserOpenClipboard, 2) //  0x11e8 
SVC_(UserOpenDesktop, 3) //  0x11e9 
SVC_(UserOpenInputDesktop, 3) //  0x11ea 
SVC_(UserOpenThreadDesktop, 5) //  0x11eb 
SVC_(UserOpenWindowStation, 2) //  0x11ec 
SVC_(UserPaintDesktop, 1) //  0x11ed 
SVC_(UserPaintMonitor, 3) //  0x11ee 
SVC_(UserPeekMessage, 5) //  0x11ef 
SVC_(UserPhysicalToLogicalPoint, 2) //  0x11f0 
SVC_(UserPostMessage, 4) //  0x11f1 
SVC_(UserPostThreadMessage, 4) //  0x11f2 
SVC_(UserPrintWindow, 3) //  0x11f3 
SVC_(UserProcessConnect, 3) //  0x11f4 
SVC_(UserQueryInformationThread, 4) //  0x11f5 
SVC_(UserQueryInputContext, 2) //  0x11f6 
SVC_(UserQuerySendMessage, 1) //  0x11f7 
SVC_(UserQueryWindow, 2) //  0x11f8 
SVC_(UserRealChildWindowFromPoint, 3) //  0x11f9 
SVC_(UserRealInternalGetMessage, 6) //  0x11fa 
SVC_(UserRealWaitMessageEx, 2) //  0x11fb 
SVC_(UserRedrawWindow, 4) //  0x11fc 
SVC_(UserRegisterClassExWOW, 7) //  0x11fd 
SVC_(UserRegisterErrorReportingDialog, 2) //  0x11fe 
SVC_(UserRegisterUserApiHook, 4) //  0x11ff 
SVC_(UserRegisterHotKey, 4) //  0x1200 
SVC_(UserRegisterRawInputDevices, 3) //  0x1201 
SVC_(UserRegisterTasklist, 1) //  0x1202 
SVC_(UserRegisterWindowMessage, 1) //  0x1203 
SVC_(UserRemoveClipboardFormatListener, 1) //  0x1204 
SVC_(UserRemoveMenu, 3) //  0x1205 
SVC_(UserRemoveProp, 2) //  0x1206 
SVC_(UserResolveDesktop, 4) //  0x1207 
SVC_(UserResolveDesktopForWOW, 1) //  0x1208 
SVC_(UserSBGetParms, 4) //  0x1209 
SVC_(UserScrollDC, 7) //  0x120a 
SVC_(UserScrollWindowEx, 8) //  0x120b 
SVC_(UserSelectPalette, 3) //  0x120c 
SVC_(UserSendInput, 3) //  0x120d 
SVC_(UserSetActiveWindow, 1) //  0x120e 
SVC_(UserSetAppImeLevel, 2) //  0x120f 
SVC_(UserSetCapture, 1) //  0x1210 
SVC_(UserSetClassLong, 4) //  0x1211 
SVC_(UserSetClassWord, 3) //  0x1212 
SVC_(UserSetClipboardData, 3) //  0x1213 
SVC_(UserSetClipboardViewer, 1) //  0x1214 
SVC_(UserSetConsoleReserveKeys, 2) //  0x1215 
SVC_(UserSetCursor, 1) //  0x1216 
SVC_(UserSetCursorContents, 2) //  0x1217 
SVC_(UserSetCursorIconData, 4) //  0x1218 
SVC_(UserSetFocus, 1) //  0x1219 
SVC_(UserSetImeHotKey, 5) //  0x121a 
SVC_(UserSetImeInfoEx, 1) //  0x121b 
SVC_(UserSetImeOwnerWindow, 2) //  0x121c 
SVC_(UserSetInformationProcess, 4) //  0x121d 
SVC_(UserSetInformationThread, 4) //  0x121e 
SVC_(UserSetInternalWindowPos, 4) //  0x121f 
SVC_(UserSetKeyboardState, 1) //  0x1220 
SVC_(UserSetMenu, 3) //  0x1221 
SVC_(UserSetMenuContextHelpId, 2) //  0x1222 
SVC_(UserSetMenuDefaultItem, 3) //  0x1223 
SVC_(UserSetMenuFlagRtoL, 1) //  0x1224 
SVC_(UserSetObjectInformation, 4) //  0x1225 
SVC_(UserSetParent, 2) //  0x1226 
SVC_(UserSetProcessWindowStation, 1) //  0x1227 
SVC_(UserGetProp, 2) //  0x1228 
SVC_(UserSetProp, 3) //  0x1229 
SVC_(UserSetScrollInfo, 4) //  0x122a 
SVC_(UserSetShellWindowEx, 2) //  0x122b 
SVC_(UserSetSysColors, 4) //  0x122c 
SVC_(UserSetSystemCursor, 2) //  0x122d 
SVC_(UserSetSystemMenu, 2) //  0x122e 
SVC_(UserSetSystemTimer, 4) //  0x122f 
SVC_(UserSetThreadDesktop, 1) //  0x1230 
SVC_(UserSetThreadLayoutHandles, 2) //  0x1231 
SVC_(UserSetThreadState, 2) //  0x1232 
SVC_(UserSetTimer, 4) //  0x1233 
SVC_(UserSetProcessDPIAware, 0) //  0x1234 
SVC_(UserSetWindowFNID, 2) //  0x1235 
SVC_(UserSetWindowLong, 4) //  0x1236 
SVC_(UserSetWindowPlacement, 2) //  0x1237 
SVC_(UserSetWindowPos, 7) //  0x1238 
SVC_(UserSetWindowRgn, 3) //  0x1239 
SVC_(UserGetWindowRgnEx, 3) //  0x123a 
SVC_(UserSetWindowRgnEx, 3) //  0x123b 
SVC_(UserSetWindowsHookAW, 3) //  0x123c 
SVC_(UserSetWindowsHookEx, 6) //  0x123d 
SVC_(UserSetWindowStationUser, 4) //  0x123e 
SVC_(UserSetWindowWord, 3) //  0x123f 
SVC_(UserSetWinEventHook, 8) //  0x1240 
SVC_(UserShowCaret, 1) //  0x1241 
SVC_(UserShowScrollBar, 3) //  0x1242 
SVC_(UserShowWindow, 2) //  0x1243 
SVC_(UserShowWindowAsync, 2) //  0x1244 
SVC_(UserSoundSentry, 0) //  0x1245 
SVC_(UserSwitchDesktop, 2) //  0x1246 
SVC_(UserSystemParametersInfo, 4) //  0x1247 
SVC_(UserTestForInteractiveUser, 1) //  0x1248 
SVC_(UserThunkedMenuInfo, 2) //  0x1249 
SVC_(UserThunkedMenuItemInfo, 6) //  0x124a 
SVC_(UserToUnicodeEx, 7) //  0x124b 
SVC_(UserTrackMouseEvent, 1) //  0x124c 
SVC_(UserTrackPopupMenuEx, 6) //  0x124d 
SVC_(UserCalcMenuBar, 5) //  0x124e 
SVC_(UserPaintMenuBar, 6) //  0x124f 
SVC_(UserTranslateAccelerator, 3) //  0x1250 
SVC_(UserTranslateMessage, 2) //  0x1251 
SVC_(UserUnhookWindowsHookEx, 1) //  0x1252 
SVC_(UserUnhookWinEvent, 1) //  0x1253 
SVC_(UserUnloadKeyboardLayout, 1) //  0x1254 
SVC_(UserUnlockWindowStation, 1) //  0x1255 
SVC_(UserUnregisterClass, 3) //  0x1256 
SVC_(UserUnregisterUserApiHook, 0) //  0x1257 
SVC_(UserUnregisterHotKey, 2) //  0x1258 
SVC_(UserUpdateInputContext, 3) //  0x1259 
SVC_(UserUpdateInstance, 3) //  0x125a 
SVC_(UserUpdateLayeredWindow, 10) //  0x125b 
SVC_(UserGetLayeredWindowAttributes, 4) //  0x125c 
SVC_(UserSetLayeredWindowAttributes, 4) //  0x125d 
SVC_(UserUpdatePerUserSystemParameters, 2) //  0x125e 
SVC_(UserUserHandleGrantAccess, 3) //  0x125f 
SVC_(UserValidateHandleSecure, 1) //  0x1260 
SVC_(UserValidateRect, 2) //  0x1261 
SVC_(UserValidateTimerCallback, 1) //  0x1262 
SVC_(UserVkKeyScanEx, 3) //  0x1263 
SVC_(UserWaitForInputIdle, 3) //  0x1264 
SVC_(UserWaitForMsgAndEvent, 1) //  0x1265 
SVC_(UserWaitMessage, 0) //  0x1266 
SVC_(UserWin32PoolAllocationStats, 6) //  0x1267 
SVC_(UserWindowFromPhysicalPoint, 2) //  0x1268 
SVC_(UserWindowFromPoint, 2) //  0x1269 
SVC_(UserYieldTask, 0) //  0x126a 
SVC_(UserRemoteConnect, 3) //  0x126b 
SVC_(UserRemoteRedrawRectangle, 4) //  0x126c 
SVC_(UserRemoteRedrawScreen, 0) //  0x126d 
SVC_(UserRemoteStopScreenUpdates, 0) //  0x126e 
SVC_(UserCtxDisplayIOCtl, 3) //  0x126f 
SVC_(UserRegisterSessionPort, 1) //  0x1270 
SVC_(UserUnregisterSessionPort, 0) //  0x1271 
SVC_(UserUpdateWindowTransform, 3) //  0x1272 
SVC_(UserDwmStartRedirection, 1) //  0x1273 
SVC_(UserDwmStopRedirection, 0) //  0x1274 
SVC_(UserDwmHintDxUpdate, 2) //  0x1275 
SVC_(UserDwmGetDxRgn, 3) //  0x1276 
SVC_(UserGetWindowMinimizeRect, 2) //  0x1277 
SVC_(GdiEngAssociateSurface, 3) //  0x1278 
SVC_(GdiEngCreateBitmap, 6) //  0x1279 
SVC_(GdiEngCreateDeviceSurface, 4) //  0x127a 
SVC_(GdiEngCreateDeviceBitmap, 4) //  0x127b 
SVC_(GdiEngCreatePalette, 6) //  0x127c 
SVC_(GdiEngComputeGlyphSet, 3) //  0x127d 
SVC_(GdiEngCopyBits, 6) //  0x127e 
SVC_(GdiEngDeletePalette, 1) //  0x127f 
SVC_(GdiEngDeleteSurface, 1) //  0x1280 
SVC_(GdiEngEraseSurface, 3) //  0x1281 
SVC_(GdiEngUnlockSurface, 1) //  0x1282 
SVC_(GdiEngLockSurface, 1) //  0x1283 
SVC_(GdiEngBitBlt, 11) //  0x1284 
SVC_(GdiEngStretchBlt, 11) //  0x1285 
SVC_(GdiEngPlgBlt, 11) //  0x1286 
SVC_(GdiEngMarkBandingSurface, 1) //  0x1287 
SVC_(GdiEngStrokePath, 8) //  0x1288 
SVC_(GdiEngFillPath, 7) //  0x1289 
SVC_(GdiEngStrokeAndFillPath, 10) //  0x128a 
SVC_(GdiEngPaint, 5) //  0x128b 
SVC_(GdiEngLineTo, 9) //  0x128c 
SVC_(GdiEngAlphaBlend, 7) //  0x128d 
SVC_(GdiEngGradientFill, 10) //  0x128e 
SVC_(GdiEngTransparentBlt, 8) //  0x128f 
SVC_(GdiEngTextOut, 10) //  0x1290 
SVC_(GdiEngStretchBltROP, 13) //  0x1291 
SVC_(GdiXLATEOBJ_cGetPalette, 4) //  0x1292 
SVC_(GdiXLATEOBJ_iXlate, 2) //  0x1293 
SVC_(GdiXLATEOBJ_hGetColorTransform, 1) //  0x1294 
SVC_(GdiCLIPOBJ_bEnum, 3) //  0x1295 
SVC_(GdiCLIPOBJ_cEnumStart, 5) //  0x1296 
SVC_(GdiCLIPOBJ_ppoGetPath, 1) //  0x1297 
SVC_(GdiEngDeletePath, 1) //  0x1298 
SVC_(GdiEngCreateClip, 0) //  0x1299 
SVC_(GdiEngDeleteClip, 1) //  0x129a 
SVC_(GdiBRUSHOBJ_ulGetBrushColor, 1) //  0x129b 
SVC_(GdiBRUSHOBJ_pvAllocRbrush, 2) //  0x129c 
SVC_(GdiBRUSHOBJ_pvGetRbrush, 1) //  0x129d 
SVC_(GdiBRUSHOBJ_hGetColorTransform, 1) //  0x129e 
SVC_(GdiXFORMOBJ_bApplyXform, 5) //  0x129f 
SVC_(GdiXFORMOBJ_iGetXform, 2) //  0x12a0 
SVC_(GdiFONTOBJ_vGetInfo, 3) //  0x12a1 
SVC_(GdiFONTOBJ_pxoGetXform, 1) //  0x12a2 
SVC_(GdiFONTOBJ_cGetGlyphs, 5) //  0x12a3 
SVC_(GdiFONTOBJ_pifi, 1) //  0x12a4 
SVC_(GdiFONTOBJ_pfdg, 1) //  0x12a5 
SVC_(GdiFONTOBJ_pQueryGlyphAttrs, 2) //  0x12a6 
SVC_(GdiFONTOBJ_pvTrueTypeFontFile, 2) //  0x12a7 
SVC_(GdiFONTOBJ_cGetAllGlyphHandles, 2) //  0x12a8 
SVC_(GdiSTROBJ_bEnum, 3) //  0x12a9 
SVC_(GdiSTROBJ_bEnumPositionsOnly, 3) //  0x12aa 
SVC_(GdiSTROBJ_bGetAdvanceWidths, 4) //  0x12ab 
SVC_(GdiSTROBJ_vEnumStart, 1) //  0x12ac 
SVC_(GdiSTROBJ_dwGetCodePage, 1) //  0x12ad 
SVC_(GdiPATHOBJ_vGetBounds, 2) //  0x12ae 
SVC_(GdiPATHOBJ_bEnum, 2) //  0x12af 
SVC_(GdiPATHOBJ_vEnumStart, 1) //  0x12b0 
SVC_(GdiPATHOBJ_vEnumStartClipLines, 4) //  0x12b1 
SVC_(GdiPATHOBJ_bEnumClipLines, 3) //  0x12b2 
SVC_(GdiGetDhpdev, 1) //  0x12b3 
SVC_(GdiEngCheckAbort, 1) //  0x12b4 
SVC_(GdiHT_Get8BPPFormatPalette, 4) //  0x12b5 
SVC_(GdiHT_Get8BPPMaskPalette, 6) //  0x12b6 
SVC_(GdiUpdateTransform, 1) //  0x12b7 
SVC_(GdiSetPUMPDOBJ, 4) //  0x12b8 
SVC_(GdiBRUSHOBJ_DeleteRbrush, 2) //  0x12b9 
SVC_(GdiUMPDEngFreeUserMem, 1) //  0x12ba 
SVC_(GdiDrawStream, 3) //  0x12bb 
SVC_(GdiDwmGetDirtyRgn, 5) //  0x12bc 
SVC_(GdiDwmGetSurfaceData, 2) //  0x12bd 
SVC_(GdiDdDDICreateAllocation, 1) //  0x12be 
SVC_(GdiDdDDIQueryResourceInfo, 1) //  0x12bf 
SVC_(GdiDdDDIOpenResource, 1) //  0x12c0 
SVC_(GdiDdDDIDestroyAllocation, 1) //  0x12c1 
SVC_(GdiDdDDISetAllocationPriority, 1) //  0x12c2 
SVC_(GdiDdDDIQueryAllocationResidency, 1) //  0x12c3 
SVC_(GdiDdDDICreateDevice, 1) //  0x12c4 
SVC_(GdiDdDDIDestroyDevice, 1) //  0x12c5 
SVC_(GdiDdDDICreateContext, 1) //  0x12c6 
SVC_(GdiDdDDIDestroyContext, 1) //  0x12c7 
SVC_(GdiDdDDICreateSynchronizationObject, 1) //  0x12c8 
SVC_(GdiDdDDIDestroySynchronizationObject, 1) //  0x12c9 
SVC_(GdiDdDDIWaitForSynchronizationObject, 1) //  0x12ca 
SVC_(GdiDdDDISignalSynchronizationObject, 1) //  0x12cb 
SVC_(GdiDdDDIGetRuntimeData, 1) //  0x12cc 
SVC_(GdiDdDDIQueryAdapterInfo, 1) //  0x12cd 
SVC_(GdiDdDDILock, 1) //  0x12ce 
SVC_(GdiDdDDIUnlock, 1) //  0x12cf 
SVC_(GdiDdDDIGetDisplayModeList, 1) //  0x12d0 
SVC_(GdiDdDDISetDisplayMode, 1) //  0x12d1 
SVC_(GdiDdDDIGetMultisampleMethodList, 1) //  0x12d2 
SVC_(GdiDdDDIPresent, 1) //  0x12d3 
SVC_(GdiDdDDIRender, 1) //  0x12d4 
SVC_(GdiDdDDIOpenAdapterFromDeviceName, 1) //  0x12d5 
SVC_(GdiDdDDIOpenAdapterFromHdc, 1) //  0x12d6 
SVC_(GdiDdDDICloseAdapter, 1) //  0x12d7 
SVC_(GdiDdDDIGetSharedPrimaryHandle, 1) //  0x12d8 
SVC_(GdiDdDDIEscape, 1) //  0x12d9 
SVC_(GdiDdDDIQueryStatistics, 1) //  0x12da 
SVC_(GdiDdDDISetVidPnSourceOwner, 1) //  0x12db 
SVC_(GdiDdDDIGetPresentHistory, 1) //  0x12dc 
SVC_(GdiDdDDICreateOverlay, 1) //  0x12dd 
SVC_(GdiDdDDIUpdateOverlay, 1) //  0x12de 
SVC_(GdiDdDDIFlipOverlay, 1) //  0x12df 
SVC_(GdiDdDDIDestroyOverlay, 1) //  0x12e0 
SVC_(GdiDdDDIWaitForVerticalBlankEvent, 1) //  0x12e1 
SVC_(GdiDdDDISetGammaRamp, 1) //  0x12e2 
SVC_(GdiDdDDIGetDeviceState, 1) //  0x12e3 
SVC_(GdiDdDDICreateDCFromMemory, 1) //  0x12e4 
SVC_(GdiDdDDIDestroyDCFromMemory, 1) //  0x12e5 
SVC_(GdiDdDDISetContextSchedulingPriority, 1) //  0x12e6 
SVC_(GdiDdDDIGetContextSchedulingPriority, 1) //  0x12e7 
SVC_(GdiDdDDISetProcessSchedulingPriorityClass, 2) //  0x12e8 
SVC_(GdiDdDDIGetProcessSchedulingPriorityClass, 2) //  0x12e9 
SVC_(GdiDdDDIReleaseProcessVidPnSourceOwners, 1) //  0x12ea 
SVC_(GdiDdDDIGetScanLine, 1) //  0x12eb 
SVC_(GdiDdDDISetQueuedLimit, 1) //  0x12ec 
SVC_(GdiDdDDIPollDisplayChildren, 1) //  0x12ed 
SVC_(GdiDdDDIInvalidateActiveVidPn, 1) //  0x12ee 
SVC_(GdiDdDDICheckOcclusion, 1) //  0x12ef 
SVC_(GdiDdDDIWaitForIdle, 1) //  0x12f0 
SVC_(GdiDdDDICheckMonitorPowerState, 1) //  0x12f1 
SVC_(GdiDdDDICheckExclusiveOwnership, 0) //  0x12f2 
SVC_(GdiDdDDISetDisplayPrivateDriverFormat, 1) //  0x12f3 
SVC_(GdiDdDDISharedPrimaryLockNotification, 1) //  0x12f4 
SVC_(GdiDdDDISharedPrimaryUnLockNotification, 1) //  0x12f5 
SVC_(GdiMakeObjectXferable, 2) //  0x12f6 
SVC_(GdiMakeObjectUnXferable, 1) //  0x12f7 
SVC_(GdiGetNumberOfPhysicalMonitors, 2) //  0x12f8 
SVC_(GdiGetPhysicalMonitors, 4) //  0x12f9 
SVC_(GdiGetPhysicalMonitorDescription, 3) //  0x12fa 
SVC_(GdiDestroyPhysicalMonitor, 1) //  0x12fb 
SVC_(GdiDDCCIGetVCPFeature, 5) //  0x12fc 
SVC_(GdiDDCCISetVCPFeature, 3) //  0x12fd 
SVC_(GdiDDCCISaveCurrentSettings, 1) //  0x12fe 
SVC_(GdiDDCCIGetCapabilitiesStringLength, 2) //  0x12ff 
SVC_(GdiDDCCIGetCapabilitiesString, 3) //  0x1300 
SVC_(GdiDDCCIGetTimingReport, 2) //  0x1301 
SVC_(UserSetMirrorRendering, 2) //  0x1302 
SVC_(UserShowSystemCursor, 1) //  0x1303 

View File

@ -0,0 +1,779 @@
// SVC_(<NAME>, <ARG_COUNT>)
//
// Funcs order should match Windows Vista Service Pack 2 x64 Free
// Note: these MUST be indented for the ARM assembler!
//
SVC_(UserGetThreadState, 1) //  0x1000 
SVC_(UserPeekMessage, 5) //  0x1001 
SVC_(UserCallOneParam, 2) //  0x1002 
SVC_(UserGetKeyState, 1) //  0x1003 
SVC_(UserInvalidateRect, 3) //  0x1004 
SVC_(UserCallNoParam, 1) //  0x1005 
SVC_(UserGetMessage, 4) //  0x1006 
SVC_(UserMessageCall, 7) //  0x1007 
SVC_(GdiBitBlt, 11) //  0x1008 
SVC_(GdiGetCharSet, 1) //  0x1009 
SVC_(UserGetDC, 1) //  0x100a 
SVC_(GdiSelectBitmap, 2) //  0x100b 
SVC_(UserWaitMessage, 0) //  0x100c 
SVC_(UserTranslateMessage, 2) //  0x100d 
SVC_(UserGetProp, 0) //  0x100e 
SVC_(UserPostMessage, 4) //  0x100f 
SVC_(UserQueryWindow, 2) //  0x1010 
SVC_(UserTranslateAccelerator, 3) //  0x1011 
SVC_(GdiFlush, 0) //  0x1012 
SVC_(UserRedrawWindow, 4) //  0x1013 
SVC_(UserWindowFromPoint, 2) //  0x1014 
SVC_(UserCallMsgFilter, 2) //  0x1015 
SVC_(UserValidateTimerCallback, 1) //  0x1016 
SVC_(UserBeginPaint, 2) //  0x1017 
SVC_(UserSetTimer, 4) //  0x1018 
SVC_(UserEndPaint, 2) //  0x1019 
SVC_(UserSetCursor, 1) //  0x101a 
SVC_(UserKillTimer, 2) //  0x101b 
SVC_(UserBuildHwndList, 7) //  0x101c 
SVC_(UserSelectPalette, 3) //  0x101d 
SVC_(UserCallNextHookEx, 4) //  0x101e 
SVC_(UserHideCaret, 1) //  0x101f 
SVC_(GdiIntersectClipRect, 5) //  0x1020 
SVC_(UserCallHwndLock, 2) //  0x1021 
SVC_(UserGetProcessWindowStation, 0) //  0x1022 
SVC_(GdiDeleteObjectApp, 1) //  0x1023 
SVC_(UserSetWindowPos, 7) //  0x1024 
SVC_(UserShowCaret, 1) //  0x1025 
SVC_(UserEndDeferWindowPosEx, 2) //  0x1026 
SVC_(UserCallHwndParamLock, 3) //  0x1027 
SVC_(UserVkKeyScanEx, 3) //  0x1028 
SVC_(GdiSetDIBitsToDeviceInternal, 16) //  0x1029 
SVC_(UserCallTwoParam, 3) //  0x102a 
SVC_(GdiGetRandomRgn, 3) //  0x102b 
SVC_(UserCopyAcceleratorTable, 3) //  0x102c 
SVC_(UserNotifyWinEvent, 4) //  0x102d 
SVC_(GdiExtSelectClipRgn, 3) //  0x102e 
SVC_(UserIsClipboardFormatAvailable, 1) //  0x102f 
SVC_(UserSetScrollInfo, 4) //  0x1030 
SVC_(GdiStretchBlt, 12) //  0x1031 
SVC_(UserCreateCaret, 4) //  0x1032 
SVC_(GdiRectVisible, 2) //  0x1033 
SVC_(GdiCombineRgn, 4) //  0x1034 
SVC_(GdiGetDCObject, 2) //  0x1035 
SVC_(UserDispatchMessage, 1) //  0x1036 
SVC_(UserRegisterWindowMessage, 1) //  0x1037 
SVC_(GdiExtTextOutW, 9) //  0x1038 
SVC_(GdiSelectFont, 2) //  0x1039 
SVC_(GdiRestoreDC, 2) //  0x103a 
SVC_(GdiSaveDC, 1) //  0x103b 
SVC_(UserGetForegroundWindow, 0) //  0x103c 
SVC_(UserShowScrollBar, 3) //  0x103d 
SVC_(UserFindExistingCursorIcon, 3) //  0x103e 
SVC_(GdiGetDCDword, 3) //  0x103f 
SVC_(GdiGetRegionData, 3) //  0x1040 
SVC_(GdiLineTo, 3) //  0x1041 
SVC_(UserSystemParametersInfo, 4) //  0x1042 
SVC_(GdiGetAppClipBox, 2) //  0x1043 
SVC_(UserGetAsyncKeyState, 1) //  0x1044 
SVC_(UserGetCPD, 3) //  0x1045 
SVC_(UserRemoveProp, 2) //  0x1046 
SVC_(GdiDoPalette, 6) //  0x1047 
SVC_(GdiPolyPolyDraw, 5) //  0x1048 
SVC_(UserSetCapture, 1) //  0x1049 
SVC_(UserEnumDisplayMonitors, 5) /* FIXME: 4 on XP/2k3 */ //  0x104a 
SVC_(GdiCreateCompatibleBitmap, 3) //  0x104b 
SVC_(UserSetProp, 3) //  0x104c 
SVC_(GdiGetTextCharsetInfo, 3) //  0x104d 
SVC_(UserSBGetParms, 4) //  0x104e 
SVC_(UserGetIconInfo, 6) //  0x104f 
SVC_(UserExcludeUpdateRgn, 2) //  0x1050 
SVC_(UserSetFocus, 1) //  0x1051 
SVC_(GdiExtGetObjectW, 3) //  0x1052 
SVC_(UserDeferWindowPos, 8) //  0x1053 
SVC_(UserGetUpdateRect, 3) //  0x1054 
SVC_(GdiCreateCompatibleDC, 1) //  0x1055 
SVC_(UserGetClipboardSequenceNumber, 0) //  0x1056 
SVC_(GdiCreatePen, 4) //  0x1057 
SVC_(UserShowWindow, 2) //  0x1058 
SVC_(UserGetKeyboardLayoutList, 2) //  0x1059 
SVC_(GdiPatBlt, 6) //  0x105a 
SVC_(UserMapVirtualKeyEx, 4) //  0x105b 
SVC_(UserSetWindowLong, 4) //  0x105c 
SVC_(GdiHfontCreate, 5) //  0x105d 
SVC_(UserMoveWindow, 6) //  0x105e 
SVC_(UserPostThreadMessage, 4) //  0x105f 
SVC_(UserDrawIconEx, 11) //  0x1060 
SVC_(UserGetSystemMenu, 2) //  0x1061 
SVC_(GdiDrawStream, 3) //  0x1062 
SVC_(UserInternalGetWindowText, 3) //  0x1063 
SVC_(UserGetWindowDC, 1) //  0x1064 
SVC_(GdiD3dDrawPrimitives2, 7) //  0x1065 
SVC_(GdiInvertRgn, 2) //  0x1066 
SVC_(GdiGetRgnBox, 2) //  0x1067 
SVC_(GdiGetAndSetDCDword, 4) //  0x1068 
SVC_(GdiMaskBlt, 13) //  0x1069 
SVC_(GdiGetWidthTable, 7) //  0x106a 
SVC_(UserScrollDC, 7) //  0x106b 
SVC_(UserGetObjectInformation, 5) //  0x106c 
SVC_(GdiCreateBitmap, 5) //  0x106d 
SVC_(GdiConsoleTextOut, 4) //  0x106e 
SVC_(UserFindWindowEx, 5) //  0x106f 
SVC_(GdiPolyPatBlt, 5) //  0x1070 
SVC_(UserUnhookWindowsHookEx, 1) //  0x1071 
SVC_(GdiGetNearestColor, 2) //  0x1072 
SVC_(GdiTransformPoints, 5) //  0x1073 
SVC_(GdiGetDCPoint, 3) //  0x1074 
SVC_(UserCheckImeHotKey, 2) //  0x1075 
SVC_(GdiCreateDIBBrush, 6) //  0x1076 
SVC_(GdiGetTextMetricsW, 3) //  0x1077 
SVC_(UserCreateWindowEx, 15) //  0x1078 
SVC_(UserSetParent, 2) //  0x1079 
SVC_(UserGetKeyboardState, 1) //  0x107a 
SVC_(UserToUnicodeEx, 7) //  0x107b 
SVC_(UserGetControlBrush, 3) //  0x107c 
SVC_(UserGetClassName, 3) //  0x107d 
SVC_(GdiAlphaBlend, 12) //  0x107e 
SVC_(GdiDdBlt, 3) //  0x107f 
SVC_(GdiOffsetRgn, 3) //  0x1080 
SVC_(UserDefSetText, 2) //  0x1081 
SVC_(GdiGetTextFaceW, 4) //  0x1082 
SVC_(GdiStretchDIBitsInternal, 16) //  0x1083 
SVC_(UserSendInput, 3) //  0x1084 
SVC_(UserGetThreadDesktop, 2) //  0x1085 
SVC_(GdiCreateRectRgn, 4) //  0x1086 
SVC_(GdiGetDIBitsInternal, 9) //  0x1087 
SVC_(UserGetUpdateRgn, 3) //  0x1088 
SVC_(GdiDeleteClientObj, 1) //  0x1089 
SVC_(UserGetIconSize, 4) //  0x108a 
SVC_(UserFillWindow, 4) //  0x108b 
SVC_(GdiExtCreateRegion, 3) //  0x108c 
SVC_(GdiComputeXformCoefficients, 1) //  0x108d 
SVC_(UserSetWindowsHookEx, 6) //  0x108e 
SVC_(UserNotifyProcessCreate, 4) //  0x108f 
SVC_(GdiUnrealizeObject, 1) //  0x1090 
SVC_(UserGetTitleBarInfo, 2) //  0x1091 
SVC_(GdiRectangle, 5) //  0x1092 
SVC_(UserSetThreadDesktop, 1) //  0x1093 
SVC_(UserGetDCEx, 3) //  0x1094 
SVC_(UserGetScrollBarInfo, 3) //  0x1095 
SVC_(GdiGetTextExtent, 5) //  0x1096 
SVC_(UserSetWindowFNID, 2) //  0x1097 
SVC_(GdiSetLayout, 3) //  0x1098 
SVC_(UserCalcMenuBar, 5) //  0x1099 
SVC_(UserThunkedMenuItemInfo, 6) //  0x109a 
SVC_(GdiExcludeClipRect, 5) //  0x109b 
SVC_(GdiCreateDIBSection, 9) //  0x109c 
SVC_(GdiGetDCforBitmap, 1) //  0x109d 
SVC_(UserDestroyCursor, 2) //  0x109e 
SVC_(UserDestroyWindow, 1) //  0x109f 
SVC_(UserCallHwndParam, 3) //  0x10a0 
SVC_(GdiCreateDIBitmapInternal, 11) //  0x10a1 
SVC_(UserOpenWindowStation, 2) //  0x10a2 
SVC_(GdiDdDeleteSurfaceObject, 1) //  0x10a3 
SVC_(GdiEnumFontClose, 1) //  0x10a4 
SVC_(GdiEnumFontOpen, 7) //  0x10a5 
SVC_(GdiEnumFontChunk, 5) //  0x10a6 
SVC_(GdiDdCanCreateSurface, 2) //  0x10a7 
SVC_(GdiDdCreateSurface, 8) //  0x10a8 
SVC_(UserSetCursorIconData, 4) //  0x10a9 
SVC_(GdiDdDestroySurface, 2) //  0x10aa 
SVC_(UserCloseDesktop, 1) //  0x10ab 
SVC_(UserOpenDesktop, 3) //  0x10ac 
SVC_(UserSetProcessWindowStation, 1) //  0x10ad 
SVC_(UserGetAtomName, 2) //  0x10ae 
SVC_(GdiDdResetVisrgn, 2) //  0x10af 
SVC_(GdiExtCreatePen, 11) //  0x10b0 
SVC_(GdiCreatePaletteInternal, 2) //  0x10b1 
SVC_(GdiSetBrushOrg, 4) //  0x10b2 
SVC_(UserBuildNameList, 4) //  0x10b3 
SVC_(GdiSetPixel, 4) //  0x10b4 
SVC_(UserRegisterClassExWOW, 7) //  0x10b5 
SVC_(GdiCreatePatternBrushInternal, 3) //  0x10b6 
SVC_(UserGetAncestor, 2) //  0x10b7 
SVC_(GdiGetOutlineTextMetricsInternalW, 4) //  0x10b8 
SVC_(GdiSetBitmapBits, 3) //  0x10b9 
SVC_(UserCloseWindowStation, 1) //  0x10ba 
SVC_(UserGetDoubleClickTime, 0) //  0x10bb 
SVC_(UserEnableScrollBar, 3) //  0x10bc 
SVC_(GdiCreateSolidBrush, 2) //  0x10bd 
SVC_(UserGetClassInfo, 5) //  0x10be 
SVC_(GdiCreateClientObj, 1) //  0x10bf 
SVC_(UserUnregisterClass, 3) //  0x10c0 
SVC_(UserDeleteMenu, 3) //  0x10c1 
SVC_(GdiRectInRegion, 2) //  0x10c2 
SVC_(UserScrollWindowEx, 8) //  0x10c3 
SVC_(GdiGetPixel, 3) //  0x10c4 
SVC_(UserSetClassLong, 4) //  0x10c5 
SVC_(UserGetMenuBarInfo, 4) //  0x10c6 
SVC_(GdiDdCreateSurfaceEx, 3) //  0x10c7 
SVC_(GdiDdCreateSurfaceObject, 6) //  0x10c8 
SVC_(GdiGetNearestPaletteIndex, 2) //  0x10c9 
SVC_(GdiDdLockD3D, 2) //  0x10ca 
SVC_(GdiDdUnlockD3D, 2) //  0x10cb 
SVC_(GdiGetCharWidthW, 6) //  0x10cc 
SVC_(UserInvalidateRgn, 3) //  0x10cd 
SVC_(UserGetClipboardOwner, 0) //  0x10ce 
SVC_(UserSetWindowRgn, 3) //  0x10cf 
SVC_(UserBitBltSysBmp, 8) //  0x10d0 
SVC_(GdiGetCharWidthInfo, 2) //  0x10d1 
SVC_(UserValidateRect, 2) //  0x10d2 
SVC_(UserCloseClipboard, 0) //  0x10d3 
SVC_(UserOpenClipboard, 2) //  0x10d4 
SVC_(GdiGetStockObject, 1) //  0x10d5 
SVC_(UserSetClipboardData, 3) //  0x10d6 
SVC_(UserEnableMenuItem, 3) //  0x10d7 
SVC_(UserAlterWindowStyle, 3) //  0x10d8 
SVC_(GdiFillRgn, 3) //  0x10d9 
SVC_(UserGetWindowPlacement, 2) //  0x10da 
SVC_(GdiModifyWorldTransform, 3) //  0x10db 
SVC_(GdiGetFontData, 5) //  0x10dc 
SVC_(UserGetOpenClipboardWindow, 0) //  0x10dd 
SVC_(UserSetThreadState, 2) //  0x10de 
SVC_(GdiOpenDCW, 7) //  0x10df 
SVC_(UserTrackMouseEvent, 1) //  0x10e0 
SVC_(GdiGetTransform, 3) //  0x10e1 
SVC_(UserDestroyMenu, 1) //  0x10e2 
SVC_(GdiGetBitmapBits, 3) //  0x10e3 
SVC_(UserConsoleControl, 3) //  0x10e4 
SVC_(UserSetActiveWindow, 1) //  0x10e5 
SVC_(UserSetInformationThread, 4) //  0x10e6 
SVC_(UserSetWindowPlacement, 2) //  0x10e7 
SVC_(UserGetControlColor, 4) //  0x10e8 
SVC_(GdiSetMetaRgn, 1) //  0x10e9 
SVC_(GdiSetMiterLimit, 3) //  0x10ea 
SVC_(GdiSetVirtualResolution, 5) //  0x10eb 
SVC_(GdiGetRasterizerCaps, 2) //  0x10ec 
SVC_(UserSetWindowWord, 3) //  0x10ed 
SVC_(UserGetClipboardFormatName, 3) //  0x10ee 
SVC_(UserRealInternalGetMessage, 6) //  0x10ef 
SVC_(UserCreateLocalMemHandle, 4) //  0x10f0 
SVC_(UserAttachThreadInput, 3) //  0x10f1 
SVC_(GdiCreateHalftonePalette, 1) //  0x10f2 
SVC_(UserPaintMenuBar, 6) //  0x10f3 
SVC_(UserSetKeyboardState, 1) //  0x10f4 
SVC_(GdiCombineTransform, 3) //  0x10f5 
SVC_(UserCreateAcceleratorTable, 2) //  0x10f6 
SVC_(UserGetCursorFrameInfo, 4) //  0x10f7 
SVC_(UserGetAltTabInfo, 6) //  0x10f8 
SVC_(UserGetCaretBlinkTime, 0) //  0x10f9 
SVC_(GdiQueryFontAssocInfo, 1) //  0x10fa 
SVC_(UserProcessConnect, 3) //  0x10fb 
SVC_(UserEnumDisplayDevices, 4) //  0x10fc 
SVC_(UserEmptyClipboard, 0) //  0x10fd 
SVC_(UserGetClipboardData, 2) //  0x10fe 
SVC_(UserRemoveMenu, 3) //  0x10ff 
SVC_(GdiSetBoundsRect, 3) //  0x1100 
SVC_(UserSetInformationProcess, 4) //  0x1101 
SVC_(GdiGetBitmapDimension, 2) //  0x1102 
SVC_(UserConvertMemHandle, 2) //  0x1103 
SVC_(UserDestroyAcceleratorTable, 1) //  0x1104 
SVC_(UserGetGUIThreadInfo, 2) //  0x1105 
SVC_(GdiCloseFigure, 1) //  0x1106 
SVC_(UserSetWindowsHookAW, 3) //  0x1107 
SVC_(UserSetMenuDefaultItem, 3) //  0x1108 
SVC_(UserCheckMenuItem, 3) //  0x1109 
SVC_(UserSetWinEventHook, 8) //  0x110a 
SVC_(UserUnhookWinEvent, 1) //  0x110b 
SVC_(GdiSetupPublicCFONT, 3) //  0x110c 
SVC_(UserLockWindowUpdate, 1) //  0x110d 
SVC_(UserSetSystemMenu, 2) //  0x110e 
SVC_(UserThunkedMenuInfo, 2) //  0x110f 
SVC_(GdiBeginPath, 1) //  0x1110 
SVC_(GdiEndPath, 1) //  0x1111 
SVC_(GdiFillPath, 1) //  0x1112 
SVC_(UserCallHwnd, 2) //  0x1113 
SVC_(UserDdeInitialize, 5) //  0x1114 
SVC_(UserModifyUserStartupInfoFlags, 2) //  0x1115 
SVC_(UserCountClipboardFormats, 0) //  0x1116 
SVC_(GdiAddFontMemResourceEx, 5) //  0x1117 
SVC_(GdiEqualRgn, 2) //  0x1118 
SVC_(GdiGetSystemPaletteUse, 1) //  0x1119 
SVC_(GdiRemoveFontMemResourceEx, 1) //  0x111a 
SVC_(UserEnumDisplaySettings, 4) //  0x111b 
SVC_(UserPaintDesktop, 1) //  0x111c 
SVC_(GdiExtEscape, 8) //  0x111d 
SVC_(GdiSetBitmapDimension, 4) //  0x111e 
SVC_(GdiSetFontEnumeration, 1) //  0x111f 
SVC_(UserChangeClipboardChain, 2) //  0x1120 
SVC_(UserResolveDesktop, 4) //  0x1121 
SVC_(UserSetClipboardViewer, 1) //  0x1122 
SVC_(UserShowWindowAsync, 2) //  0x1123 
SVC_(UserSetConsoleReserveKeys, 2) //  0x1124 
SVC_(GdiCreateColorSpace, 1) //  0x1125 
SVC_(GdiDeleteColorSpace, 1) //  0x1126 
SVC_(UserActivateKeyboardLayout, 2) //  0x1127 
SVC_(GdiAbortDoc, 1) //  0x1128 
SVC_(GdiAbortPath, 1) //  0x1129 
SVC_(GdiAddEmbFontToDC, 2) //  0x112a 
SVC_(GdiAddFontResourceW, 6) //  0x112b 
SVC_(GdiAddRemoteFontToDC, 4) //  0x112c 
SVC_(GdiAddRemoteMMInstanceToDC, 3) //  0x112d 
SVC_(GdiAngleArc, 6) //  0x112e 
SVC_(GdiAnyLinkedFonts, 0) //  0x112f 
SVC_(GdiArcInternal, 10) //  0x1130 
SVC_(GdiBRUSHOBJ_DeleteRbrush, 2) //  0x1131 
SVC_(GdiBRUSHOBJ_hGetColorTransform, 1) //  0x1132 
SVC_(GdiBRUSHOBJ_pvAllocRbrush, 2) //  0x1133 
SVC_(GdiBRUSHOBJ_pvGetRbrush, 1) //  0x1134 
SVC_(GdiBRUSHOBJ_ulGetBrushColor, 1) //  0x1135 
SVC_(GdiCLIPOBJ_bEnum, 3) //  0x1136 
SVC_(GdiCLIPOBJ_cEnumStart, 5) //  0x1137 
SVC_(GdiCLIPOBJ_ppoGetPath, 1) //  0x1138 
SVC_(GdiCancelDC, 1) //  0x1139 
SVC_(GdiChangeGhostFont, 2) //  0x113a 
SVC_(GdiCheckBitmapBits, 8) //  0x113b 
SVC_(GdiClearBitmapAttributes, 2) //  0x113c 
SVC_(GdiClearBrushAttributes, 2) //  0x113d 
SVC_(GdiColorCorrectPalette, 6) //  0x113e 
SVC_(GdiConfigureOPMProtectedOutput, 0) //  0x113f 
SVC_(GdiConvertMetafileRect, 2) //  0x1140 
SVC_(GdiCreateColorTransform, 8) //  0x1141 
SVC_(GdiCreateEllipticRgn, 4) //  0x1142 
SVC_(GdiCreateHatchBrushInternal, 3) //  0x1143 
SVC_(GdiCreateMetafileDC, 1) //  0x1144 
SVC_(GdiCreateOPMProtectedOutputs, 0) //  0x1145 
SVC_(GdiCreateRoundRectRgn, 6) //  0x1146 
SVC_(GdiCreateServerMetaFile, 6) //  0x1147 
SVC_(GdiD3dContextCreate, 4) //  0x1148 
SVC_(GdiD3dContextDestroy, 1) //  0x1149 
SVC_(GdiD3dContextDestroyAll, 1) //  0x114a 
SVC_(GdiD3dValidateTextureStageState, 1) //  0x114b 
SVC_(GdiDDCCIGetCapabilitiesString, 0) //  0x114c 
SVC_(GdiDDCCIGetCapabilitiesStringLength, 0) //  0x114d 
SVC_(GdiDDCCIGetTimingReport, 0) //  0x114e 
SVC_(GdiDDCCIGetVCPFeature, 0) //  0x114f 
SVC_(GdiDDCCISaveCurrentSettings, 0) //  0x1150 
SVC_(GdiDDCCISetVCPFeature, 0) //  0x1151 
SVC_(GdiDdAddAttachedSurface, 3) //  0x1152 
SVC_(GdiDdAlphaBlt, 3) //  0x1153 
SVC_(GdiDdAttachSurface, 2) //  0x1154 
SVC_(GdiDdBeginMoCompFrame, 2) //  0x1155 
SVC_(GdiDdCanCreateD3DBuffer, 2) //  0x1156 
SVC_(GdiDdColorControl, 2) //  0x1157 
SVC_(GdiDdCreateD3DBuffer, 8) //  0x1158 
SVC_(GdiDdCreateDirectDrawObject, 1) //  0x1159 
SVC_(GdiDdCreateMoComp, 2) //  0x115a 
SVC_(GdiDdDDICheckExclusiveOwnership, 0) //  0x115b 
SVC_(GdiDdDDICheckMonitorPowerState, 0) //  0x115c 
SVC_(GdiDdDDICheckOcclusion, 0) //  0x115d 
SVC_(GdiDdDDICloseAdapter, 0) //  0x115e 
SVC_(GdiDdDDICreateAllocation, 0) //  0x115f 
SVC_(GdiDdDDICreateContext, 0) //  0x1160 
SVC_(GdiDdDDICreateDCFromMemory, 0) //  0x1161 
SVC_(GdiDdDDICreateDevice, 0) //  0x1162 
SVC_(GdiDdDDICreateOverlay, 0) //  0x1163 
SVC_(GdiDdDDICreateSynchronizationObject, 0) //  0x1164 
SVC_(GdiDdDDIDestroyAllocation, 0) //  0x1165 
SVC_(GdiDdDDIDestroyContext, 0) //  0x1166 
SVC_(GdiDdDDIDestroyDCFromMemory, 0) //  0x1167 
SVC_(GdiDdDDIDestroyDevice, 0) //  0x1168 
SVC_(GdiDdDDIDestroyOverlay, 0) //  0x1169 
SVC_(GdiDdDDIDestroySynchronizationObject, 0) //  0x116a 
SVC_(GdiDdDDIEscape, 0) //  0x116b 
SVC_(GdiDdDDIFlipOverlay, 0) //  0x116c 
SVC_(GdiDdDDIGetContextSchedulingPriority, 0) //  0x116d 
SVC_(GdiDdDDIGetDeviceState, 0) //  0x116e 
SVC_(GdiDdDDIGetDisplayModeList, 0) //  0x116f 
SVC_(GdiDdDDIGetMultisampleMethodList, 0) //  0x1170 
SVC_(GdiDdDDIGetPresentHistory, 0) //  0x1171 
SVC_(GdiDdDDIGetProcessSchedulingPriorityClass, 0) //  0x1172 
SVC_(GdiDdDDIGetRuntimeData, 0) //  0x1173 
SVC_(GdiDdDDIGetScanLine, 0) //  0x1174 
SVC_(GdiDdDDIGetSharedPrimaryHandle, 0) //  0x1175 
SVC_(GdiDdDDIInvalidateActiveVidPn, 0) //  0x1176 
SVC_(GdiDdDDILock, 0) //  0x1177 
SVC_(GdiDdDDIOpenAdapterFromDeviceName, 0) //  0x1178 
SVC_(GdiDdDDIOpenAdapterFromHdc, 0) //  0x1179 
SVC_(GdiDdDDIOpenResource, 0) //  0x117a 
SVC_(GdiDdDDIPollDisplayChildren, 0) //  0x117b 
SVC_(GdiDdDDIPresent, 0) //  0x117c 
SVC_(GdiDdDDIQueryAdapterInfo, 0) //  0x117d 
SVC_(GdiDdDDIQueryAllocationResidency, 0) //  0x117e 
SVC_(GdiDdDDIQueryResourceInfo, 0) //  0x117f 
SVC_(GdiDdDDIQueryStatistics, 0) //  0x1180 
SVC_(GdiDdDDIReleaseProcessVidPnSourceOwners, 0) //  0x1181 
SVC_(GdiDdDDIRender, 0) //  0x1182 
SVC_(GdiDdDDISetAllocationPriority, 0) //  0x1183 
SVC_(GdiDdDDISetContextSchedulingPriority, 0) //  0x1184 
SVC_(GdiDdDDISetDisplayMode, 0) //  0x1185 
SVC_(GdiDdDDISetDisplayPrivateDriverFormat, 0) //  0x1186 
SVC_(GdiDdDDISetGammaRamp, 0) //  0x1187 
SVC_(GdiDdDDISetProcessSchedulingPriorityClass, 0) //  0x1188 
SVC_(GdiDdDDISetQueuedLimit, 0) //  0x1189 
SVC_(GdiDdDDISetVidPnSourceOwner, 0) //  0x118a 
SVC_(GdiDdDDISharedPrimaryLockNotification, 0) //  0x118b 
SVC_(GdiDdDDISharedPrimaryUnLockNotification, 0) //  0x118c 
SVC_(GdiDdDDISignalSynchronizationObject, 0) //  0x118d 
SVC_(GdiDdDDIUnlock, 0) //  0x118e 
SVC_(GdiDdDDIUpdateOverlay, 0) //  0x118f 
SVC_(GdiDdDDIWaitForIdle, 0) //  0x1190 
SVC_(GdiDdDDIWaitForSynchronizationObject, 0) //  0x1191 
SVC_(GdiDdDDIWaitForVerticalBlankEvent, 0) //  0x1192 
SVC_(GdiDdDeleteDirectDrawObject, 1) //  0x1193 
SVC_(GdiDdDestroyD3DBuffer, 1) //  0x1194 
SVC_(GdiDdDestroyMoComp, 2) //  0x1195 
SVC_(GdiDdEndMoCompFrame, 2) //  0x1196 
SVC_(GdiDdFlip, 5) //  0x1197 
SVC_(GdiDdFlipToGDISurface, 2) //  0x1198 
SVC_(GdiDdGetAvailDriverMemory, 2) //  0x1199 
SVC_(GdiDdGetBltStatus, 2) //  0x119a 
SVC_(GdiDdGetDC, 2) //  0x119b 
SVC_(GdiDdGetDriverInfo, 2) //  0x119c 
SVC_(GdiDdGetDriverState, 1) //  0x119d 
SVC_(GdiDdGetDxHandle, 3) //  0x119e 
SVC_(GdiDdGetFlipStatus, 2) //  0x119f 
SVC_(GdiDdGetInternalMoCompInfo, 2) //  0x11a0 
SVC_(GdiDdGetMoCompBuffInfo, 2) //  0x11a1 
SVC_(GdiDdGetMoCompFormats, 2) //  0x11a2 
SVC_(GdiDdGetMoCompGuids, 2) //  0x11a3 
SVC_(GdiDdGetScanLine, 2) //  0x11a4 
SVC_(GdiDdLock, 3) //  0x11a5 
SVC_(GdiDdQueryDirectDrawObject, 11) //  0x11a6 
SVC_(GdiDdQueryMoCompStatus, 2) //  0x11a7 
SVC_(GdiDdReenableDirectDrawObject, 2) //  0x11a8 
SVC_(GdiDdReleaseDC, 1) //  0x11a9 
SVC_(GdiDdRenderMoComp, 2) //  0x11aa 
SVC_(GdiDdSetColorKey, 2) //  0x11ab 
SVC_(GdiDdSetExclusiveMode, 2) //  0x11ac 
SVC_(GdiDdSetGammaRamp, 3) //  0x11ad 
SVC_(GdiDdSetOverlayPosition, 3) //  0x11ae 
SVC_(GdiDdUnattachSurface, 2) //  0x11af 
SVC_(GdiDdUnlock, 2) //  0x11b0 
SVC_(GdiDdUpdateOverlay, 3) //  0x11b1 
SVC_(GdiDdWaitForVerticalBlank, 2) //  0x11b2 
SVC_(GdiDeleteColorTransform, 2) //  0x11b3 
SVC_(GdiDescribePixelFormat, 4) //  0x11b4 
SVC_(GdiDestroyOPMProtectedOutput, 0) //  0x11b5 
SVC_(GdiDestroyPhysicalMonitor, 0) //  0x11b6 
SVC_(GdiDoBanding, 4) //  0x11b7 
SVC_(GdiDrawEscape, 4) //  0x11b8 
SVC_(GdiDvpAcquireNotification, 3) //  0x11b9 
SVC_(GdiDvpCanCreateVideoPort, 2) //  0x11ba 
SVC_(GdiDvpColorControl, 2) //  0x11bb 
SVC_(GdiDvpCreateVideoPort, 2) //  0x11bc 
SVC_(GdiDvpDestroyVideoPort, 2) //  0x11bd 
SVC_(GdiDvpFlipVideoPort, 4) //  0x11be 
SVC_(GdiDvpGetVideoPortBandwidth, 2) //  0x11bf 
SVC_(GdiDvpGetVideoPortConnectInfo, 2) //  0x11c0 
SVC_(GdiDvpGetVideoPortField, 2) //  0x11c1 
SVC_(GdiDvpGetVideoPortFlipStatus, 2) //  0x11c2 
SVC_(GdiDvpGetVideoPortInputFormats, 2) //  0x11c3 
SVC_(GdiDvpGetVideoPortLine, 2) //  0x11c4 
SVC_(GdiDvpGetVideoPortOutputFormats, 2) //  0x11c5 
SVC_(GdiDvpGetVideoSignalStatus, 2) //  0x11c6 
SVC_(GdiDvpReleaseNotification, 2) //  0x11c7 
SVC_(GdiDvpUpdateVideoPort, 4) //  0x11c8 
SVC_(GdiDvpWaitForVideoPortSync, 2) //  0x11c9 
SVC_(GdiDwmGetDirtyRgn, 0) //  0x11ca 
SVC_(GdiDwmGetSurfaceData, 0) //  0x11cb 
SVC_(GdiDxgGenericThunk, 6) //  0x11cc 
SVC_(GdiEllipse, 5) //  0x11cd 
SVC_(GdiEnableEudc, 1) //  0x11ce 
SVC_(GdiEndDoc, 1) //  0x11cf 
SVC_(GdiEndPage, 1) //  0x11d0 
SVC_(GdiEngAlphaBlend, 7) //  0x11d1 
SVC_(GdiEngAssociateSurface, 3) //  0x11d2 
SVC_(GdiEngBitBlt, 11) //  0x11d3 
SVC_(GdiEngCheckAbort, 1) //  0x11d4 
SVC_(GdiEngComputeGlyphSet, 3) //  0x11d5 
SVC_(GdiEngCopyBits, 6) //  0x11d6 
SVC_(GdiEngCreateBitmap, 6) //  0x11d7 
SVC_(GdiEngCreateClip, 0) //  0x11d8 
SVC_(GdiEngCreateDeviceBitmap, 4) //  0x11d9 
SVC_(GdiEngCreateDeviceSurface, 4) //  0x11da 
SVC_(GdiEngCreatePalette, 6) //  0x11db 
SVC_(GdiEngDeleteClip, 1) //  0x11dc 
SVC_(GdiEngDeletePalette, 1) //  0x11dd 
SVC_(GdiEngDeletePath, 1) //  0x11de 
SVC_(GdiEngDeleteSurface, 1) //  0x11df 
SVC_(GdiEngEraseSurface, 3) //  0x11e0 
SVC_(GdiEngFillPath, 7) //  0x11e1 
SVC_(GdiEngGradientFill, 10) //  0x11e2 
SVC_(GdiEngLineTo, 9) //  0x11e3 
SVC_(GdiEngLockSurface, 1) //  0x11e4 
SVC_(GdiEngMarkBandingSurface, 1) //  0x11e5 
SVC_(GdiEngPaint, 5) //  0x11e6 
SVC_(GdiEngPlgBlt, 11) //  0x11e7 
SVC_(GdiEngStretchBlt, 11) //  0x11e8 
SVC_(GdiEngStretchBltROP, 13) //  0x11e9 
SVC_(GdiEngStrokeAndFillPath, 10) //  0x11ea 
SVC_(GdiEngStrokePath, 8) //  0x11eb 
SVC_(GdiEngTextOut, 10) //  0x11ec 
SVC_(GdiEngTransparentBlt, 8) //  0x11ed 
SVC_(GdiEngUnlockSurface, 1) //  0x11ee 
SVC_(GdiEnumObjects, 4) //  0x11ef 
SVC_(GdiEudcLoadUnloadLink, 7) //  0x11f0 
SVC_(GdiExtFloodFill, 5) //  0x11f1 
SVC_(GdiFONTOBJ_cGetAllGlyphHandles, 2) //  0x11f2 
SVC_(GdiFONTOBJ_cGetGlyphs, 5) //  0x11f3 
SVC_(GdiFONTOBJ_pQueryGlyphAttrs, 2) //  0x11f4 
SVC_(GdiFONTOBJ_pfdg, 1) //  0x11f5 
SVC_(GdiFONTOBJ_pifi, 1) //  0x11f6 
SVC_(GdiFONTOBJ_pvTrueTypeFontFile, 2) //  0x11f7 
SVC_(GdiFONTOBJ_pxoGetXform, 1) //  0x11f8 
SVC_(GdiFONTOBJ_vGetInfo, 3) //  0x11f9 
SVC_(GdiFlattenPath, 1) //  0x11fa 
SVC_(GdiFontIsLinked, 1) //  0x11fb 
SVC_(GdiForceUFIMapping, 2) //  0x11fc 
SVC_(GdiFrameRgn, 5) //  0x11fd 
SVC_(GdiFullscreenControl, 5) //  0x11fe 
SVC_(GdiGetBoundsRect, 3) //  0x11ff 
SVC_(GdiGetCOPPCompatibleOPMInformation, 0) //  0x1200 
SVC_(GdiGetCertificate, 0) //  0x1201 
SVC_(GdiGetCertificateSize, 0) //  0x1202 
SVC_(GdiGetCharABCWidthsW, 6) //  0x1203 
SVC_(GdiGetCharacterPlacementW, 6) //  0x1204 
SVC_(GdiGetColorAdjustment, 2) //  0x1205 
SVC_(GdiGetColorSpaceforBitmap, 1) //  0x1206 
SVC_(GdiGetDeviceCaps, 2) //  0x1207 
SVC_(GdiGetDeviceCapsAll, 2) //  0x1208 
SVC_(GdiGetDeviceGammaRamp, 2) //  0x1209 
SVC_(GdiGetDeviceWidth, 1) //  0x120a 
SVC_(GdiGetDhpdev, 1) //  0x120b 
SVC_(GdiGetETM, 2) //  0x120c 
SVC_(GdiGetEmbUFI, 7) //  0x120d 
SVC_(GdiGetEmbedFonts, 0) //  0x120e 
SVC_(GdiGetEudcTimeStampEx, 3) //  0x120f 
SVC_(GdiGetFontResourceInfoInternalW, 7) //  0x1210 
SVC_(GdiGetFontUnicodeRanges, 2) //  0x1211 
SVC_(GdiGetGlyphIndicesW, 5) //  0x1212 
SVC_(GdiGetGlyphIndicesWInternal, 6) //  0x1213 
SVC_(GdiGetGlyphOutline, 8) //  0x1214 
SVC_(GdiGetKerningPairs, 3) //  0x1215 
SVC_(GdiGetLinkedUFIs, 3) //  0x1216 
SVC_(GdiGetMiterLimit, 2) //  0x1217 
SVC_(GdiGetMonitorID, 3) //  0x1218 
SVC_(GdiGetNumberOfPhysicalMonitors, 0) //  0x1219 
SVC_(GdiGetOPMInformation, 0) //  0x121a 
SVC_(GdiGetOPMRandomNumber, 0) //  0x121b 
SVC_(GdiGetObjectBitmapHandle, 2) //  0x121c 
SVC_(GdiGetPath, 4) //  0x121d 
SVC_(GdiGetPerBandInfo, 2) //  0x121e 
SVC_(GdiGetPhysicalMonitorDescription, 0) //  0x121f 
SVC_(GdiGetPhysicalMonitors, 0) //  0x1220 
SVC_(GdiGetRealizationInfo, 3) //  0x1221 
SVC_(GdiGetServerMetaFileBits, 7) //  0x1222 
SVC_(GdiGetSpoolMessage, 4) //  0x1223 
SVC_(GdiGetStats, 5) //  0x1224 
SVC_(GdiGetStringBitmapW, 5) //  0x1225 
SVC_(GdiGetSuggestedOPMProtectedOutputArraySize, 0) //  0x1226 
SVC_(GdiGetTextExtentExW, 8) //  0x1227 
SVC_(GdiGetUFI, 6) //  0x1228 
SVC_(GdiGetUFIPathname, 10) //  0x1229 
SVC_(GdiGradientFill, 6) //  0x122a 
SVC_(GdiHT_Get8BPPFormatPalette, 4) //  0x122b 
SVC_(GdiHT_Get8BPPMaskPalette, 6) //  0x122c 
SVC_(GdiIcmBrushInfo, 8) //  0x122d 
SVC_(GdiInit, 0) //  0x122e 
SVC_(GdiInitSpool, 0) //  0x122f 
SVC_(GdiMakeFontDir, 5) //  0x1230 
SVC_(GdiMakeInfoDC, 2) //  0x1231 
SVC_(GdiMakeObjectUnXferable, 0) //  0x1232 
SVC_(GdiMakeObjectXferable, 2) //  0x1233 
SVC_(GdiMirrorWindowOrg, 1) //  0x1234 
SVC_(GdiMonoBitmap, 1) //  0x1235 
SVC_(GdiMoveTo, 4) //  0x1236 
SVC_(GdiOffsetClipRgn, 3) //  0x1237 
SVC_(GdiPATHOBJ_bEnum, 2) //  0x1238 
SVC_(GdiPATHOBJ_bEnumClipLines, 3) //  0x1239 
SVC_(GdiPATHOBJ_vEnumStart, 1) //  0x123a 
SVC_(GdiPATHOBJ_vEnumStartClipLines, 4) //  0x123b 
SVC_(GdiPATHOBJ_vGetBounds, 2) //  0x123c 
SVC_(GdiPathToRegion, 1) //  0x123d 
SVC_(GdiPlgBlt, 11) //  0x123e 
SVC_(GdiPolyDraw, 4) //  0x123f 
SVC_(GdiPolyTextOutW, 4) //  0x1240 
SVC_(GdiPtInRegion, 3) //  0x1241 
SVC_(GdiPtVisible, 3) //  0x1242 
SVC_(GdiQueryFonts, 3) //  0x1243 
SVC_(GdiRemoveFontResourceW, 6) //  0x1244 
SVC_(GdiRemoveMergeFont, 2) //  0x1245 
SVC_(GdiResetDC, 5) //  0x1246 
SVC_(GdiResizePalette, 2) //  0x1247 
SVC_(GdiRoundRect, 7) //  0x1248 
SVC_(GdiSTROBJ_bEnum, 3) //  0x1249 
SVC_(GdiSTROBJ_bEnumPositionsOnly, 3) //  0x124a 
SVC_(GdiSTROBJ_bGetAdvanceWidths, 4) //  0x124b 
SVC_(GdiSTROBJ_dwGetCodePage, 1) //  0x124c 
SVC_(GdiSTROBJ_vEnumStart, 1) //  0x124d 
SVC_(GdiScaleViewportExtEx, 6) //  0x124e 
SVC_(GdiScaleWindowExtEx, 6) //  0x124f 
SVC_(GdiSelectBrush, 2) //  0x1250 
SVC_(GdiSelectClipPath, 2) //  0x1251 
SVC_(GdiSelectPen, 2) //  0x1252 
SVC_(GdiSetBitmapAttributes, 2) //  0x1253 
SVC_(GdiSetBrushAttributes, 2) //  0x1254 
SVC_(GdiSetColorAdjustment, 2) //  0x1255 
SVC_(GdiSetColorSpace, 2) //  0x1256 
SVC_(GdiSetDeviceGammaRamp, 2) //  0x1257 
SVC_(GdiSetFontXform, 3) //  0x1258 
SVC_(GdiSetIcmMode, 3) //  0x1259 
SVC_(GdiSetLinkedUFIs, 3) //  0x125a 
SVC_(GdiSetMagicColors, 3) //  0x125b 
SVC_(GdiSetOPMSigningKeyAndSequenceNumbers, 0) //  0x125c 
SVC_(GdiSetPUMPDOBJ, 4) //  0x125d 
SVC_(GdiSetPixelFormat, 2) //  0x125e 
SVC_(GdiSetRectRgn, 5) //  0x125f 
SVC_(GdiSetSizeDevice, 3) //  0x1260 
SVC_(GdiSetSystemPaletteUse, 2) //  0x1261 
SVC_(GdiSetTextJustification, 3) //  0x1262 
SVC_(GdiStartDoc, 4) //  0x1263 
SVC_(GdiStartPage, 1) //  0x1264 
SVC_(GdiStrokeAndFillPath, 1) //  0x1265 
SVC_(GdiStrokePath, 1) //  0x1266 
SVC_(GdiSwapBuffers, 1) //  0x1267 
SVC_(GdiTransparentBlt, 11) //  0x1268 
SVC_(GdiUMPDEngFreeUserMem, 1) //  0x1269 
SVC_(GdiUnloadPrinterDriver, 2) //  0x126a 
SVC_(GdiUnmapMemFont, 1) //  0x126b 
SVC_(GdiUpdateColors, 1) //  0x126c 
SVC_(GdiUpdateTransform, 1) //  0x126d 
SVC_(GdiWidenPath, 1) //  0x126e 
SVC_(GdiXFORMOBJ_bApplyXform, 5) //  0x126f 
SVC_(GdiXFORMOBJ_iGetXform, 2) //  0x1270 
SVC_(GdiXLATEOBJ_cGetPalette, 4) //  0x1271 
SVC_(GdiXLATEOBJ_hGetColorTransform, 1) //  0x1272 
SVC_(GdiXLATEOBJ_iXlate, 2) //  0x1273 
SVC_(UserAddClipboardFormatListener, 0) //  0x1274 
SVC_(UserAssociateInputContext, 3) //  0x1275 
SVC_(UserBlockInput, 1) //  0x1276 
SVC_(UserBuildHimcList, 4) //  0x1277 
SVC_(UserBuildPropList, 4) //  0x1278 
SVC_(UserCallHwndOpt, 2) //  0x1279 
SVC_(UserChangeDisplaySettings, 4) //  0x127a 
SVC_(UserCheckAccessForIntegrityLevel, 0) //  0x127b 
SVC_(UserCheckDesktopByThreadId, 0) //  0x127c 
SVC_(UserCheckWindowThreadDesktop, 0) //  0x127d 
SVC_(UserChildWindowFromPointEx, 4) //  0x127e 
SVC_(UserClipCursor, 1) //  0x127f 
SVC_(UserCreateDesktopEx, 0) //  0x1280 
SVC_(UserCreateInputContext, 1) //  0x1281 
SVC_(UserCreateWindowStation, 7) //  0x1282 
SVC_(UserCtxDisplayIOCtl, 3) //  0x1283 
SVC_(UserDestroyInputContext, 1) //  0x1284 
SVC_(UserDisableThreadIme, 1) //  0x1285 
SVC_(UserDoSoundConnect, 0) //  0x1286 
SVC_(UserDoSoundDisconnect, 0) //  0x1287 
SVC_(UserDragDetect, 3) //  0x1288 
SVC_(UserDragObject, 5) //  0x1289 
SVC_(UserDrawAnimatedRects, 4) //  0x128a 
SVC_(UserDrawCaption, 4) //  0x128b 
SVC_(UserDrawCaptionTemp, 7) //  0x128c 
SVC_(UserDrawMenuBarTemp, 5) //  0x128d 
SVC_(UserDwmGetDxRgn, 0) //  0x128e 
SVC_(UserDwmHintDxUpdate, 0) //  0x128f 
SVC_(UserDwmStartRedirection, 0) //  0x1290 
SVC_(UserDwmStopRedirection, 0) //  0x1291 
SVC_(UserEndMenu, 0) //  0x1292 
SVC_(UserEvent, 1) //  0x1293 
SVC_(UserFlashWindowEx, 1) //  0x1294 
SVC_(UserFrostCrashedWindow, 0) //  0x1295 
SVC_(UserGetAppImeLevel, 1) //  0x1296 
SVC_(UserGetCaretPos, 1) //  0x1297 
SVC_(UserGetClipCursor, 1) //  0x1298 
SVC_(UserGetClipboardViewer, 0) //  0x1299 
SVC_(UserGetComboBoxInfo, 2) //  0x129a 
SVC_(UserGetCursorInfo, 1) //  0x129b 
SVC_(UserGetGuiResources, 2) //  0x129c 
SVC_(UserGetImeHotKey, 4) //  0x129d 
SVC_(UserGetImeInfoEx, 2) //  0x129e 
SVC_(UserGetInternalWindowPos, 3) //  0x129f 
SVC_(UserGetKeyNameText, 3) //  0x12a0 
SVC_(UserGetKeyboardLayoutName, 1) //  0x12a1 
SVC_(UserGetLayeredWindowAttributes, 4) //  0x12a2 
SVC_(UserGetListBoxInfo, 1) //  0x12a3 
SVC_(UserGetMenuIndex, 2) //  0x12a4 
SVC_(UserGetMenuItemRect, 4) //  0x12a5 
SVC_(UserGetMouseMovePointsEx, 5) //  0x12a6 
SVC_(UserGetPriorityClipboardFormat, 2) //  0x12a7 
SVC_(UserGetRawInputBuffer, 3) //  0x12a8 
SVC_(UserGetRawInputData, 5) //  0x12a9 
SVC_(UserGetRawInputDeviceInfo, 4) //  0x12aa 
SVC_(UserGetRawInputDeviceList, 3) //  0x12ab 
SVC_(UserGetRegisteredRawInputDevices, 3) //  0x12ac 
SVC_(UserGetUpdatedClipboardFormats, 0) //  0x12ad 
SVC_(UserGetWOWClass, 2) //  0x12ae 
SVC_(UserGetWindowMinimizeRect, 0) //  0x12af 
SVC_(UserGetWindowRgnEx, 0) //  0x12b0 
SVC_(UserGhostWindowFromHungWindow, 0) //  0x12b1 
SVC_(UserHardErrorControl, 3) //  0x12b2 
SVC_(UserHiliteMenuItem, 4) //  0x12b3 
SVC_(UserHungWindowFromGhostWindow, 0) //  0x12b4 
SVC_(UserImpersonateDdeClientWindow, 2) //  0x12b5 
SVC_(UserInitTask, 12) //  0x12b6 
SVC_(UserInitialize, 3) //  0x12b7 
SVC_(UserInitializeClientPfnArrays, 4) //  0x12b8 
SVC_(UserInternalGetWindowIcon, 0) //  0x12b9 
SVC_(UserLoadKeyboardLayoutEx, 7) //  0x12ba 
SVC_(UserLockWindowStation, 1) //  0x12bb 
SVC_(UserLockWorkStation, 0) //  0x12bc 
SVC_(UserLogicalToPhysicalPoint, 0) //  0x12bd 
SVC_(UserMNDragLeave, 0) //  0x12be 
SVC_(UserMNDragOver, 2) //  0x12bf 
SVC_(UserMenuItemFromPoint, 4) //  0x12c0 
SVC_(UserMinMaximize, 3) //  0x12c1 
SVC_(UserNotifyIMEStatus, 3) //  0x12c2 
SVC_(UserOpenInputDesktop, 3) //  0x12c3 
SVC_(UserOpenThreadDesktop, 0) //  0x12c4 
SVC_(UserPaintMonitor, 0) //  0x12c5 
SVC_(UserPhysicalToLogicalPoint, 0) //  0x12c6 
SVC_(UserPrintWindow, 3) //  0x12c7 
SVC_(UserQueryInformationThread, 4) //  0x12c8 
SVC_(UserQueryInputContext, 2) //  0x12c9 
SVC_(UserQuerySendMessage, 1) //  0x12ca 
SVC_(UserRealChildWindowFromPoint, 3) //  0x12cb 
SVC_(UserRealWaitMessageEx, 2) //  0x12cc 
SVC_(UserRegisterErrorReportingDialog, 0) //  0x12cd 
SVC_(UserRegisterHotKey, 4) //  0x12ce 
SVC_(UserRegisterRawInputDevices, 3) //  0x12cf 
SVC_(UserRegisterSessionPort, 0) //  0x12d0 
SVC_(UserRegisterTasklist, 1) //  0x12d1 
SVC_(UserRegisterUserApiHook, 4) //  0x12d2 
SVC_(UserRemoteConnect, 3) //  0x12d3 
SVC_(UserRemoteRedrawRectangle, 4) //  0x12d4 
SVC_(UserRemoteRedrawScreen, 0) //  0x12d5 
SVC_(UserRemoteStopScreenUpdates, 0) //  0x12d6 
SVC_(UserRemoveClipboardFormatListener, 0) //  0x12d7 
SVC_(UserResolveDesktopForWOW, 1) //  0x12d8 
SVC_(UserSetAppImeLevel, 2) //  0x12d9 
SVC_(UserSetClassWord, 3) //  0x12da 
SVC_(UserSetCursorContents, 2) //  0x12db 
SVC_(UserSetImeHotKey, 5) //  0x12dc 
SVC_(UserSetImeInfoEx, 1) //  0x12dd 
SVC_(UserSetImeOwnerWindow, 2) //  0x12de 
SVC_(UserSetInternalWindowPos, 4) //  0x12df 
SVC_(UserSetLayeredWindowAttributes, 4) //  0x12e0 
SVC_(UserSetMenu, 3) //  0x12e1 
SVC_(UserSetMenuContextHelpId, 2) //  0x12e2 
SVC_(UserSetMenuFlagRtoL, 1) //  0x12e3 
SVC_(UserSetMirrorRendering, 0) //  0x12e4 
SVC_(UserSetObjectInformation, 4) //  0x12e5 
SVC_(UserSetProcessDPIAware, 0) //  0x12e6 
SVC_(UserSetShellWindowEx, 2) //  0x12e7 
SVC_(UserSetSysColors, 4) //  0x12e8 
SVC_(UserSetSystemCursor, 2) //  0x12e9 
SVC_(UserSetSystemTimer, 4) //  0x12ea 
SVC_(UserSetThreadLayoutHandles, 2) //  0x12eb 
SVC_(UserSetWindowRgnEx, 0) //  0x12ec 
SVC_(UserSetWindowStationUser, 4) //  0x12ed 
SVC_(UserShowSystemCursor, 0) //  0x12ee 
SVC_(UserSoundSentry, 0) //  0x12ef 
SVC_(UserSwitchDesktop, 1) //  0x12f0 
SVC_(UserTestForInteractiveUser, 1) //  0x12f1 
SVC_(UserTrackPopupMenuEx, 6) //  0x12f2 
SVC_(UserUnloadKeyboardLayout, 1) //  0x12f3 
SVC_(UserUnlockWindowStation, 1) //  0x12f4 
SVC_(UserUnregisterHotKey, 2) //  0x12f5 
SVC_(UserUnregisterSessionPort, 0) //  0x12f6 
SVC_(UserUnregisterUserApiHook, 0) //  0x12f7 
SVC_(UserUpdateInputContext, 3) //  0x12f8 
SVC_(UserUpdateInstance, 3) //  0x12f9 
SVC_(UserUpdateLayeredWindow, 10) //  0x12fa 
SVC_(UserUpdatePerUserSystemParameters, 2) //  0x12fb 
SVC_(UserUpdateWindowTransform, 0) //  0x12fc 
SVC_(UserUserHandleGrantAccess, 3) //  0x12fd 
SVC_(UserValidateHandleSecure, 1) //  0x12fe 
SVC_(UserWaitForInputIdle, 3) //  0x12ff 
SVC_(UserWaitForMsgAndEvent, 1) //  0x1300 
SVC_(UserWin32PoolAllocationStats, 0) //  0x1301 
SVC_(UserWindowFromPhysicalPoint, 0) //  0x1302 
SVC_(UserYieldTask, 0) //  0x1303 
SVC_(UserSetClassLongPtr, 0) //  0x1304 
SVC_(UserSetWindowLongPtr, 0) //  0x1305 

File diff suppressed because it is too large Load Diff

View File

@ -6,23 +6,31 @@
@ stdcall NtGdiAbortDoc(ptr)
@ stdcall NtGdiAbortPath(ptr)
@ stdcall NtGdiAddEmbFontToDC(ptr ptr)
@ stdcall NtGdiAddFontMemResourceEx(ptr long ptr long ptr)
@ stdcall NtGdiAddFontResourceW(wstr long long long long ptr)
@ stdcall NtGdiAddRemoteFontToDC(ptr ptr long ptr)
@ stdcall NtGdiAddFontMemResourceEx(ptr long ptr long ptr)
@ stdcall NtGdiRemoveMergeFont(ptr ptr)
@ stdcall NtGdiAddRemoteMMInstanceToDC(ptr ptr long)
@ stdcall NtGdiAlphaBlend(ptr long long long long ptr long long long long long ptr)
@ stdcall NtGdiAngleArc(ptr long long long long long)
@ stdcall NtGdiAnyLinkedFonts()
@ stdcall NtGdiFontIsLinked(ptr)
@ stdcall NtGdiArcInternal(long ptr long long long long long long long long)
@ stdcall NtGdiBeginPath(ptr)
@ stdcall NtGdiBitBlt(ptr long long long long ptr long long long long long)
@ stdcall NtGdiBRUSHOBJ_DeleteRbrush(ptr ptr)
@ stdcall NtGdiBRUSHOBJ_hGetColorTransform(ptr)
@ stdcall NtGdiBRUSHOBJ_pvAllocRbrush(ptr long)
@ stdcall NtGdiBRUSHOBJ_pvGetRbrush(ptr)
@ stdcall NtGdiBRUSHOBJ_ulGetBrushColor(ptr)
@ stdcall NtGdiCancelDC(ptr)
@ stdcall NtGdiChangeGhostFont(ptr long)
@ stdcall NtGdiCheckBitmapBits(ptr ptr ptr long long long long ptr)
@ stdcall NtGdiCloseFigure(ptr)
@ stdcall NtGdiClearBitmapAttributes(ptr long)
@ stdcall NtGdiClearBrushAttributes(ptr long)
@ stdcall NtGdiCLIPOBJ_bEnum(ptr long long)
@ stdcall NtGdiCLIPOBJ_cEnumStart(ptr long long long long)
@ stdcall NtGdiCLIPOBJ_ppoGetPath(ptr)
@ stdcall NtGdiCloseFigure(ptr)
@ stdcall NtGdiColorCorrectPalette(ptr ptr long long ptr long)
@ stdcall NtGdiCombineRgn(ptr ptr ptr long)
@ stdcall NtGdiCombineTransform(ptr ptr ptr)
@ -54,27 +62,89 @@
@ stdcall NtGdiD3dContextCreate(ptr ptr ptr ptr)
@ stdcall NtGdiD3dContextDestroy(ptr)
@ stdcall NtGdiD3dContextDestroyAll(ptr)
@ stdcall NtGdiD3dValidateTextureStageState(ptr)
@ stdcall NtGdiD3dDrawPrimitives2(ptr ptr ptr ptr ptr ptr ptr)
@ stdcall NtGdiDdGetDriverState(ptr)
@ stdcall NtGdiD3dValidateTextureStageState(ptr)
@ stdcall NtGdiDdAddAttachedSurface(ptr ptr ptr)
@ stdcall NtGdiDdAlphaBlt(ptr ptr ptr)
@ stdcall NtGdiDdAttachSurface(ptr ptr)
@ stdcall NtGdiDdBeginMoCompFrame(ptr ptr)
@ stdcall NtGdiDdBlt(ptr ptr ptr)
@ stdcall NtGdiDdCanCreateSurface(ptr ptr)
@ stdcall NtGdiDdCanCreateD3DBuffer(ptr ptr)
@ stdcall NtGdiDdCanCreateSurface(ptr ptr)
@ stdcall NtGdiDDCCIGetCapabilitiesString(ptr ptr long)
@ stdcall NtGdiDDCCIGetCapabilitiesStringLength(ptr ptr)
@ stdcall NtGdiDDCCIGetTimingReport(ptr ptr)
@ stdcall NtGdiDDCCIGetVCPFeature(ptr long ptr ptr ptr)
@ stdcall NtGdiDDCCISaveCurrentSettings(ptr)
@ stdcall NtGdiDDCCISetVCPFeature(ptr long long)
@ stdcall NtGdiDdColorControl(ptr ptr)
@ stdcall NtGdiDdCreateDirectDrawObject(ptr)
@ stdcall NtGdiDdCreateSurface(ptr ptr ptr ptr ptr ptr ptr ptr)
@ stdcall NtGdiDdCreateD3DBuffer(ptr ptr ptr ptr ptr ptr ptr ptr)
@ stdcall NtGdiDdCreateDirectDrawObject(ptr)
@ stdcall NtGdiDdCreateMoComp(ptr ptr)
@ stdcall NtGdiDdCreateSurface(ptr ptr ptr ptr ptr ptr ptr ptr)
@ stdcall NtGdiDdCreateSurfaceEx(ptr ptr long)
@ stdcall NtGdiDdCreateSurfaceObject(ptr ptr ptr ptr ptr long)
@ stdcall NtGdiDdDDICheckExclusiveOwnership()
@ stdcall NtGdiDdDDICheckMonitorPowerState(ptr)
@ stdcall NtGdiDdDDICheckOcclusion(ptr)
@ stdcall NtGdiDdDDICloseAdapter(ptr)
@ stdcall NtGdiDdDDICreateAllocation(ptr)
@ stdcall NtGdiDdDDICreateContext(ptr)
@ stdcall NtGdiDdDDICreateDCFromMemory(ptr)
@ stdcall NtGdiDdDDICreateDevice(ptr)
@ stdcall NtGdiDdDDICreateOverlay(ptr)
@ stdcall NtGdiDdDDICreateSynchronizationObject(ptr)
@ stdcall NtGdiDdDDIDestroyAllocation(ptr)
@ stdcall NtGdiDdDDIDestroyContext(ptr)
@ stdcall NtGdiDdDDIDestroyDCFromMemory(ptr)
@ stdcall NtGdiDdDDIDestroyDevice(ptr)
@ stdcall NtGdiDdDDIDestroyOverlay(ptr)
@ stdcall NtGdiDdDDIDestroySynchronizationObject(ptr)
@ stdcall NtGdiDdDDIEscape(ptr)
@ stdcall NtGdiDdDDIFlipOverlay(ptr)
@ stdcall NtGdiDdDDIGetContextSchedulingPriority(ptr)
@ stdcall NtGdiDdDDIGetDeviceState(ptr)
@ stdcall NtGdiDdDDIGetDisplayModeList(ptr)
@ stdcall NtGdiDdDDIGetMultisampleMethodList(ptr)
@ stdcall NtGdiDdDDIGetPresentHistory(ptr)
@ stdcall NtGdiDdDDIGetProcessSchedulingPriorityClass(ptr ptr)
@ stdcall NtGdiDdDDIGetRuntimeData(ptr)
@ stdcall NtGdiDdDDIGetScanLine(ptr)
@ stdcall NtGdiDdDDIGetSharedPrimaryHandle(ptr)
@ stdcall NtGdiDdDDIInvalidateActiveVidPn(ptr)
@ stdcall NtGdiDdDDILock(ptr)
@ stdcall NtGdiDdDDIOpenAdapterFromDeviceName(ptr)
@ stdcall NtGdiDdDDIOpenAdapterFromHdc(ptr)
@ stdcall NtGdiDdDDIOpenResource(ptr)
@ stdcall NtGdiDdDDIPollDisplayChildren(ptr)
@ stdcall NtGdiDdDDIPresent(ptr)
@ stdcall NtGdiDdDDIQueryAdapterInfo(ptr)
@ stdcall NtGdiDdDDIQueryAllocationResidency(ptr)
@ stdcall NtGdiDdDDIQueryResourceInfo(ptr)
@ stdcall NtGdiDdDDIQueryStatistics(ptr)
@ stdcall NtGdiDdDDIReleaseProcessVidPnSourceOwners(ptr)
@ stdcall NtGdiDdDDIRender(ptr)
@ stdcall NtGdiDdDDISetAllocationPriority(ptr)
@ stdcall NtGdiDdDDISetContextSchedulingPriority(ptr)
@ stdcall NtGdiDdDDISetDisplayMode(ptr)
@ stdcall NtGdiDdDDISetDisplayPrivateDriverFormat(ptr)
@ stdcall NtGdiDdDDISetGammaRamp(ptr)
@ stdcall NtGdiDdDDISetProcessSchedulingPriorityClass(ptr long)
@ stdcall NtGdiDdDDISetQueuedLimit(ptr)
@ stdcall NtGdiDdDDISetVidPnSourceOwner(ptr)
@ stdcall NtGdiDdDDISharedPrimaryLockNotification(ptr)
@ stdcall NtGdiDdDDISharedPrimaryUnLockNotification(ptr)
@ stdcall NtGdiDdDDISignalSynchronizationObject(ptr)
@ stdcall NtGdiDdDDIUnlock(ptr)
@ stdcall NtGdiDdDDIUpdateOverlay(ptr)
@ stdcall NtGdiDdDDIWaitForIdle(ptr)
@ stdcall NtGdiDdDDIWaitForSynchronizationObject(ptr)
@ stdcall NtGdiDdDDIWaitForVerticalBlankEvent(ptr)
@ stdcall NtGdiDdDeleteDirectDrawObject(ptr)
@ stdcall NtGdiDdDeleteSurfaceObject(ptr)
@ stdcall NtGdiDdDestroyD3DBuffer(ptr)
@ stdcall NtGdiDdDestroyMoComp(ptr ptr)
@ stdcall NtGdiDdDestroySurface(ptr long)
@ stdcall NtGdiDdDestroyD3DBuffer(ptr)
@ stdcall NtGdiDdEndMoCompFrame(ptr ptr)
@ stdcall NtGdiDdFlip(ptr ptr ptr ptr ptr)
@ stdcall NtGdiDdFlipToGDISurface(ptr ptr)
@ -82,12 +152,13 @@
@ stdcall NtGdiDdGetBltStatus(ptr ptr)
@ stdcall NtGdiDdGetDC(ptr ptr)
@ stdcall NtGdiDdGetDriverInfo(ptr ptr)
@ stdcall NtGdiDdGetDriverState(ptr)
@ stdcall NtGdiDdGetDxHandle(ptr ptr long)
@ stdcall NtGdiDdGetFlipStatus(ptr ptr)
@ stdcall NtGdiDdGetInternalMoCompInfo(ptr ptr)
@ stdcall NtGdiDdGetMoCompBuffInfo(ptr ptr)
@ stdcall NtGdiDdGetMoCompGuids(ptr ptr)
@ stdcall NtGdiDdGetMoCompFormats(ptr ptr)
@ stdcall NtGdiDdGetMoCompGuids(ptr ptr)
@ stdcall NtGdiDdGetScanLine(ptr ptr)
@ stdcall NtGdiDdLock(ptr ptr ptr)
@ stdcall NtGdiDdLockD3D(ptr ptr)
@ -100,46 +171,78 @@
@ stdcall NtGdiDdSetColorKey(ptr ptr)
@ stdcall NtGdiDdSetExclusiveMode(ptr ptr)
@ stdcall NtGdiDdSetGammaRamp(ptr ptr ptr)
@ stdcall NtGdiDdCreateSurfaceEx(ptr ptr long)
@ stdcall NtGdiDdSetOverlayPosition(ptr ptr ptr)
@ stdcall NtGdiDdUnattachSurface(ptr ptr)
@ stdcall NtGdiDdUnlock(ptr ptr)
@ stdcall NtGdiDdUnlockD3D(ptr ptr)
@ stdcall NtGdiDdUpdateOverlay(ptr ptr ptr)
@ stdcall NtGdiDdWaitForVerticalBlank(ptr ptr)
@ stdcall NtGdiDvpCanCreateVideoPort(ptr ptr)
@ stdcall NtGdiDvpColorControl(ptr ptr)
@ stdcall NtGdiDvpCreateVideoPort(ptr ptr)
@ stdcall NtGdiDvpDestroyVideoPort(ptr ptr)
@ stdcall NtGdiDvpFlipVideoPort(ptr ptr ptr ptr)
@ stdcall NtGdiDvpGetVideoPortBandwidth(ptr ptr)
@ stdcall NtGdiDvpGetVideoPortField(ptr ptr)
@ stdcall NtGdiDvpGetVideoPortFlipStatus(ptr ptr)
@ stdcall NtGdiDvpGetVideoPortInputFormats(ptr ptr)
@ stdcall NtGdiDvpGetVideoPortLine(ptr ptr)
@ stdcall NtGdiDvpGetVideoPortOutputFormats(ptr ptr)
@ stdcall NtGdiDvpGetVideoPortConnectInfo(ptr ptr)
@ stdcall NtGdiDvpGetVideoSignalStatus(ptr ptr)
@ stdcall NtGdiDvpUpdateVideoPort(ptr ptr ptr ptr)
@ stdcall NtGdiDvpWaitForVideoPortSync(ptr ptr)
@ stdcall NtGdiDvpAcquireNotification(ptr ptr ptr)
@ stdcall NtGdiDvpReleaseNotification(ptr ptr)
@ stdcall NtGdiDxgGenericThunk(ptr ptr ptr ptr ptr ptr)
@ stdcall NtGdiDeleteClientObj(ptr)
@ stdcall NtGdiDeleteColorSpace(ptr)
@ stdcall NtGdiDeleteColorTransform(ptr ptr)
@ stdcall NtGdiDeleteObjectApp(ptr)
@ stdcall NtGdiDescribePixelFormat(ptr long long ptr)
@ stdcall NtGdiDestroyOPMProtectedOutput(ptr)
@ stdcall NtGdiGetPerBandInfo(ptr ptr)
@ stdcall NtGdiDestroyPhysicalMonitor(ptr)
@ stdcall NtGdiDoBanding(ptr long ptr ptr)
@ stdcall NtGdiDoPalette(ptr long long ptr long long)
@ stdcall NtGdiDrawEscape(ptr long long ptr)
@ stdcall NtGdiDrawStream(ptr long ptr)
@ stdcall NtGdiDvpAcquireNotification(ptr ptr ptr)
@ stdcall NtGdiDvpCanCreateVideoPort(ptr ptr)
@ stdcall NtGdiDvpColorControl(ptr ptr)
@ stdcall NtGdiDvpCreateVideoPort(ptr ptr)
@ stdcall NtGdiDvpDestroyVideoPort(ptr ptr)
@ stdcall NtGdiDvpFlipVideoPort(ptr ptr ptr ptr)
@ stdcall NtGdiDvpGetVideoPortBandwidth(ptr ptr)
@ stdcall NtGdiDvpGetVideoPortConnectInfo(ptr ptr)
@ stdcall NtGdiDvpGetVideoPortField(ptr ptr)
@ stdcall NtGdiDvpGetVideoPortFlipStatus(ptr ptr)
@ stdcall NtGdiDvpGetVideoPortInputFormats(ptr ptr)
@ stdcall NtGdiDvpGetVideoPortLine(ptr ptr)
@ stdcall NtGdiDvpGetVideoPortOutputFormats(ptr ptr)
@ stdcall NtGdiDvpGetVideoSignalStatus(ptr ptr)
@ stdcall NtGdiDvpReleaseNotification(ptr ptr)
@ stdcall NtGdiDvpUpdateVideoPort(ptr ptr ptr ptr)
@ stdcall NtGdiDvpWaitForVideoPortSync(ptr ptr)
@ stdcall NtGdiDwmGetDirtyRgn(long long long long long)
@ stdcall NtGdiDwmGetSurfaceData(long long)
@ stdcall NtGdiDxgGenericThunk(ptr ptr ptr ptr ptr ptr)
@ stdcall NtGdiEllipse(ptr long long long long)
@ stdcall NtGdiEnableEudc(long)
@ stdcall NtGdiEndDoc(ptr)
@ stdcall NtGdiEndPage(ptr)
@ stdcall NtGdiEndPath(ptr)
@ stdcall NtGdiEngAlphaBlend(ptr ptr ptr ptr ptr ptr ptr)
@ stdcall NtGdiEngAssociateSurface(ptr ptr long)
@ stdcall NtGdiEngBitBlt(ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr)
@ stdcall NtGdiEngCheckAbort(ptr)
@ stdcall NtGdiEngComputeGlyphSet(ptr ptr ptr)
@ stdcall NtGdiEngCopyBits(ptr ptr ptr ptr ptr ptr)
@ stdcall NtGdiEngCreateBitmap(long long long long long ptr)
@ stdcall NtGdiEngCreateClip()
@ stdcall NtGdiEngCreateDeviceBitmap(ptr long long long)
@ stdcall NtGdiEngCreateDeviceSurface(ptr long long long)
@ stdcall NtGdiEngCreatePalette(long long ptr long long long)
@ stdcall NtGdiEngDeleteClip(ptr)
@ stdcall NtGdiEngDeletePalette(ptr)
@ stdcall NtGdiEngDeletePath(ptr)
@ stdcall NtGdiEngDeleteSurface(ptr)
@ stdcall NtGdiEngEraseSurface(ptr ptr long)
@ stdcall NtGdiEngFillPath(ptr ptr ptr ptr ptr ptr ptr)
@ stdcall NtGdiEngGradientFill(ptr ptr ptr ptr long ptr long ptr ptr long)
@ stdcall NtGdiEngLineTo(ptr ptr ptr long long long long ptr ptr)
@ stdcall NtGdiEngLockSurface(ptr)
@ stdcall NtGdiEngMarkBandingSurface(ptr)
@ stdcall NtGdiEngPaint(ptr ptr ptr ptr ptr)
@ stdcall NtGdiEngPlgBlt(ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr long)
@ stdcall NtGdiEngStretchBlt(ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr long)
@ stdcall NtGdiEngStretchBltROP(ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr long ptr long)
@ stdcall NtGdiEngStrokeAndFillPath(ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr)
@ stdcall NtGdiEngStrokePath(ptr ptr ptr ptr ptr ptr ptr ptr)
@ stdcall NtGdiEngTextOut(ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr)
@ stdcall NtGdiEngTransparentBlt(ptr ptr ptr ptr ptr ptr long long)
@ stdcall NtGdiEngUnlockSurface(ptr)
@ stdcall NtGdiEnumFontChunk(ptr ptr long ptr ptr)
@ stdcall NtGdiEnumFontClose(ptr)
@ stdcall NtGdiEnumFontOpen(ptr long long long wstr long ptr)
@ -158,6 +261,15 @@
@ stdcall NtGdiFillRgn(ptr ptr ptr)
@ stdcall NtGdiFlattenPath(ptr)
@ stdcall NtGdiFlush()
@ stdcall NtGdiFontIsLinked(ptr)
@ stdcall NtGdiFONTOBJ_cGetAllGlyphHandles(ptr ptr)
@ stdcall NtGdiFONTOBJ_cGetGlyphs(ptr long long ptr ptr)
@ stdcall NtGdiFONTOBJ_pfdg(ptr)
@ stdcall NtGdiFONTOBJ_pifi(ptr)
@ stdcall NtGdiFONTOBJ_pQueryGlyphAttrs(ptr long)
@ stdcall NtGdiFONTOBJ_pvTrueTypeFontFile(ptr ptr)
@ stdcall NtGdiFONTOBJ_pxoGetXform(ptr)
@ stdcall NtGdiFONTOBJ_vGetInfo(ptr long ptr)
@ stdcall NtGdiForceUFIMapping(ptr ptr)
@ stdcall NtGdiFrameRgn(ptr ptr ptr long long)
@ stdcall NtGdiFullscreenControl(long ptr long ptr ptr)
@ -171,8 +283,8 @@
@ stdcall NtGdiGetCharABCWidthsW(ptr long long ptr long ptr)
@ stdcall NtGdiGetCharacterPlacementW(ptr wstr long long ptr long)
@ stdcall NtGdiGetCharSet(ptr)
@ stdcall NtGdiGetCharWidthW(ptr long long ptr long ptr)
@ stdcall NtGdiGetCharWidthInfo(ptr ptr)
@ stdcall NtGdiGetCharWidthW(ptr long long ptr long ptr)
@ stdcall NtGdiGetColorAdjustment(ptr ptr)
@ stdcall NtGdiGetColorSpaceforBitmap(ptr)
@ stdcall NtGdiGetCOPPCompatibleOPMInformation(ptr ptr ptr)
@ -181,27 +293,36 @@
@ stdcall NtGdiGetDCObject(ptr long)
@ stdcall NtGdiGetDCPoint(ptr long ptr)
@ stdcall NtGdiGetDeviceCaps(ptr long)
@ stdcall NtGdiGetDeviceGammaRamp(ptr ptr)
@ stdcall NtGdiGetDeviceCapsAll(ptr ptr)
@ stdcall NtGdiGetDeviceGammaRamp(ptr ptr)
@ stdcall NtGdiGetDeviceWidth(ptr)
@ stdcall NtGdiGetDhpdev(ptr)
@ stdcall NtGdiGetDIBitsInternal(ptr ptr long long ptr ptr long long long)
@ stdcall NtGdiGetEmbedFonts()
@ stdcall NtGdiGetEmbUFI(ptr ptr ptr ptr ptr ptr ptr)
@ stdcall NtGdiGetETM(ptr ptr)
@ stdcall NtGdiGetEudcTimeStampEx(wstr long long)
@ stdcall NtGdiGetFontData(ptr long long ptr long)
@ stdcall NtGdiGetFontResourceInfoInternalW(wstr long long long ptr ptr long)
@ stdcall NtGdiGetFontUnicodeRanges(ptr ptr)
@ stdcall NtGdiGetGlyphIndicesW(ptr wstr long ptr long)
@ stdcall NtGdiGetGlyphIndicesWInternal(ptr wstr long ptr long long)
@ stdcall NtGdiGetGlyphOutline(ptr long long ptr long ptr ptr long)
@ stdcall NtGdiGetOPMInformation(ptr ptr ptr)
@ stdcall NtGdiGetKerningPairs(ptr long ptr)
@ stdcall NtGdiGetLinkedUFIs(ptr ptr long)
@ stdcall NtGdiGetMiterLimit(ptr ptr)
@ stdcall NtGdiGetMonitorID(ptr long ptr)
@ stdcall NtGdiGetNearestColor(ptr ptr)
@ stdcall NtGdiGetNearestPaletteIndex(ptr ptr)
@ stdcall NtGdiGetNumberOfPhysicalMonitors(ptr ptr)
@ stdcall NtGdiGetObjectBitmapHandle(ptr ptr)
@ stdcall NtGdiGetOPMInformation(ptr ptr ptr)
@ stdcall NtGdiGetOPMRandomNumber(ptr ptr)
@ stdcall NtGdiGetOutlineTextMetricsInternalW(ptr long ptr ptr)
@ stdcall NtGdiGetPath(ptr ptr ptr long)
@ stdcall NtGdiGetPerBandInfo(ptr ptr)
@ stdcall NtGdiGetPhysicalMonitorDescription(ptr long ptr)
@ stdcall NtGdiGetPhysicalMonitors(ptr long ptr ptr)
@ stdcall NtGdiGetPixel(ptr long long)
@ stdcall NtGdiGetRandomRgn(ptr ptr long)
@ stdcall NtGdiGetRasterizerCaps(ptr long)
@ -222,15 +343,12 @@
@ stdcall NtGdiGetTextMetricsW(ptr ptr long)
@ stdcall NtGdiGetTransform(ptr long ptr)
@ stdcall NtGdiGetUFI(ptr ptr ptr ptr ptr ptr)
@ stdcall NtGdiGetEmbUFI(ptr ptr ptr ptr ptr ptr ptr)
@ stdcall NtGdiGetUFIPathname(ptr ptr wstr ptr long ptr ptr ptr ptr ptr)
@ stdcall NtGdiGetEmbedFonts()
@ stdcall NtGdiChangeGhostFont(ptr long)
@ stdcall NtGdiAddEmbFontToDC(ptr ptr)
@ stdcall NtGdiGetFontUnicodeRanges(ptr ptr)
@ stdcall NtGdiGetWidthTable(ptr long ptr long ptr ptr ptr)
@ stdcall NtGdiGradientFill(ptr ptr long ptr long long)
@ stdcall NtGdiHfontCreate(ptr long long long ptr)
@ stdcall NtGdiHT_Get8BPPFormatPalette(ptr long long long)
@ stdcall NtGdiHT_Get8BPPMaskPalette(ptr long long long long long)
@ stdcall NtGdiIcmBrushInfo(ptr ptr ptr ptr ptr ptr ptr long)
@ stdcall NtGdiInit()
@ stdcall NtGdiInitSpool()
@ -239,29 +357,38 @@
@ stdcall NtGdiLineTo(ptr long long)
@ stdcall NtGdiMakeFontDir(long ptr long wstr long)
@ stdcall NtGdiMakeInfoDC(ptr long)
@ stdcall NtGdiMakeObjectUnXferable(ptr)
@ stdcall NtGdiMakeObjectXferable(ptr long)
@ stdcall NtGdiMaskBlt(ptr long long long long ptr long long ptr long long long long)
@ stdcall NtGdiMirrorWindowOrg(ptr)
@ stdcall NtGdiModifyWorldTransform(ptr ptr long)
@ stdcall NtGdiMonoBitmap(ptr)
@ stdcall NtGdiMoveTo(ptr long long ptr)
@ stdcall NtGdiOffsetClipRgn(ptr long long)
@ stdcall NtGdiOffsetRgn(ptr long long)
@ stdcall NtGdiOpenDCW(ptr ptr ptr long long ptr ptr ptr)
@ stdcall NtGdiOpenDCW(ptr ptr ptr long long ptr ptr)
@ stdcall NtGdiPatBlt(ptr long long long long long)
@ stdcall NtGdiPolyPatBlt(ptr long ptr long long)
@ stdcall NtGdiPATHOBJ_bEnum(ptr ptr)
@ stdcall NtGdiPATHOBJ_bEnumClipLines(ptr long ptr)
@ stdcall NtGdiPATHOBJ_vEnumStart(ptr)
@ stdcall NtGdiPATHOBJ_vEnumStartClipLines(ptr ptr ptr ptr)
@ stdcall NtGdiPATHOBJ_vGetBounds(ptr ptr)
@ stdcall NtGdiPathToRegion(ptr)
@ stdcall NtGdiPlgBlt(ptr ptr ptr long long long long ptr long long long)
@ stdcall NtGdiPolyDraw(ptr ptr ptr long)
@ stdcall NtGdiPolyPatBlt(ptr long ptr long long)
@ stdcall NtGdiPolyPolyDraw(ptr ptr ptr long long)
@ stdcall NtGdiPolyTextOutW(ptr ptr long long)
@ stdcall NtGdiPtInRegion(ptr long long)
@ stdcall NtGdiPtVisible(ptr long long)
@ stdcall NtGdiQueryFonts(ptr long ptr)
@ stdcall NtGdiQueryFontAssocInfo(ptr)
@ stdcall NtGdiQueryFonts(ptr long ptr)
@ stdcall NtGdiRectangle(ptr long long long long)
@ stdcall NtGdiRectInRegion(ptr ptr)
@ stdcall NtGdiRectVisible(ptr ptr)
@ stdcall NtGdiRemoveFontResourceW(ptr long long long long ptr)
@ stdcall NtGdiRemoveFontMemResourceEx(ptr)
@ stdcall NtGdiRemoveFontResourceW(ptr long long long long ptr)
@ stdcall NtGdiRemoveMergeFont(ptr ptr)
@ stdcall NtGdiResetDC(ptr ptr ptr ptr ptr)
@ stdcall NtGdiResizePalette(ptr long)
@ stdcall NtGdiRestoreDC(ptr long)
@ -287,36 +414,47 @@
@ stdcall NtGdiSetFontEnumeration(long)
@ stdcall NtGdiSetFontXform(ptr long long)
@ stdcall NtGdiSetIcmMode(ptr long long)
@ stdcall NtGdiSetLayout(ptr long long)
@ stdcall NtGdiSetLinkedUFIs(ptr ptr long)
@ stdcall NtGdiSetMagicColors(ptr long long)
@ stdcall NtGdiSetMetaRgn(ptr)
@ stdcall NtGdiSetMiterLimit(ptr long ptr)
@ stdcall NtGdiGetDeviceWidth(ptr)
@ stdcall NtGdiMirrorWindowOrg(ptr)
@ stdcall NtGdiSetLayout(ptr long long)
@ stdcall NtGdiSetOPMSigningKeyAndSequenceNumbers(ptr ptr)
@ stdcall NtGdiSetPixel(ptr long long long)
@ stdcall NtGdiSetPixelFormat(ptr long)
@ stdcall NtGdiSetPUMPDOBJ(ptr long ptr ptr)
@ stdcall NtGdiSetRectRgn(ptr long long long long)
@ stdcall NtGdiSetSizeDevice(ptr long long)
@ stdcall NtGdiSetSystemPaletteUse(ptr long)
@ stdcall NtGdiSetTextJustification(ptr long long)
@ stdcall NtGdiSetupPublicCFONT(ptr ptr long)
@ stdcall NtGdiSetVirtualResolution(ptr long long long long)
@ stdcall NtGdiSetSizeDevice(ptr long long)
@ stdcall NtGdiStartDoc(ptr ptr ptr long)
@ stdcall NtGdiStartPage(ptr)
@ stdcall NtGdiStretchBlt(ptr long long long long ptr long long long long long long)
@ stdcall NtGdiStretchDIBitsInternal(ptr long long long long long long long long ptr ptr long long long long ptr)
@ stdcall NtGdiSTROBJ_bEnum(ptr ptr ptr)
@ stdcall NtGdiSTROBJ_bEnumPositionsOnly(ptr ptr ptr)
@ stdcall NtGdiSTROBJ_bGetAdvanceWidths(ptr long long ptr)
@ stdcall NtGdiSTROBJ_dwGetCodePage(ptr)
@ stdcall NtGdiSTROBJ_vEnumStart(ptr)
@ stdcall NtGdiStrokeAndFillPath(ptr)
@ stdcall NtGdiStrokePath(ptr)
@ stdcall NtGdiSwapBuffers(ptr)
@ stdcall NtGdiTransformPoints(ptr ptr ptr long long)
@ stdcall NtGdiTransparentBlt(ptr long long long long ptr long long long long long)
@ stdcall NtGdiUMPDEngFreeUserMem(ptr)
@ stdcall NtGdiUnloadPrinterDriver(wstr long)
@ stdcall NtGdiUnmapMemFont(ptr)
@ stdcall NtGdiUnrealizeObject(ptr)
@ stdcall NtGdiUpdateColors(ptr)
@ stdcall NtGdiUpdateTransform(ptr)
@ stdcall NtGdiWidenPath(ptr)
@ stdcall NtGdiXFORMOBJ_bApplyXform(ptr ptr long long ptr)
@ stdcall NtGdiXFORMOBJ_iGetXform(ptr ptr)
@ stdcall NtGdiXLATEOBJ_cGetPalette(ptr long long ptr)
@ stdcall NtGdiXLATEOBJ_hGetColorTransform(ptr)
@ stdcall NtGdiXLATEOBJ_iXlate(ptr long)
@ stdcall NtUserActivateKeyboardLayout(ptr long)
@ stdcall NtUserAddClipboardFormatListener(ptr)
@ stdcall NtUserAlterWindowStyle(long long long)
@ -329,6 +467,7 @@
@ stdcall NtUserBuildHwndList(ptr ptr long long long ptr ptr)
@ stdcall NtUserBuildNameList(ptr long ptr ptr)
@ stdcall NtUserBuildPropList(ptr ptr long ptr)
@ stdcall NtUserCalcMenuBar(long long long long long)
@ stdcall NtUserCallHwnd(ptr long)
@ stdcall NtUserCallHwndLock(ptr long)
@ stdcall NtUserCallHwndOpt(ptr long)
@ -343,9 +482,9 @@
@ stdcall NtUserChangeDisplaySettings(ptr ptr ptr long)
@ stdcall NtUserCheckAccessForIntegrityLevel(long long ptr)
@ stdcall NtUserCheckDesktopByThreadId(long)
@ stdcall NtUserCheckWindowThreadDesktop(ptr long long)
@ stdcall NtUserCheckImeHotKey(long long)
@ stdcall NtUserCheckMenuItem(ptr long long)
@ stdcall NtUserCheckWindowThreadDesktop(ptr long long)
@ stdcall NtUserChildWindowFromPointEx(ptr long long long)
@ stdcall NtUserClipCursor(ptr)
@ stdcall NtUserCloseClipboard()
@ -362,6 +501,7 @@
@ stdcall NtUserCreateLocalMemHandle(ptr ptr long ptr)
@ stdcall NtUserCreateWindowEx(long ptr ptr ptr long long long long long ptr ptr ptr ptr long ptr)
@ stdcall NtUserCreateWindowStation(ptr long long long long long long)
@ stdcall NtUserCtxDisplayIOCtl(long long long)
@ stdcall NtUserDdeInitialize(long long long long long)
@ stdcall NtUserDeferWindowPos(ptr ptr ptr long long long long long)
@ stdcall NtUserDefSetText(ptr ptr)
@ -382,6 +522,10 @@
@ stdcall NtUserDrawCaptionTemp(ptr ptr ptr ptr ptr ptr long)
@ stdcall NtUserDrawIconEx(ptr long long ptr long long long ptr long long ptr)
@ stdcall NtUserDrawMenuBarTemp(ptr ptr ptr ptr ptr)
@ stdcall NtUserDwmGetDxRgn(long long long)
@ stdcall NtUserDwmHintDxUpdate(long long)
@ stdcall NtUserDwmStartRedirection(long)
@ stdcall NtUserDwmStopRedirection()
@ stdcall NtUserEmptyClipboard()
@ stdcall NtUserEnableMenuItem(ptr long long)
@ stdcall NtUserEnableScrollBar(ptr long long)
@ -405,7 +549,8 @@
@ stdcall NtUserGetAtomName(long ptr)
@ stdcall NtUserGetCaretBlinkTime()
@ stdcall NtUserGetCaretPos(ptr)
@ stdcall NtUserGetClassInfoEx(ptr ptr ptr ptr long)
@ stdcall -arch=i386 NtUserGetClassInfoEx(ptr ptr ptr ptr long)
@ stdcall -arch=x86_64 NtUserGetClassInfo(ptr ptr ptr ptr long)
@ stdcall NtUserGetClassName(ptr long ptr)
@ stdcall NtUserGetClipboardData(long ptr)
@ stdcall NtUserGetClipboardFormatName(long wstr ptr)
@ -435,6 +580,7 @@
@ stdcall NtUserGetKeyboardState(ptr)
@ stdcall NtUserGetKeyNameText(long wstr long)
@ stdcall NtUserGetKeyState(long)
@ stdcall NtUserGetLayeredWindowAttributes(ptr ptr ptr ptr)
@ stdcall NtUserGetListBoxInfo(ptr)
@ stdcall NtUserGetMenuBarInfo(ptr long long ptr)
@ stdcall NtUserGetMenuIndex(ptr ptr)
@ -445,6 +591,7 @@
@ stdcall NtUserGetOpenClipboardWindow()
@ stdcall NtUserGetPriorityClipboardFormat(ptr long)
@ stdcall NtUserGetProcessWindowStation()
@ stdcall NtUserGetProp(ptr long)
@ stdcall NtUserGetRawInputBuffer(ptr ptr long)
@ stdcall NtUserGetRawInputData(ptr long ptr ptr long)
@ stdcall NtUserGetRawInputDeviceInfo(ptr long ptr ptr)
@ -459,7 +606,9 @@
@ stdcall NtUserGetUpdateRect(ptr ptr long)
@ stdcall NtUserGetUpdateRgn(ptr ptr long)
@ stdcall NtUserGetWindowDC(ptr)
@ stdcall NtUserGetWindowMinimizeRect(long long)
@ stdcall NtUserGetWindowPlacement(ptr ptr)
@ stdcall NtUserGetWindowRgnEx(ptr ptr long)
@ stdcall NtUserGetWOWClass(ptr ptr)
@ stdcall NtUserGhostWindowFromHungWindow(ptr)
@ stdcall NtUserHardErrorControl(long long long)
@ -467,11 +616,11 @@
@ stdcall NtUserHiliteMenuItem(ptr ptr long long)
@ stdcall NtUserHungWindowFromGhostWindow(ptr)
@ stdcall NtUserImpersonateDdeClientWindow(ptr ptr)
@ stdcall NtUserInitialize(long ptr)
@ stdcall NtUserInitialize(long ptr ptr)
@ stdcall NtUserInitializeClientPfnArrays(ptr ptr ptr ptr)
@ stdcall NtUserInitTask(long long long long long long long long long long long long)
@ stdcall NtUserInternalGetWindowText(ptr wstr ptr)
@ stdcall NtUserInternalGetWindowIcon(ptr long)
@ stdcall NtUserInternalGetWindowText(ptr wstr ptr)
@ stdcall NtUserInvalidateRect(ptr ptr long)
@ stdcall NtUserInvalidateRgn(ptr ptr long)
@ stdcall NtUserIsClipboardFormatAvailable(long)
@ -498,13 +647,14 @@
@ stdcall NtUserOpenThreadDesktop(ptr ptr ptr ptr ptr)
@ stdcall NtUserOpenWindowStation(ptr long)
@ stdcall NtUserPaintDesktop(ptr)
@ stdcall NtUserPaintMenuBar(long long long long long long)
@ stdcall NtUserPaintMonitor(long long long)
@ stdcall NtUserPeekMessage(ptr ptr long long long)
@ stdcall NtUserPhysicalToLogicalPoint(ptr ptr)
@ stdcall NtUserPostMessage(ptr long long long)
@ stdcall NtUserPostThreadMessage(long long long long)
@ stdcall NtUserPrintWindow(ptr ptr long)
@ stdcall NtUserProcessConnect(ptr ptr)
@ stdcall NtUserProcessConnect(ptr ptr long)
@ stdcall NtUserQueryInformationThread(long long long long)
@ stdcall NtUserQueryInputContext(long long)
@ stdcall NtUserQuerySendMessage(long)
@ -515,11 +665,16 @@
@ stdcall NtUserRedrawWindow(ptr ptr ptr long)
@ stdcall NtUserRegisterClassExWOW(ptr ptr ptr ptr long long ptr)
@ stdcall NtUserRegisterErrorReportingDialog(long long)
@ stdcall NtUserRegisterUserApiHook(ptr ptr long long)
@ stdcall NtUserRegisterHotKey(ptr long long long)
@ stdcall NtUserRegisterRawInputDevices(ptr long long)
@ stdcall NtUserRegisterSessionPort(long)
@ stdcall NtUserRegisterTasklist(long)
@ stdcall NtUserRegisterUserApiHook(ptr ptr long long)
@ stdcall NtUserRegisterWindowMessage(ptr)
@ stdcall NtUserRemoteConnect(long long long)
@ stdcall NtUserRemoteRedrawRectangle(long long long long)
@ stdcall NtUserRemoteRedrawScreen()
@ stdcall NtUserRemoteStopScreenUpdates()
@ stdcall NtUserRemoveClipboardFormatListener(ptr)
@ stdcall NtUserRemoveMenu(ptr long long)
@ stdcall NtUserRemoveProp(ptr long)
@ -534,6 +689,7 @@
@ stdcall NtUserSetAppImeLevel(long long)
@ stdcall NtUserSetCapture(ptr)
@ stdcall NtUserSetClassLong(ptr long ptr long)
@ stdcall -arch=x86_64 NtUserSetClassLongPtr(ptr long ptr long)
@ stdcall NtUserSetClassWord(ptr long long)
@ stdcall NtUserSetClipboardData(long ptr ptr)
@ stdcall NtUserSetClipboardViewer(ptr)
@ -549,32 +705,33 @@
@ stdcall NtUserSetInformationThread(ptr long ptr long)
@ stdcall NtUserSetInternalWindowPos(ptr long ptr ptr)
@ stdcall NtUserSetKeyboardState(ptr)
@ stdcall NtUserSetLayeredWindowAttributes(ptr long long long)
@ stdcall NtUserSetMenu(ptr ptr long)
@ stdcall NtUserSetMenuContextHelpId(ptr long)
@ stdcall NtUserSetMenuDefaultItem(ptr long long)
@ stdcall NtUserSetMenuFlagRtoL(ptr)
@ stdcall NtUserSetMirrorRendering(long long)
@ stdcall NtUserSetObjectInformation(ptr long ptr long)
@ stdcall NtUserSetParent(ptr ptr)
@ stdcall NtUserSetProcessDPIAware()
@ stdcall NtUserSetProcessWindowStation(ptr)
@ stdcall NtUserGetProp(ptr long)
@ stdcall NtUserSetProp(ptr long ptr)
@ stdcall NtUserSetScrollInfo(ptr long ptr long)
@ stdcall NtUserSetShellWindowEx(ptr ptr)
@ stdcall NtUserSetSysColors(long ptr ptr long)
@ stdcall NtUserSetSystemCursor(ptr long)
@ stdcall NtUserSetSystemMenu(ptr ptr)
@ stdcall NtUserSetSystemTimer(ptr ptr ptr)
@ stdcall NtUserSetSystemTimer(ptr ptr long ptr)
@ stdcall NtUserSetThreadDesktop(ptr)
@ stdcall NtUserSetThreadLayoutHandles(long long)
@ stdcall NtUserSetThreadState(long long)
@ stdcall NtUserSetTimer(ptr ptr long ptr)
@ stdcall NtUserSetProcessDPIAware()
@ stdcall NtUserSetWindowFNID(ptr long)
@ stdcall NtUserSetWindowLong(ptr long long long)
@ stdcall -arch=x86_64 NtUserSetWindowLongPtr(ptr long long long)
@ stdcall NtUserSetWindowPlacement(ptr ptr)
@ stdcall NtUserSetWindowPos(ptr ptr long long long long long)
@ stdcall NtUserSetWindowRgn(ptr ptr long)
@ stdcall NtUserGetWindowRgnEx(ptr ptr long)
@ stdcall NtUserSetWindowRgnEx(ptr ptr long)
@ stdcall NtUserSetWindowsHookAW(long ptr long)
@ stdcall NtUserSetWindowsHookEx(ptr ptr long long ptr long)
@ -583,6 +740,7 @@
@ stdcall NtUserSetWinEventHook(long long ptr ptr ptr long long long)
@ stdcall NtUserShowCaret(ptr)
@ stdcall NtUserShowScrollBar(ptr long long)
@ stdcall NtUserShowSystemCursor(long)
@ stdcall NtUserShowWindow(ptr long)
@ stdcall NtUserShowWindowAsync(ptr long)
@ stdcall NtUserSoundSentry()
@ -594,8 +752,6 @@
@ stdcall NtUserToUnicodeEx(long long ptr wstr long long ptr)
@ stdcall NtUserTrackMouseEvent(ptr)
@ stdcall NtUserTrackPopupMenuEx(ptr long long long ptr ptr)
@ stdcall NtUserCalcMenuBar(long long long long long)
@ stdcall NtUserPaintMenuBar(long long long long long long)
@ stdcall NtUserTranslateAccelerator(ptr ptr ptr)
@ stdcall NtUserTranslateMessage(ptr long)
@ stdcall NtUserUnhookWindowsHookEx(ptr)
@ -603,14 +759,14 @@
@ stdcall NtUserUnloadKeyboardLayout(ptr)
@ stdcall NtUserUnlockWindowStation(ptr)
@ stdcall NtUserUnregisterClass(ptr ptr ptr)
@ stdcall NtUserUnregisterUserApiHook()
@ stdcall NtUserUnregisterHotKey(ptr long)
@ stdcall NtUserUnregisterSessionPort()
@ stdcall NtUserUnregisterUserApiHook()
@ stdcall NtUserUpdateInputContext(long long long)
@ stdcall NtUserUpdateInstance(long long long)
@ stdcall NtUserUpdateLayeredWindow(ptr ptr ptr ptr ptr ptr long ptr long ptr)
@ stdcall NtUserGetLayeredWindowAttributes(ptr ptr ptr ptr)
@ stdcall NtUserSetLayeredWindowAttributes(ptr long long long)
@ stdcall NtUserUpdatePerUserSystemParameters(long)
@ stdcall NtUserUpdatePerUserSystemParameters(long long)
@ stdcall NtUserUpdateWindowTransform(ptr ptr long)
@ stdcall NtUserUserHandleGrantAccess(ptr ptr long)
@ stdcall NtUserValidateHandleSecure(ptr)
@ stdcall NtUserValidateRect(ptr ptr)
@ -623,156 +779,3 @@
@ stdcall NtUserWindowFromPhysicalPoint(long long)
@ stdcall NtUserWindowFromPoint(long long)
@ stdcall NtUserYieldTask()
@ stdcall NtUserRemoteConnect(long long long)
@ stdcall NtUserRemoteRedrawRectangle(long long long long)
@ stdcall NtUserRemoteRedrawScreen()
@ stdcall NtUserRemoteStopScreenUpdates()
@ stdcall NtUserCtxDisplayIOCtl(long long long)
@ stdcall NtUserRegisterSessionPort(long)
@ stdcall NtUserUnregisterSessionPort()
@ stdcall NtUserUpdateWindowTransform(ptr ptr long)
@ stdcall NtUserDwmStartRedirection(long)
@ stdcall NtUserDwmStopRedirection()
@ stdcall NtUserDwmHintDxUpdate(long long)
@ stdcall NtUserDwmGetDxRgn(long long long)
@ stdcall NtUserGetWindowMinimizeRect(long long)
@ stdcall NtGdiEngAssociateSurface(ptr ptr long)
@ stdcall NtGdiEngCreateBitmap(long long long long long ptr)
@ stdcall NtGdiEngCreateDeviceSurface(ptr long long long)
@ stdcall NtGdiEngCreateDeviceBitmap(ptr long long long)
@ stdcall NtGdiEngCreatePalette(long long ptr long long long)
@ stdcall NtGdiEngComputeGlyphSet(ptr ptr ptr)
@ stdcall NtGdiEngCopyBits(ptr ptr ptr ptr ptr ptr)
@ stdcall NtGdiEngDeletePalette(ptr)
@ stdcall NtGdiEngDeleteSurface(ptr)
@ stdcall NtGdiEngEraseSurface(ptr ptr long)
@ stdcall NtGdiEngUnlockSurface(ptr)
@ stdcall NtGdiEngLockSurface(ptr)
@ stdcall NtGdiEngBitBlt(ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr)
@ stdcall NtGdiEngStretchBlt(ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr long)
@ stdcall NtGdiEngPlgBlt(ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr long)
@ stdcall NtGdiEngMarkBandingSurface(ptr)
@ stdcall NtGdiEngStrokePath(ptr ptr ptr ptr ptr ptr ptr ptr)
@ stdcall NtGdiEngFillPath(ptr ptr ptr ptr ptr ptr ptr)
@ stdcall NtGdiEngStrokeAndFillPath(ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr)
@ stdcall NtGdiEngPaint(ptr ptr ptr ptr ptr)
@ stdcall NtGdiEngLineTo(ptr ptr ptr long long long long ptr ptr)
@ stdcall NtGdiEngAlphaBlend(ptr ptr ptr ptr ptr ptr ptr)
@ stdcall NtGdiEngGradientFill(ptr ptr ptr ptr long ptr long ptr ptr long)
@ stdcall NtGdiEngTransparentBlt(ptr ptr ptr ptr ptr ptr long long)
@ stdcall NtGdiEngTextOut(ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr)
@ stdcall NtGdiEngStretchBltROP(ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr long ptr long)
@ stdcall NtGdiXLATEOBJ_cGetPalette(ptr long long ptr)
@ stdcall NtGdiXLATEOBJ_iXlate(ptr long)
@ stdcall NtGdiXLATEOBJ_hGetColorTransform(ptr)
@ stdcall NtGdiCLIPOBJ_bEnum(ptr long long)
@ stdcall NtGdiCLIPOBJ_cEnumStart(ptr long long long long)
@ stdcall NtGdiCLIPOBJ_ppoGetPath(ptr)
@ stdcall NtGdiEngDeletePath(ptr)
@ stdcall NtGdiEngCreateClip()
@ stdcall NtGdiEngDeleteClip(ptr)
@ stdcall NtGdiBRUSHOBJ_ulGetBrushColor(ptr)
@ stdcall NtGdiBRUSHOBJ_pvAllocRbrush(ptr long)
@ stdcall NtGdiBRUSHOBJ_pvGetRbrush(ptr)
@ stdcall NtGdiBRUSHOBJ_hGetColorTransform(ptr)
@ stdcall NtGdiXFORMOBJ_bApplyXform(ptr ptr long long ptr)
@ stdcall NtGdiXFORMOBJ_iGetXform(ptr ptr)
@ stdcall NtGdiFONTOBJ_vGetInfo(ptr long ptr)
@ stdcall NtGdiFONTOBJ_pxoGetXform(ptr)
@ stdcall NtGdiFONTOBJ_cGetGlyphs(ptr long long ptr ptr)
@ stdcall NtGdiFONTOBJ_pifi(ptr)
@ stdcall NtGdiFONTOBJ_pfdg(ptr)
@ stdcall NtGdiFONTOBJ_pQueryGlyphAttrs(ptr long)
@ stdcall NtGdiFONTOBJ_pvTrueTypeFontFile(ptr ptr)
@ stdcall NtGdiFONTOBJ_cGetAllGlyphHandles(ptr ptr)
@ stdcall NtGdiSTROBJ_bEnum(ptr ptr ptr)
@ stdcall NtGdiSTROBJ_bEnumPositionsOnly(ptr ptr ptr)
@ stdcall NtGdiSTROBJ_bGetAdvanceWidths(ptr long long ptr)
@ stdcall NtGdiSTROBJ_vEnumStart(ptr)
@ stdcall NtGdiSTROBJ_dwGetCodePage(ptr)
@ stdcall NtGdiPATHOBJ_vGetBounds(ptr ptr)
@ stdcall NtGdiPATHOBJ_bEnum(ptr ptr)
@ stdcall NtGdiPATHOBJ_vEnumStart(ptr)
@ stdcall NtGdiPATHOBJ_vEnumStartClipLines(ptr ptr ptr ptr)
@ stdcall NtGdiPATHOBJ_bEnumClipLines(ptr long ptr)
@ stdcall NtGdiGetDhpdev(ptr)
@ stdcall NtGdiEngCheckAbort(ptr)
@ stdcall NtGdiHT_Get8BPPFormatPalette(ptr long long long)
@ stdcall NtGdiHT_Get8BPPMaskPalette(ptr long long long long long)
@ stdcall NtGdiUpdateTransform(ptr)
@ stdcall NtGdiSetPUMPDOBJ(ptr long ptr ptr)
@ stdcall NtGdiBRUSHOBJ_DeleteRbrush(ptr ptr)
@ stdcall NtGdiUMPDEngFreeUserMem(ptr)
@ stdcall NtGdiDrawStream(ptr long ptr)
@ stdcall NtGdiDwmGetDirtyRgn(long long long long long)
@ stdcall NtGdiDwmGetSurfaceData(long long)
@ stdcall NtGdiDdDDICreateAllocation(ptr)
@ stdcall NtGdiDdDDIQueryResourceInfo(ptr)
@ stdcall NtGdiDdDDIOpenResource(ptr)
@ stdcall NtGdiDdDDIDestroyAllocation(ptr)
@ stdcall NtGdiDdDDISetAllocationPriority(ptr)
@ stdcall NtGdiDdDDIQueryAllocationResidency(ptr)
@ stdcall NtGdiDdDDICreateDevice(ptr)
@ stdcall NtGdiDdDDIDestroyDevice(ptr)
@ stdcall NtGdiDdDDICreateContext(ptr)
@ stdcall NtGdiDdDDIDestroyContext(ptr)
@ stdcall NtGdiDdDDICreateSynchronizationObject(ptr)
@ stdcall NtGdiDdDDIDestroySynchronizationObject(ptr)
@ stdcall NtGdiDdDDIWaitForSynchronizationObject(ptr)
@ stdcall NtGdiDdDDISignalSynchronizationObject(ptr)
@ stdcall NtGdiDdDDIGetRuntimeData(ptr)
@ stdcall NtGdiDdDDIQueryAdapterInfo(ptr)
@ stdcall NtGdiDdDDILock(ptr)
@ stdcall NtGdiDdDDIUnlock(ptr)
@ stdcall NtGdiDdDDIGetDisplayModeList(ptr)
@ stdcall NtGdiDdDDISetDisplayMode(ptr)
@ stdcall NtGdiDdDDIGetMultisampleMethodList(ptr)
@ stdcall NtGdiDdDDIPresent(ptr)
@ stdcall NtGdiDdDDIRender(ptr)
@ stdcall NtGdiDdDDIOpenAdapterFromDeviceName(ptr)
@ stdcall NtGdiDdDDIOpenAdapterFromHdc(ptr)
@ stdcall NtGdiDdDDICloseAdapter(ptr)
@ stdcall NtGdiDdDDIGetSharedPrimaryHandle(ptr)
@ stdcall NtGdiDdDDIEscape(ptr)
@ stdcall NtGdiDdDDIQueryStatistics(ptr)
@ stdcall NtGdiDdDDISetVidPnSourceOwner(ptr)
@ stdcall NtGdiDdDDIGetPresentHistory(ptr)
@ stdcall NtGdiDdDDICreateOverlay(ptr)
@ stdcall NtGdiDdDDIUpdateOverlay(ptr)
@ stdcall NtGdiDdDDIFlipOverlay(ptr)
@ stdcall NtGdiDdDDIDestroyOverlay(ptr)
@ stdcall NtGdiDdDDIWaitForVerticalBlankEvent(ptr)
@ stdcall NtGdiDdDDISetGammaRamp(ptr)
@ stdcall NtGdiDdDDIGetDeviceState(ptr)
@ stdcall NtGdiDdDDICreateDCFromMemory(ptr)
@ stdcall NtGdiDdDDIDestroyDCFromMemory(ptr)
@ stdcall NtGdiDdDDISetContextSchedulingPriority(ptr)
@ stdcall NtGdiDdDDIGetContextSchedulingPriority(ptr)
@ stdcall NtGdiDdDDISetProcessSchedulingPriorityClass(ptr long)
@ stdcall NtGdiDdDDIGetProcessSchedulingPriorityClass(ptr ptr)
@ stdcall NtGdiDdDDIReleaseProcessVidPnSourceOwners(ptr)
@ stdcall NtGdiDdDDIGetScanLine(ptr)
@ stdcall NtGdiDdDDISetQueuedLimit(ptr)
@ stdcall NtGdiDdDDIPollDisplayChildren(ptr)
@ stdcall NtGdiDdDDIInvalidateActiveVidPn(ptr)
@ stdcall NtGdiDdDDICheckOcclusion(ptr)
@ stdcall NtGdiDdDDIWaitForIdle(ptr)
@ stdcall NtGdiDdDDICheckMonitorPowerState(ptr)
@ stdcall NtGdiDdDDICheckExclusiveOwnership()
@ stdcall NtGdiDdDDISetDisplayPrivateDriverFormat(ptr)
@ stdcall NtGdiDdDDISharedPrimaryLockNotification(ptr)
@ stdcall NtGdiDdDDISharedPrimaryUnLockNotification(ptr)
@ stdcall NtGdiMakeObjectXferable(ptr long)
@ stdcall NtGdiMakeObjectUnXferable(ptr)
@ stdcall NtGdiGetNumberOfPhysicalMonitors(ptr ptr)
@ stdcall NtGdiGetPhysicalMonitors(ptr long ptr ptr)
@ stdcall NtGdiGetPhysicalMonitorDescription(ptr long ptr)
@ stdcall NtGdiDestroyPhysicalMonitor(ptr)
@ stdcall NtGdiDDCCIGetVCPFeature(ptr long ptr ptr ptr)
@ stdcall NtGdiDDCCISetVCPFeature(ptr long long)
@ stdcall NtGdiDDCCISaveCurrentSettings(ptr)
@ stdcall NtGdiDDCCIGetCapabilitiesStringLength(ptr ptr)
@ stdcall NtGdiDDCCIGetCapabilitiesString(ptr ptr long)
@ stdcall NtGdiDDCCIGetTimingReport(ptr ptr)
@ stdcall NtUserSetMirrorRendering(long long)
@ stdcall NtUserShowSystemCursor(long)

View File

@ -91,6 +91,10 @@ static __inline__ __attribute__((always_inline)) void __str(unsigned short *Dest
__asm__ __volatile__("str %0" : : "m"(*Destination) : "memory");
}
static __inline__ __attribute__((always_inline)) void __swapgs(void)
{
__asm__ __volatile__("swapgs" : : : "memory");
}
#elif defined(_MSC_VER)
@ -106,6 +110,7 @@ void __ltr(unsigned short Source);
void __str(unsigned short *Destination);
void __swapgs(void);
#else
#error Unknown compiler for inline assembler

View File

@ -480,6 +480,11 @@ VOID
KiUserCallbackExit(
_In_ PKTRAP_FRAME TrapFrame);
BOOLEAN
KiProcessorFreezeHandler(
_In_ PKTRAP_FRAME TrapFrame,
_In_ PKEXCEPTION_FRAME ExceptionFrame);
#ifdef __cplusplus
} // extern "C"
#endif

View File

@ -72,14 +72,6 @@ BOOLEAN
IN BOOLEAN SecondChance
);
typedef
BOOLEAN
(NTAPI *PKDEBUG_SWITCH_ROUTINE)(
IN PEXCEPTION_RECORD ExceptionRecord,
IN PCONTEXT Context,
IN BOOLEAN SecondChance
);
//
// Initialization Routines
//
@ -110,13 +102,10 @@ KdIsThisAKdTrap(
//
// Multi-Processor Switch Support
//
BOOLEAN
KCONTINUE_STATUS
NTAPI
KdpSwitchProcessor(
IN PEXCEPTION_RECORD ExceptionRecord,
IN OUT PCONTEXT ContextRecord,
IN BOOLEAN SecondChanceException
);
KdReportProcessorChange(
VOID);
//
// Time Slip Support
@ -540,7 +529,6 @@ extern LARGE_INTEGER KdTimerStart;
extern ULONG KdDisableCount;
extern KD_CONTEXT KdpContext;
extern PKDEBUG_ROUTINE KiDebugRoutine;
extern PKDEBUG_SWITCH_ROUTINE KiDebugSwitchRoutine;
extern BOOLEAN KdBreakAfterSymbolLoad;
extern BOOLEAN KdPitchDebugger;
extern BOOLEAN KdAutoEnableOnEvent;

View File

@ -982,6 +982,16 @@ VOID
NTAPI
KiInitMachineDependent(VOID);
VOID
NTAPI
KxFreezeExecution(
VOID);
VOID
NTAPI
KxThawExecution(
VOID);
BOOLEAN
NTAPI
KeFreezeExecution(IN PKTRAP_FRAME TrapFrame,
@ -991,6 +1001,11 @@ VOID
NTAPI
KeThawExecution(IN BOOLEAN Enable);
KCONTINUE_STATUS
NTAPI
KxSwitchKdProcessor(
_In_ ULONG ProcessorIndex);
_IRQL_requires_min_(DISPATCH_LEVEL)
_Acquires_nonreentrant_lock_(*LockHandle->Lock)
_Acquires_exclusive_lock_(*LockHandle->Lock)
@ -1024,9 +1039,14 @@ KiSaveProcessorControlState(
VOID
NTAPI
KiSaveProcessorState(
IN PKTRAP_FRAME TrapFrame,
IN PKEXCEPTION_FRAME ExceptionFrame
);
_In_ PKTRAP_FRAME TrapFrame,
_In_ PKEXCEPTION_FRAME ExceptionFrame);
VOID
NTAPI
KiRestoreProcessorState(
_Out_ PKTRAP_FRAME TrapFrame,
_Out_ PKEXCEPTION_FRAME ExceptionFrame);
VOID
FASTCALL

View File

@ -1260,6 +1260,28 @@ KdpNotSupported(IN PDBGKD_MANIPULATE_STATE64 State)
&KdpContext);
}
static
KCONTINUE_STATUS
KdpSwitchProcessor(
_In_ USHORT ProcessorIndex)
{
/* Make sure that the processor index is valid */
if (ProcessorIndex >= KeNumberProcessors)
{
KdpDprintf("%u is not a valid processor number\n", ProcessorIndex);
return ContinueProcessorReselected;
}
/* If the new processor is the current one, there is nothing to do */
if (ProcessorIndex == KeGetCurrentProcessorNumber())
{
return ContinueProcessorReselected;
}
/* Call the architecture specific Ke routine */
return KxSwitchKdProcessor(ProcessorIndex);
}
KCONTINUE_STATUS
NTAPI
KdpSendWaitContinue(IN ULONG PacketType,
@ -1470,10 +1492,8 @@ SendPacket:
case DbgKdSwitchProcessor:
/* TODO */
KdpDprintf("Processor Switch support is unimplemented!\n");
KdpNotSupported(&ManipulateState);
break;
/* Switch the processor and return */
return KdpSwitchProcessor(ManipulateState.Processor);
case DbgKdPageInApi:
@ -1785,6 +1805,33 @@ KdpReportExceptionStateChange(IN PEXCEPTION_RECORD ExceptionRecord,
return Status;
}
KCONTINUE_STATUS
NTAPI
KdReportProcessorChange(
VOID)
{
PKPRCB CurrentPrcb = KeGetCurrentPrcb();
PCONTEXT ContextRecord = &CurrentPrcb->ProcessorState.ContextFrame;
EXCEPTION_RECORD ExceptionRecord = {0};
KCONTINUE_STATUS Status;
/* Save the port data */
KdSave(FALSE);
ExceptionRecord.ExceptionAddress = (PVOID)KeGetContextPc(ContextRecord);
ExceptionRecord.ExceptionCode = STATUS_WAKE_SYSTEM_DEBUGGER;
/* Report the new state */
Status = KdpReportExceptionStateChange(&ExceptionRecord,
ContextRecord,
FALSE);
/* Restore the port data */
KdRestore(FALSE);
return Status;
}
VOID
NTAPI
KdpTimeSlipDpcRoutine(IN PKDPC Dpc,
@ -1833,27 +1880,6 @@ KdpTimeSlipWork(IN PVOID Context)
KeSetTimer(&KdpTimeSlipTimer, DueTime, &KdpTimeSlipDpc);
}
BOOLEAN
NTAPI
KdpSwitchProcessor(IN PEXCEPTION_RECORD ExceptionRecord,
IN OUT PCONTEXT ContextRecord,
IN BOOLEAN SecondChanceException)
{
BOOLEAN Status;
/* Save the port data */
KdSave(FALSE);
/* Report a state change */
Status = KdpReportExceptionStateChange(ExceptionRecord,
ContextRecord,
SecondChanceException);
/* Restore the port data and return */
KdRestore(FALSE);
return Status;
}
LARGE_INTEGER
NTAPI
KdpQueryPerformanceCounter(IN PKTRAP_FRAME TrapFrame)

View File

@ -72,7 +72,6 @@ BOOLEAN KdpContextSent;
// Debug Trap Handlers
//
PKDEBUG_ROUTINE KiDebugRoutine = KdpStub;
PKDEBUG_SWITCH_ROUTINE KiDebugSwitchRoutine;
//
// Debugger Configuration Settings

View File

@ -360,9 +360,8 @@ KdInitSystem(
/* Check if we've already initialized our structures */
if (!KdpDebuggerStructuresInitialized)
{
/* Set the Debug Switch Routine and Retries */
/* Set Retries */
KdpContext.KdpDefaultRetries = 20;
KiDebugSwitchRoutine = KdpSwitchProcessor;
/* Initialize breakpoints owed flag and table */
KdpOweBreakpoint = FALSE;

View File

@ -612,6 +612,41 @@ KiSaveProcessorControlState(OUT PKPROCESSOR_STATE ProcessorState)
ProcessorState->SpecialRegisters.MsrSyscallMask = __readmsr(X86_MSR_SFMASK);
}
VOID
NTAPI
KiSaveProcessorState(
_In_ PKTRAP_FRAME TrapFrame,
_In_ PKEXCEPTION_FRAME ExceptionFrame)
{
PKPRCB Prcb = KeGetCurrentPrcb();
/* Save all context */
Prcb->ProcessorState.ContextFrame.ContextFlags = CONTEXT_ALL;
KeTrapFrameToContext(TrapFrame, ExceptionFrame, &Prcb->ProcessorState.ContextFrame);
/* Save control registers */
KiSaveProcessorControlState(&Prcb->ProcessorState);
}
VOID
NTAPI
KiRestoreProcessorState(
_Out_ PKTRAP_FRAME TrapFrame,
_Out_ PKEXCEPTION_FRAME ExceptionFrame)
{
PKPRCB Prcb = KeGetCurrentPrcb();
/* Restore all context */
KeContextToTrapFrame(&Prcb->ProcessorState.ContextFrame,
ExceptionFrame,
TrapFrame,
CONTEXT_ALL,
TrapFrame->PreviousMode);
/* Restore control registers */
KiRestoreProcessorControlState(&Prcb->ProcessorState);
}
VOID
NTAPI
KeFlushEntireTb(IN BOOLEAN Invalid,

223
ntoskrnl/ke/amd64/freeze.c Normal file
View File

@ -0,0 +1,223 @@
/*
* PROJECT: ReactOS Kernel
* LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
* PURPOSE: Processor freeze support for x64
* COPYRIGHT: Copyright 2023 Timo Kreuzer <timo.kreuzer@reactos.org>
*/
/* INCLUDES *******************************************************************/
#include <ntoskrnl.h>
#define NDEBUG
#include <debug.h>
/* NOT INCLUDES ANYMORE ******************************************************/
PKPRCB KiFreezeOwner;
/* FUNCTIONS *****************************************************************/
BOOLEAN
KiProcessorFreezeHandler(
_In_ PKTRAP_FRAME TrapFrame,
_In_ PKEXCEPTION_FRAME ExceptionFrame)
{
PKPRCB CurrentPrcb = KeGetCurrentPrcb();
/* Make sure this is a freeze request */
if (CurrentPrcb->IpiFrozen != IPI_FROZEN_STATE_TARGET_FREEZE)
{
/* Not a freeze request, return FALSE to signal it is unhandled */
return FALSE;
}
/* We are frozen now */
CurrentPrcb->IpiFrozen = IPI_FROZEN_STATE_FROZEN;
/* Save the processor state */
KiSaveProcessorState(TrapFrame, ExceptionFrame);
/* Wait for the freeze owner to release us */
while (CurrentPrcb->IpiFrozen != IPI_FROZEN_STATE_THAW)
{
/* Check for Kd processor switch */
if (CurrentPrcb->IpiFrozen & IPI_FROZEN_FLAG_ACTIVE)
{
KCONTINUE_STATUS ContinueStatus;
/* Enter the debugger */
ContinueStatus = KdReportProcessorChange();
/* Set the state back to frozen */
CurrentPrcb->IpiFrozen = IPI_FROZEN_STATE_FROZEN;
/* If the status is ContinueSuccess, we need to release the freeze owner */
if (ContinueStatus == ContinueSuccess)
{
/* Release the freeze owner */
KiFreezeOwner->IpiFrozen = IPI_FROZEN_STATE_THAW;
}
}
YieldProcessor();
KeMemoryBarrier();
}
/* Restore the processor state */
KiRestoreProcessorState(TrapFrame, ExceptionFrame);
/* We are running again now */
CurrentPrcb->IpiFrozen = IPI_FROZEN_STATE_RUNNING;
/* Return TRUE to signal that we handled the freeze */
return TRUE;
}
VOID
NTAPI
KxFreezeExecution(
VOID)
{
PKPRCB CurrentPrcb = KeGetCurrentPrcb();
/* Avoid blocking on recursive debug action */
if (KiFreezeOwner == CurrentPrcb)
{
return;
}
/* Try to acquire the freeze owner */
while (InterlockedCompareExchangePointer(&KiFreezeOwner, CurrentPrcb, NULL))
{
/* Someone else was faster. We expect an NMI to freeze any time.
Spin here until the freeze owner is available. */
while (KiFreezeOwner != NULL)
{
YieldProcessor();
KeMemoryBarrier();
}
}
/* We are the owner now */
CurrentPrcb->IpiFrozen = IPI_FROZEN_STATE_OWNER;
/* Loop all processors */
for (ULONG i = 0; i < KeNumberProcessors; i++)
{
PKPRCB TargetPrcb = KiProcessorBlock[i];
if (TargetPrcb != CurrentPrcb)
{
/* Nobody else is allowed to change IpiFrozen, except the freeze owner */
ASSERT(TargetPrcb->IpiFrozen == IPI_FROZEN_STATE_RUNNING);
/* Request target to freeze */
TargetPrcb->IpiFrozen = IPI_FROZEN_STATE_TARGET_FREEZE;
}
}
/* Send the freeze IPI */
KiIpiSend(KeActiveProcessors & ~CurrentPrcb->SetMember, IPI_FREEZE);
/* Wait for all targets to be frozen */
for (ULONG i = 0; i < KeNumberProcessors; i++)
{
PKPRCB TargetPrcb = KiProcessorBlock[i];
if (TargetPrcb != CurrentPrcb)
{
/* Wait for the target to be frozen */
while (TargetPrcb->IpiFrozen != IPI_FROZEN_STATE_FROZEN)
{
YieldProcessor();
KeMemoryBarrier();
}
}
}
/* All targets are frozen, we can continue */
}
VOID
NTAPI
KxThawExecution(
VOID)
{
PKPRCB CurrentPrcb = KeGetCurrentPrcb();
/* Loop all processors */
for (ULONG i = 0; i < KeNumberProcessors; i++)
{
PKPRCB TargetPrcb = KiProcessorBlock[i];
if (TargetPrcb != CurrentPrcb)
{
/* Make sure they are still frozen */
ASSERT(TargetPrcb->IpiFrozen == IPI_FROZEN_STATE_FROZEN);
/* Request target to thaw */
TargetPrcb->IpiFrozen = IPI_FROZEN_STATE_THAW;
}
}
/* Wait for all targets to be running */
for (ULONG i = 0; i < KeNumberProcessors; i++)
{
PKPRCB TargetPrcb = KiProcessorBlock[i];
if (TargetPrcb != CurrentPrcb)
{
/* Wait for the target to be running again */
while (TargetPrcb->IpiFrozen != IPI_FROZEN_STATE_RUNNING)
{
YieldProcessor();
KeMemoryBarrier();
}
}
}
/* We are running again now */
CurrentPrcb->IpiFrozen = IPI_FROZEN_STATE_RUNNING;
/* Release the freeze owner */
InterlockedExchangePointer(&KiFreezeOwner, NULL);
}
KCONTINUE_STATUS
NTAPI
KxSwitchKdProcessor(
_In_ ULONG ProcessorIndex)
{
PKPRCB CurrentPrcb = KeGetCurrentPrcb();
PKPRCB TargetPrcb;
/* Make sure that the processor index is valid */
ASSERT(ProcessorIndex < KeNumberProcessors);
/* Inform the target processor that it's his turn now */
TargetPrcb = KiProcessorBlock[ProcessorIndex];
TargetPrcb->IpiFrozen |= IPI_FROZEN_FLAG_ACTIVE;
/* If we are not the freeze owner, we return back to the freeze loop */
if (KiFreezeOwner != CurrentPrcb)
{
return ContinueNextProcessor;
}
/* Loop until it's our turn again */
while (CurrentPrcb->IpiFrozen == IPI_FROZEN_STATE_OWNER)
{
YieldProcessor();
KeMemoryBarrier();
}
/* Check if we have been thawed */
if (CurrentPrcb->IpiFrozen == IPI_FROZEN_STATE_THAW)
{
/* Another CPU has completed, we can leave the debugger now */
KdpDprintf("[%u] KxSwitchKdProcessor: ContinueSuccess\n", KeGetCurrentProcessorNumber());
CurrentPrcb->IpiFrozen = IPI_FROZEN_STATE_OWNER;
return ContinueSuccess;
}
/* We have been reselected, return to Kd to continue in the debugger */
CurrentPrcb->IpiFrozen = IPI_FROZEN_STATE_OWNER;
return ContinueProcessorReselected;
}

View File

@ -192,14 +192,30 @@ KiDebugTrapOrFaultKMode:
ExitTrap TF_SAVE_ALL
ENDFUNC
EXTERN KiNmiInterruptHandler:PROC
FUNC KiNmiInterruptWithEf
/* Generate a KEXCEPTION_FRAME on the stack */
GENERATE_EXCEPTION_FRAME
/* Call the C handler */
lea rcx, [rsp + KEXCEPTION_FRAME_LENGTH]
lea rdx, [rsp]
call KiNmiInterruptHandler
/* Restore the registers from the KEXCEPTION_FRAME */
RESTORE_EXCEPTION_STATE
/* Return */
ret
ENDFUNC
PUBLIC KiNmiInterrupt
FUNC KiNmiInterrupt
/* Push pseudo error code */
EnterTrap TF_SAVE_ALL
UNIMPLEMENTED KiNmiInterrupt
int 3
call KiNmiInterruptWithEf
/* Return */
ExitTrap TF_SAVE_ALL

View File

@ -84,6 +84,46 @@ KiDpcInterruptHandler(VOID)
KeLowerIrql(OldIrql);
}
VOID
KiNmiInterruptHandler(
_In_ PKTRAP_FRAME TrapFrame,
_In_ PKEXCEPTION_FRAME ExceptionFrame)
{
BOOLEAN ManualSwapGs = FALSE;
/* Check if the NMI came from kernel mode */
if ((TrapFrame->SegCs & MODE_MASK) == 0)
{
/* Check if GS base is already kernel mode. This is needed, because
we might be interrupted during an interrupt/exception from user-mode
before the swapgs instruction. */
if ((LONG64)__readmsr(MSR_GS_BASE) >= 0)
{
/* Swap GS to kernel */
__swapgs();
ManualSwapGs = TRUE;
}
}
/* Check if this is a freeze */
if (KiProcessorFreezeHandler(TrapFrame, ExceptionFrame))
{
/* NMI was handled */
goto Exit;
}
/* Handle the NMI */
KiHandleNmi();
Exit:
/* Check if we need to swap GS back */
if (ManualSwapGs)
{
/* Swap GS back to user */
__swapgs();
}
}
#define MAX_SYSCALL_PARAMS 16
NTSTATUS

View File

@ -727,9 +727,6 @@ KeBugCheckWithTf(IN ULONG BugCheckCode,
PLDR_DATA_TABLE_ENTRY LdrEntry;
PULONG_PTR HardErrorParameters;
KIRQL OldIrql;
#ifdef CONFIG_SMP
LONG i = 0;
#endif
/* Set active bugcheck */
KeBugCheckActive = TRUE;
@ -1083,15 +1080,17 @@ KeBugCheckWithTf(IN ULONG BugCheckCode,
KeBugCheckOwner = Prcb->Number;
/* Freeze the other CPUs */
for (i = 0; i < KeNumberProcessors; i++)
for (ULONG i = 0; i < KeNumberProcessors; i++)
{
if (i != (LONG)KeGetCurrentProcessorNumber())
if (i != Prcb->Number)
{
/* Send the IPI and give them one second to catch up */
KiIpiSend(1 << i, IPI_FREEZE);
KeStallExecutionProcessor(1000000);
/* Send the IPI */
KiIpiSend(AFFINITY_MASK(i), IPI_FREEZE);
}
}
/* Give the other CPUs one second to catch up */
KeStallExecutionProcessor(1000000);
#endif
/* Display the BSOD */

View File

@ -49,7 +49,8 @@ KeFreezeExecution(IN PKTRAP_FRAME TrapFrame,
#endif
#ifdef CONFIG_SMP
// TODO: Add SMP support.
/* Architecture specific freeze code */
KxFreezeExecution();
#endif
/* Save the old IRQL to be restored on unfreeze */
@ -64,7 +65,8 @@ NTAPI
KeThawExecution(IN BOOLEAN Enable)
{
#ifdef CONFIG_SMP
// TODO: Add SMP support.
/* Architecture specific thaw code */
KxThawExecution();
#endif
/* Clear the freeze flag */

37
ntoskrnl/ke/i386/freeze.c Normal file
View File

@ -0,0 +1,37 @@
/*
* PROJECT: ReactOS Kernel
* LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
* PURPOSE: Processor freeze support for i386
* COPYRIGHT:
*/
/* INCLUDES *******************************************************************/
#include <ntoskrnl.h>
#define NDEBUG
#include <debug.h>
VOID
NTAPI
KxFreezeExecution(
VOID)
{
UNIMPLEMENTED;
}
VOID
NTAPI
KxThawExecution(
VOID)
{
UNIMPLEMENTED;
}
KCONTINUE_STATUS
NTAPI
KxSwitchKdProcessor(
_In_ ULONG ProcessorIndex)
{
UNIMPLEMENTED;
return ContinueError;
}

View File

@ -316,6 +316,7 @@ if(ARCH STREQUAL "i386")
${REACTOS_SOURCE_DIR}/ntoskrnl/ke/i386/cpu.c
${REACTOS_SOURCE_DIR}/ntoskrnl/ke/i386/context.c
${REACTOS_SOURCE_DIR}/ntoskrnl/ke/i386/exp.c
${REACTOS_SOURCE_DIR}/ntoskrnl/ke/i386/freeze.c
${REACTOS_SOURCE_DIR}/ntoskrnl/ke/i386/irqobj.c
${REACTOS_SOURCE_DIR}/ntoskrnl/ke/i386/kiinit.c
${REACTOS_SOURCE_DIR}/ntoskrnl/ke/i386/ldt.c
@ -350,6 +351,7 @@ elseif(ARCH STREQUAL "amd64")
${REACTOS_SOURCE_DIR}/ntoskrnl/ke/amd64/context.c
${REACTOS_SOURCE_DIR}/ntoskrnl/ke/amd64/cpu.c
${REACTOS_SOURCE_DIR}/ntoskrnl/ke/amd64/except.c
${REACTOS_SOURCE_DIR}/ntoskrnl/ke/amd64/freeze.c
${REACTOS_SOURCE_DIR}/ntoskrnl/ke/amd64/interrupt.c
${REACTOS_SOURCE_DIR}/ntoskrnl/ke/amd64/ipi.c
${REACTOS_SOURCE_DIR}/ntoskrnl/ke/amd64/irql.c

View File

@ -54,7 +54,12 @@ extern "C" {
#define _CRT_TERMINATE_DEFINED
__declspec(noreturn) void __cdecl exit(_In_ int _Code);
_CRTIMP __declspec(noreturn) void __cdecl _exit(_In_ int _Code);
#if !defined __NO_ISOCEXT /* extern stub in static libmingwex.a */
/* C99 function name */
__declspec(noreturn) void __cdecl _Exit(int); /* Declare to get noreturn attribute. */
__CRT_INLINE void __cdecl _Exit(int status)
{ _exit(status); }
#endif
#if __MINGW_GNUC_PREREQ(4,4)
#pragma push_macro("abort")
#undef abort
@ -62,7 +67,6 @@ extern "C" {
__declspec(noreturn) void __cdecl abort(void);
#if __MINGW_GNUC_PREREQ(4,4)
#pragma pop_macro("abort")
#undef abort
#endif
#endif

View File

@ -300,6 +300,21 @@ typedef enum
#define IPI_PACKET_READY 8
#define IPI_SYNCH_REQUEST 16
//
// Flags for KPRCB::IpiFrozen
//
// Values shown with !ipi extension in WinDbg:
// 0 = [Running], 1 = [Unknown], 2 = [Frozen], 3 = [Thaw], 4 = [Freeze Owner]
// 5 = [Target Freeze], 6-15 = [Unknown]
// 0x20 = [Active] (flag)
//
#define IPI_FROZEN_STATE_RUNNING 0
#define IPI_FROZEN_STATE_FROZEN 2
#define IPI_FROZEN_STATE_THAW 3
#define IPI_FROZEN_STATE_OWNER 4
#define IPI_FROZEN_STATE_TARGET_FREEZE 5
#define IPI_FROZEN_FLAG_ACTIVE 0x20
//
// PRCB Flags
//

View File

@ -120,7 +120,6 @@ typedef struct _SOUND_OVERLAPPED
OVERLAPPED Standard;
struct _SOUND_DEVICE_INSTANCE* SoundDeviceInstance;
PWAVEHDR Header;
BOOL PerformCompletion;
LPOVERLAPPED_COMPLETION_ROUTINE OriginalCompletionRoutine;
PVOID CompletionContext;

View File

@ -240,17 +240,12 @@ list(APPEND CRT_MATH_SOURCE
math/ldiv.c
math/logf.c
math/powf.c
math/rand.c
)
list(APPEND CRT_MATH_ASM_SOURCE
${LIBCNTPR_MATH_ASM_SOURCE}
)
list(APPEND LIBCNTPR_MATH_SOURCE
math/rand_nt.c
)
if(ARCH STREQUAL "i386")
list(APPEND ATAN2_ASM_SOURCE math/i386/atan2_asm.s)
elseif(ARCH STREQUAL "amd64")

View File

@ -1,73 +0,0 @@
/* Copyright (C) 1994 DJ Delorie, see COPYING.DJ for details */
#include <precomp.h>
#include <ntsecapi.h>
#include <internal/tls.h>
/*
* @implemented
*/
int
rand(void)
{
thread_data_t *data = msvcrt_get_thread_data();
/* this is the algorithm used by MSVC, according to
* http://en.wikipedia.org/wiki/List_of_pseudorandom_number_generators */
data->random_seed = data->random_seed * 214013 + 2531011;
return (data->random_seed >> 16) & RAND_MAX;
}
/*
* @implemented
*/
void
srand(unsigned int seed)
{
thread_data_t *data = msvcrt_get_thread_data();
data->random_seed = seed;
}
/*********************************************************************
* rand_s (MSVCRT.@)
*/
int CDECL rand_s(unsigned int *pval)
{
BOOLEAN (WINAPI *pSystemFunction036)(PVOID, ULONG); // RtlGenRandom
HINSTANCE hadvapi32;
if (!pval)
{
_invalid_parameter(NULL,_CRT_WIDE("rand_s"),_CRT_WIDE(__FILE__),__LINE__, 0);
*_errno() = EINVAL;
return EINVAL;
}
*pval = 0;
hadvapi32 = LoadLibraryA("advapi32.dll");
if (!hadvapi32)
{
_invalid_parameter(NULL,_CRT_WIDE("rand_s"),_CRT_WIDE(__FILE__),__LINE__, 0);
*_errno() = EINVAL;
return EINVAL;
}
pSystemFunction036 = (void*)GetProcAddress(hadvapi32, "SystemFunction036");
if (!pSystemFunction036)
{
_invalid_parameter(NULL,_CRT_WIDE("rand_s"),_CRT_WIDE(__FILE__),__LINE__, 0);
*_errno() = EINVAL;
FreeLibrary(hadvapi32);
return EINVAL;
}
if (!pSystemFunction036(pval, sizeof(*pval)))
{
_invalid_parameter(NULL,_CRT_WIDE("rand_s"),_CRT_WIDE(__FILE__),__LINE__, 0);
*_errno() = EINVAL;
FreeLibrary(hadvapi32);
return EINVAL;
}
FreeLibrary(hadvapi32);
return 0;
}

View File

@ -11,6 +11,13 @@ list(APPEND MSVCRTEX_SOURCE
misc/ofmt_stub.c
stdio/acrt_iob_func.c)
if(DLL_EXPORT_VERSION LESS 0x600)
list(APPEND MSVCRTEX_SOURCE
stdlib/_invalid_parameter.c
stdlib/rand_s.c
)
endif()
if(CMAKE_C_COMPILER_ID STREQUAL "Clang")
# Clang performs some optimizations requiring those funtions
list(APPEND MSVCRTEX_SOURCE

View File

@ -0,0 +1,52 @@
/*
* PROJECT: ReactOS CRT library
* LICENSE: MIT (https://spdx.org/licenses/MIT)
* PURPOSE: _invalid_parameter implementation
* COPYRIGHT: Timo Kreuzer <timo.kreuzer@reactos.org>
*/
#include <precomp.h>
#ifdef _MSVCRTEX_
#undef TRACE
#undef ERR
#define TRACE(...)
#define ERR(...)
#endif
static _invalid_parameter_handler invalid_parameter_handler = NULL;
/******************************************************************************
* _invalid_parameter (MSVCRT.@)
*/
void __cdecl _invalid_parameter(const wchar_t *expr, const wchar_t *func,
const wchar_t *file, unsigned int line, uintptr_t arg)
{
if (invalid_parameter_handler) invalid_parameter_handler( expr, func, file, line, arg );
else
{
ERR( "%s:%u %s: %s %lx\n", debugstr_w(file), line, debugstr_w(func), debugstr_w(expr), arg );
#if _MSVCR_VER > 0 // FIXME: possible improvement: use a global variable in the DLL
RaiseException( STATUS_INVALID_CRUNTIME_PARAMETER, EXCEPTION_NONCONTINUABLE, 0, NULL );
#endif
}
}
/* _get_invalid_parameter_handler - not exported in native msvcrt, added in msvcr80 */
_invalid_parameter_handler CDECL _get_invalid_parameter_handler(void)
{
TRACE("\n");
return invalid_parameter_handler;
}
/* _set_invalid_parameter_handler - not exproted in native msvcrt, added in msvcr80 */
_invalid_parameter_handler CDECL _set_invalid_parameter_handler(
_invalid_parameter_handler handler)
{
_invalid_parameter_handler old = invalid_parameter_handler;
TRACE("(%p)\n", handler);
invalid_parameter_handler = handler;
return old;
}

View File

@ -11,8 +11,6 @@
#include <errno.h>
#include <internal/wine/msvcrt.h>
static _invalid_parameter_handler invalid_parameter_handler = NULL;
/*********************************************************************
* _errno (MSVCRT.@)
*/
@ -130,38 +128,3 @@ void CDECL _seterrormode(int mode)
{
SetErrorMode( mode );
}
/******************************************************************************
* _invalid_parameter (MSVCRT.@)
*/
void __cdecl _invalid_parameter(const wchar_t *expr, const wchar_t *func,
const wchar_t *file, unsigned int line, uintptr_t arg)
{
if (invalid_parameter_handler) invalid_parameter_handler( expr, func, file, line, arg );
else
{
ERR( "%s:%u %s: %s %lx\n", debugstr_w(file), line, debugstr_w(func), debugstr_w(expr), arg );
#if _MSVCR_VER > 0 // FIXME: possible improvement: use a global variable in the DLL
RaiseException( STATUS_INVALID_CRUNTIME_PARAMETER, EXCEPTION_NONCONTINUABLE, 0, NULL );
#endif
}
}
/* _get_invalid_parameter_handler - not exported in native msvcrt, added in msvcr80 */
_invalid_parameter_handler CDECL _get_invalid_parameter_handler(void)
{
TRACE("\n");
return invalid_parameter_handler;
}
/* _set_invalid_parameter_handler - not exproted in native msvcrt, added in msvcr80 */
_invalid_parameter_handler CDECL _set_invalid_parameter_handler(
_invalid_parameter_handler handler)
{
_invalid_parameter_handler old = invalid_parameter_handler;
TRACE("(%p)\n", handler);
invalid_parameter_handler = handler;
return old;
}

28
sdk/lib/crt/stdlib/rand.c Normal file
View File

@ -0,0 +1,28 @@
/* Copyright (C) 1994 DJ Delorie, see COPYING.DJ for details */
#include <precomp.h>
#include <ntsecapi.h>
#include <internal/tls.h>
/*
* @implemented
*/
int
rand(void)
{
thread_data_t *data = msvcrt_get_thread_data();
/* this is the algorithm used by MSVC, according to
* http://en.wikipedia.org/wiki/List_of_pseudorandom_number_generators */
data->random_seed = data->random_seed * 214013 + 2531011;
return (data->random_seed >> 16) & RAND_MAX;
}
/*
* @implemented
*/
void
srand(unsigned int seed)
{
thread_data_t *data = msvcrt_get_thread_data();
data->random_seed = seed;
}

View File

@ -0,0 +1,72 @@
/*
* PROJECT: ReactOS CRT library
* LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
* PURPOSE: rand_s implementation
* COPYRIGHT: Copyright 2010 Sylvain Petreolle <spetreolle@yahoo.fr>
* Copyright 2015 Christoph von Wittich <christoph_vw@reactos.org>
* Copyright 2015 Pierre Schweitzer <pierre@reactos.org>
*/
#include <precomp.h>
typedef BOOLEAN (WINAPI *PFN_SystemFunction036)(PVOID, ULONG); // RtlGenRandom
PFN_SystemFunction036 g_pfnSystemFunction036 = NULL;
/*********************************************************************
* rand_s (MSVCRT.@)
*/
int CDECL rand_s(unsigned int *pval)
{
HINSTANCE hadvapi32;
if (!pval)
{
_invalid_parameter(NULL,_CRT_WIDE("rand_s"),_CRT_WIDE(__FILE__),__LINE__, 0);
*_errno() = EINVAL;
return EINVAL;
}
*pval = 0;
if (g_pfnSystemFunction036 == NULL)
{
PFN_SystemFunction036 pSystemFunction036;
hadvapi32 = LoadLibraryA("advapi32.dll");
if (!hadvapi32)
{
_invalid_parameter(NULL,_CRT_WIDE("rand_s"),_CRT_WIDE(__FILE__),__LINE__, 0);
*_errno() = EINVAL;
return EINVAL;
}
pSystemFunction036 = (void*)GetProcAddress(hadvapi32, "SystemFunction036");
if (!pSystemFunction036)
{
_invalid_parameter(NULL,_CRT_WIDE("rand_s"),_CRT_WIDE(__FILE__),__LINE__, 0);
*_errno() = EINVAL;
FreeLibrary(hadvapi32);
return EINVAL;
}
g_pfnSystemFunction036 = pSystemFunction036;
}
if (!g_pfnSystemFunction036(pval, sizeof(*pval)))
{
_invalid_parameter(NULL,_CRT_WIDE("rand_s"),_CRT_WIDE(__FILE__),__LINE__, 0);
*_errno() = EINVAL;
return EINVAL;
}
return 0;
}
// Small hack: import stub to allow GCC's stdc++ to link
#if defined(__GNUC__) && (DLL_EXPORT_VERSION < 0x600)
#ifdef WIN64
const void* __imp_rand_s = rand_s;
#else
const void* _imp_rand_s = rand_s;
#endif
#endif

View File

@ -1,11 +1,17 @@
list(APPEND LIBCNTPR_STDLIB_SOURCE
list(APPEND COMMON_STDLIB_SOURCE
stdlib/qsort.c
)
list(APPEND LIBCNTPR_STDLIB_SOURCE
${COMMON_STDLIB_SOURCE}
stdlib/rand_nt.c
)
list(APPEND CRT_STDLIB_SOURCE
${LIBCNTPR_STDLIB_SOURCE}
${COMMON_STDLIB_SOURCE}
stdlib/_exit.c
stdlib/_invalid_parameter.c
stdlib/_set_abort_behavior.c
stdlib/abort.c
stdlib/atexit.c
@ -22,6 +28,8 @@ list(APPEND CRT_STDLIB_SOURCE
stdlib/mbstowcs.c
stdlib/obsol.c
stdlib/putenv.c
stdlib/rand.c
stdlib/rand_s.c
stdlib/rot.c
stdlib/senv.c
stdlib/swab.c

View File

@ -26,7 +26,7 @@ Unsupported MME messages:
* Any not mentioned above
Notes/Bugs:
* WHDR_BEGINLOOP and WHDR_ENDLOOP are ignored
* WHDR_BEGINLOOP and WHDR_ENDLOOP are not working for looping multiple wave headers, only for a single header.
* Not possible to pause/restart playback

View File

@ -10,7 +10,6 @@
#include "precomp.h"
/*
DoWaveStreaming
Check if there is streaming to be done, and if so, do it.
@ -54,6 +53,22 @@ DoWaveStreaming(
return;
}
/* Do we need to loop a header? */
if (DeviceType == WAVE_OUT_DEVICE_TYPE && (Header->dwFlags & WHDR_BEGINLOOP))
{
if ((Header->dwFlags & WHDR_ENDLOOP))
{
/* Get loop count */
SoundDeviceInstance->LoopsRemaining = Header->dwLoops;
}
else
{
/* Report and help notice such a case */
SND_WARN(L"Looping multiple headers is UNIMPLEMENTED. Will play once only\n");
SND_ASSERT((Header->dwFlags & (WHDR_BEGINLOOP | WHDR_ENDLOOP)) == (WHDR_BEGINLOOP | WHDR_ENDLOOP));
}
}
while ( ( SoundDeviceInstance->OutstandingBuffers < SoundDeviceInstance->BufferCount ) &&
( Header ) && SoundDeviceInstance->ResetInProgress == FALSE)
{
@ -106,10 +121,6 @@ DoWaveStreaming(
Overlap->SoundDeviceInstance = SoundDeviceInstance;
Overlap->Header = Header;
/* Don't complete this header if it's part of a loop */
Overlap->PerformCompletion = TRUE;
// ( SoundDeviceInstance->LoopsRemaining > 0 );
/* Adjust the commit-related counters */
HeaderExtension->BytesCommitted += BytesToCommit;
++ SoundDeviceInstance->OutstandingBuffers;
@ -189,8 +200,8 @@ CompleteIO(
-- SoundDeviceInstance->OutstandingBuffers;
/* Did we finish a WAVEHDR and aren't looping? */
if ( HdrExtension->BytesCompleted + dwNumberOfBytesTransferred >= WaveHdr->dwBufferLength &&
SoundOverlapped->PerformCompletion )
if (HdrExtension->BytesCompleted + dwNumberOfBytesTransferred >= WaveHdr->dwBufferLength &&
SoundDeviceInstance->LoopsRemaining == 0)
{
/* Wave buffer fully completed */
Bytes = WaveHdr->dwBufferLength - HdrExtension->BytesCompleted;
@ -203,9 +214,24 @@ CompleteIO(
}
else
{
/* Partially completed */
HdrExtension->BytesCompleted += dwNumberOfBytesTransferred;
SND_TRACE(L"%d/%d bytes of wavehdr completed\n", HdrExtension->BytesCompleted, WaveHdr->dwBufferLength);
/* Do we loop a header? */
if (HdrExtension->BytesCommitted == WaveHdr->dwBufferLength &&
SoundDeviceInstance->LoopsRemaining != 0)
{
/* Reset amount of bytes and decrement loop count, to play next iteration */
HdrExtension->BytesCommitted = 0;
if (SoundDeviceInstance->LoopsRemaining != INFINITE)
--SoundDeviceInstance->LoopsRemaining;
SND_TRACE(L"Looping the header, remaining loops %u\n", SoundDeviceInstance->LoopsRemaining);
}
else
{
/* Partially completed */
HdrExtension->BytesCompleted += dwNumberOfBytesTransferred;
SND_TRACE(L"%u/%u bytes of wavehdr completed\n", HdrExtension->BytesCompleted, WaveHdr->dwBufferLength);
}
break;
}

View File

@ -1205,7 +1205,7 @@ ElfReadRecord(
NTSTATUS Status;
LARGE_INTEGER FileOffset;
ULONG RecOffset;
SIZE_T RecSize;
ULONG RecSize;
SIZE_T ReadLength;
ASSERT(LogFile);

View File

@ -261,18 +261,20 @@ BOOL UserSetCursorPos( INT x, INT y, DWORD flags, ULONG_PTR dwExtraInfo, BOOL Ho
if (y >= rcClip.bottom) y = rcClip.bottom - 1;
if (y < rcClip.top) y = rcClip.top;
/* Nothing to do if position did not actually change */
if (x == gpsi->ptCursor.x && y == gpsi->ptCursor.y)
return TRUE;
pt.x = x;
pt.y = y;
if ((gpsi->ptCursor.x != x) || (gpsi->ptCursor.y != y))
{
/* 1. Generate a mouse move message, this sets the htEx and Track Window too. */
Msg.message = WM_MOUSEMOVE;
Msg.wParam = UserGetMouseButtonsState();
Msg.lParam = MAKELPARAM(x, y);
Msg.pt = pt;
co_MsqInsertMouseMessage(&Msg, flags, dwExtraInfo, Hook);
}
/* 1. Generate a mouse move message, this sets the htEx and Track Window too */
Msg.message = WM_MOUSEMOVE;
Msg.wParam = UserGetMouseButtonsState();
Msg.lParam = MAKELPARAM(x, y);
Msg.pt = pt;
co_MsqInsertMouseMessage(&Msg, flags, dwExtraInfo, Hook);
/* 2. Store the new cursor position */
gpsi->ptCursor = pt;

View File

@ -341,6 +341,9 @@ IntDeactivateWindow(PTHREADINFO pti, HANDLE tid)
UserDerefObjectCo(pwndFocus);
}
/* Check for keyboard modifiers and release them (CORE-14768) */
MsqReleaseModifierKeys(pti->MessageQueue);
if (InAAPM) pti->TIF_flags &= ~TIF_INACTIVATEAPPMSG;
if (ptiCurrent != pti)
{

View File

@ -2530,6 +2530,21 @@ MsqSetStateWindow(PTHREADINFO pti, ULONG Type, HWND hWnd)
return NULL;
}
VOID FASTCALL
MsqReleaseModifierKeys(PUSER_MESSAGE_QUEUE MessageQueue)
{
WORD ModifierKeys[] = { VK_LCONTROL, VK_RCONTROL, VK_CONTROL,
VK_LMENU, VK_RMENU, VK_MENU,
VK_LSHIFT, VK_RSHIFT, VK_SHIFT };
UINT i;
for (i = 0; i < _countof(ModifierKeys); ++i)
{
if (IS_KEY_DOWN(MessageQueue->afKeyState, ModifierKeys[i]))
SET_KEY_DOWN(MessageQueue->afKeyState, ModifierKeys[i], FALSE);
}
}
SHORT
APIENTRY
NtUserGetKeyState(INT key)

View File

@ -288,4 +288,7 @@ co_IntWaitMessage( PWND Window,
UINT MsgFilterMin,
UINT MsgFilterMax );
VOID FASTCALL
MsqReleaseModifierKeys(PUSER_MESSAGE_QUEUE MessageQueue);
/* EOF */