This commit was generated by cvs2svn to compensate for changes in r10,
authorRex Jolliff <rex@lvcablemodem.com>
Tue, 25 Aug 1998 04:27:41 +0000 (04:27 +0000)
committerRex Jolliff <rex@lvcablemodem.com>
Tue, 25 Aug 1998 04:27:41 +0000 (04:27 +0000)
which included commits to RCS files with non-trunk default branches.

svn path=/trunk/; revision=11

57 files changed:
reactos/boot.bat
reactos/doc/api.txt
reactos/doc/faq.txt
reactos/doc/internal/pe.txt
reactos/include/base.h
reactos/include/coff.h
reactos/include/ddk/defines.h
reactos/include/ddk/exfuncs.h
reactos/include/ddk/extypes.h
reactos/include/ddk/iofuncs.h
reactos/include/ddk/iotypes.h
reactos/include/ddk/kefuncs.h
reactos/include/ddk/ketypes.h
reactos/include/ddk/mmfuncs.h
reactos/include/ddk/mmtypes.h
reactos/include/ddk/ntddk.h
reactos/include/ddk/obtypes.h
reactos/include/ddk/psfuncs.h
reactos/include/ddk/pstypes.h
reactos/include/ddk/rtl.h
reactos/include/ddk/structs.h
reactos/include/ddk/types.h
reactos/include/ddk/zw.h
reactos/include/funcs.h
reactos/include/internal/ctype.h
reactos/include/internal/debug.h
reactos/include/internal/hal/ddk.h
reactos/include/internal/hal/hal.h
reactos/include/internal/hal/page.h
reactos/include/internal/iomgr.h
reactos/include/internal/kernel.h
reactos/include/internal/mm.h
reactos/include/internal/module.h
reactos/include/internal/objmgr.h
reactos/include/internal/pool.h
reactos/include/internal/psmgr.h
reactos/include/internal/version.h
reactos/include/ntdll/pagesize.h
reactos/include/types.h
reactos/include/windows.h
reactos/include/wstring.h
reactos/lib/kernel32/mem/global.cc
reactos/lib/kernel32/mem/local.c
reactos/lib/kernel32/thread/thread.c
reactos/lib/ntdll/genntdll
reactos/lib/ntdll/genntdll.c
reactos/loaders/boot/boot.bin
reactos/loaders/boot/boot.inc
reactos/loaders/boot/boot.map
reactos/loaders/boot/osldr.asm
reactos/loaders/boot/osldr.bin
reactos/loaders/boot/osldr.txt
reactos/loaders/dos/loadros.asm
reactos/loaders/dos/loadros.com
reactos/makefile.dos
reactos/readme_rex
reactos/rules.mak

index f85739b..513c107 100644 (file)
@@ -1 +1 @@
-loaders\dos\loadros kernel\kimage.bin %1 %2 %3 %4\r
+loaders\dos\loadros ntoskrnl\kimage.bin %1 %2 %3 %4
index 379023f..4dd8408 100644 (file)
-This file attempts to document the functions made publically available by\r
-the various subsystems.\r
-\r
-* Formatted I/O operations *\r
-\r
-NAME: int vsprintf(char *buf, const char *fmt, va_list args)\r
-NAME: int sprintf(char* buf, const char* fmt, ...)\r
-WHERE: internal/kernel.h\r
-FUNCTION: The same as the standard c library versions\r
-\r
-* PIO operations *\r
-\r
-NAME: in[b/w/l](port)\r
-WHERE: internal/io.h\r
-FUNCTION: Read an IO port of the specified size (byte/word or long)\r
-RETURNS: The value read\r
-\r
-NAME: out[b/w/l](port,val)\r
-WHERE: internal/io.h\r
-FUNCTION: Write an IO port of the specified size (byte/word or long)\r
-\r
-NAME: in_p[b/w/l](port)\r
-WHERE: internal/io.h\r
-FUNCTION: Read an IO port of the specified size (byte/word or long) with\r
-        a pause\r
-RETURNS: The value read\r
-\r
-NAME: out_p[b/w/l](port,val)\r
-WHERE: internal/io.h\r
-FUNCTION: Write an IO port of the specified size (byte/word or long) with\r
-        a pause\r
-\r
-* Bit operations *\r
-\r
-NAME: int set_bit(int nr, void* addr)\r
-NAME: int clear_bit(int nr, void* addr)\r
-NAME: int change_bit(int nr, void* addr)\r
-WHERE: internal/bitops.h>\r
-FUNCTION: Operate on a bit in the word pointed to by addr\r
-RETURN: 0 if the bit was cleared before the operations\r
-        non-zero otherwise\r
-\r
-* Debugging functions *\r
-\r
-NAME: DPRINT(fmt,....)\r
-WHERE: internal/debug.h\r
-FUNCTION: Outputs a string to the console if NDEBUG isn't defined before\r
-including internal/debug.h, a NOP otherwise\r
-ARGUMENTS: The same as printf\r
-\r
-NAME: printk\r
-WHERE: internal/kernel.h\r
-FUNCTION: Outputs a string to the console\r
-ARGUMENTS: The same as printf\r
-\r
-* Memory managment functions *\r
-\r
-NAME: unsigned int physical_to_linear(unsigned int paddr)\r
-WHERE: hal/page.h\r
-FUNCTION: Converts a physical address to a linear one\r
-RECEIVES:\r
-        paddr = the physical address to convert\r
-RETURNS: A virtual address where the memory at that physical address can be \r
-accessed\r
-\r
-NAME: void* ExAllocatePool(unsigned int size, unsigned int type = 0);\r
-WHERE: internal/pool.h\r
-FUNCTION: Allocates a block of memory\r
-RECEIVES:\r
-        size = the size of the block to allocate\r
-        type = will be whether to allocate pagable memory\r
-RETURNS: The address of the block\r
-NOTE: This isn't interrupt safe\r
-\r
-NAME: void ExFreePool(void* block)\r
-WHERE: internal/pool.h\r
-FUNCTION: Frees a block of memory\r
-\r
-NAME: void free_page(unsigned int physical_base, unsigned int nr = 1)\r
-WHERE: internal/mm.h\r
-FUNCTION: Adds a continuous range of physical memory to the free list\r
-\r
-NAME: unsigned int get_free_page(void)\r
-WHERE: internal/mm.h\r
-FUNCTION: Gets a free page\r
-RETURNS: Its physical address\r
-\r
-NAME: unsigned int get_page_physical_address(unsigned int vaddr)\r
-WHERE: internal/mm.h\r
-FUNCTION: Gets the physical address of a page\r
-\r
-NAME: void mark_page_not_writable(unsigned int vaddr)\r
-WHERE: internal/mm.h\r
-FUNCTION: Prevent writing the page\r
-\r
-* DMA functions *\r
-\r
-NAME: unsigned int get_dma_page(unsigned int max_address)\r
-WHERE: internal/mm.h\r
-FUNCTION: Gets a page with a restricted physical address i.e. suitable for\r
-          dma\r
-RETURNS: The physical address of the page\r
-\r
-NAME: void disable_dma(unsigned int dmanr)\r
-WHERE:    internal/dma.h\r
-FUNCTION: Disables the specified dma channel\r
-\r
-NAME: void enable_dma(unsigned int dmanr)\r
-WHERE:    internal/dma.h\r
-FUNCTION: Enables the specified dma channel\r
-\r
-NAME: void clear_dma_ff(unsigned int dmanr)\r
-WHERE: internal/dma.h\r
-FUNCTION: Clear the dma flip-flop\r
-\r
-NAME: void set_dma_mode(unsigned int dmanr, char mode)\r
-WHERE: internal/dma.h\r
-FUNCTION: Sets the type of dma transfer\r
-\r
-NAME: void set_dma_page(unsigned int dmanr, char pagenr)\r
-WHERE: internal/dma.h\r
-FUNCTION: Set only the page register bits of the transfer address\r
-\r
-NAME: void set_dma_addr(unsigned int dmanr, unsigned int a)\r
-WHERE: internal/dma.h\r
-FUNCTION: Set the transfer address for dma\r
-NOTE: Assumes flip-flop is clear\r
-\r
-NAME: void set_dma_count(unsigned int dmanr, unsigned int count)\r
-WHERE: internal/dma.h\r
-FUNCTION: Sets the size of the transfer\r
-ARGUMENTS:\r
-        count = the number of bytes to transfer\r
-NOTE: Count must be even for channels 5-7\r
-\r
-NAME: int get_dma_residue(unsigned int dmanr)\r
-WHERE: internal/dma.h\r
-FUNCTION: Gets the residue remaining after a dma transfer on the channel\r
-\r
-\r
+This file attempts to document the functions made publically available by
+the various subsystems.
+
+* Formatted I/O operations *
+
+NAME: int vsprintf(char *buf, const char *fmt, va_list args)
+NAME: int sprintf(char* buf, const char* fmt, ...)
+WHERE: internal/kernel.h
+FUNCTION: The same as the standard c library versions
+
+* PIO operations *
+
+NAME: in[b/w/l](port)
+WHERE: internal/io.h
+FUNCTION: Read an IO port of the specified size (byte/word or long)
+RETURNS: The value read
+
+NAME: out[b/w/l](port,val)
+WHERE: internal/io.h
+FUNCTION: Write an IO port of the specified size (byte/word or long)
+
+NAME: in_p[b/w/l](port)
+WHERE: internal/io.h
+FUNCTION: Read an IO port of the specified size (byte/word or long) with
+        a pause
+RETURNS: The value read
+
+NAME: out_p[b/w/l](port,val)
+WHERE: internal/io.h
+FUNCTION: Write an IO port of the specified size (byte/word or long) with
+        a pause
+
+* Bit operations *
+
+NAME: int set_bit(int nr, void* addr)
+NAME: int clear_bit(int nr, void* addr)
+NAME: int change_bit(int nr, void* addr)
+WHERE: internal/bitops.h>
+FUNCTION: Operate on a bit in the word pointed to by addr
+RETURN: 0 if the bit was cleared before the operations
+        non-zero otherwise
+
+* Debugging functions *
+
+NAME: DPRINT(fmt,....)
+WHERE: internal/debug.h
+FUNCTION: Outputs a string to the console if NDEBUG isn't defined before
+including internal/debug.h, a NOP otherwise
+ARGUMENTS: The same as printf
+
+NAME: printk
+WHERE: internal/kernel.h
+FUNCTION: Outputs a string to the console
+ARGUMENTS: The same as printf
+
+* Memory managment functions *
+
+NAME: unsigned int physical_to_linear(unsigned int paddr)
+WHERE: hal/page.h
+FUNCTION: Converts a physical address to a linear one
+RECEIVES:
+        paddr = the physical address to convert
+RETURNS: A virtual address where the memory at that physical address can be 
+accessed
+
+NAME: void* ExAllocatePool(unsigned int size, unsigned int type = 0);
+WHERE: internal/pool.h
+FUNCTION: Allocates a block of memory
+RECEIVES:
+        size = the size of the block to allocate
+        type = will be whether to allocate pagable memory
+RETURNS: The address of the block
+NOTE: This isn't interrupt safe
+
+NAME: void ExFreePool(void* block)
+WHERE: internal/pool.h
+FUNCTION: Frees a block of memory
+
+NAME: void free_page(unsigned int physical_base, unsigned int nr = 1)
+WHERE: internal/mm.h
+FUNCTION: Adds a continuous range of physical memory to the free list
+
+NAME: unsigned int get_free_page(void)
+WHERE: internal/mm.h
+FUNCTION: Gets a free page
+RETURNS: Its physical address
+
+NAME: unsigned int get_page_physical_address(unsigned int vaddr)
+WHERE: internal/mm.h
+FUNCTION: Gets the physical address of a page
+
+NAME: void mark_page_not_writable(unsigned int vaddr)
+WHERE: internal/mm.h
+FUNCTION: Prevent writing the page
+
+* DMA functions *
+
+NAME: unsigned int get_dma_page(unsigned int max_address)
+WHERE: internal/mm.h
+FUNCTION: Gets a page with a restricted physical address i.e. suitable for
+          dma
+RETURNS: The physical address of the page
+
+NAME: void disable_dma(unsigned int dmanr)
+WHERE:    internal/dma.h
+FUNCTION: Disables the specified dma channel
+
+NAME: void enable_dma(unsigned int dmanr)
+WHERE:    internal/dma.h
+FUNCTION: Enables the specified dma channel
+
+NAME: void clear_dma_ff(unsigned int dmanr)
+WHERE: internal/dma.h
+FUNCTION: Clear the dma flip-flop
+
+NAME: void set_dma_mode(unsigned int dmanr, char mode)
+WHERE: internal/dma.h
+FUNCTION: Sets the type of dma transfer
+
+NAME: void set_dma_page(unsigned int dmanr, char pagenr)
+WHERE: internal/dma.h
+FUNCTION: Set only the page register bits of the transfer address
+
+NAME: void set_dma_addr(unsigned int dmanr, unsigned int a)
+WHERE: internal/dma.h
+FUNCTION: Set the transfer address for dma
+NOTE: Assumes flip-flop is clear
+
+NAME: void set_dma_count(unsigned int dmanr, unsigned int count)
+WHERE: internal/dma.h
+FUNCTION: Sets the size of the transfer
+ARGUMENTS:
+        count = the number of bytes to transfer
+NOTE: Count must be even for channels 5-7
+
+NAME: int get_dma_residue(unsigned int dmanr)
+WHERE: internal/dma.h
+FUNCTION: Gets the residue remaining after a dma transfer on the channel
+
+
index 69b3e10..1fe8c22 100644 (file)
-Kernel Development FAQ (for v0.0.7)\r
-\r
-This attempts to answer some of the common questions people developing for\r
-the kernel might want to ask (or at least what I think they should ask).\r
-Obviously I can only detail those parts which I have written so other\r
-developers please fill in the gaps.\r
-\r
-Q: What is this, what are you people, what's going on\r
-A: This is the ReactOS, an operating system intended as a clone of windows\r
-NT. See the project website (http://www.sid-dis.com/reactos/) for more details.\r
-\r
-Q: Why ReactOS\r
-A: To condemn Bill Gates to penury.\r
-\r
-Q: What do I need to compile the kernel\r
-A: DJGPP, get it from http://www.delorie.com/djgpp\r
-\r
-Q: How do I compile the kernel\r
-A: Unpack the zip. It is important not to install the kernel in the same\r
-directory as a previous version, this has caused a bit of confusion in the \r
-past. Edit the makefile in the top level directory, in particular select the\r
-correct host to build from. Then run make in the top directory\r
-\r
-Q: What files are created when I make the kernel\r
-A: The following files are created in the kernel directory\r
-        kimage = the kernel as a coff executable\r
-        kimage.bin = the kernel as a raw binary image\r
-        kernel.sym = a list of the kernel symbols\r
-\r
-Q: How do I load the kernel\r
-A: Run the boot.bat batch file.\r
-\r
-Q: Does it boot from disk\r
-A: Not at the moment.\r
-\r
-Q: When I run the kernel it crashes\r
-A: The kernel (at the moment) can only be loaded from a clean system. That\r
-is one without EMM386 or any version of windows loaded. A quick way to\r
-ensure this (if you have windows 95) is to set the program to run in msdos\r
-mode and specify an empty config.sys and autoexec.bat. See the windows help\r
-for more information.\r
-\r
-If you do that and the problem persists then contact the kernel team\r
-(ros-kernel@sid-dis.com) as it is probably a bug in the kernel \r
-\r
-Q6: How do I load a module with the kernel\r
-A: Add the names of any modules to be loaded to the command line of boot.bat.\r
-\r
-Q7: I want to add code to the kernel, how do I get it to be compiled\r
-A: You will need to edit the Makefile in kernel directory. There should be\r
-a statement like this \r
-\r
-    OBJECTS = hal/head.o hal/exp.o kernel/vsprintf.o \\r
-              ....\r
-             kernel/irqhand.o hal/page.o mm/virtual.o kernel/error.o \\r
-             kernel/exports.o kernel/module.o\r
-\r
-Add the name of the object file (the file produced when your code is\r
-compiled) to the end of the statement (in this case after kernel/module.o).\r
-If you need to go onto a new line then add a slash to the end of the\r
-previous line. It is also very important to use an editor which preserves\r
-tabs.\r
-\r
-Q8: I want to add code to the kernel, how do I make it official\r
-A: Contact the kernel mailing list ros-kernel@sid-dis.com or our coordinator\r
-dwinkley@whitworth.edu. If it is for a specific section then the kernel\r
-website (http://www.geocities.com/SiliconValley/Peaks/1957) has a list of\r
-those working on individual areas, you might what to contact one of them\r
-instead.\r
-\r
-Q9: What header files should I use\r
-A: Don't include the usual DJGPP headers like stdio.h unless you are using\r
-something compiler based like stdargs.h. To use the DJGPP headers requires\r
-linking with libc which is useless in kernel mode.\r
-\r
-All the header files are in the top-level include directory which is laid\r
-out like this\r
-         include  = general win32 api declarations\r
-        include/internal = private kernel headers\r
-        include/internal/hal = HAL headers\r
-        include/ddk = header files with declarations for modules\r
-\r
-There should be a file called api.txt which documents all of the functions\r
-(and which header files they need).\r
-\r
-Q11: I want to export my function for modules to use, how do I do that\r
-A: Add the function to the list in kernel/exports.lst, then remake the\r
-kernel. Note the function must be declared as extern "C".\r
-\r
-Q12: I want to make my functions part of the kernel interface to user mode,\r
-A: That section isn't finished yet, though it will probably mean adding a\r
-pointer to the function and the size of its parameters to a internal table\r
-somewhere.\r
-\r
-Q14: I want to write a module, what are the guidelines\r
-A: See modules.txt in this directory\r
-\r
-Q15: I want to write an ISR (interrupt service routine)\r
-A: See irq.txt in this directory\r
-\r
-Q16: I want to use DMA\r
-A: Firstly this answer covers only DMA via the dma chips *not*\r
-busmaster DMA.\r
-\r
-To program the dma chip use the functions in internal/dma.h (look in api.txt\r
-for details). PC DMA can only go to memory with a physical address below\r
-1mb (or 16mb on some systems), use the get_dma_page to allocate this kind\r
-of memory.\r
-\r
-Q17: You haven't answered my question\r
-A: Send your questions to ros-kernel@sid-dis.com\r
-\r
-\r
-- David Welch (welch@mcmail.com)\r
+Kernel Development FAQ (for v0.0.7)
+
+This attempts to answer some of the common questions people developing for
+the kernel might want to ask (or at least what I think they should ask).
+Obviously I can only detail those parts which I have written so other
+developers please fill in the gaps.
+
+Q: What is this, what are you people, what's going on
+A: This is the ReactOS, an operating system intended as a clone of windows
+NT. See the project website (http://www.sid-dis.com/reactos/) for more details.
+
+Q: Why ReactOS
+A: To condemn Bill Gates to penury.
+
+Q: What do I need to compile the kernel
+A: DJGPP, get it from http://www.delorie.com/djgpp
+
+Q: How do I compile the kernel
+A: Unpack the zip. It is important not to install the kernel in the same
+directory as a previous version, this has caused a bit of confusion in the 
+past. Edit the makefile in the top level directory, in particular select the
+correct host to build from. Then run make in the top directory
+
+Q: What files are created when I make the kernel
+A: The following files are created in the kernel directory
+        kimage = the kernel as a coff executable
+        kimage.bin = the kernel as a raw binary image
+        kernel.sym = a list of the kernel symbols
+
+Q: How do I load the kernel
+A: Run the boot.bat batch file.
+
+Q: Does it boot from disk
+A: Not at the moment.
+
+Q: When I run the kernel it crashes
+A: The kernel (at the moment) can only be loaded from a clean system. That
+is one without EMM386 or any version of windows loaded. A quick way to
+ensure this (if you have windows 95) is to set the program to run in msdos
+mode and specify an empty config.sys and autoexec.bat. See the windows help
+for more information.
+
+If you do that and the problem persists then contact the kernel team
+(ros-kernel@sid-dis.com) as it is probably a bug in the kernel 
+
+Q6: How do I load a module with the kernel
+A: Add the names of any modules to be loaded to the command line of boot.bat.
+
+Q7: I want to add code to the kernel, how do I get it to be compiled
+A: You will need to edit the Makefile in kernel directory. There should be
+a statement like this 
+
+    OBJECTS = hal/head.o hal/exp.o kernel/vsprintf.o \
+              ....
+             kernel/irqhand.o hal/page.o mm/virtual.o kernel/error.o \
+             kernel/exports.o kernel/module.o
+
+Add the name of the object file (the file produced when your code is
+compiled) to the end of the statement (in this case after kernel/module.o).
+If you need to go onto a new line then add a slash to the end of the
+previous line. It is also very important to use an editor which preserves
+tabs.
+
+Q8: I want to add code to the kernel, how do I make it official
+A: Contact the kernel mailing list ros-kernel@sid-dis.com or our coordinator
+dwinkley@whitworth.edu. If it is for a specific section then the kernel
+website (http://www.geocities.com/SiliconValley/Peaks/1957) has a list of
+those working on individual areas, you might what to contact one of them
+instead.
+
+Q9: What header files should I use
+A: Don't include the usual DJGPP headers like stdio.h unless you are using
+something compiler based like stdargs.h. To use the DJGPP headers requires
+linking with libc which is useless in kernel mode.
+
+All the header files are in the top-level include directory which is laid
+out like this
+         include  = general win32 api declarations
+        include/internal = private kernel headers
+        include/internal/hal = HAL headers
+        include/ddk = header files with declarations for modules
+
+There should be a file called api.txt which documents all of the functions
+(and which header files they need).
+
+Q11: I want to export my function for modules to use, how do I do that
+A: Add the function to the list in kernel/exports.lst, then remake the
+kernel. Note the function must be declared as extern "C".
+
+Q12: I want to make my functions part of the kernel interface to user mode,
+A: That section isn't finished yet, though it will probably mean adding a
+pointer to the function and the size of its parameters to a internal table
+somewhere.
+
+Q14: I want to write a module, what are the guidelines
+A: See modules.txt in this directory
+
+Q15: I want to write an ISR (interrupt service routine)
+A: See irq.txt in this directory
+
+Q16: I want to use DMA
+A: Firstly this answer covers only DMA via the dma chips *not*
+busmaster DMA.
+
+To program the dma chip use the functions in internal/dma.h (look in api.txt
+for details). PC DMA can only go to memory with a physical address below
+1mb (or 16mb on some systems), use the get_dma_page to allocate this kind
+of memory.
+
+Q17: You haven't answered my question
+A: Send your questions to ros-kernel@sid-dis.com
+
+
+- David Welch (welch@mcmail.com)
index 69e19e4..aeafa65 100644 (file)
-\r
- PORTABLE EXECUTABLE FORMAT\r
-\r
- Author:  Micheal J. O'Leary\r
-\r
-\r
- Preface\r
\r
- This document was edited and released by Microsoft Developer\r
- Support. It describes the binary portable executable format for NT.\r
- The information is provided at this point because we feel it will\r
- make the work of application development easier. Unfortunately, the\r
- information in this document may change before the final release of\r
- Windows NT. Microsoft is NOT committing to stay with these formats\r
- by releasing this document. Questions or follow-ups for any of the\r
- information presented here should be posted to CompuServe MSWIN32\r
- forum, section 6.\r
-                    --Steve Firebaugh\r
-                      Microsoft Developer Support\r
\r
\r
-\r
-Contents\r
-\r
- 1. Overview\r
-\r
- 2. PE Header\r
-\r
- 3. Object Table\r
-\r
- 4. Image Pages\r
-\r
- 5. Exports\r
-   5.1 Export Directory Table\r
-   5.2 Export Address Table\r
-   5.3 Export Name Table Pointers\r
-   5.4 Export Ordinal Table\r
-   5.5 Export Name Table\r
-\r
- 6. Imports\r
-   6.1 Import Directory Table\r
-   6.2 Import Lookup Table\r
-   6.3 Hint-Name Table\r
-   6.4 Import Address Table\r
-\r
- 7. Thread Local Storage\r
-   7.1 Thread Local Storage Directory Table\r
-   7.2 Thread Local Storage CallBack Table\r
-\r
- 8. Resources\r
-   8.1 Resource Directory Table\r
-   8.2 Resource Example\r
-\r
- 9. Fixup Table\r
-   9.1 Fixup Block\r
-\r
- 10. Debug Information\r
-   10.1 Debug Directory\r
-\r
-\r
-\r
-1. Overview\r
-\r
-    ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿  <ÄÄ¿ <ÄÄÄÄÄ Base of Image Header\r
-    ³ DOS 2 Compatible ³     ³\r
-    ³    EXE Header    ³     ³\r
-    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´     ³\r
-    ³      unused      ³     ³\r
-    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´     ³\r
-    ³  OEM Identifier  ³     ³\r
-    ³  OEM Info        ³     ³\r
-    ³                  ³     ³   DOS 2.0 Section\r
-    ³    Offset to     ³     ³   (for DOS compatibility only)\r
-    ³    PE Header     ³     ³\r
-    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´     ³\r
-    ³   DOS 2.0 Stub   ³     ³\r
-    ³   Program &      ³     ³\r
-    ³   Reloc. Table   ³     ³\r
-    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´  <ÄÄÙ\r
-    ³      unused      ³\r
-    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´  <ÄÄÄÄÄÄÄÄÄ Aligned on 8 byte boundary\r
-    ³    PE Header     ³\r
-    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\r
-    ³   Object Table   ³\r
-    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\r
-    ³   Image Pages    ³\r
-    ³     import info  ³\r
-    ³     export info  ³\r
-    ³     fixup info   ³\r
-    ³     resource info³\r
-    ³     debug info   ³\r
-    ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\r
-    \r
-Figure 1. A typical 32-bit Portable EXE File Layout\r
-\r
-\r
-\r
-2. PE Header\r
-\r
-    \r
-    ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\r
-    ³      SIGNATURE BYTES      ³  CPU TYPE   ³  # OBJECTS  ³\r
-    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄ´\r
-    ³       TIME/DATE STAMP     ³         RESERVED          ³\r
-    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄ´\r
-    ³          RESERVED         ³  NT HDR SIZE³    FLAGS    ³\r
-    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÂÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄ´\r
-    ³  RESERVED   ³LMAJOR³LMINOR³         RESERVED          ³\r
-    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÁÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\r
-    ³          RESERVED         ³         RESERVED          ³\r
-    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\r
-    ³       ENTRYPOINT RVA      ³         RESERVED          ³\r
-    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\r
-    ³          RESERVED         ³        IMAGE BASE         ³\r
-    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\r
-    ³       OBJECT ALIGN        ³        FILE ALIGN         ³\r
-    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄ´\r
-    ³  OS MAJOR   ³  OS MINOR   ³USER MAJOR   ³USER MINOR   ³\r
-    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄ´\r
-    ³ SUBSYS MAJOR³ SUBSYS MINOR³         RESERVED          ³\r
-    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\r
-    ³        IMAGE SIZE         ³       HEADER SIZE         ³\r
-    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄ´\r
-    ³       FILE CHECKSUM       ³  SUBSYSTEM  ³  DLL FLAGS  ³\r
-    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄ´\r
-    ³   STACK RESERVE SIZE      ³     STACK COMMIT SIZE     ³\r
-    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\r
-    ³   HEAP RESERVE SIZE       ³     HEAP COMMIT SIZE      ³\r
-    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\r
-    ³         RESERVED          ³  # INTERESTING RVA/SIZES  ³\r
-    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\r
-    ³   EXPORT TABLE RVA        ³   TOTAL EXPORT DATA SIZE  ³\r
-    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\r
-    ³   IMPORT TABLE RVA        ³   TOTAL IMPORT DATA SIZE  ³\r
-    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\r
-    ³  RESOURCE TABLE RVA       ³  TOTAL RESOURCE DATA SIZE ³\r
-    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\r
-    ³  EXCEPTION TABLE RVA      ³  TOTAL EXCEPTION DATA SIZE³\r
-    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\r
-    ³  SECURITY TABLE RVA       ³  TOTAL SECURITY DATA SIZE ³\r
-    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\r
-    ³    FIXUP TABLE RVA        ³  TOTAL FIXUP DATA SIZE    ³\r
-    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\r
-    ³    DEBUG TABLE RVA        ³  TOTAL DEBUG DIRECTORIES  ³\r
-    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\r
-    ³  IMAGE DESCRIPTION RVA    ³  TOTAL DESCRIPTION SIZE   ³\r
-    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\r
-    ³   MACHINE SPECIFIC RVA    ³   MACHINE SPECIFIC SIZE   ³\r
-    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\r
-    ³  THREAD LOCAL STORAGE RVA ³      TOTAL TLS SIZE       ³\r
-    ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\r
-    \r
-Figure 2. PE Header\r
-\r
-Notes:\r
-\r
-  o  A VA is a virtual address that is already biased by the Image\r
-     Base found in the PE Header.  A RVA is a virtual address that is\r
-     relative to the Image Base.\r
-     \r
-  o  An RVA in the PE Header which has a value of zero indicates the\r
-     field isn't used.\r
-     \r
-  o  Image pages are aligned and zero padded to a File Align\r
-     boundary.  The bases of all other tables and structures must be\r
-     aligned on DWORD (4 byte) boundary.  Thus, all VA's and RVA's\r
-     must be on a 32 bit boundary. All table and structure fields\r
-     must be aligned on their "natural" boundaries, with the possible\r
-     exception of the Debug Info.\r
-     \r
-SIGNATURE BYTES = DB * 4.\r
-Current value is "PE/0/0". Thats PE followed by two zeros (nulls).\r
-\r
-CPU TYPE = DW CPU Type.\r
-This field specifies the type of CPU compatibility required by this\r
-image to run.  The values are:\r
-\r
-  o  0000h __unknown\r
-     \r
-  o  014Ch __80386\r
-     \r
-  o  014Dh __80486\r
-     \r
-  o  014Eh __80586\r
-     \r
-  o  0162h __MIPS Mark I (R2000, R3000)\r
-     \r
-  o  0163h __MIPS Mark II (R6000)\r
-     \r
-  o  0166h __MIPS Mark III (R4000)\r
-     \r
-# OBJECTS = DW Number of object entries.\r
-This field specifies the number of entries in the Object Table.\r
-\r
-TIME/DATE STAMP = DD Used to store the time and date the file was\r
-created or modified by the linker.\r
-\r
-NT HDR SIZE = DW This is the number of remaining bytes in the NT\r
-header that follow the FLAGS field.\r
-\r
-FLAGS = DW Flag bits for the image.\r
-The flag bits have the following definitons:\r
-\r
-  o  0000h __Program image.\r
-     \r
-  o  0002h __Image is executable.\r
-     If this bit isn't set, then it indicates that either errors\r
-     where detected at link time or that the image is being\r
-     incrementally linked and therefore can't be loaded.\r
-     \r
-  o  0200h __Fixed.\r
-     Indicates that if the image can't be loaded at the Image Base,\r
-     then don't load it.\r
-     \r
-  o  2000h __Library image.\r
-     \r
-LMAJOR/LMINOR = DB Linker major/minor version number.\r
-\r
-ENTRYPOINT RVA = DD Entrypoint relative virtual address.\r
-The address is relative to the Image Base.  The address is the\r
-starting address for program images and the library initialization\r
-and library termination address for library images.\r
-\r
-IMAGE BASE = DD The virtual base of the image.\r
-This will be the virtual address of the first byte of the file (Dos\r
-Header).  This must be a multiple of 64K.\r
-\r
-OBJECT ALIGN = DD The alignment of the objects. This must be a power\r
-of 2 between 512 and 256M inclusive. The default is 64K.\r
-\r
-FILE ALIGN = DD Alignment factor used to align image pages.  The\r
-alignment factor (in bytes) used to align the base of the image pages\r
-and to determine the granularity of per-object trailing zero pad.\r
-Larger alignment factors will cost more file space; smaller alignment\r
-factors will impact demand load performance, perhaps significantly.\r
-Of the two, wasting file space is preferable.  This value should be a\r
-power of 2 between 512 and 64K inclusive.\r
-\r
-OS MAJOR/MINOR = DW OS version number required to run this image.\r
-\r
-USER MAJOR/MINOR # = DW User major/minor version number.\r
-This is useful for differentiating between revisions of\r
-images/dynamic linked libraries.  The values are specified at link\r
-time by the user.\r
-\r
-SUBSYS MAJOR/MINOR # = DW Subsystem major/minor version number.\r
-\r
-IMAGE SIZE = DD The virtual size (in bytes) of the image.\r
-This includes all headers.  The total image size must be a multiple\r
-of Object Align.\r
-\r
-HEADER SIZE = DD Total header size.\r
-The combined size of the Dos Header, PE Header and Object Table.\r
-\r
-FILE CHECKSUM = DD Checksum for entire file.  Set to 0 by the linker.\r
-\r
-SUBSYSTEM = DW NT Subsystem required to run this image.\r
-The values are:\r
-\r
-  o  0000h __Unknown\r
-     \r
-  o  0001h __Native\r
-     \r
-  o  0002h __Windows GUI\r
-     \r
-  o  0003h __Windows Character\r
-     \r
-  o  0005h __OS/2 Character\r
-     \r
-  o  0007h __Posix Character\r
-     \r
-DLL FLAGS = DW Indicates special loader requirements.\r
-This flag has the following bit values:\r
-\r
-  o  0001h __Per-Process Library Initialization.\r
-     \r
-  o  0002h __Per-Process Library Termination.\r
-     \r
-  o  0004h __Per-Thread Library Initialization.\r
-     \r
-  o  0008h __Per-Thread Library Termination.\r
-     \r
-All other bits are reserved for future use and should be set to zero.\r
-\r
-STACK RESERVE SIZE = DD Stack size needed for image.\r
-The memory is reserved, but only the STACK COMMIT SIZE is committed.\r
-The next page of the stack is a 'guarded page'. When the application\r
-hits the guarded page, the guarded page becomes valid, and the next\r
-page becomes the guarded page. This continues until the RESERVE SIZE\r
-is reached.\r
-\r
-STACK COMMIT SIZE = DD Stack commit size.\r
-\r
-HEAP RESERVE SIZE = DD Size of local heap to reserve.\r
-\r
-HEAP COMMIT SIZE = DD Amount to commit in local heap.\r
-\r
-# INTERESTING VA/SIZES = DD Indicates the size of the VA/SIZE array\r
-that follows.\r
-\r
-EXPORT TABLE RVA = DD  Relative Virtual Address of the Export Table.\r
-This address is relative to the Image Base.\r
-\r
-IMPORT TABLE RVA = DD  Relative Virtual Address of the Import Table.\r
-This address is relative to the Image Base.\r
-\r
-RESOURCE TABLE RVA = DD  Relative Virtual Address of the Resource\r
-Table. This address is relative to the Image Base.\r
-\r
-EXCEPTION TABLE RVA = DD  Relative Virtual Address of the Exception\r
-Table. This address is relative to the Image Base.\r
-\r
-SECURITY TABLE RVA = DD  Relative Virtual Address of the Security\r
-Table. This address is relative to the Image Base.\r
-\r
-FIXUP TABLE RVA = DD  Relative Virtual Address of the Fixup Table.\r
-This address is relative to the Image Base.\r
-\r
-DEBUG TABLE RVA = DD  Relative Virtual Address of the Debug Table.\r
-This address is relative to the Image Base.\r
-\r
-IMAGE DESCRIPTION RVA = DD  Relative Virtual Address of the\r
-description string specified in the module definiton file.\r
-\r
-MACHINE SPECIFIC RVA = DD  Relative Virtual Address of a machine\r
-specific value. This address is relative to the Image Base.\r
-\r
-TOTAL EXPORT DATA SIZE = DD  Total size of the export data.\r
-\r
-TOTAL IMPORT DATA SIZE = DD  Total size of the import data.\r
-\r
-TOTAL RESOURCE DATA SIZE = DD  Total size of the resource data.\r
-\r
-TOTAL EXCEPTION DATA SIZE = DD  Total size of the exception data.\r
-\r
-TOTAL SECURITY DATA SIZE = DD  Total size of the security data.\r
-\r
-TOTAL FIXUP DATA SIZE = DD  Total size of the fixup data.\r
-\r
-TOTAL DEBUG DIRECTORIES = DD  Total number of debug directories.\r
-\r
-TOTAL DESCRIPTION SIZE = DD  Total size of the description data.\r
-\r
-MACHINE SPECIFIC SIZE = DD  A machine specific value.\r
-\r
-\r
-\r
-3. Object Table\r
-\r
-The number of entries in the Object Table is given by the # Objects\r
-field in the PE Header.  Entries in the Object Table are numbered\r
-starting from one.  The object table immediately follows the PE\r
-Header.  The code and data memory object entries are in the order\r
-chosen by the linker.  The virtual addresses for objects must be\r
-assigned by the linker such that they are in ascending order and\r
-adjacent, and must be a multiple of Object Align in the PE header.\r
-\r
-Each Object Table entry has the following format:\r
-\r
-    ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\r
-    ³                     OBJECT NAME                       ³\r
-    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\r
-    ³       VIRTUAL SIZE        ³           RVA             ³\r
-    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\r
-    ³      PHYSICAL SIZE        ³      PHYSICAL OFFSET      ³\r
-    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\r
-    ³        RESERVED           ³         RESERVED          ³\r
-    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\r
-    ³        RESERVED           ³       OBJECT FLAGS        ³\r
-    ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\r
-    \r
-Figure 3.  Object Table\r
-\r
-OBJECT NAME = DB * 8  Object name. This is an eight-byte null-padded\r
-ASCII string representing the object name.\r
-\r
-VIRTUAL SIZE = DD Virtual memory size.  The size of the object that\r
-will be allocated when the object is loaded. Any difference between\r
-PHYSICAL SIZE and VIRTUAL SIZE is zero filled.\r
-\r
-RVA = DD Relative Virtual Address.  The virtual address the object is\r
-currently relocated to, relative to the Image Base.  Each Object's\r
-virtual address space consumes a multiple of Object Align (power of 2\r
-between 512 and 256M inclusive. Default is 64K), and immediately\r
-follows the previous Object in the virtual address space (the virtual\r
-address space for a image must be dense).\r
-\r
-PHYSICAL SIZE = DD Physical file size of initialized data.  The size\r
-of the initialized data in the file for the object.  The physical\r
-size must be a multiple of the File Align field in the PE Header, and\r
-must be less than or equal to the Virtual Size.\r
-\r
-PHYSICAL OFFSET = DD Physical offset for object's first page.  This\r
-offset is relative to beginning of the EXE file, and is aligned on a\r
-multiple of the File Align field in the PE Header.  The offset is\r
-used as a seek value.\r
-\r
-OBJECT FLAGS = DD Flag bits for the object.  The object flag bits\r
-have the following definitions:\r
-\r
-  o  000000020h __Code object.\r
-     \r
-  o  000000040h __Initialized data object.\r
-     \r
-  o  000000080h __Uninitialized data object.\r
-     \r
-  o  040000000h __Object must not be cached.\r
-     \r
-  o  080000000h __Object is not pageable.\r
-     \r
-  o  100000000h __Object is shared.\r
-     \r
-  o  200000000h __Executable object.\r
-     \r
-  o  400000000h __Readable object.\r
-     \r
-  o  800000000h __Writeable object.\r
-     \r
-All other bits are reserved for future use and should be set to zero.\r
-\r
-4. Image Pages\r
-\r
-The Image Pages section contains all initialized data for all\r
-objects.  The seek offset for the first page in each object is\r
-specified in the object table and is aligned on a File Align\r
-boundary.  The objects are ordered by the RVA.  Every object begins\r
-on a multiple of Object Align.\r
-\r
-\r
-\r
-5. Exports\r
-\r
-A typical file layout for the export information follows:\r
-\r
-    ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\r
-    ³     DIRECTORY TABLE   ³\r
-    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\r
-    ³     ADDRESS TABLE     ³\r
-    ³                       ³\r
-    ³                       ³\r
-    ³                       ³\r
-    ³                       ³\r
-    ³                       ³\r
-    ³                       ³\r
-    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\r
-    ³     NAME PTR TABLE    ³\r
-    ³                       ³\r
-    ³                       ³\r
-    ³                       ³\r
-    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\r
-    ³     ORDINAL TABLE     ³\r
-    ³                       ³\r
-    ³                       ³\r
-    ³                       ³\r
-    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\r
-    ³     NAME STRINGS      ³\r
-    ³                       ³\r
-    ³                       ³\r
-    ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\r
-    \r
-Figure 4.  Export File Layout\r
-\r
-5.1 Export Directory Table\r
-\r
-The export information begins with the Export Directory Table which\r
-describes the remainder of the export information.  The Export\r
-Directory Table contains address information that is used to resolve\r
-fixup references to the entry points within this image.\r
-\r
-    ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\r
-    ³            EXPORT FLAGS           ³\r
-    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\r
-    ³           TIME/DATE STAMP         ³\r
-    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\r
-    ³  MAJOR VERSION  ³   MINOR VERSION ³\r
-    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\r
-    ³             NAME RVA              ³\r
-    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\r
-    ³           ORDINAL BASE            ³\r
-    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\r
-    ³           # EAT ENTRIES           ³\r
-    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\r
-    ³            # NAME PTRS            ³\r
-    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\r
-    ³         ADDRESS TABLE RVA         ³\r
-    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\r
-    ³        NAME PTR TABLE RVA         ³\r
-    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\r
-    ³         ORDINAL TABLE RVA         ³\r
-    ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\r
-    \r
-Figure 5.  Export Directory Table Entry\r
-\r
-EXPORT FLAGS = DD Currently set to zero.\r
-\r
-TIME/DATE STAMP = DD Time/Date the export data was created.\r
-\r
-MAJOR/MINOR VERSION = DW  A user settable major/minor version number.\r
-\r
-NAME RVA = DD Relative Virtual Address of the Dll asciiz Name.\r
-This is the address relative to the Image Base.\r
-\r
-ORDINAL BASE = DD First valid exported ordinal.\r
-This field specifies the starting ordinal number for the export\r
-address table for this image.  Normally set to 1.\r
-\r
-# EAT ENTRIES = DD Indicates number of entries in the Export Address\r
-Table.\r
-\r
-# NAME PTRS = DD This indicates the number of entries in the Name Ptr\r
-Table (and parallel Ordinal Table).\r
-\r
-ADDRESS TABLE RVA = DD Relative Virtual Address of the Export Address\r
-Table.\r
-This address is relative to the Image Base.\r
-\r
-NAME TABLE RVA = DD Relative Virtual Address of the Export Name Table\r
-Pointers.\r
-This address is relative to the beginning of the Image Base.  This\r
-table is an array of RVA's with # NAMES entries.\r
-\r
-ORDINAL TABLE RVA = DD Relative Virtual Address of Export Ordinals\r
-Table Entry.\r
-This address is relative to the beginning of the Image Base.\r
-\r
-5.2 Export Address Table\r
-\r
-The Export Address Table contains the address of exported entrypoints\r
-and exported data and absolutes.  An ordinal number is used to index\r
-the Export Address Table. The ORDINAL BASE must be subracted from the\r
-ordinal number before indexing into this table.\r
-\r
-Export Address Table entry formats are described below:\r
-\r
-    ÚÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄ¿\r
-    ³           EXPORTED RVA            ³\r
-    ÀÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÙ\r
-    \r
-Figure 6.  Export Address Table Entry\r
-\r
-EXPORTED RVA = DD Export address.\r
-This field contains the relative virtual address of the exported\r
-entry (relative to the Image Base).\r
-\r
-5.3 Export Name Table Pointers\r
-\r
-The export name table pointers array contains address into the Export\r
-Name Table.  The pointers are 32-bits each, and are relative to the\r
-Image Base.  The pointers are ordered lexically to allow binary\r
-searches.\r
-\r
-5.4 Export Ordinal Table\r
-\r
-The Export Name Table Pointers and the Export Ordinal Table form two\r
-parallel arrays, separated to allow natural field alignment.  The\r
-export ordinal table array contains the Export Address Table ordinal\r
-numbers associated with the named export referenced by corresponding\r
-Export Name Table Pointers.\r
-\r
-The ordinals are 16-bits each, and already include the Ordinal Base\r
-stored in the Export Directory Table.\r
-\r
-5.5 Export Name Table\r
-\r
-The export name table contains optional ASCII names for exported\r
-entries in the image.  These tables are used with the array of Export\r
-Name Table Pointers and the array of Export Ordinals to translate a\r
-procedure name string into an ordinal number by searching for a\r
-matching name string.  The ordinal number is used to locate the entry\r
-point information in the export address table.\r
-\r
-Import references by name require the Export Name Table Pointers\r
-table to be binary searched to find the matching name, then the\r
-corresponding Export Ordinal Table is known to contain the entry\r
-point ordinal number.  Import references by ordinal number provide\r
-the fastest lookup since searching the name table is not required.\r
-\r
-Each name table entry has the following format:\r
-\r
-    ÚÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄ¿\r
-    ³ ASCII STRING ::: ::::::::   '\0'  ³\r
-    ÀÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÙ\r
-    \r
-Figure 7.  Export Name Table Entry\r
-\r
-ASCII STRING = DB ASCII String.\r
-The string is case sensitive and is terminated by a null byte.\r
-\r
-\r
-\r
-6. Imports\r
-\r
-A typical file layout for the import information follows:\r
-\r
-    ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\r
-    ³     DIRECTORY TABLE   ³\r
-    ³                       ³\r
-    ³                       ³\r
-    ³                       ³\r
-    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\r
-    ³    NULL DIR ENTRY     ³\r
-    ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\r
-    \r
-    ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\r
-    ³   DLL1 LOOKUP TABLE   ³\r
-    ³                       ³\r
-    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\r
-    ³         NULL          ³\r
-    ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\r
-    \r
-    ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\r
-    ³   DLL2 LOOKUP TABLE   ³\r
-    ³                       ³\r
-    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\r
-    ³         NULL          ³\r
-    ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\r
-    \r
-    ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\r
-    ³   Dll3 LOOKUP TABLE   ³\r
-    ³                       ³\r
-    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\r
-    ³         NULL          ³\r
-    ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\r
-    \r
-    ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\r
-    ³    HINT-NAME TABLE    ³\r
-    ³                       ³\r
-    ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\r
-    \r
-    ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\r
-    ³   DLL1 ADDRESS TABLE  ³\r
-    ³                       ³\r
-    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\r
-    ³         NULL          ³\r
-    ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\r
-    \r
-    ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\r
-    ³   DLL2 ADDRESS TABLE  ³\r
-    ³                       ³\r
-    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\r
-    ³         NULL          ³\r
-    ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\r
-    \r
-    ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\r
-    ³   DLL3 ADDRESS TABLE  ³\r
-    ³                       ³\r
-    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\r
-    ³         NULL          ³\r
-    ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\r
-    \r
-Figure 8.  Import File Layout\r
-\r
-6.1 Import Directory Table\r
-\r
-The import information begins with the Import Directory Table which\r
-describes the remainder of the import information.  The Import\r
-Directory Table contains address information that is used to resolve\r
-fixup references to the entry points within a DLL image.  The import\r
-directory table consists of an array of Import Directory Entries, one\r
-entry for each DLL this image references. The last directory entry is\r
-empty (NULL) which indicates the end of the directory table.\r
-\r
-An Import Directory Entry has the following format:\r
-\r
-    ÚÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄ¿\r
-    ³            IMPORT FLAGS           ³\r
-    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\r
-    ³           TIME/DATE STAMP         ³\r
-    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\r
-    ³  MAJOR VERSION  ³   MINOR VERSION ³\r
-    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\r
-    ³              NAME RVA             ³\r
-    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\r
-    ³      IMPORT LOOKUP TABLE RVA      ³\r
-    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\r
-    ³      IMPORT ADDRESS TABLE RVA     ³\r
-    ÀÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÙ\r
-    \r
-Figure 9.  Import Directory Entry\r
-\r
-IMPORT FLAGS = DD Currently set to zero.\r
-\r
-TIME/DATE STAMP = DD Time/Date the import data was pre-snapped or\r
-zero if not pre-snapped.\r
-\r
-MAJOR/MINOR VERSION = DW  The major/minor version number of the dll\r
-being referenced.\r
-\r
-NAME RVA = DD Relative Virtual Address of the Dll asciiz Name.\r
-This is the address relative to the Image Base.\r
-\r
-IMPORT LOOKUP TABLE RVA = DD This field contains the address of the\r
-start of the import lookup table for this image.  The address is\r
-relative to the beginning of the Image Base.\r
-\r
-IMPORT ADDRESS TABLE RVA = DD This field contains the address of the\r
-start of the import addresses for this image.  The address is\r
-relative to the beginning of the Image Base.\r
-\r
-6.2 Import Lookup Table\r
-\r
-The Import Lookup Table is an array of ordinal or hint/name RVA's for\r
-each DLL. The last entry is empty (NULL) which indicates the end of\r
-the table.\r
-\r
-The last element is empty.\r
-\r
-     3                                 0\r
-     1\r
-    ÚÄÒÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄ¿\r
-    ³0º   ORDINAL#/HINT-NAME TABLE RVA  ³\r
-    ÀÄÐÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÙ\r
-    \r
-Figure 10.  Import Address Table Format\r
-\r
-ORDINAL/HINT-NAME TABLE RVA = 31-bits (mask = 7fffffffh) Ordinal\r
-Number or Name Table RVA.\r
-If the import is by ordinal, this field contains a 31 bit ordinal\r
-number.  If the import is by name, this field contains a 31 bit\r
-address relative to the Image Base to the Hint-Name Table.\r
-\r
-O = 1-bit (mask = 80000000h) Import by ordinal flag.\r
-\r
-  o  00000000h __Import by name.\r
-     \r
-  o  80000000h __Import by ordinal.\r
-     \r
-6.3 Hint-Name Table\r
-\r
-The Hint-Name Table format follows:\r
-\r
-    ÚÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄ¿\r
-    ³       HINT      ³ ASCII STRING |||³\r
-    ÃÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄ´\r
-    ³|||||||||||||||||³  '\0'     PAD   ³\r
-    ÀÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÙ\r
-    \r
-    \r
-    The PAD field is optional.\r
-    \r
-Figure 11.  Import Hint-Name Table\r
-\r
-HINT = DW Hint into Export Name Table Pointers.\r
-The hint value is used to index the Export Name Table Pointers array,\r
-allowing faster by-name imports.  If the hint is incorrect, then a\r
-binary search is performed on the Export Name Ptr Table.\r
-\r
-ASCII STRING = DB ASCII String.\r
-The string is case sensitive and is terminated by a null byte.\r
-\r
-PAD = DB Zero pad byte.\r
-A trailing zero pad byte appears after the trailing null byte if\r
-necessary to align the next entry on an even boundary.\r
-\r
-The loader overwrites the import address table when loading the image\r
-with the 32-bit address of the import.\r
-\r
-\r
-\r
-6.4 Import Address Table\r
-\r
-The Import Address Table is an array of addresses of the imported\r
-routines for each DLL. The last entry is empty (NULL) which indicates\r
-the end of the table.\r
-\r
-7. Thread Local Storage\r
-\r
-Thread local storage is a special contiguous block of data. Each\r
-thread will gets its own block upon creation of the thread.\r
-\r
-The file layout for thread local storage follows:\r
-    ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\r
-    ³     DIRECTORY TABLE   ³\r
-    ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\r
-    ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\r
-    ³        TLS DATA       ³\r
-    ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\r
-    ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\r
-    ³      INDEX VARIABLE   ³\r
-    ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\r
-    ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\r
-    ³   CALLBACK ADDRESSES  ³\r
-    ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\r
-\r
-Figure 12.  Thread Local Storage Layout\r
-\r
-7.1 Thread Local Storage Directory Table\r
-\r
-The Thread Local Storage Directory Table contains address information\r
-that is used to describe the rest of TLS.\r
-\r
-The Thread Local Storage Directory Table has the following format:\r
-\r
-    ÚÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄ¿\r
-    ³       START DATA BLOCK VA         ³\r
-    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\r
-    ³        END DATA BLOCK VA          ³\r
-    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\r
-    ³             INDEX VA              ³\r
-    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\r
-    ³         CALLBACK TABLE VA         ³\r
-    ÀÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÙ\r
-    \r
-Figure 13.  Thread Local Storage Directory Table\r
-\r
-START DATA BLOCK VA = DD Virtual Address of the start of the thread\r
-local storage data block.\r
-\r
-END DATA BLOCK VA = DD Virtual Address of the end of the thread local\r
-storage data block.\r
-\r
-INDEX VA = DD  Virtual Address of the index variable used to access\r
-the thread local storage data block.\r
-\r
-CALLBACK TABLE VA = DD Virtual Address of the callback table.\r
-\r
-7.2 Thread Local Storage CallBack Table\r
-\r
-The Thread Local Storage Callbacks is an array of Virtual Address of\r
-functions to be called by the loader after thread creation and thread\r
-termination. The last entry is empty (NULL) which indicates the end\r
-of the table.\r
-\r
-The Thread Local Storage CallBack Table has the following format:\r
-\r
-    ÚÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄ¿\r
-    ³            FUNCTION1 VA           ³\r
-    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\r
-    ³            FUNCTION2 VA           ³\r
-    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\r
-    ³                                   ³\r
-    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\r
-    ³                NULL               ³\r
-    ÀÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÙ\r
-    \r
-Figure 14.  Thread Local Storage CallBack Table\r
-\r
-8. Resources\r
-\r
-Resources are indexed by a multiple level binary-sorted tree\r
-structure.  The overall design can incorporate 2**31 levels, however,\r
-NT uses only three:  the highest is TYPE, then NAME, then LANGUAGE.\r
-\r
-A typical file layout for the resource information follows:\r
-    ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\r
-    ³  RESOURCE DIRECTORY   ³\r
-    ³                       ³\r
-    ³                       ³\r
-    ³                       ³\r
-    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\r
-    ³     RESOURCE DATA     ³\r
-    ³                       ³\r
-    ³                       ³\r
-    ³                       ³\r
-    ³                       ³\r
-    ³                       ³\r
-    ³                       ³\r
-    ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\r
-    \r
-Figure 15.  Resource File Layout\r
-\r
-\r
-The Resource directory is made up of the following tables:\r
-\r
-\r
-\r
-8.1 Resource Directory Table\r
-ÚÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄ¿\r
-³           RESOURCE FLAGS          ³\r
-ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\r
-³           TIME/DATE STAMP         ³\r
-ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\r
-³  MAJOR VERSION  ³   MINOR VERSION ³\r
-ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\r
-³    # NAME ENTRY ³  # ID ENTRY     ³\r
-ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\r
-³       RESOURCE DIR ENTRIES        ³\r
-ÀÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÙ\r
-\r
-Figure 16.  Resource Table Entry\r
-\r
-\r
-RESOURCE FLAGS = DD Currently set to zero.\r
-\r
-TIME/DATE  STAMP = DD Time/Date the resource data was created by the\r
-resource compiler.\r
-\r
-MAJOR/MINOR VERSION = DW  A user settable major/minor version number.\r
-\r
-# NAME ENTRY = DW The number of name entries.\r
-This field contains the number of entries at the beginning of the\r
-array of directory entries which have actual string names associated\r
-with them.\r
-\r
-# ID ENTRY = DW The number of ID integer entries.\r
-This field contains the number of 32-bit integer IDs as their names\r
-in the array of directory entries.\r
-\r
-The resource directory is followed by a variable length array of\r
-directory entries.  # NAME ENTRY is the number of entries at the\r
-beginning of the array that have actual names associated with each\r
-entry.  The entires are in ascending order, case insensitive strings.\r
-# ID ENTRY identifies the number of entries that have 32-bit integer\r
-IDs as their name.  These entries are also sorted in ascending order.\r
-\r
-This structure allows fast lookup by either name or number, but for\r
-any given resource entry only one form of lookup is supported, not\r
-both. This is consistent with the syntax of the .RC file and the .RES\r
-file.\r
-\r
-\r
-\r
-The array of directory entries have the following format:\r
- 3                                 0\r
- 1\r
-ÚÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄ¿\r
-³         NAME RVA/INTEGER ID       ³\r
-ÃÄÒÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\r
-³Eº     DATA ENTRY RVA/SUBDIR RVA   ³\r
-ÀÄÐÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÙ\r
-\r
-Figure 17.  Resource Directory Entry\r
-\r
-\r
-INTERGER ID = DD ID.\r
-This field contains a integer ID field to identify a resource.\r
-\r
-NAME RVA = DD Name RVA address.\r
-This field contains a 31-bit address relative to the beginning of the\r
-Image Base to a Resource Directory String Entry.\r
-\r
-E = 1-bit (mask 80000000h) Unescape bit.\r
-This bit is zero for unescaped Resource Data Entries.\r
-\r
-DATA RVA = 31-bits (mask 7fffffffh) Data entry address.\r
-This field contains a 31-bit address relative to the beginning of the\r
-Image Base to a Resource Data Entry.\r
-\r
-E = 1-bit (mask 80000000h) Escape bit.\r
-This bit is 1 for escaped Subdirectory Entry.\r
-\r
-DATA RVA = 31-bits (mask 7fffffffh) Directory entries.\r
-This field contains a 31-bit address relative to the beginning of the\r
-Image Base to Subdirectory Entry.\r
-\r
-\r
-\r
-Each resource directory string entry has the following format:\r
-ÚÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄ¿\r
-³      LENGTH     ³ UNICODE STRING  ³\r
-ÃÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄ´\r
-³                                   ³\r
-ÀÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÙ\r
-\r
-Figure 18.  Resource Directory String Entry\r
-\r
-\r
-LENGTH = DW Length of string.\r
-\r
-UNICODE STRING = DW UNICODE String.\r
-\r
-All of these string objects are stored together after the last\r
-resource directory entry and before the first resource data object.\r
-This minimizes the impact of these variable length objects on the\r
-alignment of the fixed size directory entry objects. The length needs\r
-to be word aligned.\r
-\r
-\r
-\r
-Each Resource Data Entry has the following format:\r
-\r
-    ÚÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄ¿\r
-    ³              DATA RVA             ³\r
-    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\r
-    ³               SIZE                ³\r
-    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\r
-    ³              CODEPAGE             ³\r
-    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\r
-    ³              RESERVED             ³\r
-    ÀÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÙ\r
-    \r
-Figure 19.  Resource Data Entry\r
-\r
-\r
-\r
-DATA RVA = DD Address of Resource Data.\r
-This field contains 32-bit virtaul address of the resource data\r
-(relative to the Image Base).\r
-\r
-SIZE = DD Size of Resource Data.\r
-This field contains the size of the resource data for this resource.\r
-\r
-CODEPAGE = DD Codepage.\r
-\r
-RESERVED = DD Reserved - must be zero.\r
-\r
-Each resource data entry describes a leaf node in the resource\r
-directory tree.  It contains an address which is  relative to the\r
-beginning of Image Base, a size field that gives the number of bytes\r
-of data at that address, a CodePage that should be used when decoding\r
-code point values within the resource data.  Typically for new\r
-applications the code page would be the unicode code page.\r
-\r
-\r
-\r
-8.2 Resource Example\r
-\r
-The following is an example for an app. which wants to use the following data\r
-as resources:\r
-\r
-  TypeId#    NameId#   Language ID Resource Data\r
- 00000001    00000001       0        00010001\r
- 00000001    00000001       1        10010001\r
- 00000001    00000002       0        00010002\r
- 00000001    00000003       0        00010003\r
- 00000002    00000001       0        00020001\r
- 00000002    00000002       0        00020002\r
- 00000002    00000003       0        00020003\r
- 00000002    00000004       0        00020004\r
- 00000009    00000001       0        00090001\r
- 00000009    00000009       0        00090009\r
- 00000009    00000009       1        10090009\r
- 00000009    00000009       2        20090009\r
-\r
-Then the Resource Directory in the Portable format looks like:\r
-Offset         Data\r
-0000:   00000000 00000000 00000000 00030000  (3 entries in this directory)\r
-0010:   00000001 80000028     (TypeId #1, Subdirectory at offset 0x28)\r
-0018:   00000002 80000050     (TypeId #2, Subdirectory at offset 0x50)\r
-0020:   00000009 80000080     (TypeId #9, Subdirectory at offset 0x80)\r
-0028:   00000000 00000000 00000000 00030000  (3 entries in this directory)\r
-0038:   00000001 800000A0     (NameId #1, Subdirectory at offset 0xA0)\r
-0040:   00000002 00000108     (NameId #2, data desc at offset 0x108)\r
-0048:   00000003 00000118     (NameId #3, data desc at offset 0x118)\r
-0050:   00000000 00000000 00000000 00040000  (4 entries in this directory)\r
-0060:   00000001 00000128     (NameId #1, data desc at offset 0x128)\r
-0068:   00000002 00000138     (NameId #2, data desc at offset 0x138)\r
-0070:   00000003 00000148     (NameId #3, data desc at offset 0x148)\r
-0078:   00000004 00000158     (NameId #4, data desc at offset 0x158)\r
-0080:   00000000 00000000 00000000 00020000  (2 entries in this directory)\r
-0090:   00000001 00000168     (NameId #1, data desc at offset 0x168)\r
-0098:   00000009 800000C0     (NameId #9, Subdirectory at offset 0xC0)\r
-00A0:   00000000 00000000 00000000 00020000  (2 entries in this directory)\r
-00B0:   00000000 000000E8     (Language ID 0, data desc at offset 0xE8\r
-00B8:   00000001 000000F8     (Language ID 1, data desc at offset 0xF8\r
-00C0:   00000000 00000000 00000000 00030000  (3 entries in this directory)\r
-00D0:   00000001 00000178     (Language ID 0, data desc at offset 0x178\r
-00D8:   00000001 00000188     (Language ID 1, data desc at offset 0x188\r
-00E0:   00000001 00000198     (Language ID 2, data desc at offset 0x198\r
-\r
-00E8:   000001A8  (At offset 0x1A8, for TypeId #1, NameId #1, Language id #0\r
-        00000004  (4 bytes of data)\r
-        00000000  (codepage)\r
-        00000000  (reserved)\r
-00F8:   000001AC  (At offset 0x1AC, for TypeId #1, NameId #1, Language id #1\r
-        00000004  (4 bytes of data)\r
-        00000000  (codepage)\r
-        00000000  (reserved)\r
-0108:   000001B0  (At offset 0x1B0, for TypeId #1, NameId #2,\r
-        00000004  (4 bytes of data)\r
-        00000000  (codepage)\r
-        00000000  (reserved)\r
-0118:   000001B4  (At offset 0x1B4, for TypeId #1, NameId #3,\r
-        00000004  (4 bytes of data)\r
-        00000000  (codepage)\r
-        00000000  (reserved)\r
-0128:   000001B8  (At offset 0x1B8, for TypeId #2, NameId #1,\r
-        00000004  (4 bytes of data)\r
-        00000000  (codepage)\r
-        00000000  (reserved)\r
-0138:   000001BC  (At offset 0x1BC, for TypeId #2, NameId #2,\r
-        00000004  (4 bytes of data)\r
-        00000000  (codepage)\r
-        00000000  (reserved)\r
-0148:   000001C0  (At offset 0x1C0, for TypeId #2, NameId #3,\r
-        00000004  (4 bytes of data)\r
-        00000000  (codepage)\r
-        00000000  (reserved)\r
-0158:   000001C4  (At offset 0x1C4, for TypeId #2, NameId #4,\r
-        00000004  (4 bytes of data)\r
-        00000000  (codepage)\r
-        00000000  (reserved)\r
-0168:   000001C8  (At offset 0x1C8, for TypeId #9, NameId #1,\r
-        00000004  (4 bytes of data)\r
-        00000000  (codepage)\r
-        00000000  (reserved)\r
-0178:   000001CC  (At offset 0x1CC, for TypeId #9, NameId #9, Language id #0\r
-        00000004  (4 bytes of data)\r
-        00000000  (codepage)\r
-        00000000  (reserved)\r
-0188:   000001D0  (At offset 0x1D0, for TypeId #9, NameId #9, Language id #1\r
-        00000004  (4 bytes of data)\r
-        00000000  (codepage)\r
-        00000000  (reserved)\r
-0198:   000001D4  (At offset 0x1D4, for TypeId #9, NameId #9, Language id #2\r
-        00000004  (4 bytes of data)\r
-        00000000  (codepage)\r
-        00000000  (reserved)\r
-\r
-And the data for the resources will look like:\r
-01A8:          00010001\r
-01AC:          10010001\r
-01B0:          00010002\r
-01B4:          00010003\r
-01B8:          00020001\r
-01BC:          00020002\r
-01C0:          00020003\r
-01C4:          00020004\r
-01C8:          00090001\r
-01CC:          00090009\r
-01D0:          10090009\r
-01D4:          20090009\r
-\r
-\r
-9. Fixup Table\r
-\r
-The Fixup Table contains entries for all fixups in the image. The\r
-Total Fixup Data Size in the PE Header is the number of bytes in the\r
-fixup table. The fixup table is broken into blocks of fixups. Each\r
-block represents the fixups for a 4K page.\r
-\r
-Fixups that are resolved by the linker do not need to be processed by\r
-the loader, unless the load image can't be loaded at the Image Base\r
-specified in the PE Header.\r
-\r
-9.1 Fixup Block\r
-\r
-Fixup blocks have the following format:\r
-\r
-    ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\r
-    ³             PAGE RVA              ³\r
-    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\r
-    ³            BLOCK SIZE             ³\r
-    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\r
-    ³   TYPE/OFFSET   ³   TYPE/OFFSET   ³\r
-    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\r
-    ³   TYPE/OFFSET   ³       ...       ³\r
-    ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\r
-    \r
-Figure 20.  Fixup Block Format\r
-\r
-To apply a fixup, a delta needs to be calculated.  The 32-bit delta\r
-is the difference between the preferred base, and the base where the\r
-image is actually loaded.  If the image is loaded at its preferred\r
-base, the delta would be zero, and thus the fixups would not have to\r
-be applied. Each block must start on a DWORD boundary. The ABSOLUTE\r
-fixup type can be used to pad a block.\r
-\r
-PAGE RVA = DD Page RVA. The image base plus the page rva is added to\r
-each offset to create the virtual address of where the fixup needs to\r
-be applied.\r
-\r
-BLOCK SIZE = DD Number of bytes in the fixup block. This includes the\r
-PAGE RVA and SIZE fields.\r
-\r
-TYPE/OFFSET is defined as:\r
-\r
-     1    1          0\r
-     5    1\r
-    ÚÄÄÄÄÒÄÄÄÄÄÄÄÄÄÄÄÄ¿\r
-    ³TYPEº   OFFSET   ³\r
-    ÀÄÄÄÄÐÄÄÄÄÄÄÄÄÄÄÄÄÙ\r
-Figure 21.  Fixup Record Format\r
-\r
-TYPE = 4-bit fixup type. This value has the following definitions:\r
-\r
-  o  0h __ABSOLUTE. This is a NOP. The fixup is skipped.\r
-     \r
-  o  1h __HIGH. Add the high 16-bits of the delta to the 16-bit field\r
-     at Offset.  The 16-bit field represents the high value of a 32-\r
-     bit word.\r
-     \r
-  o  2h __LOW. Add the low 16-bits of the delta to the 16-bit field\r
-     at Offset.  The 16-bit field represents the low half value of a\r
-     32-bit word.  This fixup will only be emitted for a RISC machine\r
-     when the image Object Align isn't the default of 64K.\r
-     \r
-  o  3h __HIGHLOW. Apply the 32-bit delta to the 32-bit field at\r
-     Offset.\r
-     \r
-  o  4h __HIGHADJUST. This fixup requires a full 32-bit value.  The\r
-     high 16-bits is located at Offset, and the low 16-bits is\r
-     located in the next Offset array element (this array element is\r
-     included in the SIZE field). The two need to be combined into a\r
-     signed variable.  Add the 32-bit delta.  Then add 0x8000 and\r
-     store the high 16-bits of the signed variable to the 16-bit\r
-     field at Offset.\r
-     \r
-  o  5h __MIPSJMPADDR.\r
-     \r
-All other values are reserved.\r
-\r
-\r
-\r
-10. Debug Information\r
-\r
-The debug information is defined by the debugger and is not\r
-controlled by the portable EXE format or linker.  The only data\r
-defined by the portable EXE format is the Debug Directory Table.\r
-\r
-10.1 Debug Directory\r
-\r
-The debug directory table consists of one or more entries that have\r
-the following format:\r
-\r
-    ÚÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄ¿\r
-    ³            DEBUG FLAGS            ³\r
-    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\r
-    ³           TIME/DATE STAMP         ³\r
-    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\r
-    ³  MAJOR VERSION  ³  MINOR VERSION  ³\r
-    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\r
-    ³             DEBUG TYPE            ³\r
-    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\r
-    ³             DATA SIZE             ³\r
-    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\r
-    ³             DATA RVA              ³\r
-    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\r
-    ³             DATA SEEK             ³\r
-    ÀÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÙ\r
-    \r
-Figure 22.  Debug Directory Entry\r
-\r
-DEBUG FLAGS = DD Set to zero for now.\r
-\r
-TIME/DATE STAMP = DD Time/Date the debug data was created.\r
-\r
-MAJOR/MINOR VERSION = DW Version stamp.\r
-This stamp can be used to determine the version of the debug data.\r
-\r
-DEBUG TYPE = DD Format type.\r
-To support multiple debuggers, this field determines the format of\r
-the debug information. This value has the following definitions:\r
-\r
-  o  0001h __Image contains COFF symbolics.\r
-     \r
-  o  0001h __Image contains CodeView symbolics.\r
-     \r
-  o  0001h __Image contains FPO symbolics.\r
-     \r
-DATA SIZE = DD The number of bytes in the debug data. This is the\r
-size of the actual debug data and does not include the debug\r
-directory.\r
-\r
-DATA RVA = DD The relative virtual address of the debug data. This\r
-address is relative to the beginning of the Image Base.\r
-\r
-DATA SEEK = DD The seek value from the beginning of the file to the\r
-debug data.\r
-\r
-If the image contains more than one type of debug information, then\r
-the next debug directory will immediately follow the first debug\r
-directory.\r
+
+ PORTABLE EXECUTABLE FORMAT
+
+ Author:  Micheal J. O'Leary
+
+
+ Preface
+ This document was edited and released by Microsoft Developer
+ Support. It describes the binary portable executable format for NT.
+ The information is provided at this point because we feel it will
+ make the work of application development easier. Unfortunately, the
+ information in this document may change before the final release of
+ Windows NT. Microsoft is NOT committing to stay with these formats
+ by releasing this document. Questions or follow-ups for any of the
+ information presented here should be posted to CompuServe MSWIN32
+ forum, section 6.
+                    --Steve Firebaugh
+                      Microsoft Developer Support
+
+Contents
+
+ 1. Overview
+
+ 2. PE Header
+
+ 3. Object Table
+
+ 4. Image Pages
+
+ 5. Exports
+   5.1 Export Directory Table
+   5.2 Export Address Table
+   5.3 Export Name Table Pointers
+   5.4 Export Ordinal Table
+   5.5 Export Name Table
+
+ 6. Imports
+   6.1 Import Directory Table
+   6.2 Import Lookup Table
+   6.3 Hint-Name Table
+   6.4 Import Address Table
+
+ 7. Thread Local Storage
+   7.1 Thread Local Storage Directory Table
+   7.2 Thread Local Storage CallBack Table
+
+ 8. Resources
+   8.1 Resource Directory Table
+   8.2 Resource Example
+
+ 9. Fixup Table
+   9.1 Fixup Block
+
+ 10. Debug Information
+   10.1 Debug Directory
+
+
+
+1. Overview
+
+    ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿  <ÄÄ¿ <ÄÄÄÄÄ Base of Image Header
+    ³ DOS 2 Compatible ³     ³
+    ³    EXE Header    ³     ³
+    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´     ³
+    ³      unused      ³     ³
+    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´     ³
+    ³  OEM Identifier  ³     ³
+    ³  OEM Info        ³     ³
+    ³                  ³     ³   DOS 2.0 Section
+    ³    Offset to     ³     ³   (for DOS compatibility only)
+    ³    PE Header     ³     ³
+    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´     ³
+    ³   DOS 2.0 Stub   ³     ³
+    ³   Program &      ³     ³
+    ³   Reloc. Table   ³     ³
+    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´  <ÄÄÙ
+    ³      unused      ³
+    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´  <ÄÄÄÄÄÄÄÄÄ Aligned on 8 byte boundary
+    ³    PE Header     ³
+    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
+    ³   Object Table   ³
+    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
+    ³   Image Pages    ³
+    ³     import info  ³
+    ³     export info  ³
+    ³     fixup info   ³
+    ³     resource info³
+    ³     debug info   ³
+    ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
+    
+Figure 1. A typical 32-bit Portable EXE File Layout
+
+
+
+2. PE Header
+
+    
+    ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
+    ³      SIGNATURE BYTES      ³  CPU TYPE   ³  # OBJECTS  ³
+    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄ´
+    ³       TIME/DATE STAMP     ³         RESERVED          ³
+    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄ´
+    ³          RESERVED         ³  NT HDR SIZE³    FLAGS    ³
+    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÂÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄ´
+    ³  RESERVED   ³LMAJOR³LMINOR³         RESERVED          ³
+    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÁÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
+    ³          RESERVED         ³         RESERVED          ³
+    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
+    ³       ENTRYPOINT RVA      ³         RESERVED          ³
+    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
+    ³          RESERVED         ³        IMAGE BASE         ³
+    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
+    ³       OBJECT ALIGN        ³        FILE ALIGN         ³
+    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄ´
+    ³  OS MAJOR   ³  OS MINOR   ³USER MAJOR   ³USER MINOR   ³
+    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄ´
+    ³ SUBSYS MAJOR³ SUBSYS MINOR³         RESERVED          ³
+    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
+    ³        IMAGE SIZE         ³       HEADER SIZE         ³
+    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄ´
+    ³       FILE CHECKSUM       ³  SUBSYSTEM  ³  DLL FLAGS  ³
+    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄ´
+    ³   STACK RESERVE SIZE      ³     STACK COMMIT SIZE     ³
+    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
+    ³   HEAP RESERVE SIZE       ³     HEAP COMMIT SIZE      ³
+    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
+    ³         RESERVED          ³  # INTERESTING RVA/SIZES  ³
+    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
+    ³   EXPORT TABLE RVA        ³   TOTAL EXPORT DATA SIZE  ³
+    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
+    ³   IMPORT TABLE RVA        ³   TOTAL IMPORT DATA SIZE  ³
+    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
+    ³  RESOURCE TABLE RVA       ³  TOTAL RESOURCE DATA SIZE ³
+    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
+    ³  EXCEPTION TABLE RVA      ³  TOTAL EXCEPTION DATA SIZE³
+    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
+    ³  SECURITY TABLE RVA       ³  TOTAL SECURITY DATA SIZE ³
+    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
+    ³    FIXUP TABLE RVA        ³  TOTAL FIXUP DATA SIZE    ³
+    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
+    ³    DEBUG TABLE RVA        ³  TOTAL DEBUG DIRECTORIES  ³
+    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
+    ³  IMAGE DESCRIPTION RVA    ³  TOTAL DESCRIPTION SIZE   ³
+    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
+    ³   MACHINE SPECIFIC RVA    ³   MACHINE SPECIFIC SIZE   ³
+    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
+    ³  THREAD LOCAL STORAGE RVA ³      TOTAL TLS SIZE       ³
+    ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
+    
+Figure 2. PE Header
+
+Notes:
+
+  o  A VA is a virtual address that is already biased by the Image
+     Base found in the PE Header.  A RVA is a virtual address that is
+     relative to the Image Base.
+     
+  o  An RVA in the PE Header which has a value of zero indicates the
+     field isn't used.
+     
+  o  Image pages are aligned and zero padded to a File Align
+     boundary.  The bases of all other tables and structures must be
+     aligned on DWORD (4 byte) boundary.  Thus, all VA's and RVA's
+     must be on a 32 bit boundary. All table and structure fields
+     must be aligned on their "natural" boundaries, with the possible
+     exception of the Debug Info.
+     
+SIGNATURE BYTES = DB * 4.
+Current value is "PE/0/0". Thats PE followed by two zeros (nulls).
+
+CPU TYPE = DW CPU Type.
+This field specifies the type of CPU compatibility required by this
+image to run.  The values are:
+
+  o  0000h __unknown
+     
+  o  014Ch __80386
+     
+  o  014Dh __80486
+     
+  o  014Eh __80586
+     
+  o  0162h __MIPS Mark I (R2000, R3000)
+     
+  o  0163h __MIPS Mark II (R6000)
+     
+  o  0166h __MIPS Mark III (R4000)
+     
+# OBJECTS = DW Number of object entries.
+This field specifies the number of entries in the Object Table.
+
+TIME/DATE STAMP = DD Used to store the time and date the file was
+created or modified by the linker.
+
+NT HDR SIZE = DW This is the number of remaining bytes in the NT
+header that follow the FLAGS field.
+
+FLAGS = DW Flag bits for the image.
+The flag bits have the following definitons:
+
+  o  0000h __Program image.
+     
+  o  0002h __Image is executable.
+     If this bit isn't set, then it indicates that either errors
+     where detected at link time or that the image is being
+     incrementally linked and therefore can't be loaded.
+     
+  o  0200h __Fixed.
+     Indicates that if the image can't be loaded at the Image Base,
+     then don't load it.
+     
+  o  2000h __Library image.
+     
+LMAJOR/LMINOR = DB Linker major/minor version number.
+
+ENTRYPOINT RVA = DD Entrypoint relative virtual address.
+The address is relative to the Image Base.  The address is the
+starting address for program images and the library initialization
+and library termination address for library images.
+
+IMAGE BASE = DD The virtual base of the image.
+This will be the virtual address of the first byte of the file (Dos
+Header).  This must be a multiple of 64K.
+
+OBJECT ALIGN = DD The alignment of the objects. This must be a power
+of 2 between 512 and 256M inclusive. The default is 64K.
+
+FILE ALIGN = DD Alignment factor used to align image pages.  The
+alignment factor (in bytes) used to align the base of the image pages
+and to determine the granularity of per-object trailing zero pad.
+Larger alignment factors will cost more file space; smaller alignment
+factors will impact demand load performance, perhaps significantly.
+Of the two, wasting file space is preferable.  This value should be a
+power of 2 between 512 and 64K inclusive.
+
+OS MAJOR/MINOR = DW OS version number required to run this image.
+
+USER MAJOR/MINOR # = DW User major/minor version number.
+This is useful for differentiating between revisions of
+images/dynamic linked libraries.  The values are specified at link
+time by the user.
+
+SUBSYS MAJOR/MINOR # = DW Subsystem major/minor version number.
+
+IMAGE SIZE = DD The virtual size (in bytes) of the image.
+This includes all headers.  The total image size must be a multiple
+of Object Align.
+
+HEADER SIZE = DD Total header size.
+The combined size of the Dos Header, PE Header and Object Table.
+
+FILE CHECKSUM = DD Checksum for entire file.  Set to 0 by the linker.
+
+SUBSYSTEM = DW NT Subsystem required to run this image.
+The values are:
+
+  o  0000h __Unknown
+     
+  o  0001h __Native
+     
+  o  0002h __Windows GUI
+     
+  o  0003h __Windows Character
+     
+  o  0005h __OS/2 Character
+     
+  o  0007h __Posix Character
+     
+DLL FLAGS = DW Indicates special loader requirements.
+This flag has the following bit values:
+
+  o  0001h __Per-Process Library Initialization.
+     
+  o  0002h __Per-Process Library Termination.
+     
+  o  0004h __Per-Thread Library Initialization.
+     
+  o  0008h __Per-Thread Library Termination.
+     
+All other bits are reserved for future use and should be set to zero.
+
+STACK RESERVE SIZE = DD Stack size needed for image.
+The memory is reserved, but only the STACK COMMIT SIZE is committed.
+The next page of the stack is a 'guarded page'. When the application
+hits the guarded page, the guarded page becomes valid, and the next
+page becomes the guarded page. This continues until the RESERVE SIZE
+is reached.
+
+STACK COMMIT SIZE = DD Stack commit size.
+
+HEAP RESERVE SIZE = DD Size of local heap to reserve.
+
+HEAP COMMIT SIZE = DD Amount to commit in local heap.
+
+# INTERESTING VA/SIZES = DD Indicates the size of the VA/SIZE array
+that follows.
+
+EXPORT TABLE RVA = DD  Relative Virtual Address of the Export Table.
+This address is relative to the Image Base.
+
+IMPORT TABLE RVA = DD  Relative Virtual Address of the Import Table.
+This address is relative to the Image Base.
+
+RESOURCE TABLE RVA = DD  Relative Virtual Address of the Resource
+Table. This address is relative to the Image Base.
+
+EXCEPTION TABLE RVA = DD  Relative Virtual Address of the Exception
+Table. This address is relative to the Image Base.
+
+SECURITY TABLE RVA = DD  Relative Virtual Address of the Security
+Table. This address is relative to the Image Base.
+
+FIXUP TABLE RVA = DD  Relative Virtual Address of the Fixup Table.
+This address is relative to the Image Base.
+
+DEBUG TABLE RVA = DD  Relative Virtual Address of the Debug Table.
+This address is relative to the Image Base.
+
+IMAGE DESCRIPTION RVA = DD  Relative Virtual Address of the
+description string specified in the module definiton file.
+
+MACHINE SPECIFIC RVA = DD  Relative Virtual Address of a machine
+specific value. This address is relative to the Image Base.
+
+TOTAL EXPORT DATA SIZE = DD  Total size of the export data.
+
+TOTAL IMPORT DATA SIZE = DD  Total size of the import data.
+
+TOTAL RESOURCE DATA SIZE = DD  Total size of the resource data.
+
+TOTAL EXCEPTION DATA SIZE = DD  Total size of the exception data.
+
+TOTAL SECURITY DATA SIZE = DD  Total size of the security data.
+
+TOTAL FIXUP DATA SIZE = DD  Total size of the fixup data.
+
+TOTAL DEBUG DIRECTORIES = DD  Total number of debug directories.
+
+TOTAL DESCRIPTION SIZE = DD  Total size of the description data.
+
+MACHINE SPECIFIC SIZE = DD  A machine specific value.
+
+
+
+3. Object Table
+
+The number of entries in the Object Table is given by the # Objects
+field in the PE Header.  Entries in the Object Table are numbered
+starting from one.  The object table immediately follows the PE
+Header.  The code and data memory object entries are in the order
+chosen by the linker.  The virtual addresses for objects must be
+assigned by the linker such that they are in ascending order and
+adjacent, and must be a multiple of Object Align in the PE header.
+
+Each Object Table entry has the following format:
+
+    ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
+    ³                     OBJECT NAME                       ³
+    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
+    ³       VIRTUAL SIZE        ³           RVA             ³
+    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
+    ³      PHYSICAL SIZE        ³      PHYSICAL OFFSET      ³
+    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
+    ³        RESERVED           ³         RESERVED          ³
+    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
+    ³        RESERVED           ³       OBJECT FLAGS        ³
+    ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
+    
+Figure 3.  Object Table
+
+OBJECT NAME = DB * 8  Object name. This is an eight-byte null-padded
+ASCII string representing the object name.
+
+VIRTUAL SIZE = DD Virtual memory size.  The size of the object that
+will be allocated when the object is loaded. Any difference between
+PHYSICAL SIZE and VIRTUAL SIZE is zero filled.
+
+RVA = DD Relative Virtual Address.  The virtual address the object is
+currently relocated to, relative to the Image Base.  Each Object's
+virtual address space consumes a multiple of Object Align (power of 2
+between 512 and 256M inclusive. Default is 64K), and immediately
+follows the previous Object in the virtual address space (the virtual
+address space for a image must be dense).
+
+PHYSICAL SIZE = DD Physical file size of initialized data.  The size
+of the initialized data in the file for the object.  The physical
+size must be a multiple of the File Align field in the PE Header, and
+must be less than or equal to the Virtual Size.
+
+PHYSICAL OFFSET = DD Physical offset for object's first page.  This
+offset is relative to beginning of the EXE file, and is aligned on a
+multiple of the File Align field in the PE Header.  The offset is
+used as a seek value.
+
+OBJECT FLAGS = DD Flag bits for the object.  The object flag bits
+have the following definitions:
+
+  o  000000020h __Code object.
+     
+  o  000000040h __Initialized data object.
+     
+  o  000000080h __Uninitialized data object.
+     
+  o  040000000h __Object must not be cached.
+     
+  o  080000000h __Object is not pageable.
+     
+  o  100000000h __Object is shared.
+     
+  o  200000000h __Executable object.
+     
+  o  400000000h __Readable object.
+     
+  o  800000000h __Writeable object.
+     
+All other bits are reserved for future use and should be set to zero.
+
+4. Image Pages
+
+The Image Pages section contains all initialized data for all
+objects.  The seek offset for the first page in each object is
+specified in the object table and is aligned on a File Align
+boundary.  The objects are ordered by the RVA.  Every object begins
+on a multiple of Object Align.
+
+
+
+5. Exports
+
+A typical file layout for the export information follows:
+
+    ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
+    ³     DIRECTORY TABLE   ³
+    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
+    ³     ADDRESS TABLE     ³
+    ³                       ³
+    ³                       ³
+    ³                       ³
+    ³                       ³
+    ³                       ³
+    ³                       ³
+    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
+    ³     NAME PTR TABLE    ³
+    ³                       ³
+    ³                       ³
+    ³                       ³
+    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
+    ³     ORDINAL TABLE     ³
+    ³                       ³
+    ³                       ³
+    ³                       ³
+    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
+    ³     NAME STRINGS      ³
+    ³                       ³
+    ³                       ³
+    ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
+    
+Figure 4.  Export File Layout
+
+5.1 Export Directory Table
+
+The export information begins with the Export Directory Table which
+describes the remainder of the export information.  The Export
+Directory Table contains address information that is used to resolve
+fixup references to the entry points within this image.
+
+    ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
+    ³            EXPORT FLAGS           ³
+    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
+    ³           TIME/DATE STAMP         ³
+    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
+    ³  MAJOR VERSION  ³   MINOR VERSION ³
+    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
+    ³             NAME RVA              ³
+    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
+    ³           ORDINAL BASE            ³
+    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
+    ³           # EAT ENTRIES           ³
+    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
+    ³            # NAME PTRS            ³
+    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
+    ³         ADDRESS TABLE RVA         ³
+    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
+    ³        NAME PTR TABLE RVA         ³
+    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
+    ³         ORDINAL TABLE RVA         ³
+    ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
+    
+Figure 5.  Export Directory Table Entry
+
+EXPORT FLAGS = DD Currently set to zero.
+
+TIME/DATE STAMP = DD Time/Date the export data was created.
+
+MAJOR/MINOR VERSION = DW  A user settable major/minor version number.
+
+NAME RVA = DD Relative Virtual Address of the Dll asciiz Name.
+This is the address relative to the Image Base.
+
+ORDINAL BASE = DD First valid exported ordinal.
+This field specifies the starting ordinal number for the export
+address table for this image.  Normally set to 1.
+
+# EAT ENTRIES = DD Indicates number of entries in the Export Address
+Table.
+
+# NAME PTRS = DD This indicates the number of entries in the Name Ptr
+Table (and parallel Ordinal Table).
+
+ADDRESS TABLE RVA = DD Relative Virtual Address of the Export Address
+Table.
+This address is relative to the Image Base.
+
+NAME TABLE RVA = DD Relative Virtual Address of the Export Name Table
+Pointers.
+This address is relative to the beginning of the Image Base.  This
+table is an array of RVA's with # NAMES entries.
+
+ORDINAL TABLE RVA = DD Relative Virtual Address of Export Ordinals
+Table Entry.
+This address is relative to the beginning of the Image Base.
+
+5.2 Export Address Table
+
+The Export Address Table contains the address of exported entrypoints
+and exported data and absolutes.  An ordinal number is used to index
+the Export Address Table. The ORDINAL BASE must be subracted from the
+ordinal number before indexing into this table.
+
+Export Address Table entry formats are described below:
+
+    ÚÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄ¿
+    ³           EXPORTED RVA            ³
+    ÀÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÙ
+    
+Figure 6.  Export Address Table Entry
+
+EXPORTED RVA = DD Export address.
+This field contains the relative virtual address of the exported
+entry (relative to the Image Base).
+
+5.3 Export Name Table Pointers
+
+The export name table pointers array contains address into the Export
+Name Table.  The pointers are 32-bits each, and are relative to the
+Image Base.  The pointers are ordered lexically to allow binary
+searches.
+
+5.4 Export Ordinal Table
+
+The Export Name Table Pointers and the Export Ordinal Table form two
+parallel arrays, separated to allow natural field alignment.  The
+export ordinal table array contains the Export Address Table ordinal
+numbers associated with the named export referenced by corresponding
+Export Name Table Pointers.
+
+The ordinals are 16-bits each, and already include the Ordinal Base
+stored in the Export Directory Table.
+
+5.5 Export Name Table
+
+The export name table contains optional ASCII names for exported
+entries in the image.  These tables are used with the array of Export
+Name Table Pointers and the array of Export Ordinals to translate a
+procedure name string into an ordinal number by searching for a
+matching name string.  The ordinal number is used to locate the entry
+point information in the export address table.
+
+Import references by name require the Export Name Table Pointers
+table to be binary searched to find the matching name, then the
+corresponding Export Ordinal Table is known to contain the entry
+point ordinal number.  Import references by ordinal number provide
+the fastest lookup since searching the name table is not required.
+
+Each name table entry has the following format:
+
+    ÚÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄ¿
+    ³ ASCII STRING ::: ::::::::   '\0'  ³
+    ÀÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÙ
+    
+Figure 7.  Export Name Table Entry
+
+ASCII STRING = DB ASCII String.
+The string is case sensitive and is terminated by a null byte.
+
+
+
+6. Imports
+
+A typical file layout for the import information follows:
+
+    ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
+    ³     DIRECTORY TABLE   ³
+    ³                       ³
+    ³                       ³
+    ³                       ³
+    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
+    ³    NULL DIR ENTRY     ³
+    ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
+    
+    ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
+    ³   DLL1 LOOKUP TABLE   ³
+    ³                       ³
+    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
+    ³         NULL          ³
+    ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
+    
+    ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
+    ³   DLL2 LOOKUP TABLE   ³
+    ³                       ³
+    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
+    ³         NULL          ³
+    ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
+    
+    ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
+    ³   Dll3 LOOKUP TABLE   ³
+    ³                       ³
+    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
+    ³         NULL          ³
+    ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
+    
+    ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
+    ³    HINT-NAME TABLE    ³
+    ³                       ³
+    ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
+    
+    ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
+    ³   DLL1 ADDRESS TABLE  ³
+    ³                       ³
+    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
+    ³         NULL          ³
+    ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
+    
+    ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
+    ³   DLL2 ADDRESS TABLE  ³
+    ³                       ³
+    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
+    ³         NULL          ³
+    ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
+    
+    ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
+    ³   DLL3 ADDRESS TABLE  ³
+    ³                       ³
+    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
+    ³         NULL          ³
+    ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
+    
+Figure 8.  Import File Layout
+
+6.1 Import Directory Table
+
+The import information begins with the Import Directory Table which
+describes the remainder of the import information.  The Import
+Directory Table contains address information that is used to resolve
+fixup references to the entry points within a DLL image.  The import
+directory table consists of an array of Import Directory Entries, one
+entry for each DLL this image references. The last directory entry is
+empty (NULL) which indicates the end of the directory table.
+
+An Import Directory Entry has the following format:
+
+    ÚÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄ¿
+    ³            IMPORT FLAGS           ³
+    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
+    ³           TIME/DATE STAMP         ³
+    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
+    ³  MAJOR VERSION  ³   MINOR VERSION ³
+    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
+    ³              NAME RVA             ³
+    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
+    ³      IMPORT LOOKUP TABLE RVA      ³
+    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
+    ³      IMPORT ADDRESS TABLE RVA     ³
+    ÀÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÙ
+    
+Figure 9.  Import Directory Entry
+
+IMPORT FLAGS = DD Currently set to zero.
+
+TIME/DATE STAMP = DD Time/Date the import data was pre-snapped or
+zero if not pre-snapped.
+
+MAJOR/MINOR VERSION = DW  The major/minor version number of the dll
+being referenced.
+
+NAME RVA = DD Relative Virtual Address of the Dll asciiz Name.
+This is the address relative to the Image Base.
+
+IMPORT LOOKUP TABLE RVA = DD This field contains the address of the
+start of the import lookup table for this image.  The address is
+relative to the beginning of the Image Base.
+
+IMPORT ADDRESS TABLE RVA = DD This field contains the address of the
+start of the import addresses for this image.  The address is
+relative to the beginning of the Image Base.
+
+6.2 Import Lookup Table
+
+The Import Lookup Table is an array of ordinal or hint/name RVA's for
+each DLL. The last entry is empty (NULL) which indicates the end of
+the table.
+
+The last element is empty.
+
+     3                                 0
+     1
+    ÚÄÒÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄ¿
+    ³0º   ORDINAL#/HINT-NAME TABLE RVA  ³
+    ÀÄÐÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÙ
+    
+Figure 10.  Import Address Table Format
+
+ORDINAL/HINT-NAME TABLE RVA = 31-bits (mask = 7fffffffh) Ordinal
+Number or Name Table RVA.
+If the import is by ordinal, this field contains a 31 bit ordinal
+number.  If the import is by name, this field contains a 31 bit
+address relative to the Image Base to the Hint-Name Table.
+
+O = 1-bit (mask = 80000000h) Import by ordinal flag.
+
+  o  00000000h __Import by name.
+     
+  o  80000000h __Import by ordinal.
+     
+6.3 Hint-Name Table
+
+The Hint-Name Table format follows:
+
+    ÚÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄ¿
+    ³       HINT      ³ ASCII STRING |||³
+    ÃÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄ´
+    ³|||||||||||||||||³  '\0'     PAD   ³
+    ÀÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÙ
+    
+    
+    The PAD field is optional.
+    
+Figure 11.  Import Hint-Name Table
+
+HINT = DW Hint into Export Name Table Pointers.
+The hint value is used to index the Export Name Table Pointers array,
+allowing faster by-name imports.  If the hint is incorrect, then a
+binary search is performed on the Export Name Ptr Table.
+
+ASCII STRING = DB ASCII String.
+The string is case sensitive and is terminated by a null byte.
+
+PAD = DB Zero pad byte.
+A trailing zero pad byte appears after the trailing null byte if
+necessary to align the next entry on an even boundary.
+
+The loader overwrites the import address table when loading the image
+with the 32-bit address of the import.
+
+
+
+6.4 Import Address Table
+
+The Import Address Table is an array of addresses of the imported
+routines for each DLL. The last entry is empty (NULL) which indicates
+the end of the table.
+
+7. Thread Local Storage
+
+Thread local storage is a special contiguous block of data. Each
+thread will gets its own block upon creation of the thread.
+
+The file layout for thread local storage follows:
+    ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
+    ³     DIRECTORY TABLE   ³
+    ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
+    ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
+    ³        TLS DATA       ³
+    ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
+    ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
+    ³      INDEX VARIABLE   ³
+    ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
+    ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
+    ³   CALLBACK ADDRESSES  ³
+    ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
+
+Figure 12.  Thread Local Storage Layout
+
+7.1 Thread Local Storage Directory Table
+
+The Thread Local Storage Directory Table contains address information
+that is used to describe the rest of TLS.
+
+The Thread Local Storage Directory Table has the following format:
+
+    ÚÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄ¿
+    ³       START DATA BLOCK VA         ³
+    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
+    ³        END DATA BLOCK VA          ³
+    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
+    ³             INDEX VA              ³
+    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
+    ³         CALLBACK TABLE VA         ³
+    ÀÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÙ
+    
+Figure 13.  Thread Local Storage Directory Table
+
+START DATA BLOCK VA = DD Virtual Address of the start of the thread
+local storage data block.
+
+END DATA BLOCK VA = DD Virtual Address of the end of the thread local
+storage data block.
+
+INDEX VA = DD  Virtual Address of the index variable used to access
+the thread local storage data block.
+
+CALLBACK TABLE VA = DD Virtual Address of the callback table.
+
+7.2 Thread Local Storage CallBack Table
+
+The Thread Local Storage Callbacks is an array of Virtual Address of
+functions to be called by the loader after thread creation and thread
+termination. The last entry is empty (NULL) which indicates the end
+of the table.
+
+The Thread Local Storage CallBack Table has the following format:
+
+    ÚÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄ¿
+    ³            FUNCTION1 VA           ³
+    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
+    ³            FUNCTION2 VA           ³
+    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
+    ³                                   ³
+    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
+    ³                NULL               ³
+    ÀÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÙ
+    
+Figure 14.  Thread Local Storage CallBack Table
+
+8. Resources
+
+Resources are indexed by a multiple level binary-sorted tree
+structure.  The overall design can incorporate 2**31 levels, however,
+NT uses only three:  the highest is TYPE, then NAME, then LANGUAGE.
+
+A typical file layout for the resource information follows:
+    ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
+    ³  RESOURCE DIRECTORY   ³
+    ³                       ³
+    ³                       ³
+    ³                       ³
+    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
+    ³     RESOURCE DATA     ³
+    ³                       ³
+    ³                       ³
+    ³                       ³
+    ³                       ³
+    ³                       ³
+    ³                       ³
+    ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
+    
+Figure 15.  Resource File Layout
+
+
+The Resource directory is made up of the following tables:
+
+
+
+8.1 Resource Directory Table
+ÚÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄ¿
+³           RESOURCE FLAGS          ³
+ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
+³           TIME/DATE STAMP         ³
+ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
+³  MAJOR VERSION  ³   MINOR VERSION ³
+ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
+³    # NAME ENTRY ³  # ID ENTRY     ³
+ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
+³       RESOURCE DIR ENTRIES        ³
+ÀÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÙ
+
+Figure 16.  Resource Table Entry
+
+
+RESOURCE FLAGS = DD Currently set to zero.
+
+TIME/DATE  STAMP = DD Time/Date the resource data was created by the
+resource compiler.
+
+MAJOR/MINOR VERSION = DW  A user settable major/minor version number.
+
+# NAME ENTRY = DW The number of name entries.
+This field contains the number of entries at the beginning of the
+array of directory entries which have actual string names associated
+with them.
+
+# ID ENTRY = DW The number of ID integer entries.
+This field contains the number of 32-bit integer IDs as their names
+in the array of directory entries.
+
+The resource directory is followed by a variable length array of
+directory entries.  # NAME ENTRY is the number of entries at the
+beginning of the array that have actual names associated with each
+entry.  The entires are in ascending order, case insensitive strings.
+# ID ENTRY identifies the number of entries that have 32-bit integer
+IDs as their name.  These entries are also sorted in ascending order.
+
+This structure allows fast lookup by either name or number, but for
+any given resource entry only one form of lookup is supported, not
+both. This is consistent with the syntax of the .RC file and the .RES
+file.
+
+
+
+The array of directory entries have the following format:
+ 3                                 0
+ 1
+ÚÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄ¿
+³         NAME RVA/INTEGER ID       ³
+ÃÄÒÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
+³Eº     DATA ENTRY RVA/SUBDIR RVA   ³
+ÀÄÐÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÙ
+
+Figure 17.  Resource Directory Entry
+
+
+INTERGER ID = DD ID.
+This field contains a integer ID field to identify a resource.
+
+NAME RVA = DD Name RVA address.
+This field contains a 31-bit address relative to the beginning of the
+Image Base to a Resource Directory String Entry.
+
+E = 1-bit (mask 80000000h) Unescape bit.
+This bit is zero for unescaped Resource Data Entries.
+
+DATA RVA = 31-bits (mask 7fffffffh) Data entry address.
+This field contains a 31-bit address relative to the beginning of the
+Image Base to a Resource Data Entry.
+
+E = 1-bit (mask 80000000h) Escape bit.
+This bit is 1 for escaped Subdirectory Entry.
+
+DATA RVA = 31-bits (mask 7fffffffh) Directory entries.
+This field contains a 31-bit address relative to the beginning of the
+Image Base to Subdirectory Entry.
+
+
+
+Each resource directory string entry has the following format:
+ÚÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄ¿
+³      LENGTH     ³ UNICODE STRING  ³
+ÃÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄ´
+³                                   ³
+ÀÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÙ
+
+Figure 18.  Resource Directory String Entry
+
+
+LENGTH = DW Length of string.
+
+UNICODE STRING = DW UNICODE String.
+
+All of these string objects are stored together after the last
+resource directory entry and before the first resource data object.
+This minimizes the impact of these variable length objects on the
+alignment of the fixed size directory entry objects. The length needs
+to be word aligned.
+
+
+
+Each Resource Data Entry has the following format:
+
+    ÚÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄ¿
+    ³              DATA RVA             ³
+    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
+    ³               SIZE                ³
+    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
+    ³              CODEPAGE             ³
+    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
+    ³              RESERVED             ³
+    ÀÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÙ
+    
+Figure 19.  Resource Data Entry
+
+
+
+DATA RVA = DD Address of Resource Data.
+This field contains 32-bit virtaul address of the resource data
+(relative to the Image Base).
+
+SIZE = DD Size of Resource Data.
+This field contains the size of the resource data for this resource.
+
+CODEPAGE = DD Codepage.
+
+RESERVED = DD Reserved - must be zero.
+
+Each resource data entry describes a leaf node in the resource
+directory tree.  It contains an address which is  relative to the
+beginning of Image Base, a size field that gives the number of bytes
+of data at that address, a CodePage that should be used when decoding
+code point values within the resource data.  Typically for new
+applications the code page would be the unicode code page.
+
+
+
+8.2 Resource Example
+
+The following is an example for an app. which wants to use the following data
+as resources:
+
+  TypeId#    NameId#   Language ID Resource Data
+ 00000001    00000001       0        00010001
+ 00000001    00000001       1        10010001
+ 00000001    00000002       0        00010002
+ 00000001    00000003       0        00010003
+ 00000002    00000001       0        00020001
+ 00000002    00000002       0        00020002
+ 00000002    00000003       0        00020003
+ 00000002    00000004       0        00020004
+ 00000009    00000001       0        00090001
+ 00000009    00000009       0        00090009
+ 00000009    00000009       1        10090009
+ 00000009    00000009       2        20090009
+
+Then the Resource Directory in the Portable format looks like:
+Offset         Data
+0000:   00000000 00000000 00000000 00030000  (3 entries in this directory)
+0010:   00000001 80000028     (TypeId #1, Subdirectory at offset 0x28)
+0018:   00000002 80000050     (TypeId #2, Subdirectory at offset 0x50)
+0020:   00000009 80000080     (TypeId #9, Subdirectory at offset 0x80)
+0028:   00000000 00000000 00000000 00030000  (3 entries in this directory)
+0038:   00000001 800000A0     (NameId #1, Subdirectory at offset 0xA0)
+0040:   00000002 00000108     (NameId #2, data desc at offset 0x108)
+0048:   00000003 00000118     (NameId #3, data desc at offset 0x118)
+0050:   00000000 00000000 00000000 00040000  (4 entries in this directory)
+0060:   00000001 00000128     (NameId #1, data desc at offset 0x128)
+0068:   00000002 00000138     (NameId #2, data desc at offset 0x138)
+0070:   00000003 00000148     (NameId #3, data desc at offset 0x148)
+0078:   00000004 00000158     (NameId #4, data desc at offset 0x158)
+0080:   00000000 00000000 00000000 00020000  (2 entries in this directory)
+0090:   00000001 00000168     (NameId #1, data desc at offset 0x168)
+0098:   00000009 800000C0     (NameId #9, Subdirectory at offset 0xC0)
+00A0:   00000000 00000000 00000000 00020000  (2 entries in this directory)
+00B0:   00000000 000000E8     (Language ID 0, data desc at offset 0xE8
+00B8:   00000001 000000F8     (Language ID 1, data desc at offset 0xF8
+00C0:   00000000 00000000 00000000 00030000  (3 entries in this directory)
+00D0:   00000001 00000178     (Language ID 0, data desc at offset 0x178
+00D8:   00000001 00000188     (Language ID 1, data desc at offset 0x188
+00E0:   00000001 00000198     (Language ID 2, data desc at offset 0x198
+
+00E8:   000001A8  (At offset 0x1A8, for TypeId #1, NameId #1, Language id #0
+        00000004  (4 bytes of data)
+        00000000  (codepage)
+        00000000  (reserved)
+00F8:   000001AC  (At offset 0x1AC, for TypeId #1, NameId #1, Language id #1
+        00000004  (4 bytes of data)
+        00000000  (codepage)
+        00000000  (reserved)
+0108:   000001B0  (At offset 0x1B0, for TypeId #1, NameId #2,
+        00000004  (4 bytes of data)
+        00000000  (codepage)
+        00000000  (reserved)
+0118:   000001B4  (At offset 0x1B4, for TypeId #1, NameId #3,
+        00000004  (4 bytes of data)
+        00000000  (codepage)
+        00000000  (reserved)
+0128:   000001B8  (At offset 0x1B8, for TypeId #2, NameId #1,
+        00000004  (4 bytes of data)
+        00000000  (codepage)
+        00000000  (reserved)
+0138:   000001BC  (At offset 0x1BC, for TypeId #2, NameId #2,
+        00000004  (4 bytes of data)
+        00000000  (codepage)
+        00000000  (reserved)
+0148:   000001C0  (At offset 0x1C0, for TypeId #2, NameId #3,
+        00000004  (4 bytes of data)
+        00000000  (codepage)
+        00000000  (reserved)
+0158:   000001C4  (At offset 0x1C4, for TypeId #2, NameId #4,
+        00000004  (4 bytes of data)
+        00000000  (codepage)
+        00000000  (reserved)
+0168:   000001C8  (At offset 0x1C8, for TypeId #9, NameId #1,
+        00000004  (4 bytes of data)
+        00000000  (codepage)
+        00000000  (reserved)
+0178:   000001CC  (At offset 0x1CC, for TypeId #9, NameId #9, Language id #0
+        00000004  (4 bytes of data)
+        00000000  (codepage)
+        00000000  (reserved)
+0188:   000001D0  (At offset 0x1D0, for TypeId #9, NameId #9, Language id #1
+        00000004  (4 bytes of data)
+        00000000  (codepage)
+        00000000  (reserved)
+0198:   000001D4  (At offset 0x1D4, for TypeId #9, NameId #9, Language id #2
+        00000004  (4 bytes of data)
+        00000000  (codepage)
+        00000000  (reserved)
+
+And the data for the resources will look like:
+01A8:          00010001
+01AC:          10010001
+01B0:          00010002
+01B4:          00010003
+01B8:          00020001
+01BC:          00020002
+01C0:          00020003
+01C4:          00020004
+01C8:          00090001
+01CC:          00090009
+01D0:          10090009
+01D4:          20090009
+
+
+9. Fixup Table
+
+The Fixup Table contains entries for all fixups in the image. The
+Total Fixup Data Size in the PE Header is the number of bytes in the
+fixup table. The fixup table is broken into blocks of fixups. Each
+block represents the fixups for a 4K page.
+
+Fixups that are resolved by the linker do not need to be processed by
+the loader, unless the load image can't be loaded at the Image Base
+specified in the PE Header.
+
+9.1 Fixup Block
+
+Fixup blocks have the following format:
+
+    ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
+    ³             PAGE RVA              ³
+    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
+    ³            BLOCK SIZE             ³
+    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
+    ³   TYPE/OFFSET   ³   TYPE/OFFSET   ³
+    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
+    ³   TYPE/OFFSET   ³       ...       ³
+    ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
+    
+Figure 20.  Fixup Block Format
+
+To apply a fixup, a delta needs to be calculated.  The 32-bit delta
+is the difference between the preferred base, and the base where the
+image is actually loaded.  If the image is loaded at its preferred
+base, the delta would be zero, and thus the fixups would not have to
+be applied. Each block must start on a DWORD boundary. The ABSOLUTE
+fixup type can be used to pad a block.
+
+PAGE RVA = DD Page RVA. The image base plus the page rva is added to
+each offset to create the virtual address of where the fixup needs to
+be applied.
+
+BLOCK SIZE = DD Number of bytes in the fixup block. This includes the
+PAGE RVA and SIZE fields.
+
+TYPE/OFFSET is defined as:
+
+     1    1          0
+     5    1
+    ÚÄÄÄÄÒÄÄÄÄÄÄÄÄÄÄÄÄ¿
+    ³TYPEº   OFFSET   ³
+    ÀÄÄÄÄÐÄÄÄÄÄÄÄÄÄÄÄÄÙ
+Figure 21.  Fixup Record Format
+
+TYPE = 4-bit fixup type. This value has the following definitions:
+
+  o  0h __ABSOLUTE. This is a NOP. The fixup is skipped.
+     
+  o  1h __HIGH. Add the high 16-bits of the delta to the 16-bit field
+     at Offset.  The 16-bit field represents the high value of a 32-
+     bit word.
+     
+  o  2h __LOW. Add the low 16-bits of the delta to the 16-bit field
+     at Offset.  The 16-bit field represents the low half value of a
+     32-bit word.  This fixup will only be emitted for a RISC machine
+     when the image Object Align isn't the default of 64K.
+     
+  o  3h __HIGHLOW. Apply the 32-bit delta to the 32-bit field at
+     Offset.
+     
+  o  4h __HIGHADJUST. This fixup requires a full 32-bit value.  The
+     high 16-bits is located at Offset, and the low 16-bits is
+     located in the next Offset array element (this array element is
+     included in the SIZE field). The two need to be combined into a
+     signed variable.  Add the 32-bit delta.  Then add 0x8000 and
+     store the high 16-bits of the signed variable to the 16-bit
+     field at Offset.
+     
+  o  5h __MIPSJMPADDR.
+     
+All other values are reserved.
+
+
+
+10. Debug Information
+
+The debug information is defined by the debugger and is not
+controlled by the portable EXE format or linker.  The only data
+defined by the portable EXE format is the Debug Directory Table.
+
+10.1 Debug Directory
+
+The debug directory table consists of one or more entries that have
+the following format:
+
+    ÚÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄ¿
+    ³            DEBUG FLAGS            ³
+    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
+    ³           TIME/DATE STAMP         ³
+    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
+    ³  MAJOR VERSION  ³  MINOR VERSION  ³
+    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
+    ³             DEBUG TYPE            ³
+    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
+    ³             DATA SIZE             ³
+    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
+    ³             DATA RVA              ³
+    ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
+    ³             DATA SEEK             ³
+    ÀÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÙ
+    
+Figure 22.  Debug Directory Entry
+
+DEBUG FLAGS = DD Set to zero for now.
+
+TIME/DATE STAMP = DD Time/Date the debug data was created.
+
+MAJOR/MINOR VERSION = DW Version stamp.
+This stamp can be used to determine the version of the debug data.
+
+DEBUG TYPE = DD Format type.
+To support multiple debuggers, this field determines the format of
+the debug information. This value has the following definitions:
+
+  o  0001h __Image contains COFF symbolics.
+     
+  o  0001h __Image contains CodeView symbolics.
+     
+  o  0001h __Image contains FPO symbolics.
+     
+DATA SIZE = DD The number of bytes in the debug data. This is the
+size of the actual debug data and does not include the debug
+directory.
+
+DATA RVA = DD The relative virtual address of the debug data. This
+address is relative to the beginning of the Image Base.
+
+DATA SEEK = DD The seek value from the beginning of the file to the
+debug data.
+
+If the image contains more than one type of debug information, then
+the next debug directory will immediately follow the first debug
+directory.
index 14bfec7..7be8db3 100644 (file)
-/* \r
-   Base.h\r
-\r
-   Base definitions\r
-\r
-   Copyright (C) 1996, 1997 Free Software Foundation, Inc.\r
-\r
-   Author: Scott Christley <scottc@net-community.com>\r
-\r
-   This file is part of the Windows32 API Library.\r
-\r
-   This library is free software; you can redistribute it and/or\r
-   modify it under the terms of the GNU Library General Public\r
-   License as published by the Free Software Foundation; either\r
-   version 2 of the License, or (at your option) any later version.\r
-   \r
-   This library is distributed in the hope that it will be useful,\r
-   but WITHOUT ANY WARRANTY; without even the implied warranty of\r
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r
-   Library General Public License for more details.\r
-\r
-   If you are interested in a warranty or support for this source code,\r
-   contact Scott Christley <scottc@net-community.com> for more information.\r
-   \r
-   You should have received a copy of the GNU Library General Public\r
-   License along with this library; see the file COPYING.LIB.\r
-   If not, write to the Free Software Foundation, \r
-   59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
-*/ \r
-\r
-#ifndef _GNU_H_WINDOWS32_BASE\r
-#define _GNU_H_WINDOWS32_BASE\r
-\r
-#ifdef __cplusplus\r
-extern "C" {\r
-#endif /* __cplusplus */\r
-\r
-#ifndef NULL\r
-#ifdef __cplusplus\r
-#define NULL  (0)\r
-#else\r
-#define NULL  ((void *)0)\r
-#endif\r
-#endif /* !NULL */\r
-\r
-#define FALSE 0\r
-#define TRUE 1\r
-\r
-#ifndef RC_INVOKED\r
-\r
-/* typedef ACMDRIVERENUMCB;\r
-typedef ACMDRIVERPROC;\r
-typedef ACMFILERCHOOSEHOOKPROC;\r
-typedef ACMFILTERENUMCB;\r
-typedef ACMFILTERTAGENUMCB;\r
-typedef ACMFORMATCHOOSEHOOKPROC;\r
-typedef ACMFORMATENUMCB;\r
-typedef ACMFORMATTAGENUMCB;\r
-typedef APPLET_PROC;\r
-*/\r
-typedef unsigned short ATOM;\r
-/* Changed from BOOL to WINBOOL to avoid Objective-C conflict */\r
-typedef int WINBOOL;\r
-typedef unsigned char BOOLEAN;\r
-typedef unsigned char BYTE;\r
-typedef unsigned long CALTYPE;\r
-typedef unsigned long CALID;\r
-typedef char CCHAR;\r
-typedef unsigned long COLORREF;\r
-#define CONST const\r
-\r
-/* Check VOID before defining CHAR, SHORT, and LONG */\r
-#ifndef VOID\r
-#define VOID void\r
-typedef char CHAR;\r
-typedef short SHORT;\r
-typedef long LONG;\r
-#endif\r
-\r
-/*\r
-typedef CTRYID;\r
-typedef DLGPROC;\r
-*/\r
-typedef unsigned int DWORD; /* was unsigned long */\r
-typedef double DWORDLONG, *PDWORDLONG;\r
-/*\r
-typedef EDITWORDBREAKPROC;\r
-typedef ENHMFENUMPROC;\r
-typedef ENUMRESLANGPROC;\r
-typedef ENUMRESNAMEPROC;\r
-typedef ENUMRESTYPEPROC;\r
-*/\r
-typedef float FLOAT;\r
-/* typedef GLOBALHANDLE; */\r
-typedef void *HANDLE;\r
-typedef HANDLE HACCEL;\r
-typedef HANDLE HBITMAP;\r
-typedef HANDLE HBRUSH;\r
-typedef HANDLE HCOLORSPACE;\r
-typedef HANDLE HCONV;\r
-typedef HANDLE HCONVLIST;\r
-typedef HANDLE HCURSOR;\r
-typedef HANDLE HDBC;\r
-typedef HANDLE HDC;\r
-typedef HANDLE HDDEDATA;\r
-typedef HANDLE HDESK;\r
-typedef HANDLE HDROP;\r
-typedef HANDLE HDWP;\r
-typedef HANDLE HENHMETAFILE;\r
-typedef HANDLE HENV;\r
-typedef int HFILE;\r
-typedef HANDLE HFONT;\r
-typedef HANDLE HGDIOBJ;\r
-typedef HANDLE HGLOBAL;\r
-typedef HANDLE HGLRC;\r
-typedef HANDLE HHOOK;\r
-typedef HANDLE HICON;\r
-typedef HANDLE HIMAGELIST;\r
-typedef HANDLE HINSTANCE;\r
-typedef HANDLE HKEY, *PHKEY;\r
-typedef HANDLE HKL;\r
-typedef HANDLE HLOCAL;\r
-typedef HANDLE HMENU;\r
-typedef HANDLE HMETAFILE;\r
-typedef HANDLE HMODULE;\r
-typedef HANDLE HPALETTE;\r
-typedef HANDLE HPEN;\r
-typedef HANDLE HRASCONN;\r
-typedef long HRESULT;\r
-typedef HANDLE HRGN;\r
-typedef HANDLE HRSRC;\r
-typedef HANDLE HSTMT;\r
-typedef HANDLE HSZ;\r
-typedef HANDLE HWINSTA;\r
-typedef HANDLE HWND;\r
-typedef int INT;\r
-typedef unsigned short LANGID;\r
-typedef DWORD LCID;\r
-typedef DWORD LCTYPE;\r
-/* typedef LOCALHANDLE */\r
-typedef double LONGLONG, *PLONGLONG;\r
-typedef unsigned short *LP;\r
-typedef long LPARAM;\r
-typedef WINBOOL *LPBOOL;\r
-typedef BYTE *LPBYTE;\r
-typedef CONST CHAR *LPCCH;\r
-typedef CHAR *LPCH;\r
-typedef COLORREF *LPCOLORREF;\r
-typedef const char *LPCSTR;\r
-typedef char* PCSZ;\r
-   \r
-#ifdef UNICODE\r
-typedef const unsigned short *LPCTSTR;\r
-#else\r
-typedef const char *LPCTSTR;\r
-#endif /* UNICODE */\r
-\r
-typedef const unsigned short *LPCWCH;\r
-typedef const unsigned short *LPCWSTR;\r
-typedef DWORD *LPDWORD;\r
-/* typedef LPFRHOOKPROC; */\r
-typedef HANDLE *LPHANDLE;\r
-/* typedef LPHANDLER_FUNCTION; */\r
-typedef int *LPINT;\r
-typedef long *LPLONG;\r
-typedef char *LPSTR;\r
-\r
-#ifdef UNICODE\r
-typedef unsigned short *LPTCH;\r
-typedef unsigned short *LPTSTR;\r
-#else\r
-typedef char *LPTCH;\r
-typedef char *LPTSTR;\r
-#endif /* UNICODE */\r
-\r
-typedef long LRESULT;\r
-typedef void *LPVOID;\r
-typedef const void *LPCVOID;\r
-typedef unsigned short *LPWCH;\r
-typedef unsigned short *LPWORD;\r
-typedef unsigned short *LPWSTR;\r
-typedef unsigned short *PWSTR;\r
-/* typedef NPSTR; */\r
-typedef unsigned short *NWPSTR;\r
-typedef WINBOOL *PWINBOOL;\r
-typedef BYTE *PBOOLEAN;\r
-typedef BYTE *PBYTE;\r
-typedef const CHAR *PCCH;\r
-typedef CHAR *PCH;\r
-typedef CHAR *PCHAR;\r
-typedef const char *PCSTR;\r
-typedef const unsigned short *PCWCH;\r
-typedef const unsigned short *PCWSTR;\r
-typedef DWORD *PDWORD;\r
-typedef float *PFLOAT;\r
-typedef HANDLE *PHANDLE;\r
-/* typedef PHKEY; */\r
-typedef int *PINT;\r
-/* typedef LCID *PLCID; */\r
-typedef long *PLONG;\r
-typedef short *PSHORT;\r
-/* typedef PSID; */\r
-typedef char *PSTR;\r
-typedef char *PSZ;\r
-\r
-#ifdef UNICODE\r
-typedef unsigned short *PTBYTE;\r
-typedef unsigned short *PTCH;\r
-typedef unsigned short *PTCHAR;\r
-typedef unsigned short *PTSTR;\r
-#else\r
-typedef unsigned char *PTBYTE;\r
-typedef char *PTCH;\r
-typedef char *PTCHAR;\r
-typedef char *PTSTR;\r
-#endif /* UNICODE */\r
-\r
-typedef unsigned char *PUCHAR;\r
-typedef unsigned int *PUINT;\r
-typedef unsigned long *PULONG;\r
-typedef unsigned short *PUSHORT;\r
-typedef void *PVOID;\r
-typedef unsigned short *PWCH;\r
-typedef unsigned short *PWCHAR;\r
-typedef unsigned short *PWORD;\r
-/*\r
-typedef PWSTR;\r
-typedef REGSAM;\r
-*/\r
-\r
-typedef short RETCODE;\r
-\r
-typedef HANDLE SC_HANDLE;\r
-typedef LPVOID  SC_LOCK;\r
-typedef SC_HANDLE *LPSC_HANDLE;\r
-typedef DWORD SERVICE_STATUS_HANDLE;\r
-/* typedef SPHANDLE; */\r
-\r
-#ifdef UNICODE\r
-typedef unsigned short TBYTE;\r
-typedef unsigned short TCHAR;\r
-typedef unsigned short BCHAR;\r
-#else\r
-typedef unsigned char TBYTE;\r
-typedef char TCHAR;\r
-typedef BYTE BCHAR;\r
-#endif /* UNICODE */\r
-\r
-typedef unsigned char UCHAR;\r
-typedef unsigned int UINT;\r
-typedef unsigned long ULONG;\r
-typedef unsigned short USHORT;\r
-typedef unsigned short WCHAR;\r
-typedef unsigned short WORD;\r
-typedef unsigned int WPARAM;\r
-/* typedef YIELDPROC; */\r
-\r
-/* Only use __stdcall under WIN32 compiler */\r
-#ifdef i386\r
-#define STDCALL     __attribute__ ((stdcall))\r
-#define CDECL       __attribute((cdecl))\r
-#define CALLBACK    WINAPI\r
-#define PASCAL      WINAPI\r
-#else\r
-#define STDCALL\r
-#define CDECL\r
-#define CALLBACK\r
-#define PASCAL\r
-#endif\r
-#define WINAPI      STDCALL\r
-#define APIENTRY    STDCALL\r
-#define WINGDIAPI\r
-\r
-#define _export\r
-\r
-/*\r
-  Enumerations\r
-*/\r
-typedef enum _ACL_INFORMATION_CLASS {\r
-  AclRevisionInformation = 1,   \r
-  AclSizeInformation            \r
-} ACL_INFORMATION_CLASS; \r
\r
-typedef enum _MEDIA_TYPE { \r
-  Unknown,                \r
-  F5_1Pt2_512,            \r
-  F3_1Pt44_512,           \r
-  F3_2Pt88_512,           \r
-  F3_20Pt8_512,           \r
-  F3_720_512,             \r
-  F5_360_512,             \r
-  F5_320_512,             \r
-  F5_320_1024,            \r
-  F5_180_512,             \r
-  F5_160_512,             \r
-  RemovableMedia,         \r
-  FixedMedia              \r
-} MEDIA_TYPE; \r
\r
-#define RASCS_DONE 0x2000\r
-#define RASCS_PAUSED 0x1000\r
-typedef enum _RASCONNSTATE { \r
-    RASCS_OpenPort = 0, \r
-    RASCS_PortOpened, \r
-    RASCS_ConnectDevice, \r
-    RASCS_DeviceConnected, \r
-    RASCS_AllDevicesConnected, \r
-    RASCS_Authenticate, \r
-    RASCS_AuthNotify, \r
-    RASCS_AuthRetry, \r
-    RASCS_AuthCallback, \r
-    RASCS_AuthChangePassword, \r
-    RASCS_AuthProject, \r
-    RASCS_AuthLinkSpeed, \r
-    RASCS_AuthAck, \r
-    RASCS_ReAuthenticate, \r
-    RASCS_Authenticated, \r
-    RASCS_PrepareForCallback, \r
-    RASCS_WaitForModemReset, \r
-    RASCS_WaitForCallback,\r
-    RASCS_Projected, \r
\r
-    RASCS_StartAuthentication,  \r
-    RASCS_CallbackComplete,     \r
-    RASCS_LogonNetwork,         \r
\r
-    RASCS_Interactive = RASCS_PAUSED, \r
-    RASCS_RetryAuthentication, \r
-    RASCS_CallbackSetByCaller, \r
-    RASCS_PasswordExpired, \r
\r
-    RASCS_Connected = RASCS_DONE, \r
-    RASCS_Disconnected \r
-} RASCONNSTATE ; \r
\r
-typedef enum _RASPROJECTION {  \r
-    RASP_Amb = 0x10000, \r
-    RASP_PppNbf = 0x803F, \r
-    RASP_PppIpx = 0x802B, \r
-    RASP_PppIp = 0x8021 \r
-} RASPROJECTION ; \r
\r
-typedef enum _SECURITY_IMPERSONATION_LEVEL {\r
-    SecurityAnonymous, \r
-    SecurityIdentification, \r
-    SecurityImpersonation, \r
-    SecurityDelegation \r
-} SECURITY_IMPERSONATION_LEVEL; \r
\r
-typedef enum _SID_NAME_USE { \r
-    SidTypeUser = 1, \r
-    SidTypeGroup, \r
-    SidTypeDomain, \r
-    SidTypeAlias, \r
-    SidTypeWellKnownGroup, \r
-    SidTypeDeletedAccount, \r
-    SidTypeInvalid, \r
-    SidTypeUnknown \r
-} SID_NAME_USE, *PSID_NAME_USE; \r
\r
-typedef enum _TOKEN_INFORMATION_CLASS {\r
-    TokenUser = 1, \r
-    TokenGroups, \r
-    TokenPrivileges, \r
-    TokenOwner, \r
-    TokenPrimaryGroup, \r
-    TokenDefaultDacl, \r
-    TokenSource, \r
-    TokenType, \r
-    TokenImpersonationLevel, \r
-    TokenStatistics \r
-} TOKEN_INFORMATION_CLASS; \r
\r
-typedef enum tagTOKEN_TYPE {\r
-    TokenPrimary = 1, \r
-    TokenImpersonation \r
-} TOKEN_TYPE; \r
\r
-#endif /* ! defined (RC_INVOKED) */\r
-\r
-/*\r
-  Macros\r
-*/\r
-#define FORWARD_WM_NOTIFY(hwnd, idFrom, pnmhdr, fn)  (void)(fn)((hwnd), WM_NOTIFY, (WPARAM)(int)(id),  (LPARAM)(NMHDR FAR*)(pnmhdr)) \r
-\r
-#define GetBValue(rgb)   ((BYTE) ((rgb) >> 16)) \r
-#define GetGValue(rgb)   ((BYTE) (((WORD) (rgb)) >> 8)) \r
-#define GetRValue(rgb)   ((BYTE) (rgb)) \r
-#define RGB(r, g ,b)  ((DWORD) (((BYTE) (r) | ((WORD) (g) << 8)) | (((DWORD) (BYTE) (b)) << 16))) \r
-\r
-#define HANDLE_WM_NOTIFY(hwnd, wParam, lParam, fn) (fn)((hwnd), (int)(wParam), (NMHDR FAR*)(lParam)) \r
-\r
-#define HIBYTE(w)   ((BYTE) (((WORD) (w) >> 8) & 0xFF)) \r
-#define HIWORD(l)   ((WORD) (((DWORD) (l) >> 16) & 0xFFFF)) \r
-#define LOBYTE(w)   ((BYTE) (w)) \r
-#define LOWORD(l)   ((WORD) (l)) \r
-#define MAKELONG(a, b) ((LONG) (((WORD) (a)) | ((DWORD) ((WORD) (b))) << 16)) \r
-#define MAKEWORD(a, b) ((WORD) (((BYTE) (a)) | ((WORD) ((BYTE) (b))) << 8)) \r
-\r
-/* original Cygnus headers also had the following defined: */\r
-#define SEXT_HIWORD(l)     ((((int)l) >> 16))\r
-#define ZEXT_HIWORD(l)     ((((unsigned int)l) >> 16))\r
-#define SEXT_LOWORD(l)     ((int)(short)l)\r
-\r
-#define INDEXTOOVERLAYMASK(i) ((i) << 8) \r
-#define INDEXTOSTATEIMAGEMASK(i) ((i) << 12) \r
-\r
-#define MAKEINTATOM(i)   (LPTSTR) ((DWORD) ((WORD) (i))) \r
-#define MAKEINTRESOURCE(i)  (LPTSTR) ((DWORD) ((WORD) (i)))\r
-\r
-#define MAKELANGID(p, s) ((((WORD) (s)) << 10) | (WORD) (p)) \r
-#define PRIMARYLANGID(lgid)    ((WORD  )(lgid) & 0x3ff) \r
-#define SUBLANGID(lgid)        ((WORD  )(lgid) >> 10) \r
-\r
-#define LANGIDFROMLCID(lcid)   ((WORD) (lcid)) \r
-#define SORTIDFROMLCID(lcid) ((WORD  )((((DWORD)(lcid)) & 0x000FFFFF) >> 16)) \r
-#define MAKELCID(lgid, srtid)  ((DWORD)((((DWORD)((WORD)(srtid))) << 16) |  ((DWORD)((WORD)(lgid))))) \r
-#define MAKELPARAM(l, h)   ((LPARAM) MAKELONG(l, h)) \r
-#define MAKELRESULT(l, h)   ((LRESULT) MAKELONG(l, h)) \r
-#define MAKEPOINTS(l)   (*((POINTS FAR *) & (l))) \r
-#define MAKEROP4(fore,back) (DWORD)((((back) << 8) & 0xFF000000) | (fore)) \r
-#define MAKEWPARAM(l, h)   ((WPARAM) MAKELONG(l, h)) \r
-\r
-#ifndef max\r
-#define max(a, b)  (((a) > (b)) ? (a) : (b)) \r
-#endif\r
-\r
-#ifndef min\r
-#define min(a, b)  (((a) < (b)) ? (a) : (b)) \r
-#endif\r
-\r
-#define PALETTEINDEX(i) ((COLORREF) (0x01000000 | (DWORD) (WORD) (i))) \r
-#define PALETTERGB(r, g, b)  (0x02000000 | RGB(r, g, b)) \r
-#define POINTSTOPOINT(pt, pts) {(pt).x = (SHORT) LOWORD(pts); (pt).y = (SHORT) HIWORD(pts);} \r
-#define POINTTOPOINTS(pt) (MAKELONG((short) ((pt).x), (short) ((pt).y))) \r
-\r
-#define INDEXTOOVERLAYMASK(i) ((i) << 8)  \r
-#define INDEXTOSTATEIMAGEMASK(i) ((i) << 12)  \r
-\r
-#ifdef UNICODE\r
-#define TEXT(quote) L##quote \r
-#else\r
-#define TEXT(quote) quote\r
-#endif\r
-\r
-#ifndef RC_INVOKED\r
-\r
-/*\r
-   Definitions for callback procedures\r
-*/\r
-typedef int CALLBACK (*BFFCALLBACK) (HWND, UINT, LPARAM, LPARAM);\r
-typedef UINT CALLBACK (*LPCCHOOKPROC) (HWND, UINT, WPARAM, LPARAM);\r
-typedef UINT CALLBACK (*LPCFHOOKPROC) (HWND, UINT, WPARAM, LPARAM);\r
-typedef DWORD CALLBACK (*PTHREAD_START_ROUTINE) (LPVOID);\r
-typedef PTHREAD_START_ROUTINE LPTHREAD_START_ROUTINE;\r
-typedef DWORD CALLBACK (*EDITSTREAMCALLBACK) (DWORD, LPBYTE, LONG, LONG);\r
-typedef UINT CALLBACK (*LPFRHOOKPROC) (HWND, UINT, WPARAM, LPARAM);\r
-typedef UINT CALLBACK (*LPOFNHOOKPROC) (HWND, UINT, WPARAM, LPARAM);\r
-typedef UINT CALLBACK (*LPPRINTHOOKPROC) (HWND, UINT, WPARAM, LPARAM);\r
-typedef UINT CALLBACK (*LPSETUPHOOKPROC) (HWND, UINT, WPARAM, LPARAM);\r
-typedef WINBOOL CALLBACK (*DLGPROC) (HWND, UINT, WPARAM, LPARAM);\r
-typedef int CALLBACK (*PFNPROPSHEETCALLBACK) (HWND, UINT, LPARAM);\r
-typedef VOID CALLBACK (*LPSERVICE_MAIN_FUNCTION) (DWORD, LPTSTR);\r
-typedef int CALLBACK (*PFNTVCOMPARE) (LPARAM, LPARAM, LPARAM);\r
-typedef LRESULT CALLBACK (*WNDPROC) (HWND, UINT, WPARAM, LPARAM);\r
-typedef int CALLBACK (*FARPROC)(void);\r
-typedef FARPROC PROC;\r
-typedef WINBOOL CALLBACK (*ENUMRESTYPEPROC) (HANDLE, LPTSTR, LONG);\r
-typedef WINBOOL CALLBACK (*ENUMRESNAMEPROC) (HANDLE, LPCTSTR, LPTSTR, LONG);\r
-typedef WINBOOL CALLBACK (*ENUMRESLANGPROC) (HANDLE, LPCTSTR, LPCTSTR, WORD, LONG);\r
-typedef FARPROC DESKTOPENUMPROC;\r
-typedef WINBOOL CALLBACK (*ENUMWINDOWSPROC) (HWND, LPARAM);\r
-typedef WINBOOL CALLBACK (*ENUMWINDOWSTATIONPROC) (LPTSTR, LPARAM);\r
-typedef VOID CALLBACK (*SENDASYNCPROC) (HWND, UINT, DWORD, LRESULT);\r
-typedef VOID CALLBACK (*TIMERPROC) (HWND, UINT, UINT, DWORD);\r
-typedef FARPROC GRAYSTRINGPROC;\r
-typedef WINBOOL CALLBACK (*DRAWSTATEPROC) (HDC, LPARAM, WPARAM, int, int);\r
-typedef WINBOOL CALLBACK (*PROPENUMPROCEX) (HWND, LPCTSTR, HANDLE, DWORD);\r
-typedef WINBOOL CALLBACK (*PROPENUMPROC) (HWND, LPCTSTR, HANDLE);\r
-typedef LRESULT CALLBACK (*HOOKPROC) (int, WPARAM, LPARAM);\r
-typedef VOID CALLBACK (*ENUMOBJECTSPROC) (LPVOID, LPARAM);\r
-typedef VOID CALLBACK (*LINEDDAPROC) (int, int, LPARAM);\r
-typedef WINBOOL CALLBACK (*ABORTPROC) (HDC, int);\r
-typedef UINT CALLBACK (*LPPAGEPAINTHOOK) (HWND, UINT, WPARAM, LPARAM );\r
-typedef UINT CALLBACK (*LPPAGESETUPHOOK) (HWND, UINT, WPARAM, LPARAM );\r
-typedef int CALLBACK (*ICMENUMPROC) (LPTSTR, LPARAM);\r
-typedef LONG (*EDITWORDBREAKPROCEX) (char *, LONG, BYTE, INT);\r
-typedef int CALLBACK (*PFNLVCOMPARE) (LPARAM, LPARAM, LPARAM);\r
-typedef WINBOOL CALLBACK (*LOCALE_ENUMPROC) (LPTSTR);\r
-typedef WINBOOL CALLBACK (*CODEPAGE_ENUMPROC) (LPTSTR);\r
-typedef WINBOOL CALLBACK (*DATEFMT_ENUMPROC) (LPTSTR);\r
-typedef WINBOOL CALLBACK (*TIMEFMT_ENUMPROC) (LPTSTR);\r
-typedef WINBOOL CALLBACK (*CALINFO_ENUMPROC) (LPTSTR);\r
-typedef WINBOOL CALLBACK (*PHANDLER_ROUTINE) (DWORD);\r
-typedef WINBOOL CALLBACK (*LPHANDLER_FUNCTION) (DWORD);\r
-typedef UINT CALLBACK (*PFNGETPROFILEPATH) (LPCTSTR, LPSTR, UINT);\r
-typedef UINT CALLBACK (*PFNRECONCILEPROFILE) (LPCTSTR, LPCTSTR, DWORD);\r
-typedef WINBOOL CALLBACK (*PFNPROCESSPOLICIES) (HWND, LPCTSTR, LPCTSTR, LPCTSTR, DWORD);\r
-\r
-#define SECURITY_NULL_SID_AUTHORITY     {0,0,0,0,0,0}\r
-#define SECURITY_WORLD_SID_AUTHORITY    {0,0,0,0,0,1}\r
-#define SECURITY_LOCAL_SID_AUTHORITY    {0,0,0,0,0,2}\r
-#define SECURITY_CREATOR_SID_AUTHORITY  {0,0,0,0,0,3}\r
-#define SECURITY_NON_UNIQUE_AUTHORITY   {0,0,0,0,0,4}\r
-#define SECURITY_NT_AUTHORITY           {0,0,0,0,0,5}\r
-\r
-#define SE_CREATE_TOKEN_NAME              TEXT("SeCreateTokenPrivilege")\r
-#define SE_ASSIGNPRIMARYTOKEN_NAME        TEXT("SeAssignPrimaryTokenPrivilege")\r
-#define SE_LOCK_MEMORY_NAME               TEXT("SeLockMemoryPrivilege")\r
-#define SE_INCREASE_QUOTA_NAME            TEXT("SeIncreaseQuotaPrivilege")\r
-#define SE_UNSOLICITED_INPUT_NAME         TEXT("SeUnsolicitedInputPrivilege")\r
-#define SE_MACHINE_ACCOUNT_NAME           TEXT("SeMachineAccountPrivilege")\r
-#define SE_TCB_NAME                       TEXT("SeTcbPrivilege")\r
-#define SE_SECURITY_NAME                  TEXT("SeSecurityPrivilege")\r
-#define SE_TAKE_OWNERSHIP_NAME            TEXT("SeTakeOwnershipPrivilege")\r
-#define SE_LOAD_DRIVER_NAME               TEXT("SeLoadDriverPrivilege")\r
-#define SE_SYSTEM_PROFILE_NAME            TEXT("SeSystemProfilePrivilege")\r
-#define SE_SYSTEMTIME_NAME                TEXT("SeSystemtimePrivilege")\r
-#define SE_PROF_SINGLE_PROCESS_NAME       TEXT("SeProfileSingleProcessPrivilege")\r
-#define SE_INC_BASE_PRIORITY_NAME         TEXT("SeIncreaseBasePriorityPrivilege")\r
-#define SE_CREATE_PAGEFILE_NAME           TEXT("SeCreatePagefilePrivilege")\r
-#define SE_CREATE_PERMANENT_NAME          TEXT("SeCreatePermanentPrivilege")\r
-#define SE_BACKUP_NAME                    TEXT("SeBackupPrivilege")\r
-#define SE_RESTORE_NAME                   TEXT("SeRestorePrivilege")\r
-#define SE_SHUTDOWN_NAME                  TEXT("SeShutdownPrivilege")\r
-#define SE_DEBUG_NAME                     TEXT("SeDebugPrivilege")\r
-#define SE_AUDIT_NAME                     TEXT("SeAuditPrivilege")\r
-#define SE_SYSTEM_ENVIRONMENT_NAME        TEXT("SeSystemEnvironmentPrivilege")\r
-#define SE_CHANGE_NOTIFY_NAME             TEXT("SeChangeNotifyPrivilege")\r
-#define SE_REMOTE_SHUTDOWN_NAME           TEXT("SeRemoteShutdownPrivilege")\r
-\r
-#define SERVICES_ACTIVE_DATABASEW      L"ServicesActive"\r
-#define SERVICES_FAILED_DATABASEW      L"ServicesFailed"\r
-#define SERVICES_ACTIVE_DATABASEA      "ServicesActive"\r
-#define SERVICES_FAILED_DATABASEA      "ServicesFailed"\r
-#define SC_GROUP_IDENTIFIERW           L'+'\r
-#define SC_GROUP_IDENTIFIERA           '+'\r
-\r
-#ifdef UNICODE\r
-#define SERVICES_ACTIVE_DATABASE       SERVICES_ACTIVE_DATABASEW\r
-#define SERVICES_FAILED_DATABASE       SERVICES_FAILED_DATABASEW\r
-#define SC_GROUP_IDENTIFIER            SC_GROUP_IDENTIFIERW\r
-#else \r
-#define SERVICES_ACTIVE_DATABASE       SERVICES_ACTIVE_DATABASEA\r
-#define SERVICES_FAILED_DATABASE       SERVICES_FAILED_DATABASEA\r
-#define SC_GROUP_IDENTIFIER            SC_GROUP_IDENTIFIERA\r
-#endif /* UNICODE */\r
-\r
-/* ---------------------------------- */\r
-/* From ddeml.h in old Cygnus headers */\r
-\r
-typedef void (*CALLB) (void);\r
-typedef CALLB PFNCALLBACK;\r
-\r
-typedef WINBOOL SECURITY_CONTEXT_TRACKING_MODE;\r
-\r
-/* End of stuff from ddeml.h in old Cygnus headers */\r
-/* ----------------------------------------------- */\r
-\r
-typedef FARPROC WNDENUMPROC;\r
-typedef FARPROC ENHMFENUMPROC;\r
-typedef DWORD CCSTYLE, *PCCSTYLE, *LPCCSTYLE;\r
-typedef DWORD CCSTYLEFLAGA, *PCCSTYLEFLAGA, *LPCCSTYLEFLAGA;\r
-#define DECLARE_HANDLE(s) typedef HANDLE s\r
-\r
-#endif /* ! defined (RC_INVOKED) */\r
-\r
-#ifdef __cplusplus\r
-}\r
-#endif /* __cplusplus */\r
-\r
-#endif /* _GNU_H_WINDOWS32_BASE */\r
+/* 
+   Base.h
+
+   Base definitions
+
+   Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+
+   Author: Scott Christley <scottc@net-community.com>
+
+   This file is part of the Windows32 API Library.
+
+   This library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public
+   License as published by the Free Software Foundation; either
+   version 2 of the License, or (at your option) any later version.
+   
+   This library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   If you are interested in a warranty or support for this source code,
+   contact Scott Christley <scottc@net-community.com> for more information.
+   
+   You should have received a copy of the GNU Library General Public
+   License along with this library; see the file COPYING.LIB.
+   If not, write to the Free Software Foundation, 
+   59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/ 
+
+#ifndef _GNU_H_WINDOWS32_BASE
+#define _GNU_H_WINDOWS32_BASE
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+#ifndef NULL
+#ifdef __cplusplus
+#define NULL  (0)
+#else
+#define NULL  ((void *)0)
+#endif
+#endif /* !NULL */
+
+#define FALSE 0
+#define TRUE 1
+
+#ifndef RC_INVOKED
+
+/* typedef ACMDRIVERENUMCB;
+typedef ACMDRIVERPROC;
+typedef ACMFILERCHOOSEHOOKPROC;
+typedef ACMFILTERENUMCB;
+typedef ACMFILTERTAGENUMCB;
+typedef ACMFORMATCHOOSEHOOKPROC;
+typedef ACMFORMATENUMCB;
+typedef ACMFORMATTAGENUMCB;
+typedef APPLET_PROC;
+*/
+typedef unsigned short ATOM;
+/* Changed from BOOL to WINBOOL to avoid Objective-C conflict */
+typedef int WINBOOL;
+typedef unsigned char BOOLEAN;
+typedef unsigned char BYTE;
+typedef unsigned long CALTYPE;
+typedef unsigned long CALID;
+typedef char CCHAR;
+typedef unsigned long COLORREF;
+#define CONST const
+
+/* Check VOID before defining CHAR, SHORT, and LONG */
+#ifndef VOID
+#define VOID void
+typedef char CHAR;
+typedef short SHORT;
+typedef long LONG;
+#endif
+
+/*
+typedef CTRYID;
+typedef DLGPROC;
+*/
+typedef unsigned int DWORD; /* was unsigned long */
+typedef double DWORDLONG, *PDWORDLONG;
+/*
+typedef EDITWORDBREAKPROC;
+typedef ENHMFENUMPROC;
+typedef ENUMRESLANGPROC;
+typedef ENUMRESNAMEPROC;
+typedef ENUMRESTYPEPROC;
+*/
+typedef float FLOAT;
+/* typedef GLOBALHANDLE; */
+typedef void *HANDLE;
+typedef HANDLE HACCEL;
+typedef HANDLE HBITMAP;
+typedef HANDLE HBRUSH;
+typedef HANDLE HCOLORSPACE;
+typedef HANDLE HCONV;
+typedef HANDLE HCONVLIST;
+typedef HANDLE HCURSOR;
+typedef HANDLE HDBC;
+typedef HANDLE HDC;
+typedef HANDLE HDDEDATA;
+typedef HANDLE HDESK;
+typedef HANDLE HDROP;
+typedef HANDLE HDWP;
+typedef HANDLE HENHMETAFILE;
+typedef HANDLE HENV;
+typedef int HFILE;
+typedef HANDLE HFONT;
+typedef HANDLE HGDIOBJ;
+typedef HANDLE HGLOBAL;
+typedef HANDLE HGLRC;
+typedef HANDLE HHOOK;
+typedef HANDLE HICON;
+typedef HANDLE HIMAGELIST;
+typedef HANDLE HINSTANCE;
+typedef HANDLE HKEY, *PHKEY;
+typedef HANDLE HKL;
+typedef HANDLE HLOCAL;
+typedef HANDLE HMENU;
+typedef HANDLE HMETAFILE;
+typedef HANDLE HMODULE;
+typedef HANDLE HPALETTE;
+typedef HANDLE HPEN;
+typedef HANDLE HRASCONN;
+typedef long HRESULT;
+typedef HANDLE HRGN;
+typedef HANDLE HRSRC;
+typedef HANDLE HSTMT;
+typedef HANDLE HSZ;
+typedef HANDLE HWINSTA;
+typedef HANDLE HWND;
+typedef int INT;
+typedef unsigned short LANGID;
+typedef DWORD LCID;
+typedef DWORD LCTYPE;
+/* typedef LOCALHANDLE */
+typedef double LONGLONG, *PLONGLONG;
+typedef unsigned short *LP;
+typedef long LPARAM;
+typedef WINBOOL *LPBOOL;
+typedef BYTE *LPBYTE;
+typedef CONST CHAR *LPCCH;
+typedef CHAR *LPCH;
+typedef COLORREF *LPCOLORREF;
+typedef const char *LPCSTR;
+typedef char* PCSZ;
+   
+#ifdef UNICODE
+typedef const unsigned short *LPCTSTR;
+#else
+typedef const char *LPCTSTR;
+#endif /* UNICODE */
+
+typedef const unsigned short *LPCWCH;
+typedef const unsigned short *LPCWSTR;
+typedef DWORD *LPDWORD;
+/* typedef LPFRHOOKPROC; */
+typedef HANDLE *LPHANDLE;
+/* typedef LPHANDLER_FUNCTION; */
+typedef int *LPINT;
+typedef long *LPLONG;
+typedef char *LPSTR;
+
+#ifdef UNICODE
+typedef unsigned short *LPTCH;
+typedef unsigned short *LPTSTR;
+#else
+typedef char *LPTCH;
+typedef char *LPTSTR;
+#endif /* UNICODE */
+
+typedef long LRESULT;
+typedef void *LPVOID;
+typedef const void *LPCVOID;
+typedef unsigned short *LPWCH;
+typedef unsigned short *LPWORD;
+typedef unsigned short *LPWSTR;
+typedef unsigned short *PWSTR;
+/* typedef NPSTR; */
+typedef unsigned short *NWPSTR;
+typedef WINBOOL *PWINBOOL;
+typedef BYTE *PBOOLEAN;
+typedef BYTE *PBYTE;
+typedef const CHAR *PCCH;
+typedef CHAR *PCH;
+typedef CHAR *PCHAR;
+typedef const char *PCSTR;
+typedef const unsigned short *PCWCH;
+typedef const unsigned short *PCWSTR;
+typedef DWORD *PDWORD;
+typedef float *PFLOAT;
+typedef HANDLE *PHANDLE;
+/* typedef PHKEY; */
+typedef int *PINT;
+/* typedef LCID *PLCID; */
+typedef long *PLONG;
+typedef short *PSHORT;
+/* typedef PSID; */
+typedef char *PSTR;
+typedef char *PSZ;
+
+#ifdef UNICODE
+typedef unsigned short *PTBYTE;
+typedef unsigned short *PTCH;
+typedef unsigned short *PTCHAR;
+typedef unsigned short *PTSTR;
+#else
+typedef unsigned char *PTBYTE;
+typedef char *PTCH;
+typedef char *PTCHAR;
+typedef char *PTSTR;
+#endif /* UNICODE */
+
+typedef unsigned char *PUCHAR;
+typedef unsigned int *PUINT;
+typedef unsigned long *PULONG;
+typedef unsigned short *PUSHORT;
+typedef void *PVOID;
+typedef unsigned short *PWCH;
+typedef unsigned short *PWCHAR;
+typedef unsigned short *PWORD;
+/*
+typedef PWSTR;
+typedef REGSAM;
+*/
+
+typedef short RETCODE;
+
+typedef HANDLE SC_HANDLE;
+typedef LPVOID  SC_LOCK;
+typedef SC_HANDLE *LPSC_HANDLE;
+typedef DWORD SERVICE_STATUS_HANDLE;
+/* typedef SPHANDLE; */
+
+#ifdef UNICODE
+typedef unsigned short TBYTE;
+typedef unsigned short TCHAR;
+typedef unsigned short BCHAR;
+#else
+typedef unsigned char TBYTE;
+typedef char TCHAR;
+typedef BYTE BCHAR;
+#endif /* UNICODE */
+
+typedef unsigned char UCHAR;
+typedef unsigned int UINT;
+typedef unsigned long ULONG;
+typedef unsigned short USHORT;
+typedef unsigned short WCHAR;
+typedef unsigned short WORD;
+typedef unsigned int WPARAM;
+/* typedef YIELDPROC; */
+
+/* Only use __stdcall under WIN32 compiler */
+#ifdef i386
+#define STDCALL     __attribute__ ((stdcall))
+#define CDECL       __attribute((cdecl))
+#define CALLBACK    WINAPI
+#define PASCAL      WINAPI
+#else
+#define STDCALL
+#define CDECL
+#define CALLBACK
+#define PASCAL
+#endif
+#define WINAPI      STDCALL
+#define APIENTRY    STDCALL
+#define WINGDIAPI
+
+#define _export
+
+/*
+  Enumerations
+*/
+typedef enum _ACL_INFORMATION_CLASS {
+  AclRevisionInformation = 1,   
+  AclSizeInformation            
+} ACL_INFORMATION_CLASS; 
+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              
+} MEDIA_TYPE; 
+#define RASCS_DONE 0x2000
+#define RASCS_PAUSED 0x1000
+typedef enum _RASCONNSTATE { 
+    RASCS_OpenPort = 0, 
+    RASCS_PortOpened, 
+    RASCS_ConnectDevice, 
+    RASCS_DeviceConnected, 
+    RASCS_AllDevicesConnected, 
+    RASCS_Authenticate, 
+    RASCS_AuthNotify, 
+    RASCS_AuthRetry, 
+    RASCS_AuthCallback, 
+    RASCS_AuthChangePassword, 
+    RASCS_AuthProject, 
+    RASCS_AuthLinkSpeed, 
+    RASCS_AuthAck, 
+    RASCS_ReAuthenticate, 
+    RASCS_Authenticated, 
+    RASCS_PrepareForCallback, 
+    RASCS_WaitForModemReset, 
+    RASCS_WaitForCallback,
+    RASCS_Projected, 
+    RASCS_StartAuthentication,  
+    RASCS_CallbackComplete,     
+    RASCS_LogonNetwork,         
+    RASCS_Interactive = RASCS_PAUSED, 
+    RASCS_RetryAuthentication, 
+    RASCS_CallbackSetByCaller, 
+    RASCS_PasswordExpired, 
+    RASCS_Connected = RASCS_DONE, 
+    RASCS_Disconnected 
+} RASCONNSTATE ; 
+typedef enum _RASPROJECTION {  
+    RASP_Amb = 0x10000, 
+    RASP_PppNbf = 0x803F, 
+    RASP_PppIpx = 0x802B, 
+    RASP_PppIp = 0x8021 
+} RASPROJECTION ; 
+typedef enum _SECURITY_IMPERSONATION_LEVEL {
+    SecurityAnonymous, 
+    SecurityIdentification, 
+    SecurityImpersonation, 
+    SecurityDelegation 
+} SECURITY_IMPERSONATION_LEVEL; 
+typedef enum _SID_NAME_USE { 
+    SidTypeUser = 1, 
+    SidTypeGroup, 
+    SidTypeDomain, 
+    SidTypeAlias, 
+    SidTypeWellKnownGroup, 
+    SidTypeDeletedAccount, 
+    SidTypeInvalid, 
+    SidTypeUnknown 
+} SID_NAME_USE, *PSID_NAME_USE; 
+typedef enum _TOKEN_INFORMATION_CLASS {
+    TokenUser = 1, 
+    TokenGroups, 
+    TokenPrivileges, 
+    TokenOwner, 
+    TokenPrimaryGroup, 
+    TokenDefaultDacl, 
+    TokenSource, 
+    TokenType, 
+    TokenImpersonationLevel, 
+    TokenStatistics 
+} TOKEN_INFORMATION_CLASS; 
+typedef enum tagTOKEN_TYPE {
+    TokenPrimary = 1, 
+    TokenImpersonation 
+} TOKEN_TYPE; 
+#endif /* ! defined (RC_INVOKED) */
+
+/*
+  Macros
+*/
+#define FORWARD_WM_NOTIFY(hwnd, idFrom, pnmhdr, fn)  (void)(fn)((hwnd), WM_NOTIFY, (WPARAM)(int)(id),  (LPARAM)(NMHDR FAR*)(pnmhdr)) 
+
+#define GetBValue(rgb)   ((BYTE) ((rgb) >> 16)) 
+#define GetGValue(rgb)   ((BYTE) (((WORD) (rgb)) >> 8)) 
+#define GetRValue(rgb)   ((BYTE) (rgb)) 
+#define RGB(r, g ,b)  ((DWORD) (((BYTE) (r) | ((WORD) (g) << 8)) | (((DWORD) (BYTE) (b)) << 16))) 
+
+#define HANDLE_WM_NOTIFY(hwnd, wParam, lParam, fn) (fn)((hwnd), (int)(wParam), (NMHDR FAR*)(lParam)) 
+
+#define HIBYTE(w)   ((BYTE) (((WORD) (w) >> 8) & 0xFF)) 
+#define HIWORD(l)   ((WORD) (((DWORD) (l) >> 16) & 0xFFFF)) 
+#define LOBYTE(w)   ((BYTE) (w)) 
+#define LOWORD(l)   ((WORD) (l)) 
+#define MAKELONG(a, b) ((LONG) (((WORD) (a)) | ((DWORD) ((WORD) (b))) << 16)) 
+#define MAKEWORD(a, b) ((WORD) (((BYTE) (a)) | ((WORD) ((BYTE) (b))) << 8)) 
+
+/* original Cygnus headers also had the following defined: */
+#define SEXT_HIWORD(l)     ((((int)l) >> 16))
+#define ZEXT_HIWORD(l)     ((((unsigned int)l) >> 16))
+#define SEXT_LOWORD(l)     ((int)(short)l)
+
+#define INDEXTOOVERLAYMASK(i) ((i) << 8) 
+#define INDEXTOSTATEIMAGEMASK(i) ((i) << 12) 
+
+#define MAKEINTATOM(i)   (LPTSTR) ((DWORD) ((WORD) (i))) 
+#define MAKEINTRESOURCE(i)  (LPTSTR) ((DWORD) ((WORD) (i)))
+
+#define MAKELANGID(p, s) ((((WORD) (s)) << 10) | (WORD) (p)) 
+#define PRIMARYLANGID(lgid)    ((WORD  )(lgid) & 0x3ff) 
+#define SUBLANGID(lgid)        ((WORD  )(lgid) >> 10) 
+
+#define LANGIDFROMLCID(lcid)   ((WORD) (lcid)) 
+#define SORTIDFROMLCID(lcid) ((WORD  )((((DWORD)(lcid)) & 0x000FFFFF) >> 16)) 
+#define MAKELCID(lgid, srtid)  ((DWORD)((((DWORD)((WORD)(srtid))) << 16) |  ((DWORD)((WORD)(lgid))))) 
+#define MAKELPARAM(l, h)   ((LPARAM) MAKELONG(l, h)) 
+#define MAKELRESULT(l, h)   ((LRESULT) MAKELONG(l, h)) 
+#define MAKEPOINTS(l)   (*((POINTS FAR *) & (l))) 
+#define MAKEROP4(fore,back) (DWORD)((((back) << 8) & 0xFF000000) | (fore)) 
+#define MAKEWPARAM(l, h)   ((WPARAM) MAKELONG(l, h)) 
+
+#ifndef max
+#define max(a, b)  (((a) > (b)) ? (a) : (b)) 
+#endif
+
+#ifndef min
+#define min(a, b)  (((a) < (b)) ? (a) : (b)) 
+#endif
+
+#define PALETTEINDEX(i) ((COLORREF) (0x01000000 | (DWORD) (WORD) (i))) 
+#define PALETTERGB(r, g, b)  (0x02000000 | RGB(r, g, b)) 
+#define POINTSTOPOINT(pt, pts) {(pt).x = (SHORT) LOWORD(pts); (pt).y = (SHORT) HIWORD(pts);} 
+#define POINTTOPOINTS(pt) (MAKELONG((short) ((pt).x), (short) ((pt).y))) 
+
+#define INDEXTOOVERLAYMASK(i) ((i) << 8)  
+#define INDEXTOSTATEIMAGEMASK(i) ((i) << 12)  
+
+#ifdef UNICODE
+#define TEXT(quote) L##quote 
+#else
+#define TEXT(quote) quote
+#endif
+
+#ifndef RC_INVOKED
+
+/*
+   Definitions for callback procedures
+*/
+typedef int CALLBACK (*BFFCALLBACK) (HWND, UINT, LPARAM, LPARAM);
+typedef UINT CALLBACK (*LPCCHOOKPROC) (HWND, UINT, WPARAM, LPARAM);
+typedef UINT CALLBACK (*LPCFHOOKPROC) (HWND, UINT, WPARAM, LPARAM);
+typedef DWORD CALLBACK (*PTHREAD_START_ROUTINE) (LPVOID);
+typedef PTHREAD_START_ROUTINE LPTHREAD_START_ROUTINE;
+typedef DWORD CALLBACK (*EDITSTREAMCALLBACK) (DWORD, LPBYTE, LONG, LONG);
+typedef UINT CALLBACK (*LPFRHOOKPROC) (HWND, UINT, WPARAM, LPARAM);
+typedef UINT CALLBACK (*LPOFNHOOKPROC) (HWND, UINT, WPARAM, LPARAM);
+typedef UINT CALLBACK (*LPPRINTHOOKPROC) (HWND, UINT, WPARAM, LPARAM);
+typedef UINT CALLBACK (*LPSETUPHOOKPROC) (HWND, UINT, WPARAM, LPARAM);
+typedef WINBOOL CALLBACK (*DLGPROC) (HWND, UINT, WPARAM, LPARAM);
+typedef int CALLBACK (*PFNPROPSHEETCALLBACK) (HWND, UINT, LPARAM);
+typedef VOID CALLBACK (*LPSERVICE_MAIN_FUNCTION) (DWORD, LPTSTR);
+typedef int CALLBACK (*PFNTVCOMPARE) (LPARAM, LPARAM, LPARAM);
+typedef LRESULT CALLBACK (*WNDPROC) (HWND, UINT, WPARAM, LPARAM);
+typedef int CALLBACK (*FARPROC)(void);
+typedef FARPROC PROC;
+typedef WINBOOL CALLBACK (*ENUMRESTYPEPROC) (HANDLE, LPTSTR, LONG);
+typedef WINBOOL CALLBACK (*ENUMRESNAMEPROC) (HANDLE, LPCTSTR, LPTSTR, LONG);
+typedef WINBOOL CALLBACK (*ENUMRESLANGPROC) (HANDLE, LPCTSTR, LPCTSTR, WORD, LONG);
+typedef FARPROC DESKTOPENUMPROC;
+typedef WINBOOL CALLBACK (*ENUMWINDOWSPROC) (HWND, LPARAM);
+typedef WINBOOL CALLBACK (*ENUMWINDOWSTATIONPROC) (LPTSTR, LPARAM);
+typedef VOID CALLBACK (*SENDASYNCPROC) (HWND, UINT, DWORD, LRESULT);
+typedef VOID CALLBACK (*TIMERPROC) (HWND, UINT, UINT, DWORD);
+typedef FARPROC GRAYSTRINGPROC;
+typedef WINBOOL CALLBACK (*DRAWSTATEPROC) (HDC, LPARAM, WPARAM, int, int);
+typedef WINBOOL CALLBACK (*PROPENUMPROCEX) (HWND, LPCTSTR, HANDLE, DWORD);
+typedef WINBOOL CALLBACK (*PROPENUMPROC) (HWND, LPCTSTR, HANDLE);
+typedef LRESULT CALLBACK (*HOOKPROC) (int, WPARAM, LPARAM);
+typedef VOID CALLBACK (*ENUMOBJECTSPROC) (LPVOID, LPARAM);
+typedef VOID CALLBACK (*LINEDDAPROC) (int, int, LPARAM);
+typedef WINBOOL CALLBACK (*ABORTPROC) (HDC, int);
+typedef UINT CALLBACK (*LPPAGEPAINTHOOK) (HWND, UINT, WPARAM, LPARAM );
+typedef UINT CALLBACK (*LPPAGESETUPHOOK) (HWND, UINT, WPARAM, LPARAM );
+typedef int CALLBACK (*ICMENUMPROC) (LPTSTR, LPARAM);
+typedef LONG (*EDITWORDBREAKPROCEX) (char *, LONG, BYTE, INT);
+typedef int CALLBACK (*PFNLVCOMPARE) (LPARAM, LPARAM, LPARAM);
+typedef WINBOOL CALLBACK (*LOCALE_ENUMPROC) (LPTSTR);
+typedef WINBOOL CALLBACK (*CODEPAGE_ENUMPROC) (LPTSTR);
+typedef WINBOOL CALLBACK (*DATEFMT_ENUMPROC) (LPTSTR);
+typedef WINBOOL CALLBACK (*TIMEFMT_ENUMPROC) (LPTSTR);
+typedef WINBOOL CALLBACK (*CALINFO_ENUMPROC) (LPTSTR);
+typedef WINBOOL CALLBACK (*PHANDLER_ROUTINE) (DWORD);
+typedef WINBOOL CALLBACK (*LPHANDLER_FUNCTION) (DWORD);
+typedef UINT CALLBACK (*PFNGETPROFILEPATH) (LPCTSTR, LPSTR, UINT);
+typedef UINT CALLBACK (*PFNRECONCILEPROFILE) (LPCTSTR, LPCTSTR, DWORD);
+typedef WINBOOL CALLBACK (*PFNPROCESSPOLICIES) (HWND, LPCTSTR, LPCTSTR, LPCTSTR, DWORD);
+
+#define SECURITY_NULL_SID_AUTHORITY     {0,0,0,0,0,0}
+#define SECURITY_WORLD_SID_AUTHORITY    {0,0,0,0,0,1}
+#define SECURITY_LOCAL_SID_AUTHORITY    {0,0,0,0,0,2}
+#define SECURITY_CREATOR_SID_AUTHORITY  {0,0,0,0,0,3}
+#define SECURITY_NON_UNIQUE_AUTHORITY   {0,0,0,0,0,4}
+#define SECURITY_NT_AUTHORITY           {0,0,0,0,0,5}
+
+#define SE_CREATE_TOKEN_NAME              TEXT("SeCreateTokenPrivilege")
+#define SE_ASSIGNPRIMARYTOKEN_NAME        TEXT("SeAssignPrimaryTokenPrivilege")
+#define SE_LOCK_MEMORY_NAME               TEXT("SeLockMemoryPrivilege")
+#define SE_INCREASE_QUOTA_NAME            TEXT("SeIncreaseQuotaPrivilege")
+#define SE_UNSOLICITED_INPUT_NAME         TEXT("SeUnsolicitedInputPrivilege")
+#define SE_MACHINE_ACCOUNT_NAME           TEXT("SeMachineAccountPrivilege")
+#define SE_TCB_NAME                       TEXT("SeTcbPrivilege")
+#define SE_SECURITY_NAME                  TEXT("SeSecurityPrivilege")
+#define SE_TAKE_OWNERSHIP_NAME            TEXT("SeTakeOwnershipPrivilege")
+#define SE_LOAD_DRIVER_NAME               TEXT("SeLoadDriverPrivilege")
+#define SE_SYSTEM_PROFILE_NAME            TEXT("SeSystemProfilePrivilege")
+#define SE_SYSTEMTIME_NAME                TEXT("SeSystemtimePrivilege")
+#define SE_PROF_SINGLE_PROCESS_NAME       TEXT("SeProfileSingleProcessPrivilege")
+#define SE_INC_BASE_PRIORITY_NAME         TEXT("SeIncreaseBasePriorityPrivilege")
+#define SE_CREATE_PAGEFILE_NAME           TEXT("SeCreatePagefilePrivilege")
+#define SE_CREATE_PERMANENT_NAME          TEXT("SeCreatePermanentPrivilege")
+#define SE_BACKUP_NAME                    TEXT("SeBackupPrivilege")
+#define SE_RESTORE_NAME                   TEXT("SeRestorePrivilege")
+#define SE_SHUTDOWN_NAME                  TEXT("SeShutdownPrivilege")
+#define SE_DEBUG_NAME                     TEXT("SeDebugPrivilege")
+#define SE_AUDIT_NAME                     TEXT("SeAuditPrivilege")
+#define SE_SYSTEM_ENVIRONMENT_NAME        TEXT("SeSystemEnvironmentPrivilege")
+#define SE_CHANGE_NOTIFY_NAME             TEXT("SeChangeNotifyPrivilege")
+#define SE_REMOTE_SHUTDOWN_NAME           TEXT("SeRemoteShutdownPrivilege")
+
+#define SERVICES_ACTIVE_DATABASEW      L"ServicesActive"
+#define SERVICES_FAILED_DATABASEW      L"ServicesFailed"
+#define SERVICES_ACTIVE_DATABASEA      "ServicesActive"
+#define SERVICES_FAILED_DATABASEA      "ServicesFailed"
+#define SC_GROUP_IDENTIFIERW           L'+'
+#define SC_GROUP_IDENTIFIERA           '+'
+
+#ifdef UNICODE
+#define SERVICES_ACTIVE_DATABASE       SERVICES_ACTIVE_DATABASEW
+#define SERVICES_FAILED_DATABASE       SERVICES_FAILED_DATABASEW
+#define SC_GROUP_IDENTIFIER            SC_GROUP_IDENTIFIERW
+#else 
+#define SERVICES_ACTIVE_DATABASE       SERVICES_ACTIVE_DATABASEA
+#define SERVICES_FAILED_DATABASE       SERVICES_FAILED_DATABASEA
+#define SC_GROUP_IDENTIFIER            SC_GROUP_IDENTIFIERA
+#endif /* UNICODE */
+
+/* ---------------------------------- */
+/* From ddeml.h in old Cygnus headers */
+
+typedef void (*CALLB) (void);
+typedef CALLB PFNCALLBACK;
+
+typedef WINBOOL SECURITY_CONTEXT_TRACKING_MODE;
+
+/* End of stuff from ddeml.h in old Cygnus headers */
+/* ----------------------------------------------- */
+
+typedef FARPROC WNDENUMPROC;
+typedef FARPROC ENHMFENUMPROC;
+typedef DWORD CCSTYLE, *PCCSTYLE, *LPCCSTYLE;
+typedef DWORD CCSTYLEFLAGA, *PCCSTYLEFLAGA, *LPCCSTYLEFLAGA;
+#define DECLARE_HANDLE(s) typedef HANDLE s
+
+#endif /* ! defined (RC_INVOKED) */
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* _GNU_H_WINDOWS32_BASE */
index 9eb5d01..4e467d3 100644 (file)
-/* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */\r
-#ifndef __dj_include_coff_h_\r
-#define __dj_include_coff_h_\r
-\r
-#ifdef __cplusplus\r
-extern "C" {\r
-#endif\r
-\r
-//#ifndef __dj_ENFORCE_ANSI_FREESTANDING\r
-\r
-//#ifndef __STRICT_ANSI__\r
-\r
-//#ifndef _POSIX_SOURCE\r
-\r
-/*** coff information for Intel 386/486.  */\r
-\r
-/********************** FILE HEADER **********************/\r
-\r
-struct external_filehdr {\r
-       unsigned short f_magic;         /* magic number                 */\r
-       unsigned short f_nscns;         /* number of sections           */\r
-       unsigned long f_timdat; /* time & date stamp            */\r
-       unsigned long f_symptr; /* file pointer to symtab       */\r
-       unsigned long f_nsyms;          /* number of symtab entries     */\r
-       unsigned short f_opthdr;        /* sizeof(optional hdr)         */\r
-       unsigned short f_flags;         /* flags                        */\r
-};\r
-\r
-\r
-/* Bits for f_flags:\r
- *     F_RELFLG        relocation info stripped from file\r
- *     F_EXEC          file is executable (no unresolved external references)\r
- *     F_LNNO          line numbers stripped from file\r
- *     F_LSYMS         local symbols stripped from file\r
- *     F_AR32WR        file has byte ordering of an AR32WR machine (e.g. vax)\r
- */\r
-\r
-#define F_RELFLG       (0x0001)\r
-#define F_EXEC         (0x0002)\r
-#define F_LNNO         (0x0004)\r
-#define F_LSYMS                (0x0008)\r
-\r
-\r
-\r
-#define        I386MAGIC       0x14c\r
-#define I386AIXMAGIC   0x175\r
-#define I386BADMAG(x) (((x).f_magic!=I386MAGIC) && (x).f_magic!=I386AIXMAGIC)\r
-\r
-\r
-#define        FILHDR  struct external_filehdr\r
-#define        FILHSZ  sizeof(FILHDR)\r
-\r
-\r
-/********************** AOUT "OPTIONAL HEADER" **********************/\r
-\r
-\r
-typedef struct \r
-{\r
-  unsigned short       magic;          /* type of file                         */\r
-  unsigned short       vstamp;         /* version stamp                        */\r
-  unsigned long        tsize;          /* text size in bytes, padded to FW bdry*/\r
-  unsigned long        dsize;          /* initialized data "  "                */\r
-  unsigned long        bsize;          /* uninitialized data "   "             */\r
-  unsigned long        entry;          /* entry pt.                            */\r
-  unsigned long        text_start;     /* base of text used for this file */\r
-  unsigned long        data_start;     /* base of data used for this file */\r
-}\r
-AOUTHDR;\r
-\r
-\r
-typedef struct gnu_aout {\r
-       unsigned long info;\r
-       unsigned long tsize;\r
-       unsigned long dsize;\r
-       unsigned long bsize;\r
-       unsigned long symsize;\r
-       unsigned long entry;\r
-       unsigned long txrel;\r
-       unsigned long dtrel;\r
-       } GNU_AOUT;\r
-\r
-#define AOUTSZ (sizeof(AOUTHDR))\r
-\r
-#define OMAGIC          0404    /* object files, eg as output */\r
-#define ZMAGIC          0413    /* demand load format, eg normal ld output */\r
-#define STMAGIC                0401    /* target shlib */\r
-#define SHMAGIC                0443    /* host   shlib */\r
-\r
-\r
-/********************** SECTION HEADER **********************/\r
-\r
-\r
-struct external_scnhdr {\r
-       char            s_name[8];      /* section name                 */\r
-       unsigned long           s_paddr;        /* physical address, aliased s_nlib */\r
-       unsigned long           s_vaddr;        /* virtual address              */\r
-       unsigned long           s_size;         /* section size                 */\r
-       unsigned long           s_scnptr;       /* file ptr to raw data for section */\r
-       unsigned long           s_relptr;       /* file ptr to relocation       */\r
-       unsigned long           s_lnnoptr;      /* file ptr to line numbers     */\r
-       unsigned short          s_nreloc;       /* number of relocation entries */\r
-       unsigned short          s_nlnno;        /* number of line number entries*/\r
-       unsigned long           s_flags;        /* flags                        */\r
-};\r
-\r
-#define        SCNHDR  struct external_scnhdr\r
-#define        SCNHSZ  sizeof(SCNHDR)\r
-\r
-/*\r
- * names of "special" sections\r
- */\r
-#define _TEXT  ".text"\r
-#define _DATA  ".data"\r
-#define _BSS   ".bss"\r
-#define _COMMENT ".comment"\r
-#define _LIB ".lib"\r
-\r
-/*\r
- * s_flags "type"\r
- */\r
-#define STYP_TEXT       (0x0020)       /* section contains text only */\r
-#define STYP_DATA       (0x0040)       /* section contains data only */\r
-#define STYP_BSS        (0x0080)       /* section contains bss only */\r
-\r
-/********************** LINE NUMBERS **********************/\r
-\r
-/* 1 line number entry for every "breakpointable" source line in a section.\r
- * Line numbers are grouped on a per function basis; first entry in a function\r
- * grouping will have l_lnno = 0 and in place of physical address will be the\r
- * symbol table index of the function name.\r
- */\r
-struct external_lineno {\r
-       union {\r
-               unsigned long l_symndx __attribute__((packed)); /* function name symbol index, iff l_lnno == 0 */\r
-               unsigned long l_paddr __attribute__((packed));          /* (physical) address of line number */\r
-       } l_addr;\r
-       unsigned short l_lnno;                                          /* line number */\r
-};\r
-\r
-\r
-#define        LINENO  struct external_lineno\r
-#define        LINESZ  sizeof(LINENO)\r
-\r
-\r
-/********************** SYMBOLS **********************/\r
-\r
-#define E_SYMNMLEN     8       /* # characters in a symbol name        */\r
-#define E_FILNMLEN     14      /* # characters in a file name          */\r
-#define E_DIMNUM       4       /* # array dimensions in auxiliary entry */\r
-\r
-struct external_syment \r
-{\r
-  union {\r
-    char e_name[E_SYMNMLEN];\r
-    struct {\r
-      unsigned long e_zeroes __attribute__((packed));\r
-      unsigned long e_offset __attribute__((packed));\r
-    } e;\r
-  } e;\r
-  unsigned long e_value __attribute__((packed));\r
-  short e_scnum;\r
-  unsigned short e_type;\r
-  unsigned char e_sclass;\r
-  unsigned char e_numaux;\r
-};\r
-\r
-#define N_BTMASK       (0xf)\r
-#define N_TMASK                (0x30)\r
-#define N_BTSHFT       (4)\r
-#define N_TSHIFT       (2)\r
-  \r
-union external_auxent {\r
-       struct {\r
-               unsigned long x_tagndx __attribute__((packed));         /* str, un, or enum tag indx */\r
-               union {\r
-                       struct {\r
-                           unsigned short  x_lnno;                             /* declaration line number */\r
-                           unsigned short  x_size;                             /* str/union/array size */\r
-                       } x_lnsz;\r
-                       unsigned long x_fsize __attribute__((packed));          /* size of function */\r
-               } x_misc;\r
-               union {\r
-                       struct {                                        /* if ISFCN, tag, or .bb */\r
-                           unsigned long x_lnnoptr __attribute__((packed));    /* ptr to fcn line # */\r
-                           unsigned long x_endndx __attribute__((packed));     /* entry ndx past block end */\r
-                       } x_fcn;\r
-                       struct {                                        /* if ISARY, up to 4 dimen. */\r
-                           unsigned short x_dimen[E_DIMNUM];\r
-                       } x_ary;\r
-               } x_fcnary;\r
-               unsigned short x_tvndx;                                         /* tv index */\r
-       } x_sym;\r
-\r
-       union {\r
-               char x_fname[E_FILNMLEN];\r
-               struct {\r
-                       unsigned long x_zeroes __attribute__((packed));\r
-                       unsigned long x_offset __attribute__((packed));\r
-               } x_n;\r
-       } x_file;\r
-\r
-       struct {\r
-               unsigned long x_scnlen __attribute__((packed));         /* section length */\r
-               unsigned short x_nreloc;                                        /* # relocation entries */\r
-               unsigned short x_nlinno;                                        /* # line numbers */\r
-       } x_scn;\r
-\r
-        struct {\r
-               unsigned long x_tvfill __attribute__((packed));         /* tv fill value */\r
-               unsigned short x_tvlen;                                         /* length of .tv */\r
-               unsigned short x_tvran[2];                                      /* tv range */\r
-       } x_tv;         /* info about .tv section (in auxent of symbol .tv)) */\r
-\r
-\r
-};\r
-\r
-#define        SYMENT  struct external_syment\r
-#define        SYMESZ  sizeof(SYMENT)\r
-#define        AUXENT  union external_auxent\r
-#define        AUXESZ  sizeof(AUXENT)\r
-\r
-\r
-#      define _ETEXT   "etext"\r
-\r
-\r
-/* Relocatable symbols have number of the section in which they are defined,\r
-   or one of the following: */\r
-\r
-#define N_UNDEF        ((short)0)      /* undefined symbol */\r
-#define N_ABS  ((short)-1)     /* value of symbol is absolute */\r
-#define N_DEBUG        ((short)-2)     /* debugging symbol -- value is meaningless */\r
-#define N_TV   ((short)-3)     /* indicates symbol needs preload transfer vector */\r
-#define P_TV   ((short)-4)     /* indicates symbol needs postload transfer vector*/\r
-\r
-/*\r
- * Type of a symbol, in low N bits of the word\r
- */\r
-#define T_NULL         0\r
-#define T_VOID         1       /* function argument (only used by compiler) */\r
-#define T_CHAR         2       /* character            */\r
-#define T_SHORT                3       /* short integer        */\r
-#define T_INT          4       /* integer              */\r
-#define T_LONG         5       /* long integer         */\r
-#define T_FLOAT                6       /* floating point       */\r
-#define T_DOUBLE       7       /* double word          */\r
-#define T_STRUCT       8       /* structure            */\r
-#define T_UNION                9       /* union                */\r
-#define T_ENUM         10      /* enumeration          */\r
-#define T_MOE          11      /* member of enumeration*/\r
-#define T_UCHAR                12      /* unsigned character   */\r
-#define T_USHORT       13      /* unsigned short       */\r
-#define T_UINT         14      /* unsigned integer     */\r
-#define T_ULONG                15      /* unsigned long        */\r
-#define T_LNGDBL       16      /* long double          */\r
-\r
-/*\r
- * derived types, in n_type\r
-*/\r
-#define DT_NON         (0)     /* no derived type */\r
-#define DT_PTR         (1)     /* pointer */\r
-#define DT_FCN         (2)     /* function */\r
-#define DT_ARY         (3)     /* array */\r
-\r
-#define BTYPE(x)       ((x) & N_BTMASK)\r
-\r
-#define ISPTR(x)       (((x) & N_TMASK) == (DT_PTR << N_BTSHFT))\r
-#define ISFCN(x)       (((x) & N_TMASK) == (DT_FCN << N_BTSHFT))\r
-#define ISARY(x)       (((x) & N_TMASK) == (DT_ARY << N_BTSHFT))\r
-#define ISTAG(x)       ((x)==C_STRTAG||(x)==C_UNTAG||(x)==C_ENTAG)\r
-#define DECREF(x) ((((x)>>N_TSHIFT)&~N_BTMASK)|((x)&N_BTMASK))\r
-\r
-/********************** STORAGE CLASSES **********************/\r
-\r
-/* This used to be defined as -1, but now n_sclass is unsigned.  */\r
-#define C_EFCN         0xff    /* physical end of function     */\r
-#define C_NULL         0\r
-#define C_AUTO         1       /* automatic variable           */\r
-#define C_EXT          2       /* external symbol              */\r
-#define C_STAT         3       /* static                       */\r
-#define C_REG          4       /* register variable            */\r
-#define C_EXTDEF       5       /* external definition          */\r
-#define C_LABEL                6       /* label                        */\r
-#define C_ULABEL       7       /* undefined label              */\r
-#define C_MOS          8       /* member of structure          */\r
-#define C_ARG          9       /* function argument            */\r
-#define C_STRTAG       10      /* structure tag                */\r
-#define C_MOU          11      /* member of union              */\r
-#define C_UNTAG                12      /* union tag                    */\r
-#define C_TPDEF                13      /* type definition              */\r
-#define C_USTATIC      14      /* undefined static             */\r
-#define C_ENTAG                15      /* enumeration tag              */\r
-#define C_MOE          16      /* member of enumeration        */\r
-#define C_REGPARM      17      /* register parameter           */\r
-#define C_FIELD                18      /* bit field                    */\r
-#define C_AUTOARG      19      /* auto argument                */\r
-#define C_LASTENT      20      /* dummy entry (end of block)   */\r
-#define C_BLOCK                100     /* ".bb" or ".eb"               */\r
-#define C_FCN          101     /* ".bf" or ".ef"               */\r
-#define C_EOS          102     /* end of structure             */\r
-#define C_FILE         103     /* file name                    */\r
-#define C_LINE         104     /* line # reformatted as symbol table entry */\r
-#define C_ALIAS                105     /* duplicate tag                */\r
-#define C_HIDDEN       106     /* ext symbol in dmert public lib */\r
-\r
-/********************** RELOCATION DIRECTIVES **********************/\r
-\r
-\r
-\r
-struct external_reloc {\r
-  unsigned long r_vaddr __attribute__((packed));\r
-  unsigned long r_symndx __attribute__((packed));\r
-  unsigned short r_type;\r
-};\r
-\r
-\r
-#define RELOC struct external_reloc\r
-#define RELSZ sizeof(RELOC)\r
-\r
-#define RELOC_REL32    20      /* 32-bit PC-relative address */\r
-#define RELOC_ADDR32   6       /* 32-bit absolute address */\r
-\r
-#define DEFAULT_DATA_SECTION_ALIGNMENT 4\r
-#define DEFAULT_BSS_SECTION_ALIGNMENT 4\r
-#define DEFAULT_TEXT_SECTION_ALIGNMENT 4\r
-/* For new sections we havn't heard of before */\r
-#define DEFAULT_SECTION_ALIGNMENT 4\r
-\r
-//#endif /* !_POSIX_SOURCE */\r
-//#endif /* !__STRICT_ANSI__ */\r
-//#endif /* !__dj_ENFORCE_ANSI_FREESTANDING */\r
-\r
-#ifndef __dj_ENFORCE_FUNCTION_CALLS\r
-#endif /* !__dj_ENFORCE_FUNCTION_CALLS */\r
-\r
-#ifdef __cplusplus\r
-}\r
-#endif\r
-\r
-#endif /* !__dj_include_coff_h_ */\r
+/* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */
+#ifndef __dj_include_coff_h_
+#define __dj_include_coff_h_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+//#ifndef __dj_ENFORCE_ANSI_FREESTANDING
+
+//#ifndef __STRICT_ANSI__
+
+//#ifndef _POSIX_SOURCE
+
+/*** coff information for Intel 386/486.  */
+
+/********************** FILE HEADER **********************/
+
+struct external_filehdr {
+       unsigned short f_magic;         /* magic number                 */
+       unsigned short f_nscns;         /* number of sections           */
+       unsigned long f_timdat; /* time & date stamp            */
+       unsigned long f_symptr; /* file pointer to symtab       */
+       unsigned long f_nsyms;          /* number of symtab entries     */
+       unsigned short f_opthdr;        /* sizeof(optional hdr)         */
+       unsigned short f_flags;         /* flags                        */
+};
+
+
+/* Bits for f_flags:
+ *     F_RELFLG        relocation info stripped from file
+ *     F_EXEC          file is executable (no unresolved external references)
+ *     F_LNNO          line numbers stripped from file
+ *     F_LSYMS         local symbols stripped from file
+ *     F_AR32WR        file has byte ordering of an AR32WR machine (e.g. vax)
+ */
+
+#define F_RELFLG       (0x0001)
+#define F_EXEC         (0x0002)
+#define F_LNNO         (0x0004)
+#define F_LSYMS                (0x0008)
+
+
+
+#define        I386MAGIC       0x14c
+#define I386AIXMAGIC   0x175
+#define I386BADMAG(x) (((x).f_magic!=I386MAGIC) && (x).f_magic!=I386AIXMAGIC)
+
+
+#define        FILHDR  struct external_filehdr
+#define        FILHSZ  sizeof(FILHDR)
+
+
+/********************** AOUT "OPTIONAL HEADER" **********************/
+
+
+typedef struct 
+{
+  unsigned short       magic;          /* type of file                         */
+  unsigned short       vstamp;         /* version stamp                        */
+  unsigned long        tsize;          /* text size in bytes, padded to FW bdry*/
+  unsigned long        dsize;          /* initialized data "  "                */
+  unsigned long        bsize;          /* uninitialized data "   "             */
+  unsigned long        entry;          /* entry pt.                            */
+  unsigned long        text_start;     /* base of text used for this file */
+  unsigned long        data_start;     /* base of data used for this file */
+}
+AOUTHDR;
+
+
+typedef struct gnu_aout {
+       unsigned long info;
+       unsigned long tsize;
+       unsigned long dsize;
+       unsigned long bsize;
+       unsigned long symsize;
+       unsigned long entry;
+       unsigned long txrel;
+       unsigned long dtrel;
+       } GNU_AOUT;
+
+#define AOUTSZ (sizeof(AOUTHDR))
+
+#define OMAGIC          0404    /* object files, eg as output */
+#define ZMAGIC          0413    /* demand load format, eg normal ld output */
+#define STMAGIC                0401    /* target shlib */
+#define SHMAGIC                0443    /* host   shlib */
+
+
+/********************** SECTION HEADER **********************/
+
+
+struct external_scnhdr {
+       char            s_name[8];      /* section name                 */
+       unsigned long           s_paddr;        /* physical address, aliased s_nlib */
+       unsigned long           s_vaddr;        /* virtual address              */
+       unsigned long           s_size;         /* section size                 */
+       unsigned long           s_scnptr;       /* file ptr to raw data for section */
+       unsigned long           s_relptr;       /* file ptr to relocation       */
+       unsigned long           s_lnnoptr;      /* file ptr to line numbers     */
+       unsigned short          s_nreloc;       /* number of relocation entries */
+       unsigned short          s_nlnno;        /* number of line number entries*/
+       unsigned long           s_flags;        /* flags                        */
+};
+
+#define        SCNHDR  struct external_scnhdr
+#define        SCNHSZ  sizeof(SCNHDR)
+
+/*
+ * names of "special" sections
+ */
+#define _TEXT  ".text"
+#define _DATA  ".data"
+#define _BSS   ".bss"
+#define _COMMENT ".comment"
+#define _LIB ".lib"
+
+/*
+ * s_flags "type"
+ */
+#define STYP_TEXT       (0x0020)       /* section contains text only */
+#define STYP_DATA       (0x0040)       /* section contains data only */
+#define STYP_BSS        (0x0080)       /* section contains bss only */
+
+/********************** LINE NUMBERS **********************/
+
+/* 1 line number entry for every "breakpointable" source line in a section.
+ * Line numbers are grouped on a per function basis; first entry in a function
+ * grouping will have l_lnno = 0 and in place of physical address will be the
+ * symbol table index of the function name.
+ */
+struct external_lineno {
+       union {
+               unsigned long l_symndx __attribute__((packed)); /* function name symbol index, iff l_lnno == 0 */
+               unsigned long l_paddr __attribute__((packed));          /* (physical) address of line number */
+       } l_addr;
+       unsigned short l_lnno;                                          /* line number */
+};
+
+
+#define        LINENO  struct external_lineno
+#define        LINESZ  sizeof(LINENO)
+
+
+/********************** SYMBOLS **********************/
+
+#define E_SYMNMLEN     8       /* # characters in a symbol name        */
+#define E_FILNMLEN     14      /* # characters in a file name          */
+#define E_DIMNUM       4       /* # array dimensions in auxiliary entry */
+
+struct external_syment 
+{
+  union {
+    char e_name[E_SYMNMLEN];
+    struct {
+      unsigned long e_zeroes __attribute__((packed));
+      unsigned long e_offset __attribute__((packed));
+    } e;
+  } e;
+  unsigned long e_value __attribute__((packed));
+  short e_scnum;
+  unsigned short e_type;
+  unsigned char e_sclass;
+  unsigned char e_numaux;
+};
+
+#define N_BTMASK       (0xf)
+#define N_TMASK                (0x30)
+#define N_BTSHFT       (4)
+#define N_TSHIFT       (2)
+  
+union external_auxent {
+       struct {
+               unsigned long x_tagndx __attribute__((packed));         /* str, un, or enum tag indx */
+               union {
+                       struct {
+                           unsigned short  x_lnno;                             /* declaration line number */
+                           unsigned short  x_size;                             /* str/union/array size */
+                       } x_lnsz;
+                       unsigned long x_fsize __attribute__((packed));          /* size of function */
+               } x_misc;
+               union {
+                       struct {                                        /* if ISFCN, tag, or .bb */
+                           unsigned long x_lnnoptr __attribute__((packed));    /* ptr to fcn line # */
+                           unsigned long x_endndx __attribute__((packed));     /* entry ndx past block end */
+                       } x_fcn;
+                       struct {                                        /* if ISARY, up to 4 dimen. */
+                           unsigned short x_dimen[E_DIMNUM];
+                       } x_ary;
+               } x_fcnary;
+               unsigned short x_tvndx;                                         /* tv index */
+       } x_sym;
+
+       union {
+               char x_fname[E_FILNMLEN];
+               struct {
+                       unsigned long x_zeroes __attribute__((packed));
+                       unsigned long x_offset __attribute__((packed));
+               } x_n;
+       } x_file;
+
+       struct {
+               unsigned long x_scnlen __attribute__((packed));         /* section length */
+               unsigned short x_nreloc;                                        /* # relocation entries */
+               unsigned short x_nlinno;                                        /* # line numbers */
+       } x_scn;
+
+        struct {
+               unsigned long x_tvfill __attribute__((packed));         /* tv fill value */
+               unsigned short x_tvlen;                                         /* length of .tv */
+               unsigned short x_tvran[2];                                      /* tv range */
+       } x_tv;         /* info about .tv section (in auxent of symbol .tv)) */
+
+
+};
+
+#define        SYMENT  struct external_syment
+#define        SYMESZ  sizeof(SYMENT)
+#define        AUXENT  union external_auxent
+#define        AUXESZ  sizeof(AUXENT)
+
+
+#      define _ETEXT   "etext"
+
+
+/* Relocatable symbols have number of the section in which they are defined,
+   or one of the following: */
+
+#define N_UNDEF        ((short)0)      /* undefined symbol */
+#define N_ABS  ((short)-1)     /* value of symbol is absolute */
+#define N_DEBUG        ((short)-2)     /* debugging symbol -- value is meaningless */
+#define N_TV   ((short)-3)     /* indicates symbol needs preload transfer vector */
+#define P_TV   ((short)-4)     /* indicates symbol needs postload transfer vector*/
+
+/*
+ * Type of a symbol, in low N bits of the word
+ */
+#define T_NULL         0
+#define T_VOID         1       /* function argument (only used by compiler) */
+#define T_CHAR         2       /* character            */
+#define T_SHORT                3       /* short integer        */
+#define T_INT          4       /* integer              */
+#define T_LONG         5       /* long integer         */
+#define T_FLOAT                6       /* floating point       */
+#define T_DOUBLE       7       /* double word          */
+#define T_STRUCT       8       /* structure            */
+#define T_UNION                9       /* union                */
+#define T_ENUM         10      /* enumeration          */
+#define T_MOE          11      /* member of enumeration*/
+#define T_UCHAR                12      /* unsigned character   */
+#define T_USHORT       13      /* unsigned short       */
+#define T_UINT         14      /* unsigned integer     */
+#define T_ULONG                15      /* unsigned long        */
+#define T_LNGDBL       16      /* long double          */
+
+/*
+ * derived types, in n_type
+*/
+#define DT_NON         (0)     /* no derived type */
+#define DT_PTR         (1)     /* pointer */
+#define DT_FCN         (2)     /* function */
+#define DT_ARY         (3)     /* array */
+
+#define BTYPE(x)       ((x) & N_BTMASK)
+
+#define ISPTR(x)       (((x) & N_TMASK) == (DT_PTR << N_BTSHFT))
+#define ISFCN(x)       (((x) & N_TMASK) == (DT_FCN << N_BTSHFT))
+#define ISARY(x)       (((x) & N_TMASK) == (DT_ARY << N_BTSHFT))
+#define ISTAG(x)       ((x)==C_STRTAG||(x)==C_UNTAG||(x)==C_ENTAG)
+#define DECREF(x) ((((x)>>N_TSHIFT)&~N_BTMASK)|((x)&N_BTMASK))
+
+/********************** STORAGE CLASSES **********************/
+
+/* This used to be defined as -1, but now n_sclass is unsigned.  */
+#define C_EFCN         0xff    /* physical end of function     */
+#define C_NULL         0
+#define C_AUTO         1       /* automatic variable           */
+#define C_EXT          2       /* external symbol              */
+#define C_STAT         3       /* static                       */
+#define C_REG          4       /* register variable            */
+#define C_EXTDEF       5       /* external definition          */
+#define C_LABEL                6       /* label                        */
+#define C_ULABEL       7       /* undefined label              */
+#define C_MOS          8       /* member of structure          */
+#define C_ARG          9       /* function argument            */
+#define C_STRTAG       10      /* structure tag                */
+#define C_MOU          11      /* member of union              */
+#define C_UNTAG                12      /* union tag                    */
+#define C_TPDEF                13      /* type definition              */
+#define C_USTATIC      14      /* undefined static             */
+#define C_ENTAG                15      /* enumeration tag              */
+#define C_MOE          16      /* member of enumeration        */
+#define C_REGPARM      17      /* register parameter           */
+#define C_FIELD                18      /* bit field                    */
+#define C_AUTOARG      19      /* auto argument                */
+#define C_LASTENT      20      /* dummy entry (end of block)   */
+#define C_BLOCK                100     /* ".bb" or ".eb"               */
+#define C_FCN          101     /* ".bf" or ".ef"               */
+#define C_EOS          102     /* end of structure             */
+#define C_FILE         103     /* file name                    */
+#define C_LINE         104     /* line # reformatted as symbol table entry */
+#define C_ALIAS                105     /* duplicate tag                */
+#define C_HIDDEN       106     /* ext symbol in dmert public lib */
+
+/********************** RELOCATION DIRECTIVES **********************/
+
+
+
+struct external_reloc {
+  unsigned long r_vaddr __attribute__((packed));
+  unsigned long r_symndx __attribute__((packed));
+  unsigned short r_type;
+};
+
+
+#define RELOC struct external_reloc
+#define RELSZ sizeof(RELOC)
+
+#define RELOC_REL32    20      /* 32-bit PC-relative address */
+#define RELOC_ADDR32   6       /* 32-bit absolute address */
+
+#define DEFAULT_DATA_SECTION_ALIGNMENT 4
+#define DEFAULT_BSS_SECTION_ALIGNMENT 4
+#define DEFAULT_TEXT_SECTION_ALIGNMENT 4
+/* For new sections we havn't heard of before */
+#define DEFAULT_SECTION_ALIGNMENT 4
+
+//#endif /* !_POSIX_SOURCE */
+//#endif /* !__STRICT_ANSI__ */
+//#endif /* !__dj_ENFORCE_ANSI_FREESTANDING */
+
+#ifndef __dj_ENFORCE_FUNCTION_CALLS
+#endif /* !__dj_ENFORCE_FUNCTION_CALLS */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* !__dj_include_coff_h_ */
index d7c662b..413e5af 100644 (file)
-/* GENERAL DEFINITIONS ****************************************************/\r
-\r
-#include <internal/hal/irq.h>\r
-\r
-\r
-\r
-/*\r
- * PURPOSE: Number of a thread priority levels\r
- */\r
-#define NR_PRIORITY_LEVELS (32)\r
-\r
-/*\r
- * PURPOSE: Type of queue to insert a work item in\r
- */\r
-enum\r
-{\r
-  CriticalWorkQueue,\r
-  DelayedWorkQueue,\r
-  HyperCriticalWorkQueue,\r
-};\r
-\r
-/*\r
- * Types of memory to allocate\r
- */\r
-enum\r
-{\r
-   NonPagedPool,\r
-   NonPagedPoolMustSucceed,\r
-   NonPagedPoolCacheAligned,\r
-   NonPagedPoolCacheAlignedMustS,\r
-   PagedPool,\r
-   PagedPoolCacheAligned,\r
-};\r
-\r
-/*\r
- * PURPOSE: Irp flags\r
- */\r
-enum\r
-{\r
-   /*\r
-    * Read any data from the actual backing media\r
-    */\r
-   IRP_NOCACHE,\r
-     \r
-   /*\r
-    * The I/O operation is performing paging\r
-    */\r
-   IRP_PAGING_IO,\r
-     \r
-   /*\r
-    * The IRP is for a mount operation\r
-    */\r
-   IRP_MOUNT_COMPLETION,\r
-     \r
-   /*\r
-    * The API expects synchronous behaviour\r
-    */\r
-   IRP_SYNCHRONOUS_API,\r
-     \r
-   /*\r
-    * The IRP is associated with a larger operation\r
-    */\r
-   IRP_ASSOCIATED_IRP,\r
-     \r
-   /*\r
-    * The AssociatedIrp.SystemBuffer field is valid\r
-    */\r
-   IRP_BUFFERED_IO,\r
-     \r
-   /*\r
-    * The system buffer was allocated from pool and should be deallocated \r
-    * by the I/O manager\r
-    */\r
-   IRP_DEALLOCATE_BUFFER,\r
-     \r
-   /*\r
-    * The IRP is for an input operation\r
-    */\r
-   IRP_INPUT_OPERATION,\r
-     \r
-   /*\r
-    * The paging operation should complete synchronously \r
-    */\r
-   IRP_SYNCHRONOUS_PAGING_IO,\r
-     \r
-   /*\r
-    * The IRP represents a filesystem create operation\r
-    */\r
-   IRP_CREATE_OPERATION,\r
-     \r
-   /*\r
-    * The IRP represents a filesystem read operation\r
-    */\r
-   IRP_READ_OPERATION,\r
-     \r
-   /*\r
-    * The IRP represents a filesystem write operation\r
-    */\r
-   IRP_WRITE_OPERATION,\r
-          \r
-   /*\r
-    * The IRP represents a filesystem close operation\r
-    */\r
-   IRP_CLOSE_OPERATION,\r
-     \r
-   /*\r
-    * Asynchronous behavior is advised but not required\r
-    */\r
-   IRP_DEFER_IO_COMPLETION,\r
-};\r
-\r
-/*\r
- * I/O operation flags\r
- */\r
-enum\r
-{\r
-   /*\r
-    * Force an access check even if opened in kernel mode\r
-    */\r
-   SL_FORCE_ACCESS_CHECK,\r
-     \r
-   /*\r
-    * The file being opened is a paging file\r
-    */\r
-   SL_OPEN_PAGING_FILE,\r
-     \r
-   SL_OPEN_TARGET_DIRECTORY,\r
-     \r
-   SL_CASE_SENSITIVE,\r
-     \r
-   SL_KEY_SPECIFIED,\r
-     \r
-   SL_OVERRIDE_VERIFY_VOLUME,\r
-     \r
-   SL_WRITE_THROUGH,\r
-     \r
-   SL_FT_SEQUENTIAL_WRITE,\r
-     \r
-   SL_FAIL_IMMEDIATELY,\r
-     \r
-   SL_EXCLUSIVE_LOCK,\r
-     \r
-   SL_RESTART_SCAN,\r
-     \r
-   SL_RETURN_SINGLE_ENTRY,\r
-     \r
-   SL_INDEX_SPECIFIED,\r
-     \r
-   SL_WATCH_TREE,\r
-     \r
-   SL_ALLOW_RAW_MOUNT,   \r
-};\r
-\r
-/*\r
- * Possible flags for the device object flags\r
- */\r
-enum\r
-{\r
-   DO_BUFFERED_IO = 0x1,\r
-   DO_DIRECT_IO   = 0x2,\r
-};\r
-\r
-/*\r
- * Possible status codes\r
- * FIXME: These may not be the actual values used by NT\r
- */\r
-enum\r
-{\r
-   STATUS_SUCCESS,\r
-   STATUS_INSUFFICIENT_RESOURCES,\r
-   STATUS_OBJECT_NAME_EXISTS,\r
-   STATUS_OBJECT_NAME_COLLISION,\r
-//   STATUS_DATATYPE_MISALIGNMENT,\r
-   STATUS_CTL_FILE_NOT_SUPPORTED,\r
-//   STATUS_ACCESS_VIOLATION,\r
-   STATUS_PORT_ALREADY_SET,\r
-   STATUS_SECTION_NOT_IMAGE,\r
-   STATUS_BAD_WORKING_SET_LIMIT,\r
-   STATUS_INCOMPATIBLE_FILE_MAP,\r
-   STATUS_HANDLE_NOT_WAITABLE,\r
-   STATUS_PORT_DISCONNECTED,\r
-   STATUS_NOT_LOCKED,\r
-   STATUS_NOT_MAPPED_VIEW,\r
-   STATUS_UNABLE_TO_FREE_VM,\r
-   STATUS_UNABLE_TO_DELETE_SECTION,\r
-   STATUS_MORE_PROCESSING_REQUIRED,\r
-   STATUS_INVALID_CID,\r
-   STATUS_BAD_INITIAL_STACK,\r
-   STATUS_INVALID_VOLUME_LABEL,\r
-   STATUS_SECTION_NOT_EXTENDED,\r
-   STATUS_NOT_MAPPED_DATA,\r
-   STATUS_INFO_LENGTH_MISMATCH,\r
-   STATUS_INVALID_INFO_CLASS,\r
-   STATUS_SUSPEND_COUNT_EXCEEDED,\r
-   STATUS_NOTIFY_ENUM_DIR,\r
-   STATUS_REGISTRY_RECOVERED,\r
-   STATUS_REGISTRY_IO_FAILED,\r
-   STATUS_KEY_DELETED,\r
-   STATUS_NO_LOG_SPACE,\r
-   STATUS_KEY_HAS_CHILDREN,\r
-   STATUS_CHILD_MUST_BE_VOLATILE,\r
-   STATUS_REGISTRY_CORRUPT,\r
-   STATUS_DLL_NOT_FOUND,\r
-   STATUS_DLL_INIT_FAILED,\r
-   STATUS_ORDINAL_NOT_FOUND,\r
-   STATUS_ENTRYPOINT_NOT_FOUND,\r
-//   STATUS_PENDING,\r
-   STATUS_MORE_ENTRIES,\r
-//   STATUS_INTEGER_OVERFLOW,\r
-   STATUS_BUFFER_OVERFLOW,\r
-   STATUS_NO_MORE_FILES,\r
-   STATUS_NO_INHERITANCE,\r
-   STATUS_NO_MORE_EAS,\r
-   STATUS_NO_MORE_ENTRIES,\r
-   STATUS_GUIDS_EXHAUSTED,\r
-   STATUS_AGENTS_EXHAUSTED,\r
-   STATUS_UNSUCCESSFUL,\r
-   STATUS_NOT_IMPLEMENTED,\r
-   STATUS_ILLEGAL_FUNCTION,\r
-//   STATUS_IN_PAGE_ERROR,\r
-   STATUS_PAGEFILE_QUOTA,\r
-   STATUS_COMMITMENT_LIMIT,\r
-   STATUS_SECTION_TOO_BIG,\r
-   RPC_NT_SS_IN_NULL_CONTEXT,\r
-   RPC_NT_INVALID_BINDING,\r
-//   STATUS_INVALID_HANDLE,\r
-   STATUS_OBJECT_FILE_MISMATCH,\r
-   STATUS_FILE_CLOSED,\r
-   STATUS_INVALID_PORT_HANDLE,\r
-   STATUS_NOT_COMMITTED,\r
-   STATUS_INVALID_PARAMETER,\r
-   STATUS_INVALID_PARAMETER_1,\r
-   STATUS_INVALID_PARAMETER_2,\r
-   STATUS_INVALID_PARAMETER_3,\r
-   STATUS_INVALID_PARAMETER_4,\r
-   STATUS_INVALID_PARAMETER_5,\r
-   STATUS_INVALID_PARAMETER_6,\r
-   STATUS_INVALID_PARAMETER_7,\r
-   STATUS_INVALID_PARAMETER_8,\r
-   STATUS_INVALID_PARAMETER_9,\r
-   STATUS_INVALID_PARAMETER_10,\r
-   STATUS_INVALID_PARAMETER_11,\r
-   STATUS_INVALID_PARAMETER_12,\r
-   STATUS_INVALID_PARAMETER_MAX,\r
-   STATUS_INVALID_PAGE_PROTECTION,\r
-   STATUS_RESOURCE_DATA_NOT_FOUND,\r
-   STATUS_RESOURCE_TYPE_NOT_FOUND,\r
-   STATUS_RESOURCE_NAME_NOT_FOUND,\r
-   STATUS_RESOURCE_LANG_NOT_FOUND,\r
-   STATUS_NO_SUCH_DEVICE,\r
-   STATUS_NO_SUCH_FILE,\r
-   STATUS_INVALID_DEVICE_REQUEST,\r
-   STATUS_END_OF_FILE,\r
-   STATUS_FILE_FORCED_CLOSED,\r
-   STATUS_WRONG_VOLUME,\r
-   STATUS_NO_MEDIA,\r
-   STATUS_NO_MEDIA_IN_DEVICE,\r
-   STATUS_NONEXISTENT_SECTOR,\r
-   STATUS_WORKING_SET_QUOTA,\r
-//   STATUS_NO_MEMORY,\r
-   STATUS_CONFLICTING_ADDRESS,\r
-   STATUS_INVALID_SYSTEM_SERVICE,\r
-   STATUS_THREAD_IS_TERMINATING,\r
-   STATUS_PROCESS_IS_TERMINATING,\r
-   STATUS_INVALID_LOCK_SEQUENCE,\r
-   STATUS_INVALID_VIEW_SIZE,\r
-   STATUS_ALREADY_COMMITTED,\r
-   STATUS_ACCESS_DENIED,\r
-   STATUS_FILE_IS_A_DIRECTORY,\r
-   STATUS_CANNOT_DELETE,\r
-   STATUS_INVALID_COMPUTER_NAME,\r
-   STATUS_FILE_DELETED,\r
-   STATUS_DELETE_PENDING,\r
-   STATUS_PORT_CONNECTION_REFUSED,\r
-   STATUS_NO_SUCH_PRIVILEGE,\r
-   STATUS_PRIVILEGE_NOT_HELD,\r
-   STATUS_CANNOT_IMPERSONATE,\r
-   STATUS_LOGON_FAILURE,\r
-   STATUS_ACCOUNT_RESTRICTION,\r
-   STATUS_INVALID_LOGON_HOURS,\r
-   STATUS_INVALID_WORKSTATION,\r
-   STATUS_BUFFER_TOO_SMALL,\r
-   STATUS_UNABLE_TO_DECOMMIT_VM,\r
-   STATUS_DISK_CORRUPT_ERROR,\r
-   STATUS_OBJECT_NAME_INVALID,\r
-   STATUS_OBJECT_NAME_NOT_FOUND,\r
-//   STATUS_OBJECT_NAME_COLLISION,\r
-   STATUS_OBJECT_PATH_INVALID,\r
-   STATUS_OBJECT_PATH_NOT_FOUND,\r
-   STATUS_DFS_EXIT_PATH_FOUND,\r
-   STATUS_OBJECT_PATH_SYNTAX_BAD,\r
-   STATUS_DATA_OVERRUN,\r
-   STATUS_DATA_LATE_ERROR,\r
-   STATUS_DATA_ERROR,\r
-   STATUS_CRC_ERROR,\r
-   STATUS_SHARING_VIOLATION,\r
-   STATUS_QUOTA_EXCEEDED,\r
-   STATUS_MUTANT_NOT_OWNED,\r
-   STATUS_SEMAPHORE_LIMIT_EXCEEDED,\r
-   STATUS_DISK_FULL,\r
-   STATUS_LOCK_NOT_GRANTED,\r
-};\r
-\r
-/*\r
- * Possible device types\r
- */\r
-enum\r
-{\r
-   /*\r
-    * Standard define types\r
-    */\r
-   FILE_DEVICE_BEEP,\r
-   FILE_DEVICE_CDROM,\r
-   FILE_DEVICE_CONTROLLER,\r
-   FILE_DEVICE_DISK,\r
-   FILE_DEVICE_INPORT_PORT,\r
-   FILE_DEVICE_KEYBOARD,\r
-   FILE_DEVICE_MIDI_IN,\r
-   FILE_DEVICE_MIDI_OUT,\r
-   FILE_DEVICE_MOUSE,\r
-   FILE_DEVICE_NULL,\r
-   FILE_DEVICE_PARALLEL_PORT,\r
-   FILE_DEVICE_PRINTER,\r
-   FILE_DEVICE_SCANNER,\r
-   FILE_DEVICE_SERIAL_MOUSE_PORT,\r
-   FILE_DEVICE_SERIAL_PORT,\r
-   FILE_DEVICE_SCREEN,\r
-   FILE_DEVICE_TAPE,\r
-   FILE_DEVICE_UNKNOWN,\r
-   FILE_DEVICE_VIDEO,\r
-   FILE_DEVICE_VIRTUAL_DISK,\r
-   FILE_DEVICE_WAVE_IN,\r
-   FILE_DEVICE_WAVE_OUT,\r
-   FILE_DEVICE_8042_PORT,\r
-     \r
-   /*\r
-    * Values beyond this are reserved for ISVs\r
-    */\r
-   FILE_DEVICE_FIRST_FREE = 32768\r
-};\r
-\r
-\r
-\r
-/*\r
- * Possible device characteristics\r
- */\r
-enum\r
-{\r
-   FILE_REMOVABLE_MEDIA  = 0x1,\r
-   FILE_READ_ONLY_DEVICE = 0x2,\r
-   FILE_FLOPPY_DISKETTE  = 0x4,\r
-   FILE_WRITE_ONCE_MEDIA = 0x8,\r
-   FILE_REMOTE_DEVICE    = 0x10,\r
-};\r
-\r
-/*\r
- * PURPOSE: Bus types\r
- */\r
-enum\r
-{\r
-   Internal,\r
-   Isa,\r
-   MicroChannel,\r
-   TurboChannel,\r
-   PCIBus,\r
-   MaximumInterfaceType,\r
-};\r
-   \r
-/*\r
- * This is a list of bug check types (not MS's)\r
- */\r
-enum\r
-{\r
-   KBUG_NONE,\r
-   KBUG_ORPHANED_IRP,\r
-   KBUG_IO_STACK_OVERFLOW,\r
-   KBUG_OUT_OF_MEMORY,\r
-   KBUG_POOL_FREE_LIST_CORRUPT,\r
-     \r
-   /*\r
-    * These are well known but the actual value is unknown\r
-    */\r
-   NO_PAGES_AVAILABLE,\r
-     \r
-   /*\r
-    * These are well known (MS) bug types\r
-    * (Reference: NT Insider 1997 - http://www.osr.com)\r
-    */\r
-   IRQL_NOT_LESS_OR_EQUAL = 0xa,\r
-   KMODE_EXCEPTION_NOT_HANDLED = 0x1e,\r
-   UNEXPECTED_KERNEL_MODE_TRAP = 0x7f,\r
-   PAGE_FAULT_IN_NON_PAGED_AREA = 0x50,\r
-};\r
-\r
-/*\r
- * PURPOSE: Object attributes\r
- */\r
-enum\r
-{\r
-   OBJ_INHERIT = 0x1,\r
-   OBJ_PERMANENT = 0x2,\r
-   OBJ_EXCLUSIVE = 0x4,\r
-   OBJ_CASE_INSENSITIVE = 0x8,\r
-   OBJ_OPENIF = 0x10,\r
-};\r
-\r
-/*\r
- * PURPOSE: DPC priorities\r
- */\r
-enum\r
-{\r
-   High,\r
-   Medium,\r
-   Low,\r
-};\r
-\r
-/*\r
- * PURPOSE: Timer types\r
- */\r
-enum\r
-  {\r
-      NotificationTimer,\r
-      SynchronizationTimer,      \r
-  };\r
-   \r
-/*\r
- * PURPOSE: Some drivers use these\r
- */\r
-#define IN\r
-#define OUT\r
-#define OPTIONAL\r
-\r
-/*\r
- * PURPOSE: Power IRP minor function numbers\r
- */\r
-enum\r
-{\r
-   IRP_MN_QUERY_POWER,\r
-   IRP_MN_SET_POWER,\r
-   IRP_MN_WAIT_WAKE,\r
-   IRP_MN_QUERY_CAPABILITIES,\r
-   IRP_MN_POWER_SEQUENCE,\r
-};\r
-\r
-/*\r
- * FIXME: These are not in the correct order\r
- */\r
-enum\r
-{  \r
-     IRP_MJ_CREATE,\r
-     IRP_MJ_CREATE_NAMED_PIPE,\r
-     IRP_MJ_CLOSE,\r
-     IRP_MJ_READ,\r
-     IRP_MJ_WRITE,\r
-     IRP_MJ_QUERY_INFORMATION,\r
-     IRP_MJ_SET_INFORMATION,\r
-     IRP_MJ_QUERY_EA,\r
-     IRP_MJ_SET_EA,\r
-     IRP_MJ_FLUSH_BUFFERS,\r
-     IRP_MJ_QUERY_VOLUME_INFORMATION,\r
-     IRP_MJ_SET_VOLUME_INFORMATION,\r
-     IRP_MJ_DIRECTORY_CONTROL,\r
-     IRP_MJ_FILE_SYSTEM_CONTROL,     \r
-     IRP_MJ_DEVICE_CONTROL,\r
-     IRP_MJ_INTERNAL_DEVICE_CONTROL,\r
-     IRP_MJ_SHUTDOWN,\r
-     IRP_MJ_LOCK_CONTROL,\r
-     IRP_MJ_CLEANUP,\r
-     IRP_MJ_CREATE_MAILSLOT,\r
-     IRP_MJ_QUERY_SECURITY,\r
-     IRP_MJ_SET_SECURITY,\r
-     IRP_MJ_QUERY_POWER,\r
-     IRP_MJ_SET_POWER,\r
-     IRP_MJ_DEVICE_CHANGE,\r
-     IRP_MJ_QUERY_QUOTA,\r
-     IRP_MJ_SET_QUOTA,\r
-     IRP_MJ_PNP_POWER,\r
-     IRP_MJ_MAXIMUM_FUNCTION,\r
-};\r
-\r
-/*\r
- * PURPOSE: Used all over\r
- */\r
-enum\r
-{\r
-   KernelMode,\r
-   UserMode,\r
-};\r
-   \r
-/*\r
- * PURPOSE: Arguments to MmProbeAndLockPages\r
- */\r
-enum\r
-{\r
-   IoReadAccess,\r
-   IoWriteAccess,\r
-   IoModifyAccess,\r
-};\r
-\r
-#define MAXIMUM_VOLUME_LABEL_LENGTH (32)\r
-\r
-/*\r
- * IRQ levels\r
- */\r
-enum\r
-{\r
-   PASSIVE_LEVEL,\r
-     \r
-   /*\r
-    * Which order for these (only DISPATCH_LEVEL is important for now)\r
-    */\r
-   APC_LEVEL,\r
-   DISPATCH_LEVEL,\r
-     \r
-   /*\r
-    * Above here are device specific IRQ levels\r
-    */\r
-   FIRST_DEVICE_SPECIFIC_LEVEL,\r
-   HIGH_LEVEL = FIRST_DEVICE_SPECIFIC_LEVEL + NR_DEVICE_SPECIFIC_LEVELS,\r
-};\r
-  \r
+/* GENERAL DEFINITIONS ****************************************************/
+
+#include <internal/hal/irq.h>
+
+#include <ddk/kedef.h> 
+#include <ddk/iodef.h>
+
+/*
+ * PURPOSE: Number of a thread priority levels
+ */
+#define NR_PRIORITY_LEVELS (32)
+
+/*
+ * PURPOSE: Type of queue to insert a work item in
+ */
+enum
+{
+  CriticalWorkQueue,
+  DelayedWorkQueue,
+  HyperCriticalWorkQueue,
+};
+
+/*
+ * Types of memory to allocate
+ */
+enum
+{
+   NonPagedPool,
+   NonPagedPoolMustSucceed,
+   NonPagedPoolCacheAligned,
+   NonPagedPoolCacheAlignedMustS,
+   PagedPool,
+   PagedPoolCacheAligned,
+};
+
+/*
+ * Possible status codes
+ * FIXME: These may not be the actual values used by NT
+ */
+enum
+{
+   STATUS_SUCCESS,
+   STATUS_INSUFFICIENT_RESOURCES,
+   STATUS_OBJECT_NAME_EXISTS,
+   STATUS_OBJECT_NAME_COLLISION,
+//   STATUS_DATATYPE_MISALIGNMENT,
+   STATUS_CTL_FILE_NOT_SUPPORTED,
+//   STATUS_ACCESS_VIOLATION,
+   STATUS_PORT_ALREADY_SET,
+   STATUS_SECTION_NOT_IMAGE,
+   STATUS_BAD_WORKING_SET_LIMIT,
+   STATUS_INCOMPATIBLE_FILE_MAP,
+   STATUS_HANDLE_NOT_WAITABLE,
+   STATUS_PORT_DISCONNECTED,
+   STATUS_NOT_LOCKED,
+   STATUS_NOT_MAPPED_VIEW,
+   STATUS_UNABLE_TO_FREE_VM,
+   STATUS_UNABLE_TO_DELETE_SECTION,
+   STATUS_MORE_PROCESSING_REQUIRED,
+   STATUS_INVALID_CID,
+   STATUS_BAD_INITIAL_STACK,
+   STATUS_INVALID_VOLUME_LABEL,
+   STATUS_SECTION_NOT_EXTENDED,
+   STATUS_NOT_MAPPED_DATA,
+   STATUS_INFO_LENGTH_MISMATCH,
+   STATUS_INVALID_INFO_CLASS,
+   STATUS_SUSPEND_COUNT_EXCEEDED,
+   STATUS_NOTIFY_ENUM_DIR,
+   STATUS_REGISTRY_RECOVERED,
+   STATUS_REGISTRY_IO_FAILED,
+   STATUS_KEY_DELETED,
+   STATUS_NO_LOG_SPACE,
+   STATUS_KEY_HAS_CHILDREN,
+   STATUS_CHILD_MUST_BE_VOLATILE,
+   STATUS_REGISTRY_CORRUPT,
+   STATUS_DLL_NOT_FOUND,
+   STATUS_DLL_INIT_FAILED,
+   STATUS_ORDINAL_NOT_FOUND,
+   STATUS_ENTRYPOINT_NOT_FOUND,
+//   STATUS_PENDING,
+   STATUS_MORE_ENTRIES,
+//   STATUS_INTEGER_OVERFLOW,
+   STATUS_BUFFER_OVERFLOW,
+   STATUS_NO_MORE_FILES,
+   STATUS_NO_INHERITANCE,
+   STATUS_NO_MORE_EAS,
+   STATUS_NO_MORE_ENTRIES,
+   STATUS_GUIDS_EXHAUSTED,
+   STATUS_AGENTS_EXHAUSTED,
+   STATUS_UNSUCCESSFUL,
+   STATUS_NOT_IMPLEMENTED,
+   STATUS_ILLEGAL_FUNCTION,
+//   STATUS_IN_PAGE_ERROR,
+   STATUS_PAGEFILE_QUOTA,
+   STATUS_COMMITMENT_LIMIT,
+   STATUS_SECTION_TOO_BIG,
+   RPC_NT_SS_IN_NULL_CONTEXT,
+   RPC_NT_INVALID_BINDING,
+//   STATUS_INVALID_HANDLE,
+   STATUS_OBJECT_FILE_MISMATCH,
+   STATUS_FILE_CLOSED,
+   STATUS_INVALID_PORT_HANDLE,
+   STATUS_NOT_COMMITTED,
+   STATUS_INVALID_PARAMETER,
+   STATUS_INVALID_PARAMETER_1,
+   STATUS_INVALID_PARAMETER_2,
+   STATUS_INVALID_PARAMETER_3,
+   STATUS_INVALID_PARAMETER_4,
+   STATUS_INVALID_PARAMETER_5,
+   STATUS_INVALID_PARAMETER_6,
+   STATUS_INVALID_PARAMETER_7,
+   STATUS_INVALID_PARAMETER_8,
+   STATUS_INVALID_PARAMETER_9,
+   STATUS_INVALID_PARAMETER_10,
+   STATUS_INVALID_PARAMETER_11,
+   STATUS_INVALID_PARAMETER_12,
+   STATUS_INVALID_PARAMETER_MAX,
+   STATUS_INVALID_PAGE_PROTECTION,
+   STATUS_RESOURCE_DATA_NOT_FOUND,
+   STATUS_RESOURCE_TYPE_NOT_FOUND,
+   STATUS_RESOURCE_NAME_NOT_FOUND,
+   STATUS_RESOURCE_LANG_NOT_FOUND,
+   STATUS_NO_SUCH_DEVICE,
+   STATUS_NO_SUCH_FILE,
+   STATUS_INVALID_DEVICE_REQUEST,
+   STATUS_END_OF_FILE,
+   STATUS_FILE_FORCED_CLOSED,
+   STATUS_WRONG_VOLUME,
+   STATUS_NO_MEDIA,
+   STATUS_NO_MEDIA_IN_DEVICE,
+   STATUS_NONEXISTENT_SECTOR,
+   STATUS_WORKING_SET_QUOTA,
+//   STATUS_NO_MEMORY,
+   STATUS_CONFLICTING_ADDRESS,
+   STATUS_INVALID_SYSTEM_SERVICE,
+   STATUS_THREAD_IS_TERMINATING,
+   STATUS_PROCESS_IS_TERMINATING,
+   STATUS_INVALID_LOCK_SEQUENCE,
+   STATUS_INVALID_VIEW_SIZE,
+   STATUS_ALREADY_COMMITTED,
+   STATUS_ACCESS_DENIED,
+   STATUS_FILE_IS_A_DIRECTORY,
+   STATUS_CANNOT_DELETE,
+   STATUS_INVALID_COMPUTER_NAME,
+   STATUS_FILE_DELETED,
+   STATUS_DELETE_PENDING,
+   STATUS_PORT_CONNECTION_REFUSED,
+   STATUS_NO_SUCH_PRIVILEGE,
+   STATUS_PRIVILEGE_NOT_HELD,
+   STATUS_CANNOT_IMPERSONATE,
+   STATUS_LOGON_FAILURE,
+   STATUS_ACCOUNT_RESTRICTION,
+   STATUS_INVALID_LOGON_HOURS,
+   STATUS_INVALID_WORKSTATION,
+   STATUS_BUFFER_TOO_SMALL,
+   STATUS_UNABLE_TO_DECOMMIT_VM,
+   STATUS_DISK_CORRUPT_ERROR,
+   STATUS_OBJECT_NAME_INVALID,
+   STATUS_OBJECT_NAME_NOT_FOUND,
+//   STATUS_OBJECT_NAME_COLLISION,
+   STATUS_OBJECT_PATH_INVALID,
+   STATUS_OBJECT_PATH_NOT_FOUND,
+   STATUS_DFS_EXIT_PATH_FOUND,
+   STATUS_OBJECT_PATH_SYNTAX_BAD,
+   STATUS_DATA_OVERRUN,
+   STATUS_DATA_LATE_ERROR,
+   STATUS_DATA_ERROR,
+   STATUS_CRC_ERROR,
+   STATUS_SHARING_VIOLATION,
+   STATUS_QUOTA_EXCEEDED,
+   STATUS_MUTANT_NOT_OWNED,
+   STATUS_SEMAPHORE_LIMIT_EXCEEDED,
+   STATUS_DISK_FULL,
+   STATUS_LOCK_NOT_GRANTED,
+     
+   STATUS_DEVICE_NOT_READY,
+   STATUS_IO_TIMEOUT,
+   STATUS_MEDIA_WRITE_PROTECTED,
+   STATUS_NO_MEDIA_IN_DRIVE,
+   STATUS_VERIFY_REQUIRED,
+   STATUS_UNRECOGNIZED_MEDIA,
+//   STATUS_WRONG_VOLUME,
+};
+   
+/*
+ * This is a list of bug check types (not MS's)
+ */
+enum
+{
+   APC_INDEX_MISMATCH = 1,
+   DEVICE_QUEUE_NOT_BUSY,
+   INVALID_AFFINITY_SET,
+   INVALID_DATA_ACCESS_TRAP,
+   INVALID_PROCESS_ATTACH_ATTEMPT,
+   INVALID_PROCESS_DEATTACH_ATTEMPT,
+   INVALID_SOFTWARE_INTERRUPT,
+   IRQL_NOT_DISPATCH_LEVEL,
+   IRQL_NOT_GREATER_OR_EQUAL,
+   NO_EXCEPTION_HANDLING_SUPPORT,
+   MAXIMUM_WAIT_OBJECTS_EXCEEDED,
+   MUTEX_LEVEL_NUMBER_VIOLATION,
+   NO_USER_MODE_CONTEXT,
+   SPIN_LOCK_ALREADY_OWNED,
+   SPIN_LOCK_NOT_OWNED,
+   THREAD_NOT_MUTEX_OWNER,
+   TRAP_CAUSE_UNKNOWN,
+   EMPTY_THREAD_REAPER_LIST,
+   CREATE_DELETE_LOCK_NOT_LOCKED,
+   LAST_CHANCE_CALLED_FROM_KMODE,
+   CID_HANDLE_CREATION,
+   CID_HANDLE_DELETION,
+   REFERENCE_BY_POINTER,
+   BAD_POOL_HEADER,
+   MEMORY_MANAGMENT,
+   PFN_SHARE_COUNT,
+   PFN_REFERENCE_COUNT,
+   NO_SPIN_LOCK_AVAILABLE,
+   KMODE_EXCEPTION_NOT_HANDLED,
+   SHARED_RESOURCE_CONV_ERROR,
+   KERNEL_APC_PENDING_DURING_EXIT,
+   QUOTA_UNDERFLOW,
+   FILE_SYSTEM,
+   FAT_FILE_SYSTEM,
+   NTFS_FILE_SYSTEM,
+   NPFS_FILE_SYSTEM,
+   CDFS_FILE_SYSTEM,
+   RDR_FILE_SYSTEM,
+   CORRUPT_ACCESS_TOKEN,
+   SECURITY_SYSTEM,
+   INCONSISTENT_IRP,
+   PANIC_STACK_SWITCH,
+   PORT_DRIVER_INTERNAL,
+   SCSI_DISK_DRIVER_INTERNAL,
+   INSTRUCTION_BUS_ERROR,
+   SET_OF_INVALID_CONTEXT,
+   PHASE0_INITIALIZATION_FAILED,
+   PHASE1_INITIALIZATION_FAILED,
+   UNEXPECTED_INITIALIZATION_CALL,
+   CACHE_MANAGER,
+   NO_MORE_IRP_STACK_LOCATIONS,
+   DEVICE_REFERENCE_COUNT_NOT_ZERO,
+   FLOPPY_INTERNAL_ERROR,
+   SERIAL_DRIVER_INTERNAL,
+   SYSTEM_EXIT_OWNED_MUTEX,
+   SYSTEM_UNWIND_PREVIOUS_USER,
+   SYSTEN_SERVICE_EXCEPTION,
+   INTERRUPT_UNWIND_ATTEMPTED,
+   INTERRUPT_EXCEPTION_NOT_HANDLED,
+   MULTIPROCESSOR_CONFIGURATION_NOT_SUPPORTED,
+   NO_MORE_SYSTEM_PTES,
+   TARGET_MDL_TOO_SMALL,
+   MUST_SUCCEED_POOL_EMPTY,
+   ATDISK_DRIVER_INTERNAL,
+   NO_SUCH_PARTITION,
+   MULTIPLE_IRP_COMPLETE_REQUESTS,
+   INSUFFICENT_SYSTEM_MAP_PAGES,
+   DEREF_UNKNOWN_LOGON_SERVICE,
+   REF_UNKNOWN_LOGON_SERVICE,
+   CANCEL_STATE_IN_COMPLETED_IRP,
+   PAGE_FAULT_WITH_INTERRUPTS_OFF,
+   IRQL_GT_ZERO_AT_SYSTEM_SERVICE,
+   STREAMS_INTERNAL_ERROR,
+   FATAL_UNHANDLED_HARD_ERROR,
+   NO_PAGES_AVAILABLE,
+   PFN_LIST_CORRUPT,
+   NDIS_INTERNAL_ERROR,
+   PAGE_FAULT_IN_NONPAGED_AREA,
+   REGISTRY_ERROR,
+   MAILSLOT_FILE_SYSTEM,
+   NO_BOOT_DEVICE,
+   LM_SERVER_INTERNAL_ERROR,
+   DATA_COHERENCY_EXCEPTION,
+   INSTRUCTION_COHERENCY_EXCEPTION,
+   XNS_INTERNAL_ERROR,
+   FTDISK_INTERNAL_ERROR,
+   PINBALL_FILE_SYSTEM,
+   CRITICAL_SERVICE_FAILED,
+   SET_ENV_VAR_FAILED,
+   HAL_INITIALIZED_FAILED,
+   UNSUPPORTED_PROCESSOR,
+   OBJECT_INITIALIZATION_FAILED,
+   SECURITY_INITIALIZATION_FAILED,
+   PROCESS_INITIALIZATION_FAILED,
+   HAL1_INITIALIZATION_FAILED,   
+};
+enum
+{
+   KBUG_NONE,
+   KBUG_ORPHANED_IRP,
+   KBUG_IO_STACK_OVERFLOW,
+   KBUG_OUT_OF_MEMORY,
+   KBUG_POOL_FREE_LIST_CORRUPT,
+     
+   /*
+    * These are well known but the actual value is unknown
+    */
+//   NO_PAGES_AVAILABLE,
+     
+   /*
+    * These are well known (MS) bug types
+    * (Reference: NT Insider 1997 - http://www.osr.com)
+    */
+   IRQL_NOT_LESS_OR_EQUAL = 0xa,
+//   KMODE_EXCEPTION_NOT_HANDLED = 0x1e,
+   UNEXPECTED_KERNEL_MODE_TRAP = 0x7f,
+   PAGE_FAULT_IN_NON_PAGED_AREA = 0x50,
+};
+
+/*
+ * PURPOSE: Object attributes
+ */
+enum
+{
+   OBJ_INHERIT = 0x1,
+   OBJ_PERMANENT = 0x2,
+   OBJ_EXCLUSIVE = 0x4,
+   OBJ_CASE_INSENSITIVE = 0x8,
+   OBJ_OPENIF = 0x10,
+};
+
+/*
+ * PURPOSE: DPC priorities
+ */
+enum
+{
+   High,
+   Medium,
+   Low,
+};
+
+/*
+ * PURPOSE: Timer types
+ */
+enum
+  {
+      NotificationTimer,
+      SynchronizationTimer,      
+  };
+   
+/*
+ * PURPOSE: Some drivers use these
+ */
+#define IN
+#define OUT
+#define OPTIONAL
+
+/*
+ * PURPOSE: Power IRP minor function numbers
+ */
+enum
+{
+   IRP_MN_QUERY_POWER,
+   IRP_MN_SET_POWER,
+   IRP_MN_WAIT_WAKE,
+   IRP_MN_QUERY_CAPABILITIES,
+   IRP_MN_POWER_SEQUENCE,
+};
+
+/*
+ * PURPOSE: Used all over
+ */
+enum
+{
+   KernelMode,
+   UserMode,
+};
+   
+/*
+ * PURPOSE: Arguments to MmProbeAndLockPages
+ */
+enum
+{
+   IoReadAccess,
+   IoWriteAccess,
+   IoModifyAccess,
+};
+
+#define MAXIMUM_VOLUME_LABEL_LENGTH (32)
+
+/*
+ * IRQ levels
+ */
+enum
+{
+   PASSIVE_LEVEL,
+     
+   /*
+    * Which order for these (only DISPATCH_LEVEL is important for now)
+    */
+   APC_LEVEL,
+   DISPATCH_LEVEL,
+     
+   /*
+    * Above here are device specific IRQ levels
+    */
+   FIRST_DEVICE_SPECIFIC_LEVEL,
+   HIGH_LEVEL = FIRST_DEVICE_SPECIFIC_LEVEL + NR_DEVICE_SPECIFIC_LEVELS,
+};
+  
index 224241a..5414541 100644 (file)
@@ -1,15 +1,17 @@
 /* EXECUTIVE ROUTINES ******************************************************/
 
-//VOID ExAcquireFastMutex(PFAST_MUTEX FastMutex);
+VOID ExAcquireFastMutex(PFAST_MUTEX FastMutex);
+VOID ExAcquireFastMutexUnsafe(PFAST_MUTEX FastMutex);
 
+BOOLEAN ExAcquireResourceExclusive(PERESOURCE Resource, BOOLEAN Wait);
+BOOLEAN ExAcquireResourceExclusiveLite(PERESOURCE Resource, BOOLEAN Wait);
+BOOLEAN ExAcquireResourceSharedLite(PERESOURCE Resource, BOOLEAN Wait);
+BOOLEAN ExAcquireSharedStarveExclusive(PERESOURCE Resource, BOOLEAN Wait);
+BOOLEAN ExAcquireSharedWaitForExclusive(PERESOURCE Resource, BOOLEAN Wait);
+PVOID ExAllocateFromNPagedLookasideList(PNPAGED_LOOKASIDE_LIST LookSide);
+PVOID ExAllocateFromPagedLookasideList(PPAGED_LOOKASIDE_LIST LookSide);
+PVOID ExAllocateFromZone(PZONE_HEADER Zone);
 
-/*
- * FUNCTION: Releases previously allocated memory
- * ARGUMENTS:
- *        block = block to free
- */
-VOID ExFreePool(PVOID block);
-   
 /*
  * FUNCTION: Allocates memory from the nonpaged pool
  * ARGUMENTS:
@@ -20,6 +22,63 @@ VOID ExFreePool(PVOID block);
  */
 PVOID ExAllocatePool(POOL_TYPE PoolType, ULONG size);
 
+PVOID ExAllocatePoolWithQuota(POOL_TYPE PoolType, ULONG NumberOfBytes);
+PVOID ExAllocatePoolWithQuotaTag(POOL_TYPE PoolType, ULONG NumberOfBytes,
+                                ULONG Tag);
+PVOID ExAllocatePoolWithTag(POOL_TYPE PoolType, ULONG NumberOfBytes,
+                           ULONG Tag);
+VOID ExConvertExclusiveToSharedLite(PERESOURCE Resource);
+VOID ExDeleteNPagedLookasideList(PNPAGED_LOOKASIDE_LIST Lookaside);
+VOID ExDeletePagedLookasideList(PPAGED_LOOKASIDE_LIST Lookaside);
+NTSTATUS ExDeleteResource(PERESOURCE Resource);
+NTSTATUS ExDeleteResourceLite(PERESOURCE Resource);
+NTSTATUS ExExtendZone(PZONE_HEADER Zone, PVOID Segment, ULONG SegmentSize);
+
+/*
+ * FUNCTION: Releases previously allocated memory
+ * ARGUMENTS:
+ *        block = block to free
+ */
+VOID ExFreePool(PVOID block);
+
+VOID ExFreeToNPagedLookasideList(PNPAGED_LOOKASIDE_LIST Lookaside,
+                                PVOID Entry);
+VOID ExFreeToPagedLookasideList(PPAGED_LOOKASIDE_LIST Lookaside,
+                                PVOID Entry);
+PVOID ExFreeToZone(PZONE_HEADER Zone, PVOID Block);
+ERESOURCE_THREAD ExGetCurrentResourceThread(VOID);
+ULONG ExGetExclusiveWaiterCount(PERESOURCE Resource);
+ULONG ExGetSharedWaiterCount(PERESOURCE Resource);
+VOID ExInitializeFastMutex(PFAST_MUTEX FastMutex);
+VOID ExInitializeNPagedLookasideList(PNPAGED_LOOKASIDE_LIST Lookaside,
+                                    PALLOCATE_FUNCTION Allocate,
+                                    PFREE_FUNCTION Free,
+                                    ULONG Flags,
+                                    ULONG Size,
+                                    ULONG Tag,
+                                    USHORT Depth);
+VOID ExInitializePagedLookasideList(PPAGED_LOOKASIDE_LIST Lookaside,
+                                    PALLOCATE_FUNCTION Allocate,
+                                    PFREE_FUNCTION Free,
+                                    ULONG Flags,
+                                    ULONG Size,
+                                    ULONG Tag,
+                                    USHORT Depth);
+NTSTATUS ExInitializeResource(PERESOURCE Resource);
+NTSTATUS ExInitializeResourceLite(PERESOURCE Resource);
+VOID ExInitializeSListHead(PSLIST_HEADER SListHead);
+VOID ExInitializeWorkItem(PWORK_QUEUE_ITEM Item,
+                         PWORKER_THREAD_ROUTINE Routine,
+                         PVOID Context);
+NTSTATUS ExInitializeZone(PZONE_HEADER Zone,
+                         ULONG BlockSize,
+                         PVOID InitialSegment,
+                         ULONG InitialSegmentSize);
+LARGE_INTEGER ExInterlockedAddLargeInteger(PLARGE_INTEGER Addend,
+                                          LARGE_INTEGER Increment,
+                                          PKSPIN_LOCK Lock);
+ULONG ExInterlockedAddUlong(PULONG Addend, ULONG Increment, PKSPIN_LOCK Lock);
+
 VOID ExInterlockedRemoveEntryList(PLIST_ENTRY ListHead, PLIST_ENTRY Entry,
                                  PKSPIN_LOCK Lock);
 VOID RemoveEntryFromList(PLIST_ENTRY ListHead, PLIST_ENTRY Entry);   
@@ -33,3 +92,5 @@ PLIST_ENTRY ExInterlockedInsertHeadList(PLIST_ENTRY ListHead,
                                        PLIST_ENTRY ListEntry,
                                        PKSPIN_LOCK Lock);
 
+VOID ExQueueWorkItem(PWORK_QUEUE_ITEM WorkItem,
+                    WORK_QUEUE_TYPE QueueType);
index 81ed7c3..35e4e02 100644 (file)
@@ -1,3 +1,50 @@
+
+
+typedef ULONG INTERLOCKED_RESULT;
+typedef ULONG WORK_QUEUE_TYPE;
+
+typedef ULONG ERESOURCE_THREAD, *PERESOURCE_THREAD;
+
+typedef struct _OWNER_ENTRY
+{
+   ERESOURCE_THREAD OwnerThread;
+   union
+     {
+       LONG OwnerCount;
+       ULONG TableSize;
+     } a;
+} OWNER_ENTRY, *POWNER_ENTRY;
+
+typedef struct _ERESOURCE
+{
+   LIST_ENTRY SystemResourcesList;
+   POWNER_ENTRY OwnerTable;
+   SHORT ActiveCount;
+   USHORT Flag;
+   PKSEMAPHORE SharedWaiters;
+   PKEVENT ExclusiveWaiters;
+   OWNER_ENTRY OwnerThreads[2];
+   ULONG ContentionCount;
+   USHORT NumberOfSharedWaiters;
+   USHORT NumberOfExclusiveWaiters;
+   union
+     {
+       PVOID Address;
+       ULONG CreatorBackTraceIndex;
+     } a;
+   KSPIN_LOCK SpinLock;
+} ERESOURCE, *PERESOURCE;
+
+
+typedef struct 
+{
+   LONG Count;
+   PKTHREAD Owner;
+   ULONG Contention;
+   KEVENT Event;
+   ULONG OldIrql;
+} FAST_MUTEX, *PFAST_MUTEX;
+
 typedef struct _ZONE_HEADER
 {
    SINGLE_LIST_ENTRY FreeList;
@@ -16,3 +63,65 @@ typedef struct _ZONE_ENTRY
 {
    SINGLE_LIST_ENTRY Entry;
 } ZONE_ENTRY, *PZONE_ENTRY;
+
+
+typedef VOID (*PWORKER_THREAD_ROUTINE)(PVOID Parameter);
+
+typedef struct _WORK_QUEUE_ITEM
+{
+   LIST_ENTRY Entry;
+   PWORKER_THREAD_ROUTINE Routine;
+   PVOID Context;
+} WORK_QUEUE_ITEM, *PWORK_QUEUE_ITEM;
+
+typedef PVOID (*PALLOCATE_FUNCTION)(POOL_TYPE PoolType,
+                                  ULONG NumberOfBytes,
+                                  ULONG Tag);
+typedef VOID (*PFREE_FUNCTION)(PVOID Buffer);
+
+typedef union _SLIST_HEADER
+{
+   ULONGLONG Alignment;
+   struct
+     {
+       SINGLE_LIST_ENTRY Next;
+       USHORT Depth;
+       USHORT Sequence;        
+     } s;
+} SLIST_HEADER, *PSLIST_HEADER;
+
+typedef struct
+{
+   SLIST_HEADER ListHead;
+   USHORT Depth;
+   USHORT Pad;
+   ULONG TotalAllocates;
+   ULONG AllocateMisses;
+   ULONG TotalFrees;
+   ULONG TotalMisses;
+   POOL_TYPE Type;
+   ULONG Tag;
+   ULONG Size;
+   PALLOCATE_FUNCTION Allocate;
+   PFREE_FUNCTION Free;
+   LIST_ENTRY ListEntry;
+   KSPIN_LOCK Lock;
+} NPAGED_LOOKASIDE_LIST, *PNPAGED_LOOKASIDE_LIST;
+
+typedef struct
+{
+   SLIST_HEADER ListHead;
+   USHORT Depth;
+   USHORT Pad;
+   ULONG TotalAllocates;
+   ULONG AllocateMisses;
+   ULONG TotalFrees;
+   ULONG TotalMisses;
+   POOL_TYPE Type;
+   ULONG Tag;
+   ULONG Size;
+   PALLOCATE_FUNCTION Allocate;
+   PFREE_FUNCTION Free;
+   LIST_ENTRY ListEntry;
+   FAST_MUTEX Lock;
+} PAGED_LOOKASIDE_LIST, *PPAGED_LOOKASIDE_LIST;
index 4b4499c..b735640 100644 (file)
@@ -224,7 +224,7 @@ BOOLEAN IoCancelIrp(PIRP Irp);
 NTSTATUS IoCheckShareAccess(ACCESS_MASK DesiredAccess,
                            ULONG DesiredShareAccess,
                            PFILE_OBJECT FileObject,
-//                         PSHARE_ACCESS ShareAccess,
+                           PSHARE_ACCESS ShareAccess,
                            BOOLEAN Update);
 
 /*
@@ -404,7 +404,7 @@ BOOLEAN IoRaiseHardInformationalError(NTSTATUS ErrorStatus,
 NTSTATUS IoReadPartitionTable(PDEVICE_OBJECT DeviceObject,
                              ULONG SectorSize,
                              BOOLEAN ReturnedRecognizedPartitions,
-                             struct _DRIVER_LAYOUT_INFORMATION** PBuffer);
+                             struct _DRIVE_LAYOUT_INFORMATION** PBuffer);
 
 VOID IoRegisterDriverReinitialization(PDRIVER_OBJECT DriverObject,
                                      PDRIVER_REINITIALIZE ReinitRoutine,
@@ -502,3 +502,22 @@ NTSTATUS IoWritePartitionTable(PDEVICE_OBJECT DeviceObject,
                               ULONG SectorsPerTrack,
                               ULONG NumberOfHeads,
                               struct _DRIVE_LAYOUT_INFORMATION* PBuffer);
+
+typedef ULONG FS_INFORMATION_CLASS;
+
+// Preliminary guess
+NTKERNELAPI NTSTATUS IoQueryFileVolumeInformation(IN PFILE_OBJECT FileObject, 
+                                 IN FS_INFORMATION_CLASS FsInformationClass, 
+                                                 IN ULONG Length, 
+                                                 OUT PVOID FsInformation, 
+                                                 OUT PULONG ReturnedLength);
+
+NTKERNELAPI // confirmed - Undocumented because it does not require a valid file handle 
+NTSTATUS 
+IoQueryFileInformation(
+IN PFILE_OBJECT FileObject,
+IN FILE_INFORMATION_CLASS FileInformationClass,
+IN ULONG Length,
+OUT PVOID FileInformation,
+OUT PULONG ReturnedLength
+);
index 0869601..fb863d3 100644 (file)
@@ -16,10 +16,14 @@ struct _IO_STATUS_BLOCK;
 
 /* SIMPLE TYPES *************************************************************/
 
+enum
+{
+   DeallocateObject,
+   KeepObject,
+};
+
 typedef ULONG INTERFACE_TYPE;
 typedef INTERFACE_TYPE* PINTERFACE_TYPE;
-typedef ULONG CONFIGURATION_TYPE;
-typedef CONFIGURATION_TYPE* PCONFIGURATION_TYPE;
 
 /*
  * FIXME: Definition needed
@@ -62,8 +66,9 @@ typedef VOID (*PIO_APC_ROUTINE) (PVOID ApcContext,
  */
 typedef struct _IO_TIMER
 {
-} IO_TIMER, PIO_TIMER;
-
+   KTIMER timer;
+   KDPC dpc;
+} IO_TIMER, *PIO_TIMER;
 
 /*
  * PURPOSE: IRP stack location
@@ -136,9 +141,6 @@ typedef struct _IO_STACK_LOCATION
     */
    PIO_COMPLETION_ROUTINE CompletionRoutine;
    PVOID CompletionContext;
-   BOOLEAN InvokeOnSuccess;
-   BOOLEAN InvokeOnError;
-   BOOLEAN InvokeOnCancel;
    
    /*
     * Driver created device object representing the target device
@@ -176,6 +178,52 @@ typedef NTSTATUS (*PDRIVER_INITIALIZE)(struct _DRIVER_OBJECT* DriverObject,
 typedef NTSTATUS (*PDRIVER_CANCEL)(struct _DRIVER_OBJECT* DriverObject,
                                   PUNICODE_STRING RegistryPath);
 
+
+typedef struct _SECTION_OBJECT_POINTERS
+{
+   PVOID DataSectionObject;
+   PVOID SharedCacheMap;
+   PVOID ImageSectionObject;
+} SECTION_OBJECT_POINTERS, *PSECTION_OBJECT_POINTERS;
+
+typedef struct _IO_COMPLETION_CONTEXT
+{
+   PVOID Port;
+   ULONG Key;
+} IO_COMPLETION_CONTEXT, *PIO_COMPLETION_CONTEXT;
+
+typedef struct _FILE_OBJECT
+{
+   CSHORT Type;
+   CSHORT Size;
+   struct _DEVICE_OBJECT* DeviceObject;
+   struct _VPB* Vpb;   
+   PVOID FsContext;
+   PVOID FsContext2;
+   PSECTION_OBJECT_POINTERS SectionObjectPointers;
+   PVOID PrivateCacheMap;
+   NTSTATUS FinalStatus;
+   struct _FILE_OBJECT* RelatedFileObject;
+   BOOLEAN LockOperation;
+   BOOLEAN DeletePending;
+   BOOLEAN ReadAccess;
+   BOOLEAN WriteAccess;
+   BOOLEAN DeleteAccess;
+   BOOLEAN SharedRead;
+   BOOLEAN SharedWrite;
+   BOOLEAN SharedDelete;
+   ULONG Flags;
+   UNICODE_STRING FileName;
+   LARGE_INTEGER CurrentByteOffset;
+   ULONG Waiters;
+   ULONG Busy;
+   PVOID LastLock;
+   KEVENT Lock;
+   KEVENT Event;
+   PIO_COMPLETION_CONTEXT CompletionContext;
+} FILE_OBJECT, *PFILE_OBJECT;
+
+
 typedef struct _IRP
 {
    PMDL MdlAddress;
@@ -212,13 +260,11 @@ typedef struct _IRP
        struct
          {
             KDEVICE_QUEUE_ENTRY DeviceQueueEntry;
-//          PETHREAD Thread;
-            PVOID Thread;
+            PETHREAD Thread;
             PCHAR AuxiliaryBuffer;
             LIST_ENTRY ListEntry;
             struct _IO_STACK_LOCATION* CurrentStackLocation;
-//          PFILE_OBJECT OriginalFileObject;
-            PVOID OriginalFileObject;
+            PFILE_OBJECT OriginalFileObject;
          } Overlay;      
        KAPC Apc;
        ULONG CompletionKey;
@@ -288,7 +334,7 @@ typedef NTSTATUS (*PFAST_IO_DISPATCH)(struct _DEVICE_OBJECT*, IRP*);
 /*
  * Dispatch routine type declaration
  */
-typedef NTSTATUS (*PDRIVER_STARTIO)(struct _DEVICE_OBJECT*, IRP*);
+typedef VOID (*PDRIVER_STARTIO)(struct _DEVICE_OBJECT*, IRP*);
 
 /*
  * Dispatch routine type declaration
@@ -326,14 +372,6 @@ typedef struct _DRIVER_OBJECT
 } DRIVER_OBJECT, *PDRIVER_OBJECT;
 
 
-
-
-typedef struct _FILE_OBJECT
-{
-   PDEVICE_OBJECT DeviceObject;
-   PVOID FsContext;
-} FILE_OBJECT, *PFILE_OBJECT;
-
 typedef struct _CONFIGURATION_INFORMATION
 {
    ULONG DiskCount;
@@ -355,20 +393,6 @@ typedef VOID (*PIO_DPC_ROUTINE)(PKDPC Dpc,
 typedef VOID (*PIO_TIMER_ROUTINE)(PDEVICE_OBJECT DeviceObject,
                                  PVOID Context);
 
-#if PKEY_VALUE_FULL_INFORMATION_DEFINED
-typedef NTSTATUS (*PIO_QUERY_DEVICE_ROUTINE)(PVOID Context,
-                                     PUNICODE_STRING PathName,
-                                     INTERFACE_TYPE BusType,
-                                     ULONG BusNumber,
-                                     PKEY_VALUE_FULL_INFORMATION* BusKey,
-                                     CONFIGURATION_TYPE ControllerType,
-                                     ULONG ControllerNumber,
-                                     PKEY_VALUE_FULL_INFORMATION* CtrlKey,
-                                     CONFIGURATION_TYPE PeripheralType,
-                                     ULONG PeripheralNumber,
-                                     PKEY_VALUE_FULL_INFORMATION* PrphKey);
-#endif
-
 #if WINDOWS_STRUCTS_DOESNT_ALREADY_DEFINE_THIS
 typedef struct _PARTITION_INFORMATION
 {
@@ -390,4 +414,142 @@ typedef struct _DRIVER_LAYOUT_INFORMATION
    PARTITION_INFORMATION PartitionEntry[1];
 } DRIVER_LAYOUT_INFORMATION, *PDRIVER_LAYOUT_INFORMATION;
 
+
+
+
+
+typedef struct _IO_RESOURCE_DESCRIPTOR
+{
+   UCHAR Option;
+   UCHAR Type;
+   UCHAR SharedDisposition;
+   
+   /*
+    * Reserved for system use
+    */
+   UCHAR Spare1;             
+   
+   USHORT Flags;
+   
+   /*
+    * Reserved for system use
+    */
+   UCHAR Spare2;
+   
+   union
+     {
+       struct
+         {
+            ULONG Length;
+            ULONG Alignment;
+            PHYSICAL_ADDRESS MinimumAddress;
+            PHYSICAL_ADDRESS MaximumAddress;
+         } Port;
+       struct
+         {
+            ULONG Length;
+            ULONG Alignment;
+            PHYSICAL_ADDRESS MinimumAddress;
+            PHYSICAL_ADDRESS MaximumAddress;
+         } Memory;
+       struct
+         { 
+            ULONG MinimumVector;
+            ULONG MaximumVector;
+         } Interrupt;
+       struct
+         {
+            ULONG MinimumChannel;
+            ULONG MaximumChannel;
+         } Dma;
+     } u;     
+} IO_RESOURCE_DESCRIPTOR, *PIO_RESOURCE_DESCRIPTOR;
+
+typedef struct _IO_RESOURCE_LIST
+{
+   USHORT Version;
+   USHORT Revision;
+   ULONG Count;
+   IO_RESOURCE_DESCRIPTOR Descriptors[1];
+} IO_RESOURCE_LIST, *PIO_RESOURCE_LIST;
+
+typedef struct _IO_RESOURCES_REQUIREMENTS_LIST
+{
+   /*
+    * List size in bytes
+    */
+   ULONG ListSize;
+   
+   /*
+    * System defined enum for the bus
+    */
+   INTERFACE_TYPE InterfaceType;
+   
+   ULONG BusNumber;
+   ULONG SlotNumber;
+   ULONG Reserved[3];
+   ULONG AlternativeLists;
+   IO_RESOURCE_LIST List[1];   
+} IO_RESOURCES_REQUIREMENTS_LIST, *PIO_RESOURCE_REQUIREMENTS_LIST;
+
+typedef struct
+{
+   UCHAR Type;
+   UCHAR ShareDisposition;
+   USHORT Flags;
+   union
+     {
+       struct
+         {
+            PHYSICAL_ADDRESS Start;
+            ULONG Length;
+         } Port;
+       struct
+         {
+            ULONG Level;
+            ULONG Vector;
+            ULONG Affinity;
+         } Interrupt;
+       struct
+         {
+            PHYSICAL_ADDRESS Start;
+            ULONG Length;
+         } Memory;
+       struct
+         {
+            ULONG Channel;
+            ULONG Port;
+            ULONG Reserved1;
+         } Dma;
+       struct
+         {
+            ULONG DataSize;
+            ULONG Reserved1;
+            ULONG Reserved2;
+         } DeviceSpecificData;
+     } u;
+} CM_PARTIAL_RESOURCE_DESCRIPTOR, *PCM_PARTIAL_RESOURCE_DESCRIPTOR;
+
+typedef struct
+{
+   USHORT Version;
+   USHORT Revision;
+   ULONG Count;
+   CM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptors[1];
+} CM_PARTIAL_RESOURCE_LIST;
+
+typedef struct
+{
+   INTERFACE_TYPE InterfaceType;
+   ULONG BusNumber;
+   CM_PARTIAL_RESOURCE_LIST PartialResourceList;
+} CM_FULL_RESOURCE_DESCRIPTOR;
+
+typedef struct
+{
+   ULONG Count;
+   CM_FULL_RESOURCE_DESCRIPTOR List[1];
+} CM_RESOURCE_LIST, *PCM_RESOURCE_LIST;
+
+
 #endif __INCLUDE_DDK_IOTYPES_H
index bbc42d2..a15a0f8 100644 (file)
@@ -1,6 +1,17 @@
+#ifndef __INCLUDE_DDK_KEFUNCS_H
+#define __INCLUDE_DDK_KEFUNCS_H
+
 /* KERNEL FUNCTIONS ********************************************************/
 
+/*
+ * FUNCTION: Acquires a spinlock so the caller can synchronize access to 
+ * data
+ * ARGUMENTS:
+ *         SpinLock = Initialized spinlock
+ *         OldIrql (OUT) = Set the previous irql on return 
+ */
 VOID KeAcquireSpinLock(PKSPIN_LOCK SpinLock, PKIRQL OldIrql);
+
 VOID KeAcquireSpinLockAtDpcLevel(PKSPIN_LOCK SpinLock);
 BOOLEAN KeCancelTimer(PKTIMER Timer);
 VOID KeClearEvent(PKEVENT Event);
@@ -14,6 +25,7 @@ VOID KeFlushIoBuffers(PMDL Mdl, BOOLEAN ReadOperation, BOOLEAN DmaOperation);
 KIRQL KeGetCurrentIrql(VOID);
 ULONG KeGetCurrentProcessorNumber(VOID);
 ULONG KeGetDcacheFillSize(VOID);
+PKTHREAD KeGetCurrentThread(VOID);
 VOID KeInitializeCallbackRecord(PKBUGCHECK_CALLBACK_RECORD CallbackRecord);
 VOID KeInitializeDeviceQueue(PKDEVICE_QUEUE DeviceQueue);
 VOID KeInitializeDpc(PKDPC Dpc, PKDEFERRED_ROUTINE DeferredRoutine,
@@ -122,3 +134,5 @@ VOID KeBugCheckEx(ULONG BugCheckCode,
  * RETURNS: Doesn't
  */
 VOID KeBugCheck(ULONG BugCheckCode);
+
+#endif /* __INCLUDE_DDK_KEFUNCS_H */
index 32f5348..23b1744 100644 (file)
+/* KERNEL TYPES **************************************************************/
+
+#ifndef __INCLUDE_DDK_KETYPES_H
+#define __INCLUDE_DDK_KETYPES_H
+
 typedef LONG KPRIORITY;
    
 typedef VOID (*PKBUGCHECK_CALLBACK_ROUTINE)(PVOID Buffer, ULONG Length);
 typedef BOOLEAN (*PKSYNCHRONIZE_ROUTINE)(PVOID SynchronizeContext);
-   
-typedef struct
-{
-} KBUGCHECK_CALLBACK_RECORD, *PKBUGCHECK_CALLBACK_RECORD;
-   
-typedef struct
-{
-} KMUTEX, *PKMUTEX;
-   
-typedef struct
-{
-} KSEMAPHORE, *PKSEMAPHORE; 
+
+struct _KAPC;
+
+typedef VOID (*PKNORMAL_ROUTINE)(PVOID NormalContext,
+                                PVOID SystemArgument1,
+                                PVOID SystemArgument2);
+typedef VOID (*PKKERNEL_ROUTINE)(struct _KAPC* Apc,
+                               PKNORMAL_ROUTINE* NormalRoutine,
+                               PVOID* NormalContext,
+                               PVOID* SystemArgument1,
+                               PVOID* SystemArgument2);
+             
+typedef VOID (*PKRUNDOWN_ROUTINE)(struct _KAPC* Apc);        
 
 typedef struct
+/*
+ * PURPOSE: Object describing the wait a thread is currently performing
+ */
 {
-} KTHREAD, *PKTHREAD;
+   LIST_ENTRY WaitListEntry;
+   struct _KTHREAD* Thread;
+   PVOID Object;
+   struct _KWAIT_BLOCK* NextWaitBlock;
+   USHORT WaitKey;
+   USHORT WaitType;
+} KWAIT_BLOCK, *PKWAIT_BLOCK;
 
 
+
+typedef struct _ETHREAD
 /*
- * PURPOSE: Included in every object that a thread can wait on
+ * PURPOSE: Describes a thread of execution
  */
-typedef struct 
 {
+   CSHORT Type;
+   CSHORT Size;
    /*
-    * PURPOSE: True if the object is signaling a change of state
+    * PURPOSE: Head of the queue of apcs
     */
-   BOOLEAN signaled;
+   LIST_ENTRY apc_queue_head;
+   
+   /*
+    * PURPOSE: Entry in the linked list of threads
+    */
+   LIST_ENTRY Entry;
    
    /*
-    * PURPOSE: Head of the queue of threads waiting on this object
+    * PURPOSE: Current state of the thread
     */
-   LIST_ENTRY wait_queue_head;
+   ULONG State;
    
    /*
-    * PURPOSE: True if all the threads waiting should be woken when the
-    * object changes state
+    * PURPOSE: Priority modifier of the thread
     */
-   BOOLEAN wake_all;
+   ULONG Priority;
    
-} DISPATCHER_HEADER, *PDISPATCHER_HEADER;
+   /*
+    * PURPOSE: Pointer to our process
+    */
+   struct _EPROCESS* Process;
+   
+   /*
+    * PURPOSE: Handle of our process
+    */
+   HANDLE ProcessHandle;
+   
+   /*
+    * PURPOSE: Thread affinity mask
+    */
+   ULONG AffinityMask;
+   
+   /*
+    * PURPOSE: Saved thread context
+    */
+   hal_thread_state context;
+   
+} KTHREAD, *PKTHREAD, *PETHREAD;
+                     
+typedef struct _DISPATCHER_HEADER
+{
+   UCHAR Type;
+   UCHAR Absolute;
+   UCHAR Size;
+   UCHAR Inserted;
+   LONG SignalState;
+   LIST_ENTRY WaitListHead;
+} DISPATCHER_HEADER;
+             
+typedef struct _KAPC
+{
+   CSHORT Type;
+   CSHORT Size;
+   ULONG Spare0;
+   struct _KTHREAD* Thread;
+   LIST_ENTRY ApcListEntry;
+   PKKERNEL_ROUTINE KernelRoutine;
+   PKRUNDOWN_ROUTINE RundownRoutine;
+   PKNORMAL_ROUTINE NormalRoutine;
+   PVOID NormalContext;
+   PVOID SystemArgument1;
+   PVOID SystemArgument2;
+   CCHAR ApcStateIndex;
+   KPROCESSOR_MODE ApcMode;
+   BOOLEAN Inserted;
+} KAPC, *PKAPC;
 
+typedef struct
+{
+   LIST_ENTRY Entry;
+   PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine;
+   PVOID Buffer;
+   ULONG Length;
+   PUCHAR Component;
+   ULONG Checksum;
+   UCHAR State;
+} KBUGCHECK_CALLBACK_RECORD, *PKBUGCHECK_CALLBACK_RECORD;
+   
+typedef struct
+{
+   DISPATCHER_HEADER Header;
+   LIST_ENTRY MutantListEntry;
+   struct _KTHREAD* OwnerThread;
+   BOOLEAN Abandoned;
+   UCHAR ApcDisable;
+} KMUTEX, *PKMUTEX;
+   
+typedef struct
+{
+   DISPATCHER_HEADER Header;
+   LONG Limit;
+} KSEMAPHORE, *PKSEMAPHORE; 
 
+typedef struct _KEVENT
 /*
  * PURPOSE: Describes an event
  */
-typedef struct _KEVENT
 {
    /*
     * PURPOSE: So we can use the general wait routine
     */
-   DISPATCHER_HEADER hdr;
-   
-   /*
-    * PURPOSE: Type of event, notification or synchronization
-    */
-   EVENT_TYPE type;
+   DISPATCHER_HEADER Header;
 } KEVENT, *PKEVENT;
 
 
@@ -66,14 +157,6 @@ typedef struct _KSPIN_LOCK
    KIRQL irql;
 } KSPIN_LOCK, *PKSPIN_LOCK;
 
-typedef struct
-{
-} KAPC;
-
-typedef struct
-{
-} UNICODE_STRING;
-
 typedef VOID (*PDRIVER_ADD_DEVICE)(VOID);
 
 struct _KDPC;
@@ -139,3 +222,63 @@ typedef struct _KDEVICE_QUEUE_ENTRY
 typedef struct _WAIT_CONTEXT_BLOCK
 {
 } WAIT_CONTEXT_BLOCK, *PWAIT_CONTEXT_BLOCK;
+
+
+typedef struct _KTIMER
+{
+   /*
+    * Pointers to maintain the linked list of activated timers
+    */
+   LIST_ENTRY entry;
+   
+   /*
+    * Absolute expiration time in system time units
+    */
+   unsigned long long expire_time;
+
+   /*
+    * Optional dpc associated with the timer 
+    */
+   PKDPC dpc;
+   
+   /*
+    * True if the timer is signaled
+    */
+   BOOLEAN signaled;
+   
+   /*
+    * True if the timer is in the system timer queue
+    */
+   BOOLEAN running;
+   
+   /*
+    * Type of the timer either Notification or Synchronization
+    */
+   TIMER_TYPE type;
+   
+   /*
+    * Period of the timer in milliseconds (zero if once-only)
+    */
+   ULONG period;
+   
+} KTIMER, *PKTIMER;
+
+struct _KINTERRUPT;
+
+typedef BOOLEAN (*PKSERVICE_ROUTINE)(struct _KINTERRUPT* Interrupt, 
+                            PVOID ServiceContext);
+
+typedef struct _KINTERRUPT
+{
+   ULONG Vector;
+   KAFFINITY ProcessorEnableMask;
+   PKSPIN_LOCK IrqLock;
+   BOOLEAN Shareable;
+   BOOLEAN FloatingSave;
+   PKSERVICE_ROUTINE ServiceRoutine;
+   PVOID ServiceContext;
+   LIST_ENTRY Entry;
+   KIRQL SynchLevel;
+} KINTERRUPT, *PKINTERRUPT;
+
+#endif /* __INCLUDE_DDK_KETYPES_H */
index 4c0b8fc..248d1e9 100644 (file)
@@ -152,7 +152,7 @@ PVOID MmGetSystemAddressForMdl(PMDL Mdl);
  *       BaseVa = Base virtual address of the buffer 
  *       Length = Length in bytes of the buffer
  */
-VOID MmInitalizeMdl(PMDL MemoryDescriptorList, PVOID BaseVa, ULONG Length);
+VOID MmInitializeMdl(PMDL MemoryDescriptorList, PVOID BaseVa, ULONG Length);
 
 /*
  * FUNCTION: Checks whether an address is valid for read/write
index bf3cd42..351d71a 100644 (file)
@@ -1,24 +1,14 @@
-typedef struct _MDL
+ typedef struct _MDL
 /*
  * PURPOSE: Describes a user buffer passed to a system API
  */
 {
-   /*
-    * Base address of the buffer in user mode
-    */
-   PVOID Base;
-   
-   /*
-    * Length of the buffer in bytes
-    */
-   ULONG Length;
-   
-   /*
-    * System address of buffer or NULL if not mapped
-    */
-   PVOID SysBase;
-   
-   /*
-    * Below this is a variable length list of page physical address
-    */
+   struct _MDL* Next;
+   CSHORT Size;
+   CSHORT MdlFlags;
+   struct _EPROCESS* Process;
+   PVOID MappedSystemVa;
+   PVOID StartVa;
+   ULONG ByteCount;
+   ULONG ByteOffset;
 } MDL, *PMDL;
index dcd5805..bfb5255 100644 (file)
@@ -1,41 +1,75 @@
-/*\r
- * COPYRIGHT:      See COPYING in the top level directory\r
- * PROJECT:        ReactOS kernel\r
- * FILE:           include/ddk/ntddk.h\r
- * PURPOSE:        Interface definitions for drivers\r
- * PROGRAMMER:     David Welch (welch@mcmail.com)\r
- * UPDATE HISTORY:\r
- *                 15/05/98: Created\r
- */\r
-\r
-#ifndef __NTDDK_H\r
-#define __NTDDK_H\r
-\r
-#ifdef __cplusplus\r
-extern "C"\r
-{\r
-#endif\r
-\r
-/* INCLUDES ***************************************************************/\r
-\r
-#include <windows.h>\r
-#include <internal/hal/page.h>\r
-\r
-#include <ddk/defines.h>\r
-#include <ddk/types.h>\r
-#include <ddk/structs.h>\r
-#include <internal/hal/ddk.h>\r
-#include <ddk/rtl.h>\r
-#include <ddk/zw.h>\r
-#include <ddk/exfuncs.h>\r
-#include <ddk/mmfuncs.h>\r
-#include <ddk/kefuncs.h>\r
-#include <ddk/iofuncs.h> \r
-#include <ddk/psfuncs.h>\r
-   \r
-#ifdef __cplusplus\r
-};\r
-#endif\r
-\r
-#endif /* __NTDDK_H */\r
-\r
+/*
+ * COPYRIGHT:      See COPYING in the top level directory
+ * PROJECT:        ReactOS kernel
+ * FILE:           include/ddk/ntddk.h
+ * PURPOSE:        Interface definitions for drivers
+ * PROGRAMMER:     David Welch (welch@mcmail.com)
+ * UPDATE HISTORY:
+ *                 15/05/98: Created
+ */
+
+#ifndef __NTDDK_H
+#define __NTDDK_H
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+/* INCLUDES ***************************************************************/
+
+#include <windows.h>
+
+#define NT_SUCCESS(StatCode)  ((NTSTATUS)(StatCode) >= 0)
+#define NTKERNELAPI
+
+   #define CTL_CODE(Dev, Func, Meth, Acc) ( ((Dev)<<16) | ((Acc)<<14) | ((Func)<<2) | (Meth))
+
+//  IOCTL Parameter buffering methods
+#define METHOD_BUFFERED    0
+#define METHOD_IN_DIRECT   1
+#define METHOD_OUT_DIRECT  2
+#define METHOD_NEITHER     3
+
+//  IOCTL File access type
+#define FILE_ANY_ACCESS    0
+#define FILE_READ_ACCESS   1
+#define FILE_WRITE_ACCESS  2
+
+#define QUAD_PART(LI)  (*(LONGLONG *)(&LI))
+
+enum {
+  STATUS_NOT_SUPPORTED = 9999,
+  STATUS_DISK_OPERATION_FAILED
+};
+
+#define  IO_DISK_INCREMENT  4
+
+#define  FILE_WORD_ALIGNMENT  0x0001
+
+#define  FILE_OPENED          0x0001
+   
+#include <ddk/defines.h>
+#include <ddk/types.h>
+#include <ddk/structs.h>
+#include <ddk/setypes.h>
+   
+#include <internal/hal/ddk.h>
+   
+#include <ddk/rtl.h>
+#include <ddk/zw.h>
+#include <ddk/exfuncs.h>
+#include <ddk/mmfuncs.h>
+#include <ddk/kefuncs.h>
+#include <ddk/iofuncs.h> 
+#include <ddk/psfuncs.h>
+#include <ddk/obfuncs.h>
+   
+ULONG DbgPrint(PCH Format,...);   
+   
+#ifdef __cplusplus
+};
+#endif
+
+#endif /* __NTDDK_H */
+
index 41f5bae..12c8c1e 100644 (file)
@@ -12,7 +12,7 @@ typedef struct _OBJECT_TYPE
    /*
     * PURPOSE: Name of the type
     */
-   LPCSTR TypeName;
+   UNICODE_STRING TypeName;
    
    /*
     * PURPOSE: Total number of objects of this type
@@ -96,7 +96,7 @@ typedef struct _OBJECT
    /*
     * PURPOSE: Name of this entry
     */
-   LPCSTR name;
+   UNICODE_STRING name;
    
    /*
     * PURPOSE: Our entry in our parents list of subdirectory
@@ -139,11 +139,11 @@ typedef struct _OBJECT_ATTRIBUTES
     */
    ULONG Attributes;
    
-   //SECURITY_DESCRIPTOR SecurityDescriptor
-   //SecurityQualityOfService
+   SECURITY_DESCRIPTOR SecurityDescriptor;
+//   SecurityQualityOfService
    
    struct _DIRECTORY_OBJECT* parent;
-   char* name;
-   char* path;
+   UNICODE_STRING name;
+   UNICODE_STRING path;
    
 } OBJECT_ATTRIBUTES, *POBJECT_ATTRIBUTES;
index cbbb9db..5f2eb0b 100644 (file)
@@ -25,3 +25,8 @@ NTSTATUS PsCreateSystemThread(PHANDLE ThreadHandle,
                              PCLIENT_ID ClientId,
                              PKSTART_ROUTINE StartRoutine,
                               PVOID StartContext);
+NTSTATUS PsTerminateSystemThread(NTSTATUS ExitStatus);
+NTSTATUS PsSuspendThread(VOID);
+NTSTATUS PsWakeThread(PETHREAD Thread);
+PETHREAD PsGetCurrentThread(VOID);
+PEPROCESS PsGetCurrentProcess(VOID);
index e7fdeb4..b7aaf1e 100644 (file)
@@ -3,6 +3,8 @@
 
 #include <kernel32/heap.h>
 
+typedef ULONG THREADINFOCLASS;
+
 typedef struct _CLIENT_ID 
 {
     HANDLE UniqueProcess;
@@ -60,10 +62,7 @@ typedef struct _NT_PEB
        WORD                    wMinorVersion; 
        WORD                    wBuildNumber;  
        WORD                    wPlatformId;    
-} NT_PEB;
-
-typedef NT_PEB *PPEB;  
-
+} NT_PEB, *PPEB;
 
 
 typedef struct _NT_TIB {
@@ -104,8 +103,58 @@ typedef struct _EPROCESS
 {
 } EPROCESS, *PEPROCESS;
 
+//typedef KTHREAD ETHREAD, *PETHREAD;
+
+#if ETHREAD_NOT_THE_SAME_AS_KTHREAD
 typedef struct _ETHREAD
 {
+   EPROCESS* Process;
 } ETHREAD, *PETHREAD;
 
+/*
+ * PURPOSE: Thread object
+ */
+typedef struct 
+{
+   CSHORT Type;
+   CSHORT Size;
+   
+   /*
+    * PURPOSE: Entry in the linked list of threads
+    */
+   LIST_ENTRY Entry;
+   
+   /*
+    * PURPOSE: Current state of the thread
+    */
+   ULONG State;
+   
+   /*
+    * PURPOSE: Priority modifier of the thread
+    */
+   ULONG Priority;
+   
+   /*
+    * PURPOSE: Pointer to our parent process
+    */
+//   PEPROCESS Parent;
+   
+   /*
+    * PURPOSE: Handle of our parent process
+    */
+   HANDLE ParentHandle;
+   
+   /*
+    * PURPOSE: Not currently used 
+    */
+   ULONG AffinityMask;
+   
+   /*
+    * PURPOSE: Saved thread context
+    */
+   hal_thread_state context;
+   
+} THREAD_OBJECT, *PTHREAD_OBJECT;
+#endif
+
 #endif /* __INCLUDE_DDK_PSTYPES_H */
index f4ad771..d7e708f 100644 (file)
@@ -5,6 +5,52 @@
 #ifndef __DDK_RTL_H
 #define __DDK_RTL_H
 
+typedef struct _CONTROLLER_OBJECT
+{
+   CSHORT Type;
+   CSHORT Size;   
+   PVOID ControllerExtension;
+   KDEVICE_QUEUE DeviceWaitQueue;
+   ULONG Spare1;
+   LARGE_INTEGER Spare2;
+} CONTROLLER_OBJECT, *PCONTROLLER_OBJECT;
+   
+typedef struct _STRING
+{
+   /*
+    * Length in bytes of the string stored in buffer
+    */
+   USHORT Length;
+   
+   /*
+    * Maximum length of the string 
+    */
+   USHORT MaximumLength;
+   
+   /*
+    * String
+    */
+   PCHAR Buffer;
+} STRING, *PSTRING;
+
+typedef struct _ANSI_STRING
+{
+   /*
+    * Length in bytes of the string stored in buffer
+    */
+   USHORT Length;
+   
+   /*
+    * Maximum length of the string 
+    */
+   USHORT MaximumLength;
+   
+   /*
+    * String
+    */
+   PCHAR Buffer;
+} ANSI_STRING, *PANSI_STRING;
+
 typedef struct _TIME_FIELDS
 {
    CSHORT Year;
@@ -179,6 +225,43 @@ VOID RtlStoreLong(PULONG Address, ULONG Value);
 VOID RtlStoreUshort(PUSHORT Address, USHORT Value);
 BOOLEAN RtlTimeFieldsToTime(PTIME_FIELDS TimeFields, PLARGE_INTEGER Time);
 VOID RtlTimeToTimeFields(PLARGE_INTEGER Time, PTIME_FIELDS TimeFields);
+PWSTR RtlStrtok(PUNICODE_STRING _string, PWSTR _sep, PWSTR* temp);
+
+
+typedef struct {
+       ULONG           Length;
+       ULONG           Unknown[11];
+} RTL_HEAP_DEFINITION, *PRTL_HEAP_DEFINITION;
+
+// Heap creation routine
+
+HANDLE 
+STDCALL
+RtlCreateHeap(
+       ULONG Flags, 
+       PVOID BaseAddress, 
+       ULONG SizeToReserve, 
+       ULONG SizeToCommit, 
+       PVOID Unknown,
+       PRTL_HEAP_DEFINITION Definition
+       );
+
+PVOID 
+STDCALL 
+RtlAllocateHeap(
+       HANDLE Heap, 
+       ULONG Flags, 
+       ULONG Size 
+       );
+
+
+BOOLEAN 
+STDCALL 
+RtlFreeHeap(
+       HANDLE Heap, 
+       ULONG Flags, 
+       PVOID Address 
+       );
 
 
 #endif /* __DDK_RTL_H */
index 6ea04d0..694bb21 100644 (file)
-/* SYSTEM STRUCTURES ******************************************************/\r
-\r
-#include <internal/hal/hal.h>\r
-#include <ddk/cfgtypes.h>\r
-#include <ddk/ketypes.h>\r
-#include <ddk/obtypes.h>\r
-#include <ddk/mmtypes.h>\r
-#include <ddk/iotypes.h>\r
-#include <ddk/extypes.h>\r
-#include <ddk/pstypes.h>\r
-\r
-/*\r
- * PURPOSE: Thread object\r
- */\r
-typedef struct \r
-{\r
-   CSHORT Type;\r
-   CSHORT Size;\r
-   \r
-   /*\r
-    * PURPOSE: Entry in the linked list of threads\r
-    */\r
-   LIST_ENTRY Entry;\r
-   \r
-   /*\r
-    * PURPOSE: Current state of the thread\r
-    */\r
-   ULONG State;\r
-   \r
-   /*\r
-    * PURPOSE: Priority modifier of the thread\r
-    */\r
-   ULONG Priority;\r
-   \r
-   /*\r
-    * PURPOSE: Pointer to our parent process\r
-    */\r
-//   PEPROCESS Parent;\r
-   \r
-   /*\r
-    * PURPOSE: Handle of our parent process\r
-    */\r
-   HANDLE ParentHandle;\r
-   \r
-   /*\r
-    * PURPOSE: Not currently used \r
-    */\r
-   ULONG AffinityMask;\r
-   \r
-   /*\r
-    * PURPOSE: Saved thread context\r
-    */\r
-   hal_thread_state context;\r
-   \r
-} THREAD_OBJECT, *PTHREAD_OBJECT;\r
-\r
-\r
-\r
-/*\r
- * PURPOSE: Object describing the wait a thread is currently performing\r
- */\r
-typedef struct\r
-{\r
-   /*\r
-    * PURPOSE: Pointer to the waiting thread\r
-    */\r
-   PTHREAD_OBJECT thread;\r
-   \r
-   /*\r
-    * PURPOSE: Entry in the wait queue for the object being waited on\r
-    */\r
-   LIST_ENTRY Entry;\r
-   \r
-   /*\r
-    * PURPOSE: Pointer to the object being waited on\r
-    */\r
-   DISPATCHER_HEADER* wait_object;\r
-   \r
-} KWAIT_BLOCK, *PKWAIT_BLOCK;\r
-   \r
-typedef struct _ADAPTER_OBJECT\r
-{\r
-} ADAPTER_OBJECT, *PADAPTER_OBJECT;\r
-\r
-typedef struct _CONTROLLER_OBJECT\r
-{\r
-   PVOID ControllerExtension;   \r
-} CONTROLLER_OBJECT, *PCONTROLLER_OBJECT;\r
-   \r
-typedef struct _STRING\r
-{\r
-   /*\r
-    * Length in bytes of the string stored in buffer\r
-    */\r
-   USHORT Length;\r
-   \r
-   /*\r
-    * Maximum length of the string \r
-    */\r
-   USHORT MaximumLength;\r
-   \r
-   /*\r
-    * String\r
-    */\r
-   PCHAR Buffer;\r
-} STRING, *PSTRING;\r
-\r
-typedef struct _ANSI_STRING\r
-{\r
-   /*\r
-    * Length in bytes of the string stored in buffer\r
-    */\r
-   USHORT Length;\r
-   \r
-   /*\r
-    * Maximum length of the string \r
-    */\r
-   USHORT MaximumLength;\r
-   \r
-   /*\r
-    * String\r
-    */\r
-   PCHAR Buffer;\r
-} ANSI_STRING, *PANSI_STRING;\r
-\r
-typedef struct _KTIMER\r
-{\r
-   /*\r
-    * Pointers to maintain the linked list of activated timers\r
-    */\r
-   LIST_ENTRY entry;\r
-   \r
-   /*\r
-    * Absolute expiration time in system time units\r
-    */\r
-   unsigned long long expire_time;\r
-\r
-   /*\r
-    * Optional dpc associated with the timer \r
-    */\r
-   PKDPC dpc;\r
-   \r
-   /*\r
-    * True if the timer is signaled\r
-    */\r
-   BOOLEAN signaled;\r
-   \r
-   /*\r
-    * True if the timer is in the system timer queue\r
-    */\r
-   BOOLEAN running;\r
-   \r
-   /*\r
-    * Type of the timer either Notification or Synchronization\r
-    */\r
-   TIMER_TYPE type;\r
-   \r
-   /*\r
-    * Period of the timer in milliseconds (zero if once-only)\r
-    */\r
-   ULONG period;\r
-   \r
-} KTIMER, *PKTIMER;\r
-\r
-\r
-\r
-\r
-typedef struct _IO_RESOURCE_DESCRIPTOR\r
-{\r
-   UCHAR Option;\r
-   UCHAR Type;\r
-   UCHAR SharedDisposition;\r
-   \r
-   /*\r
-    * Reserved for system use\r
-    */\r
-   UCHAR Spare1;             \r
-   \r
-   USHORT Flags;\r
-   \r
-   /*\r
-    * Reserved for system use\r
-    */\r
-   UCHAR Spare2;\r
-   \r
-   union\r
-     {\r
-       struct\r
-         {\r
-            ULONG Length;\r
-            ULONG Alignment;\r
-            PHYSICAL_ADDRESS MinimumAddress;\r
-            PHYSICAL_ADDRESS MaximumAddress;\r
-         } Port;\r
-       struct\r
-         {\r
-            ULONG Length;\r
-            ULONG Alignment;\r
-            PHYSICAL_ADDRESS MinimumAddress;\r
-            PHYSICAL_ADDRESS MaximumAddress;\r
-         } Memory;\r
-       struct\r
-         { \r
-            ULONG MinimumVector;\r
-            ULONG MaximumVector;\r
-         } Interrupt;\r
-       struct\r
-         {\r
-            ULONG MinimumChannel;\r
-            ULONG MaximumChannel;\r
-         } Dma;\r
-     } u;     \r
-} IO_RESOURCE_DESCRIPTOR, *PIO_RESOURCE_DESCRIPTOR;\r
-\r
-typedef struct _IO_RESOURCE_LIST\r
-{\r
-   USHORT Version;\r
-   USHORT Revision;\r
-   ULONG Count;\r
-   IO_RESOURCE_DESCRIPTOR Descriptors[1];\r
-} IO_RESOURCE_LIST, *PIO_RESOURCE_LIST;\r
-\r
-typedef struct _IO_RESOURCES_REQUIREMENTS_LIST\r
-{\r
-   /*\r
-    * List size in bytes\r
-    */\r
-   ULONG ListSize;\r
-   \r
-   /*\r
-    * System defined enum for the bus\r
-    */\r
-   INTERFACE_TYPE InterfaceType;\r
-   \r
-   ULONG BusNumber;\r
-   ULONG SlotNumber;\r
-   ULONG Reserved[3];\r
-   ULONG AlternativeLists;\r
-   IO_RESOURCE_LIST List[1];   \r
-} IO_RESOURCES_REQUIREMENTS_LIST, *PIO_RESOURCE_REQUIREMENTS_LIST;\r
-\r
-typedef struct\r
-{\r
-   UCHAR Type;\r
-   UCHAR ShareDisposition;\r
-   USHORT Flags;\r
-   union\r
-     {\r
-       struct\r
-         {\r
-            PHYSICAL_ADDRESS Start;\r
-            ULONG Length;\r
-         } Port;\r
-       struct\r
-         {\r
-            ULONG Level;\r
-            ULONG Vector;\r
-            ULONG Affinity;\r
-         } Interrupt;\r
-       struct\r
-         {\r
-            PHYSICAL_ADDRESS Start;\r
-            ULONG Length;\r
-         } Memory;\r
-       struct\r
-         {\r
-            ULONG Channel;\r
-            ULONG Port;\r
-            ULONG Reserved1;\r
-         } Dma;\r
-       struct\r
-         {\r
-            ULONG DataSize;\r
-            ULONG Reserved1;\r
-            ULONG Reserved2;\r
-         } DeviceSpecificData;\r
-     } u;\r
-} CM_PARTIAL_RESOURCE_DESCRIPTOR, *PCM_PARTIAL_RESOURCE_DESCRIPTOR;\r
-\r
-typedef struct\r
-{\r
-   USHORT Version;\r
-   USHORT Revision;\r
-   ULONG Count;\r
-   CM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptors[1];\r
-} CM_PARTIAL_RESOURCE_LIST;\r
-\r
-typedef struct\r
-{\r
-   INTERFACE_TYPE InterfaceType;\r
-   ULONG BusNumber;\r
-   CM_PARTIAL_RESOURCE_LIST PartialResourceList;\r
-} CM_FULL_RESOURCE_DESCRIPTOR;\r
-\r
-typedef struct\r
-{\r
-   ULONG Count;\r
-   CM_FULL_RESOURCE_DESCRIPTOR List[1];\r
-} CM_RESOURCE_LIST, *PCM_RESOURCE_LIST;\r
-\r
-struct _KINTERRUPT;\r
-\r
-typedef BOOLEAN (*PKSERVICE_ROUTINE)(struct _KINTERRUPT* Interrupt, \r
-                            PVOID ServiceContext);\r
-\r
-typedef struct _KINTERRUPT\r
-{\r
-   ULONG Vector;\r
-   KAFFINITY ProcessorEnableMask;\r
-   PKSPIN_LOCK IrqLock;\r
-   BOOLEAN Shareable;\r
-   BOOLEAN FloatingSave;\r
-   PKSERVICE_ROUTINE ServiceRoutine;\r
-   PVOID ServiceContext;\r
-   LIST_ENTRY Entry;\r
-   KIRQL SynchLevel;\r
-} KINTERRUPT, *PKINTERRUPT;\r
-\r
+/* SYSTEM STRUCTURES ******************************************************/
+
+#include <internal/hal/hal.h>
+#include <ddk/cfgtypes.h>
+#include <ddk/ketypes.h>
+#include <ddk/obtypes.h>
+#include <ddk/mmtypes.h>
+#include <ddk/iotypes.h>
+#include <ddk/extypes.h>
+#include <ddk/pstypes.h>
+   
+typedef struct _ADAPTER_OBJECT
+{
+} ADAPTER_OBJECT, *PADAPTER_OBJECT;
index f7b4524..d4d69e1 100644 (file)
@@ -6,12 +6,9 @@
 typedef const int CINT;
 
 
-typedef ULONG KAFFINITY;
-typedef KAFFINITY *PKAFFINITY;
+typedef ULONG KAFFINITY, *PKAFFINITY;
 
-//typedef LONG KPRIORITY;
-
-typedef LONG NTSTATUS;
+typedef LONG NTSTATUS, *PNTSTATUS;
 
 typedef ULONG DEVICE_TYPE;
 
@@ -35,20 +32,12 @@ typedef unsigned long long ULONGLONG;
  */
 //typedef LONG NTSTATUS;
 
-/*
- * Unicode string type 
- * FIXME: Real unicode please
- */
-typedef char* PUNICODE_STRING;
-
-#if REAL_UNICODE
 typedef struct _UNICODE_STRING
 {
    USHORT Length;
    USHORT MaximumLength;
    PWSTR Buffer;
 } UNICODE_STRING, *PUNICODE_STRING;
-#endif
 
 typedef enum _SECTION_INHERIT {
     ViewShare = 1,
@@ -58,12 +47,10 @@ typedef enum _SECTION_INHERIT {
 /*
  * Various other types (all quite pointless)
  */
-//typedef ULONG DEVICE_TYPE;
 typedef ULONG KPROCESSOR_MODE;
-typedef ULONG KIRQL;
+typedef UCHAR KIRQL;
 typedef KIRQL* PKIRQL;
 typedef ULONG IO_ALLOCATION_ACTION;
-//typedef ULONG INTERFACE_TYPE;
 typedef ULONG POOL_TYPE;
 typedef ULONG TIMER_TYPE;
 typedef ULONG MM_SYSTEM_SIZE;
@@ -71,15 +58,10 @@ typedef ULONG LOCK_OPERATION;
 typedef ULONG KEY_INFORMATION_CLASS;
 typedef ULONG FILE_INFORMATION_CLASS;
 typedef ULONG KEY_VALUE_INFORMATION_CLASS;
-//typedef ULONG SECTION_INHERIT;
-typedef ULONG EVENT_TYPE;
-//typedef ULONG KAFFINITY;
-//typedef KAFFINITY* PKAFFINITY;
 typedef ULONG PHYSICAL_ADDRESS;
 typedef PHYSICAL_ADDRESS* PPHYSICAL_ADDRESS;
 typedef ULONG WAIT_TYPE;
-typedef ULONG KWAIT_REASON;
-typedef ULONG KINTERRUPT_MODE;
+//typedef ULONG KINTERRUPT_MODE;
 typedef USHORT CSHORT;
 
 #endif
index ad6265d..1ab26a6 100644 (file)
-/*\r
- * COPYRIGHT:        See COPYING in the top level directory\r
- * PROJECT:          ReactOS kernel\r
- * PURPOSE:          System call definitions\r
- * FILE:             include/ddk/zw.h\r
- * REVISION HISTORY: \r
- *              ??/??/??: First few functions (David Welch)\r
- *              ??/??/??: Complete implementation by Boudewijn Dekker\r
- *              13/07/98: Reorganised things a bit (David Welch)\r
- */\r
-\r
-#ifndef __DDK_ZW_H\r
-#define __DDK_ZW_H\r
-\r
-#include <windows.h>\r
-\r
-/*\r
- * FUNCTION: Closes an object handle\r
- * ARGUMENTS:\r
- *         Handle = Handle to the object\r
- * RETURNS: Status\r
- */\r
-NTSTATUS ZwClose(HANDLE Handle);\r
-\r
-/*\r
- * FUNCTION: Creates or opens a directory object, which is a container for\r
- * other objects\r
- * ARGUMENTS:\r
- *        DirectoryHandle (OUT) = Points to a variable which stores the\r
- *                                handle for the directory on success\r
- *        DesiredAccess = Type of access the caller requires to the directory\r
- *        ObjectAttributes = Structures specifing the object attributes,\r
- *                           initialized with InitializeObjectAttributes\r
- * RETURNS: Status \r
- */\r
-NTSTATUS ZwCreateDirectoryObject(PHANDLE DirectoryHandle,\r
-                                ACCESS_MASK DesiredAccess,\r
-                                POBJECT_ATTRIBUTES ObjectAttributes);\r
-\r
-/*\r
- * FUNCTION: Creates or opens a registry key\r
- * ARGUMENTS:\r
- *        KeyHandle (OUT) = Points to a variable which stores the handle\r
- *                          for the key on success\r
- *        DesiredAccess = Access desired by the caller to the key \r
- *        ObjectAttributes = Initialized object attributes for the key\r
- *        TitleIndex = Who knows?\r
- *        Class = Object class of the key?\r
- *        CreateOptions = Options for the key creation\r
- *        Disposition (OUT) = Points to a variable which a status value\r
- *                            indicating whether a new key was created\r
- * RETURNS: Status\r
- */\r
-NTSTATUS ZwCreateKey(PHANDLE KeyHandle, ACCESS_MASK DesiredAccess,\r
-                    POBJECT_ATTRIBUTES ObjectAttributes,\r
-                    ULONG TitleIndex, PUNICODE_STRING Class,\r
-                    ULONG CreateOptions, PULONG Disposition);\r
-\r
-/*\r
- * FUNCTION: Deletes a registry key\r
- * ARGUMENTS:\r
- *         KeyHandle = Handle of the key\r
- * RETURNS: Status\r
- */\r
-NTSTATUS ZwDeleteKey(HANDLE KeyHandle);\r
-\r
-/*\r
- * FUNCTION: Returns information about the subkeys of an open key\r
- * ARGUMENTS:\r
- *         KeyHandle = Handle of the key whose subkeys are to enumerated\r
- *         Index = zero based index of the subkey for which information is\r
- *                 request\r
- *         KeyInformationClass = Type of information returned\r
- *         KeyInformation (OUT) = Caller allocated buffer for the information\r
- *                                about the key\r
- *         Length = Length in bytes of the KeyInformation buffer\r
- *         ResultLength (OUT) = Caller allocated storage which holds\r
- *                              the number of bytes of information retrieved\r
- *                              on return\r
- * RETURNS: Status\r
- */\r
-NTSTATUS ZwEnumerateKey(HANDLE KeyHandle, ULONG Index, \r
-                       KEY_INFORMATION_CLASS KeyInformationClass,\r
-                       PVOID KeyInformation, ULONG Length, \r
-                       PULONG ResultLength);\r
-\r
-/*\r
- * FUNCTION: Returns information about the value entries of an open key\r
- * ARGUMENTS:\r
- *         KeyHandle = Handle of the key whose value entries are to enumerated\r
- *         Index = zero based index of the subkey for which information is\r
- *                 request\r
- *         KeyInformationClass = Type of information returned\r
- *         KeyInformation (OUT) = Caller allocated buffer for the information\r
- *                                about the key\r
- *         Length = Length in bytes of the KeyInformation buffer\r
- *         ResultLength (OUT) = Caller allocated storage which holds\r
- *                              the number of bytes of information retrieved\r
- *                              on return\r
- * RETURNS: Status\r
- */\r
-NTSTATUS ZwEnumerateValueKey(HANDLE KeyHandle, ULONG Index, \r
-                       KEY_VALUE_INFORMATION_CLASS KeyInformationClass,\r
-                       PVOID KeyInformation, ULONG Length, \r
-                       PULONG ResultLength);\r
-\r
-\r
-/*\r
- * FUNCTION: Forces a registry key to be committed to disk\r
- * ARGUMENTS:\r
- *        KeyHandle = Handle of the key to be written to disk\r
- * RETURNS: Status\r
- */\r
-NTSTATUS ZwFlushKey(HANDLE KeyHandle);\r
-\r
-/*\r
- * FUNCTION: Changes the attributes of an object to temporary\r
- * ARGUMENTS:\r
- *        Handle = Handle for the object\r
- * RETURNS: Status\r
- */\r
-NTSTATUS ZwMakeTemporaryObject(HANDLE Handle);\r
-\r
-/*\r
- * FUNCTION: Maps a view of a section into the virtual address space of a \r
- *           process\r
- * ARGUMENTS:\r
- *        SectionHandle = Handle of the section\r
- *        ProcessHandle = Handle of the process\r
- *        BaseAddress = Desired base address (or NULL) on entry\r
- *                      Actual base address of the view on exit\r
- *        ZeroBits = Number of high order address bits that must be zero\r
- *        CommitSize = Size in bytes of the initially committed section of \r
- *                     the view \r
- *        SectionOffset = Offset in bytes from the beginning of the section\r
- *                        to the beginning of the view\r
- *        ViewSize = Desired length of map (or zero to map all) on entry\r
- *                   Actual length mapped on exit\r
- *        InheritDisposition = Specified how the view is to be shared with\r
- *                            child processes\r
- *        AllocateType = Type of allocation for the pages\r
- *        Protect = Protection for the committed region of the view\r
- * RETURNS: Status\r
- */\r
-NTSTATUS ZwMapViewOfSection(HANDLE SectionHandle,\r
-                           HANDLE ProcessHandle,\r
-                           PVOID* BaseAddress,\r
-                           ULONG ZeroBits,\r
-                           ULONG CommitSize,\r
-                           PLARGE_INTEGER SectionOffset,\r
-                           PULONG ViewSize,\r
-                           SECTION_INHERIT InheritDisposition,\r
-                           ULONG AllocationType,\r
-                           ULONG Protect);\r
-\r
-/*\r
- * FUNCTION: Opens an existing key in the registry\r
- * ARGUMENTS:\r
- *        KeyHandle (OUT) = Caller supplied storage for the resulting handle\r
- *        DesiredAccess = Requested access to the key\r
- *        ObjectAttribute = Initialized attributes for the object\r
- * RETURNS: Status\r
- */\r
-NTSTATUS ZwOpenKey(PHANDLE KeyHandle, ACCESS_MASK DesiredAccess,\r
-                  POBJECT_ATTRIBUTES ObjectAttributes);\r
-\r
-/*\r
- * FUNCTION: Opens an existing section object\r
- * ARGUMENTS:\r
- *        KeyHandle (OUT) = Caller supplied storage for the resulting handle\r
- *        DesiredAccess = Requested access to the key\r
- *        ObjectAttribute = Initialized attributes for the object\r
- * RETURNS: Status\r
- */\r
-NTSTATUS ZwOpenSection(PHANDLE KeyHandle, ACCESS_MASK DesiredAccess,\r
-                      POBJECT_ATTRIBUTES ObjectAttributes);\r
-\r
-/*\r
- * FUNCTION: Returns information about an open file\r
- * ARGUMENTS:\r
- *        FileHandle = Handle of the file to be queried\r
- *        IoStatusBlock (OUT) = Caller supplied storage for the result\r
- *        FileInformation (OUT) = Caller supplied storage for the file\r
- *                                information\r
- *        Length = Length in bytes of the buffer for file information\r
- *        FileInformationClass = Type of information to be returned\r
- * RETURNS: Status\r
- */\r
-NTSTATUS ZwQueryInformationFile(HANDLE FileHandle,\r
-                               PIO_STATUS_BLOCK IoStatusBlock,\r
-                               PVOID FileInformation,\r
-                               ULONG Length,\r
-                               FILE_INFORMATION_CLASS FileInformationClass);\r
-\r
-#ifndef _NTNATIVE\r
-#define _NTNATIVE\r
-\r
-#ifdef __cplusplus\r
-extern "C" {\r
-#endif /* __cplusplus */\r
-\r
-#include <kernel32/heap.h>\r
-   \r
-#if KERNEL_SUPPORTS_OBJECT_ATTRIBUTES_CORRECTLY\r
-typedef struct _OBJECT_ATTRIBUTES {\r
-    ULONG Length;\r
-    HANDLE RootDirectory;\r
-    PUNICODE_STRING ObjectName;\r
-    ULONG Attributes;\r
-    SECURITY_DESCRIPTOR *SecurityDescriptor;       \r
-    SECURITY_QUALITY_OF_SERVICE *SecurityQualityOfService;  \r
-} OBJECT_ATTRIBUTES, *POBJECT_ATTRIBUTES;\r
-#endif\r
-   \r
-#if IOTYPES_DIDNT_DECLARE_THIS\r
-typedef struct _IO_STATUS_BLOCK {\r
-    NTSTATUS Status;\r
-    ULONG Information;\r
-} IO_STATUS_BLOCK, *PIO_STATUS_BLOCK;\r
-#endif\r
-\r
-\r
-//typedef LARGE_INTEGER *PLARGE_INTEGER;\r
-\r
-//\r
-\r
-#define NtCurrentProcess() ( (HANDLE) 0xFFFFFFFF )\r
-#define NtCurrentThread() ( (HANDLE) 0xFFFFFFFE )\r
-\r
-\r
-\r
-// event access mask\r
-\r
-#define EVENT_READ_ACCESS      0x0001\r
-#define EVENT_WRITE_ACCESS     0x0002\r
-\r
-\r
-//process query / set information class\r
-\r
-#define        ProcessBasicInformation                 0\r
-#define        ProcessQuotaLimits                      1\r
-#define        ProcessIoCounters                       2\r
-#define ProcessVmCounters                      3\r
-#define ProcessTimes                           4\r
-#define ProcessBasePriority                    5\r
-#define ProcessRaisePriority                   6\r
-#define ProcessDebugPort                       7\r
-#define ProcessExceptionPort                   8\r
-#define ProcessAccessToken                     9\r
-#define ProcessLdtInformation                  10\r
-#define ProcessLdtSize                         11\r
-#define ProcessDefaultHardErrorMode            12\r
-#define ProcessIoPortHandlers                  13\r
-#define ProcessPooledUsageAndLimits            14\r
-#define ProcessWorkingSetWatch                 15\r
-#define ProcessUserModeIOPL                    16\r
-#define ProcessEnableAlignmentFaultFixup       17\r
-#define ProcessPriorityClass                   18\r
-#define ProcessWx86Information                 19\r
-#define ProcessHandleCount                     20\r
-#define ProcessAffinityMask                    21\r
-#define MaxProcessInfoClass                    22\r
-\r
-// thread query / set information class\r
-\r
-#define ThreadBasicInformation                 0\r
-#define ThreadTimes                            1\r
-#define ThreadPriority                         2\r
-#define ThreadBasePriority                     3\r
-#define ThreadAffinityMask                     4\r
-#define ThreadImpersonationToken               5\r
-#define ThreadDescriptorTableEntry             6\r
-#define ThreadEnableAlignmentFaultFixup                7\r
-#define ThreadEventPair                                8\r
-#define ThreadQuerySetWin32StartAddress                9\r
-#define ThreadZeroTlsCell                      10\r
-#define ThreadPerformanceCount                 11\r
-#define ThreadAmILastThread                    12\r
-#define ThreadIdealProcessor                   13\r
-#define ThreadPriorityBoost                    14\r
-#define MaxThreadInfoClass                     15\r
-\r
-\r
-// key query information class\r
-\r
-#define KeyBasicInformation                    0\r
-#define KeyNodeInformation                     1\r
-#define KeyFullInformation                     2\r
-\r
-\r
-// key set information class\r
-\r
-#define KeyWriteTimeInformation                0\r
-\r
-// key value information class\r
-\r
-#define KeyValueBasicInformation               0\r
-#define        KeyValueFullInformation         1\r
-#define        KeyValuePartialInformation              2\r
-\r
-// object handle information\r
-\r
-#define        HandleBasicInformation                  4\r
-\r
-// system information\r
-\r
-#define SystemTimeAdjustmentInformation                28\r
-\r
-\r
-// file information\r
-\r
-\r
-#define FileDirectoryInformation               1\r
-#define FileFullDirectoryInformation           2\r
-#define FileBothDirectoryInformation           3\r
-#define FileBasicInformation                   4\r
-#define FileStandardInformation                        5\r
-#define FileInternalInformation                        6\r
-#define FileEaInformation                      7\r
-#define FileAccessInformation                  8\r
-#define FileNameInformation                    9\r
-#define FileRenameInformation                  10\r
-#define FileLinkInformation                    11\r
-#define FileNamesInformation                   12\r
-#define FileDispositionInformation             13\r
-#define FilePositionInformation                        14\r
-#define FileFullEaInformation                  15\r
-#define FileModeInformation                    16\r
-#define FileAlignmentInformation               17\r
-#define FileAllInformation                     18\r
-#define FileAllocationInformation              19\r
-#define FileEndOfFileInformation               20\r
-#define FileAlternateNameInformation           21\r
-#define FileStreamInformation                  22\r
-#define FilePipeInformation                    23\r
-#define FilePipeLocalInformation               24\r
-#define FilePipeRemoteInformation              25\r
-#define FileMailslotQueryInformation           26\r
-#define FileMailslotSetInformation             27\r
-#define FileCompressionInformation             28\r
-#define FileCopyOnWriteInformation             29\r
-#define FileCompletionInformation              30\r
-#define FileMoveClusterInformation             31\r
-#define FileOleClassIdInformation              32\r
-#define FileOleStateBitsInformation            33\r
-#define FileNetworkOpenInformation             34\r
-#define FileObjectIdInformation                        35\r
-#define FileOleAllInformation                  36\r
-#define FileOleDirectoryInformation            37\r
-#define FileContentIndexInformation            38\r
-#define FileInheritContentIndexInformation     39\r
-#define FileOleInformation                     40\r
-#define FileMaximumInformation                 41\r
-\r
-\r
-\r
-//file system information class values\r
-\r
-\r
-\r
-#define FileFsVolumeInformation                1\r
-#define FileFsLabelInformation                 2\r
-#define FileFsSizeInformation                  3\r
-#define FileFsDeviceInformation                        4\r
-#define FileFsAttributeInformation             5\r
-#define FileFsControlInformation               6\r
-#define FileFsQuotaQueryInformation            7\r
-#define FileFsQuotaSetInformation              8\r
-#define FileFsMaximumInformation               9\r
-\r
-// wait type\r
-\r
-#define WaitAll                                        0\r
-#define WaitAny                                        1\r
\r
\r
-// key restore flags\r
-\r
-#define REG_WHOLE_HIVE_VOLATILE     (0x00000001L)   \r
-#define REG_REFRESH_HIVE            (0x00000002L)   \r
-\r
-\r
-#define OBJ_NAME_PATH_SEPARATOR ((WCHAR)L'\\')\r
-\r
-// object type  access rights\r
-\r
-#define OBJECT_TYPE_CREATE (0x0001)\r
-#define OBJECT_TYPE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1)\r
-\r
-\r
-// directory access rights\r
-\r
-#define DIRECTORY_QUERY                 (0x0001)\r
-#define DIRECTORY_TRAVERSE              (0x0002)\r
-#define DIRECTORY_CREATE_OBJECT         (0x0004)\r
-#define DIRECTORY_CREATE_SUBDIRECTORY   (0x0008)\r
-\r
-#define DIRECTORY_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0xF)\r
-\r
-// symbolic link access rights\r
-\r
-#define SYMBOLIC_LINK_QUERY (0x0001)\r
-#define SYMBOLIC_LINK_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1)\r
-   \r
-typedef struct _PROCESS_WS_WATCH_INFORMATION {\r
-    PVOID FaultingPc;\r
-    PVOID FaultingVa;\r
-} PROCESS_WS_WATCH_INFORMATION, *PPROCESS_WS_WATCH_INFORMATION;\r
-\r
-typedef struct _PROCESS_BASIC_INFORMATION {\r
-    NTSTATUS ExitStatus;\r
-    PPEB PebBaseAddress;\r
-    KAFFINITY AffinityMask;\r
-    KPRIORITY BasePriority;\r
-    ULONG UniqueProcessId;\r
-    ULONG InheritedFromUniqueProcessId;\r
-} PROCESS_BASIC_INFORMATION, *PPROCESS_BASIC_INFORMATION;\r
-\r
-typedef struct _QUOTA_LIMITS {\r
-    ULONG PagedPoolLimit;\r
-    ULONG NonPagedPoolLimit;\r
-    ULONG MinimumWorkingSetSize;\r
-    ULONG MaximumWorkingSetSize;\r
-    ULONG PagefileLimit;\r
-    LARGE_INTEGER TimeLimit;\r
-} QUOTA_LIMITS, *PQUOTA_LIMITS;\r
-\r
-typedef struct _IO_COUNTERS {\r
-    ULONG ReadOperationCount;\r
-    ULONG WriteOperationCount;\r
-    ULONG OtherOperationCount;\r
-    LARGE_INTEGER ReadTransferCount;\r
-    LARGE_INTEGER WriteTransferCount;\r
-    LARGE_INTEGER OtherTransferCount;\r
-} IO_COUNTERS, *PIO_COUNTERS;\r
-\r
-\r
-typedef struct _VM_COUNTERS {\r
-    ULONG PeakVirtualSize;\r
-    ULONG VirtualSize;\r
-    ULONG PageFaultCount;\r
-    ULONG PeakWorkingSetSize;\r
-    ULONG WorkingSetSize;\r
-    ULONG QuotaPeakPagedPoolUsage;\r
-    ULONG QuotaPagedPoolUsage;\r
-    ULONG QuotaPeakNonPagedPoolUsage;\r
-    ULONG QuotaNonPagedPoolUsage;\r
-    ULONG PagefileUsage;\r
-    ULONG PeakPagefileUsage;\r
-} VM_COUNTERS, *PVM_COUNTERS;\r
-\r
-\r
-typedef struct _POOLED_USAGE_AND_LIMITS {\r
-    ULONG PeakPagedPoolUsage;\r
-    ULONG PagedPoolUsage;\r
-    ULONG PagedPoolLimit;\r
-    ULONG PeakNonPagedPoolUsage;\r
-    ULONG NonPagedPoolUsage;\r
-    ULONG NonPagedPoolLimit;\r
-    ULONG PeakPagefileUsage;\r
-    ULONG PagefileUsage;\r
-    ULONG PagefileLimit;\r
-} POOLED_USAGE_AND_LIMITS, *PPOOLED_USAGE_AND_LIMITS;\r
-\r
-\r
-typedef struct _PROCESS_ACCESS_TOKEN {\r
-    HANDLE Token;\r
-    HANDLE Thread;\r
-\r
-} PROCESS_ACCESS_TOKEN, *PPROCESS_ACCESS_TOKEN;\r
-\r
-typedef struct _KERNEL_USER_TIMES {\r
-    LARGE_INTEGER CreateTime;\r
-    LARGE_INTEGER ExitTime;\r
-    LARGE_INTEGER KernelTime;\r
-    LARGE_INTEGER UserTime;\r
-} KERNEL_USER_TIMES;\r
-typedef KERNEL_USER_TIMES *PKERNEL_USER_TIMES;\r
-\r
-// exception structures\r
-\r
-\r
-#define TEB_EXCEPTION_FRAME(pcontext) ((PEXCEPTION_FRAME)((TEB *)GET_SEL_BASE((pcontext)->SegFs))->except)\r
-\r
-   \r
-typedef struct _OBJECT_NAME_INFORMATION {               \r
-    UNICODE_STRING Name;                                \r
-} OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION;   \r
-\r
-\r
-// section information \r
-\r
-\r
-// handle information \r
-\r
-//#define HANDLE_FLAG_INHERIT             0x00000001 \r
-//#define HANDLE_FLAG_PROTECT_FROM_CLOSE  0x00000002 \r
-\r
-\r
-typedef struct _HANDLE_INFO \r
-{\r
-       BOOL bInheritHanlde;\r
-       BOOL bProtectFromClose;\r
-} HANDLE_INFO;\r
-typedef HANDLE_INFO *PHANDLE_INFO;\r
-\r
-\r
-\r
-typedef struct _SYSTEM_TIME_ADJUSTMENT\r
-{\r
-       DWORD dwTimeAdjustment; \r
-       BOOL bTimeAdjustmentDisabled;\r
-} SYSTEM_TIME_ADJUSTMENT, *PSYSTEM_TIME_ADJUSTMENT;\r
-       \r
-\r
-// file information\r
-\r
-// asynchorneous procedure call \r
-\r
-\r
-typedef struct _FILE_BASIC_INFORMATION {                    \r
-    LARGE_INTEGER CreationTime;                             \r
-    LARGE_INTEGER LastAccessTime;                           \r
-    LARGE_INTEGER LastWriteTime;                            \r
-    LARGE_INTEGER ChangeTime;                               \r
-    ULONG FileAttributes;                                   \r
-} FILE_BASIC_INFORMATION, *PFILE_BASIC_INFORMATION;         \r
-                                                            \r
-typedef struct _FILE_STANDARD_INFORMATION {                 \r
-    LARGE_INTEGER AllocationSize;                           \r
-    LARGE_INTEGER EndOfFile;                                \r
-    ULONG NumberOfLinks;                                    \r
-    BOOLEAN DeletePending;                                  \r
-    BOOLEAN Directory;                                      \r
-} FILE_STANDARD_INFORMATION, *PFILE_STANDARD_INFORMATION;   \r
-                                                            \r
-typedef struct _FILE_POSITION_INFORMATION {                 \r
-    LARGE_INTEGER CurrentByteOffset;                        \r
-} FILE_POSITION_INFORMATION, *PFILE_POSITION_INFORMATION;   \r
-                                                            \r
-typedef struct _FILE_ALIGNMENT_INFORMATION {                \r
-    ULONG AlignmentRequirement;                             \r
-} FILE_ALIGNMENT_INFORMATION, *PFILE_ALIGNMENT_INFORMATION; \r
-                                                            \r
-typedef struct _FILE_DISPOSITION_INFORMATION {                  \r
-    BOOLEAN DeleteFile;                                         \r
-} FILE_DISPOSITION_INFORMATION, *PFILE_DISPOSITION_INFORMATION; \r
-                                                                \r
-typedef struct _FILE_END_OF_FILE_INFORMATION {                  \r
-    LARGE_INTEGER EndOfFile;                                    \r
-} FILE_END_OF_FILE_INFORMATION, *PFILE_END_OF_FILE_INFORMATION; \r
-                                                                \r
-\r
-typedef struct _FILE_FULL_EA_INFORMATION {\r
-    ULONG NextEntryOffset;\r
-    UCHAR Flags;\r
-    UCHAR EaNameLength;\r
-    USHORT EaValueLength;\r
-    CHAR EaName[1];\r
-} FILE_FULL_EA_INFORMATION;\r
-typedef FILE_FULL_EA_INFORMATION *PFILE_FULL_EA_INFORMATION; \r
-\r
-\r
-\r
-// file system information structures\r
-\r
-typedef struct _FILE_FS_DEVICE_INFORMATION {                    \r
-    DEVICE_TYPE DeviceType;                                     \r
-    ULONG Characteristics;                                      \r
-} FILE_FS_DEVICE_INFORMATION;\r
-typedef FILE_FS_DEVICE_INFORMATION *PFILE_FS_DEVICE_INFORMATION;   \r
-\r
-\r
-// timer apc routine [ possible incompatible with ms winnt ]\r
-\r
-typedef\r
-VOID\r
-(*PTIMERAPCROUTINE) (\r
-    PVOID Argument,\r
-    PVOID Context\r
-    );\r
-\r
-// shutdown action [ possible incompatible with ms winnt ]\r
-// this might be parameter to specify how to shutdown\r
-typedef\r
-VOID\r
-(*SHUTDOWN_ACTION) (\r
-    VOID\r
-    );\r
-\r
- //NtAcceptConnectPort\r
- //NtAccessCheck\r
- //NtAccessCheckAndAuditAlarm\r
-\r
-NTSTATUS\r
-STDCALL\r
-NtAddAtom(\r
-       IN PUNICODE_STRING pString\r
-       );\r
\r
- //NtAdjustGroupsToken\r
- //NtAdjustPrivilegesToken\r
- //NtAlertResumeThread\r
- //NtAlertThread\r
- //NtAllocateLocallyUniqueId\r
- //NtAllocateUuids\r
-\r
-\r
-NTSTATUS\r
-STDCALL\r
-NtAllocateVirtualMemory( \r
-       IN HANDLE hProcess,\r
-       OUT LPVOID  lpAddress,\r
-       IN ULONG uWillThingAbThis,\r
-       IN DWORD dwSize,\r
-       IN DWORD  flAllocationType, \r
-       IN DWORD  flProtect\r
-       );\r
-\r
-// NtCallbackReturn\r
-// NtCancelIoFile\r
-\r
-NTSTATUS\r
-STDCALL\r
-NtCancelTimer(\r
-       IN HANDLE TimerHandle,\r
-       IN BOOL Resume\r
-       );\r
-\r
-NTSTATUS\r
-STDCALL\r
-NtClearEvent( \r
-       IN HANDLE  EventHandle \r
-       );\r
-\r
-\r
-NTSTATUS\r
-STDCALL\r
-NtClose(\r
-       IN HANDLE Handle\r
-       );\r
-\r
-// NtCloseObjectAuditAlarm\r
-// NtCompleteConnectPort\r
-// NtConnectPort\r
-\r
-NTSTATUS\r
-STDCALL\r
-NtContinue(\r
-       IN PCONTEXT Context\r
-       );\r
-\r
-//NtCreateChannel\r
-\r
-\r
-NTSTATUS\r
-STDCALL\r
-NtCreateDirectoryObject(\r
-       OUT PHANDLE DirectoryHandle,\r
-       IN ACCESS_MASK DesiredAccess,\r
-       IN POBJECT_ATTRIBUTES ObjectAttributes\r
-       );\r
-\r
-NTSTATUS\r
-STDCALL\r
-NtCreateEvent(\r
-       OUT PHANDLE FileHandle,\r
-       IN ACCESS_MASK DesiredAccess,\r
-       IN POBJECT_ATTRIBUTES ObjectAttributes,\r
-       IN BOOL ManualReset,\r
-       IN BOOL InitialState\r
-       );\r
-//NtCreateEventPair\r
-\r
-                                        \r
-NTSTATUS                                        \r
-STDCALL                                           \r
-NtCreateFile(                                   \r
-       OUT PHANDLE FileHandle,                     \r
-       IN ACCESS_MASK DesiredAccess,               \r
-       IN POBJECT_ATTRIBUTES ObjectAttributes,     \r
-       OUT PIO_STATUS_BLOCK IoStatusBlock,         \r
-       IN PLARGE_INTEGER AllocationSize OPTIONAL,  \r
-       IN ULONG FileAttributes,                    \r
-       IN ULONG ShareAccess,                       \r
-       IN ULONG CreateDisposition,                 \r
-       IN ULONG CreateOptions,                     \r
-       IN PVOID EaBuffer OPTIONAL,                 \r
-       IN ULONG EaLength                           \r
-       );                                          \r
-\r
-// NtCreateIoCompletion\r
-\r
-NTSTATUS\r
-STDCALL\r
-NtCreateKey(\r
-       OUT PHANDLE KeyHandle,\r
-       IN ACCESS_MASK DesiredAccess,\r
-       IN POBJECT_ATTRIBUTES ObjectAttributes,\r
-       IN ULONG TitleIndex,\r
-       IN PUNICODE_STRING Class OPTIONAL,\r
-       IN ULONG CreateOptions,\r
-       IN PULONG Disposition OPTIONAL\r
-       );\r
-// NtCreateMailslotFile\r
-//-- NtCreateMutant\r
-//-- NtCreateNamedPipeFile\r
-//-- NtCreatePagingFile\r
-//-- NtCreatePort\r
\r
-NTSTATUS \r
-STDCALL \r
-NtCreateProcess(\r
-       OUT PHANDLE ProcessHandle,\r
-        IN ACCESS_MASK DesiredAccess,\r
-        IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,\r
-        IN HANDLE ParentProcess,\r
-        IN BOOLEAN InheritObjectTable,\r
-        IN HANDLE SectionHandle OPTIONAL,\r
-        IN HANDLE DebugPort OPTIONAL,\r
-        IN HANDLE ExceptionPort OPTIONAL\r
-       );\r
-// NtCreateProfile\r
-\r
-NTSTATUS\r
-STDCALL\r
-NtCreateSection( \r
-       OUT PHANDLE SectionHandle, \r
-       IN ACCESS_MASK DesiredAccess,\r
-       IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,  \r
-       IN PLARGE_INTEGER MaximumSize OPTIONAL,  \r
-       IN ULONG SectionPageProtection OPTIONAL,\r
-       IN ULONG AllocationAttributes,\r
-       IN HANDLE FileHandle OPTIONAL\r
-       );\r
-\r
-NTSTATUS\r
-STDCALL\r
-NtCreateSemaphore(\r
-       OUT PHANDLE SemaphoreHandle,\r
-       IN ACCESS_MASK DesiredAccess,\r
-       IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,\r
-       IN ULONG InitialCount,\r
-       IN ULONG MaximumCount\r
-       );\r
-// NtCreateSymbolicLinkObject\r
-\r
-NTSTATUS\r
-STDCALL \r
-NtCreateThread(\r
-       OUT PHANDLE ThreadHandle,\r
-       IN ACCESS_MASK DesiredAccess,\r
-       IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,\r
-       IN HANDLE ProcessHandle,\r
-       IN PCLIENT_ID ClientId,\r
-       IN PCONTEXT ThreadContext,\r
-       IN PINITIAL_TEB InitialTeb,\r
-       IN BOOLEAN CreateSuspended\r
-       );\r
-\r
-NTSTATUS\r
-STDCALL \r
-NtCreateTimer(\r
-       OUT PHANDLE TimerHandle,\r
-       IN ACCESS_MASK DesiredAccess,\r
-       IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,\r
-       IN LONG ManualReset \r
-       );\r
-//-- NtCreateToken\r
-\r
-NT_TEB\r
-STDCALL \r
-NtCurrentTeb(\r
-       VOID\r
-       );\r
-\r
-NTSTATUS\r
-STDCALL\r
-NtDelayExecution(\r
-       IN BOOL Alertable,\r
-       IN PLARGE_INTEGER Interval\r
-       );\r
-\r
-\r
-NTSTATUS\r
-STDCALL\r
-NtDeleteAtom(\r
-       IN ATOM Atom\r
-       );\r
-\r
-