2 * PROJECT: ReactOS Runtime Library
3 * LICENSE: See COPYING in the top level directory
4 * FILE: lib/rtl/bootdata.c
5 * PURPOSE: Boot Status Data Implementation
6 * PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org)
10 /* INCLUDES *****************************************************************/
16 typedef struct _RTL_BSD_ITEM_TABLE_ENTRY
20 } RTL_BSD_ITEM_TABLE_ENTRY
;
22 /* FUNCTIONS *****************************************************************/
24 PRTL_BSD_DATA DummyBsd
;
25 RTL_BSD_ITEM_TABLE_ENTRY BsdItemTable
[RtlBsdItemMax
] =
28 FIELD_OFFSET(RTL_BSD_DATA
, Version
),
29 sizeof(&DummyBsd
->Version
)
30 }, // RtlBsdItemVersionNumber
32 FIELD_OFFSET(RTL_BSD_DATA
, ProductType
),
33 sizeof(&DummyBsd
->ProductType
)
34 }, // RtlBsdItemProductType
36 FIELD_OFFSET(RTL_BSD_DATA
, AabEnabled
),
37 sizeof(&DummyBsd
->AabEnabled
)
38 }, // RtlBsdItemAabEnabled
40 FIELD_OFFSET(RTL_BSD_DATA
, AabTimeout
),
41 sizeof(&DummyBsd
->AabTimeout
)
42 }, // RtlBsdItemAabTimeout
44 FIELD_OFFSET(RTL_BSD_DATA
, LastBootSucceeded
),
45 sizeof(&DummyBsd
->LastBootSucceeded
)
46 }, // RtlBsdItemBootGood
48 FIELD_OFFSET(RTL_BSD_DATA
, LastBootShutdown
),
49 sizeof(&DummyBsd
->LastBootShutdown
)
50 }, // RtlBsdItemBootShutdown
52 FIELD_OFFSET(RTL_BSD_DATA
, SleepInProgress
),
53 sizeof(&DummyBsd
->SleepInProgress
)
54 }, // RtlBsdSleepInProgress
56 FIELD_OFFSET(RTL_BSD_DATA
, PowerTransition
),
57 sizeof(&DummyBsd
->PowerTransition
)
58 }, // RtlBsdPowerTransition
60 FIELD_OFFSET(RTL_BSD_DATA
, BootAttemptCount
),
61 sizeof(&DummyBsd
->BootAttemptCount
)
62 }, // RtlBsdItemBootAttemptCount
64 FIELD_OFFSET(RTL_BSD_DATA
, LastBootCheckpoint
),
65 sizeof(&DummyBsd
->LastBootCheckpoint
)
66 }, // RtlBsdItemBootCheckpoint
68 FIELD_OFFSET(RTL_BSD_DATA
, LastBootId
),
69 sizeof(&DummyBsd
->LastBootId
)
70 }, // RtlBsdItemBootId
72 FIELD_OFFSET(RTL_BSD_DATA
, LastSuccessfulShutdownBootId
),
73 sizeof(&DummyBsd
->LastSuccessfulShutdownBootId
)
74 }, // RtlBsdItemShutdownBootId
76 FIELD_OFFSET(RTL_BSD_DATA
, LastReportedAbnormalShutdownBootId
),
77 sizeof(&DummyBsd
->LastReportedAbnormalShutdownBootId
)
78 }, // RtlBsdItemReportedAbnormalShutdownBootId
80 FIELD_OFFSET(RTL_BSD_DATA
, ErrorInfo
),
81 sizeof(&DummyBsd
->ErrorInfo
)
82 }, // RtlBsdItemErrorInfo
84 FIELD_OFFSET(RTL_BSD_DATA
, PowerButtonPressInfo
),
85 sizeof(&DummyBsd
->PowerButtonPressInfo
)
86 }, // RtlBsdItemPowerButtonPressInfo
88 FIELD_OFFSET(RTL_BSD_DATA
, Checksum
),
89 sizeof(&DummyBsd
->Checksum
)
90 }, // RtlBsdItemChecksum
98 RtlCreateBootStatusDataFile (
102 IO_STATUS_BLOCK IoStatusBlock
;
103 LARGE_INTEGER AllocationSize
;
104 LARGE_INTEGER ByteOffset
;
105 UNICODE_STRING FileName
=
106 RTL_CONSTANT_STRING(L
"\\SystemRoot\\bootstat.dat");
107 OBJECT_ATTRIBUTES ObjectAttributes
=
108 RTL_CONSTANT_OBJECT_ATTRIBUTES(&FileName
, OBJ_CASE_INSENSITIVE
);
111 RTL_BSD_DATA InitialBsd
;
113 /* Create the boot status data file */
114 AllocationSize
.QuadPart
= 0x800;
115 DBG_UNREFERENCED_LOCAL_VARIABLE(AllocationSize
);
116 Status
= ZwCreateFile(&FileHandle
,
117 FILE_GENERIC_READ
| FILE_GENERIC_WRITE
,
120 NULL
, //&AllocationSize,
121 FILE_ATTRIBUTE_SYSTEM
,
124 FILE_SYNCHRONOUS_IO_NONALERT
,
127 if (NT_SUCCESS(Status
))
129 /* Setup a sane looking initial BSD */
130 RtlZeroMemory(&InitialBsd
, sizeof(InitialBsd
));
131 InitialBsd
.Version
= sizeof(InitialBsd
);
132 InitialBsd
.ProductType
= NtProductWinNt
;
133 InitialBsd
.AabEnabled
= 1;
134 InitialBsd
.AabTimeout
= 30;
135 InitialBsd
.LastBootSucceeded
= TRUE
;
137 /* Write it to disk */
138 ByteOffset
.QuadPart
= 0;
139 Status
= ZwWriteFile(FileHandle
,
161 RtlGetSetBootStatusData (
162 _In_ HANDLE FileHandle
,
164 _In_ RTL_BSD_ITEM_TYPE DataClass
,
166 _In_ ULONG BufferSize
,
167 _Out_opt_ PULONG ReturnLength
170 IO_STATUS_BLOCK IoStatusBlock
;
171 LARGE_INTEGER ByteOffset
;
174 DPRINT("RtlGetSetBootStatusData (%p %u %d %p %lu %p)\n",
175 FileHandle
, Read
, DataClass
, Buffer
, BufferSize
, ReturnLength
);
177 if (DataClass
>= RtlBsdItemMax
)
179 return STATUS_INVALID_PARAMETER
;
182 if (BufferSize
> BsdItemTable
[DataClass
].Size
)
184 return STATUS_BUFFER_TOO_SMALL
;
187 ByteOffset
.HighPart
= 0;
188 ByteOffset
.LowPart
= BsdItemTable
[DataClass
].Offset
;
192 Status
= ZwReadFile(FileHandle
,
204 Status
= ZwWriteFile(FileHandle
,
215 if (NT_SUCCESS(Status
))
219 *ReturnLength
= BsdItemTable
[DataClass
].Size
;
231 RtlLockBootStatusData (
232 _Out_ PHANDLE FileHandle
235 UNICODE_STRING FileName
=
236 RTL_CONSTANT_STRING(L
"\\SystemRoot\\bootstat.dat");
237 OBJECT_ATTRIBUTES ObjectAttributes
=
238 RTL_CONSTANT_OBJECT_ATTRIBUTES(&FileName
, OBJ_CASE_INSENSITIVE
);
239 HANDLE LocalFileHandle
;
241 IO_STATUS_BLOCK IoStatusBlock
;
243 /* Intialize the file handle */
246 /* Open the boot status data file */
247 Status
= ZwOpenFile(&LocalFileHandle
,
252 FILE_SYNCHRONOUS_IO_NONALERT
);
253 if (NT_SUCCESS(Status
))
255 /* Return the file handle */
256 *FileHandle
= LocalFileHandle
;
267 RtlUnlockBootStatusData (
268 _In_ HANDLE FileHandle
271 IO_STATUS_BLOCK IoStatusBlock
;
273 /* Flush the file and close it */
274 ZwFlushBuffersFile(FileHandle
, &IoStatusBlock
);
275 return ZwClose(FileHandle
);