1 /**
2  * This file has no copyright assigned and is placed in the Public Domain.
3  * This file is part of the mingw-w64 runtime package.
4  * No warranty is given; refer to the file DISCLAIMER.PD within this package.
5  */
6 #ifndef _INCL_NTMSAPI_H_
7 #define _INCL_NTMSAPI_H_
8 
9 #include <_mingw_unicode.h>
10 
11 #pragma pack(8)
12 
13 #ifdef __cplusplus
14 extern "C" {
15 #endif
16 
17   /* See http://msdn.microsoft.com/en-us/library/cc245176%28PROT.13%29.aspx */
18   typedef GUID NTMS_GUID;
19   typedef GUID *LPNTMS_GUID;
20   typedef BYTE *PSECURITY_DESCRIPTOR_NTMS;
21   typedef ULONG_PTR NTMS_HANDLE;
22 
23 
24 #define NTMS_NULLGUID {0,0,0,{0,0,0,0,0,0,0,0}}
25 #define NTMS_IS_NULLGUID(id) ((id.Data1==0)&&(id.Data2==0)&&(id.Data3==0)&& (id.Data4[0]==0)&&(id.Data4[1]==0)&&(id.Data4[2]==0)&& (id.Data4[3]==0)&&(id.Data4[4]==0)&&(id.Data4[5]==0)&& (id.Data4[6]==0)&&(id.Data4[7]==0))
26 
27 #define OpenNtmsSession __MINGW_NAME_AW(OpenNtmsSession)
28 #define GetNtmsDeviceName __MINGW_NAME_AW(GetNtmsDeviceName)
29 #define GetNtmsObjectInformation __MINGW_NAME_AW(GetNtmsObjectInformation)
30 #define SetNtmsObjectInformation __MINGW_NAME_AW(SetNtmsObjectInformation)
31 #define CreateNtmsMediaPool __MINGW_NAME_AW(CreateNtmsMediaPool)
32 #define GetNtmsMediaPoolName __MINGW_NAME_AW(GetNtmsMediaPoolName)
33 #define GetNtmsObjectAttribute __MINGW_NAME_AW(GetNtmsObjectAttribute)
34 #define SetNtmsObjectAttribute __MINGW_NAME_AW(SetNtmsObjectAttribute)
35 #define GetNtmsUIOptions __MINGW_NAME_AW(GetNtmsUIOptions)
36 #define SetNtmsUIOptions __MINGW_NAME_AW(SetNtmsUIOptions)
37 #define SubmitNtmsOperatorRequest __MINGW_NAME_AW(SubmitNtmsOperatorRequest)
38 
39 #define CreateNtmsMedia __MINGW_NAME_AW(CreateNtmsMedia)
40 #define EjectDiskFromSADrive __MINGW_NAME_AW(EjectDiskFromSADrive)
41 #define GetVolumesFromDrive __MINGW_NAME_AW(GetVolumesFromDrive)
42 
43 #ifndef NTMS_NOREDEF
44 
45   enum NtmsObjectsTypes {
46     NTMS_UNKNOWN = 0,
47     NTMS_OBJECT,NTMS_CHANGER,NTMS_CHANGER_TYPE,NTMS_COMPUTER,NTMS_DRIVE,NTMS_DRIVE_TYPE,NTMS_IEDOOR,NTMS_IEPORT,NTMS_LIBRARY,
48     NTMS_LIBREQUEST,NTMS_LOGICAL_MEDIA,NTMS_MEDIA_POOL,NTMS_MEDIA_TYPE,NTMS_PARTITION,NTMS_PHYSICAL_MEDIA,NTMS_STORAGESLOT,
49     NTMS_OPREQUEST,NTMS_UI_DESTINATION,NTMS_NUMBER_OF_OBJECT_TYPES
50   };
51 
52   typedef struct _NTMS_ASYNC_IO {
53     NTMS_GUID OperationId;
54     NTMS_GUID EventId;
55     DWORD dwOperationType;
56     DWORD dwResult;
57     DWORD dwAsyncState;
58     HANDLE hEvent;
59     WINBOOL bOnStateChange;
60   } NTMS_ASYNC_IO,*LPNTMS_ASYNC_IO;
61 
62   enum NtmsAsyncStatus {
63     NTMS_ASYNCSTATE_QUEUED = 0,NTMS_ASYNCSTATE_WAIT_RESOURCE,NTMS_ASYNCSTATE_WAIT_OPERATOR,NTMS_ASYNCSTATE_INPROCESS,NTMS_ASYNCSTATE_COMPLETE
64   };
65 
66   enum NtmsAsyncOperations {
67     NTMS_ASYNCOP_MOUNT = 1
68   };
69 #endif
70 
71   enum NtmsSessionOptions {
72     NTMS_SESSION_QUERYEXPEDITE = 0x1
73   };
74 
75   HANDLE WINAPI OpenNtmsSessionW(LPCWSTR lpServer,LPCWSTR lpApplication,DWORD dwOptions);
76   HANDLE WINAPI OpenNtmsSessionA(LPCSTR lpServer,LPCSTR lpApplication,DWORD dwOptions);
77   DWORD WINAPI CloseNtmsSession(HANDLE hSession);
78 
79 #ifndef NTMS_NOREDEF
80 
81   enum NtmsMountOptions {
82     NTMS_MOUNT_READ = 0x0001,NTMS_MOUNT_WRITE = 0x0002,NTMS_MOUNT_ERROR_NOT_AVAILABLE = 0x0004,NTMS_MOUNT_ERROR_IF_UNAVAILABLE = 0x0004,
83     NTMS_MOUNT_ERROR_OFFLINE = 0x0008,NTMS_MOUNT_ERROR_IF_OFFLINE = 0x0008,NTMS_MOUNT_SPECIFIC_DRIVE = 0x0010,NTMS_MOUNT_NOWAIT = 0x0020
84   };
85 
86   enum NtmsDismountOptions {
87     NTMS_DISMOUNT_DEFERRED = 0x0001,NTMS_DISMOUNT_IMMEDIATE = 0x0002
88   };
89 
90   enum NtmsMountPriority {
91     NTMS_PRIORITY_DEFAULT = 0,NTMS_PRIORITY_HIGHEST = 15,NTMS_PRIORITY_HIGH = 7,NTMS_PRIORITY_NORMAL = 0,NTMS_PRIORITY_LOW = -7,
92     NTMS_PRIORITY_LOWEST = -15
93   };
94 
95   typedef struct _NTMS_MOUNT_INFORMATION {
96     DWORD dwSize;
97     LPVOID lpReserved;
98   } NTMS_MOUNT_INFORMATION,*LPNTMS_MOUNT_INFORMATION;
99 #endif
100 
101   DWORD WINAPI MountNtmsMedia(HANDLE hSession,LPNTMS_GUID lpMediaId,LPNTMS_GUID lpDriveId,DWORD dwCount,DWORD dwOptions,int dwPriority,DWORD dwTimeout,LPNTMS_MOUNT_INFORMATION lpMountInformation);
102   DWORD WINAPI DismountNtmsMedia(HANDLE hSession,LPNTMS_GUID lpMediaId,DWORD dwCount,DWORD dwOptions);
103 
104 #ifndef NTMS_NOREDEF
105   enum NtmsAllocateOptions {
106     NTMS_ALLOCATE_NEW = 0x0001,NTMS_ALLOCATE_NEXT = 0x0002,NTMS_ALLOCATE_ERROR_IF_UNAVAILABLE = 0x0004
107   };
108 
109   typedef struct _NTMS_ALLOCATION_INFORMATION {
110     DWORD dwSize;
111     LPVOID lpReserved;
112     NTMS_GUID AllocatedFrom;
113   } NTMS_ALLOCATION_INFORMATION,*LPNTMS_ALLOCATION_INFORMATION;
114 #endif
115 
116   DWORD WINAPI AllocateNtmsMedia(HANDLE hSession,LPNTMS_GUID lpMediaPool,LPNTMS_GUID lpPartition,LPNTMS_GUID lpMediaId,DWORD dwOptions,DWORD dwTimeout,LPNTMS_ALLOCATION_INFORMATION lpAllocateInformation);
117   DWORD WINAPI DeallocateNtmsMedia(HANDLE hSession,LPNTMS_GUID lpMediaId,DWORD dwOptions);
118   DWORD WINAPI SwapNtmsMedia(HANDLE hSession,LPNTMS_GUID lpMediaId1,LPNTMS_GUID lpMediaId2);
119   DWORD WINAPI AddNtmsMediaType(HANDLE hSession,LPNTMS_GUID lpMediaTypeId,LPNTMS_GUID lpLibId);
120   DWORD WINAPI DeleteNtmsMediaType(HANDLE hSession,LPNTMS_GUID lpMediaTypeId,LPNTMS_GUID lpLibId);
121   DWORD WINAPI ChangeNtmsMediaType(HANDLE hSession,LPNTMS_GUID lpMediaId,LPNTMS_GUID lpPoolId);
122   DWORD WINAPI DecommissionNtmsMedia(HANDLE hSession,LPNTMS_GUID lpMediaId);
123   DWORD WINAPI SetNtmsMediaComplete(HANDLE hSession,LPNTMS_GUID lpMediaId);
124   DWORD WINAPI DeleteNtmsMedia(HANDLE hSession,LPNTMS_GUID lpMediaId);
125 
126 #ifndef NTMS_NOREDEF
127   enum NtmsCreateOptions {
128     NTMS_OPEN_EXISTING = 0x0001,NTMS_CREATE_NEW = 0x0002,NTMS_OPEN_ALWAYS = 0x0003
129   };
130 #endif
131 
132 #ifdef PRE_SEVIL
133   DWORD WINAPI CreateNtmsMediaPool(HANDLE hSession,LPCTSTR lpPoolName,LPNTMS_GUID lpMediaType,DWORD dwAction,LPSECURITY_ATTRIBUTES lpSecurityAttributes,LPNTMS_GUID lpPoolId);
134 #endif
135   DWORD WINAPI CreateNtmsMediaPoolA(HANDLE hSession,LPCSTR lpPoolName,LPNTMS_GUID lpMediaType,DWORD dwAction,LPSECURITY_ATTRIBUTES lpSecurityAttributes,LPNTMS_GUID lpPoolId);
136   DWORD WINAPI CreateNtmsMediaPoolW(HANDLE hSession,LPCWSTR lpPoolName,LPNTMS_GUID lpMediaType,DWORD dwAction,LPSECURITY_ATTRIBUTES lpSecurityAttributes,LPNTMS_GUID lpPoolId);
137   DWORD WINAPI GetNtmsMediaPoolNameA(HANDLE hSession,LPNTMS_GUID lpPoolId,LPSTR lpNameBuf,LPDWORD lpdwBufSize);
138   DWORD WINAPI GetNtmsMediaPoolNameW(HANDLE hSession,LPNTMS_GUID lpPoolId,LPWSTR lpNameBuf,LPDWORD lpdwBufSize);
139   DWORD WINAPI MoveToNtmsMediaPool(HANDLE hSession,LPNTMS_GUID lpMediaId,LPNTMS_GUID lpPoolId);
140   DWORD WINAPI DeleteNtmsMediaPool(HANDLE hSession,LPNTMS_GUID lpPoolId);
141   DWORD WINAPI DeleteNtmsLibrary(HANDLE hSession,LPNTMS_GUID lpLibraryId);
142   DWORD WINAPI DeleteNtmsDrive(HANDLE hSession,LPNTMS_GUID lpDriveId);
143 
144 #define NTMS_OBJECTNAME_LENGTH 64
145 #define NTMS_DESCRIPTION_LENGTH 127
146 #define NTMS_DEVICENAME_LENGTH 64
147 #define NTMS_SERIALNUMBER_LENGTH 32
148 #define NTMS_REVISION_LENGTH 32
149 #define NTMS_BARCODE_LENGTH 64
150 #define NTMS_SEQUENCE_LENGTH 32
151 #define NTMS_VENDORNAME_LENGTH 128
152 #define NTMS_PRODUCTNAME_LENGTH 128
153 #define NTMS_USERNAME_LENGTH 64
154 #define NTMS_APPLICATIONNAME_LENGTH 64
155 #define NTMS_COMPUTERNAME_LENGTH 64
156 #define NTMS_I1_MESSAGE_LENGTH 127
157 #define NTMS_MESSAGE_LENGTH 256
158 #define NTMS_POOLHIERARCHY_LENGTH 512
159 #define NTMS_OMIDLABELID_LENGTH 255
160 #define NTMS_OMIDLABELTYPE_LENGTH 64
161 #define NTMS_OMIDLABELINFO_LENGTH 256
162 
163 #ifndef NTMS_NOREDEF
164 
165   enum NtmsDriveState {
166     NTMS_DRIVESTATE_DISMOUNTED = 0,NTMS_DRIVESTATE_MOUNTED = 1,NTMS_DRIVESTATE_LOADED = 2,NTMS_DRIVESTATE_UNLOADED = 5,
167     NTMS_DRIVESTATE_BEING_CLEANED = 6,NTMS_DRIVESTATE_DISMOUNTABLE = 7
168   };
169 
170 #define _NTMS_DRIVEINFORMATION __MINGW_NAME_AW(_NTMS_DRIVEINFORMATION)
171 #define NTMS_DRIVEINFORMATION __MINGW_NAME_AW(NTMS_DRIVEINFORMATION)
172 
173   typedef struct _NTMS_DRIVEINFORMATIONA {
174     DWORD Number;
175     DWORD State;
176     NTMS_GUID DriveType;
177     CHAR szDeviceName[NTMS_DEVICENAME_LENGTH];
178     CHAR szSerialNumber[NTMS_SERIALNUMBER_LENGTH];
179     CHAR szRevision[NTMS_REVISION_LENGTH];
180     WORD ScsiPort;
181     WORD ScsiBus;
182     WORD ScsiTarget;
183     WORD ScsiLun;
184     DWORD dwMountCount;
185     SYSTEMTIME LastCleanedTs;
186     NTMS_GUID SavedPartitionId;
187     NTMS_GUID Library;
188     GUID Reserved;
189     DWORD dwDeferDismountDelay;
190   } NTMS_DRIVEINFORMATIONA;
191 
192   typedef struct _NTMS_DRIVEINFORMATIONW {
193     DWORD Number;
194     DWORD State;
195     NTMS_GUID DriveType;
196     WCHAR szDeviceName[NTMS_DEVICENAME_LENGTH];
197     WCHAR szSerialNumber[NTMS_SERIALNUMBER_LENGTH];
198     WCHAR szRevision[NTMS_REVISION_LENGTH];
199     WORD ScsiPort;
200     WORD ScsiBus;
201     WORD ScsiTarget;
202     WORD ScsiLun;
203     DWORD dwMountCount;
204     SYSTEMTIME LastCleanedTs;
205     NTMS_GUID SavedPartitionId;
206     NTMS_GUID Library;
207     GUID Reserved;
208     DWORD dwDeferDismountDelay;
209   } NTMS_DRIVEINFORMATIONW;
210 
211   enum NtmsLibraryType {
212     NTMS_LIBRARYTYPE_UNKNOWN = 0,NTMS_LIBRARYTYPE_OFFLINE = 1,NTMS_LIBRARYTYPE_ONLINE = 2,NTMS_LIBRARYTYPE_STANDALONE = 3
213   };
214 
215   enum NtmsLibraryFlags {
216     NTMS_LIBRARYFLAG_FIXEDOFFLINE = 0x01,NTMS_LIBRARYFLAG_CLEANERPRESENT = 0x02,NTMS_LIBRARYFLAG_AUTODETECTCHANGE = 0x04,
217     NTMS_LIBRARYFLAG_IGNORECLEANERUSESREMAINING = 0x08,NTMS_LIBRARYFLAG_RECOGNIZECLEANERBARCODE = 0x10
218   };
219 
220   enum NtmsInventoryMethod {
221     NTMS_INVENTORY_NONE = 0,NTMS_INVENTORY_FAST = 1,NTMS_INVENTORY_OMID = 2,NTMS_INVENTORY_DEFAULT = 3,NTMS_INVENTORY_SLOT = 4,
222     NTMS_INVENTORY_STOP = 5,NTMS_INVENTORY_MAX
223   };
224 
225   typedef struct _NTMS_LIBRARYINFORMATION {
226     DWORD LibraryType;
227     NTMS_GUID CleanerSlot;
228     NTMS_GUID CleanerSlotDefault;
229     WINBOOL LibrarySupportsDriveCleaning;
230     WINBOOL BarCodeReaderInstalled;
231     DWORD InventoryMethod;
232     DWORD dwCleanerUsesRemaining;
233     DWORD FirstDriveNumber;
234     DWORD dwNumberOfDrives;
235     DWORD FirstSlotNumber;
236     DWORD dwNumberOfSlots;
237     DWORD FirstDoorNumber;
238     DWORD dwNumberOfDoors;
239     DWORD FirstPortNumber;
240     DWORD dwNumberOfPorts;
241     DWORD FirstChangerNumber;
242     DWORD dwNumberOfChangers;
243     DWORD dwNumberOfMedia;
244     DWORD dwNumberOfMediaTypes;
245     DWORD dwNumberOfLibRequests;
246     GUID Reserved;
247     WINBOOL AutoRecovery;
248     DWORD dwFlags;
249   } NTMS_LIBRARYINFORMATION;
250 
251 #define _NTMS_CHANGERINFORMATION __MINGW_NAME_AW(_NTMS_CHANGERINFORMATION)
252 #define NTMS_CHANGERINFORMATION __MINGW_NAME_AW(NTMS_CHANGERINFORMATION)
253 
254   typedef struct _NTMS_CHANGERINFORMATIONA {
255     DWORD Number;
256     NTMS_GUID ChangerType;
257     CHAR szSerialNumber[NTMS_SERIALNUMBER_LENGTH];
258     CHAR szRevision[NTMS_REVISION_LENGTH];
259     CHAR szDeviceName[NTMS_DEVICENAME_LENGTH];
260     WORD ScsiPort;
261     WORD ScsiBus;
262     WORD ScsiTarget;
263     WORD ScsiLun;
264     NTMS_GUID Library;
265   } NTMS_CHANGERINFORMATIONA;
266 
267   typedef struct _NTMS_CHANGERINFORMATIONW {
268     DWORD Number;
269     NTMS_GUID ChangerType;
270     WCHAR szSerialNumber[NTMS_SERIALNUMBER_LENGTH];
271     WCHAR szRevision[NTMS_REVISION_LENGTH];
272     WCHAR szDeviceName[NTMS_DEVICENAME_LENGTH];
273     WORD ScsiPort;
274     WORD ScsiBus;
275     WORD ScsiTarget;
276     WORD ScsiLun;
277     NTMS_GUID Library;
278   } NTMS_CHANGERINFORMATIONW;
279 
280   enum NtmsSlotState {
281     NTMS_SLOTSTATE_UNKNOWN = 0,NTMS_SLOTSTATE_FULL = 1,NTMS_SLOTSTATE_EMPTY = 2,NTMS_SLOTSTATE_NOTPRESENT = 3,NTMS_SLOTSTATE_NEEDSINVENTORY = 4
282   };
283 
284   typedef struct _NTMS_STORAGESLOTINFORMATION {
285     DWORD Number;
286     DWORD State;
287     NTMS_GUID Library;
288   } NTMS_STORAGESLOTINFORMATION;
289 
290   enum NtmsDoorState {
291     NTMS_DOORSTATE_UNKNOWN = 0,NTMS_DOORSTATE_CLOSED = 1,NTMS_DOORSTATE_OPEN = 2
292   };
293 
294   typedef struct _NTMS_IEDOORINFORMATION {
295     DWORD Number;
296     DWORD State;
297     WORD MaxOpenSecs;
298     NTMS_GUID Library;
299   } NTMS_IEDOORINFORMATION;
300 
301   enum NtmsPortPosition {
302     NTMS_PORTPOSITION_UNKNOWN = 0,NTMS_PORTPOSITION_EXTENDED = 1,NTMS_PORTPOSITION_RETRACTED = 2
303   };
304 
305   enum NtmsPortContent {
306     NTMS_PORTCONTENT_UNKNOWN = 0,NTMS_PORTCONTENT_FULL = 1,NTMS_PORTCONTENT_EMPTY = 2
307   };
308 
309   typedef struct _NTMS_IEPORTINFORMATION {
310     DWORD Number;
311     DWORD Content;
312     DWORD Position;
313     WORD MaxExtendSecs;
314     NTMS_GUID Library;
315   } NTMS_IEPORTINFORMATION;
316 
317   enum NtmsBarCodeState {
318     NTMS_BARCODESTATE_OK = 1,NTMS_BARCODESTATE_UNREADABLE = 2
319   };
320 
321   enum NtmsMediaState {
322     NTMS_MEDIASTATE_IDLE = 0,
323     NTMS_MEDIASTATE_INUSE,NTMS_MEDIASTATE_MOUNTED,NTMS_MEDIASTATE_LOADED,NTMS_MEDIASTATE_UNLOADED,
324     NTMS_MEDIASTATE_OPERROR,NTMS_MEDIASTATE_OPREQ
325   };
326 
327 #define _NTMS_PMIDINFORMATION __MINGW_NAME_AW(_NTMS_PMIDINFORMATION)
328 #define NTMS_PMIDINFORMATION __MINGW_NAME_AW(NTMS_PMIDINFORMATION)
329 
330   typedef struct _NTMS_PMIDINFORMATIONA {
331     NTMS_GUID CurrentLibrary;
332     NTMS_GUID MediaPool;
333     NTMS_GUID Location;
334     DWORD LocationType;
335     NTMS_GUID MediaType;
336     NTMS_GUID HomeSlot;
337     CHAR szBarCode[NTMS_BARCODE_LENGTH];
338     DWORD BarCodeState;
339     CHAR szSequenceNumber[NTMS_SEQUENCE_LENGTH];
340     DWORD MediaState;
341     DWORD dwNumberOfPartitions;
342     DWORD dwMediaTypeCode;
343     DWORD dwDensityCode;
344     NTMS_GUID MountedPartition;
345   } NTMS_PMIDINFORMATIONA;
346 
347   typedef struct _NTMS_PMIDINFORMATIONW {
348     NTMS_GUID CurrentLibrary;
349     NTMS_GUID MediaPool;
350     NTMS_GUID Location;
351     DWORD LocationType;
352     NTMS_GUID MediaType;
353     NTMS_GUID HomeSlot;
354     WCHAR szBarCode[NTMS_BARCODE_LENGTH];
355     DWORD BarCodeState;
356     WCHAR szSequenceNumber[NTMS_SEQUENCE_LENGTH];
357     DWORD MediaState;
358     DWORD dwNumberOfPartitions;
359     DWORD dwMediaTypeCode;
360     DWORD dwDensityCode;
361     NTMS_GUID MountedPartition;
362   } NTMS_PMIDINFORMATIONW;
363 
364   typedef struct _NTMS_LMIDINFORMATION {
365     NTMS_GUID MediaPool;
366     DWORD dwNumberOfPartitions;
367   } NTMS_LMIDINFORMATION;
368 
369   enum NtmsPartitionState {
370     NTMS_PARTSTATE_UNKNOWN = 0,
371     NTMS_PARTSTATE_UNPREPARED,NTMS_PARTSTATE_INCOMPATIBLE,NTMS_PARTSTATE_DECOMMISSIONED,
372     NTMS_PARTSTATE_AVAILABLE,NTMS_PARTSTATE_ALLOCATED,NTMS_PARTSTATE_COMPLETE,NTMS_PARTSTATE_FOREIGN,NTMS_PARTSTATE_IMPORT,
373     NTMS_PARTSTATE_RESERVED
374   };
375 
376 #define NTMS_PARTSTATE_NEW NTMS_PARTSTATE_UNKNOWN
377 
378 #define _NTMS_PARTITIONINFORMATION __MINGW_NAME_AW(_NTMS_PARTITIONINFORMATION)
379 #define NTMS_PARTITIONINFORMATION __MINGW_NAME_AW(NTMS_PARTITIONINFORMATION)
380 
381   typedef struct _NTMS_PARTITIONINFORMATIONA {
382     NTMS_GUID PhysicalMedia;
383     NTMS_GUID LogicalMedia;
384     DWORD State;
385     WORD Side;
386     DWORD dwOmidLabelIdLength;
387     BYTE OmidLabelId[NTMS_OMIDLABELID_LENGTH];
388     CHAR szOmidLabelType[NTMS_OMIDLABELTYPE_LENGTH];
389     CHAR szOmidLabelInfo[NTMS_OMIDLABELINFO_LENGTH];
390     DWORD dwMountCount;
391     DWORD dwAllocateCount;
392     LARGE_INTEGER Capacity;
393   } NTMS_PARTITIONINFORMATIONA;
394 
395   typedef struct _NTMS_PARTITIONINFORMATIONW {
396     NTMS_GUID PhysicalMedia;
397     NTMS_GUID LogicalMedia;
398     DWORD State;
399     WORD Side;
400     DWORD dwOmidLabelIdLength;
401     BYTE OmidLabelId[NTMS_OMIDLABELID_LENGTH];
402     WCHAR szOmidLabelType[NTMS_OMIDLABELTYPE_LENGTH];
403     WCHAR szOmidLabelInfo[NTMS_OMIDLABELINFO_LENGTH];
404     DWORD dwMountCount;
405     DWORD dwAllocateCount;
406     LARGE_INTEGER Capacity;
407   } NTMS_PARTITIONINFORMATIONW;
408 
409   enum NtmsPoolType {
410     NTMS_POOLTYPE_UNKNOWN = 0,NTMS_POOLTYPE_SCRATCH = 1,NTMS_POOLTYPE_FOREIGN = 2,NTMS_POOLTYPE_IMPORT = 3,NTMS_POOLTYPE_APPLICATION = 1000
411   };
412 
413   enum NtmsAllocationPolicy {
414     NTMS_ALLOCATE_FROMSCRATCH = 1
415   };
416 
417   enum NtmsDeallocationPolicy {
418     NTMS_DEALLOCATE_TOSCRATCH = 1
419   };
420 
421   typedef struct _NTMS_MEDIAPOOLINFORMATION {
422     DWORD PoolType;
423     NTMS_GUID MediaType;
424     NTMS_GUID Parent;
425     DWORD AllocationPolicy;
426     DWORD DeallocationPolicy;
427     DWORD dwMaxAllocates;
428     DWORD dwNumberOfPhysicalMedia;
429     DWORD dwNumberOfLogicalMedia;
430     DWORD dwNumberOfMediaPools;
431   } NTMS_MEDIAPOOLINFORMATION;
432 
433   enum NtmsReadWriteCharacteristics {
434     NTMS_MEDIARW_UNKNOWN = 0,NTMS_MEDIARW_REWRITABLE = 1,NTMS_MEDIARW_WRITEONCE = 2,NTMS_MEDIARW_READONLY = 3
435   };
436 
437   typedef struct _NTMS_MEDIATYPEINFORMATION {
438     DWORD MediaType;
439     DWORD NumberOfSides;
440     DWORD ReadWriteCharacteristics;
441     DWORD DeviceType;
442   } NTMS_MEDIATYPEINFORMATION;
443 
444 #define _NTMS_DRIVETYPEINFORMATION __MINGW_NAME_AW(_NTMS_DRIVETYPEINFORMATION)
445 #define NTMS_DRIVETYPEINFORMATION __MINGW_NAME_AW(NTMS_DRIVETYPEINFORMATION)
446 
447   typedef struct _NTMS_DRIVETYPEINFORMATIONA {
448     CHAR szVendor[NTMS_VENDORNAME_LENGTH];
449     CHAR szProduct[NTMS_PRODUCTNAME_LENGTH];
450     DWORD NumberOfHeads;
451     DWORD DeviceType;
452   } NTMS_DRIVETYPEINFORMATIONA;
453 
454   typedef struct _NTMS_DRIVETYPEINFORMATIONW {
455     WCHAR szVendor[NTMS_VENDORNAME_LENGTH];
456     WCHAR szProduct[NTMS_PRODUCTNAME_LENGTH];
457     DWORD NumberOfHeads;
458     DWORD DeviceType;
459   } NTMS_DRIVETYPEINFORMATIONW;
460 
461 #define _NTMS_CHANGERTYPEINFORMATION __MINGW_NAME_AW(_NTMS_CHANGERTYPEINFORMATION)
462 #define NTMS_CHANGERTYPEINFORMATION __MINGW_NAME_AW(NTMS_CHANGERTYPEINFORMATION)
463 
464   typedef struct _NTMS_CHANGERTYPEINFORMATIONA {
465     CHAR szVendor[NTMS_VENDORNAME_LENGTH];
466     CHAR szProduct[NTMS_PRODUCTNAME_LENGTH];
467     DWORD DeviceType;
468   } NTMS_CHANGERTYPEINFORMATIONA;
469 
470   typedef struct _NTMS_CHANGERTYPEINFORMATIONW {
471     WCHAR szVendor[NTMS_VENDORNAME_LENGTH];
472     WCHAR szProduct[NTMS_PRODUCTNAME_LENGTH];
473     DWORD DeviceType;
474   } NTMS_CHANGERTYPEINFORMATIONW;
475 
476   enum NtmsLmOperation {
477     NTMS_LM_REMOVE = 0,NTMS_LM_DISABLECHANGER = 1,NTMS_LM_DISABLELIBRARY = 1,NTMS_LM_ENABLECHANGER = 2,NTMS_LM_ENABLELIBRARY = 2,
478     NTMS_LM_DISABLEDRIVE = 3,NTMS_LM_ENABLEDRIVE = 4,NTMS_LM_DISABLEMEDIA = 5,NTMS_LM_ENABLEMEDIA = 6,NTMS_LM_UPDATEOMID = 7,
479     NTMS_LM_INVENTORY = 8,NTMS_LM_DOORACCESS = 9,NTMS_LM_EJECT = 10,NTMS_LM_EJECTCLEANER = 11,NTMS_LM_INJECT = 12,NTMS_LM_INJECTCLEANER = 13,
480     NTMS_LM_PROCESSOMID = 14,NTMS_LM_CLEANDRIVE = 15,NTMS_LM_DISMOUNT = 16,NTMS_LM_MOUNT = 17,NTMS_LM_WRITESCRATCH = 18,NTMS_LM_CLASSIFY = 19,
481     NTMS_LM_RESERVECLEANER = 20,NTMS_LM_RELEASECLEANER = 21,NTMS_LM_MAXWORKITEM
482   };
483 
484   enum NtmsLmState {
485     NTMS_LM_QUEUED = 0,NTMS_LM_INPROCESS = 1,NTMS_LM_PASSED = 2,NTMS_LM_FAILED = 3,NTMS_LM_INVALID = 4,NTMS_LM_WAITING = 5,
486     NTMS_LM_DEFERRED = 6,NTMS_LM_DEFFERED = 6,NTMS_LM_CANCELLED = 7,NTMS_LM_STOPPED = 8
487   };
488 
489 #define _NTMS_LIBREQUESTINFORMATION __MINGW_NAME_AW(_NTMS_LIBREQUESTINFORMATION)
490 #define NTMS_LIBREQUESTINFORMATION __MINGW_NAME_AW(NTMS_LIBREQUESTINFORMATION)
491 
492   typedef struct _NTMS_LIBREQUESTINFORMATIONA {
493     DWORD OperationCode;
494     DWORD OperationOption;
495     DWORD State;
496     NTMS_GUID PartitionId;
497     NTMS_GUID DriveId;
498     NTMS_GUID PhysMediaId;
499     NTMS_GUID Library;
500     NTMS_GUID SlotId;
501     SYSTEMTIME TimeQueued;
502     SYSTEMTIME TimeCompleted;
503     CHAR szApplication[NTMS_APPLICATIONNAME_LENGTH];
504     CHAR szUser[NTMS_USERNAME_LENGTH];
505     CHAR szComputer[NTMS_COMPUTERNAME_LENGTH];
506     DWORD dwErrorCode;
507     NTMS_GUID WorkItemId;
508     DWORD dwPriority;
509   } NTMS_LIBREQUESTINFORMATIONA;
510 
511   typedef struct _NTMS_LIBREQUESTINFORMATIONW {
512     DWORD OperationCode;
513     DWORD OperationOption;
514     DWORD State;
515     NTMS_GUID PartitionId;
516     NTMS_GUID DriveId;
517     NTMS_GUID PhysMediaId;
518     NTMS_GUID Library;
519     NTMS_GUID SlotId;
520     SYSTEMTIME TimeQueued;
521     SYSTEMTIME TimeCompleted;
522     WCHAR szApplication[NTMS_APPLICATIONNAME_LENGTH];
523     WCHAR szUser[NTMS_USERNAME_LENGTH];
524     WCHAR szComputer[NTMS_COMPUTERNAME_LENGTH];
525     DWORD dwErrorCode;
526     NTMS_GUID WorkItemId;
527     DWORD dwPriority;
528   } NTMS_LIBREQUESTINFORMATIONW;
529 
530   enum NtmsOpreqCommand {
531     NTMS_OPREQ_UNKNOWN = 0,NTMS_OPREQ_NEWMEDIA,NTMS_OPREQ_CLEANER,NTMS_OPREQ_DEVICESERVICE,NTMS_OPREQ_MOVEMEDIA,
532     NTMS_OPREQ_MESSAGE
533   };
534 
535   enum NtmsOpreqState {
536     NTMS_OPSTATE_UNKNOWN = 0,
537     NTMS_OPSTATE_SUBMITTED,NTMS_OPSTATE_ACTIVE,NTMS_OPSTATE_INPROGRESS,NTMS_OPSTATE_REFUSED,
538     NTMS_OPSTATE_COMPLETE
539   };
540 
541 #define _NTMS_OPREQUESTINFORMATION __MINGW_NAME_AW(_NTMS_OPREQUESTINFORMATION)
542 #define NTMS_OPREQUESTINFORMATION __MINGW_NAME_AW(NTMS_OPREQUESTINFORMATION)
543 
544   typedef struct _NTMS_OPREQUESTINFORMATIONA {
545     DWORD Request;
546     SYSTEMTIME Submitted;
547     DWORD State;
548     CHAR szMessage[NTMS_MESSAGE_LENGTH];
549     DWORD Arg1Type;
550     NTMS_GUID Arg1;
551     DWORD Arg2Type;
552     NTMS_GUID Arg2;
553     CHAR szApplication[NTMS_APPLICATIONNAME_LENGTH];
554     CHAR szUser[NTMS_USERNAME_LENGTH];
555     CHAR szComputer[NTMS_COMPUTERNAME_LENGTH];
556   } NTMS_OPREQUESTINFORMATIONA;
557 
558   typedef struct _NTMS_OPREQUESTINFORMATIONW {
559     DWORD Request;
560     SYSTEMTIME Submitted;
561     DWORD State;
562     WCHAR szMessage[NTMS_MESSAGE_LENGTH];
563     DWORD Arg1Type;
564     NTMS_GUID Arg1;
565     DWORD Arg2Type;
566     NTMS_GUID Arg2;
567     WCHAR szApplication[NTMS_APPLICATIONNAME_LENGTH];
568     WCHAR szUser[NTMS_USERNAME_LENGTH];
569     WCHAR szComputer[NTMS_COMPUTERNAME_LENGTH];
570   } NTMS_OPREQUESTINFORMATIONW;
571 
572   typedef struct _NTMS_COMPUTERINFORMATION {
573     DWORD dwLibRequestPurgeTime;
574     DWORD dwOpRequestPurgeTime;
575     DWORD dwLibRequestFlags;
576     DWORD dwOpRequestFlags;
577     DWORD dwMediaPoolPolicy;
578   } NTMS_COMPUTERINFORMATION;
579 
580   enum NtmsLibRequestFlags {
581     NTMS_LIBREQFLAGS_NOAUTOPURGE = 0x01,NTMS_LIBREQFLAGS_NOFAILEDPURGE = 0x02
582   };
583 
584   enum NtmsOpRequestFlags {
585     NTMS_OPREQFLAGS_NOAUTOPURGE = 0x01,NTMS_OPREQFLAGS_NOFAILEDPURGE = 0x02,NTMS_OPREQFLAGS_NOALERTS = 0x10,NTMS_OPREQFLAGS_NOTRAYICON = 0x20
586   };
587 
588   enum NtmsMediaPoolPolicy {
589     NTMS_POOLPOLICY_PURGEOFFLINESCRATCH = 0x01,NTMS_POOLPOLICY_KEEPOFFLINEIMPORT = 0x02
590   };
591 
592 #define _NTMS_OBJECTINFORMATION __MINGW_NAME_AW(_NTMS_OBJECTINFORMATION)
593 #define NTMS_OBJECTINFORMATION __MINGW_NAME_AW(NTMS_OBJECTINFORMATION)
594 #define LPNTMS_OBJECTINFORMATION __MINGW_NAME_AW(LPNTMS_OBJECTINFORMATION)
595 
596   enum NtmsOperationalState {
597     NTMS_READY = 0,
598     NTMS_INITIALIZING = 10,
599     NTMS_NEEDS_SERVICE = 20,
600     NTMS_NOT_PRESENT = 21
601   };
602 
603   typedef struct _RSM_MESSAGE {
604       LPGUID lpguidOperation;
605       DWORD dwNtmsType;
606       DWORD dwState;
607       DWORD dwFlags;
608       DWORD dwPriority;
609       DWORD dwErrorCode;
610       LPWSTR lpszComputerName;
611       LPWSTR lpszApplication;
612       LPWSTR lpszUser;
613       LPWSTR lpszTimeSubmitted;
614       LPWSTR lpszMessage;
615   } RSM_MESSAGE, *LPRSM_MESSAGE;
616 
617   typedef struct _NTMS_OBJECTINFORMATIONA {
618     DWORD dwSize;
619     DWORD dwType;
620     SYSTEMTIME Created;
621     SYSTEMTIME Modified;
622     NTMS_GUID ObjectGuid;
623     WINBOOL Enabled;
624     DWORD dwOperationalState;
625     CHAR szName[NTMS_OBJECTNAME_LENGTH];
626     CHAR szDescription[NTMS_DESCRIPTION_LENGTH];
627     union {
628       NTMS_DRIVEINFORMATIONA Drive;
629       NTMS_DRIVETYPEINFORMATIONA DriveType;
630       NTMS_LIBRARYINFORMATION Library;
631       NTMS_CHANGERINFORMATIONA Changer;
632       NTMS_CHANGERTYPEINFORMATIONA ChangerType;
633       NTMS_STORAGESLOTINFORMATION StorageSlot;
634       NTMS_IEDOORINFORMATION IEDoor;
635       NTMS_IEPORTINFORMATION IEPort;
636       NTMS_PMIDINFORMATIONA PhysicalMedia;
637       NTMS_LMIDINFORMATION LogicalMedia;
638       NTMS_PARTITIONINFORMATIONA Partition;
639       NTMS_MEDIAPOOLINFORMATION MediaPool;
640       NTMS_MEDIATYPEINFORMATION MediaType;
641       NTMS_LIBREQUESTINFORMATIONA LibRequest;
642       NTMS_OPREQUESTINFORMATIONA OpRequest;
643       NTMS_COMPUTERINFORMATION Computer;
644     } Info;
645   } NTMS_OBJECTINFORMATIONA,*LPNTMS_OBJECTINFORMATIONA;
646 
647   typedef struct _NTMS_OBJECTINFORMATIONW {
648     DWORD dwSize;
649     DWORD dwType;
650     SYSTEMTIME Created;
651     SYSTEMTIME Modified;
652     NTMS_GUID ObjectGuid;
653     WINBOOL Enabled;
654     DWORD dwOperationalState;
655     WCHAR szName[NTMS_OBJECTNAME_LENGTH];
656     WCHAR szDescription[NTMS_DESCRIPTION_LENGTH];
657     union {
658       NTMS_DRIVEINFORMATIONW Drive;
659       NTMS_DRIVETYPEINFORMATIONW DriveType;
660       NTMS_LIBRARYINFORMATION Library;
661       NTMS_CHANGERINFORMATIONW Changer;
662       NTMS_CHANGERTYPEINFORMATIONW ChangerType;
663       NTMS_STORAGESLOTINFORMATION StorageSlot;
664       NTMS_IEDOORINFORMATION IEDoor;
665       NTMS_IEPORTINFORMATION IEPort;
666       NTMS_PMIDINFORMATIONW PhysicalMedia;
667       NTMS_LMIDINFORMATION LogicalMedia;
668       NTMS_PARTITIONINFORMATIONW Partition;
669       NTMS_MEDIAPOOLINFORMATION MediaPool;
670       NTMS_MEDIATYPEINFORMATION MediaType;
671       NTMS_LIBREQUESTINFORMATIONW LibRequest;
672       NTMS_OPREQUESTINFORMATIONW OpRequest;
673       NTMS_COMPUTERINFORMATION Computer;
674     } Info;
675   } NTMS_OBJECTINFORMATIONW,*LPNTMS_OBJECTINFORMATIONW;
676 
677 #define NTMS_I1_LIBREQUESTINFORMATION __MINGW_NAME_AW(NTMS_I1_LIBREQUESTINFORMATION)
678 #define NTMS_I1_PARTITIONINFORMATION __MINGW_NAME_AW(NTMS_I1_PARTITIONINFORMATION)
679 #define NTMS_I1_PMIDINFORMATION __MINGW_NAME_AW(NTMS_I1_PMIDINFORMATION)
680 #define NTMS_I1_OPREQUESTINFORMATION __MINGW_NAME_AW(NTMS_I1_OPREQUESTINFORMATION)
681 #define NTMS_I1_OBJECTINFORMATION __MINGW_NAME_AW(NTMS_I1_OBJECTINFORMATION)
682 
683   typedef struct _NTMS_I1_LIBRARYINFORMATION {
684     DWORD LibraryType;
685     NTMS_GUID CleanerSlot;
686     NTMS_GUID CleanerSlotDefault;
687     WINBOOL LibrarySupportsDriveCleaning;
688     WINBOOL BarCodeReaderInstalled;
689     DWORD InventoryMethod;
690     DWORD dwCleanerUsesRemaining;
691     DWORD FirstDriveNumber;
692     DWORD dwNumberOfDrives;
693     DWORD FirstSlotNumber;
694     DWORD dwNumberOfSlots;
695     DWORD FirstDoorNumber;
696     DWORD dwNumberOfDoors;
697     DWORD FirstPortNumber;
698     DWORD dwNumberOfPorts;
699     DWORD FirstChangerNumber;
700     DWORD dwNumberOfChangers;
701     DWORD dwNumberOfMedia;
702     DWORD dwNumberOfMediaTypes;
703     DWORD dwNumberOfLibRequests;
704     GUID Reserved;
705   } NTMS_I1_LIBRARYINFORMATION;
706 
707   typedef struct _NTMS_I1_LIBREQUESTINFORMATIONA {
708     DWORD OperationCode;
709     DWORD OperationOption;
710     DWORD State;
711     NTMS_GUID PartitionId;
712     NTMS_GUID DriveId;
713     NTMS_GUID PhysMediaId;
714     NTMS_GUID Library;
715     NTMS_GUID SlotId;
716     SYSTEMTIME TimeQueued;
717     SYSTEMTIME TimeCompleted;
718     CHAR szApplication[NTMS_APPLICATIONNAME_LENGTH];
719     CHAR szUser[NTMS_USERNAME_LENGTH];
720     CHAR szComputer[NTMS_COMPUTERNAME_LENGTH];
721   } NTMS_I1_LIBREQUESTINFORMATIONA;
722 
723   typedef struct _NTMS_I1_LIBREQUESTINFORMATIONW {
724     DWORD OperationCode;
725     DWORD OperationOption;
726     DWORD State;
727     NTMS_GUID PartitionId;
728     NTMS_GUID DriveId;
729     NTMS_GUID PhysMediaId;
730     NTMS_GUID Library;
731     NTMS_GUID SlotId;
732     SYSTEMTIME TimeQueued;
733     SYSTEMTIME TimeCompleted;
734     WCHAR szApplication[NTMS_APPLICATIONNAME_LENGTH];
735     WCHAR szUser[NTMS_USERNAME_LENGTH];
736     WCHAR szComputer[NTMS_COMPUTERNAME_LENGTH];
737   } NTMS_I1_LIBREQUESTINFORMATIONW;
738 
739   typedef struct _NTMS_I1_PMIDINFORMATIONA {
740     NTMS_GUID CurrentLibrary;
741     NTMS_GUID MediaPool;
742     NTMS_GUID Location;
743     DWORD LocationType;
744     NTMS_GUID MediaType;
745     NTMS_GUID HomeSlot;
746     CHAR szBarCode[NTMS_BARCODE_LENGTH];
747     DWORD BarCodeState;
748     CHAR szSequenceNumber[NTMS_SEQUENCE_LENGTH];
749     DWORD MediaState;
750     DWORD dwNumberOfPartitions;
751   } NTMS_I1_PMIDINFORMATIONA;
752 
753   typedef struct _NTMS_I1_PMIDINFORMATIONW {
754     NTMS_GUID CurrentLibrary;
755     NTMS_GUID MediaPool;
756     NTMS_GUID Location;
757     DWORD LocationType;
758     NTMS_GUID MediaType;
759     NTMS_GUID HomeSlot;
760     WCHAR szBarCode[NTMS_BARCODE_LENGTH];
761     DWORD BarCodeState;
762     WCHAR szSequenceNumber[NTMS_SEQUENCE_LENGTH];
763     DWORD MediaState;
764     DWORD dwNumberOfPartitions;
765   } NTMS_I1_PMIDINFORMATIONW;
766 
767   typedef struct _NTMS_I1_PARTITIONINFORMATIONA {
768     NTMS_GUID PhysicalMedia;
769     NTMS_GUID LogicalMedia;
770     DWORD State;
771     WORD Side;
772     DWORD dwOmidLabelIdLength;
773     BYTE OmidLabelId[255];
774     CHAR szOmidLabelType[64];
775     CHAR szOmidLabelInfo[256];
776     DWORD dwMountCount;
777     DWORD dwAllocateCount;
778   } NTMS_I1_PARTITIONINFORMATIONA;
779 
780   typedef struct _NTMS_I1_PARTITIONINFORMATIONW {
781     NTMS_GUID PhysicalMedia;
782     NTMS_GUID LogicalMedia;
783     DWORD State;
784     WORD Side;
785     DWORD dwOmidLabelIdLength;
786     BYTE OmidLabelId[255];
787     WCHAR szOmidLabelType[64];
788     WCHAR szOmidLabelInfo[256];
789     DWORD dwMountCount;
790     DWORD dwAllocateCount;
791   } NTMS_I1_PARTITIONINFORMATIONW;
792 
793   typedef struct _NTMS_I1_OPREQUESTINFORMATIONA {
794     DWORD Request;
795     SYSTEMTIME Submitted;
796     DWORD State;
797     CHAR szMessage[NTMS_I1_MESSAGE_LENGTH];
798     DWORD Arg1Type;
799     NTMS_GUID Arg1;
800     DWORD Arg2Type;
801     NTMS_GUID Arg2;
802     CHAR szApplication[NTMS_APPLICATIONNAME_LENGTH];
803     CHAR szUser[NTMS_USERNAME_LENGTH];
804     CHAR szComputer[NTMS_COMPUTERNAME_LENGTH];
805   } NTMS_I1_OPREQUESTINFORMATIONA;
806 
807   typedef struct _NTMS_I1_OPREQUESTINFORMATIONW {
808     DWORD Request;
809     SYSTEMTIME Submitted;
810     DWORD State;
811     WCHAR szMessage[NTMS_I1_MESSAGE_LENGTH];
812     DWORD Arg1Type;
813     NTMS_GUID Arg1;
814     DWORD Arg2Type;
815     NTMS_GUID Arg2;
816     WCHAR szApplication[NTMS_APPLICATIONNAME_LENGTH];
817     WCHAR szUser[NTMS_USERNAME_LENGTH];
818     WCHAR szComputer[NTMS_COMPUTERNAME_LENGTH];
819   } NTMS_I1_OPREQUESTINFORMATIONW;
820 
821   typedef struct _NTMS_I1_OBJECTINFORMATIONA {
822     DWORD dwSize;
823     DWORD dwType;
824     SYSTEMTIME Created;
825     SYSTEMTIME Modified;
826     NTMS_GUID ObjectGuid;
827     WINBOOL Enabled;
828     DWORD dwOperationalState;
829     CHAR szName[NTMS_OBJECTNAME_LENGTH];
830     CHAR szDescription[NTMS_DESCRIPTION_LENGTH];
831     union {
832       NTMS_DRIVEINFORMATIONA Drive;
833       NTMS_DRIVETYPEINFORMATIONA DriveType;
834       NTMS_I1_LIBRARYINFORMATION Library;
835       NTMS_CHANGERINFORMATIONA Changer;
836       NTMS_CHANGERTYPEINFORMATIONA ChangerType;
837       NTMS_STORAGESLOTINFORMATION StorageSlot;
838       NTMS_IEDOORINFORMATION IEDoor;
839       NTMS_IEPORTINFORMATION IEPort;
840       NTMS_I1_PMIDINFORMATIONA PhysicalMedia;
841       NTMS_LMIDINFORMATION LogicalMedia;
842       NTMS_I1_PARTITIONINFORMATIONA Partition;
843       NTMS_MEDIAPOOLINFORMATION MediaPool;
844       NTMS_MEDIATYPEINFORMATION MediaType;
845       NTMS_I1_LIBREQUESTINFORMATIONA LibRequest;
846       NTMS_I1_OPREQUESTINFORMATIONA OpRequest;
847     } Info;
848   } NTMS_I1_OBJECTINFORMATIONA,*LPNTMS_I1_OBJECTINFORMATIONA;
849 
850   typedef struct _NTMS_I1_OBJECTINFORMATIONW {
851     DWORD dwSize;
852     DWORD dwType;
853     SYSTEMTIME Created;
854     SYSTEMTIME Modified;
855     NTMS_GUID ObjectGuid;
856     WINBOOL Enabled;
857     DWORD dwOperationalState;
858     WCHAR szName[NTMS_OBJECTNAME_LENGTH];
859     WCHAR szDescription[NTMS_DESCRIPTION_LENGTH];
860     union {
861       NTMS_DRIVEINFORMATIONW Drive;
862       NTMS_DRIVETYPEINFORMATIONW DriveType;
863       NTMS_I1_LIBRARYINFORMATION Library;
864       NTMS_CHANGERINFORMATIONW Changer;
865       NTMS_CHANGERTYPEINFORMATIONW ChangerType;
866       NTMS_STORAGESLOTINFORMATION StorageSlot;
867       NTMS_IEDOORINFORMATION IEDoor;
868       NTMS_IEPORTINFORMATION IEPort;
869       NTMS_I1_PMIDINFORMATIONW PhysicalMedia;
870       NTMS_LMIDINFORMATION LogicalMedia;
871       NTMS_I1_PARTITIONINFORMATIONW Partition;
872       NTMS_MEDIAPOOLINFORMATION MediaPool;
873       NTMS_MEDIATYPEINFORMATION MediaType;
874       NTMS_I1_LIBREQUESTINFORMATIONW LibRequest;
875       NTMS_I1_OPREQUESTINFORMATIONW OpRequest;
876     } Info;
877   } NTMS_I1_OBJECTINFORMATIONW,*LPNTMS_I1_OBJECTINFORMATIONW;
878 #endif
879 
880 #ifndef NTMS_NOREDEF
881 
882   enum NtmsCreateNtmsMediaOptions {
883     NTMS_ERROR_ON_DUPLICATE = 0x0001
884   };
885 #endif
886 
887 #ifdef PRE_SEVIL
888   DWORD WINAPI GetNtmsObjectInformation(HANDLE hSession,LPNTMS_GUID lpObjectId,LPNTMS_OBJECTINFORMATION lpInfo);
889   DWORD WINAPI SetNtmsObjectInformation(HANDLE hSession,LPNTMS_GUID lpObjectId,LPNTMS_OBJECTINFORMATION lpInfo);
890 #endif
891   DWORD WINAPI GetNtmsObjectInformationA(HANDLE hSession,LPNTMS_GUID lpObjectId,LPNTMS_OBJECTINFORMATIONA lpInfo);
892   DWORD WINAPI GetNtmsObjectInformationW(HANDLE hSession,LPNTMS_GUID lpObjectId,LPNTMS_OBJECTINFORMATIONW lpInfo);
893   DWORD WINAPI SetNtmsObjectInformationA(HANDLE hSession,LPNTMS_GUID lpObjectId,LPNTMS_OBJECTINFORMATIONA lpInfo);
894   DWORD WINAPI SetNtmsObjectInformationW(HANDLE hSession,LPNTMS_GUID lpObjectId,LPNTMS_OBJECTINFORMATIONW lpInfo);
895   DWORD WINAPI CreateNtmsMediaA(HANDLE hSession,LPNTMS_OBJECTINFORMATIONA lpMedia,LPNTMS_OBJECTINFORMATIONA lpList,DWORD dwOptions);
896   DWORD WINAPI CreateNtmsMediaW(HANDLE hSession,LPNTMS_OBJECTINFORMATIONW lpMedia,LPNTMS_OBJECTINFORMATIONW lpList,DWORD dwOptions);
897   enum NtmsEnumerateOption {
898     NTMS_ENUM_DEFAULT = 0,NTMS_ENUM_ROOTPOOL = 1
899   };
900   DWORD WINAPI EnumerateNtmsObject(HANDLE hSession,const LPNTMS_GUID lpContainerId,LPNTMS_GUID lpList,LPDWORD lpdwListSize,DWORD dwType,DWORD dwOptions);
901   DWORD WINAPI DisableNtmsObject(HANDLE hSession,DWORD dwType,LPNTMS_GUID lpObjectId);
902   DWORD WINAPI EnableNtmsObject(HANDLE hSession,DWORD dwType,LPNTMS_GUID lpObjectId);
903   enum NtmsEjectOperation {
904     NTMS_EJECT_START = 0,NTMS_EJECT_STOP = 1,NTMS_EJECT_QUEUE = 2,NTMS_EJECT_FORCE = 3,NTMS_EJECT_IMMEDIATE = 4,NTMS_EJECT_ASK_USER = 5
905   };
906   DWORD WINAPI EjectNtmsMedia(HANDLE hSession,LPNTMS_GUID lpMediaId,LPNTMS_GUID lpEjectOperation,DWORD dwAction);
907   enum NtmsInjectOperation {
908     NTMS_INJECT_START = 0,NTMS_INJECT_STOP = 1,NTMS_INJECT_RETRACT = 2,NTMS_INJECT_STARTMANY = 3
909   };
910   DWORD WINAPI InjectNtmsMedia(HANDLE hSession,LPNTMS_GUID lpLibraryId,LPNTMS_GUID lpInjectOperation,DWORD dwAction);
911   DWORD WINAPI AccessNtmsLibraryDoor(HANDLE hSession,LPNTMS_GUID lpLibraryId,DWORD dwAction);
912   DWORD WINAPI CleanNtmsDrive(HANDLE hSession,LPNTMS_GUID lpDriveId);
913   DWORD WINAPI DismountNtmsDrive(HANDLE hSession,LPNTMS_GUID lpDriveId);
914   DWORD WINAPI InventoryNtmsLibrary(HANDLE hSession,LPNTMS_GUID lpLibraryId,DWORD dwAction);
915   DWORD WINAPI IdentifyNtmsSlot(HANDLE hSession,LPNTMS_GUID lpSlotId,DWORD dwOption);
916 
917 #define NTMS_OMID_TYPE_RAW_LABEL 0x01
918 #define NTMS_OMID_TYPE_FILESYSTEM_INFO 0x02
919 
920   typedef struct {
921     WCHAR FileSystemType[64];
922     WCHAR VolumeName[256];
923     DWORD SerialNumber;
924   } NTMS_FILESYSTEM_INFO;
925 
926   DWORD WINAPI UpdateNtmsOmidInfo(HANDLE hSession,LPNTMS_GUID lpMediaId,DWORD labelType,DWORD numberOfBytes,LPVOID lpBuffer);
927   DWORD WINAPI CancelNtmsLibraryRequest(HANDLE hSession,LPNTMS_GUID lpRequestId);
928   DWORD WINAPI GetNtmsRequestOrder(HANDLE hSession,LPNTMS_GUID lpRequestId,LPDWORD lpdwOrderNumber);
929   DWORD WINAPI SetNtmsRequestOrder(HANDLE hSession,LPNTMS_GUID lpRequestId,DWORD dwOrderNumber);
930   DWORD WINAPI DeleteNtmsRequests(HANDLE hSession,LPNTMS_GUID lpRequestId,DWORD dwType,DWORD dwCount);
931   DWORD WINAPI ReserveNtmsCleanerSlot (HANDLE hSession,LPNTMS_GUID lpLibrary,LPNTMS_GUID lpSlot);
932   DWORD WINAPI ReleaseNtmsCleanerSlot (HANDLE hSession,LPNTMS_GUID lpLibrary);
933   DWORD WINAPI InjectNtmsCleaner (HANDLE hSession,LPNTMS_GUID lpLibrary,LPNTMS_GUID lpInjectOperation,DWORD dwNumberOfCleansLeft,DWORD dwAction);
934   DWORD WINAPI EjectNtmsCleaner (HANDLE hSession,LPNTMS_GUID lpLibrary,LPNTMS_GUID lpEjectOperation,DWORD dwAction);
935   DWORD WINAPI BeginNtmsDeviceChangeDetection(HANDLE hSession,LPHANDLE lpDetectHandle);
936   DWORD WINAPI SetNtmsDeviceChangeDetection(HANDLE hSession,HANDLE DetectHandle,LPNTMS_GUID lpRequestId,DWORD dwType,DWORD dwCount);
937   DWORD WINAPI EndNtmsDeviceChangeDetection(HANDLE hSession,HANDLE DetectHandle);
938 
939 #ifndef NTMS_NOREDEF
940   enum NtmsDriveType {
941     NTMS_UNKNOWN_DRIVE = 0
942   };
943 #endif
944 
945   DWORD WINAPI GetNtmsObjectSecurity(HANDLE hSession,LPNTMS_GUID lpObjectId,DWORD dwType,SECURITY_INFORMATION RequestedInformation,PSECURITY_DESCRIPTOR lpSecurityDescriptor,DWORD nLength,LPDWORD lpnLengthNeeded);
946   DWORD WINAPI SetNtmsObjectSecurity(HANDLE hSession,LPNTMS_GUID lpObjectId,DWORD dwType,SECURITY_INFORMATION SecurityInformation,PSECURITY_DESCRIPTOR lpSecurityDescriptor);
947   enum NtmsAccessMask {
948     NTMS_USE_ACCESS = 0x1,
949     NTMS_MODIFY_ACCESS = 0x2,
950     NTMS_CONTROL_ACCESS = 0x4 /* Hmm, could be 3, too. */
951   };
952 
953 #define NTMS_GENERIC_READ NTMS_USE_ACCESS
954 #define NTMS_GENERIC_WRITE NTMS_USE_ACCESS | NTMS_MODIFY_ACCESS
955 #define NTMS_GENERIC_EXECUTE NTMS_USE_ACCESS | NTMS_MODIFY_ACCESS | NTMS_CONTROL_ACCESS
956 #define NTMS_GENERIC_ALL NTMS_USE_ACCESS | NTMS_MODIFY_ACCESS | NTMS_CONTROL_ACCESS
957 
958 #define NTMS_MAXATTR_LENGTH 0x10000
959 #define NTMS_MAXATTR_NAMELEN 32
960 
961   DWORD WINAPI GetNtmsObjectAttributeA(HANDLE hSession,LPNTMS_GUID lpObjectId,DWORD dwType,LPCSTR lpAttributeName,LPVOID lpAttributeData,LPDWORD lpAttributeSize);
962   DWORD WINAPI GetNtmsObjectAttributeW(HANDLE hSession,LPNTMS_GUID lpObjectId,DWORD dwType,LPCWSTR lpAttributeName,LPVOID lpAttributeData,LPDWORD lpAttributeSize);
963   DWORD WINAPI SetNtmsObjectAttributeA(HANDLE hSession,LPNTMS_GUID lpObjectId,DWORD dwType,LPCSTR lpAttributeName,LPVOID lpAttributeData,DWORD dwAttributeSize);
964   DWORD WINAPI SetNtmsObjectAttributeW(HANDLE hSession,LPNTMS_GUID lpObjectId,DWORD dwType,LPCWSTR lpAttributeName,LPVOID lpAttributeData,DWORD AttributeSize);
965 
966   enum NtmsUITypes {
967     NTMS_UITYPE_INVALID = 0,
968     NTMS_UITYPE_INFO,NTMS_UITYPE_REQ,NTMS_UITYPE_ERR,NTMS_UITYPE_MAX
969   };
970 
971   enum NtmsUIOperations {
972     NTMS_UIDEST_ADD = 1,
973     NTMS_UIDEST_DELETE,NTMS_UIDEST_DELETEALL,
974     NTMS_UIOPERATION_MAX
975   };
976 
977   DWORD WINAPI GetNtmsUIOptionsA(HANDLE hSession,const LPNTMS_GUID lpObjectId,DWORD dwType,LPSTR lpszDestination,LPDWORD lpdwBufSize);
978   DWORD WINAPI GetNtmsUIOptionsW(HANDLE hSession,const LPNTMS_GUID lpObjectId,DWORD dwType,LPWSTR lpszDestination,LPDWORD lpdwBufSize);
979   DWORD WINAPI SetNtmsUIOptionsA(HANDLE hSession,const LPNTMS_GUID lpObjectId,DWORD dwType,DWORD dwOperation,LPCSTR lpszDestination);
980   DWORD WINAPI SetNtmsUIOptionsW(HANDLE hSession,const LPNTMS_GUID lpObjectId,DWORD dwType,DWORD dwOperation,LPCWSTR lpszDestination);
981   DWORD WINAPI SubmitNtmsOperatorRequestW(HANDLE hSession,DWORD dwRequest,LPCWSTR lpMessage,LPNTMS_GUID lpArg1Id,LPNTMS_GUID lpArg2Id,LPNTMS_GUID lpRequestId);
982   DWORD WINAPI SubmitNtmsOperatorRequestA(HANDLE hSession,DWORD dwRequest,LPCSTR lpMessage,LPNTMS_GUID lpArg1Id,LPNTMS_GUID lpArg2Id,LPNTMS_GUID lpRequestId);
983   DWORD WINAPI WaitForNtmsOperatorRequest(HANDLE hSession,LPNTMS_GUID lpRequestId,DWORD dwTimeout);
984   DWORD WINAPI CancelNtmsOperatorRequest(HANDLE hSession,LPNTMS_GUID lpRequestId);
985   DWORD WINAPI SatisfyNtmsOperatorRequest(HANDLE hSession,LPNTMS_GUID lpRequestId);
986 
987 #ifndef NTMS_NOREDEF
988   enum NtmsNotificationOperations {
989     NTMS_OBJ_UPDATE = 1,
990     NTMS_OBJ_INSERT,NTMS_OBJ_DELETE,NTMS_EVENT_SIGNAL,NTMS_EVENT_COMPLETE
991   };
992 
993   typedef struct _NTMS_NOTIFICATIONINFORMATION {
994     DWORD dwOperation;
995     NTMS_GUID ObjectId;
996   } NTMS_NOTIFICATIONINFORMATION,*LPNTMS_NOTIFICATIONINFORMATION;
997 #endif
998 
999   DWORD WINAPI ImportNtmsDatabase(HANDLE hSession);
1000   DWORD WINAPI ExportNtmsDatabase(HANDLE hSession);
1001   DWORD WINAPI ImportNtmsDatabase(HANDLE hSession);
1002   DWORD WINAPI ExportNtmsDatabase(HANDLE hSession);
1003   HANDLE WINAPI OpenNtmsNotification(HANDLE hSession,DWORD dwType);
1004   DWORD WINAPI WaitForNtmsNotification(HANDLE hNotification,LPNTMS_NOTIFICATIONINFORMATION lpNotificationInformation,DWORD dwTimeout);
1005   DWORD WINAPI CloseNtmsNotification(HANDLE hNotification);
1006   DWORD WINAPI EjectDiskFromSADriveW(LPCWSTR lpComputerName,LPCWSTR lpAppName,LPCWSTR lpDeviceName,HWND hWnd,LPCWSTR lpTitle,LPCWSTR lpMessage,DWORD dwOptions);
1007   DWORD WINAPI EjectDiskFromSADriveA(LPCSTR lpComputerName,LPCSTR lpAppName,LPCSTR lpDeviceName,HWND hWnd,LPCSTR lpTitle,LPCSTR lpMessage,DWORD dwOptions);
1008   DWORD WINAPI GetVolumesFromDriveW(LPWSTR pszDriveName,LPWSTR *VolumeNameBufferPtr,LPWSTR *DriveLetterBufferPtr);
1009   DWORD WINAPI GetVolumesFromDriveA(LPSTR pszDriveName,LPSTR *VolumeNameBufferPtr,LPSTR *DriveLetterBufferPtr);
1010 
1011 #ifdef __cplusplus
1012 }
1013 #endif
1014 
1015 #pragma pack()
1016 #endif
1017