Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

774 lines
25 KiB

  1. /*++ BUILD Version: 0000 // Increment this if a change has global effects
  2. Copyright (c) Microsoft Corporation. All rights reserved.
  3. Module Name:
  4. scsiwmi.h
  5. Abstract:
  6. This module contains the internal structure definitions and APIs used by
  7. the SCSI WMILIB helper functions
  8. Author:
  9. AlanWar
  10. Revision History:
  11. --*/
  12. #ifndef _SCSIWMI_
  13. #define _SCSIWMI_
  14. #if defined (_MSC_VER) && (_MSC_VER >= 1020)
  15. #pragma once
  16. #endif
  17. #ifdef __cplusplus
  18. extern "C" {
  19. #endif
  20. //
  21. // This is a per-request context buffer that is needed for every wmi srb.
  22. // The request context must remain valid throughout the entire processing
  23. // of the srb, at least until ScsiPortWmiPostProcess returns with the
  24. // final srb return status and buffer size. If the srb can
  25. // pend then memory for this buffer should be allocated from the SRB
  26. // extension. If not then the memory can be allocated from a stack frame that
  27. // does not go out of scope.
  28. //
  29. typedef struct
  30. {
  31. PVOID UserContext; // Available for miniport use
  32. ULONG BufferSize; // Reserved for SCSIWMI use
  33. PUCHAR Buffer; // Reserved for SCSIWMI use
  34. UCHAR MinorFunction;// Reserved for SCSIWMI use
  35. UCHAR ReturnStatus; // Available to miniport after ScsiPortWmiPostProcess
  36. ULONG ReturnSize; // Available to miniport after ScsiPortWmiPostProcess
  37. } SCSIWMI_REQUEST_CONTEXT, *PSCSIWMI_REQUEST_CONTEXT;
  38. #define ScsiPortWmiGetReturnStatus(RequestContext) ((RequestContext)->ReturnStatus)
  39. #define ScsiPortWmiGetReturnSize(RequestContext) ((RequestContext)->ReturnSize)
  40. //
  41. // This defines a guid to be registered with WMI.
  42. //
  43. typedef struct
  44. {
  45. LPCGUID Guid; // Guid representing data block
  46. ULONG InstanceCount; // Count of Instances of Datablock. If
  47. // this count is 0xffffffff then the guid
  48. // is assumed to be dynamic instance names
  49. ULONG Flags; // Additional flags (see WMIREGINFO in wmistr.h)
  50. } SCSIWMIGUIDREGINFO, *PSCSIWMIGUIDREGINFO;
  51. //
  52. // If this is set then the guid is registered as having dynamic
  53. // instance names.
  54. //
  55. #define WMIREG_FLAG_CALL_BY_NAME 0x40000000
  56. typedef
  57. UCHAR
  58. (*PSCSIWMI_QUERY_REGINFO) (
  59. IN PVOID DeviceContext,
  60. IN PSCSIWMI_REQUEST_CONTEXT RequestContext,
  61. OUT PWCHAR *MofResourceName
  62. );
  63. /*++
  64. Routine Description:
  65. This routine is a callback into the miniport to retrieve information about
  66. the guids being registered.
  67. This callback is synchronous and may not be pended. Also
  68. ScsiPortWmiPostProcess should not be called from within this callback.
  69. Arguments:
  70. DeviceContext is a caller specified context value originally passed to
  71. ScsiPortWmiDispatchFunction.
  72. RequestContext is a context associated with the srb being processed.
  73. MofResourceName returns with a pointer to a WCHAR string with name of
  74. the MOF resource attached to the miniport binary image file. If
  75. the driver does not have a mof resource attached then this can
  76. be returned as NULL.
  77. Return Value:
  78. TRUE if request is pending else FALSE
  79. --*/
  80. typedef
  81. BOOLEAN
  82. (*PSCSIWMI_QUERY_DATABLOCK) (
  83. IN PVOID Context,
  84. IN PSCSIWMI_REQUEST_CONTEXT DispatchContext,
  85. IN ULONG GuidIndex,
  86. IN ULONG InstanceIndex,
  87. IN ULONG InstanceCount,
  88. IN OUT PULONG InstanceLengthArray,
  89. IN ULONG BufferAvail,
  90. OUT PUCHAR Buffer
  91. );
  92. /*++
  93. Routine Description:
  94. This routine is a callback into the miniport to query for the contents of
  95. one or more instances of a data block. This callback may be called with
  96. an output buffer that is too small to return all of the data queried.
  97. In this case the callback is responsible to report the correct output
  98. buffer size needed.
  99. If the request can be completed immediately without pending,
  100. ScsiPortWmiPostProcess should be called from within this callback and
  101. FALSE returned.
  102. If the request cannot be completed within this callback then TRUE should
  103. be returned. Once the pending operations are finished the miniport should
  104. call ScsiPortWmiPostProcess and then complete the srb.
  105. Arguments:
  106. DeviceContext is a caller specified context value originally passed to
  107. ScsiPortWmiDispatchFunction.
  108. RequestContext is a context associated with the srb being processed.
  109. GuidIndex is the index into the list of guids provided when the
  110. miniport registered
  111. InstanceIndex is the index that denotes first instance of the data block
  112. is being queried.
  113. InstanceCount is the number of instances expected to be returned for
  114. the data block.
  115. InstanceLengthArray is a pointer to an array of ULONG that returns the
  116. lengths of each instance of the data block. This may be NULL when
  117. there is not enough space in the output buffer to fufill the request.
  118. In this case the miniport should call ScsiPortWmiPostProcess with
  119. a status of SRB_STATUS_DATA_OVERRUN and the size of the output buffer
  120. needed to fufill the request.
  121. BufferAvail on entry has the maximum size available to write the data
  122. blocks in the output buffer. If the output buffer is not large enough
  123. to return all of the data blocks then the miniport should call
  124. ScsiPortWmiPostProcess with a status of SRB_STATUS_DATA_OVERRUN
  125. and the size of the output buffer needed to fufill the request.
  126. Buffer on return is filled with the returned data blocks. Note that each
  127. instance of the data block must be aligned on a 8 byte boundry. This
  128. may be NULL when there is not enough space in the output buffer to
  129. fufill the request. In this case the miniport should call
  130. ScsiPortWmiPostProcess with a status of SRB_STATUS_DATA_OVERRUN and
  131. the size of the output buffer needed to fufill the request.
  132. Return Value:
  133. TRUE if request is pending else FALSE
  134. --*/
  135. typedef
  136. BOOLEAN
  137. (*PSCSIWMI_SET_DATABLOCK) (
  138. IN PVOID DeviceContext,
  139. IN PSCSIWMI_REQUEST_CONTEXT RequestContext,
  140. IN ULONG GuidIndex,
  141. IN ULONG InstanceIndex,
  142. IN ULONG BufferSize,
  143. IN PUCHAR Buffer
  144. );
  145. /*++
  146. Routine Description:
  147. This routine is a callback into the miniport to set the contents of an
  148. entire instance of a data block.
  149. If the request can be completed immediately without pending,
  150. ScsiPortWmiPostProcess should be called from within this callback and
  151. FALSE returned.
  152. If the request cannot be completed within this callback then TRUE should
  153. be returned. Once the pending operations are finished the miniport should
  154. call ScsiPortWmiPostProcess and then complete the srb.
  155. Arguments:
  156. DeviceContext is a caller specified context value originally passed to
  157. ScsiPortWmiDispatchFunction.
  158. RequestContext is a context associated with the srb being processed.
  159. GuidIndex is the index into the list of guids provided when the
  160. miniport registered
  161. InstanceIndex is the index that denotes which instance of the data block
  162. is being set.
  163. BufferSize has the size of the data block passed
  164. Buffer has the new values for the data block
  165. Return Value:
  166. TRUE if request is pending else FALSE
  167. --*/
  168. typedef
  169. BOOLEAN
  170. (*PSCSIWMI_SET_DATAITEM) (
  171. IN PVOID DeviceContext,
  172. IN PSCSIWMI_REQUEST_CONTEXT RequestContext,
  173. IN ULONG GuidIndex,
  174. IN ULONG InstanceIndex,
  175. IN ULONG DataItemId,
  176. IN ULONG BufferSize,
  177. IN PUCHAR Buffer
  178. );
  179. /*++
  180. Routine Description:
  181. This routine is a callback into the miniport to set a single data item
  182. in a single instance of a data block.
  183. If the request can be completed immediately without pending,
  184. ScsiPortWmiPostProcess should be called from within this callback and
  185. FALSE returned.
  186. If the request cannot be completed within this callback then TRUE should
  187. be returned. Once the pending operations are finished the miniport should
  188. call ScsiPortWmiPostProcess and then complete the srb.
  189. Arguments:
  190. DeviceContext is a caller specified context value originally passed to
  191. ScsiPortWmiDispatchFunction.
  192. RequestContext is a context associated with the srb being processed.
  193. GuidIndex is the index into the list of guids provided when the
  194. miniport registered
  195. InstanceIndex is the index that denotes which instance of the data block
  196. is being set.
  197. DataItemId has the id of the data item being set
  198. BufferSize has the size of the data item passed
  199. Buffer has the new values for the data item
  200. Return Value:
  201. TRUE if request is pending else FALSE
  202. --*/
  203. typedef
  204. BOOLEAN
  205. (*PSCSIWMI_EXECUTE_METHOD) (
  206. IN PVOID DeviceContext,
  207. IN PSCSIWMI_REQUEST_CONTEXT RequestContext,
  208. IN ULONG GuidIndex,
  209. IN ULONG InstanceIndex,
  210. IN ULONG MethodId,
  211. IN ULONG InBufferSize,
  212. IN ULONG OutBufferSize,
  213. IN OUT PUCHAR Buffer
  214. );
  215. /*++
  216. Routine Description:
  217. This routine is a callback into the miniport to execute a method.
  218. If the request can be completed immediately without pending,
  219. ScsiPortWmiPostProcess should be called from within this callback and
  220. FALSE returned.
  221. If the request cannot be completed within this callback then TRUE should
  222. be returned. Once the pending operations are finished the miniport should
  223. call ScsiPortWmiPostProcess and then complete the srb.
  224. Arguments:
  225. Context is a caller specified context value originally passed to
  226. ScsiPortWmiDispatchFunction.
  227. RequestContext is a context associated with the srb being processed.
  228. GuidIndex is the index into the list of guids provided when the
  229. miniport registered
  230. InstanceIndex is the index that denotes which instance of the data block
  231. is being called.
  232. MethodId has the id of the method being called
  233. InBufferSize has the size of the data block passed in as the input to
  234. the method.
  235. OutBufferSize on entry has the maximum size available to write the
  236. returned data block. If the output buffer is not large enough
  237. to return all of the data blocks then the miniport should call
  238. ScsiPortWmiPostProcess with a status of SRB_STATUS_DATA_OVERRUN
  239. and the size of the output buffer needed to fufill the request.
  240. It is important to check that there is sufficient room in the
  241. output buffer before performing any operations that may have
  242. side effects.
  243. Buffer on entry has the input data block and on return has the output
  244. output data block.
  245. Return Value:
  246. TRUE if request is pending else FALSE
  247. --*/
  248. typedef enum
  249. {
  250. ScsiWmiEventControl, // Enable or disable an event
  251. ScsiWmiDataBlockControl // Enable or disable data block collection
  252. } SCSIWMI_ENABLE_DISABLE_CONTROL;
  253. typedef
  254. BOOLEAN
  255. (*PSCSIWMI_FUNCTION_CONTROL) (
  256. IN PVOID DeviceContext,
  257. IN PSCSIWMI_REQUEST_CONTEXT RequestContext,
  258. IN ULONG GuidIndex,
  259. IN SCSIWMI_ENABLE_DISABLE_CONTROL Function,
  260. IN BOOLEAN Enable
  261. );
  262. /*++
  263. Routine Description:
  264. This routine is a callback into the miniport to enabled or disable event
  265. generation or data block collection. Since WMI manages reference counting
  266. for each of the data blocks or events, a miniport should only expect a
  267. single enable followed by a single disable. Data blocks will only
  268. receive collection enable/disable if they were registered as requiring
  269. it, that is include the WMIREG_FLAG_EXPENSIVE flag.
  270. If the request can be completed immediately without pending,
  271. ScsiPortWmiPostProcess should be called from within this callback and
  272. FALSE returned.
  273. If the request cannot be completed within this callback then TRUE should
  274. be returned. Once the pending operations are finished the miniport should
  275. call ScsiPortWmiPostProcess and then complete the srb.
  276. Arguments:
  277. DeviceContext is a caller specified context value originally passed to
  278. ScsiPortWmiDispatchFunction.
  279. RequestContext is a context associated with the srb being processed.
  280. Function specifies which functionality is being enabled or disabled
  281. Enable is TRUE then the function is being enabled else disabled
  282. Return Value:
  283. TRUE if request is pending else FALSE
  284. --*/
  285. //
  286. // This structure supplies context information for SCSIWMILIB to process the
  287. // WMI srbs.
  288. //
  289. typedef struct _SCSIWMILIB_CONTEXT
  290. {
  291. //
  292. // WMI data block guid registration info
  293. ULONG GuidCount;
  294. PSCSIWMIGUIDREGINFO GuidList;
  295. //
  296. // WMI functionality callbacks
  297. PSCSIWMI_QUERY_REGINFO QueryWmiRegInfo;
  298. PSCSIWMI_QUERY_DATABLOCK QueryWmiDataBlock;
  299. PSCSIWMI_SET_DATABLOCK SetWmiDataBlock;
  300. PSCSIWMI_SET_DATAITEM SetWmiDataItem;
  301. PSCSIWMI_EXECUTE_METHOD ExecuteWmiMethod;
  302. PSCSIWMI_FUNCTION_CONTROL WmiFunctionControl;
  303. } SCSI_WMILIB_CONTEXT, *PSCSI_WMILIB_CONTEXT;
  304. VOID
  305. ScsiPortWmiPostProcess(
  306. IN PSCSIWMI_REQUEST_CONTEXT RequestContext,
  307. IN UCHAR SrbStatus,
  308. IN ULONG BufferUsed
  309. );
  310. /*++
  311. Routine Description:
  312. This routine will do the work of post-processing a WMI srb.
  313. Arguments:
  314. RequestContext is a context associated with the srb being processed. After
  315. this api returns the ReturnStatus and ReturnSize fields are updated.
  316. SrbStatus has the return status code for the srb. If a query or method
  317. callback was passed an output buffer that was not large enough
  318. then SrbStatus should be SRB_STATUS_DATA_OVERRUN and BufferUsed
  319. should be the number of bytes needed in the output buffer.
  320. BufferUsed has the number of bytes required by the miniport to return the
  321. data requested in the WMI srb. If SRB_STATUS_DATA_OVERRUN was passed
  322. in SrbStatus then BufferUsed has the number of needed in the output
  323. buffer. If SRB_STATUS_SUCCESS is passed in SrbStatus then BufferUsed
  324. has the actual number of bytes used in the output buffer.
  325. Return Value:
  326. --*/
  327. BOOLEAN
  328. ScsiPortWmiDispatchFunction(
  329. IN PSCSI_WMILIB_CONTEXT WmiLibInfo,
  330. IN UCHAR MinorFunction,
  331. IN PVOID DeviceContext,
  332. IN PSCSIWMI_REQUEST_CONTEXT RequestContext,
  333. IN PVOID DataPath,
  334. IN ULONG BufferSize,
  335. IN PVOID Buffer
  336. );
  337. /*++
  338. Routine Description:
  339. Dispatch helper routine for WMI srb requests. Based on the Minor
  340. function passed the WMI request is processed and this routine
  341. invokes the appropriate callback in the WMILIB structure.
  342. Arguments:
  343. WmiLibInfo has the SCSI WMILIB information control block associated
  344. with the adapter or logical unit
  345. DeviceContext is miniport defined context value passed on to the callbacks
  346. invoked by this api.
  347. RequestContext is a pointer to a context structure that maintains
  348. information about this WMI srb. This request context must remain
  349. valid throughout the entire processing of the srb, at least until
  350. ScsiPortWmiPostProcess returns with the final srb return status and
  351. buffer size. If the srb can pend then memory for this buffer should
  352. be allocated from the SRB extension. If not then the memory can be
  353. allocated from a stack frame that does not go out of scope, perhaps
  354. that of the caller to this api.
  355. DataPath is value passed in wmi request
  356. BufferSize is value passed in wmi request
  357. Buffer is value passed in wmi request
  358. Return Value:
  359. TRUE if request is pending else FALSE
  360. --*/
  361. #define ScsiPortWmiFireAdapterEvent( \
  362. HwDeviceExtension, \
  363. Guid, \
  364. InstanceIndex, \
  365. EventDataSize, \
  366. EventData \
  367. ) \
  368. ScsiPortWmiFireLogicalUnitEvent(\
  369. HwDeviceExtension, \
  370. 0xff, \
  371. 0, \
  372. 0, \
  373. Guid, \
  374. InstanceIndex, \
  375. EventDataSize, \
  376. EventData)
  377. /*++
  378. Routine Description:
  379. This routine will fire a WMI event associated with an adapter using
  380. the data buffer passed. This routine may be called at or below DPC level.
  381. Arguments:
  382. HwDeviceExtension is the adapter device extension
  383. Guid is pointer to the GUID that represents the event
  384. InstanceIndex is the index of the instance of the event
  385. EventDataSize is the number of bytes of data that is being fired with
  386. with the event. This size specifies the size of the event data only
  387. and does NOT include the 0x40 bytes of preceeding padding.
  388. EventData is the data that is fired with the events. There must be exactly
  389. 0x40 bytes of padding preceeding the event data.
  390. Return Value:
  391. --*/
  392. VOID
  393. ScsiPortWmiFireLogicalUnitEvent(
  394. IN PVOID HwDeviceExtension,
  395. IN UCHAR PathId,
  396. IN UCHAR TargetId,
  397. IN UCHAR Lun,
  398. IN LPGUID Guid,
  399. IN ULONG InstanceIndex,
  400. IN ULONG EventDataSize,
  401. IN PVOID EventData
  402. );
  403. /*++
  404. Routine Description:
  405. This routine will fire a WMI event using the data buffer passed. This
  406. routine may be called at or below DPC level
  407. Arguments:
  408. HwDeviceExtension is the adapter device extension
  409. PathId identifies the SCSI bus if a logical unit is firing the event
  410. or is 0xff if the adapter is firing the event.
  411. TargetId identifies the target controller or device on the bus
  412. Lun identifies the logical unit number of the target device
  413. Guid is pointer to the GUID that represents the event
  414. InstanceIndex is the index of the instance of the event
  415. EventDataSize is the number of bytes of data that is being fired with
  416. with the event. This size specifies the size of the event data only
  417. and does NOT include the 0x40 bytes of preceeding padding.
  418. EventData is the data that is fired with the events. There must be exactly
  419. 0x40 bytes of padding preceeding the event data.
  420. Return Value:
  421. --*/
  422. //
  423. // This macro determines if the WMI request is a QueryAllData request
  424. // or a different request
  425. //
  426. #define ScsiPortWmiIsQueryAllData(RequestContext) \
  427. ( (RequestContext)->MinorFunction == WMI_GET_ALL_DATA )
  428. PWCHAR ScsiPortWmiGetInstanceName(
  429. IN PSCSIWMI_REQUEST_CONTEXT RequestContext
  430. );
  431. /*++
  432. Routine Description:
  433. This routine will return a pointer to the instance name that was
  434. used to pass the request. If the request type is one that does not
  435. use an instance name then NULL is retuened. The instance name is a
  436. counted string.
  437. Arguments:
  438. RequestContext is a pointer to a context structure that maintains
  439. information about this WMI srb. This request context must remain
  440. valid throughout the entire processing of the srb, at least until
  441. ScsiPortWmiPostProcess returns with the final srb return status and
  442. buffer size. If the srb can pend then memory for this buffer should
  443. be allocated from the SRB extension. If not then the memory can be
  444. allocated from a stack frame that does not go out of scope, perhaps
  445. that of the caller to this api.
  446. Return Value:
  447. Pointer to instance name or NULL if no instance name is available
  448. --*/
  449. BOOLEAN ScsiPortWmiSetInstanceCount(
  450. IN PSCSIWMI_REQUEST_CONTEXT RequestContext,
  451. IN ULONG InstanceCount,
  452. OUT PULONG BufferAvail,
  453. OUT PULONG SizeNeeded
  454. );
  455. /*++
  456. Routine Description:
  457. This routine will update the wnode to indicate the number of
  458. instances that will be returned by the driver. Note that the values
  459. for BufferAvail may change after this call. This routine
  460. may only be called for a WNODE_ALL_DATA. This routine must be
  461. called before calling ScsiPortWmiSetInstanceName or
  462. ScsiPortWmiSetData
  463. Arguments:
  464. RequestContext is a pointer to a context structure that maintains
  465. information about this WMI srb. This request context must remain
  466. valid throughout the entire processing of the srb, at least until
  467. ScsiPortWmiPostProcess returns with the final srb return status and
  468. buffer size. If the srb can pend then memory for this buffer should
  469. be allocated from the SRB extension. If not then the memory can be
  470. allocated from a stack frame that does not go out of scope, perhaps
  471. that of the caller to this api.
  472. InstanceCount is the number of instances to be returned by the
  473. driver.
  474. *BufferAvail returns with the number of bytes available for
  475. instance names and data in the buffer. This may be 0 if there
  476. is not enough room for all instances.
  477. *SizeNeeded returns with the number of bytes that are needed so far
  478. to build the output wnode
  479. Return Value:
  480. TRUE if successful else FALSE. If FALSE wnode is not a
  481. WNODE_ALL_DATA or does not have dynamic instance names.
  482. --*/
  483. PWCHAR ScsiPortWmiSetInstanceName(
  484. IN PSCSIWMI_REQUEST_CONTEXT RequestContext,
  485. IN ULONG InstanceIndex,
  486. IN ULONG InstanceNameLength,
  487. OUT PULONG BufferAvail,
  488. IN OUT PULONG SizeNeeded
  489. );
  490. /*++
  491. Routine Description:
  492. This routine will update the wnode header to include the position where an
  493. instance name is to be written. Note that the values
  494. for BufferAvail may change after this call. This routine
  495. may only be called for a WNODE_ALL_DATA.
  496. Arguments:
  497. RequestContext is a pointer to a context structure that maintains
  498. information about this WMI srb. This request context must remain
  499. valid throughout the entire processing of the srb, at least until
  500. ScsiPortWmiPostProcess returns with the final srb return status and
  501. buffer size. If the srb can pend then memory for this buffer should
  502. be allocated from the SRB extension. If not then the memory can be
  503. allocated from a stack frame that does not go out of scope, perhaps
  504. that of the caller to this api.
  505. InstanceIndex is the index to the instance name being filled in
  506. InstanceNameLength is the number of bytes (including count) needed
  507. to write the instance name.
  508. *BufferAvail returns with the number of bytes available for
  509. instance names and data in the buffer. This may be 0 if there
  510. is not enough room for the instance name.
  511. *SizeNeeded on entry has the number of bytes needed so far to build
  512. the WNODE and on return has the number of bytes needed to build
  513. the wnode after including the instance name
  514. Return Value:
  515. pointer to where the instance name should be filled in. If NULL
  516. then the wnode is not a WNODE_ALL_DATA or does not have dynamic
  517. instance names
  518. --*/
  519. PVOID ScsiPortWmiSetData(
  520. IN PSCSIWMI_REQUEST_CONTEXT RequestContext,
  521. IN ULONG InstanceIndex,
  522. IN ULONG DataLength,
  523. OUT PULONG BufferAvail,
  524. IN OUT PULONG SizeNeeded
  525. );
  526. /*++
  527. Routine Description:
  528. This routine will update the wnode to indicate the position of the
  529. data for an instance that will be returned by the driver. Note that
  530. the values for BufferAvail may change after this call. This routine
  531. may only be called for a WNODE_ALL_DATA.
  532. Arguments:
  533. RequestContext is a pointer to a context structure that maintains
  534. information about this WMI srb. This request context must remain
  535. valid throughout the entire processing of the srb, at least until
  536. ScsiPortWmiPostProcess returns with the final srb return status and
  537. buffer size. If the srb can pend then memory for this buffer should
  538. be allocated from the SRB extension. If not then the memory can be
  539. allocated from a stack frame that does not go out of scope, perhaps
  540. that of the caller to this api.
  541. InstanceIndex is the index to the instance name being filled in
  542. DataLength is the number of bytes needed to write the data.
  543. *BufferAvail returns with the number of bytes available for
  544. instance names and data in the buffer. This may be 0 if there
  545. is not enough room for the data.
  546. *SizeNeeded on entry has the number of bytes needed so far to build
  547. the WNODE and on return has the number of bytes needed to build
  548. the wnode after including the data
  549. Return Value:
  550. pointer to where the data should be filled in. If NULL
  551. then the wnode is not a WNODE_ALL_DATA or does not have dynamic
  552. instance names
  553. --*/
  554. #ifdef __cplusplus
  555. }
  556. #endif
  557. #endif