39 pSetupData->SourcePath.Buffer,
L"unattend.inf");
41 DPRINT(
"UnattendInf path: '%S'\n", UnattendInfPath);
45 DPRINT(
"Does not exist: %S\n", UnattendInfPath);
53 pSetupData->LanguageId,
57 DPRINT(
"SpInfOpenInfFile() failed\n");
64 DPRINT(
"SpInfFindFirstLine() failed for section 'Unattend'\n");
71 DPRINT(
"INF_GetData() failed for key 'Signature'\n");
78 DPRINT(
"Signature not $ReactOS$\n");
88 DPRINT(
"Can't find key 'UnattendSetupEnabled'\n");
94 DPRINT(
"Can't read key 'UnattendSetupEnabled'\n");
100 DPRINT(
"Unattend setup is disabled by 'UnattendSetupEnabled' key!\n");
110 DPRINT(
"SpInfFindFirstLine() failed for key 'DestinationDiskNumber'\n");
116 DPRINT(
"SpInfGetIntField() failed for key 'DestinationDiskNumber'\n");
120 pSetupData->DestinationDiskNumber = (
LONG)IntValue;
125 DPRINT(
"SpInfFindFirstLine() failed for key 'DestinationPartitionNumber'\n");
131 DPRINT(
"SpInfGetIntField() failed for key 'DestinationPartitionNumber'\n");
135 pSetupData->DestinationPartitionNumber = (
LONG)IntValue;
143 DPRINT(
"INF_GetData() failed for key 'InstallationDirectory'\n");
148 ARRAYSIZE(pSetupData->InstallationDirectory),
155 DPRINT(
"Running unattended setup\n");
158 pSetupData->MBRInstallType = -1;
163 pSetupData->MBRInstallType = IntValue;
168 pSetupData->FormatPartition = 0;
173 pSetupData->FormatPartition = IntValue;
177 pSetupData->AutoPartition = 0;
182 pSetupData->AutoPartition = IntValue;
200 pSetupData->FsType = 0;
205 pSetupData->FsType = IntValue;
225 CHAR CrLf[] = {
'\r',
'\n'};
260 L"UnattendedInstall", PathBuffer);
265 L"\"%s\"",
L"winnt");
267 L"ProductType", PathBuffer);
270 L"\"%s\\\"", pSetupData->SourceRootPath.Buffer);
272 L"SourcePath", PathBuffer);
281 pSetupData->SourcePath.Buffer,
L"unattend.inf");
284 DPRINT(
"Does not exist: %S\n", UnattendInfPath);
291 DPRINT1(
"Cannot load %S as an INI file!\n", UnattendInfPath);
299 pSetupData->DestinationPath.Buffer,
L"System32\\$winnt$.inf");
306 pSetupData->DestinationPath.Buffer,
L"System32\\$winnt$.inf");
312 pSetupData->SourcePath.Buffer,
L"unattend.inf");
315 DPRINT(
"Does not exist: %S\n", UnattendInfPath);
333 DPRINT1(
"Cannot load %S as an INI file!\n", PathBuffer);
345 DPRINT(
"NtQueryInformationFile() failed (Status %lx)\n",
Status);
358 DPRINT1(
"Cannot load %S !\n", UnattendInfPath);
416 RtlInitEmptyUnicodeString(InstallSourcePath,
464 DPRINT1(
"NtOpenSymbolicLinkObject(%wZ) failed with Status 0x%08lx\n",
469 RtlInitEmptyUnicodeString(&SystemRootPath,
471 sizeof(SystemRootBuffer));
487 InstallSourcePath = &SystemRootPath;
525 pSetupData->SourcePath.Buffer,
L"txtsetup.sif");
529 pSetupData->SetupInf =
533 pSetupData->LanguageId,
560 pSetupData->RequiredPartitionDiskSpace = ~0;
566 pSetupData->RequiredPartitionDiskSpace = (
ULONG)IntValue;
609 pSetupData->InstallationDirectory[0] = 0;
617 ARRAYSIZE(pSetupData->InstallationDirectory),
636 ASSERT(PartEntry->IsPartitioned && PartEntry->PartitionNumber != 0);
641 L"\\Device\\Harddisk%lu\\Partition%lu\\",
643 PartEntry->PartitionNumber);
647 DPRINT1(
"RtlStringCchPrintfW() failed with status 0x%08lx\n",
Status);
655 DPRINT1(
"RtlCreateUnicodeString() failed with status 0x%08lx\n",
Status);
659 DPRINT(
"DestinationRootPath: %wZ\n", &pSetupData->DestinationRootPath);
662 if (!InstallationDir)
663 InstallationDir = pSetupData->InstallationDirectory;
675 L"multi(0)disk(0)rdisk(%lu)partition(%lu)\\",
677 PartEntry->OnDiskPartitionNumber);
680 L"multi(%lu)disk(%lu)rdisk(%lu)partition(%lu)\\",
684 PartEntry->OnDiskPartitionNumber);
686 DPRINT1(
"Fixed disk found by BIOS, using MULTI ARC path '%S'\n", PathBuffer);
691 L"scsi(%u)disk(%u)rdisk(%u)partition(%lu)\\",
695 PartEntry->OnDiskPartitionNumber);
696 DPRINT1(
"Fixed disk not found by BIOS, using SCSI ARC path '%S'\n", PathBuffer);
703 L"multi(0)disk(0)rdisk(%lu)partition(%lu)\\",
705 DPRINT1(
"Removable disk, using MULTI ARC path '%S'\n", PathBuffer);
708 L"signature(%08x)disk(%u)rdisk(%u)partition(%lu)\\",
712 PartEntry->OnDiskPartitionNumber);
713 DPRINT1(
"Removable disk, using SIGNATURE ARC path '%S'\n", PathBuffer);
719 DPRINT1(
"RtlStringCchPrintfW() failed with status 0x%08lx\n",
Status);
728 DPRINT1(
"ConcatPaths() failed with status 0x%08lx\n",
Status);
737 DPRINT1(
"RtlCreateUnicodeString() failed with status 0x%08lx\n",
Status);
746 pSetupData->DestinationRootPath.Buffer, InstallationDir);
750 DPRINT1(
"CombinePaths() failed with status 0x%08lx\n",
Status);
760 DPRINT1(
"RtlCreateUnicodeString() failed with status 0x%08lx\n",
Status);
772 DPRINT1(
"RtlCreateUnicodeString() failed with status 0x%08lx\n",
Status);
800 pSetupData->ErrorRoutine =
NULL;
832 &pSetupData->SourceRootPath,
833 &pSetupData->SourceRootDir);
836 DPRINT1(
"GetSourcePaths() failed (Status 0x%08lx)\n",
Status);
845 DPRINT1(
"SourcePath (1): '%wZ'\n", &pSetupData->SourcePath);
846 DPRINT1(
"SourceRootPath (1): '%wZ'\n", &pSetupData->SourceRootPath);
847 DPRINT1(
"SourceRootDir (1): '%wZ'\n", &pSetupData->SourceRootDir);
853 DPRINT1(
"LoadSetupInf() failed (Error 0x%lx)\n",
Error);
856 DPRINT1(
"SourcePath (2): '%wZ'\n", &pSetupData->SourcePath);
857 DPRINT1(
"SourceRootPath (2): '%wZ'\n", &pSetupData->SourceRootPath);
858 DPRINT1(
"SourceRootDir (2): '%wZ'\n", &pSetupData->SourceRootDir);
871 if (pSetupData->ComputerList !=
NULL)
874 pSetupData->ComputerList =
NULL;
878 if (pSetupData->DisplayList !=
NULL)
881 pSetupData->DisplayList =
NULL;
885 if (pSetupData->KeyboardList !=
NULL)
888 pSetupData->KeyboardList =
NULL;
892 if (pSetupData->LayoutList !=
NULL)
895 pSetupData->LayoutList =
NULL;
899 if (pSetupData->LanguageList !=
NULL)
902 pSetupData->LanguageList =
NULL;
921 IN WCHAR DestinationDriveLetter,
938 DPRINT1(
"TODO: Updating / repairing the registry is not completely implemented yet!\n");
944 DPRINT1(
"VerifyRegistryHives failed, Status 0x%08lx\n",
Status);
945 ShouldRepairRegistry =
FALSE;
947 if (!ShouldRepairRegistry)
948 DPRINT1(
"No need to repair the registry\n");
961 DPRINT1(
"RegInitializeRegistry() failed\n");
991 DPRINT1(
"SpInfFindFirstLine() failed\n");
1008 DPRINT1(
"No update needed for the registry!\n");
1048 pSetupData->LanguageId,
Delete))
1143 ShouldRepairRegistry =
FALSE;
#define OBJ_NAME_PATH_SEPARATOR
#define FILE_NON_DIRECTORY_FILE
static BOOL ImportRegistryFile(HWND hWnd)
WCHAR FileNameBuffer[MAX_PATH]
BOOL Delete(LPCTSTR ServiceName)
VOID RegCleanupRegistry(IN PUNICODE_STRING NtSystemRoot)
NTSTATUS RegInitializeRegistry(IN PUNICODE_STRING NtSystemRoot)
NTSTATUS VerifyRegistryHives(IN PUNICODE_STRING NtSystemRoot, OUT PBOOLEAN ShouldRepairRegistry)
BOOLEAN ProcessKeyboardLayoutRegistry(IN PGENERIC_LIST List, IN PCWSTR LanguageId)
BOOLEAN SetGeoID(IN PCWSTR Id)
BOOLEAN ProcessDisplayRegistry(IN HINF InfFile, IN PGENERIC_LIST List)
BOOLEAN ProcessLocaleRegistry(IN PGENERIC_LIST List)
BOOLEAN SetDefaultPagefile(IN WCHAR Drive)
NTSYSAPI BOOLEAN NTAPI RtlCreateUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
#define NT_SUCCESS(StatCode)
#define INVALID_HANDLE_VALUE
static const WCHAR Cleanup[]
UNICODE_STRING * PUNICODE_STRING
struct _UNICODE_STRING UNICODE_STRING
enum _ERROR_NUMBER ERROR_NUMBER
@ ERROR_SIGNATURE_TXTSETUPSIF
@ ERROR_CORRUPT_TXTSETUPSIF
@ ERROR_UPDATE_LOCALESETTINGS
@ ERROR_INITIALIZE_REGISTRY
@ ERROR_UPDATE_DISPLAY_SETTINGS
@ ERROR_UPDATE_KBSETTINGS
struct _FileName FileName
NTSTATUS CombinePaths(OUT PWSTR PathBuffer, IN SIZE_T cchPathSize, IN ULONG NumberOfPathComponents, IN ...)
NTSTATUS ConcatPaths(IN OUT PWSTR PathBuffer, IN SIZE_T cchPathSize, IN ULONG NumberOfPathComponents, IN ...)
NTSTATUS OpenAndMapFile(IN HANDLE RootDirectory OPTIONAL, IN PCWSTR PathNameToFile, OUT PHANDLE FileHandle, OUT PHANDLE SectionHandle, OUT PVOID *BaseAddress, OUT PULONG FileSize OPTIONAL, IN BOOLEAN ReadWriteAccess)
#define UnMapAndCloseFile(FileHandle, SectionHandle, BaseAddress)
#define DoesFileExist(RootDirectory, FileName)
_Must_inspect_result_ _In_opt_ PFLT_INSTANCE _Out_ PHANDLE FileHandle
#define FILE_SYNCHRONOUS_IO_NONALERT
_Must_inspect_result_ _Out_ PLARGE_INTEGER FileSize
_Must_inspect_result_ _In_ PFSRTL_PER_STREAM_CONTEXT Ptr
_Check_return_ long __cdecl wcstol(_In_z_ const wchar_t *_Str, _Out_opt_ _Deref_post_z_ wchar_t **_EndPtr, _In_ int _Radix)
_Check_return_ unsigned long __cdecl wcstoul(_In_z_ const wchar_t *_Str, _Out_opt_ _Deref_post_z_ wchar_t **_EndPtr, _In_ int _Radix)
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
#define OBJ_CASE_INSENSITIVE
pSpInfFindNextLine SpInfFindNextLine
pSpInfGetIntField SpInfGetIntField
pSpInfFindFirstLine SpInfFindFirstLine
FORCEINLINE VOID INF_FreeData(IN PCWSTR InfData)
pSpInfOpenInfFile SpInfOpenInfFile
pSpInfCloseInfFile SpInfCloseInfFile
NTSTATUS IniCacheLoad(PINICACHE *Cache, PWCHAR FileName, BOOLEAN String)
PINICACHESECTION IniCacheAppendSection(PINICACHE Cache, PWCHAR Name)
NTSTATUS IniCacheSave(PINICACHE Cache, PWCHAR FileName)
PINICACHEKEY IniCacheInsertKey(PINICACHESECTION Section, PINICACHEKEY AnchorKey, INSERTION_TYPE InsertionType, PWCHAR Name, PWCHAR Data)
PINICACHE IniCacheCreate(VOID)
VOID IniCacheDestroy(PINICACHE Cache)
PCWSTR MUIGetGeoID(IN PCWSTR LanguageId)
BOOLEAN AddCodePage(IN PCWSTR LanguageId)
BOOLEAN AddKeyboardLayouts(IN PCWSTR LanguageId)
BOOLEAN INF_GetDataField(IN PINFCONTEXT Context, IN ULONG FieldIndex, OUT PCWSTR *Data)
BOOLEAN INF_GetData(IN PINFCONTEXT Context, OUT PCWSTR *Key, OUT PCWSTR *Data)
VOID DestroyGenericList(IN OUT PGENERIC_LIST List, IN BOOLEAN FreeData)
static const char const char const char PIMAGEHLP_STATUS_ROUTINE StatusRoutine
static OUT PIO_STATUS_BLOCK IoStatusBlock
#define InitializeObjectAttributes(p, n, a, r, s)
NTSYSAPI NTSTATUS NTAPI NtOpenFile(OUT PHANDLE phFile, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, OUT PIO_STATUS_BLOCK pIoStatusBlock, IN ULONG ShareMode, IN ULONG OpenMode)
#define SYMBOLIC_LINK_QUERY
NTSYSAPI NTSTATUS NTAPI NtWriteFile(IN HANDLE hFile, IN HANDLE hEvent OPTIONAL, IN PIO_APC_ROUTINE IoApcRoutine OPTIONAL, IN PVOID IoApcContext OPTIONAL, OUT PIO_STATUS_BLOCK pIoStatusBlock, IN PVOID WriteBuffer, IN ULONG WriteBufferLength, IN PLARGE_INTEGER FileOffset OPTIONAL, IN PULONG LockOperationKey OPTIONAL)
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
#define NtCurrentProcess()
NTSYSAPI NTSTATUS NTAPI NtQueryInformationFile(IN HANDLE hFile, OUT PIO_STATUS_BLOCK pIoStatusBlock, OUT PVOID FileInformationBuffer, IN ULONG FileInformationBufferLength, IN FILE_INFORMATION_CLASS FileInfoClass)
NTSTATUS NTAPI NtClose(IN HANDLE Handle)
NTSYSAPI VOID NTAPI RtlFreeUnicodeString(PUNICODE_STRING UnicodeString)
NTSTATUS NTAPI NtQueryInformationProcess(_In_ HANDLE ProcessHandle, _In_ PROCESSINFOCLASS ProcessInformationClass, _Out_ PVOID ProcessInformation, _In_ ULONG ProcessInformationLength, _Out_opt_ PULONG ReturnLength)
#define STATUS_NOT_IMPLEMENTED
NTSTRSAFEAPI RtlStringCchCopyW(_Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, _In_ size_t cchDest, _In_ NTSTRSAFE_PCWSTR pszSrc)
NTSTRSAFEVAPI RtlStringCchPrintfW(_Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, _In_ size_t cchDest, _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat,...)
NTSTATUS NTAPI NtQuerySymbolicLinkObject(IN HANDLE LinkHandle, OUT PUNICODE_STRING LinkTarget, OUT PULONG ResultLength OPTIONAL)
NTSTATUS NTAPI NtOpenSymbolicLinkObject(OUT PHANDLE LinkHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes)
#define FileStandardInformation
_Check_return_ _CRTIMP int __cdecl _wcsicmp(_In_z_ const wchar_t *_Str1, _In_z_ const wchar_t *_Str2)
BOOLEAN SetMountedDeviceValues(IN PPARTLIST List)
ERROR_NUMBER LoadSetupInf(IN OUT PUSETUP_DATA pSetupData)
VOID FinishSetup(IN OUT PUSETUP_DATA pSetupData)
VOID CheckUnattendedSetup(IN OUT PUSETUP_DATA pSetupData)
ERROR_NUMBER UpdateRegistry(IN OUT PUSETUP_DATA pSetupData, IN BOOLEAN RepairUpdateFlag, IN PPARTLIST PartitionList, IN WCHAR DestinationDriveLetter, IN PCWSTR SelectedLanguageId, IN PREGISTRY_STATUS_ROUTINE StatusRoutine OPTIONAL, IN PFONTSUBSTSETTINGS SubstSettings OPTIONAL)
NTSTATUS GetSourcePaths(OUT PUNICODE_STRING SourcePath, OUT PUNICODE_STRING SourceRootPath, OUT PUNICODE_STRING SourceRootDir)
VOID InstallSetupInfFile(IN OUT PUSETUP_DATA pSetupData)
NTSTATUS InitDestinationPaths(IN OUT PUSETUP_DATA pSetupData, IN PCWSTR InstallationDir, IN PPARTENTRY PartEntry)
ERROR_NUMBER InitializeSetup(IN OUT PUSETUP_DATA pSetupData, IN ULONG InitPhase)
VOID(__cdecl * PREGISTRY_STATUS_ROUTINE)(IN REGISTRY_STATUS,...)
BOOLEAN IsUnattendedSetup
PULONG MinorVersion OPTIONAL
PDRIVE_LAYOUT_INFORMATION LayoutBuffer
BOOL DoRegistryFontFixup(PFONTSUBSTSETTINGS pSettings, LANGID LangID)
#define RTL_CONSTANT_STRING(s)
#define RtlZeroMemory(Destination, Length)
static PPARTLIST PartitionList
static BOOLEAN RepairUpdateFlag
PCWSTR SelectedLanguageId
_In_ WDFCHILDLIST _In_ PWDF_CHILD_LIST_ITERATOR Iterator
_In_ WDFIOTARGET _In_ _Strict_type_match_ WDF_IO_TARGET_SENT_IO_ACTION Action
_In_ WDFMEMORY _Out_opt_ size_t * BufferSize
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _Out_opt_ PUSHORT _Inout_opt_ PUNICODE_STRING Value