894{
907 ULONG i,
Increment, DiskCount, RealDiskCount, HarddiskCount, PartitionCount;
910 WCHAR Buffer[
sizeof(
"\\Device\\Harddisk4294967295\\Partition4294967295")];
911
913
914
917 RealDiskCount = 0;
918
919
922 {
923
925 }
926
927
929 {
931
932
933 Last =
strrchr(LoaderBlock->NtBootPathName,
'\\');
936 {
937
939 }
940
941
943 {
944
946 Saved = Last;
947 Last =
strrchr(LoaderBlock->NtBootPathName,
'\\');
948 *Saved = '\\';
949 }
950
952 {
953
955 }
956
957
958 NtSystemPath[0] = 'X';
959 NtSystemPath[1] = ':';
960
962
963
965 {
967 }
968
969
971 }
972
973
975 for (
i = 0;
i < DiskCount; ++
i)
976 {
977
980
981
990 &StatusBlock,
994 {
995
997 swprintf(Buffer2,
L"\\DosDevices\\PhysicalDrive%d",
i);
999
1002
1003 RealDiskCount =
i + 1;
1004 }
1005 else
1006 {
1007
1009 {
1011 ++DiskCount;
1012 }
1013 }
1014 }
1015
1016
1018
1019
1020 if (LoaderBlock->LoadOptions !=
NULL)
1021 LoadOptions =
_strupr(LoaderBlock->LoadOptions);
1022 else
1024
1025
1026
1027 if (LoadOptions !=
NULL &&
1030 {
1032 *NtSystemPath = 'X';
1033
1035 }
1036
1037
1039 DiskCount =
max(DiskCount, RealDiskCount);
1041
1042
1043
1044 for (
i = 0;
i < DiskCount; ++
i)
1045 {
1046
1047 HarddiskCount = (Devices ? Devices[
i] :
i);
1048
1049
1055
1056
1057 BootableFound =
FALSE;
1058 for (PartitionCount = 1; ; ++PartitionCount)
1059 {
1060 swprintf(
Buffer,
L"\\Device\\Harddisk%d\\Partition%d", HarddiskCount, PartitionCount);
1064 {
1065
1066 break;
1067 }
1068
1069
1071 {
1072 BootableFound =
TRUE;
1073
1074
1077 break;
1078 }
1079
1080 }
1081
1082
1083 if (!BootableFound)
1084 {
1085 for (PartitionCount = 1; ; ++PartitionCount)
1086 {
1087 swprintf(
Buffer,
L"\\Device\\Harddisk%d\\Partition%d", HarddiskCount, PartitionCount);
1091 break;
1092
1093
1095 {
1097 break;
1098 }
1099 }
1100 }
1101
1102
1103 if (LayoutInfo !=
NULL)
1105 }
1106
1107
1108 for (
i = 0;
i < DiskCount; ++
i)
1109 {
1110
1111 HarddiskCount = (Devices ? Devices[
i] :
i);
1112
1113
1119
1120
1121 for (PartitionCount = 1; ; ++PartitionCount)
1122 {
1123 swprintf(
Buffer,
L"\\Device\\Harddisk%d\\Partition%d", HarddiskCount, PartitionCount);
1127 break;
1128
1130 {
1132 }
1133 }
1134
1135
1136 if (LayoutInfo !=
NULL)
1138 }
1139
1140
1141 for (
i = 0;
i < DiskCount; ++
i)
1142 {
1143
1144 HarddiskCount = (Devices ? Devices[
i] :
i);
1145
1146
1152
1153
1154 SkipPartition = 0;
1155 for (PartitionCount = 1; ; ++PartitionCount)
1156 {
1157 swprintf(
Buffer,
L"\\Device\\Harddisk%d\\Partition%d", HarddiskCount, PartitionCount);
1161 break;
1162
1165 {
1166 SkipPartition = PartitionCount;
1167 }
1168 }
1169
1170
1171 for (PartitionCount = 1; ; ++PartitionCount)
1172 {
1173 if (PartitionCount == SkipPartition)
1174 continue;
1175
1176 swprintf(
Buffer,
L"\\Device\\Harddisk%d\\Partition%d", HarddiskCount, PartitionCount);
1180 break;
1181
1183 {
1185 }
1186 }
1187
1188
1189 if (LayoutInfo !=
NULL)
1191 }
1192
1193
1194 if (Devices !=
NULL)
1196
1197
1198
1200 {
1205 }
1207 {
1212 }
1213
1214
1216 {
1220 }
1221
1222
1224 {
1225
1227 if (DriveLetter != 0)
1228 {
1229 if (DriveLetter != 0xFF)
1230 *NtSystemPath = DriveLetter;
1231 }
1232
1233 else
1234 {
1236 DriveLetter = 'A';
1238 DriveLetter = 'D';
1239 else
1240 DriveLetter = 'C';
1241
1242
1244 {
1245 ++DriveLetter;
1246 if (DriveLetter > 'Z')
1247 break;
1248 }
1249
1250
1251
1252 if (DriveLetter > 'Z')
1253 {
1254 DriveLetter = 'Z';
1257 }
1258
1259
1260 *NtSystemPath = DriveLetter;
1261 }
1262
1264 }
1265
1266
1268}
DECLSPEC_NORETURN VOID NTAPI KeBugCheck(ULONG BugCheckCode)
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
static NTSTATUS HalpQueryDriveLayout(_In_ PUNICODE_STRING DeviceName, _Outptr_ PDRIVE_LAYOUT_INFORMATION *LayoutInfo)
enum _PARTITION_TYPE PARTITION_TYPE
static VOID HalpEnableAutomaticDriveLetterAssignment(VOID)
static PULONG IopComputeHarddiskDerangements(_In_ ULONG DiskCount)
static NTSTATUS HalpSetMountLetter(_In_ PUNICODE_STRING DeviceName, _In_ UCHAR DriveLetter)
static const UNICODE_STRING CdPrefix
static const UNICODE_STRING FloppyPrefix
static BOOLEAN HalpIsOldStyleFloppy(_In_ PUNICODE_STRING DeviceName)
static NTSTATUS HalpDeleteMountLetter(_In_ UCHAR DriveLetter)
static NTSTATUS HalpQueryPartitionType(_In_ PUNICODE_STRING DeviceName, _In_opt_ PDRIVE_LAYOUT_INFORMATION LayoutInfo, _Out_ PPARTITION_TYPE PartitionType)
static UCHAR HalpNextDriveLetter(_In_ PUNICODE_STRING DeviceName, _In_ PSTRING NtDeviceName, _Out_ PUCHAR NtSystemPath, _In_ BOOLEAN IsRemovable)
_ACRTIMP size_t __cdecl strlen(const char *)
_ACRTIMP char *__cdecl strstr(const char *, const char *)
_ACRTIMP char *__cdecl strrchr(const char *, int)
IN OUT PLONG IN OUT PLONG Addend IN OUT PLONG IN LONG Increment
_Must_inspect_result_ _In_opt_ PFLT_INSTANCE _Out_ PHANDLE FileHandle
#define FILE_SYNCHRONOUS_IO_NONALERT
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
PCONFIGURATION_INFORMATION NTAPI IoGetConfigurationInformation(VOID)
Returns a pointer to the I/O manager's global configuration information structure.
#define InitializeObjectAttributes(p, n, a, r, s)
NTSYSAPI NTSTATUS NTAPI ZwOpenFile(_Out_ PHANDLE FileHandle, _In_ ACCESS_MASK DesiredAccess, _In_ POBJECT_ATTRIBUTES ObjectAttributes, _Out_ PIO_STATUS_BLOCK IoStatusBlock, _In_ ULONG ShareAccess, _In_ ULONG OpenOptions)
NTSYSAPI NTSTATUS NTAPI ZwClose(_In_ HANDLE Handle)
NTSYSAPI VOID NTAPI RtlInitString(PSTRING DestinationString, PCSZ SourceString)
NTSYSAPI NTSTATUS NTAPI RtlAnsiStringToUnicodeString(PUNICODE_STRING DestinationString, PANSI_STRING SourceString, BOOLEAN AllocateDestinationString)
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
NTSYSAPI VOID NTAPI RtlFreeUnicodeString(PUNICODE_STRING UnicodeString)
NTSYSAPI BOOLEAN NTAPI RtlPrefixUnicodeString(IN PUNICODE_STRING String1, IN PUNICODE_STRING String2, IN BOOLEAN CaseInSensitive)
BOOLEAN IoRemoteBootClient
NTSTATUS NTAPI IoCreateSymbolicLink(IN PUNICODE_STRING SymbolicLinkName, IN PUNICODE_STRING DeviceName)
#define OBJ_CASE_INSENSITIVE
_Must_inspect_result_ _In_ PWDFDEVICE_INIT _In_opt_ PCUNICODE_STRING DeviceName