2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS kernel
4 * FILE: ntoskrnl/io/bootlog.c
5 * PURPOSE: Boot log file support
7 * PROGRAMMERS: Eric Kohl
10 /* INCLUDES *****************************************************************/
16 #if defined (ALLOC_PRAGMA)
17 #pragma alloc_text(INIT, IopInitBootLog)
18 #pragma alloc_text(INIT, IopStartBootLog)
21 /* GLOBALS ******************************************************************/
23 static BOOLEAN IopBootLogCreate
= FALSE
;
24 static BOOLEAN IopBootLogEnabled
= FALSE
;
25 static BOOLEAN IopLogFileEnabled
= FALSE
;
26 static ULONG IopLogEntryCount
= 0;
27 static ERESOURCE IopBootLogResource
;
30 /* FUNCTIONS ****************************************************************/
33 IopInitBootLog(BOOLEAN StartBootLog
)
35 ExInitializeResourceLite(&IopBootLogResource
);
36 if (StartBootLog
) IopStartBootLog();
43 IopBootLogCreate
= TRUE
;
44 IopBootLogEnabled
= TRUE
;
51 IopBootLogEnabled
= FALSE
;
56 IopBootLog(PUNICODE_STRING DriverName
,
59 OBJECT_ATTRIBUTES ObjectAttributes
;
61 WCHAR ValueNameBuffer
[8];
62 UNICODE_STRING KeyName
;
63 UNICODE_STRING ValueName
;
68 if (IopBootLogEnabled
== FALSE
)
71 ExAcquireResourceExclusiveLite(&IopBootLogResource
, TRUE
);
73 DPRINT("Boot log: %wS %wZ\n",
74 Success
? L
"Loaded driver" : L
"Did not load driver",
79 Success
? L
"Loaded driver" : L
"Did not load driver",
82 swprintf(ValueNameBuffer
,
86 RtlInitUnicodeString(&KeyName
,
87 L
"\\Registry\\Machine\\System\\CurrentControlSet");
88 InitializeObjectAttributes(&ObjectAttributes
,
93 Status
= ZwOpenKey(&ControlSetKey
,
96 if (!NT_SUCCESS(Status
))
98 DPRINT1("ZwOpenKey() failed (Status %lx)\n", Status
);
99 ExReleaseResourceLite(&IopBootLogResource
);
103 RtlInitUnicodeString(&KeyName
, L
"BootLog");
104 InitializeObjectAttributes(&ObjectAttributes
,
106 OBJ_CASE_INSENSITIVE
| OBJ_OPENIF
,
109 Status
= ZwCreateKey(&BootLogKey
,
114 REG_OPTION_NON_VOLATILE
,
116 if (!NT_SUCCESS(Status
))
118 DPRINT1("ZwCreateKey() failed (Status %lx)\n", Status
);
119 ZwClose(ControlSetKey
);
120 ExReleaseResourceLite(&IopBootLogResource
);
124 RtlInitUnicodeString(&ValueName
, ValueNameBuffer
);
125 Status
= ZwSetValueKey(BootLogKey
,
130 (wcslen(Buffer
) + 1) * sizeof(WCHAR
));
132 ZwClose(ControlSetKey
);
134 if (!NT_SUCCESS(Status
))
136 DPRINT1("NtSetValueKey() failed (Status %lx)\n", Status
);
143 ExReleaseResourceLite(&IopBootLogResource
);
148 IopWriteLogFile(PWSTR LogText
)
150 OBJECT_ATTRIBUTES ObjectAttributes
;
151 UNICODE_STRING FileName
;
152 IO_STATUS_BLOCK IoStatusBlock
;
154 PWSTR CrLf
= L
"\r\n";
157 DPRINT("IopWriteLogFile() called\n");
159 RtlInitUnicodeString(&FileName
,
160 L
"\\SystemRoot\\rosboot.log");
161 InitializeObjectAttributes(&ObjectAttributes
,
163 OBJ_CASE_INSENSITIVE
| OBJ_OPENIF
,
167 Status
= ZwCreateFile(&FileHandle
,
175 FILE_NON_DIRECTORY_FILE
| FILE_SYNCHRONOUS_IO_NONALERT
,
178 if (!NT_SUCCESS(Status
))
180 DPRINT1("ZwCreateFile() failed (Status %lx)\n", Status
);
186 Status
= ZwWriteFile(FileHandle
,
192 wcslen(LogText
) * sizeof(WCHAR
),
195 if (!NT_SUCCESS(Status
))
197 DPRINT1("ZwWriteFile() failed (Status %lx)\n", Status
);
204 Status
= ZwWriteFile(FileHandle
,
216 if (!NT_SUCCESS(Status
))
218 DPRINT1("ZwWriteFile() failed (Status %lx)\n", Status
);
226 IopCreateLogFile(VOID
)
228 OBJECT_ATTRIBUTES ObjectAttributes
;
229 UNICODE_STRING FileName
;
230 IO_STATUS_BLOCK IoStatusBlock
;
232 LARGE_INTEGER ByteOffset
;
236 DPRINT("IopSaveBootLogToFile() called\n");
238 ExAcquireResourceExclusiveLite(&IopBootLogResource
, TRUE
);
240 RtlInitUnicodeString(&FileName
,
241 L
"\\SystemRoot\\rosboot.log");
242 InitializeObjectAttributes(&ObjectAttributes
,
244 OBJ_CASE_INSENSITIVE
| OBJ_OPENIF
,
248 Status
= ZwCreateFile(&FileHandle
,
256 FILE_NON_DIRECTORY_FILE
| FILE_SYNCHRONOUS_IO_NONALERT
,
259 if (!NT_SUCCESS(Status
))
261 DPRINT1("ZwCreateFile() failed (Status %lx)\n", Status
);
265 ByteOffset
.QuadPart
= (LONGLONG
)0;
268 Status
= ZwWriteFile(FileHandle
,
277 if (!NT_SUCCESS(Status
))
279 DPRINT1("ZwWriteKey() failed (Status %lx)\n", Status
);
289 IopSaveBootLogToFile(VOID
)
291 PKEY_VALUE_PARTIAL_INFORMATION KeyInfo
;
292 WCHAR ValueNameBuffer
[8];
293 OBJECT_ATTRIBUTES ObjectAttributes
;
294 UNICODE_STRING KeyName
;
295 UNICODE_STRING ValueName
;
302 if (IopBootLogCreate
== FALSE
)
305 DPRINT("IopSaveBootLogToFile() called\n");
307 ExAcquireResourceExclusiveLite(&IopBootLogResource
, TRUE
);
309 Status
= IopCreateLogFile();
310 if (!NT_SUCCESS(Status
))
312 DPRINT1("IopCreateLogFile() failed (Status %lx)\n", Status
);
313 ExReleaseResourceLite(&IopBootLogResource
);
317 //Status = IopWriteLogFile(L"ReactOS "KERNEL_VERSION_STR);
319 if (!NT_SUCCESS(Status
))
321 DPRINT1("IopWriteLogFile() failed (Status %lx)\n", Status
);
322 ExReleaseResourceLite(&IopBootLogResource
);
326 Status
= IopWriteLogFile(NULL
);
327 if (!NT_SUCCESS(Status
))
329 DPRINT1("IopWriteLogFile() failed (Status %lx)\n", Status
);
330 ExReleaseResourceLite(&IopBootLogResource
);
335 BufferSize
= sizeof(KEY_VALUE_PARTIAL_INFORMATION
) + 256 * sizeof(WCHAR
);
336 KeyInfo
= ExAllocatePool(PagedPool
,
340 ExReleaseResourceLite(&IopBootLogResource
);
344 RtlInitUnicodeString(&KeyName
,
345 L
"\\Registry\\Machine\\System\\CurrentControlSet\\BootLog");
346 InitializeObjectAttributes(&ObjectAttributes
,
348 OBJ_CASE_INSENSITIVE
,
351 Status
= ZwOpenKey(&KeyHandle
,
354 if (!NT_SUCCESS(Status
))
357 ExReleaseResourceLite(&IopBootLogResource
);
363 swprintf(ValueNameBuffer
,
366 RtlInitUnicodeString(&ValueName
,
369 Status
= ZwQueryValueKey(KeyHandle
,
371 KeyValuePartialInformation
,
375 if (Status
== STATUS_OBJECT_NAME_NOT_FOUND
)
380 if (!NT_SUCCESS(Status
))
384 ExReleaseResourceLite(&IopBootLogResource
);
388 Status
= IopWriteLogFile((PWSTR
)&KeyInfo
->Data
);
389 if (!NT_SUCCESS(Status
))
393 ExReleaseResourceLite(&IopBootLogResource
);
398 ZwDeleteValueKey(KeyHandle
,
406 IopLogFileEnabled
= TRUE
;
407 ExReleaseResourceLite(&IopBootLogResource
);
409 DPRINT("IopSaveBootLogToFile() done\n");