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>
18 /* GLOBALS ******************************************************************/
20 static BOOLEAN IopBootLogCreate
= FALSE
;
21 static BOOLEAN IopBootLogEnabled
= FALSE
;
22 static BOOLEAN IopLogFileEnabled
= FALSE
;
23 static ULONG IopLogEntryCount
= 0;
24 static ERESOURCE IopBootLogResource
;
27 /* FUNCTIONS ****************************************************************/
30 IopInitBootLog(BOOLEAN StartBootLog
)
32 ExInitializeResourceLite(&IopBootLogResource
);
33 if (StartBootLog
) IopStartBootLog();
40 IopBootLogCreate
= TRUE
;
41 IopBootLogEnabled
= TRUE
;
48 IopBootLogEnabled
= FALSE
;
53 IopBootLog(PUNICODE_STRING DriverName
,
56 OBJECT_ATTRIBUTES ObjectAttributes
;
58 WCHAR ValueNameBuffer
[8];
59 UNICODE_STRING KeyName
;
60 UNICODE_STRING ValueName
;
65 if (IopBootLogEnabled
== FALSE
)
68 ExAcquireResourceExclusiveLite(&IopBootLogResource
, TRUE
);
70 DPRINT("Boot log: %wS %wZ\n",
71 Success
? L
"Loaded driver" : L
"Did not load driver",
76 Success
? L
"Loaded driver" : L
"Did not load driver",
79 swprintf(ValueNameBuffer
,
83 RtlInitUnicodeString(&KeyName
,
84 L
"\\Registry\\Machine\\System\\CurrentControlSet");
85 InitializeObjectAttributes(&ObjectAttributes
,
90 Status
= ZwOpenKey(&ControlSetKey
,
93 if (!NT_SUCCESS(Status
))
95 DPRINT1("ZwOpenKey() failed (Status %lx)\n", Status
);
96 ExReleaseResourceLite(&IopBootLogResource
);
100 RtlInitUnicodeString(&KeyName
, L
"BootLog");
101 InitializeObjectAttributes(&ObjectAttributes
,
103 OBJ_CASE_INSENSITIVE
| OBJ_OPENIF
,
106 Status
= ZwCreateKey(&BootLogKey
,
111 REG_OPTION_NON_VOLATILE
,
113 if (!NT_SUCCESS(Status
))
115 DPRINT1("ZwCreateKey() failed (Status %lx)\n", Status
);
116 ZwClose(ControlSetKey
);
117 ExReleaseResourceLite(&IopBootLogResource
);
121 RtlInitUnicodeString(&ValueName
, ValueNameBuffer
);
122 Status
= ZwSetValueKey(BootLogKey
,
127 (wcslen(Buffer
) + 1) * sizeof(WCHAR
));
129 ZwClose(ControlSetKey
);
131 if (!NT_SUCCESS(Status
))
133 DPRINT1("NtSetValueKey() failed (Status %lx)\n", Status
);
140 ExReleaseResourceLite(&IopBootLogResource
);
145 IopWriteLogFile(PWSTR LogText
)
147 OBJECT_ATTRIBUTES ObjectAttributes
;
148 UNICODE_STRING FileName
;
149 IO_STATUS_BLOCK IoStatusBlock
;
151 PWSTR CrLf
= L
"\r\n";
154 DPRINT("IopWriteLogFile() called\n");
156 RtlInitUnicodeString(&FileName
,
157 L
"\\SystemRoot\\rosboot.log");
158 InitializeObjectAttributes(&ObjectAttributes
,
160 OBJ_CASE_INSENSITIVE
| OBJ_OPENIF
,
164 Status
= ZwCreateFile(&FileHandle
,
172 FILE_NON_DIRECTORY_FILE
| FILE_SYNCHRONOUS_IO_NONALERT
,
175 if (!NT_SUCCESS(Status
))
177 DPRINT1("ZwCreateFile() failed (Status %lx)\n", Status
);
183 Status
= ZwWriteFile(FileHandle
,
189 wcslen(LogText
) * sizeof(WCHAR
),
192 if (!NT_SUCCESS(Status
))
194 DPRINT1("ZwWriteFile() failed (Status %lx)\n", Status
);
201 Status
= ZwWriteFile(FileHandle
,
213 if (!NT_SUCCESS(Status
))
215 DPRINT1("ZwWriteFile() failed (Status %lx)\n", Status
);
223 IopCreateLogFile(VOID
)
225 OBJECT_ATTRIBUTES ObjectAttributes
;
226 UNICODE_STRING FileName
;
227 IO_STATUS_BLOCK IoStatusBlock
;
229 LARGE_INTEGER ByteOffset
;
233 DPRINT("IopSaveBootLogToFile() called\n");
235 ExAcquireResourceExclusiveLite(&IopBootLogResource
, TRUE
);
237 RtlInitUnicodeString(&FileName
,
238 L
"\\SystemRoot\\rosboot.log");
239 InitializeObjectAttributes(&ObjectAttributes
,
241 OBJ_CASE_INSENSITIVE
| OBJ_OPENIF
,
245 Status
= ZwCreateFile(&FileHandle
,
253 FILE_NON_DIRECTORY_FILE
| FILE_SYNCHRONOUS_IO_NONALERT
,
256 if (!NT_SUCCESS(Status
))
258 DPRINT1("ZwCreateFile() failed (Status %lx)\n", Status
);
262 ByteOffset
.QuadPart
= (LONGLONG
)0;
265 Status
= ZwWriteFile(FileHandle
,
274 if (!NT_SUCCESS(Status
))
276 DPRINT1("ZwWriteKey() failed (Status %lx)\n", Status
);
286 IopSaveBootLogToFile(VOID
)
288 PKEY_VALUE_PARTIAL_INFORMATION KeyInfo
;
289 WCHAR ValueNameBuffer
[8];
290 OBJECT_ATTRIBUTES ObjectAttributes
;
291 UNICODE_STRING KeyName
;
292 UNICODE_STRING ValueName
;
299 if (IopBootLogCreate
== FALSE
)
302 DPRINT("IopSaveBootLogToFile() called\n");
304 ExAcquireResourceExclusiveLite(&IopBootLogResource
, TRUE
);
306 Status
= IopCreateLogFile();
307 if (!NT_SUCCESS(Status
))
309 DPRINT1("IopCreateLogFile() failed (Status %lx)\n", Status
);
310 ExReleaseResourceLite(&IopBootLogResource
);
314 Status
= IopWriteLogFile(L
"ReactOS "KERNEL_VERSION_STR
);
315 if (!NT_SUCCESS(Status
))
317 DPRINT1("IopWriteLogFile() failed (Status %lx)\n", Status
);
318 ExReleaseResourceLite(&IopBootLogResource
);
322 Status
= IopWriteLogFile(NULL
);
323 if (!NT_SUCCESS(Status
))
325 DPRINT1("IopWriteLogFile() failed (Status %lx)\n", Status
);
326 ExReleaseResourceLite(&IopBootLogResource
);
331 BufferSize
= sizeof(KEY_VALUE_PARTIAL_INFORMATION
) + 256 * sizeof(WCHAR
);
332 KeyInfo
= ExAllocatePool(PagedPool
,
337 ExReleaseResourceLite(&IopBootLogResource
);
341 RtlInitUnicodeString(&KeyName
,
342 L
"\\Registry\\Machine\\System\\CurrentControlSet\\BootLog");
343 InitializeObjectAttributes(&ObjectAttributes
,
345 OBJ_CASE_INSENSITIVE
,
348 Status
= ZwOpenKey(&KeyHandle
,
351 if (!NT_SUCCESS(Status
))
355 ExReleaseResourceLite(&IopBootLogResource
);
361 swprintf(ValueNameBuffer
,
364 RtlInitUnicodeString(&ValueName
,
367 Status
= ZwQueryValueKey(KeyHandle
,
369 KeyValuePartialInformation
,
373 if (Status
== STATUS_OBJECT_NAME_NOT_FOUND
)
378 if (!NT_SUCCESS(Status
))
383 ExReleaseResourceLite(&IopBootLogResource
);
387 Status
= IopWriteLogFile((PWSTR
)&KeyInfo
->Data
);
388 if (!NT_SUCCESS(Status
))
393 ExReleaseResourceLite(&IopBootLogResource
);
398 ZwDeleteValueKey(KeyHandle
,
406 IopLogFileEnabled
= TRUE
;
407 ExReleaseResourceLite(&IopBootLogResource
);
409 DPRINT("IopSaveBootLogToFile() done\n");