mirror of
https://github.com/reactos/reactos.git
synced 2024-07-21 11:48:04 +00:00
- Move CmpSetSystemValues to cmsysini.c
- Remove all NTLDR-style profile code from cmsysini.c, since ReactOS doesn't support it, and there's no use lugging that code around. - Rename CmpCreateCurrentControlSetLink to CmpCreateControlSet. - Get rid of CmiCreateCuttenControlSetLink and use the new version instead, which also supports setting the right current Hardware Profile ID. svn path=/trunk/; revision=26670
This commit is contained in:
parent
0285323c9d
commit
e72d90dbc8
|
@ -66,8 +66,13 @@ CmImportHardwareHive(PCHAR ChunkBase,
|
|||
ULONG ChunkSize,
|
||||
OUT PEREGISTRY_HIVE *RegistryHive);
|
||||
|
||||
static NTSTATUS
|
||||
CmiCreateCurrentControlSetLink(VOID);
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
CmpSetSystemValues(IN PLOADER_PARAMETER_BLOCK LoaderBlock);
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
CmpCreateControlSet(IN PLOADER_PARAMETER_BLOCK LoaderBlock);
|
||||
|
||||
static VOID STDCALL
|
||||
CmiHiveSyncDpcRoutine(PKDPC Dpc,
|
||||
|
@ -78,8 +83,8 @@ CmiHiveSyncDpcRoutine(PKDPC Dpc,
|
|||
extern LIST_ENTRY CmiCallbackHead;
|
||||
extern FAST_MUTEX CmiCallbackLock;
|
||||
|
||||
UNICODE_STRING CmpSystemStartOptions;
|
||||
UNICODE_STRING CmpLoadOptions;
|
||||
extern UNICODE_STRING CmpSystemStartOptions;
|
||||
extern UNICODE_STRING CmpLoadOptions;
|
||||
/* FUNCTIONS ****************************************************************/
|
||||
|
||||
VOID STDCALL
|
||||
|
@ -206,63 +211,6 @@ CmpLinkHiveToMaster(IN PUNICODE_STRING LinkName,
|
|||
return CmiConnectHive(&ObjectAttributes, RegistryHive);
|
||||
}
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
CmpSetSystemValues(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
|
||||
{
|
||||
OBJECT_ATTRIBUTES ObjectAttributes;
|
||||
UNICODE_STRING KeyName, ValueName;
|
||||
HANDLE KeyHandle;
|
||||
NTSTATUS Status;
|
||||
ASSERT(LoaderBlock != NULL);
|
||||
if (ExpInTextModeSetup) return STATUS_SUCCESS;
|
||||
|
||||
/* Setup attributes for loader options */
|
||||
RtlInitUnicodeString(&KeyName,
|
||||
L"\\REGISTRY\\MACHINE\\SYSTEM\\CurrentControlSet\\"
|
||||
L"Control");
|
||||
InitializeObjectAttributes(&ObjectAttributes,
|
||||
&KeyName,
|
||||
OBJ_CASE_INSENSITIVE,
|
||||
NULL,
|
||||
NULL);
|
||||
Status = NtOpenKey(&KeyHandle, KEY_WRITE, &ObjectAttributes);
|
||||
if (!NT_SUCCESS(Status)) goto Quickie;
|
||||
|
||||
/* Key opened, now write to the key */
|
||||
RtlInitUnicodeString(&KeyName, L"SystemStartOptions");
|
||||
Status = NtSetValueKey(KeyHandle,
|
||||
&KeyName,
|
||||
0,
|
||||
REG_SZ,
|
||||
CmpSystemStartOptions.Buffer,
|
||||
CmpSystemStartOptions.Length);
|
||||
if (!NT_SUCCESS(Status)) goto Quickie;
|
||||
|
||||
/* Free the options now */
|
||||
ExFreePool(CmpSystemStartOptions.Buffer);
|
||||
|
||||
/* Setup value name for system boot device */
|
||||
RtlInitUnicodeString(&KeyName, L"SystemBootDevice");
|
||||
RtlCreateUnicodeStringFromAsciiz(&ValueName, LoaderBlock->NtBootPathName);
|
||||
Status = NtSetValueKey(KeyHandle,
|
||||
&KeyName,
|
||||
0,
|
||||
REG_SZ,
|
||||
ValueName.Buffer,
|
||||
ValueName.Length);
|
||||
|
||||
Quickie:
|
||||
/* Free the buffers */
|
||||
RtlFreeUnicodeString(&ValueName);
|
||||
|
||||
/* Close the key and return */
|
||||
NtClose(KeyHandle);
|
||||
|
||||
/* Return the status */
|
||||
return Status;
|
||||
}
|
||||
|
||||
BOOLEAN
|
||||
NTAPI
|
||||
CmpInitializeSystemHive(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
|
||||
|
@ -538,7 +486,7 @@ CmInitSystem1(VOID)
|
|||
}
|
||||
|
||||
/* Create the 'CurrentControlSet' link. */
|
||||
Status = CmiCreateCurrentControlSetLink();
|
||||
Status = CmpCreateControlSet(KeLoaderBlock);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
/* Bugcheck */
|
||||
|
@ -584,97 +532,6 @@ CmInitSystem1(VOID)
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
static NTSTATUS
|
||||
CmiCreateCurrentControlSetLink(VOID)
|
||||
{
|
||||
RTL_QUERY_REGISTRY_TABLE QueryTable[5];
|
||||
WCHAR TargetNameBuffer[80];
|
||||
ULONG TargetNameLength;
|
||||
UNICODE_STRING LinkName = RTL_CONSTANT_STRING(
|
||||
L"\\Registry\\Machine\\SYSTEM\\CurrentControlSet");
|
||||
UNICODE_STRING LinkValue = RTL_CONSTANT_STRING(L"SymbolicLinkValue");
|
||||
ULONG CurrentSet;
|
||||
ULONG DefaultSet;
|
||||
ULONG Failed;
|
||||
ULONG LastKnownGood;
|
||||
NTSTATUS Status;
|
||||
OBJECT_ATTRIBUTES ObjectAttributes;
|
||||
HANDLE KeyHandle;
|
||||
if (ExpInTextModeSetup) return STATUS_SUCCESS;
|
||||
|
||||
DPRINT("CmiCreateCurrentControlSetLink() called\n");
|
||||
|
||||
RtlZeroMemory(&QueryTable, sizeof(QueryTable));
|
||||
|
||||
QueryTable[0].Name = L"Current";
|
||||
QueryTable[0].Flags = RTL_QUERY_REGISTRY_DIRECT;
|
||||
QueryTable[0].EntryContext = &CurrentSet;
|
||||
|
||||
QueryTable[1].Name = L"Default";
|
||||
QueryTable[1].Flags = RTL_QUERY_REGISTRY_DIRECT;
|
||||
QueryTable[1].EntryContext = &DefaultSet;
|
||||
|
||||
QueryTable[2].Name = L"Failed";
|
||||
QueryTable[2].Flags = RTL_QUERY_REGISTRY_DIRECT;
|
||||
QueryTable[2].EntryContext = &Failed;
|
||||
|
||||
QueryTable[3].Name = L"LastKnownGood";
|
||||
QueryTable[3].Flags = RTL_QUERY_REGISTRY_DIRECT;
|
||||
QueryTable[3].EntryContext = &LastKnownGood;
|
||||
|
||||
Status = RtlQueryRegistryValues(RTL_REGISTRY_ABSOLUTE,
|
||||
L"\\Registry\\Machine\\SYSTEM\\Select",
|
||||
QueryTable,
|
||||
NULL,
|
||||
NULL);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
return(Status);
|
||||
}
|
||||
|
||||
DPRINT("Current %ld Default %ld\n", CurrentSet, DefaultSet);
|
||||
|
||||
swprintf(TargetNameBuffer,
|
||||
L"\\Registry\\Machine\\SYSTEM\\ControlSet%03lu",
|
||||
CurrentSet);
|
||||
TargetNameLength = wcslen(TargetNameBuffer) * sizeof(WCHAR);
|
||||
|
||||
DPRINT("Link target '%S'\n", TargetNameBuffer);
|
||||
|
||||
InitializeObjectAttributes(&ObjectAttributes,
|
||||
&LinkName,
|
||||
OBJ_CASE_INSENSITIVE | OBJ_OPENIF | OBJ_OPENLINK,
|
||||
NULL,
|
||||
NULL);
|
||||
Status = ZwCreateKey(&KeyHandle,
|
||||
KEY_ALL_ACCESS | KEY_CREATE_LINK,
|
||||
&ObjectAttributes,
|
||||
0,
|
||||
NULL,
|
||||
REG_OPTION_VOLATILE | REG_OPTION_CREATE_LINK,
|
||||
NULL);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
DPRINT1("ZwCreateKey() failed (Status %lx)\n", Status);
|
||||
return(Status);
|
||||
}
|
||||
|
||||
Status = ZwSetValueKey(KeyHandle,
|
||||
&LinkValue,
|
||||
0,
|
||||
REG_LINK,
|
||||
(PVOID)TargetNameBuffer,
|
||||
TargetNameLength);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
DPRINT1("ZwSetValueKey() failed (Status %lx)\n", Status);
|
||||
}
|
||||
|
||||
ZwClose(KeyHandle);
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
NTSTATUS
|
||||
CmiConnectHive(IN POBJECT_ATTRIBUTES KeyObjectAttributes,
|
||||
IN PEREGISTRY_HIVE RegistryHive)
|
||||
|
|
|
@ -13,7 +13,6 @@
|
|||
#define NDEBUG
|
||||
#include "debug.h"
|
||||
|
||||
#if 0
|
||||
/* GLOBALS *******************************************************************/
|
||||
|
||||
UNICODE_STRING CmSymbolicLinkValueName =
|
||||
|
@ -21,6 +20,7 @@ UNICODE_STRING CmSymbolicLinkValueName =
|
|||
|
||||
UNICODE_STRING CmpSystemStartOptions;
|
||||
UNICODE_STRING CmpLoadOptions;
|
||||
extern BOOLEAN ExpInTextModeSetup;
|
||||
|
||||
/* FUNCTIONS *****************************************************************/
|
||||
|
||||
|
@ -33,6 +33,7 @@ CmpSetSystemValues(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
|
|||
HANDLE KeyHandle;
|
||||
NTSTATUS Status;
|
||||
ASSERT(LoaderBlock != NULL);
|
||||
if (ExpInTextModeSetup) return STATUS_SUCCESS;
|
||||
|
||||
/* Setup attributes for loader options */
|
||||
RtlInitUnicodeString(&KeyName,
|
||||
|
@ -82,244 +83,9 @@ Quickie:
|
|||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
CmpHwProfileDefaultSelect(IN PVOID ProfileList,
|
||||
OUT PULONG ProfileIndexToUse,
|
||||
IN PVOID Context)
|
||||
CmpCreateControlSet(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
|
||||
{
|
||||
/* Clear the index and return success */
|
||||
*ProfileIndexToUse = 0;
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
CmpAddDockingInfo(IN HANDLE Key,
|
||||
IN PPROFILE_PARAMETER_BLOCK ProfileBlock)
|
||||
{
|
||||
NTSTATUS Status = STATUS_SUCCESS;
|
||||
UNICODE_STRING KeyName;
|
||||
ULONG Value;
|
||||
PAGED_CODE ();
|
||||
|
||||
/* Get the Value from the profile block, create a Name for it and set it */
|
||||
Value = ProfileBlock->DockingState;
|
||||
RtlInitUnicodeString(&KeyName, L"DockingState");
|
||||
Status = NtSetValueKey(Key,
|
||||
&KeyName,
|
||||
0,
|
||||
REG_DWORD,
|
||||
&Value,
|
||||
sizeof(Value));
|
||||
if (!NT_SUCCESS(Status)) return Status;
|
||||
|
||||
/* Get the Value from the profile block, create a Name for it and set it */
|
||||
Value = ProfileBlock->Capabilities;
|
||||
RtlInitUnicodeString(&KeyName, L"Capabilities");
|
||||
Status = NtSetValueKey(Key,
|
||||
&KeyName,
|
||||
0,
|
||||
REG_DWORD,
|
||||
&Value,
|
||||
sizeof(Value));
|
||||
if (!NT_SUCCESS(Status)) return Status;
|
||||
|
||||
/* Get the Value from the profile block, create a Name for it and set it */
|
||||
Value = ProfileBlock->DockID;
|
||||
RtlInitUnicodeString(&KeyName, L"DockID");
|
||||
Status = NtSetValueKey(Key,
|
||||
&KeyName,
|
||||
0,
|
||||
REG_DWORD,
|
||||
&Value,
|
||||
sizeof(Value));
|
||||
if (!NT_SUCCESS(Status)) return Status;
|
||||
|
||||
/* Get the Value from the profile block, create a Name for it and set it */
|
||||
Value = ProfileBlock->SerialNumber;
|
||||
RtlInitUnicodeString(&KeyName, L"SerialNumber");
|
||||
Status = NtSetValueKey(Key,
|
||||
&KeyName,
|
||||
0,
|
||||
REG_DWORD,
|
||||
&Value,
|
||||
sizeof(Value));
|
||||
|
||||
/* Return Status */
|
||||
return Status;
|
||||
}
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
CmpAddAliasEntry(IN HANDLE IDConfigDB,
|
||||
IN PPROFILE_PARAMETER_BLOCK ProfileBlock,
|
||||
IN ULONG ProfileNumber)
|
||||
{
|
||||
UNICODE_STRING KeyName;
|
||||
OBJECT_ATTRIBUTES ObjectAttributes;
|
||||
NTSTATUS Status = STATUS_SUCCESS;
|
||||
CHAR Buffer[128];
|
||||
WCHAR UnicodeBuffer[128];
|
||||
ANSI_STRING TempString;
|
||||
HANDLE AliasHandle = NULL, AliasIdHandle = NULL;
|
||||
ULONG Value;
|
||||
ULONG Disposition;
|
||||
ULONG AliasId = 0;
|
||||
PAGED_CODE ();
|
||||
|
||||
/* Open the alias key */
|
||||
RtlInitUnicodeString(&KeyName, L"Alias");
|
||||
InitializeObjectAttributes(&ObjectAttributes,
|
||||
&KeyName,
|
||||
OBJ_CASE_INSENSITIVE,
|
||||
IDConfigDB,
|
||||
NULL);
|
||||
Status = NtOpenKey(&AliasHandle, KEY_READ | KEY_WRITE, &ObjectAttributes);
|
||||
|
||||
/* Check if we failed to open it */
|
||||
if (Status == STATUS_OBJECT_NAME_NOT_FOUND)
|
||||
{
|
||||
/* Create it instead */
|
||||
Status = NtCreateKey(&AliasHandle,
|
||||
KEY_READ | KEY_WRITE,
|
||||
&ObjectAttributes,
|
||||
0,
|
||||
NULL,
|
||||
0,
|
||||
&Disposition);
|
||||
}
|
||||
|
||||
/* Check if we failed */
|
||||
if (!NT_SUCCESS (Status))
|
||||
{
|
||||
/* Cleanup and exit */
|
||||
AliasHandle = NULL;
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
/* Loop every alias ID */
|
||||
while (AliasId++ < 200)
|
||||
{
|
||||
/* Build the KeyName */
|
||||
sprintf(Buffer, "%04ld", AliasId);
|
||||
RtlInitAnsiString(&TempString, Buffer);
|
||||
|
||||
/* Convert it to Unicode */
|
||||
KeyName.MaximumLength = sizeof(UnicodeBuffer);
|
||||
KeyName.Buffer = UnicodeBuffer;
|
||||
Status = RtlAnsiStringToUnicodeString(&KeyName,
|
||||
&TempString,
|
||||
FALSE);
|
||||
ASSERT (STATUS_SUCCESS == Status);
|
||||
|
||||
/* Open the key */
|
||||
InitializeObjectAttributes(&ObjectAttributes,
|
||||
&KeyName,
|
||||
OBJ_CASE_INSENSITIVE,
|
||||
AliasHandle,
|
||||
NULL);
|
||||
Status = NtOpenKey(&AliasIdHandle,
|
||||
KEY_READ | KEY_WRITE,
|
||||
&ObjectAttributes);
|
||||
if (NT_SUCCESS (Status))
|
||||
{
|
||||
/* We opened it, close and keep looping */
|
||||
NtClose(AliasIdHandle);
|
||||
}
|
||||
else if (Status == STATUS_OBJECT_NAME_NOT_FOUND)
|
||||
{
|
||||
/* We couldn't find it, change Status and break out */
|
||||
Status = STATUS_SUCCESS;
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Any other error, break out */
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* Check if we failed in the alias loop */
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
/* Cleanup and exit */
|
||||
AliasIdHandle = 0;
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
/* Otherwise, create the alias key */
|
||||
Status = NtCreateKey(&AliasIdHandle,
|
||||
KEY_READ | KEY_WRITE,
|
||||
&ObjectAttributes,
|
||||
0,
|
||||
NULL,
|
||||
0,
|
||||
&Disposition);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
/* Cleanup and exit */
|
||||
AliasIdHandle = 0;
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
/* Add docking information */
|
||||
CmpAddDockingInfo(AliasIdHandle, ProfileBlock);
|
||||
|
||||
/* Set the profile number */
|
||||
Value = ProfileNumber;
|
||||
RtlInitUnicodeString(&KeyName, L"ProfileNumber");
|
||||
Status = NtSetValueKey(AliasIdHandle,
|
||||
&KeyName,
|
||||
0,
|
||||
REG_DWORD,
|
||||
&Value,
|
||||
sizeof(Value));
|
||||
|
||||
Exit:
|
||||
/* Close every opened key */
|
||||
if (AliasHandle) NtClose(AliasHandle);
|
||||
if (AliasIdHandle) NtClose(AliasIdHandle);
|
||||
|
||||
/* Return Status */
|
||||
return Status;
|
||||
}
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
CmSetAcpiHwProfile(IN PPROFILE_ACPI_DOCKING_STATE NewDockState,
|
||||
IN PVOID Select,
|
||||
IN PVOID Context,
|
||||
OUT PHANDLE NewProfile,
|
||||
OUT PBOOLEAN ProfileChanged)
|
||||
{
|
||||
/* FIXME: TODO */
|
||||
*ProfileChanged = FALSE;
|
||||
*NewProfile = NULL;
|
||||
ASSERT(FALSE);
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
CmpCloneHwProfile(IN HANDLE ConfigHandle,
|
||||
IN HANDLE Parent,
|
||||
IN HANDLE OldProfile,
|
||||
IN ULONG OldProfileNumber,
|
||||
IN USHORT DockingState,
|
||||
OUT PHANDLE NewProfile,
|
||||
OUT PULONG NewProfileNumber)
|
||||
{
|
||||
/* FIXME: TODO */
|
||||
*NewProfileNumber = FALSE;
|
||||
*NewProfile = NULL;
|
||||
ASSERT(FALSE);
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
CmpCreateCurrentControlSetLink(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
|
||||
{
|
||||
UNICODE_STRING ConfigName = RTL_CONSTANT_STRING(L"Control\\ConfigHandle");
|
||||
UNICODE_STRING ConfigName = RTL_CONSTANT_STRING(L"Control\\IDConfigDB");
|
||||
UNICODE_STRING SelectName =
|
||||
RTL_CONSTANT_STRING(L"\\Registry\\Machine\\System\\Select");
|
||||
UNICODE_STRING KeyName;
|
||||
|
@ -329,16 +95,14 @@ CmpCreateCurrentControlSetLink(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
|
|||
CHAR Buffer[128];
|
||||
WCHAR UnicodeBuffer[128];
|
||||
HANDLE SelectHandle, KeyHandle, ConfigHandle = NULL, ProfileHandle = NULL;
|
||||
HANDLE ParentHandle = NULL, AcpiHandle;
|
||||
HANDLE ParentHandle = NULL;
|
||||
ULONG ControlSet, HwProfile;
|
||||
ANSI_STRING TempString;
|
||||
NTSTATUS Status;
|
||||
ULONG ResultLength, Disposition;
|
||||
BOOLEAN AcpiProfile = FALSE;
|
||||
PLOADER_PARAMETER_EXTENSION LoaderExtension;
|
||||
PROFILE_ACPI_DOCKING_STATE AcpiDockState;
|
||||
BOOLEAN Active;
|
||||
PAGED_CODE();
|
||||
if (ExpInTextModeSetup) return STATUS_SUCCESS;
|
||||
|
||||
/* Open the select key */
|
||||
InitializeObjectAttributes(&ObjectAttributes,
|
||||
|
@ -347,7 +111,7 @@ CmpCreateCurrentControlSetLink(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
|
|||
NULL,
|
||||
NULL);
|
||||
Status = NtOpenKey(&SelectHandle, KEY_READ, &ObjectAttributes);
|
||||
if (!NT_SUCCESS(Status))return(Status);
|
||||
if (!NT_SUCCESS(Status)) return(Status);
|
||||
|
||||
/* Open the current value */
|
||||
RtlInitUnicodeString(&KeyName, L"Current");
|
||||
|
@ -449,9 +213,7 @@ CmpCreateCurrentControlSetLink(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
|
|||
NULL,
|
||||
NULL);
|
||||
Status = NtOpenKey(&ParentHandle, KEY_READ, &ObjectAttributes);
|
||||
|
||||
/* Check if there is no hardware profile key */
|
||||
if (!NT_SUCCESS (Status))
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
/* Exit and clean up */
|
||||
ParentHandle = 0;
|
||||
|
@ -459,7 +221,7 @@ CmpCreateCurrentControlSetLink(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
|
|||
}
|
||||
|
||||
/* Build the profile name */
|
||||
sprintf(Buffer, "%04ld",HwProfile);
|
||||
sprintf(Buffer, "%04ld", HwProfile);
|
||||
RtlInitAnsiString(&TempString, Buffer);
|
||||
|
||||
/* Convert it to Unicode */
|
||||
|
@ -479,8 +241,6 @@ CmpCreateCurrentControlSetLink(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
|
|||
Status = NtOpenKey(&ProfileHandle,
|
||||
KEY_READ | KEY_WRITE,
|
||||
&ObjectAttributes);
|
||||
|
||||
/* Check if there's no such key */
|
||||
if (!NT_SUCCESS (Status))
|
||||
{
|
||||
/* Cleanup and exit */
|
||||
|
@ -492,80 +252,7 @@ CmpCreateCurrentControlSetLink(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
|
|||
LoaderExtension = LoaderBlock->Extension;
|
||||
if (LoaderExtension)
|
||||
{
|
||||
/* Check the hardware profile status */
|
||||
switch (LoaderExtension->Profile.Status)
|
||||
{
|
||||
/* Cloned status */
|
||||
case 3:
|
||||
|
||||
/* Clone it */
|
||||
Status = CmpCloneHwProfile(ConfigHandle,
|
||||
ParentHandle,
|
||||
ProfileHandle,
|
||||
HwProfile,
|
||||
LoaderExtension->
|
||||
Profile.DockingState,
|
||||
&ProfileHandle,
|
||||
&HwProfile);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
/* Cloning failed, cleanup and exit */
|
||||
ProfileHandle = 0;
|
||||
goto Cleanup;
|
||||
}
|
||||
|
||||
/* Set the current config key */
|
||||
RtlInitUnicodeString(&KeyName, L"CurrentConfig");
|
||||
Status = NtSetValueKey(ConfigHandle,
|
||||
&KeyName,
|
||||
0,
|
||||
REG_DWORD,
|
||||
&HwProfile,
|
||||
sizeof (HwProfile));
|
||||
if (!NT_SUCCESS (Status)) goto Cleanup;
|
||||
|
||||
/* Alias status */
|
||||
case 1:
|
||||
|
||||
/* Create an alias entry */
|
||||
Status = CmpAddAliasEntry(ConfigHandle,
|
||||
&LoaderExtension->Profile,
|
||||
HwProfile);
|
||||
|
||||
/* Docking status */
|
||||
case 2:
|
||||
|
||||
/* Create the current dock info key */
|
||||
RtlInitUnicodeString(&KeyName,
|
||||
L"CurrentDockInfo");
|
||||
InitializeObjectAttributes(&ObjectAttributes,
|
||||
&KeyName,
|
||||
OBJ_CASE_INSENSITIVE,
|
||||
ConfigHandle,
|
||||
NULL);
|
||||
Status = NtCreateKey(&KeyHandle,
|
||||
KEY_READ | KEY_WRITE,
|
||||
&ObjectAttributes,
|
||||
0,
|
||||
NULL,
|
||||
REG_OPTION_VOLATILE,
|
||||
&Disposition);
|
||||
ASSERT (STATUS_SUCCESS == Status);
|
||||
|
||||
/* Add the docking information */
|
||||
Status = CmpAddDockingInfo(KeyHandle,
|
||||
&LoaderExtension->Profile);
|
||||
break;
|
||||
|
||||
/* Other cases */
|
||||
case 0:
|
||||
case 0xC001:
|
||||
break;
|
||||
|
||||
/* Unknown status */
|
||||
default:
|
||||
ASSERT(FALSE);
|
||||
}
|
||||
ASSERTMSG("ReactOS doesn't support NTLDR Profiles yet!\n", FALSE);
|
||||
}
|
||||
|
||||
/* Create the current hardware profile key */
|
||||
|
@ -602,7 +289,7 @@ CmpCreateCurrentControlSetLink(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
|
|||
Status = RtlAnsiStringToUnicodeString(&KeyName,
|
||||
&TempString,
|
||||
FALSE);
|
||||
ASSERT (STATUS_SUCCESS == Status);
|
||||
ASSERT(STATUS_SUCCESS == Status);
|
||||
|
||||
/* Set it */
|
||||
Status = NtSetValueKey(KeyHandle,
|
||||
|
@ -614,26 +301,6 @@ CmpCreateCurrentControlSetLink(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
|
|||
NtClose(KeyHandle);
|
||||
}
|
||||
|
||||
/* Check if we have to set the ACPI Profile */
|
||||
if (AcpiProfile)
|
||||
{
|
||||
/* Setup the docking state to undocked */
|
||||
AcpiDockState.DockingState = 1;
|
||||
AcpiDockState.SerialLength = 2;
|
||||
AcpiDockState.SerialNumber[0] = L'\0';
|
||||
|
||||
/* Set the ACPI profile */
|
||||
Status = CmSetAcpiHwProfile(&AcpiDockState,
|
||||
CmpHwProfileDefaultSelect,
|
||||
NULL,
|
||||
&AcpiHandle,
|
||||
&Active);
|
||||
ASSERT(NT_SUCCESS(Status));
|
||||
|
||||
/* Close the key */
|
||||
NtClose(AcpiHandle);
|
||||
}
|
||||
|
||||
/* Close every opened handle */
|
||||
Cleanup:
|
||||
if (ConfigHandle) NtClose(ConfigHandle);
|
||||
|
@ -643,4 +310,3 @@ Cleanup:
|
|||
/* Return success */
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
#endif
|
||||
|
|
Loading…
Reference in a new issue