1 /* 2 * PROJECT: ReactOS Kernel 3 * LICENSE: GPL - See COPYING in the top level directory 4 * FILE: ntoskrnl/wmi/wmi.c 5 * PURPOSE: I/O Windows Management Instrumentation (WMI) Support 6 * PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org) 7 */ 8 9 /* INCLUDES *****************************************************************/ 10 11 #include <ntoskrnl.h> 12 #define INITGUID 13 #include <wmiguid.h> 14 #include <wmidata.h> 15 #include <wmistr.h> 16 17 #include "wmip.h" 18 19 #define NDEBUG 20 #include <debug.h> 21 22 typedef PVOID PWMI_LOGGER_INFORMATION; // FIXME 23 24 typedef enum _WMI_CLOCK_TYPE 25 { 26 WMICT_DEFAULT, 27 WMICT_SYSTEMTIME, 28 WMICT_PERFCOUNTER, 29 WMICT_PROCESS, 30 WMICT_THREAD, 31 WMICT_CPUCYCLE 32 } WMI_CLOCK_TYPE; 33 34 /* FUNCTIONS *****************************************************************/ 35 36 BOOLEAN 37 NTAPI 38 WmiInitialize( 39 VOID) 40 { 41 UNICODE_STRING DriverName = RTL_CONSTANT_STRING(L"\\Driver\\WMIxWDM"); 42 NTSTATUS Status; 43 44 /* Initialize the GUID object type */ 45 Status = WmipInitializeGuidObjectType(); 46 if (!NT_SUCCESS(Status)) 47 { 48 DPRINT1("WmipInitializeGuidObjectType() failed: 0x%lx\n", Status); 49 return FALSE; 50 } 51 52 /* Create the WMI driver */ 53 Status = IoCreateDriver(&DriverName, WmipDriverEntry); 54 if (!NT_SUCCESS(Status)) 55 { 56 DPRINT1("Failed to create WMI driver: 0x%lx\n", Status); 57 return FALSE; 58 } 59 60 return TRUE; 61 } 62 63 /* 64 * @unimplemented 65 */ 66 NTSTATUS 67 NTAPI 68 IoWMIRegistrationControl(IN PDEVICE_OBJECT DeviceObject, 69 IN ULONG Action) 70 { 71 DPRINT("IoWMIRegistrationControl() called for DO %p, requesting %lu action, returning success\n", 72 DeviceObject, Action); 73 74 return STATUS_SUCCESS; 75 } 76 77 /* 78 * @unimplemented 79 */ 80 NTSTATUS 81 NTAPI 82 IoWMIAllocateInstanceIds(IN GUID *Guid, 83 IN ULONG InstanceCount, 84 OUT ULONG *FirstInstanceId) 85 { 86 UNIMPLEMENTED; 87 return STATUS_NOT_IMPLEMENTED; 88 } 89 90 /* 91 * @unimplemented 92 */ 93 NTSTATUS 94 NTAPI 95 IoWMISuggestInstanceName(IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL, 96 IN PUNICODE_STRING SymbolicLinkName OPTIONAL, 97 IN BOOLEAN CombineNames, 98 OUT PUNICODE_STRING SuggestedInstanceName) 99 { 100 UNIMPLEMENTED; 101 return STATUS_NOT_IMPLEMENTED; 102 } 103 104 /* 105 * @unimplemented 106 */ 107 NTSTATUS 108 NTAPI 109 IoWMIWriteEvent(_Inout_ PVOID WnodeEventItem) 110 { 111 PWNODE_HEADER Header = WnodeEventItem; 112 113 if(!Header) 114 { 115 DPRINT1("Got NULL Item!\n"); 116 return STATUS_INVALID_PARAMETER; 117 } 118 119 DPRINT1("IoWMIWriteEvent() called for WnodeEventItem %p (Flags = 0x%08lx), returning success\n", 120 WnodeEventItem, Header->Flags); 121 122 if (Header->Flags & WNODE_FLAG_TRACED_GUID) 123 { 124 // Never free WnodeEventItem in this case. 125 DPRINT("IoWMIWriteEvent(): Flags has WNODE_FLAG_TRACED_GUID\n"); 126 return STATUS_SUCCESS; 127 } 128 129 /* Free the buffer if we are returning success */ 130 ExFreePool(WnodeEventItem); 131 132 return STATUS_SUCCESS; 133 } 134 135 /* 136 * @unimplemented 137 */ 138 NTSTATUS 139 NTAPI 140 IoWMIOpenBlock( 141 _In_ LPCGUID DataBlockGuid, 142 _In_ ULONG DesiredAccess, 143 _Out_ PVOID *DataBlockObject) 144 { 145 HANDLE GuidObjectHandle; 146 NTSTATUS Status; 147 148 /* Open the GIOD object */ 149 Status = WmipOpenGuidObject(DataBlockGuid, 150 DesiredAccess, 151 KernelMode, 152 &GuidObjectHandle, 153 DataBlockObject); 154 if (!NT_SUCCESS(Status)) 155 { 156 DPRINT1("WmipOpenGuidObject failed: 0x%lx\n", Status); 157 return Status; 158 } 159 160 161 return STATUS_SUCCESS; 162 } 163 164 /* 165 * @unimplemented 166 */ 167 NTSTATUS 168 NTAPI 169 IoWMIQueryAllData( 170 IN PVOID DataBlockObject, 171 IN OUT ULONG *InOutBufferSize, 172 OUT PVOID OutBuffer) 173 { 174 PWMIP_GUID_OBJECT GuidObject; 175 NTSTATUS Status; 176 177 178 Status = ObReferenceObjectByPointer(DataBlockObject, 179 WMIGUID_QUERY, 180 WmipGuidObjectType, 181 KernelMode); 182 if (!NT_SUCCESS(Status)) 183 { 184 return Status; 185 } 186 187 GuidObject = DataBlockObject; 188 189 /* Huge HACK! */ 190 if (IsEqualGUID(&GuidObject->Guid, &MSSmBios_RawSMBiosTables_GUID)) 191 { 192 Status = WmipQueryRawSMBiosTables(InOutBufferSize, OutBuffer); 193 } 194 else 195 { 196 Status = STATUS_NOT_SUPPORTED; 197 } 198 199 ObDereferenceObject(DataBlockObject); 200 201 return Status; 202 } 203 204 /* 205 * @unimplemented 206 */ 207 NTSTATUS 208 NTAPI 209 IoWMIQueryAllDataMultiple(IN PVOID *DataBlockObjectList, 210 IN ULONG ObjectCount, 211 IN OUT ULONG *InOutBufferSize, 212 OUT PVOID OutBuffer) 213 { 214 UNIMPLEMENTED; 215 return STATUS_NOT_IMPLEMENTED; 216 } 217 218 /* 219 * @unimplemented 220 */ 221 NTSTATUS 222 NTAPI 223 IoWMIQuerySingleInstance(IN PVOID DataBlockObject, 224 IN PUNICODE_STRING InstanceName, 225 IN OUT ULONG *InOutBufferSize, 226 OUT PVOID OutBuffer) 227 { 228 UNIMPLEMENTED; 229 return STATUS_NOT_IMPLEMENTED; 230 } 231 232 /* 233 * @unimplemented 234 */ 235 NTSTATUS 236 NTAPI 237 IoWMIQuerySingleInstanceMultiple(IN PVOID *DataBlockObjectList, 238 IN PUNICODE_STRING InstanceNames, 239 IN ULONG ObjectCount, 240 IN OUT ULONG *InOutBufferSize, 241 OUT PVOID OutBuffer) 242 { 243 UNIMPLEMENTED; 244 return STATUS_NOT_IMPLEMENTED; 245 } 246 247 /* 248 * @unimplemented 249 */ 250 NTSTATUS 251 NTAPI 252 IoWMISetSingleInstance(IN PVOID DataBlockObject, 253 IN PUNICODE_STRING InstanceName, 254 IN ULONG Version, 255 IN ULONG ValueBufferSize, 256 IN PVOID ValueBuffer) 257 { 258 UNIMPLEMENTED; 259 return STATUS_NOT_IMPLEMENTED; 260 } 261 262 /* 263 * @unimplemented 264 */ 265 NTSTATUS 266 NTAPI 267 IoWMISetSingleItem(IN PVOID DataBlockObject, 268 IN PUNICODE_STRING InstanceName, 269 IN ULONG DataItemId, 270 IN ULONG Version, 271 IN ULONG ValueBufferSize, 272 IN PVOID ValueBuffer) 273 { 274 UNIMPLEMENTED; 275 return STATUS_NOT_IMPLEMENTED; 276 } 277 278 /* 279 * @unimplemented 280 */ 281 NTSTATUS 282 NTAPI 283 IoWMIExecuteMethod(IN PVOID DataBlockObject, 284 IN PUNICODE_STRING InstanceName, 285 IN ULONG MethodId, 286 IN ULONG InBufferSize, 287 IN OUT PULONG OutBufferSize, 288 IN OUT PUCHAR InOutBuffer) 289 { 290 UNIMPLEMENTED; 291 return STATUS_NOT_IMPLEMENTED; 292 } 293 294 /* 295 * @unimplemented 296 */ 297 NTSTATUS 298 NTAPI 299 IoWMISetNotificationCallback(IN PVOID Object, 300 IN WMI_NOTIFICATION_CALLBACK Callback, 301 IN PVOID Context) 302 { 303 UNIMPLEMENTED; 304 return STATUS_NOT_IMPLEMENTED; 305 } 306 307 /* 308 * @unimplemented 309 */ 310 NTSTATUS 311 NTAPI 312 IoWMIHandleToInstanceName(IN PVOID DataBlockObject, 313 IN HANDLE FileHandle, 314 OUT PUNICODE_STRING InstanceName) 315 { 316 UNIMPLEMENTED; 317 return STATUS_NOT_IMPLEMENTED; 318 } 319 320 /* 321 * @unimplemented 322 */ 323 NTSTATUS 324 NTAPI 325 IoWMIDeviceObjectToInstanceName(IN PVOID DataBlockObject, 326 IN PDEVICE_OBJECT DeviceObject, 327 OUT PUNICODE_STRING InstanceName) 328 { 329 UNIMPLEMENTED; 330 return STATUS_NOT_IMPLEMENTED; 331 } 332 333 /* 334 * @unimplemented 335 */ 336 NTSTATUS 337 NTAPI 338 WmiQueryTraceInformation(IN TRACE_INFORMATION_CLASS TraceInformationClass, 339 OUT PVOID TraceInformation, 340 IN ULONG TraceInformationLength, 341 OUT PULONG RequiredLength OPTIONAL, 342 IN PVOID Buffer OPTIONAL) 343 { 344 UNIMPLEMENTED; 345 return STATUS_NOT_IMPLEMENTED; 346 } 347 348 /* 349 * @unimplemented 350 */ 351 NTSTATUS 352 __cdecl 353 WmiTraceMessage(IN TRACEHANDLE LoggerHandle, 354 IN ULONG MessageFlags, 355 IN LPGUID MessageGuid, 356 IN USHORT MessageNumber, 357 IN ...) 358 { 359 UNIMPLEMENTED; 360 return STATUS_NOT_IMPLEMENTED; 361 } 362 363 /* 364 * @unimplemented 365 */ 366 NTSTATUS 367 NTAPI 368 WmiTraceMessageVa(IN TRACEHANDLE LoggerHandle, 369 IN ULONG MessageFlags, 370 IN LPGUID MessageGuid, 371 IN USHORT MessageNumber, 372 IN va_list MessageArgList) 373 { 374 UNIMPLEMENTED; 375 return STATUS_NOT_IMPLEMENTED; 376 } 377 378 NTSTATUS 379 NTAPI 380 WmiFlushTrace(IN OUT PWMI_LOGGER_INFORMATION LoggerInfo) 381 { 382 UNIMPLEMENTED; 383 return STATUS_NOT_IMPLEMENTED; 384 } 385 386 LONG64 387 FASTCALL 388 WmiGetClock(IN WMI_CLOCK_TYPE ClockType, 389 IN PVOID Context) 390 { 391 UNIMPLEMENTED; 392 return STATUS_NOT_IMPLEMENTED; 393 } 394 395 NTSTATUS 396 NTAPI 397 WmiQueryTrace(IN OUT PWMI_LOGGER_INFORMATION LoggerInfo) 398 { 399 UNIMPLEMENTED; 400 return STATUS_NOT_IMPLEMENTED; 401 } 402 403 NTSTATUS 404 NTAPI 405 WmiStartTrace(IN OUT PWMI_LOGGER_INFORMATION LoggerInfo) 406 { 407 UNIMPLEMENTED; 408 return STATUS_NOT_IMPLEMENTED; 409 } 410 411 NTSTATUS 412 NTAPI 413 WmiStopTrace(IN PWMI_LOGGER_INFORMATION LoggerInfo) 414 { 415 UNIMPLEMENTED; 416 return STATUS_NOT_IMPLEMENTED; 417 } 418 419 NTSTATUS 420 FASTCALL 421 WmiTraceFastEvent(IN PWNODE_HEADER Wnode) 422 { 423 UNIMPLEMENTED; 424 return STATUS_NOT_IMPLEMENTED; 425 } 426 427 NTSTATUS 428 NTAPI 429 WmiUpdateTrace(IN OUT PWMI_LOGGER_INFORMATION LoggerInfo) 430 { 431 UNIMPLEMENTED; 432 return STATUS_NOT_IMPLEMENTED; 433 } 434 435 /* 436 * @unimplemented 437 */ 438 NTSTATUS 439 NTAPI 440 NtTraceEvent(IN ULONG TraceHandle, 441 IN ULONG Flags, 442 IN ULONG TraceHeaderLength, 443 IN struct _EVENT_TRACE_HEADER* TraceHeader) 444 { 445 UNIMPLEMENTED; 446 return STATUS_NOT_IMPLEMENTED; 447 } 448 449 /*Eof*/ 450