Major cleanup of NDK. I've decided that it would be much cleaner to accumulate all types, regardless of their um/km availabilty, into each header. Thus, umtypes.h now only contains the equivalent of ntdef.h and is automatically not-included if the DDK is. Similary, I've removed all the NTIFS hacks and added a single ifssupp.h file, which is automatically removed if the IFS is added. That file will be deleted then the Longhorn WDK is made public (it contains the IFS/DDK). Nothing has changed on the includer-side, the same rules still apply
Modified: trunk/reactos/drivers/storage/scsiport/scsiport_int.h
Modified: trunk/reactos/include/drivers/diskdump/diskdump.h
Modified: trunk/reactos/include/ndk/arch/ketypes.h
Added: trunk/reactos/include/ndk/cmtypes.h
Modified: trunk/reactos/include/ndk/extypes.h
Modified: trunk/reactos/include/ndk/fixmes.txt
Modified: trunk/reactos/include/ndk/i386/mmtypes.h
Added: trunk/reactos/include/ndk/ifssupp.h
Modified: trunk/reactos/include/ndk/iotypes.h
Modified: trunk/reactos/include/ndk/kdfuncs.h
Modified: trunk/reactos/include/ndk/kefuncs.h
Modified: trunk/reactos/include/ndk/ketypes.h
Modified: trunk/reactos/include/ndk/lpctypes.h
Modified: trunk/reactos/include/ndk/mmtypes.h
Modified: trunk/reactos/include/ndk/ntndk.h
Modified: trunk/reactos/include/ndk/obtypes.h
Modified: trunk/reactos/include/ndk/pstypes.h
Modified: trunk/reactos/include/ndk/rtlfuncs.h
Modified: trunk/reactos/include/ndk/rtltypes.h
Modified: trunk/reactos/include/ndk/umfuncs.h
Modified: trunk/reactos/include/ndk/umtypes.h
Modified: trunk/reactos/include/ndk/zwfuncs.h
Modified: trunk/reactos/include/ndk/zwtypes.h
Modified: trunk/reactos/w32api/include/basetsd.h
Modified: trunk/reactos/w32api/include/winnt.h

Modified: trunk/reactos/drivers/storage/scsiport/scsiport_int.h
--- trunk/reactos/drivers/storage/scsiport/scsiport_int.h	2005-08-17 06:14:55 UTC (rev 17419)
+++ trunk/reactos/drivers/storage/scsiport/scsiport_int.h	2005-08-17 07:06:59 UTC (rev 17420)
@@ -7,8 +7,12 @@
 
 #define VERSION "0.0.3"
 
+#ifndef PAGE_ROUND_UP
 #define PAGE_ROUND_UP(x) ( (((ULONG_PTR)x)%PAGE_SIZE) ? ((((ULONG_PTR)x)&(~(PAGE_SIZE-1)))+PAGE_SIZE) : ((ULONG_PTR)x) )
+#endif
+#ifndef ROUND_UP
 #define ROUND_UP(N, S) ((((N) + (S) - 1) / (S)) * (S))
+#endif
 
 #define TAG(A, B, C, D) (ULONG)(((A)<<0) + ((B)<<8) + ((C)<<16) + ((D)<<24))
 

Modified: trunk/reactos/include/drivers/diskdump/diskdump.h
--- trunk/reactos/include/drivers/diskdump/diskdump.h	2005-08-17 06:14:55 UTC (rev 17419)
+++ trunk/reactos/include/drivers/diskdump/diskdump.h	2005-08-17 07:06:59 UTC (rev 17420)
@@ -2,7 +2,7 @@
 #define __DISKDUMP_H
 
 #include <ddk/ntddscsi.h>
-#include <ndk/ketypes.h>
+#include <ndk/ntndk.h>
 
 #define MM_CORE_DUMP_HEADER_MAGIC         (0xdeafbead)
 #define MM_CORE_DUMP_HEADER_VERSION       (0x1)

Modified: trunk/reactos/include/ndk/arch/ketypes.h
--- trunk/reactos/include/ndk/arch/ketypes.h	2005-08-17 06:14:55 UTC (rev 17419)
+++ trunk/reactos/include/ndk/arch/ketypes.h	2005-08-17 07:06:59 UTC (rev 17420)
@@ -9,7 +9,7 @@
 #ifndef _ARCH_KETYPES_H
 #define _ARCH_KETYPES_H
 
-/* Shared structure needed by Arch-specific headers */
+/* Shared structures needed by Arch-specific headers */
 typedef struct _KDPC_DATA
 {
     LIST_ENTRY  DpcListHead;
@@ -18,6 +18,12 @@
     ULONG  DpcCount;
 } KDPC_DATA, *PKDPC_DATA;
 
+typedef struct _PP_LOOKASIDE_LIST
+{
+    struct _GENERAL_LOOKASIDE *P;
+    struct _GENERAL_LOOKASIDE *L;
+} PP_LOOKASIDE_LIST, *PPP_LOOKASIDE_LIST;
+
 #ifdef _M_IX86
 #include <ndk/i386/ketypes.h>
 #else

