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 ****************************************************************/
32 ExInitializeResourceLite(&IopBootLogResource
);
39 IopBootLogCreate
= TRUE
;
40 IopBootLogEnabled
= TRUE
;
47 IopBootLogEnabled
= FALSE
;
52 IopBootLog(PUNICODE_STRING DriverName
,
55 OBJECT_ATTRIBUTES ObjectAttributes
;
57 WCHAR ValueNameBuffer
[8];
58 UNICODE_STRING KeyName
;
59 UNICODE_STRING ValueName
;
64 if (IopBootLogEnabled
== FALSE
)
67 ExAcquireResourceExclusiveLite(&IopBootLogResource
, TRUE
);
69 DPRINT("Boot log: %wS %wZ\n",
70 Success
? L
"Loaded driver" : L
"Did not load driver",
75 Success
? L
"Loaded driver" : L
"Did not load driver",
78 swprintf(ValueNameBuffer
,
82 RtlInitUnicodeString(&KeyName
,
83 L
"\\Registry\\Machine\\System\\CurrentControlSet");
84 InitializeObjectAttributes(&ObjectAttributes
,
89 Status
= NtOpenKey(&ControlSetKey
,
92 if (!NT_SUCCESS(Status
))
94 DPRINT1("NtOpenKey() failed (Status %lx)\n", Status
);
95 ExReleaseResourceLite(&IopBootLogResource
);
99 RtlInitUnicodeString(&KeyName
, L
"BootLog");
100 InitializeObjectAttributes(&ObjectAttributes
,
102 OBJ_CASE_INSENSITIVE
| OBJ_OPENIF
,
105 Status
= NtCreateKey(&BootLogKey
,
110 REG_OPTION_NON_VOLATILE
,
112 if (!NT_SUCCESS(Status
))
114 DPRINT1("NtCreateKey() failed (Status %lx)\n", Status
);
115 NtClose(ControlSetKey
);
116 ExReleaseResourceLite(&IopBootLogResource
);
120 RtlInitUnicodeString(&ValueName
, ValueNameBuffer
);
121 Status
= NtSetValueKey(BootLogKey
,
126 (wcslen(Buffer
) + 1) * sizeof(WCHAR
));
128 NtClose(ControlSetKey
);
130 if (!NT_SUCCESS(Status
))
132 DPRINT1("NtSetValueKey() failed (Status %lx)\n", Status
);
139 ExReleaseResourceLite(&IopBootLogResource
);
144 IopWriteLogFile(PWSTR LogText
)
146 OBJECT_ATTRIBUTES ObjectAttributes
;
147 UNICODE_STRING FileName
;
148 IO_STATUS_BLOCK IoStatusBlock
;
150 PWSTR CrLf
= L
"\r\n";
153 DPRINT("IopWriteLogFile() called\n");
155 RtlInitUnicodeString(&FileName
,
156 L
"\\SystemRoot\\rosboot.log");
157 InitializeObjectAttributes(&ObjectAttributes
,
159 OBJ_CASE_INSENSITIVE
| OBJ_OPENIF
,
163 Status
= NtCreateFile(&FileHandle
,
171 FILE_NON_DIRECTORY_FILE
| FILE_SYNCHRONOUS_IO_NONALERT
,
174 if (!NT_SUCCESS(Status
))
176 DPRINT1("NtCreateFile() failed (Status %lx)\n", Status
);
182 Status
= NtWriteFile(FileHandle
,
188 wcslen(LogText
) * sizeof(WCHAR
),
191 if (!NT_SUCCESS(Status
))
193 DPRINT1("NtWriteFile() failed (Status %lx)\n", Status
);
200 Status
= NtWriteFile(FileHandle
,
212 if (!NT_SUCCESS(Status
))
214 DPRINT1("NtWriteFile() failed (Status %lx)\n", Status
);
222 IopCreateLogFile(VOID
)
224 OBJECT_ATTRIBUTES ObjectAttributes
;
225 UNICODE_STRING FileName
;
226 IO_STATUS_BLOCK IoStatusBlock
;
228 LARGE_INTEGER ByteOffset
;
232 DPRINT("IopSaveBootLogToFile() called\n");
234 ExAcquireResourceExclusiveLite(&IopBootLogResource
, TRUE
);
236 RtlInitUnicodeString(&FileName
,
237 L
"\\SystemRoot\\rosboot.log");
238 InitializeObjectAttributes(&ObjectAttributes
,
240 OBJ_CASE_INSENSITIVE
| OBJ_OPENIF
,
244 Status
= NtCreateFile(&FileHandle
,
252 FILE_NON_DIRECTORY_FILE
| FILE_SYNCHRONOUS_IO_NONALERT
,
255 if (!NT_SUCCESS(Status
))
257 DPRINT1("NtCreateFile() failed (Status %lx)\n", Status
);
261 ByteOffset
.QuadPart
= (LONGLONG
)0;
264 Status
= NtWriteFile(FileHandle
,
273 if (!NT_SUCCESS(Status
))
275 DPRINT1("NtWriteKey() failed (Status %lx)\n", Status
);
285 IopSaveBootLogToFile(VOID
)
287 PKEY_VALUE_PARTIAL_INFORMATION KeyInfo
;
288 WCHAR ValueNameBuffer
[8];
289 OBJECT_ATTRIBUTES ObjectAttributes
;
290 UNICODE_STRING KeyName
;
291 UNICODE_STRING ValueName
;
298 if (IopBootLogCreate
== FALSE
)
301 DPRINT("IopSaveBootLogToFile() called\n");
303 ExAcquireResourceExclusiveLite(&IopBootLogResource
, TRUE
);
305 Status
= IopCreateLogFile();
306 if (!NT_SUCCESS(Status
))
308 DPRINT1("IopCreateLogFile() failed (Status %lx)\n", Status
);
309 ExReleaseResourceLite(&IopBootLogResource
);
313 Status
= IopWriteLogFile(L
"ReactOS "KERNEL_VERSION_STR
);
314 if (!NT_SUCCESS(Status
))
316 DPRINT1("IopWriteLogFile() failed (Status %lx)\n", Status
);
317 ExReleaseResourceLite(&IopBootLogResource
);
321 Status
= IopWriteLogFile(NULL
);
322 if (!NT_SUCCESS(Status
))
324 DPRINT1("IopWriteLogFile() failed (Status %lx)\n", Status
);
325 ExReleaseResourceLite(&IopBootLogResource
);
330 BufferSize
= sizeof(KEY_VALUE_PARTIAL_INFORMATION
) + 256 * sizeof(WCHAR
);
331 KeyInfo
= ExAllocatePool(PagedPool
,
336 ExReleaseResourceLite(&IopBootLogResource
);
340 RtlInitUnicodeString(&KeyName
,
341 L
"\\Registry\\Machine\\System\\CurrentControlSet\\BootLog");
342 InitializeObjectAttributes(&ObjectAttributes
,
344 OBJ_CASE_INSENSITIVE
,
347 Status
= NtOpenKey(&KeyHandle
,
350 if (!NT_SUCCESS(Status
))
354 ExReleaseResourceLite(&IopBootLogResource
);
360 swprintf(ValueNameBuffer
,
363 RtlInitUnicodeString(&ValueName
,
366 Status
= NtQueryValueKey(KeyHandle
,
368 KeyValuePartialInformation
,
372 if (Status
== STATUS_OBJECT_NAME_NOT_FOUND
)
377 if (!NT_SUCCESS(Status
))
382 ExReleaseResourceLite(&IopBootLogResource
);
386 Status
= IopWriteLogFile((PWSTR
)&KeyInfo
->Data
);
387 if (!NT_SUCCESS(Status
))
392 ExReleaseResourceLite(&IopBootLogResource
);
397 NtDeleteValueKey(KeyHandle
,
405 IopLogFileEnabled
= TRUE
;
406 ExReleaseResourceLite(&IopBootLogResource
);
408 DPRINT("IopSaveBootLogToFile() done\n");