3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * FILE: ntoskrnl/io/bootlog.c
6 * PURPOSE: Boot log file support
8 * PROGRAMMERS: Eric Kohl
11 /* INCLUDES *****************************************************************/
15 #include <internal/debug.h>
17 #if defined (ALLOC_PRAGMA)
18 #pragma alloc_text(INIT, IopInitBootLog)
19 #pragma alloc_text(INIT, IopStartBootLog()
22 /* GLOBALS ******************************************************************/
24 static BOOLEAN IopBootLogCreate
= FALSE
;
25 static BOOLEAN IopBootLogEnabled
= FALSE
;
26 static BOOLEAN IopLogFileEnabled
= FALSE
;
27 static ULONG IopLogEntryCount
= 0;
28 static ERESOURCE IopBootLogResource
;
31 /* FUNCTIONS ****************************************************************/
34 IopInitBootLog(BOOLEAN StartBootLog
)
36 ExInitializeResourceLite(&IopBootLogResource
);
37 if (StartBootLog
) IopStartBootLog();
44 IopBootLogCreate
= TRUE
;
45 IopBootLogEnabled
= TRUE
;
52 IopBootLogEnabled
= FALSE
;
57 IopBootLog(PUNICODE_STRING DriverName
,
60 OBJECT_ATTRIBUTES ObjectAttributes
;
62 WCHAR ValueNameBuffer
[8];
63 UNICODE_STRING KeyName
;
64 UNICODE_STRING ValueName
;
69 if (IopBootLogEnabled
== FALSE
)
72 ExAcquireResourceExclusiveLite(&IopBootLogResource
, TRUE
);
74 DPRINT("Boot log: %wS %wZ\n",
75 Success
? L
"Loaded driver" : L
"Did not load driver",
80 Success
? L
"Loaded driver" : L
"Did not load driver",
83 swprintf(ValueNameBuffer
,
87 RtlInitUnicodeString(&KeyName
,
88 L
"\\Registry\\Machine\\System\\CurrentControlSet");
89 InitializeObjectAttributes(&ObjectAttributes
,
94 Status
= ZwOpenKey(&ControlSetKey
,
97 if (!NT_SUCCESS(Status
))
99 DPRINT1("ZwOpenKey() failed (Status %lx)\n", Status
);
100 ExReleaseResourceLite(&IopBootLogResource
);
104 RtlInitUnicodeString(&KeyName
, L
"BootLog");
105 InitializeObjectAttributes(&ObjectAttributes
,
107 OBJ_CASE_INSENSITIVE
| OBJ_OPENIF
,
110 Status
= ZwCreateKey(&BootLogKey
,
115 REG_OPTION_NON_VOLATILE
,
117 if (!NT_SUCCESS(Status
))
119 DPRINT1("ZwCreateKey() failed (Status %lx)\n", Status
);
120 ZwClose(ControlSetKey
);
121 ExReleaseResourceLite(&IopBootLogResource
);
125 RtlInitUnicodeString(&ValueName
, ValueNameBuffer
);
126 Status
= ZwSetValueKey(BootLogKey
,
131 (wcslen(Buffer
) + 1) * sizeof(WCHAR
));
133 ZwClose(ControlSetKey
);
135 if (!NT_SUCCESS(Status
))
137 DPRINT1("NtSetValueKey() failed (Status %lx)\n", Status
);
144 ExReleaseResourceLite(&IopBootLogResource
);
149 IopWriteLogFile(PWSTR LogText
)
151 OBJECT_ATTRIBUTES ObjectAttributes
;
152 UNICODE_STRING FileName
;
153 IO_STATUS_BLOCK IoStatusBlock
;
155 PWSTR CrLf
= L
"\r\n";
158 DPRINT("IopWriteLogFile() called\n");
160 RtlInitUnicodeString(&FileName
,
161 L
"\\SystemRoot\\rosboot.log");
162 InitializeObjectAttributes(&ObjectAttributes
,
164 OBJ_CASE_INSENSITIVE
| OBJ_OPENIF
,
168 Status
= ZwCreateFile(&FileHandle
,
176 FILE_NON_DIRECTORY_FILE
| FILE_SYNCHRONOUS_IO_NONALERT
,
179 if (!NT_SUCCESS(Status
))
181 DPRINT1("ZwCreateFile() failed (Status %lx)\n", Status
);
187 Status
= ZwWriteFile(FileHandle
,
193 wcslen(LogText
) * sizeof(WCHAR
),
196 if (!NT_SUCCESS(Status
))
198 DPRINT1("ZwWriteFile() failed (Status %lx)\n", Status
);
205 Status
= ZwWriteFile(FileHandle
,
217 if (!NT_SUCCESS(Status
))
219 DPRINT1("ZwWriteFile() failed (Status %lx)\n", Status
);
227 IopCreateLogFile(VOID
)
229 OBJECT_ATTRIBUTES ObjectAttributes
;
230 UNICODE_STRING FileName
;
231 IO_STATUS_BLOCK IoStatusBlock
;
233 LARGE_INTEGER ByteOffset
;
237 DPRINT("IopSaveBootLogToFile() called\n");
239 ExAcquireResourceExclusiveLite(&IopBootLogResource
, TRUE
);
241 RtlInitUnicodeString(&FileName
,
242 L
"\\SystemRoot\\rosboot.log");
243 InitializeObjectAttributes(&ObjectAttributes
,
245 OBJ_CASE_INSENSITIVE
| OBJ_OPENIF
,
249 Status
= ZwCreateFile(&FileHandle
,
257 FILE_NON_DIRECTORY_FILE
| FILE_SYNCHRONOUS_IO_NONALERT
,
260 if (!NT_SUCCESS(Status
))
262 DPRINT1("ZwCreateFile() failed (Status %lx)\n", Status
);
266 ByteOffset
.QuadPart
= (LONGLONG
)0;
269 Status
= ZwWriteFile(FileHandle
,
278 if (!NT_SUCCESS(Status
))
280 DPRINT1("ZwWriteKey() failed (Status %lx)\n", Status
);
290 IopSaveBootLogToFile(VOID
)
292 PKEY_VALUE_PARTIAL_INFORMATION KeyInfo
;
293 WCHAR ValueNameBuffer
[8];
294 OBJECT_ATTRIBUTES ObjectAttributes
;
295 UNICODE_STRING KeyName
;
296 UNICODE_STRING ValueName
;
303 if (IopBootLogCreate
== FALSE
)
306 DPRINT("IopSaveBootLogToFile() called\n");
308 ExAcquireResourceExclusiveLite(&IopBootLogResource
, TRUE
);
310 Status
= IopCreateLogFile();
311 if (!NT_SUCCESS(Status
))
313 DPRINT1("IopCreateLogFile() failed (Status %lx)\n", Status
);
314 ExReleaseResourceLite(&IopBootLogResource
);
317 #if defined (__GNUC__)
318 Status
= IopWriteLogFile(L
"ReactOS "KERNEL_VERSION_STR
);
319 #elif defined (_MSC_VER)
320 Status
= IopWriteLogFile("ReactOS "KERNEL_VERSION_STR
);
322 if (!NT_SUCCESS(Status
))
324 DPRINT1("IopWriteLogFile() failed (Status %lx)\n", Status
);
325 ExReleaseResourceLite(&IopBootLogResource
);
329 Status
= IopWriteLogFile(NULL
);
330 if (!NT_SUCCESS(Status
))
332 DPRINT1("IopWriteLogFile() failed (Status %lx)\n", Status
);
333 ExReleaseResourceLite(&IopBootLogResource
);
338 BufferSize
= sizeof(KEY_VALUE_PARTIAL_INFORMATION
) + 256 * sizeof(WCHAR
);
339 KeyInfo
= ExAllocatePool(PagedPool
,
344 ExReleaseResourceLite(&IopBootLogResource
);
348 RtlInitUnicodeString(&KeyName
,
349 L
"\\Registry\\Machine\\System\\CurrentControlSet\\BootLog");
350 InitializeObjectAttributes(&ObjectAttributes
,
352 OBJ_CASE_INSENSITIVE
,
355 Status
= ZwOpenKey(&KeyHandle
,
358 if (!NT_SUCCESS(Status
))
362 ExReleaseResourceLite(&IopBootLogResource
);
368 swprintf(ValueNameBuffer
,
371 RtlInitUnicodeString(&ValueName
,
374 Status
= ZwQueryValueKey(KeyHandle
,
376 KeyValuePartialInformation
,
380 if (Status
== STATUS_OBJECT_NAME_NOT_FOUND
)
385 if (!NT_SUCCESS(Status
))
390 ExReleaseResourceLite(&IopBootLogResource
);
394 Status
= IopWriteLogFile((PWSTR
)&KeyInfo
->Data
);
395 if (!NT_SUCCESS(Status
))
400 ExReleaseResourceLite(&IopBootLogResource
);
405 ZwDeleteValueKey(KeyHandle
,
413 IopLogFileEnabled
= TRUE
;
414 ExReleaseResourceLite(&IopBootLogResource
);
416 DPRINT("IopSaveBootLogToFile() done\n");