Added: trunk/reactos/include/ndk/cmtypes.h
--- trunk/reactos/include/ndk/cmtypes.h	2005-08-17 06:14:55 UTC (rev 17419)
+++ trunk/reactos/include/ndk/cmtypes.h	2005-08-17 07:06:59 UTC (rev 17420)
@@ -0,0 +1,129 @@
+/*
+ * PROJECT:         ReactOS Native Headers
+ * FILE:            include/ndk/cmtypes.h
+ * PURPOSE:         Definitions for Config Manager Types not defined in DDK/IFS
+ * PROGRAMMER:      Alex Ionescu (alex@relsoft.net)
+ * UPDATE HISTORY:
+ *                  Created 06/10/04
+ */
+
+#ifndef _CMTYPES_H
+#define _CMTYPES_H
+
+/* DEPENDENCIES **************************************************************/
+
+/* EXPORTED DATA *************************************************************/
+
+/* CONSTANTS *****************************************************************/
+
+/* ENUMERATIONS **************************************************************/
+
+#ifdef NTOS_MODE_USER
+typedef enum _KEY_INFORMATION_CLASS
+{
+    KeyBasicInformation,
+    KeyNodeInformation,
+    KeyFullInformation,
+    KeyNameInformation,
+    KeyCachedInformation,
+    KeyFlagsInformation
+} KEY_INFORMATION_CLASS;
+
+typedef enum _KEY_VALUE_INFORMATION_CLASS
+{
+    KeyValueBasicInformation,
+    KeyValueFullInformation,
+    KeyValuePartialInformation,
+    KeyValueFullInformationAlign64,
+    KeyValuePartialInformationAlign64
+} KEY_VALUE_INFORMATION_CLASS;
+
+typedef enum _KEY_SET_INFORMATION_CLASS
+{
+    KeyWriteTimeInformation,
+    KeyUserFlagsInformation,
+    MaxKeySetInfoClass
+} KEY_SET_INFORMATION_CLASS;
+
+/* TYPES *********************************************************************/
+
+typedef struct _KEY_WRITE_TIME_INFORMATION
+{
+    LARGE_INTEGER LastWriteTime;
+} KEY_WRITE_TIME_INFORMATION, *PKEY_WRITE_TIME_INFORMATION;
+
+typedef struct _KEY_USER_FLAGS_INFORMATION
+{
+    ULONG UserFlags;
+} KEY_USER_FLAGS_INFORMATION, *PKEY_USER_FLAGS_INFORMATION;
+
+typedef struct _KEY_FULL_INFORMATION
+{
+    LARGE_INTEGER LastWriteTime;
+    ULONG TitleIndex;
+    ULONG ClassOffset;
+    ULONG ClassLength;
+    ULONG SubKeys;
+    ULONG MaxNameLen;
+    ULONG MaxClassLen;
+    ULONG Values;
+    ULONG MaxValueNameLen;
+    ULONG MaxValueDataLen;
+    WCHAR Class[1];
+} KEY_FULL_INFORMATION, *PKEY_FULL_INFORMATION;
+
+typedef struct _KEY_NODE_INFORMATION
+{
+    LARGE_INTEGER LastWriteTime;
+    ULONG TitleIndex;
+    ULONG ClassOffset;
+    ULONG ClassLength;
+    ULONG NameLength;
+    WCHAR Name[1];
+} KEY_NODE_INFORMATION, *PKEY_NODE_INFORMATION;
+
+typedef struct _KEY_VALUE_ENTRY
+{
+    PUNICODE_STRING ValueName;
+    ULONG DataLength;
+    ULONG DataOffset;
+    ULONG Type;
+} KEY_VALUE_ENTRY, *PKEY_VALUE_ENTRY;
+
+typedef struct _KEY_VALUE_PARTIAL_INFORMATION
+{
+    ULONG TitleIndex;
+    ULONG Type;
+    ULONG DataLength;
+    UCHAR Data[1];
+} KEY_VALUE_PARTIAL_INFORMATION, *PKEY_VALUE_PARTIAL_INFORMATION;
+
+typedef struct _KEY_VALUE_BASIC_INFORMATION
+{
+    ULONG TitleIndex;
+    ULONG Type;
+    ULONG NameLength;
+    WCHAR Name[1];
+} KEY_VALUE_BASIC_INFORMATION, *PKEY_VALUE_BASIC_INFORMATION;
+
+typedef struct _KEY_VALUE_FULL_INFORMATION
+{
+    ULONG TitleIndex;
+    ULONG Type;
+    ULONG DataOffset;
+    ULONG DataLength;
+    ULONG NameLength;
+    WCHAR Name[1];
+} KEY_VALUE_FULL_INFORMATION, *PKEY_VALUE_FULL_INFORMATION;
+
+typedef struct _KEY_BASIC_INFORMATION
+{
+    LARGE_INTEGER LastWriteTime;
+    ULONG TitleIndex;
+    ULONG NameLength;
+    WCHAR Name[1];
+} KEY_BASIC_INFORMATION, *PKEY_BASIC_INFORMATION;
+
+#endif
+#endif
+

Modified: trunk/reactos/include/ndk/extypes.h
--- trunk/reactos/include/ndk/extypes.h	2005-08-17 06:14:55 UTC (rev 17419)
+++ trunk/reactos/include/ndk/extypes.h	2005-08-17 07:06:59 UTC (rev 17420)
@@ -11,36 +11,37 @@
 #define _EXTYPES_H
 
 /* DEPENDENCIES **************************************************************/
-#include "ketypes.h"
 
 /* EXPORTED DATA *************************************************************/
+#ifndef NTOS_MODE_USER
 extern POBJECT_TYPE NTOSAPI ExIoCompletionType;
 extern NTOSAPI POBJECT_TYPE ExMutantObjectType;
 extern NTOSAPI POBJECT_TYPE ExTimerType;
+#endif
 
 /* CONSTANTS *****************************************************************/
-
+#ifndef NTOS_MODE_USER
 #define INVALID_HANDLE_VALUE (HANDLE)-1
+#endif
 
 /* Increments */
 #define MUTANT_INCREMENT 1
 
