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 ****************************************************************/
34 IopInitBootLog(BOOLEAN StartBootLog
)
36 ExInitializeResourceLite(&IopBootLogResource
);
37 if (StartBootLog
) IopStartBootLog();
45 IopBootLogCreate
= TRUE
;
46 IopBootLogEnabled
= TRUE
;
53 IopBootLogEnabled
= FALSE
;
58 IopBootLog(PUNICODE_STRING DriverName
,
61 OBJECT_ATTRIBUTES ObjectAttributes
;
63 WCHAR ValueNameBuffer
[8];
64 UNICODE_STRING KeyName
;
65 UNICODE_STRING ValueName
;
70 if (IopBootLogEnabled
== FALSE
)
73 ExAcquireResourceExclusiveLite(&IopBootLogResource
, TRUE
);
75 DPRINT("Boot log: %wS %wZ\n",
76 Success
? L
"Loaded driver" : L
"Did not load driver",
81 Success
? L
"Loaded driver" : L
"Did not load driver",
84 swprintf(ValueNameBuffer
,
88 RtlInitUnicodeString(&KeyName
,
89 L
"\\Registry\\Machine\\System\\CurrentControlSet");
90 InitializeObjectAttributes(&ObjectAttributes
,
95 Status
= ZwOpenKey(&ControlSetKey
,
98 if (!NT_SUCCESS(Status
))
100 DPRINT1("ZwOpenKey() failed (Status %lx)\n", Status
);
101 ExReleaseResourceLite(&IopBootLogResource
);
105 RtlInitUnicodeString(&KeyName
, L
"BootLog");
106 InitializeObjectAttributes(&ObjectAttributes
,
108 OBJ_CASE_INSENSITIVE
| OBJ_OPENIF
,
111 Status
= ZwCreateKey(&BootLogKey
,
116 REG_OPTION_NON_VOLATILE
,
118 if (!NT_SUCCESS(Status
))
120 DPRINT1("ZwCreateKey() failed (Status %lx)\n", Status
);
121 ZwClose(ControlSetKey
);
122 ExReleaseResourceLite(&IopBootLogResource
);
126 RtlInitUnicodeString(&ValueName
, ValueNameBuffer
);
127 Status
= ZwSetValueKey(BootLogKey
,
132 (ULONG
)(wcslen(Buffer
) + 1) * sizeof(WCHAR
));
134 ZwClose(ControlSetKey
);
136 if (!NT_SUCCESS(Status
))
138 DPRINT1("NtSetValueKey() failed (Status %lx)\n", Status
);
145 ExReleaseResourceLite(&IopBootLogResource
);
151 IopWriteLogFile(PWSTR LogText
)
153 OBJECT_ATTRIBUTES ObjectAttributes
;
154 UNICODE_STRING FileName
;
155 IO_STATUS_BLOCK IoStatusBlock
;
157 PWSTR CrLf
= L
"\r\n";
160 DPRINT("IopWriteLogFile() called\n");
162 RtlInitUnicodeString(&FileName
,
163 L
"\\SystemRoot\\rosboot.log");
164 InitializeObjectAttributes(&ObjectAttributes
,
166 OBJ_CASE_INSENSITIVE
| OBJ_OPENIF
,
170 Status
= ZwCreateFile(&FileHandle
,
171 FILE_APPEND_DATA
| SYNCHRONIZE
,
178 FILE_NON_DIRECTORY_FILE
| FILE_SYNCHRONOUS_IO_NONALERT
,
181 if (!NT_SUCCESS(Status
))
183 DPRINT1("ZwCreateFile() failed (Status %lx)\n", Status
);
189 Status
= ZwWriteFile(FileHandle
,
195 (ULONG
)wcslen(LogText
) * sizeof(WCHAR
),
198 if (!NT_SUCCESS(Status
))
200 DPRINT1("ZwWriteFile() failed (Status %lx)\n", Status
);
207 Status
= ZwWriteFile(FileHandle
,
219 if (!NT_SUCCESS(Status
))
221 DPRINT1("ZwWriteFile() failed (Status %lx)\n", Status
);
230 IopCreateLogFile(VOID
)
232 OBJECT_ATTRIBUTES ObjectAttributes
;
233 UNICODE_STRING FileName
;
234 IO_STATUS_BLOCK IoStatusBlock
;
236 LARGE_INTEGER ByteOffset
;
240 DPRINT("IopSaveBootLogToFile() called\n");
242 ExAcquireResourceExclusiveLite(&IopBootLogResource
, TRUE
);
244 RtlInitUnicodeString(&FileName
,
245 L
"\\SystemRoot\\rosboot.log");
246 InitializeObjectAttributes(&ObjectAttributes
,
248 OBJ_CASE_INSENSITIVE
| OBJ_OPENIF
,
252 Status
= ZwCreateFile(&FileHandle
,
260 FILE_NON_DIRECTORY_FILE
| FILE_SYNCHRONOUS_IO_NONALERT
,
263 if (!NT_SUCCESS(Status
))
265 DPRINT1("ZwCreateFile() failed (Status %lx)\n", Status
);
269 ByteOffset
.QuadPart
= (LONGLONG
)0;
272 Status
= ZwWriteFile(FileHandle
,
281 if (!NT_SUCCESS(Status
))
283 DPRINT1("ZwWriteKey() failed (Status %lx)\n", Status
);
293 IopSaveBootLogToFile(VOID
)
295 PKEY_VALUE_PARTIAL_INFORMATION KeyInfo
;
296 WCHAR ValueNameBuffer
[8];
297 OBJECT_ATTRIBUTES ObjectAttributes
;
298 UNICODE_STRING KeyName
;
299 UNICODE_STRING ValueName
;
306 if (IopBootLogCreate
== FALSE
)
309 DPRINT("IopSaveBootLogToFile() called\n");
311 ExAcquireResourceExclusiveLite(&IopBootLogResource
, TRUE
);
313 Status
= IopCreateLogFile();
314 if (!NT_SUCCESS(Status
))
316 DPRINT1("IopCreateLogFile() failed (Status %lx)\n", Status
);
317 ExReleaseResourceLite(&IopBootLogResource
);
321 //Status = IopWriteLogFile(L"ReactOS "KERNEL_VERSION_STR);
323 if (!NT_SUCCESS(Status
))
325 DPRINT1("IopWriteLogFile() failed (Status %lx)\n", Status
);
326 ExReleaseResourceLite(&IopBootLogResource
);
330 Status
= IopWriteLogFile(NULL
);
331 if (!NT_SUCCESS(Status
))
333 DPRINT1("IopWriteLogFile() failed (Status %lx)\n", Status
);
334 ExReleaseResourceLite(&IopBootLogResource
);
339 BufferSize
= sizeof(KEY_VALUE_PARTIAL_INFORMATION
) + 256 * sizeof(WCHAR
);
340 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
))
361 ExReleaseResourceLite(&IopBootLogResource
);
367 swprintf(ValueNameBuffer
,
370 RtlInitUnicodeString(&ValueName
,
373 Status
= ZwQueryValueKey(KeyHandle
,
375 KeyValuePartialInformation
,
379 if (Status
== STATUS_OBJECT_NAME_NOT_FOUND
)
384 if (!NT_SUCCESS(Status
))
388 ExReleaseResourceLite(&IopBootLogResource
);
392 Status
= IopWriteLogFile((PWSTR
)&KeyInfo
->Data
);
393 if (!NT_SUCCESS(Status
))
397 ExReleaseResourceLite(&IopBootLogResource
);
402 ZwDeleteValueKey(KeyHandle
,
410 IopLogFileEnabled
= TRUE
;
411 ExReleaseResourceLite(&IopBootLogResource
);
413 DPRINT("IopSaveBootLogToFile() done\n");