Index: include/reactos/subsys/win/basemsg.h =================================================================== --- include/reactos/subsys/win/basemsg.h (revision 60201) +++ include/reactos/subsys/win/basemsg.h (working copy) @@ -22,7 +22,7 @@ BasepCreateThread, BasepGetTempFile, BasepExitProcess, - BasepDebugProcess, + BasepDebugProcessOld, BasepCheckVDM, BasepUpdateVDMEntry, BasepGetNextVDMCommand, @@ -46,8 +46,9 @@ BasepNlsUpdateCacheCount, BasepSetTermsrvClientTimeZone, BasepSxsCreateActivationContext, - BasepUnknown, + BasepDebugProcess, BasepRegisterThread, + BasepCheckApplicationCompatibility, BasepNlsGetUserInfo, BasepMaxApiNumber @@ -72,7 +73,7 @@ { ULONG Flags; ULONG ProcessParameterFlags; - HANDLE FileHandle; + HANDLE FileHandle; UNICODE_STRING SxsWin32ExePath; UNICODE_STRING SxsNtExePath; SIZE_T OverrideManifestOffset; Index: include/reactos/subsys/win/conmsg.h =================================================================== --- include/reactos/subsys/win/conmsg.h (revision 60201) +++ include/reactos/subsys/win/conmsg.h (working copy) @@ -159,8 +159,8 @@ typedef struct _CONSOLE_START_INFO { INT IconIndex; - HICON IconHandle1; - HICON IconHandle2; + HICON hIcon; + HICON hSmIcon; DWORD dwHotKey; DWORD dwStartupFlags; CONSOLE_PROPERTIES; @@ -185,13 +185,14 @@ HANDLE InputHandle; HANDLE OutputHandle; HANDLE ErrorHandle; - HANDLE Event1; - HANDLE Event2; + HANDLE Events[2]; /* Adapted from CONSOLE_ALLOCCONSOLE */ CONSOLE_START_INFO ConsoleStartInfo; } CONSRV_API_CONNECTINFO, *PCONSRV_API_CONNECTINFO; +#ifndef _WIN64 C_ASSERT(sizeof(CONSRV_API_CONNECTINFO) == 0x638); +#endif typedef struct { Index: subsystems/win32/csrsrv/api.c =================================================================== --- subsystems/win32/csrsrv/api.c (revision 60201) +++ subsystems/win32/csrsrv/api.c (working copy) @@ -159,22 +159,6 @@ /* Reference the Process */ CsrLockedReferenceProcess(CsrProcess); - /* Release the lock */ - CsrReleaseProcessLock(); - - /* Duplicate the Object Directory */ - Status = NtDuplicateObject(NtCurrentProcess(), - CsrObjectDirectory, - CsrProcess->ProcessHandle, - &ConnectInfo->ObjectDirectory, - 0, - 0, - DUPLICATE_SAME_ACCESS | - DUPLICATE_SAME_ATTRIBUTES); - - /* Acquire the lock */ - CsrAcquireProcessLock(); - /* Check for success */ if (NT_SUCCESS(Status)) { @@ -1057,7 +1041,7 @@ { Connected = FALSE; } _SEH2_END; - + if (!Connected) { DPRINT1("CSRSS: CsrConnectToUser failed\n"); Index: subsystems/win32/csrsrv/srv.h =================================================================== --- subsystems/win32/csrsrv/srv.h (revision 60201) +++ subsystems/win32/csrsrv/srv.h (working copy) @@ -49,7 +49,7 @@ #define SESSION_ROOT L"\\Sessions" #define GLOBAL_ROOT L"\\GLOBAL??" #define SYMLINK_NAME L"SymbolicLink" -#define SB_PORT_NAME L"SbAbiPort" +#define SB_PORT_NAME L"SbApiPort" #define CSR_PORT_NAME L"ApiPort" #define UNICODE_PATH_SEP L"\\" Index: subsystems/win/basesrv/api.h =================================================================== --- subsystems/win/basesrv/api.h (revision 60201) +++ subsystems/win/basesrv/api.h (working copy) @@ -8,6 +8,9 @@ #pragma once +/* appcompat.c */ +CSR_API(BaseSrvCheckApplicationCompatibility); + /* dosdev.c */ VOID BaseInitDefineDosDevice(VOID); VOID BaseCleanupDefineDosDevice(VOID); Index: subsystems/win/basesrv/appcompat.c =================================================================== --- subsystems/win/basesrv/appcompat.c (revision 0) +++ subsystems/win/basesrv/appcompat.c (working copy) @@ -0,0 +1,62 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS Base API Server DLL + * FILE: subsystems/win/basesrv/init.c + * PURPOSE: Initialization + * PROGRAMMERS: Timo Kreuzer (timo.kreuzer@reactos.org) + */ + +/* INCLUDES *******************************************************************/ + +#include "basesrv.h" +#include "api.h" + +#define NDEBUG +#include + +typedef struct _BASE_APP_COMPAT_EXTRA1 +{ + WCHAR String1[32]; + ULONG tdwFlags; + ULONG SizeOfStruct; + ULONG tdwMagic; + ULONG ttrExe; + ULONG dword50; + ULONG dword54; + ULONG dword58; + PVOID ttrLayer; + CHAR String2[28]; + ULONG dword7C; + ULONG dword80; + ULONG field_84; + CHAR String3[256]; +} BASE_APP_COMPAT_EXTRA1, *PBASE_APP_COMPAT_EXTRA1; + +typedef struct _BASE_APP_COMPAT_DATA +{ + UNICODE_STRING FileName; + HANDLE ProcessHandle; + ULONG Flags; + USHORT Code; + USHORT Unknown_012; + PVOID Environment; + ULONG EnvironmentSize; + PBASE_APP_COMPAT_EXTRA1 AppCompExtra1; + ULONG AppCompExtra1Size; + PVOID AppCompExtra2; + ULONG AppCompExtra2Size; + BOOL CheckRunAppResult; + ULONG Flags2; +} BASE_APP_COMPAT_DATA, *PBASE_APP_COMPAT_DATA; + + +CSR_API(BaseSrvCheckApplicationCompatibility) +{ + PBASE_APP_COMPAT_DATA AppCompatData = (PBASE_APP_COMPAT_DATA)&ApiMessage->Data; + DPRINT("BASESRV: BaseSrvCheckApplicationCompatibility(%wZ)\n", + AppCompatData->FileName); + + AppCompatData->CheckRunAppResult = FALSE; + + return STATUS_SUCCESS; +} Index: subsystems/win/basesrv/basesrv.h =================================================================== --- subsystems/win/basesrv/basesrv.h (revision 60201) +++ subsystems/win/basesrv/basesrv.h (working copy) @@ -39,14 +39,14 @@ } BASESRV_KERNEL_IMPORTS, *PBASESRV_KERNEL_IMPORTS; /* FIXME: BASENLS.H */ -typedef NTSTATUS(*WINAPI POPEN_DATA_FILE)(HANDLE hFile, +typedef NTSTATUS (WINAPI *POPEN_DATA_FILE)(HANDLE hFile, PWCHAR FileName); -typedef BOOL(*WINAPI PGET_CP_FILE_NAME_FROM_REGISTRY)(UINT CodePage, +typedef BOOL (WINAPI *PGET_CP_FILE_NAME_FROM_REGISTRY)(UINT CodePage, LPWSTR FileName, ULONG FileNameSize); -typedef BOOL(*WINAPI PGET_NLS_SECTION_NAME)(UINT CodePage, +typedef BOOL (WINAPI *PGET_NLS_SECTION_NAME)(UINT CodePage, UINT Base, ULONG Unknown, LPWSTR BaseName, @@ -53,8 +53,8 @@ LPWSTR Result, ULONG ResultSize); -typedef BOOL(*WINAPI PVALIDATE_LOCALE)(IN ULONG LocaleId); -typedef NTSTATUS(*WINAPI PCREATE_NLS_SECURTY_DESCRIPTOR)(IN PVOID Buffer, +typedef BOOL (WINAPI *PVALIDATE_LOCALE)(IN ULONG LocaleId); +typedef NTSTATUS (WINAPI *PCREATE_NLS_SECURTY_DESCRIPTOR)(IN PVOID Buffer, IN ULONG BufferSize, IN ULONG AceType); @@ -63,6 +63,18 @@ extern HANDLE BaseSrvSharedHeap; extern PBASE_STATIC_SERVER_DATA BaseStaticServerData; +NTSTATUS +NTAPI +BaseSrvNlsConnect( + PCSR_PROCESS CsrProcess, + PVOID ConnectionInfo, + PULONG ConnectionInfoLength); + +NTSTATUS +NTAPI +BaseSrvCleanupVDMResources( + PCSR_PROCESS CsrProcess); + #endif // __BASESRV_H__ /* EOF */ Index: subsystems/win/basesrv/CMakeLists.txt =================================================================== --- subsystems/win/basesrv/CMakeLists.txt (revision 60201) +++ subsystems/win/basesrv/CMakeLists.txt (working copy) @@ -1,9 +1,10 @@ include_directories(${REACTOS_SOURCE_DIR}/include/reactos/subsys) -spec2def(basesrv.dll basesrv.spec) +spec2def(basesrv.dll basesrv.spec ADD_IMPORTLIB) list(APPEND SOURCE + appcompat.c dosdev.c init.c proc.c Index: subsystems/win/basesrv/dosdev.c =================================================================== --- subsystems/win/basesrv/dosdev.c (revision 60201) +++ subsystems/win/basesrv/dosdev.c (working copy) @@ -169,7 +169,7 @@ Status == STATUS_BUFFER_TOO_SMALL) { LinkTarget.Length = 0; - LinkTarget.MaximumLength = Length; + LinkTarget.MaximumLength = (USHORT)Length; LinkTarget.Buffer = (PWSTR) RtlAllocateHeap(BaseSrvHeap, HEAP_ZERO_MEMORY, Index: subsystems/win/basesrv/init.c =================================================================== --- subsystems/win/basesrv/init.c (revision 60201) +++ subsystems/win/basesrv/init.c (working copy) @@ -57,8 +57,9 @@ BaseSrvNlsUpdateCacheCount, BaseSrvSetTermsrvClientTimeZone, BaseSrvSxsCreateActivationContext, - BaseSrvUnknown, + BaseSrvDebugProcess, BaseSrvRegisterThread, + BaseSrvCheckApplicationCompatibility, BaseSrvNlsGetUserInfo, }; @@ -92,46 +93,49 @@ TRUE, // BaseSrvNlsUpdateCacheCount TRUE, // BaseSrvSetTermsrvClientTimeZone TRUE, // BaseSrvSxsCreateActivationContext - TRUE, // BaseSrvUnknown + TRUE, // BaseSrvDebugProcess TRUE, // BaseSrvRegisterThread + TRUE, // BaseSrvCheckApplicationCompatibility TRUE, // BaseSrvNlsGetUserInfo }; PCHAR BaseServerApiNameTable[BasepMaxApiNumber - BASESRV_FIRST_API_NUMBER] = { - "BaseCreateProcess", - "BaseCreateThread", - "BaseGetTempFile", - "BaseExitProcess", - "BaseDebugProcess", - "BaseCheckVDM", - "BaseUpdateVDMEntry", - "BaseGetNextVDMCommand", - "BaseExitVDM", - "BaseIsFirstVDM", - "BaseGetVDMExitCode", - "BaseSetReenterCount", - "BaseSetProcessShutdownParam", - "BaseGetProcessShutdownParam", - "BaseNlsSetUserInfo", - "BaseNlsSetMultipleUserInfo", - "BaseNlsCreateSection", - "BaseSetVDMCurDirs", - "BaseGetVDMCurDirs", - "BaseBatNotification", - "BaseRegisterWowExec", - "BaseSoundSentryNotification", - "BaseRefreshIniFileMapping", - "BaseDefineDosDevice", - "BaseSetTermsrvAppInstallMode", - "BaseNlsUpdateCacheCount", - "BaseSetTermsrvClientTimeZone", - "BaseSxsCreateActivationContext", - "BaseUnknown", - "BaseRegisterThread", - "BaseNlsGetUserInfo", + "BaseSrvCreateProcess", + "BaseSrvCreateThread", + "BaseSrvGetTempFile", + "BaseSrvExitProcess", + "BaseSrvDebugProcess", + "BaseSrvCheckVDM", + "BaseSrvUpdateVDMEntry", + "BaseSrvGetNextVDMCommand", + "BaseSrvExitVDM", + "BaseSrvIsFirstVDM", + "BaseSrvGetVDMExitCode", + "BaseSrvSetReenterCount", + "BaseSrvSetProcessShutdownParam", + "BaseSrvGetProcessShutdownParam", + "BaseSrvNlsSetUserInfo", + "BaseSrvNlsSetMultipleUserInfo", + "BaseSrvNlsCreateSection", + "BaseSrvSetVDMCurDirs", + "BaseSrvGetVDMCurDirs", + "BaseSrvBatNotification", + "BaseSrvRegisterWowExec", + "BaseSrvSoundSentryNotification", + "BaseSrvRefreshIniFileMapping", + "BaseSrvDefineDosDevice", + "BaseSrvSetTermsrvAppInstallMode", + "BaseSrvNlsUpdateCacheCount", + "BaseSrvSetTermsrvClientTimeZone", + "BaseSrvSxsCreateActivationContext", + "BaseSrvDebugProcess", + "BaseSrvRegisterThread", + "BaseSrvCheckApplicationCompatibility", + "BaseSrvNlsGetUserInfo", }; + /* FUNCTIONS ******************************************************************/ NTSTATUS @@ -329,13 +333,13 @@ /* Create the base directory */ Buffer[SystemRootString.Length / sizeof(WCHAR)] = UNICODE_NULL; Success = RtlCreateUnicodeString(&BaseSrvWindowsDirectory, - SystemRootString.Buffer); + SystemRootString.Buffer); ASSERT(Success); /* Create the system directory */ wcscat(SystemRootString.Buffer, L"\\System32"); Success = RtlCreateUnicodeString(&BaseSrvWindowsSystemDirectory, - SystemRootString.Buffer); + SystemRootString.Buffer); ASSERT(Success); /* Create the kernel32 path */ @@ -560,6 +564,32 @@ LoadedServerDll->SharedSection = BaseStaticServerData; } +NTSTATUS +NTAPI +BaseClientConnectRoutine ( + _In_ PCSR_PROCESS CsrProcess, + _Inout_ PVOID ConnectionInfo, + _Inout_ PULONG ConnectionInfoLength) +{ + /* Check parameter */ + if (*ConnectionInfoLength != 4) + { + return STATUS_INVALID_PARAMETER; + } + + /* Do the NLS connection */ + return BaseSrvNlsConnect(CsrProcess, ConnectionInfo, ConnectionInfoLength); +} + +NTSTATUS +NTAPI +BaseClientDisconnectRoutine ( + _In_ PCSR_PROCESS CsrProcess) +{ + /* Cleanup VDM resources */ + return BaseSrvCleanupVDMResources(CsrProcess); +} + CSR_SERVER_DLL_INIT(ServerDllInitialization) { /* Setup the DLL Object */ @@ -569,8 +599,8 @@ LoadedServerDll->ValidTable = BaseServerApiServerValidTable; LoadedServerDll->NameTable = BaseServerApiNameTable; LoadedServerDll->SizeOfProcessData = 0; - LoadedServerDll->ConnectCallback = NULL; - LoadedServerDll->DisconnectCallback = NULL; + LoadedServerDll->ConnectCallback = BaseClientConnectRoutine; + LoadedServerDll->DisconnectCallback = BaseClientDisconnectRoutine; LoadedServerDll->ShutdownProcessCallback = NULL; BaseSrvDllInstance = LoadedServerDll->ServerHandle; Index: subsystems/win/basesrv/nls.c =================================================================== --- subsystems/win/basesrv/nls.c (revision 60201) +++ subsystems/win/basesrv/nls.c (working copy) @@ -49,7 +49,7 @@ /* FUNCTIONS *****************************************************************/ -NTSTATUS +NTSTATUS NTAPI BaseSrvDelayLoadKernel32(VOID) { @@ -128,6 +128,18 @@ NtQueryDefaultLocale(0, &pNlsRegUserInfo->UserLocaleId); } +NTSTATUS +NTAPI +BaseSrvNlsConnect( + PCSR_PROCESS CsrProcess, + PVOID ConnectionInfo, + PULONG ConnectionInfoLength) +{ + /* Does nothing */ + return STATUS_SUCCESS; +} + + /* PUBLIC SERVER APIS *********************************************************/ CSR_API(BaseSrvNlsSetUserInfo) Index: subsystems/win/basesrv/vdm.c =================================================================== --- subsystems/win/basesrv/vdm.c (revision 60201) +++ subsystems/win/basesrv/vdm.c (working copy) @@ -13,6 +13,14 @@ #define NDEBUG #include +NTSTATUS +NTAPI +BaseSrvCleanupVDMResources(PCSR_PROCESS CsrProcess) +{ + UNIMPLEMENTED; + return STATUS_SUCCESS; +} + /* PUBLIC SERVER APIS *********************************************************/ CSR_API(BaseSrvCheckVDM) Index: win32ss/user/winsrv/CMakeLists.txt =================================================================== --- win32ss/user/winsrv/CMakeLists.txt (revision 60201) +++ win32ss/user/winsrv/CMakeLists.txt (working copy) @@ -27,7 +27,7 @@ target_link_libraries(winsrv win32ksys libcntpr ${PSEH_LIB} ${CONSRV_TARGET_LINK_LIBS}) add_delay_importlibs(winsrv advapi32 gdi32 user32 ${CONSRV_DELAY_IMPORT_LIBS}) -add_importlibs(winsrv csrsrv kernel32 ntdll ${CONSRV_IMPORT_LIBS}) +add_importlibs(winsrv csrsrv basesrv kernel32 ntdll ${CONSRV_IMPORT_LIBS}) add_dependencies(winsrv bugcodes) add_cd_file(TARGET winsrv DESTINATION reactos/system32 FOR all) Index: win32ss/user/winsrv/usersrv/init.c =================================================================== --- win32ss/user/winsrv/usersrv/init.c (revision 60201) +++ win32ss/user/winsrv/usersrv/init.c (working copy) @@ -18,6 +18,12 @@ /* GLOBALS ********************************************************************/ HINSTANCE UserServerDllInstance = NULL; +HANDLE WinSrvApiPort; +ULONG gSessionId; +BOOL gLUIDDeviceMapsEnabled; +USHORT gDispatchTableValues[2] = {663, 2123}; +HANDLE ghPowerRequestEvent; +HANDLE ghMediaRequestEvent; /* Memory */ HANDLE UserServerHeap = NULL; // Our own heap. @@ -95,11 +101,11 @@ LARGE_INTEGER Offset; SIZE_T ViewSize; CHAR IVTAndBda[1024+256]; - + /* Free the 1MB pre-reserved region. In reality, ReactOS should simply support us mapping the view into the reserved area, but it doesn't. */ BaseAddress = 0; ViewSize = 1024 * 1024; - Status = ZwFreeVirtualMemory(NtCurrentProcess(), + Status = ZwFreeVirtualMemory(NtCurrentProcess(), &BaseAddress, &ViewSize, MEM_RELEASE); @@ -108,7 +114,7 @@ DPRINT1("Couldn't unmap reserved memory (%x)\n", Status); return 0; } - + /* Open the physical memory section */ InitializeObjectAttributes(&ObjectAttributes, &PhysMemName, @@ -269,6 +275,128 @@ return STATUS_NOT_IMPLEMENTED; } +NTSTATUS +NTAPI +UserClientConnect ( + _Inout_ PCSR_PROCESS CsrProcess, + _In_ PVOID ConnectionInfo, + _In_ PULONG ConnectionInfoSize) +{ + PUSERCONNECT UserConnectionInfo = ConnectionInfo; + NTSTATUS Status; + DPRINT("UserClientConnect()\n"); + + /* Check if we don't have an API port yet */ + if (WinSrvApiPort == NULL) + { + /* Query the API port and save it globally */ + WinSrvApiPort = CsrQueryApiPort(); + + /* Inform win32k about the API port */ + Status = NtUserSetInformationThread(NtCurrentThread(), + UserThreadCsrApiPort, + &WinSrvApiPort, + sizeof(WinSrvApiPort)); + if (!NT_SUCCESS(Status)) + { + return Status; + } + } + + /* Check parameter */ + if (*ConnectionInfoSize != sizeof(USERCONNECT)) + { + return STATUS_INVALID_PARAMETER; + } + + /* Pass the request to win32k */ + UserConnectionInfo->dwDispatchCount = gDispatchTableValues[0]; + Status = NtUserProcessConnect(CsrProcess->ProcessHandle, + UserConnectionInfo, + *ConnectionInfoSize); + + return Status; +} + +ULONG // Should be NTSTATUS, but PTHREAD_START_ROUTINE is defined that way... +NTAPI +TerminalServerRequestThread ( + PVOID Parameter) +{ + UNIMPLEMENTED; + return STATUS_SUCCESS; +} + +ULONG +NTAPI +UserClientShutdown ( + _In_ PCSR_PROCESS CsrProcess, + _In_ ULONG Flags, + _In_ BOOLEAN FirstPhase) +{ + UNIMPLEMENTED; + return 0; +} + +NTSTATUS +NTAPI +WinStationAPIInit ( + VOID) +{ + CLIENT_ID ClientId; + HANDLE ThreadHandle; + LONG ThreadPriority; + ULONG Enabled; + NTSTATUS Status; + + /* Save the session id in a global variable */ + gSessionId = NtCurrentTeb()->ProcessEnvironmentBlock->SessionId; + + /* Query LUID Device Maps information */ + Status = NtQueryInformationProcess(NtCurrentProcess(), + ProcessLUIDDeviceMapsEnabled, + &Enabled, + sizeof(Enabled), + NULL); + if (NT_SUCCESS(Status)) + gLUIDDeviceMapsEnabled = Enabled; + + /* Create the terminal server request thread */ + Status = RtlCreateUserThread(NtCurrentProcess(), + NULL, + TRUE, + 0, + 0, + 0, + TerminalServerRequestThread, + NULL, + &ThreadHandle, + &ClientId); + if (!NT_SUCCESS(Status)) + { + return Status; + } + + /* Register the thread with CSR */ + CsrAddStaticServerThread(ThreadHandle, &ClientId, 0); + + /* Set the server thread priority to highest */ + ThreadPriority = THREAD_PRIORITY_HIGHEST; + Status = NtSetInformationThread(ThreadHandle, + ThreadBasePriority, + &ThreadPriority, + 4); + if (!NT_SUCCESS(Status)) + { + return Status; + } + + /* Now start the server thread */ + NtResumeThread(ThreadHandle, 0); + + return Status; +} + CSR_SERVER_DLL_INIT(UserServerDllInitialization) { /*** From win32csr... ***/ @@ -293,9 +421,10 @@ LoadedServerDll->ValidTable = UserServerApiServerValidTable; LoadedServerDll->NameTable = UserServerApiNameTable; LoadedServerDll->SizeOfProcessData = 0; - LoadedServerDll->ConnectCallback = NULL; + LoadedServerDll->ConnectCallback = UserClientConnect; LoadedServerDll->DisconnectCallback = NULL; LoadedServerDll->HardErrorCallback = UserServerHardError; + LoadedServerDll->ShutdownProcessCallback = UserClientShutdown; LoadedServerDll->ShutdownProcessCallback = NULL; UserServerDllInstance = LoadedServerDll->ServerHandle; @@ -318,6 +447,54 @@ } /*** END - From win32csr... ***/ + /* Create the power request event */ + Status = NtCreateEvent(&ghPowerRequestEvent, + EVENT_ALL_ACCESS, + NULL, + SynchronizationEvent, + FALSE); + if (!NT_SUCCESS(Status)) + { + return Status; + } + + /* Create the media request event */ + Status = NtCreateEvent(&ghMediaRequestEvent, + EVENT_ALL_ACCESS, + NULL, + SynchronizationEvent, + FALSE); + if (!NT_SUCCESS(Status)) + { + return Status; + } + + /* Set the create notify routine */ + BaseSetProcessCreateNotify(NtUserNotifyProcessCreate); + + /* Initialize the kernel mode subsystem */ + Status = NtUserInitialize(0x50000, + ghPowerRequestEvent, + ghMediaRequestEvent); + if (!NT_SUCCESS(Status)) + { + return Status; + } + + /* Check if this is a terminal server */ + if (SharedUserData->SuiteMask & VER_SUITE_TERMINAL) + { + /* Enable ExitWindowsEx API */ + UserServerApiServerValidTable[UserpExitWindowsEx - USERSRV_FIRST_API_NUMBER] = TRUE; + + /* Do additional windowstation init */ + Status = WinStationAPIInit(); + if (!NT_SUCCESS(Status)) + { + return Status; + } + } + /* All done */ return STATUS_SUCCESS; } Index: win32ss/user/winsrv/usersrv/usersrv.h =================================================================== --- win32ss/user/winsrv/usersrv/usersrv.h (revision 60201) +++ win32ss/user/winsrv/usersrv/usersrv.h (working copy) @@ -29,6 +29,7 @@ #include #include #include +#include /* Public Win32K Headers */ #include @@ -45,6 +46,9 @@ /* USER Headers */ #include +/* BASESRV Header */ +#include + /* Public Win32 Headers */ #include