-/* Callback Object Access Rights */
-#define CALLBACK_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0x0001)
-#define CALLBACK_EXECUTE    (STANDARD_RIGHTS_EXECUTE|SYNCHRONIZE|0x0001)
-#define CALLBACK_WRITE      (STANDARD_RIGHTS_WRITE|SYNCHRONIZE|0x0001)
-#define CALLBACK_READ       (STANDARD_RIGHTS_READ|SYNCHRONIZE|0x0001)
+/* Executive Object Access Rights */
+#define CALLBACK_ALL_ACCESS     (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0x0001)
+#define CALLBACK_EXECUTE        (STANDARD_RIGHTS_EXECUTE|SYNCHRONIZE|0x0001)
+#define CALLBACK_WRITE          (STANDARD_RIGHTS_WRITE|SYNCHRONIZE|0x0001)
+#define CALLBACK_READ           (STANDARD_RIGHTS_READ|SYNCHRONIZE|0x0001)
+#ifdef NTOS_MODE_USER
+#define EVENT_QUERY_STATE       0x0001
+#define SEMAPHORE_QUERY_STATE   0x0001
+#endif
 
 /* ENUMERATIONS **************************************************************/
 
 /* TYPES *********************************************************************/
 
-/* You'll need the IFS for this, so use an equivalent version */
-#ifndef _NTIFS_
-typedef PVOID EX_RUNDOWN_REF;
-typedef PVOID EX_PUSH_LOCK;
-#endif
-
+#ifndef NTOS_MODE_USER
 typedef struct _EX_QUEUE_WORKER_INFO
 {
     UCHAR QueueDisabled:1;
@@ -120,4 +121,5 @@
 } HANDLE_TABLE, *PHANDLE_TABLE;
 
 #endif
+#endif
 

Modified: trunk/reactos/include/ndk/fixmes.txt
--- trunk/reactos/include/ndk/fixmes.txt	2005-08-17 06:14:55 UTC (rev 17419)
+++ trunk/reactos/include/ndk/fixmes.txt	2005-08-17 07:06:59 UTC (rev 17420)
@@ -33,45 +33,10 @@
 	Priority 4:
 	- FIXED: Kernel and Memory Types are not architecture-specific (Eric) [ketypes.h, mmtypes.h]
 	- FIXED: Win32K Builds with windows.h (Filip) [extypes.h, ketypes.h]
-	- Move out stuff from umtypes.h into the actual header where they should go. Use ifdeffing
-	  directly in that file to protect user-mode versus kernel-mode types. umtypes.h will only
-	  end up containing the misc types that are needed for compatibility. This would create a
-	  significant cleanup.
+	- FIXED: Modify design of NDK so that all the types are in their respective files (Alex) [*.h]
 
 	Priority 5:
 	- FIXED: LPC Types are totally wrong. (Alex) [lpctypes.h]
 	- Missing System Info Classes [zwtypes.h]
 	- FIXED: Process Priority Classes are messed up (Alex) [pstypes.h]
 	
