ReactOS 0.4.17-dev-923-g4c9a150
bootdata.c
Go to the documentation of this file.
1/*
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)
7 * Eric Kohl
8 */
9
10/* INCLUDES *****************************************************************/
11
12#include <rtl.h>
13#define NDEBUG
14#include <debug.h>
15
17{
21
22/* FUNCTIONS *****************************************************************/
23
26{
27 {
29 sizeof(&DummyBsd->Version)
30 }, // RtlBsdItemVersionNumber
31 {
32 FIELD_OFFSET(RTL_BSD_DATA, ProductType),
33 sizeof(&DummyBsd->ProductType)
34 }, // RtlBsdItemProductType
35 {
36 FIELD_OFFSET(RTL_BSD_DATA, AabEnabled),
37 sizeof(&DummyBsd->AabEnabled)
38 }, // RtlBsdItemAabEnabled
39 {
40 FIELD_OFFSET(RTL_BSD_DATA, AabTimeout),
41 sizeof(&DummyBsd->AabTimeout)
42 }, // RtlBsdItemAabTimeout
43 {
44 FIELD_OFFSET(RTL_BSD_DATA, LastBootSucceeded),
46 }, // RtlBsdItemBootGood
47 {
48 FIELD_OFFSET(RTL_BSD_DATA, LastBootShutdown),
50 }, // RtlBsdItemBootShutdown
51 {
52 FIELD_OFFSET(RTL_BSD_DATA, SleepInProgress),
54 }, // RtlBsdSleepInProgress
55 {
56 FIELD_OFFSET(RTL_BSD_DATA, PowerTransition),
58 }, // RtlBsdPowerTransition
59 {
60 FIELD_OFFSET(RTL_BSD_DATA, BootAttemptCount),
62 }, // RtlBsdItemBootAttemptCount
63 {
64 FIELD_OFFSET(RTL_BSD_DATA, LastBootCheckpoint),
66 }, // RtlBsdItemBootCheckpoint
67 {
68 FIELD_OFFSET(RTL_BSD_DATA, LastBootId),
69 sizeof(&DummyBsd->LastBootId)
70 }, // RtlBsdItemBootId
71 {
72 FIELD_OFFSET(RTL_BSD_DATA, LastSuccessfulShutdownBootId),
74 }, // RtlBsdItemShutdownBootId
75 {
76 FIELD_OFFSET(RTL_BSD_DATA, LastReportedAbnormalShutdownBootId),
78 }, // RtlBsdItemReportedAbnormalShutdownBootId
79 {
80 FIELD_OFFSET(RTL_BSD_DATA, ErrorInfo),
81 sizeof(&DummyBsd->ErrorInfo)
82 }, // RtlBsdItemErrorInfo
83 {
84 FIELD_OFFSET(RTL_BSD_DATA, PowerButtonPressInfo),
86 }, // RtlBsdItemPowerButtonPressInfo
87 {
88 FIELD_OFFSET(RTL_BSD_DATA, Checksum),
89 sizeof(&DummyBsd->Checksum)
90 }, // RtlBsdItemChecksum
91 {
92 FIELD_OFFSET(RTL_BSD_DATA, PowerTransitionExtension),
94 }, // RtlBsdPowerTransitionExtension
95 {
96 FIELD_OFFSET(RTL_BSD_DATA, ItemFeatureConfigState),
98 }, // RtlBsdItemFeatureConfigurationState
99 {
100 FIELD_OFFSET(RTL_BSD_DATA, ItemRevocationList),
102 }, // RtlBsdItemRevocationListInfo
103};
104
105/*
106 * @implemented
107 */
109NTAPI
111 VOID
112 )
113{
118 RTL_CONSTANT_STRING(L"\\SystemRoot\\bootstat.dat");
123 RTL_BSD_DATA InitialBsd;
124
125 /* Create the boot status data file */
126 AllocationSize.QuadPart = 0x800;
128 Status = ZwCreateFile(&FileHandle,
132 NULL, //&AllocationSize,
134 0,
137 NULL,
138 0);
139 if (NT_SUCCESS(Status))
140 {
141 /* Setup a sane looking initial BSD */
142 RtlZeroMemory(&InitialBsd, sizeof(InitialBsd));
143 InitialBsd.Version = sizeof(InitialBsd);
144 InitialBsd.ProductType = NtProductWinNt;
145 InitialBsd.AabEnabled = 1;
146 InitialBsd.AabTimeout = 30;
147 InitialBsd.LastBootSucceeded = TRUE;
148
149 /* Write it to disk */
150 ByteOffset.QuadPart = 0;
151 Status = ZwWriteFile(FileHandle,
152 NULL,
153 NULL,
154 NULL,
156 &InitialBsd,
157 sizeof(InitialBsd),
158 &ByteOffset,
159 NULL);
160 }
161
162 /* Close the file */
164
165 return Status;
166}
167
168/*
169 * @implemented
170 */
172NTAPI
176 _In_ RTL_BSD_ITEM_TYPE DataClass,
180 )
181{
185
186 DPRINT("RtlGetSetBootStatusData (%p %u %d %p %lu %p)\n",
188
189 if (DataClass >= RtlBsdItemMax)
190 {
192 }
193
194 if (BufferSize > BsdItemTable[DataClass].Size)
195 {
197 }
198
199 ByteOffset.HighPart = 0;
200 ByteOffset.LowPart = BsdItemTable[DataClass].Offset;
201
202 if (Read)
203 {
204 Status = ZwReadFile(FileHandle,
205 NULL,
206 NULL,
207 NULL,
209 Buffer,
211 &ByteOffset,
212 NULL);
213 }
214 else
215 {
216 Status = ZwWriteFile(FileHandle,
217 NULL,
218 NULL,
219 NULL,
221 Buffer,
223 &ByteOffset,
224 NULL);
225 }
226
227 if (NT_SUCCESS(Status))
228 {
229 if (ReturnLength)
230 {
231 *ReturnLength = BsdItemTable[DataClass].Size;
232 }
233 }
234
235 return Status;
236}
237
238/*
239 * @implemented
240 */
242NTAPI
245 )
246{
248 RTL_CONSTANT_STRING(L"\\SystemRoot\\bootstat.dat");
251 HANDLE LocalFileHandle;
254
255 /* Intialize the file handle */
256 *FileHandle = NULL;
257
258 /* Open the boot status data file */
259 Status = ZwOpenFile(&LocalFileHandle,
263 0,
265 if (NT_SUCCESS(Status))
266 {
267 /* Return the file handle */
268 *FileHandle = LocalFileHandle;
269 }
270
271 return Status;
272}
273
274/*
275 * @implemented
276 */
278NTAPI
281 )
282{
284
285 /* Flush the file and close it */
287 return ZwClose(FileHandle);
288}
289
290/* EOF */
_In_ PVOID _In_ ULONG _Out_ PVOID _In_ ULONG _Inout_ PULONG ReturnLength
unsigned char BOOLEAN
Definition: actypes.h:127
LONG NTSTATUS
Definition: precomp.h:26
Definition: bufpool.h:45
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
Definition: conport.c:36
_In_ ULONG BufferSize
Definition: dispmprt.h:490
_In_ PIO_STATUS_BLOCK IoStatusBlock
Definition: dispmprt.h:608
_In_ ULONG AllocationSize
Definition: dispmprt.h:712
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
#define RTL_CONSTANT_STRING(s)
Definition: combase.c:35
@ NtProductWinNt
Definition: shellpath.c:64
#define L(x)
Definition: resources.c:13
IN PDCB IN PCCB IN VBO IN OUT PULONG OUT PDIRENT OUT PBCB OUT PVBO ByteOffset
Definition: fatprocs.h:732
_Must_inspect_result_ _In_opt_ PFLT_INSTANCE _Out_ PHANDLE FileHandle
Definition: fltkernel.h:1231
#define FILE_CREATE
Definition: from_kernel.h:55
#define FILE_SYNCHRONOUS_IO_NONALERT
Definition: from_kernel.h:31
Status
Definition: gdiplustypes.h:24
NTSYSAPI NTSTATUS NTAPI ZwOpenFile(_Out_ PHANDLE FileHandle, _In_ ACCESS_MASK DesiredAccess, _In_ POBJECT_ATTRIBUTES ObjectAttributes, _Out_ PIO_STATUS_BLOCK IoStatusBlock, _In_ ULONG ShareAccess, _In_ ULONG OpenOptions)
NTSYSAPI NTSTATUS NTAPI ZwClose(_In_ HANDLE Handle)
enum _RTL_BSD_ITEM_TYPE RTL_BSD_ITEM_TYPE
@ RtlBsdItemMax
Definition: rtltypes.h:447
#define _Out_opt_
Definition: no_sal2.h:214
#define _Out_
Definition: no_sal2.h:160
#define _In_
Definition: no_sal2.h:158
#define FILE_ATTRIBUTE_SYSTEM
Definition: nt_native.h:704
#define FILE_ALL_ACCESS
Definition: nt_native.h:651
#define FILE_GENERIC_READ
Definition: nt_native.h:653
#define FILE_GENERIC_WRITE
Definition: nt_native.h:660
#define DBG_UNREFERENCED_LOCAL_VARIABLE(L)
Definition: ntbasedef.h:331
#define RTL_CONSTANT_OBJECT_ATTRIBUTES(n, a)
PVOID *typedef PHANDLE
Definition: ntsecpkg.h:455
#define OBJ_CASE_INSENSITIVE
Definition: winternl.h:228
NTSTATUS NTAPI RtlLockBootStatusData(_Out_ PHANDLE FileHandle)
Definition: bootdata.c:243
NTSTATUS NTAPI RtlGetSetBootStatusData(_In_ HANDLE FileHandle, _In_ BOOLEAN Read, _In_ RTL_BSD_ITEM_TYPE DataClass, _In_ PVOID Buffer, _In_ ULONG BufferSize, _Out_opt_ PULONG ReturnLength)
Definition: bootdata.c:173
NTSTATUS NTAPI RtlUnlockBootStatusData(_In_ HANDLE FileHandle)
Definition: bootdata.c:279
PRTL_BSD_DATA DummyBsd
Definition: bootdata.c:24
RTL_BSD_ITEM_TABLE_ENTRY BsdItemTable[RtlBsdItemMax]
Definition: bootdata.c:25
struct _RTL_BSD_ITEM_TABLE_ENTRY RTL_BSD_ITEM_TABLE_ENTRY
NTSTATUS NTAPI RtlCreateBootStatusDataFile(VOID)
Definition: bootdata.c:110
#define STATUS_BUFFER_TOO_SMALL
Definition: shellext.h:69
#define DPRINT
Definition: sndvol32.h:73
_In_ BOOLEAN Read
Definition: strmini.h:479
UCHAR AabTimeout
Definition: rtltypes.h:1356
RTL_BSD_ITEM_REVOCATION_LIST ItemRevocationList
Definition: rtltypes.h:1371
RTL_BSD_POWER_BUTTON_PRESS_INFO PowerButtonPressInfo
Definition: rtltypes.h:1369
ULONG ProductType
Definition: rtltypes.h:1354
BOOLEAN LastBootShutdown
Definition: rtltypes.h:1358
ULONG LastSuccessfulShutdownBootId
Definition: rtltypes.h:1365
ULONG ItemFeatureConfigState
Definition: rtltypes.h:1367
RTL_BSD_DATA_ERROR_INFO ErrorInfo
Definition: rtltypes.h:1368
UCHAR BootAttemptCount
Definition: rtltypes.h:1361
UCHAR LastBootCheckpoint
Definition: rtltypes.h:1362
BOOLEAN SleepInProgress
Definition: rtltypes.h:1359
ULONG LastBootId
Definition: rtltypes.h:1364
RTL_BSD_DATA_POWER_TRANSITION_EXTENSION PowerTransitionExtension
Definition: rtltypes.h:1370
BOOLEAN LastBootSucceeded
Definition: rtltypes.h:1357
ULONG LastReportedAbnormalShutdownBootId
Definition: rtltypes.h:1366
BOOLEAN AabEnabled
Definition: rtltypes.h:1355
UCHAR Checksum
Definition: rtltypes.h:1363
ULONG Version
Definition: rtltypes.h:1353
RTL_BSD_DATA_POWER_TRANSITION PowerTransition
Definition: rtltypes.h:1360
Definition: bootdata.c:17
UCHAR Size
Definition: bootdata.c:19
UCHAR Offset
Definition: bootdata.c:18
uint32_t * PULONG
Definition: typedefs.h:59
unsigned char UCHAR
Definition: typedefs.h:53
#define FIELD_OFFSET(t, f)
Definition: typedefs.h:255
#define NTAPI
Definition: typedefs.h:36
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
uint32_t ULONG
Definition: typedefs.h:59
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
Definition: wdfdevice.h:4539
_Must_inspect_result_ _In_ WDFDEVICE _In_ LPCGUID _Out_ PINTERFACE _In_ USHORT _In_ USHORT Version
Definition: wdffdo.h:469
NTSYSAPI NTSTATUS NTAPI ZwFlushBuffersFile(_In_ HANDLE FileHandle, _Out_ PIO_STATUS_BLOCK IoStatusBlock)