OSDN Git Service

Correct project name references in w32api source files.
[mingw/mingw-org-wsl.git] / w32api / include / ddk / ntdddisk.h
index daf75c0..5cf72d1 100644 (file)
 /*
- * ntdddisk.h
+ * ddk/ntdddisk.h
  *
- * Disk IOCTL interface.
+ * Driver Development Kit -- Disk IOCTL interface.
  *
- * This file is part of the w32api package.
+ * Written by Casper S. Hornstrup  <chorns@users.sourceforge.net>
+ * Copyright (C) 2002-2004, 2015, 2016, 2022, MinGW.OSDN Project
  *
- * Contributors:
- *   Created by Casper S. Hornstrup <chorns@users.sourceforge.net>
  *
- * THIS SOFTWARE IS NOT COPYRIGHTED
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
  *
- * This source code is offered for use in the public domain. You may
- * use, modify or distribute it freely.
+ * The above copyright notice, this permission notice, and the following
+ * disclaimer shall be included in all copies or substantial portions of
+ * the Software.
  *
- * This code is distributed in the hope that it will be useful but
- * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
- * DISCLAIMED. This includes but is not limited to warranties of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OF OR OTHER
+ * DEALINGS IN THE SOFTWARE.
  *
  */
-
-#ifndef __NTDDDISK_H
-#define __NTDDDISK_H
-
-#if __GNUC__ >=3
+#ifndef _DDK_NTDDDISK_H
 #pragma GCC system_header
-#endif
 
