1 /* $Id: bootlog.c,v 1.3 2004/09/24 15:00:34 ekohl Exp $
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
7 * PROGRAMMER: Eric Kohl
10 /* INCLUDES *****************************************************************/
14 #include <internal/debug.h>
17 /* GLOBALS ******************************************************************/
19 static BOOLEAN IopBootLogCreate
= FALSE
;
20 static BOOLEAN IopBootLogEnabled
= FALSE
;
21 static BOOLEAN IopLogFileEnabled
= FALSE
;
22 static ULONG IopLogEntryCount
= 0;
23 static ERESOURCE IopBootLogResource
;
26 /* FUNCTIONS ****************************************************************/
31 ExInitializeResourceLite(&IopBootLogResource
);
38 IopBootLogCreate
= TRUE
;
39 IopBootLogEnabled
= TRUE
;
46 IopBootLogEnabled
= FALSE
;
51 IopBootLog(PUNICODE_STRING DriverName
,
54 OBJECT_ATTRIBUTES ObjectAttributes
;
56 WCHAR ValueNameBuffer
[8];
57 UNICODE_STRING KeyName
;
58 UNICODE_STRING ValueName
;
63 if (IopBootLogEnabled
== FALSE
)
66 ExAcquireResourceExclusiveLite(&IopBootLogResource
, TRUE
);
68 DPRINT("Boot log: %S %wZ\n",
69 Success
? L
"Loaded driver" : L
"Did not load driver",
74 Success
? L
"Loaded driver" : L
"Did not load driver",
77 swprintf(ValueNameBuffer
,
81 RtlInitUnicodeString(&KeyName
,
82 L
"\\Registry\\Machine\\System\\CurrentControlSet");
83 InitializeObjectAttributes(&ObjectAttributes
,
88 Status
= NtOpenKey(&ControlSetKey
,
91 if (!NT_SUCCESS(Status
))
93 DPRINT1("NtOpenKey() failed (Status %lx)\n", Status
);
94 ExReleaseResourceLite(&IopBootLogResource
);
98 RtlInitUnicodeString(&KeyName
, L
"BootLog");
99 InitializeObjectAttributes(&ObjectAttributes
,
101 OBJ_CASE_INSENSITIVE
| OBJ_OPENIF
,
104 Status
= NtCreateKey(&BootLogKey
,
109 REG_OPTION_NON_VOLATILE
,
111 if (!NT_SUCCESS(Status
))
113 DPRINT1("NtCreateKey() failed (Status %lx)\n", Status
);
114 NtClose(ControlSetKey
);
115 ExReleaseResourceLite(&IopBootLogResource
);
119 RtlInitUnicodeString(&ValueName
, ValueNameBuffer
);
120 Status
= NtSetValueKey(BootLogKey
,
125 (wcslen(Buffer
) + 1) * sizeof(WCHAR
));
127 NtClose(ControlSetKey
);
129 if (!NT_SUCCESS(Status
))
131 DPRINT1("NtSetValueKey() failed (Status %lx)\n", Status
);
138 ExReleaseResourceLite(&IopBootLogResource
);
143 IopWriteLogFile(PWSTR LogText
)
145 FILE_STANDARD_INFORMATION FileInformation
;
146 OBJECT_ATTRIBUTES ObjectAttributes
;
147 UNICODE_STRING FileName
;
148 IO_STATUS_BLOCK IoStatusBlock
;
150 LARGE_INTEGER ByteOffset
;
151 PWSTR CrLf
= L
"\r\n";
155 DPRINT("IopWriteLogFile() called\n");
157 RtlInitUnicodeString(&FileName
,
158 L
"\\SystemRoot\\rosboot.log");
159 InitializeObjectAttributes(&ObjectAttributes
,
161 OBJ_CASE_INSENSITIVE
| OBJ_OPENIF
,
165 Status
= NtCreateFile(&FileHandle
,
166 FILE_WRITE_DATA
, /* FILE_APPEND_DATA */
173 FILE_NON_DIRECTORY_FILE
| FILE_SYNCHRONOUS_IO_NONALERT
,
176 if (!NT_SUCCESS(Status
))
178 DPRINT1("NtCreateFile() failed (Status %lx)\n", Status
);
182 Status
= NtQueryInformationFile(FileHandle
,
185 sizeof(FILE_STANDARD_INFORMATION
),
186 FileStandardInformation
);
187 if (!NT_SUCCESS(Status
))
189 DPRINT1("NtQueryInformationFile() failed (Status %lx)\n", Status
);
194 ByteOffset
.QuadPart
= FileInformation
.EndOfFile
.QuadPart
;
198 Status
= NtWriteFile(FileHandle
,
204 wcslen(LogText
) * sizeof(WCHAR
),
207 if (!NT_SUCCESS(Status
))
209 DPRINT1("NtWriteFile() failed (Status %lx)\n", Status
);
214 ByteOffset
.QuadPart
+= (wcslen(LogText
) * sizeof(WCHAR
));
218 Status
= NtWriteFile(FileHandle
,
230 if (!NT_SUCCESS(Status
))
232 DPRINT1("NtWriteFile() failed (Status %lx)\n", Status
);
240 IopCreateLogFile(VOID
)
242 OBJECT_ATTRIBUTES ObjectAttributes
;
243 UNICODE_STRING FileName
;
244 IO_STATUS_BLOCK IoStatusBlock
;
246 LARGE_INTEGER ByteOffset
;
250 DPRINT("IopSaveBootLogToFile() called\n");
252 ExAcquireResourceExclusiveLite(&IopBootLogResource
, TRUE
);
254 RtlInitUnicodeString(&FileName
,
255 L
"\\SystemRoot\\rosboot.log");
256 InitializeObjectAttributes(&ObjectAttributes
,
258 OBJ_CASE_INSENSITIVE
| OBJ_OPENIF
,
262 Status
= NtCreateFile(&FileHandle
,
270 FILE_NON_DIRECTORY_FILE
| FILE_SYNCHRONOUS_IO_NONALERT
,
273 if (!NT_SUCCESS(Status
))
275 DPRINT1("NtCreateFile() failed (Status %lx)\n", Status
);
279 ByteOffset
.QuadPart
= (LONGLONG
)0;
282 Status
= NtWriteFile(FileHandle
,
291 if (!NT_SUCCESS(Status
))
293 DPRINT1("NtWriteKey() failed (Status %lx)\n", Status
);
303 IopSaveBootLogToFile(VOID
)
305 PKEY_VALUE_PARTIAL_INFORMATION KeyInfo
;
306 WCHAR ValueNameBuffer
[8];
307 OBJECT_ATTRIBUTES ObjectAttributes
;
308 UNICODE_STRING KeyName
;
309 UNICODE_STRING ValueName
;
316 if (IopBootLogCreate
== FALSE
)
319 DPRINT("IopSaveBootLogToFile() called\n");
321 ExAcquireResourceExclusiveLite(&IopBootLogResource
, TRUE
);
323 Status
= IopCreateLogFile();
324 if (!NT_SUCCESS(Status
))
326 DPRINT1("IopCreateLogFile() failed (Status %lx)\n", Status
);
327 ExReleaseResourceLite(&IopBootLogResource
);
331 Status
= IopWriteLogFile(L
"ReactOS "KERNEL_VERSION_STR
);
332 if (!NT_SUCCESS(Status
))
334 DPRINT1("IopWriteLogFile() failed (Status %lx)\n", Status
);
335 ExReleaseResourceLite(&IopBootLogResource
);
339 Status
= IopWriteLogFile(NULL
);
340 if (!NT_SUCCESS(Status
))
342 DPRINT1("IopWriteLogFile() failed (Status %lx)\n", Status
);
343 ExReleaseResourceLite(&IopBootLogResource
);
348 BufferSize
= sizeof(KEY_VALUE_PARTIAL_INFORMATION
) + 256 * sizeof(WCHAR
);
349 KeyInfo
= ExAllocatePool(PagedPool
,
354 ExReleaseResourceLite(&IopBootLogResource
);
358 RtlInitUnicodeString(&KeyName
,
359 L
"\\Registry\\Machine\\System\\CurrentControlSet\\BootLog");
360 InitializeObjectAttributes(&ObjectAttributes
,
362 OBJ_CASE_INSENSITIVE
,
365 Status
= NtOpenKey(&KeyHandle
,
368 if (!NT_SUCCESS(Status
))
372 ExReleaseResourceLite(&IopBootLogResource
);
378 swprintf(ValueNameBuffer
,
381 RtlInitUnicodeString(&ValueName
,
384 Status
= NtQueryValueKey(KeyHandle
,
386 KeyValuePartialInformation
,
390 if (Status
== STATUS_OBJECT_NAME_NOT_FOUND
)
395 if (!NT_SUCCESS(Status
))
400 ExReleaseResourceLite(&IopBootLogResource
);
404 Status
= IopWriteLogFile((PWSTR
)&KeyInfo
->Data
);
405 if (!NT_SUCCESS(Status
))
410 ExReleaseResourceLite(&IopBootLogResource
);
415 // NtDeleteValueKey(KeyHandle,
423 IopLogFileEnabled
= TRUE
;
424 ExReleaseResourceLite(&IopBootLogResource
);
426 DPRINT("IopSaveBootLogToFile() done\n");