Author: ion Date: Mon Feb 6 18:57:18 2012 New Revision: 55467
URL: http://svn.reactos.org/svn/reactos?rev=55467&view=rev Log: [SMSS2]: Implement SmpTranslateSystemPartitionInformation which sets a few last registry keys as part of the initialization process. [SMSS2]: Implement SmpLoadSubsystemsForMuSession which correctly creates a session, loads win32k.sys inside of it, and then detaches from the session. Winlogon.exe is set as the initial command (but not launched), and CSRSS is fake-started. [CSRSRV]: No longer start win32k.sys, that's not your job. [SMSS2]: Kill most debug prints that aren't errors.
Modified: trunk/reactos/base/system/smss2/sminit.c trunk/reactos/base/system/smss2/smss.c trunk/reactos/base/system/smss2/smss.h trunk/reactos/base/system/smss2/smsubsys.c trunk/reactos/subsystems/win32/csrss/csrsrv/init.c
Modified: trunk/reactos/base/system/smss2/sminit.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/system/smss2/sminit.c?... ============================================================================== --- trunk/reactos/base/system/smss2/sminit.c [iso-8859-1] (original) +++ trunk/reactos/base/system/smss2/sminit.c [iso-8859-1] Mon Feb 6 18:57:18 2012 @@ -13,14 +13,6 @@ #include "debug.h"
/* GLOBALS ********************************************************************/ - -typedef struct _SMP_REGISTRY_VALUE -{ - LIST_ENTRY Entry; - UNICODE_STRING Name; - UNICODE_STRING Value; - PCHAR AnsiValue; -} SMP_REGISTRY_VALUE, *PSMP_REGISTRY_VALUE;
UNICODE_STRING SmpSubsystemName, PosixName, Os2Name; LIST_ENTRY SmpBootExecuteList, SmpSetupExecuteList, SmpPagingFileList; @@ -244,7 +236,7 @@
/* Recreate the security descriptors to take into account security mode */ SmpCreateSecurityDescriptors(FALSE); - DPRINT1("SmpProtectionMode: %d\n", SmpProtectionMode); + DPRINT("SmpProtectionMode: %d\n", SmpProtectionMode); return STATUS_SUCCESS; }
@@ -269,7 +261,7 @@ SmpAllowProtectedRenames = 0; }
- DPRINT1("SmpAllowProtectedRenames: %d\n", SmpAllowProtectedRenames); + DPRINT("SmpAllowProtectedRenames: %d\n", SmpAllowProtectedRenames); return STATUS_SUCCESS; }
@@ -315,7 +307,7 @@ OBJ_PERMANENT, NULL, SecDescriptor); - DPRINT1("Creating: %wZ directory\n", &SearchString); + DPRINT("Creating: %wZ directory\n", &SearchString); Status = NtCreateDirectoryObject(&DirHandle, DIRECTORY_ALL_ACCESS, &ObjectAttributes); @@ -403,7 +395,7 @@ while (*DllName) { /* Add this to the linked list */ - DPRINT1("Excluded DLL: %S\n", DllName); + DPRINT("Excluded DLL: %S\n", DllName); Status = SmpSaveRegistryValue(EntryContext, DllName, NULL, TRUE);
/* Bail out on failure or if only one DLL name was present */ @@ -478,7 +470,7 @@ }
/* This is the directory, initialize it */ - DPRINT1("KnownDll Path: %S\n", ValueData); + DPRINT("KnownDll Path: %S\n", ValueData); return SmpInitializeKnownDllPath(&SmpKnownDllPath, ValueData, ValueLength); }
@@ -497,7 +489,7 @@ /* Convert the strings into UNICODE_STRING and set the variable defined */ RtlInitUnicodeString(&ValueString, ValueName); RtlInitUnicodeString(&DataString, ValueData); - DPRINT1("Setting %wZ = %wZ\n", &ValueString, &DataString); + DPRINT("Setting %wZ = %wZ\n", &ValueString, &DataString); Status = RtlSetEnvironmentVariable(0, &ValueString, &DataString); if (!NT_SUCCESS(Status)) { @@ -545,7 +537,7 @@ (ValueType != REG_DWORD)) { /* It isn't, must be a subsystem entry, add it to the list */ - DPRINT1("Subsystem entry: %S-%S\n", ValueName, ValueData); + DPRINT("Subsystem entry: %S-%S\n", ValueName, ValueData); return SmpSaveRegistryValue(EntryContext, ValueName, ValueData, TRUE); }
@@ -562,7 +554,7 @@ while (*SubsystemName) { /* We should have already put it into the list when we found it */ - DPRINT1("Found subsystem: %S\n", SubsystemName); + DPRINT("Found subsystem: %S\n", SubsystemName); RegEntry = SmpFindRegistryValue(EntryContext, SubsystemName); if (!RegEntry) { @@ -578,13 +570,13 @@ if (_wcsicmp(ValueName, L"Required")) { /* Put it into the optional list */ - DPRINT1("Optional\n"); + DPRINT("Optional\n"); InsertTailList(&SmpSubSystemsToDefer, &RegEntry->Entry); } else { /* Put it into the required list */ - DPRINT1("Required\n"); + DPRINT("Required\n"); InsertTailList(&SmpSubSystemsToLoad, &RegEntry->Entry); } } @@ -795,6 +787,161 @@ };
/* FUNCTIONS ******************************************************************/ + +VOID +NTAPI +SmpTranslateSystemPartitionInformation(VOID) +{ + NTSTATUS Status; + UNICODE_STRING UnicodeString, LinkTarget, SearchString, SystemPartition; + OBJECT_ATTRIBUTES ObjectAttributes; + HANDLE KeyHandle, LinkHandle; + CHAR ValueBuffer[512 + sizeof(KEY_VALUE_PARTIAL_INFORMATION)]; + PKEY_VALUE_PARTIAL_INFORMATION PartialInfo = (PVOID)ValueBuffer; + ULONG Length, Context; + CHAR DirInfoBuffer[512 + sizeof(OBJECT_DIRECTORY_INFORMATION)]; + POBJECT_DIRECTORY_INFORMATION DirInfo = (PVOID)DirInfoBuffer; + WCHAR LinkBuffer[MAX_PATH]; + + /* Open the setup key */ + RtlInitUnicodeString(&UnicodeString, L"\Registry\Machine\System\Setup"); + InitializeObjectAttributes(&ObjectAttributes, + &UnicodeString, + OBJ_CASE_INSENSITIVE, + NULL, + NULL); + Status = NtOpenKey(&KeyHandle, KEY_READ, &ObjectAttributes); + if (!NT_SUCCESS(Status)) + { + DPRINT1("SMSS: can't open system setup key for reading: 0x%x\n", Status); + return; + } + + /* Query the system partition */ + RtlInitUnicodeString(&UnicodeString, L"SystemPartition"); + Status = NtQueryValueKey(KeyHandle, + &UnicodeString, + KeyValuePartialInformation, + PartialInfo, + sizeof(ValueBuffer), + &Length); + NtClose(KeyHandle); + if (!NT_SUCCESS(Status)) + { + DPRINT1("SMSS: can't query SystemPartition value: 0x%x\n", Status); + return; + } + + /* Initialize the system partition string string */ + RtlInitUnicodeString(&SystemPartition, (PWCHAR)PartialInfo->Data); + + /* Enumerate the directory looking for the symbolic link string */ + RtlInitUnicodeString(&SearchString, L"SymbolicLink"); + RtlInitEmptyUnicodeString(&LinkTarget, LinkBuffer, sizeof(LinkBuffer)); + Status = NtQueryDirectoryObject(SmpDosDevicesObjectDirectory, + DirInfo, + sizeof(DirInfoBuffer), + TRUE, + TRUE, + &Context, + NULL); + if (!NT_SUCCESS(Status)) + { + DPRINT1("SMSS: can't find drive letter for system partition\n"); + return; + } + + /* Keep searching until we find it */ + do + { + /* Is this it? */ + if ((RtlEqualUnicodeString(&DirInfo->TypeName, &SearchString, TRUE)) && + (DirInfo->Name.Length == 2 * sizeof(WCHAR)) && + (DirInfo->Name.Buffer[1] == L':')) + { + /* Looks like we found it, open the link to get its target */ + InitializeObjectAttributes(&ObjectAttributes, + &DirInfo->Name, + OBJ_CASE_INSENSITIVE, + SmpDosDevicesObjectDirectory, + NULL); + Status = NtOpenSymbolicLinkObject(&LinkHandle, + SYMBOLIC_LINK_ALL_ACCESS, + &ObjectAttributes); + if (NT_SUCCESS(Status)) + { + /* Open worked, query the target now */ + Status = NtQuerySymbolicLinkObject(LinkHandle, + &LinkTarget, + NULL); + NtClose(LinkHandle); + + /* Check if it matches the string we had found earlier */ + if ((NT_SUCCESS(Status)) && + ((RtlEqualUnicodeString(&SystemPartition, + &LinkTarget, + TRUE)) || + ((RtlPrefixUnicodeString(&SystemPartition, + &LinkTarget, + TRUE)) && + (LinkTarget.Buffer[SystemPartition.Length / sizeof(WCHAR)] == L'\')))) + { + /* All done */ + break; + } + } + } + + /* Couldn't find it, try again */ + Status = NtQueryDirectoryObject(SmpDosDevicesObjectDirectory, + DirInfo, + sizeof(DirInfoBuffer), + TRUE, + FALSE, + &Context, + NULL); + } while (NT_SUCCESS(Status)); + if (!NT_SUCCESS(Status)) + { + DPRINT1("SMSS: can't find drive letter for system partition\n"); + return; + } + + /* Open the setup key again, for full access this time */ + RtlInitUnicodeString(&UnicodeString, + L"\Registry\Machine\Software\Microsoft\Windows\CurrentVersion\Setup"); + InitializeObjectAttributes(&ObjectAttributes, + &UnicodeString, + OBJ_CASE_INSENSITIVE, + NULL, + NULL); + Status = NtOpenKey(&KeyHandle, KEY_ALL_ACCESS, &ObjectAttributes); + if (!NT_SUCCESS(Status)) + { + DPRINT1("SMSS: can't open software setup key for writing: 0x%x\n", + Status); + return; + } + + /* Wrap up the end of the link buffer */ + wcsncpy(LinkBuffer, DirInfo->Name.Buffer, 2); + LinkBuffer[2] = L'\'; + LinkBuffer[3] = L'\0'; + + /* Now set this as the "BootDir" */ + RtlInitUnicodeString(&UnicodeString, L"BootDir"); + Status = NtSetValueKey(KeyHandle, + &UnicodeString, + 0, + REG_SZ, + LinkBuffer, + 4 * sizeof(WCHAR)); + if (!NT_SUCCESS(Status)) + { + DPRINT1("SMSS: couldn't write BootDir value: 0x%x\n", Status); + } + NtClose(KeyHandle); +}
NTSTATUS NTAPI @@ -1151,7 +1298,7 @@ }
/* Create the symbolic link */ - DPRINT1("Creating symlink for %wZ to %wZ\n", &RegEntry->Name, &RegEntry->Value); + DPRINT("Creating symlink for %wZ to %wZ\n", &RegEntry->Name, &RegEntry->Value); Status = NtCreateSymbolicLinkObject(&DirHandle, SYMBOLIC_LINK_ALL_ACCESS, &ObjectAttributes, @@ -1357,7 +1504,7 @@ { /* Get the entry and skip it if it's in the exluded list */ RegEntry = CONTAINING_RECORD(NextEntry, SMP_REGISTRY_VALUE, Entry); - DPRINT1("Processing known DLL: %wZ-%wZ\n", &RegEntry->Name, &RegEntry->Value); + DPRINT("Processing known DLL: %wZ-%wZ\n", &RegEntry->Name, &RegEntry->Value); if ((SmpFindRegistryValue(&SmpExcludeKnownDllsList, RegEntry->Name.Buffer)) || (SmpFindRegistryValue(&SmpExcludeKnownDllsList, @@ -1388,6 +1535,8 @@ &ImageCharacteristics); if (!NT_SUCCESS(Status)) { + DPRINT1("Hey ReactOS -- you suck! Please fix the checksum (or the API) behind: %wZ\n", &RegEntry->Value); + #if 0 /* Checksum failed, so don't even try going further -- kill SMSS */ RtlInitUnicodeString(&ErrorResponse, L"Verification of a KnownDLL failed."); @@ -1395,6 +1544,7 @@ ErrorParameters[1] = Status; ErrorParameters[2] = (ULONG)&RegEntry->Value; SmpTerminate(ErrorParameters, 5, RTL_NUMBER_OF(ErrorParameters)); + #endif } else if (!(ImageCharacteristics & IMAGE_FILE_DLL)) { @@ -1559,7 +1709,7 @@
/* First let's write the OS variable */ RtlInitUnicodeString(&ValueName, L"OS"); - DPRINT1("Setting %wZ to %S\n", &ValueName, L"Windows_NT"); + DPRINT("Setting %wZ to %S\n", &ValueName, L"Windows_NT"); Status = NtSetValueKey(KeyHandle, &ValueName, 0, @@ -1597,7 +1747,7 @@ }
/* Set it */ - DPRINT1("Setting %wZ to %S\n", &ValueName, ArchName); + DPRINT("Setting %wZ to %S\n", &ValueName, ArchName); Status = NtSetValueKey(KeyHandle, &ValueName, 0, @@ -1615,7 +1765,7 @@ /* And now let's write the processor level */ RtlInitUnicodeString(&ValueName, L"PROCESSOR_LEVEL"); swprintf(ValueBuffer, L"%u", ProcessorInfo.ProcessorLevel); - DPRINT1("Setting %wZ to %S\n", &ValueName, ValueBuffer); + DPRINT("Setting %wZ to %S\n", &ValueName, ValueBuffer); Status = NtSetValueKey(KeyHandle, &ValueName, 0, @@ -1683,7 +1833,7 @@
/* So that we can set this as the PROCESSOR_IDENTIFIER variable */ RtlInitUnicodeString(&ValueName, L"PROCESSOR_IDENTIFIER"); - DPRINT1("Setting %wZ to %S\n", &ValueName, PartialInfo->Data); + DPRINT("Setting %wZ to %S\n", &ValueName, PartialInfo->Data); Status = NtSetValueKey(KeyHandle, &ValueName, 0, @@ -1725,7 +1875,7 @@ }
/* Write the revision to the registry */ - DPRINT1("Setting %wZ to %S\n", &ValueName, ValueBuffer); + DPRINT("Setting %wZ to %S\n", &ValueName, ValueBuffer); Status = NtSetValueKey(KeyHandle, &ValueName, 0, @@ -1743,7 +1893,7 @@ /* And finally, write the number of CPUs */ RtlInitUnicodeString(&ValueName, L"NUMBER_OF_PROCESSORS"); swprintf(ValueBuffer, L"%u", BasicInfo.NumberOfProcessors); - DPRINT1("Setting %wZ to %S\n", &ValueName, ValueBuffer); + DPRINT("Setting %wZ to %S\n", &ValueName, ValueBuffer); Status = NtSetValueKey(KeyHandle, &ValueName, 0, @@ -1797,7 +1947,7 @@ }
/* And write it in the environment! */ - DPRINT1("Setting %wZ to %S\n", &ValueName, ValueBuffer); + DPRINT("Setting %wZ to %S\n", &ValueName, ValueBuffer); Status = NtSetValueKey(KeyHandle, &ValueName, 0,
Modified: trunk/reactos/base/system/smss2/smss.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/system/smss2/smss.c?re... ============================================================================== --- trunk/reactos/base/system/smss2/smss.c [iso-8859-1] (original) +++ trunk/reactos/base/system/smss2/smss.c [iso-8859-1] Mon Feb 6 18:57:18 2012 @@ -627,7 +627,7 @@ Status = SmpInit(&InitialCommand, Handles); if (!NT_SUCCESS(Status)) { - DPRINT1("SMSS: SmpInit return failure - Status == %x\n"); + DPRINT1("SMSS: SmpInit return failure - Status == %x\n", Status); RtlInitUnicodeString(&DbgString, L"Session Manager Initialization"); Parameters[1] = Status; //_SEH2_LEAVE; Hack so that setup can work. will go away later
Modified: trunk/reactos/base/system/smss2/smss.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/system/smss2/smss.h?re... ============================================================================== --- trunk/reactos/base/system/smss2/smss.h [iso-8859-1] (original) +++ trunk/reactos/base/system/smss2/smss.h [iso-8859-1] Mon Feb 6 18:57:18 2012 @@ -36,6 +36,16 @@ #define SMP_SUBSYSTEM_FLAG 0x08 #define SMP_INVALID_PATH 0x10 #define SMP_DEFERRED_FLAG 0x20 + +/* STRUCTURES *****************************************************************/ + +typedef struct _SMP_REGISTRY_VALUE +{ + LIST_ENTRY Entry; + UNICODE_STRING Name; + UNICODE_STRING Value; + PCHAR AnsiValue; +} SMP_REGISTRY_VALUE, *PSMP_REGISTRY_VALUE;
/* EXTERNALS ******************************************************************/
@@ -56,6 +66,11 @@ extern UNICODE_STRING SmpSystemRoot; extern PWCHAR SmpDefaultEnvironment; extern UNICODE_STRING SmpDefaultLibPath; +extern LIST_ENTRY SmpSetupExecuteList; +extern LIST_ENTRY SmpSubSystemsToLoad; +extern LIST_ENTRY SmpExecuteList; +extern LIST_ENTRY SmpSubSystemList; +extern ULONG AttachedSessionId;
/* FUNCTIONS ******************************************************************/
@@ -187,4 +202,8 @@ IN PUNICODE_STRING FileName );
- +VOID +NTAPI +SmpTranslateSystemPartitionInformation( + VOID + );
Modified: trunk/reactos/base/system/smss2/smsubsys.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/system/smss2/smsubsys.... ============================================================================== --- trunk/reactos/base/system/smss2/smsubsys.c [iso-8859-1] (original) +++ trunk/reactos/base/system/smss2/smsubsys.c [iso-8859-1] Mon Feb 6 18:57:18 2012 @@ -19,6 +19,7 @@ HANDLE SmpWindowsSubSysProcess; HANDLE SmpWindowsSubSysProcessId; BOOLEAN RegPosixSingleInstance; +WCHAR InitialCommandBuffer[256];
/* FUNCTIONS ******************************************************************/
@@ -31,7 +32,7 @@ OUT PHANDLE ProcessId) { DPRINT1("Should start subsystem %wZ for Session: %lx\n", FileName, MuSessionId); - return STATUS_SUCCESS; + return STATUS_SUCCESS; }
NTSTATUS @@ -40,7 +41,169 @@ OUT PHANDLE ProcessId, IN PUNICODE_STRING InitialCommand) { - DPRINT1("Should start subsystems for Session: %lx\n", *MuSessionId); - return STATUS_SUCCESS; + NTSTATUS Status = STATUS_SUCCESS, Status2; + PSMP_REGISTRY_VALUE RegEntry; + UNICODE_STRING DestinationString, NtPath; + PLIST_ENTRY NextEntry; + LARGE_INTEGER Timeout; + PVOID State; + + /* Write a few last registry keys with the boot partition information */ + SmpTranslateSystemPartitionInformation(); + + /* Process "SetupExecute" values */ + NextEntry = SmpSetupExecuteList.Flink; + while (NextEntry != &SmpSetupExecuteList) + { + /* Execute each one and move on */ + RegEntry = CONTAINING_RECORD(NextEntry, SMP_REGISTRY_VALUE, Entry); + DPRINT1("SetupExecute entry: %wZ\n", &RegEntry->Name); + SmpExecuteCommand(&RegEntry->Name, 0, NULL, 0); + NextEntry = NextEntry->Flink; + } + + /* Now process the subsystems */ + NextEntry = SmpSubSystemList.Flink; + while (NextEntry != &SmpSubSystemList) + { + /* Get the entry and check if this is the special Win32k entry */ + RegEntry = CONTAINING_RECORD(NextEntry, SMP_REGISTRY_VALUE, Entry); + DPRINT1("Subsystem: %wZ\n", &RegEntry->Name); + if (!_wcsicmp(RegEntry->Name.Buffer, L"Kmode")) + { + /* Translate it */ + if (!RtlDosPathNameToNtPathName_U(RegEntry->Value.Buffer, + &NtPath, + NULL, + NULL)) + { + Status = STATUS_OBJECT_PATH_SYNTAX_BAD; + DPRINT1("Failed: %lx\n", Status); + } + else + { + /* Get the driver privilege */ + Status = SmpAcquirePrivilege(SE_LOAD_DRIVER_PRIVILEGE, &State); + if (NT_SUCCESS(Status)) + { + /* Create the new session */ + ASSERT(AttachedSessionId == -1); + Status = NtSetSystemInformation(SystemSessionCreate, + MuSessionId, + sizeof(*MuSessionId)); + if (!NT_SUCCESS(Status)) + { + DPRINT1("SMSS: Session space creation failed\n"); + SmpReleasePrivilege(State); + RtlFreeHeap(RtlGetProcessHeap(), 0, NtPath.Buffer); + return Status; + } + AttachedSessionId = *MuSessionId; + + /* Start Win32k.sys on this session */ + DPRINT1("Starting win32k.sys...\n"); + RtlInitUnicodeString(&DestinationString, + L"\SystemRoot\System32\win32k.sys"); + Status = NtSetSystemInformation(SystemExtendServiceTableInformation, + &DestinationString, + sizeof(DestinationString)); + RtlFreeHeap(RtlGetProcessHeap(), 0, NtPath.Buffer); + SmpReleasePrivilege(State); + if (!NT_SUCCESS(Status)) + { + DPRINT1("SMSS: Load of WIN32K failed.\n"); + return Status; + } + } + } + } + + /* Next entry */ + NextEntry = NextEntry->Flink; + } + + /* Now parse the required subsystem list */ + NextEntry = SmpSubSystemsToLoad.Flink; + while (NextEntry != &SmpSubSystemsToLoad) + { + /* Get each entry and check if it's the internal debug or not */ + RegEntry = CONTAINING_RECORD(NextEntry, SMP_REGISTRY_VALUE, Entry); + DPRINT1("Subsystem (required): %wZ\n", &RegEntry->Name); + if (_wcsicmp(RegEntry->Name.Buffer, L"debug")) + { + /* Load the required subsystem */ + Status = SmpExecuteCommand(&RegEntry->Value, + *MuSessionId, + ProcessId, + SMP_SUBSYSTEM_FLAG); + } + else + { + /* Load the internal debug system */ + Status = SmpExecuteCommand(&RegEntry->Value, + *MuSessionId, + ProcessId, + SMP_DEBUG_FLAG | SMP_SUBSYSTEM_FLAG); + } + if (!NT_SUCCESS(Status)) + { + DbgPrint("SMSS: Subsystem execute failed (%WZ)\n", &RegEntry->Value); + return Status; + } + + /* Move to the next entry */ + NextEntry = NextEntry->Flink; + } + + /* Process the "Execute" list now */ + NextEntry = SmpExecuteList.Blink; + if (NextEntry != &SmpExecuteList) + { + /* Get the custom initial command */ + RegEntry = CONTAINING_RECORD(NextEntry, SMP_REGISTRY_VALUE, Entry); + DPRINT1("Initial command found: %wZ\n", &RegEntry->Name); + + /* Write the initial command and wait for 5 seconds (why??!) */ + *InitialCommand = RegEntry->Name; + Timeout.QuadPart = -50000000; + NtDelayExecution(FALSE, &Timeout); + } + else + { + /* Use the default Winlogon initial command */ + RtlInitUnicodeString(InitialCommand, L"winlogon.exe"); + InitialCommandBuffer[0] = UNICODE_NULL; + DPRINT1("Initial command found: %wZ\n", InitialCommand); + + /* Check if there's a debugger for Winlogon */ + Status2 = LdrQueryImageFileExecutionOptions(InitialCommand, + L"Debugger", + REG_SZ, + InitialCommandBuffer, + sizeof(InitialCommandBuffer) - + InitialCommand->Length, + NULL); + if ((NT_SUCCESS(Status2)) && (InitialCommandBuffer[0])) + { + /* Put the debugger string with the Winlogon string */ + wcscat(InitialCommandBuffer, L" "); + wcscat(InitialCommandBuffer, InitialCommand->Buffer); + RtlInitUnicodeString(InitialCommand, InitialCommandBuffer); + } + } + + /* Finally check if there was a custom initial command */ + NextEntry = SmpExecuteList.Flink; + while (NextEntry != &SmpExecuteList) + { + /* Execute each one */ + RegEntry = CONTAINING_RECORD(NextEntry, SMP_REGISTRY_VALUE, Entry); + DPRINT1("Initial command (custom): %wZ\n", &RegEntry->Name); + SmpExecuteCommand(&RegEntry->Name, *MuSessionId, NULL, 0); + NextEntry = NextEntry->Flink; + } + + /* Return status */ + return Status; }
Modified: trunk/reactos/subsystems/win32/csrss/csrsrv/init.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/csrss/csrs... ============================================================================== --- trunk/reactos/subsystems/win32/csrss/csrsrv/init.c [iso-8859-1] (original) +++ trunk/reactos/subsystems/win32/csrss/csrsrv/init.c [iso-8859-1] Mon Feb 6 18:57:18 2012 @@ -598,6 +598,7 @@ return Status; }
+#if 0 /********************************************************************** * CsrpLoadKernelModeDriver/3 */ @@ -641,6 +642,7 @@ } return Status; } +#endif
/********************************************************************** * CsrpCreateApiPort/2 @@ -753,7 +755,7 @@ {TRUE, CsrpCreateApiPort, "create the api port \Windows\ApiPort"}, {TRUE, CsrpCreateHardErrorPort, "create the hard error port"}, {TRUE, CsrpCreateObjectDirectory,"create the object directory \Windows"}, - {TRUE, CsrpLoadKernelModeDriver, "load Kmode driver"}, +// {TRUE, CsrpLoadKernelModeDriver, "load Kmode driver"}, {TRUE, CsrpInitVideo, "initialize video"}, {TRUE, CsrpApiRegisterDef, "initialize api definitions"}, {TRUE, CsrpCCTS, "connect client to server"},