-#ifdef __cplusplus
-extern "C" {
-#endif
+/* This file supports partial inclusion by <winioctl.h>; defer definition
+ * of its normal repeat inclusion guard macro...
+ */
+#ifndef __WINIOCTL_H_SOURCED__
+/* ...until we've ascertained that this is NOT such partial inclusion.
+ */
+#define _DDK_NTDDDISK_H
 
+/* In case of full inclusion, we must also include the full content of:
+ */
 #include "ntddk.h"
-#include "ntddstor.h"
-
-#define DD_DISK_DEVICE_NAME               "\\Device\\UNKNOWN"
-#define DD_DISK_DEVICE_NAME_U             L"\\Device\\UNKNOWN"
-
-#define IOCTL_DISK_BASE                   FILE_DEVICE_DISK
-
-#define IOCTL_DISK_CHECK_VERIFY \
-  CTL_CODE(IOCTL_DISK_BASE, 0x0200, METHOD_BUFFERED, FILE_READ_ACCESS)
-
-#define IOCTL_DISK_CONTROLLER_NUMBER \
-  CTL_CODE(IOCTL_DISK_BASE, 0x0011, METHOD_BUFFERED, FILE_ANY_ACCESS)
-
-#define IOCTL_DISK_CREATE_DISK \
-  CTL_CODE(IOCTL_DISK_BASE, 0x0016, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
-
-#define IOCTL_DISK_DELETE_DRIVE_LAYOUT \
-  CTL_CODE(IOCTL_DISK_BASE, 0x0040, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
-
-#define IOCTL_DISK_FIND_NEW_DEVICES \
-  CTL_CODE(IOCTL_DISK_BASE, 0x0206, METHOD_BUFFERED, FILE_READ_ACCESS)
-
-#define IOCTL_DISK_FORMAT_TRACKS \
-  CTL_CODE(IOCTL_DISK_BASE, 0x0006, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
-
-#define IOCTL_DISK_FORMAT_TRACKS_EX \
-  CTL_CODE(IOCTL_DISK_BASE, 0x000b, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
-
-#define IOCTL_DISK_GET_CACHE_INFORMATION \
-  CTL_CODE(IOCTL_DISK_BASE, 0x0035, METHOD_BUFFERED, FILE_READ_ACCESS)
-
-#define IOCTL_DISK_GET_DRIVE_GEOMETRY \
-  CTL_CODE(IOCTL_DISK_BASE, 0x0000, METHOD_BUFFERED, FILE_ANY_ACCESS)
-
-#define IOCTL_DISK_GET_DRIVE_GEOMETRY_EX \
-  CTL_CODE(IOCTL_DISK_BASE, 0x0028, METHOD_BUFFERED, FILE_ANY_ACCESS)
-
-#define IOCTL_DISK_GET_DRIVE_LAYOUT \
-  CTL_CODE(IOCTL_DISK_BASE, 0x0003, METHOD_BUFFERED, FILE_READ_ACCESS)
-
-#define IOCTL_DISK_GET_DRIVE_LAYOUT_EX \
-  CTL_CODE(IOCTL_DISK_BASE, 0x0014, METHOD_BUFFERED, FILE_ANY_ACCESS)
-
-#define IOCTL_DISK_GET_MEDIA_TYPES \
-  CTL_CODE(IOCTL_DISK_BASE, 0x0300, METHOD_BUFFERED, FILE_ANY_ACCESS)
-
-#define IOCTL_DISK_GET_LENGTH_INFO \
-  CTL_CODE(IOCTL_DISK_BASE, 0x0017, METHOD_BUFFERED, FILE_READ_ACCESS)
-
-#define IOCTL_DISK_GET_PARTITION_INFO \
-  CTL_CODE(IOCTL_DISK_BASE, 0x0001, METHOD_BUFFERED, FILE_READ_ACCESS)
-
-#define IOCTL_DISK_GET_PARTITION_INFO_EX \
-  CTL_CODE(IOCTL_DISK_BASE, 0x0012, METHOD_BUFFERED, FILE_ANY_ACCESS)
-
-#define IOCTL_DISK_GROW_PARTITION \
-  CTL_CODE(IOCTL_DISK_BASE, 0x0034, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
-
-#define IOCTL_DISK_INTERNAL_CLEAR_VERIFY \
-  CTL_CODE(IOCTL_DISK_BASE, 0x0101, METHOD_NEITHER, FILE_ANY_ACCESS)
-
-#define IOCTL_DISK_INTERNAL_SET_VERIFY \
-  CTL_CODE(IOCTL_DISK_BASE, 0x0100, METHOD_NEITHER, FILE_ANY_ACCESS)
-
-#define IOCTL_DISK_IS_WRITABLE \
-  CTL_CODE(IOCTL_DISK_BASE, 0x0009, METHOD_BUFFERED, FILE_ANY_ACCESS)
-
-#define IOCTL_DISK_PERFORMANCE \
-  CTL_CODE(IOCTL_DISK_BASE, 0x0008, METHOD_BUFFERED, FILE_ANY_ACCESS)
-
-#define IOCTL_DISK_PERFORMANCE_OFF \
-  CTL_CODE(IOCTL_DISK_BASE, 0x0018, METHOD_BUFFERED, FILE_ANY_ACCESS)
-
-#define IOCTL_DISK_REASSIGN_BLOCKS \
-  CTL_CODE(IOCTL_DISK_BASE, 0x0007, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
-
-#define IOCTL_DISK_RESERVE \
-  CTL_CODE(IOCTL_DISK_BASE, 0x0204, METHOD_BUFFERED, FILE_READ_ACCESS)
-
-#define IOCTL_DISK_SET_CACHE_INFORMATION \
-  CTL_CODE(IOCTL_DISK_BASE, 0x0036, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
-
-#define IOCTL_DISK_SET_DRIVE_LAYOUT \
-  CTL_CODE(IOCTL_DISK_BASE, 0x0004, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
-
-#define IOCTL_DISK_SET_DRIVE_LAYOUT_EX \
-  CTL_CODE(IOCTL_DISK_BASE, 0x0015, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
-
-#define IOCTL_DISK_SET_PARTITION_INFO \
-  CTL_CODE(IOCTL_DISK_BASE, 0x0002, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
-
-#define IOCTL_DISK_SET_PARTITION_INFO_EX \
-  CTL_CODE(IOCTL_DISK_BASE, 0x0013, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
-
-#define IOCTL_DISK_UPDATE_DRIVE_SIZE \
-  CTL_CODE(IOCTL_DISK_BASE, 0x0032, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
-
-#define IOCTL_DISK_VERIFY \
-  CTL_CODE(IOCTL_DISK_BASE, 0x0005, METHOD_BUFFERED, FILE_ANY_ACCESS)
-
-#define SMART_GET_VERSION \
-  CTL_CODE(IOCTL_DISK_BASE, 0x0020, METHOD_BUFFERED, FILE_READ_ACCESS)
-
-#define SMART_RCV_DRIVE_DATA \
-  CTL_CODE(IOCTL_DISK_BASE, 0x0022, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
-
-#define SMART_SEND_DRIVE_COMMAND \
-  CTL_CODE(IOCTL_DISK_BASE, 0x0021, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
-
-
-#define PARTITION_ENTRY_UNUSED            0x00
-#define PARTITION_FAT_12                  0x01
-#define PARTITION_XENIX_1                 0x02
-#define PARTITION_XENIX_2                 0x03
-#define PARTITION_FAT_16                  0x04
-#define PARTITION_EXTENDED                0x05
-#define PARTITION_HUGE                    0x06
-#define PARTITION_IFS                     0x07
-#define PARTITION_OS2BOOTMGR              0x0A
-#define PARTITION_FAT32                   0x0B
-#define PARTITION_FAT32_XINT13            0x0C
-#define PARTITION_XINT13                  0x0E
-#define PARTITION_XINT13_EXTENDED         0x0F
-#define PARTITION_PREP                    0x41
-#define PARTITION_LDM                     0x42
-#define PARTITION_UNIX                    0x63
-#define VALID_NTFT                        0xC0
-#define PARTITION_NTFT                    0x80
-
-#define IsFTPartition( PartitionType ) \
-  (((PartitionType) & PARTITION_NTFT) && \
-  IsRecognizedPartition(PartitionType))
-
-#define IsContainerPartition(PartitionType) \
-  (((PartitionType) == PARTITION_EXTENDED) || \
-  ((PartitionType) == PARTITION_XINT13_EXTENDED))
-
-#define IsRecognizedPartition(PartitionType) ( \
-       (((PartitionType) & PARTITION_NTFT) && (((PartitionType) & ~0xC0) == PARTITION_FAT_12)) || \
-       (((PartitionType) & PARTITION_NTFT) && (((PartitionType) & ~0xC0) == PARTITION_HUGE)) || \
-       (((PartitionType) & PARTITION_NTFT) && (((PartitionType) & ~0xC0) == PARTITION_IFS)) || \
-       (((PartitionType) & PARTITION_NTFT) && (((PartitionType) & ~0xC0) == PARTITION_FAT32)) || \
-       (((PartitionType) & PARTITION_NTFT) && (((PartitionType) & ~0xC0) == PARTITION_FAT32_XINT13)) || \
-       (((PartitionType) & PARTITION_NTFT) && (((PartitionType) & ~0xC0) == PARTITION_XINT13)) || \
-       ((PartitionType) == PARTITION_FAT_12) || \
-       ((PartitionType) == PARTITION_FAT_16) || \
-       ((PartitionType) == PARTITION_HUGE) || \
-       ((PartitionType) == PARTITION_IFS) || \
-       ((PartitionType) == PARTITION_FAT32) || \
-       ((PartitionType) == PARTITION_FAT32_XINT13) || \
-       ((PartitionType) == PARTITION_XINT13))
-
-#define WMI_DISK_GEOMETRY_GUID \
-  {0x25007f51, 0x57c2, 0x11d1, {0xa5, 0x28, 0x0, 0xa0, 0xc9, 0x6, 0x29, 0x10}}
+#endif
 
-typedef USHORT BAD_TRACK_NUMBER;
-typedef USHORT *PBAD_TRACK_NUMBER;
+/* In either case, we always include <ddk/ntddstor.h>, either in full,
+ * or under the same criterion of selectivity as for this file itself.
+ */
+#include "ntddstor.h"
 
-typedef enum _MEDIA_TYPE {
-  Unknown,
-  F5_1Pt2_512,
-  F3_1Pt44_512,
-  F3_2Pt88_512,
-  F3_20Pt8_512,
-  F3_720_512,
-  F5_360_512,
-  F5_320_512,
-  F5_320_1024,
-  F5_180_512,
-  F5_160_512,
-  RemovableMedia,
-  FixedMedia,
-  F3_120M_512,
-  F3_640_512,
-  F5_640_512,
-  F5_720_512,
-  F3_1Pt2_512,
-  F3_1Pt23_1024,
-  F5_1Pt23_1024,
-  F3_128Mb_512,
-  F3_230Mb_512,
-  F8_256_128
+#if ! (defined _DDK_NTDDDISK_H && defined _WINIOCTL_H)
+/* The content of this section is common to both <ddk/ntdddisk.h> and
+ * <winioctl.h>.  If both repeat inclusion guards are already defined,
+ * then we've already seen it; there is no need to process it again.
+ */
+#define __IOCTL_DISK_(FN,M,A)                    CTL_CODE(IOCTL_DISK_BASE,(FN),(M),(A))
+
+#define IOCTL_DISK_BASE                          FILE_DEVICE_DISK
+#define IOCTL_DISK_GET_DRIVE_GEOMETRY          __FILE_AM_BUFFERED(__IOCTL_DISK_,0x0000)
+#define IOCTL_DISK_GET_PARTITION_INFO          __FILE_RD_BUFFERED(__IOCTL_DISK_,0x0001)
+#define IOCTL_DISK_SET_PARTITION_INFO          __FILE_RW_BUFFERED(__IOCTL_DISK_,0x0002)
+#define IOCTL_DISK_GET_DRIVE_LAYOUT            __FILE_RD_BUFFERED(__IOCTL_DISK_,0x0003)
+#define IOCTL_DISK_SET_DRIVE_LAYOUT            __FILE_RW_BUFFERED(__IOCTL_DISK_,0x0004)
+#define IOCTL_DISK_VERIFY                      __FILE_AM_BUFFERED(__IOCTL_DISK_,0x0005)
+#define IOCTL_DISK_FORMAT_TRACKS               __FILE_RW_BUFFERED(__IOCTL_DISK_,0x0006)
+#define IOCTL_DISK_REASSIGN_BLOCKS             __FILE_RW_BUFFERED(__IOCTL_DISK_,0x0007)
+#define IOCTL_DISK_PERFORMANCE                 __FILE_AM_BUFFERED(__IOCTL_DISK_,0x0008)
+#define IOCTL_DISK_IS_WRITABLE                 __FILE_AM_BUFFERED(__IOCTL_DISK_,0x0009)
+#define IOCTL_DISK_FORMAT_TRACKS_EX            __FILE_RW_BUFFERED(__IOCTL_DISK_,0x000B)
+#define IOCTL_DISK_GET_PARTITION_INFO_EX       __FILE_AM_BUFFERED(__IOCTL_DISK_,0x0012)
+#define IOCTL_DISK_SET_PARTITION_INFO_EX       __FILE_RW_BUFFERED(__IOCTL_DISK_,0x0013)
+#define IOCTL_DISK_GET_DRIVE_LAYOUT_EX         __FILE_AM_BUFFERED(__IOCTL_DISK_,0x0014)
+#define IOCTL_DISK_SET_DRIVE_LAYOUT_EX         __FILE_RW_BUFFERED(__IOCTL_DISK_,0x0015)
+#define IOCTL_DISK_CREATE_DISK                 __FILE_RW_BUFFERED(__IOCTL_DISK_,0x0016)
+#define IOCTL_DISK_GET_LENGTH_INFO             __FILE_RD_BUFFERED(__IOCTL_DISK_,0x0017)
+#define IOCTL_DISK_PERFORMANCE_OFF             __FILE_AM_BUFFERED(__IOCTL_DISK_,0x0018)
+#define IOCTL_DISK_GET_DRIVE_GEOMETRY_EX       __FILE_AM_BUFFERED(__IOCTL_DISK_,0x0028)
+#define IOCTL_DISK_UPDATE_DRIVE_SIZE           __FILE_RW_BUFFERED(__IOCTL_DISK_,0x0032)
+#define IOCTL_DISK_GROW_PARTITION              __FILE_RW_BUFFERED(__IOCTL_DISK_,0x0034)
+#define IOCTL_DISK_GET_CACHE_INFORMATION       __FILE_RD_BUFFERED(__IOCTL_DISK_,0x0035)
+#define IOCTL_DISK_SET_CACHE_INFORMATION       __FILE_RW_BUFFERED(__IOCTL_DISK_,0x0036)
+#define IOCTL_DISK_DELETE_DRIVE_LAYOUT         __FILE_RW_BUFFERED(__IOCTL_DISK_,0x0040)
+#define IOCTL_DISK_CHECK_VERIFY                __FILE_RD_BUFFERED(__IOCTL_DISK_,0x0200)
+#define IOCTL_DISK_RESERVE                     __FILE_RD_BUFFERED(__IOCTL_DISK_,0x0204)
+#define IOCTL_DISK_FIND_NEW_DEVICES            __FILE_RD_BUFFERED(__IOCTL_DISK_,0x0206)
+#define IOCTL_DISK_GET_MEDIA_TYPES             __FILE_AM_BUFFERED(__IOCTL_DISK_,0x0300)
+
+enum
+{ PARTITION_ENTRY_UNUSED       = 0x00,
+  PARTITION_FAT_12             = 0x01,
+  PARTITION_XENIX_1            = 0x02,
+  PARTITION_XENIX_2            = 0x03,
+  PARTITION_FAT_16             = 0x04,
+  PARTITION_EXTENDED           = 0x05,
+  PARTITION_HUGE               = 0x06,
+  PARTITION_IFS                = 0x07,
+  PARTITION_OS2BOOTMGR         = 0x0A,
+  PARTITION_FAT32              = 0x0B,
+  PARTITION_FAT32_XINT13       = 0x0C,
+  PARTITION_XINT13             = 0x0E,
+  PARTITION_XINT13_EXTENDED    = 0x0F,
+  PARTITION_PREP               = 0x41,
+  PARTITION_LDM                = 0x42,
+  PARTITION_UNIX               = 0x63,
+  PARTITION_NTFT               = 0x80,
+  VALID_NTFT                   = 0xC0
+};
+
+#define IsRecognizedPartition( TYPE ) \
+ (   (((TYPE) & PARTITION_NTFT) && (((TYPE) & ~VALID_NTFT) == PARTITION_FAT_12))\
+  || (((TYPE) & PARTITION_NTFT) && (((TYPE) & ~VALID_NTFT) == PARTITION_HUGE))\
+  || (((TYPE) & PARTITION_NTFT) && (((TYPE) & ~VALID_NTFT) == PARTITION_IFS))\
+  || (((TYPE) & PARTITION_NTFT) && (((TYPE) & ~VALID_NTFT) == PARTITION_FAT32))\
+  || (((TYPE) & PARTITION_NTFT) && (((TYPE) & ~VALID_NTFT) == PARTITION_FAT32_XINT13))\
+  || (((TYPE) & PARTITION_NTFT) && (((TYPE) & ~VALID_NTFT) == PARTITION_XINT13))\
+  || ((TYPE) == PARTITION_FAT32) || ((TYPE) == PARTITION_FAT32_XINT13)\
+  || ((TYPE) == PARTITION_FAT_12) || ((TYPE) == PARTITION_FAT_16)\
+  || ((TYPE) == PARTITION_HUGE) || ((TYPE) == PARTITION_IFS)\
+  || ((TYPE) == PARTITION_XINT13)\
+ )
+#define IsContainerPartition( TYPE ) \
+ (((TYPE) == PARTITION_EXTENDED) || ((TYPE) == PARTITION_XINT13_EXTENDED))
+
+typedef
+enum _MEDIA_TYPE
+/* https://msdn.microsoft.com/en-us/library/windows/hardware/ff562216(v=vs.85).aspx */
+{ Unknown                      = 0x00,
+  F5_1Pt2_512                  = 0x01,
+  F3_1Pt44_512                 = 0x02,
+  F3_2Pt88_512                 = 0x03,
+  F3_20Pt8_512                 = 0x04,
+  F3_720_512                   = 0x05,
+  F5_360_512                   = 0x06,
+  F5_320_512                   = 0x07,
+  F5_320_1024                  = 0x08,
+  F5_180_512                   = 0x09,
+  F5_160_512                   = 0x0A,
+  RemovableMedia               = 0x0B,
+  FixedMedia                   = 0x0C,
+  F3_120M_512                  = 0x0D,
+  F3_640_512                   = 0x0E,
+  F5_640_512                   = 0x0F,
+  F5_720_512                   = 0x10,
+  F3_1Pt2_512                  = 0x11,
+  F3_1Pt23_1024                = 0x12,
+  F5_1Pt23_1024                = 0x13,
+  F3_128Mb_512                 = 0x14,
+  F3_230Mb_512                 = 0x15,
+  F8_256_128                   = 0x16,
+  F3_200Mb_512                 = 0x17,
+  F3_240M_512                  = 0x18,
+  F3_32M_512                   = 0x19
 } MEDIA_TYPE, *PMEDIA_TYPE;
 
-typedef enum _DETECTION_TYPE {
-  DetectNone,
-  DetectInt13,
-  DetectExInt13
+typedef
+enum _DETECTION_TYPE
+/* https://msdn.microsoft.com/en-us/library/windows/hardware/ff552516%28v=vs.85%29.aspx */
+{ DetectNone                   = 0,
+  DetectInt13                  = 1,
+  DetectExInt13                        = 2
 } DETECTION_TYPE;
 
-typedef struct _DISK_CONTROLLER_NUMBER {
-  ULONG  ControllerNumber;
-  ULONG  DiskNumber;
-} DISK_CONTROLLER_NUMBER, *PDISK_CONTROLLER_NUMBER;
-
-typedef struct _DISK_INT13_INFO {
-  USHORT  DriveSelect;
-  ULONG  MaxCylinders;
-  USHORT  SectorsPerTrack;
-  USHORT  MaxHeads;
-  USHORT  NumberDrives;
+typedef
+struct _DISK_INT13_INFO
+/* https://msdn.microsoft.com/en-us/library/windows/hardware/ff552624(v=vs.85).aspx */
+{ USHORT       DriveSelect;
+  ULONG        MaxCylinders;
+  USHORT       SectorsPerTrack;
+  USHORT       MaxHeads;
+  USHORT       NumberDrives;
 } DISK_INT13_INFO, *PDISK_INT13_INFO;
 
-typedef struct _DISK_EX_INT13_INFO {
-  USHORT  ExBufferSize;
-  USHORT  ExFlags;
-  ULONG  ExCylinders;
-  ULONG  ExHeads;
-  ULONG  ExSectorsPerTrack;
-  ULONG64  ExSectorsPerDrive;
-  USHORT  ExSectorSize;
-  USHORT  ExReserved;
+typedef
+struct _DISK_EX_INT13_INFO
+/* https://msdn.microsoft.com/en-us/library/windows/hardware/ff552610(v=vs.85).aspx */
+{ USHORT       ExBufferSize;
+  USHORT       ExFlags;
+  ULONG        ExCylinders;
+  ULONG        ExHeads;
+  ULONG        ExSectorsPerTrack;
+  ULONG64      ExSectorsPerDrive;
+  USHORT       ExSectorSize;
+  USHORT       ExReserved;
 } DISK_EX_INT13_INFO, *PDISK_EX_INT13_INFO;
 
-typedef struct _DISK_DETECTION_INFO {
-  ULONG  SizeOfDetectInfo;
-  DETECTION_TYPE  DetectionType;
-  _ANONYMOUS_UNION union {
-    _ANONYMOUS_STRUCT struct {
-      DISK_INT13_INFO  Int13;
-      DISK_EX_INT13_INFO  ExInt13;
+typedef
+struct _DISK_DETECTION_INFO
+/* https://msdn.microsoft.com/en-us/library/windows/hardware/ff552601(v=vs.85).aspx */
+{ ULONG                      SizeOfDetectInfo;
+  DETECTION_TYPE             DetectionType;
+  _ANONYMOUS_UNION union
+  { _ANONYMOUS_STRUCT struct
+    { DISK_INT13_INFO        Int13;
+      DISK_EX_INT13_INFO      ExInt13;
     } DUMMYSTRUCTNAME;
   } DUMMYUNIONNAME;
 } DISK_DETECTION_INFO, *PDISK_DETECTION_INFO;
 
-typedef struct _DISK_GEOMETRY {
-  LARGE_INTEGER  Cylinders;
-  MEDIA_TYPE  MediaType;
-  ULONG  TracksPerCylinder;
-  ULONG  SectorsPerTrack;
-  ULONG  BytesPerSector;
+typedef
+struct _DISK_GEOMETRY
+/* https://msdn.microsoft.com/en-us/library/windows/hardware/ff552613(v=vs.85).aspx */
+{ LARGE_INTEGER        Cylinders;
+  MEDIA_TYPE           MediaType;
+  ULONG                TracksPerCylinder;
+  ULONG                SectorsPerTrack;
+  ULONG                BytesPerSector;
 } DISK_GEOMETRY, *PDISK_GEOMETRY;
 
-typedef struct _DISK_GEOMETRY_EX {
-  DISK_GEOMETRY  Geometry;
-  LARGE_INTEGER  DiskSize;
-  UCHAR  Data[1];
+typedef
+struct _DISK_GEOMETRY_EX
+/* https://msdn.microsoft.com/en-us/library/windows/hardware/ff552618(v=vs.85).aspx */
+{ DISK_GEOMETRY        Geometry;
+  LARGE_INTEGER        DiskSize;
+  UCHAR                Data[1];
 } DISK_GEOMETRY_EX, *PDISK_GEOMETRY_EX;
 
-#define DiskGeometryGetPartition(Geometry) \
+/* Note: although declared as an array of only one byte, the Data area within
+ * the DISK_GEOMETRY_EX structure represents a variable size region containing
+ * a DISK_PARTITION_INFO structure followed by a DISK_DETECTION_INFO structure;
+ * the above <ddk/ntdddisk.h> reference defines the following pair of macros,
+ * for obtaining pointers to the embedded structures, given a pointer to the
+ * containing DISK_GEOMETRY_EX structure itself; (the corresponding reference
+ * for <winioctl.h> refers to these macros, without defining them).
+ */
+#if NTDDI_VERSION < NTDDI_WS03
+ /* FIXME: given the above definition for DISK_GEOMETRY_EX, this pair of
+  * macro definitions makes no sense at all...
+  */
+# define DiskGeometryGetPartition(Geometry) \
    ((PDISK_PARTITION_INFO)((Geometry) + 1))
 
-#define DiskGeometryGetDetect(Geometry)\
- ((PDISK_DETECTION_INFO)(((PBYTE)DiskGeometryGetPartition(Geometry) + \
-  DiskGeometryGetPartition(Geometry)->SizeOfPartitionInfo)))
-
-typedef struct _PARTITION_INFORMATION {
-  LARGE_INTEGER  StartingOffset;
-  LARGE_INTEGER  PartitionLength;
-  DWORD  HiddenSectors;
-  DWORD  PartitionNumber;
-  BYTE  PartitionType;
-  BOOLEAN  BootIndicator;
-  BOOLEAN  RecognizedPartition;
-  BOOLEAN  RewritePartition;
+# define DiskGeometryGetDetect(Geometry) \
+   ((PDISK_DETECTION_INFO)(((PBYTE)DiskGeometryGetPartition(Geometry) + \
+       DiskGeometryGetPartition(Geometry)->SizeOfPartitionInfo)))
+#else
+ /* ...whereas this pair would seem to be appropriate, regardless of the
+  * underlying NTDDI_VERSION.
+  */
+# define DiskGeometryGetPartition(Geometry) \
+   ((PDISK_PARTITION_INFO)((Geometry)->Data))
+
+# define DiskGeometryGetDetect(Geometry) \
+   ((PDISK_DETECTION_INFO)(((ULONG_PTR)DiskGeometryGetPartition(Geometry) + \
+       DiskGeometryGetPartition(Geometry)->SizeOfPartitionInfo)))
+#endif
+
+typedef
+struct _PARTITION_INFORMATION
+/* https://msdn.microsoft.com/en-us/library/windows/hardware/ff563751(v=vs.85).aspx */
+{ LARGE_INTEGER        StartingOffset;
+  LARGE_INTEGER        PartitionLength;
+  ULONG                HiddenSectors;
+  ULONG                PartitionNumber;
+  UCHAR                PartitionType;
+  BOOLEAN              BootIndicator;
+  BOOLEAN              RecognizedPartition;
+  BOOLEAN              RewritePartition;
 } PARTITION_INFORMATION, *PPARTITION_INFORMATION;
 
-typedef struct _PARTITION_INFORMATION_GPT {
-  GUID  PartitionType;
-  GUID  PartitionId;
-  ULONG64  Attributes;
-  WCHAR Name  [36];
+typedef
+struct _PARTITION_INFORMATION_GPT
+/* https://msdn.microsoft.com/en-us/library/windows/hardware/ff563763(v=vs.85).aspx */
+{ GUID                 PartitionType;
+  GUID                 PartitionId;
+  ULONG64              Attributes;
+  WCHAR                Name[36];
 } PARTITION_INFORMATION_GPT, *PPARTITION_INFORMATION_GPT;
 
-typedef struct _DISK_PARTITION_INFO {
-  ULONG  SizeOfPartitionInfo;
-  PARTITION_STYLE  PartitionStyle;
-  _ANONYMOUS_UNION union {
-    struct {
-      ULONG  Signature;
-      ULONG  CheckSum;
-    } Mbr;
-    struct {
-      GUID  DiskId;
-    } Gpt;
+typedef
+struct _DISK_PARTITION_INFO
+/* https://msdn.microsoft.com/en-us/library/windows/hardware/ff552629(v=vs.85).aspx */
+{ ULONG                  SizeOfPartitionInfo;
+  PARTITION_STYLE        PartitionStyle;
+  _ANONYMOUS_UNION union
+  { struct
+    { ULONG                Signature;
+      ULONG                CheckSum;
+    }                    Mbr;
+    struct
+    { GUID                 DiskId;
+    }                    Gpt;
   } DUMMYUNIONNAME;
 } DISK_PARTITION_INFO, *PDISK_PARTITION_INFO;
 
-typedef struct _DISK_PERFORMANCE {
-  LARGE_INTEGER  BytesRead;
-  LARGE_INTEGER  BytesWritten;
-  LARGE_INTEGER  ReadTime;
-  LARGE_INTEGER  WriteTime;
-  LARGE_INTEGER  IdleTime;
-  ULONG  ReadCount;
-  ULONG  WriteCount;
-  ULONG  QueueDepth;
-  ULONG  SplitCount;
-  LARGE_INTEGER  QueryTime;
-  ULONG  StorageDeviceNumber;
-  WCHAR  StorageManagerName[8];
+typedef
+struct _DISK_PERFORMANCE
+/* https://msdn.microsoft.com/en-us/library/windows/hardware/ff552633(v=vs.85).aspx */
+{ LARGE_INTEGER        BytesRead;
+  LARGE_INTEGER        BytesWritten;
+  LARGE_INTEGER        ReadTime;
+  LARGE_INTEGER        WriteTime;
+  LARGE_INTEGER        IdleTime;
+  ULONG                ReadCount;
+  ULONG                WriteCount;
+  ULONG                QueueDepth;
+  ULONG                SplitCount;
+  LARGE_INTEGER        QueryTime;
+  ULONG                StorageDeviceNumber;
+  WCHAR                StorageManagerName[8];
 } DISK_PERFORMANCE, *PDISK_PERFORMANCE;
 
-typedef struct _PARTITION_INFORMATION_EX {
-  PARTITION_STYLE  PartitionStyle;
-  LARGE_INTEGER  StartingOffset;
-  LARGE_INTEGER  PartitionLength;
-  ULONG  PartitionNumber;
-  BOOLEAN  RewritePartition;
-  _ANONYMOUS_UNION union {
-    PARTITION_INFORMATION_MBR  Mbr;
-    PARTITION_INFORMATION_GPT  Gpt;
+typedef
+struct _PARTITION_INFORMATION_EX
+/* https://msdn.microsoft.com/en-us/library/windows/hardware/ff563754(v=vs.85).aspx */
+{ PARTITION_STYLE              PartitionStyle;
+  LARGE_INTEGER                StartingOffset;
+  LARGE_INTEGER                PartitionLength;
+  ULONG                        PartitionNumber;
+  BOOLEAN                      RewritePartition;
+  _ANONYMOUS_UNION union
+  { PARTITION_INFORMATION_MBR  Mbr;
+    PARTITION_INFORMATION_GPT  Gpt;
   } DUMMYUNIONNAME;
 } PARTITION_INFORMATION_EX, *PPARTITION_INFORMATION_EX;
 
-typedef struct _FORMAT_EX_PARAMETERS {
-  MEDIA_TYPE  MediaType;
-  ULONG  StartCylinderNumber;
-  ULONG  EndCylinderNumber;
-  ULONG  StartHeadNumber;
-  ULONG  EndHeadNumber;
-  USHORT  FormatGapLength;
-  USHORT  SectorsPerTrack;
-  USHORT  SectorNumber[1];
+typedef
+struct _FORMAT_EX_PARAMETERS
+/* https://msdn.microsoft.com/en-us/library/windows/hardware/ff553875(v=vs.85).aspx */
+{ MEDIA_TYPE   MediaType;
+  ULONG        StartCylinderNumber;
+  ULONG        EndCylinderNumber;
+  ULONG        StartHeadNumber;
+  ULONG        EndHeadNumber;
+  USHORT       FormatGapLength;
+  USHORT       SectorsPerTrack;
+  USHORT       SectorNumber[1];
 } FORMAT_EX_PARAMETERS, *PFORMAT_EX_PARAMETERS;
 
-typedef struct _FORMAT_PARAMETERS {
-  MEDIA_TYPE  MediaType;
-  ULONG  StartCylinderNumber;
-  ULONG  EndCylinderNumber;
-  ULONG  StartHeadNumber;
-  ULONG  EndHeadNumber;
+typedef
+struct _FORMAT_PARAMETERS
+/* https://msdn.microsoft.com/en-us/library/windows/hardware/ff553878(v=vs.85).aspx */
+{ MEDIA_TYPE   MediaType;
+  ULONG        StartCylinderNumber;
+  ULONG        EndCylinderNumber;
+  ULONG        StartHeadNumber;
+  ULONG        EndHeadNumber;
 } FORMAT_PARAMETERS, *PFORMAT_PARAMETERS;
 
-typedef struct _GET_LENGTH_INFORMATION {
-  LARGE_INTEGER  Length;
+typedef
+struct _GET_LENGTH_INFORMATION
+/* https://msdn.microsoft.com/en-us/library/windows/hardware/ff554986(v=vs.85).aspx */
+{ LARGE_INTEGER        Length;
 } GET_LENGTH_INFORMATION, *PGET_LENGTH_INFORMATION;
 
-typedef struct _REASSIGN_BLOCKS {
-  WORD  Reserved;
-  WORD  Count;
-  DWORD  BlockNumber[1];
+typedef
+struct _REASSIGN_BLOCKS
+/* https://msdn.microsoft.com/en-us/library/windows/hardware/ff563962(v=vs.85).aspx */
+{ USHORT       Reserved;
+  USHORT       Count;
+  ULONG        BlockNumber[1];
 } REASSIGN_BLOCKS, *PREASSIGN_BLOCKS;
 
-typedef struct _SET_PARTITION_INFORMATION {
-  UCHAR  PartitionType;
+typedef
+struct _SET_PARTITION_INFORMATION
+/* https://msdn.microsoft.com/en-us/library/windows/hardware/ff566192(v=vs.85).aspx */
+{ UCHAR        PartitionType;
 } SET_PARTITION_INFORMATION, *PSET_PARTITION_INFORMATION;
 
-typedef SET_PARTITION_INFORMATION SET_PARTITION_INFORMATION_MBR;
-typedef PARTITION_INFORMATION_GPT SET_PARTITION_INFORMATION_GPT;
-
-typedef struct _SET_PARTITION_INFORMATION_EX {
-  PARTITION_STYLE  PartitionStyle;
-  _ANONYMOUS_UNION union {
-    SET_PARTITION_INFORMATION_MBR  Mbr;
-    SET_PARTITION_INFORMATION_GPT  Gpt;
-  } DUMMYUNIONNAME;
-} SET_PARTITION_INFORMATION_EX, *PSET_PARTITION_INFORMATION_EX;
-
-typedef struct _VERIFY_INFORMATION {
-  LARGE_INTEGER  StartingOffset;
-  DWORD  Length;
+typedef
+struct _VERIFY_INFORMATION
+/* https://msdn.microsoft.com/en-us/library/windows/hardware/ff568005(v=vs.85).aspx */
+{ LARGE_INTEGER        StartingOffset;
+  ULONG                Length;
 } VERIFY_INFORMATION, *PVERIFY_INFORMATION;
 
-typedef enum {
-       EqualPriority,
-       KeepPrefetchedData,
-       KeepReadData
+typedef enum
+/* https://msdn.microsoft.com/en-us/library/windows/hardware/ff552583(v=vs.85).aspx */
+{ EqualPriority                = 0,
+  KeepPrefetchedData           = 1,
+  KeepReadData                 = 2
 } DISK_CACHE_RETENTION_PRIORITY;
 
-typedef struct _DISK_CACHE_INFORMATION {
-       BOOLEAN  ParametersSavable;
-       BOOLEAN  ReadCacheEnabled;
-       BOOLEAN  WriteCacheEnabled;
-       DISK_CACHE_RETENTION_PRIORITY  ReadRetentionPriority;
-       DISK_CACHE_RETENTION_PRIORITY  WriteRetentionPriority;
-       USHORT  DisablePrefetchTransferLength;
-       BOOLEAN  PrefetchScalar;
-       _ANONYMOUS_UNION union {
-               struct {
-                       USHORT  Minimum;
-                       USHORT  Maximum;
-                       USHORT  MaximumBlocks;
-               } ScalarPrefetch;
-               struct {
-                       USHORT  Minimum;
-                       USHORT  Maximum;
-               } BlockPrefetch;
-       } DUMMYUNIONNAME;
+typedef
+struct _DISK_CACHE_INFORMATION
+/* https://msdn.microsoft.com/en-us/library/windows/hardware/ff552580(v=vs.85).aspx */
+{ BOOLEAN                              ParametersSavable;
+  BOOLEAN                              ReadCacheEnabled;
+  BOOLEAN                              WriteCacheEnabled;
+  DISK_CACHE_RETENTION_PRIORITY        ReadRetentionPriority;
+  DISK_CACHE_RETENTION_PRIORITY        WriteRetentionPriority;
+  USHORT                               DisablePrefetchTransferLength;
+  BOOLEAN                              PrefetchScalar;
+  _ANONYMOUS_UNION union
+  { struct
+    { USHORT                             Minimum;
+      USHORT                             Maximum;
+      USHORT                             MaximumBlocks;
+    }                                  ScalarPrefetch;
+    struct
+    { USHORT                             Minimum;
+      USHORT                             Maximum;
+    }                                  BlockPrefetch;
+  } DUMMYUNIONNAME;
 } DISK_CACHE_INFORMATION, *PDISK_CACHE_INFORMATION;
 
-typedef struct _DISK_GROW_PARTITION {
-  ULONG  PartitionNumber;
-  LARGE_INTEGER  BytesToGrow;
+typedef
+struct _DISK_GROW_PARTITION
+/* https://msdn.microsoft.com/en-us/library/windows/hardware/ff552621(v=vs.85).aspx */
+{ ULONG                PartitionNumber;
+  LARGE_INTEGER        BytesToGrow;
 } DISK_GROW_PARTITION, *PDISK_GROW_PARTITION;
 
-/* GETVERSIONINPARAMS.fCapabilities constants */
+/* End of _DDK_NTDDDISK_H and _WINIOCTL_H common declarations.
+ */
+#endif
+#ifdef _DDK_NTDDDISK_H
+/* Declarations specific to _DDK_NTDDDISK_H alone.
+ */
+_BEGIN_C_DECLS
+
+#define DD_DISK_DEVICE_NAME                       "\\Device\\UNKNOWN"
+#define DD_DISK_DEVICE_NAME_U                    L"\\Device\\UNKNOWN"
+
+#define IOCTL_DISK_CONTROLLER_NUMBER           __FILE_AM_BUFFERED(__IOCTL_DISK_,0x0011)
+#define IOCTL_DISK_INTERNAL_SET_VERIFY         __FILE_AM_BUFFERED(__IOCTL_DISK_,0x0100)
+#define IOCTL_DISK_INTERNAL_CLEAR_VERIFY       __FILE_AM_BUFFERED(__IOCTL_DISK_,0x0101)
+
+#define SMART_GET_VERSION                      __FILE_RD_BUFFERED(__IOCTL_DISK_,0x0020)
+#define SMART_RCV_DRIVE_DATA                   __FILE_RW_BUFFERED(__IOCTL_DISK_,0x0022)
+#define SMART_SEND_DRIVE_COMMAND               __FILE_RW_BUFFERED(__IOCTL_DISK_,0x0021)
+
+#define IsFTPartition( PartitionType ) \
+ (((PartitionType) & PARTITION_NTFT) && IsRecognizedPartition(PartitionType))
+
+DEFINE_GUID( WMI_DISK_GEOMETRY_GUID,
+    0x25007f51L, 0x57c2, 0x11d1, 0xa5, 0x28, 0x0, 0xa0, 0xc9, 0x6, 0x29, 0x10
+  );
+
+typedef USHORT BAD_TRACK_NUMBER;
+typedef USHORT *PBAD_TRACK_NUMBER;
+
+typedef
+struct _DISK_CONTROLLER_NUMBER
+{ ULONG                ControllerNumber;
+  ULONG                DiskNumber;
+} DISK_CONTROLLER_NUMBER, *PDISK_CONTROLLER_NUMBER;
+
+typedef SET_PARTITION_INFORMATION SET_PARTITION_INFORMATION_MBR;
+typedef PARTITION_INFORMATION_GPT SET_PARTITION_INFORMATION_GPT;
+
+typedef
+struct _SET_PARTITION_INFORMATION_EX
+{ PARTITION_STYLE                      PartitionStyle;
+  _ANONYMOUS_UNION union
+  { SET_PARTITION_INFORMATION_MBR      Mbr;
+    SET_PARTITION_INFORMATION_GPT      Gpt;
+  } DUMMYUNIONNAME;
+} SET_PARTITION_INFORMATION_EX, *PSET_PARTITION_INFORMATION_EX;
+
+/* GETVERSIONINPARAMS.fCapabilities constants
+ */
 #define CAP_ATA_ID_CMD                    1
 #define CAP_ATAPI_ID_CMD                  2
 #define CAP_SMART_CMD                     4
 
-typedef struct _GETVERSIONINPARAMS {
-       UCHAR  bVersion;
-       UCHAR  bRevision;
-       UCHAR  bReserved;
-       UCHAR  bIDEDeviceMap;
-       ULONG  fCapabilities;
-       ULONG  dwReserved[4];
+typedef
+struct _GETVERSIONINPARAMS
+{ UCHAR                bVersion;
+  UCHAR                bRevision;
+  UCHAR                bReserved;
+  UCHAR                bIDEDeviceMap;
+  ULONG                fCapabilities;
+  ULONG                dwReserved[4];
 } GETVERSIONINPARAMS, *PGETVERSIONINPARAMS, *LPGETVERSIONINPARAMS;
 
-/* IDEREGS.bCommandReg constants */
+/* IDEREGS.bCommandReg constants
+ */
 #define ATAPI_ID_CMD                      0xA1
 #define ID_CMD                            0xEC
 #define SMART_CMD                         0xB0
@@ -440,29 +472,32 @@ typedef struct _GETVERSIONINPARAMS {
 #define SMART_CYL_LOW                     0x4F
 #define SMART_CYL_HI                      0xC2
 
-typedef struct _IDEREGS {
-       UCHAR  bFeaturesReg;
-       UCHAR  bSectorCountReg;
-       UCHAR  bSectorNumberReg;
-       UCHAR  bCylLowReg;
-       UCHAR  bCylHighReg;
-       UCHAR  bDriveHeadReg;
-       UCHAR  bCommandReg;
-       UCHAR  bReserved;
+typedef
+struct _IDEREGS
+{ UCHAR                bFeaturesReg;
+  UCHAR                bSectorCountReg;
+  UCHAR                bSectorNumberReg;
+  UCHAR                bCylLowReg;
+  UCHAR                bCylHighReg;
+  UCHAR                bDriveHeadReg;
+  UCHAR                bCommandReg;
+  UCHAR                bReserved;
 } IDEREGS, *PIDEREGS, *LPIDEREGS;
 
 #include <pshpack1.h>
-typedef struct _SENDCMDINPARAMS {
-       ULONG  cBufferSize;
-       IDEREGS  irDriveRegs;
-       UCHAR  bDriveNumber;
-       UCHAR  bReserved[3];
-       ULONG  dwReserved[4];
-       UCHAR  bBuffer[1];
+typedef
+struct _SENDCMDINPARAMS
+{ ULONG                cBufferSize;
+  IDEREGS              irDriveRegs;
+  UCHAR                bDriveNumber;
+  UCHAR                bReserved[3];
+  ULONG                dwReserved[4];
+  UCHAR                bBuffer[1];
 } SENDCMDINPARAMS, *PSENDCMDINPARAMS, *LPSENDCMDINPARAMS;
 #include <poppack.h>
 
-/* DRIVERSTATUS.bDriverError constants */
+/* DRIVERSTATUS.bDriverError constants
+ */
 #define SMART_NO_ERROR                    0
 #define SMART_IDE_ERROR                   1
 #define SMART_INVALID_FLAG                2
@@ -482,11 +517,12 @@ typedef struct _SENDCMDINPARAMS {
 #define SMART_SHORT_SELFTEST_CAPTIVE      129
 #define SMART_EXTENDED_SELFTEST_CAPTIVE   130
 
-typedef struct _DRIVERSTATUS {
-       UCHAR  bDriverError;
-       UCHAR  bIDEError;
-       UCHAR  bReserved[2];
-       ULONG  dwReserved[2];
+typedef
+struct _DRIVERSTATUS
+{ UCHAR                bDriverError;
+  UCHAR                bIDEError;
+  UCHAR                bReserved[2];
+  ULONG                dwReserved[2];
 } DRIVERSTATUS, *PDRIVERSTATUS, *LPDRIVERSTATUS;
 
 #define READ_ATTRIBUTE_BUFFER_SIZE        512
@@ -495,10 +531,11 @@ typedef struct _DRIVERSTATUS {
 #define SMART_LOG_SECTOR_SIZE             512
 
 #include <pshpack1.h>
-typedef struct _SENDCMDOUTPARAMS {
-       ULONG  cBufferSize;
-       DRIVERSTATUS  DriverStatus;
-       UCHAR  bBuffer[1];
+typedef
+struct _SENDCMDOUTPARAMS
+{ ULONG                cBufferSize;
+  DRIVERSTATUS         DriverStatus;
+  UCHAR                bBuffer[1];
 } SENDCMDOUTPARAMS, *PSENDCMDOUTPARAMS, *LPSENDCMDOUTPARAMS;
 #include <poppack.h>
 
@@ -514,8 +551,7 @@ typedef struct _SENDCMDOUTPARAMS {
 #define RETURN_SMART_STATUS               0xDA
 #define ENABLE_DISABLE_AUTO_OFFLINE       0xDB
 
-#ifdef __cplusplus
-}
-#endif
+_END_C_DECLS
 
-#endif /* __NTDDDISK_H */
+#endif /* _DDK_NTDDDISK_H */
+#endif /* !_DDK_NTDDDISK_H: $RCSfile$: end of file */