diff --git a/reactos/drivers/sac/driver/data.c b/reactos/drivers/sac/driver/data.c index eee9ce0c7a7..14e4b7480af 100644 --- a/reactos/drivers/sac/driver/data.c +++ b/reactos/drivers/sac/driver/data.c @@ -77,6 +77,8 @@ CreateDeviceSecurityDescriptor(IN PDEVICE_OBJECT *DeviceObject) else { SAC_DBG(SAC_DBG_INIT, "SAC CreateDeviceSecurityDescriptor : Unable to create Raw ACL, error : %x\n", Status); + /* FIXME: Temporary hack */ + Status = STATUS_SUCCESS; goto CleanupPath; } @@ -377,7 +379,7 @@ InitializeGlobalData(IN PUNICODE_STRING RegistryPath, SAC_DBG(SAC_DBG_ENTRY_EXIT, "Entering.\n"); /* If we already did this, bail out */ - if (!GlobalDataInitialized) goto SuccessExit; + if (GlobalDataInitialized) goto SuccessExit; /* Setup the symbolic link for Win32 support */ RtlInitUnicodeString(&LinkName, L"\\DosDevices\\SAC"); diff --git a/reactos/drivers/sac/driver/memory.c b/reactos/drivers/sac/driver/memory.c index 6dfe2f1625e..4182a5c3069 100644 --- a/reactos/drivers/sac/driver/memory.c +++ b/reactos/drivers/sac/driver/memory.c @@ -93,6 +93,11 @@ MyAllocatePool(IN SIZE_T PoolSize, IN PCHAR File, IN ULONG Line) { + PVOID p; + p = ExAllocatePoolWithTag(NonPagedPool, PoolSize, Tag); + SAC_DBG(SAC_DBG_MM, "Returning block 0x%X.\n", p); + return p; +#if 0 KIRQL OldIrql; PSAC_MEMORY_LIST GlobalDescriptor, NewDescriptor; PSAC_MEMORY_ENTRY LocalDescriptor, NextDescriptor; @@ -102,7 +107,7 @@ MyAllocatePool(IN SIZE_T PoolSize, SAC_DBG(SAC_DBG_MM, "Entering.\n"); /* Acquire the memory allocation lock and align the size request */ - KeAcquireSpinLock(&MemoryLock, &OldIrql);; + KeAcquireSpinLock(&MemoryLock, &OldIrql); PoolSize = ALIGN_UP(PoolSize, ULONGLONG); #if _USE_SAC_HEAP_ALLOCATOR_ @@ -220,12 +225,14 @@ MyAllocatePool(IN SIZE_T PoolSize, Buffer = LocalDescriptor + 1; RtlZeroMemory(Buffer, PoolSize); return Buffer; +#endif } VOID NTAPI MyFreePool(IN PVOID *Block) { +#if 0 PSAC_MEMORY_ENTRY NextDescriptor; PSAC_MEMORY_ENTRY ThisDescriptor, FoundDescriptor; PSAC_MEMORY_ENTRY LocalDescriptor = (PVOID)((ULONG_PTR)(*Block) - sizeof(SAC_MEMORY_ENTRY)); @@ -323,10 +330,10 @@ MyFreePool(IN PVOID *Block) LocalSize = GlobalSize = 0; ThisDescriptor = (PVOID)LocalSize; NextDescriptor = (PVOID)GlobalSize; - GlobalDescriptor = (PVOID) ThisDescriptor; + GlobalDescriptor = (PVOID)ThisDescriptor; FoundDescriptor = (PVOID)GlobalDescriptor; - GlobalDescriptor = (PVOID) NextDescriptor; - NextDescriptor = (PVOID) FoundDescriptor; + GlobalDescriptor = (PVOID)NextDescriptor; + NextDescriptor = (PVOID)FoundDescriptor; /* Use the NT pool allocator*/ ExFreePool(LocalDescriptor); @@ -334,6 +341,8 @@ MyFreePool(IN PVOID *Block) /* Release the lock, delete the address, and return */ KeReleaseSpinLock(&MemoryLock, OldIrql); +#endif + ExFreePool(*Block); *Block = NULL; SAC_DBG(SAC_DBG_MM, "exiting.\n"); } diff --git a/reactos/drivers/sac/driver/sacdrv.h b/reactos/drivers/sac/driver/sacdrv.h index fef618c989a..f9e4daa7968 100644 --- a/reactos/drivers/sac/driver/sacdrv.h +++ b/reactos/drivers/sac/driver/sacdrv.h @@ -35,6 +35,7 @@ #define SAC_DBG_UTIL 0x02 #define SAC_DBG_INIT 0x04 #define SAC_DBG_MM 0x1000 +#define SAC_DBG_MACHINE 0x2000 #define SAC_DBG(x, ...) \ if (SACDebug & x) \ { \ diff --git a/reactos/drivers/sac/driver/util.c b/reactos/drivers/sac/driver/util.c index 32daaac3bc3..ca0c65b26b1 100644 --- a/reactos/drivers/sac/driver/util.c +++ b/reactos/drivers/sac/driver/util.c @@ -13,7 +13,7 @@ /* GLOBALS *******************************************************************/ PCHAR Utf8ConversionBuffer; -ULONG Utf8ConversionBufferSize; +ULONG Utf8ConversionBufferSize = PAGE_SIZE; PSAC_MACHINE_INFO MachineInformation; PVOID RequestSacCmdEventObjectBody; PKEVENT RequestSacCmdEventWaitObjectBody; @@ -122,7 +122,7 @@ NTSTATUS NTAPI PreloadGlobalMessageTable(IN PVOID ImageBase) { - NTSTATUS Status; + NTSTATUS Status, Status2; ULONG MessageId, TotalLength, TextSize, i; PWCHAR StringBuffer; PMESSAGE_RESOURCE_ENTRY MessageEntry; @@ -130,6 +130,7 @@ PreloadGlobalMessageTable(IN PVOID ImageBase) SAC_DBG(SAC_DBG_ENTRY_EXIT, "SAC PreloadGlobalMessageTable: Entering.\n"); /* Nothing to do if we already have a table */ + Status = STATUS_SUCCESS; if (GlobalMessageTable) goto Exit; /* Loop through up to 200 messages */ @@ -137,12 +138,12 @@ PreloadGlobalMessageTable(IN PVOID ImageBase) for (MessageId = 1; MessageId != SAC_MAX_MESSAGES; MessageId++) { /* Find this message ID in the string table*/ - Status = RtlFindMessage(ImageBase, - 11, - LANG_NEUTRAL, - MessageId, - &MessageEntry); - if (NT_SUCCESS(Status)) + Status2 = RtlFindMessage(ImageBase, + 11, + LANG_NEUTRAL, + MessageId, + &MessageEntry); + if (NT_SUCCESS(Status2)) { /* Make sure it's Unicode */ ASSERT(MessageEntry->Flags & MESSAGE_RESOURCE_UNICODE); @@ -182,12 +183,12 @@ PreloadGlobalMessageTable(IN PVOID ImageBase) for (i = 0, MessageId = 1; MessageId != SAC_MAX_MESSAGES; MessageId++) { /* Make sure the message is still there...! */ - Status = RtlFindMessage(ImageBase, - 11, - LANG_NEUTRAL, - MessageId, - &MessageEntry); - if (NT_SUCCESS(Status)) + Status2 = RtlFindMessage(ImageBase, + 11, + LANG_NEUTRAL, + MessageId, + &MessageEntry); + if (NT_SUCCESS(Status2)) { /* Write the entry in the message table*/ GlobalMessageTable[i].Index = MessageId; @@ -202,7 +203,7 @@ PreloadGlobalMessageTable(IN PVOID ImageBase) ASSERT((ULONG)(wcslen(StringBuffer)*sizeof(WCHAR)) <= TextSize); /* Move to the next buffer space */ - StringBuffer += TextSize; + StringBuffer += (TextSize / sizeof(WCHAR)); /* Move to the next entry, make sure the status is full success */ i++; @@ -229,135 +230,6 @@ TearDownGlobalMessageTable(VOID) return STATUS_SUCCESS; } -NTSTATUS -NTAPI -TranslateMachineInformationXML(IN PWCHAR *Buffer, - IN PWCHAR ExtraData) -{ - NTSTATUS Status; - ULONG Size; - PWCHAR p; - CHECK_PARAMETER1(Buffer); - - Status = STATUS_SUCCESS; - Size = wcslen(L"\r\n"); - - if (MachineInformation->MachineName) - { - Size += wcslen(MachineInformation->MachineName); - Size += wcslen(L"%s\r\n"); - } - - if (MachineInformation->MachineGuid) - { - Size += wcslen(MachineInformation->MachineGuid); - Size += wcslen(L"%s\r\n"); - } - - if (MachineInformation->ProcessorArchitecture) - { - Size += wcslen(MachineInformation->ProcessorArchitecture); - Size += wcslen(L"%s\r\n"); - } - - if (MachineInformation->MajorVersion) - { - Size += wcslen(MachineInformation->MajorVersion); - Size += wcslen(L"%s\r\n"); - } - - if (MachineInformation->BuildNumber) - { - Size += wcslen(MachineInformation->BuildNumber); - Size += wcslen(L"%s\r\n"); - } - - if (MachineInformation->ProductType) - { - Size += wcslen(MachineInformation->ProductType); - Size += wcslen(L"%s\r\n"); - } - - if (MachineInformation->ServicePack) - { - Size += wcslen(MachineInformation->ServicePack); - Size += wcslen(L"%s\r\n"); - } - - if (ExtraData) Size += wcslen(ExtraData); - - Size += wcslen(L"\r\n"); - - p = (PWCHAR)SacAllocatePool((Size + sizeof(ANSI_NULL)) * sizeof(WCHAR), GLOBAL_BLOCK_TAG); - - *Buffer = p; - if (!p) return STATUS_NO_MEMORY; - - Size = wcslen(L"\r\n"); - wcscpy(p, L"\r\n"); - - p += Size; - - if (MachineInformation->MachineName) - { - p += swprintf(p, L"%s\r\n", MachineInformation->MachineName); - } - - if (MachineInformation->MachineGuid) - { - p += swprintf(p, L"%s\r\n", MachineInformation->MachineGuid); - } - - if (MachineInformation->ProcessorArchitecture) - { - p += swprintf(p, L"%s\r\n", MachineInformation->ProcessorArchitecture); - } - - if (MachineInformation->MajorVersion) - { - p += swprintf(p, L"%s\r\n", MachineInformation->MajorVersion); - } - - if (MachineInformation->BuildNumber) - { - p += swprintf(p, L"%s\r\n", MachineInformation->BuildNumber); - } - - if (MachineInformation->ProductType) - { - p += swprintf(p, L"%s\r\n", MachineInformation->ProductType); - } - - if (MachineInformation->ServicePack) - { - p += swprintf(p, L"%s\r\n", MachineInformation->ServicePack); - } - - if (ExtraData) - { - Size = wcslen(ExtraData); - wcscpy(p, ExtraData); - p += Size; - } - - wcscpy(p, L"\r\n"); - ASSERT((((ULONG) wcslen(*Buffer) + 1) * sizeof(WCHAR)) <= Size); - return Status; -} - -VOID -NTAPI -InitializeMachineInformation(VOID) -{ - SAC_DBG(SAC_DBG_ENTRY_EXIT, "SAC Initialize Machine Information : Entering.\n"); - - /* FIXME: TODO */ - MachineInformation = NULL; - ASSERT(FALSE); - - SAC_DBG(SAC_DBG_ENTRY_EXIT, "SAC Initialize Machine Information : Exiting with error.\n"); -} - NTSTATUS NTAPI GetRegistryValueBuffer(IN PCWSTR KeyName, @@ -479,7 +351,7 @@ SetRegistryValue(IN PCWSTR KeyName, NTSTATUS NTAPI -CopyRegistryValueData(IN PULONG* Buffer, +CopyRegistryValueData(IN PVOID* Buffer, IN PKEY_VALUE_PARTIAL_INFORMATION PartialInfo) { NTSTATUS Status = STATUS_SUCCESS; @@ -504,6 +376,446 @@ CopyRegistryValueData(IN PULONG* Buffer, return Status; } +NTSTATUS +NTAPI +TranslateMachineInformationXML(IN PWCHAR *Buffer, + IN PWCHAR ExtraData) +{ + NTSTATUS Status; + ULONG Size; + PWCHAR p; + CHECK_PARAMETER1(Buffer); + + /* Start by believing the world is beautiful */ + Status = STATUS_SUCCESS; + + /* First, the header */ + Size = wcslen(L"\r\n"); + + /* Do we have a machine name? */ + if (MachineInformation->MachineName) + { + /* Go and add it in */ + Size += wcslen(MachineInformation->MachineName); + Size += wcslen(L"%s\r\n"); + } + + /* Do we have a GUID? */ + if (MachineInformation->MachineGuid) + { + /* Go and add it in */ + Size += wcslen(MachineInformation->MachineGuid); + Size += wcslen(L"%s\r\n"); + } + + /* Do we know the processor? */ + if (MachineInformation->ProcessorArchitecture) + { + /* Go and add it in */ + Size += wcslen(MachineInformation->ProcessorArchitecture); + Size += wcslen(L"%s\r\n"); + } + + /* Do we have the version? */ + if (MachineInformation->MajorVersion) + { + /* Go and add it in */ + Size += wcslen(MachineInformation->MajorVersion); + Size += wcslen(L"%s\r\n"); + } + + /* Do we have the build? */ + if (MachineInformation->BuildNumber) + { + /* Go and add it in */ + Size += wcslen(MachineInformation->BuildNumber); + Size += wcslen(L"%s\r\n"); + } + + /* Do we have the product type? */ + if (MachineInformation->ProductType) + { + /* Go and add it in */ + Size += wcslen(MachineInformation->ProductType); + Size += wcslen(L"%s\r\n"); + } + + /* Do we have a service pack? */ + if (MachineInformation->ServicePack) + { + /* Go and add it in */ + Size += wcslen(MachineInformation->ServicePack); + Size += wcslen(L"%s\r\n"); + } + + /* Anything else we need to know? Add it in too */ + if (ExtraData) Size += wcslen(ExtraData); + + /* Finally, add the footer */ + Size += wcslen(L"\r\n"); + + /* Convert to bytes and add a NULL */ + Size += sizeof(ANSI_NULL); + Size *= sizeof(WCHAR); + + /* Allocate space for the buffer */ + p = SacAllocatePool(Size, GLOBAL_BLOCK_TAG); + *Buffer = p; + if (!p) return STATUS_NO_MEMORY; + + wcscpy(p, L"\r\n"); + p += wcslen(L"\r\n");; + + if (MachineInformation->MachineName) + { + p += swprintf(p, + L"%s\r\n", + MachineInformation->MachineName); + } + + if (MachineInformation->MachineGuid) + { + p += swprintf(p, + L"%s\r\n", + MachineInformation->MachineGuid); + } + + if (MachineInformation->ProcessorArchitecture) + { + p += swprintf(p, + L"%s\r\n", + MachineInformation->ProcessorArchitecture); + } + + if (MachineInformation->MajorVersion) + { + p += swprintf(p, + L"%s\r\n", + MachineInformation->MajorVersion); + } + + if (MachineInformation->BuildNumber) + { + p += swprintf(p, + L"%s\r\n", + MachineInformation->BuildNumber); + } + + if (MachineInformation->ProductType) + { + p += swprintf(p, + L"%s\r\n", + MachineInformation->ProductType); + } + + if (MachineInformation->ServicePack) + { + p += swprintf(p, + L"%s\r\n", + MachineInformation->ServicePack); + } + + if (ExtraData) + { + wcscpy(p, ExtraData); + p += wcslen(ExtraData); + } + + wcscpy(p, L"\r\n"); + SAC_DBG(SAC_DBG_ENTRY_EXIT, "MachineInformation: %S\n", *Buffer); + ASSERT((((ULONG)wcslen(*Buffer) + 1) * sizeof(WCHAR)) <= Size); + return Status; +} + +VOID +NTAPI +InitializeMachineInformation(VOID) +{ + NTSTATUS Status; + PWCHAR GuidString, MajorVersion, ServicePack, BuildNumber, MessageBuffer; + PWCHAR ProductType; + ULONG SuiteTypeMessage; + BOOLEAN SetupInProgress = FALSE; + GUID SystemGuid; + ULONG RealSize, Size, OutputSize; + PKEY_VALUE_PARTIAL_INFORMATION PartialInfo; + RTL_OSVERSIONINFOEXW VersionInformation; + SAC_DBG(SAC_DBG_ENTRY_EXIT, "SAC Initialize Machine Information : Entering.\n"); + + /* Don't do anything if we already quried this */ + if (MachineInformation) + { + SAC_DBG(SAC_DBG_MACHINE, "SAC Initialize Machine Information:: MachineInformationBuffer already initialzied.\n"); + return; + } + + /* Allocate the machine information */ + MachineInformation = SacAllocatePool(sizeof(*MachineInformation), + GLOBAL_BLOCK_TAG); + if (!MachineInformation) + { + goto Fail; + } + + /* Zero it out for now */ + RtlZeroMemory(MachineInformation, sizeof(*MachineInformation)); + + /* Query OS version */ + RtlZeroMemory(&VersionInformation, sizeof(VersionInformation)); + VersionInformation.dwOSVersionInfoSize = sizeof(VersionInformation); + Status = RtlGetVersion((PRTL_OSVERSIONINFOW)&VersionInformation); + if (!NT_SUCCESS(Status)) + { + SAC_DBG(SAC_DBG_ENTRY_EXIT, "SAC InitializeMachineInformation: Exiting (2).\n"); + goto Fail; + } + + /* Check if setup is in progress */ + Status = GetRegistryValueBuffer(L"\\Registry\\Machine\\System\\Setup", + L"SystemSetupInProgress", + &PartialInfo); + if (NT_SUCCESS(Status)) + { + /* The key is there, is the value set? */ + if (*(PULONG)PartialInfo->Data) SetupInProgress = TRUE; + SacFreePool(PartialInfo); + if (SetupInProgress) + { + /* Yes, so we'll use a special hostname to identify this */ + MessageBuffer = GetMessage(SAC_UNINITIALIZED_MSG); + Size = wcslen(MessageBuffer); + ASSERT(Size > 0); + RealSize = Size * sizeof(WCHAR) + sizeof(UNICODE_NULL); + + /* Make room for it and copy it in there */ + MachineInformation->MachineName = SacAllocatePool(RealSize, + GLOBAL_BLOCK_TAG); + if (MachineInformation->MachineName) + { + wcscpy(MachineInformation->MachineName, MessageBuffer); + } + } + } + + /* If we are not in setup mode, or if we failed to check... */ + if (!SetupInProgress) + { + /* Query the computer name */ + Status = GetRegistryValueBuffer(L"\\Registry\\Machine\\System\\" + L"CurrentControlSet\\Control\\" + L"ComputerName\\ComputerName", + L"ComputerName", + &PartialInfo); + if (!NT_SUCCESS(Status)) + { + /* It's not critical, but we won't have it */ + SAC_DBG(SAC_DBG_ENTRY_EXIT, "SAC InitializeMachineInformation: Failed to get machine name.\n"); + } + else + { + /* We have the name, copy it from the registry */ + Status = CopyRegistryValueData((PVOID*)&MachineInformation-> + MachineName, + PartialInfo); + SacFreePool(PartialInfo); + if (!NT_SUCCESS(Status)) + { + SAC_DBG(SAC_DBG_ENTRY_EXIT, "SAC InitializeMachineInformation: Exiting (20).\n"); + goto Fail; + } + } + } + + /* Next step, try to get the machine GUID */ + RtlZeroMemory(&SystemGuid, sizeof(SystemGuid)); + OutputSize = sizeof(SystemGuid); + Status = HeadlessDispatch(HeadlessCmdQueryGUID, + NULL, + 0, + &SystemGuid, + &OutputSize); + if (!NT_SUCCESS(Status)) + { + SAC_DBG(SAC_DBG_ENTRY_EXIT, "SAC InitializeMachineInformation: Failed to get Machine GUID.\n"); + } + else + { + /* We have it -- make room for it */ + GuidString = SacAllocatePool(0x50, GLOBAL_BLOCK_TAG); + if (!GuidString) + { + SAC_DBG(SAC_DBG_ENTRY_EXIT, "SAC InitializeMachineInformation: Exiting (31).\n"); + goto Fail; + } + + /* Build the string with the GUID in it, and save the ppointer to it */ + swprintf(GuidString, + L"%08lx-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x", + SystemGuid.Data1, + SystemGuid.Data2, + SystemGuid.Data3, + SystemGuid.Data4[0], + SystemGuid.Data4[1], + SystemGuid.Data4[2], + SystemGuid.Data4[3], + SystemGuid.Data4[4], + SystemGuid.Data4[5], + SystemGuid.Data4[6], + SystemGuid.Data4[7]); + MachineInformation->MachineGuid = GuidString; + } + + /* Next, query the processor architecture */ + Status = GetRegistryValueBuffer(L"\\Registry\\Machine\\System\\" + L"CurrentControlSet\\Control\\" + L"Session Manager\\Environment", + L"PROCESSOR_ARCHITECTURE", + &PartialInfo); + if (!NT_SUCCESS(Status)) + { + /* It's not critical, but we won't have it */ + SAC_DBG(SAC_DBG_ENTRY_EXIT, "SAC InitializeMachineInformation: Exiting (30).\n"); + } + else + { + /* We have it! Copy the value from the registry */ + Status = CopyRegistryValueData((PVOID*)&MachineInformation-> + ProcessorArchitecture, + PartialInfo); + SacFreePool(PartialInfo); + if (!NT_SUCCESS(Status)) + { + SAC_DBG(SAC_DBG_ENTRY_EXIT, "SAC InitializeMachineInformation: Exiting (30).\n"); + goto Fail; + } + } + + /* Now allocate a buffer for the OS version number */ + MajorVersion = SacAllocatePool(0x18, GLOBAL_BLOCK_TAG); + if (!MajorVersion) + { + SAC_DBG(SAC_DBG_ENTRY_EXIT, "SAC InitializeMachineInformation: Exiting (50).\n"); + goto Fail; + } + + /* Build the buffer and set a pointer to it */ + swprintf(MajorVersion, + L"%d.%d", + VersionInformation.dwMajorVersion, + VersionInformation.dwMinorVersion); + MachineInformation->MajorVersion = MajorVersion; + + /* Now allocate a buffer for the OS build number */ + BuildNumber = SacAllocatePool(0xC, GLOBAL_BLOCK_TAG); + if (!BuildNumber) + { + SAC_DBG(SAC_DBG_ENTRY_EXIT, "SAC InitializeMachineInformation: Exiting (60).\n"); + goto Fail; + } + + /* Build the buffer and set a pointer to it */ + swprintf(BuildNumber, L"%d", VersionInformation.dwBuildNumber); + MachineInformation->BuildNumber = BuildNumber; + + /* Now check what kind of SKU this is */ + if (ExVerifySuite(DataCenter)) + { + SuiteTypeMessage = SAC_DATACENTER_SUITE_MSG; + } + else if (ExVerifySuite(EmbeddedNT)) + { + SuiteTypeMessage = SAC_EMBEDDED_SUITE_MSG; + } + else if (ExVerifySuite(Enterprise)) + { + SuiteTypeMessage = SAC_ENTERPRISE_SUITE_MSG; + } + else + { + /* Unknown or perhaps a client SKU */ + SuiteTypeMessage = SAC_NO_SUITE_MSG; + } + + /* Get the string that correponds to the SKU type */ + MessageBuffer = GetMessage(SuiteTypeMessage); + if (!MessageBuffer) + { + /* We won't have it, but this isn't critical */ + SAC_DBG(SAC_DBG_INIT, "SAC InitializeMachineInformation: Failed to get product type.\n"); + } + else + { + /* Calculate the size we need to hold the string */ + Size = wcslen(MessageBuffer); + ASSERT(Size > 0); + RealSize = Size * sizeof(WCHAR) + sizeof(UNICODE_NULL); + + /* Allocate a buffer for it */ + ProductType = SacAllocatePool(RealSize, GLOBAL_BLOCK_TAG); + if (!ProductType) + { + SAC_DBG(SAC_DBG_INIT, "SAC InitializeMachineInformation: Failed product type memory allocation.\n"); + goto Fail; + } + + /* Copy the string and set the pointer */ + RtlCopyMemory(ProductType, MessageBuffer, RealSize); + MachineInformation->ProductType = ProductType; + } + + /* Check if this is a SP version or RTM version */ + if (VersionInformation.wServicePackMajor) + { + /* This is a service pack, allocate a buffer for the version */ + ServicePack = SacAllocatePool(0x18, GLOBAL_BLOCK_TAG); + if (ServicePack) + { + /* Build the buffer and set a pointer to it */ + swprintf(ServicePack, + L"%d.%d", + VersionInformation.wServicePackMajor, + VersionInformation.wServicePackMinor); + MachineInformation->ServicePack = ServicePack; + + /* We've collected all the machine info and are done! */ + return; + } + + /* This is the failure path */ + SAC_DBG(SAC_DBG_INIT, "SAC InitializeMachineInformation: Failed service pack memory allocation.\n"); + } + else + { + /* Get a generic string that indicates there's no service pack */ + MessageBuffer = GetMessage(SAC_NO_DATA_MSG); + Size = wcslen(MessageBuffer); + ASSERT(Size > 0); + RealSize = Size * sizeof(WCHAR) + sizeof(UNICODE_NULL); + + /* Allocate memory for the "no service pack" string */ + ServicePack = SacAllocatePool(RealSize, GLOBAL_BLOCK_TAG); + if (ServicePack) + { + /* Copy the buffer and set a pointer to it */ + RtlCopyMemory(ServicePack, MessageBuffer, RealSize); + MachineInformation->ServicePack = ServicePack; + + /* We've collected all the machine info and are done! */ + return; + } + + SAC_DBG(SAC_DBG_INIT, "SAC InitializeMachineInformation: Failed service pack memory allocation.\n"); + } + +Fail: + /* In the failure path, always cleanup the machine information buffer */ + if (MachineInformation) + { + SacFreePool(MachineInformation); + } + SAC_DBG(SAC_DBG_ENTRY_EXIT, "SAC Initialize Machine Information : Exiting with error.\n"); +} + NTSTATUS NTAPI GetCommandConsoleLaunchingPermission(OUT PBOOLEAN Permission) @@ -549,7 +861,7 @@ ImposeSacCmdServiceStartTypePolicy(VOID) if (!Buffer) return STATUS_UNSUCCESSFUL; /* Read the value */ - Status = CopyRegistryValueData(&Data, Buffer); + Status = CopyRegistryValueData((PVOID*)&Data, Buffer); SacFreePool(Buffer); if (!NT_SUCCESS(Status)) return Status; @@ -632,7 +944,7 @@ NTAPI RegisterBlueScreenMachineInformation(VOID) { PWCHAR XmlBuffer; - PHEADLESS_BLUE_SCREEN_DATA BsBuffer; + PHEADLESS_CMD_SET_BLUE_SCREEN_DATA BsBuffer; ULONG Length, HeaderLength, TotalLength; NTSTATUS Status; ULONG i; @@ -653,15 +965,15 @@ RegisterBlueScreenMachineInformation(VOID) CHECK_PARAMETER_WITH_STATUS(BsBuffer, STATUS_NO_MEMORY); /* Copy the XML property name */ - strcpy((PCHAR)BsBuffer->XMLData, "MACHINEINFO"); - BsBuffer->Property = (PUCHAR)HeaderLength + sizeof(ANSI_NULL); + strcpy((PCHAR)BsBuffer->Data, "MACHINEINFO"); + BsBuffer->ValueIndex = HeaderLength + sizeof(ANSI_NULL); /* Copy the data and NULL-terminate it */ for (i = 0; i < Length; i++) { - BsBuffer->XMLData[HeaderLength + sizeof(ANSI_NULL) + i] = XmlBuffer[i]; + BsBuffer->Data[BsBuffer->ValueIndex + i] = XmlBuffer[i]; } - BsBuffer->XMLData[HeaderLength + sizeof(ANSI_NULL) + i] = ANSI_NULL; + BsBuffer->Data[BsBuffer->ValueIndex + i] = ANSI_NULL; /* Let the OS save the buffer for later */ Status = HeadlessDispatch(HeadlessCmdSetBlueScreenData, diff --git a/reactos/include/reactos/mc/CMakeLists.txt b/reactos/include/reactos/mc/CMakeLists.txt index 8037a7c2575..a1d652e6401 100644 --- a/reactos/include/reactos/mc/CMakeLists.txt +++ b/reactos/include/reactos/mc/CMakeLists.txt @@ -7,9 +7,12 @@ list(APPEND UNICODE_SOURCE neteventmsg.mc ntiologc.mc ntstatus.mc - pciclass.mc + pciclass.mc) + +list(APPEND UNICODE_SOURCE_REALLY sacmsg.mc) add_message_headers(ANSI ${ANSI_SOURCE}) # FIXME: this needs testing before switching to unicode add_message_headers(ANSI ${UNICODE_SOURCE}) +add_message_headers(UNICODE ${UNICODE_SOURCE_REALLY}) diff --git a/reactos/include/reactos/mc/sacmsg.mc b/reactos/include/reactos/mc/sacmsg.mc index 4d3052c3d42..4802bc0ccf1 100644 --- a/reactos/include/reactos/mc/sacmsg.mc +++ b/reactos/include/reactos/mc/sacmsg.mc @@ -461,7 +461,7 @@ Language=English . MessageId=98 -SymbolicName=SACDRV_98 +SymbolicName=SAC_NO_DATA_MSG Language=English None%0 . @@ -473,25 +473,25 @@ Language=English . MessageId=100 -SymbolicName=SACDRV_100 +SymbolicName=SAC_DATACENTER_SUITE_MSG Language=English Windows Server 2003 Datacenter Edition%0 . MessageId=101 -SymbolicName=SACDRV_101 +SymbolicName=SAC_EMBEDDED_SUITE_MSG Language=English Windows Server 2003 Embedded%0 . MessageId=102 -SymbolicName=SACDRV_102 +SymbolicName=SAC_ENTERPRISE_SUITE_MSG Language=English Windows Server 2003 Enterprise Edition%0 . MessageId=103 -SymbolicName=SACDRV_103 +SymbolicName=SAC_NO_SUITE_MSG Language=English Windows Server 2003%0 . @@ -695,7 +695,7 @@ The specified gateway IP address is invalid. . MessageId=153 -SymbolicName=SACDRV_153 +SymbolicName=SAC_UNINITIALIZED_MSG Language=English not yet initialized%0 . diff --git a/reactos/ntoskrnl/ex/hdlsterm.c b/reactos/ntoskrnl/ex/hdlsterm.c index f91b32cc78a..6f2b5af584f 100644 --- a/reactos/ntoskrnl/ex/hdlsterm.c +++ b/reactos/ntoskrnl/ex/hdlsterm.c @@ -17,111 +17,156 @@ PHEADLESS_GLOBALS HeadlessGlobals; /* FUNCTIONS *****************************************************************/ +FORCEINLINE +KIRQL +HdlspAcquireGlobalLock(VOID) +{ + KIRQL OldIrql; + + /* Don't acquire the lock if we are bugchecking */ + if (!HeadlessGlobals->InBugCheck) + { + KeAcquireSpinLock(&HeadlessGlobals->SpinLock, &OldIrql); + } + else + { + OldIrql = 0xFF; + } + + return OldIrql; +} + +FORCEINLINE +VOID +HdlspReleaselobalLock(IN KIRQL OldIrql) +{ + /* Only release the lock if we aren't bugchecking */ + if (OldIrql != 0xFF) + { + KeReleaseSpinLock(&HeadlessGlobals->SpinLock, OldIrql); + } + else + { + ASSERT(HeadlessGlobals->InBugCheck == TRUE); + } +} + VOID NTAPI -HdlspSendStringAtBaud( - IN PUCHAR String - ) +HdlspSendStringAtBaud(IN PUCHAR String) { - /* Send every byte */ - while (*String++ != ANSI_NULL) - { - InbvPortPutByte(HeadlessGlobals->TerminalPort, *String); - } + /* Send every byte */ + while (*String++ != ANSI_NULL) + { + InbvPortPutByte(HeadlessGlobals->TerminalPort, *String); + } } NTSTATUS NTAPI -HdlspEnableTerminal( - IN BOOLEAN Enable - ) +HdlspEnableTerminal(IN BOOLEAN Enable) { - /* Enable if requested, as long as this isn't a PCI serial port crashing */ - if ((Enable) && - !(HeadlessGlobals->TerminalEnabled) && - !((HeadlessGlobals->IsMMIODevice) && (HeadlessGlobals->InBugCheck))) - { - /* Initialize the COM port with cportlib */ - HeadlessGlobals->TerminalEnabled = InbvPortInitialize( - HeadlessGlobals->TerminalBaudRate, - HeadlessGlobals->TerminalPortNumber, - HeadlessGlobals->TerminalPortAddress, - &HeadlessGlobals->TerminalPort, - HeadlessGlobals->IsMMIODevice); - if (!HeadlessGlobals->TerminalEnabled) return STATUS_UNSUCCESSFUL; + /* Enable if requested, as long as this isn't a PCI serial port crashing */ + if ((Enable) && + !(HeadlessGlobals->TerminalEnabled) && + !((HeadlessGlobals->IsMMIODevice) && (HeadlessGlobals->InBugCheck))) + { + /* Initialize the COM port with cportlib */ + HeadlessGlobals->TerminalEnabled = InbvPortInitialize(HeadlessGlobals-> + TerminalBaudRate, + HeadlessGlobals-> + TerminalPortNumber, + HeadlessGlobals-> + TerminalPortAddress, + &HeadlessGlobals-> + TerminalPort, + HeadlessGlobals-> + IsMMIODevice); + if (!HeadlessGlobals->TerminalEnabled) + { + DPRINT1("Failed to initialize port through cportlib\n"); + return STATUS_UNSUCCESSFUL; + } - /* Cleanup the screen and reset the cursor */ - HdlspSendStringAtBaud((PUCHAR)"\x1B[2J"); - HdlspSendStringAtBaud((PUCHAR)"\x1B[H"); + /* Cleanup the screen and reset the cursor */ + HdlspSendStringAtBaud((PUCHAR)"\x1B[2J"); + HdlspSendStringAtBaud((PUCHAR)"\x1B[H"); - /* Enable FIFO */ - InbvPortEnableFifo(HeadlessGlobals->TerminalPort, TRUE); - } - else if (!Enable) - { - /* Specific case when headless is being disabled */ - InbvPortTerminate(HeadlessGlobals->TerminalPort); - HeadlessGlobals->TerminalPort = 0; - HeadlessGlobals->TerminalEnabled = FALSE; - } - return STATUS_SUCCESS; + /* Enable FIFO */ + InbvPortEnableFifo(HeadlessGlobals->TerminalPort, TRUE); + } + else if (!Enable) + { + /* Specific case when headless is being disabled */ + InbvPortTerminate(HeadlessGlobals->TerminalPort); + HeadlessGlobals->TerminalPort = 0; + HeadlessGlobals->TerminalEnabled = FALSE; + } + + /* All done */ + return STATUS_SUCCESS; } VOID NTAPI INIT_FUNCTION -HeadlessInit( - IN PLOADER_PARAMETER_BLOCK LoaderBlock - ) +HeadlessInit(IN PLOADER_PARAMETER_BLOCK LoaderBlock) { - PHEADLESS_LOADER_BLOCK HeadlessBlock; + PHEADLESS_LOADER_BLOCK HeadlessBlock; - HeadlessBlock = LoaderBlock->Extension->HeadlessLoaderBlock; - if (!HeadlessBlock) return; - if ((HeadlessBlock->PortNumber > 4) && (HeadlessBlock->UsedBiosSettings)) return; + /* Only initialize further if the loader found EMS enabled */ + HeadlessBlock = LoaderBlock->Extension->HeadlessLoaderBlock; + if (!HeadlessBlock) return; - HeadlessGlobals = ExAllocatePoolWithTag( - NonPagedPool, - sizeof(HEADLESS_GLOBALS), - 'sldH'); - if (!HeadlessGlobals) return; + /* Ignore invalid EMS settings */ + if ((HeadlessBlock->PortNumber > 4) && (HeadlessBlock->UsedBiosSettings)) return; - /* Zero and copy loader data */ - RtlZeroMemory(HeadlessGlobals, sizeof(HEADLESS_GLOBALS)); - HeadlessGlobals->TerminalPortNumber = HeadlessBlock->PortNumber; - HeadlessGlobals->TerminalPortAddress = HeadlessBlock->PortAddress; - HeadlessGlobals->TerminalBaudRate = HeadlessBlock->BaudRate; - HeadlessGlobals->TerminalParity = HeadlessBlock->Parity; - HeadlessGlobals->TerminalStopBits = HeadlessBlock->StopBits; - HeadlessGlobals->UsedBiosSettings = HeadlessBlock->UsedBiosSettings; - HeadlessGlobals->IsMMIODevice = HeadlessBlock->IsMMIODevice; - HeadlessGlobals->TerminalType = HeadlessBlock->TerminalType; - HeadlessGlobals->SystemGUID = HeadlessBlock->SystemGUID; + /* Allocate the global headless data */ + HeadlessGlobals = ExAllocatePoolWithTag(NonPagedPool, + sizeof(*HeadlessGlobals), + 'sldH'); + if (!HeadlessGlobals) return; - /* These two are opposites of each other */ - if (HeadlessGlobals->IsMMIODevice) HeadlessGlobals->IsNonLegacyDevice = TRUE; + /* Zero and copy loader data */ + RtlZeroMemory(HeadlessGlobals, sizeof(*HeadlessGlobals)); + HeadlessGlobals->TerminalPortNumber = HeadlessBlock->PortNumber; + HeadlessGlobals->TerminalPortAddress = HeadlessBlock->PortAddress; + HeadlessGlobals->TerminalBaudRate = HeadlessBlock->BaudRate; + HeadlessGlobals->TerminalParity = HeadlessBlock->Parity; + HeadlessGlobals->TerminalStopBits = HeadlessBlock->StopBits; + HeadlessGlobals->UsedBiosSettings = HeadlessBlock->UsedBiosSettings; + HeadlessGlobals->IsMMIODevice = HeadlessBlock->IsMMIODevice; + HeadlessGlobals->TerminalType = HeadlessBlock->TerminalType; + HeadlessGlobals->SystemGUID = HeadlessBlock->SystemGUID; + DPRINT1("EMS on Port %d (0x%lx) at %d bps\n", + HeadlessGlobals->TerminalPortNumber, + HeadlessGlobals->TerminalPortAddress, + HeadlessGlobals->TerminalBaudRate); - /* Check for a PCI device, warn that this isn't supported */ - if (HeadlessBlock->PciDeviceId != PCI_INVALID_VENDORID) - { - DPRINT1("PCI Serial Ports not supported\n"); - } + /* These two are opposites of each other */ + if (HeadlessGlobals->IsMMIODevice) HeadlessGlobals->IsNonLegacyDevice = TRUE; - /* Log entries are not yet supported */ - DPRINT1("FIXME: No Headless logging support\n"); + /* Check for a PCI device, warn that this isn't supported */ + if (HeadlessBlock->PciDeviceId != PCI_INVALID_VENDORID) + { + DPRINT1("PCI Serial Ports not supported\n"); + } - /* Allocate temporary buffer */ - HeadlessGlobals->TmpBuffer = ExAllocatePoolWithTag(NonPagedPool, 80, 'sldH'); - if (!HeadlessGlobals->TmpBuffer) return; + /* Log entries are not yet supported */ + DPRINT1("FIXME: No Headless logging support\n"); - /* Windows seems to apply some special hacks for 9600 bps */ - if (HeadlessGlobals->TerminalBaudRate == 9600) - { - DPRINT1("Please use other baud rate than 9600bps for now\n"); - } + /* Allocate temporary buffer */ + HeadlessGlobals->TmpBuffer = ExAllocatePoolWithTag(NonPagedPool, 80, 'sldH'); + if (!HeadlessGlobals->TmpBuffer) return; - /* Enable the terminal */ - HdlspEnableTerminal(TRUE); + /* Windows seems to apply some special hacks for 9600 bps */ + if (HeadlessGlobals->TerminalBaudRate == 9600) + { + DPRINT1("Please use other baud rate than 9600bps for now\n"); + } + + /* Enable the terminal */ + HdlspEnableTerminal(TRUE); } VOID @@ -197,59 +242,80 @@ HdlspPutString( NTSTATUS NTAPI -HdlspDispatch( - IN HEADLESS_CMD Command, - IN PVOID InputBuffer, - IN SIZE_T InputBufferSize, - OUT PVOID OutputBuffer, - OUT PSIZE_T OutputBufferSize - ) +HdlspDispatch(IN HEADLESS_CMD Command, + IN PVOID InputBuffer, + IN SIZE_T InputBufferSize, + OUT PVOID OutputBuffer, + OUT PSIZE_T OutputBufferSize) { - //NTSTATUS Status = STATUS_NOT_IMPLEMENTED; - ASSERT(HeadlessGlobals != NULL); + KIRQL OldIrql; + PHEADLESS_RSP_QUERY_INFO HeadlessInfo; + PHEADLESS_CMD_PUT_STRING PutString; + PHEADLESS_CMD_ENABLE_TERMINAL EnableTerminal; + NTSTATUS Status = STATUS_NOT_IMPLEMENTED; + ASSERT(HeadlessGlobals != NULL); // ASSERT(HeadlessGlobals->PageLockHandle != NULL); - /* FIXME: This should be using the headless spinlock */ + /* Ignore non-reentrant commands */ + if ((Command != HeadlessCmdAddLogEntry) && + (Command != HeadlessCmdStartBugCheck) && + (Command != HeadlessCmdSendBlueScreenData) && + (Command != HeadlessCmdDoBugCheckProcessing)) + { + OldIrql = HdlspAcquireGlobalLock(); - /* Ignore non-reentrant commands */ - if ((Command != HeadlessCmdAddLogEntry) && - (Command != HeadlessCmdStartBugCheck) && - (Command != HeadlessCmdSendBlueScreenData) && - (Command != HeadlessCmdDoBugCheckProcessing)) - { - if (HeadlessGlobals->ProcessingCmd) return STATUS_UNSUCCESSFUL; + if (HeadlessGlobals->ProcessingCmd) + { + HdlspReleaselobalLock(OldIrql); + return STATUS_UNSUCCESSFUL; + } - /* Don't allow these commands next time */ - HeadlessGlobals->ProcessingCmd = TRUE; - } + /* Don't allow these commands next time */ + HeadlessGlobals->ProcessingCmd = TRUE; + HdlspReleaselobalLock(OldIrql); + } + + /* Handle each command */ + switch (Command) + { + case HeadlessCmdEnableTerminal: + + /* Make sure the caller passed valid data */ + if (!(InputBuffer) || + (InputBufferSize != sizeof(*EnableTerminal))) + { + DPRINT1("Invalid buffer\n"); + Status = STATUS_INVALID_PARAMETER; + break; + } + + /* Go and enable it */ + EnableTerminal = InputBuffer; + Status = HdlspEnableTerminal(EnableTerminal->Enable); + break; - /* Handle each command */ - switch (Command) - { - case HeadlessCmdEnableTerminal: - break; case HeadlessCmdCheckForReboot: break; case HeadlessCmdPutString: - /* Validate the existence of an input buffer */ - if (!InputBuffer) - { - //Status = STATUS_INVALID_PARAMETER; - goto Reset; - } + /* Validate the existence of an input buffer */ + if (!InputBuffer) + { + Status = STATUS_INVALID_PARAMETER; + break; + } /* Terminal should be on */ if (HeadlessGlobals->TerminalEnabled) { /* Print each byte in the string making sure VT100 chars are used */ - PHEADLESS_CMD_PUT_STRING PutString = (PVOID)InputBuffer; + PutString = InputBuffer; HdlspPutString(PutString->String); } /* Return success either way */ - //Status = STATUS_SUCCESS; + Status = STATUS_SUCCESS; break; case HeadlessCmdClearDisplay: break; @@ -276,13 +342,62 @@ HdlspDispatch( case HeadlessCmdDoBugCheckProcessing: break; case HeadlessCmdQueryInformation: - break; + + /* Make sure the caller passed valid data */ + if (!(OutputBuffer) || + !(OutputBufferSize) || + (*OutputBufferSize < sizeof(*HeadlessInfo))) + { + DPRINT1("Invalid buffer\n"); + Status = STATUS_INVALID_PARAMETER; + break; + } + + /* If we got here, headless is enabled -- we know this much */ + HeadlessInfo = OutputBuffer; + HeadlessInfo->PortType = HeadlessSerialPort; + HeadlessInfo->Serial.TerminalAttached = TRUE; + HeadlessInfo->Serial.UsedBiosSettings = HeadlessGlobals->UsedBiosSettings; + HeadlessInfo->Serial.TerminalBaudRate = HeadlessGlobals->TerminalBaudRate; + HeadlessInfo->Serial.TerminalType = HeadlessGlobals->TerminalType; + + /* Now check on what port/baud it's enabled on */ + if ((HeadlessGlobals->TerminalPortNumber >= 1) || + (HeadlessGlobals->UsedBiosSettings)) + { + /* Get the EMS information */ + HeadlessInfo->Serial.TerminalPort = HeadlessGlobals-> + TerminalPortNumber; + HeadlessInfo->Serial.TerminalPortBaseAddress = HeadlessGlobals-> + TerminalPortAddress; + } + else + { + /* We don't know for sure */ + HeadlessInfo->Serial.TerminalPort = SerialPortUndefined; + HeadlessInfo->Serial.TerminalPortBaseAddress = 0; + } + + /* All done */ + Status = STATUS_SUCCESS; + break; case HeadlessCmdAddLogEntry: break; case HeadlessCmdDisplayLog: break; - case HeadlessCmdSetBlueScreenData: - break; + case HeadlessCmdSetBlueScreenData: + + /* Validate the existence of an input buffer */ + if (!InputBuffer) + { + Status = STATUS_INVALID_PARAMETER; + break; + } + + /* Lie so that we can get Hdl bringup a little bit further */ + UNIMPLEMENTED; + Status = STATUS_SUCCESS; + break; case HeadlessCmdSendBlueScreenData: break; case HeadlessCmdQueryGUID: @@ -293,60 +408,60 @@ HdlspDispatch( break; } -Reset: - /* Unset prcessing state */ - if ((Command != HeadlessCmdAddLogEntry) && - (Command != HeadlessCmdStartBugCheck) && - (Command != HeadlessCmdSendBlueScreenData) && - (Command != HeadlessCmdDoBugCheckProcessing)) - { - ASSERT(HeadlessGlobals->ProcessingCmd == TRUE); - HeadlessGlobals->ProcessingCmd = FALSE; - } + /* Unset processing state */ + if ((Command != HeadlessCmdAddLogEntry) && + (Command != HeadlessCmdStartBugCheck) && + (Command != HeadlessCmdSendBlueScreenData) && + (Command != HeadlessCmdDoBugCheckProcessing)) + { + ASSERT(HeadlessGlobals->ProcessingCmd == TRUE); + HeadlessGlobals->ProcessingCmd = FALSE; + } - //UNIMPLEMENTED; - return STATUS_SUCCESS; + /* All done */ + return Status; } /* - * @unimplemented + * @implemented */ NTSTATUS NTAPI -HeadlessDispatch( - IN HEADLESS_CMD Command, - IN PVOID InputBuffer, - IN SIZE_T InputBufferSize, - OUT PVOID OutputBuffer, - OUT PSIZE_T OutputBufferSize - ) +HeadlessDispatch(IN HEADLESS_CMD Command, + IN PVOID InputBuffer, + IN SIZE_T InputBufferSize, + OUT PVOID OutputBuffer, + OUT PSIZE_T OutputBufferSize) { - /* Check for stubs that will expect something even with headless off */ - if (!HeadlessGlobals) - { - /* Don't allow the SAC to connect */ - if (Command == HeadlessCmdEnableTerminal) return STATUS_UNSUCCESSFUL; + /* Check for stubs that will expect something even with headless off */ + if (!HeadlessGlobals) + { + /* Don't allow the SAC to connect */ + if (Command == HeadlessCmdEnableTerminal) return STATUS_UNSUCCESSFUL; - /* Send bogus reply */ - if ((Command == HeadlessCmdQueryInformation) || - (Command == HeadlessCmdGetByte) || - (Command == HeadlessCmdGetLine) || - (Command == HeadlessCmdCheckForReboot) || - (Command == HeadlessCmdTerminalPoll)) - { - if (!(OutputBuffer) || !(OutputBufferSize)) return STATUS_INVALID_PARAMETER; - RtlZeroMemory(OutputBuffer, *OutputBufferSize); - } - return STATUS_SUCCESS; - } - - /* Do the real work */ - return HdlspDispatch( - Command, - InputBuffer, - InputBufferSize, - OutputBuffer, - OutputBufferSize); -} + /* Send bogus reply */ + if ((Command == HeadlessCmdQueryInformation) || + (Command == HeadlessCmdGetByte) || + (Command == HeadlessCmdGetLine) || + (Command == HeadlessCmdCheckForReboot) || + (Command == HeadlessCmdTerminalPoll)) + { + if (!(OutputBuffer) || !(OutputBufferSize)) + { + return STATUS_INVALID_PARAMETER; + } + + RtlZeroMemory(OutputBuffer, *OutputBufferSize); + } + return STATUS_SUCCESS; + } + + /* Do the real work */ + return HdlspDispatch(Command, + InputBuffer, + InputBufferSize, + OutputBuffer, + OutputBufferSize); +} /* EOF */ diff --git a/reactos/ntoskrnl/include/internal/hdl.h b/reactos/ntoskrnl/include/internal/hdl.h index 349a9070f7b..073f1b9cb7f 100644 --- a/reactos/ntoskrnl/include/internal/hdl.h +++ b/reactos/ntoskrnl/include/internal/hdl.h @@ -72,12 +72,11 @@ typedef struct _HEADLESS_LOG_ENTRY // // Headless Bugcheck Information // -typedef struct _HEADLESS_BLUE_SCREEN_DATA +typedef struct _HEADLESS_CMD_SET_BLUE_SCREEN_DATA { - PUCHAR Property; - PUCHAR XMLData; - struct _HEADLESS_BLUE_SCREEN_DATA *Next; -} HEADLESS_BLUE_SCREEN_DATA, * PHEADLESS_BLUE_SCREEN_DATA; + ULONG ValueIndex; + UCHAR Data[ANYSIZE_ARRAY]; +} HEADLESS_CMD_SET_BLUE_SCREEN_DATA, *PHEADLESS_CMD_SET_BLUE_SCREEN_DATA; // // Headless Control Structure, mostly for !SAC @@ -89,7 +88,7 @@ typedef struct _HEADLESS_GLOBALS PHEADLESS_LOG_ENTRY LogEntries; PUCHAR TmpBuffer; PUCHAR InputBuffer; - PHEADLESS_BLUE_SCREEN_DATA BlueScreenData; + PHEADLESS_CMD_SET_BLUE_SCREEN_DATA BlueScreenData; union { struct @@ -183,6 +182,11 @@ typedef struct _HEADLESS_RSP_QUERY_INFO }; } HEADLESS_RSP_QUERY_INFO, *PHEADLESS_RSP_QUERY_INFO; +typedef struct _HEADLESS_CMD_ENABLE_TERMINAL +{ + BOOLEAN Enable; +} HEADLESS_CMD_ENABLE_TERMINAL, *PHEADLESS_CMD_ENABLE_TERMINAL; + typedef struct _HEADLESS_CMD_PUT_STRING { UCHAR String[1];