152{
169 ULONG DiskNumber, CdRomCount, CheckSum,
i, EnabledDisks = 0;
171
172
174
175
176
177
178
179
180
181
182
183
184
185
187 GUID_DEVINTERFACE_CDROM,
188 CdRomCount,
189 &EnabledDisks);
191 {
192 NotEnabledPresent =
TRUE;
193 }
194
196
198
199
202 NextEntry = NextEntry->
Flink)
203 {
206 ListEntry);
207
208 if (
strcmp(LoaderBlock->ArcBootDeviceName, ArcDiskSignature->
ArcName) == 0)
209 {
210 break;
211 }
212
213 ArcDiskSignature =
NULL;
214 }
215
216
217 if (!ArcDiskSignature)
218 {
219 DPRINT(
"Failed finding a cd that could match current boot device\n");
221 }
222
223
226 {
227 DPRINT(
"Failed allocating resources!\n");
228
230 }
231
232
233 if (EnabledDisks > CdRomCount)
234 {
235 CdRomCount = EnabledDisks;
236 }
237
238
239 if (NotEnabledPresent && !EnabledDisks)
240 {
241 CdRomCount += 5;
242 }
243
244
245 if (!CdRomCount)
246 {
248 }
249
250
251 for (DiskNumber = 0, EnabledDisks = 0; DiskNumber < CdRomCount; DiskNumber++)
252 {
253
254 if (lSymbolicLinkList && *lSymbolicLinkList !=
UNICODE_NULL)
255 {
256
258
260
261
266
268 {
270 }
271
272
276 0,
282
284 {
285
289 }
290
291
295 {
298 }
300 {
303 }
304
305
310 {
313 }
314 }
315 else
316 {
317
322 {
324 }
325
326
332 {
335 }
336 }
337
338
340 CheckSum = 0;
344 2048,
349 {
350
354 {
357 }
358
359
361 {
362 for (
i = 0;
i < 2048 /
sizeof(
ULONG);
i++)
363 {
365 }
366 }
367 }
368
369
371
372
373 if (CheckSum + ArcDiskSignature->
CheckSum == 0)
374 {
375
376 sprintf(ArcBuffer,
"\\ArcName\\%s", LoaderBlock->ArcBootDeviceName);
380 {
381
384 DPRINT(
"Boot device found\n");
385 }
386
387
390 }
391
392
394 }
395
398 {
400 }
401
403 {
405 }
406
408}
_In_ PFCB _In_ LONGLONG StartingOffset
_In_ PCHAR _In_ ULONG DeviceNumber
_ACRTIMP size_t __cdecl wcslen(const wchar_t *)
_ACRTIMP int __cdecl strcmp(const char *, const char *)
static const WCHAR Cleanup[]
#define KeWaitForSingleObject(pEvt, foo, a, b, c)
#define KeInitializeEvent(pEvt, foo, foo2)
#define NonPagedPoolCacheAligned
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 ExFreePoolWithTag(_P, _T)
#define FILE_READ_ATTRIBUTES
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
static OUT PIO_STATUS_BLOCK IoStatusBlock
NTSTATUS IopFetchConfigurationInformation(_Out_ PWSTR *SymbolicLinkList, _In_ GUID Guid, _In_ ULONG ExpectedInterfaces, _Out_ PULONG Interfaces)
NTSTATUS NTAPI IoGetDeviceObjectPointer(IN PUNICODE_STRING ObjectName, IN ACCESS_MASK DesiredAccess, OUT PFILE_OBJECT *FileObject, OUT PDEVICE_OBJECT *DeviceObject)
PIRP NTAPI IoBuildSynchronousFsdRequest(IN ULONG MajorFunction, IN PDEVICE_OBJECT DeviceObject, IN PVOID Buffer, IN ULONG Length, IN PLARGE_INTEGER StartingOffset, IN PKEVENT Event, IN PIO_STATUS_BLOCK IoStatusBlock)
PIRP NTAPI IoBuildDeviceIoControlRequest(IN ULONG IoControlCode, IN PDEVICE_OBJECT DeviceObject, IN PVOID InputBuffer, IN ULONG InputBufferLength, IN PVOID OutputBuffer, IN ULONG OutputBufferLength, IN BOOLEAN InternalDeviceIoControl, IN PKEVENT Event, IN PIO_STATUS_BLOCK IoStatusBlock)
#define IOCTL_STORAGE_GET_DEVICE_NUMBER
#define CONTAINING_RECORD(address, type, field)
#define STATUS_INSUFFICIENT_RESOURCES
_In_ PDEVICE_OBJECT DeviceObject
_In_ WDFREQUEST _In_ WDFFILEOBJECT FileObject
_In_opt_ PDEVICE_OBJECT _In_ ULONG _Outptr_result_nullonfailure_ _At_ * SymbolicLinkList(return==0, __drv_allocatesMem(Mem))) PZZWSTR *SymbolicLinkList
_In_ ULONG _In_ BOOLEAN _Out_ struct _DRIVE_LAYOUT_INFORMATION ** PartitionBuffer
#define ObDereferenceObject