1/*
2 * scsiwmi.h
3 *
4 * SCSI WMILIB interface.
5 *
6 * This file is part of the w32api package.
7 *
8 * Contributors:
9 *   Created by Casper S. Hornstrup <chorns@users.sourceforge.net>
10 *
11 * THIS SOFTWARE IS NOT COPYRIGHTED
12 *
13 * This source code is offered for use in the public domain. You may
14 * use, modify or distribute it freely.
15 *
16 * This code is distributed in the hope that it will be useful but
17 * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
18 * DISCLAIMED. This includes but is not limited to warranties of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
20 *
21 */
22
23#ifndef __SCSIWMI_H
24#define __SCSIWMI_H
25
26#include "srb.h"
27
28#ifdef __cplusplus
29extern "C" {
30#endif
31
32#pragma pack(push,4)
33
34typedef struct _SCSIWMI_REQUEST_CONTEXT {
35  PVOID  UserContext;
36  ULONG  BufferSize;
37  PUCHAR  Buffer;
38  UCHAR  MinorFunction;
39  UCHAR  ReturnStatus;
40  ULONG  ReturnSize;
41} SCSIWMI_REQUEST_CONTEXT, *PSCSIWMI_REQUEST_CONTEXT;
42
43#ifdef _GUID_DEFINED
44# warning _GUID_DEFINED is deprecated, use GUID_DEFINED instead
45#endif
46
47#if ! (defined _GUID_DEFINED || defined GUID_DEFINED)
48#define GUID_DEFINED
49typedef struct _GUID {
50    ULONG          Data1;
51    unsigned short Data2;
52    unsigned short Data3;
53    unsigned char  Data4[ 8 ];
54} GUID;
55#endif
56
57typedef struct _SCSIWMIGUIDREGINFO {
58  LPCGUID  Guid;
59  ULONG  InstanceCount;
60  ULONG  Flags;
61} SCSIWMIGUIDREGINFO, *PSCSIWMIGUIDREGINFO;
62
63typedef UCHAR
64(NTAPI *PSCSIWMI_QUERY_REGINFO)(
65	IN PVOID  DeviceContext,
66	IN PSCSIWMI_REQUEST_CONTEXT  RequestContext,
67	OUT PWCHAR  *MofResourceName);
68
69typedef BOOLEAN
70(NTAPI *PSCSIWMI_QUERY_DATABLOCK)(
71  IN PVOID  Context,
72  IN PSCSIWMI_REQUEST_CONTEXT  DispatchContext,
73  IN ULONG  GuidIndex,
74  IN ULONG  InstanceIndex,
75  IN ULONG  InstanceCount,
76  IN OUT PULONG  InstanceLengthArray,
77  IN ULONG  BufferAvail,
78  OUT PUCHAR  Buffer);
79
80typedef BOOLEAN
81(NTAPI *PSCSIWMI_SET_DATABLOCK)(
82  IN PVOID  DeviceContext,
83  IN PSCSIWMI_REQUEST_CONTEXT  RequestContext,
84  IN ULONG  GuidIndex,
85  IN ULONG  InstanceIndex,
86  IN ULONG  BufferSize,
87  IN PUCHAR  Buffer);
88
89typedef BOOLEAN
90(NTAPI *PSCSIWMI_SET_DATAITEM)(
91  IN PVOID  DeviceContext,
92  IN PSCSIWMI_REQUEST_CONTEXT  RequestContext,
93  IN ULONG  GuidIndex,
94  IN ULONG  InstanceIndex,
95  IN ULONG  DataItemId,
96  IN ULONG  BufferSize,
97  IN PUCHAR  Buffer);
98
99typedef BOOLEAN
100(NTAPI *PSCSIWMI_EXECUTE_METHOD)(
101  IN PVOID  DeviceContext,
102  IN PSCSIWMI_REQUEST_CONTEXT  RequestContext,
103  IN ULONG  GuidIndex,
104  IN ULONG  InstanceIndex,
105  IN ULONG  MethodId,
106  IN ULONG  InBufferSize,
107  IN ULONG  OutBufferSize,
108  IN OUT PUCHAR  Buffer);
109
110typedef enum _SCSIWMI_ENABLE_DISABLE_CONTROL {
111	ScsiWmiEventControl,
112	ScsiWmiDataBlockControl
113} SCSIWMI_ENABLE_DISABLE_CONTROL;
114
115typedef BOOLEAN
116(NTAPI *PSCSIWMI_FUNCTION_CONTROL)(
117  IN PVOID  DeviceContext,
118  IN PSCSIWMI_REQUEST_CONTEXT  RequestContext,
119  IN ULONG  GuidIndex,
120  IN SCSIWMI_ENABLE_DISABLE_CONTROL  Function,
121  IN BOOLEAN  Enable);
122
123typedef struct _SCSIWMILIB_CONTEXT {
124  ULONG  GuidCount;
125  PSCSIWMIGUIDREGINFO  GuidList;
126  PSCSIWMI_QUERY_REGINFO  QueryWmiRegInfo;
127  PSCSIWMI_QUERY_DATABLOCK  QueryWmiDataBlock;
128  PSCSIWMI_SET_DATABLOCK  SetWmiDataBlock;
129  PSCSIWMI_SET_DATAITEM  SetWmiDataItem;
130  PSCSIWMI_EXECUTE_METHOD  ExecuteWmiMethod;
131  PSCSIWMI_FUNCTION_CONTROL  WmiFunctionControl;
132} SCSI_WMILIB_CONTEXT, *PSCSI_WMILIB_CONTEXT;
133
134SCSIPORTAPI
135BOOLEAN
136NTAPI
137ScsiPortWmiDispatchFunction(
138  IN PSCSI_WMILIB_CONTEXT  WmiLibInfo,
139  IN UCHAR  MinorFunction,
140  IN PVOID  DeviceContext,
141  IN PSCSIWMI_REQUEST_CONTEXT  RequestContext,
142  IN PVOID  DataPath,
143  IN ULONG  BufferSize,
144  IN PVOID  Buffer);
145
146#define ScsiPortWmiFireAdapterEvent(  \
147  HwDeviceExtension,                  \
148  Guid,                               \
149  InstanceIndex,                      \
150  EventDataSize,                      \
151  EventData)                          \
152    ScsiPortWmiFireLogicalUnitEvent(  \
153	  HwDeviceExtension,                \
154	  0xff,                             \
155	  0,                                \
156	  0,                                \
157	  Guid,                             \
158	  InstanceIndex,                    \
159	  EventDataSize,                    \
160	  EventData)
161
162/*
163 * ULONG
164 * ScsiPortWmiGetReturnSize(
165 *   PSCSIWMI_REQUEST_CONTEXT  RequestContext);
166 */
167#define ScsiPortWmiGetReturnSize(RequestContext) \
168  ((RequestContext)->ReturnSize)
169
170/* UCHAR
171 * ScsiPortWmiGetReturnStatus(
172 *   PSCSIWMI_REQUEST_CONTEXT  RequestContext);
173 */
174#define ScsiPortWmiGetReturnStatus(RequestContext) \
175  ((RequestContext)->ReturnStatus)
176
177SCSIPORTAPI
178VOID
179NTAPI
180ScsiPortWmiPostProcess(
181  IN PSCSIWMI_REQUEST_CONTEXT  RequestContext,
182  IN UCHAR  SrbStatus,
183  IN ULONG  BufferUsed);
184
185SCSIPORTAPI
186VOID
187NTAPI
188ScsiPortWmiFireLogicalUnitEvent(
189  IN PVOID  HwDeviceExtension,
190  IN UCHAR  PathId,
191  IN UCHAR  TargetId,
192  IN UCHAR  Lun,
193  IN LPGUID  Guid,
194  IN ULONG  InstanceIndex,
195  IN ULONG  EventDataSize,
196  IN PVOID  EventData);
197
198#pragma pack(pop)
199
200#ifdef __cplusplus
201}
202#endif
203
204#endif /* __SCSIWMI_H */
205