-Generic Note:
-	One of the most difficult things is when certain structures require the IFS for some of their
-	members. Up until some time ago, the IFS was 1000$, so it was senseless to require it in order
-	to allow people to use the NDK. Recently, however, the IFS price went down to 100$. This is 
-	still way too much. Even though the GNU NTIFS.H exists, I don't want to fallback on it. The
-	good news is that the WDK (Windows Driver Kit), which will supplant the DDK in about a year,
-	includes the IFS. At that point we can remove all the #ifndef/ifdef NTIFS hacks, since it'll
-	be OK to "force" IFS usage.
-	
-	UPDATE:
-	However, I'm giving serious consideration of making the IFS a requirement, and suggesting
-	usage of the GNU IFS for anyone that needs it. The problem, however, is that the official
-	GNU IFS is outdated and quite invalid in many ways, compared to the ReactOS IFS (which still
-	isn't perfect yet). Also, this would include many more definitions then needed. A third
-	option that I'm considering is creating a new header, until the WDK is out, which will be 
-	called ifstypes. It would be the brother of umtypes, but for kernel mode. Only a small
-	number of types will need to be included, and hence they will be easy to locate in case
-	the official ones change (by the time they do, the WDK will be out however, so no worries).
-	It would reduce all the ifdeffing to a single file.
-	
-	UPDATE2:
-	No. This is a bad idea. I've just added a note to purge out large parts of umtypes.h into the
-	actual xxtypes.h files, and then use iffdefing. This is a direct contradiction to my idea of
-	generalizing all the IFS stuff together.
-	
-	UPDATE3:
-	No. This is different...the user-mode types will always be unavailable in kernel-mode, and 
-	dissipating them into the real files is a good thing, because they will never move out and
-	they are much easier to maintain. However, once the WDK comes out, all #ifdef ntifs will
-	become obsolete, and they will have to be hunted down and removed. Having a single file that
-	is automatically added if the IFS is not detected is much easier to remove once the time
-	comes.

Modified: trunk/reactos/include/ndk/i386/mmtypes.h
--- trunk/reactos/include/ndk/i386/mmtypes.h	2005-08-17 06:14:55 UTC (rev 17419)
+++ trunk/reactos/include/ndk/i386/mmtypes.h	2005-08-17 07:06:59 UTC (rev 17420)
@@ -9,4 +9,17 @@
 #ifndef _I386_MMTYPES_H
 #define _I386_MMTYPES_H
 
+/* DEPENDENCIES **************************************************************/
+
+/* EXPORTED DATA *************************************************************/
+
+/* CONSTANTS *****************************************************************/
+
+#define PAGE_SIZE                         0x1000
+#define PAGE_SHIFT                        12L
+
+/* ENUMERATIONS **************************************************************/
+
+/* TYPES *********************************************************************/
+
 #endif

Added: trunk/reactos/include/ndk/ifssupp.h
--- trunk/reactos/include/ndk/ifssupp.h	2005-08-17 06:14:55 UTC (rev 17419)
+++ trunk/reactos/include/ndk/ifssupp.h	2005-08-17 07:06:59 UTC (rev 17420)
@@ -0,0 +1,116 @@
+/*
+ * PROJECT:         ReactOS Native Headers
+ * FILE:            include/ndk/ifssupp.h
+ * PURPOSE:         Defintions present in IFS, required for NDK usage.
+ * PROGRAMMER:      Alex Ionescu (alex@relsoft.net)
+ * UPDATE HISTORY:
+ *                  Created 08/16/05
+ */
+#ifndef _NTIFS_
+#define _NTIFS_
+
+/* DEPENDENCIES **************************************************************/
+
+/* EXPORTED DATA *************************************************************/
+
+/* CONSTANTS *****************************************************************/
+
+/* TYPES *********************************************************************/
+
+typedef PVOID PRTL_HEAP_PARAMETERS;
+
+#if defined(USE_LPC6432)
+#define LPC_CLIENT_ID CLIENT_ID64
+#define LPC_SIZE_T ULONGLONG
+#define LPC_PVOID ULONGLONG
+#define LPC_HANDLE ULONGLONG
+#else
+#define LPC_CLIENT_ID CLIENT_ID
+#define LPC_SIZE_T SIZE_T
+#define LPC_PVOID PVOID
+#define LPC_HANDLE HANDLE
+#endif
+
+typedef struct _PORT_MESSAGE
+{
+    union
+    {
+        struct
+        {
+            CSHORT DataLength;
+            CSHORT TotalLength;
+        } s1;
+        ULONG Length;
+    } u1;
+    union
+    {
+        struct
+        {
+            CSHORT Type;
+            CSHORT DataInfoOffset;
+        } s2;
+        ULONG ZeroInit;
+    } u2;
+    union
+    {
+        LPC_CLIENT_ID ClientId;
+        double DoNotUseThisField;
+    };
+    ULONG MessageId;
+    union
+    {
+        LPC_SIZE_T ClientViewSize;
+        ULONG CallbackId;
+    };
+} PORT_MESSAGE, *PPORT_MESSAGE;
+
+typedef struct _PORT_VIEW
+{
+    ULONG Length;
+    LPC_HANDLE SectionHandle;
+    ULONG SectionOffset;
+    LPC_SIZE_T ViewSize;
+    LPC_PVOID ViewBase;
+    LPC_PVOID ViewRemoteBase;
+} PORT_VIEW, *PPORT_VIEW;
+
+typedef struct _REMOTE_PORT_VIEW
+{
+    ULONG Length;
+    LPC_SIZE_T ViewSize;
+    LPC_PVOID ViewBase;
+} REMOTE_PORT_VIEW, *PREMOTE_PORT_VIEW;
+
+typedef struct _KAPC_STATE
+{
+    LIST_ENTRY ApcListHead[2];
+    PKPROCESS Process;
+    BOOLEAN KernelApcInProgress;
+    BOOLEAN KernelApcPending;
+    BOOLEAN UserApcPending;
+} KAPC_STATE, *PKAPC_STATE, *RESTRICTED_POINTER PRKAPC_STATE;
+
+typedef struct _KQUEUE
+{
+    DISPATCHER_HEADER Header;
+    LIST_ENTRY EntryListHead;
+    ULONG CurrentCount;
+    ULONG MaximumCount;
+    LIST_ENTRY ThreadListHead;
+} KQUEUE, *PKQUEUE, *RESTRICTED_POINTER PRKQUEUE;
+
+typedef PVOID EX_RUNDOWN_REF;
+typedef PVOID EX_PUSH_LOCK;
+
+typedef struct _SECURITY_CLIENT_CONTEXT
+{
+    SECURITY_QUALITY_OF_SERVICE SecurityQos;
+    PACCESS_TOKEN ClientToken;
+    BOOLEAN DirectlyAccessClientToken;
+    BOOLEAN DirectAccessEffectiveOnly;
+    BOOLEAN ServerIsRemote;
+    TOKEN_CONTROL ClientTokenControl;
+} SECURITY_CLIENT_CONTEXT, *PSECURITY_CLIENT_CONTEXT;
+
+#endif
+

Modified: trunk/reactos/include/ndk/iotypes.h
--- trunk/reactos/include/ndk/iotypes.h	2005-08-17 06:14:55 UTC (rev 17419)
+++ trunk/reactos/include/ndk/iotypes.h	2005-08-17 07:06:59 UTC (rev 17420)
@@ -11,17 +11,82 @@
 #define _IOTYPES_H
 
 /* DEPENDENCIES **************************************************************/
-#include "potypes.h"
 
 /* EXPORTED DATA *************************************************************/
+#ifndef NTOS_MODE_USER
 extern POBJECT_TYPE NTOSAPI IoAdapterObjectType;
 extern POBJECT_TYPE NTOSAPI IoDeviceHandlerObjectType;
 extern POBJECT_TYPE NTOSAPI IoDeviceObjectType;
 extern POBJECT_TYPE NTOSAPI IoDriverObjectType;
 extern POBJECT_TYPE NTOSAPI IoFileObjectType;
+#endif
 
 /* CONSTANTS *****************************************************************/
 
+#ifdef NTOS_MODE_USER
+/* Object Access Rights */
+#define SYMBOLIC_LINK_QUERY                 0x0001
+#define SYMBOLIC_LINK_ALL_ACCESS            STANDARD_RIGHTS_REQUIRED | 0x0001
+#endif
+
+/* File Result Flags */
+#define FILE_SUPERSEDED                     0x00000000
+#define FILE_OPENED                         0x00000001
+#define FILE_CREATED                        0x00000002
+#define FILE_OVERWRITTEN                    0x00000003
+#define FILE_EXISTS                         0x00000004
+#define FILE_DOES_NOT_EXIST                 0x00000005
+
+/* Pipe Flags */
+#define FILE_PIPE_BYTE_STREAM_MODE          0x00000000
+#define FILE_PIPE_MESSAGE_MODE              0x00000001
+#define FILE_PIPE_QUEUE_OPERATION           0x00000000
+#define FILE_PIPE_COMPLETE_OPERATION        0x00000001
+#define FILE_PIPE_INBOUND                   0x00000000
+#define FILE_PIPE_OUTBOUND                  0x00000001
+#define FILE_PIPE_FULL_DUPLEX               0x00000002
+#define FILE_PIPE_CLIENT_END                0x00000000
+#define FILE_PIPE_SERVER_END                0x00000001
+
+/* File Attributes */
+#define FILE_ATTRIBUTE_VALID_FLAGS          0x00007fb7
+#define FILE_ATTRIBUTE_VALID_SET_FLAGS      0x000031a7
+
+/* File Flags */
+#define FILE_SUPERSEDE                      0x00000000
+#define FILE_OPEN                           0x00000001
+#define FILE_CREATE                         0x00000002
+#define FILE_OPEN_IF                        0x00000003
+#define FILE_OVERWRITE                      0x00000004
+#define FILE_OVERWRITE_IF                   0x00000005
+#define FILE_MAXIMUM_DISPOSITION            0x00000005
+
+/* File Types */
+#define FILE_DIRECTORY_FILE                 0x00000001
+#define FILE_WRITE_THROUGH                  0x00000002
+#define FILE_SEQUENTIAL_ONLY                0x00000004
+#define FILE_NO_INTERMEDIATE_BUFFERING      0x00000008
+#define FILE_SYNCHRONOUS_IO_ALERT           0x00000010
+#define FILE_SYNCHRONOUS_IO_NONALERT        0x00000020
+#define FILE_NON_DIRECTORY_FILE             0x00000040
+#define FILE_CREATE_TREE_CONNECTION         0x00000080
+#define FILE_COMPLETE_IF_OPLOCKED           0x00000100
+#define FILE_NO_EA_KNOWLEDGE                0x00000200
+#define FILE_OPEN_FOR_RECOVERY              0x00000400
+#define FILE_RANDOM_ACCESS                  0x00000800
+#define FILE_DELETE_ON_CLOSE                0x00001000
+#define FILE_OPEN_BY_FILE_ID                0x00002000
+#define FILE_OPEN_FOR_BACKUP_INTENT         0x00004000
+#define FILE_NO_COMPRESSION                 0x00008000
+#define FILE_RESERVE_OPFILTER               0x00100000
+#define FILE_OPEN_REPARSE_POINT             0x00200000
+#define FILE_OPEN_NO_RECALL                 0x00400000
+#define FILE_OPEN_FOR_FREE_SPACE_QUERY      0x00800000
+
+/* Device Charactertics */
+#define FILE_REMOVABLE_MEDIA                0x00000001
+#define FILE_REMOTE_DEVICE                  0x00000010
+
 /* Device Object Extension Flags */
 #define DOE_UNLOAD_PENDING    0x1
 #define DOE_DELETE_PENDING    0x2
@@ -67,6 +132,90 @@
 #define DNUF_NOT_DISABLEABLE    0x0008
 
 /* ENUMERATIONS **************************************************************/
+
+#ifdef NTOS_MODE_USER
+typedef enum _INTERFACE_TYPE
+{
+    InterfaceTypeUndefined = -1,
+    Internal,
+    Isa,
+    Eisa,
+    MicroChannel,
+    TurboChannel,
+    PCIBus,
+    VMEBus,
+    NuBus,
+    PCMCIABus,
+    CBus,
+    MPIBus,
+    MPSABus,
+    ProcessorInternal,
+    InternalPowerBus,
+    PNPISABus,
+    PNPBus,
+    MaximumInterfaceType
+}INTERFACE_TYPE, *PINTERFACE_TYPE;
+
+typedef enum _FILE_INFORMATION_CLASS
+{
+    FileDirectoryInformation = 1,
+    FileFullDirectoryInformation,
+    FileBothDirectoryInformation,
+    FileBasicInformation,
+    FileStandardInformation,
+    FileInternalInformation,
+    FileEaInformation,
+    FileAccessInformation,
+    FileNameInformation,
+    FileRenameInformation,
+    FileLinkInformation,
+    FileNamesInformation,
+    FileDispositionInformation,
+    FilePositionInformation,
+    FileFullEaInformation,
+    FileModeInformation,
+    FileAlignmentInformation,
+    FileAllInformation,
+    FileAllocationInformation,
+    FileEndOfFileInformation,
+    FileAlternateNameInformation,
+    FileStreamInformation,
+    FilePipeInformation,
+    FilePipeLocalInformation,
+    FilePipeRemoteInformation,
+    FileMailslotQueryInformation,
+    FileMailslotSetInformation,
+    FileCompressionInformation,
+    FileObjectIdInformation,
+    FileCompletionInformation,
+    FileMoveClusterInformation,
+    FileQuotaInformation,
+    FileReparsePointInformation,
+    FileNetworkOpenInformation,
+    FileAttributeTagInformation,
+    FileTrackingInformation,
+    FileIdBothDirectoryInformation,
+    FileIdFullDirectoryInformation,
+    FileValidDataLengthInformation,
+    FileShortNameInformation,
+    FileMaximumInformation
+} FILE_INFORMATION_CLASS, *PFILE_INFORMATION_CLASS;
+
+typedef enum _FSINFOCLASS
+{
+    FileFsVolumeInformation = 1,
+    FileFsLabelInformation,
+    FileFsSizeInformation,
+    FileFsDeviceInformation,
+    FileFsAttributeInformation,
+    FileFsControlInformation,
+    FileFsFullSizeInformation,
+    FileFsObjectIdInformation,
+    FileFsDriverPathInformation,
+    FileFsMaximumInformation
+} FS_INFORMATION_CLASS, *PFS_INFORMATION_CLASS;
+#endif
+
 typedef enum _PNP_DEVNODE_STATE
 {
     DeviceNodeUnspecified = 0x300,
@@ -95,6 +244,279 @@
 
 /* TYPES *********************************************************************/
 
+#ifdef NTOS_MODE_USER
+typedef struct _FILE_BASIC_INFORMATION
+{
+    LARGE_INTEGER CreationTime;
+    LARGE_INTEGER LastAccessTime;
+    LARGE_INTEGER LastWriteTime;
+    LARGE_INTEGER ChangeTime;
+    ULONG FileAttributes;
+} FILE_BASIC_INFORMATION, *PFILE_BASIC_INFORMATION;
+
+typedef struct _FILE_STANDARD_INFORMATION
+{
+    LARGE_INTEGER AllocationSize;
+    LARGE_INTEGER EndOfFile;
+    ULONG NumberOfLinks;
+    BOOLEAN DeletePending;
+    BOOLEAN Directory;
+} FILE_STANDARD_INFORMATION, *PFILE_STANDARD_INFORMATION;
+
+typedef struct _FILE_NETWORK_OPEN_INFORMATION
+{
+    LARGE_INTEGER CreationTime;
+    LARGE_INTEGER LastAccessTime;
+    LARGE_INTEGER LastWriteTime;
+    LARGE_INTEGER ChangeTime;
+    LARGE_INTEGER AllocationSize;
+    LARGE_INTEGER EndOfFile;
+    ULONG FileAttributes;
+} FILE_NETWORK_OPEN_INFORMATION, *PFILE_NETWORK_OPEN_INFORMATION;
+
+typedef struct _FILE_EA_INFORMATION
+{
+    ULONG EaSize;
+} FILE_EA_INFORMATION, *PFILE_EA_INFORMATION;
+
+typedef struct _FILE_COMPRESSION_INFORMATION
+{
+    LARGE_INTEGER CompressedFileSize;
+    USHORT CompressionFormat;
+    UCHAR CompressionUnitShift;
+    UCHAR ChunkShift;
+    UCHAR ClusterShift;
+    UCHAR Reserved[3];
+} FILE_COMPRESSION_INFORMATION, *PFILE_COMPRESSION_INFORMATION;
+
+typedef struct _FILE_POSITION_INFORMATION
+{
+  LARGE_INTEGER CurrentByteOffset;
+} FILE_POSITION_INFORMATION, *PFILE_POSITION_INFORMATION;
+
+typedef struct _FILE_DISPOSITION_INFORMATION
+{
+    BOOLEAN DeleteFile;
+} FILE_DISPOSITION_INFORMATION, *PFILE_DISPOSITION_INFORMATION;
+
+typedef struct _FILE_FULL_EA_INFORMATION
+{
+    ULONG NextEntryOffset;
+    UCHAR Flags;
+    UCHAR EaNameLength;
+    USHORT EaValueLength;
+    CHAR EaName[1];
+} FILE_FULL_EA_INFORMATION, *PFILE_FULL_EA_INFORMATION;
+
+typedef struct _FILE_QUOTA_INFORMATION
+{
+    ULONG NextEntryOffset;
+    ULONG SidLength;
+    LARGE_INTEGER ChangeTime;
+    LARGE_INTEGER QuotaUsed;
+    LARGE_INTEGER QuotaThreshold;
+    LARGE_INTEGER QuotaLimit;
+    SID Sid;
+} FILE_QUOTA_INFORMATION, *PFILE_QUOTA_INFORMATION;
+
+typedef struct _FILE_INTERNAL_INFORMATION
+{
+    LARGE_INTEGER IndexNumber;
+} FILE_INTERNAL_INFORMATION, *PFILE_INTERNAL_INFORMATION;
+
+typedef struct _FILE_RENAME_INFORMATION
+{
+    BOOLEAN ReplaceIfExists;
+    HANDLE  RootDirectory;
+    ULONG FileNameLength;
+    WCHAR FileName[1];
+} FILE_RENAME_INFORMATION, *PFILE_RENAME_INFORMATION;
+
+typedef struct _FILE_PIPE_INFORMATION
+{
+    ULONG ReadMode;
+    ULONG CompletionMode;
+} FILE_PIPE_INFORMATION, *PFILE_PIPE_INFORMATION;
+
+typedef struct _FILE_PIPE_LOCAL_INFORMATION
+{
+    ULONG NamedPipeType;
+    ULONG NamedPipeConfiguration;
+    ULONG MaximumInstances;
+    ULONG CurrentInstances;
+    ULONG InboundQuota;
+    ULONG ReadDataAvailable;
+    ULONG OutboundQuota;
+    ULONG WriteQuotaAvailable;
+    ULONG NamedPipeState;
+    ULONG NamedPipeEnd;
+} FILE_PIPE_LOCAL_INFORMATION, *PFILE_PIPE_LOCAL_INFORMATION;
+
+typedef struct _FILE_PIPE_REMOTE_INFORMATION
+{
+    LARGE_INTEGER CollectDataTime;
+    ULONG MaximumCollectionCount;
+} FILE_PIPE_REMOTE_INFORMATION, *PFILE_PIPE_REMOTE_INFORMATION;
+
+typedef struct _FILE_MAILSLOT_QUERY_INFORMATION
+{
+    ULONG MaximumMessageSize;
+    ULONG MailslotQuota;
+    ULONG NextMessageSize;
+    ULONG MessagesAvailable;
+    LARGE_INTEGER ReadTimeout;
+} FILE_MAILSLOT_QUERY_INFORMATION, *PFILE_MAILSLOT_QUERY_INFORMATION;
+
+typedef struct _FILE_MAILSLOT_SET_INFORMATION
+{
+    LARGE_INTEGER ReadTimeout;
+} FILE_MAILSLOT_SET_INFORMATION, *PFILE_MAILSLOT_SET_INFORMATION;
+
+typedef struct _FILE_BOTH_DIR_INFORMATION
+{
+    ULONG NextEntryOffset;
+    ULONG FileIndex;
+    LARGE_INTEGER CreationTime;
+    LARGE_INTEGER LastAccessTime;
+    LARGE_INTEGER LastWriteTime;
+    LARGE_INTEGER ChangeTime;
+    LARGE_INTEGER EndOfFile;
+    LARGE_INTEGER AllocationSize;
+    ULONG FileAttributes;
+    ULONG FileNameLength;
+    ULONG EaSize;
+    CCHAR ShortNameLength;
+    WCHAR ShortName[12];
+    WCHAR FileName[1];
+} FILE_BOTH_DIR_INFORMATION, *PFILE_BOTH_DIR_INFORMATION;
+
+typedef struct _FILE_COMPLETION_INFORMATION
+{
+    HANDLE Port;
+    PVOID Key;
+} FILE_COMPLETION_INFORMATION, *PFILE_COMPLETION_INFORMATION;
+
+typedef struct _FILE_LINK_INFORMATION
+{
+    BOOLEAN ReplaceIfExists;
+    HANDLE RootDirectory;
+    ULONG FileNameLength;
+    WCHAR FileName[1];
+} FILE_LINK_INFORMATION, *PFILE_LINK_INFORMATION;
+
+typedef struct _FILE_NAME_INFORMATION
+{
+    ULONG FileNameLength;
+    WCHAR FileName[1];
+} FILE_NAME_INFORMATION, *PFILE_NAME_INFORMATION;
+
+typedef struct _FILE_ALLOCATION_INFORMATION
+{
+    LARGE_INTEGER AllocationSize;
+} FILE_ALLOCATION_INFORMATION, *PFILE_ALLOCATION_INFORMATION;
+
+typedef struct _FILE_END_OF_FILE_INFORMATION
+{
+    LARGE_INTEGER EndOfFile;
+} FILE_END_OF_FILE_INFORMATION, *PFILE_END_OF_FILE_INFORMATION;
+
+typedef struct _FILE_VALID_DATA_LENGTH_INFORMATION
+{
+    LARGE_INTEGER ValidDataLength;
+} FILE_VALID_DATA_LENGTH_INFORMATION, *PFILE_VALID_DATA_LENGTH_INFORMATION;
+
+typedef struct _FILE_FS_DEVICE_INFORMATION
+{
+    DEVICE_TYPE DeviceType;
+    ULONG Characteristics;
+} FILE_FS_DEVICE_INFORMATION, *PFILE_FS_DEVICE_INFORMATION;
+
+typedef struct _FILE_FS_ATTRIBUTE_INFORMATION
+{
+    ULONG FileSystemAttributes;
+    ULONG MaximumComponentNameLength;
+    ULONG FileSystemNameLength;
+    WCHAR FileSystemName[1];
+} FILE_FS_ATTRIBUTE_INFORMATION, *PFILE_FS_ATTRIBUTE_INFORMATION;
+
+typedef struct _FILE_FS_SIZE_INFORMATION
+{
+    LARGE_INTEGER TotalAllocationUnits;
+    LARGE_INTEGER AvailableAllocationUnits;
+    ULONG SectorsPerAllocationUnit;
+    ULONG BytesPerSector;
+} FILE_FS_SIZE_INFORMATION, *PFILE_FS_SIZE_INFORMATION;
+
+typedef struct _FILE_FS_LABEL_INFORMATION
+{
+    ULONG VolumeLabelLength;
+    WCHAR VolumeLabel[1];
+} FILE_FS_LABEL_INFORMATION, *PFILE_FS_LABEL_INFORMATION;
+
+typedef struct _FILE_FS_VOLUME_INFORMATION
+{
+    LARGE_INTEGER VolumeCreationTime;
+    ULONG VolumeSerialNumber;
+    ULONG VolumeLabelLength;
+    BOOLEAN SupportsObjects;
+    WCHAR VolumeLabel[1];
+} FILE_FS_VOLUME_INFORMATION, *PFILE_FS_VOLUME_INFORMATION;
+
+typedef struct _FILE_PIPE_WAIT_FOR_BUFFER
+{
+    LARGE_INTEGER Timeout;
+    ULONG NameLength;
+    BOOLEAN TimeoutSpecified;
+    WCHAR Name[1];
+} FILE_PIPE_WAIT_FOR_BUFFER, *PFILE_PIPE_WAIT_FOR_BUFFER;
+
+typedef struct _FILE_PIPE_PEEK_BUFFER
+{
+    ULONG NamedPipeState;
+    ULONG ReadDataAvailable;
+    ULONG NumberOfMessages;
+    ULONG MessageLength;
+    CHAR Data[1];
+} FILE_PIPE_PEEK_BUFFER, *PFILE_PIPE_PEEK_BUFFER;
+
+typedef struct _IO_STATUS_BLOCK
+{
+    union
+    {
+        NTSTATUS  Status;
+        PVOID  Pointer;
+    };
+    ULONG_PTR  Information;
+} IO_STATUS_BLOCK, *PIO_STATUS_BLOCK;
+
+typedef struct _IO_ERROR_LOG_PACKET
+{
+    UCHAR MajorFunctionCode;
+    UCHAR RetryCount;
+    USHORT DumpDataSize;
+    USHORT NumberOfStrings;
+    USHORT StringOffset;
+    USHORT EventCategory;
+    NTSTATUS ErrorCode;
+    ULONG UniqueErrorValue;
+    NTSTATUS FinalStatus;
+    ULONG SequenceNumber;
+    ULONG IoControlCode;
+    LARGE_INTEGER DeviceOffset;
+    ULONG DumpData[1];
+}IO_ERROR_LOG_PACKET, *PIO_ERROR_LOG_PACKET;
+
+typedef struct _IO_ERROR_LOG_MESSAGE
+{
+    USHORT Type;
+    USHORT Size;
+    USHORT DriverNameLength;
+    LARGE_INTEGER TimeStamp;
+    ULONG DriverNameOffset;
+    IO_ERROR_LOG_PACKET EntryData;
+} IO_ERROR_LOG_MESSAGE, *PIO_ERROR_LOG_MESSAGE;
+#endif
+
 typedef struct _MAILSLOT_CREATE_PARAMETERS
 {
     ULONG           MailslotQuota;
@@ -115,6 +537,7 @@
     BOOLEAN         TimeoutSpecified;
 } NAMED_PIPE_CREATE_PARAMETERS, *PNAMED_PIPE_CREATE_PARAMETERS;
 
+#ifndef NTOS_MODE_USER
 typedef struct _IO_TIMER
 {
     USHORT Type;
@@ -127,52 +550,33 @@
 
 typedef struct _DEVICE_NODE
 {
-    /* A tree structure. */
     struct _DEVICE_NODE *Parent;
     struct _DEVICE_NODE *PrevSibling;
     struct _DEVICE_NODE *NextSibling;
     struct _DEVICE_NODE *Child;
-    /* The level of deepness in the tree. */
     UINT Level;
-    PPO_DEVICE_NOTIFY Notify;
-    /* State machine. */
+    struct _PO_DEVICE_NOTIFY *Notify;
     PNP_DEVNODE_STATE State;
     PNP_DEVNODE_STATE PreviousState;
     PNP_DEVNODE_STATE StateHistory[20];
     UINT StateHistoryEntry;
-    /* ? */
     INT CompletionStatus;
-    /* ? */
     PIRP PendingIrp;
-    /* See DNF_* flags below (WinDBG documentation has WRONG values) */
     ULONG Flags;
-    /* See DNUF_* flags below (and IRP_MN_QUERY_PNP_DEVICE_STATE) */
     ULONG UserFlags;
-    /* See CM_PROB_* values are defined in cfg.h */
     ULONG Problem;
-    /* Pointer to the PDO corresponding to the device node. */
     PDEVICE_OBJECT PhysicalDeviceObject;
-    /* Resource list as assigned by the PnP arbiter. See IRP_MN_START_DEVICE
-       and ARBITER_INTERFACE (not documented in DDK, but present in headers). */
     PCM_RESOURCE_LIST ResourceList;
-    /* Resource list as assigned by the PnP arbiter (translated version). */
     PCM_RESOURCE_LIST ResourceListTranslated;
-    /* Instance path relative to the Enum key in registry. */
     UNICODE_STRING InstancePath;
-    /* Name of the driver service. */
     UNICODE_STRING ServiceName;
-    /* ? */
     PDEVICE_OBJECT DuplicatePDO;
-    /* See IRP_MN_QUERY_RESOURCE_REQUIREMENTS. */
     PIO_RESOURCE_REQUIREMENTS_LIST ResourceRequirements;
-    /* Information about bus for bus drivers. */
     INTERFACE_TYPE InterfaceType;
     ULONG BusNumber;
-    /* Information about underlying bus for child devices. */
     INTERFACE_TYPE ChildInterfaceType;
     ULONG ChildBusNumber;
     USHORT ChildBusTypeIndex;
-    /* ? */
     UCHAR RemovalPolicy;
     UCHAR HardwareRemovalPolicy;
     LIST_ENTRY TargetDeviceNotify;
@@ -191,9 +595,7 @@
     {
         struct _DEVICE_NODE *NextResourceDeviceNode;
     } OverUsed2;
-    /* See IRP_MN_QUERY_RESOURCES/IRP_MN_FILTER_RESOURCES. */
     PCM_RESOURCE_LIST BootResources;
-    /* See the bitfields in DEVICE_CAPABILITIES structure. */
     ULONG CapabilityFlags;
     struct
     {
@@ -245,6 +647,77 @@
     PVOID ClientIdentificationAddress;
     CHAR Extension[1];
 } PRIVATE_DRIVER_EXTENSIONS, *PPRIVATE_DRIVER_EXTENSIONS;
+#endif
 
+/* FUNCTION TYPES ************************************************************/
+
+typedef VOID
+(NTAPI *PIO_APC_ROUTINE)(
+    IN PVOID ApcContext,
+    IN PIO_STATUS_BLOCK IoStatusBlock,
+    IN ULONG Reserved);
+
+/* I/O CONTROL CODES *********************************************************/
+
+#ifdef NTOS_MODE_USER
+/* Mailslots */
+#define FSCTL_MAILSLOT_PEEK             \
+    CTL_CODE(FILE_DEVICE_MAILSLOT, 0, METHOD_NEITHER, FILE_READ_DATA)
+
+/* Pipes */
+#define FSCTL_PIPE_ASSIGN_EVENT         \
+    CTL_CODE(FILE_DEVICE_NAMED_PIPE, 0, METHOD_BUFFERED, FILE_ANY_ACCESS)
[truncated at 1000 lines; 2891 more skipped]