Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--winsup/CYGWIN_LICENSE46
-rw-r--r--winsup/ChangeLog36
-rw-r--r--winsup/MAINTAINERS17
-rw-r--r--winsup/Makefile.common127
-rw-r--r--winsup/Makefile.in71
-rwxr-xr-xwinsup/configure1223
-rwxr-xr-xwinsup/configure.in65
-rw-r--r--winsup/cygwin/CYGWIN_LICENSE46
-rw-r--r--winsup/cygwin/ChangeLog229
-rw-r--r--winsup/cygwin/ChangeLog-1995177
-rw-r--r--winsup/cygwin/ChangeLog-19962031
-rw-r--r--winsup/cygwin/ChangeLog-19972800
-rw-r--r--winsup/cygwin/ChangeLog-19984490
-rw-r--r--winsup/cygwin/ChangeLog-19993552
-rw-r--r--winsup/cygwin/Makefile.in341
-rw-r--r--winsup/cygwin/ROADMAP129
-rw-r--r--winsup/cygwin/acconfig.h15
-rw-r--r--winsup/cygwin/ansi.sgml59
-rw-r--r--winsup/cygwin/assert.cc50
-rw-r--r--winsup/cygwin/config.h.in38
-rw-r--r--winsup/cygwin/config/i386/longjmp.c51
-rw-r--r--winsup/cygwin/config/i386/makefrag17
-rw-r--r--winsup/cygwin/config/i386/profile.h58
-rw-r--r--winsup/cygwin/config/i386/setjmp.c48
-rwxr-xr-xwinsup/cygwin/configure2335
-rw-r--r--winsup/cygwin/configure.in229
-rw-r--r--winsup/cygwin/cygwin.din1051
-rw-r--r--winsup/cygwin/dcrt0.cc1063
-rw-r--r--winsup/cygwin/debug.cc326
-rw-r--r--winsup/cygwin/debug.h69
-rw-r--r--winsup/cygwin/delqueue.cc99
-rw-r--r--winsup/cygwin/dir.cc340
-rw-r--r--winsup/cygwin/dlfcn.cc236
-rw-r--r--winsup/cygwin/dll_init.cc499
-rw-r--r--winsup/cygwin/dll_init.h102
-rw-r--r--winsup/cygwin/dll_init.sgml11
-rw-r--r--winsup/cygwin/dtable.cc603
-rw-r--r--winsup/cygwin/dtable.sgml20
-rw-r--r--winsup/cygwin/environ.cc567
-rw-r--r--winsup/cygwin/errno.cc669
-rw-r--r--winsup/cygwin/exceptions.cc1066
-rw-r--r--winsup/cygwin/exec.cc204
-rw-r--r--winsup/cygwin/external.cc107
-rw-r--r--winsup/cygwin/external.sgml16
-rw-r--r--winsup/cygwin/fcntl.cc106
-rw-r--r--winsup/cygwin/fhandler.cc1501
-rw-r--r--winsup/cygwin/fhandler.h804
-rw-r--r--winsup/cygwin/fhandler_console.cc1387
-rw-r--r--winsup/cygwin/fhandler_floppy.cc90
-rw-r--r--winsup/cygwin/fhandler_raw.cc495
-rw-r--r--winsup/cygwin/fhandler_serial.cc883
-rw-r--r--winsup/cygwin/fhandler_tape.cc829
-rw-r--r--winsup/cygwin/fhandler_termios.cc293
-rw-r--r--winsup/cygwin/fhandler_tty.cc1070
-rw-r--r--winsup/cygwin/fhandler_windows.cc145
-rw-r--r--winsup/cygwin/fhandler_zero.cc58
-rw-r--r--winsup/cygwin/fork.cc625
-rw-r--r--winsup/cygwin/gcrt0.c41
-rw-r--r--winsup/cygwin/glob.c871
-rw-r--r--winsup/cygwin/gmon.c277
-rw-r--r--winsup/cygwin/gmon.h166
-rw-r--r--winsup/cygwin/grp.cc283
-rw-r--r--winsup/cygwin/heap.cc140
-rw-r--r--winsup/cygwin/include/a.out.h421
-rw-r--r--winsup/cygwin/include/arpa/ftp.h109
-rw-r--r--winsup/cygwin/include/arpa/inet.h25
-rw-r--r--winsup/cygwin/include/arpa/telnet.h322
-rw-r--r--winsup/cygwin/include/asm/byteorder.h93
-rw-r--r--winsup/cygwin/include/asm/socket.h58
-rw-r--r--winsup/cygwin/include/asm/types.h13
-rw-r--r--winsup/cygwin/include/cygwin/acl.h81
-rw-r--r--winsup/cygwin/include/cygwin/cygwin_dll.h96
-rw-r--r--winsup/cygwin/include/cygwin/icmp.h1
-rw-r--r--winsup/cygwin/include/cygwin/if.h74
-rw-r--r--winsup/cygwin/include/cygwin/in.h188
-rw-r--r--winsup/cygwin/include/cygwin/mtio.h190
-rw-r--r--winsup/cygwin/include/cygwin/rdevio.h30
-rw-r--r--winsup/cygwin/include/cygwin/socket.h152
-rw-r--r--winsup/cygwin/include/cygwin/sockios.h1
-rw-r--r--winsup/cygwin/include/cygwin/types.h1
-rw-r--r--winsup/cygwin/include/cygwin/uio.h1
-rw-r--r--winsup/cygwin/include/cygwin/version.h159
-rw-r--r--winsup/cygwin/include/dlfcn.h41
-rw-r--r--winsup/cygwin/include/exceptions.h120
-rw-r--r--winsup/cygwin/include/fcntl.h7
-rw-r--r--winsup/cygwin/include/features.h1
-rw-r--r--winsup/cygwin/include/getopt.h66
-rw-r--r--winsup/cygwin/include/glob.h111
-rw-r--r--winsup/cygwin/include/icmp.h1
-rw-r--r--winsup/cygwin/include/io.h28
-rw-r--r--winsup/cygwin/include/lastlog.h12
-rw-r--r--winsup/cygwin/include/limits.h144
-rw-r--r--winsup/cygwin/include/mapi.h102
-rw-r--r--winsup/cygwin/include/memory.h7
-rw-r--r--winsup/cygwin/include/mntent.h35
-rw-r--r--winsup/cygwin/include/net/if.h6
-rw-r--r--winsup/cygwin/include/netdb.h167
-rw-r--r--winsup/cygwin/include/netinet/in.h6
-rw-r--r--winsup/cygwin/include/netinet/ip.h6
-rw-r--r--winsup/cygwin/include/netinet/ip_icmp.h6
-rw-r--r--winsup/cygwin/include/paths.h9
-rw-r--r--winsup/cygwin/include/pthread.h92
-rw-r--r--winsup/cygwin/include/strings.h6
-rw-r--r--winsup/cygwin/include/sys/acl.h17
-rw-r--r--winsup/cygwin/include/sys/cdefs.h12
-rw-r--r--winsup/cygwin/include/sys/copying.dj41
-rw-r--r--winsup/cygwin/include/sys/cygwin.h44
-rw-r--r--winsup/cygwin/include/sys/file.h31
-rw-r--r--winsup/cygwin/include/sys/ioctl.h20
-rw-r--r--winsup/cygwin/include/sys/mman.h40
-rw-r--r--winsup/cygwin/include/sys/mount.h25
-rw-r--r--winsup/cygwin/include/sys/mtio.h11
-rw-r--r--winsup/cygwin/include/sys/resource.h40
-rw-r--r--winsup/cygwin/include/sys/select.h35
-rw-r--r--winsup/cygwin/include/sys/smallprint.h17
-rw-r--r--winsup/cygwin/include/sys/socket.h38
-rw-r--r--winsup/cygwin/include/sys/strace.h96
-rw-r--r--winsup/cygwin/include/sys/syslog.h73
-rw-r--r--winsup/cygwin/include/sys/sysmacros.h8
-rw-r--r--winsup/cygwin/include/sys/termio.h2
-rw-r--r--winsup/cygwin/include/sys/termios.h295
-rw-r--r--winsup/cygwin/include/sys/ttychars.h1
-rw-r--r--winsup/cygwin/include/sys/uio.h25
-rw-r--r--winsup/cygwin/include/sys/un.h16
-rw-r--r--winsup/cygwin/include/sys/utsname.h23
-rw-r--r--winsup/cygwin/include/sys/vfs.h28
-rw-r--r--winsup/cygwin/include/sys/wait.h63
-rw-r--r--winsup/cygwin/include/syslog.h6
-rw-r--r--winsup/cygwin/include/termio.h6
-rw-r--r--winsup/cygwin/include/tzfile.h10
-rw-r--r--winsup/cygwin/init.cc58
-rw-r--r--winsup/cygwin/ioctl.cc44
-rw-r--r--winsup/cygwin/malloc_wrapper.cc221
-rw-r--r--winsup/cygwin/mcount.c174
-rw-r--r--winsup/cygwin/misc-std.sgml73
-rwxr-xr-xwinsup/cygwin/mkvers.sh165
-rw-r--r--winsup/cygwin/mmap.cc474
-rw-r--r--winsup/cygwin/net.cc1827
-rw-r--r--winsup/cygwin/ntea.cc335
-rw-r--r--winsup/cygwin/passwd.cc275
-rw-r--r--winsup/cygwin/path.cc2836
-rw-r--r--winsup/cygwin/path.h98
-rw-r--r--winsup/cygwin/path.sgml205
-rw-r--r--winsup/cygwin/pinfo.cc413
-rw-r--r--winsup/cygwin/pipe.cc93
-rw-r--r--winsup/cygwin/posix.sgml88
-rw-r--r--winsup/cygwin/profil.c173
-rw-r--r--winsup/cygwin/profil.h44
-rw-r--r--winsup/cygwin/pthread.cc203
-rw-r--r--winsup/cygwin/regexp/COPYRIGHT22
-rw-r--r--winsup/cygwin/regexp/README84
-rw-r--r--winsup/cygwin/regexp/regexp.h24
-rw-r--r--winsup/cygwin/regexp/regmagic.h7
-rw-r--r--winsup/cygwin/registry.cc176
-rw-r--r--winsup/cygwin/resource.cc94
-rw-r--r--winsup/cygwin/scandir.cc101
-rw-r--r--winsup/cygwin/security.cc2084
-rw-r--r--winsup/cygwin/select.cc1380
-rw-r--r--winsup/cygwin/select.h56
-rw-r--r--winsup/cygwin/shared.cc287
-rw-r--r--winsup/cygwin/shared.sgml17
-rw-r--r--winsup/cygwin/signal.cc367
-rw-r--r--winsup/cygwin/sigproc.cc1345
-rw-r--r--winsup/cygwin/sigproc.h66
-rw-r--r--winsup/cygwin/smallprint.c229
-rw-r--r--winsup/cygwin/spawn.cc980
-rw-r--r--winsup/cygwin/strace.cc409
-rw-r--r--winsup/cygwin/strsep.cc65
-rw-r--r--winsup/cygwin/sync.cc112
-rw-r--r--winsup/cygwin/sync.h48
-rw-r--r--winsup/cygwin/syscalls.cc1939
-rw-r--r--winsup/cygwin/sysconf.cc62
-rw-r--r--winsup/cygwin/syslog.cc395
-rw-r--r--winsup/cygwin/termios.cc274
-rw-r--r--winsup/cygwin/thread.cc1001
-rw-r--r--winsup/cygwin/thread.h312
-rw-r--r--winsup/cygwin/times.cc540
-rw-r--r--winsup/cygwin/tty.cc417
-rw-r--r--winsup/cygwin/tz_posixrules.h48
-rw-r--r--winsup/cygwin/uinfo.cc200
-rw-r--r--winsup/cygwin/uname.cc110
-rw-r--r--winsup/cygwin/wait.cc113
-rw-r--r--winsup/cygwin/window.cc231
-rw-r--r--winsup/cygwin/winsup.h595
-rw-r--r--winsup/cygwin/winver.rc53
-rw-r--r--winsup/doc/Makefile.in91
-rw-r--r--winsup/doc/calls.texinfo686
-rw-r--r--winsup/doc/changes.texinfo202
-rwxr-xr-xwinsup/doc/configure1078
-rw-r--r--winsup/doc/configure.in54
-rw-r--r--winsup/doc/copy.texinfo382
-rw-r--r--winsup/doc/cygwin-api.in.sgml68
-rw-r--r--winsup/doc/cygwin-ug-net.in.sgml64
-rw-r--r--winsup/doc/cygwin-ug.in.sgml63
-rw-r--r--winsup/doc/cygwinenv.sgml91
-rw-r--r--winsup/doc/dll.sgml120
-rw-r--r--winsup/doc/doctool.c622
-rw-r--r--winsup/doc/doctool.txt146
-rw-r--r--winsup/doc/faq.texinfo13
-rw-r--r--winsup/doc/fhandler-tut.txt83
-rw-r--r--winsup/doc/filemodes.sgml34
-rw-r--r--winsup/doc/gcc.sgml78
-rw-r--r--winsup/doc/gdb.sgml88
-rw-r--r--winsup/doc/history.texinfo667
-rw-r--r--winsup/doc/how.texinfo1140
-rw-r--r--winsup/doc/install.texinfo166
-rw-r--r--winsup/doc/legal.sgml32
-rw-r--r--winsup/doc/ntsec.sgml316
-rw-r--r--winsup/doc/overview.sgml87
-rw-r--r--winsup/doc/overview2.sgml307
-rw-r--r--winsup/doc/pathnames.sgml272
-rw-r--r--winsup/doc/programming.sgml11
-rw-r--r--winsup/doc/readme.texinfo12
-rw-r--r--winsup/doc/relnotes.texinfo15
-rw-r--r--winsup/doc/setup-net.sgml131
-rw-r--r--winsup/doc/setup.sgml42
-rw-r--r--winsup/doc/setup2.sgml279
-rw-r--r--winsup/doc/textbinary.sgml181
-rw-r--r--winsup/doc/using.sgml19
-rw-r--r--winsup/doc/what.texinfo85
-rw-r--r--winsup/doc/who.texinfo71
-rw-r--r--winsup/doc/windres.sgml167
-rw-r--r--winsup/mingw/CRT_noglob.c17
-rw-r--r--winsup/mingw/CRTfmode.c20
-rw-r--r--winsup/mingw/CRTglob.c18
-rw-r--r--winsup/mingw/CRTinit.c32
-rw-r--r--winsup/mingw/ChangeLog430
-rw-r--r--winsup/mingw/Makefile.in265
-rwxr-xr-xwinsup/mingw/configure2169
-rw-r--r--winsup/mingw/configure.in143
-rw-r--r--winsup/mingw/crt1.c234
-rw-r--r--winsup/mingw/crtdll.def704
-rw-r--r--winsup/mingw/crtmt.c14
-rw-r--r--winsup/mingw/crtst.c12
-rw-r--r--winsup/mingw/ctype_old.c52
-rw-r--r--winsup/mingw/dllcrt1.c89
-rw-r--r--winsup/mingw/dllmain.c33
-rw-r--r--winsup/mingw/gccmain.c85
-rw-r--r--winsup/mingw/include/_mingw.h68
-rw-r--r--winsup/mingw/include/assert.h71
-rw-r--r--winsup/mingw/include/conio.h74
-rw-r--r--winsup/mingw/include/ctype.h153
-rw-r--r--winsup/mingw/include/dir.h26
-rw-r--r--winsup/mingw/include/direct.h96
-rw-r--r--winsup/mingw/include/dirent.h96
-rw-r--r--winsup/mingw/include/dos.h123
-rw-r--r--winsup/mingw/include/errno.h117
-rw-r--r--winsup/mingw/include/excpt.h123
-rw-r--r--winsup/mingw/include/fcntl.h135
-rw-r--r--winsup/mingw/include/float.h219
-rw-r--r--winsup/mingw/include/io.h258
-rw-r--r--winsup/mingw/include/limits.h110
-rw-r--r--winsup/mingw/include/locale.h91
-rw-r--r--winsup/mingw/include/malloc.h78
-rw-r--r--winsup/mingw/include/math.h182
-rw-r--r--winsup/mingw/include/mem.h8
-rw-r--r--winsup/mingw/include/memory.h9
-rw-r--r--winsup/mingw/include/process.h158
-rw-r--r--winsup/mingw/include/setjmp.h72
-rw-r--r--winsup/mingw/include/share.h44
-rw-r--r--winsup/mingw/include/signal.h111
-rw-r--r--winsup/mingw/include/stdarg.h109
-rw-r--r--winsup/mingw/include/stddef.h373
-rw-r--r--winsup/mingw/include/stdio.h373
-rw-r--r--winsup/mingw/include/stdlib.h386
-rw-r--r--winsup/mingw/include/string.h197
-rw-r--r--winsup/mingw/include/sys/fcntl.h8
-rw-r--r--winsup/mingw/include/sys/file.h9
-rw-r--r--winsup/mingw/include/sys/locking.h52
-rw-r--r--winsup/mingw/include/sys/stat.h175
-rw-r--r--winsup/mingw/include/sys/time.h3
-rw-r--r--winsup/mingw/include/sys/timeb.h82
-rw-r--r--winsup/mingw/include/sys/types.h118
-rw-r--r--winsup/mingw/include/sys/unistd.h9
-rw-r--r--winsup/mingw/include/sys/utime.h89
-rw-r--r--winsup/mingw/include/tchar.h261
-rw-r--r--winsup/mingw/include/time.h219
-rw-r--r--winsup/mingw/include/unistd.h10
-rw-r--r--winsup/mingw/include/values.h4
-rw-r--r--winsup/mingw/include/varargs.h98
-rw-r--r--winsup/mingw/include/wchar.h212
-rw-r--r--winsup/mingw/include/wctype.h99
-rw-r--r--winsup/mingw/init.c84
-rw-r--r--winsup/mingw/jamfile72
-rw-r--r--winsup/mingw/main.c96
-rw-r--r--winsup/mingw/moldname-crtdll.def135
-rw-r--r--winsup/mingw/moldname-msvcrt.def139
-rw-r--r--winsup/mingw/moldname.def137
-rw-r--r--winsup/mingw/moldname.def.in139
-rw-r--r--winsup/mingw/msvcrt.def737
-rw-r--r--winsup/mingw/msvcrt20.def719
-rw-r--r--winsup/mingw/msvcrt40.def676
-rw-r--r--winsup/mingw/mthr.c206
-rw-r--r--winsup/mingw/mthr_init.c76
-rw-r--r--winsup/mingw/mthr_stub.c37
-rw-r--r--winsup/mingw/profile/Makefile.in119
-rwxr-xr-xwinsup/mingw/profile/configure1037
-rw-r--r--winsup/mingw/profile/configure.in77
-rw-r--r--winsup/mingw/profile/gcrt0.c52
-rw-r--r--winsup/mingw/profile/gmon.c284
-rw-r--r--winsup/mingw/profile/gmon.h178
-rw-r--r--winsup/mingw/profile/mcount.c180
-rw-r--r--winsup/mingw/profile/profil.c185
-rw-r--r--winsup/mingw/profile/profil.h49
-rw-r--r--winsup/mingw/profile/profile.h63
-rw-r--r--winsup/mingw/readme.txt685
-rw-r--r--winsup/mingw/samples/dirent/jamfile3
-rw-r--r--winsup/mingw/samples/dirent/test.c91
-rw-r--r--winsup/mingw/samples/dlltest/dll.c22
-rw-r--r--winsup/mingw/samples/dlltest/dll.def3
-rw-r--r--winsup/mingw/samples/dlltest/dll.h4
-rw-r--r--winsup/mingw/samples/dlltest/exe.c23
-rw-r--r--winsup/mingw/samples/dlltest/exe.exp8
-rw-r--r--winsup/mingw/samples/dlltest/expexe.c17
-rw-r--r--winsup/mingw/samples/dlltest/expexe.def2
-rw-r--r--winsup/mingw/samples/dlltest/jamfile46
-rw-r--r--winsup/mingw/samples/dlltest/loaddll.c40
-rw-r--r--winsup/mingw/samples/dlltest/loadexe.c47
-rw-r--r--winsup/mingw/samples/dlltest/readme.txt39
-rw-r--r--winsup/mingw/samples/dlltest/silly.cpp55
-rw-r--r--winsup/mingw/samples/dlltest/silly.def11
-rw-r--r--winsup/mingw/samples/dlltest/silly.exp8
-rw-r--r--winsup/mingw/samples/dlltest/silly.h27
-rw-r--r--winsup/mingw/samples/dlltest/sillydll.cpp107
-rw-r--r--winsup/mingw/samples/filehand/filehand.c57
-rw-r--r--winsup/mingw/samples/filehand/jamfile3
-rw-r--r--winsup/mingw/samples/filehand/junk.txt1
-rw-r--r--winsup/mingw/samples/fixargv/fixargv.c290
-rw-r--r--winsup/mingw/samples/fixargv/fixargv.h24
-rw-r--r--winsup/mingw/samples/fixargv/readme.txt85
-rw-r--r--winsup/mingw/samples/fmode/all.c46
-rw-r--r--winsup/mingw/samples/fmode/jamfile5
-rw-r--r--winsup/mingw/samples/fmode/readme.txt5
-rw-r--r--winsup/mingw/samples/fmode/test.c31
-rw-r--r--winsup/mingw/samples/globbing/glob.c20
-rw-r--r--winsup/mingw/samples/globbing/jamfile11
-rw-r--r--winsup/mingw/samples/globbing/noglob.c22
-rw-r--r--winsup/mingw/samples/globbing/readme.txt14
-rw-r--r--winsup/mingw/samples/print/jamfile9
-rw-r--r--winsup/mingw/samples/print/prntest.c65
-rw-r--r--winsup/mingw/samples/seh/eh3.c112
-rw-r--r--winsup/mingw/samples/seh/exutil.c68
-rw-r--r--winsup/mingw/samples/seh/exutil.def3
-rw-r--r--winsup/mingw/samples/seh/exutil.h23
-rw-r--r--winsup/mingw/samples/seh/jamfile13
-rw-r--r--winsup/mingw/samples/seh/sehfix.c60
-rw-r--r--winsup/mingw/samples/seh/sehsub.c43
-rw-r--r--winsup/mingw/samples/seh/sehtest.c72
-rw-r--r--winsup/mingw/samples/simpledll/dll.c33
-rw-r--r--winsup/mingw/samples/simpledll/dll.cpp44
-rw-r--r--winsup/mingw/samples/simpledll/dll.def2
-rw-r--r--winsup/mingw/samples/simpledll/exe.c13
-rw-r--r--winsup/mingw/samples/simpledll/jamfile14
-rw-r--r--winsup/mingw/samples/simpledll/makedll.bat23
-rw-r--r--winsup/mingw/samples/test/jamfile9
-rw-r--r--winsup/mingw/samples/test/test.c20
-rw-r--r--winsup/mingw/samples/wintest/jamfile8
-rw-r--r--winsup/mingw/samples/wintest/test.c212
-rw-r--r--winsup/mingw/string_old.c47
-rw-r--r--winsup/testsuite/README42
-rw-r--r--winsup/testsuite/config/default.exp6
-rw-r--r--winsup/testsuite/winsup.api/devzero.c113
-rw-r--r--winsup/testsuite/winsup.api/samples/sample-fail.c4
-rw-r--r--winsup/testsuite/winsup.api/samples/sample-miscompile.c1
-rw-r--r--winsup/testsuite/winsup.api/samples/sample-pass.c4
-rw-r--r--winsup/testsuite/winsup.api/winsup.exp43
-rw-r--r--winsup/utils/ChangeLog21
-rw-r--r--winsup/utils/Makefile.in109
-rw-r--r--winsup/utils/aclocal.m478
-rwxr-xr-xwinsup/utils/configure1246
-rw-r--r--winsup/utils/configure.in75
-rw-r--r--winsup/utils/cygcheck.cc922
-rw-r--r--winsup/utils/cygpath.cc154
-rw-r--r--winsup/utils/getfacl.c124
-rw-r--r--winsup/utils/kill.cc85
-rw-r--r--winsup/utils/mkgroup.c410
-rw-r--r--winsup/utils/mkpasswd.c438
-rw-r--r--winsup/utils/mount.cc240
-rw-r--r--winsup/utils/passwd.c352
-rw-r--r--winsup/utils/ps.cc150
-rw-r--r--winsup/utils/regtool.cc524
-rw-r--r--winsup/utils/setfacl.c377
-rw-r--r--winsup/utils/strace.cc481
-rw-r--r--winsup/utils/umount.cc173
-rw-r--r--winsup/utils/utils.sgml657
-rw-r--r--winsup/w32api/ChangeLog1006
-rw-r--r--winsup/w32api/Makefile.in124
-rw-r--r--winsup/w32api/TODO61
-rwxr-xr-xwinsup/w32api/config.guess995
-rwxr-xr-xwinsup/w32api/config.sub1278
-rwxr-xr-xwinsup/w32api/configure1481
-rw-r--r--winsup/w32api/configure.in51
-rw-r--r--winsup/w32api/include/basetyps.h137
-rw-r--r--winsup/w32api/include/cderr.h40
-rw-r--r--winsup/w32api/include/cguid.h78
-rw-r--r--winsup/w32api/include/commctrl.h2059
-rw-r--r--winsup/w32api/include/commdlg.h503
-rw-r--r--winsup/w32api/include/cpl.h54
-rw-r--r--winsup/w32api/include/cplext.h6
-rw-r--r--winsup/w32api/include/custcntl.h98
-rw-r--r--winsup/w32api/include/dbt.h86
-rw-r--r--winsup/w32api/include/dde.h60
-rw-r--r--winsup/w32api/include/ddeml.h241
-rw-r--r--winsup/w32api/include/dlgs.h182
-rw-r--r--winsup/w32api/include/httpext.h87
-rw-r--r--winsup/w32api/include/imagehlp.h326
-rw-r--r--winsup/w32api/include/imm.h420
-rw-r--r--winsup/w32api/include/initguid.h8
-rw-r--r--winsup/w32api/include/intshcut.h78
-rw-r--r--winsup/w32api/include/isguids.h11
-rw-r--r--winsup/w32api/include/largeint.h109
-rw-r--r--winsup/w32api/include/lm.h22
-rw-r--r--winsup/w32api/include/lmaccess.h605
-rw-r--r--winsup/w32api/include/lmalert.h56
-rw-r--r--winsup/w32api/include/lmapibuf.h14
-rw-r--r--winsup/w32api/include/lmat.h35
-rw-r--r--winsup/w32api/include/lmaudit.h246
-rw-r--r--winsup/w32api/include/lmbrowsr.h70
-rw-r--r--winsup/w32api/include/lmchdev.h57
-rw-r--r--winsup/w32api/include/lmconfig.h17
-rw-r--r--winsup/w32api/include/lmcons.h60
-rw-r--r--winsup/w32api/include/lmerr.h277
-rw-r--r--winsup/w32api/include/lmerrlog.h207
-rw-r--r--winsup/w32api/include/lmmsg.h23
-rw-r--r--winsup/w32api/include/lmremutl.h41
-rw-r--r--winsup/w32api/include/lmrepl.h90
-rw-r--r--winsup/w32api/include/lmserver.h602
-rw-r--r--winsup/w32api/include/lmshare.h142
-rw-r--r--winsup/w32api/include/lmsname.h54
-rw-r--r--winsup/w32api/include/lmstats.h110
-rw-r--r--winsup/w32api/include/lmsvc.h130
-rw-r--r--winsup/w32api/include/lmuse.h56
-rw-r--r--winsup/w32api/include/lmuseflg.h6
-rw-r--r--winsup/w32api/include/lmwksta.h229
-rw-r--r--winsup/w32api/include/lzexpand.h36
-rw-r--r--winsup/w32api/include/mciavi.h21
-rw-r--r--winsup/w32api/include/mcx.h73
-rw-r--r--winsup/w32api/include/mmsystem.h1933
-rw-r--r--winsup/w32api/include/nb30.h182
-rw-r--r--winsup/w32api/include/nddeapi.h127
-rw-r--r--winsup/w32api/include/nspapi.h19
-rw-r--r--winsup/w32api/include/oaidl.h513
-rw-r--r--winsup/w32api/include/objbase.h151
-rw-r--r--winsup/w32api/include/objfwd.h51
-rw-r--r--winsup/w32api/include/objidl.h1660
-rw-r--r--winsup/w32api/include/ocidl.h7
-rw-r--r--winsup/w32api/include/ole.h304
-rw-r--r--winsup/w32api/include/ole2.h106
-rw-r--r--winsup/w32api/include/ole2ver.h5
-rw-r--r--winsup/w32api/include/oleauto.h252
-rw-r--r--winsup/w32api/include/olectl.h721
-rw-r--r--winsup/w32api/include/olectlid.h109
-rw-r--r--winsup/w32api/include/oledlg.h931
-rw-r--r--winsup/w32api/include/oleidl.h320
-rw-r--r--winsup/w32api/include/pbt.h16
-rw-r--r--winsup/w32api/include/poppack.h3
-rw-r--r--winsup/w32api/include/prsht.h244
-rw-r--r--winsup/w32api/include/psapi.h92
-rw-r--r--winsup/w32api/include/pshpack1.h3
-rw-r--r--winsup/w32api/include/pshpack2.h3
-rw-r--r--winsup/w32api/include/pshpack4.h3
-rw-r--r--winsup/w32api/include/pshpack8.h3
-rw-r--r--winsup/w32api/include/rapi.h64
-rw-r--r--winsup/w32api/include/regstr.h763
-rw-r--r--winsup/w32api/include/richedit.h349
-rw-r--r--winsup/w32api/include/richole.h103
-rw-r--r--winsup/w32api/include/rpc.h54
-rw-r--r--winsup/w32api/include/rpcdce.h381
-rw-r--r--winsup/w32api/include/rpcdce2.h52
-rw-r--r--winsup/w32api/include/rpcdcep.h124
-rw-r--r--winsup/w32api/include/rpcndr.h466
-rw-r--r--winsup/w32api/include/rpcnsi.h118
-rw-r--r--winsup/w32api/include/rpcnsip.h21
-rw-r--r--winsup/w32api/include/rpcnterr.h18
-rw-r--r--winsup/w32api/include/rpcproxy.h185
-rw-r--r--winsup/w32api/include/scrnsave.h78
-rw-r--r--winsup/w32api/include/shellapi.h251
-rw-r--r--winsup/w32api/include/shlguid.h73
-rw-r--r--winsup/w32api/include/shlobj.h695
-rw-r--r--winsup/w32api/include/sql.h705
-rw-r--r--winsup/w32api/include/sqlext.h79
-rw-r--r--winsup/w32api/include/sqltypes.h61
-rw-r--r--winsup/w32api/include/unknwn.h67
-rw-r--r--winsup/w32api/include/winbase.h1841
-rw-r--r--winsup/w32api/include/wincon.h203
-rw-r--r--winsup/w32api/include/wincrypt.h184
-rw-r--r--winsup/w32api/include/windef.h223
-rw-r--r--winsup/w32api/include/windows.h137
-rw-r--r--winsup/w32api/include/windowsx.h505
-rw-r--r--winsup/w32api/include/winerror.h1011
-rw-r--r--winsup/w32api/include/wingdi.h2808
-rw-r--r--winsup/w32api/include/wininet.h881
-rw-r--r--winsup/w32api/include/winioctl.h255
-rw-r--r--winsup/w32api/include/winnetwk.h312
-rw-r--r--winsup/w32api/include/winnls.h454
-rw-r--r--winsup/w32api/include/winnt.h2231
-rw-r--r--winsup/w32api/include/winperf.h135
-rw-r--r--winsup/w32api/include/winreg.h155
-rw-r--r--winsup/w32api/include/winresrc.h10
-rw-r--r--winsup/w32api/include/winsock.h510
-rw-r--r--winsup/w32api/include/winsock2.h129
-rw-r--r--winsup/w32api/include/winspool.h776
-rw-r--r--winsup/w32api/include/winsvc.h202
-rw-r--r--winsup/w32api/include/winuser.h3236
-rw-r--r--winsup/w32api/include/winver.h129
-rw-r--r--winsup/w32api/include/wtypes.h152
-rw-r--r--winsup/w32api/include/zmouse.h24
-rwxr-xr-xwinsup/w32api/install-sh251
-rw-r--r--winsup/w32api/lib/Makefile.in181
-rw-r--r--winsup/w32api/lib/advapi32.def350
-rw-r--r--winsup/w32api/lib/cap.def6
-rw-r--r--winsup/w32api/lib/comctl32.def128
-rw-r--r--winsup/w32api/lib/comdlg32.def25
-rw-r--r--winsup/w32api/lib/ctl3d32.def27
-rw-r--r--winsup/w32api/lib/d3dim.def8
-rw-r--r--winsup/w32api/lib/d3drm.def24
-rw-r--r--winsup/w32api/lib/d3dxof.def4
-rw-r--r--winsup/w32api/lib/ddraw.def28
-rw-r--r--winsup/w32api/lib/dinput.c2488
-rw-r--r--winsup/w32api/lib/dinput.def5
-rw-r--r--winsup/w32api/lib/dlcapi.def5
-rw-r--r--winsup/w32api/lib/dplayx.def10
-rw-r--r--winsup/w32api/lib/dsetup.def18
-rw-r--r--winsup/w32api/lib/dsound.def9
-rw-r--r--winsup/w32api/lib/dxguid.c461
-rw-r--r--winsup/w32api/lib/gdi32.def334
-rw-r--r--winsup/w32api/lib/glaux.def173
-rw-r--r--winsup/w32api/lib/glu32.def54
-rw-r--r--winsup/w32api/lib/glut.def116
-rw-r--r--winsup/w32api/lib/glut32.def116
-rw-r--r--winsup/w32api/lib/imagehlp.def114
-rw-r--r--winsup/w32api/lib/imm32.def77
-rw-r--r--winsup/w32api/lib/kernel32.def758
-rw-r--r--winsup/w32api/lib/largeint.c118
-rw-r--r--winsup/w32api/lib/lz32.def14
-rw-r--r--winsup/w32api/lib/mapi32.def150
-rw-r--r--winsup/w32api/lib/mfcuia32.def12
-rw-r--r--winsup/w32api/lib/mgmtapi.def12
-rw-r--r--winsup/w32api/lib/mpr.def72
-rw-r--r--winsup/w32api/lib/msacm32.def46
-rw-r--r--winsup/w32api/lib/mswsock.def28
-rw-r--r--winsup/w32api/lib/nddeapi.def30
-rw-r--r--winsup/w32api/lib/netapi32.def247
-rw-r--r--winsup/w32api/lib/odbc32.def62
-rw-r--r--winsup/w32api/lib/ole32.def163
-rw-r--r--winsup/w32api/lib/oleaut32.def146
-rw-r--r--winsup/w32api/lib/olecli32.def57
-rw-r--r--winsup/w32api/lib/oledlg.def25
-rw-r--r--winsup/w32api/lib/olepro32.def9
-rw-r--r--winsup/w32api/lib/olesvr32.def13
-rw-r--r--winsup/w32api/lib/opengl32.def369
-rw-r--r--winsup/w32api/lib/penwin32.def101
-rw-r--r--winsup/w32api/lib/pkpd32.def36
-rw-r--r--winsup/w32api/lib/rapi.def84
-rw-r--r--winsup/w32api/lib/rasapi32.def33
-rw-r--r--winsup/w32api/lib/res.rc6
-rw-r--r--winsup/w32api/lib/rpcdce4.def26
-rw-r--r--winsup/w32api/lib/rpcns4.def60
-rw-r--r--winsup/w32api/lib/rpcrt4.def372
-rw-r--r--winsup/w32api/lib/scrnsave.c406
-rw-r--r--winsup/w32api/lib/shell32.c51
-rw-r--r--winsup/w32api/lib/shell32.def123
-rw-r--r--winsup/w32api/lib/svrapi.def22
-rw-r--r--winsup/w32api/lib/tapi32.def116
-rw-r--r--winsup/w32api/lib/test.c40
-rw-r--r--winsup/w32api/lib/th32.def14
-rw-r--r--winsup/w32api/lib/thunk32.def68
-rw-r--r--winsup/w32api/lib/url.def9
-rw-r--r--winsup/w32api/lib/user32.def561
-rw-r--r--winsup/w32api/lib/uuid.c331
-rw-r--r--winsup/w32api/lib/vdmdbg.def18
-rw-r--r--winsup/w32api/lib/version.def16
-rw-r--r--winsup/w32api/lib/vfw32.def131
-rw-r--r--winsup/w32api/lib/win32spl.def16
-rw-r--r--winsup/w32api/lib/wininet.def159
-rw-r--r--winsup/w32api/lib/winmm.def196
-rw-r--r--winsup/w32api/lib/winspool.def131
-rw-r--r--winsup/w32api/lib/winstrm.def9
-rw-r--r--winsup/w32api/lib/wow32.def19
-rw-r--r--winsup/w32api/lib/ws2_32.def108
-rw-r--r--winsup/w32api/lib/wsock32.def75
-rw-r--r--winsup/w32api/lib/wst.def3
582 files changed, 146593 insertions, 0 deletions
diff --git a/winsup/CYGWIN_LICENSE b/winsup/CYGWIN_LICENSE
new file mode 100644
index 000000000..f10b01f56
--- /dev/null
+++ b/winsup/CYGWIN_LICENSE
@@ -0,0 +1,46 @@
+--------------------------------------------------------------------------
+This program is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License (GPL) as published by
+the Free Software Foundation; either version 2 of the License, or (at
+your option) any later version.
+
+This program 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 General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+--------------------------------------------------------------------------
+
+ *** NOTE ***
+
+In accordance with section 10 of the GPL, Cygnus permits programs whose
+sources are distributed under a license that complies with the Open
+Source definition to be linked with libcygwin.a without libcygwin.a
+itself causing the resulting program to be covered by the GNU GPL.
+
+This means that you can port an Open Source(tm) application to cygwin,
+and distribute that executable as if it didn't include a copy of
+libcygwin.a linked into it. Note that this does not apply to the cygwin
+DLL itself. If you distribute a (possibly modified) version of the DLL
+you must adhere to the terms of the GPL, i.e., you must provide sources
+for the cygwin DLL.
+
+See http://www.opensource.org/osd.html for the precise Open Source
+Definition referenced above.
+
+If you have questions about any of the above or would like to arrange
+for other licensing terms, please contact Cygnus using the information
+given below:
+
+ Cygnus Solutions
+ 1325 Chesapeake Terrace
+ Sunnyvale, CA 94089
+ USA
+
+ +1 408 542 9600
+ hotline: +1 408 542 9601
+ email: info@cygnus.com
+ fax: +1 408 542 9699
diff --git a/winsup/ChangeLog b/winsup/ChangeLog
new file mode 100644
index 000000000..4f2b5fbfa
--- /dev/null
+++ b/winsup/ChangeLog
@@ -0,0 +1,36 @@
+Sun Feb 6 18:15:44 2000 Christopher Faylor <cgf@cygnus.com>
+
+ * configure.in: Do the standard CC/CFLAGS stuff for propagation to
+ sub-configures.
+ * configure: Regenerate.
+
+2000-01-26 DJ Delorie <dj@cygnus.com>
+
+ * doc/Makefile.in: fix doctool -d options
+
+Fri Jan 21 12:51:32 2000 Christopher Faylor <cgf@cygnus.com>
+
+ * Makefile.common: No need to rerun Makefile if config.status changes.
+ That should happen automatically.
+ * Makefile.in: Ditto.
+
+Sat Jan 8 14:40:01 2000 Christopher Faylor <cgf@cygnus.com>
+
+ * Makefile.common: Remove cygwin DLL specific stuff. Make Makefile
+ target PRECIOUS.
+ * Makefile.in: Make Makefile target PRECIOUS.
+
+Fri Jan 7 21:00:49 2000 Christopher Faylor <cgf@cygnus.com>
+
+ * Makefile.common: Remove cygwin DLL specific stuff. Correctly deal
+ with updir stuff when building in the same directory as the source.
+
+Thu Jan 6 19:04:35 2000 Christopher Faylor <cgf@cygnus.com>
+
+ Create new directory structure
+ * Makefile.in: New file.
+ * configure.in: New file.
+ * configure: New file.
+ * Makefile.common: New file.
+ * cygwin: New directory.
+ * w32api: New directory.
diff --git a/winsup/MAINTAINERS b/winsup/MAINTAINERS
new file mode 100644
index 000000000..9bb62c260
--- /dev/null
+++ b/winsup/MAINTAINERS
@@ -0,0 +1,17 @@
+The following people are responsible for maintaining various pieces of
+the winsup directory. Their approval is required before committing any
+changes to the repository.
+
+Makefile.* Chris Faylor <cgf@cygnus.com>
+configure.* Chris Faylor <cgf@cygnus.com>
+MAINTAINERS Chris Faylor <cgf@cygnus.com>
+cygwin/security.cc and
+ntsec stuff Corinna Vinschen <corinna@vinschen.de>
+cygwin/fhandler_tape.cc Corinna Vinschen <corinna@vinschen.de>
+cygwin/{everything else} Chris Faylor <cgf@cygnus.com>,
+ DJ Delorie <cgf@cygnus.com>
+doc/* DJ Delorie <cgf@cygnus.com>
+mingw/* Mumit Khan <xraylith.wisc.edu>
+utils/* Chris Faylor <cgf@cygnus.com>,
+ DJ Delorie <dj@cygnus.com>
+w32api/* Mumit Khan <xraylith.wisc.edu>
diff --git a/winsup/Makefile.common b/winsup/Makefile.common
new file mode 100644
index 000000000..c6143426a
--- /dev/null
+++ b/winsup/Makefile.common
@@ -0,0 +1,127 @@
+# Makefile.common - common definitions for the winsup directory
+#
+# Copyright 2000 Cygnus Solutions.
+#
+# This file is part of Cygwin.
+#
+# This software is a copyrighted work licensed under the terms of the
+# Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+# details.
+
+# This makefile requires GNU make.
+
+CFLAGS_COMMON:=-Wall -Wwrite-strings # -finline-functions
+MALLOC_DEBUG:=#-DMALLOC_DEBUG -I/gotham/src/comp-tools/winsup/dlmalloc
+MALLOC_OBJ:=#/gotham/src/comp-tools/winsup/dlmalloc/malloc.o
+
+ifeq (,${findstring /,$(srcdir)})
+ updir:=$(srcdir)/..
+ updir1:=$(updir)/..
+else
+ updir:=${patsubst %:::,%,${patsubst %/:::,%,$(dir $(srcdir)):::}}
+ifneq (,${findstring /,$(updir)})
+ updir1:=${patsubst %:::,%,${patsubst %/:::,%,$(dir $(updir)):::}}
+else
+ updir1:=$(updir)/..
+endif
+endif
+
+
+pwd:=${shell pwd}
+ifeq (,${findstring /,$(pwd)})
+ bupdir:=..
+ bupdir1:=../..
+else
+ bupdir:=${patsubst %:::,%,${patsubst %/:::,%,$(dir $(pwd)):::}}
+ifneq (,${findstring /,$(bupdir)})
+ bupdir1:=${patsubst %:::,%,${patsubst %/:::,%,$(dir $(bupdir)):::}}
+else
+ bupdir1:=$(bupdir)/..
+endif
+endif
+
+w32api_source:=$(updir)/w32api
+w32api_build:=$(bupdir)/w32api
+w32api_include:=$(w32api_source)/include
+w32api_lib:=$(w32api_build)/lib
+newlib_source:=$(updir1)/newlib
+newlib_build:=$(bupdir1)/newlib
+cygwin_build:=$(bupdir)/cygwin
+cygwin_source:=$(updir)/cygwin
+mingw_build:=$(bupdir)/mingw
+mingw_source:=$(updir)/mingw
+utils_build:=$(bupdir)/utils
+utils_source:=$(updir)/utils
+
+INCLUDES:=-I. -I$(cygwin_source)/include -I$(cygwin_source) -I$(newlib_source)/libc/sys/cygwin -I$(newlib_source)/libc/include -I$(w32api_include)
+ifdef CONFIG_DIR
+INCLUDES+=-I$(CONFIG_DIR)
+endif
+
+MINGW_INCLUDES:=-I$(updir)/mingw/include $(INCLUDES)
+
+GCC_DEFAULT_OPTIONS:=$(CFLAGS_COMMON) $(CFLAGS_CONFIG) $(INCLUDES)
+
+# Link in libc and libm from newlib
+
+LIBC:=$(newlib_build)/libc/libc.a
+LIBM:=$(newlib_build)/libm/libm.a
+CRT0:=$(newlib_build)/libc/crt0.o
+
+ALL_CFLAGS:=$(DEFS) $(MALLOC_DEBUG) $(CFLAGS) $(GCC_DEFAULT_OPTIONS)
+ALL_CXXFLAGS:=$(DEFS) $(MALLOC_DEBUG) $(CXXFLAGS) $(GCC_DEFAULT_OPTIONS)
+
+ifndef PREPROCESS
+c=-c
+o=.o
+else
+c=-E
+o=.E
+endif
+
+LIBGCC:=${subst \,/,${shell $(CC_FOR_TARGET) -print-libgcc-file-name}}
+GCC_INCLUDE:=${dir $(LIBGCC)}/include
+
+COMPILE_CXX:=$(CC) $c -nostdinc++ $(ALL_CXXFLAGS) -I$(GCC_INCLUDE) \
+ -fno-rtti -fno-exceptions
+COMPILE_CC:=$(CC) $c -nostdinc $(ALL_CFLAGS) -I$(GCC_INCLUDE)
+
+vpath %.a $(cygwin_build):$(w32api_lib):$(newlib_build)/libc:$(newlib_build)/libm
+
+unexport MAKEOVERRIDES
+
+.PRECIOUS: %.o
+
+%.o: %.cc
+ifdef VERBOSE
+ $(COMPILE_CXX) -o $(@D)/$(*F)$o $<
+else
+ @echo $(CC) $c $(CXXFLAGS) -o $(@D)/$(*F)$o ${subst $(srcdir)/,,$<}; \
+ $(COMPILE_CXX) -o $(@D)/$(*F)$o $<
+endif
+
+%.o: %.c
+ifdef VERBOSE
+ $(COMPILE_CC) -o $(@D)/$(*F)$o $<
+else
+ @echo $(CC) $c $(CFLAGS) -o $(@D)/$(*F)$o ${subst $(srcdir)/,,$<}; \
+ $(COMPILE_CC) -o $(@D)/$(*F)$o $<
+endif
+
+$(bupdir1)/libiberty/%.o: $(updir1)/libiberty/%.c
+ @$(MAKE) -C $(@D) $(MAKEOVERRIDES) $(@F)
+
+$(w32api_lib)/%.a: $(w32api_lib)/Makefile
+ @$(MAKE) --no-print-dir -C $(@D) $(MAKEOVERRIDES) $(@F)
+
+all:
+
+# For auto-rebuilding the Makefile
+
+.PRECIOUS: Makefile
+
+Makefile: Makefile.in $(srcdir)/configure.in config.status
+ $(SHELL) config.status
+
+config.status: configure
+ $(SHELL) config.status --recheck
diff --git a/winsup/Makefile.in b/winsup/Makefile.in
new file mode 100644
index 000000000..dcb1263c0
--- /dev/null
+++ b/winsup/Makefile.in
@@ -0,0 +1,71 @@
+# Makefile.in for windows stuff
+# Copyright 1995, 1996, 1997, 1998, 1999 Cygnus Solutions.
+#
+# This file is part of Cygwin.
+#
+# This software is a copyrighted work licensed under the terms of the
+# Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+# details.
+
+# This makefile requires GNU make.
+
+SHELL:=@SHELL@
+VPATH:=@srcdir@
+srcdir:=@srcdir@
+objdir:=.
+
+target_alias:=@target_alias@
+build_alias:=@build_alias@
+host_alias:=@host_alias@
+prefix:=@prefix@
+
+program_transform_name:=@program_transform_name@
+exec_prefix:=@exec_prefix@
+bindir:=@bindir@
+libdir:=@libdir@
+ifeq ($(target_alias),$(host_alias))
+ifeq ($(build_alias),$(host_alias))
+tooldir:=$(exec_prefix)
+else
+tooldir:=$(exec_prefix)/$(target_alias)
+endif
+else
+tooldir:=$(exec_prefix)/$(target_alias)
+endif
+datadir:=@datadir@
+infodir:=@infodir@
+includedir:=@includedir@
+
+SUBDIRS=@SUBDIRS@
+INSTALL_SUBDIRS=${patsubst %,install_%,$(SUBDIRS)}
+CLEAN_SUBDIRS=${patsubst %,clean_%,$(SUBDIRS)}
+
+.PHONY: all install clean $(SUBDIRS) $(INSTALL_SUBDIRS) \
+ $(CLEAN_SUBDIRS)
+
+.SUFFIXES:
+
+unexport MAKEOVERRIDES
+
+all: Makefile $(SUBDIRS)
+
+install: Makefile $(INSTALL_SUBDIRS)
+
+clean: $(CLEAN_SUBDIRS)
+
+$(SUBDIRS):
+ @$(MAKE) -C $@ $(MAKEOVERRIDES) all
+
+$(INSTALL_SUBDIRS):
+ @$(MAKE) -C ${patsubst install_%,%,$@} $(MAKEOVERRIDES) install
+
+$(CLEAN_SUBDIRS):
+ @$(MAKE) -C ${patsubst clean_%,%,$@} $(MAKEOVERRIDES) clean
+
+.PRECIOUS: Makefile
+
+Makefile: Makefile.in $(srcdir)/configure.in config.status
+ $(SHELL) config.status
+
+config.status: configure
+ $(SHELL) config.status --recheck
diff --git a/winsup/configure b/winsup/configure
new file mode 100755
index 000000000..407842a7b
--- /dev/null
+++ b/winsup/configure
@@ -0,0 +1,1223 @@
+#! /bin/sh
+
+# Guess values for system-dependent variables and create Makefiles.
+# Generated automatically using autoconf version 2.13
+# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.
+#
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+
+# Defaults:
+ac_help=
+ac_default_prefix=/usr/local
+# Any additions from configure.in:
+
+# Initialize some variables set by options.
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+build=NONE
+cache_file=./config.cache
+exec_prefix=NONE
+host=NONE
+no_create=
+nonopt=NONE
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+sitefile=
+srcdir=
+target=NONE
+verbose=
+x_includes=NONE
+x_libraries=NONE
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datadir='${prefix}/share'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+libdir='${exec_prefix}/lib'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+infodir='${prefix}/info'
+mandir='${prefix}/man'
+
+# Initialize some other variables.
+subdirs=
+MFLAGS= MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
+# Maximum number of lines to put in a shell here document.
+ac_max_here_lines=12
+
+ac_prev=
+for ac_option
+do
+
+ # If the previous option needs an argument, assign it.
+ if test -n "$ac_prev"; then
+ eval "$ac_prev=\$ac_option"
+ ac_prev=
+ continue
+ fi
+
+ case "$ac_option" in
+ -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
+ *) ac_optarg= ;;
+ esac
+
+ # Accept the important Cygnus configure options, so we can diagnose typos.
+
+ case "$ac_option" in
+
+ -bindir | --bindir | --bindi | --bind | --bin | --bi)
+ ac_prev=bindir ;;
+ -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+ bindir="$ac_optarg" ;;
+
+ -build | --build | --buil | --bui | --bu)
+ ac_prev=build ;;
+ -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+ build="$ac_optarg" ;;
+
+ -cache-file | --cache-file | --cache-fil | --cache-fi \
+ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+ ac_prev=cache_file ;;
+ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+ cache_file="$ac_optarg" ;;
+
+ -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
+ ac_prev=datadir ;;
+ -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
+ | --da=*)
+ datadir="$ac_optarg" ;;
+
+ -disable-* | --disable-*)
+ ac_feature=`echo $ac_option|sed -e 's/-*disable-//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then
+ { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
+ fi
+ ac_feature=`echo $ac_feature| sed 's/-/_/g'`
+ eval "enable_${ac_feature}=no" ;;
+
+ -enable-* | --enable-*)
+ ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then
+ { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
+ fi
+ ac_feature=`echo $ac_feature| sed 's/-/_/g'`
+ case "$ac_option" in
+ *=*) ;;
+ *) ac_optarg=yes ;;
+ esac
+ eval "enable_${ac_feature}='$ac_optarg'" ;;
+
+ -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+ | --exec | --exe | --ex)
+ ac_prev=exec_prefix ;;
+ -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+ | --exec=* | --exe=* | --ex=*)
+ exec_prefix="$ac_optarg" ;;
+
+ -gas | --gas | --ga | --g)
+ # Obsolete; use --with-gas.
+ with_gas=yes ;;
+
+ -help | --help | --hel | --he)
+ # Omit some internal or obsolete options to make the list less imposing.
+ # This message is too long to be a string in the A/UX 3.1 sh.
+ cat << EOF
+Usage: configure [options] [host]
+Options: [defaults in brackets after descriptions]
+Configuration:
+ --cache-file=FILE cache test results in FILE
+ --help print this message
+ --no-create do not create output files
+ --quiet, --silent do not print \`checking...' messages
+ --site-file=FILE use FILE as the site file
+ --version print the version of autoconf that created configure
+Directory and file names:
+ --prefix=PREFIX install architecture-independent files in PREFIX
+ [$ac_default_prefix]
+ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
+ [same as prefix]
+ --bindir=DIR user executables in DIR [EPREFIX/bin]
+ --sbindir=DIR system admin executables in DIR [EPREFIX/sbin]
+ --libexecdir=DIR program executables in DIR [EPREFIX/libexec]
+ --datadir=DIR read-only architecture-independent data in DIR
+ [PREFIX/share]
+ --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc]
+ --sharedstatedir=DIR modifiable architecture-independent data in DIR
+ [PREFIX/com]
+ --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var]
+ --libdir=DIR object code libraries in DIR [EPREFIX/lib]
+ --includedir=DIR C header files in DIR [PREFIX/include]
+ --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include]
+ --infodir=DIR info documentation in DIR [PREFIX/info]
+ --mandir=DIR man documentation in DIR [PREFIX/man]
+ --srcdir=DIR find the sources in DIR [configure dir or ..]
+ --program-prefix=PREFIX prepend PREFIX to installed program names
+ --program-suffix=SUFFIX append SUFFIX to installed program names
+ --program-transform-name=PROGRAM
+ run sed PROGRAM on installed program names
+EOF
+ cat << EOF
+Host type:
+ --build=BUILD configure for building on BUILD [BUILD=HOST]
+ --host=HOST configure for HOST [guessed]
+ --target=TARGET configure for TARGET [TARGET=HOST]
+Features and packages:
+ --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
+ --enable-FEATURE[=ARG] include FEATURE [ARG=yes]
+ --with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
+ --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
+ --x-includes=DIR X include files are in DIR
+ --x-libraries=DIR X library files are in DIR
+EOF
+ if test -n "$ac_help"; then
+ echo "--enable and --with options recognized:$ac_help"
+ fi
+ exit 0 ;;
+
+ -host | --host | --hos | --ho)
+ ac_prev=host ;;
+ -host=* | --host=* | --hos=* | --ho=*)
+ host="$ac_optarg" ;;
+
+ -includedir | --includedir | --includedi | --included | --include \
+ | --includ | --inclu | --incl | --inc)
+ ac_prev=includedir ;;
+ -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+ | --includ=* | --inclu=* | --incl=* | --inc=*)
+ includedir="$ac_optarg" ;;
+
+ -infodir | --infodir | --infodi | --infod | --info | --inf)
+ ac_prev=infodir ;;
+ -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+ infodir="$ac_optarg" ;;
+
+ -libdir | --libdir | --libdi | --libd)
+ ac_prev=libdir ;;
+ -libdir=* | --libdir=* | --libdi=* | --libd=*)
+ libdir="$ac_optarg" ;;
+
+ -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+ | --libexe | --libex | --libe)
+ ac_prev=libexecdir ;;
+ -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+ | --libexe=* | --libex=* | --libe=*)
+ libexecdir="$ac_optarg" ;;
+
+ -localstatedir | --localstatedir | --localstatedi | --localstated \
+ | --localstate | --localstat | --localsta | --localst \
+ | --locals | --local | --loca | --loc | --lo)
+ ac_prev=localstatedir ;;
+ -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+ | --localstate=* | --localstat=* | --localsta=* | --localst=* \
+ | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
+ localstatedir="$ac_optarg" ;;
+
+ -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+ ac_prev=mandir ;;
+ -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+ mandir="$ac_optarg" ;;
+
+ -nfp | --nfp | --nf)
+ # Obsolete; use --without-fp.
+ with_fp=no ;;
+
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c)
+ no_create=yes ;;
+
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+ no_recursion=yes ;;
+
+ -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+ | --oldin | --oldi | --old | --ol | --o)
+ ac_prev=oldincludedir ;;
+ -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+ oldincludedir="$ac_optarg" ;;
+
+ -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+ ac_prev=prefix ;;
+ -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+ prefix="$ac_optarg" ;;
+
+ -program-prefix | --program-prefix | --program-prefi | --program-pref \
+ | --program-pre | --program-pr | --program-p)
+ ac_prev=program_prefix ;;
+ -program-prefix=* | --program-prefix=* | --program-prefi=* \
+ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+ program_prefix="$ac_optarg" ;;
+
+ -program-suffix | --program-suffix | --program-suffi | --program-suff \
+ | --program-suf | --program-su | --program-s)
+ ac_prev=program_suffix ;;
+ -program-suffix=* | --program-suffix=* | --program-suffi=* \
+ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+ program_suffix="$ac_optarg" ;;
+
+ -program-transform-name | --program-transform-name \
+ | --program-transform-nam | --program-transform-na \
+ | --program-transform-n | --program-transform- \
+ | --program-transform | --program-transfor \
+ | --program-transfo | --program-transf \
+ | --program-trans | --program-tran \
+ | --progr-tra | --program-tr | --program-t)
+ ac_prev=program_transform_name ;;
+ -program-transform-name=* | --program-transform-name=* \
+ | --program-transform-nam=* | --program-transform-na=* \
+ | --program-transform-n=* | --program-transform-=* \
+ | --program-transform=* | --program-transfor=* \
+ | --program-transfo=* | --program-transf=* \
+ | --program-trans=* | --program-tran=* \
+ | --progr-tra=* | --program-tr=* | --program-t=*)
+ program_transform_name="$ac_optarg" ;;
+
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ silent=yes ;;
+
+ -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+ ac_prev=sbindir ;;
+ -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+ | --sbi=* | --sb=*)
+ sbindir="$ac_optarg" ;;
+
+ -sharedstatedir | --sharedstatedir | --sharedstatedi \
+ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+ | --sharedst | --shareds | --shared | --share | --shar \
+ | --sha | --sh)
+ ac_prev=sharedstatedir ;;
+ -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+ | --sha=* | --sh=*)
+ sharedstatedir="$ac_optarg" ;;
+
+ -site | --site | --sit)
+ ac_prev=site ;;
+ -site=* | --site=* | --sit=*)
+ site="$ac_optarg" ;;
+
+ -site-file | --site-file | --site-fil | --site-fi | --site-f)
+ ac_prev=sitefile ;;
+ -site-file=* | --site-file=* | --site-fil=* | --site-fi=* | --site-f=*)
+ sitefile="$ac_optarg" ;;
+
+ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+ ac_prev=srcdir ;;
+ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+ srcdir="$ac_optarg" ;;
+
+ -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+ | --syscon | --sysco | --sysc | --sys | --sy)
+ ac_prev=sysconfdir ;;
+ -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+ sysconfdir="$ac_optarg" ;;
+
+ -target | --target | --targe | --targ | --tar | --ta | --t)
+ ac_prev=target ;;
+ -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+ target="$ac_optarg" ;;
+
+ -v | -verbose | --verbose | --verbos | --verbo | --verb)
+ verbose=yes ;;
+
+ -version | --version | --versio | --versi | --vers)
+ echo "configure generated by autoconf version 2.13"
+ exit 0 ;;
+
+ -with-* | --with-*)
+ ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then
+ { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
+ fi
+ ac_package=`echo $ac_package| sed 's/-/_/g'`
+ case "$ac_option" in
+ *=*) ;;
+ *) ac_optarg=yes ;;
+ esac
+ eval "with_${ac_package}='$ac_optarg'" ;;
+
+ -without-* | --without-*)
+ ac_package=`echo $ac_option|sed -e 's/-*without-//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then
+ { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
+ fi
+ ac_package=`echo $ac_package| sed 's/-/_/g'`
+ eval "with_${ac_package}=no" ;;
+
+ --x)
+ # Obsolete; use --with-x.
+ with_x=yes ;;
+
+ -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+ | --x-incl | --x-inc | --x-in | --x-i)
+ ac_prev=x_includes ;;
+ -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+ x_includes="$ac_optarg" ;;
+
+ -x-libraries | --x-libraries | --x-librarie | --x-librari \
+ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+ ac_prev=x_libraries ;;
+ -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+ x_libraries="$ac_optarg" ;;
+
+ -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; }
+ ;;
+
+ *)
+ if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then
+ echo "configure: warning: $ac_option: invalid host type" 1>&2
+ fi
+ if test "x$nonopt" != xNONE; then
+ { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; }
+ fi
+ nonopt="$ac_option"
+ ;;
+
+ esac
+done
+
+if test -n "$ac_prev"; then
+ { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; }
+fi
+
+trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
+
+# File descriptor usage:
+# 0 standard input
+# 1 file creation
+# 2 errors and warnings
+# 3 some systems may open it to /dev/tty
+# 4 used on the Kubota Titan
+# 6 checking for... messages and results
+# 5 compiler messages saved in config.log
+if test "$silent" = yes; then
+ exec 6>/dev/null
+else
+ exec 6>&1
+fi
+exec 5>./config.log
+
+echo "\
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+" 1>&5
+
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Also quote any args containing shell metacharacters.
+ac_configure_args=
+for ac_arg
+do
+ case "$ac_arg" in
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c) ;;
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;;
+ *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*)
+ ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+ *) ac_configure_args="$ac_configure_args $ac_arg" ;;
+ esac
+done
+
+# NLS nuisances.
+# Only set these to C if already set. These must not be set unconditionally
+# because not all systems understand e.g. LANG=C (notably SCO).
+# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'!
+# Non-C LC_CTYPE values break the ctype check.
+if test "${LANG+set}" = set; then LANG=C; export LANG; fi
+if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi
+if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi
+if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -rf conftest* confdefs.h
+# AIX cpp loses on an empty file, so make sure it contains at least a newline.
+echo > confdefs.h
+
+# A filename unique to this package, relative to the directory that
+# configure is in, which we can look for to find out if srcdir is correct.
+ac_unique_file=Makefile.in
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+ ac_srcdir_defaulted=yes
+ # Try the directory containing this script, then its parent.
+ ac_prog=$0
+ ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'`
+ test "x$ac_confdir" = "x$ac_prog" && ac_confdir=.
+ srcdir=$ac_confdir
+ if test ! -r $srcdir/$ac_unique_file; then
+ srcdir=..
+ fi
+else
+ ac_srcdir_defaulted=no
+fi
+if test ! -r $srcdir/$ac_unique_file; then
+ if test "$ac_srcdir_defaulted" = yes; then
+ { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; }
+ else
+ { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; }
+ fi
+fi
+srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'`
+
+# Prefer explicitly selected file to automatically selected ones.
+if test -z "$sitefile"; then
+ if test -z "$CONFIG_SITE"; then
+ if test "x$prefix" != xNONE; then
+ CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
+ else
+ CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+ fi
+ fi
+else
+ CONFIG_SITE="$sitefile"
+fi
+for ac_site_file in $CONFIG_SITE; do
+ if test -r "$ac_site_file"; then
+ echo "loading site script $ac_site_file"
+ . "$ac_site_file"
+ fi
+done
+
+if test -r "$cache_file"; then
+ echo "loading cache $cache_file"
+ . $cache_file
+else
+ echo "creating cache $cache_file"
+ > $cache_file
+fi
+
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+ac_exeext=
+ac_objext=o
+if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
+ # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu.
+ if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then
+ ac_n= ac_c='
+' ac_t=' '
+ else
+ ac_n=-n ac_c= ac_t=
+ fi
+else
+ ac_n= ac_c='\c' ac_t=
+fi
+
+
+
+
+
+
+ac_aux_dir=
+for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
+ if test -f $ac_dir/install-sh; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install-sh -c"
+ break
+ elif test -f $ac_dir/install.sh; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install.sh -c"
+ break
+ fi
+done
+if test -z "$ac_aux_dir"; then
+ { echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; }
+fi
+ac_config_guess=$ac_aux_dir/config.guess
+ac_config_sub=$ac_aux_dir/config.sub
+ac_configure=$ac_aux_dir/configure # This should be Cygnus configure.
+
+
+# Do some error checking and defaulting for the host and target type.
+# The inputs are:
+# configure --host=HOST --target=TARGET --build=BUILD NONOPT
+#
+# The rules are:
+# 1. You are not allowed to specify --host, --target, and nonopt at the
+# same time.
+# 2. Host defaults to nonopt.
+# 3. If nonopt is not specified, then host defaults to the current host,
+# as determined by config.guess.
+# 4. Target and build default to nonopt.
+# 5. If nonopt is not specified, then target and build default to host.
+
+# The aliases save the names the user supplied, while $host etc.
+# will get canonicalized.
+case $host---$target---$nonopt in
+NONE---*---* | *---NONE---* | *---*---NONE) ;;
+*) { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } ;;
+esac
+
+
+# Make sure we can run config.sub.
+if ${CONFIG_SHELL-/bin/sh} $ac_config_sub sun4 >/dev/null 2>&1; then :
+else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; }
+fi
+
+echo $ac_n "checking host system type""... $ac_c" 1>&6
+echo "configure:587: checking host system type" >&5
+
+host_alias=$host
+case "$host_alias" in
+NONE)
+ case $nonopt in
+ NONE)
+ if host_alias=`${CONFIG_SHELL-/bin/sh} $ac_config_guess`; then :
+ else { echo "configure: error: can not guess host type; you must specify one" 1>&2; exit 1; }
+ fi ;;
+ *) host_alias=$nonopt ;;
+ esac ;;
+esac
+
+host=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $host_alias`
+host_cpu=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+host_vendor=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+echo "$ac_t""$host" 1>&6
+
+echo $ac_n "checking target system type""... $ac_c" 1>&6
+echo "configure:608: checking target system type" >&5
+
+target_alias=$target
+case "$target_alias" in
+NONE)
+ case $nonopt in
+ NONE) target_alias=$host_alias ;;
+ *) target_alias=$nonopt ;;
+ esac ;;
+esac
+
+target=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $target_alias`
+target_cpu=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+target_vendor=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+target_os=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+echo "$ac_t""$target" 1>&6
+
+echo $ac_n "checking build system type""... $ac_c" 1>&6
+echo "configure:626: checking build system type" >&5
+
+build_alias=$build
+case "$build_alias" in
+NONE)
+ case $nonopt in
+ NONE) build_alias=$host_alias ;;
+ *) build_alias=$nonopt ;;
+ esac ;;
+esac
+
+build=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $build_alias`
+build_cpu=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+build_vendor=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+build_os=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+echo "$ac_t""$build" 1>&6
+
+test "$host_alias" != "$target_alias" &&
+ test "$program_prefix$program_suffix$program_transform_name" = \
+ NONENONEs,x,x, &&
+ program_prefix=${target_alias}-
+
+
+if test $host != $build; then
+ ac_tool_prefix=${host_alias}-
+else
+ ac_tool_prefix=
+fi
+
+# Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:658: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_CC="${ac_tool_prefix}gcc"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+ echo "$ac_t""$CC" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+
+if test -z "$ac_cv_prog_CC"; then
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:690: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_CC="gcc"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_prog_CC" && ac_cv_prog_CC="gcc"
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+ echo "$ac_t""$CC" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+else
+ CC="gcc"
+fi
+fi
+
+if test -z "$CC"; then
+ # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:726: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_prog_rejected=no
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then
+ ac_prog_rejected=yes
+ continue
+ fi
+ ac_cv_prog_CC="cc"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+if test $ac_prog_rejected = yes; then
+ # We found a bogon in the path, so make sure we never use it.
+ set dummy $ac_cv_prog_CC
+ shift
+ if test $# -gt 0; then
+ # We chose a different compiler from the bogus one.
+ # However, it has the same basename, so the bogon will be chosen
+ # first if we set CC to just the basename; use the full file name.
+ shift
+ set dummy "$ac_dir/$ac_word" "$@"
+ shift
+ ac_cv_prog_CC="$@"
+ fi
+fi
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+ echo "$ac_t""$CC" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; }
+fi
+
+echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
+echo "configure:775: checking whether we are using GNU C" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.c <<EOF
+#ifdef __GNUC__
+ yes;
+#endif
+EOF
+if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:784: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+ ac_cv_prog_gcc=yes
+else
+ ac_cv_prog_gcc=no
+fi
+fi
+
+echo "$ac_t""$ac_cv_prog_gcc" 1>&6
+
+if test $ac_cv_prog_gcc = yes; then
+ GCC=yes
+ ac_test_CFLAGS="${CFLAGS+set}"
+ ac_save_CFLAGS="$CFLAGS"
+ CFLAGS=
+ echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
+echo "configure:799: checking whether ${CC-cc} accepts -g" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ echo 'void f(){}' > conftest.c
+if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then
+ ac_cv_prog_cc_g=yes
+else
+ ac_cv_prog_cc_g=no
+fi
+rm -f conftest*
+
+fi
+
+echo "$ac_t""$ac_cv_prog_cc_g" 1>&6
+ if test "$ac_test_CFLAGS" = set; then
+ CFLAGS="$ac_save_CFLAGS"
+ elif test $ac_cv_prog_cc_g = yes; then
+ CFLAGS="-g -O2"
+ else
+ CFLAGS="-O2"
+ fi
+ if test "$ac_test_CXXFLAGS" != set; then
+ CXXFLAGS='$(CFLAGS)'
+ fi
+else
+ GCC=
+ test "${CFLAGS+set}" = set || CFLAGS="-g"
+fi
+
+
+SUBDIRS="cygwin w32api mingw utils doc"
+subdirs="$SUBDIRS"
+
+echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6
+echo "configure:834: checking whether ${MAKE-make} sets \${MAKE}" >&5
+set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftestmake <<\EOF
+all:
+ @echo 'ac_maketemp="${MAKE}"'
+EOF
+# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+eval `${MAKE-make} -f conftestmake 2>/dev/null | grep temp=`
+if test -n "$ac_maketemp"; then
+ eval ac_cv_prog_make_${ac_make}_set=yes
+else
+ eval ac_cv_prog_make_${ac_make}_set=no
+fi
+rm -f conftestmake
+fi
+if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ SET_MAKE=
+else
+ echo "$ac_t""no" 1>&6
+ SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+
+
+trap '' 1 2 15
+cat > confcache <<\EOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs. It is not useful on other systems.
+# If it contains results you don't want to keep, you may remove or edit it.
+#
+# By default, configure uses ./config.cache as the cache file,
+# creating it if it does not exist already. You can give configure
+# the --cache-file=FILE option to use a different cache file; that is
+# what configure does when it calls configure scripts in
+# subdirectories, so they share the cache.
+# Giving --cache-file=/dev/null disables caching, for debugging configure.
+# config.status only pays attention to the cache file if you give it the
+# --recheck option to rerun configure.
+#
+EOF
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, don't put newlines in cache variables' values.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(set) 2>&1 |
+ case `(ac_space=' '; set | grep ac_space) 2>&1` in
+ *ac_space=\ *)
+ # `set' does not quote correctly, so add quotes (double-quote substitution
+ # turns \\\\ into \\, and sed turns \\ into \).
+ sed -n \
+ -e "s/'/'\\\\''/g" \
+ -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p"
+ ;;
+ *)
+ # `set' quotes correctly as required by POSIX, so do not add quotes.
+ sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p'
+ ;;
+ esac >> confcache
+if cmp -s $cache_file confcache; then
+ :
+else
+ if test -w $cache_file; then
+ echo "updating cache $cache_file"
+ cat confcache > $cache_file
+ else
+ echo "not updating unwritable cache $cache_file"
+ fi
+fi
+rm -f confcache
+
+trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# Any assignment to VPATH causes Sun make to only execute
+# the first set of double-colon rules, so remove it if not needed.
+# If there is a colon in the path, we need to keep it.
+if test "x$srcdir" = x.; then
+ ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d'
+fi
+
+trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15
+
+# Transform confdefs.h into DEFS.
+# Protect against shell expansion while executing Makefile rules.
+# Protect against Makefile macro expansion.
+cat > conftest.defs <<\EOF
+s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%-D\1=\2%g
+s%[ `~#$^&*(){}\\|;'"<>?]%\\&%g
+s%\[%\\&%g
+s%\]%\\&%g
+s%\$%$$%g
+EOF
+DEFS=`sed -f conftest.defs confdefs.h | tr '\012' ' '`
+rm -f conftest.defs
+
+
+# Without the "./", some shells look in PATH for config.status.
+: ${CONFIG_STATUS=./config.status}
+
+echo creating $CONFIG_STATUS
+rm -f $CONFIG_STATUS
+cat > $CONFIG_STATUS <<EOF
+#! /bin/sh
+# Generated automatically by configure.
+# Run this file to recreate the current configuration.
+# This directory was configured as follows,
+# on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+#
+# $0 $ac_configure_args
+#
+# Compiler output produced by configure, useful for debugging
+# configure, is in ./config.log if it exists.
+
+ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]"
+for ac_option
+do
+ case "\$ac_option" in
+ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+ echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion"
+ exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;;
+ -version | --version | --versio | --versi | --vers | --ver | --ve | --v)
+ echo "$CONFIG_STATUS generated by autoconf version 2.13"
+ exit 0 ;;
+ -help | --help | --hel | --he | --h)
+ echo "\$ac_cs_usage"; exit 0 ;;
+ *) echo "\$ac_cs_usage"; exit 1 ;;
+ esac
+done
+
+ac_given_srcdir=$srcdir
+
+trap 'rm -fr `echo "Makefile" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
+EOF
+cat >> $CONFIG_STATUS <<EOF
+
+# Protect against being on the right side of a sed subst in config.status.
+sed 's/%@/@@/; s/@%/@@/; s/%g\$/@g/; /@g\$/s/[\\\\&%]/\\\\&/g;
+ s/@@/%@/; s/@@/@%/; s/@g\$/%g/' > conftest.subs <<\\CEOF
+$ac_vpsub
+$extrasub
+s%@SHELL@%$SHELL%g
+s%@CFLAGS@%$CFLAGS%g
+s%@CPPFLAGS@%$CPPFLAGS%g
+s%@CXXFLAGS@%$CXXFLAGS%g
+s%@FFLAGS@%$FFLAGS%g
+s%@DEFS@%$DEFS%g
+s%@LDFLAGS@%$LDFLAGS%g
+s%@LIBS@%$LIBS%g
+s%@exec_prefix@%$exec_prefix%g
+s%@prefix@%$prefix%g
+s%@program_transform_name@%$program_transform_name%g
+s%@bindir@%$bindir%g
+s%@sbindir@%$sbindir%g
+s%@libexecdir@%$libexecdir%g
+s%@datadir@%$datadir%g
+s%@sysconfdir@%$sysconfdir%g
+s%@sharedstatedir@%$sharedstatedir%g
+s%@localstatedir@%$localstatedir%g
+s%@libdir@%$libdir%g
+s%@includedir@%$includedir%g
+s%@oldincludedir@%$oldincludedir%g
+s%@infodir@%$infodir%g
+s%@mandir@%$mandir%g
+s%@host@%$host%g
+s%@host_alias@%$host_alias%g
+s%@host_cpu@%$host_cpu%g
+s%@host_vendor@%$host_vendor%g
+s%@host_os@%$host_os%g
+s%@target@%$target%g
+s%@target_alias@%$target_alias%g
+s%@target_cpu@%$target_cpu%g
+s%@target_vendor@%$target_vendor%g
+s%@target_os@%$target_os%g
+s%@build@%$build%g
+s%@build_alias@%$build_alias%g
+s%@build_cpu@%$build_cpu%g
+s%@build_vendor@%$build_vendor%g
+s%@build_os@%$build_os%g
+s%@CC@%$CC%g
+s%@subdirs@%$subdirs%g
+s%@SET_MAKE@%$SET_MAKE%g
+s%@SUBDIRS@%$SUBDIRS%g
+
+CEOF
+EOF
+
+cat >> $CONFIG_STATUS <<\EOF
+
+# Split the substitutions into bite-sized pieces for seds with
+# small command number limits, like on Digital OSF/1 and HP-UX.
+ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script.
+ac_file=1 # Number of current file.
+ac_beg=1 # First line for current file.
+ac_end=$ac_max_sed_cmds # Line after last line for current file.
+ac_more_lines=:
+ac_sed_cmds=""
+while $ac_more_lines; do
+ if test $ac_beg -gt 1; then
+ sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file
+ else
+ sed "${ac_end}q" conftest.subs > conftest.s$ac_file
+ fi
+ if test ! -s conftest.s$ac_file; then
+ ac_more_lines=false
+ rm -f conftest.s$ac_file
+ else
+ if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds="sed -f conftest.s$ac_file"
+ else
+ ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file"
+ fi
+ ac_file=`expr $ac_file + 1`
+ ac_beg=$ac_end
+ ac_end=`expr $ac_end + $ac_max_sed_cmds`
+ fi
+done
+if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds=cat
+fi
+EOF
+
+cat >> $CONFIG_STATUS <<EOF
+
+CONFIG_FILES=\${CONFIG_FILES-"Makefile"}
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then
+ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+ case "$ac_file" in
+ *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
+ ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+ *) ac_file_in="${ac_file}.in" ;;
+ esac
+
+ # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories.
+
+ # Remove last slash and all that follows it. Not all systems have dirname.
+ ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
+ if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
+ # The file is in a subdirectory.
+ test ! -d "$ac_dir" && mkdir "$ac_dir"
+ ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`"
+ # A "../" for each directory in $ac_dir_suffix.
+ ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'`
+ else
+ ac_dir_suffix= ac_dots=
+ fi
+
+ case "$ac_given_srcdir" in
+ .) srcdir=.
+ if test -z "$ac_dots"; then top_srcdir=.
+ else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;;
+ /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;;
+ *) # Relative path.
+ srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix"
+ top_srcdir="$ac_dots$ac_given_srcdir" ;;
+ esac
+
+
+ echo creating "$ac_file"
+ rm -f "$ac_file"
+ configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure."
+ case "$ac_file" in
+ *Makefile*) ac_comsub="1i\\
+# $configure_input" ;;
+ *) ac_comsub= ;;
+ esac
+
+ ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
+ sed -e "$ac_comsub
+s%@configure_input@%$configure_input%g
+s%@srcdir@%$srcdir%g
+s%@top_srcdir@%$top_srcdir%g
+" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file
+fi; done
+rm -f conftest.s*
+
+EOF
+cat >> $CONFIG_STATUS <<EOF
+
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+
+exit 0
+EOF
+chmod +x $CONFIG_STATUS
+rm -fr confdefs* $ac_clean_files
+test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1
+
+if test "$no_recursion" != yes; then
+
+ # Remove --cache-file and --srcdir arguments so they do not pile up.
+ ac_sub_configure_args=
+ ac_prev=
+ for ac_arg in $ac_configure_args; do
+ if test -n "$ac_prev"; then
+ ac_prev=
+ continue
+ fi
+ case "$ac_arg" in
+ -cache-file | --cache-file | --cache-fil | --cache-fi \
+ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+ ac_prev=cache_file ;;
+ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+ ;;
+ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+ ac_prev=srcdir ;;
+ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+ ;;
+ *) ac_sub_configure_args="$ac_sub_configure_args $ac_arg" ;;
+ esac
+ done
+
+ for ac_config_dir in $SUBDIRS; do
+
+ # Do not complain, so a configure script can configure whichever
+ # parts of a large source tree are present.
+ if test ! -d $srcdir/$ac_config_dir; then
+ continue
+ fi
+
+ echo configuring in $ac_config_dir
+
+ case "$srcdir" in
+ .) ;;
+ *)
+ if test -d ./$ac_config_dir || mkdir ./$ac_config_dir; then :;
+ else
+ { echo "configure: error: can not create `pwd`/$ac_config_dir" 1>&2; exit 1; }
+ fi
+ ;;
+ esac
+
+ ac_popdir=`pwd`
+ cd $ac_config_dir
+
+ # A "../" for each directory in /$ac_config_dir.
+ ac_dots=`echo $ac_config_dir|sed -e 's%^\./%%' -e 's%[^/]$%&/%' -e 's%[^/]*/%../%g'`
+
+ case "$srcdir" in
+ .) # No --srcdir option. We are building in place.
+ ac_sub_srcdir=$srcdir ;;
+ /*) # Absolute path.
+ ac_sub_srcdir=$srcdir/$ac_config_dir ;;
+ *) # Relative path.
+ ac_sub_srcdir=$ac_dots$srcdir/$ac_config_dir ;;
+ esac
+
+ # Check for guested configure; otherwise get Cygnus style configure.
+ if test -f $ac_sub_srcdir/configure; then
+ ac_sub_configure=$ac_sub_srcdir/configure
+ elif test -f $ac_sub_srcdir/configure.in; then
+ ac_sub_configure=$ac_configure
+ else
+ echo "configure: warning: no configuration information is in $ac_config_dir" 1>&2
+ ac_sub_configure=
+ fi
+
+ # The recursion is here.
+ if test -n "$ac_sub_configure"; then
+
+ # Make the cache file name correct relative to the subdirectory.
+ case "$cache_file" in
+ /*) ac_sub_cache_file=$cache_file ;;
+ *) # Relative path.
+ ac_sub_cache_file="$ac_dots$cache_file" ;;
+ esac
+
+ echo "running ${CONFIG_SHELL-/bin/sh} $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_sub_srcdir"
+ # The eval makes quoting arguments work.
+ if eval ${CONFIG_SHELL-/bin/sh} $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_sub_srcdir
+ then :
+ else
+ { echo "configure: error: $ac_sub_configure failed for $ac_config_dir" 1>&2; exit 1; }
+ fi
+ fi
+
+ cd $ac_popdir
+ done
+fi
+
diff --git a/winsup/configure.in b/winsup/configure.in
new file mode 100755
index 000000000..14aaa0dea
--- /dev/null
+++ b/winsup/configure.in
@@ -0,0 +1,65 @@
+dnl Autoconf configure script for Cygwin.
+dnl Copyright 1996, 1997, 1998 Cygnus Solutions.
+dnl
+dnl This file is part of Cygwin.
+dnl
+dnl This software is a copyrighted work licensed under the terms of the
+dnl Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+dnl details.
+dnl
+dnl Process this file with autoconf to produce a configure script.
+
+AC_PREREQ(2.12)dnl
+AC_INIT(Makefile.in)
+
+dnl FIXME: We temporarily define our own version of AC_PROG_CC. This is
+dnl copied from autoconf 2.12, but does not call AC_PROG_CC_WORKS. We
+dnl are probably using a cross compiler, which will not be able to fully
+dnl link an executable. This should really be fixed in autoconf
+dnl itself.
+
+AC_DEFUN(LIB_AC_PROG_CC,
+[AC_BEFORE([$0], [AC_PROG_CPP])dnl
+AC_CHECK_TOOL(CC, gcc, gcc)
+if test -z "$CC"; then
+ AC_CHECK_PROG(CC, cc, cc, , , /usr/ucb/cc)
+ test -z "$CC" && AC_MSG_ERROR([no acceptable cc found in \$PATH])
+fi
+
+AC_PROG_CC_GNU
+
+if test $ac_cv_prog_gcc = yes; then
+ GCC=yes
+dnl Check whether -g works, even if CFLAGS is set, in case the package
+dnl plays around with CFLAGS (such as to build both debugging and
+dnl normal versions of a library), tasteless as that idea is.
+ ac_test_CFLAGS="${CFLAGS+set}"
+ ac_save_CFLAGS="$CFLAGS"
+ CFLAGS=
+ AC_PROG_CC_G
+ if test "$ac_test_CFLAGS" = set; then
+ CFLAGS="$ac_save_CFLAGS"
+ elif test $ac_cv_prog_cc_g = yes; then
+ CFLAGS="-g -O2"
+ else
+ CFLAGS="-O2"
+ fi
+ if test "$ac_test_CXXFLAGS" != set; then
+ CXXFLAGS='$(CFLAGS)'
+ fi
+else
+ GCC=
+ test "${CFLAGS+set}" = set || CFLAGS="-g"
+fi
+])
+
+AC_CANONICAL_SYSTEM
+
+LIB_AC_PROG_CC
+
+SUBDIRS="cygwin w32api mingw utils doc"
+AC_CONFIG_SUBDIRS($SUBDIRS)
+AC_PROG_MAKE_SET
+
+AC_SUBST(SUBDIRS)
+AC_OUTPUT(Makefile)
diff --git a/winsup/cygwin/CYGWIN_LICENSE b/winsup/cygwin/CYGWIN_LICENSE
new file mode 100644
index 000000000..f10b01f56
--- /dev/null
+++ b/winsup/cygwin/CYGWIN_LICENSE
@@ -0,0 +1,46 @@
+--------------------------------------------------------------------------
+This program is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License (GPL) as published by
+the Free Software Foundation; either version 2 of the License, or (at
+your option) any later version.
+
+This program 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 General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+--------------------------------------------------------------------------
+
+ *** NOTE ***
+
+In accordance with section 10 of the GPL, Cygnus permits programs whose
+sources are distributed under a license that complies with the Open
+Source definition to be linked with libcygwin.a without libcygwin.a
+itself causing the resulting program to be covered by the GNU GPL.
+
+This means that you can port an Open Source(tm) application to cygwin,
+and distribute that executable as if it didn't include a copy of
+libcygwin.a linked into it. Note that this does not apply to the cygwin
+DLL itself. If you distribute a (possibly modified) version of the DLL
+you must adhere to the terms of the GPL, i.e., you must provide sources
+for the cygwin DLL.
+
+See http://www.opensource.org/osd.html for the precise Open Source
+Definition referenced above.
+
+If you have questions about any of the above or would like to arrange
+for other licensing terms, please contact Cygnus using the information
+given below:
+
+ Cygnus Solutions
+ 1325 Chesapeake Terrace
+ Sunnyvale, CA 94089
+ USA
+
+ +1 408 542 9600
+ hotline: +1 408 542 9601
+ email: info@cygnus.com
+ fax: +1 408 542 9699
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
new file mode 100644
index 000000000..70651d065
--- /dev/null
+++ b/winsup/cygwin/ChangeLog
@@ -0,0 +1,229 @@
+Mon Feb 7 16:50:44 2000 Christopher Faylor <cgf@cygnus.com>
+
+ * Makefile.in: cygrun needs libshell32.a.
+
+Sun Feb 6 22:17:58 2000 Christopher Faylor <cgf@cygnus.com>
+
+ * sigproc.cc (proc_subproc): Simplify case for when a child process is
+ stopped since new signal handler ensures the desired behavior.
+
+Sun Feb 6 21:52:33 2000 Christopher Faylor <cgf@cygnus.com>
+
+ * Makefile.in: Fix install target so that directories will be created
+ when necessary.
+
+Sun Feb 6 18:12:17 2000 Christopher Faylor <cgf@cygnus.com>
+
+ * Makefile.in: exceptions.cc should depend on autoload.h.
+ * exceptions.cc: Undef DECLSPEC_IMPORT prior to including imagehlp.h to
+ avoid defining StackWalk as "import".
+ (call_handler): Minor optimizations.
+ (sig_handle_tty_stop): Fix typo in previous checkin.
+ * sigproc.cc (sigproc_init): Ditto, for signal_arrived initialization.
+
+Sat Feb 5 15:37:37 2000 Christopher Faylor <cgf@cygnus.com>
+
+ * dcrt0.cc (isquote): Convert to inline function.
+
+Sat Feb 5 00:26:01 2000 Christopher Faylor <cgf@cygnus.com>
+
+ Throughout, rename global_signal_arrived to signal_arrived.
+ Throughout, eliminate use of arm_signals and __signal_arrived.
+ Throughout, revert to use of simple call to WaitForSingleObject or
+ WaitForMultipleObjects.
+ * debug.h: Eliminate obsolete function declaration.
+ * exceptions.cc (sigWaitForSingleObject): Eliminate obsolete function
+ definition.
+ * fhandler.h: Reflect change to select_stuff wait method.
+ * fhandler_tape.cc (get_ll): Accomodate new w32api LARGE_INTEGER
+ definition.
+ * ntea.c (NTReadEARaw): Ditto.
+ (NTWriteEA): Ditto.
+ * security.cc (ReadSD): Ditto.
+ (WriteSD): Ditto.
+ * syscalls.cc (_link): Ditto.
+ * uname.cc (uname): Eliminate PPC switch.
+
+2000-02-01 Salvador Eduardo Tropea <salvador@inti.gov.ar>
+
+ * include/io.h: add return type to setmode()
+
+2000-01-27 DJ Delorie <dj@cygnus.com>
+
+ * include/netdb.h (h_errno): change __imp_ to dllimport
+ * cygwin.din (reent_data): add DATA
+
+Thu Jan 27 01:07:14 2000 Christopher Faylor <cgf@cygnus.com>
+
+ * exceptions.cc (call_handler): Add debugging output.
+ * select.cc (MAKEready): Arm signals earlier.
+ * sigproc.cc (__signal_arrived:arm): Move debugging version of this
+ method here.
+ (__signal_arrived::release): Ditto.
+ * sigproc.h: Recognize debugging versions of above two methods.
+ (arm_signals::WaitForMultipleObjects): Don't release signal lock unless
+ signal arrived.
+ (arm_signals::WaitForMultipleSingleObject): Ditto.
+ (arm_signals::MsgWaitForMultipleObjects): Ditto.
+
+Thu Jan 27 00:19:26 2000 Christopher Faylor <cgf@cygnus.com>
+
+ * sync.h (new_muto): Workaround change in gcc behavior.
+
+Wed Jan 26 12:57:13 2000 Christopher Faylor <cgf@cygnus.com>
+
+ * Makefile.in: Ensure that all required libraries are built prior
+ to linking cygrun.exe.
+
+Tue Jan 25 21:26:57 2000 Christopher Faylor <cgf@cygnus.com>
+
+ * exceptions.cc (sig_handle): Crudely work around potential problem
+ when main thread has a lock but is killed by a fatal signal.
+ * fhandler_tty.cc (fhandler_pty_master::write): Don't perform line
+ editing on the pty master (so why do we need the second argument to
+ line_edit, then?)
+ * thread.cc: Reformat to GNU standards.
+
+2000-01-11 DJ Delorie <dj@cygnus.com>
+
+ * ROADMAP: new
+
+2000-01-11 DJ Delorie <dj@cygnus.com>
+
+ * fhandler_zero.cc: new, emulate /dev/zero
+ * testsuite/winsup.api/devzero.c: new, test /dev/zero
+ * Makefile.in: build fhandler_zero.o
+ * fhandler.h: add support for /dev/zero
+ * hinfo.cc: ditto
+ * path.cc: ditto
+
+2000-01-11 DJ Delorie <dj@cygnus.com>
+
+ * mmap.cc (mmap): MSDN says *one* of FILE_MAP_*, fix flags for
+ MAP_PRIVATE.
+
+Mon Jan 10 01:11:00 2000 Corinna Vinschen <corinna@vinschen.de>
+
+ * security.cc (acl_access): New function.
+ * syscalls.cc (access): Call acl_access if ntsec is on.
+
+Mon Jan 10 01:11:00 2000 Corinna Vinschen <corinna@vinschen.de>
+
+ * fhandler.cc (get_file_owner): Use of ReadSD() instead of
+ GetFileSecurity().
+ (get_file_group): Ditto.
+
+Sun Jan 9 15:43:07 2000 Christopher Faylor <cgf@cygnus.com>
+
+ * debug.cc (struct thread_start): Add a flag to determine whether a
+ field is in use. Eliminate thread_start_ix since it was not
+ thread-safe.
+ (thread_stub): Use notavail flag to control whether the entry in
+ start_buf can be reused.
+ (makethread): Ditto.
+
+Sun Jan 9 20:18:00 2000 Corinna Vinschen <corinna@vinschen.de>
+
+ * security.cc (alloc_sd): Rearrange order of ACE creation.
+ (setacl): Optimize creation of ACEs related to inheritance. Code
+ cleanup.
+ (aclcheck): Disable check for existance of DEF_)CLASS_OBJ.
+
+Sat Jan 8 18:42:32 2000 Christopher Faylor <cgf@cygnus.com>
+
+ * mkvers.h: Reorg fix.
+
+Sat Jan 8 20:00:00 2000 Corinna Vinschen <corinna@vinschen.de>
+
+ * cygwin.din: Add new acl API calls.
+ * grp.cc (getgroups): Change to work for any username.
+ * security.cc (get_id_from_sid): Change to work with acl API.
+ (is_grp_member): New function.
+ (get_nt_attribute): Rewritten.
+ (add_access_allowed_ace): New function.
+ (add_access_denied_ace): Ditto.
+ (alloc_sd): Rewritten.
+ (setacl): New function.
+ (getace): Ditto.
+ (searchace): Ditto.
+ (getacl): Ditto.
+ (acl): Ditto.
+ (facl): Ditto.
+ (aclcheck): Ditto.
+ (acecmp): Ditto.
+ (aclsort): Ditto.
+ (acltomode): Ditto.
+ (aclfrommode): Ditto.
+ (acltopbits): Ditto.
+ (aclfrompbits): Ditto.
+ (permtostr): Ditto.
+ (acltotext): Ditto.
+ (permfromstr): Ditto.
+ (aclfromtext): Ditto.
+ * syscalls.cc (access): Set errno again when needed.
+ * include/cygwin/acl.h: New file.
+ * include/sys/acl.h: Ditto.
+
+Sat Jan 8 14:46:19 2000 Christopher Faylor <cgf@cygnus.com>
+
+ * Makefile.in: Add cygwin DLL specific CFLAGS define.
+
+Fri Jan 7 21:01:57 2000 Christopher Faylor <cgf@cygnus.com>
+
+ * exceptions.cc (interrupt_on_return): Properly coerce assignment of
+ sigsave.func.
+
+2000-01-07 Mumit Khan <khan@xraylith.wisc.edu>
+
+ * acconfig.h: New file.
+ * configure.in Add check for memset builtin.
+ (AC_CONFIG_HEADER): Use.
+ (STRACE_HHMMSS): Define instead of substituting.
+ (_MT_SAFE): Likewise.
+ (_CYG_THREAD_FAILSAFE): Likewise.
+ (DEBUGGING): Likewise.
+ (MT_SAFE): Substitute as a yes/no variable.
+ * Makefile.in: Remove DEBUGGING, STRACE_HHMMSS, and THREAD_FAILSAFE
+ variables and add DEFS. Update usage of MT_SAFE to reflect yes/no
+ values. Add config.h to winsup.h dependency.
+ (CFLAGS_CONFIG): Update.
+ (INCLUDES): Prepend `-I.'.
+ * utils/Makefile.in (INCLUDES): Likewise.
+ * winsup.h: Conditionally include config.h.
+ * thread.cc: Likewise.
+ * config.h.in: Generate new file.
+ * configure: Regenerate.
+
+
+Fri Jan 7 16:21:01 2000 Christopher Faylor <cgf@cygnus.com>
+
+ * dcrt0.cc (dll_crt0): Allow signal handling for dynamically loaded
+ case.
+
+Thu Jan 6 00:30:12 2000 Corinna Vinschen <corinna@vinschen.de>
+
+ * path.cc (symlink_check_one): Initialize local variable `unixattr'
+ before calling `get_file_attribute'.
+ * syscalls.cc (chown): Ditto.
+ * security.cc (get_nt_attribute): Eliminate attribute copying from
+ world to user/group in case of missing ACEs.
+ (alloc_sd): Set special rights for administrators group only if it's
+ neither owner nor group.
+ * utils/mkpasswd.c: Create entry for local group administrators (SID
+ 544).
+
+Thu Jan 6 00:21:31 2000 Christopher Faylor <cgf@cygnus.com>
+
+ Change function calls to __stdcall throughout.
+ * exceptions.cc (handle_exceptions): Probe stack for return address to
+ use with new signal method. Fill out sigsave.cx with this information.
+ (call_handler): Use sigsave.cx if it is available, rather than trying
+ to find the context of the main thread.
+ (interrupt_on_return): Use address of context rather than
+ pass-by-reference.
+ (interrupt_now): Ditto.
+
+Thu Jan 6 00:21:31 2000 Corinna Vinschen <corinna@vinschen.de>
+
+ * grp.cc (getgroups): Return supplementary groups now.
+ * include/limits.h: Define NGROUP_MAX as 16 now.
diff --git a/winsup/cygwin/ChangeLog-1995 b/winsup/cygwin/ChangeLog-1995
new file mode 100644
index 000000000..462a61336
--- /dev/null
+++ b/winsup/cygwin/ChangeLog-1995
@@ -0,0 +1,177 @@
+Mon Dec 18 16:44:38 1995 Jason Molenda (crash@phydeaux.cygnus.com)
+
+ * configure.in (target_cpu): specify valid Intel x86 architectures
+ explicitly.
+
+Mon Dec 18 15:04:29 1995 Jason Molenda (crash@phydeaux.cygnus.com)
+
+ * sysdef/*.def: moved to sysdef/i386/.
+
+Mon Dec 18 15:00:56 1995 Jason Molenda (crash@phydeaux.cygnus.com)
+
+ * configure.in: Set DLL_ENTRY and SYSDEF_DIR for i386 and powerpc.
+ * configure: Regenerated with autoconf 2.7.
+
+ * Makefile.in: Use DLL_ENTRY and SYSDEF_DIR.
+
+Sat Dec 16 18:36:44 1995 steve chamberlain <sac@slash.cygnus.com>
+
+ Changed the way that file handles are inherited. Now
+ all files are opened with the inheriting turned on, and they're
+ closed when necessary.
+
+ Changed the way that children are waited for. Now
+ you can exec a non-gnuwin32 program and wait for its
+ result.
+
+ * Makefile.in: Turn off frame-pointer.
+ * dcrt0.cc (environ_init): Lint.
+ * dirsearch.cc (opendir): Use new path_conv mechanism.
+ * exceptions.cc (ctrl_c_handler): Exit with correct status
+ * exec.cc (file_exists): Moved to paths.cc
+ (_execve): Moved most of the work into spawn.cc.
+ * fhandler.cc (*): Much.
+ * libccrt0.c (foo): Deleted.
+ (cygwin_crt0): Lint.
+ * path.cc (readlink): Initialize the SECURITY_ATTRIBUTES struct.
+ * pipe.cc (pipe, dup*): Reorganized.
+ * registry.cc (read_in): Create the key in CURRENT_USER.
+ * wait.cc, spawn.cc (*): Much.
+ * sysconf.cc (sysconf): Understand SC_PAGESIZE.
+ * times.cc (utime): New function.
+ * uname.cc (uname): Dig out more info.
+
+Wed Dec 13 05:54:55 1995 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * dcrt0.cc (environ_init): Cast alloca return to appropriate type.
+ * spawn.cc (spawn_guts): Ditto.
+
+ * strace.cc (__small_{v,}sprintf): Add appropriate prototypes.
+
+ * exceptions.cc (_except_list): Only use segments for 386 systems.
+ (__stack_trace): Add PowerPC support, and do nothing for systems
+ that are not supported except print stack tracing is not yet
+ support.
+
+ * sdata.cc (import_term): Only use __attribute__((section)) on 386
+ systems.
+
+ * shared.cc (shared_init): Use MARK macro instead of calling mark
+ directly with incorrect type arguments.
+
+ * fhandler.cc (fhandler_dev_null::{read,write}): Use size_t in
+ prototype, not unsigned int.
+
+ * fork.cc (find_exec): Fix type errors.
+ * path.cc (path_to_real_path_keep_rel): Ditto.
+ * syscalls.h (PATH_TO_REAL_PATH): Ditto.
+
+ * {longjmp,setjmp}.c: #ifdef i386 code.
+
+ * include/wintypes.h (ExitProcess): Add
+ __attribute__((__noreturn__)) so exit compiles without warnings.
+
+Tue Dec 12 18:25:05 1995 Jason Molenda (crash@phydeaux.cygnus.com)
+
+ * include/wintypes.h (WINAPI): Only define WINAPI for x86 systems.
+
+Tue Dec 5 16:00:05 1995 Jason Molenda (crash@phydeaux.cygnus.com)
+
+ * Makefile.in (all): Only build documentation for info target.
+ Expect texi2html to not be found most of the time.
+
+Tue Dec 5 08:08:08 1995 steve chamberlain <sac@slash.cygnus.com>
+
+ Release-B10
+
+ * cygwin.dll (__assert, wait, spawnv, spawnvp): Deleted.
+ * dcrt0.c: Quoting rewritten.
+ * exec.cc (file_exists): Use new path_conv mechanism.
+ (_execve): Close open child process handles.
+ * fhandler.cc (fhandler_normal::open): Follow symlinks.
+ (fhandler_normal::read): Keep track of logical file posision.
+ (fhandler_normal::lseek): Seek in text files correctly.
+ (fhandler_normal::fstat): Set IFLNK bit if its a symlink.
+ (fhandler_normal::init): Maintain is_pipe.
+ (fhandler_dev_null::fstat): New.
+ (fhandler_dev_null::get_handle): Return INVALID_HANDLE.
+ * fork.cc: Use new event mechanism.
+ * libccrt0.cc: Keep track of _fmode variable.
+ * misc.c (readlink): Delete.
+ * path.cc (__path_to_real_path_1): Allow /d<letter> mechanism.
+ (path_to_real_path_keep_rel): New
+ (link_cookie:*): Support for symbolic links.
+ * spawn.cc (spawn_guts): Quoting rewritten.
+ * times.cc: New.
+ * syscalls.cc (_stat_worker): New.
+ (_stat, _lstat): Use _stat_worker.
+ * sysconf.cc (sysconf): Support _SC_CLK_TCK.
+
+Tue Nov 28 15:29:38 1995 steve chamberlain <sac@slash.cygnus.com>
+
+ * loads of stuff. When I make < 100k of diffs in a day,
+ the ChangeLog will be usefull.
+
+Tue Nov 21 18:01:39 1995 steve chamberlain <sac@slash.cygnus.com>
+
+ * Makefile.in: Build the doc.
+ * exceptions.cc: lint.
+ * fork.cc: lint.
+ * shared.cc (shared_init): If MapViewOfFileEx fails, then try
+ again, but get the OS to select the address (for win95)
+ * strace.cc (__sysprintf): Print pid and state in hex.
+ * syscalls.cc (_unlink): Translate path to realpath.
+
+Wed Nov 15 23:47:43 1995 Jason Molenda (crash@phydeaux.cygnus.com)
+
+ * spawn.cc (_exit): set return value's lower byte to 0 by default.
+
+ Tue Oct 3 10:23:14 1995 Anders Blomdell (anders.blomdell@control.lth.se)
+
+ * spawn.cc (spawn_guts): quote doublequotes correctly
+
+Tue Nov 14 15:05:33 1995 Jason Molenda (crash@phydeaux.cygnus.com)
+
+ * configure.in: comment out call to cfg-ml-com.in.
+
+Tue Oct 31 11:19:18 1995 steve chamberlain <sac@slash.cygnus.com>
+
+ * libcerr.cc: New file.
+ * dcrt0.cc (environ_init): Initialize PATH and friends nicely.
+ * exceptions.cc (ctrl_c_handler): Default case is to exit.
+ * fork.cc (__suffixy, find_exec): translate between paths and
+ real_paths.
+ * shared.cc (shared_init): Hard wire shared memory at 0xa0000000.
+ * syscalls.c (__path_to_real_path, real_path_to_path): Always
+ translate '/' <> '\'
+
+Mon Oct 30 17:36:10 1995 steve chamberlain <sac@slash.cygnus.com>
+
+ * syscalls.cc (_rename): Fix for win95.
+
+Fri Oct 27 20:53:47 1995 steve chamberlain <sac@slash.cygnus.com>
+
+ * Everything changed.
+
+Thu Oct 19 10:47:52 1995 steve chamberlain <sac@slash.cygnus.com>
+
+ * registry.cc, uinfo.cc: New files.
+ * crt0.c (*uinfo*, *_exe_suffix*): Delete.
+ (dll_crt0): Call shared_init.
+ * getlogin.c: deleted.
+ * shared.cc: Fill in.
+ * spawn.c (_spawn): Use __exe_suffix function.
+ * syscalls.c (getuid, getgid): Moved into uinfo.cc
+ * syscalls.h (*uinfo, __exe_suffix): Deleted
+ * Makefile.in: Cope with target configury.
+ * termios.c: Fix stub prototypes.
+ * win.h: Deleted.
+ * include/winadvapi.h: Fill in some REG prototypes.
+
+Thu Oct 19 10:47:52 1995 steve chamberlain <sac@slash.cygnus.com>
+
+ * Makefile.in: Cope with target configury.
+
+Wed Oct 18 15:34:49 1995 steve chamberlain <sac@slash.cygnus.com>
+
+ * Moved from newlib.
diff --git a/winsup/cygwin/ChangeLog-1996 b/winsup/cygwin/ChangeLog-1996
new file mode 100644
index 000000000..b0c88d97b
--- /dev/null
+++ b/winsup/cygwin/ChangeLog-1996
@@ -0,0 +1,2031 @@
+Mon Dec 23 13:35:27 1996 Jeremy Allison <jra@cygnus.com>
+
+ * Makefile.in: Added $(srcdir)/../libstdc++/stl -I$(srcdir)/../libio
+ to the include path. As mmap uses STL then this is needed
+ to build the cross compiler. Also added mmap.o file.
+ * cygwin.din: Added mmap, mprotect, msync, munmap.
+ * dcrt0.cc: Added code to get the module pathname from
+ a previously unused field in the u area so fork() calls
+ don't have to search the path. Forwards compatible with
+ earlier releases as they set this field to zero.
+ * fork.cc: Added call to recreate_mmaps_after_fork() in
+ child code. Ensures child has same view of mmap'ed areas
+ as parent.
+ * libccrt0.cc: (See dcrt0.cc change). Setup the module
+ handle so fork can get the path name.
+ * mmap.cc: New file. Implements mmap, mprotect, msync, munmap,
+ recreate_mmaps_after_fork. Uses STL.
+ * select.cc: Added code to set errno to EINVAL if select done
+ on handles and sockets. Must fix this soon.
+ * spawn.cc: Set new variable hmodule in u area to zero for child.
+ * syscalls.cc: Added fsync functionality. No longer a dummy call.
+ * winsup.h: Decremented internal_reserved array by one to add
+ hmodule in u area. Added prototype for recreate_mmaps_after_fork().
+ * include/sys/mman.h: Fixed include file for mmap calls.
+
+Tue Dec 17 16:20:52 1996 Geoffrey Noer <noer@cygnus.com>
+
+ * syscalls.cc (_rename): fix code so we really do
+ return -1 if _rename fails.
+
+Tue Dec 17 12:12:29 1996 Jeremy Allison <jra@cygnus.com>
+
+ * fhandler.cc: Added Sergeys patch for FakeReadFile.
+ * cygwin.din: Re-ordered network calls.
+
+Mon Dec 16 16:47:26 1996 Geoffrey Noer <noer@cygnus.com>
+
+ * configure.in: remove AC_C_CROSS (now part of AC_PROG_CC)
+ * utils/configure.in: ditto
+ * configure: regenerate
+ * utils/configure: regenerate
+
+Mon Dec 16 14:50:46 1996 Geoffrey Noer <noer@cygnus.com>
+
+ * cygwin.din: export cygwin32_getsockopt
+
+ patch from sos@prospect.com.ru (Sergey Okhapkin):
+ * spawn.cc: don't assume all scripts should be run in
+ bash -- run the shell specified after the #!
+
+Fri Dec 13 16:18:22 1996 Jeremy Allison <jra@cygnus.com>
+
+ * path.cc: Added support for UNC paths.
+
+Fri Dec 13 10:56:21 1996 Jeremy Allison <jra@cygnus.com>
+
+ * cygwin.din: Added h_errno, seteuid, _seteuid.
+ * exceptions.cc: Made init_exceptions extern "C".
+ * exceptions.h: Added cplusplus wrappers to enable this to
+ be used from C.
+ * net.cc: Added error numbers, fixed gethostbyaddr, added h_errno
+ fixes.
+ * stubs.cc: Added seteuid.
+ * include/mywinsock.h: Added HOST error entries for DNS lookups.
+
+Tue Dec 10 15:38:46 1996 Geoffrey Noer <noer@cygnus.com>
+
+ * version.h: bump CYGWIN_DLL_VERSION_MINOR to 4
+
+ patch from Marcus Daniels <marcus@sysc.pdx.edu>:
+ * fhandler.cc: add fhandler_dev_null::dup (fhandler_base *child)
+ * fhandler.h: add matching header
+
+ gnu-win32 beta 17.1 release made
+
+Thu Dec 5 14:03:08 1996 Geoffrey Noer <noer@cygnus.com>
+
+ * select.cc: add missing end comment at about line 933.
+ gnu-win32 beta 17 release made
+
+Wed Dec 4 15:53:11 1996 Geoffrey Noer <noer@cygnus.com>
+
+ * version.h: increment minor dll number in conjunction
+ with gnu-win32 beta 17 release
+
+Tue Dec 3 15:05:57 1996 Geoffrey Noer <noer@cygnus.com>
+
+ * strsep.cc: new file containing Berkeley-copyrighted strsep
+ code previously in misc.cc.
+ * misc.cc: strsep moved to strsep.cc, stop including
+ unistd.h, strings.h, sys/types.h, stddef.h, and stdarg.h
+ * Makefile.in: appropriate adjustments to add strsep.cc
+
+Tue Dec 3 13:50:59 1996 Geoffrey Noer <noer@cygnus.com>
+
+ * include/sys/copying.dj: new file whose presence is
+ required by include/sys/file.h
+
+Tue Dec 3 13:37:27 1996 Geoffrey Noer <noer@cygnus.com>
+
+ Throughout all Cygnus-developped source files: put all
+ code under GPL
+
+Tue Dec 3 10:54:01 1996 Jeremy Allison <jra@cygnus.com>
+
+ * fork.cc: Changed code to delete [] saved child_hinfo
+ after allocate_pid called. Needed as child changes this
+ value in the shared area when it de-linearizes fd array.
+ Needed to stop race condition with earlier fix.
+ * winsup.h: Changed definition of item in hinfo to be
+ a char array rather than fhandler_console. Stops
+ destructor being called when fork delete [] of
+ hinfo array called.
+ * hinfo.cc: Changes (casts) to support winsup.h changes.
+
+Mon Dec 2 17:22:13 1996 Geoffrey Noer <noer@cygnus.com>
+
+ * include/utime.h: add ifdef _UTIME_U wrapper around header
+
+Mon Dec 2 15:45:46 1996 Jeremy Allison <jra@cygnus.com>
+
+ * fork.cc: Fixed file descriptor resource leak in parent.
+ * registry.cc: Removed fatal error if registry key cannot
+ be opened. Causes errors in service code.
+
+Wed Nov 27 15:40:15 1996 Geoffrey Noer <noer@cygnus.com>
+
+ * cygwin.din: for MS compatibility, also export functions
+ as _funcname = funcname
+ * include/netdb:
+ * include/sys/socket.h:
+ Do the equivalent thing for functions exported as cygwin32_funcname
+
+Wed Nov 27 15:14:30 1996 Geoffrey Noer <noer@cygnus.com>
+
+ * cygwin.din: remove exported helper functions that shouldn't
+ need to be exported (_read et al)
+ * glob/Makefile.in: add SHELL definition
+ * utils/Makefile.in: add SHELL definition
+
+Mon Nov 25 14:24:52 1996 Geoffrey Noer <noer@cygnus.com>
+
+ * include/commdlg.h, ddeml.h, winadvapi.h, winbase.h, wincon.h,
+ windef.h, windowsx.h, winerror.h, wingdi.h, winkernel.h, winnt.h,
+ wintypes.h, winuser.h, winversion.h:
+ Add MS-style header files back, each of which now includes our
+ windows.h. This should allow compilation of Windows code
+ that expects normal MS-named headers as long as the information
+ is in our windows.h somewhere. The appropriate wrappers have
+ been added to each file so windows.h isn't included more than
+ once.
+ * include/windows.h: add paranoia wrapper so it can be included
+ more than once.
+
+Mon Nov 18 22:19:40 1996 Geoffrey Noer <noer@cygnus.com>
+
+ * Makefile.in: change rules around so new-cygwin.dll is
+ only rebuilt when necessary
+ * spawn.cc: include <stdlib.h>
+
+Mon Nov 18 21:08:15 1996 Geoffrey Noer <noer@cygnus.com>
+
+ * net.cc: remove extern "C"s that shouldn't be there
+ (get_win95_ifconf, get_winnt_ifconf, get_if_flags)
+ * syscalls.cc: remove extern "C"s from num_entries, _stat_worker
+ * winsup.h: add extern "C"s for syscalls protos
+
+Mon Nov 18 20:35:39 1996 Geoffrey Noer <noer@cygnus.com>
+
+ * winsup.h: include version.h
+ * Makefile.in: remove dependencies involving version.h, but add
+ version.h to winsup.h dependency line and also add others that
+ should also be there.
+ * dcrt0.cc:
+ * libccrt0.cc:
+ * registry.cc:
+ * shared.cc: delete includes of version.h
+
+Mon Nov 18 20:16:37 1996 Geoffrey Noer <noer@cygnus.com>
+
+ * stubs.c -> stubs.cc, add extern "C"s
+ * uname.c -> uname.cc, add extern "C"s
+ * console.cc: add extern "C"s, remove include windows.h
+ since its already included in winsup.h
+ * dirsearch.cc: add extern "C"s
+ * fcntl.cc: add extern "C"s
+ * winsup.h: remove LEAN_AND_MEAN define since that's no longer
+ relevant with new windows headers, include version.h
+ * malloc.cc: fix typos
+
+Mon Nov 18 18:02:31 1996 Geoffrey Noer <noer@cygnus.com>
+
+ * grp.c renamed to grp.cc, add extern "C"s
+ * misc.c renamed to misc.cc, add extern "C"s
+
+Mon Nov 18 16:08:26 1996 Geoffrey Noer <noer@cygnus.com>
+
+ * syscalls.cc: extern "C"'d function calls
+ * net.cc: extern "C"'d function calls, some respacing
+ * hinfo.cc: extern "C"'d function calls, some respacing
+ * syscalls.h: removed defines for MIN, errno, alloca(x),
+ DEFAULT_GID/UID, NOT_OPEN_FD(fd), STD_RBITS et al,
+ O_NOSYMLINK
+ * winsup.h: added what was just deleted from syscalls.h
+
+Mon Nov 18 15:56:22 1996 Jeremy Allison <jra@cygnus.com>
+
+ * cygwin.din: Added readv
+ * syscalls.cc: Added readv code.
+ * syscalls.h: Added readv prototype.
+
+Wed Nov 13 15:55:14 1996 Geoffrey Noer <noer@cygnus.com>
+
+ * cygwin.din: added C++-related exports for stuff in
+ libgcc.a (from new.o, tinfo.o, tinfo2.o, exception.o).
+
+Mon Nov 11 15:50:26 1996 Geoffrey Noer <noer@cygnus.com>
+
+ * dcrt0.cc
+ * dirsearch.cc
+ * malloc.cc
+ * passwd.cc
+ * path.cc,
+ * pinfo.cc
+ * syslog.cc
+ * utils/kill.cc
+ * utils/cygwin.cc:
+ need to #include <stdlib.h> which used to be included
+ automatically in windows.h included by winsup.h.
+ * shared.cc: UnmapViewOfFile takes a void *, not a
+ const void *
+ * malloc.cc: formatting fixes
+
+Fri Nov 8 17:31:55 1996 Jeremy Allison <jra@cygnus.com>
+
+ * select.cc: Added fix for HANDLE select sent by
+ Sergey Okhapkin.
+ * fhandler.h: Changed dup to return int. Can now
+ return error to dup2.
+ * fhandler.cc: Changed dup to return error code.
+ Corrected fhandler_console::close to return
+ error code.
+ * hinfo.cc (dup2): Check return code from
+ fhandler->dup.
+ * times.cc: Changed DST calculation as tm struct
+ month starts at zero, NT wMonth starts at 1.
+ * TODO: Added the things i'd like to do.
+
+Wed Nov 6 17:42:31 1996 Geoffrey Noer <noer@cygnus.com>
+
+ * Makefile.in: Changed name of base file for cygwin.dll from
+ base to cygwin.base. Changed name of exp file for cygwin.dll
+ from win.exp to cygwin.exp. Updated dependency list, removing
+ recently removed files like libcfork.cc, added missing files,
+ and added all missing header dependencies. Small formatting
+ fixes.
+
+Fri Nov 1 16:38:48 1996 Geoffrey Noer <noer@cygnus.com>
+
+ * TODO: deleted old stuff from a long time ago, added some
+ new stuff
+
+ * added public domain disclaimers to all files missing them,
+ reformatting of non-imported code to conform to GNU standards.
+ Changes to:
+ delqueue.h, exceptions.h, fcntl.cc, fhandler.h, grp.c,
+ init.cc, ioctl.cc, key.cc, libcctype.c, libcerr.cc, libcmain.cc,
+ misc.c, path.h, pold.c, resource.cc, smallprint.c, strerror.cc,
+ syslog.cc, termios.cc, test.c, version.h, wait.cc
+
+Fri Nov 1 14:44:29 1996 Jeremy Allison <jra@cygnus.com>
+
+ * fhandler.h: Added is_console() method needed by
+ new select code.
+ * fhandler.cc (fhandler_console::init): Added c_oflag setting
+ dependent on bin parameter.
+ * select.cc: Added code to implement select from console
+ handles. Ignores keyup events and still blocks.
+
+Wed Oct 30 16:35:41 1996 Jeremy Allison <jra@cygnus.com>
+
+ * fhandler.h: Removed fhandler_console_in, fhandler_console_out
+ and integrated them both into fhandler_console. Added output_handle_
+ so fhandler console has two handles.
+ * fhandler.cc: Updated to support changes in fhandler.h. It is now
+ possible to open("/dev/tty") and read/write to the same fd.
+ * hinfo.cc(build_fhandler): Removed references to obsolete classes.
+ * spawn.cc: Changed to get correct reference to output_handle_ for
+ fhandler_console class.
+ * console.cc: Changed to get output handle rather than input handle.
+ * winsup.h: Changed definition of prototypes for functions changed
+ in console.cc
+
+Wed Oct 30 13:05:33 1996 Geoffrey Noer <noer@cygnus.com>
+
+ * include/custcntl.h
+ * include/features.h
+ * include/icmp.h
+ * include/wchar.h
+ * include/cygwin32/icmp.h
+ * include/cygwin32/ip.h
+ * include/cygwin32/sockios.h
+ * include/cygwin32/types.h
+ * include/cygwin32/uio.h
+ * include/sys/ttychars.h
+ Added comment with name of header to each so that these are no
+ longer empty files (some unzip programs won't create
+ zero-length files which is a problem for headers)
+
+Sun Oct 27 17:30:03 1996 Geoffrey Noer <noer@cygnus.com>
+
+ * cygwin.din: also export "_execl = execl" and the same
+ for _execle and _execlp
+
+Thu Oct 24 01:43:29 1996 Geoffrey Noer <noer@cygnus.com>
+
+ * include/windows.h: rewritten to include headers from
+ the include/Windows32 subdirectory
+ * winsup.h: no longer define MAX_PATH here since it's defined
+ in header files dragged in by windows.h
+ * dirsearch.cc (readdir): change WIN32_FIND_DATAA to WIN32_FIND_DATA
+ * libccrt0.cc: #include <stdlib.h>
+ * syscalls.cc (_unlink): chmod file to be unlinked to be
+ writable and try to delete it again if first delete failed
+ with permission denied error (rm will now work on read-only files)
+ (num_entries): change WIN32_FIND_DATAA to WIN32_FIND_DATA
+ * include/commdlg.h: delete
+ * include/ddeml.h: delete
+ * include/winadvapi.h: delete
+ * include/winbase.h: delete
+ * include/wincon.h: delete
+ * include/windef.h: delete
+ * include/windowsx.h: delete
+ * include/winerror.h: delete
+ * include/wingdi.h: delete
+ * include/winkernel.h: delete
+ * include/winnt.h: delete
+ * include/wintypes.h: delete
+ * include/winuser.h: delete
+ * include/winversion.h: delete
+
+Wed Oct 23 10:43:05 1996 Jeremy Allison <jra@cygnus.com>
+
+ * dcrt0.cc (api_fatal): Changed locking clear of
+ process table to unlocking clear. Needed as lock code calls
+ api_fatal.
+ * exceptions.cc: Added debug_printfs to follow exceptions in
+ strace mode.
+ * pinfo.cc: Added code to ensure fd table is cleared when new
+ pid entry allocated. Fixed bug when process is terminated
+ violently by TerminateProcess and leaves fd table non-zero.
+ * termios.cc: Changed stubbed out syscalls to syscall_printf
+ rather than small_printf. Stops annoying tcdrain message.
+ * winsup.h: Made get_empty_pinfo call private to pinfo_list.
+ Should never be called external to this class.
+
+Tue Oct 22 16:14:23 1996 Jeremy Allison <jra@cygnus.com>
+
+ * hinfo.cc: Removed previous change. This is not the
+ correct place to flush input events.
+
+Tue Oct 22 09:25:32 1996 Jeremy Allison <jra@cygnus.com>
+
+ * dcrt0.cc: Fixed up exit code to clean up pinfo array.
+ * exceptions.cc: Fixed up exit code to clean up pinfo array.
+ * fork.cc: Tidied up access to inuse_p entry. Added flags
+ to allow different states to be represented.
+ * hinfo.cc: Added code to flush pending events if
+ stdin is a console.
+ * pinfo.cc (pinfo::record_death): Added code to clean
+ the pinfo array if we are an exiting parent.
+ * spawn.cc: Removed erroneous code to clean childs
+ pinfo entry.
+ * wait.cc: Changed WAIT_ERROR_RC to Win32 WAIT_FAILED.
+ Tidied up access to pinfo array.
+ * winsup.h: Added record_death_nolock to pinfo class.
+ Added PID_XXX types for inuse_p.
+
+Tue Oct 22 01:26:52 1996 Geoffrey Noer <noer@cygnus.com>
+
+ * include/Windows32/Base.h:
+ * include/Windows32/Functions.h:
+ * include/Windows32/Structures.h:
+ * include/Windows32/UnicodeFunctions.h:
+ Fixes to just commited changes
+
+Mon Oct 21 19:58:50 1996 Geoffrey Noer <noer@cygnus.com>
+
+ * include/Windows32/ASCIIFunctions.h:
+ * include/Windows32/Base.h:
+ * include/Windows32/Defines.h:
+ * include/Windows32/Functions.h:
+ * include/Windows32/Structures.h:
+ * include/Windows32/UnicodeFunctions.h:
+
+ Add back items in old include files (commdlg.h, ddeml.h,
+ shellapi.h, winadvapi.h, winbase.h, wincon.h, windef.h,
+ windowsx.h, winerror.h, wingdi.h, winkernel.h, winnt.h,
+ wintypes.h, winuser.h, winversion.h) which should now be able
+ to be erased and windows.h modified to point to the new headers
+ without anything nasty happening.
+
+ * include/WINREADME: deleted
+ * include/mywinsock.h: removed many blank lines
+
+Mon Oct 21 09:48:00 1996 Jeremy Allison <jra@cygnus.com>
+
+ * select.cc: Re-written from scratch. Take account of
+ the following cases. (1). All sockets [written&works]
+ (2). Handles, sockets and always readies [written,not tested]
+ (3). All handles [written,not tested]. (4). Handles & sockets
+ with timeout [not yet written,returns -1]. Correctly blocks
+ and doesn't spin cpu.
+ * pinfo.cc: Changed to add global lock around pinfo array.
+ * fork.cc: Changed to use global pinfo lock.
+ * shared.cc: Fixed bug with fork()->exec()->exec() code.
+ * net.cc: Removed select_init() call (no longer used).
+ * spawn.cc: Implemented suggestion that spawn creates
+ process suspended, then sets up it's dwProcessId entry
+ in the shared pinfo array.
+ * wait.cc: Changed to use global pinfo lock.
+ * winsup.h: Added missing windows_95() call.
+ * fhandler.h: Changed ifdefs to select new always_ready
+ methods.
+ * fhandler.cc (fhandler_console::write): Fixed bug
+ where return of write_normal was being ignored.
+ * dcrt0.cc: Added code to use global pinfo lock.
+ Ensure that process records it's own death.
+ * exceptions.cc: Added code to clear our entry in pinfo
+ array when we are exiting. Should reduce dead processes in
+ pinfo array.
+ * include/winbase.h: Added MAXIMUM_WAIT_OBJECTS define.
+
+Mon Oct 21 00:52:17 1996 Geoffrey Noer <noer@cygnus.com>
+
+ * Makefile.in: install headers from new Windows32 dir
+
+Sat Oct 19 00:47:58 1996 Geoffrey Noer <noer@cygnus.com>
+
+ * include/Windows32/Base.h: change DWORD to unsigned int from
+ unsigned long, change __WIN32__ checks to _WIN32, change
+ // comments to /* */
+
+Fri Oct 18 17:33:07 1996 Geoffrey Noer <noer@cygnus.com>
+
+ * include/Windows32/Defines.h: change INFINITE to 0xFFFFFFFF,
+ add back definitions present in old winsup headers missing from
+ this file (STATUS_WAIT_0 et al, CONTEXT stuff, FAR, PACKED,
+ ASCIICHAR)
+ * include/Windows32/Functions.h: change // comments to /* */
+ * include/Windows32/Messages.h: add definitions for WM_NULL,
+ WM_PENWINFIRST, WM_PENWINLAST
+ * include/Windows32/Sockets.h: change __WIN32__ checks to _WIN32
+ * include/Windows32/Structures.h: add ppc case for CONTEXT
+ structure, change // comments to /* */
+
+Fri Oct 18 17:25:09 1996 Geoffrey Noer <noer@cygnus.com>
+
+ * include/Windows32: new directory for Windows headers
+ * include/Windows32/ASCIIFunctions.h:
+ * include/Windows32/Base.h:
+ * include/Windows32/Defines.h:
+ * include/Windows32/Errors.h:
+ * include/Windows32/Functions.h:
+ * include/Windows32/Messages.h:
+ * include/Windows32/Sockets.h:
+ * include/Windows32/Structures.h:
+ * include/Windows32/UnicodeFunctions.h:
+ New Win32 headers from Scott Christley's windows32api-0.1.2 package
+ with no local modifications.
+
+Wed Oct 16 17:16:33 1996 Geoffrey Noer <noer@cygnus.com>
+
+ * key.cc: remove extra blank lines, change ASCIICHAR to AsciiChar
+ * registry.cc: remove #include <winbase.h> since it's already
+ included in windows.h
+
+Tue Oct 15 09:51:48 1996 Jeremy Allison <jra@cygnus.com>
+
+ * fhandler.h: Many changes to support moving fhandler array out of
+ shared area into locally allocated memory. Removed fhandler class,
+ fhandler_base is now root of class tree. Re-arranged class definitions
+ to make it clear what functions are virtual and can be overridden.
+ Inlined may accessor functions.
+ * fhandler.cc: Many changes to support moving fhandler array out of
+ shared area into locally allocated memory. unix_path_name_ is now
+ always set (all fhandler_base classes have a name).
+ * hinfo.cc: Many changes to support moving fhandler array out of
+ shared area into locally allocated memory. Added linearization and
+ de-linearization functions.
+ * net.cc(socket): Added code to keep name for fhandler_socket.
+ * pinfo.cc : Changed allocation of fhandler_base array to be in local
+ memory rather than in shared area. (modified functions are pinfo_init,
+ pinfo_list::get_empty_pinfo, pinfo_list::allocate_pid,
+ pinfo::record_death).
+ * shared.cc: Added functions to copy fd area for spawned process.
+ Changed name of shared area to include master version number of
+ Cygwin32.
+ * spawn.cc (spawn_guts): Added code to initialize new shared area
+ for fds.
+ * syscalls.cc: Changed all code depending on NOFILE to use
+ getdtablesize(). Added internal setdtablesize() call for exec'ed
+ processes.
+ * syscalls.h: Added getdtablesize().
+ * sysconf.cc (sysconf): Changed SC_OPEN_MAX to return getdtablesize().
+ * winsup.h: Moved fhandler array out of shared area. Changed from
+ fhandler to fhandler_base (new root of class tree).
+ * include/mywinsock.h: Updated #endif to make end of
+ __INSIDE_CYGWIN32__ clear.
+ * include/winkernel.h: Added UnmapViewOfFile call.
+
+Mon Oct 14 14:59:16 1996 Geoffrey Noer <noer@cygnus.com>
+
+ * sysdef/i386: replace all files with ones from Scott
+ Christley's windows32api-0.1.2 package. Still need to
+ integrate new headers.
+
+Mon Oct 14 13:41:14 1996 Geoffrey Noer <noer@cygnus.com>
+
+ * syscalls.cc (_unlink): need to fchmod file to writable
+ before attempting to delete. This change still needs more
+ work (fchmod isn't written yet).
+ * (fchmod): change comment
+
+Fri Oct 11 22:27:17 1996 Geoffrey Noer <noer@cygnus.com>
+
+ * fhandler.cc, fhandler.h: minor fixes to console
+ support functions (remove missed reference to gotarg2,
+ definition in fhandler.h)
+
+Wed Oct 9 17:55:00 1996 Geoffrey Noer <noer@cygnus.com>
+
+ * delqueue.cc: added copyright notice, reformatted file
+
+ from sos@prospect.com.ru (Sergey Okhapkin):
+ * fhandler.cc, fhandler.h: add/fix ansi/vt100 console support,
+ and fix a tab bug
+ (modified functions are fhandler_console_out::clear_screen,
+ fhandler_console_out::clear_to_eol,
+ fhandler_console_out::char_command,
+ fhandler_console_out::write,
+ FakeReadFile)
+
+Wed Oct 9 17:32:17 1996 Jeremy Allison <jra@cygnus.com>
+
+ * times.cc: Swapped gmtime and localtime (they were
+ incorrectly reversed).
+ Added is_dst determination to them both.
+ * misc.c: Added swab, ffs.
+ * fcntl.cc(fcntl): Added capability for lock calls.
+ * fhandler.h: Added lock method into fhandler class.
+ * fhandler.cc: Added NT/Win95 semantics locks into ::lock
+ made them pretend they are POSIX locks.
+ * syscalls.cc (writev): Fixed return value bug.
+ * net.cc: Added WSAEOPNOTSUPP error.
+ * cygwin.din: Added ffs and swab.
+ * include/strings.h: Added file (just include string.h).
+ * include/winbase.h: Added defines LOCKFILE_FAIL_IMMEDIATELY
+ and LOCKFILE_EXCLUSIVE_LOCK.
+ * include/winerror.h: Added define ERROR_LOCK_FAILED.
+
+Thu Oct 3 16:19:23 1996 Jeremy Allison <jra@cygnus.com>
+
+ * fhandler.h: Many changes - removed all public variables
+ from classes, replaced with accessor functions. Renamed all
+ class variables to add a trailing '_'. This makes reading
+ and understanding which variables are class variables much simpler.
+ Changed name member to unix_path_name_ and made dynamic rather
+ than a fixed 31 byte buffer per entry.
+ * fhandler.cc: Updated varable access for above.
+ * fcntl.cc: Updated varable access for above.
+ * hinfo.cc: Updated varable access for above.
+ * spawn.cc: Updated varable access for above.
+ * syscalls.cc: Added fsync (null call) and fchmod(null
+ call at present).
+ * net.cc: Added ioctls for SIOCGIFCONF and SIOCGIFFLAGS.
+ Added ntohs, ntohl, static functions get_winnt_ifconf,
+ get_win95_ifconf and get_if_flags.
+ * include/cygwin32/if.h: Added structs for new ioctls.
+ * include/cygwin32/socket.h: Added iovec include.
+ * include/asm/socket.h: Added defines for above ioctls.
+ * cygwin.din: Added ntohs, ntohl, fsync, fchmod.
+
+Wed Oct 2 17:34:21 1996 Geoffrey Noer <noer@cygnus.com>
+
+ * utils/configure.in: add call to AC_CANONICAL_SYSTEM
+ * utils/configure: regenerate
+ * Makefile.in: build cygwin.dll as new-cygwin.dll and install as
+ cygwin.dll to prevent confusion when building winsup natively
+
+Tue Oct 1 17:27:34 1996 Jeremy Allison (jra@cygnus.com)
+
+ * include/regex.h: Added.
+ * net.cc: Added WSAECONNRESET, WSAEPFNOSUPPORT to
+ errmap array.
+
+Tue Oct 1 15:40:39 1996 Jeremy Allison (jra@cygnus.com)
+
+ * fork.cc (cygwin_fork_helper1): Fixed resource leak of process
+ handles, added cleanup code. Also fixed timout problem when child
+ cannot be initialized.
+ * dirsearch.cc (readdir): Changed comparison to explicitly check for
+ INVALID_HANDLE_VALUE. Test < 0 fails with void *.
+ * syscalls.cc (num_entries): Changed comparison to explicitly check for
+ INVALID_HANDLE_VALUE. Test < 0 fails with void *.
+ * cygwin.din: Added regcomp, regexec, regerror, regfree.
+ * Makefile.in: Added EXTRA_OFILES containing ../librx/rx.o. Added
+ comment to explain makefrag. Added ../newlib/libc/include to include
+ path.
+
+Mon Sep 30 16:10:56 1996 Stu Grossman (grossman@critters.cygnus.com)
+
+ * cygwin.din: Remove getopt and friends.
+
+Fri Sep 27 18:31:28 1996 Jeremy Allison <jra@cygnus.com>
+
+ * dcrt0.cc (dll_crt_1): Moved initialization of _reent to correct
+ position.
+
+Fri Sep 27 14:24:05 1996 Jeremy Allison <jra@cygnus.com>
+
+ * dcrt0.cc (dll_crt_1): Fixed fork bug with _impure_ptr not being
+ initialized correctly in a forked child. This should fix
+ the bash echo in a sub-shell bug.
+ * include/sys/uio.h: Created file. Contains definitions for writev
+ * include/limits.h: Added IOV_MAX and SSIZE_MAX.
+ * syscalls.cc: Added writev, changed read and write to return ssize_t.
+ * syscalls.h: Added writev, changed read and write to return ssize_t.
+ * cygwin.din: Added writev call.
+
+Wed Sep 20 13:09:00 1996 Jeremy Allison <jra@cygnus.com>
+
+ * include/mntent.h: Added MOUNTED definition, needed by
+ some code.
+ * dcrt0.cc : Added __progname for getopt code.
+ * misc.c: Added getw code.
+ * cygwin.din: Added getopt, optarg, opterr, optind
+ optopt, putw, getw calls.
+
+Fri Sep 20 03:03:17 1996 Geoffrey Noer <noer@cygnus.com>
+
+ * select.cc: change long millisec to unsigned int,
+ respaced file
+
+ patch from Sergey Okhapkin <sos@prospect.com.ru>:
+ * select.cc (polled): fix for select to get keyboard input
+ working properly (check EventType != KEY_EVENT instead
+ of checking for KeyEvent.AsciiChar == 0)
+ * select.cc (cygwin32_select): make int i unsigned int so NULL is
+ a valid timeout argument for loop
+
+Fri Sep 13 18:21:52 1996 Jeremy Allison <jra@cygnus.com>
+
+ * fhandler.cc (fhandler_base::read): rewrite text mode read
+
+Fri Sep 13 14:58:17 1996 Geoffrey Noer <noer@cygnus.com>
+
+ * exceptions.cc (call_handler): fix control-C not working
+ problem by setting rethere variable before the old value is
+ clobbered.
+
+Thu Sep 12 16:27:00 1996 Jeremy Allison <jra@cygnus.com>
+
+ * syslog.cc (pass_handler) : Removed duplicate code
+ in pass_handler::print(). Added get_win95_event_log_path()
+ to facilitate moving to registry configuration.
+
+Thu Sep 12 12:56:00 1996 Jeremy Allison <jra@cygnus.com>
+
+ * syslog.cc : Added real openlog, syslog, logmask, closelog
+ calls. syslog logs to event log on NT, file on Win95.
+ * include/winnt.h : added EVENTLOG_xx_TYPE definitions.
+ * include/winadvapi.h : added ReportEventA, RegisterEventSourceA
+ DeregisterEventSourceA declarations.
+ * include/winkernel.h : added LockFile, UnlockFile, LockFileEx,
+ UnlockFileEx declarations.
+ * include/wintypes.h : added PSID typedef.
+ * include/sys/syslog.h : added options flag definitions for openlog.
+
+Wed Sep 11 15:34:09 1996 Geoffrey Noer <noer@cygnus.com>
+
+ * fhandler.cc (popen): delete stub in favor of newlib's
+ (pclose): delete stub in favor of newlib's
+
+Tue Sep 10 17:20:56 1996 Geoffrey Noer <noer@cygnus.com>
+
+ * configure.in: don't transform names (the only time this might
+ be a good idea is for unix x cygwin32)
+ * configure: regenerated with autoconf
+
+Tue Sep 10 17:20:56 1996 Geoffrey Noer <noer@cygnus.com>
+
+ patch from Sergey Okhapkin <sos@prospect.com.ru>:
+ * fhandler.cc (FakeReadFile): support arrow keys, stop treating
+ bringing window to front as a key down (resulting in random
+ characters being printed in bash).
+
+Mon Sep 9 19:09:36 1996 Geoffrey Noer <noer@cygnus.com>
+
+ * syscalls.cc (system): fix system call
+
+Fri Sep 6 09:33:13 1996 Doug Evans <dje@canuck.cygnus.com>
+
+ * fhandler.h (fhandler_base): Make execable_p public char, not
+ private signed char. Delete get_execable.
+ * fhandler.cc (fhandler_base::get_execable): Renamed to
+ check_execable_p.
+ (fhandler_base::open): Restore symlink support.
+ Set execable_p, symlink_p.
+ (fhandler_base::fstat): Replace call to get_execable with reference
+ to execable_p.
+ (fhandler_base::fhandler_base): Set execable_p to 0.
+ * path.h (symlink_check): Declare it.
+ * path.cc (symlink_check): New function.
+ (readlink): Call it.
+ (symlink_follow): Likewise. New arg EXEC, callers updated.
+ * syscalls.cc (_stat_worker): New arg CALLER, callers updated.
+
+ * syscalls.cc: Delete all occurences of in/out and MARK.
+
+Thu Sep 5 18:51:01 1996 Doug Evans <dje@canuck.cygnus.com>
+
+ * fork.cc: Don't include <ctype.h>. Delete find_exec and support.
+ * spawn.cc: Include <ctype.h>. Move find_exec and support here.
+ (perhaps_suffix): New argument report_failure_p, callers updated.
+ (find_exec_1): Use perhaps_suffix when scanning PATH.
+ (spawn_guts): Replace code to translate posix to win32 path lists
+ with calls to utility fns that do the job.
+
+Wed Sep 4 13:30:57 1996 Doug Evans <dje@canuck.cygnus.com>
+
+ * path.cc (readlink): Make more bulletproof.
+
+Wed Aug 28 16:44:24 1996 Geoffrey Noer <noer@cygnus.com>
+
+ * syscalls.cc (system): use execlp
+ * public release beta 16 made
+
+Tue Aug 27 09:58:14 1996 Doug Evans <dje@canuck.cygnus.com>
+
+ * version.h (CYGWIN_DLL_VERSION_MINOR): Bump up to 2.
+
+Mon Aug 26 15:12:44 1996 Geoffrey Noer <noer@cygnus.com>
+
+ * syscalls.cc (system): added basic system() call.
+
+Mon Aug 26 13:46:30 1996 Doug Evans <dje@canuck.cygnus.com>
+
+ * cygwin.din (cygwin_fork_helper__FPvN30): Delete.
+ (vfork,select): Add.
+ * fork.cc (prepare_child): Delete, contents moved into
+ cygwin_fork_helper1.
+ (cygwin_fork_helper): Delete, contents moved into __fork.
+ * winsup.h (cygwin_fork_helper): Delete.
+
+ * path.cc: #include <fcntl.h>.
+ (symlink,readlink): Reenable, rewrite.
+ (symlink_follow): New function.
+ * path.h (symlink): Delete.
+ (SYMLINK_COOKIE, MAX_LINK_DEPTH): Define.
+ (symlink_follow): Declare.
+ * spawn.cc (spawn_guts): Rewrite symlink support.
+
+ * syscalls.cc (_unlink): Make arg a const char *.
+ * winsup.h (_unlink): Likewise.
+
+ * spawn.cc (spawn_guts): Fix allocation of stack space for sh.exe path.
+
+ * include/sys/errno.h: Deleted. Use newlib's.
+
+Fri Aug 23 16:00:00 1996 Jeremy Allison <jra@cygnus.com>
+
+ * net.cc (getdomainname): Changed win95 code to open
+ "System" key rather than "SYSTEM". I think the registry
+ is case-sensitive.
+
+Thu Aug 22 17:04:09 1996 Geoffrey Noer <noer@cygnus.com>
+
+ move fork into the dll:
+ * libcfork.cc: deleted
+ * fork.cc (vfork): used to be in libcfork.cc
+ * (__fork): used to be in libcfork.cc
+ * (fork): used to be in libcfork.cc
+ * Makefile.in: don't build libcfork.cc any more
+ * libccrt0.cc: set data_start, etc. from dll structure
+ * winsup.h: add data_start, etc. to public vars in dll
+ * cygwin.din: list fork
+
+Thu Aug 22 01:36:53 1996 Geoffrey Noer <noer@cygnus.com>
+
+ * registry.cc: fix new registry code
+ * syscalls.cc: make Windows95 check function extern "C"
+
+Wed Aug 21 16:15:47 1996 Geoffrey Noer <noer@cygnus.com>
+
+ * cygwin.din: list vfork
+ * dirsearch.cc: fix errno setting in readdir that caused
+ diff to not function on directories
+ * pipe.cc: reformatted
+
+Wed Aug 21 15:12:47 1996 Jeremy Allison <jra@cygnus.com>
+
+ * net.cc (domainname): Changed getdomainname to get the
+ information from the registry.
+ * registry.h: Modified interface to reg_key.
+ * registry.cc: Added open(),close() calls, made
+ get/set string values return error indication, added trailing
+ underscore to hkey member so it can be seen to
+ be a class member.
+ * include/winadvapi.h: Added KEY_READ and KEY write
+ defines for registry access.
+
+Mon Aug 19 09:22:35 1996 Doug Evans <dje@canuck.cygnus.com>
+
+ * path.cc (split_path): New function.
+ * path.h (split_path): Declare it.
+ * cygwin.din (cygwin32_split_path): Export it.
+
+ * include/winkernel.h (FILE_SHARE_DELETE): Define.
+
+ * syscalls.cc (__do_global_[cd]tors], __main): Move from here.
+ * dcrt0.cc: To here.
+
+ * dcrt0.cc (recur): Restore (now that we know WHY it was needed).
+ (dll_crt0_1): Probe forked child's stack out.
+
+ * fork.cc (FORK_WAIT_TIMEOUT): Bump up to two minutes.
+
+ * fork.cc (dump_jmp_buf): New function.
+ (cygwin_fork_helper1): Call it.
+ * dcrt0.cc (dll_crt0:1): Call it.
+ * winsup.h (dump_jmp_buf): Declare it.
+
+ * fork.cc (cygwin_fork_helper1): Reenable child suspend before
+ stack copy code.
+
+Sat Aug 17 04:06:36 1996 Geoffrey Noer <noer@cygnus.com>
+
+ * dirsearch.cc: reformatted, removed a couple of gotos
+
+Thu Aug 15 17:56:08 1996 Geoffrey Noer <noer@cygnus.com>
+
+ * cygwin.din: added __eprintf, a newlib function needed by assert.
+ * times.cc: swap gmtime and localtime (gmtime really was localtime
+ and vice versa).
+
+Tue Aug 13 03:46:22 1996 Geoffrey Noer <noer@cygnus.com>
+
+ * signal.cc: renamed all signal variables "sig",
+ fixed signal range error checking in all relevant functions,
+ (sigaddset): new
+ (sigismember): new
+ (sigfillset): new
+ (sigemptyset): new
+ * cygwin.din: added corresponding entries for new signal functions.
+ * cygwin.h: added protos for them
+ * fhandler.cc, fhandler.h: major reformat of code
+ * net.cc (cygwin32_socket): call checkinit() at start to
+ initialize WinSock in case it isn't already.
+ * syscalls.cc (access): set errno appropriately when no
+ write access
+ * fcntl.cc: reformatting
+
+Sat Aug 10 16:30:14 1996 Geoffrey Noer <noer@cygnus.com>
+
+ * signal.cc (_raise): rewrite to shorten code, corrected
+ return values.
+ * fcntl.cc, net.cc, signal.cc, stubs.c: reformatted, added
+ public domain notice at the tops if they were missing.
+
+Fri Aug 9 18:19:12 1996 Geoffrey Noer <noer@cygnus.com>
+
+ * syscalls.cc (_rename): return -1 if file to be renamed
+ doesn't exist. Reformatted whole file.
+ * fork.cc: increase timeout value to 60 sec from 30 sec
+
+Thu Aug 8 17:44:39 1996 Jim Wilson <wilson@cygnus.com>
+
+ * config/i386/longjmp.c: Increment %eax if it is zero.
+
+Wed Aug 7 15:51:04 1996 Geoffrey Noer <noer@cygnus.com>
+
+ * include/sys/mman.h: fixed defines for PROT_READ et al to
+ match what's more normally there in unix
+ * sysdef/i386/*: removed the extra underscores present in most
+ of these files that shouldn't have been there
+ * net.cc: cleaned up whitespace, formatting
+
+Tue Jul 16 12:43:16 1996 Doug Evans <dje@canuck.cygnus.com>
+
+ * libccrt0.cc (__version): Deleted, unused.
+
+ * uname.c (uname): Print CYGWIN_DLL_VERSION is version field.
+
+Mon Jul 15 16:48:29 1996 Doug Evans <dje@canuck.cygnus.com>
+
+ * version.h (CYGWIN_DLL_VERSION_MINOR): Bump up to 1.
+
+ Path handling clean up, pass 2 (use //<letter>, not /.<letter>.).
+ * path.cc (SLASH_DRIVE_PREFIX_LEN): Delete.
+ (slash_drive_to_win32_path): New function.
+ (mount_info::posix_path_p): Delete support for $CYGWIN,
+ always return 1.
+ (path_conv::path_conv): Call slash_drive_to_win32_path.
+ (mount_info::conv_to_win32_path): Renamed from
+ posix_path_to_win32_path. All callers updated.
+ (mount_info::conv_to_posix_path): Renamed from
+ win32_path_to_posix_path. All callers updated.
+ (normalize_posix_path): Keep two leading /'s (or \'s).
+ (normalize_win32_path): Likewise.
+ (conv_to_{win32,posix}_path): Renamed from
+ {posix,win32}_path_to_{win32,posix}_path_keep_rel.
+ (conv_to_full_{win32,posix}_path): Renamed from
+ {posix,win32}_path_to_full_{win32,posix}_path.
+ (posix_path_list_p): New function.
+ (cygwin32_{unix,dos}_path_to_{dos,unix}_path_keep_rel): Delete.
+ ({unix,dos}_path_to_{dos,unix}_path): Delete.
+ ({win32,posix}_to_{posix,win32}_path_list_buf_size): Renamed from
+ cygwin32_{win32,posix}_to_{posix,win32}_path_list_buf_size.
+ ({win32,posix}_to_{posix,win32}_path_list): Renamed from
+ cygwin32_{win32,posix}_to_{posix,win32}_path_list.
+ (slash_drive_prefix_p): Recognize //<letter>, not /.<letter>.
+ (build_slash_drive_prefix): Update.
+ * path.h: Update.
+ * cygwin.din ({dos,unix}_path_to_{unix,dos}_path): Delete.
+ (cygwin32_{dos,unix}_path_to_{unix,dos}_path_keep_rel): Delete.
+ (cygwin32_conv_to_{posix,win32}_path): Renamed from
+ (cygwin32_{win32,posix}_path_to_{posix,win32}_path_keep_rel.
+ (cygwin32_conv_to_full_{posix,win32}): New exports.
+ (cygwin32_posix_path_list_p): New export.
+ * dcrt0.cc (path_len): Delete.
+ (PATH_ENV_BUF_SIZE): Delete.
+ (conv_path_names): Delete all but PATH.
+ (dll_crt0_1): Rewrite environment variable conversion code.
+ * fork.cc (find_exec_1): Delete _SC_PATH_RULES support. Determine
+ path delimiter by calling posix_path_list_p.
+ * shared.cc (shared_info::initialize): Delete `path_rules'.
+ * sysconf.cc (sysconf): Delete _SC_PATH_RULES.
+ * winsup.h (shared_info): Delete `path_rules'.
+
+ * fork.cc (cygwin_fork_helper1): Reset u->forkee after child has
+ started.
+
+ * pinfo.cc (pinfo::init_from_fork): Delete. Empty function.
+ * fork.cc (cygwin_fork_helper1): Delete call to it.
+
+ * utils/kill.cc (usage): New function.
+ (main): Allow multiple pids to be passed. Call usage.
+
+Mon Jul 15 13:07:23 1996 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * Makefile.in (install): If cross compiling, install the
+ cygwin.dll file as $target_alias-cygwin.dll in the bin directory,
+ instead of plain cygin.dll.
+ Install the cygwin.dll file in the library directory as well.
+
+ * configure.in: Test for cross compiling, and if cross compiling,
+ transform name of cygwin.dll file in the binary directory.
+
+ * configure: Regenerate.
+
+ * utils/Makefile.in (Makefile): Rebuild Makefile if configure.in
+ changes.
+ (install): Use the toplevel install.sh to install the utilities,
+ and transform the name if cross compiling.
+
+ * utils/configure.in: Test for cross compiling, and if cross
+ compiling, tranform mount, umount, ps, etc. Do not call
+ AC_PROG_INSTALL anymore.
+
+ * utils/configure: Regenerate.
+
+Fri Jul 12 16:25:09 1996 Geoffrey Noer <noer@cygnus.com>
+
+ * Makefile.in: also make install in utils subdir so "mount"
+ et al gets installed.
+
+Thu Jul 11 17:53:31 1996 Geoffrey Noer <noer@cygnus.com>
+
+ * include/sys/param.h: fixed value of HZ (now 1000 instead of 100).
+ caused bug that showed up as "time sleep 5" returning 50.
+
+Thu Jul 11 14:08:09 1996 Geoffrey Noer <noer@cygnus.com>
+
+ * fhandler.cc: correct typo in comment
+ * exceptions.cc: remove definition of sig_func_ptr, replace
+ occurances with newlib-defined _sig_func_ptr.
+
+Wed Jul 10 19:12:18 1996 Doug Evans <dje@canuck.cygnus.com>
+
+ * version.h (CYGWIN_DLL_VERSION_{MAJOR,MINOR}): Bump up to 17.0.
+ * winsup.h (class per_process): New members {public,internal}_reserved.
+ (SIZEOF_PER_PROCESS): Define.
+ * dcrt0.cc (dll_crt0_1): Add sanity check of per_process size.
+ Don't call checkout for forkee.
+ * libccrt0.cc (cygwin_crt0): Set magic_biscuit to sizeof per_process
+ again.
+
+ * utils/ps.cc (main): Print uid.
+
+ * hinfo.h: Deleted. Contents moved to winsup.h.
+ * Makefile.in (WINSUP_H): Update.
+
+ * dcrt0.cc (u, environ): Moved here.
+ * shared.cc: From here.
+
+ * pinfo.cc (pinfo_init): Renamed from pinfo_init_per_process.
+ All callers updated.
+ * hinfo.cc (hmap_init): Renamed from hmap_init_per_process.
+ All callers updated.
+ * winsup.h (cygwin_parent_p): Renamed from invoked_by_cygwin_p.
+ All uses updated.
+
+ * fork.cc (prepare_child): Add debug message.
+
+ * uinfo.cc (uinfo_init): Renamed from uinfo::init.
+ All callers updated. Call getlogin instead of GetUserName.
+ (getlogin): Call GetUserName.
+ * winsup.h (class uinfo): Delete. Members uid,gid moved ...
+ (class pinfo): To here. All uses updated.
+ (class shared_info): Delete member `u'.
+ * fork.cc (cygwin_fork_helper1): Set child's uid,gid.
+
+ * pinfo.cc (pinfo::clearout): Reset strace_mask_ptr.
+
+ * shared.cc (open_shared_file_map): Add debugging message.
+
+Fri Jul 5 15:36:48 1996 Doug Evans <dje@canuck.cygnus.com>
+
+ * exceptions.cc (sig_func_ptr): New typedef.
+ (__stack_trace): Make i386 and ppc formats the same.
+ (sigfunc): Use sig_func_ptr.
+ (call_handler): Likewise. All callers updated.
+ (__cygwin_exception_handler): Handle exceptions before dll has
+ fully initialized. Only call dump_status once, like __stack_trace.
+ (really_exit): Call _exit, not exit.
+
+ * hinfo.cc: Add copyright.
+ * uinfo.cc: Likewise.
+
+ * passwd.c: Whitespace cleanup.
+ (search_for): Make static.
+
+ * pinfo.cc (pinfo_list::init): Delete call to clearout vec[0].
+ (pinfo::clearout): Reset more fields.
+ (pinfo_list::get_empty_pinfo): Delete printing of error messages
+ if table is full.
+
+ * shared.cc (open_shared_file_map): Mark shared map as not inherited.
+
+ * signal.cc (signal): Delete (void *) coersion of result.
+ (usleep): Convert microseconds to milliseconds. Delete second copy.
+ (_raise): Use _sig_func_ptr.
+
+ * syscalls.h: Delete #include mntent.h, sys/types.h, string.h,
+ stdio.h, setjmp.h, stdlib.h, signal.h, sys/strace.h, unistd.h,
+ ctype.h, fcntl.h.
+ * winsup.h: #include sys/types.h, sys/strace.h, setjmp.h, signal.h,
+ string.h, windows.h.
+ * All necessary files updated.
+
+ * winsup.h (class pinfo): Delete member localtime_buf.
+ * times.cc (corelocaltime): Use static local for localtime_buf.
+
+ * winsup.h (class pinfo): Rename the_pid to pid. All uses updated.
+ Delete handle_valid_p, unused. Rename __sig_mask to sig_mask.
+
+Thu Jul 4 14:36:01 1996 Doug Evans <dje@canuck.cygnus.com>
+
+ * shared.h: Deleted. All files updated.
+ * winsup.h: shared.h contents moved here.
+ * Makefile.in (WINSUP_H): Update.
+
+ * heap.cc: Renamed from pproc.cc.
+ (heap_init): Renamed from per_process::init.
+ In forkee initialization, ensure memory being reserved is at same
+ address as parent's. Commit forkee memory in one chunk.
+ (_sbrk): Moved here,
+ * syscalls.cc (_sbrk): From here.
+ * Makefile.in (DLL_OFILES): Update.
+ * dcrt0.cc (dll_crt0_1): Call heap_init instead of u->init.
+ * winsup.h (class per_process): Delete member `init'.
+
+ * dcrt0.cc (recur): Delete.
+ (dos_argv_to_unix_argv): Delete.
+
+ * delqueue.cc: Delete #include of delqueue.h, winerror.h
+ * winsup.h: #include delqueue.h.
+
+ * exceptions.cc (ctrl_c_handler): Only require 13 ^c's to quit task.
+
+ * fork.cc (fork_mutex,forkee_stopped,forker_stopped): New static
+ globals, were in class_shared info.
+ (fork_init,fork_terminate): New functions.
+ (prepare_child,cygwin_fork_helper1): Update.
+ (cygwin_fork_helper1): If fork disabled, return EAGAIN.
+ Delete unnecessary resetting of forkee_stopped event.
+ * winsup.h (fork_init,fork_terminate): Declare them.
+ * dcrt0.cc (dll_crt0_1): Call fork_init.
+ (_exit): Call fork_terminate.
+ * shared.c (shared_info::initialize): Delete init of fork stuff.
+
+ * shared.c (h): New static global, was in class shared_info.
+ (shared_info::terminate): Delete, move contents into shared_terminate.
+
+ * strace.cc (flush_p): New static global.
+ (strace_init): Don't clobber u->strace_mask if _STRACE_INHERIT set.
+ (__sys_printf): Only flush buffers if _STRACE_FLUSH.
+ * include/sys/strace.h (_STRACE_FLUSH,_STRACE_INHERIT): Define.
+ Reorganize bitmasks.
+
+ * utils/ps.cc (main): Make output prettier.
+
+Wed Jul 3 12:30:24 1996 Doug Evans <dje@canuck.cygnus.com>
+
+ * utils/Makefile.in (mount,umount,ps,kill): Rewrite rules.
+ (PROGS): Add cygwin.
+ (cygwin): New target.
+ (install): Install all of $(PROGS).
+ * utils/cygwin.cc: New file.
+
+ * pinfo.cc (pinfo_init_per_process): PID environment variable handling
+ moved here. Delete setting of u->parent. Set strace_mask_ptr.
+ Set invoked_by_cygwin_p appropriately.
+ (vfork_init): Delete, unused.
+ (pinfo::init_self): Delete setting of root_p.
+ (pinfo::terminate): root_p renamed to invoked_by_cygwin_p.
+ * winsup.h (class per_process): Delete initial_pid, no longer used.
+ (class pinfo): Add strace_mask_ptr.
+ * fork.cc (cygwin_fork_helper1): Update.
+
+ * winsup.h (class per_process): Delete trace_file, trace_mutex.
+ Rename estrace to strace_mask.
+ (system_printf): Declare.
+ * strace.cc (strace_init): Renamed from per_process::strace_init.
+ Don't open trace file unless strace environment variable set.
+ Open trace file with FILE_SHARE_READ so others can read trace file
+ while tracing in progress. Print error if $strace too big.
+ (strace_file, strace_mutex): New static globals.
+ (__sys_printf): Don't do anything if strace file not opened.
+ (system_printf): New function.
+ * pproc.cc (per_process::init): Delete call to strace_init.
+ * dcrt0 (dll_crt0_1): Call strace_init as soon as possible.
+
+ * dcrt0 (dll_crt0_1): Delete local can_glob, use
+ u->self->invoked_by_cygwin_p instead.
+ Move PID environment variable handling into pinfo_init_per_process.
+ Delete setting of u->self->in_bash.
+ Delete watching for bash.
+ * winsup.h (class pinfo): Delete in_bash.
+
+ * exceptions.cc (*): Call system_printf, not __sys_printf.
+
+ * shared.h (class shared_info): Delete pp, unused.
+
+ * syscalls.cc (isatty): Replace ttyname with is_tty.
+
+ * winsup.h (registry_init_once_only): Delete, unused.
+ (stdout_handle,file_handle_from_fd): Likewise.
+ (CHILD_P,child_p,ALL_FS,loadup_dll,cygwin_s): Likewise.
+ (unmixedcaseify): Prototype moved to path.h.
+ * path.h (unmixedcaseify): Declare.
+
+ * fork.cc (FORK_WAIT_TIMEOUT, WAIT_ERROR_RC): Define.
+ (find_exec_1): Don't search PATH if directory present (not only if
+ absolute path). Search "." before searching PATH.
+ (copy): Return boolean indicating success. All callers updated.
+ (prepare_child): Simplify. Check return code of WaitForSingleObject.
+ Don't wait an infinite amount of time.
+ (cygwin_fork_helper1): Simplify.
+ Check return code of WaitForSingleObject.
+ Don't wait an infinite amount of time.
+ Check return code of copy.
+ Disable code to Suspend/Resume child thread a second time.
+
+ * winsup.h (class per_process): Make initial_sp a char *.
+ * libccrt0.cc (cygwin_crt0): Update.
+
+ * path.cc (path_conv): If name too long, set path to bogus value.
+
+ * include/winkernel.h (WriteProcessMemory): Fix prototype.
+
+ * include/sys/strace.h: Add extern "C" ifdef __cplusplus.
+ (_STRACE): Delete.
+ * dirsearch.cc (rewinddir): Use syscall_printf.
+
+Tue Jul 2 14:44:18 1996 Doug Evans <dje@canuck.cygnus.com>
+
+ * wait.cc (WAIT_ERROR_RC): Use it instead of ALL_FS.
+ (wait_found): New argument `options'. If GetExitCodeProcess fails,
+ ensure `result' contains something reasonable.
+ (wait_for_single): Check whether `c' is NULL before dereferencing it.
+ (wait_for_any): Add some comments. Delete unnecessary gotos.
+ (waitpid): Print message if called with intpid == 0.
+
+Sat Jun 29 10:49:28 1996 Doug Evans <dje@canuck.cygnus.com>
+
+ * dirsearch.cc (readdir): Clean up syscall tracing.
+ Mixed case handling temporarily disabled.
+
+Wed Jun 26 11:54:27 1996 Jason Molenda (crash@godzilla.cygnus.co.jp)
+
+ * Makefile.in (bindir, libdir, datadir, infodir, includedir):
+ Use autoconf-set values.
+ (docdir): Removed.
+ (install-info): Add.
+ * configure.in (AC_PREREQ): autoconf 2.5 or higher.
+ * configure: Rebuilt.
+ * glob/configure.in (AC_PREREQ): autoconf 2.5 or higher.
+ * glob/configure: Rebuilt.
+ * utils/Makefile.in (bindir, exec_prefix): Use autoconf-set values.
+ * utils/configure.in (AC_PREREQ): autoconf 2.5 or higher.
+ * utils/configure: Rebuilt.
+
+Tue Jun 25 17:48:56 1996 Doug Evans <dje@canuck.cygnus.com>
+
+ * include/sys/param.h (PATH_MAX,MAXPATHLEN): Change from 1024 to 259.
+ (BIG_ENDIAN,LITTLE_ENDIAN,BYTE_ORDER): Define.
+
+Mon Jun 24 16:35:48 1996 Mark Eichin <eichin@cygnus.com>
+
+ * fhandler.cc (read): Replace the old broken igncr code (which has
+ been disabled for a while anyway) with code that checks for
+ ENABLE_LINE_INPUT and replace only \r\n with \n.
+
+Mon Jun 24 00:12:22 1996 Doug Evans <dje@canuck.cygnus.com>
+
+ * dcrt0.cc (dll_crt0_1): Convert argv[0] to posix style if necessary.
+
+Sun Jun 23 17:21:41 1996 Doug Evans <dje@canuck.cygnus.com>
+
+ * version.h (CYGWIN_DLL_VERSION_MINOR): Bump up to 2.
+
+ * fork.cc (perhaps_suffix): Simplify.
+ (find_exec_1): Likewise. Always try appending .exe first.
+ (cygwin_fork_helper1): Clean up (lots more needed still).
+ Test for split heap before calling CreateProcess.
+ No longer call find_exec, now done at start up.
+ * dcrt0.cc (dll_crt0_1): Call find_exec to expand argv[0].
+
+ * path.cc (conv_path_list_buf_size): New function.
+ (cygwin32_{win32,posix}_to_{posix,win32}_path_list_buf_size): Ditto.
+ (conv_path_list): Ditto.
+ (cygwin32_{win32,posix}_to_{posix,win32}_path_list): Ditto.
+ * cygwin.din: Export them.
+
+ * misc.c (small_printf): Delete.
+ (vhangup): Set errno.
+
+ * syscalls.cc (isatty): Print syscall trace message even if error.
+
+ * console.cc (*): Check return codes of win32 api calls.
+
+ * syscalls.cc (chmod): Set errno of SetFileAttributes fails.
+ Fix call to syscall_printf.
+
+Thu Jun 20 00:43:52 1996 Doug Evans <dje@canuck.cygnus.com>
+
+ * dcrt0.cc (dll_crt0_1): Save full program name.
+ * fork.cc (cygwin_fork_helper1): Always call find_exec.
+
+ * path.cc (normalize_{posix,win32}_path): Fix edge case handling.
+ (path_conv::path_conv): Ensure path is \-ified if win32 path rules.
+
+ * spawn.cc (spawn_guts): Set errno if CreateProcess fails.
+
+Wed Jun 19 00:18:03 1996 Doug Evans <dje@canuck.cygnus.com>
+
+ * path.h (PATH_RULES macros): Delete. Use ones in unistd.h.
+ (enum path_rules_enum): Deleted. All uses updated.
+ (path_conv): Rename member get_native to get_win32. All uses updated.
+ (*win32_path*): Renamed from *native_path*.
+ * path.cc (*win32_path*): Renamed from *native_path*.
+ (mount_info::posix_path_p): Prepend '_' to PATH_RULES.
+ Fix returning of cached value.
+ (slash_drive_prefix_p, build_slash_drive_prefix): New functions.
+ (mount_info::posix_path_to_win32_path): /.<letter>. is a drive spec.
+ (path_conv::path_conv): Likewise.
+ (mount_info::win32_path_to_posix_path): Convert unknown drives to
+ /.<letter>. Normalize win32_path.
+ (normalize_win32_path): New functions.
+ (getcwd_inner): New arg `posix_p'. All callers updated.
+ * shared.cc (shared_info::initialize): Prepend '_' to PATH_RULES.
+ _PATH_RULES_NATIVE -> _PATH_RULES_WIN32.
+ * spawn.cc (*win32_path*): Renamed from *native_path*.
+ * dcrt0.cc: Likewise.
+ * cygwin.din: Likewise.
+
+ * Makefile.in (WINSUP_H): Add shared.h
+
+ * smallprint.c (rn): Make static.
+
+ * sysconf.cc: Renamed from sysconf.c.
+ (sysconf): Support _SC_PATH_RULES.
+
+ * screen.c: Deleted.
+ * Makefile.in (DLL_OFILES): Delete screen.o.
+
+ * fork.cc (cygwin_fork_helper): Don't pass 0 from longjmp to setjmp.
+
+ * path.h (class mount_info): Update posix_path_to_native_path member.
+ * path.cc (path_prefix_p): Rewrite.
+ New arg `len'. All callers updated.
+ (mount_info::binary_native_path_p): Call path_prefix_p.
+ (path_conv::path_conv): Pass full_path to binary_native_path_p.
+ (mount_info::posix_path_to_native_path): Delete arg keep_rel_p.
+ New arg full_native_path. All callers updated. Don't call
+ getcwd_inner if unnecessary. Rewrite relative path handling.
+ (mount_info::native_path_to_posix_path): Call path_prefix_p.
+ Call slashify on `pathbuf', not original argument.
+
+ * syscalls.cc (chdir): Fix lifetime of converted path.
+
+Tue Jun 18 11:48:51 1996 Doug Evans <dje@canuck.cygnus.com>
+
+ * configure.in (EXE_LDFLAGS): Explicitly link with newlib if necessary.
+ * configure: Regenerated.
+ * Makefile.in (EXE_LDFLAGS): Define.
+ (FLAGS_TO_PASS): Add EXE_LDFLAGS.
+ (config.status): New target.
+ (utils-all): Depend on $(LIBNAME).
+ * utils/Makefile.in (EXE_LDFLAGS): Define.
+ (mount,umount,ps,kill): Link with $(EXE_LDFLAGS).
+
+ * version.h (CYGWIN_DLL_VERSION_MINOR): Bump up to 1.
+
+Mon Jun 17 18:29:54 1996 Doug Evans <dje@canuck.cygnus.com>
+
+ Improve pathname handling, first pass.
+ * path.h (symlink): Renamed from link_cookie.
+ (class path_conv): New member error.
+ (path_conv::get_native): Renamed from get_dos, all uses updated.
+ (path_conv::get_binary): Delete.
+ (mount_info::{mangle,reverse_mangle}): Delete.
+ (mount_item::posix_path_to_native_path): Renamed from mangle.
+ (mount_info::native_path_to_posix_path): Renamed from reverse_mangle.
+ (path_rules_enum): Define.
+ * path.cc: Temporarily disable mixed-case and symlink handling.
+ (mount_info::posix_path_p): New function.
+ (mount_info::binary_native_path_p): Renamed from binary_dos_path_p.
+ (path_conv::path_conv): Handle native path rules.
+ (mount_item::{mangle,reverse_mangle}): Delete.
+ (mount_info::posix_path_to_native_path): Renamed from mangle.
+ (mount_info::native_path_to_posix_path): Renamed from reverse_mangle.
+ (mount_info::from_registry): Set nmounts. Use MAX_PATH.
+ (mount_info::{add,del}_item): Rewrite.
+ (slashify): Renamed from flip_slash.
+ (getcwd_inner): Make static. Don't convert to posix path if using
+ native path rules.
+ (file_exists): Delete.
+ (addmntent,hasmntopt): Delete.
+ (mount): Only update registry if mount succeeded.
+ (umount): Only update registry if umount succeeded.
+ (normalize_posix_path): Renamed from normalize_path. Pass in cwd.
+ (cygwin32_{posix,native}_path_to_{native,posix}_path_keep_rel): Renamed
+ from ...{unix/dos}....
+ * dcrt0.cc (dos_argv_to_unix_argv): #ifdef out.
+ (dll_crt0_1): Don't call it.
+ * fhandler.cc (fhandler_base::open): Temporarily disable symlinks.
+ * shared.cc (open_shared_file_map): New function.
+ (shared_init): Call it.
+ (shared_info::initialize): Fetch `path_rules' from registry.
+ * shared.h (inited): Make private.
+ (path_rules): New member.
+ * spawn.cc: #include "shared.h".
+ (spawn_guts, env var translation): Don't translate path names if
+ using native path rules.
+ * syscalls.cc (symlink): Delete (moved to path.cc).
+ * cygwin.din (dump__5pinfo): Delete.
+ (cygwin32_{posix,native}_path_to_{native,posix}_path_keep_rel): Renamed
+ from ...{unix/dos}....
+
+ * smallout.cc: Delete.
+ * sdata.cc: Delete.
+ * shared.cc (u,s,environ): Define here.
+ * Makefile.in (glob/libglob.a): Depend on glob/glob.c, glob/fnmatch.c.
+ (utils-all): New target.
+ (DLL_OFILES): Delete smallout.o, sdata.o.
+ (Makefile): Depend on cygwin.din.
+ (WINSUP_H): Depend on syscalls.h.
+
+ * configure.in (AC_CONFIG_SUBDIRS): Add bin.
+ (AC_PROG_INSTALL): Call.
+ * configure: Regenerated.
+ * utils/{Makefile.in,configure.in,configure}: New files.
+ * utils/{kill.cc,mount.cc,ps.cc,umount.cc,termcap}: New files.
+ * Makefile.in (UTILS_ALL): Define.
+ (all): Depend on $(UTILS_ALL).
+ (utils-all): New target.
+
+ * dcrt0.cc (recur): Make no-op to see what happens.
+ (globify): Don't call glob if unnecessary.
+ Check return code from glob.
+ (api_fatal): New function.
+ * fhandler.cc (fhandler_base::read): Dump first few chars read.
+ (fhandler_base::get_execable): New function.
+ (fhandler_base::fstat): Use it.
+ (fhandler_base::fhandler_base): Init execable_p.
+ (fhandler_disk_file::fhandler_disk_file): Delete execable_p.
+ (fhandler::{get,set}_execable_bit): Delete.
+ (fhandler_disk_file::{get,set}_execable_bit): Delete.
+ * fhandler.h (class fhandler): Delete {get,set}_execable_bit.
+ (class fhandler_base): New member execable_p.
+ New member fn get_execable.
+ * fork.cc: Simplify/cleanup.
+ (cygwin_fork_helper1): Use MAX_PATH, not MAXPATHLEN.
+ * pinfo.cc (pinfo::dump): Delete.
+ * pproc.cc (per_process::set_envname): Delete.
+ * strace.cc (smallout::do_pline): Delete.
+ * syscalls.h (readlink): Third arg is an int.
+ * winsup.h (class pinfo, member progname): Use MAX_PATH.
+ (class pinfo, member dump): Delete.
+ (class smallout): Delete.
+ (smallout): Delete.
+ (class per_process, member set_envname): Delete.
+ (file_exists): Delete.
+ (api_fatal): Declare.
+ * Makefile.in (LIB{C,CXX}FLAGS_FOR_TARGET): Delete, use {C,CXX}FLAGS.
+ (FLAGS_TO_PASS): Define.
+ (glob/libglob.a): Delete duplicate entry.
+
+ * syscalls.cc (_sbrk): Update u->size when heap is grown.
+
+ * hinfo.cc (hmap_init_per_process): Ensure stdout's handle != stderr's.
+
+Fri Jun 14 06:32:13 1996 Doug Evans <dje@canuck.cygnus.com>
+
+ * register.h, registry.cc: Whitespace cleanup.
+
+Thu Jun 13 20:57:28 1996 Doug Evans <dje@canuck.cygnus.com>
+
+ * Makefile.in (install): Install cygwin.dll in $(bindir).
+
+Tue Jun 11 13:46:17 1996 Geoffrey Noer <noer@cygnus.com>
+
+ * fhandler.cc: lseek is now only binary mode, interpret control
+ z characters as EOF when reading from a file. Reformatted some
+ of the code (cleaned up line spacing, etc.)
+
+Tue Jun 11 09:50:09 1996 Jason Molenda (crash@kyriath.cygnus.com)
+
+ * path.cc (nofinalslash): move it so it is next to its friends
+ flip_slash and backslashify.
+
+Mon Jun 10 18:57:03 1996 Jason Molenda (crash@kyriath.cygnus.com)
+
+ * path.cc (*): Pretty printing.
+ (unix_path_to_dos_path_with_rel): use "dosnamein" and "unixnameout"
+ instead of "path" & "real_path".
+ (dos_path_to_unix_path_keep_rel): delete obsolete code.
+ (mount_item::mangle): use "unixnamein" and "dosnameout" instead of
+ "unixname" and "dosname".
+ (mount_info::mangle): use "unixnamein" and "dosnameout". Remove
+ obsolete code.
+ * path.h (mount_item): Update prototypes, add comment.
+ (mount_info): Update prototypes.
+
+Mon Jun 10 17:05:23 1996 Jason Molenda (crash@kyriath.cygnus.com)
+
+ * path.cc (mount_item::reverse_mangle): Pretty printing,
+ add a bit to the comment.
+ (getcwd_inner): use MAX_PATH not MAXPATHLEN.
+ (normalize_path): use MAX_PATH not MAXPATHLEN.
+ (link_cookie::follow): use MAX_PATH not MAXPATHLEN.
+
+Mon Jun 10 15:36:32 1996 Geoffrey Noer <noer@cygnus.com>
+
+ * Makefile.in: changed $(DOC) so it doesn't include html
+ files; made a new info-html target that does the html
+ versions of the docs. Since most customers don't have texi2html
+ installed, the make shouldn't fail because of this.
+ * configure: regenerated with autoconf 2.8
+
+Sun Jun 9 17:10:37 1996 Doug Evans <dje@canuck.cygnus.com>
+
+ * version.c: Deleted.
+ * version.h: New file.
+ * winsup.h (VERSION): Deleted.
+ (class per_process): Add version_major, version_minor. Delete version.
+ * registry.cc: #include "version.h".
+ (reg_session::reg_session): Update.
+ * libccrt0.cc: #include "version.h"
+ (cygwin_crt0): Delete setting of version, set magic_biscuit to 0.
+ Set version_major, version_minor.
+ * dcrt0.cc: #include "version.h".
+ (cygwin_dll_version_{major,minor}): New static locals.
+ (dll_crt0_1): Rewrite app/dll compatibility test.
+ * Makefile.in (LIBCOS): Delete version.o.
+ (DLL_OFILES): Delete version.o.
+ (dcrt0.o,libccrt0.o,registry.o): Depend on version.h.
+
+ * exceptions.h: New file.
+ * exceptions.cc: Massive cleanups (still lots more to go).
+ #include "exceptions.h".
+ (init_exceptions): Renamed from __init_exceptions. New argument of
+ pointer to exception handler list entry.
+ (init_exception_handler): Renamed from init_thread_exceptions.
+ Rewrite based on info from Onno Hovers <onno@stack.urc.tue.nl>.
+ (ppc descriptor_to_{function,gotattr}): Make static.
+ (i386 __stack_trace): Fix test for top of stack.
+ * dcrt0.cc: #include "exceptions.h".
+ (dll_crt0_1): Exception handler list entry must live on stack.
+ * winsup.h (class pinfo): Delete member myp.
+ * syscalls.h (struct exception_list): Delete.
+ (__really_exit, __init_exceptions): Delete.
+ * Makefile.in (dcrt0.o,exceptions.o): Depend on exceptions.h.
+
+Fri Jun 7 17:49:28 1996 Jason Molenda (crash@phydeaux.cygnus.com)
+
+ * dcrt0.cc (conv_path_names): Add GCC_EXEC_PREFIX.
+
+Fri Jun 7 14:38:05 1996 Doug Evans <dje@canuck.cygnus.com>
+
+ * Makefile.in (CC_FOR_TARGET,LD,DLLTOOL): Define.
+ (AR,RANLIB): Set via configure.
+ * configure.in (AR,LD,DLLTOOL): Set.
+ (AC_PROG_RANLIB): Call.
+ * configure: Regenerated.
+
+Thu Jun 6 12:11:23 1996 Kim Knuttila <krk@cygnus.com>
+
+ * dcrt0.cc (dll_crt0_1): Removed reference to reent_data._next.
+
+Tue Jun 4 15:52:29 1996 Geoffrey Noer <noer@cygnus.com>
+
+ * include/winkernel.h: fixed typo
+
+Tue May 28 13:08:25 1996 Doug Evans <dje@canuck.cygnus.com>
+
+ * syscalls.cc (_sbrk): Fix test of return value from VirtualAlloc.
+ Delete lincr, make incr signed, and use only it. Misc. minor cleanup.
+
+Thu May 23 17:31:57 1996 Geoffrey Noer <noer@cygnus.com>
+
+ sac diffs applied:
+ * path.h: change MAXMOUNTS to 30 instead of 20
+ * sysdef/i386/rpcndr.def: add "none" to end of file
+ * fhandler.cc: fix memset call to say sizeof (*buf) instead
+ of sizeof (buf).
+ * include/winuser.h: define MDIS_ALLCHILDSTYLES
+ * Makefile.in: entry to build glob/libglob.a:
+
+Thu May 23 10:38:43 1996 Doug Evans <dje@canuck.cygnus.com>
+
+ * fhandler.h (class fhandler_base): Make `name' private and shrink
+ to 32 bytes.
+ (set_name): Declare.
+ * fhandler.cc (fhandler::set_name): New function.
+ (fhander_base::open): Call it.
+ (fhander_base::init): Call it.
+ (fhandler_tty::ttyname): Call get_name instead of accessing `name'
+ directly.
+
+ * dcrt0.cc (dll_crt0_1): Call ExitProcess instead of exit if
+ DLL and APP are out of sync.
+
+Thu May 16 03:07:18 1996 Mark Eichin <eichin@cygnus.com>
+
+ * fhandler.cc (FakeReadFile): new function. Interface like
+ ReadFile, only called from fhandler_console_in::read, calls
+ ReadFile unless we're really reading from STD_INPUT_HANDLE and
+ with ENABLE_LINE_INPUT turned off, in which case we use
+ ReadConsoleInput instead. When using ReadConsoleInput, always read
+ all available events, but only block if we don't get at least one
+ actual character. This would be the place to implement FIONBIO on
+ the console tty, which doesn't actually exist yet.
+ (dbg_input_event): copied from select.cc, debugging code to show
+ detail of what events we're actually getting.
+ (ioctl): off-by-one on window size.
+
+Wed May 15 18:11:16 1996 Jim Wilson <wilson@chestnut.cygnus.com>
+
+ * fhandler.h (class fhandler_base): Use MAXPATHLEN not 100 for size
+ of array name.
+
+Wed May 15 11:14:46 1996 Doug Evans <dje@canuck.cygnus.com>
+
+ * fork.cc (cygwin_fork_helper1): More debugging printf's.
+
+ * dcrt0.cc (num_ms_env_vars): Renamed from ms_env_arity.
+ (build_argv): Renamed from fill.
+ (compute_argc): Renamed from prepare.
+ * libccrt0.cc (cygwin_statu): Make static.
+ * pproc.cc (per_process::init): Move strace initialization from here,
+ * strace.cc (per_process::strace_init): To here.
+ Pass FILE_SHARE_WRITE to CreateFileA. Print error message if open
+ of log file fails. Create mutex for trace messages.
+ (__sys_printf): Always write to end of disk files. Use mutex.
+ (d): Delete.
+ * winsup.h (class per_process): Add strace_init. Reorganize.
+ `run_ctors' renamed to `run_ctors_p'. New member `trace_mutex'.
+ (d): Delete.
+ (PATH_MAX): Delete.
+
+ * Makefile.in: Add header file dependencies.
+
+ * dcrt0.cc (_exit): Add debugging printf.
+ * shared.h (class shared_info): Rename member mutex_a to fork_mutex.
+ * fork.cc (cygwin_fork_helper1): Update.
+ Return with error if process slot unavailable.
+ Set errno and release fork_mutex if failed because of split heap.
+ * shared.cc (shared_info::terminate): Update.
+ (shared_info::initialize): Update.
+
+Tue May 14 14:59:32 1996 Doug Evans <dje@canuck.cygnus.com>
+
+ * fork.cc (cygwin_fork_helper1): Avoid SIGSEGV if allocate_pid fails.
+
+ * pproc.cc (per_process::init): Fix test.
+
+ * winsup.h (): Rename member `parent' to `ppid'.
+ * fork.cc (prepare_child): Update.
+ (cygwin_fork_helper1): Likewise.
+ * hinfo.cc (hmap_init_per_process): Likewise.
+ (hinfo_vec::dup_for_fork): Fix message.
+ (hinfo_vec::dup2): Fix args to debug_printf. Delete extra printf's.
+ * pinfo.cc (pinfo_init_per_process): Update.
+ (pinfo::dump): Likewise.
+ (pinfo::init_self): Likewise.
+ * pproc.cc (per_process::init): Open strace file in append mode.
+ * smallprintf.c (__small_vsprintf): Support %p.
+ * syscalls.cc (getppid): Update.
+ * wait.cc (wait_for_any): Likewise.
+
+Mon May 13 13:45:36 1996 Mark Eichin <eichin@cygnus.com>
+
+ * fhandler.cc (ioctl): fix TIOCGWINSZ handling: (1) check the
+ error return (2) if we're trying on STD_INPUT_HANDLE, substitute
+ STD_OUTPUT_HANDLE since GetConsoleScreenBufferInfo only works on
+ console output (3) check srWindow for the *screen* size, instead
+ of checking dwSize for the scroll buffer size.
+
+ * include/sys/errno.h (ECONNABORTED): add another errno value.
+ * net.cc (errmap): add ECONNABORTED case.
+
+ * fhandler.cc (fstat): clear the *entire* stat buf, not just the
+ first four bytes.
+
+Fri May 10 17:59:09 1996 Mark Eichin <eichin@cygnus.com>
+
+ * select.cc: change most debugging statements to select_printf.
+ (dbg_input_event): new function, prints an INPUT_RECORD via select
+ printf.
+ (polled): Don't sleep around WaitForMultipleObjects; let it have a
+ 10ms timeout until we have time to test it with 0. If
+ WaitForMultipleObjects says that STD_INPUT_HANDLE has data, use
+ PeekConsoleInput to scan the available events. If the first one is
+ not a *bKeyDown* with a non-zero *AsciiChar* then use
+ ReadConsoleInput to rip it off the queue, and pretend it wasn't
+ there, so that later calls to read (and thus ReadFile) don't block
+ because they can't find any *real* input. (This could be optimized
+ later to check the whole queue, and if there are *no* real input
+ events, nuke them all.)
+
+ * include/sys/strace.h (_STRACE_SELECT, select_printf): new printf
+ category, because select needs a *lot* of work. STRACE=256 to use it.
+
+ * fhandler.cc (fhandler_console_in::init): IGNCR can't work
+ without major changes to deal with the interaction with select
+ (which shouldn't wake up if IGNCR causes the whole input to be
+ deleted...) so don't make it the default.
+ (fhandler_console_out::tcgetattr, fhandler_tty::tcgetattr): don't
+ set IGNCR based on get_r_binary either.
+
+Wed May 8 20:20:05 1996 Mark Eichin <eichin@cygnus.com>
+
+ * times.cc (__to_clock_t): must cast dwLowDateTime to *unsigned*
+ before adding it -- otherwise we may subtract it!
+ (to_time_t): same.
+
+Wed May 8 18:21:28 1996 Mark Eichin <eichin@cygnus.com>
+
+ * times.cc (corelocaltime): new function. Basic localtime from
+ newlib, with no conversions.
+ (gmtime): just calls corelocaltime.
+ (localtime): uses GetTimeZoneInformation, biases to standard time
+ first, then uses DaylightDate and StandardDate to figure out if
+ we're in DST -- and calls corelocaltime a second time with the
+ rebiased seconds, if we are.
+ (times): add debug_printf statements which work around apparent
+ compiler bug and 7+ minute error.
+
+ * select.cc: revert to <sac>'s changes of 4/20 which were
+ accidentally backed out on 4/24.
+
+Tue May 7 05:29:42 1996 Mark Eichin <eichin@cygnus.com>
+
+ * times.cc (__to_clock_t): subtract out FACTOR, the difference
+ between 1601 and 1970, just like to_time_t() does.
+
+Tue May 7 01:55:06 1996 Mark Eichin <eichin@cygnus.com>
+
+ * times.cc (gmtime): new function. Use GetTimeZoneInformation to
+ compensate ahead before calling localtime (since the newlib
+ version doesn't know what timezone we're in.)
+ (localtime): use SECSPERMIN, not 60, to show that we know what
+ we're talking about.
+
+ * net.cc (errmap): add WSAEADDRINUSE, WSAECONNREFUSED mappings.
+
+Sun May 5 00:45:59 1996 Mark Eichin <eichin@cygnus.com>
+
+ * include/sys/socket.h: add recvfrom macro and cygwin32_recvfrom
+ declaration. Remove htons/htonl misdeclarations as they collide
+ with the macros in asm/byteorder.h.
+
+ * include/asm/byteorder.h: enable the ntohl/ntohs declarations so
+ we at least get the macro versions when we optimize, even if the
+ library hooks aren't there.
+
+Wed Apr 24 23:42:49 1996 Steve Chamberlain <sac@dilithium.transmeta.com>
+
+ * winsup.h (pinfo, pinfo_list): Remove dummy item.
+ * fork.cc (*): Revert changes of Apr 2.
+
+Sun Apr 21 17:00:14 1996 Steve Chamberlain <sac@slash.cygnus.com>
+
+ * wait.cc (wait_for_any): Fix the wait heuristic.
+
+Sat Apr 20 13:22:03 1996 Steve Chamberlain <sac@slash.cygnus.com>
+
+ * Makefile.in (.cc.o): Pass -fno-rtti.
+ * dcrt0.cc (globify): A single match is ok.
+ * exceptions.cc (i386 call_handler): optimize.
+ * fhandler.cc (fhandler_console_in::read): Handle ICRNL right.
+ (*:get_name *:always_ready): New.
+ * select.cc: Understand that console output doesn't signal when it's
+ ready.
+
+Fri Apr 12 14:49:34 1996 Doug Evans <dje@canuck.cygnus.com>
+
+ * Makefile.in (glob/libglob.a): Pass -I so glob.c finds right dirent.h.
+
+Wed Apr 10 16:13:30 1996 steve chamberlain <sac@slash.cygnus.com>
+
+ * Makefile.in (glob/libglob.a): Call glob makefile correctly.
+ * winsup.h (pinfo, pinfo_list): Reorder elements to avoid
+ alignment bug in PPC gcc.
+
+Tue Apr 9 17:23:57 1996 steve chamberlain <sac@slash.cygnus.com>
+
+ * dcrt0.cc (globify): Expand command line wildcards if
+ run from dos prompt.
+
+ * exceptions.cc (386 call_handler): More fumblings.
+ * fhandler.cc (fhandler_base::stat): Initialize ino.
+ (fhandler_console::open): Fix test for RDONLY.
+ (fhandler_tty::stat): Set ino.
+ (fhandler_console_out::vt100 stuff): More.
+ * fork.cc: Lint.
+ * pinfo.cc (pinfo::init_self): Don't bother to DuplicateHandles
+ to get process info.
+ * signal.cc (usleep): Get correct order of magnitude.
+ * spawn.cc (spawn_guts): Turn of exception handling in
+ parent of thing which execs.
+ * syscalls.cc (stat): Look for <file> and <file.exe>.
+ * wait.cc (wait_for_any): Keep waiting if WaitForMultipleObject
+ returns invalid result.
+
+Tue Apr 2 12:45:35 1996 steve chamberlain <sac@slash.cygnus.com>
+
+ * dcrt0.cc (conv_path_names): Add HOME.
+ (dll_crt0_1): Use u->self->head_sp.
+ * exceptions.cc (i386 call_handler): Rewritten, now almost works
+ on win95.
+ * fhandler.cc (fhandler_base::open): Calculate namehash.
+ (fhandler_base::fstat): ^ name hash with file index low.
+ * fork.cc (*): forkee/forkerr events moved from sinfo
+ into pinfo.
+
+Fri Mar 29 16:35:02 1996 steve chamberlain <sac@slash.cygnus.com>
+
+ * libcmain.cc: New.
+ * winsup.h: restore and myp moved from per_process to pinfo class.
+ * dcrt0.cc (dll_crt0_1): Cope with move.
+ * exceptions.cc (init_thread_exceptions): Ditto.
+ * signal.cc (sigprocmask): Ditto.
+ * fork.cc (cygwin_fork_helper1): Don't fork if split_heap_p.
+ * pinfo.cc (pinfo::clearout): Zero split_heap_p.
+ * syscalls.cc (_sbrk): Cope with not being able to
+ allocate contiguous chunks.
+
+
+Tue Mar 26 09:14:32 1996 steve chamberlain <sac@slash.cygnus.com>
+
+ * exceptions.cc (__cygwin_exception_handler): re-export.
+
+Fri Mar 22 16:49:29 1996 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * cygwin.din (__stack_trace): Export.
+ (__cygwin_exception_handler): Ditto.
+
+ * exceptions.cc (i386 exception handling): Move under appropriate
+ x86 #ifdefs. Use the macro HAVE_INIT_THREAD_EXCEPTIONS to be
+ whatever a machine needs to do to initialize exceptions in this
+ thread. Nop for the PowerPC right now.
+ (__stack_trace): Make it a "C" function so there is no name
+ mangling, and export it.
+ (call_handler): Split by architecture before the function, rather
+ than inside it. First stab at PowerPC exception handling.
+ (__cygwin_exception_handler): Rename from ehandler3, and export
+ it. Add more status -> signal mappings.
+ (ctrl_c_handler, CTRL_LOGOFF_EVENT): Map to SIGHUP, not SIGQUIT.
+ (__stack_trace): Split into separate machine dependent functions,
+ rather than #ifdef'ing inside of a common function. Make the
+ PowerPC messages clearer.
+
+Mon Mar 18 13:27:05 1996 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * include/winkernel.h (CreateThread): Correctly declare function
+ pointer argument.
+
+ * misc.c (wprintf): Convert to use vprintf and fix warnings.
+ (tgetent): Declare to return int to fix warnings.
+ (vhangup): Declare to return int to fix warnings. Return -1 also.
+
+ * include/winbase.h (UnhandledExceptionFilter): Declare.
+
+Tue Mar 12 12:56:28 1996 Doug Evans <dje@charmed.cygnus.com>
+
+ * include/winkernel.h (FlushFileBuffers): Declare.
+
+Tue Mar 12 11:16:32 1996 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * exceptions.cc (dump_status): Make columns line up for PowerPC.
+ (call_handler): Right now, call exit(255) for the PowerPC.
+
+ * strace.cc (__sys_printf): Call FlushFileBuffers after writing
+ out the file to make sure it really gets flushed.
+
+ * include/winkernel.h (PowerPC CONTEXT): Add fields returned if
+ CONTEXT_DEBUG_REGISTERS is set.
+
+Sun Mar 10 15:31:17 1996 Steve Chamberlain <sac@slash.cygnus.com>
+
+ * strerror.cc, syslog.cc, net.cc: New files.
+ * cygwin.din: Add new net functions.
+ * dcrt0.cc (dll_crt0_1): Fix call to build argv[0].
+ * fhandler.cc (fhandler_base::open): Tidy.
+ * fhandler.h: Add net classes.
+ * hinfo.cc (hinfo_vec::build_fhandler): Add tape stuff.
+ * path.cc (*::mangle, *::reverse_mangle): Fix.
+ (mount_info::init): No trailing / now.
+ * select.cc (*): Rewrite.
+ * spawn.cc (spawn_guts): Fix leak.
+ * syscalls.cc (_sbrk): Keep working until memory really fills up.
+
+Tue Feb 20 16:53:24 1996 Steve Chamberlain <sac@slash.cygnus.com>
+
+ * dcrt0.cc (dll_crt0_1): Get version from the header.
+ * fhandler.cc (CHUNK_SIZE): New.
+ (fhandler_base::read, fhandler_base::write): CRLF conversion
+ rewritten.
+ path.cc (path_conv::path_conv): Initialize mixed, binary and silent.
+ * smallprint.c (__small_vsprintf): Add 'c' option.
+ * wait.cc (wait_found): Close child handles.
+
+Mon Feb 19 09:11:57 1996 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * Makefile.in (real-headers): Eliminate real-headers dependency on
+ mspatches/*.patch, since you can't be guaranteed that it exists.
+
+Fri Feb 16 14:24:47 1996 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * exceptions.cc (dump_status): On the PowerPC, dump all of the
+ integer registers.
+
+ * uname.c (uname): Don't assume that the only two NT systems are
+ i386 and PowerPC.
+ * exceptions.cc (call_handler): Ditto.
+ (dump_status): Ditto.
+
+Thu Feb 15 18:20:33 1996 Steve Chamberlain <sac@slash.cygnus.com>
+
+ * cygwin.din (__empty): Add.
+ * dcrt0.cc (dos_argv_to_unix_argv): New.
+ (check, onetimecheck): New.
+ * exceptions.cc (ehandler3): Always show backtrace
+ if exception failed.
+ * fhandler.cc (*::open): Removed dos_path argument.
+ (fhandler_base::fstat): Use nFileIndexLow as the inode
+ value.
+ * hinfo.cc (init_std_file_from_handle): Don't default
+ to binary.
+ * paths.cc (*): Use new registry classes.
+ * registry.cc (*): Rewritten.
+ * syscalls.cc (open): Call fhandler->open without
+ the dos filename arg.
+
+Sat Feb 10 08:18:45 1996 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * configure.in (ALLOCA for powerpc): Add __allocate_stack.
+
+Wed Feb 7 16:41:18 1996 Steve Chamberlain <sac@slash.cygnus.com>
+
+ Release-B13
+
+ * malloc.cc (export_*): New. Changed the way that malloc
+ stubs are used.
+ * cygwin.din: Export the export_* stuff as malloc, realloc and free.
+ * path.cc (link_cookie::create): Keep cookie filenames in unix
+ format.
+ (reverse_mangle): Clean up.
+ (readlink): Ditto.
+ (qfunc): Sort by name too.
+ * spawn.cc (spawn_guts): Handle zero length arg.
+ Only set errno when it's not 0.
+ * Makefile.in: Build new doc.
+ * fhandler.cc (fhandler_base::fstat): Round up block used.
+ * path.cc (escape_char): Now it's ^.
+ * syscalls.cc (errmap): ERROR_INVALID_NAME yields ENOENT.
+ (chown): Returns 0.
+ (sbrk): Clean up.
+ (_unlink): Only try and DeleteFile once.
+
+Mon Feb 5 19:15:44 1996 Steve Chamberlain <sac@slash.cygnus.com>
+
+ * dcrt0.cc (dll_crt0_1): Build env string into static buffer.
+ * dirsearch.c (opendir): Stat on unix pathname.
+ * paths.cc (*): Support for mixed case filenames.
+
+Sun Feb 4 15:55:58 1996 Steve Chamberlain <sac@slash.cygnus.com>
+
+ * *.cc: Lint.
+ (conv_path_names): New.
+ (dll_crt0_1): Use conv_path_names list.
+ * fctnl.cc (F_DUPFD): Look from the fd forward.
+ * fhandler.cc (fhandler_base::open): Understand binary modes.
+ (fhandler_console_in::init): Call tcsetattr with reasonable start
+ values.
+ * spawn.cc (spawn_guts): Use conv_path_names.
+ (queue_file_deletion): Deleted.
+ (unlink): Use new queue file stuff.
+ * delqueue.cc, delqueue.h: New files.
+ * shared.h: New file.
+
+Wed Jan 31 11:12:24 1996 Steve Chamberlain <sac@slash.cygnus.com>
+
+ * crt0.cc: Hacks to probe out ppc stack.
+ * exceptions.cc (ehander3): Don't use 386 context info on the ppc.
+ * path.cc (mount_info::mangle): Turn /usi or /usp into /usr.
+ * uname.c (uname): Change sysname and get ppc name right.
+
+Fri Jan 26 15:47:31 1996 Steve Chamberlain <sac@slash.cygnus.com>
+
+ * pproc.cc (per_process::init): Cope when no memory is needed.
+ * Makefile.in, configure.in: Cope with config directory.
+ * setjmp.c, longjmp.c: Moved into config/i386.
+ * config/ppc/setjmp.S, config/ppc/longjmp.S: New.
+
+Fri Jan 26 14:57:33 1996 Jason Molenda (crash@phydeaux.cygnus.com)
+
+ * Makefile.in (DLL_OFILES): removed ppc-stub.o
+ ppc-stub.c: Removed.
+ configure: regenerated with autoconf 2.7.
+
+Fri Jan 26 11:18:07 1996 Kim Knuttila <krk@cygnus.com>
+
+ * Makefile.in (DLL_OFILES): added ppc-stub.o
+
+Thu Jan 25 09:33:24 1996 Steve Chamberlain <sac@slash.cygnus.com>
+
+ * malloc.cc (malloc, free, realloc): Hack for ppc.
+
+Wed Jan 24 20:22:42 1996 Steve Chamberlain <sac@slash.cygnus.com>
+
+ * cygwin.dll (loadup_dll): Remove.
+ * dcrt0.cc: lint.
+ * fhandler.* (*): Move to new class structure.
+ * hinfo.cc: Use new fhandler glue.
+ * libcfork.cc: Cope with ppc naming convention.
+
+Mon Jan 22 10:33:53 1996 Steve Chamberlain <sac@slash.cygnus.com>
+
+ * fhandler.h, hinfo.h: New files.
+ * winsup.h: Split from here.
+ * configure.in: Set i386 entry point correctly.
+ * fhandler.cc (fhandler_normal:open): .com files
+ are executable too.
+ * hinfo.cc (init_std_file_from_handle): Inspect
+ master_fmode_binary.
+ * misc.cc (wcscmp, wcslen): New.
+ * dcrt0.cc (probe): Change way a forkee's stack is allocated.
+ * pproc.cc (per_process::init): Initialize using heap chunk.
+ * shared.cc (shared_info::initialize): Initialize heap chunk.
+ * syscalls.cc (_sbrk): If current chunk is used, allocate another.
+ * wait.cc (wait_found): Fix exit code.
+
+Thu Jan 18 10:09:45 1996 Steve Chamberlain <sac@slash.cygnus.com>
+
+ * fhandler.cc (fhandler_normal::open) Don't test a
+ com port to see if it's executable.
+ * configure.in, cygwin.din: More powerpc configury.
+
+Wed Jan 17 16:25:36 1996 Steve Chamberlain <sac@slash.cygnus.com>
+
+ * configure.in, Makefile.in: Build powerpc stuff.
+ * hinfo.cc (build_fhandler): Use new with placement.
+ (fhandler::operator new): New.
+
+Wed Jan 3 18:18:57 1996 steve chamberlain <sac@slash.cygnus.com>
+
+ * select.cc: New file.
+ * Makefile.in: Cope with it.
+
+Tue Jan 2 08:58:58 1996 steve chamberlain <sac@slash.cygnus.com>
+
+ * version.c: New file.
+ * Makefile.in: Cope with it.
+ * cygwin.def (setgrent, cuserid, setpgrp, mount, setmntent, endmntent, umount): New.
+ * dcrt0.cc: Remove obsolete vfork stuff.
+ (dll_crt0): Change way environ is built. Check that app is built
+ with correct version of dll.
+ * dirsearch.cc, exceptions.cc: Lint.
+ * fhandler.cc: Lint. Most of termios.c moved into here.
+ (fhandler_console:*): New.
+ * hinfo.cc (hinfo_vec::init_std_file_from_handle): Open stdfiles as consoles
+ if possible.
+ * libccrt0.cc: Lint.
+ * malloc.cc: More comments.
+ * path.cc (*): Cope with mount handling.
+ * registry.cc: Lint.
+ (reg_session): New.
+ * shared.cc: Lint.
+ * signal.cc (usleep): New.
+ * spawn.cc: Lint. Removed vfork stuff.
+ * stubs.c (getmntent, endgrent): Deleted.
+ * syscalls.c (__seterrno): Now takes arguments.
+ * termios.c: Much moved info fhandler.c
+ * times.cc (utime, utimes): New.
+ * uinfo.c (cuserid): New.
diff --git a/winsup/cygwin/ChangeLog-1997 b/winsup/cygwin/ChangeLog-1997
new file mode 100644
index 000000000..7a5c0b3a4
--- /dev/null
+++ b/winsup/cygwin/ChangeLog-1997
@@ -0,0 +1,2800 @@
+Wed Dec 31 15:00:32 1997 Geoffrey Noer <noer@cygnus.com>
+
+ patch from sos@prospect.com.ru (Sergey Okhapkin):
+ * hinfo.cc (hinfo_vec::find_unused_handle): correct
+ previous patch -- need to fix up vec[i].h pointers
+
+Wed Dec 31 14:13:22 1997 Ian Lance Taylor <ian@cygnus.com>
+
+ * regexp/Makefile.in (tooldir): New variable.
+ (install): Install regexp.h.
+
+Tue Dec 30 19:52:46 1997 Ian Lance Taylor <ian@cygnus.com>
+
+ * net.cc (inet_netof): New function.
+ (inet_makeaddr): New function.
+ * cygwin.din: Export inet_netof and inet_makeaddr.
+
+Tue Dec 23 17:45:07 1997 Ian Lance Taylor <ian@cygnus.com>
+
+ * path.cc (current_directory_name): New static variable.
+ (current_directory_posix_name): New static variable.
+ (getcwd_inner): Cache the directory name.
+ (chdir): Move here from syscalls.cc. Clear directory cache
+ variables.
+ * syscalls.cc (chdir): Remove; now in path.cc.
+
+ * environ.cc (setenv): Add cast to avoid warning.
+
+ * security.cc (get_file_attribute): Make file parameter a pointer
+ to const char.
+ (set_file_attribute): Likewise.
+ * winsup.c (get_file_attribute): Update declaration.
+ (set_file_attribute): Likewise.
+
+ * path.cc (path_conv): Don't pass the root directory to
+ symlink_check_one.
+
+Mon Dec 22 16:34:40 1997 Ian Lance Taylor <ian@cygnus.com>
+
+ * path.cc (realpath): Use path_conv to resolve symlinks.
+
+ * path.cc (path_conv::path_conv): Rewrite completely to convert to
+ win32 path first and then check for symlinks element by element.
+ (symlink_check_one): New static function based on old
+ symlink_check_worker, but without path conversion.
+ (path_prefix_p): Move definition before all uses.
+ (skip_n_slashes, symlink_expand, symlink_follow): Remove.
+ (symlink_check_worker, symlink_check): Remove.
+ (readlink): Rewrite to use new symlink_check_one.
+ (unmixedcaseify, mixedcaseify): Comment out.
+ * path.h (symlink_check, symlink_follow): Don't declare.
+ * fhandler.cc (open): Don't pass O_NOSYMLINK to path_conv. Set
+ errno from path_conv if it fails.
+ * dirsearch.cc (opendir): Check errors from path_conv, and set
+ errno appropriately.
+ * times.cc (utimes): Likewise.
+ * syscalls.cc (_unlink, _link, mkdir, rmdir, chdir): Likewise.
+ (chmod, _rename): Likewise.
+ (_stat_worker): Don't just pass nofollow to _open, but base
+ whether to pass O_NOSYMLINK on whether nofollow is set.
+ (lstat): Pass 1, not O_NOSYMLINK, to _stat_worker.
+ * strerror.cc (strerror): Add ELOOP.
+
+Thu Dec 18 12:30:47 1997 Ian Lance Taylor <ian@cygnus.com>
+
+ * fhandler.h (class fhandler_base): Remove inline definitions of
+ tcflush, tcsendbreak, tcdrain, tcflow, tcsetattr, tcgetattr,
+ tcsetpgrp, and tcgetpgrp, so that we can set proper errno values.
+ (class fhandler_tty): Add pgrp_ field, and virtual tcgetpgrp and
+ tcsetpgrp functions.
+ * fhandler.cc (fhandler_base::tcflush): New function.
+ (fhandler_base::tcsendbreak): New function.
+ (fhandler_base::tcdrain): New function.
+ (fhandler_base::tcflow): New function.
+ (fhandler_base::tcsetattr): New function.
+ (fhandler_base::tcgetattr): New function.
+ (fhandler_base::tcsetpgrp): New function.
+ (fhandler_base::tcgetpgrp): New function.
+ (fhandler_tty::fhandler_tty): Initialize pgrp_.
+
+ * tty.cc (tcsetpgrp): Set errno correctly on failure.
+
+ * include/sys/termios.h (CBAUD): Change to 037.
+ (B57600, B115200): Change to values that can fit in a speed_t.
+
+ * spawn.cc (spawn_guts): Set errno correctly if we can't find the
+ executable.
+
+Mon Dec 15 16:40:07 1997 Geoffrey Noer <noer@cygnus.com>
+
+ patch from msnyder@cygnus.com (Michael Snyder):
+ * heap.cc (_sbrk): handle situation where newalloc < incr
+
+Mon Dec 15 16:40:07 1997 Geoffrey Noer <noer@cygnus.com>
+
+ patch from sos@prospect.com.ru (Sergey Okhapkin):
+ Allow Cygwin32 to terminate process even when in a blocking
+ winsock call.
+ * exceptions.cc (call_handler): call to WSACancelBlockingCall()
+ removed.
+ (sighandle): call WSACleanup() before exiting the process to
+ cancel blocking winsock calls.
+ * include/mywinsock.h: add proto for WSACleanup().
+
+Mon Dec 15 16:40:07 1997 Geoffrey Noer <noer@cygnus.com>
+
+ * Makefile.in: compile .cc files with -fno-exceptions to
+ decrease dll size and increase execution speed a little.
+
+Mon Dec 15 16:40:07 1997 Geoffrey Noer <noer@cygnus.com>
+
+ patch from cgf@bbc.com (Chris Faylor):
+ * tty.cc (do_input): Detect CTRL-T as a special case when
+ STRACE_CACHE is active. Dumps the strace cache to disk.
+ * console.cc (fhandler_console::read): Detect CTRL-T as a special
+ case when STRACE_CACHE is active. Dumps the strace cache to disk.
+
+Sat Dec 13 15:12:53 1997 Ian Lance Taylor <ian@cygnus.com>
+
+ * fork.cc: Include <malloc.h>.
+ (cygwin_fork_helper1): Call __malloc_copy after copying the stack
+ and heap to the child.
+
+Thu Dec 11 15:14:40 1997 Geoffrey Noer <noer@cygnus.com>
+
+ patch from cgf@bbc.com (Chris Faylor):
+ * sigproc.cc (proc_subproc): Remove over-enthusiastic test for
+ process handling readiness or proc_wait will loop attempting to
+ handle a dying subprocess when signal handlers are not ready.
+ * fork.cc (cygwin_fork_helper1): Reorganize to ensure that a
+ forked process is capable of receiving signals when fork()
+ returns.
+
+Wed Dec 10 15:43:37 1997 Ian Lance Taylor <ian@cygnus.com>
+
+ * include/sys/termios.h (IXANY): Correct value.
+ (PARMRK): Define again.
+
+Wed Dec 10 00:05:23 1997 Geoffrey Noer <noer@cygnus.com>
+
+ patch from cgf@bbc.com (Chris Faylor):
+ * dcrt0.cc (dll_crt0_1): Move start time initialization to a more
+ logical place (pinfo_init).
+ (do_exit): Reorganize to attempt to solve races when a cygwin
+ process occupies two windows pids (i.e., an execed process).
+ * exceptions.cc (lock_cs): Fix erroneous WFSO logic.
+ (sighandle): Use new method for determining if process was
+ initiated via fork.
+ (events_terminate): Do not close pinfo_mutex. Allow automatic
+ close by ExitProcess to lengthen the time that the pinfo structure
+ is locked, minimizing races between an exiting child and a
+ potentially exiting parent.
+ * hinfo.cc (hmap_init): Use new method for determining if process
+ was initiated via fork.
+ (hinfo_vec::de_linearize_fd_array): Fix a typo in a comment.
+ * pinfo.cc (clearout): Remove this function. Handled in
+ allocate_pid.
+ (pinfo_init): Move start_time setting here from dll_crt0_1.
+ Remove call to init_self in favor of adding three additional lines
+ of code.
+ (pinfo_list::operator []): Implement a very simple hashing
+ scheme for pid lookup.
+ (lpfu): New routine controlled by DEBUGGING conditional. When
+ DEBUGGING is activated, lpfu returns more information about the
+ state of a timed out pinfo_mutex.
+ (pinfo_list::get_empty_pinfo): Remove function. Move
+ functionality to allocate_pid.
+ (allocate_pid): Implement a (very) simple hashing scheme for
+ finding an available pid. Take advantage of reorganized pinfo
+ structure to zero all pertinent fields with one memset.
+ (pinfo::record_death_nolock): Don't bothering zeroing
+ inconsequential stuff.
+ (pinfo::record_death): Leave pinfo_mutex locked with the
+ understanding that this function will be called just prior to
+ exiting the process. This minimizes a race between a child which
+ is exiting at nearly the same time as its parent.
+ * sigproc.cc: Reformat function calls.
+ (sigproc_init): Clear new PID_INITIALIZING flag to indicate that
+ a (possibly execed) process is now capable of receiving signals.
+ (sig_send): Be more defensive in determining if a signal can be
+ sent to myself or suffer problems with execed processes.
+ (sigproc_terminate): Wait for sig_proc to exit to ensure that
+ all pending signals have been handled. Use new 'proc_terminate'
+ function to terminate the subprocess handling thread.
+ (allow_sig_dispatch): Don't bother blocking signals if signal
+ handling isn't active in this process yet.
+ (block_sig_dispatch): Don't bother blocking signals if signal
+ handling isn't active in this process yet.
+ (sig_proc): Use sig_loop_wait variable to control wait time for
+ signal semaphores. Uncouples this wait from wait_subproc.
+ Perform signal cleanup here on thread termination.
+ (proc_exists): More accurate tests to determine if a process
+ really exists.
+ (proc_register): Remove this function in favor of a macro.
+ (proc_subproc): More stringent test for being "ready" to process
+ subprocesses. Add more common initialization to PROC_ADDCHILD.
+ Remove PROC_EXIT in favor of a separate function.
+ (proc_terminate): New function. Replaces PROC_EXIT functionality
+ in proc_subproc. Terminates subproc handler thread.
+ (stopped_or_terminated): use lock_pinfo_for_update when modifying
+ child stopsig status or suffer a race.
+ (wait_subproc): Save sig_proc thread handle away for
+ synchronization when exiting. Set up 'i_am_alive' mutex inherited
+ by childen. Child's inability to lock this mutex means that the
+ parent is still alive and processing children. Use proc_loop_wait
+ to control WFMO. Clean up events queue on thread exit.
+ (zap_subproc): Clear out pinfo structure for a child.
+ * sigproc.h: Remove PROC_EXIT constant. Remove obsolete
+ proc_register declaration.
+ (alive_parent): New macro to determine if a parent is still alive.
+ * spawn.cc (spawn_guts): Fix a comment typo. Use proc_terminate
+ to terminate all subprocess handling prior to an exec. Use new
+ method for determining if this process was started via a fork.
+ Attempt to clean up races between execed process, its parent, and
+ the execed child.
+ * winsup.h (pinfo): Add a new handle indicating that a parent is
+ alive. This should be a foolproof way of determining if a parent
+ has gone away so that a child will know whether to remove itself
+ from the pinfo table.
+ Reorganize the structure in such a way that items to be zeroed
+ are grouped together at the beginning for more efficient zeroing
+ in allocate_pid.
+ Add a new PID_* constant.
+ New lock_pinfo_for_update macro for use when debugging cygwin.
+
+Wed Dec 10 00:05:23 1997 Geoffrey Noer <noer@cygnus.com>
+
+ patch from sos@prospect.com.ru (Sergey Okhapkin):
+ Change the way to inherit fd table on spawn/exec calls.
+ Use STARTUPINFO structure to pass an fd table to a child process
+ instead of shared memory area. This is undocumented, but is used
+ by MSVC runtime. The desktop inheritance code added again,
+ otherwise user32.dll will fail to initialize after sexec calls.
+ * pinfo.cc (pinfo_init): delinearize fd array from STARTUPINFO
+ structure instead of call to copy_shared_fd_table.
+ * shared.cc (create_shared_fd_mapping_name): remove
+ (create/copy_shared_fd_table): remove
+ * spawn.cc (spawn_guts): use lp(cb)Reserved2 fields of STARTUPINFO
+ to pass fd table to a child. Remove call to
+ create_shared_fd_table. Inherit window station/desktop on sexec
+ calls.
+ * winsup.h: remove prototypes for create/copy_shared_fd_table.
+
+Fri Dec 5 18:57:42 1997 Geoffrey Noer <noer@cygnus.com>
+
+ patch from cgf@bbc.com (Chris Faylor):
+ * kill.cc (main): Report error if kill() fails. Minor reformat.
+ * ps.cc (main): Only use month/day in start time when starting
+ time is > 24 hours in the past, not when it occurs yesterday.
+
+Fri Dec 5 15:54:41 1997 Geoffrey Noer <noer@cygnus.com>
+
+ * fcntl.cc (_fcntl): reformat
+ * fhandler.cc (fhandler_tty::open): new, need special open for
+ ttys. In addition to calling fhandler_base::open, check
+ flags to handle blocking vs. non-blocking I/O. Should
+ initialize tty to standard state (9600 bits/sec - 8 - 1 with
+ no flow control) but this code needs more work still. Ifdef
+ out for now.
+ (fhandler_tty::tcsendbreak): new
+ (fhandler_tty::tcdrain): new
+ (fhandler_tty::tcflow): new
+ (fhandler_tty::tcsetattr): add support for action arg. Use
+ a DCB struct to hold the values we will set. First call
+ GetCommState to get the current state, then reassign values
+ based on the contents of the termios struct. Handle the
+ case where t->c_ospeed is set to B0, otherwise set state.BaudRate.
+ Set all the other DCB struct values appropriately, based on
+ the contents of the termios struct.
+ (fhandler_tty::tcgetattr): do the inverse of tcsetattr.
+ Call GetCommState to get the current state and use this to set
+ the appropriate termios struct values.
+ * termios.cc: reformat
+ (tcsendbreak): implement -- add duration arg,
+ call fhandler tcsendbreak as appropriate
+ (tcdrain): implement -- call fhandler tcdrain as appropriate
+ (tcflow): implement -- call fhandler tcflow as appropriate
+ * fhandler.h: add new tc* protos
+ * include/sys/termios.h: correct values of iflag bits,
+ define CRTSXOFF and CRTSCTS, CBAUD, B57600 and B115200.
+ Add protos for tc* functions.
+
+Wed Nov 26 17:06:17 1997 Geoffrey Noer <noer@cygnus.com>
+
+ patch from sos@prospect.com.ru (Sergey Okhapkin):
+ * spawn.cc (perhaps_suffix): resolve symlinks to .exes.
+
+Mon Nov 24 17:10:49 1997 Geoffrey Noer <noer@cygnus.com>
+
+ * cygwin.din: remove crypt
+ * syscalls.cc (crypt): remove crypt stub
+
+Sun Nov 23 17:34:42 1997 Geoffrey Noer <noer@cygnus.com>
+
+ patch from sos@prospect.com.ru (Sergey Okhapkin):
+ * spawn.cc (spawn_guts): save the path of the script itself,
+ use the saved path while building the command line to execute.
+
+Thu Nov 20 22:58:23 1997 Geoffrey Noer <noer@cygnus.com>
+
+ * stubs.cc: delete file, move unimplemented stubs to the
+ files in which they would normally belong.
+ * grp.cc (setgrent): implement (was in stubs.cc)
+ * syscalls.cc: move regfree, mknod, setgid, set(e)uid, sync,
+ crypt, and PPC __chkstk/_alloca/dll_entry stubs here from stubs.cc
+ (sync): just return zero for now instead of -1
+ (crypt): return -1 instead of 0
+
+Thu Nov 20 22:41:57 1997 Geoffrey Noer <noer@cygnus.com>
+
+ patch from cgf@bbc.com (Chris Faylor):
+ * spawn.cc (spawn_guts): A premature close of the spawned filehandle
+ was possible when reparenting an exited process. Fix this.
+ * dcrt0.cc (do_exit): Only do minimal cleanup if "pid focus"
+ has moved to another windows process or the other process will
+ become confused.
+
+ patch from sos@prospect.com.ru (Sergey Okhapkin):
+ * sigproc.cc (getsem): set errno to EPERM if existing semaphore
+ cannot be opened.
+ (wait_subproc): allow access to signal semaphores to process's
+ owner only except for SIGCHLD (needed for SIGCHLD delivery after
+ sexecXX calls).
+
+Thu Nov 20 00:52:58 1997 Geoffrey Noer <noer@cygnus.com>
+
+ patch from cgf@bbc.com (Chris Faylor):
+ * syscalls.cc (hash_path_name): Ignore trailing backslash when
+ calculating pathname hash.
+ * hinfo.cc (hinfo_vec::de_linearize_fd_array): Set use_tty
+ if /dev/ttyn is detected in the shared_fd_table. Before this
+ change, executing "set CYGWIN_TTY=1", "bash", "unset CYGWIN_TTY",
+ "/bin/pwd" would result in pwd printing nothing because
+ the de_linearize code would use the wrong fhandler_xxx when
+ reading from the buffer inherited from the parent process.
+ * cygwin.din: Add new ctermid function for export.
+ * syscalls.cc (ctermid): New function
+ * exceptions.cc (call_handler): If called during a P_OVERLAY
+ spawn, merely set appropriate flags and return. The spawn
+ code will then clean up and exit.
+ * sigproc.cc (proc_exists): Reorganize to better detect defunct
+ processes. Don't clean up pinfo if process has a parent since the
+ parent should clean up eventually.
+ * spawn.cc: New global exec_exit. Set by signal handler to
+ value which should be used on exit from aborted spawn.
+ (spawn_guts): Try harder to let the child terminate (if it is
+ going to) before exiting on a signal. Remove obsolete code.
+
+ patch from sos@prospect.com.ru (Sergey Okhapkin):
+ * exec.cc (file_exists): Removed
+ * spawn.cc (spawn_guts): call perhaps_suffix to convert filename
+ to win32 form and to check file existance; prog variable
+ removed, all references changed to real_path variable.
+ Do not inherit parent's window station/desktop on sexecXX calls.
+ They are no longer needed with the new signal handling.
+ (_spawnve): extra file existance check removed
+ * winsup.h: file_exists prototype removed
+
+Wed Nov 19 16:23:47 1997 Geoffrey Noer <noer@cygnus.com>
+
+ patch from sos@prospect.com.ru (Sergey Okhapkin):
+ * cygwin.din: add missing exports for random -- initstate
+ and setstate (accessed by gawk among others?)
+
+Tue Nov 18 22:27:10 1997 Geoffrey Noer <noer@cygnus.com>
+
+ * Makefile.in: Add spaces after colons in rules for make
+
+Mon Nov 17 22:35:25 1997 Geoffrey Noer <noer@cygnus.com>
+
+ patch from proven@cygnus.com (Chris Provenzano):
+ * Makefile.in: set SHELL = @SHELL@, set VPATH to only @srcdir@.
+ Remove mingw from directories to build for now, adapt rules
+ for building sysdef files without fancy VPATH
+ * configure: regenerate
+ * config/i386/makefrag: add rules to build setjmp/longjmp
+ * regexp/Makefile.in: set SHELL = @SHELL@
+ * regexp/configure: regenerate
+ * utils/Makefile.in: set SHELL = @SHELL@
+ * utils/configure: regenerate
+
+Mon Nov 17 18:36:50 1997 Geoffrey Noer <noer@rtl.cygnus.com>
+
+ patch from sos@prospect.com.ru (Sergey Okhapkin):
+ * fhandler.cc (fhandler_disk_file::open): calls to symlink_XXX
+ replaced with path_conv class calls.
+ * path.cc (path_conv::path_conv): comments added, O_NOSYMLINK case
+ added.
+ * path.h (class path_conv): symlink_p, exec_p - new class members.
+ * spawn.cc (spawn_guts): call path_conv instead of symlink_follow.
+
+Sun Nov 16 15:54:27 1997 Geoffrey Noer <noer@rtl.cygnus.com>
+
+ patch from cgf@bbc.com (Chris Faylor):
+ * dcrt0.cc (do_exit): Use new pinfo element in debug statement.
+ * pinfo.cc (pinfo_init): Eliminate use of "PID" environment
+ variable in favor of scanning the process table for a
+ SpawnedProcessId field matching current windows process id.
+ Should speed up spawned process startup slightly. Delay setting
+ of dwProcessId until process is capable of processing signals
+ since this field is used to build signal semaphores.
+ * signal.cc (kill_worker): Perform a `proc_exists' on the pid
+ in question if signal == 0. This will verify that the process
+ actually exists and was not abnormally terminated.
+ * sigproc.cc (sigproc_init): Initialize dwProcessId field after
+ signal processing has been initialized.
+ (sigproc_terminate): Remove events[0] close.
+ (getsem): Use GetCurrentProcessId to find the windows pid since
+ this dwProcessId field is not yet set up. Use proc_exists to
+ determine if error should be printed on OpenSemaphore error.
+ (proc_exists): New function. Makes more exhaustive test of
+ process existence. Determines if process died without going
+ through normal shutdown.
+ (wait_subproc): Close wakeup event only on thread exit.
+ * spawn.cc: Remove pExeced. Use new field in pinfo.
+ (spawn_guts): Initialize dwSpawnedProcessId field.
+ * utils/ps.cc (main): Perform a kill(pid, 0) on any pids that
+ appear to be active. This will clear out pids that have died
+ abnormally. 'ps -f' bypasses this.
+ * winsup.h (class pinfo): Add dwSpawnedProcessId field.
+
+Sun Nov 16 15:54:27 1997 Geoffrey Noer <noer@rtl.cygnus.com>
+
+ patch from sos@prospect.com.ru (Sergey Okhapkin):
+ * pinfo.cc ((pinfo_init): use dwProcessId for execed/spawned
+ check, set subproc_ready event only if the process is exec'ed.
+ * spawn.cc (spawn_guts): initialize hProcess and dwProcessId
+ fields of pinfo on exec, keep progname field on spawn.
+
+Sun Nov 16 15:54:27 1997 Geoffrey Noer <noer@rtl.cygnus.com>
+
+ patch from sos@prospect.com.ru (Sergey Okhapkin):
+ * dcrt0.cc: remove commented out code
+ * spawn.cc: fix misapplied patch problem
+
+Sun Nov 16 15:54:27 1997 Geoffrey Noer <noer@cygnus.com>
+
+ patch from cgf@bbc.com (Chris Faylor):
+ * fhandler.cc (fhandler_dev_null::open): Open Windows 'nul'
+ device rather than "faking" a real open.
+ (fhandler_dev_null::close): delete.
+ (fhandler_dev_null::fstat): delete.
+ (fhandler_dev_null::ioctl): delete.
+ (fhandler_dev_null::read): delete.
+ (fhandler_dev_null::write): delete.
+ (fhandler_dev_null::lseek): delete.
+ (fhandler_dev_null::dup): delete.
+ * fhandler.h (class fhandler_base): delete above methods from
+ class.
+ * hinfo.cc (hinfo_vec::build_fhandler): Use new fhandler_dev_null
+ class which opens 'nul' device. Treat /dev/null similarly to
+ other Windows devices. This allows redirection of /dev/null to
+ non-cygwin processes.
+
+Sun Nov 16 15:54:27 1997 Geoffrey Noer <noer@cygnus.com>
+
+ patch from cgf@bbc.com (Chris Faylor):
+ * dcrt0.cc (do_exit): Use EXIT_* flags to determine how exit
+ should proceed. Honor new EXIT_NOCLOSEALL to avoid
+ close_all_files.
+ * exceptions.cc (__cygwin32_exception_handler): Use new
+ EXIT_SIGNAL define to indicate exiting due to signal.
+ * signal.cc (sigprocmask): Slightly more defensive check against
+ being called prior to complete cygwin setup.
+ (_raise): Defensive check to guard against being called prior to
+ complete cygwin setup.
+ * sigproc.cc (stopped_or_terminated): Use new EXIT_SIGNAL define
+ to detect exiting due to signal.
+ * sigproc.h: Define flags to be used during exit process as
+ EXIT_*.
+ * spawn.cc (spawn_guts): Use EXIT_* constants to control how
+ do_exit proceeds after _P_OVERLAY.
+
+Sun Nov 16 15:54:27 1997 Geoffrey Noer <noer@cygnus.com>
+
+ * sysconf.cc (sysconf): return 1048576 for ARG_MAX until
+ we figure out the right value (_POSIX_ARG_MAX is only 4K
+ which is too small).
+
+Sun Nov 16 15:54:27 1997 Geoffrey Noer <noer@cygnus.com>
+
+ patch from sos@prospect.com.ru (Sergey Okhapkin):
+ * dcrt0.cc (dll_crt0_1): call winsock_init if neccesary.
+ * fhandler.cc ((fhandler_socket::fhandler_socket): moved to net.cc
+ * fhandler.h (class fhandler_socket): destructor prototype added.
+ * fork.cc (cygwin_fork_helper1): set PID_SOCKETS_USED in the
+ child's pinfo if parent has open socket descriptors; call
+ winsock_init in child code if necessary.
+ * net.cc: static variable winsock_init_p removed;
+ number_of_sockets is new global variable containing number of
+ opened sockets.
+ (winsock_init): made global, save "winsock inited" flag in process
+ state field.
+ (cygwin32_winsock calls): condition for winsock initialisation
+ changed
+ (fhandler_socket::fhandler_socket): new, moved from fhandler.cc;
+ increment number_of_sockets on constructor call.
+ (fhandler_socket::~fhandler_socket): new. Decrement
+ number_of_sockets on destructor call, check for negative value.
+ (fhandler_socket::ioctl): check for winsock initialisation added.
+ * spawn.cc (spawn_guts): handle PID_SOCKETS_USED in child's pinfo.
+ * winsup.h: PID_SOCKETS_USED - new enum value; number_of_sockets
+ and winsock_init() prototypes added.
+
+Wed Nov 12 23:02:34 1997 Geoffrey Noer <noer@cygnus.com>
+
+ patch from cgf@bbc.com (Chris Faylor):
+ * exceptions.cc: Substitute do_exit for _exit as appropriate.
+ do_exit allows full 32 bits of exit value. The upper 16 bits
+ are used for special cygwin operations.
+ * winsup.h: Change definition of do_exit to allow calling from
+ signal handler.
+ * dcrt0.cc (do_exit): Change to allow calling from signal handler
+ in place of _exit. This is necessary to ensure that only cygwin
+ internal applications can exit with the upper order 16 bits set
+ to non-zero.
+
+Wed Nov 12 23:02:34 1997 Geoffrey Noer <noer@cygnus.com>
+
+ patch from cgf@bbc.com (Chris Faylor):
+ * dcrt0.cc (do_exit): New function. Subsumes functionality of
+ _exit but takes a DWORD argument. Changed to avoid some shutdown
+ activities when called with REPARENTING bit set in argument. Also
+ explicitly kills any executing non-cygwin subprocess from a
+ spawn(P_OVERLAY)...
+ (_exit): Use do_exit for exiting. Ensure that only low order 1
+ bits of status are used or confusion will result if exiting with
+ some higher order bits set.
+ * exceptions.cc (set_process_mask): Reflect new method for
+ sig_send to send signals to self.
+ (handle_sigsuspend): Reflect new method for sig_send to send
+ signals to self.
+ * fork.cc: A handle name was changed in the pinfo structure to
+ be more reflective of its use. Change forkee_stopped to
+ subproc_ready everywhere.
+ * pinfo.cc (pinfo::clearout): Change forkee_stopped to
+ subproc_ready.
+ (pinfo_init): Use PID_EXECED flag to determine if this process has
+ been execed. If so, signal the remaining stub in the process
+ which invoked us so that the stub can terminate and let us take
+ over as this pid.
+ * sigproc.cc (sig_send): Change method for determining if sending
+ signals to myself. A NULL pointer means communicate with my
+ signal handler. This is necessary to allow communication with
+ our own signal processors after reparenting an execed process.
+ Also, add an additional test to detect if a process goes away in
+ the middle of attempting to send it a signal.
+ (allow_sig_dispatch): Reflect new method for sig_send to send
+ signals to self.
+ (getsem): Use dwProcessId in names for signal semaphores. Allows
+ communicating with both parts of a process that is temporarily
+ "split in two" while execing.
+ (sig_proc): Avoid printing an error if WAIT_FAILED and exiting
+ anyway. Process requests even if loop_wait == 0.
+ (proc_subproc): Defensive check for manipulating processes prior
+ to initialization or after terminating sigproc.
+ Use different check for subprocesses that have been reparented.
+ Hopefully this will eliminate WFSO, error 6 problems.
+ (wait_subproc): Only exit when loop_wait == 0 and not dealing with
+ a process.
+ * spawn.cc: Set up two global variables, used on exit when
+ execing a non-cygwin process: hExeced - handle of non-cygwin
+ process which is being waited for by a stub, pExeced - windows pid
+ of the process.
+ (spawn_guts): Reorganize to always (temporarily) wait for the new
+ process when P_OVERLAY. If a cygwin process is invoked, then the
+ wait will return when an event is signalled and the new process
+ will be "reparented" in the ppid. If a non-cygwin process is
+ invoked, wait until the process exits or a signal is received
+ which terminates the process. In this case, the do_exit function
+ will terminate the non-cygwin process.
+ * winsup.h: Rename forkee_stopped to subproc_ready since this
+ event now has a dual role which is better defined by this new
+ name. Add a new flag (PID_EXECED) for process_state. Define a
+ new function `do_exit' which operates similarly to _exit
+ but takes > 16 quantities with the high order bit signifying
+ different exit actions.
+
+Mon Nov 10 17:11:08 1997 Geoffrey Noer <noer@cygnus.com>
+
+ * include/utime.h: remove (moved to newlib/libc/sys/cygwin32/sys)
+ so as not to conflict with the one in newlib/libc/include.
+
+Mon Nov 10 15:11:42 1997 Geoffrey Noer <noer@cygnus.com>
+
+ patch from sos@prospect.com.ru (Sergey Okhapkin):
+ * exceptions.cc (__cygwin32_exception_handler): exit with
+ "core dumped" exit code after writing "core" file.
+
+Mon Nov 10 15:11:42 1997 Geoffrey Noer <noer@cygnus.com>
+
+ patch from cgf@bbc.com (Chris Faylor):
+ * console.cc: Add convenience macros and structures for handling
+ scrolling.
+ (fhandler_console::fillin_info): New function to fill in the `info'
+ struct.
+ (fhandler_console::scroll_screen): Change to scroll only the visible
+ portion of the screen. Honor scroll regions more stringently.
+ (fhandler_console::open): Use new fillin_info function.
+ (fhandler_console::ioctl): Use new fillin_info function which
+ automatically calculates screen size.
+ (fhandler_console::clear_screen): Use new fillin_info function.
+ Only clear visible portion of screen.
+ (fhandler_console::cursor_set): Add a flag to indicate whether
+ cursor positioning is absolute within buffer or is screen relative.
+ Use new fillin_info function to get screen information.
+ (fhandler_console::cursor_rel): Use new fillin_info function.
+ Change for new cursor_set parameter.
+ (fhandler_console::cursor_get): Use new fillin_info function.
+ (fhandler_console::char_command): Use new fillin_info function
+ where appropriate. Change for new cursor set parameter where
+ appropriate. Scroll only visible portion of screen when required.
+ * fhandler.h (class fhandler_console): Add fillin_info, change
+ cursor_set to reflect additional argument.
+
+Mon Nov 10 15:11:42 1997 Geoffrey Noer <noer@cygnus.com>
+
+ patch from cgf@bbc.com (Chris Faylor):
+ * dcrt0.cc (dll_crt0_1): Register process start time.
+ * fork.cc (cygwin_fork_helper1): Register process start time.
+ * utils/ps.cc (main): Report process start time.
+ (start_time): New function to format time similarly to UNIX ps.
+ A time from today shows as HH:MM, times from previous days just
+ show the month and day.
+ * winsup.h (class pinfo): Add start_time field.
+
+Mon Nov 10 11:54:27 1997 Ian Lance Taylor <ian@cygnus.com>
+
+ * include/Windows32/Defines.h (TIME_ZONE_ID_INVALID): Define.
+ * times.cc (gettimeofday): The error return from
+ GetTimeZoneInformation is TIME_ZONE_ID_INVALID, not
+ TIME_ZONE_ID_UNKNOWN.
+
+Sun Nov 9 17:08:30 1997 Geoffrey Noer <noer@cygnus.com>
+
+ patch from cgf@bbc.com (Chris Faylor):
+ * Makefile.in: add ../libiberty/strsignal.o
+ * cygwin.din: add exports for strsignal, strtosigno
+ * utils/kill.cc: changes to allow accepting signal name
+ as argument
+
+Sun Nov 9 17:08:30 1997 Geoffrey Noer <noer@cygnus.com>
+
+ * include/limits.h: define PATH_MAX here instead of
+ include/sys/param.h, define _POSIX_NGROUPS_MAX as 0 not 1
+ (system invariant value, not implementation-specific)
+ * include/sys/param.h: remove PATH_MAX, change NOFILE from 64
+ to 8192, delete PATHSIZE, remove safety wrapper around
+ MAXHOSTNAMELEN, add comments
+ * sysconf.cc (sysconf): return NGROUPS_MAX not zero,
+ return _POSIX_SAVED_IDS not zero. Return _POSIX_CHILD_MAX
+ not 4096. Return _POSIX_CHILD_MAX, not 8.
+
+ patch from sos@prospect.com.ru (Sergey Okhapkin):
+ * winsup.h: add proto for setdtablesize, define NOFILE_INIT
+ and NOFILE_INCR
+ * hinfo.cc (hmap_init, hinfo_vec::find_unused_handle): change to
+ support virtually unlimited numbers of fds. Remove setdtablesize
+ proto
+ * syscalls.cc: initialize dtable_size to NOFILE_INIT instead of
+ NOFILE
+
+Thu Nov 6 13:14:09 1997 Geoffrey Noer <noer@cygnus.com>
+
+ * exceptions.cc (__cygwin32_exception_handler): don't
+ print "In cygwin32_except_handler" for exceptions Cygwin32
+ isn't going to handle. Print "(progname PID) Exception: <type>"
+ to console. Redirect all detailed information including the
+ stack trace to <progname>.core. This should reduce confusion
+ about what's causing the exception (a lot of people would see "In
+ cygwin32..." and think the problem was in Cygwin32 when most of
+ the time it was in some other program).
+ * syscalls.cc: add fixme
+ * times.cc: add fixme
+
+Wed Nov 5 19:23:10 1997 Geoffrey Noer <noer@cygnus.com>
+
+ patch from cgf@bbc.com (Chris Faylor):
+ * Makefile.in: force .c.os and .cc.os to be built in same
+ directories as source
+
+Wed Nov 5 19:23:10 1997 Geoffrey Noer <noer@cygnus.com>
+
+ * drct0.cc (dll_crt0_1): stop initializing winsock on process
+ startup since that slows down startup time of all processes, even
+ ones that don't end up making Winsock calls.
+ * fork.cc (cygwin_fork_helper1): don't need to call uinfo_init
+ or socket_checkinit after fork -- the appropriate functions will
+ do the necessary initialization if they are ever called.
+ * net.cc: init winsock_init_p to zero and make it static
+ (all exported functions): call winsock_init before making
+ any WinSock calls since this no longer happens in dcrt0.cc
+ startup code. Only do this if !winsock_init_p.
+ (winsock_init): checkinit renamed. Now just inits winsock
+ without checking whether it has been already initialized.
+ Make it static.
+ * uinfo.cc (uinfo_init): after we call getpwnam, we know
+ the passwd file has been read in so don't check initialization
+ of it. However, we do need to read_etc_group() if group_in_memory
+ isn't set.
+ * passwd.cc: rename global i variable to pw_pos, rename
+ passwd_in_memory to passwd_in_memory_p to match net.cc scheme.
+ Add comments.
+ (read_etc_passwd): make static
+ (various): make sure to read_etc_passwd() if passwd_in_memory
+ isn't set
+ * grp.cc: add comments, rename idx global to grp_pos,
+ rename group_in_memory to group_in_memory_p to match net.cc
+ scheme, group_in_memory_p no longer static (needs to be accessed
+ by uinfo_init)
+ * winsup.h: remove proto for socket_checkinit since that's
+ renamed and static within net.cc
+
+Tue Nov 4 01:02:20 1997 Geoffrey Noer <noer@cygnus.com>
+
+ patch from cgf@bbc.com (Chris Faylor):
+ * signal.cc (sigprocmask): Newer versions of gcc will call
+ sigprocmask when a builtin constructor is activated. If this
+ happens prior to the setup of u->self, then a NULL dereference
+ will occur. Guard against this.
+
+Mon Nov 3 17:00:45 1997 Geoffrey Noer <noer@cygnus.com>
+
+ patch from cgf@bbc.com (Chris Faylor):
+ * hinfo.cc (hinfo_vec::build_fhandler): Open a console for
+ /dev/tty when !use_tty.
+
+Thu Oct 30 10:28:15 1997 Tom Tromey <tromey@cygnus.com>
+
+ * include/mapi.h: New file.
+ * sysdef/i386/mapi32.def (MAPISendMail@20): New export.
+
+Thu Oct 30 15:08:13 1997 Geoffrey Noer <noer@cygnus.com>
+
+ * times.cc: add comments listing standards funcs are defined in
+ (dump_filetime): remove unused local func
+ * net.cc (fail): remove local func, replace one reference with
+ equivalent debug_printf, add standards comments, reformat a little
+ (fhandler_socket::close): simplify handling of res
+ (fhandler_socket::fstat): set ENOSYS (unimplemented)
+ * stubs.cc: set ENOSYS in unimplemented funcs
+ * uname.cc: add standards comment
+ * ntea.cc: reformat
+
+Wed Oct 29 22:43:57 1997 Geoffrey Noer <noer@cygnus.com>
+
+ * times.cc (settimeofday): set ENOSYS instead of EPERM
+ since ENOSYS maps to "Function not implemented" which is the
+ case here.
+ * syscalls.cc (seterrno): on failure, set EACCES instead of EPERM
+ which is better for the unknown error case
+
+Fri Oct 24 01:24:07 1997 Geoffrey Noer <noer@cygnus.com>
+
+ patch from green@cygnus.com (Anthony Green):
+ * dcrt0.cc: new host_dependent_constants object with a global
+ instance of it which allows constants that are different in Win 95
+ and NT to be saved here instead of having forks in the code and
+ having to check the OS type each time. Add two constants for
+ fhandler, one for sharing attributes and one for upper word value
+ for locking files.
+ (dll_crt0_1): call host_dependent init function
+ * fhandler.cc (fhandler_base::open): use above object for
+ setting shared attributes
+ (fhandler_disk_file::lock): get upper word for locking from
+ host_dependent_constants
+ * winsup.h: define host_dependent_constants class and add extern
+ for global instance of it
+
+Wed Oct 22 02:27:53 1997 Geoffrey Noer <noer@cygnus.com>
+
+ patch from sos@prospect.com.ru (Sergey Okhapkin):
+ * cygwin.din: Export getenv, putenv, setenv and unsetenv instead
+ of cygwin32_ wrappers
+ * dcrt0.cc: External variable environ removed
+ (dll_crt0_1): strip executable's path on console title if
+ environment variable CYGWIN_TITLE set to "strip", references to
+ environ removed.
+ * environ.cc: New file. Code derived from newlib sources.
+ * exec.cc: include stdlib.h
+ (execl, execv): new (derived from newlib sources).
+ (sexecve): reference to environ removed.
+ (sexecvpe): call getenv instead of cygwin32_getenv.
+ * grp.cc: new static variable group_in_memory
+ (read_etc_group): skip blank lines
+ (getgrgid, getgrnam, getgrent): call read_etc_group when necessary.
+ * misc.cc (cygwin32_getenv/putenv/setenv/unsetenv): remove
+ wrappers.
+ * passwd.cc: new static variable passwd_in_memory
+ (read_etc_passwd): skip blank lines
+ (search_for, getpwent): call read_etc_passwd when necessary.
+ (setpwent): fixed incorrect initialization of i var.
+ * pinfo.cc (pinfo_init): initialize uid with illegal value to
+ force read of /etc/passwd and /etc/group.
+ * spawn.cc: call getenv instead cygwin32_getenv
+ (spawn_guts): force read of /etc/passwd and /etc/group on sexec
+ calls.
+ * uinfo.cc (uinfo_init): read /etc/passwd and /etc/group only if
+ uid is undefined.
+ * winsup.h: remove protos for environ, cygwin32_getenv,
+ cygwin32_putenv
+
+Wed Oct 22 02:08:54 1997 Geoffrey Noer <noer@cygnus.com>
+
+ * utils/aclocal.m4: new file. Define autoconf macros for
+ determining whether we're compiling for the cygwin32 environment
+ or not and determine the executable suffix
+ * utils/configure.in: call AM_CYGWIN32 and AM_EXEEXT
+ * utils/configure: regenerate
+ * utils/Makefile.in: add $(exeext) after executable names so
+ programs will be built with the .exe suffix
+
+Wed Oct 22 00:50:27 1997 Geoffrey Noer <noer@cygnus.com>
+
+ Now that it is possible to use gdb using a stable
+ cygwin.dll to debug a program using a newer, potentially buggy
+ cygwin.dll, the strace mechanism will probably end up being
+ used more and more for debugging timing/race-condition bugs that
+ aren't easily exposed in a gdb session. The following changes
+ make the strace facility better for debugging timing issues by
+ storing the last few commands in a buffer instead of writing
+ to disk each function call.
+
+ patch from cgf@bbc.com (Chris Faylor):
+ * dcrt0.cc (dll_crt0_1): Change to strace_init call to take
+ an argument (for planned future registry changes).
+ (_exit): Call strace_dump when appropriate. Add a debugging
+ printf.
+ * include/sys/strace.h: Add _STRACE_CACHE, _STRACE_EXITDUMP,
+ strace_dump ().
+ * strace.c (strace_init): Allow hexadecimal, octal setting of
+ strace flags in environment variable. Handle new cache option.
+ (strace_printf): Display number of seconds from last message.
+ Handle _STRACE_CACHE.
+ (strace_dump): New function. Dump cached messages to disk.
+
+Wed Oct 22 00:08:40 1997 Geoffrey Noer <noer@cygnus.com>
+
+ * cygwin.din: export socket calls without cygwin32_ prefix
+ * net.cc: remove unused herror function in favor of
+ cygwin32_herror which is exported as herror
+ * include/netdb.h: we are now exporting the socket calls without
+ the cygwin32_ prefix so we don't need the nasty remapping in
+ header files
+ * include/arpa/inet.h: ditto
+ * include/sys/socket.h: ditto
+ * select.cc (select): make extern C
+
+Tue Oct 21 22:52:29 1997 Geoffrey Noer <noer@cygnus.com>
+
+ patch from cgf@bbc.com (Chris Faylor):
+ * sigproc.cc (sigproc_terminate): Fix flawed attempt to signal
+ any processes waiting for signal notification success when the
+ process receiving the signal is terminating.
+ (wait_subproc): Report on errors when opening the
+ sync_proc_subproc mutex. Move initialization of events[0]
+ "wakeup" signal prior to wait_subproc_inited or risk a (miniscule)
+ chance for a reference to a NULL handle.
+ * strace.cc (ta[]): Change WM_ASYNCIO entry to reflect previous
+ changes to WM_ASYNCIO constant.
+
+Tue Oct 21 14:30:14 1997 Geoffrey Noer <noer@cygnus.com>
+
+ patch from cgf@bbc.com (Chris Faylor):
+ * sigproc.cc (proc_subproc): fix minor error output problem
+
+Mon Oct 20 20:19:02 1997 Geoffrey Noer <noer@cygnus.com>
+
+ * Makefile.in: change DLL_NAME to cygwin97r2.dll
+
+Mon Oct 20 20:16:47 1997 Geoffrey Noer <noer@cygnus.com>
+
+ patch from sos@prospect.com.ru (Sergey Okhapkin):
+ * window.cc (alarm): When there is a previous alarm() request
+ with less than one second remaining, then the return from a call
+ to alarm() is supposed to return 1.
+
+Mon Oct 20 20:16:47 1997 Geoffrey Noer <noer@cygnus.com>
+
+ patch from cgf@bbc.com (Chris Faylor):
+ * Makefile.in: Add sigproc.o target. Add sigproc.h dependency
+ where appropriate. Add -s to intermediate ld of cygwin.dll to
+ speed up the process of building the .dll.
+ * dcrt0.cc: Add new sigproc.h include.
+ (dll_crt0_1): Replace window_init with sigproc_init for
+ initialization of signal/sub process handling. Change to use new
+ process_state field in pinfo.
+ (_exit): Remove spurious debugging statement. Terminate sigproc
+ processing. Remove signal blocking obviated by previous signal
+ termination. Remove SIGCHLD notification of parent as it is now
+ handled automatically in the parent.
+ (api_fatal): Terminate sigproc processing.
+ * exceptions.cc: Add new sigproc.h include. Change name of
+ ourhThread.
+ (ctrl_c_handler): Change to static as this is no longer called
+ outside of this module.
+ (lock_cs): Change to a function which will optionally grab new
+ signal dispatch mutex. Don't wait forever for cs mutex.
+ (unlock_cs): Change to a function which will optionally release
+ new signal dispatch mutex.
+ (init_exceptions): Detect errors from SetConsoleCtrlHandler.
+ Initialize new sig_dispatch mutex. This mutex is used to
+ control dispatching to a function on signal receipt.
+ (sig_dispatch_pending): New function. Called from signal
+ processing thread to dispatch pending signals.
+ (set_process_mask): Block signal dispatch during setting of new
+ mask, if possible. Contact signal thread to dispatch pending
+ signals.
+ (handle_sigsuspend): New function. Attempts to implement a
+ sigsuspend which will not lose signal notification. Called from
+ sigsuspend.
+ (call_handler): Use sigproc_printf where appropriate.
+ (ctrl_c_handler): Use _raise to invoke the correct signal.
+ (sighandle): New function. Subsumes most of ctrl_c_handler.
+ Change to mark as suspended signals which would dispatch for which
+ the sig_dispatch mutex is unavailable. Use sigproc_printf where
+ appropriate.
+ (events_init): Remove application_stopped mutex made obsolete by
+ new sigproc handling.
+ (events_terminate): Remove application_stopped mutex made
+ obsolete by new sigproc handling.
+ * fork.cc: Add new sigproc.h include.
+ (cygwin_fork_helper1): Use process_state field in pinfo (replaces
+ inuse_p). Call proc_register to add a new subproc to sigproc
+ handling. Call sigproc_init for new subprocess. Remove obsolete
+ window_init.
+ * heap.cc (_sbrk): Use process_state field in pinfo (replaces
+ split_heap_p).
+ * hinfo.cc (hmap_init): Use process_state field in pinfo (replaces
+ cygwin_parent_p).
+ * include/sys/strace.h: Add tracing for signal/subprocesses.
+ * init.cc: Add new sigproc.h include. Add waitq_storage global
+ for new sigproc handling.
+ (dll_entry): Add initialization, destruction of structures needed
+ by new sigproc handling.
+ * net.cc (fhandler_socket::ioctl): Use gethwnd() function to find
+ hwnd of hidden window.
+ * pinfo.cc: Add new sigproc.h include.
+ (pinfo::clearout): Use process_state field in pinfo (replaces
+ split_heap_p). Explicitly initialize various handles to NULL.
+ (pinfo_init): Use process_state field in pinfo (replaces
+ cygwin_parent_p).
+ (pinfo_list::operator): Use process_state field in pinfo (replaces
+ inuse_p).
+ (pinfo_list::alocate_pid): Initialize process_state field.
+ (pinfo::init_self): Remove obsolete initialization of hProcess.
+ (pinfo::record_death_nolock): Changes for new sigproc handling.
+ (pinfo::record_death): Move bulk of this code to sigproc.cc.
+ (pinfo::terminate): Remove function made obsolete by sigproc
+ handling.
+ (pinfo::init_from_exec): Use process_state field (replaces
+ inuse_p).
+ * signal.cc: Add new sigproc.h include.
+ (kill_worker): Call new sig_send function to send signals to
+ cygwin processes.
+ (_kill): Use process_state field in pinfo (replaces inuse_p).
+ (sigsuspend): Call handle_sigsuspend in exceptions.cc to handle
+ sigsuspend in a non-raceable way.
+ * sigproc.cc: New signal/subprocess handling module. Replaces
+ SendMessage method for signals with a method using semaphores.
+ Also detects changes in the state of child processes.
+ * sigproc.h: New header file defining constants and functions for
+ signal/subprocess handling.
+ * spawn.cc: Add new sigproc.h include. Clean up trailing spaces.
+ (spawn_guts): Reorganize to use new sigproc handling.
+ Use new pinfo process_state field (replaces inuse_p).
+ * syscalls.cc (_read): Use new pinfo process_state field (replaces
+ inuse_p).
+ (_write): ditto.
+ * tty.cc (tty_init): Use new pinfo process_state field (replaces
+ cygwin_parent_p).
+ * utils/ps.cc (main): Use new pinfo process_state field (replaces
+ inuse_p). Detect "zombie" processes similarly to UNIX ps.
+ * wait.cc: Add required includes.
+ (wait_found): Function obsoleted by new sigproc handling.
+ (wait4): Reorganize to use new sigproc handling.
+ * window.cc: Changes for new sigproc handling.
+ (WndProc): Remove SIGNAL handling obsoleted by new sigproc
+ handling. Use static window handle since the field has been
+ removed from pinfo. Use _raise where appropriate to send signals.
+ (Winmain): Replace global window handle with static since the
+ field has been removed from pinfo.
+ (window_init): Remove obsolete function.
+ (gethwnd): New function to allocate hidden window on demand rather
+ than at startup.
+ (window_terminate): Kill hidden window only if allocated.
+ (setitimer): Use gethwnd function to retrieve hidden window
+ handle.
+ * winsup.h: Remove stuff made obsolete by sigproc handling. Move
+ some constants to new sigproc.h header file. Remove inuse_p,
+ cygin_parent_p, split_heap_p. Replace with a single process_state
+ field. Define bit fields for process_state in an enum for easier
+ debugging.
+
+Mon Oct 20 19:17:33 1997 Geoffrey Noer <noer@cygnus.com>
+
+ * sysdef/i386/winserve.def: remove ancient version of cygwin.din
+ * include/sgtty.h: remove since Cygwin32's tty handling doesn't
+ support bsd syntax/semantics
+ * include/sys/termios.h: change winsize struct to include
+ ws_xpixel and ws_ypixel members
+ * cygwin.din: remove export of ScreenCols, ScreenGetCursor,
+ ScreenRows, ScreenSetCursor, get_pid__5pinfo, getkey, _getkey,
+ kbhit, _kbhit, __small_printf = small_printf__FPCce
+ * key.cc: remove. Similar functionality exists in ncurses
+ which can be compiled for Cygwin32
+ * console.cc (ScreenCols, ScreenGetCursor, ScreenSetCursor,
+ ScreenRows): delete and delete SCREEN_ROWS/COLS defines
+ * pold.c: remove old pipe-related code that's no longer used
+ * include/regex.h: remove, it's not a part of cygwin.dll
+ * syscalls.cc: started to add comments including standards
+ information
+ (truncate): new
+ (ftruncate): length is an off_t, not a size_t. Add missing
+ return value to debug printf
+ * syscalls.h: ftruncate length is an off_t, add proto for truncate
+
+ patch from cgf@bbc.com (Chris Faylor):
+ * console.cc (fhandler_console::write): Recognize '@' as a valid
+ character to follow a '\e[' sequence or get 'Bad escape' errors.
+
+Wed Oct 15 18:44:25 1997 Geoffrey Noer <noer@cygnus.com>
+
+ * cygwin.din: restore __main as an export
+
+Mon Oct 13 18:41:09 1997 Geoffrey Noer <noer@cygnus.com>
+
+ * cygwin.din: revert renaming of __assert since that's
+ actually what it's supposed to be called
+ * assert.cc: ditto
+
+Fri Oct 10 19:25:49 1997 Tom Tromey <tromey@cygnus.com>
+
+ * include/Windows32/Base.h: Moved typedefs of CHAR, SHORT, etc,
+ before all other uses in file.
+
+Fri Oct 10 17:50:12 1997 Ian Lance Taylor <ian@cygnus.com>
+
+ * include/Windows32/Base.h: Only typedef CHAR, SHORT, and LONG if
+ VOID is not defined
+
+Thu Oct 9 00:46:40 1997 Geoffrey Noer <noer@cygnus.com>
+
+ * cygwin.din: remove all libgcc.a exports. They don't
+ belong here since libgcc.a doesn't really relate to the
+ purpose of cygwin.dll, and (to make things worse) the contents
+ change over time.
+ * assert.cc: rename __assert to __cygwin32_assert
+ * exceptions.cc: rename __stack_trace to __cygwin32_stack_trace,
+ __cygwin_except_handler to __cygwin32_except_handler
+ * version.h: increment major and minor numbers
+
+Tue Oct 7 12:52:25 1997 Geoffrey Noer <noer@cygnus.com>
+
+ patch from sos@prospect.com.ru (Sergey Okhapkin):
+ * dcrt0.cc (_exit): under Win 95, don't send SIGCHLD
+ unless special env variable is set. This works around a
+ problem where exiting a process can hang under Win 95.
+
+Mon Oct 6 23:41:34 1997 Geoffrey Noer <noer@cygnus.com>
+
+ * regexp: new directory containing free regexp code by
+ Henry Spencer. Taken from the most recent release of NetBSD.
+ Write configure.in and Makefile.in, based on files from
+ winsup/utils.
+ * Makefile.in: build regexp directory and include objs in
+ cygwin.dll.
+ * stubs.cc: remove all reg* stubs except for regfree which
+ isn't provided by above code.
+
+Mon Oct 6 13:35:48 1997 Geoffrey Noer <noer@cygnus.com>
+
+ * dcrt0.cc: remove asm idata3 terminator, now that ld is fixed
+ such that this is no longer necessary.
+ * libccrt0.cc: ditto
+
+Mon Oct 6 13:14:00 1997 Geoffrey Noer <noer@cygnus.com>
+
+ patch from sos@prospect.com.ru (Sergey Okhapkin):
+ * spawn.cc (spawn_guts): return child's PID on
+ spawn (_P_NOWAIT,...) instead of child's handle.
+ (cwait): rewritten as a wrapper to waitpid.
+
+Mon Oct 6 13:02:01 1997 Geoffrey Noer <noer@cygnus.com>
+
+ patch from sos@prospect.com.ru (Sergey Okhapkin):
+ * net.cc (socketpair): new
+ * cygwin.din: add socketpair export
+
+Mon Oct 6 13:01:51 1997 Geoffrey Noer <noer@cygnus.com>
+
+ patch from cgf@bbc.com (Chris Faylor):
+ * dcrt0.cc: Remove obsolete call to fork_terminate.
+ * exceptions.cc: Respace, remove extraneous trailing whitespace.
+ Change critical section to mutex since there are supposedly
+ multi-processor problems with critical sections under NT.
+ Use "lock_cs" and "unlock_cs" macros to lock/unlock critical
+ regions.
+ (init_exceptions): Change critical section initialization to mutex
+ initialization.
+ (set_process_mask): Use locking macros to control access to
+ sig_mask.
+ (ctrl_c_handler): Use lock_cs/unlock_cs to control access.
+ (events_init): Use standard cygname function to create names for
+ shareable objects.
+ (events_init): Close cs mutex.
+ * fork.cc: Use event flags which are specific to the child being
+ forked. This prevents one process from prematurely activating
+ another. It also makes fork slightly more thread-safe.
+ (fork_init): Remove event initialization.
+ (fork_terminate): Remove function.
+ (cygwin_fork_helper1): Initialize events on a per-fork basis.
+ Events are inherited in child's pinfo structure.
+ Remove child->hThread initialization as it not needed. Use
+ pi.hThread where child->hThread is used.
+ Work around Windows 95 bug where a WaitForSingleObjects will
+ sometimes return ERROR_INVALID_HANDLE when it is resumed after
+ a suspend.
+ * pinfo.cc: Remove references to hThread field whereever it occurs.
+ * strace.cc: Use standard cygname function to create name for
+ strace_mutex. Prevents confusion between different .dll versions.
+ * wait.cc (wait_found): Remove reference to hThread.
+ * winsup.h (class pinfo): Remove reference to hThread. Add
+ per-process fork control event handles.
+ * include/limits.h: Increase NGROUPS_MAX from 0 to 1 to reflect
+ recent change to getgroups.
+
+Mon Oct 6 11:06:22 1997 Geoffrey Noer <noer@cygnus.com>
+
+ Oops. ../libio refers to objdir and is not the same
+ as $(srcdir)/../libio.
+
+Thu Oct 2 23:12:19 1997 Geoffrey Noer <noer@cygnus.com>
+
+ Revert patches to sources applied after Sept 16. Removed
+ relevant portions of ChangeLog entries. Some of those changes
+ may reappear later (removing the entries makes this log easier
+ to understand).
+
+Thu Oct 2 15:34:03 1997 Geoffrey Noer <noer@cygnus.com>
+
+ * Makefile.in: remove hardcoding of SHELL to /bin/sh, remove
+ ../libio from INCLUDES since $(srcdir)/../libio is already
+ included.
+ * glob/Makefile.in: remove hardcoding of SHELL to /bin/sh
+
+Mon Sep 29 14:06:24 1997 Geoffrey Noer <noer@cygnus.com>
+
+ patch from sos@prospect.com.ru (Sergey Okhapkin):
+ * cygwin.din: add exports for rcmd, rresvport, rexec
+ * net.cc (cygwin32_rcmd): new
+ (cygwin32_rresvport): new
+ (cygwin32_rexec): new
+ * include/mywinsock.h: add protos for Winsock calls associated
+ with functions called by the above.
+
+Mon Sep 29 13:26:24 1997 Geoffrey Noer <noer@cygnus.com>
+
+ patch from cgf@bbc.com (Chris Faylor):
+ * grp.cc (getgrent): Change overlooked comment to reflect new
+ behavior.
+
+Thu Sep 25 18:35:49 1997 Geoffrey Noer <noer@cygnus.com>
+
+ * Makefile.in: remove debugdll defs since the shared memory
+ overlap problem is solved by the timestamp addition of Sept 23
+ * version.h: rework explanations of version numbers
+
+Thu Sep 25 16:21:49 1997 Geoffrey Noer <noer@cygnus.com>
+
+ * spawn.cc: add missing cast to debug printf
+
+Thu Sep 25 16:14:17 1997 Ian Lance Taylor <ian@cygnus.com>
+
+ * path.cc (conv_to_win32_path): Call backslashify on a win32
+ path.
+
+Tue Sep 23 17:58:17 1997 Geoffrey Noer <noer@cygnus.com>
+
+ Fixes for things that were causing compile-time warnings:
+ * exec.cc (_execve): add missing const to args to match def
+ of execve in newlib which this calls.
+ (sexecve): add missing const to def
+ (sexeclpe): don't need to cast argv in sexecvpe call
+ (sexecvpe): add missing const to def
+ * winsup.h: correct _execve proto, add protos for login/logout
+ * syscalls.h: correct sexecve, sexecvpe protos
+ * include/Windows32/Base.h: NULL should be defined differently
+ for C++
+ * init.cc: respacing
+
+Tue Sep 23 17:05:50 1997 Geoffrey Noer <noer@cygnus.com>
+
+ patch from sos@prospect.com.ru (Sergey Okhapkin):
+ * dcrt0.cc (dll_crt0_1): don't use alloca for allocating storage
+ for environment blocks because setenv() uses realloc!
+
+Tue Sep 23 17:05:50 1997 Geoffrey Noer <noer@cygnus.com>
+
+ patch from cgf@bbc.com (Chris Faylor):
+ * Makefile.in (LD_STUFF): Add datestamp.o after DLL_OFILES.
+ (datestamp.o): New target. datestamp.c is generated whenever .o
+ files change. It creates a file containing a "date stamp"
+ which is used by the function "cygname" to create named
+ shared memory, events, mutexes, and semaphores used by
+ cygwin.dll. The unique datestamp allows multiple loading of
+ different cygwin.dll's even when they have incompatible use
+ of shared memory areas.
+ * init.cc (dll_entry): Create the name string used by cygname
+ from the name of the invoking .dll + the datestamp of the
+ .dll from the auto-generated datestamp.c
+ * misc.cc (cygname): New function. Creates a standard Cygnus
+ shared resource name given a prefix, a name (e.g., pinfo_mutex),
+ and a numeric suffix (e.g., a pid). Replaces custom code in
+ several files. Uses cygwin_dlldate from datestamp.c to construct
+ names that are unique for a given cygwin load.
+ * shared.cc (open_shared_file_map): Use standard cygname function
+ to create names for sharable objects. Use static handle 'h'
+ so that it can be closed later by shared_terminate.
+ (shared_terminate): Guard against calling CloseHandle with a
+ NULL handle.
+ (create_shared_fd_mapping_name): Use cygname function to generate
+ the name for the "fd_map".
+
+Tue Sep 16 23:34:36 1997 Geoffrey Noer <noer@cygnus.com>
+
+ patch from sos@prospect.com.ru (Sergey Okhapkin):
+ * fcntl.cc (_fcntl): correct errno value (EBADF instead of
+ EBADFD).
+
+Tue Sep 16 17:22:28 1997 Geoffrey Noer <noer@cygnus.com>
+
+ patch from sos@prospect.com.ru (Sergey Okhapkin):
+ * include/Windows32/Defines.h: add missing defines needed
+ for NTEA usage.
+ * ntea.cc: remove them from here
+ * syscalls.cc (_link): call CreateFile with FILE_WRITE_ATTRIBUTES
+ flag instead of GENERIC_WRITE
+
+Tue Sep 16 17:22:28 1997 Geoffrey Noer <noer@cygnus.com>
+
+ patch from cgf@bbc.com (Chris Faylor):
+ * pinfo.cc (pinfo_init): Fix a NULL pointer dereference when PID
+ environment variable contains garbage.
+
+Thu Sep 11 16:51:40 1997 Geoffrey Noer <noer@cygnus.com>
+
+ * syscalls.cc (ftruncate): read file pointer location at
+ beginning of function and restore it at the end
+
+Thu Sep 11 15:35:10 1997 Ian Lance Taylor <ian@cygnus.com>
+
+ * path.cc (backslashify): Don't turn a single trailing slash into
+ a double trailing slash.
+
+Wed Sep 10 11:40:55 1997 Ian Lance Taylor <ian@cygnus.com>
+
+ * include/Windows32/Structures.h: Add PACKED to PRINTDLG.
+ * include/Windows32/Functions.h: Add STDCALL to a few function
+ declarations.
+
+Tue Sep 9 02:12:18 1997 Geoffrey Noer <noer@cygnus.com>
+
+ patch from sos@prospect.com.ru (Sergey Okhapkin):
+ * syscalls.cc (_link): Implement hard links under NT with NTFS
+ using the backup API. Default to copying the file (what we did
+ before).
+
+Mon Sep 8 20:19:09 1997 Geoffrey Noer <noer@cygnus.com>
+
+ Merge in the following changes:
+
+ Thu Aug 21 13:30:12 1997 Ian Lance Taylor <ian@cygnus.com>
+ * assert.cc: New file.
+ * Makefile.in (DLL_OFILES): Add assert.o.
+ (assert.o): New target.
+ * pinfo.cc (cygwin32_winpid_to_pid): New C function.
+ * cygwin.din: Add cygwin32_winpid_to_pid.
+ * include/sys/cygwin.h: Include <sys/types.h>.
+ (cygwin32_winpid_to_pid): Declare.
+ * pinfo.cc (pinfo_init): Add debug_printf showing pid and pgid.
+
+ Wed Aug 20 13:24:30 1997 Ian Lance Taylor <ian@cygnus.com>
+ * spawn.cc (env_sort): New static function.
+ (spawn_guts): Sort the environment before passing it to
+ CreateProcess.
+ * exceptions.cc (exit_already): New file static variable.
+ (__cygwin_exception_handler): If exit_already is set, just
+ return. If we get an exception we don't recognize, let the next
+ exception handler handle it. Just ignore the INVALID_HANDLE
+ exception.
+ (really_exit): Remove file static exit_already variable; use the
+ global one.
+ (events_terminate): Set exit_already.
+ * include/Windows32/Defines.h (EXCEPTION_INVALID_HANDLE): Define.
+ (STATUS_INVALID_HANDLE): Define.
+ * include/Windows32/Functions.h: Declare some shell functions.
+
+Mon Sep 8 17:40:46 1997 Geoffrey Noer <noer@cygnus.com>
+
+ patch from sos@prospect.com.ru (Sergey Okhapkin):
+ * dcrt0.cc (_exit): Kill the foreground process group on session
+ leader exit only if job control is in progress.
+ * exceptions.cc (ctrl_c_handler): protect the code with critical
+ section. This helps stability under Win 95.
+ * include/sys/strace.h: add new wm_printf macro
+ * signal.cc (kill_worker): window message number changed (window
+ messages WM_USER-WM_USER+0x100 reserved for common controls on
+ windows95). Debug print added.
+ * spawn.cc (spawn_guts): removed unneeded flag DETACHED_PROCESS.
+ * strace.cc: defines for SIGNAL and ASYNCIO messages added.
+ * tty.cc (create_tty_master): initialize speed fields of termios
+ structure.
+ (fhandler_pty_master::open): likewise.
+ * window.cc (WndProc): debug print added, window message number
+ changed.
+ * winsup.h: WM_ASYNCIO number changed.
+
+Mon Sep 8 16:40:46 1997 Geoffrey Noer <noer@cygnus.com>
+
+ patch from cgf@bbc.com (Chris Faylor):
+ * fhandler.h: set_w_binary/set_r_binary now defined to
+ return void
+ * grp.cc (getgroups): always return an array of length 1 where
+ the element is the user's gid.
+ * pinfo.cc (pinfo_init): verify that we haven't exceeded the
+ maximum number of processes
+ (pinfo_list::allocate_pid): ditto
+ * include/Windows32/Functions.h: add noreturn attrib to ExitProcess
+ * include/sys/strace.h: change strace defs so strace-related
+ printfs will automatically add __FUNCTION__: to the beginning,
+ rename __sys_printf to strace_printf.
+ * *.cc: remove function names from debug printfs in favor of the
+ new scheme where they are automatically added, change __sys_printf
+ references (now strace_printf).
+ * smallprint.c (__small_vsprintf): new function displayer code
+ to support the above changes
+
+Wed Sep 3 12:44:45 1997 Geoffrey Noer <noer@cygnus.com>
+
+ * Makefile.in: split subdir_do into subdir_dobefore and
+ subdir_doafter to reflect whether the subdir in question
+ should be built before or after the top level is built
+ (e.g. glob needs to be built before libcygwin.a but libcygwin.a
+ needs to be built before utils).
+
+Thu Aug 28 12:09:39 1997 Geoffrey Noer <noer@cygnus.com>
+
+ * configure.in: when setting up EXE_LDFLAGS, correct the
+ location of crt0.o to ../../newlib since EXE_LDFLAGS is used
+ by Cygwin32 subdirectories where newlib is two directories up
+ instead of one.
+ * configure: regenerate with autoconf
+
+Thu Aug 28 00:13:11 1997 Geoffrey Noer <noer@cygnus.com>
+
+ Replace all licensing-related headers in all Cygnus-owned
+ files. Instead of listing terms at the top of each file, now
+ we simply refer to:
+ * CYGWIN32_LICENSE: new file listing Cygwin32 licensing terms
+
+Wed Aug 27 17:40:16 1997 Geoffrey Noer <noer@cygnus.com>
+
+ * cygwin.din: export random, srandom
+
+Wed Aug 20 16:56:39 1997 Geoffrey Noer <noer@cygnus.com>
+
+ * Makefile.in: remove unused winsock-related build rules
+ that were commented out, minor comment changes, remove
+ test.exe build rule.
+
+Wed Aug 20 14:45:17 1997 Geoffrey Noer <noer@cygnus.com>
+
+ * Makefile.in: link cygwin.dll with -lm -lgcc -lc -lgcc instead
+ of -lc -lm -lm -lgcc so lgcc finds abort(). Add definitions that
+ will eventually be used to build a cygwindebug.dll used by gdb
+ so gdb can debug a buggy cygwin.dll. Change some variable names
+ to have underscores in them (DLL_NAME, LIB_NAME, DEF_FILE, etc.).
+ Comment out text.exe build rule.
+
+Tue Aug 19 20:41:51 1997 Geoffrey Noer <noer@cygnus.com>
+
+ * dcrt0.cc: respace, modify some comments slightly
+
+Tue Aug 19 16:17:57 1997 Geoffrey Noer <noer@cygnus.com>
+
+ * Makefile.in: include ../libiberty/random.o, stop including
+ librx since it is LGPL'd code.
+ * stubs.cc: add stubs for regcomp, regexec, regerror, regfree
+ * dcrt0.cc (dll_crt0_1): default to not support tty/pty devs,
+ default to not displaying the running process in the title bar.
+
+Fri Aug 15 18:23:43 1997 Rob Savoye <rob@cygnus.com>
+
+ Add mingw directory for the minimalist cygwin environment.
+ See mingw/ChangeLog for changes specific to that directory
+
+ * configure.in: Add mingw to AC_CONFIG_SUBDIR.
+ * configure: Regenerated from autoconf 2.12 with Cygnus patches.
+ * Makefile.in: Use subdir_do which uses the value of $SUBDIRS
+ rather than having seperate target for each directory.
+ * glob/Makefile.in: Add a phony target for install.
+ * configure.in: Add mingw to AC_CONFIG_SUBDIR.
+
+Fri Aug 15 01:12:19 1997 Geoffrey Noer <noer@cygnus.com>
+
+ * times.cc: add missing extern "C"s around exported functions
+
+Thu Aug 14 17:00:32 1997 Geoffrey Noer <noer@cygnus.com>
+
+ patch from sos@prospect.com.ru (Sergey Okhapkin):
+ * console.cc (fhandler_console::input_tcsetattr): clear iflag_ and
+ lflag_ when tty support enabled.
+ (FakeReadFile): do not interrupt read when tty support enabled.
+ Do not reset signal_arrived event.
+ * cygwin.din: add exports - cf(g)set(i)ospeed, login, logout, ttyslot
+ * dcrt0.cc (_exit): kill orphaned childs with SIGHUP and SIGCONT
+ on group leader exit, kill foreground process group on session
+ leader exit.
+ * dirsearch.cc (closedir): check for FindFirst() was called
+ * exceptions.cc: include mywinsock.h.
+ (call_handler): call WSACancelBlockingCall to try to interrupt
+ blocking winsock call, do PulseEvent() instead of SetEvent().
+ (ctrl_c_handler): clear pending SIGCONT on stop signals, clear all
+ pending stop signals on SIGCONT, suspend the thread before resuming
+ to avoid W95 bug, process pending signals on SIGCONT, add signals to
+ pending if the process is stopped.
+ * fcntl.cc (fcntl): some code rearrangement to always do debug printfs
+ on call exit.
+ * hinfo.cc: include stdio.h
+ (hinfo_vec::build_fhandler): always add ttynum to tty's filename
+ (hinfo_vec::dup2): fix return value initialization and errno setting.
+ * include/netdb.h: typedef for sig_t removed
+ * include/sys/termios.h: octal constants changed to hexadecimals
+ to simplify debugging.
+ * misc.cc: include unistd.h and utmp.h
+ (login): new
+ (logout): new
+ * pinfo.cc (lock_pinfo_for_update): debug printf added
+ (pinfo::record_death): mark processes as orphaned on group leader
+ exit.
+ * select.cc (cygwin32_select): ResetEvent() removed
+ * signal.cc: unneeded ResetEvents removed
+ (_kill): ignore stop signals from a member of orphaned process group,
+ kill self process the last on group kill.
+ (sigaction): reset pending SIGCHLD when the disposition is set to
+ default.
+ * spawn.cc (spawn_guts): ResetEvent removed
+ (cwait): do not interrupt the call
+ * strerror.cc: include stdio.h, reenable disabled cases, remove
+ duplicated cases, return decimal error value in the default case.
+ * syscalls.cc (setsid): set process group id to process id when setsid
+ called.
+ (setpgid): check for negative pgid
+ * syslog.cc (syslog): %m macro support added
+ * termios.cc (cfg(s)eti(o)speed): new fuctions needed to support
+ NIST PCTS requirements.
+ * tty.cc: include utmp.h.
+ (ttyslot): new
+ (tty_list::terminate): fill in utmp on tty master exit
+ (tty_list::allocate_tty): check for tty master pocess alive
+ (create_tty_master): fill in utmp
+ (do_input): restart tty output on interrupt
+ (fhandler_tty_slave::fhndler_tty_slave): ttynum logic moved to
+ build_fhandler.
+ (fhandler_tty_slave::open): set tty's session id to sid of the calling
+ process.
+ (fhandler_tty_slave::write): check for TOSTOP bit
+ (fhandler_tty_slave::fstat): allow access to tty to everyone
+ (fhandler_tty_slave::ioctl): check for TOSTOP bit
+ * tty.h: ttyslot prototype added
+ * wait.cc (wait4): check for valid value of option argument added
+ * winsup.h: define PID_ORPHANED, move tty_list array to the end
+ of shared area.
+
+Thu Aug 14 11:42:59 1997 Ian Lance Taylor <ian@cygnus.com>
+
+ * path.cc (slash_unc_prefix_p): Correct check of path[3]. Permit
+ numbers after the host name.
+
+ * include/Windows32/Defines.h: Correct value for SM_CMETRICS,
+ SM_CXDRAG, SM_CYDRAG, SM_CXEDGE, SM_CYEDGE, SM_CXFIXEDFRAME,
+ SM_CYFIXEDFRAME, and add SM_MOUSEWHEELPRESENT.
+
+Wed Aug 13 20:11:52 1997 Ian Lance Taylor <ian@cygnus.com>
+
+ * fork.cc (cygwin_fork_helper1): If we don't have a console, pass
+ DETACHED_PROCESS to CreateProcess.
+ * spawn.cc (spawn_guts): Likewise.
+
+Tue Aug 12 19:51:32 1997 Ian Lance Taylor <ian@cygnus.com>
+
+ * include/Windows32/Structures.h (IMAGE_DOS_HEADER): Remove
+ dos_message and nt_signature fields; they aren't present in the
+ Windows header file.
+
+Wed Aug 6 16:27:13 1997 Ian Lance Taylor <ian@cygnus.com>
+
+ * include/Windows32/Structures.h: Define LPMEASUREITEMSTRUCT as a
+ pointer to MEASUREITEMSTRUCT.
+
+ * syscalls.cc (_stat_worker): In directory case, only set
+ STD_WBITS in st_mode if FILE_ATTRIBUTE_READONLY is clear.
+ (access): Remove special case for directory.
+
+ * include/Windows32/Defines.h (HKEY_DYN_DATA): Define.
+ (REG_FULL_RESOURCE_DESCRIPTOR): Define.
+ (REG_RESOURCE_REQUIREMENTS_LIST): Define.
+
+Mon Aug 4 21:15:05 1997 Andrew Cagney <cagney@b1.cygnus.com>
+
+ * glob/Makefile.in: Add include of newlib/libc/sys/cygwin32 to
+ explicit .c.o rule so that dirent.h is found.
+
+Thu Jul 24 02:14:24 1997 Geoffrey Noer <noer@cygnus.com>
+
+ patch from sos@prospect.com.ru (Sergey Okhapkin):
+ * cygwin.din: fpathconf, initgroups - new exports
+ * console.cc: new static variable CONSOLE_SCREEN_BUFFER_INFO info
+ (fhandler_console::scroll_screen): local variable info removed
+ (fhandler_console::open): likewise
+ (fhandler_console::ioctl): likewise
+ (fhandler_console::clear_screen): likewise
+ (fhandler_console::cursor_set): likewise
+ (fhandler_console::cursor_rel): likewise
+ (fhandler_console::cursor_get): likewise
+ (fhandler_console::write_normal): fixed scroll region bug, termcap
+ "cs" entry works now
+ * dcrt0.cc (dll_crt0_1): set file API to use OEM charset, convert
+ command line from ANSI to OEM charset.
+ (_exit): clear stopsig value on process exit
+ * exceptions.cc (call_handler): add one millisecond delay before
+ SetEvent()
+ (ctrl_c_handler): clear pending stop signals on SIGCONT, do not send
+ SIGCHLD to parent on process resuming; some debug printfs added; do
+ not call _exit() in a context of signal handling thread (would cause
+ more harm than good); fixed a bug with SA_NOCLDSTOP flag.
+ * fhandler.cc (fhandler_base::open): use full win32 path name to
+ generate inode number namehash instead of unix filename.
+ * fork.cc (cygwin_fork_helper1): block all signals while child and
+ parent are in fork() code
+ * grp.cc (initgroups): new stub added
+ * include/limits.h: new posix defines added
+ * include/sys/termios.h: typedef speed_t as unsigned char
+ * path.cc (mount_info::conv_to_posix_path) bugfix
+ * pinfo.cc (pinfo_list::operator []): PID_NOT_IN_USE check added
+ (pinfo::record_death): set child's ppid to 1 on parent exit
+ * signal.cc (sleep): correct return value if sleep call was
+ interrupted
+ (_kill): correct return value if killed pid was not found.
+ (sigaction): correct return value on handling non-handlable
+ signals, clear pending ignored signals
+ (sigsuspend): sigsuspend call should always return -1 and set errno
+ to EINTR.
+ * spawn.cc: respace
+ * syscalls.cc: map ERROR_NO_DATA to EPIPE instead of ENODATA
+ (isatty): fixed return value
+ (fpathconf): new
+ (pathconf): rewritten
+ (ttyname): fixed return value
+ * sysconf.cc (sysconf): misc fixes
+ * termios.cc (tcsendbreak): corrected errno set
+ (tcdrain): likewise
+ (tcflush): likewise
+ (tcflow): likewise
+ (tcsetattr): likewise
+ (tcgetattr): likewise
+ (tcgetpgrp): likewise
+ (tcsetpgrp): likewise
+ * tty.cc (fhandler_tty_slave::ioctl): TCGETA/TCSETA support added
+ * wait.cc (_wait): wait() syscall should do not terminate if
+ a child is stopped.
+ (wait4): wait calls should wait childs only; fixed a bug with
+ nprocinfo count; fixed signal handling.
+
+Thu Jul 24 02:10:25 1997 Geoffrey Noer <noer@cygnus.com>
+
+ * uname.cc: uname now outputs Cygwin32_NT or Cygwin32_95
+ instead of Cygwin32/NT or Cygwin32/95.
+
+Thu Jul 24 02:10:25 1997 Geoffrey Noer <noer@cygnus.com>
+
+ patch from sos@prospect.com.ru (Sergey Okhapkin):
+ * cygwin.din: sexecve, sexecl, sexecle, sexeclp, sexeclpe,
+ sexecv, sexecp, sexecvpe - new exports
+ * exceptions.cc (ctrl_c_handler): do not raise SIGHUP on
+ CTRL_LOGOFF_EVENT to prevent termination of cygwin application
+ run as NT service on user logoff, raise SIGHUP instead of SIGQUIT
+ on system shutdown, clear stopped status in inuse_p on SIGCONT,
+ set stopped status on stop signals, call _exit() on process
+ termination in a context of signal thread to terminate while
+ in a blocking win32 syscall.
+ * exec.cc: include unistd.h and ctype.h.
+ (_execve): code moved to sexecve, call sexecve with a NULL hToken
+ handle.
+ (sexecve): new, check path, argv[0] and envp to null values,
+ pass nToken handle to spawn_guts().
+ (sexecl): new (code derived from spawn family of functions in
+ spawn.cc)
+ (sexecle): new
+ (sexeclp): new
+ (sexeclpe): new
+ (sexecv): new
+ (sexecp): new
+ (strccopy): new
+ (sexecvpe): new
+ * fhandler.cc (fhandler_base::fstat): add STD_RBITS and STD_WBITS
+ to st_mode of non-file handles.
+ (fhandler_dev_floppy::open): clear O_TRUNC bit.
+ (fhandler_dev_tape::open): likewise
+ * fhandler.h (fhandler_pty_master): new member pktmode (flag to
+ indicate pty's packet mode)
+ * fork.cc (cygwin_fork_helper1): call uinfo_init () in a child code
+ to read /etc/passwd, /etc/group into memory.
+ * hinfo.cc (hinfo_vec::build_fhandler): check socket names for right
+ inheritance on exec().
+ * include/Windows32/Defines.h: fixed a typo in LPSTR_TEXTCALLBACKA
+ definition
+ * include/Windows32/Functions.h: added prototype for
+ ImpersonateLoggedOnUser() API call.
+ * net.cc (cygwin32_socket): duplicate socket handle as inheritable
+ to avoid Windows95 socket inheritance bug, close the original socket.
+ (cygwin32_accept): likewise.
+ * path.cc (mount_info::conv_to_win32_path): do not add trailing
+ backslash to UNC device names like "\\.\a:", "\\.\tape0:" etc.
+ * pinfo.cc (pinfo::record_death_nolock) set PID_WAITING_FOR_PARENT
+ bit to inuse_p instead of assignment - inuse_p is a bit set now.
+ (pinfo::record_death): check PID_WAITING_FOR_PARENT bit instead of
+ comparison.
+ * select.cc (fd_pipe_map::convert_to_unix_fdset): deal with pipe
+ errors.
+ (pipethread): likewise
+ * shared.cc (create_shared_fd_table): allow any process to access
+ shared arg, needed for sexec() family implementation
+ * signal.cc (kill_worker): fixed a typo in debug printf
+ * spawn.cc (spawn_guts): new hToken argument (security token of
+ logged on user for sexec() calls implementation), added checks for
+ zero prog_arg and argv[0], if hToken is not NULL run
+ CreateProcessAsUser() on the current window station/desktop, or
+ just CreateProcess() otherwise, close hToken after the process is
+ created.
+ (_spawnve): pass NULL hToken to spawn_guts().
+ * syscalls.cc (_read): set process's read status while in a read call
+ (_write): set process's write status while in a write call
+ (stat_worker): if GetFileAttributes() fails, try to call fstat to
+ support raw devices
+ * syscalls.h: include windows.h, added sexec() family functions
+ prototypes.
+ * sysdef/i386/kernel32.def: ImpersonateLoggedOnUser - new export
+ * tty.cc: tty attachment logic changed - tty_list::count field
+ counts now number of tty opens, but not a number of processes,
+ attached to a tty.
+ (tty_init): do not call attach_tty() in a exec'ed process
+ (attach_tty): correct return value if !use_tty.
+ (tty::init): initialize pgid and hwnd fields.
+ (tty_list::terminate): clearout tty on master exit.
+ (tty_list::allocate_tty): fixed a bug in a tty allocation.
+ (fhandler_tty_master::init): on NT allow any process to open
+ tty-master process for handle duplication, create synchronisation
+ events with a world-wide access, initialize winsize structure with
+ a default values.
+ (fhandler_tty_slave::open): if a tty doesn't have process group set,
+ set it to a process group of current process.
+ (fhandler_tty_slave::write): added missed \n to debug print, tty
+ write synchronization moved to a more correct place.
+ (fhandler_tty_slave::read): Sleep time changed for conformance with
+ other sleeps.
+ (fhandler_tty_slave::tcsetattr): synchronization added
+ (fhandler_tty_slave::ioctl): initialize arg.winsize with a tty-stored
+ value, copy the result of ioctl call to winsize.
+ (fhandler_pty_master::fstat): small fix
+ (fhandler_pty_master::open): on NT allow any process to open
+ pty-master process for handle duplication, initialize winsize
+ structure with a default values.
+ (fhandler_pty_master::read): check for pipe errors, changes to support
+ packet mode
+ (fhandler_pty_master::ioctl): rewritten, no longer a stub.
+ (fhandler_pty_master::linearize/de_linearize): save/restore pktmode
+ value.
+ * tty.h (class tty): winsize - new member
+ * utils/ps.cc: show process status just after tty number field
+ * winsup.h: defines for new bits in inuse_p added, spawn_guts()
+ prototype changed.
+
+Thu Jul 24 02:10:25 1997 Geoffrey Noer <noer@cygnus.com>
+
+ patch from sos@prospect.com.ru (Sergey Okhapkin):
+ * Makefile.in: Add tty.o to link and dependency lists, add
+ tty.h to headers list
+ * console.cc (fhandler_console::open): save open call flags
+ (fhandler_console::input_tcsetattr): clear all console modes if
+ tty support enabled
+ (FakeReadFile): restart read on signal delivering, changed CTRL
+ macro to CONTROL to avoid conflict with sys/termios.h, copy as
+ much as possible chars to output buffer instead of call to
+ undo_input after every char to prevent timeouts problem.
+ * cygwin.din: srandom, ptsname, grantpt, unlockpt - new exports.
+ * dcrt0.cc: include tty.h, new use_tty global variable.
+ (dll_crt0_1): call events_init() on application startup, set
+ use_tty to FALSE if CYGWIN_NOTTY environment variable is defined,
+ do not change console title if CYGWIN_NOTITLE environment
+ variable set, call tty_init().
+ (_exit): call tty_terminate(), events_terminate() and others
+ in the right order. All modifications of console title are
+ mutexed to allow tty code to obtain console window handle right.
+ * exceptions.cc (exception_init): initialization of signal_arrived
+ event moved to events_init().
+ (call_handler): raise signal arrived event after resuming main
+ thread.
+ (__cygwin_exception_handler): raise signal instead of calling
+ ctrl_c_handler, because exception handler is called in a context
+ of the thread, caused exception, and SuspendThread in call_handler
+ blocks itself :-)
+ (ctrl_c_handler): clear stopsig on SIGCONT delivery, call
+ ResumeThread until suspend count > 1, notify parent about child's
+ status changed. Care about handling SIGCONT signal. On stop
+ signals release vital mutexes used by stopped thread, save
+ signal number for wait(WUNTRACED) calls, notify parent about child's
+ status change. Do not stop processes running without job control
+ (when pgid == 0). Ensure that main thread is unblocked before
+ call _exit().
+ (events_init): new
+ (events_terminate): new
+ * fcntl.cc (_fcntl): use saved open flags on F_GETFL/F_SETFL instead
+ of game with access_ variable. Is this variable longer needed?
+ * fhandler.cc (fhandler_base::linearize/de_linearize): save/restore
+ openflags_ variable.
+ (fhandler_base::open): save file open flags.
+ * fhandler.h (fhandler_base): new openflags_ member, new member
+ functions get_flags/set_flags, new virtual functions ptsname,
+ dup_for_fork, tcget(set)pgrp
+ (fhandler_pipe): remove always_write/except_ready because pipes
+ are always write ready (not true...) and selectable on read.
+ new classes fhandler_tty_slave, fhandler_pty_master,
+ fhandler_tty_master
+ * fork.cc (cygwin_fork_helper1): inherit control tty number on fork,
+ call tty_init on child startup.
+ * hinfo.cc: include stdlib.h and ctype.h.
+ (hmap_init): take care on exec'ed processes.
+ (init_std_file_from_handle): open /dev/tty for standard handles if
+ tty usage enabled.
+ (build_fhandler): check for tty slave and pty master devices.
+ * include/exceptions.h: exception handler returns "int" (exception
+ handling code), not "void".
+ * include/termios.h: new defines, struct winsize must contain
+ ws_xpixel and ws_ypixel members (commented now to avoid
+ incompabilities with existing binaries. Should be uncommented in
+ next release.
+ * net.cc (gethostbyaddr): corrected return value
+ * passwd.cc (parse): remove trailing newline from password
+ lines (user's shell was reported with trailing newline before).
+ * pinfo.cc (lock_pinfo_for_update): open mutex code moved to
+ events_init() in exceptions.cc.
+ (destroy_pinfo_lock): removed, pinfo_mutex is now closed in
+ events_terminate() in exceptions.cc.
+ (init_self): the initial value for pgid must be 0 (no job-controlled
+ process).
+ * select.cc: all debug_printf's changed to select_printf.
+ (fd_pipe_map): new class to implement (polling...) select on pipes.
+ (pipethread): new
+ (cygwin32_select): comment out socket only case since generic
+ code (select on different types of handles) works for sockets too
+ but is interruptable. The case for always_ready_used is used now
+ and for polling select (zero timevalue). Changes to support
+ select on pipes.
+ * shared.cc (shared_info::initialize): initialize tty table.
+ * signal.cc (sleep/usleep/sigsuspend/pause): signal_arrived moved
+ from u area to dll's address space, signal_arrived is manual reset
+ event now.
+ (_raise): implemented as kill (self, sig).
+ (kill_worker): new. Use SendMessage instead of PostMessage to avoid
+ some timing problems.
+ * spawn.cc: include tty.h.
+ (spawn_guts) call close_all_files() on exec, call tty_terminate()
+ before process exit. Some changes due to moving signal_arrived to
+ dll's address space.
+ (_spawnve): inherit control tty number on spawn.
+ * syscalls.cc (close_all_files): reenabled. The code is ok after
+ all! The troubles were due to incorrect usage on exec() calls.
+ (setsid): no longer a stub
+ (ptsname): new
+ * termios.cc: all syscall_printf's changed to termios_printf.
+ (tcget(set)pgrp): rewritten, no longer a stub.
+ * times.cc (utimes): It looks like Win32 does not allow changing
+ times of directories, so just return success in this case.
+ * tty.cc: new file
+ (tty_init): new
+ (tty_terminate): new
+ (attach_tty): new
+ (detach_tty): new
+ (tty::init): new
+ (tty_list::terminate): new
+ (tty_list::connect_tty): new
+ (tty_list::free_tty): new
+ (tty_list::init): new
+ (tty_list::allocate_tty): new
+ (fhandler_tty_master::fhandler_tty_master): new
+ (create_tty_master): new
+ (fhandler_tty_master::init): new
+ (doecho): new
+ (do_input): new
+ (process_input): new
+ (do_output): new
+ (process_output): new
+ (process_ioctl): new
+ (fhandler_tty_slave::fhandler_tty_slave): new
+ (fhandler_tty_slave::open): new
+ (fhandler_tty_slave::init): new
+ (fhandler_tty_slave::close): new
+ (fhandler_tty_slave::write): new
+ (fhandler_tty_slave::read): new
+ (fhandler_tty_slave::linearize): new
+ (fhandler_tty_slave::de_linearize): new
+ (fhandler_tty_slave::dup): new
+ (fhandler_tty_slave::dup_for_fork): new
+ (fhandler_tty_slave::fstat): new
+ (fhandler_tty_slave::tcgetattr): new
+ (fhandler_tty_slave::tcsetattr): new
+ (fhandler_tty_slave::tcflush): new
+ (fhandler_tty_slave::tcsetpgrp): new
+ (fhandler_tty_slave::tcgetpgrp): new
+ (fhandler_tty_slave::send_ioctl_request): new
+ (fhandler_tty_slave::ioctl): new
+ (fhandler_pty_master::fhandler_pty_master): new
+ (fhandler_pty_master::fstat): new
+ (fhandler_pty_master::open): new
+ (fhandler_pty_master::close): new
+ (fhandler_pty_master::write): new
+ (fhandler_pty_master::read): new
+ (fhandler_pty_master::tcgetattr): new
+ (fhandler_pty_master::tcsetattr): new
+ (fhandler_pty_master::tcflush): new
+ (fhandler_pty_master::ioctl): new
+ (fhandler_pty_master::ptsname): new
+ (fhandler_pty_master::linearize): new
+ (fhandler_pty_master::de_linearize): new
+ (fhandler_pty_master::dup_for_fork): new
+ (grantpt): new
+ (unlockpt): new
+ * tty.h: new
+ * utils/ps.cc: display process's control tty number.
+ * wait.cc (wait_for_single): removed.
+ (wait_for_any): all code moved to wait4().
+ (wait4): rescan process table on child status changes, support for
+ WUNTRACED flag, avoid time races on child exit, correct return
+ value on timeout.
+ * window.cc: misc changes to wait creation of process's hidden
+ window to avoid race conditions on multiprocessor systems.
+ * winsup.h: misc changes to support all of the above.
+
+Thu Jul 24 02:10:25 1997 Geoffrey Noer <noer@cygnus.com>
+
+ * net.cc (cygwin32_shutdown): New implementation to replace
+ stub previously present
+
+Tue Jul 22 14:59:22 1997 Geoffrey Noer <noer@cygnus.com>
+
+ * cygwin.din: remove random, srandom
+ * Makefile.in: remove random/srandom-related lines
+
+Tue Jul 22 14:10:32 1997 Ian Lance Taylor <ian@cygnus.com>
+
+ * path.cc (realpath): New C function.
+ * cygwin.din: Export realpath.
+
+ * cygwin.din: Export srandom.
+
+Wed Jul 9 12:26:03 1997 Geoffrey Noer <noer@cygnus.com>
+
+ * Makefile.in: libiberty random.o ends up in winsup, link
+ in that obj for now
+
+Tue Jul 8 14:02:41 1997 Ian Lance Taylor <ian@cygnus.com>
+
+ * libcmain.cc (main): Pass wShowWindow field from startup info to
+ WinMain.
+
+Mon Jul 7 17:47:48 1997 Geoffrey Noer <noer@cygnus.com>
+
+ * path.cc: respace, reword comments
+ * times.cc (utimes): add FIXME
+
+Tue Jun 24 18:31:27 1997 Geoffrey Noer <noer@cygnus.com>
+
+ * winsup.h: adjust protos to reflect the above, add enum os_type
+ which contains {winNT, win95, win32s, unknown}
+ * security.cc (is_nt): Delete
+ * syscalls.cc (windows_95): Delete
+ (get_os_type): New local function which returns os_type. Replaces
+ windows_95() and is_nt().
+
+ * fhandler.cc: Reformat. Call get_os_type() instead of
+ windows_95() and/or is_nt(), reorder so NT cases are first.
+ * mmap.cc: ditto
+ * net.cc: ditto
+ * syscalls.cc: ditto
+ * syslog.cc: ditto
+
+ * uname.cc (uname): call get_os_type to fill new our_os local
+ variable, check that when filling out utsname struct, default
+ to i386 when we can't find out the specific Intel processor
+ variant.
+ * fhandler.cc (get_file_owner): remove doit variable
+ (get_file_group): ditto
+ * mmap.cc: extern "C" individual functions instead of wrapper
+ around most of file.
+ * misc.cc: minor reformat
+ * heap.cc (_sbrk): split a = b = c statement into two to
+ make code clearer and avoid invalid C++ casting warning during
+ compile.
+ * path.cc (symlink_follow): initialize syml_p and exec_p to zero
+ * select.cc: respace
+ (selectthread): cast first arg of WINSOCK_FD_SET
+ * ntea.cc (NTReadEARaw): add missing casts in front of malloc calls
+ * utils/mount.cc: remove mixed option since that hasn't been
+ supported for quite some time
+
+Sun Jun 22 17:27:03 1997 Ian Lance Taylor <ian@cygnus.com>
+
+ * include/windows.h: If RC_INVOKED is defined, don't include
+ limits.h, stdarg.h, Structures.h, Functions.h or Sockets.h, and
+ don't typedef BOOL.
+ * include/Windows32/Base.h: Don't do any typedefs if RC_INVOKED is
+ defined.
+
+ * include/Windows32/Sockets.h (MAXHOSTNAMELEN): Don't define if
+ already defined.
+ * include/sys/param.h (MAXHOSTNAMELEN): Likewise.
+
+Fri Jun 20 11:06:09 1997 Geoffrey Noer <noer@cygnus.com>
+
+ patch from sos@prospect.com.ru (Sergey Okhapkin):
+ * include/sys/wait.h: correct operator precidence bug
+ in WIFSIGNALED
+
+Thu Jun 19 12:58:45 1997 Geoffrey Noer <noer@cygnus.com>
+
+ patch from sos@prospect.com.ru (Sergey Okhapkin):
+ Handle unblocked pending signals on sig_mask changes
+ * exceptions.cc (return_handler): renamed to set_process_mask
+ (set_process_mask): new; use to set process mask instead of direct
+ u->self->sig_mask manipulations.
+ * winsup.h: rename return_handler proto to set_process_mask
+ * signal.cc: throughout file, call set_process_mask() instead of
+ direct manipulations of u->self->sig_mask.
+ (pause): new
+ * cygwin.din: add pause() export
+ * syscalls.cc (system): correct return value
+
+Wed Jun 18 22:01:56 1997 Geoffrey Noer <noer@cygnus.com>
+
+ * Makefile.in: add $(srcdir)/../newlib/libc/sys/cygwin32 to
+ the list of includes since that's where sys/dirent.h is
+ supposed to live
+ * include/sys/dirent.h: moved to newlib/libc/sys/cygwin32/sys
+
+Wed Jun 18 13:56:47 1997 Geoffrey Noer <noer@cygnus.com>
+
+ patch from sos@prospect.com.ru (Sergey Okhapkin):
+ * signal.cc (sigsuspend): deal with pending unblocked signals
+ * winsup.h: add proto for return_handler (sigset_t)
+
+Wed Jun 18 02:02:13 1997 Geoffrey Noer <noer@cygnus.com>
+
+ respaced console.cc, fhandler.cc, syscalls.cc, pinfo.cc,
+ fork.cc, spawn.cc
+
+Tue Jun 17 14:57:09 1997 Geoffrey Noer <noer@cygnus.com>
+
+ patch from sos@prospect.com.ru (Sergey Okhapkin):
+ * cygwin.din: add getpgid, killpg exports, delete duplicate
+ random export
+ * fork.cc (cygwin_fork_helper1): inherit pgid and sid on fork
+ * misc.cc (cygwin32_*env): save environ value in __cygwin_environ
+ too. Is __cygwin_environ variable really neccessary? Why not
+ export cygwin.dll's environ variable with "__cygwin_environ" name?
+ * pinfo.cc (pinfo::init_self): initialize pgid and sid
+ * signal.cc (kill_worker): new
+ (_kill): rewritten to support process groups
+ (killpg): new
+ * spawn.cc (_spawnwe): inherit pgid and sid on spawn family calls
+ * stubs.cc (setpgrp, getpgrp): remove stubs
+ * syscalls.cc (setpgid, getpgid, setpgrp, getpgrp): new
+ * termios.cc (setpgid): remove stub
+ * utils/ps.cc (main): add pgid to output, change output
+ format
+ * wait.cc (wait_for_any): add intpid argument, arrays ctable and
+ ptable have now fixed MAXIMUM_WAIT_OBJECTS size to avoid extra
+ scan of process table, changes for process groups support.
+ (wait4): misc changes to support process groups
+ * winsup.h (pinfo class): add new variables pgid, sid.
+ Define __cygwin_environ.
+
+Mon Jun 16 18:30:21 1997 Geoffrey Noer <noer@cygnus.com>
+
+ patch from sos@prospect.com.ru (Sergey Okhapkin):
+ * spawn.cc (spawn_guts): set child->hProcess and child->hThread,
+ CloseHandle on pi.hThread at end of spawn_guts instead of right
+ after starting the child process,
+ _P_WAIT needs to be handled separately from _P_OVERLAY
+
+Sun Jun 15 23:51:10 1997 Geoffrey Noer <noer@cygnus.com>
+
+ patch from sos@prospect.com.ru (Sergey Okhapkin):
+ * cygwin.din: remove setenv/getenv-related exports,
+ export cygwin32_ equivalents
+ * exec.cc: check ?
+ * misc.cc (cygwin32_getenv): new
+ (cygwin32_putenv): new
+ cygwin32_setenv): new
+ (cygwin32_unsetenv): new
+ * spawn.cc: call cygwin32_getenv instead of getenv,
+ call spawn with *u->envptr instead of environ
+ * winsup.h: define **environ as extern, define *cygwin32_getenv
+
+Sun Jun 15 20:51:09 1997 Geoffrey Noer <noer@cygnus.com>
+
+ patch from sos@prospect.com.ru (Sergey Okhapkin):
+ * Makefile.in: add ../libiberty/random.o to EXTRA_OFILES
+ * cygwin.din: remove exports of tgetent and _tgetent, added random
+ * exception.cc (exceptions_init): make OurThread handle
+ noniherittable, remove unused buf array.
+ (return_handler): add restmask argument (sig_mask value before
+ calling signal handler)
+ (call_handler): save sig_mask in user's stack before calling signal
+ handler, change PulseEvent() call to SetEvent() -- there were
+ losses of signal_arrived events if main thread was not in wait
+ state.
+ (ctrl_c_handler): add support for SIGIO signal.
+ * fhandler.cc (fhandler_base::linearize/delinearize):
+ save/restore async_ flag
+ (fhandler_base::fhandler_base): clear async_ flag
+ * fhandler.h: add async_ as new variable in fhandler_base,
+ add get_async/set_async functions
+ * misc.cc (tgetent): remove stub
+ * net.cc (fhandler_socket::write): raise SIGPIPE if write to
+ disconnected socket.
+ (cygwin32_accept): check the result of find_unused_handle() before
+ accept() call, set errno if no more file descriptors available.
+ (fhandler_socket::ioctl): add support for async I/O on sockets
+ * pinfo.cc (pinfo::clearout): clear sig_pending mask
+ * syscalls.cc (readv, writev): rewrite
+ * window.cc (WndProc): add support for async I/O
+ * winsup.h: define WM_ASYNCIO
+
+Mon Jun 9 18:51:09 1997 Geoffrey Noer <noer@cygnus.com>
+
+ * include/winsock.h: fix protection wrapper name
+
+Fri Jun 6 12:41:09 1997 Ian Lance Taylor <ian@cygnus.com>
+
+ * include/Windows32/Defines.h: Define CommonDlgExtendedError
+ return values (CDERR_*, PDERR_*, CFERR_*, FNERR_*). Define
+ TEXTMETRIC tmPitchAndFamily values (TMPF_*).
+
+ * include/dlgs.h: New file; just includes windows.h.
+ * include/cderr.h: Likewise.
+
+ * libcmain.cc (main): Don't pass the program name to WinMain.
+
+ * cygwin.din: Export strlwr and strupr.
+
+ * include/winreg.h: New file; just includes windows.h.
+ * include/winsock.h: New file; just includes windows.h and
+ Windows32/Sockets.h.
+ * include/Windows32/Sockets.h: Don't define u_char, et. al. if
+ _SYS_TYPES_H is defined. Undefine fd_set if it is defined.
+
+ * include/Windows32/Functions.h: Define MoveMemory, FillMemory,
+ and ZeroMemory as macros.
+
+ * times.cc (_timezone, _daylight, _tzname): New global variables.
+ (tzset): New function.
+ * cygwin.din: Don't set _timezone to timezone. Export tzset and
+ _tzset. Export _timezone, _daylight, and _tzname.
+
+ * dcrt0.cc (__cygwin_environ): New global variable.
+ (dll_crt0_1): Set __cygwin_environ to environ.
+ * cygwin.din: Export __cygwin_environ.
+
+Thu Jun 5 17:52:02 1997 Ian Lance Taylor <ian@cygnus.com>
+
+ * times.cc (gettimeofday): Check return values and set tz_dsttime
+ correctly.
+
+Wed Jun 4 00:04:33 1997 Geoffrey Noer <noer@cygnus.com>
+
+ * fhandler.cc (fhandler_pipe::lseek): new virtual function
+ * fhandler.h: add lseek to fhandler_pipe class
+
+Tue Jun 3 19:20:47 1997 Ian Lance Taylor <ian@cygnus.com>
+
+ * include/Windows32/Defines.h (IMAGE_DOS_SIGNATURE): Define.
+ (IMAGE_NT_SIGNATURE): Define.
+ * include/Windows32/Structures.h (IMAGE_DOS_HEADER): Define.
+
+Tue Jun 3 13:05:26 1997 Geoffrey Noer <noer@cygnus.com>
+
+ * console.cc: respace
+ * fhandler.h: add virtual off_t lseek to fhandler_socket and
+ fhandler_tty defs, respacing
+
+Mon Jun 3 12:21:20 1997 Geoffrey Noer <noer@cygnus.com>
+
+ patch from sos@prospect.com.ru (Sergey Okhapkin):
+ * cygwin.din: export wait3, wait4
+ * dcrt0.cc (_exit): call fill_rusage
+ * exceptions.cc (ctrl_c_handler): increment rusage_self.ru_nsignals++
+ * fhandler.cc (fhandler_pipe::fhandler_pipe): new stub
+ * fhandler.h: add fhandler_pipe class
+ * hinfo.cc (hinfo_vec::build_fhandler): call
+ GetNumberOfConsoleInputEvents instead of GetConsoleScreenBufferInfo,
+ handle fhandler_pipe class
+ * pinfo.cc: include sys/resource.h,
+ (pinfo::clearout): erase memory associated with rusage_self
+ and rusage_children
+ * resource.cc (getrusage): rewrite
+ (add_timeval): new helper function
+ (add_rusage): new helper function
+ (fill_rusage): new helper function
+ * shared.cc (create_shared_fd_table): pass file mapping handle to
+ children letting them close it
+ * spawn.cc (spawn_guts): call fill_rusage and add_rusage as
+ appropriate
+ (cwait): ditto
+ * times.cc (__to_clock_t): add flag arg which says whether or not
+ to substract FACTOR from total
+ (times): also fill in tms_cstime and tms_cutime, add flag arg to
+ __to_clock_t calls
+ (totimeval): add extra flag passed on to __to_clock_t
+ (gettimeofday): add extra flag passed on to totimeval
+ * wait.cc (wait_for_single): add extra rusage arg, change
+ wait_found calls to account for extra arg
+ (wait_for_any): ditto
+ (_wait): call wait4 instead of waitpid
+ (wait_found): add rusage arg, deal with it calling add_rusage as
+ appropriate
+ (wait_pid): now just calls wait4
+ (wait4): was wait_pid but adds extra rusage arg and deals with it
+ (wait3): new, calls wait4
+ * winsup.h: include sys/resource.h, add rusage_self and
+ rusage_children to pinfo class, fix totimeval proto, add protos
+ for fill_rusage and add_rusage
+ * passwd.cc: include termios.h
+ (getpass): new
+ * stubs.cc (getpass): delete old stub
+
+Tue Jun 3 14:51:47 1997 Ian Lance Taylor <ian@cygnus.com>
+
+ * times.cc (ftime): New function.
+ * cygwin.din: Export ftime.
+
+Mon Jun 2 14:34:00 1997 Geoffrey Noer <noer@cygnus.com>
+
+ patch from sos@prospect.com.ru (Sergey Okhapkin):
+ * include/limits.h: NGROUPS_MAX should be 0
+ * include/asm/socket.h: add missing additional options
+ including SO_SNDBUF, SO_RCVBUF, et al
+ * include/sys/wait.h: include sys/resource.h, add protos for
+ wait3() and wait4().
+
+Mon Jun 2 15:26:35 1997 Ian Lance Taylor <ian@cygnus.com>
+
+ * utils/configure.in: Call AC_PROG_INSTALL.
+ * utils/configure: Rebuild.
+
+Mon Jun 2 11:44:14 1997 Geoffrey Noer <noer@cygnus.com>
+
+ * grp.cc (getgroups): new
+ * cygwin.din: export getgroups
+
+Fri May 30 16:47:38 1997 Geoffrey Noer <noer@cygnus.com>
+
+ * uname.cc (uname): completely rewrite, using more of the
+ SYSTEM_INFO struct to figure out information (now x86 type is
+ set correctly in Windows 95.
+ * version.h: increment CYGWIN_DLL_VERSION_MINOR
+ * include/Windows32/Structures.h: SYSTEM_INFO struct's first
+ member is dwOemId, not dwOemID according to MS docs
+
+Fri May 30 16:47:38 1997 Geoffrey Noer <noer@cygnus.com>
+
+ patch from sos@prospect.com.ru (Sergey Okhapkin):
+ * window.cc: new file
+ * Makefile.in: add window.cc to lists of source, object files,
+ and dependencies.
+ * console.cc: include <stdlib.h>, scroll_screen() added to
+ fhandler_console class,
+ add support for default screen attributes,
+ (open): set default_color on tty open
+ (linearize/delinearize): pass default_color to the child process
+ (clear_screen): fix Win95-specific bug, add support for
+ default_color.
+ (clear_to_eol): remove
+ (fhandler_console::fhandler_console): set default_color to
+ white on black
+ (char_command): add invisible screen attribute, misc changes
+ (FakeReadFile): do not convert AltGr-char to ESC-char sequence
+ to support international keyboards.
+ * cygwin.din: export setitimer, getitimer
+ * dcrt0.cc (dll_crt0_1): add call to window_init(), uppercase
+ environment vars only if started by a win32 process.
+ (_exit): add call to window_terminate()
+ * fhandler.cc: add mode argument to open() calls,
+ (fhandler_base::open): do not check for symlink in path_conv
+ calls, calls to set/get_file_attribute() instead of NTRead/WriteEA.
+ (fhandler_base::fstat): use get_file_attribute if possible
+ (fhandler_disk_file::open): remove unneeded unixattr checks
+ * fhandler.h: changes to support above.
+ * fork.cc (cygwin_fork_helper_1): pass umask value to the child,
+ call window_init() in child
+ * ntea.cc: enable EA calls, add FILE_FLAG_BACKUP_SEMANTICS
+ to CreateFile calls to support EA of directories.
+ * path.cc (symlink): add mode argument to _open call, remove
+ unneeded stuff
+ (symlink_check_worker): add checks for "system" attribute and EA.
+ * security.cc (get/set_file_attribute): new. Calls EA code now,
+ placeholders for NTFS security support.
+ * signal.cc (alarm): remove in favor of new implementation in
+ window.cc
+ (RemoteThread): remove
+ (_kill): use window messages to emulate signals on both NT and Win95
+ * spawn.cc (spawn_guts): call window_terminate on exec()
+ (cwait): correct return result code
+ (_spawnve): add umask inheritance, some bug fixes
+ * syscalls.cc (_open): add mode argument, umask support
+ (umask): rewritten
+ (chmod): try to set file attributes, set system bit on symlinks
+ (stat_worker): fix nlinks of directories, add mode argument
+ to _open() call.
+ * syscalls.h: add mode argument to _open() prototype
+ * winsup.h: changes to support above
+
+Tue May 27 12:22:19 1997 Geoffrey Noer <noer@cygnus.com>
+
+ * times.cc (gettimeofday): return 0 on success instead of 1
+ (utimes): init res to 0
+
+Wed May 21 11:29:24 1997 Geoffrey Noer <noer@cygnus.com>
+
+ * include/limits.h: define NGROUPS_MAX
+
+Tue May 20 14:13:59 1997 Geoffrey Noer <noer@cygnus.com>
+
+ * passwd.cc: rename function setpwend to setpwent (typo)
+ * cygwin.din: ditto, also remove name__C9type_info from
+ exports list.
+
+Wed May 14 17:38:39 1997 Geoffrey Noer <noer@cygnus.com>
+
+ patch from sos@prospect.com.ru (Sergey Okhapkin):
+ * signal.cc (sleep): call WaitForSingleObject instead of Sleep
+ (usleep): ditto
+
+Wed May 7 15:34:07 1997 Geoffrey Noer <noer@cygnus.com>
+
+ Public gnu-win32 beta 18 release made
+
+Sun May 4 15:34:07 1997 Geoffrey Noer <noer@cygnus.com>
+
+ patch from Mikey <jeffdb@netzone.com>:
+ * console.cc (FakeReadFile): FlushConsoleInputBuffer if
+ flags & ENABLE_LINE_INPUT and then return ReadFile
+
+Fri May 2 10:53:10 1997 Geoffrey Noer <noer@cygnus.com>
+
+ * signal.cc: make exported functions extern "C"
+ * include/cygwin32/socket.h: replace values assigned to
+ IP_ definitions with ones suitable for use with WinSock.
+ * cygwin.din: add exports for sigpending, sigsuspend, remove
+ exports for __9type_infoPCc and before__9type_infoRC9type_info
+ * winsup.h: remove signal-related protos from winsup.h in favor
+ of newlib/libc/include/sys/signal.h
+
+ patch from sos@prospect.com.ru (Sergey Okhapkin):
+ * signal.cc: (sigpending) new
+ (sigsuspend): new
+ * utils/termcap: replace with one from Linux
+
+Tue Apr 29 19:03:29 1997 Geoffrey Noer <noer@cygnus.com>
+
+ * utils/ps.cc: print Win32 pid as unsigned int so Windows 95
+ pids don't show up as negative values
+
+Tue Apr 29 17:20:57 1997 Geoffrey Noer <noer@cygnus.com>
+
+ patch from sos@prospect.com.ru (Sergey Okhapkin):
+ * spawn.cc (spawn_guts): allocate new cygwin PID for a child
+ created with spawn(!_P_OVERLAY)
+
+Tue Apr 29 13:24:59 1997 Geoffrey Noer <noer@cygnus.com>
+
+ patch from sos@prospect.com.ru (Sergey Okhapkin):
+ * console.cc: assorted console fixes
+ * select.cc (fd_socket_map::convert_to_unix_fdset): only
+ do full debug_printf if used_ valid
+ * exceptions.cc: correct constants used for checking size of
+ stack (should be negated)
+ * fhandler.cc (fhandler_base::open): fix syscall_printf typo
+
+ patch from marcus@cathcart.sysc.pdx.edu (Marcus Daniels):
+ * include/sys/mman.h: define MAP_ANON MAP_ANONYMOUS (typo fix)
+
+Mon Apr 28 15:19:44 1997 Geoffrey Noer <noer@cygnus.com>
+
+ * cygwin.din: remove libgcc2.a internal functions
+
+Mon Apr 28 14:57:04 1997 Michael Meissner <meissner@cygnus.com>
+
+ * cygwin.din (before__9type_infoRC9type_info): Remove, the
+ type_info::before(type_info const &) function no longer seems to
+ exist.
+
+Mon Apr 28 14:19:44 1997 Geoffrey Noer <noer@cygnus.com>
+
+ patch from sos@prospect.com.ru (Sergey Okhapkin):
+ * console.cc (undo_input): new
+ (scroll_screen): new
+ (fhandler_console::output_tcsetattr): fix debug printf
+ (fhandler_console::input_tcsetattr): no longer call set_w_binary
+ (fhandler_console::cursor_get): fix base_chars
+ (fhandler_console::char_command): make savex, savey globals,
+ add char buf, add code to handle clears better, many other
+ additions
+ (fhandler_console::write_normal): assorted fixes
+ (fhandler_console::write): move screen scroll code to
+ scroll_screen(), support Reset Linux terminal, Restore cursor
+ position, Save cursor position, Skip orig_colors
+ (FakeReadFile): enlarge keytable to include shift/control/alt
+ values
+ Command set still missing set pelette, character sets, and
+ UTF codes.
+
+Mon Apr 28 12:19:44 1997 Geoffrey Noer <noer@cygnus.com>
+
+ * fhandler.cc (fhandler_base::open): only include
+ FILE_SHARE_DELETE in shared when running NT (Win 95 doesn't
+ support it).
+
+Thu Apr 24 18:57:21 1997 Geoffrey Noer <noer@cygnus.com>
+
+ patch from Jeremy Allison <jra@cygnus.com>:
+ Correct problem caused by setting /dev/null fd to -1 which is
+ same as INVALID_HANDLE_VALUE.
+ * fhandler.h: set DEV_NULL_HANDLE_VALUE to -2
+ * fhandler.cc (fhandler_dev_null::open): set handle to
+ DEV_NULL_HANDLE_VALUE instead of INVALID_HANDLE_VALUE
+ * hinfo.cc (hinfo_vec::build_fhandler): add case for
+ handle == (HANDLE) DEV_NULL_HANDLE_VALUE
+
+Thu Apr 24 15:12:13 1997 Geoffrey Noer <noer@cygnus.com>
+
+ * fhandler.cc (fhandler_base::write): catch return of raw_write
+ and return -1 if it failed
+
+Thu Apr 24 10:42:01 1997 Geoffrey Noer <noer@cygnus.com>
+
+ path.cc (symlink): restore chmod call for now since the NTEA code
+ isn't quite up to the task yet.
+
+ patch from sos@prospect.com.ru (Sergey Okhapkin):
+ * exceptions.cc (ctrl_c_handler): corrections to Apr 18 patch
+ * fhandler.cc: ditto
+ * dcrt0.cc (dll_crt0_1): move console title setting code,
+ set up default signal handlers
+ * fork.cc (cygwin_fork_helper1): also set child->sigs and
+ child->sig_mask
+ * spawn.cc (spawn_guts): if mode _P_OVERLAY, set up child
+ signal handlers.
+
+Mon Apr 21 22:29:49 1997 Geoffrey Noer <noer@cygnus.com>
+
+ * include/Windows32/ASCIIFunctions.h: remove old def of
+ GetEnvironmentStringsA, add new one based on def from Functions.h
+ * include/Windows32/Functions.h: define GetEnvironmentStrings as
+ GetEnvironmentStringsA when not unicode, remove definition of
+ GetEnvironmentStrings in favor of ones in ASCIIFunctions.h and
+ UnicodeFunctions.h
+ * include/Windows32/Defines.h: add missing XTYP_ definitions,
+ change value of XTYPF_NOBLOCK to 0x0002 from 0x2
+ * include/Windows32/Sockets.h: comment out redefinitions of
+ errno.h-type constants since MS doesn't define them and we
+ have our own in errno.h
+
+Fri Apr 18 10:40:30 1997 Geoffrey Noer <noer@cygnus.com>
+
+ * include/Windows32/Structures.h: add typedefs for
+ LPDLGITEMTEMPLATE, PDLGITEMTEMPLATE.
+ * include/Windows32/Defines.h: define FW_REGULAR FW_NORMAL
+
+ patch from sos@prospect.com.ru (Sergey Okhapkin):
+ * exceptions.cc (ctrl_c_handler): do not reset signal
+ handler to SIG_DFL while processing the signal, instead
+ block the signal while handler executes.
+ * signal.cc (_raise): fixes related to the above
+
+Thu Apr 17 23:50:50 1997 Geoffrey Noer <noer@cygnus.com>
+
+ * path.h: increase path length in mount table to MAX_PATH
+ in size instad of 30. This will increase cygwin.dll memory
+ usage by 20K. We need to remove static allocations from
+ path code.
+
+Thu Apr 17 10:11:50 1997 Geoffrey Noer <noer@cygnus.com>
+
+ patch from sos@prospect.com.ru (Sergey Okhapkin):
+ * exceptions.cc (ctrl_c_handler): CTRL_CLOSE_EVENT should
+ generate SIGHUP instead of SIGQUIT
+ * signal.cc (_raise): rewrite
+
+Wed Apr 16 10:42:46 1997 Geoffrey Noer <noer@cygnus.com>
+
+ * version.h: increment CYGWIN_DLL_VERSION_MINOR
+ * syscalls.cc (system): use spawnvp instead of fork/exec
+ * ntea.cc: make all functions return false for now; they
+ were causing an obscene performance hit
+
+ patch from sos@prospect.com.ru (Sergey Okhapkin):
+ * console.cc (FakeReadFile): patch to support EINTR, EIO
+ * exceptions.cc: add support for return_handler, remove
+ control-C counter
+ (return_handler): new
+ (ctrl_c_handler): handle SIGCHLD, other assorted fixes
+ * fhandler.cc (fstat): reset errno to 0
+ * passwd.cc (search_for): correct location of a debug printf
+ * select.cc: patches to handle signals better, respacing
+ * signal.cc (_raise): misc fixes
+ (_kill): call OpenProcess with PROCESS_ALL_ACCESS instead of
+ PROCESS_TERMINATE
+ * spawn.cc: more signal fixes
+ * syscalls.cc: add two new errors to errmap[]
+ (_stat_worker): fill out buf struct when stating directories
+ * wait.cc (wait_for_single): use INFINITE instead of large value
+ for timeouts
+ (wait_for_any): init nprocinfo to 1, not 0, other small fixes
+ * winsup.h: add signal_arrived to per_process class, reduce
+ amount of reserved space, add sig_pending to pinfo class
+
+Tue Apr 15 17:01:34 1997 Geoffrey Noer <noer@cygnus.com>
+
+ * utils/mkpasswd.c: change default shell to /bin/sh
+
+ patch from sos@prospect.com.ru (Sergey Okhapkin):
+ * utils/kill.cc: support sending numbered signals using
+ signal code instead of just calling TerminateProcess
+
+Tue Apr 15 15:24:55 1997 Ian Lance Taylor <ian@cygnus.com>
+
+ * utils/Makefile.in (INSTALL): Set to @INSTALL@.
+ (INSTALL_PROGRAM): Set to @INSTALL_PROGRAM@.
+ (INSTALL_DATA): Set to @INSTALL_DATA@.
+ (INSTALL_XFORM): Remove.
+ (install): Depend upon installdirs. Use $(program_transform_name)
+ directly, rather than using $(INSTALL_XFORM).
+ (installdirs): New target.
+
+Mon Apr 14 16:32:05 1997 Ian Lance Taylor <ian@cygnus.com>
+
+ * utils/Makefile.in (INSTALL): Change install.sh to install-sh.
+
+Mon Apr 14 12:33:22 1997 Geoffrey Noer <noer@cygnus.com>
+
+ * registry.cc: change key name to "Cygnus Solutions" instead
+ of "Cygnus Support"
+ * security.cc: don't include windows.h, already in winsup.h
+ * Makefile.in: add dependencies section entries for security.cc
+ and ntea.cc
+
+Fri Apr 11 00:03:49 1997 Geoffrey Noer <noer@cygnus.com>
+
+ * dcrt0.cc: add harmless cast to FreeEnvironmentStrings call
+ * registry.cc: added more presumed-harmless casts
+ * shared.cc: and another, and respacing
+ * utils/Makefile.in: don't need to link with -lkernel32 since it's
+ included automatically
+ * fhandler.cc: fhandler_console and FakeReadFile moved to
+ console.cc, stop including sys/stat.h, sys/param.h, sys/types.h,
+ stdio.h, ctype.h, pwd.h, grp.h, stdlib.h
+ reordered/respaced code so now we have all of fhandler_base, then
+ all of fhandler_disk_file, then all of fhandler_tty, etc...
+ (fhandler_base::ioctl): delete unused switch statement
+ * console.cc: added fhandler_console and FakeReadFile from
+ fhandler.cc, add includes necessary for this code
+ * grp.cc, Makefile.in: fix copyright dates
+ * ntea.cc: include string.h
+
+Thu Apr 10 22:00:43 1997 Geoffrey Noer <noer@cygnus.com>
+
+ patch from sos@prospect.com.ru (Sergey Okhapkin):
+ * path.cc (symlink): do NTWriteEA instead of chmod using same
+ flags
+
+Thu Apr 10 17:36:43 1997 Geoffrey Noer <noer@cygnus.com>
+
+ patch from gunther.ebert@ixos-leipzig.de (Gunther Ebert):
+ * Makefile.in: add libnetapi32.a to DLL_IMPORTS list, build security.o
+ * fhandler.cc (get_file_owner): new
+ (get_file_group): new
+ (fhandler_base::fstat): do another path_conv and check for error,
+ use get_file_owner and get_file_group to set buf->st_uid and
+ buf->st_gid
+ * fhandler.h: add protos for get_file_owner() and get_file_group()
+ * grp.cc (add_grp_line): new helper function
+ (read_etc_group): new helper function
+ (getgrgid): rewritten, no longer a stub
+ (getgrnam): rewritten, no longer a stub
+ (endgrent): rewritten, no longer a stub
+ (getgrent): rewritten, no longer a stub
+ * include/Windows32/ASCIIFunctions.h, include/Windows32/Base.h,
+ include/Windows32/Functions.h, include/Windows32/Defines.h,
+ include/Windows32/Structures.h, include/Windows32/UnicodeFunctions.h:
+ misc security/uid-related additions
+ * passwd.cc (add_pwd_line): new
+ (read_etc_passwd): new
+ (search_for): rewrite
+ (setpwend): rewritten, no longer a stub
+ (getpwent): rewritten, no longer a stub
+ (endpwent): rewritten, no longer a stub
+ * security.cc: new file
+ (get_world_sid): new
+ (world_full_access): new
+ (get_id_from_sid): new
+ (is_nt): new
+ * stubs.cc (endgrent): remove
+ (getgrent): remove
+ * syscalls.cc (rel2abssd): new
+ (set_process_privileges): new
+ (chown): now implemented for real for NT, still a stub in Win95
+ (_stat_worker): use get_file_owner and get_file_group to set
+ buf->st_uid and buf->st_gid
+ * uinfo.cc: add protos for read_etc_passwd, read_etc_group
+ (uinfo_init): call read_etc_passwd(), read_etc_group()
+ * utils/Makefile.in: build mkpasswd, mkgroup
+ * utils/mkgroup.c: new, use to make an /etc/group file
+ * utils/mkpasswd.c: new, use to make an /etc/passwd file
+ * winsup.h: add protos for is_nt(), get_id_from_sid()
+
+ patch from sos@prospect.com.ru (Sergey Okhapkin):
+ * Makefile.in: build ntea.o
+ * dcrt0.cc (dll_crt0_1): move console title code here from spawn_guts
+ * exceptions.cc (ctrl_c_handler): small signal fixes, prepare
+ things so we can eventually reset the signal handler to SIG_DFL
+ * fhandler.cc (fhandler_disk_file::open): first check for EA info
+ about exec/symlink status before doing it the hard way
+ (fhandler_make_pipe): u->self->hmap.build_fhandler takes extra arg
+ (fhandler_base::open): make use of NTEA
+ * fhandler.h: remove init_std_file_from_handle, build_fhandler
+ protos
+ * hinfo.cc: include mywinsock.h and sys/socket.h, define
+ __INSIDE_CYGWIN_NET__, __INSIDE_CYGWIN32__
+ (hinfo_vec::build_fhandler): takes an additional handle arg,
+ call GetConsoleScreenBufferInfo with it to see if are
+ fhandler_console, call GetCommState with it to see if we're
+ an fhandler_tty, call getpeername with it to see if we wamt
+ fhandler_socket. Old determining methods still work too.
+ * path.cc (symlink): chmod file to ((S_IFLNK) | (STD_RBITS) |
+ (STD_WBITS) | (STD_XBITS)) permissions
+ * select.cc: include stdio.h
+ (cygwin32_select): fix typo (missing an &),
+ assorted fixes for mixed socket/handles case
+ * shared.cc (create_shared_fd_table): set sa.bInheritHandle to 1
+ to support reparenting
+ * signal.cc (_kill): add FIXME, cleanup return codes
+ * spawn.cc (spawn_guts): remove console title code, add code
+ to support reparenting of child processes
+ * syscalls.cc: add new third arg to hmap.build_fhandler calls
+ (chmod): make use of NTWriteEA
+ * ntea.cc: new file, NTEA handling routines
+ * times.cc: fix value of NSPERSEC
+ (utimes): fix return value
+ * wait.cc: changes to support reparenting, change INFINITE to
+ constant 500 to avoid "blocking win32 syscalls and signals"
+ problem
+ * winsup.h: add NTReadEA, NTWriteEA protos, define REPARENTING,
+ fix build_fhandler proto to add new arg, add handles hrProcess and
+ hrThread
+
+Tue Apr 9 00:25:33 1997 Geoffrey Noer <noer@cygnus.com>
+
+ * libcerr.cc: remove fixed size of sys_errlist array, figure out
+ sys_nerr from the sizeof the array rather than hard coding it.
+ * shared.cc (open_shared_file_map): add typecast
+ * signal.cc (_kill): SIGKILL should avoid exception handler
+ * fork.cc (cygwin_fork_helper1): don't call ExitProcess with a
+ negative arg on recreate_mmaps_after_fork failure
+ * include/Windows32/Defines.h: define VER_PLATFORM_WIN32_WINDOWS
+
+ patch from sos@prospect.com.ru (Sergey Okhapkin):
+ * dcrt0.cc: move reent_data from private address space to cygwin.dll
+ * fork.cc: copy parent's reent_data to the child
+ * cygwin.din: export reent_data
+ * winsup.h: add as public struct _reent reent_save to pinfo class
+
+ another patch from sos@prospect.com.ru (Sergey Okhapkin):
+ * winsup.h: add ctrl_c_handler prototype
+ * exceptions.cc (init_exceptions): don't use u->self->hThread
+ since for a spawned process, this contains thread id of parent
+ Win32 process, not the child's. Instead use GetCurrent* funcs
+ to get thread handle.
+ (ctrl_c_handler): add more signal support, especially for kill
+ * signal.cc (_kill): more signal support, using CreateRemoteThread
+ under NT. Win95 only supports SIGKILL since it doesn't have this
+ call.
+ * syscalls.cc (windows_95): first version check should be an &
+ of 0x80000000 instead of 0x8000000
+ (close_all_files): hmap[i] doesn't always exist, for now comment
+ out code
+
+ patch from marcus@sysc.pdx.edu (Marcus Daniels):
+ * path.cc (skip_n_slashes): new local function
+ (symlink_check_worker): new local function, used to be symlink_check
+ (symlink_check): calls symlink_check_worker and returns
+ whether path is a symlink or not.
+ (symlink_expand): new local function, expand a symlink into
+ a file or directory path using symlink_check_worker
+ (path_conv::path_conv): takes extra follow_mode arg
+ (symlink_follow): call symlink_expand
+ * fhandler.cc, syscalls.cc: fix path_conv references
+ * path.h: fix path_conv prototype
+
+Mon Mar 24 19:44:28 1997 Geoffrey Noer <noer@cygnus.com>
+
+ patch from sos@prospect.com.ru (Sergey Okhapkin):
+ * select.cc: fix Feb 19 patch to select
+ * syscalls.cc: add statfs() and fstatfs() calls
+ * include/sys/vfs.h: new header file to support these
+ * cygwin.din: add them to dll export list
+
+Tue Mar 18 18:10:24 1997 Geoffrey Noer <noer@cygnus.com>
+
+ * dcrt0.cc: change idata3 asm section to have five null fields
+ instead of eight to conform to how MS does this section.
+
+Sun Mar 9 13:10:55 1997 Geoffrey Noer <noer@cygnus.com>
+
+ * include/sys/resource.h: add missing struct members to rusage struct
+ * resource.cc: added setting of missing fields, mostly to 0 until
+ we investigate how to set correct values.
+
+Wed Feb 19 17:44:06 1997 Jeremy Allison <jra@cygnus.com>
+
+ * select.cc: Added fixes from sos@prospect.com.ru (Sergey Okhapkin)
+ to implement blocking select on sockets/handles. This isn't
+ the way I finally want to do this, but I won't get chance
+ to do the re-write for a month or two so...
+ * include/Windows32/Defines.h: Added defines for NT ACL
+ stuff.
+
+Tue Feb 18 12:28:11 1997 Geoffrey Noer <noer@cygnus.com>
+
+ patch from sos@prospect.com.ru (Sergey Okhapkin):
+ * fhandler.cc: support reverse index escapes in console code
+
+Fri Feb 14 18:55:01 1997 Jeremy Allison <jra@cygnus.com>
+
+ * path.cc: Fixed normalize_posix_path() so that double slashes
+ are removed, except for those starting a UNC path. The command
+ ls .///////FILE_IN_DIRECTORY works now.
+
+Thu Feb 13 14:06:04 1997 Geoffrey Noer <noer@cygnus.com>
+
+ * path.cc: remove SLASH_P define and
+ * winsup.h: define it here instead
+ patch from scottk@utig.ig.utexas.edu (Scott Kempf):
+ dirsearch.cc (opendir): fix problem with accessing "/"
+
+Mon Feb 10 13:57:11 1997 Geoffrey Noer <noer@cygnus.com>
+
+ patch from sos@prospect.com.ru (Sergey Okhapkin):
+ * misc.cc: replace nice () stub with Win32 implementation
+ * spawn.cc
+ * fork.cc: use priority returned by GetPriorityClass
+
+Wed Feb 5 16:56:23 1997 Geoffrey Noer <noer@cygnus.com>
+
+ * fhandler.cc, syscalls.cc: minor reformat
+ patch from sos@prospect.com.ru (Sergey Okhapkin):
+ * spawn.cc: set console title to reflect what's running
+ * winsup.h: TITLESIZE define added
+
+Mon Feb 3 16:53:10 1997 Geoffrey Noer <noer@cygnus.com>
+
+ * fhandler.h: fix typo
+ * fhandler.cc: check_execable_p should only take one arg now
+
+Mon Feb 3 16:16:39 1997 Jeremy Allison <jra@cygnus.com>
+
+ * fhandler.cc: Removed open_helper, turned it into
+ fhandler_base::open and added fhandler_disk_file::open. More
+ correct C++.
+ fhandler_disk_file: Moved check_execable_p into fhandler_disk_file.
+ tty ports are now closed correctly.
+ * fhandler.h: Changes to support the above.
+
+Fri Jan 31 19:14:34 1997 Geoffrey Noer <noer@cygnus.com>
+
+ * fhandler.cc (fhandler_base::open_helper): new function
+ containing the common open() code. symlink and executable
+ status defaults to 0.
+ (fhandler_tty::open): new function that calls
+ fhandler_base::open_helper
+ (fhandler_base::open): remove common code now in open_helper,
+ leaving symlink checking and executable checking
+ * fhandler.h: changes for the above, open_helper is protected
+
+Thu Jan 30 15:23:15 1997 Geoffrey Noer <noer@cygnus.com>
+
+ * hinfo.cc: also treat com3 and com4 as special files
+ * spawn.cc (spawn_guts): check return of WaitForSingleObject
+ in _P_WAIT case, some reformatting
+
+Tue Jan 28 10:46:16 1997 Jeremy Allison <jra@cygnus.com>
+
+ * net.cc: Added errors "WSAEINVAL", "WSAEFAULT" as these
+ can be returned for net calls.
+ * fhandler.cc: Added FILE_SHARE_DELETE to open share modes.
+ Much closer to POSIX on NT now (ignored on '95).
+
+Fri Jan 17 13:32:26 1997 Geoffrey Noer <noer@cygnus.com>
+
+ * configure.in:
+ * utils/configure.in: define LIB_AC_PROG_CC to get around
+ autoconf 1.12 problem. Invoke it instead of AC_PROG_CC.
+ * configure:
+ * utils/configure: regenerate
+
+Thu Jan 16 12:35:41 1997 Geoffrey Noer <noer@cygnus.com>
+
+ * mmap.cc: added missing copyright notice
+
+Tue Jan 14 12:51:12 1997 Jeremy Allison <jra@cygnus.com>
+
+ * cygwin.din: Added get_osfhandle, cwait and all the
+ spawn functions.
+ * exec.cc: Added include of process.h. Changed call to
+ spawn_guts to add extra parameter.
+ * libcerr.cc: Added extra error messages. Ensured
+ messages start at zero.
+ * spawn.cc: Changed spawn_guts to do wait and nowait
+ calls. Added all spawn functions.
+ * syscalls.cc: Added get_osfhandle.
+ * winsup.h: Removed incorrect spawn definitions,
+ corrected prototypes for spawn_guts and file_exists
+ calls.
+ * include/io.h: New file. Added for get_osfhandle.
+
+Thu Jan 9 14:20:01 1997 Jeremy Allison <jra@cygnus.com>
+
+ * exceptions.h: Moved from winsup to winsup/include.
+ * include/mywinsock.h: Added getprotobynumber and
+ getservbyport.
+ * Makefile.in: Moved exceptions.h dependency.
+ * cygwin.din: Added cygwin32_getprotobynumber and
+ cygwin32_getservbyport.
+ * net.cc: Added cygwin32_getprotobynumber and
+ cygwin32_getservbyport.
+
+Wed Jan 8 14:15:35 1997 Jeremy Allison <jra@cygnus.com>
+
+ * fhandler.cc: Fix from Scott Kempf (scottk@rimu.ig.utexas.edu)
+ to ensure creation_disposition is set correctly in open.
+
+Fri Jan 3 12:10:22 1997 Jeremy Allison <jra@cygnus.com>
+
+ * fork.cc: Added parameter to recreate_mmaps_after_fork
+ in child, and added set_child_mmap_ptr() call in parent.
+ Needed as cygwin.dll statics are not copied accros a fork.
+ * mmap.cc: Added parameter to recreate_mmaps_after_fork,
+ added set_child_mmap_ptr() call.
+ * winsup.h: Added mmap_ptr to pinfo struct. Removed obsolete
+ comments.
+ * Makefile.in: Added -I../libio, needed to rebuild source
+ using STL. Also added -nostdinc++ on recommendation of
+ Mike Stump (mrs@cygnus.com).
+
+Thu Jan 2 17:23:10 1997 Jeremy Allison <jra@cygnus.com>
+
+ * dcrt0.cc: Added a call to initialize winsock on app
+ init.
+ * fork.cc: Added call so child initializes winsock before
+ returning from the fork. This makes many network daemons
+ run correctly that did not before (apache soon...).
+ * net.cc: Removed calls to checkinit, this is now done on
+ app startup. Renamed checkinit to socket_checkinit and
+ removed static scope.
+ * winsup.h: Added prototype for socket_checkinit().
+
+Thu Jan 2 12:25:06 1997 Jeremy Allison <jra@cygnus.com>
+
+ * dcrt0.cc (api_fatal): Check that u and u->self are
+ not zero before indirecting through them.
+ * fork.cc: Changed security descriptor for fork
+ mutexes to allow access by all.
+ * pinfo.cc: Changed security descriptor for shared
+ area to allow access by all.
+ * shared.cc: Added get_null_sd() call to return
+ security descriptor allowing access by all. Needed
+ when a cygwin32 service is running and also interactive
+ cygwin32 apps by the current logged in user.
+ * winsup.h: Added prototype for get_null_sd().
diff --git a/winsup/cygwin/ChangeLog-1998 b/winsup/cygwin/ChangeLog-1998
new file mode 100644
index 000000000..e22a158ed
--- /dev/null
+++ b/winsup/cygwin/ChangeLog-1998
@@ -0,0 +1,4490 @@
+Thu Dec 31 16:50:32 1998 DJ Delorie <dj@cygnus.com>
+
+ * mmap.cc: replaced all references to libstdc++ templates with
+ inline classes to remove build dependency on libstdc++
+
+Thu Dec 31 00:02:40 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * sysdef/uuid.def: remove useless stub.
+ * sysdef/oldnames.def: ditto.
+ * sysdef/largeint.def: ditto.
+ * sysdef/rpcndr.def: ditto.
+
+Wed Dec 30 20:33:09 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * utils/cygcheck.cc: clean up misc. warnings relating to
+ signed vs. unsigned, char * vs. const char *, etc...
+
+Wed Dec 30 21:41:25 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * dcrt0.cc (do_exit): Remove previous dwProcessId
+ change as it presumes too much knowledge about signalling
+ in the wrong place in the code.
+ * sigproc.cc (sigproc_terminate): Move the dwProcessId
+ assignment here but only do it when it is necessary or
+ programs will die abnormally.
+ * fhandler.h: Add raw_write method to fhandler_serial.
+ * fhandler_serial.cc (raw_write): New method. Accomodates
+ overlapped I/O that now must be used with serial.
+ * utils/kill.cc (main): Allow `0' signal. Just checks
+ for existence of process.
+
+Wed Dec 30 00:01:18 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * include/cygwin/version.h: bump API_MINOR to 8 to mark
+ recently exported _ctype_, _sys_errlist, _sys_nerr. Briefly
+ describe all API_MINOR changes to date.
+
+Wed Dec 30 01:31:34 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * dcrt0.cc (do_exit): Set myself->dwProcessId so that
+ some exit routines will not falsely believe that this
+ process has been execed.
+ * select.cc (peek_serial): Remove debugging statements.
+ * sigproc.cc (sigproc_terminate): Detect state where
+ myself->dwProcessId == 0 as indicative of not being
+ an exec stub.
+
+Tue Dec 29 21:13:33 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * dcrt0.cc (alloc_stack_hard_way): Fix a couple of thinkos
+ in calculating size of the new stack. Just use the size
+ passed from the parent.
+ (dll_crt0_1): Set up new frame pointers here, if appropriate.
+ * fork.cc (fork): Move frame pointer setup into dll_crt0_1.
+
+Tue Dec 29 12:57:38 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * utils/mkpasswd.c: Include wchar.h.
+ * utils/mkgroup.c: Ditto.
+
+Tue Dec 29 12:53:23 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * Makefile.in: remove dep for libcerr.o
+
+Mon Dec 28 22:02:15 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * fhandler.h: Make fhandler_serial io_status public since
+ select needs it. Add 'saw_error' field to select_record so
+ that select can detect error conditions.
+ * fhandler_serial.cc (fhandler_serial::raw_read): Detect
+ "operation aborted" error and retry. This seems to indicate
+ an attempt to retry an overlapped operation.
+ * select.cc (select_stuff::wait): Honor saw_error field when
+ appropriate.
+ (peek_serial): Rewrite to operate similarly to
+ fhandler_serial::raw_read.
+ * include/sys/termios.h: CBAUD mask was still not right.
+
+Mon Dec 28 09:09:27 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * libcerr.cc: Make obsolete. Move into errno.cc
+ * libctype.c: Make obsolete. Use newlib table.
+ * Makefile.in: Remove obsolete entries from LIBCOS. Define
+ __INSIDE_CYGWIN__ explicitly for .c -> .o compilation.
+ * cygwin.din: New exports: _ctype_, _sys_errlist, _sys_nerr.
+ * errno.cc: Move _sys_errlist and _sys_nerr here.
+ * dlfcn.cc: Reorganize includes to put ctype.h after winsup.h
+ so that __INSIDE_CYGWIN__ will be defined for use in ctype.h.
+ * fhandler_console.cc: Ditto.
+ * fhandler_tty.cc: Ditto.
+ * path.cc: Ditto.
+ * spawn.cc: Ditto.
+
+Sat Dec 26 00:20:48 1998 Christopher Faylor <cgf@cygnus.com>
+
+ patch from Corinna Vinschen <corinna.vinschen@cityweb.de>:
+ * include/Windows32/CommonFunction.h: Added proto for
+ NetUserChangePassword().
+
+Thu Dec 24 16:15:40 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * dcrt0.cc (dll_crt0_1): Add more debugging output.
+ * ioctl.cc (ioctl): Can't use TC[GS]ET ioctls for pty master as
+ it conflicts with TIOCPKT.
+ * passwd.cc (passwd): Bypass tc[gs]etattr call in favor of appropriate
+ method or conversion confusion will result due to attempts to
+ appropriately convert to old-style termios structures in tc[gs]etattr.
+ * strace.cc (strace_vsprintf): Define t explicitly.
+ * termios.cc (tcsetattr): Reorganize to allow meaningful debugging
+ output.
+ (tcgetattr): Ditto.
+
+Wed Dec 23 15:02:11 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * winsup.h: Reorganize include order to allow thread-safe build.
+
+Wed Dec 23 11:45:33 1998 DJ Delorie <dj@cygnus.com>
+
+ * strace.cc (strace_microseconds): new function; returns elapsed
+ time in microseconds, using performance counters if available.
+ (strace_vsprintf): print timestamps and deltas as microseconds,
+ not seconds.
+
+Wed Dec 23 11:35:02 1998 DJ Delorie <dj@cygnus.com>
+
+ * times.cc (__to_clock_t): Change return value to unsigned long
+ long to prevent overflow.
+
+Tue Dec 22 19:37:55 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * fhandler.h: Reflect fhandler_*::init argument reordering.
+ Add dup and init methods to fhandler_serial.
+ * fhandler.cc (fhandler_base::init): Reorder arguments to mirror
+ open().
+ * fhandler_console.cc (fhandler_console::init): Ditto. Initialize
+ using fhandler_base rather than fhandler_serial as console is
+ now being slowly uncouple from fhandler_serial.
+ * fhandler_serial.cc (fhandler_serial::fhandler_serial): Set size
+ of data structure or suffer strange behavior on exec().
+ (raw_read): Add debugging output.
+ (fhandler_serial::init): New method.
+ (fhandler_serial::open): Detect call from init method and avoid
+ calling fhandler_base::open. Don't worry about non-blocking reads
+ since they are now handled correctly by _read().
+ (fhandler_serial::tcsetattr): Honor ICANON in a kludgey sort of way.
+ (fhandler_serial::tcgetattr): Ditto.
+ (fhandler_serial::dup): New method. Ensures duplication of all
+ elements of fhandler_serial class.
+ * fhandler_tty.cc (fhandler_tty_master::init): Reflect init argument
+ reordering.
+ (fhandler_tty_slave::init): Ditto.
+ * hinfo.cc (hinfo::init_std_file_from_handle): Remove unnecessary
+ argument.
+ (hinfo_init): Reflect change to init_std_file_from_handle.
+ (cygwin_attach_handle_to_fd): Use more appropriate types for
+ arguments.
+ (hinfo::build_fhandler): Add some slop to allocated buffer just
+ for paranoia's sake.
+ (hinfo::dup2): Avoid dereferencing a NULL pointer when oldfd==newfd.
+ * pipe.cc (make_pipe): Reflect init argument change.
+ * shared.h: Another immigrant from winsup.h
+ * winsup.h: Reflect change to init_std_file_from_handle. Relocate
+ a declaration to shared.h so that it can be used in fhandler.h.
+ * include/sys/cygwin.h: Reflect change to cygwin_attach_handle_to_fd.
+
+Mon Dec 21 16:22:48 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * fhandler.cc (fhandler_base::open): Detect serial device as a special
+ case requiring an overlapped open.
+ * fhandler.h (fhandler_serial): Add several methods. Add new 'fixup after
+ fork required' field.
+ * fhandler_serial.cc (raw_read): Rewrite to come closer to handling VMIN
+ VTIME parameters and to allow EINTR.
+ (fhandler_serial::open): Initialize overlapped event here. Make error
+ messages more explicit.
+ (fhandler_serial::close): Close status event.
+ (fhandler_serial::tcsetattr): Store vtime_ as milliseconds. Attempt to
+ handle VMIN > 0, VTIME == 0 better.
+ (fhandler_serial::fixup_after_fork): Initialize a new event handle after
+ a fork.
+ (fhandler_serial::de_linearize): Ditto.
+ * hinfo.cc (hinfo::fixup_after_fork): Call fork fixer upper if close_on_exec
+ of need_fork_fixup set.
+
+Sun Dec 20 16:05:25 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * include/shellapi.h: replace with stub that includes windows.h
+ like similar headers already do.
+ * scandir.cc (scandir): add parens around assignment used as truth
+ value.
+
+Sat Dec 19 00:42:44 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * thread.cc: Fix copyright info.
+ * thread.h: Ditto.
+ * libcmain.cc: gcc is now more picky about requiring a type
+ for main(), so add one.
+ * include/pthread.h: Add attribution for net contributor.
+
+Fri Dec 18 19:21:30 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * pthread.cc: fix copyright header.
+ * shared.h: ditto.
+
+Fri Dec 18 19:21:30 1998 Geoffrey Noer <noer@cygnus.com>
+
+ patch from Corinna Vinschen <corinna.vinschen@cityweb.de>:
+ * cygwin.din: export scandir and alphasort.
+ * Makefile.in: add scandir.o to deps
+ * scandir.cc: New file with scandir and alphasort implementations.
+ * include/cygwin/version.h: bump API_MINOR to 7.
+
+Fri Dec 18 16:44:07 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * include/pthread.h: clean up, remove C++-style comments,
+ remove pthread_getsequence_np proto.
+
+Fri Dec 18 15:26:33 1998 Christopher Faylor <cgf@cygnus.com>
+
+ Throughout, prepend cygwin_ to functions that are exported
+ as cygwin_* which previously needed to be aliased.
+
+ * path.cc (cygwin_conv_to_win32_path): Resolve symbolic links.
+ Return success or failure value.
+ (cygwin_conv_to_full_win32_path): Ditto.
+ (cygwin_conv_to_posix_path): Return success or failure value.
+ (cygwin_win32_to_posix_path_list): Ditto.
+ (cygwin_posix_to_win32_path_list): Ditto.
+ * shared.h: New include file that incorporates parts of
+ winsup.h, fhandler_tty.h, path.h, and delqueue.h.
+ * Makefile.in: Remove old include files.
+ * cygwin.din: cygwin_* aliases are no longer required.
+ * libccrt0.cc: Store api_minor in per_process structure.
+ * select.cc: Change meaning of second argument to ready_for_read
+ to indicate whether read_ahead should be ignored.
+ * fhandler.h: Reflect change in second argument to ready_for_read.
+ * syscalls.cc (_read): Ditto.
+ * termios.cc: Throughout, detect attempt to use old style termios
+ structure and convert as appropriate.
+ * ioctl.cc (ioctl): Detect use of ioctl requiring termios field
+ and call appropriate tc[gs]et* function to handle it.
+ * fhandler_console.cc (fhandler_console::ioctl): Remove TC* calls
+ that are now handled in main ioctl.
+ * fhandler_tty.cc (fhandler_tty_slave::ioctl): Ditto.
+ * include/cygwin/version.h: Added TERMIOS defines. Bump API_MINOR
+ to 6.
+ * include/sys/cygwin.h: Reflect change in return value for some
+ cygwin_conv_* calls.
+ * include/sys/termios.h: Reformat slightly. Add conversion macros
+ for dealing with old style termios structure.
+ * include/pthread.h: add
+
+Fri Dec 18 15:03:33 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * Makefile.in: Cleanup pthread usage.
+
+Fri Dec 18 14:35:59 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * Makefile.in: Remove obsolete header dependency for
+ thread-safe build.
+
+Fri Dec 18 14:16:04 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * exceptions.cc (sig_handle): Avoid suspending top-level
+ processes.
+ * trace.cc: Remove unneeded include.
+
+Thu Dec 17 19:19:53 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * cygwin.din: remove pthread_getsequence_np, _reent_clib
+
+Thu Dec 17 16:48:15 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * include/cygwin/version.h: correct two typos in comments
+
+Thu Dec 17 19:11:31 1998 Christopher Faylor <cgf@cygnus.com>
+
+ patch from Corinna Vinschen <corinna.vinschen@cityweb.de>:
+ * include/Windows32/Defines.h: Add values for using Windows
+ function `DeviceIoControl()'.
+
+Thu Dec 17 18:00:34 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * dcrt0.cc (dll_crt0_1): exception_list is not a struct.
+ * debug.cc (thread_stub): Ditto.
+
+Thu Dec 17 08:24:37 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * cygwin.din: Remove leading underscores from pthread functions.
+ * include/cygwin/version.h: Bump DLL major version to 21, DLL minor
+ version to 0, and API_MINOR to 5.
+
+Wed Dec 16 22:54:16 1998 Christopher Faylor <cgf@cygnus.com>
+
+ Merge in thread-safe branch changes.
+
+Wed Dec 16 22:54:16 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * pthread.cc: Include winsup.h.
+
+Wed Dec 16 22:54:16 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * thread.cc: Reformat.
+ * pthread.cc: New file.
+ * cygwin.din: Add pthread interface functions
+
+Wed Dec 16 22:54:16 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * configure.in: Add some --enable options.
+ * configure: Regenerate.
+ * Makefile.in: Reorganize CFLAGS to recognize new --enable options.
+
+Wed Dec 16 22:54:16 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * fork.cc (stack_base): Store slightly different information
+ in child_info_fork structure for later use in alloc_stack_hard_way.
+ (fork): Set frame pointer information if stack has been reallocated.
+ * dcrt0.cc (alloc_stack_hard_way): Reflect change in
+ child_info_fork structure.
+ (dll_crt0_1): Make thread initializers "static" and NO_COPY or death
+ of the main thread causes death of other threads.
+ * winsup.h (child_info_fork): Change structure.
+
+Wed Dec 16 22:54:16 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * thread.h: Remove extraneous declaration.
+ * include/sys/strace.h: Make a new thread_printf function
+ for use by new thread-safe code.
+ * thread.cc: Use thread_printf throughout.
+
+Wed Dec 16 22:54:16 1998 Christopher Faylor <cgf@cygnus.com>
+
+ patch from Marco Fuykschot (marco@ddi.nl)
+ * Throughout sources add locking control for preliminary
+ thread-safe cygwin operation.
+
+Wed Dec 16 22:54:16 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * dcrt0.cc (getprogname): Should be a static.
+ (alloc_stack): Extend to allow forking from another
+ thread.
+ (alloc_stack_hard_way): New function used by alloc_stack.
+ (dll_crt0_1); Don't pass parameters since stack may be
+ "funny". Use statics instead. Move fork/spawn checking
+ into dll_crt0.
+ (dll_crt0): Do fork spawn checking here. alloc_stack()
+ will call dll_crt0_1 if forked from a non-main thread.
+ * fork.cc (stack_base): New function determines base
+ (and other values) of this thread's stack.
+ (fork): Use new PROC_FORK1 method for forking. Provides
+ more data to forkee. Use stack_base to set stack
+ values.
+ * winsup.h (child_info_fork): Changes for PROC_FORK1.
+
+Wed Dec 16 16:15:29 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * include/shellapi.h: fix typo in DragQueryPoint proto.
+
+Mon Dec 14 12:37:43 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * net.cc: minor respacing
+ (get_ifconf): new local function, combines get_winnt_ifconf and
+ get_win95_ifconf.
+ (get_win95_ifconf): delete
+ (get_winnt_ifconf): delete
+ (fhandler_socket::ioctl): adjust ifconf calls in light of above,
+ check returned value for safety.
+ * include/cygwin/version.h: bump CYGWIN_VERSION_API_MINOR to 4
+ in honor of newly supported socket ioctls.
+
+ patch from Corinna Vinschen <corinna.vinschen@cityweb.de>:
+ * include/asm/socket.h: Added defines for ioctl() calls
+ SIOCGIFADDR, SIOCGIFBRDADDR and SIOCGIFNETMASK.
+ * net.cc (get_winnt_ifconf): Check the registry entries
+ instead of just calling get_win95_ifconf(). Added what argument
+ to support the new ioctl() calls.
+ (get_win95_ifconf): Check the Windows 9x registry entries as
+ described by Tim Newsham.
+ (fhandler_socket::ioctl): Support the ioctl() commands
+ SIOCGIFADDR, SIOCGIFBRDADDR and SIOCGIFNETMASK.
+ (get_if_flags): Check for a down interface.
+
+Wed Dec 9 18:11:31 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * fhandler.cc (fhandler_disk_file::open): check for shell scripts
+ regardless of Win32 OS type.
+
+Sun Dec 6 19:38:11 1998 Christopher Faylor <cgf@cygnus.com>
+
+ patch from Corinna Vinschen <corinna.vinschen@cityweb.de>:
+ * fhandler_console.cc (fhandler_console::tcgetattr): Fix typo.
+ ISIG should be ored with c_lflag.
+
+Tue Dec 1 16:28:56 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * include/utmp.h: delete, moved to newlib/libc/sys/cygwin/sys.
+
+Thu Dec 3 15:41:51 1998 Geoffrey Noer <noer@cygnus.com>
+
+ Released 20.1 update.
+
+Thu Dec 3 22:24:18 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * exceptions.cc (set_process_mask): Add `sync' parameter
+ to control whether signals should be synched on exit.
+ (handle_sigsuspend): Provide second argument to set_process_mask -
+ don't sync.
+ (call_handler): Ditto for asm handler.
+ * signal.cc (sigprocmask): Ensure that signals are synchronized
+ by calling set_process_mask with sync == 1.
+ * sigproc.cc (__release_signal_mutex): Third argument is not
+ strictly a BOOL, so change it.
+ * sigproc.h: Reflect above parameter changes.
+
+Thu Dec 3 15:30:44 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * select.cc (peek_console): Work around NT bug that
+ caused strange behavior with ReadFile after this
+ function was invoked.
+
+Tue Dec 1 14:43:35 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * sigproc.cc (sigproc_init): Set maintid and signal_mutex early
+ to avoid races in wait_sig initialization.
+ (__get_signal_mutex): Improve debug output.
+ (__release_signal_mutex): Ditto.
+ * spawn.cc (spawn_guts): Allocate more space for string when building
+ up from #! and absolute path is not known. Otherwise weird stuff
+ like infinite recursion or unknown file errors occur.
+
+Tue Dec 1 08:34:18 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * mkvers.sh: Accomodate lack of timezone in date output so that
+ year shows up correctly.
+
+Mon Nov 30 14:30:51 1998 Jeff Johnston <jjohnstn@cygnus.com>
+
+ * times.cc (times): Altered function so that on non-Windows-NT systems
+ it does not use the GetProcessTimes() API which is not supported.
+
+Mon Nov 30 00:38:54 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * dcrt0.cc: Fix incorrect use of struct on exception_list
+ typedef.
+ * debug.cc (thread_stub): Ditto.
+ * dll_init.cc: Ditto.
+ * include/Windows32/Structures.h: Correct typo where
+ typedef SYSTEM_POWER_STATUS was being used as a struct.
+
+Sun Nov 29 22:03:17 1998 Christopher Faylor <cgf@cygnus.com>
+
+ patch from Corinna Vinschen <corinna.vinschen@cityweb.de>:
+ * fhandler_console.cc (fhandler_console::ioctl):
+ Added ioctl commands TCGETA, TCSETA, TCSETAW, TCSETAF.
+
+Fri Nov 27 22:30:58 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * fhandler.h: Set aside NOEINTR bit. When this is set
+ cygwin will not allow the read on this device to be
+ interrupted by a signal.
+ * pipe (_pipe): Set NOEINTR bit for read end of pipes
+ created using this method. The vague rationale for this
+ is that these pipes are supposed to be more like Windows
+ pipes than UNIX pipes.
+ * syscalls.cc (_pipe): Honor NOEINTR flag.
+ * getopt.c: Clean up some gcc warnings.
+ * libcerr.c: Ditto.
+
+Fri Nov 27 21:56:03 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * exceptions.cc (SIG_NONMASKABLE): Update for new signal
+ mask method.
+ (handle_sigsuspend): Release of signal mutex must be
+ synchronous -- the signal must be delivered before the
+ function returns. Otherwise, there will be races in
+ the caller code.
+ * sigproc.cc (sigproc_terminate): Minor cleanup.
+
+Thu Nov 26 20:26:17 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * exceptions.cc (call_handler): Attempt to work around
+ potential race when setting signal_arrived. This
+ particularly affects sigsuspend.
+ (handle_sigsuspend): Reset signal_arrived prior to
+ grabbing the mutex. This should reduce the probability
+ of a race.
+ * sigproc.cc (sig_send): Don't reset signal_arrived in
+ the SIGSUSPEND case since this could introduce a race.
+
+Thu Nov 26 12:19:16 1998 Christopher Faylor <cgf@cygnus.com>
+
+ patch from sos@prospect.com.ru (Sergey Okhapkin):
+ * select.cc (MAKEready): Don't wait for signal prior to
+ testing for read. That introduces an unnecessary delay.
+
+Wed Nov 25 23:03:47 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * winsup.h: Make `isdirsep' an alias for SLASH_P.
+ Implement isabspath convenience macro.
+ Change sigprotect to a macro since it appears to
+ be impossible to send __FILE__ type macros to a
+ constructor. Change use of sig_protect throughout.
+ * dcrt0.cc (dll_crt0_1): Use new path macro.
+ * dlfcn.cc (get_full_path_of_dll): Ditto.
+ * path.cc (path_conv::path_conv): Ditto.
+ (normalize_posix_path): Ditto.
+ (slashify): Ditto.
+ (backslashify): Ditto.
+ * syscalls.cc (num_entries): Ditto.
+ * lock.cc: Redefine lock methods to pass debug info to
+ {get,release}_signal_mutex.
+ * environ.cc (environ_init): Correct strncmp test for
+ TERM=, otherwise it's impossible to set TERM.
+ * exceptions.cc: Eliminate lock_cs and unlock_cs macros.
+ Use {get,release}_signal_mutex throughout.
+ (signal_init): Don't initialize signal_mutex here.
+ (set_process_mask): Remove vestiges of old mutex code.
+ (handle_sigsuspend): Ditto.
+ (call_handler): Move signal_arrived SetEvent back here.
+ It was being triggered too often before.
+ Detect when the signal thread is exiting.
+ (sig_handle): Remove inappropriate SetEvent(signal_arrived).
+ (events_terminate): Move close of signal_mutex elsewhere.
+ * glob.cc: Increase "MAXPATHLEN" size for arguments that
+ are not necessarily pathnames.
+ * pinfo.cc (lpfu): Lower timeout for reporting possible
+ problem with INFINITE wait.
+ * sigproc.cc (wake_wait_subproc): Make this a macro with
+ no arguments so that its use in the code is a little
+ clearer.
+ (proc_terminate): Eliminate signal blocking here since
+ this should already be handled by the caller.
+ (sigproc_init): It makes sense to initialize signal_mutex
+ here, so do so.
+ (__allow_sig_dispatch): Rename. Take debugging arguments.
+ Pass arguments on to release_signal_mutex.
+ (__block_sig_dispatch): Rename. Take debugging arguments.
+ Pass arguments on to get_signal_mutex. Detect signal
+ thread exiting confition.
+ (__get_signal_mutex): Take debugging arguments. Maintain
+ a stack of nested mutex calls for later display in
+ __release_signal_mutex. Detect signal thread exit
+ condition. Don't bother with locking if signal thread is
+ executing or if just an exec stub.
+ (__release_signal_mutex): Don't bother with locking if signal
+ thread is executing or if just an exec stub.
+ * sigproc.h: Reflect renamed functions above. Provide
+ wrappers to pass in diagnostic information.
+ * spawn.cc (spawn_guts): More fixes to deal with nested
+ #! and to properly report posix argv[0] when invoked as a
+ script.
+
+Wed Nov 25 12:41:12 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * Makefile.in: Reinstate libwinspool.a/winspool.drv creation.
+
+Tue Nov 24 18:48:56 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * Makefile.in: add CFLAGS_COMMON and CFLAGS_CONFIG to CFLAGS
+ and CXXFLAGS in FLAGS_TO_PASS.
+
+ * include/sys/select.h: new file with select proto. Avoid
+ potential conflict with Winsock inclusion by Cygwin internals.
+ * include/sys/socket.h: remove select proto.
+ * winsup.h: define __INSIDE_CYGWIN__. Include windows.h after
+ Unix include files.
+ * include/mywinsock.h: delete file
+ * include/Windows32/Sockets.h: add ndef __INSIDE_CYGWIN__s
+ around portions that conflict with Unix definitions. This
+ yields what used to be mywinsock.h which is a blend of Unix
+ sockets and Winsock needed by Cygwin internals.
+ * exceptions.cc: define Win32_Winsock to include
+ Windows32/Sockets.h. No longer define __INSIDE_CYGWIN__.
+ * hinfo.cc: ditto
+ * net.cc: ditto
+ * select.cc: ditto
+
+ * include/exceptions.h: change wrapper define to _EXCEPTIONS_H.
+ * include/sys/resource.h: move includes outside __cplusplus check.
+ * include/sys/wait.h: ditto.
+
+Sun Nov 22 23:33:19 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * sigproc.cc (__release_signal_mutex): revert Nov 3d change.
+
+Sun Nov 22 17:04:44 1998 Christopher Faylor <cgf@cygnus.com>
+
+ patch from sos@prospect.com.ru (Sergey Okhapkin):
+ * regexp/Makefile.in: Add additional bits necessary to
+ allow correct installation of include file.
+
+Fri Nov 20 17:04:48 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * Makefile.in: Set "Warn about writable strings" option in CFLAGS.
+ * fhandler_tty.h: Fix for writable strings detection.
+ * grp.cc (add_grp_line): Ditto.
+ * mkvers.sh: Ditto.
+ * path.h: Ditto.
+ * registry.cc: (reg_key::reg_key): Ditto.
+ * smallprint.c (__small_vsprintf): Ditto.
+ * tty.cc (tty::get_event): Ditto.
+ * winsup.h: Give up on read_ready_thread. Move sig_protect
+ here since it needs to use information set up after the sigproc.h
+ include.
+ * dcrt0.cc: Ditto.
+ * debug.cc (WFSO): New function. Used to ensure that
+ function shows up on stack trace.
+ (WFMO): Ditto.
+ * debug.h: Define the above.
+ * exceptions.cc (ctrl_c_handler): Record last signal
+ for signal handler.
+ * select.cc (MAKEready): New macro for constructing
+ fhandler_*::ready_for_read function.
+ (fhandler_*::ready_for_read): Use macro to construct this
+ method throughout.
+ * sigproc.cc (sig_send): Work around race on process termination
+ where the event being waited for may disappear.
+ (sigproc_terminate): #ifdef code here that attempted to deal with
+ the above condition in sig_send.
+ * sigproc.h: Move sig_protect to winsup.h.
+ * spawn.cc (perhaps_suffix): Don't return pointer into an
+ automatic variable.
+ (find_exec): Always point known_suffix to something.
+ * syscalls.cc (read_handler): Refine debug output.
+ (read_ready_thread): Delete.
+ (_read): Eliminate use of read_ready_thread. Call ready_for_read
+ directly as appropriate.
+
+Thu Nov 19 15:26:40 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * Makefile.in: remove -Wunused since that's already in -Wall
+ * dlfcn.cc (check_path_access): rename winenv arg to mywinenv
+ * path.cc (symlink): change save_errno var to saved_errno
+ * spawn.cc (find_exec): rename winenv arg to mywinenv
+ (spawn_guts): rename sigprotect handle to starting_here
+ * winsup.h: remove trailing comma from process_state flags
+ enum
+ * utils/aclocal.m4: regenerate
+ * utils/configure: regenerate
+
+Thu Nov 19 11:16:38 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * Makefile.in: Use correct libpthread.a target when
+ thread-safe is enabled.
+
+Thu Nov 19 10:49:27 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * path.cc (path_conv): Correct error reporting.
+
+Wed Nov 18 20:07:50 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * utils/Makefile.in: remove termcap file install rule
+
+Wed Nov 18 18:14:18 1998 Geoffrey Noer <noer@cygnus.com>
+
+ More minor cleanup:
+ * environ.cc (winenv): don't define len twice.
+ * fork.cc (sync_with_parent): should NOT use rc since
+ this is a macro and that could have interfered with rc in
+ the calling function. Renamed to psync_rc.
+ * fhandler_serial.cc (fhandler_serial::open): change
+ access to myaccess since it shadows global decl.
+ * hinfo.cc: ditto throughout
+ * path.cc: ditto throughout
+ (path_conv::path_conv): change error to err.
+
+Wed Nov 18 16:17:58 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * profil.c: include stdio.h
+ (print_prof): comment out unused func
+ (profile_ctl): should return an int
+
+Wed Nov 18 16:17:58 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * utils/ps.cc: include sys/cygwin.h, make pname buf
+ MAXPATH in size.
+
+ patch from Corinna Vinschen <corinna.vinschen@cityweb.de>:
+ * utils/ps.cc (main): converting windows paths to posix
+ paths in output.
+
+Wed Nov 18 15:34:46 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * include/wchar.h: include stddef.h.
+
+Wed Nov 18 17:39:15 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * environ.cc (environ_init): Fix incorrect TERM= detection.
+
+Tue Nov 17 17:28:09 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * gcrt0.c: include stdlib.h, add proto for monstartup.
+
+Tue Nov 17 16:47:42 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * include/wchar.h: add protos for wcslen and wcscmp.
+ * syscalls.cc: minor reformat.
+
+Tue Nov 17 15:38:45 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * fhandler.cc (fhandler_base::fhandler_base): Default non-disk
+ devices to binary mode.
+ * fhandler.h: Reformat slightly.
+
+Tue Nov 17 11:19:23 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * external.cc (fillout_pinfo): Copy progname using strcpy to
+ save on time.
+ * path.h: Add new enums for more fine-grained control
+ of path_conv.
+ * dir.cc (opendir): Use enum argument to path_conv.
+ (mkdir): Ditto.
+ (rmdir): Ditto.
+ * dlfcn.cc (get_full_path_of_dll): Ditto.
+ * fhandler.h: Add new set_readahead_valid to set actual
+ readahead.
+ * fhandler.cc (raw_read): Remove extraneous variable.
+ (fhandler_base::read): Rework to allow readahead when
+ not text mode.
+ (fhandler_disk_file::fstat): get_symlink_p() only returns
+ true/false now.
+ (fhandler_disk_file::fhandler_disk_file): Use enum argument
+ to path_conv.
+ (fhandler_disk_file::open): Ditto.
+ * spawn.cc (perhaps_suffix): Ditto.
+ * syscalls.cc (_unlink): Ditto.
+ (_link): Ditto.
+ (stat_worker): Ditto.
+ (_rename): Ditto.
+ * fhandler_serial.cc (fhandler_serial::open): Always reset timeouts.
+ * path.cc (path_conv::path_conv): Honor new enum arguments.
+ Specifically, use SYMLINK_CONTENTS for readlink interface.
+ (readlink): Use SYMLINK_CONTENTS argument to path_conv.
+ * select.cc: Rework serial support which has apparently never
+ worked.
+
+Mon Nov 16 16:15:20 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * Makefile.in: FLAGS_TO_PASS should pass CFLAGS and CXXFLAGS
+ not ALL_CFLAGS and ALL_CXXFLAGS. Rework handling of CFLAGS
+ variables to remove duplication and make it possible to
+ build mingw directory.
+
+Mon Nov 16 09:40:21 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * syscalls.cc (_open): Use new macro to check for
+ NULL or empty pathname and return appropriate error.
+ * path.cc (check_null_empty_path*): Move macro to
+ path.h.
+ * path.h: Move macros here.
+
+Sun Nov 15 20:23:10 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * include/cygwin/version.h: bump API_MINOR to 3 to mark
+ addition of dll_noncygwin_dllcrt0 to exports list.
+
+Sun Nov 15 23:05:21 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * path.cc (check_null_empty_path): New macro.
+ (check_null_empty_path_errno): Ditto.
+ (path_conv::path_conv): Check for NULL and empty
+ path names here and set appropriate error.
+ (conv_to_win32_path): Ditto.
+ (conv_to_full_win32_path): Ditto.
+ (conv_to_posix_path): Ditto.
+ (conv_to_full_posix_path): Ditto.
+ (mount_info::conv_wo_win32_path): Back out previous
+ change.
+ (mount_info::conv_to_posix_path): Ditto.
+
+Sun Nov 15 19:29:19 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * include/limits.h: define CHILD_MAX to be 63.
+ * sysconf.cc (sysconf): return CHILD_MAX when asked for
+ instead of _POSIX_CHILD_MAX.
+
+Sun Nov 15 18:25:22 1998 Geoffrey Noer <noer@cygnus.com>
+
+ patch from Mumit Khan <khan@xraylith.wisc.edu>:
+ * path.cc (mount_info::conv_to_posix_path): Handle NULL and
+ empty pathnames.
+ (mount_info::conv_to_win32_path): Likewise.
+
+Sun Nov 15 18:09:06 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * cygwin.din: export dll_noncygwin_dllcrt0.
+ * {libccrt0.cc, winsup.h}: minor reformat.
+
+Sat Nov 14 22:14:51 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * environ.cc (environ_init): Use sizeof for string lengths
+ rather than hard-coded values.
+
+ patch from Mumit Khan <khan@xraylith.wisc.edu>:
+ * dll_init.cc (dll_foreign_dllcrt0): Rename to
+ dll_noncygwin_dllcrt0.
+ * winsup.h: Ditto.
+ * include/cygwin/cygwin_dll.h: Ditto.
+
+Sat Nov 14 14:09:33 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * hinfo.cc (hinfo::de_linearize_fd_array): Reset first fd
+ for open to zero after an exec.
+
+Sat Nov 14 01:29:23 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * fork.cc (fork): No need for intermediate jmp_buf variable.
+
+ patch from Mumit Khan <khan@xraylith.wisc.edu>:
+ * libccrt0.cc (cygwin_attach_foreign_dll): New function.
+ * dll_init.cc (dll_foreign_dllcrt0): New function to initialize
+ DLLs loaded by non-cygwin apps.
+ (dll_dllcrt0_1): Initialize process table entry.
+ (dll_dllcrt0): Revert last change to do partial initialization.
+ * winsup.h (dll_foreign_dllcrt0): Prototype.
+ * include/cygwin/cygwin_dll.h (_cygwin_foreign_dll_entry): New
+ entry point that does partial initialization for non-cygwin apps.
+
+Fri Nov 13 16:17:28 1998 Geoffrey Noer <noer@cygnus.com>
+
+ Assorted -Wall cleanup:
+ * utils/mount.cc (show_mounts): remove unused var i.
+ * utils/cygcheck.cc (dll_info): comment out unused var ofs.
+ (dump_sysinfo): return a void, not an int. Comment out unused
+ var len in two places. Add parens around assignment used as
+ truth value.
+ * utils/kill.cc (main): remove unused var i
+ * utils/mkpasswd: include <ctype.h> and <stdlib.h>.
+ (enum_users): remove unused var rc.
+ (enum_local_groups): ditto.
+ * utils/ps.cc (main): Add parens around assignments used as
+ truth values.
+ * utils/mkgroup.c: include <ctype.h> and <stdlib.h>.
+ (enum_groups): return void, not int. Remove unused var rc.
+ * gmon.c: include <stdio.h> and <unistd.h>.
+ (_mcleanup): remove unused vars buf and profdir.
+
+Fri Nov 13 16:17:28 1998 Geoffrey Noer <noer@cygnus.com>
+
+ patch from Corinna Vinschen <corinna.vinschen@cityweb.de>:
+ * include/sys/sysmacros.h: new file, define major, minor, makedev
+
+Fri Nov 13 17:03:52 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * dcrt0.cc: Reflect a variable name change.
+ * fhandler.h: *::ready_for read takes an additional argument.
+ * fhandler_console.cc (get_non_ascii_key): New function derived
+ from fhandler_console::read1.
+ (fhandler_console::read1): Use new function.
+ * select.cc (*::ready_for_read): Add new "nonblocking" argument.
+ (peek_console): Be more diligent in detecting when a usable
+ character has been entered or false positives will be returned.
+ (fhandler_tty_common::ready_for_read): Detect attempt to perform
+ a "background" read.
+ * syscalls.cc (read_handler): Remove code for dealing with slow
+ devices. Just deal with non-blocking here.
+ (read_ready_thread): Renamed function. Rewritten to only detect
+ when an fd has data ready to be read. Actual reads happen in
+ the main thread.
+ (_read): Rely on read_handler to read data for everything. Use
+ the read_ready_thread to indicate when data is ready to be read.
+ Gut the read_thread_info class since it no longer needs to return
+ much information.
+ * winsup.h: Reflect above changes to read_thread_info. Rename
+ to read_ready_thread_info.
+
+Fri Nov 13 15:09:26 1998 Christopher Faylor <cgf@cygnus.com>
+
+ patch from Corinna Vinschen <corinna.vinschen@cityweb.de> and
+ Ron Parker <rdparker@butlermfg.org>:
+ * path.cc (mount_info::conv_to_win32_path): Refined recognition of
+ UNC devices.
+
+Fri Nov 13 12:37:00 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * Makefile.in: Fix a typo.
+
+Fri Nov 13 10:59:43 1998 DJ Delorie <dj@cygnus.com>
+
+ * Makefile.in: "make" uses new "ld -shared" by default internally.
+
+Fri Nov 13 00:58:38 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * spawn.cc (find_exec): Make sure that return value is correct
+ in all cases. Document.
+ * fhandler.h (fhandler_tty_common): Give unit number to constructor.
+ * fhandler_tty.cc (fhandler_tty_slave::fhandler_tty_slave): Give
+ unit number to descriptor. Create correct UNIX path name for
+ tty so that ttyname() will work correctly.
+ * select.cc (fhandler_tty_common::ready_for_read): Don't worry
+ about read_for_read since the tty read routines are already
+ interruptible.
+ * syscalls.cc (_read): Reset read thread events on signal.
+
+ patch from Mumit Khan <khan@xraylith.wisc.edu>:
+ * dlfcn.cc (ctype.h): Include.
+ (check_access): Document.
+ (check_path_access): Document.
+ (get_full_path_to_dll): Rework to handle general filenames and
+ symlinks.
+
+Thu Nov 12 17:01:52 1998 DJ Delorie <dj@cygnus.com>
+
+ * Makefile.in (shared): "make shared" uses the new "ld -shared"
+ * cygwin.din: add LIBRARY and BASE tags for "ld -shared"
+
+Wed Nov 11 17:16:17 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * configure.in: Add --enable options for various cygwin defines
+ including preliminary thread-safe defines.
+ * configure: Regenerate
+ * Makefile.in: Honor new --enable options.
+ * glob.h: Move BSD defines to sys/cdefs.h.
+ * include/sys/cdefs.h: Move __P definition here.
+
+Wed Nov 11 14:00:45 1998 DJ Delorie <dj@cygnus.com>
+
+ * cygwin.din (getpwnam): remove duplicates
+
+Tue Nov 10 18:27:09 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * utils/aclocal.m4: regenerate with aclocal
+ * utils/configure.in: don't call AM_CYGWIN32
+ * utils/configure: regenerate
+
+Tue Nov 10 15:56:03 1998 Geoffrey Noer <noer@cygnus.com>
+
+ patch from Gary V. Vaughan <gvaughan@oranda.demon.co.uk>:
+ * dlfcn.cc (dlopen): return an introspective handle to the
+ current module if name arg is NULL. The Single UNIX
+ Specification, Version 2 has this as a requirement.
+
+Mon Nov 9 16:29:27 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * errno.cc (strerror): all errnos in
+ newlib/libc/include/sys/errno.h are now listed here.
+
+Mon Nov 9 16:29:27 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * include/cygwin/version.h: up DLL version, bump API_MINOR to 2
+ to mark following change.
+
+ patch from Mumit Khan <khan@xraylith.wisc.edu>:
+ * cygwin.din: add exports for some of the newlib bessel
+ functions (j1, jn, y1, yn).
+
+Mon Nov 9 15:10:06 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * syscalls.cc (_link): rewrite FIXME.
+
+Mon Nov 9 14:51:03 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * errno.cc (strerror): add string for EDEADLOCK.
+
+ patch from Corinna Vinschen <corinna.vinschen@cityweb.de>:
+ * errno.cc (errmap[]): add END_OF_MEDIA and additional Win32
+ error codes.
+
+Sun Nov 8 21:28:01 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * fhandler.h: fhandler_pipe cannot be is_slow under
+ Windows9[58]. There is no way to check for EOF on a pipe
+ without performing a read on that system.
+ * syscalls.cc (read_handler): Don't check for ready_for_read
+ unless this is a "slow" device.
+ * winsup.h: Reorganize to accomdate fhandler.h requirement
+ for os_type.
+
+Sat Nov 7 23:27:05 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * fhandler.h (fhandler_console): Add a new function declaration.
+ * fhandler_console.cc (fhandler_console::read1): New function
+ renamed from console_read to allow use of class fields.
+ Detect readahead situation when doing line buffering and
+ buffer does not contain \n.
+ (fhandler_console::read): Reflect function name change.
+ * select.cc (cygwin_select): Changes for better handling
+ of < 1000 usec timeouts.
+ (select_stuff::wait): Perform a poll on timeout to
+ set any fd's that may have become active.
+ (peek_pipe): More debugging. Honor write_ready if set.
+ (peek_console): Can't always use WaitForSingleObject.
+ Detect readahead conditions set in fhandler_console::read1.
+ Honor write_ready if set.
+ (peek_windows): Honor write_ready if set.
+ * times.cc (__to_clock_t): Return clock_t value.
+ (times): Add some debugging printfs.
+
+Fri Nov 6 20:15:20 1998 Christopher Faylor <cgf@cygnus.com>
+
+ patch from Corinna Vinschen <corinna.vinschen@cityweb.de>:
+ * spawn.cc (spawn_guts): find_exec() argument mismatch
+ resulted in inability to run !# scripts which did not
+ begin with '/'.
+
+Tue Nov 3 16:12:59 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * exceptions.cc (handle_exceptions): Don't wait for signal
+ completion.
+ (ctrl_c_handler): Ditto.
+ * fhandler.h (fhandler_*): Declare new ready_for_read functions.
+ * select.cc: Reorganize all methods into a peek_*, a poll_*,
+ and a fhandler_*::ready_for_read. This is to allow the _read
+ function to query the state of an fd without starting a thread.
+ * signal.cc (kill_worker): If sending a signal from a non-main thread
+ don't wait for completion.
+ * sigproc.h (myself_nowait_nonmain): New define for use by sig_send.
+ * sigproc.cc (sig_send): Honor myself_nowait_nonmain. Don't wait
+ if not in main thread.
+ (__release_signal_mutex): Revert to calling ReleaseMutex only
+ once or mutex is released prematurely.
+ * syscalls.cc (read_handler): Use new ready_for_read method to
+ determine if an fd has data for reading. This function optionally
+ blocks until there is data to read.
+ (read_helper): Add debugging statement.
+ (_read): Move signal_arrived reset to before sig_protect to avoid
+ a race. Force read_handler thread to longjmp back to read_handler
+ function on signal.
+
+Tue Nov 3 12:18:31 1998 DJ Delorie <dj@cygnus.com>
+
+ * utils/cygcheck.cc (dump_sysinfo): Note when not finding a
+ program (like cpp) on the path is a good thing.
+
+Tue Nov 3 01:26:08 1998 Geoffrey Noer <noer@cygnus.com>
+
+ patch from Kazuhiro Fujieda <fujieda@jaist.ac.jp>:
+ * environ.cc (environ_init): correct size arg to parse_options
+
+Mon Nov 2 21:40:32 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * regexp/regexp.c (regatom): Respond to compiler warning.
+
+Mon Nov 2 21:36:48 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * exceptions.cc (handle_exceptions): cygwin should not
+ print exception information if the exception is trapped
+ via signal().
+ Also use consistent timings for lock_cs() throughout.
+
+Mon Nov 2 16:46:28 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * Makefile.in: For now, also include newlib/libc/sys/cygwin.
+ Eventually will stop including newlib/libc/sys/cygwin32.
+
+Mon Nov 2 19:38:30 1998 Christopher Faylor <cgf@cygnus.com>
+
+ patch from Corinna Vinschen <corinna.vinschen@cityweb.de>:
+ * syscall.cc (gethostname): function deleted
+ * net.cc (gethostname): new function 'gethostname' which
+ first calls wsock32::gethostname and only if it fails,
+ calls GetComputerNameA.
+
+Wed Oct 28 17:57:53 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * include/cygwin/version.h: up DLL version to 20.0 in honor
+ of new Net release.
+
+Wed Oct 28 17:57:53 1998 Geoffrey Noer <noer@cygnus.com>
+
+ patch from Mumit Khan <khan@xraylith.wisc.edu>:
+ * dll_init.cc (doGlobalCTORS): Fix invocation order.
+ (doGlobalDTORS): Likewise.
+
+Wed Oct 28 17:57:53 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * Makefile.in: add include/exceptions.h to dll_init.cc deps.
+
+ patch from Mumit Khan <khan@xraylith.wisc.edu>:
+ * dll_init.cc (exceptions.h): Include.
+ (dll_dllcrt0_1): New function to initialize Cygwin DLL guts
+ properly when a non-Cygwin app uses the Cygwin DLL.
+ (dll_dllcrt0): Call dll_dllcrt0_1 when user_data is NULL.
+
+Tue Oct 27 17:35:00 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * syslog.cc: drop "32" from CYGWIN32_LOG_NAME
+
+Tue Oct 27 16:09:09 1998 DJ Delorie <dj@cygnus.com>
+
+ * utils/cygcheck.cc (usage): cygwhich->cygcheck
+
+Mon Oct 26 17:47:10 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * Makefile.in: fix deps for dll_entry.o and dll_main.o,
+ add dep for glob.o.
+
+ patch from Mumit Khan <khan@xraylith.wisc.edu>:
+ * dll_entry.cc: New file for user DLL entry point.
+ * dll_main.cc: New file for user DLL main.
+ * Makefile.in (LIBCOS): Add dll_entry.o and dll_main.o.
+
+Mon Oct 26 13:47:10 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * Makefile.in: add back install of include/net which was
+ removed by accident.
+
+Mon Oct 26 15:25:22 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * strace.cc (get_strace_mutex): Don't reset last windows
+ error.
+ (strace_printf): Preserve last windows error.
+
+Mon Oct 26 11:01:46 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * uname.cc (uname): Remove slash from system name.
+
+Mon Oct 26 02:11:44 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * include/asm/byteorder.h: add missing __cplusplus wrapper.
+
+Mon Oct 26 00:46:33 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * uname.cc (uname): Remove space from the system name.
+
+Sun Oct 25 23:47:56 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * fhandler_console.cc (console_read): Several typos caused flaky
+ behavior when \r or \n detected under ENABLE_LINE_INPUT. Also ignore
+ first \n detected under ENABLE_LINE_INPUT if it isn't preceded by a \r.
+ This avoids problems when switching from "raw" mode into "cooked mode.
+
+Sun Oct 25 12:28:21 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * cygwin.din: remove unnecessary __cygwin32_stack_trace and
+ __cygwin_stack_trace exports.
+
+Sat Oct 24 21:18:46 1998 Christopher Faylor <cgf@cygnus.com>
+
+ patch from Corinna Vinschen <corinna.vinschen@cityweb.de>:
+ * path.cc (symlink): Standard protection for symlink should
+ be 0777.
+ * syscalls.cc (num_entries): Calculated links for directory
+ entry should only include directories.
+
+Sat Oct 24 20:51:08 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * mkvers.sh: Modify check for CVS/Tag to work around ash bug.
+ * sigproc.cc (wait_sig): Fix detection of non-blockable signals.
+
+Fri Oct 23 18:24:43 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * environ.cc: CYGWIN32 environment variable is now called CYGWIN
+ * window.cc: lose "32" in Cygwin32WndClass
+ * syslog.cc: lose "32" in WIN95_EVENT_LOG_PATH and
+ CYGWIN32_LOG_NAME.
+
+Fri Oct 23 16:32:59 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * utils/cygcheck.cc: reformat, add copyright notice
+
+Fri Oct 23 18:15:28 1998 DJ Delorie <dj@cygnus.com>
+
+ * utils/cygcheck.cc: new file
+ * utils/Makefile.in: build cygcheck.exe
+
+Fri Oct 23 16:48:41 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * exceptions.cc (signals_init): Add error to api_fatal.
+ (events_init): Ditto. Collapse printfs into one.
+ (winsock_init): Ditto.
+ * net.cc (winsock_init): Remove "Cygwin" from error message.
+
+Fri Oct 23 13:48:10 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * Makefile.in: install include/cygwin headers, losing the "32".
+ * include/cygwin32: remove
+
+Fri Oct 23 14:36:31 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * environ.cc (environ_init): Avoid reallocating environ array.
+ * exec.cc: Increase number of arguments to 1024 throughout.
+ * fhandler.cc (fhandler_disk_file::open): Revert to checking
+ a file for '#!' to find out if it is executable but add
+ extra check for NTEA which, if set, eliminates the need for
+ the read.
+ * sigproc.cc (sigproc_terminate): Close hwait_sig and set it
+ to NULL prior to closing other handles since this flags some
+ routines that the process is going down.
+
+Fri Oct 23 00:31:27 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * utils/*: remove "32"s from cygwin32_foo function calls
+
+Fri Oct 23 00:24:27 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * include/cygwin/version.h: increment CYGWIN_VERSION_DLL_MINOR
+ and CYGWIN_VERSION_API_MINOR since I'm changing the API in a
+ meaningful but backwards-compatible fashion.
+
+ * exceptions.cc: strip "32" from cygwin32_exception_handler
+ debug printfs
+
+ * net.cc: strip "32" from all net functions
+ * select.cc, syscalls.cc, winsup.h: lose "32" from cygwin32_select
+ * cygwin.din: adjust for these changes (no backwards
+ compatability issues here).
+
+ * cygwin.din: rename all cygwin32_foo functions, aliasing as
+ cygwin_foo for backwards compat. for now but intend to lose them
+ at a later date.
+ * include/sys/cygwin.h: copy all cygwin32_ protos and make them
+ usable without the "32". We will remove the cygwin32_ ones at a
+ later date.
+ * external.cc, external.h: lose "32" from cygwin32_internal
+ * shared.cc, winsup.h: lose "32" in cygwin32_getshared
+ * path.cc, path.h: lose "32" in cygwin32_foo comments
+ * dll_init.cc: lose "32" in cygwin32_detach_dll
+ * hinfo.cc: lose "32" in cygwin32_attach_handle_to_fd
+ * libccrt0.cc: lose "32" in refs to cygwin32_attach_dll
+ * pinfo.cc: lose "32" in cygwin32_winpid_to_pid
+
+ * include/cygwin32: remove all files except cygwin32_dll.h which
+ some people may already be including. Aim to remove this
+ remaining file at a later date.
+ * include/cygwin: move all include/cygwin32 files here.
+ * cygwin/cygwin_dll.h: change protos to reflect loss of "32"s
+ * include/net/if.h, include/netinet/in.h, include/netinet/ip.h,
+ include/netinet/ip_icmp.h, include/asm/socket.h:
+ include/sys/socket.h: include the headers in include/cygwin
+ * Makefile.in, winsup.h: fix references to
+ include/cygwin32/version.h
+
+ * libcctype.c, smallprint.c, test.c: lose "32" in Cygwin32 refs in
+ comments
+ * include/dlfcn.h, include/exceptions.h, include/mapi.h,
+ include/winsock.h, include/mywinsock.h: ditto
+ * config/*: ditto
+ * profil.c: ditto, and respace
+
+Thu Oct 22 22:52:40 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * net.cc, exceptions.cc, hinfo.cc, select.cc,
+ include/mywinsock.h: rename __INSIDE_CYGWIN32__ to
+ __INSIDE_CYGWIN__
+
+Thu Oct 22 17:39:06 1998 Geoffrey Noer <noer@cygnus.com>
+
+ First round of Cygwin32 -> Cygwin renaming. In all files,
+ rename Cygwin32 to Cygwin in comments.
+ * CYGWIN32_LICENSE: delete and
+ * CYGWIN_LICENSE: add it back under this name
+
+Thu Oct 22 20:10:24 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * exceptions.cc: Eliminate cs mutex. Just use signal_mutex
+ throughout. Rename sig_dispatch_mutex to signal_mutex throughout.
+ (lock_cs): Rewrite to be a front-end for get_signal_mutex.
+ (unlock_cs): Rewrite to be a front-end for release_signal_mutex.
+ (set_process_mask): Synchronize signals after resetting mask.
+ * sigproc.cc (release_signal_mutex): Report on success or
+ failure of signal_mutex release.
+ * include/Windows32/Defines.h (FILE_FLAG_WRITE_THROUGH): Make
+ unsigned to avoid a compiler warning.
+
+Thu Oct 22 14:23:49 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * utils/Makefile.in: disable building cygwin.exe.
+
+Thu Oct 22 14:16:10 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * exceptions.cc (sig_handle): Minimize life of cs lock during
+ handling of signals to reduce the potential for a race.
+
+Thu Oct 22 10:23:19 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * include/sys/strace.h: Minor addition from threadsafe-branch.
+
+Thu Oct 22 09:03:18 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * debug.cc (close_handle): Error condition needs a return value.
+ * environ.cc (parse_thing): char pointers should all be constant.
+ (add): Ditto.
+ * heap.cc (heap_init): Provide a little more information in
+ fatal printf. Use api_fatal to print errors.
+ * sigproc.cc (sigproc_terminate): Move code executed on
+ thread termination here from wait_sig since this function
+ may actually be executing in the signal thread.
+ * strace.cc (strace_open): Argument should be const.
+ (strace_init): Ditto.
+ * winsup.h: Ditto.
+ * include/cygwin32/version.h: Note that original shared memory
+ version was 0 for 98r2.
+
+Wed Oct 21 08:41:39 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * dcrt0.cc (__api_fatal): Remove "cygwin" identifier.
+ * fhandler.cc (fhandler_disk_file::open): Set symlink flag
+ appropriately for previous change.
+ * shared.cc (shared_name): Initialize static buffer to
+ (hopefully) force it into NO_COPY segment.
+ * mkvers.sh: Reorganize, add cvs tag detection, and output
+ cygwin "info" defines.
+
+Tue Oct 20 18:42:50 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * include/cygwin32/version.h: rewrite versioning comments,
+ updating for new scheme but keeping historical information.
+
+Mon Oct 19 23:45:24 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * include/windows.h: remove Objective-C BOOL ifdef, now taken
+ care of within the include/Windows32 header files.
+ * fhandler_console.cc: fix KeyEvent references in light of
+ changes to the KeyEvent struct in the Windows32 headers.
+
+ Update include/Windows32 header files. Changes from
+ Mumit Khan <khan@xraylith.wisc.edu>, Corinna Vinschen
+ <corinna.vinschen@cityweb.de>, and me.
+ * include/Windows32/CommonFunctions.h: new file, contents from
+ Functions.h.
+ * include/Windows32/*.h: Misc updates.
+
+Mon Oct 19 20:26:15 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * debug.cc: Throughout, avoid calling *_printf while lock
+ is active. Previous lock count was not thread-safe.
+ * fhandler_console.cc (console_read): Avoid sending a
+ \r to caller if ENABLE_LINE_INPUT.
+ (fhandler_console::read): Rely on console_read to handle
+ \r\n conversion.
+
+Mon Oct 19 12:10:09 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * mkvers.sh: Use more portable constructs to allow running
+ this with /bin/sh, bash, and ksh.
+
+Mon Oct 19 11:19:58 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * path.cc (mount_info::from_registry): Missed "b15.0" part
+ for writing mount information back to registry.
+ (mount_info::init): Remove obsolete stuff.
+
+Mon Oct 19 10:42:17 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * Makefile.in: Avoid newer GNU make construction when building
+ version.cc.
+
+Mon Oct 19 00:09:06 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * Makefile.in: invoke mkvers.sh with $(SHELL)
+
+Sun Oct 18 15:19:17 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * fhandler.cc (set_name): Accept unit argument for generating
+ win32_name.
+ (fhandler_base::fhandler_base): Ditto.
+ (fhandler_dev_floppy::fhandler_dev_floppy): Ditto.
+ (fhandler_dev_tape::fhandler_dev_tape): Ditto.
+ (fstat): Set symlink bit only if symlink_p is positive.
+ * fhandler.h: Reflect unit argument changes.
+ * fhandler_serial.cc (fhandler_serial::fhandler_serial): Accept
+ unit argument for generating win32_name.
+ * hinfo.cc (hinfo::build_fhandler): Pass unit argument to constructor
+ where apropriate.
+ * path.cc (path_conv::path_conv): Set symlink_p to a positive
+ value if !nofollow, negative otherwise.
+ (windows_device_names): Can't default to \dev\comx. \dev part
+ doesn't work.
+ (get_device_number): Accept just "comN" for backwards compatibility.
+
+Sat Oct 17 01:58:15 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * dcrt0.cc (globify): Fix problem with argument corruption
+ due to use of pointer freed by realloc.
+
+Sat Oct 17 00:10:53 1998 Christopher Faylor <cgf@cygnus.com>
+
+ Change NOT_OPEN_FD to dtable.not_open throughout.
+ * Makefile.in: Change .dll name to cygwin1.dll. Increment
+ the '1' when there are API/shared memory changes. Make
+ version.cc file every time .dll is linked. Remove datestamp
+ stuff.
+ * mkvers.sh: New file. Creates version.cc.
+ * cygwin.din: Export setdtablesize.
+ * dcrt0.cc: Remove obsolete version variables.
+ (build_argv): Use issep() macro rather than isspace since
+ isspace includes whitespace that the shell does not consider
+ a command separator.
+ (check_sanity_and_sync): Use new cygwin version defines and
+ structures for compatibility checking.
+ (dll_crt0_1): Ditto.
+ (__api_fatal): Renamed from api_fatal. Now always called from
+ macro which tacks program name to beginning of fmt. Increase
+ size of buffer.
+ * environ.cc (regopt): Use new reg_key class constructor
+ functionality.
+ * net.cc (getdomainname): Ditto.
+ * path.cc (read_mounts): Ditto.
+ (mount_info::from_registry): Ditto.
+ (mount_info::to_registry): Ditto.
+ (hash_path_name): No need for this to be a "C" function.
+ * external.cc (cygwin32_internal): Export version info strings.
+ * external.h: Add CW_GETVERSIONINFO.
+ * fhandler.cc (fhandler_base::write): Eliminate use of MIN macro.
+ * init.cc (set_dllname): Obsolete function. Handled in version.cc.
+ (dll_entry): Remove reference to set_dllname.
+ * libccrt0.cc (this_proc): Renamed from cygwin_statu.
+ (cygwin_crt0_common): Record api version in this_proc.
+ * mmap.cc (recreate_mmaps_after_fork): No need for this to be
+ a "C" function.
+ * syscalls.cc (close_all_files): Ditto.
+ * pinfo.cc (lock_pinfo_for_update): Eliminate a compiler warning.
+ * registry.cc: Eliminate reg_session class. Augment reg_key to handle
+ functionality of reg_session.
+ * registry.h: Ditto.
+ * shared.cc (shared_name): No need for this to be a "C" function.
+ Use new cygwin version structure.
+ (shared_info::initialize): Use new reg_key class constructor
+ functionality.
+ * smallprint.c (__small_vsprintf): Accept %P as a format specifier.
+ Signifies the program name.
+ * spawn.cc (spawn_guts): Quote *all* of the stuff the dcrt0.c considers
+ special.
+ * tty.cc (tty::inuse_event_exists): Remove debugging printf. It results
+ in too much output to strace log.
+ * uinfo.cc: Add a needed include.
+ * uname.cc (uname): Use new cygwin version structure to fill in utsname
+ fields.
+ * winsup.h: Regroup into sections. Add new version structure.
+ * include/utmp.h: Move login/logout function declarations here.
+ * include/cygwin32/version.h: Define new CYGWIN version/info
+ stuff here.
+
+Fri Oct 16 00:13:35 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * Makefile.in: enable building mingw subdir by default
+
+Thu Oct 15 12:01:08 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * spawn.cc (spawn_guts): Set all security attributes
+ for CreateProcess so that sexec will work properly.
+
+Thu Oct 15 08:49:12 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * hinfo.cc (hinfo::dup2): Avoid a null pointer dereference
+ in a debugging printf.
+
+Wed Oct 14 18:06:51 1998 Geoffrey Noer <noer@cygnus.com>
+
+ patch from Corinna Vinschen <corinna.vinschen@cityweb.de>:
+ * fhandler_console.cc (fhandler_console::dup): reset
+ default_color since the console fhandler forgets its default
+ colorizing when it's `dup'ed.
+ (fhandler_console::fhandler_console): remove unnecessary
+ erasing in constructor of fhandler_console.
+
+Mon Oct 12 22:20:59 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * fcntl.cc (fcntl): According to the "Single UNIX Specification",
+ F_DUPFD should *not* close its argument. Revert to previous
+ behavior.
+ * hinfo.cc (dup2): Guard against closing target fd too early.
+ * pinfo.cc: Always initialize myself to a dummy value so that
+ myself != NULL checks are avoided.
+ * include/sys/strace.h (strace): Remove NULL check for myself.
+ * dcrt0.cc (api_fatal): Ditto.
+ * exceptions.cc (handle_exceptions): Ditto.
+ * signal.cc (sigprocmask): Ditto.
+ (_raise): Ditto.
+ * strace.cc (get_strace_mutex): Ditto.
+
+Mon Oct 12 15:19:47 1998 DJ Delorie <dj@cygnus.com>
+
+ * utils/ps.cc (main): use const char *pname
+
+Fri Oct 9 12:32:23 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * syscalls.cc (getw): Simplify.
+
+Thu Oct 8 23:09:34 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * times.cc: add missing syscall_printfs to time functions,
+ slight reformatting.
+
+Thu Oct 8 21:56:37 1998 DJ Delorie <dj@cygnus.com>
+
+ * hinfo.cc (cygwin32_attach_handle_to_fd): allow to pass -1
+ for dup() simulation; return allocated fd.
+ * pinfo.cc (lock_pinfo_for_update): if the mutex is broken,
+ fail instead of looping. If you do loop, don't use 100% CPU.
+
+Thu Oct 8 18:33:02 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * dcrt0.cc: Add another per-thread object for strace.
+ (quoted): Fix misconception of method used to quote
+ quotes.
+ (globify): Optionally output arguments.
+ (build_argv): Ditto.
+ (dll_crt0_1): Fix typo in line reassignment.
+ * debug.cc (class locker): Avoid calling lock multiple times.
+ * exceptions.cc (call_handler): Set strace recursion flag
+ to zero when invoking a signal handler.
+ * fcntl.cc (_fcntl): F_DUPFD should close its argument.
+ * fork.cc (fork): Move determination of parent process to
+ a safer place.
+ * sigproc.cc (get_sig_dispatch_mutex): Rename. Use macro
+ interface to provide the name of the caller for strace output.
+ (release_sig_dispatch_mutex): Ditto.
+ * sigproc.h: Define *_dispatch_mutex wrappers.
+ * strace.cc (strace_printf): Use new per-thread object to
+ guard against recursion.
+ * winsup.h: Define per_thread_strace_protect. Redo per_thread
+ base class for a little more clarity.
+
+Wed Oct 7 22:30:43 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * fhandler_tty.h: up NTTYs from 16 to 128
+
+Wed Oct 7 09:15:55 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * fhandler_console.cc (console_read): Distinguish between
+ 0 byte return from CTRL-C and EOF condition.
+
+Tue Oct 6 22:31:44 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * dcrt0.cc (build_argv): Rewrite. Now: 1) allocates argv on
+ the fly, 2) inserts '@' files as they are found, 3) uses
+ sh-style quoting using either " or ' which may be embedded
+ in an argument.
+ (insert_file): Don't scan command line. Accept already
+ parsed arguments from build_argv.
+ (quoted): New function for parsing quoted strings.
+ (globify): Don't scan argv list. Accept element from
+ build_argv which will be tacked to end of argv as it
+ is being built. Extend quoting options to allow
+ tilde, braces, and quotes.
+ (dcrt0_dll_1): Simplify argv processing. Just call
+ build_argv, which handles everything.
+
+Tue Oct 6 11:04:43 1998 Christopher Faylor <cgf@cygnus.com>
+
+ Change Create[A-Z]* calls throughout to use sec_none_nih
+ to avoid subprocesses accidentally inheriting handles.
+ * grp.cc: Hold group structures in group_buf rather than
+ an image of the /etc/group file.
+ (parse_grp): New function to parse a group line into a
+ struct group.
+ (add_grp_line): Use parse_grp to add line from /etc/group
+ into internal cache.
+ (read_etc_group): Avoid redundant feof call. Set up
+ default group.
+ (getgrgid): Just return appropriate entry from group_buf
+ rather than reparsing internal representation.
+ (getgrnam): Ditto.
+ (getgrent): Ditto.
+ * hinfo.cc (hinfo::select_*): Set errno value when attempt
+ is made to use an unopened fd.
+ * passwd.cc: Hold passwd structures in passwd_buf rather than
+ an image of the /etc/passwd file.
+ (parse_pw): New function to parse a passwd line into a
+ struct passwd.
+ (add_pw_line): Use parse_pw to add line from /etc/passwd
+ into internal cache.
+ (read_etc_passwd): Avoid redundant feof call.
+ (search_for): Just scan passwd_buf for matching entries.
+ (getpwent): Just return appropriate entry from passwd_buf
+ rather than reparsing internal representation.
+
+Mon Oct 5 18:06:31 1998 Geoffrey Noer <noer@cygnus.com>
+
+ patch from Corinna Vinschen <corinna.vinschen@cityweb.de>:
+ * sysdef/kernel32.def: add missing GetDiskFreeSpaceEx lines
+
+Sat Oct 3 23:52:23 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * dcrt0.cc (si): Initialize so that NO_COPY will work.
+ * debug.cc (class locker): Fix previous change. Critical
+ sections are still required, so protect them if operating
+ in main thread to avoid signal problems.
+ Make any previously static use of locker global since that
+ appears to be the only foolproof way of marking the variable
+ NO_COPY. Rename these variables to something that is not
+ likely to be collided with.
+ * exceptions.cc (call_handler): Signal arrival of a dispatched
+ signal here and wait a long time for the mutex before giving
+ up. Should increase performance slightly.
+ * sigproc.cc (maintid): New external symbol.
+ * sigproc.cc (maintid): Make this global since it is used
+ in other places now.
+ (sig_dispatch_pending): Don't wait for wait_sig to complete
+ if there are no pending signals. Avoids a race and should
+ be faster.
+ (wait_sig): Don't set signal_arrived event here. Do it in
+ call_handler.
+ * strace.cc (strace_printf): Remove previous recursion check
+ since it is not signal safe.
+ * syscalls.cc (_read): Remove duplicate CreateEvent typo.
+
+Fri Oct 2 09:54:42 1998 DJ Delorie <dj@cygnus.com>
+
+ * strace.cc (strace_printf): protect against recursion
+
+Thu Oct 1 17:08:47 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * utils/ps.cc (main): add more detailed usage printfs
+
+Thu Oct 1 11:05:16 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * Makefile.in: Fix typo in debug.o dependency.
+ * debug.cc (class locker): Give up on using critical sections
+ since they are not safe to use in the main thread due to signals.
+
+Wed Sep 30 22:34:42 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * fork.cc (fork): Close parent's parent_alive handle
+ if there is one or suffer a handle leak.
+ * syscalls.cc (_read): Make all events no access and
+ non-inheritable or suffer potential handle leak.
+ * windows.cc (gethwnd): Ditto.
+
+Wed Sep 30 17:22:29 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * include/io.h: add missing setmode proto
+
+Tue Sep 29 23:33:11 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * fhandler_tty.cc (fhandler_pty_master::close): Make sure
+ both sides of both pipes associated with a tty master are
+ closed or suffer handle leaks.
+
+Tue Sep 29 16:55:00 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * path.cc (mount_info::init): remove default mounts for
+ raw devices.
+ * utils/mount.cc (reset_mounts): ditto
+ (main, usage): new -f flag disables warning messages about
+ missing mount point directories. Two new flags, disabled for
+ now: -c will create missing mount point directory, -g will
+ select adding the mount point to the global registry location.
+ * include/sys/mount.h: add MOUNT_GLOBAL define, for future use.
+
+Tue Sep 29 14:20:30 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * exceptions.cc (exception): Use %p to denote some hex
+ values.
+ * winsup.h (read_info): Add jmp_buf to structure. Required
+ for syscalls.cc change below.
+
+Mon Sep 28 19:36:41 1998 Syd Polk <spolk@cygnus.com>
+
+ * include/{tchar.h, direct.h}: Added so that
+ tcl8.1a2 can be compiled with cygwin.
+
+Mon Sep 28 19:36:41 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * syscalls.cc (thread_reset): Yet another method for
+ handling interruptible reads.
+ (_read): Use thread_reset to reset reads after a signal.
+
+Sun Sep 27 21:11:46 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * cygwin.din: New alias for __cygwin32_stack_trace.
+ * debug.cc (find_handle): Avoid leaving function without
+ unlocking.
+ (newh): Ditto.
+ * exceptions.cc (__cygwin32_stack_trace): Rename to just
+ `stack'. Shortens stack trace output.
+ (exception): Use %p to distinguish register values.
+ * fhandler_console.cc (fhandler_console::init): Remove
+ debugging sig_protect.
+ * init.cc (dll_entry): Move definition to avoid a
+ compiler warning.
+ * path.cc (mount_info::conv_to_win32_path): Detect
+ case of root directory when setting win32 relative
+ path.
+ (mount): Remove obsolete label.
+ * syscalls.cc (thread_sync): New function for exiting
+ the read helper thread.
+ (_read): Use new method for exiting the read helper
+ thread.
+
+Sun Sep 27 11:25:06 1998 Christopher Faylor <cgf@cygnus.com>
+
+ patch from sos@prospect.com.ru (Sergey Okhapkin):
+ * delqueue.cc (delqueue_list::process_queue): Clear queue
+ entry if file cannot be deleted for a reason other than
+ sharing violation.
+
+Fri Sep 25 08:52:50 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * debug.cc: locker variables should all be static.
+ * syscalls.cc (_read): Call ForceCloseHandle on
+ thread handle since it is protected.
+
+Thu Sep 24 18:59:25 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * path.cc (mount): don't verify that path is an existing
+ directory. Instead
+ * utils/mount.cc: verify that path is an existing directory
+ and print warning if it's not. Still do the mount.
+
+Thu Sep 24 11:45:04 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * debug.cc: locker class variables must be NO_COPY since
+ they contain data that should not be precisely duplicated
+ after a fork. This hopefully fixes a "SIGSEGV" problem.
+ * select.cc (peek_pipe): Pipes apparently should set both
+ "read" and "exception" flags on EOF.
+
+Wed Sep 23 18:26:31 1998 DJ Delorie <dj@cygnus.com>
+
+ * doc/doctool.c (main): typo checking for --help
+
+Wed Sep 23 17:46:06 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * path.cc (symlink_check_one): Try much harder to ensure that
+ CloseHandle is called on the file which was opened to check
+ for a symlink. Avoid obsolete check for NULL buf.
+
+Wed Sep 23 17:11:50 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * syscalls.cc (_read): Close thread handle or suffer a leak.
+ * dir.cc (opendir): Simplify logic.
+ (readdir): Ditto. Close handle explicitly when hit end
+ of files.
+ (rewinddir): Close directory handle or suffer leak.
+ (closedir): Simplify logic.
+
+Wed Sep 23 14:42:12 1998 Christopher Faylor <cgf@cygnus.com>
+
+ patch from DJ Delorie <dj@cygnus.com>:
+ * path.cc (symlink_check_one): Don't re-define res or symlinks
+ will be undetectable.
+
+Wed Sep 23 12:02:39 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * Change calls to api_fatal throughout to avoid need for \n
+ (see below).
+ Adapt some *_printf()/ExitProcess combinations to use api_fatal.
+ * winsup.h (SIGTOMASK): Generate signal mask correctly for
+ programs linked with newer cygwins.
+ * dcrt0.cc (check_sanity_and_check): Set subtract constant for
+ signal mask calculation based on whether binary was linked with
+ "older" or "newer" cygwin.
+ (do_global_ctors): Accept a second argument indicating whether
+ the ctors should always be run. Necessary in forked processes
+ for cygwin constructors which may do more than just allocate memory.
+ (checkout): Remove obsolete function.
+ (dll_crt0_1): Remove obsolete function call. Call do_global_ctors
+ with second argument TRUE.
+ (api_fatal): Change to a print-style function, allowing arguments.
+ Always emit a "\n" after a message.
+ (__main): Do not force running of constructors in forked processes.
+ * exceptions.cc (call_handler): Simplify arguments passed to this
+ function. Eliminate potential race by setting signal masks here.
+ (sig_handle): Just calculate current sigaction pointer once.
+ Change call_handler arguments.
+ * fhandler_console.cc (fhandler_console::write_normal): Output
+ unknown characters to screen.
+ (fhandler_console::write): Make signal protection synchronous.
+ * fork.cc (fork): Reorganize slightly to eliminate a compiler warning.
+ * init.cc (dll_entry): Temporarily remove freeing of waitq_storage
+ on thread detach until a more robust scheme is developed.
+ * signal.cc (signal): Make signal protection synchronous.
+ (sigaction): Ditto.
+ * sigproc.cc (get_sig_dispatch_mutex): More debug info.
+ (release_sig_dispatch_mutex): Work around potential bug in windows
+ with double allocation of a mutex when WaitForSingleObject is
+ interrupted. Save errno here only if about to call sig_send
+ where it may be changed.
+ (wait_sig): Remove unnecessary sig_sign stuff. Add some debugging
+ output.
+ * termios.cc (tcflow): Signal protection.
+ (tcgetattr): Ditto.
+ (tcsetattr): Make signal protection synchronous.
+ * winsup.h: Add new extern for SIGTOMASK macro. Use it in SIGTOMASK
+ macro. Move errno stuff to end so that it can benefit from previous
+ declarations.
+ * configure.in: Move AC_CANONICAL_SYSTEM up a little to avoid having
+ configure generate some code (like the check for host type) twice.
+ * configure: Regenerate.
+
+Wed Sep 23 11:49:55 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * path.cc (symlink_check_one): Fix handle leak resulting
+ from open of file to check for symlink magic. Suggested
+ by Corinna Vinschen <corinna.vinschen@cityweb.de> .
+
+Wed Sep 23 08:33:26 1998 Christopher Faylor <cgf@cygnus.com>
+
+ patch from sos@prospect.com.ru (Sergey Okhapkin):
+ * fhandler_tty.cc (process_ioctl): Use console handle
+ for ioctl operations.
+
+Tue Sep 22 23:58:20 1998 Geoffrey Noer <noer@cygnus.com>
+
+ based on patch from sos@prospect.com.ru (Sergey Okhapkin):
+ * utils/ps.cc (main): rewrite ps to give it more options,
+ including a, e, f, l, and u.
+
+Tue Sep 22 15:18:41 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * path.cc (umount): remove initial system_printf
+ (mount): stat path, verify that it's an existing directory,
+ otherwise fail.
+ (strncasematch, strcasematch): return 0 instead of FALSE
+ * utils/mount.cc (reset_mounts): reset / to System drive,
+ not C: as was done in the old days.
+
+Mon Sep 21 18:18:18 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * path.cc (mount, umount, setmntent, getmntent, endmntent):
+ make extern "C"
+
+Mon Sep 21 20:37:16 1998 DJ Delorie <dj@cygnus.com>
+
+ * doc/configure.in: don't try to find cc until we can correctly
+ configure it for a native cc in a cross build.
+
+Mon Sep 21 17:17:14 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * fhandler.cc (fhandler_disk_file::check_execable_p):
+ don't check for .shc since that's non-standard. Check for
+ .exe first.
+
+Mon Sep 21 14:57:50 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * doc/Makefile.in: reference -db2html in case docbook
+ tools aren't installed.
+
+Mon Sep 21 14:43:40 1998 Geoffrey Noer <noer@cygnus.com>
+
+ patch from DJ Delorie <dj@cygnus.com>:
+ * doc/doctool.c (scan_file): correct off by one error in
+ malloc
+
+Mon Sep 21 14:28:38 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * fhandler.h (select_record): Clear memory in constructor.
+
+Mon Sep 21 08:49:22 1998 Christopher Faylor <cgf@cygnus.com>
+
+ patch from sos@prospect.com.ru (Sergey Okhapkin):
+ * select.h: Use unsigned int to hold count in fd_set
+ structure or suffer alignment problems.
+ (WINSOCK_FD_ZERO): Back out previous change as it
+ is no longer needed due to the above.
+
+Sat Sep 19 22:58:18 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * fhandler_console.cc (console_read): Keep looping in
+ ENABLE_LINE_INPUT mode when no characters are read.
+ This apparently means that a CTRL-C has been hit.
+ * select.cc (select_record::operator new): Remove.
+ (setlect_stuff::~select_stuff): Use delete to remove
+ record.
+ (pipe_cleanup): Remove unneeded statement.
+ (poll_socket): Add debugging statement.
+ (start_thread_socket): Add debugging statements.
+ * fhandler.h: Remove new operator from select_record.
+ * select.h: Make WINSOCK_FD_ZERO more aggressive.
+ * sigproc.cc (allow_sig_dispatch): Use new errno
+ saving method.
+ * syscalls.cc (_read): Reorganize stack freeing
+ code to avoid overhead when it's not needed and
+ to actually decommit stack memory.
+
+Sat Sep 19 19:16:32 1998 Christopher Faylor <cgf@cygnus.com>
+
+ patch from sos@prospect.com.ru (Sergey Okhapkin):
+ * select.cc (socket_cleanup): Avoid using a pointer
+ after it has been deleted.
+
+Fri Sep 18 13:57:37 1998 Christopher Faylor <cgf@cygnus.com>
+
+ patch from sos@prospect.com.ru (Sergey Okhapkin):
+ * Makefile.in: Really remove extra slash in INCLUDES.
+ Previous change didn't work.
+ pipe.cc (make_pipe): set close-on-exec flag for non-inheritable
+ pipes.
+
+Thu Sep 17 15:26:14 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * doc/Makefile.in: Add dummy install target.
+
+Thu Sep 17 12:30:49 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * winsup.h (per_thread*): New classes for storing and
+ manipulating per_thread information.
+ (threadstuff): New array of per_thread objects which are
+ manipulated after a fork.
+ (read_helper_thread_info): read() thread local storage.
+ (waitq_storage): wait() thread local storage.
+ * debug.cc (class locker): New class for generic locking
+ of debug table manipulation. Use this throughout for
+ locking access to thread/debug tables.
+ (debug_init): Remove in favor of automatic constructor.
+ * debug.h: Ditto.
+ * fork.cc (fork): Iterate through threadstuff looking
+ for thread information to clear out. Should solve some
+ problems for Windows 95/98.
+ * init.cc (dll_entry): Remove thread storage initialization.
+ Use per_thread class for DLL_THREAD_DETEACH.
+ * sigproc.cc: Use system_printf rather than alert_printf
+ throughout since system_printf now has the same functionality.
+ (sigproc_init): Use method to initialize per-thread storage.
+ * sigproc.h: Remove waitq_storage declaration.
+ * syscalls.cc (_read): Use per_thread class to manipulate
+ per-thread information.
+ * wait.cc (wait4): Ditto.
+
+Wed Sep 16 12:58:49 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * syscalls.c (_read): Lower timeout for signal detection after
+ EOF on device. Should fix recent configure performance problems.
+ * Makefile.in: Extend clean target into regexp directory.
+
+Wed Sep 16 11:44:14 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * fhandler.cc (fhandler_base::set_name): Honor no_free_names().
+ (fhandler_base::linearize): Remove unneeded check for NULL
+ get_win32_name().
+ (fhandler_disk_file::fhandler_disk_file): Set path names
+ to a standard constant. They should eventually be filled
+ out by fhandler_disk_file::open.
+ (fhandler_disk_file::open): Detect if win32_path_name_ is
+ a dummy path. Fill it out from real_path, if so.
+ * hinfo.cc (hinfo::init_std_file_from_handle): Improve debugging
+ statement.
+ (hinfo::linearize_fd_array): Remove unneeded check for NULL
+ get*_name ().
+ * path.cc (path_conv::path_conv): Correct problem with
+ symlinks found at places like E:\.
+
+Wed Sep 16 02:25:33 1998 Geoffrey Noer <noer@cygnus.com>
+
+ patch from sos@prospect.com.ru (Sergey Okhapkin):
+ * fhandler.cc (fhandler_disk_file::open): fix typo.
+
+Tue Sep 15 23:52:44 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * winsup.h: Remove side effects from SLASH_P.
+
+Tue Sep 15 18:36:08 1998 Ben Elliston <bje@cygnus.com>
+
+ * sysdef/kernel32.def: Add definition for the Win32 API function
+ `TryEnterCriticalSection'.
+
+Tue Sep 15 12:26:48 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * Makefile.in: Remove extra slash in INCLUDES.
+ * hinfo.cc (hinfo::dup2): Always clear close-on-exec
+ flag for duplicated handle (problem and fix determined
+ by Sergey Okhapkin, sos@prospect.com.ru).
+ * fhandler.cc (fhandler_base::set_name): Avoid use of empty
+ path names.
+ (fhandler_base::raw_read): Show error code on failure.
+ (fhandler_base::linearize): Avoid copying NULL names.
+ (fhandler_base::open): Use NULL detection in small_printf.
+ (fhandler_base::dup): Move set_close_on_exec_flag to dup2
+ so it is caught in all cases.
+ (fhandler_disk_file::fhandler_disk_file): Set "no free names"
+ flag.
+ (fhandler_disk_file::open): Clear "no free names" flag since
+ names have been allocated to the fhandler structure at this point.
+ * fhandler.h (set_no_free_names): Newconditional "no free names"
+ function.
+ * hinfo.cc (hinfo::dup2): Clear close on exec here.
+ (hinfo::linearize_fd_array): Avoid copying NULL names.
+ * path.cc (normalize_posix_path): Avoid copying trailing slash
+ if root.
+ (nofinalslash): Rename variable.
+ * path.h: Add flag for future use.
+ * regexp/regerror.c: Avoid including RCS strings in product.
+ * regexp/regsub.c: Ditto.
+
+ patch from sos@prospect.com.ru (Sergey Okhapkin):
+ * select.cc (thread_pipe): Sleep for 10ms on every iteration.
+ (start_thread_pipe): Set the handle in the select structure
+ so that it will be properly identified in select_stuff::wait.
+
+Tue Sep 15 12:28:30 1998 DJ Delorie <dj@cygnus.com>
+
+ * added documentation and doctool.c
+
+Tue Sep 15 08:37:26 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * Makefile.in: Fix LIBGCC definition for native builds.
+ Remove CFCOMMON in favor of configure solution.
+ * configure.in: Default CXXFLAGS to be == CFLAGS.
+ * configure: regenerate.
+
+Sun Sep 13 19:52:04 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * Makefile.in: include ../libio when building
+
+Sun Sep 13 19:30:58 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * include/cygwin32/version.h: bump version minor now that
+ we've merged in all that new code...
+
+Sun Sep 13 21:34:33 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * dcrt0.cc (do_global_ctors): Reverse call order
+ of constructors thanks to insight from Mumit Khan
+ (hkan@xraylith.wisc.edu).
+ (do_global_dtors): Reflect above change: invoke destructors
+ in the proper order.
+ * smallprint.c (__small_vsprintf): Gracefully detect a
+ null pointer for '%s' format.
+ * syscalls.cc (_read): Set correct flags to retrieve stack
+ information or suffer sporadic failures due to uninitialized
+ flag.
+ * regexp/regexp.c: Comment out RCS string. This provides
+ no useful information in the .dll.
+
+Thu Sep 10 21:09:51 1998 Christopher Faylor <cgf@cygnus.com>
+
+ Merge in experimental-980602 branch changes.
+
+Thu Sep 10 21:09:51 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * path.cc (symlink_check_one): known_suffix needs to be
+ determined here in some cases, so deal with it here.
+ (path_conv::path_conv): More effort needed to propagate
+ the known_suffix back to caller in every case.
+ (has_suffix): Return suffix found.
+ (readlink): Avoid two passes through symlink_check_one.
+ * spawn.cc (find_exec): Propagate known_suffix from
+ perhaps_suffix back to caller, if appropriate.
+ (spawn_guts): Use suffix returned from find_exec to
+ determine if file should be scanned as a script when
+ a #! file is found. Avoids a duplicate call to
+ perhaps_suffix.
+
+Thu Sep 10 21:09:51 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * path.h (suffix_info): New struct for dealing with standard
+ suffix (.exe, .bat, etc.) information.
+ (path_conv): Constructor now takes a suffix_info argument.
+ (std_suffixes) Standard array of suffixes to consider "special".
+ * path.cc (path_conv): Constructor now takes a suffix_info
+ argument. Record any known suffix in path_conv known_suffix
+ field.
+ (has_suffix): New function for determining if a path already
+ has a known suffix.
+ (next_suffix): New function for returning the next suffix from
+ a list of suffixes.
+ (symlink_check_one): Take an optional suffix_info argument
+ for suffixes to consider or tack on.
+ * spawn.cc (std_suffixes): Standard list of executable suffixes.
+ (perhaps_suffix): Pass std_suffixes to path_conv. Use
+ new known_suffix field in path_conv to determine if a
+ suffix has been detected.
+
+Thu Sep 10 21:09:51 1998 Christopher Faylor <cgf@cygnus.com>
+
+ Substitute new str{,n}casematch for strcasecmp throughout.
+ This implementation is faster since it only tests equality.
+
+ Change fhandler*::open throughout to return true/false
+ since the pointer returned was never used for anything.
+
+ * Use strcasestr throughout for case insensitive matches for
+ filenames.
+ * Makefile.in: Use GNU make construct for determining gcc lib.
+ * dcrt0.cc (check_sanity_and_sync): Make error message more
+ explicit.
+ * debug.h: Better defines for dummy functions when !DEBUGGING.
+ * fhandler.cc (fhandler_base::fstat): Don't bother zeroing buf
+ here since it is always done in the caller.
+ (fhandler_base::~fhandler_base): Recognize cases where *_path_name_
+ should not be freed.
+ (fhandler_disk_file::open): Split into two functions. First
+ function performs a path_conv and does testing on same. This
+ calls new fhandler_disk_file::open with path_conv data. New
+ function is called by stat_worker to avoid extra path tests and
+ mallocs.
+ Also, fix long standing off-by-one typo looking for #! magic.
+ Also, reapply test for != WinNT when checking files for magic.
+ Otherwise there is a tremendous slowdown in file opening, especially
+ for stat().
+ * fhandler.h: Add support for setting/detecting when *_path_name
+ should not be freed.
+ Add new fhandler_disk_file::open declaration.
+ * hinfo.cc (digits): Remove obsolete function.
+ (hinfo::build_fhandler): Add default name for FH_DISK.
+ * path.cc (path_prefix_p_): Don't check beyond len1 for leading
+ slash. Responsible for reported performance problems?
+ (path_conv::path_conv): Ensure that fileattr is filled out
+ correctly in all cases. Return immediately when a file
+ is detected in !follow_mode.
+ (nofinalslash): Simplify.
+ (strncasematch): New function similar to strncasecmp except
+ that it only checks for =/!= and benchmarks faster than same.
+ (strcasematch): Ditto, re. strcasecmp.
+ (strcasestr): New function which does a case-insensitive strstr.
+ Needed for filename matching.
+ * smallprint.c (__small_vsprintf): Fix off-by-one in %.ns processing.
+ * spawn.cc (exe_exts): Make global for eventual use by other modules.
+ * syscalls.cc (_fstat): Zero buf prior to use.
+ (stat_worker): Rename from _stat_worker. Reorganize to minimize
+ mallocs and path name conversions. Should now perform only one
+ path conversion and 0 malloc/frees.
+ * winsup.h: Declare new functions.
+
+Thu Sep 10 21:09:51 1998 Christopher Faylor <cgf@cygnus.com>
+
+ Clean up error messages throughout using new strace_printf
+ options.
+ * smallprint.c (__small_vsprintf): Add %E option for printing
+ error code. Understand %.n syntax.
+ * strace.cc (strace_vsprintf): Common routine for formatting
+ strace output. Default to always ending with \n unless
+ string ends with \b.
+ (strace_write): Common routine for writing to strace output.
+ (strace_printf): Use above two routines.
+ (system_printf): Ditto.
+ * path.cc (path_conv): Scan path to be converted from right
+ to left for efficiency. Implement extension searching
+ which is passed from spawn to symlink_check_one to minimize
+ overhead.
+ (symlink_check_one): Check extensions for existence for use
+ with spawn.
+ (readlink): Accomodate changes to symlink_check_one.
+ * spawn.cc (perhaps_suffix): Use new extension checking
+ capabilities of path_conv.
+ (find_exec_1): Delete.
+ (find_exec): Generalize to allow searching on any PATH like
+ environment variable.
+ * dllfcn.cc (check_path_access): Use find_exec to find a path.
+ This also ensures that paths are in Windows format which was
+ not the case before.
+ * environ.cc (conv_envvars): Add LD_LIBRARY_PATH.
+ * fork.cc (fork): Clean up dll loading slightly.
+ * Makefile.in: Turn on compiler warnings.
+ * winsup.h (save_errno): New class for saving errno from
+ being clobbered.
+ * include/sys/strace.h: Make system_printf a macro similar
+ to strace_printf_wrapper.
+
+Thu Sep 10 21:09:51 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * sigproc.cc (sig_send): Attempt to work around Windows strangeness
+ when thread interrupted while waiting for completion event.
+
+Thu Sep 10 21:09:51 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * dcrt0.cc: Remove debugging function DELETEME ().
+ * fhandler.cc (fhandler_base::fstat): Respond to compiler warning.
+ * signal.cc (sleep): Reset signal_arrived event before using it or
+ we could wake up immediately.
+ (usleep): Ditto.
+ (pause): Ditto.
+ * spawn.cc (spawn_guts): Ditto. Respond to compiler warning.
+ * sigproc.cc (sig_send): More debugging info.
+ (sig_dispatch_mutex): Only ping wait_sig when needed.
+
+Thu Sep 10 21:09:51 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * select.cc (socket_cleanup): Close thread handle or suffer
+ handle leak.
+
+Thu Sep 10 21:09:51 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * select.cc (verify_true): New function.
+ (fhandler_socket::select_*): Use verify_true for verification
+ function to avoid multiple calls to socket select.
+
+Thu Sep 10 21:09:51 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * select.cc (select_stuff::wait): Scan entire list of fds
+ when WFMO wakes up.
+ (set_bits): Add some strace debugging output.
+ (thread_socket): Ditto.
+ (verify_ok): Return result of set_bits rather than always 1.
+ (start_thread_socket): Set the handle in the select structure
+ so that it will be properly identified in select_stuff::wait.
+ (fhandler_windows::select_read): Verification routine should
+ be `poll_windows'.
+
+Thu Sep 10 21:09:51 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * sigproc.cc: Change some sigproc_printfs to only occur when
+ #ifdef DEBUGGING.
+ * spawn.cc (perhaps_suffix): Search for (PROG is the pathname to
+ the executable file) PROG.exe, PROG.com, PROG.bat, PROG.cmd, and
+ PROG and return extension found or NULL if no matching file.
+ (spawn_guts): If the file name of the executable ends in either
+ .exe, .com, .bat, or .cmd we assume that it is not a script file
+ and therefore do not open the file to determine if it is.
+ Fix "wait_failed" error when exec() called and non-cygwin parent.
+
+Thu Sep 10 21:09:51 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * dir.cc (rmdir): Set correct errno when non-empty directory and
+ Windows9x.
+ * pipe.cc (pipe): Use binary mode by default for pipes.
+ * syscalls.cc (_read): Wait for terminated thread to exit before
+ clearing its stack memory.
+
+Thu Sep 10 21:09:51 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * hinfo.cc (hinfo::fixup_after_fork): Start initial fd search
+ to zero forked processes so that a close(0)/dup(fd) will work.
+
+Thu Sep 10 21:09:51 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * fhandler_windows::set_close_on_exec: Deal with possible
+ NULL handle.
+ (fhandler_windows::fixup_after_fork): Ditto.
+ * select.cc (select_stuff:wait): Handle return from
+ MsgWaitForMultipleObjects correctly for windows case.
+ * sigproc.cc (sig_send): Reset completion event for main thread.
+ * syscalls.cc (_read): Better handling of stack free condition.
+
+Thu Sep 10 21:09:51 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * exceptions.cc (call_handler): Exit earlier if just running
+ in an exec'ed stub since the stub may own the sig_dispatch mutex,
+ but we still want to exit.
+ * select.cc (select_stuff::wait): Fix check for window activity
+ from MsgWaitForMultipleObjects. Handle infinite wait correctly.
+ (poll_windows): Add debugging output.
+ * spawn.cc (spawn_guts): Protect against signals interrupting
+ at an inopportune moment.
+
+Thu Sep 10 21:09:51 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * select.cc (select_stuff:test_and_set): Take appropriate action
+ when a select record uses a window_handle.
+ (fhandler_windows::select_read): Set handle and windows_handle
+ appropriately.
+ (fhandler_windows::select_write): Ditto.
+ (fhandler_windows::select_except): Ditto.
+
+Thu Sep 10 21:09:51 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * select.cc (cygwin32_select): Need to reset signal_arrived before
+ testing it or suffer loop.
+
+Thu Sep 10 21:09:51 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * fork.cc (resume_child): Give up on SuspendThread synchronization
+ and use subproc_ready/forker_finished events.
+ (sync_with_parent): Ditto.
+ * sigproc.cc (wait_sig): Make sigcomplete_main manual reset to
+ allow handling of nested interrupts.
+ (wait_sig): Fix stupid typo on exit that would cause a
+ loop to run for a long time. Are exits faster now?
+
+Thu Sep 10 21:09:51 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * exceptions.cc (unlock_cs): Leave decision to release
+ sig_dispatch_mutex to the caller.
+ (set_process_mask): Call release_sig_dispatch_mutex explicitly
+ if needed.
+ (handle_sigsuspend): unlock_cs no longer takes an argument.
+ (call_handler): Try to acquire the strace mutex prior to
+ suspending the main thread to ensure that the mutex is always
+ released.
+ (sig_handle): Call release_sig_dispatch_mutex explicitly.
+ * fhandler_console.cc (fhandler_console::write): Protect against
+ signals while writing.
+ * signal.cc (signal): Protect against signal dispatch.
+ (sigaction): Ditto.
+ * sigproc.cc (sig_dispatch_pending): Return status no longer needed.
+ (sig_send): Assume pending_signals if sending signal to self.
+ (allow_sig_dispatch): Accept synchronize argument to control whether
+ to wait for wait_sig to do its thing.
+ (release_sig_dispatch_mutex): Just awaken wait_sig loop and wait
+ for acknowledgement if waitfor is TRUE.
+ (wait_sig): Don't ever zero pending_signals to avoid a possible race.
+ Set pending_signals for blocked signals, too.
+ * sigproc.h: Add __SIGFLUSH signal.
+ (class sig_protect): Allow destructor to wait for signal dispatch,
+ or not given constructor argument.
+ * strace.cc (get_strace_mutex): Renamed from waitfor_strace_mutex.
+ (release_strace_mutex): External function for use by call_handler.
+ This replaces raw calls to ReleaseMutex throughout.
+ * syscalls.cc (_read): Use sig_protect to protect against signals.
+ Other cosmetic cleanups.
+ (_close): Protect function with sig_protect.
+ * termios.cc (tcsetattr): Protect function with sig_protect.
+
+Thu Sep 10 21:09:51 1998 DJ Delorie <dj@cygnus.com>
+
+ * syscalls.cc (_read): typo in matching printf format to args.
+
+ * fhandler.cc (write): Switch to the Microsoft/DJGPP way of
+ writing out text files: pass \r but prepend \r to \n.
+ (read): Don't collapse multiple \r's.
+
+ * delqueue.cc: rewritten for speed. Don't check *every* entry in
+ the list if we know the list is empty, plus check for duplicates.
+ * delqueue.h: ditto.
+ * path.cc (path_conv): If a path component is missing, short-
+ circuit the symlink check.
+
+Thu Sep 10 21:09:51 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * fhandler.h: Reorder fhandler status field so that device is
+ in lower bits. This allows gcc to optimize access to the device.
+ * hinfo.cc: Inline not_open().
+ * winsup.h: Inline hinfo::not_open(). Make hinfo::[] operator a
+ simple array reference.
+ * strace.cc: Change strace() to a macro.
+ * include/sys/strace.h: Ditto.
+ * syscalls.cc (read_handler): New function. Called directly from
+ _read for "non-slow" devices or via read_handler for slow devices.
+ (_read): Use read_handler for reading.
+ (read_helper): Ditto.
+
+Thu Sep 10 21:09:51 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * dcrt0.cc (do_exit): Don't ignore signals if reparenting.
+ Besides being a race, this screws up the process which is
+ actually executing.
+ * fork.cc (fork): Don't create a new process group when
+ forking or subprocesses won't respond to CTRL-C.
+ * syscalls.cc (_read): Ensure correct setting of EINTR errno.
+
+Thu Sep 10 21:09:51 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * fork.cc (sync_with_child): Consider it a success if the child
+ has set the subproc_ready signal regardless of whether it has
+ exited or not.
+ * init.cc (dll_entry): Set read_helper_thread_info stuff to 0
+ on dll initialization. Windows 95 seems to keep garbage here,
+ despite documentation to the contrary.
+ * syscalls.cc (_read): Report on errors to create read_helper
+ events.
+
+Thu Sep 10 21:09:51 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * dcrt0.cc (compute_argc): Limit debug_printf string argument size
+ or suffer a buffer overrun.
+ (do_exit): Add debugging statement.
+ * exceptions.cc (call_handler): Remove extraneous sigproc_printf.
+ Consolidate signal_arrived event with sig_was_dispatched.
+ (events_terminate): Consolidate signal_arrived event with
+ sig_was_dispatched.
+ * fhandler.h: Rename a field to something more mnemonic.
+ * fhandler_tty.cc: Throughout: Only set up fhandler_tty_master when
+ actually using ttys. Change tty_master `f' field to `console'.
+ * tty.cc: Ditto.
+ * fork.cc (sync_with_child): Add more information to "child died"
+ error.
+ * hinfo.cc (hinfo::build_fhandler): Call tty master constructor
+ when appropriate.
+ * select.cc (select_stuff::wait): Consolidate signal_arrived event
+ with sig_was_dispatched.
+ * sigproc.h: Ditto.
+ * syscalls.cc (_read): Ditto.
+ * winsup.h: Ditto.
+ * sigproc.cc: Ditto, throughout.
+ (block_sig_dispatch): Don't reset signal_arrived. Causes races.
+ * spawn.cc (spawn_guts): Limit debug_printf string argument size
+ or suffer a buffer overrun.
+ * include/sys/strace.h: Implement strace_minimal for very minimal
+ output which, hopefully, will not affect the behavior of traced
+ programs as much.
+
+Thu Sep 10 21:09:51 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * Makefile.in: build libwinspool.a with the dll name winspool.drv
+
+Thu Sep 10 21:09:51 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * dcrt0.cc (build_argv): Remove verbose debug_printf.
+ (dll_crt0_1): Use shared data handle passed in from parent process
+ when appropriate. Remove extraneous debug_printf.
+ * environ.cc (getwinenv): New function. Returns (possibly cached)
+ native version of an environment variable.
+ (win_env::add_cache): Add cached version of posix and win env
+ variables to local table.
+ (posify): Modify for use with native caching.
+ (setenv): Convert special environment variables to native here,
+ when they are set.
+ (struct parse_thing): Simplify struct.
+ (struct parse_things): Extend table to accomodate "envcache"
+ setting.
+ (parse_options): Add "envcache" option to control whether special
+ environment variables are cached. Simplify handling of remembered
+ parameters.
+ (winenv): Modify for use with getwinenv.
+ * exceptions.cc (unlock_cs): release_sig_dispatch takes an argument
+ now.
+ (set_process_mask): unlock_cs now wakens wait_sig when appropriate.
+ (handle_sigsuspend): Reorganize to take advantage of new behavior
+ of release_sig_dispatch_mutex and hopefully avoid a race.
+ (handle_sig): Avoid waking wait_sig if we couldn't get the dispatch
+ mutex.
+ * exec.cc (strccpy): Change to modify second argument to point
+ to position where "parse" stopped so that it doesn't have to be
+ recalculated by the caller.
+ (sexecvpe): Use find_exec () to find program to run. If you've
+ got a function for this, you might as well use it.
+ * fhandler_tty.cc (fhandler_pty_master::process_input_to_slave):
+ Report on signal being sent in termios_printf. Use kill_pgrp
+ interface.
+ * fork.cc (fork_copy): Just copy everything at once rather than
+ in individual pieces.
+ (fork): Potentially move up sbrk() when DEBUGGING so that parent
+ and child heaps are in sync. Pass cygwin_shared_h to child.
+ * path.cc (path_conv::path_conv): Make sure that a file is not
+ a symlink when returning immediately.
+ * sigproc.cc (sig_dispatch_pending): Return TRUE if signals were
+ pending.
+ (sigproc_init): Move sig_was_dispatched initialization here so
+ that it will always be available to other functions which rely
+ on it. Otherwise these functions would have to wait for wait_sig
+ to complete its initialization.
+ (sig_send): Rework SIGSUSPEND handling.
+ (release_sig_dispatch_mutex): Wait for signal to be dispatched
+ after releasing mutex if argument is TRUE.
+ (wait_sig): Remove sig_was_dispatched initialization from here.
+ * sigproc.h: release_sig_dispatch takes an argument.
+ * spawn.cc (perhaps_suffix): Take an optional argument indicating
+ whether the path has already been converted to win32.
+ (find_exec_1): Use getwinenv to get windows version of PATH. Use
+ windows version of individual directories to avoid posix lookups.
+ (spawn_guts): Call strace_dump here to cause strace output to
+ be slightly more synced when using strace caching.
+ (spawnvpe): Use find_exec () to find program to run. If you've
+ got a function for this, you might as well use it.
+ * syscalls.cc (_read): Only block signals for "slow" devices.
+ * winsup.h: Changes needed for previous checkin and getwinenv.
+
+Thu Sep 10 21:09:51 1998 DJ Delorie <dj@cygnus.com>
+
+ * path.cc (path_conv): bug fix when path ends in slash
+
+Thu Sep 10 21:09:51 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * fhandler.cc (fhandler_base::set_name): Use fhandler
+ method for determining native name. Avoid path_conv
+ when possible.
+ (fhandler_disk_file::get_native): New function, returns
+ windows name of disk file.
+ * fhandler.h: Add get_native() method to fhandler_*
+ classes.
+ * fhandler_serial.cc (fhandler_serial::get_native): Return
+ windows name of serial port.
+ * fhandler_tty.cc (fhandler_tty_master::init): Use consistent
+ name for tty master.
+ * fork.cc (fork_copy): Experimental change to avoid loop.
+ * grp.cc (add_grp_line): Use realloc to extend group buffer.
+ * hinfo.cc (hinfo::release): fd object should be deleted,
+ not freed or suffer a memory leak.
+ (init_std_file_from_handle): Reset first_fd_for_open to
+ signal that std* locations have been opened. Avoids use
+ of these locations prior to full dtable setup.
+ * passwd.cc (add_pwd_line): Use realloc to extend passwd buffer.
+ * path.cc (path_conv::path_conv): Avoid checking for symlinks on
+ network shares. Check for existence of file prior to taking
+ it apart for symlink checking (this needs more work).
+ (windows_device_names): Make global.
+ (get_device_number): Detect tty master.
+ * sigproc.cc (wait_sig): Maintain a flag which indicates when
+ signals are queued due to the wait_sig's inability to get a
+ sig_dispatch mutex.
+ (sig_dispatch_pending): Don't wake up the wait_sig thread if
+ unless there are signals queued (see above) or force argument.
+ (allow_sig_dispatch): Only wait for signal dispatch if something
+ is queued.
+ * sigproc.h: allow_sig_dispatch takes a (defaulted) argument now.
+ * syscalls.cc (_open): Use default hinfo::find_unused_handle call.
+ * net.cc: Ditto, throughout.
+ * pipe.cc: Ditto.
+
+Thu Sep 10 21:09:51 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * dcrt0.cc (do_exit): Ignore user initiated signals here.
+ * fhandler.cc (fhandler_disk_file::open): Detect error condition
+ on fhandler_base::open.
+ * fhandler_console.cc (undo_input): Respond to compiler warnings.
+ * grp.cc (getgrgid): Ditto.
+ * times.cc (_tzname): Ditto.
+ * fhandler_tty.cc (fhandler_Tty_slave::open): Cosmetic changes.
+ * fork.cc: Clean up debugging output.
+ * pinfo.cc (pinfo_init): Set pgid and sid to different values
+ initially. Let user program set sid appropriately if it is
+ to be the owner of a tty.
+ * sigproc.cc (allow_sig_dispatch): Try harder to detect when we
+ should wait for a signal dispatch.
+ * strace.cc (strace_open): Revert to previous mutex behavior.
+ * include/sys/strace.h: Ditto.
+ * syscalls.cc (_open): Detect error from fhandler open.
+
+Thu Sep 10 21:09:51 1998 Christopher Faylor <cgf@cygnus.com>
+
+ Global changes:
+ Store win32 name in fhandler structure to avoid multiple translations.
+ Support close_on_exec at the Win32 level for all but sockets.
+ Respond to gcc warnings.
+ Use single fstat() call for devices.
+ *::set_close_on_exec modified.
+ * dir.cc (opendir): Use win32 name in stat to speed things
+ up a little.
+ * debug.cc: New file. Provides routines for extra debugging
+ when -DDEBUGGING is specified.
+ * debug.h: New file. Definitions for debug.cc.
+ * exceptions.cc (signals_init): Break out signal initialization
+ from exceptions.
+ (dump_status): Add thread name to stack dump output.
+ (handle_exceptions): Renamed.
+ (set_process_mask): Don't ever mask non-maskable signals.
+ (ctrl_c_handler): Preliminary change to allow propagation of
+ cygwin signals back to gdb.
+ (sig_handle): Call do_exit directly from signal thread rather than
+ attempting to redirect the main thread.
+ * fhandler.cc (set_name): Store win32 name in fhandler structure.
+ (*::open) name field is extraneous now. Use get_win32_name () to
+ retrieve stored win32 name.
+ (fhandler_base::fstat): Default to performing fstat on a device.
+ (fhandler_disk_file::fstat): Renamed from fhandler_base::fstat.
+ Operate only on disk files.
+ (fhandler_base::set_close_on_exec_flag): New function sets flag
+ without touching the handle.
+ (fhandler_base::~fhandler_base): Free unix/win32 path names.
+ (fhandler_disk_file::close): Only call delqueue.process_queue from
+ this function since disk files are the only things that can
+ be unlinked, currently.
+ (fhandler_dev_null::open): Delete.
+ (set_inheritence): New function. Set handle inheritence.
+ (fhandler_*::fork_fixup): New functions. Inherit fhandler data
+ after a fork.
+ fhandler.h: *::set_output_handle - new method.
+ Setup methods for use by select().
+ fork.cc (fork): Call fixup_after_fork in child to inherit
+ handles marked as non-inheritable on CreateProcess.
+ hinfo.cc (hinfo::build_fhandler): Use new function to detect
+ devices.
+ (dup_for_exec): Delete obsolete function.
+ (hinfo::dup2): Remove extraneous tests.
+ (hinfo::select_*): Interfaces into select().
+ (hinfo::release): Free fd in dtable.
+ (hinfo::fixup_after_fork): New function. Inherit close-on-exec
+ handles from parent after fork.
+ path.cc (mount_info::posix_path_p): Make inline.
+ (path_conv::path_conv): Short circuit when path resolves to a device.
+ (digits): Move here from hinfo.cc.
+ (windows_device_names): Win32 names for Cygwin devices.
+ (get_device_number): New function. Return devie number given device
+ name.
+ (win32_device_name): New function. Decode a windows device name
+ and an optional "unit".
+ (mount_info::conv_to_win32_path): Short circuit when path resolves to
+ a device.
+ * path.h: add device and unit fields to path_conv class.
+ * select.cc: Rewrite for more structure, more OO.
+ * sigproc.cc: (get_sig_dispatch_mutex): New function.
+ (release_sig_dispatch_mutex): New function.
+ * sigproc.h: sig_protect class. Automatic protection from signals
+ when used.
+ * syscalls.cc (stat_dev): New function.
+ (stat_worker): Short-circuit when a cygwin device is detected.
+ * utils/ps.cc: Don't lock_pinfo when -f. Compress format to fit
+ more on a line.
+
+Thu Sep 10 21:09:51 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * dcrt0.cc (dll_crt0_1): Register name for main thread.
+ * exceptions.cc (dump_status): Add thread name to diagnostic output.
+ (__cygwin32_exception_handler): Rename to handle_exceptions. Avoid
+ creating a .core file.
+ * exec.cc (sexecve): Reflect spawn_guts argument change.
+ * fhandler_tty.cc (fhandler_tty_master::init): Use makethread to
+ create a new thread.
+ * select.cc: Create pipe/socket threads each time select is called.
+ Use thread termination as indication of fd readiness.
+ * sigproc.cc (sigproc_init): Use makethread to create a new thread.
+ (wait_sig): Simplify default signal call slightly.
+ * spawn.cc (spawn_guts): Accept child pinfo pointer rather than
+ pid. Reorganize so that common initialization is handled once.
+ * strace.cc: Set strace_mutex to NULL initially to catch CreateMutex
+ errors.
+ * window.cc (gethwnd): Use makethread to create a new thread.
+
+Thu Sep 10 21:09:51 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * Makefile.in: Add debug.o target.
+ * cygwin.din: Separate pipe from _pipe.
+ * dcrt0.cc (alloc_stack): New, more precise method for allocating
+ stack space after a fork.
+ (dll_crt0_1): Use new child_proc_info class to retrieve information
+ from possible parent process. Remove #ifdef erroneously checked in.
+ Remove extraneous syscall_printf.
+ * exceptions.cc (signals_init): New function.
+ * fhandler.cc (fhandler_make_pipe): Move to pipe.cc.
+ * fhandler.h (fhandler_base): New = operator preserves unix_path_name_.
+ * fhandler_tty.cc: Strip some tty functions from here into tty.cc.
+ * fork.cc: Remove obsolete ifdefs. Reorganize, streamline with new
+ fork.
+ * hinfo.cc: Speed up build_fhandler.
+ * libccrt0.cc: Remove obsolete ifdefs.
+ * pinfo.cc (pinfo_init): Simplified by new fork/spawn info passing
+ method.
+ * pipe.cc (make_pipe): Moved from fhandler.cc. Handles MS-style
+ _pipe.
+ (pipe): Use new arguments to make_pipe.
+ (_pipe): New MS-compatible function.
+ * shared.cc: cygwin_shared_h make global so that it can be inherited
+ via new fork/spawn info passing method.
+ (open_shared_file_map): Detect if shared info is already set up from
+ fork/spawn.
+ * sigproc.cc (sigproc_init): Initialize signals with signals_init here.
+ Use new fork/spawn info passing method.
+ * spawn.cc (spawn_guts): Pass information in a structure to spawned
+ process. Identify structure type with a "magic number".
+ * strace.cc (strace_printf): Only print program full path spec once
+ to save space and clutter. Preserve any windows error.
+ * syscalls.cc (_open): Detect and avoid error return from
+ build_fhandler.
+ * tty.cc: Accept some non-fhandler functions formerly found in
+ fhandler_tty.cc
+ * winsup.h (pinfo): Remove some fields obsoleted by new fork/spawn
+ info passing method.
+ (child_info*): New classes for passing information to forked/spawned
+ process.
+
+Thu Sep 10 21:09:51 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * Makefile.in: Add debug.o target.
+ * console.cc (fhandler_console::char_command): Fix failed merge.
+ * dcrt0.cc (alloc_stack): New, more precise method for allocating
+ stack space after a fork.
+ (dll_crt0_1): Use new child_proc_info class to retrieve information
+ from possible parent process. Remove #ifdef erroneously checked in.
+ Remove extraneous syscall_printf.
+
+Thu Sep 10 21:09:51 1998 Christopher Faylor <cgf@cygnus.com>
+
+ Global changes:
+ Replace pinfo hmap entry with "dtable" reference.
+ Replace cygwin_shared .t field with '.tty' and allow indexing via
+ tty into this array.
+ Make fhandler_ constructors set the size of the structure into any
+ created class.
+ Change fhandler settings into a bit mask. Use methods to access.
+ Record device type in fhandler class.
+ Remove old linearize/de_linearize code in favor of newer method
+ uses more bullet-proof method for determing device type of inherited
+ files.
+ Protect various important handles from closing when operating
+ under -DDEBUGGING.
+ * dcrt0.cc (do_global_ctors): Renamed, made static and reused
+ for calling from dll_crt0_1 to initialize cygwin.dll constructors.
+ (do_global_dtors): Renamed.
+ (dll_crt0_1): mark noreturn. Use new do_global_ctors function.
+ Call debug_init to initialize features turned on by -DDEBUGGING.
+ Call dtable_init to initialize dtable, hinfo_init to initialize
+ standard fds.
+ (dll_crt0): Mark noreturn. Move constructor calls to dll_crt0_1.
+ (__main): Use new do_global_ctors ().
+ Remove OLDWAY and _PPC_ conditionals.
+ * environ.cc (environ_init): Use appropriate strace printf.
+ * exceptions.cc (set_process_mask): Don't ever mask out unmaskable
+ signals.
+ * init.cc (dll_entry): Initialize storage for read_helper.
+ * pinfo.cc (init_from_exec): Delete obsolete function.
+ * sigproc.cc (sig_send): Implement myself_nowait to allow
+ sending a signal to myself without waiting for synchronization.
+ (wait_sig): Change method for determining whether signal should
+ be examined slightly.
+ * strace.cc (strace_printf): Add ability to report on thread from
+ which message originated.
+ (threadname): New function
+ * syscalls.cc (read_helper): New function. Invoked in separate thread
+ from _read.
+ (_read): Use a separate thread for reads that can be interrupted
+ with a TerminateThread(). Allows EINTR.
+ (setdtablesize): Use new method for extending the size. Callable
+ from anywhere.
+ (getdtablesize): Use new method for getting the current dtable size.
+ * tty.cc: Remove use count in favor of a method which checks tty
+ availability via an event. Some code cleanup.
+ (tty::inuse): New function for determining if a tty is
+ in use by any process.
+ (tty_list::terminate): Use new method for determining if a tty is in
+ use. Should avoid hangs waiting for non-existent processes to
+ free up a tty.
+ (tty::common_init): Common initialization for tty/pty master.
+ (fhandler_tty_master::init): New function.
+ (do_output): Use new method for determining if a tty is in use.
+ (fhandler_pty_master::open): Use comon initialization code.
+ (fhandler_pty_master::ptsname): static buffer is ok now.
+ * tty.h: Reflect inuse changes and tty.cc cleanup.
+ * winsup.h: Include debug.h for use when -DDEBUGGING. Remove
+ stuff previously here which was conditionally compiled with -DDEBUGGING.
+ (hinfo_vec): Rename to hinfo. Maintain argv style list of pointers
+ to open fds. Add methods to deal with above changes.
+ (pinfo): Removals due to above changes.
+ (shared_info): Rename t to tty.
+ Add common defines to extern "C" section.
+
+Wed Sep 9 22:24:50 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * path.cc (path_prefix_p_): Rewrite to avoid false match
+ against root when remote path or \\x style disk device.
+ * include/sys/strace.h: Implement new macro for use by
+ malloc_printf which does not default to "on" if STRACE=1.
+ This avoids massive strace logs.
+
+Tue Sep 8 11:31:42 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * dcrt0.cc (dll_crt0_1): Remove ill-advised ifdef NEEDOEM.
+
+Thu Sep 3 17:54:18 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * Makefile.in: Speed up dll links.
+ * path.cc (chdir): Fix previous change.
+
+Mon Aug 31 12:23:33 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * path.cc (chdir): Protect free from potential signal race.
+
+Fri Aug 28 15:59:27 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * dlfcn.h: delete, move it
+ * include/dlfcn.h: here
+
+Thu Aug 27 14:20:38 1998 Christopher Faylor <cgf@cygnus.com>
+
+ patch from sos@prospect.com.ru (Sergey Okhapkin):
+ * path.cc (path_conv::path_conv): remove trailing backslash from
+ full win32 name, otherwise the last component of the path isn't
+ checked for symlink.
+
+Wed Aug 26 14:15:22 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * fhandler.h (fhandler_base): Make set_name() public and implement
+ clear_name() to accomodate dup2.
+ * hinfo.cc (dup2): Previous change exposed problem with dup2.
+ Same unix_path_name_ ptr was being used in two separate fds.
+ Fix this.
+
+Wed Aug 26 12:10:27 1998 Christopher Faylor <cgf@cygnus.com>
+
+ patch from sos@prospect.com.ru (Sergey Okhapkin):
+ * malloc.cc: Use malloc_printf throughout.
+ * path.cc (getcwd_inner): Allocate buffer with realloc to
+ avoid a memory leak.
+ * syscalls.cc (_close): delete unix_path_name_ explicitly since
+ destructor is never called.
+ * include/sys/strace.h: Add strace_malloc stuff.
+
+Mon Aug 24 15:45:59 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * include/sys/ioctl.h: variable names in protos should start
+ with two leading underscores.
+ * include/sys/mman.h: ditto.
+ * include/sys/mount.h: ditto.
+ * include/sys/resource.h: ditto.
+ * include/sys/smallprint.h: ditto.
+ * include/sys/socket.h: ditto.
+ * include/sys/strace.h: ditto.
+ * include/sys/vfs.h: ditto.
+ * include/sys/wait.h: ditto.
+ * include/mntent.h: ditto.
+
+Tue Aug 18 17:00:20 1998 Geoffrey Noer <noer@cygnus.com>
+
+ patch from Trevor Yann (TYann@vet.com.au):
+ * uname.cc (uname): report processor type for win98
+
+Tue Aug 18 16:09:13 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * fork.cc (cygwin_fork_helper1): Start initial fd search
+ to zero forked processes so that a close(0)/dup(fd) will work.
+
+Mon Aug 17 16:58:09 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * winsup.h (hinfo): Remember initial fd to start searching
+ for new fds. This avoid assigning std/in/out/err to
+ files opened early in initialization.
+ (hinfo_vec::find_unused_handle): New default way to search
+ for a new handle. Avoids using std/in/out/err until the
+ proper time in the initialization.
+ * fhandler.cc (fhandler_make_pipe): Use default method for
+ finding unused handle.
+ * net.cc: Ditto throughout.
+ * pipe.cc (dup): Ditto.
+ * syscalls.cc (_open): Ditto.
+ * hinfo.cc (hinfo_vec::init_std_file): Set initial fd for open
+ search to include std/in/out/err.
+
+ patch from sos@prospect.com.ru (Sergey Okhapkin):
+ * spawn.cc (perhaps_suffix): Use translated win32 path when
+ determining if a .exe extension should be added or suffer adding
+ a .exe extension twice.
+
+Mon Aug 10 15:08:49 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * include/cygwin32/version.h: up minor version number
+
+Mon Aug 10 07:04:13 1998 DJ Delorie <dj@cygnus.com>
+
+ * delqueue.cc: rewritten for speed. Don't check *every* entry in
+ the list if we know the list is empty, plus check for duplicates.
+ * delqueue.h: ditto.
+
+Sat Aug 8 14:03:52 1998 Eric Bachalo <ebachalo@cygnus.com>
+
+ * spawn.cc (perhaps_suffix): If report_failure_p is non-zero this
+ function will search for (PROG is the pathname to the executable
+ file) PROG.exe, PROG, PROG.com, PROG.bat, and PROG.cmd and return
+ either the full path name if found or NULL if not.
+ (spawn_guts): If the file name of the executable end in either
+ .exe, .com, .bat, or .cmd we assume that it is not a script file
+ and therefore do not open the file to determine if it is.
+
+Thu Aug 6 22:25:38 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * path.cc (path_conv): If a path component is missing, short-
+ circuit the symlink check. Bug fix for case where path ends
+ in a slash.
+ (path_conv::path_conv): Make sure that a file is not
+ a symlink when returning immediately. Avoid checking for
+ symlinks on network shares. Check for existence of file prior
+ to taking it apart for symlink checking (this needs more work).
+
+Sun Aug 2 19:17:59 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * select.cc (cleanup_pipe_thread): Cleanup thread handle or suffer
+ handle leak.
+ (cleanup_socket_thread): Ditto.
+ * sigproc.cc (proc_subproc): Make wait thread manual reset to
+ solve problem with nested waits not waiting correctly.
+ * fhandler_tty (fhandler_tty_slave::open): Don't create the output
+ mutex, just open it. If it can't be opened, its an error.
+
+Wed Jul 29 12:08:19 1998 Eric Bachalo <ebachalo@loony.cygnus.com>
+
+ * include/Windows32/Defines.h: Added Virtual-Key Code defines
+ for the Win95 keys - VK_LWIN, VK_RWIN, and VK_APPS.
+
+Tue Jul 21 14:47:59 1998 DJ Delorie <dj@cygnus.com>
+
+ * path.cc (path_prefix_p): optimize calls by comparing first
+ characters inline.
+ (path_conv): optimize by not checking both foo and foo/ for
+ symbolic links.
+
+Tue Jul 21 14:39:03 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * pinfo.cc (pinfo_init): Set myself->sid to 1 so that
+ a program started up outside of cygwin will not trump
+ other opens of ttys. Fixes problem with pgid change below.
+
+Tue Jul 21 12:59:21 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * path.cc (chdir): Force chdir to disk device to go to the root
+ directory.
+
+Tue Jul 21 09:32:23 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * pinfo.cc (pinfo_init): 0 is a very bad value for a default pgid.
+
+Fri Jul 16 15:09:50 1998 Stan Cox <scox@cygnus.com>
+
+ * (gcrt0.c, gmon.c, profil.c, mcount.c, gmon.h, profil.h,
+ config/i386/profile.h): New files for gprof cygwin support.
+ Some code contributed by Tim Newsham for Secure Networks, Inc.
+ * Makefile.in (LIBGMON_A, GMON_START, GMON_OFILES): New for gprof.
+
+Mon Jul 13 19:29:00 1998 Eric Bachalo <ebachalo@loony.cygnus.com>
+
+ * dcrt0.cc (insert_files): Now both -@file and @file work as
+ command line file insertion options.
+ * fhandler_serial.cc (fhandler_serial::open): Enabled RTS Control
+ Line by default to make full handshaking cables work for the
+ D10V board. (CDB.fRtsControl)
+ (fhandler_serial::tcsetattr): same as above
+
+Wed Jul 8 15:53:35 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * dcrt0.cc (dll_crt0_1): Avoid redundant strace_printf.
+
+Wed Jul 8 15:05:10 1998 DJ Delorie <dj@cygnus.com>
+
+ * fhandler.cc (fhandler_base::lseek): Note lseek so that next
+ write() can check for the Win95 "gap" bug.
+ (fhandler_base::write): If Win95 and lseek past eof
+ followed by write, use WriteFile to force the "gap" to be filled
+ with zeros rather than left to the "undefined" data Win32 specifies.
+ (fhandler_base::fhandler_base): initialize check_win95_lseek_bug_.
+ * fhandler.h (class fhandler_base): Add check_win95_lseek_bug_
+ for bug: when seek past EOF and write, win95 fills with random
+ data (security hole).
+
+Thu Jul 2 10:45:15 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * environ.cc (winenv): Be more paranoid when restoring special
+ win32 environment variables beginning with '='.
+
+Thu Jul 2 09:19:32 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * environ.cc: Previous change was not rigorous enough.
+ Track environment variables to convert in a structure which
+ records the correct function for converting the environment
+ variable from/to POSIX format.
+ (isspecial): New function.
+ (parse_options): Use template to initialize parse array.
+ (posify): Use new conversion function.
+ (winenv): Ditto. Also restore special win32 environment variables
+ beginning with '='.
+ * path.cc (conv_path_list): Source argument should be const.
+ (win32_to_posix_path_list): Ditto.
+ (posix_to_win32_path_list): Ditto.
+ * path.h: Reflect changes to path.cc.
+
+Tue Jun 30 14:00:32 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * environ.cc (winenv): Avoid converting environment variables to
+ windows style if they begin with something like a 'C:'.
+
+Sun Jun 28 20:59:16 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * include/Windows32/Structures.h (MINMAXINFO): Add a missing
+ *LP...
+
+Thu Jun 25 10:45:38 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * signal.cc (sigpending): Stop from always reporting pending signals
+ when no signals are actually pending.
+
+Tue Jun 23 15:38:45 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * Makefile.in: Add a new target.
+ * cygwin.din: Add cygwin32_internal interface.
+ * dcrt0.cc (dll_crt0_1): Don't call main if no main set. Allows
+ initialization from a .dll.
+ * utils/ps.cc: Use new internal/external interface to cygwin to
+ provide an unchanging interface to some cygwin internals.
+ * external.h: Preliminary stab at an interface to cygwin32 for
+ getting at the "naughty bits".
+ * external.cc: External interfaces to some cygwin internal stuff.
+
+ patch from sos@prospect.com.ru (Sergey Okhapkin):
+ * exceptions.cc (sig_handle): When abnormally terminating,
+ close_all_files in signal thread context to prevent socket hangs.
+
+Thu Jun 18 15:17:06 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * pinfo.cc (pinfo_list::allocate_pid): Wrap pids at SHRT_MAX
+ or ash complains.
+
+ patch from sos@prospect.com.ru (Sergey Okhapkin):
+ * window.cc (WndProc): Always kill timer before starting up
+ a new one or eventually suffer a timer proliferation.
+
+Mon Jun 15 09:40:30 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * exceptions.cc: Cosmetic change.
+
+ patch from sos@prospect.com.ru (Sergey Okhapkin):
+ * syscalls.cc (system): Ignore SIGINT, SIGQUIT and SIGCHLD while
+ in a system() call.
+
+Thu Jun 11 18:37:02 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * include/sys/syslog.h: add missing LOG_LOCALn bits
+
+Tue Jun 9 22:29:26 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * dll_init.cc (DllNameIterator::operator const char* ()): Add
+ a missing \n to a *_printf.
+ * fhandler_tty.cc (fhandler_tty_slave::dup): Ditto.
+ (fhandler_tty_slave::ioctl): Ditto.
+ * errno.cc (errmap): Add an unrepresented windows error.
+ Simplify table.
+
+Tue Jun 9 17:21:44 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * errno.cc (errmap): Make sure that errmap array is
+ terminated with a NULL or suffer a SIGSEGV.
+
+Tue Jun 9 10:30:02 1998 Christopher Faylor <cgf@cygnus.com>
+
+ Change `sprintf' to `__small_sprintf' throughout cygwin.
+ * cygwin.din: Don't export exception handler.
+ * exceptions.cc (__cygwin32_exception_handler): Rename to
+ handle_exceptions. Make static. Redo core file generation
+ slightly so that __small_sprintf can be used.
+ (call_handler): Remove use of `rethere' in asm code. Don't
+ probe stack as this is potentially dangerous unless done
+ meticulously.
+ * select.cc (select): Redo to create thread whenever needed
+ for pipe/socket. Thread termination denotes fd readiness.
+
+Mon Jun 8 14:31:11 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * hinfo.cc (set_std_handle): New function to set windows
+ "standard" handles from cygwin handles.
+ (hinfo_vec::dup2): Set windows standard handle if appropriate.
+ * syscalls.cc (_open): Set windows standard handle if appropriate.
+
+Sun Jun 7 16:34:00 1998 Christopher Faylor <cgf@cygnus.com>
+
+ patch from sos@prospect.com.ru (Sergey Okhapkin):
+ * fhandler_console.cc (fhandler_console::scroll_screen): Add a
+ workaround for Win95 ScrollConsoleScreenBuffer bug which allowed
+ scrolling to work correctly in both directions.
+ (fhandler_console::char_command): Simulate underscore with cyan
+ instead of magenta like on a real linux console.
+
+Sat Jun 6 00:01:18 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * dcrt0.cc: Remove obsolete PPC and OLDWAY defines.
+ * exceptions.cc: Remove obsolete PPC defines.
+
+Fri Jun 5 22:18:01 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * utils/Makefile.in: install should build products if necessary.
+
+Fri Jun 5 17:47:11 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * errno.cc (seterrno): shouldn't & against 0xff since there
+ are error codes above 255.
+
+Fri Jun 5 14:35:36 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * exceptions.cc (ctrl_c_handler): Ignore CTRL_LOGOFF_EVENT or
+ everybody gets signalled when a user logs off. Allow program
+ to clean up when receiving a CTRL_CLOSE_EVENT or CTRL_SHUTDOWN_EVENT.
+ * spawn.cc (_spawnve): Delete hmap.vec from created child since
+ it just gets overwritten in the child anyway.
+ * pinfo.cc (lpfu): u -> user_data.
+
+Thu Jun 4 22:45:12 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * mmap.cc (mprotect): 3rd arg to VirtualProtect call should
+ be new_prot, not prot. Also, fix check for PROT_NONE (==,
+ not &).
+
+Wed Jun 3 16:37:43 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * exceptions.cc: Fix typo in comment
+ (ctrl_c_handler): Add comments, return FALSE on CTRL_CLOSE_EVENT,
+ CTRL_LOGOFF_EVENT, and CTRL_SHUTDOWN_EVENT events. Otherwise,
+ we handle the console event ourselves, send a SIGINT, and return
+ TRUE.
+
+Wed Jun 3 14:36:08 1998 Geoffrey Noer <noer@cygnus.com>
+
+ patch from sos@prospect.com.ru (Sergey Okhapkin):
+ * path.cc (conv_to_win32_path, conv_to_full_win32_path): resolve
+ symlinks before converting.
+
+Wed Jun 3 02:11:23 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * exceptions.cc (ctrl_c_handler): return zero when a
+ CTRL_LOGOFF_EVENT occurs.
+
+Wed Jun 3 01:01:17 1998 Geoffrey Noer <noer@cygnus.com>
+
+ Reorganize fhandler-related file layout.
+ * Makefile.in: Remove console.o, add fhandler_console.o. Add
+ fhandler_serial.o. Remove tty.o, add fhandler_tty.o.
+ * fhandler_console.cc: Was console.cc.
+ * console.cc: Delete.
+ * fhandler_serial.cc: Was code in fhandler.cc.
+ * fhandler.cc: Delete fhandler_serial routines.
+ * fhandler.h: Fix comments describing fhandler file layout.
+ * fhandler_tty.cc: Was code in tty.cc.
+ * tty.h: Delete.
+ * fhandler_tty.h: Was tty.h.
+ * tty.cc: Delete code moved to fhandler_tty.cc.
+ * winsup.h: Include fhandler_tty.h instead of tty.h.
+
+Tue Jun 2 23:34:42 1998 Geoffrey Noer <noer@cygnus.com>
+
+ Don't need processor-specific sysdef directories:
+ * sysdef/powerpc: remove all files
+ * sysdef/i386: move all files to top of sysdef directory
+ * configure.in: stop setting processor-specific sysdef variable
+ * configure: regenerate
+ * Makefile.in: build .a files from top-level sysdef files.
+
+Tue Jun 2 16:52:18 1998 Geoffrey Noer <noer@cygnus.com>
+
+ patch from lhall@rfk.com (Larry Hall):
+ * console.cc (fhandler_console::fhandler_console): call
+ fillin_info() to check if console attributes have already been
+ set. If so, set the default foreground color to be the default
+ for the console, otherwise set it to white.
+ (fhandler_console::char_command): use the default color to set fg,
+ bg, and bold for all cases.
+
+Mon Jun 1 14:05:01 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * dir.cc (writable_directory): Avoid a malloc.
+ (opendir): Convert to fully qualified path spec. Use inode from
+ stat as hash instead of recalculating.
+ (readdir): Try hard to generate the same inode for filenames
+ as inodes returned from stat(). Handle '.' and '..' inodes
+ differently than normal files. Note that '..' will still fail
+ in certain pathological conditions.
+ * fhandler.cc (fstat): Preserve errno around path conversion.
+ * path.cc (path_conf::path_conv): Add an extra argument signifying
+ whether caller wants a fully qualified Windows spec.
+ (get_current_directory_name): New function. Retrieves current
+ directory name into internal buffer.
+ (getcwd_inner): Reorganize. Use get_current_directory_name()
+ to retrieve a (possibly cached) directory name.
+ (hash_path_name): Move function here from syscalls.cc. Rewrite to
+ deal (simplistically) with non-absolute path specs. Use
+ get_current_directory_name to absolutize path.
+ * path.h: Reflect additional argument for path_conv.
+ * select.cc (cygwin32_select): Remove newline from select_printf().
+ * syscalls.cc (hash_path_name): Move to path.cc.
+ (stat_worker): Always use full path spec so that inodes are
+ calculated correctly.
+ * uinfo.cc (getlogin): Make extern "C".
+ * include/sys/resource.h: Put extern "C" around this file.
+
+Mon Jun 1 13:16:03 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * console.cc: Comment out small_printfs which issue errors
+ on things like invalid escape sequences. This is very much
+ unlike a normal terminal, or even like linux which console.cc
+ purports to emulate.
+ (console_read): Renamed from FakeReadConsole. Streamline
+ slightly.
+ (fhandler_console::read): Ditto.
+
+Fri May 29 22:41:18 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * hinfo.cc: Include unistd.h, not fcntl.h.
+
+Fri May 29 21:38:10 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * path.cc (mount_info::binary_win32_path_p): Don't allow
+ the root mount to replace a //drive or //host specification.
+
+Fri May 29 08:20:28 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * winsup.h: Remove exports section in favor of external
+ include files. Fix some comments.
+ * {console.cc, fcntl.cc, pipe.cc}: Include unistd.h.
+ * dcrt0.cc (__main): Make extern "C".
+ * strace.cc: Include time.h.
+ * wait.cc (_wait): Make extern "C".
+ * version.h: Bump minor version to 3 in honor of /dev/windows
+ support.
+
+Fri May 29 03:11:28 1998 Geoffrey Noer <noer@cygnus.com>
+
+ patch from sos@prospect.com.ru (Sergey Okhapkin):
+ * Makefile.in: Add fhandler_windows.o target
+ * fhandler.h: Include <sys/ioctl.h>. fhandler_windows: new
+ fhandler class that handles access to Windows message queue.
+ (fhandler_base::is_windows): new virtual member function
+ * fhandler_windows.cc: New file, fhandler_windows class
+ implementation.
+ * hinfo.cc (hinfo_vec::build_fhandler): build fhandler_windows
+ class for "/dev/windows". Include <sys/ioctl.h>.
+ * select.cc: New fd_windows_map class
+ (fd_windows_map::convert_to_unix_fdset): New, check for Windows
+ messages in a queue.
+ (cygwin32_select): check for windows fd is passed to select call,
+ increase size of harray by one to support windows pseudo-handle,
+ do MsgWaitForMultipleObjects if windows fd passed to select call.
+
+Thu May 28 18:22:24 1998 Ian Lance Taylor <ian@cygnus.com>
+
+ * utils/cygpath.cc: New file.
+ * utils/Makefile.in (PROGS): Add cygpath$(EXEEXT).
+ (cygpath$(EXEEXT)): Ne target.
+
+ * include/sys/cygwin.h: Declare more path conversion functions.
+
+Thu May 28 15:56:26 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * include/sys/ioctl.h: need to include <sys/cdefs.h>
+ * syscalls.h: remove ioctl proto
+
+Wed May 27 01:34:06 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * cygwin.din: add sethostent/endhostent exports
+ * net.cc (sethostent, endhostent): new stubs
+
+Fri May 22 17:31:50 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * include/cygwin32/in.h: correct typo in IPPORT_WHOIS define
+
+Fri May 22 17:00:48 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * include/sys/ioctl.h: add ioctl proto
+
+Wed May 20 18:52:31 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * include/sys/param.h: delete, file overlaps with newlib's.
+ Move it to newlib/libc/sys/cygwin32/sys where such files
+ are supposed to go.
+
+Wed May 20 18:20:35 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * select.cc (auto_del_fd_set_map::auto_del_fd_set_map): correct
+ C++ problem -- can't use parens in call to new.
+
+Wed May 20 17:03:25 1998 Geoffrey Noer <noer@cygnus.com>
+
+ based on patch from newsham@lava.net (Tim Newsham):
+ * select.cc: FIXMEs added/adjusted
+ (select_sleep): new static select helper function
+ (cleanup_sockthread): ditto
+ (cleanup_pipethread): ditto
+ (cygwin32_select): remove degenerate goto in favor of calling
+ select_sleep, call cleanup_sockthread and cleanup_pipethread
+ instead of previously duplicated code.
+
+Wed May 20 02:21:37 1998 Geoffrey Noer <noer@cygnus.com>
+
+ patch from Christopher Faylor <cgf@cygnus.com>
+ * fhandler.cc (fhandler_serial::raw_read): When
+ vmin_ == 0, vtime_ > 0, don't force only one char at a time
+ to be read.
+ (fhandler_serial::tcsetattr): set to.ReadIntervalTimeout
+ and to.ReadTotalTimeoutMultiplier appropriately so reads
+ will time out properly when vmin_ == 0, vtime_ > 0.
+
+Tue May 19 09:05:46 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * init.cc (set_dllname): Use consistent "cygwin32" name for dll
+ if the name of the dll is actually cygwin. This will allow
+ better interoperability between dlls which have been renamed,
+ i.e., cygwindevo.dll -> cygwin98r1.dll.
+
+Mon May 18 22:39:35 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * winsup.h: Remove sig* undefs since this is now done in newlib.
+ Define SIGTOMASK define for use by signal mask operations.
+ * exceptions.cc (__cygwin32_exception_handler): Use SIGTOMASK.
+ (sig_handle): Ditto
+ * signal.cc (sigpending): Ditto.
+ (sigaddset): Use SIGTOMASK. Disallow signal 0.
+ (sigdelset): Ditto.
+ (sigismember): Ditto.
+ * strace.cc (strace_printf): It is possible for strace_mutex to
+ be an invalid handle. Open the mutex if so. Call ReleaseMutex
+ until exhausted since a signal may have interrupted an strace_printf.
+ (strace_dump): Call ReleaseMutex until exhausted.
+ * tty.cc (do_output): Remove strace printf to avoid filling up strace
+ output.
+ (fhandler_tty_slave::read): Use SIGTOMASK.
+
+Mon May 18 09:11:38 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * dcrt0.cc (dll_crt0_1): Clear errno before calling main.
+
+Thu May 14 00:37:01 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * dcrt0.cc: add comments, reformatting
+
+Wed May 13 17:47:23 1998 Geoffrey Noer <noer@cygnus.com>
+
+ patch from sos@prospect.com.ru (Sergey Okhapkin):
+ * times.cc (to_time_t): prevent stat from returning incorrect
+ file modification time (one second less) on fat partitions due
+ to round-up error.
+
+Wed May 13 16:03:07 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * select.cc: add comments, FIXMEs, respace, delete old
+ sockets-only case that was previously commented out.
+ (cygwin32_select): in case where handles and sockets are
+ set, don't check that always_ready_used is zero (that case is
+ covered before).
+ * syscalls.cc: delete unused file_queue struct.
+
+Tue May 12 18:36:25 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * syscalls.cc (get_os_type): add FIXME
+
+Tue May 5 14:02:12 1998 Christopher Faylor <cgf@cygnus.com>
+
+ Throughout Cygwin replace use of "sa" SECURITY_ATTRIBUTE variables
+ with appropriate global variables.
+ * shared.cc (shared_init): Initialize global security attribute
+ variables for use in various places around cygwin.
+ * fork.cc (fork_init): Remove. Functionality replaced by above.
+ * dcrt0.cc (dll_crt0_1): Remove obsolete fork_init() call.
+
+Sat May 2 17:40:51 1998 Christopher Faylor <cgf@cygnus.com>
+
+ patch from sos@prospect.com.ru (Sergey Okhapkin):
+ * tty.cc (create_tty_master): Fill in ut_host utmp field with
+ local host name instead of "local" to avoid "who" command timeouts.
+
+Fri May 1 22:38:20 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * environ.cc: Add a global to control com port reset behavior.
+ (parse_options): Recognize "reset_com" as a CYGWIN32 option.
+ * fhandler.cc (fhandler_serial::raw_read): Handle vmin and vtime
+ more like UNIX.
+ (fhandler_serial::open): Revive code to reset com port on open.
+ Only reset the port if reset_com global is not set and if this
+ function is being called explicitly by open.
+ (fhandler_serial::tcsetattr): Make CRTSCTS flow control more
+ like UNIX -- it should turn on hardware handshaking in both
+ directions. Handle vmin and vtime in a manner more consistent
+ with UNIX.
+ (fhandler_serial::tcgetattr): Reflect CRTSCTS changes above when
+ reporting this state.
+ * include/sys/termios.h: Move CRTSCTS and CRTSXOFF (sic) into
+ 16 bits or they will never be capable of being set.
+
+Thu Apr 30 15:05:45 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * console.cc (fhandler_console::init): If resetting stdin,
+ make sure to reset the ConsoleCtrlHandler.
+ * exceptions.cc (set_console_handler): New function broken out
+ of init_exceptions(). Sets the function responsible for handling
+ CTRL-C.
+ (init_exceptions): Snipped out set_console_handler.
+
+Thu Apr 30 14:11:30 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * include/sys/cygwin.h: Remove cygnus-specific declaration.
+ * winsup.h: Move cygnus-specific cygwin32_attach_handle_to_fd
+ declaration here. This function may eventually be replaced by
+ an osf_* function.
+
+Tue Apr 28 17:07:46 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * passwd.cc (parse, getpass): remove unneeded uses of NO_COPY
+ * grp.cc (getgrgid, getgrnam): ditto
+
+Tue Apr 28 16:18:03 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * version.h: bump minor version to 2
+ * errno.cc: add FIXME
+
+Wed Apr 22 15:43:56 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * syscalls.cc (cygname): delete
+ * shared.cc (shared_name): new, was cygname
+ * strace.cc, exceptions.cc, sigproc.cc, shared.cc: fix
+ cygname references in light of above
+
+Wed Apr 22 14:12:09 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * select.cc (fd_set_map::remove_pair_by_handle): minor optimization
+ * strace.cc (strace_printf): change format for consistency
+
+ patch from sos@prospect.com.ru (Sergey Okhapkin):
+ * dcrt0.cc (dll_crt0): Call global constructors explicitly
+ * tty.cc (create_tty_master): Remove code which attempted to
+ invoke tty constructor
+
+Tue Apr 21 16:18:27 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * environ.cc (ucenv): inline
+ (posify): Ditto
+ (environ_init): remove obsolete function use
+ * path.cc (symlink_check_one): Set errno here where appropriate.
+ (readlink): Rely on errno set by symlink_check_one rather than
+ defaulting to EINVAL. Should fix problems with RCS.
+
+Tue Apr 21 15:36:41 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * Implement a NOSTRACE preprocessor define to allow building
+ Cygwin32 without any STRACE code.
+ * configure.in: Add entries for architecture specific programs
+ to allow easier cross-compile builds
+ * configure: Ditto
+ * Makefile.in: Ditto
+ * console.cc (fhandler_console::char_command): Fix two problems
+ with cursor position report: 1) it reported position relative
+ to beginning of buffer rather than beginning of screen, 2) it
+ reported y, x in reversed order
+ * dcrt0.cc: Remove NO_COPY from variables that don't need it.
+ Remove variables obsoleted by NO_COPY.
+ (dll_crt0_1): strace settings are now inherited. Don't try
+ to initialize strace early. Remove initialization of variables
+ which are now handled automatically by NO_COPY. Set error mode
+ for Cygwin32 to fail on critical errors rather than popping up
+ a dialog box.
+ * spawn.cc (spawn_guts): Always use default error mode when
+ spawning a new process. Move error message to more generally
+ useful location. Terminate signal handling in a cygwin parent
+ process or two processes will be handling signals.
+ (_spawnve): Inherit strace stuff
+ * exceptions.cc (events_init): Provide more information on
+ "Catastrophic failure". Change error message wording slightly.
+ * fork.cc: Remove obsolete structure
+ (cygwin_fork_helper1): Remove use of obsolete structure. Inherit
+ strace settings in child processes.
+ * sigproc.cc (sigproc_init): Set wait_sig priority immediately
+ after thread creation.
+ * smallprint.c: Remove unneeded include
+ * strace.cc: Reorganize to handle NOSTRACE
+ (strace_open): Use strace entries in pinfo structure which are
+ now inherited
+ (strace_dump): ditto
+ (strace_init): preprocessor define STRACE_HHMMSS causes strace
+ output to use alternate log file format.
+ (strace_printf): ditto
+ * syscalls.cc (access): Remove SetErrorMode in favor of global
+ cygwin32 setting in dll_crt0_1.
+ * fhandler.cc: Handle NOSTRACE
+ * tty.cc: Ditto
+ * window.cc: Ditto
+ * include/sys/strace.h: Ditto
+ * winsup.h: Move strace_file handle from per_process to pinfo so
+ that it can be inherited. Remove obsolete pinfo entry.
+
+Tue Apr 21 14:30:52 1998 Christopher Faylor <cgf@cygnus.com>
+
+ * hinfo.cc (cygwin32_attach_handle_to_fd): New function
+ * include/sys/cygwin.h: Ditto.
+ * cygwin.din: Export new cygwin-specific function
+
+Tue Apr 21 02:32:08 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * syscalls.cc: comment out file_queue struct that doesn't
+ seem to be used for anything anymore. Don't need to include
+ stdarg.h or sys/socket.h. Include utmp.h. Minor respacing.
+ Move all functions from misc.cc here.
+ (_read): change strace debug printf function name to _read
+ (logout): rename success to res
+ * misc.cc: delete file
+ * Makefile.in: adjust for above change
+
+Tue Apr 21 01:45:05 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * dir.cc: new file for directory-related functions, was
+ dirsearch.cc.
+ (mkdir, rmdir, writable_directory): move here from syscalls.cc,
+ writable_directory no longer static
+ * dirsearch.cc: delete file
+ * winsup.h: add proto for writable_directory.
+ * errno.cc: new file for errno-related functions, move errmap
+ struct here from syscalls.cc
+ (seterrno): move from syscalls.cc
+ (strerror): move from strerror.cc
+ * strerror.cc: delete file
+ * syscalls.cc: delete everything moved to any of the above files
+ * Makefile.in: adjustments for above
+
+Thu Apr 17 16:43:23 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * termios.cc: add comments, add extern "C" in front of exported
+ calls, move debugging local functions to end of file
+ * winsup.h: remove fork_terminate proto for function that is no
+ longer with us. Add strccpy proto.
+ * spawn.cc (_spawnve): make static
+ (strccpy): remove in favor of identical function in exec.cc
+ * exec.cc (strccpy): no longer static
+
+ patch from newsham@lava.net (Tim Newsham):
+ * select.cc (cygwin32_select): fix off by one error, stop
+ using memcpy to copy memory over itself
+
+Thu Apr 16 16:23:00 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * net.cc: respace, put all fhandler_socket functions together
+ (getsockopt): fix case statement bug resulting in faulty strace
+ output
+ (setsockopt): ditto
+ * shared.cc: throughout, rename global h to cygwin_shared_h
+ * strerror.cc: make error global a local variable
+ * fhandler.h: add comments, add virtual function always_read_ready
+ to fhandler_serial which should return zero to allow non-blocking
+ serial I/O.
+ * Makefile.in: select.cc should depend on select.h
+
+Wed Apr 15 16:14:01 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * select.h: new file, containing macros used by select.cc.
+ * select.cc: remove them from here, include select.h
+
+Wed Apr 15 15:23:55 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * ntea.cc (NTReadEARaw): mark as static, don't check allow_ntea
+ since this is only accessed by functions that have already checked
+ it.
+
+Tue Apr 14 14:07:54 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * cygwin.din: export truncate call
+
+Mon Apr 13 23:15:13 1998 Geoffrey Noer <noer@cygnus.com>
+
+ Throughout Cygwin32, rename *u for per_process data *user_data.
+ Likewise, rename *s for shared memory data *cygwin_shared.
+ Respace where necessary.
+ * registry.cc: minor respace
+ * registry.h: ditto
+ * net.cc: ditto
+ * fhandler.cc (fhandler_base::read): don't redeclare int len
+ * syslog.cc: add FIXME, reformatting, remove extern "C" around
+ whole file, add before exported functions
+ (syslog): rename second cp char pointer cp2
+ (setlogmask): comment out unused function
+
+Mon Apr 13 17:55:43 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * environ.cc (parse_options): add "ntea" setting to CYGWIN32
+ env variable. Setting determines whether NTEA is used or not.
+ * ntea.cc: Add allow_ntea global which is inited to FALSE.
+ Now instead of immediately returning FALSE, make all
+ functions check allow_ntea variable and use or not use NTEA
+ based on its value.
+ * ps.cc (main): widen Win32_pid field by one to better handle
+ Win 95 pids.
+
+ patch from sos@prospect.com.ru (Sergey Okhapkin):
+ * shared.cc (shared_info::initialize): increase default
+ heap_chunk_size to 128 mb to get around the problem that
+ Cygwin32 still can't cope with a split heap properly.
+
+Wed Apr 8 18:04:07 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * net.cc (cygwin32_bind, cygwin32_getsockname, cygwin32_listen,
+ cygwin32_shutdown): if should check sock, not s.
+
+Wed Apr 8 15:00:46 1998 Geoffrey Noer <noer@cygnus.com>
+
+ Eliminate warnings revealed by -Wshadow -Wall:
+ * console.cc (FakeReadFile): fix aggregate with partly bracketed
+ initializer (add missing brackets).
+ * tty.cc (fhandler_tty_slave::close): remove unused variable tty
+ (fhandler_tty_slave::dup): ditto
+ (fhandler_tty_slave::send_ioctl_request): ditto
+
+Wed Apr 8 03:04:11 1998 Geoffrey Noer <noer@cygnus.com>
+
+ Eliminate warnings revealed by -Wshadow -Wall:
+ * console.cc (FakeReadFile): change variable name index to
+ modifier_index.
+ (fhandler_console::read): remove second definition of flags
+ * dcrt0.cc (build_argv): rename s to start, e to end
+ (insert_files): reformat, add parens around assign used as truth
+ value, make i a DWORD, remove dup def of i.
+ * dlfcn.cc (set_dl_error): rename s to str
+ (checkAccess): rename to check_access
+ (checkPathAccess): rename to check_path_access
+ (getFullPathOfDll): rename to get_full_path_of_dll, don't
+ redeclare len
+ * dll_init.cc (DllList::detachDll): rename index to dll_index
+ * fork.cc (cygwin_fork_helper1): rename index to dll_index,
+ reformat slightly, rename res in dll load section to loadres,
+ don't redeclare rc two additional times
+ (dump_jmp_buf): rename s to sbuf
+ * grp.cc (initgroups): rename group arg to grp
+ * hinfo.cc (digits): rename s to str
+ (hinfo_vec::build_fhandler): rename first buf variable to
+ buf_info, the second to buff.
+ (hinfo_vec::linearize_fd_array): cast sizeof return to int,
+ declare i in for loop
+ (hinfo_vec::de_linearize_fd_array): declare i in for loop
+ * misc.cc (nice): rename pri to priority, index to curr
+ (cygname): rename s to str
+ (login): rename tty to currtty
+ (logout) put missing parens around arg to sizeof calls
+ * net.cc (DuplicateSocket): rename function to duplicate_socket,
+ rename s arg to sock
+ (fhandler_socket::fhandler_socket): rename s arg to sock
+ (socketpair): rename sin to sock_in
+ (cygwin32_rexec): rename passwd arg to password
+ * passwd.cc (parse): rename stat array to tmpbuf
+ * resource.cc (fill_rusage): rename creation to creation_time,
+ exit to exit_time, kernel to kernel_time, user to user_time
+ (getrusage): rename rusage arg to rusage_in
+ * sigproc.cc (proc_terminate): move i declaration outside of
+ loop, get rid of extra declaration
+ (getsem): rename s to str
+ (proc_strace): declare i at top of function, remove extra two
+ declarations of it later
+ * smallprint.c: include ctype.h for isalnum proto
+ (__small_vsprintf): put parens around assign used as truth value
+ * spawn.cc (spawn_guts): rename both s variables to str, remove
+ redeclarations of i
+ * strace.cc (mark): rename s arg to str
+ * syscalls.cc (chown): remove unused vars group, passwd
+ (access): rename s to st
+ (ctermid): rename s to str
+ * termios.cc (cfsetospeed, cfsetispeed): rename s to speed
+ * times.cc (times): rename creation to creation_time,
+ exit to exit_time, kernel to kernel_time, user to user_time
+ (time_t_to_filetime, timeval_to_filetime): rename time to time_in
+ * tty.cc (create_tty_master): rename utmp variable our_utmp
+ (fhandler_tty_master::init): rename ttynum arg ttynum_in
+
+Tue Apr 7 17:18:05 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * syscalls.cc (seterrno): add FIXME
+ * path.cc (symlink_check_one): change comment wording
+
+ patch from Tom Tromey (tromey@cygnus.com)
+ * syscalls.cc (access): Call SetErrorMode to turn off critical
+ errors dialog.
+
+ patch from Mikey (jeffdb@netzone.com):
+ * fhandler.cc (fhandler_disk_file::open): under Win95, set
+ S_IXOTH|S_IXGRP|S_IXGRP if the first two bytes of a file contain
+ a '#!'.
+ (fhandler_disk_file::check_execable_p): consider shell scripts
+ execable
+
+Mon Apr 6 20:55:06 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * include/sys/cygwin.h: add protos for cygwin32 path conversion
+ functions.
+
+Wed Apr 1 16:12:58 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * {fhandler.cc, fhandler.h, hinfo.cc, console.cc}: Rename
+ fhandler_tty class to fhandler_serial
+
+Tue Mar 31 16:27:36 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * ntea.cc: temporarily disable reading/writing NTEA information
+ due to the large penalty incurred on NT fat partitions.
+
+Fri Mar 27 13:35:30 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * environ.cc (parse_options): change struct to union to avoid
+ references to uninitialized fields.
+
+Thu Mar 26 19:03:00 1998 Eric Bachalo <ebachalo@cygnus.com>
+
+ * dcrt0.cc (insert_files): added this function to replace
+ -@file in the command line with the contents of the file
+ (dll_crt0_1): calls insert_files before building argv
+
+Wed Mar 25 15:25:26 1998 Geoffrey Noer <noer@cygnus.com>
+
+ And more:
+ * {fhandler.cc, fhandler.h, tty.cc, net.cc, console.cc}: make
+ ioctl calls' cmd arg unsigned, ditto for access arg of init calls.
+ * console.cc (fhandler_console::fillin_info): add parens around
+ assignment used as truth value.
+ (FakeReadFile): make copied_chars a size_t
+ (fhandler_console::read): make i in loop unsigned
+ * environ.cc (setenv): make l_value unsigned, add parens around
+ assignments used as truth values.
+ * exceptions.cc (call_handler): supposed to return an int and
+ wasn't at the end of control flow. Now returns 1 there.
+ * fhandler.h (~fhandler_base): destructor should be marked virtual
+ * misc.cc (login): add parens around assignment used as truth
+ value.
+ * net.cc: cast INVALID_SOCKET to int in comparisons
+ (fhandler_socket::ioctl): remove int cast to FIONBIO since cmd
+ is now unsigned
+ (get_win95_ifconf): add cast to signed vs unsigned int comparison.
+ * ntea.cc (NTReadEA): add cast to signed vs unsigned int
+ comparison.
+ * path.cc (getcwd_inner): make len a size_t
+ * pinfo.cc (cygwin32_winpid_to_pid): add comment
+ * select.cc (cygwin32_select): make wait_ret an int
+ * signal.cc (kill_worker): add parens around assignments used as
+ truth values.
+ * sigproc.cc (wait_sig): make rc a DWORD
+ (sig_send): add parens around assignment used as truth value.
+ * strace.cc: make inqueue global a static DWORD
+ * tty.cc (do_output): add cast to signed vs unsigned int
+ comparison.
+ (fhandler_pty_master::open): remove unused handle nh
+
+Tue Mar 24 18:03:59 1998 Geoffrey Noer <noer@cygnus.com>
+
+ More spring cleaning:
+ * net.cc: move LOAD macro definition out of winsock_init,
+ correction to make it valid ANSI C++.
+ * grp.cc (read_etc_group): pass default line directly to
+ add_grp_line call
+
+Mon Mar 23 19:21:00 1998 Geoffrey Noer <noer@cygnus.com>
+
+ patch from cgf@bbc.com (Christopher Faylor):
+ * spawn.cc (spawn_guts): Don't call close_all_files if a cygwin
+ process has been spawned. Otherwise, we close tty handles twice.
+
+Fri Mar 20 23:01:24 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * pinfo.cc (pinfo_list::init): Initialize next_pid to PBASE.
+ (pinfo_list::operator []): Now index is given by pid mod size().
+ (pinfo_list::allocate_pid): Allow more pid numbers than spaces in
+ the process table. Pids now can range from PBASE (1000) to
+ INT_MAX. At that point they wrap to 1000 again. For speed, use
+ modular arithmetic to map pids into table.
+ * winsup.h: move PBASE to pinfo.cc, rename next_pid_index to
+ next_pid
+ * utils/ps.cc (main): reorg of what's printed where, listing pid
+ first.
+
+Thu Mar 19 15:05:07 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * winsup.h: Change section name in NO_COPY definition. We were
+ using a .data$nocopy section to avoid copying certain data on
+ fork. The linker used to include this between __data_start__ and
+ __data_end__, but that broke building the cygwin32 dll. The fix
+ is to rename the section ".data_cygwin_nocopy" and explictly
+ include it after __data_end__.
+
+Wed Mar 18 15:03:51 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * tty.h: fix ttyslot proto; it returns an int
+ * glob.h: fix glob proto; it returns an int
+
+Mon Mar 16 16:16:40 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * Makefile.in: stop installing the dll in the lib directory as
+ well as the bindir.
+ * environ.cc (parse_options): don't need to call malloc
+
+Mon Mar 16 11:56:23 1998 Geoffrey Noer <noer@cygnus.com>
+
+ patch from cgf@bbc.com (Christopher Faylor):
+ * tty.cc (fhandler_tty_slave::dup): Don't set flags to 0. Flags
+ have already been set in wrapper.
+ * net.cc: Rename `s' variable which shadows global `s'.
+ * termios.cc: ditto
+ * time.cc: ditto
+
+Tue Mar 10 15:54:04 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * version.h: up CYGWIN_DLL_VERSION_MINOR
+
+Tue Mar 10 15:41:29 1998 Geoffrey Noer <noer@cygnus.com>
+
+ patch from cgf@bbc.com (Christopher Faylor):
+ * spawn.cc (spawn_guts): Make argument handling after `#! pgm'
+ handle spaces similarly to UNIX. Close "linearized" file handles
+ when a non-cygwin32 binary is executed or suffer hangs on exit.
+ Reorganize lpReserved2 buffer to avoid conflicts with Microsoft
+ usage which resulted in incorrect stdin/stdout operation with
+ programs compiled using MSVC.
+ * pinfo.cc (pinfo_init): Accomodate change to lpReserved2
+ organization.
+
+Mon Mar 9 19:27:17 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * syscalls.cc (_open): modify to take a variable number of
+ arguments to match newlib's fcntl.h.
+ * environ.cc (parse_options): rewrite struct known to conform
+ to ANSI standards. Can't statically initialize, so do so
+ dynamically at the beginning of the function instead.
+
+ patch from jeffdb@netzone.com (Mikey):
+ * dcrt0.cc (build_argv, compute_argc): need to escape quotes
+
+Sat Feb 28 16:41:54 1998 Geoffrey Noer <noer@cygnus.com>
+
+ patch from sos@prospect.com.ru (Sergey Okhapkin):
+ * fhandler.cc (fhandler_base::init): call set_flags based on
+ access arg.
+ * net.cc: include fcntl.h
+ (fhandler_socket::fhandler_socket): made sockets O_RDWR
+
+Thu Feb 26 23:41:54 1998 Geoffrey Noer <noer@cygnus.com>
+
+ Beta 19 release made.
+
+Sun Feb 22 23:46:31 1998 Geoffrey Noer <noer@cygnus.com>
+
+ patch from sos@prospect.com.ru (Sergey Okhapkin):
+ * Makefile.in: Do not link cygwinb19.dll with libwsock32.a
+ * exceptions.cc: add proto for i_WSACleanup.
+ (sig_handle): call *i_WSACleanup if winsock was inited.
+ * hinfo.cc: add proto for i_getpeername.
+ (hinfo_vec::build_fhandler): call *i_getpeername if winsock
+ was inited
+ * net.cc: wsock32, i_wsockimports - new globals. Throughout
+ file, call winsock functions via indirect pointers.
+ (winsock_init): dynamically load wsock32.dll and resolve addresses
+ of exports.
+ (cygwin32_rcmd, cygwin32_rexec, cygwin32_rresvport): resolve
+ addresses of exports.
+ * select.cc: add protos for i___WSAFDIsSet, i_WSAGetLastError,
+ i_select, i_socket, i_closesocket. WINSOCK_FD_ISSET changed to
+ use indirect pointer. Direct winsock calls changed to indirect.
+ (cygwin32_select): initialize winsock before calling select in
+ degenerate case.
+ * winsup.h: remove protos for ScreenRows, ScreenCols,
+ ScreenGetCursor, ScreenSetCursor.
+
+Sun Feb 22 17:44:55 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * environ.cc (parse_options): comment out -- no longer
+ compiles with egcs. Will rewrite/enable later.
+
+Sun Feb 22 13:49:10 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * syscalls.h: remove protos for _open, _read, _write since
+ they are in newlib headers that are already included
+ * syscalls.cc (_read): return int, not ssize_t
+ (_write): ditto
+
+Sat Feb 21 14:21:17 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * Makefile.in: rename dll to cygwindevo.dll
+
+Sat Feb 21 01:33:56 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * cygwin.din: remove dup definition of endpwent
+
+Thu Feb 19 14:20:21 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * include/cygwin32/cygwin_dll.h: Correct protection wrapper
+
+Tue Feb 17 20:21:24 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * include/Windows32/Structures.h: tagBITMAPFILEHEADER should
+ be packed.
+
+Tue Feb 17 19:34:41 1998 Geoffrey Noer <noer@cygnus.com>
+
+ patch from cgf@bbc.com (Christopher Faylor):
+ * cygwin.din: export sigpause
+ * signal.cc (sigpause): New "compatibility interface" to
+ sigsuspend function. Used currently by inetutils.
+
+Tue Feb 17 11:43:27 1998 Ian Lance Taylor <ian@cygnus.com>
+
+ * tty.h (class tty): Add slave_opened field.
+ * tty.cc (fhandler_tty_master::init): Initialize slave_opened.
+ (do_output): Only return with EOF if the slave has been opened.
+ (fhandler_tty_slave::open): Set slave_opened.
+ (fhandler_pty_master::open): Initialize slave_opened.
+
+ * tty.cc (fhandler_pty_master::read): Change type of n to DWORD.
+ If there are no characters to read, and the descriptor is in
+ nonblocking mode, just return EGAIN.
+
+Mon Feb 16 15:11:25 1998 Ian Lance Taylor <ian@cygnus.com>
+
+ * tty.h (class tty): Remove handle_pid and slave_handles fields.
+ (class tty_list): Add getcount method.
+ * tty.cc (tty::init): Initialize input_handle and output_handle.
+ (tty_list::free_tty): If we just freed the last reference to this
+ tty, close input_handle and output_handle.
+ (fhandler_tty_master::init): Don't initialize handle_pid and
+ slave_handles.
+ (do_output): Instead of just calling ReadFile, loop using
+ PeekNamedPipe and check whether the tty has been closed. Return 0
+ on EOF and -1 on error.
+ (process_output): Only print debugging error message if error
+ occurs in do_output.
+ (fhandler_tty_slave::open): Always duplicate handles from master.
+ Never close handles in source. Don't change slave_handles.
+ (fhandler_tty_slave::close): Don't change slave_handles, and don't
+ close tty handles.
+ (fhandler_tty_slave::linearize): Call attach_tty.
+ (fhandler_tty_slave::de_linearize): Don't call attach_tty.
+ (fhandler_tty_slave::dup): Don't increment slave handles.
+ (fhandler_pty_master::open): Don't initialize handle_pid and
+ slave_handles.
+ (fhandler_pty_master::close): Don't check slave_handles, and don't
+ close tty handles.
+ (fhandler_pty_master::read): Handle EOF return value from
+ do_output.
+ (fhandler_pty_master::linearize): Call attach_tty.
+ (fhandler_pty_master::de_linearize): Don't call attach_tty.
+
+ * fork.cc (cygwin_fork_helper1): Copy strace_mask from parent to
+ child.
+
+Thu Feb 12 20:33:57 1998 Geoffrey Noer <noer@cygnus.com>
+
+ patch from cgf@bbc.com (Christopher Faylor):
+ * utils/cygwin.cc: Modify -s option to use new strace_mask entry
+ in pinfo. Prepare for future ability to specify an strace file.
+
+Thu Feb 12 11:57:26 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * grp.cc (read_etc_group): add a default /etc/group in memory
+ if /etc/group isn't found
+ (getgrnam): return NULL if requested group isn't found instead
+ of returning a default group
+
+Wed Feb 11 15:59:10 1998 Geoffrey Noer <noer@cygnus.com>
+
+ patch from sos@prospect.com.ru (Sergey Okhapkin):
+ * strace.cc (strace_open): do not close u->strace_file if it
+ points to stderr.
+ * malloc.cc (malloc_init): do not check for application's malloc
+ in a forkee, this breaks memory coherency in a forkee and forker.
+ use_internal_malloc flag now copies on fork.
+
+Tue Feb 10 18:11:30 1998 Geoffrey Noer <noer@cygnus.com>
+
+ patch from cgf@bbc.com (Christopher Faylor)
+ Throughout sources, mark statics and globals as NO_COPY where
+ appropriate.
+ * fork.cc (cygwin_fork_helper1): Remove #if 0 around fork_copy of
+ cygwin data/bss. Remove __malloc_copy since it is no longer
+ necessary.
+
+Tue Feb 10 15:30:19 1998 Geoffrey Noer <noer@cygnus.com>
+
+ patch from cgf@bbc.com (Christopher Faylor)
+ * console.cc (fhandler_console::write): Implement xterm style
+ escape sequences for setting title in the console title bar.
+ * fhandler.h: Define constants for console title escape sequence.
+
+Tue Feb 10 14:16:17 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * include/a.out.h: remove junk chars introduced by mailer
+ when this header was sent to us
+
+ patch from sos@prospect.com.ru (Sergey Okhapkin):
+ * libccrt0.cc: rename cygwin_attach_dll to cygwin32_attach_dll
+
+ patch from cgf@bbc.com (Christopher Faylor):
+ * environ.cc: fix off by one problem
+
+Mon Feb 9 14:56:00 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * Makefile.in: add registry.h to environ.o deps
+
+Mon Feb 9 14:42:24 1998 Ian Lance Taylor <ian@cygnus.com>
+
+ * Makefile.in (DLL_OFILES): Rename dllinit.o to dll_init.o.
+
+ * tty.cc (fhandler_tty_slave::close): Don't close the tty handles
+ if the slave and the master are the same process.
+
+ * path.cc (read_mounts): Change key parameter to reference, to
+ avoiding running the destructor.
+
+Mon Feb 9 13:53:50 1998 Geoffrey Noer <noer@cygnus.com>
+
+ patch from cgf@bbc.com (Christopher Faylor):
+ Moves all environment manipulation into environ.cc.
+ Switches to CYGWIN32 for settings:
+ set CYGWIN32=[no]title [no]strip_title [no]binmode [no]glob
+ strace=mask:cache,file [no]tty
+ (set STRACE=whatever is still honored).
+ Propagates tty settings to all subprocesses regardless of
+ unsetting of environment variable.
+ Moves strace mask into pinfo structure for easier future
+ manipulation by external program. Moves strace_file into the
+ vacated position for automatic use in forked processes.
+ Propagates old title to execed processes so that they can
+ correctly restore the correct title when they exit.
+ * console.cc: Use PID_USETTY setting in process_state so that
+ tty state can be easily inherited.
+ (set_console_title): New function to set console title.
+ * syscalls.cc: Use PID_USETTY setting in process_state so that
+ tty state can be easily inherited.
+ * tty.cc: Ditto.
+ * hinfo.cc: Ditto.
+ (hinfo_vec::de_linearize_fd_array): Return last location in buffer
+ for further potential processing.
+ * dcrt0.cc: Add global variables for control of glob and title,
+ set by environ_init. Mark some variables as NO_COPY.
+ Remove routines and variables for dealing with environment.
+ (dll_crt0_1): Move environment initialization into separate
+ function. Honor 'noglob' CYGWIN32 setting.
+ * environ.cc (environ_init): New function to initialize the
+ environ table. Also scans for CYGWIN32 environment variable,
+ setting appropriate values.
+ (ucenv): New function. Upper cases an environment variable.
+ (parse_options): New function. Parse CYGWIN_* environment
+ variable.
+ (posify): New function. Convert a Windows env path spec to
+ cygwin.
+ (env_sort): New function. Sort an environ block.
+ (winenv): New function. Returns a windows style environment
+ block.
+ * fhandler.cc (fhandler_base::read): Reflect change to location of
+ strace_mask.
+ * fork.cc (cygwin_fork_helper1): Remove save/restore of some
+ settings since this is automatic now with new dll data copy. Save
+ PID_USETTY setting in child process_state.
+ * strace.h: Cosmetic change.
+ * pinfo.cc (pinfo_init): Call environ_init here since it may
+ affect further processing in this function. Use old console title
+ from "parent" process if execed process. Reflect change to
+ location of strace_mask.
+ * spawn.cc (spawn_guts): Remove environment manipulation code.
+ Use new winenv function call instead. Save old title in block of
+ memory copied to newly execed process if title is being displayed.
+ * strace.cc: Changes to reflect new location for strace_mask and
+ strace_file. These are now automatically inherited on fork.
+ * winsup.h: Move strace_mask into pinfo to allow possible
+ manipulation by other processes. Put u->strace_file in uptr
+ structure so that it will be automatically duplicated on fork,
+ removing the necessity of initializing strace in a forked
+ process. Add functions/variables associated with environment
+ manipulation and console title setting.
+
+Mon Feb 9 03:06:56 1998 Geoffrey Noer <noer@cygnus.com>
+
+ Extensive reformatting in new files from next patch.
+ Rename dllinit.h file to dll_init.h and likewise for dll_init.cc.
+ Rename cygwin_detach_dll to cygwin32_detach_dll throughout.
+ Similarly, rename cygwin_attach_dll and _cygwin_dll_entry.
+ And rename sanityAndSyncCheck to check_sanity_and_sync.
+ Also:
+ * dll_init.h: don't include winsup.h
+ * dll_init.cc: include winsup.h here instead
+ * dlfcn.cc: include winsup.h, don't include windows.h
+ * cygwin.din: rename cygwin_detach_dll to cygwin32_detach_dll.
+
+ patch from giac@dalim.de (Philippe Giacinti):
+ Copy data areas of cygwin-compiled dlls on fork(),
+ implement dlopen/dlsym/dlclose/dlerror calls.
+ * Makefile.in: add dlfcn.o and dllinit.o to DLL_OFILES, add
+ dllinit.h dependencies
+ * cygwin.din: dll_dllcrt0, cygwin_detach_dll, dlopen, dlclose,
+ dlsym, dlerror, dlfork -- new exports.
+ * dcrt0.cc: include dllinit.h, mark u pointer as NO_COPY.
+ (sanityAndSyncCheck): new, code moved from dll_crt0_1.
+ Initialize all linked dlls before calling main().
+ * dlfcn.cc: new file.
+ * dllinit.cc: new file.
+ * dllinit.h: new file.
+ * exceptions.cc: mark some variables with NO_COPY.
+ * fork.cc: include dllinit.h; declare cygwin.dll data/bss
+ start/end.
+ (cygwin_fork_helper1): copy data/bss of cygwin.dll itself to child
+ process (the code is disabled now); copy data areas of
+ linked/loaded dlls (if any); free loaded dll list on cleanup.
+ * include/cygwin32/cygwin_dll.h: new file.
+ * include/dlfcn.h: new file.
+ * libccrt0.cc (cygwin_crt0_common): new, code derived from
+ cygwin_crt0, MainFunc parameter added.
+ (cygwin_crt0): call cygwin_crt0_common.
+ (cygwin_attach_dll): new.
+ * shared.cc: mark some data as NO_COPY
+ * strace.cc: mark some data as NO_COPY
+ * winsup.h: add dll_dllcrt0 proto, NO_COPY macro.
+
+Sun Feb 8 17:51:26 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * getopt.c: new. Import Berkeley getopt code modified for use
+ in Cygnus' kerberos implementation (including the writing of
+ getopt_long by Chris Provenzano (proven@cygnus.com)) then modified
+ a bit more to get it working in Cygwin32. Although we were
+ going to remove getopt, it appears that too many programs would
+ need fixing to remove it completely. Whether getopt should be
+ included in Cygwin32 should be decided at a later time.
+ * include/getopt.h: new. Import Berkeley getopt.h.
+ * Makefile.in: add getopt.o to LIBCOS
+ * utils/Makefile.in: remove include of ../../include since
+ getopt.h is now in winsup/include, also revert recent change
+ of addition of GETOPT_OBJS.
+
+Fri Feb 6 16:28:19 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * cygwin.din: remove set_new_handler and cygwin_set_attributes
+ exports
+ * version.h: up major version number
+ * Makefile.in: rename dll to cygwinb19.dll
+ * syscalls.cc (cygwin_set_attributes): axe
+
+Thu Feb 5 18:28:37 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * include/Windows32/Functions.h: add protos for
+ DdeCmpStringHandles and DdeCreateDataHandle
+ * Makefile.in: stop including ../libiberty/getopt* since
+ we aren't exporting or using them
+ * utils/Makefile.in: add new variable for libiberty getopt objs
+ which is linked in for cygwin.exe
+
+Thu Feb 5 17:59:12 1998 Geoffrey Noer <noer@cygnus.com>
+
+ syscalls.cc: move ppc dll_entry asm code to...
+ dcrt0.cc: ...here
+
+ Import new globbing code from NetBSD 1.3
+ * glob: delete subdirectory
+ * glob.c: new file
+ * glob.h: new file
+ * Makefile.in: remove glob from submakes, remove glob/libglob.a
+ from DLL_IMPORTS, fix dcrt0 glob.h dependency
+ * configure.in: don't configure glob subdirectory
+ * configure: regenerate
+ * dcrt0.cc: include glob.h, not glob/glob.h.
+ (globify): don't call glob with GLOB_NOESCAPE which isn't a valid
+ flag with this glob
+
+Wed Feb 4 16:14:13 1998 Geoffrey Noer <noer@cygnus.com>
+
+ patch from sos@prospect.com.ru (Sergey Okhapkin):
+ Allow system administrator to enter into the HKLM registry tree
+ a predefined mount table inherittable by all cygwin users. The
+ predefined mounts are non-mandatory so the user's mount table has
+ a higher priority than the default one. Cygwin reads HKLM tree
+ in read-only mode.
+ * path.cc (read_mounts): new, code derived from
+ mount_info::from_registry().
+ (mount_info::from_registry): call read_mounts from user's table,
+ then from system-wide mount table.
+ * registry.cc (reg_session::reg_session): key and access arguments
+ added.
+ (reg_key::init): access argument added.
+ (reg_key::reg_key): access argument added.
+ * registry.h (class reg_key): init prototype changed, default
+ argument of reg_key added.
+ (class reg_session): default arguments of constructor added.
+
+Wed Feb 4 15:38:59 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * include/a.out.h: new coff header file
+
+Wed Feb 4 01:55:18 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * uinfo.cc: define DEFAULT_UID/GID here
+ * winsup.h: removed DEFAULT_UID/GID defs and unused
+ set_console_title proto. Did some major reorganizing,
+ and a little reformatting, commenting.
+
+Tue Feb 3 23:59:23 1998 Geoffrey Noer <noer@cygnus.com>
+
+ patch from cgf@bbc.com (Chris Faylor):
+ Replace u->self and this_procinfo () with new `myself' pointer
+ wherever appropriate. Also replace get_pid() calls with a
+ simple ->pid reference.
+
+Mon Feb 2 12:34:49 1998 Geoffrey Noer <noer@cygnus.com>
+
+ patch from sos@prospect.com.ru (Sergey Okhapkin):
+ * console.cc (FakeReadFile): limit bytes to read to 30000 due to
+ Win NT 4.0 SP3 bug. Kill foreground process group with SIGWINCH
+ on console buffer size change if tty support enabled.
+ * include/sys/termios.h: define more constants.
+ * tty.cc (fhandler_pty_master::ioctl): kill foreground process
+ group with SIGWINCH on window resizing.
+
+Mon Feb 2 12:14:49 1998 Geoffrey Noer <noer@cygnus.com>
+
+ patch from cgf@bbc.com (Chris Faylor):
+ * dcrt0.cc (dll_crt0_1): Initialize u->self here, early in a
+ forked process so the correct pid is used in strace output and so
+ signals do not end up being erroneously sent to the parent.
+ * exceptions.cc: Make a global variable static. Some minor
+ optimizations.
+ (call_handler): Make sure that the signal mask is restored when
+ sig_dispatch mutex is unavailable.
+ Reorder asm statements to prevent clobbering of flags register by
+ preceding ors or risk random inexplicable behavior when returning
+ from a signal handler.
+ * fork.cc (cygwin_fork_helper1): Put setjmp restore in child's
+ pinfo. Have the child figure out its pid earlier in the
+ initialization process. Don't print a "child failed" error if the
+ child failed during initialization due to a CTRL-C. This is still
+ not quite right (see comment).
+ * sigproc.cc (sig_send): Remove unlock/lock_pinfo or suffer
+ consistent hangs in zsh. Make {allow,block}_sig_dispatch globally
+ available.
+ (wait_sig): Fix problem where blocked signals would still be
+ processed if queued. Add debugging SIGNOQUEUE conditional to turn
+ off signal queueing, making cygwin more like traditional UNIX.
+ * sigproc.h: Add {allow,block}_sig_dispatch functions.
+
+Mon Jan 26 17:33:57 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * path.cc (mount_info::init): don't hardcode C: as the default
+ slash mount. Instead, use the drive letter that the OS is loaded
+ on.
+
+Mon Jan 26 13:33:57 1998 Geoffrey Noer <noer@cygnus.com>
+
+ patch from cgf@bbc.com (Chris Faylor):
+ * fork.cc (cygwin_fork_helper): Move setting PID_INITIALIZING
+ process_state here to avoid erroneously setting it permanently
+ via proc_register().
+ * pinfo.cc (pinfo_init): Delay notifying "parent" when execing
+ until this process is ready to receive signals or risk a race
+ condition if exec parent calls sigproc_terminate prior to
+ the child exec.
+ * sigproc.cc (proc_subproc): Don't set PID_INITIALIZING here.
+ It is too late in the process creation.
+ (sig_send): Reset sigsuspend mutex prior to use to avoid a race.
+ (wait_sig): Create sigsuspend mutex as an auto reset to attempt
+ to avoid a race condition. Notify parent that this process is
+ ready if we were execed (code moved from pinfo_init). Change
+ PulseEvents to SetEvents to avoid races
+ * spawn.cc (spawn_guts): Move setting PID_INITIALIZING
+ process_state here to help avoid race.
+
+Fri Jan 23 12:31:37 1998 Ian Lance Taylor <ian@cygnus.com>
+
+ * malloc.cc (malloc_critical_section): New static variable.
+ (malloc_init): New function.
+ (__malloc_lock, __malloc_unlock): New functions.
+ * winsup.h (malloc_init): Declare.
+ * heap.cc (heap_init): Call malloc_init.
+
+Thu Jan 22 18:46:40 1998 Ian Lance Taylor <ian@cygnus.com>
+
+ * tty.h (class tty): Change slave_handles to int.
+ * tty.cc (fhandler_tty_slave::open): Check for invalid tty
+ handles. If this is the first slave, set slave_handles to 2;
+ otherwise, increment slave_handles.
+ (fhandler_tty_slave::close): Only close the tty handles if the
+ slave_handles field drops to 1.
+ (fhandler_tty_slave::write): Add a debugging message if WriteFile
+ fails.
+ (fhandler_tty_slave::dup): Set ttynum of new fhandler. Increment
+ slave_handles if appropriate.
+ (fhandler_pty_master::close): Only close the tty handles if the
+ tty is no longer allocated.
+
+ * tty.h (class tty): Add handle_pid and slave_handles fields.
+ * tty.cc (attach_tty): Call connect_tty even if use_tty is not
+ set.
+ (detach_tty): Don't check use_tty.
+ (fhandler_tty_master::init): Initialize handle_pid and
+ slave_handles of tty.
+ (do_input): Treat \r as end of line character.
+ (do_output): Only set output_done_event if it is not NULL.
+ (fhandler_tty_slave::open): Don't worry if we can't open
+ output_done_event. Check slave_handles field of tty to decide
+ from where to duplicate the handles. Call detach_tty on error.
+ If we are now the owner of the slave handles, mark the tty
+ appropriately.
+ (fhandler_tty_slave::close): Only close output_done_event if it is
+ not NULL. Check for errors from CloseHandle. Close the tty
+ handles if we own them.
+ (fhandler_tty_slave::write): Only wait for output_done_event if it
+ is not NULL.
+ (fhandler_tty_slave::read): If nobody owns the tty, return EOF.
+ (fhandler_tty_slave::dup): Attach the tty. Don't duplicate
+ output_done_event if it is NULL. Detach the tty on error.
+ (fhandler_pty_master::open): Initialize handle_pid and
+ slave_handles of tty. Don't create output_done_event.
+ (fhandler_pty_master::close): Only close output_done_event if it
+ is not NULL. Check for errors from CloseHandle. Only close the
+ tty handles if we own them.
+ (fhandler_pty_master::read): Only set output_done_event if it is
+ not NULL.
+ * hinfo.cc (de_linearize_fd_array): Don't set use_tty just because
+ we find a tty to delinearize.
+
+Wed Jan 21 21:58:27 1998 Geoffrey Noer <noer@cygnus.com>
+
+ patch from cgf@bbc.com (Chris Faylor):
+ * sigproc.cc: Changes in wait_sig/sig_send semaphore/event
+ signaling to attempt to eliminate races.
+
+Tue Jan 20 16:11:05 1998 Geoffrey Noer <noer@cygnus.com>
+
+ Remove last remnants of the mixed case handling support.
+ * path.cc (path_conv::path_conv): remove mixed_p init
+ (mount_info::from_registry): don't check for fmixed
+ (mount_info::to_registry): ditto
+ (mount_item::getmntent): when setting ret.mnt_opts, only consider
+ text vs binary flag
+ (mount_item::init): remove init of mixed
+ * path.h: remove mixed_p, mixed from path_conv class. Remove
+ unmixedcaseify proto.
+ * include/sys/mount.h: comment out MOUNT_MIXED define, protect
+ header against multiple inclusion
+
+ A little header file cleanup. Mostly to protect headers against
+ multiple inclusion. Some aren't strictly speaking necessary but...
+ * include/sys/cygwin.h: protect header against multiple inclusion
+ * include/sys/smallprint.h: ditto, also add cplusplus wrapper
+ * include/sys/strace.h: comment last endif
+ * include/cygwin32/in.h: change _LINUX_IN_H protect defines
+ to _CYGWIN32_IN_H
+ * include/arpa/inet.h: protect header against multiple inclusion
+ * include/asm/types.h: ditto
+ * include/net/if.h: ditto
+ * include/netinet/ip.h: ditto
+ * include/netinet/ip_icmp.h: ditto
+ * include/netinet/in.h: ditto, remove commented out real header
+ file
+ * include/fcntl.h: protect header against multiple inclusion
+ * include/memory.h: ditto
+ * include/mntent.h: ditto
+ * include/strings.h: ditto
+ * include/syslog.h: ditto
+ * include/termio.h: ditto
+
+Tue Jan 20 12:51:59 1998 Ian Lance Taylor <ian@cygnus.com>
+
+ * strace.cc (strace_stderr): New static variable.
+ (strace_init): Set strace_stderr.
+ (system_printf): If not strace_stderr, use debug_printf to put the
+ message in a trace file.
+
+ * fhandler.h (fhandler_pty_master): Add neednl_ field.
+ * tty.h (RESTART_OUTPUT_EVENT): Change to be different from
+ IOCTL_DONE_EVENT.
+ * tty.cc (fhandler_tty_master::init): Initialize neednl_.
+ (do_output): Handle a length of one by using neednl_ to record an
+ expansion of \n to \r\n which doesn't fit. Never expand \r to
+ \r\n. Correct order of \r\n.
+ (fhandler_tty_slave::open): Improve error handling. Use
+ DUPLICATE_CLOSE_SOURCE to close the pipes in the master process.
+ (fhandler_tty_slave::dup): Duplicate the handles, rather than
+ calling fhandler_tty_slave::open.
+ (fhandler_pty_master::open): Initialize neednl_.
+ (fhandler_pty_master::read): Return EOF for ERROR_BROKEN_PIPE,
+ rather than error. Set errno correctly.
+ * hinfo.cc (digits): New static function.
+ (build_fhandler): Always accept /dev/ptmx and /dev/ttyDDD, even if
+ use_tty is not set. use_tty now only controls the interpretation
+ of /dev/tty.
+
+Mon Jan 19 14:49:45 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * sigproc.cc (sig_send): lock_pinfo_for_update during this
+ function
+
+Fri Jan 16 18:09:59 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * sigproc.cc (sigproc_init): if we can't create a signal
+ thread or can't create sync_proc_subproc mutex, fail with
+ an api_fatal call rather than just returning
+
+Fri Jan 16 18:08:49 1998 Geoffrey Noer <noer@cygnus.com>
+
+ patch from cgf@bbc.com (Chris Faylor):
+ Changed signal handling to use one semaphore and one shared
+ memory array which is manipulated via Interlocked*() functions.
+ * exceptions.cc (lock_cs): Comment. Report on error.
+ (unlock_cs): Add debugging statement.
+ (sig_dispatch_pending): Remove obsolete function.
+ (set_process_mask): Adapt to new signal method.
+ (call_handler): Clear wait()ing threads here while main thread is
+ suspended to avoid timing screwups. Avoid calling the handler if
+ can't get dispatch mutex (code moved from sig_handle). Return
+ status of acquiring the sig_dispatch mutex.
+ (sighandle): Adapt to new signal method. Reorganize to *always*
+ honor sig_dispatch mutex or suffer deadlock on fatal signals when
+ someone else has the mutex and we're attempting to cleanup.
+ (events_init): Reflect change in cygname() arguments.
+ * fork.cc (stack_dummy): New function. Returns address of
+ argument to determine bounds for eventual stack copy.
+ (cygwin_fork_helper1): Call subproc_init to start up subproc
+ thread if it is not alreay started. Ensure that signals are
+ blocked while forked process is initializing. Change method of
+ calculation for lower stack bounds to slightly more foolproof
+ method. Preserve some global settings in forked process.
+ * misc.cc (cygname): Remove an unused argument.
+ * pinfo.cc (pinfo_list::allocate_pid): Add a useful debugging
+ statement.
+ * shared.cc (open_shared_file_map): Reflect change in cygname()
+ arguments.
+ * signal.cc (kill_pgrp): Avoid killing dead processes. Don't
+ kill processes in my pgrp if not also in my ctty.
+ (sigaction): Adapt to new signal method.
+ (sigpending): Adapt to new signal method.
+ * sigproc.cc: Many changes to adapt to new signal method. Also
+ delay waits for thread initialization until the thread needs to be
+ contacted.
+ * sigproc.h: Ditto.
+ * spawn.cc (spawn_guts): Fix potential off-by-one error(?) in
+ transcribing the argument list and add paranoid code to detect
+ future overruns. Change priority to highest so that waiting
+ process will clear out quickly.
+ (_spawnve): Call subproc_init() to start up subproc thread if is
+ not already started.
+ * strace.cc (strace_printf): Increase size of internal buffer so
+ that long argument lists printed from spawn_guts do not overrun it
+ so easily.
+ * wait.cc (wait4): Set status flag to -1 prior to exit. This will
+ cause previous wait that was interrupted by a signal which
+ dispatched to another wait to return the correct error value.
+ * winsup.h (pinfo): Add _sigtodo array for new signal method.
+ Remove obsolete field. Reflect change in cygname arguments.
+
+Thu Jan 15 13:07:07 1998 Ian Lance Taylor <ian@cygnus.com>
+
+ * syscalls.cc (mkdir): Don't permit the directory to be created if
+ the parent directory is not writable.
+
+ * syscalls.cc (fchmod): Call chmod with the path name, rather than
+ just returning zero.
+
+ * syscalls.cc (writable_directory): New static function.
+ (_unlink): Don't permit the file to be removed if the directory is
+ not writable.
+ (rename): Don't permit the rename if either the source or
+ destination directory is not writable.
+
+ * syscalls.cc (chown): Set username and groupname lengths to UNLEN
+ + 1, rather than 100. If getpwuid fails, try to look up the real
+ user name to see if it is the same. Don't report an error if
+ there is no security mapping.
+
+Wed Jan 14 15:34:20 1998 Ian Lance Taylor <ian@cygnus.com>
+
+ * syscalls.cc (setegid): New function which just returns ENOSYS.
+ (chroot): Likewise.
+ * cygwin.din: Export setegid, _setegid, chroot, and _chroot.
+
+ * syscalls.cc (setmode): Rename from _setmode. Change to return
+ the old mode. Remove old setmode function.
+ * cygwin.din: Make _setmode an alias for setmode.
+
+Wed Jan 14 14:46:00 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * Makefile.in: don't strip cygwin.dll by default
+ * winsup.h: minor reformatting, removed/reworded some comments
+
+Mon Jan 12 13:53:03 1998 Geoffrey Noer <noer@cygnus.com>
+
+ patch from cgf@bbc.com (Chris Faylor):
+ Speed up cygwin pid calculation by staying in the range
+ 1000 through (1000 + PSIZE - 1).
+ * pinfo.cc (pinfo_list::init): Change to reflect new pid
+ calculation method.
+ (pinfo_list::operator []): Ditto.
+ (pinfo_list::allocate_pid): Ditto.
+ * winsup.h (pinfo): Move pid and ppid into non-zeroed region since
+ they are always set by allocate_pid.
+ (pinfo_list): Change pid_base to next_pid_index to reflect new pid
+ calculation method.
+ (PBASE): New constant for new pid calcuation method.
+
+Sat Jan 10 12:06:38 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * syscalls.cc (process_deletion_queue): remove wrapper function
+ (close_all_files): call s->delqueue.process_queue instead of
+ going through wrapper.
+ * fhandler.cc (fhandler_base::close): call
+ s->delqueue.process_queue instead of using above wrapper.
+ * winsup.h: remove process_deletion_queue proto
+ * delqueue.h: up MAX_DELQUEUES_PENDING to 100 for now. Rename
+ v to dqueue for clarity.
+ * delqueue.cc: v renamed to dqueue throughout. Add FIXME
+ describing why this whole delqueue system needs rewriting.
+
+Fri Jan 9 13:18:44 1998 Geoffrey Noer <noer@cygnus.com>
+
+ Remove some historical baggage:
+ * syscalls.cc (cygwin_set_attributes): remove commented-out code,
+ add FIXME since this function should go away next time an
+ incompatible change to cygwin.din is made. Stop including
+ include/sys/cygwin.h.
+ * include/sys/cygwin.h: remove cygwin_set_attributes proto.
+ Remove CYGWIN_FMODE_ALL_BINARY define.
+ * hinfo (hinfo_vec::init_std_file_from_handle): remove old
+ commented-out code
+ * path.cc (unmixedcaseify): delete commented-out function
+ (mixedcaseify): ditto
+ * strerror.cc (strerror): delete commented-out code section
+
+Tue Jan 6 18:51:40 1998 Geoffrey Noer <noer@cygnus.com>
+
+ patch from cgf@bbc.com (Chris Faylor):
+ Conform to POSIX method for sending SIGHUP to stopped processes.
+ * dcrt0.cc (do_exit): Use new kill_pgrp function to kill orphaned
+ children on group leader exit iff the children are stopped (per
+ POSIX).
+ * signal.cc (kill_worker): Negative signal now means to send
+ a SIGCONT after the signal, to wake up the target process.
+ (_kill): Break out pgrp handling into separate function.
+ (kill_pgrp): New function pulled from _kill to send signals
+ to processes in a given pgrp.
+
+Tue Jan 6 14:37:43 1998 Geoffrey Noer <noer@cygnus.com>
+
+ patch from cgf@bbc.com (Chris Faylor):
+ * fhandler.cc (fhandler_base::open): include
+ FILE_FLAG_BACKUP_SEMANTICS in file_attributes when file is
+ a directory. Allows opening of directory as a file. Allows
+ use of handle to perform some operations on both directories and
+ files.
+ (fhandler_base::fstat): Loop when attempting to get volume serial
+ number. Works around an apparent Windows NT 3.51 bug.
+ * times.cc (utimes): use FILE_FLAG_BACKUP_SEMANTICS flag
+ to allow accessing directory times (may only work under NT;
+ until now it didn't work under either OS).
+ * winsup.h: Add O_DIROPEN constant.
+
+Mon Jan 5 19:18:01 1998 Geoffrey Noer <noer@cygnus.com>
+
+ * Makefile.in: make winsup.h depend on winsup.h in accordance
+ with below
+
+ patch from cgf@bbc.com (Chris Faylor):
+ * {*.cc, *.h}: Remove include files already present in winsup.h.
+ Change empty function parameter lists to (void) where appropriate.
+
+ * fork.cc: Clean up include files. Minor change to CreateProcess
+ parameter list.
+ * signal.cc: Remove ifdef'ed stuff.
+ * smallprint.c: Add a necessary include file.
+ * winsup.h: Add a common include file. Add a function declaration
+ for kill_pgrp.
+
+Mon Jan 5 18:30:37 1998 Geoffrey Noer <noer@cygnus.com>
+
+ Fix spoofing of directory inodes.
+ * syscalls.cc (hash_path_name): instead of initializing the
+ hash to zero, take the value of the initial hash as a new
+ argument.
+ (_stat_worker): fix up hash_path_name reference in light of above
+ * dirsearch.cc (opendir): initialize dir->__d_dirhash to the
+ hash of the full directory name so readdir can make use of it.
+ (readdir): compute d_ino by combining the directory hash
+ calculated by opendir with the hash of the filename.
+ * fhandler.cc: fix up hash_path_name reference in light of above
+
+ * winsup.h: remove unnecessary protos for getkey, kbhit. Adjust
+ hash_path_name proto.
diff --git a/winsup/cygwin/ChangeLog-1999 b/winsup/cygwin/ChangeLog-1999
new file mode 100644
index 000000000..b459908d2
--- /dev/null
+++ b/winsup/cygwin/ChangeLog-1999
@@ -0,0 +1,3552 @@
+Sat Dec 25 12:46:25 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * dlfcn.cc (dlsym): Use correct HANDLE type for GetProcAddress.
+ (dlclose): Ditto for FreeLibrary.
+ * fhandler_windows.cc (fhandler_windows::set_close_on_exec): Properly
+ coerce arguments to set_inheritance.
+ (fhandler_windows::fixup_after_fork): Ditto for fork_fixup.
+ * libcmain.cc (main): Simplify.
+ * select.cc (peek_windows): Properly coerce argument to PeekMessage.
+
+Sat Dec 25 12:30:25 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * Makefile.in: Eliminate unneeded .y SUFFIX.
+ * dcrt0.cc (__api_fatal): Make "C".
+ (do_global_ctors): Make __stdcall.
+ (getprogname): Ditto.
+ (insert_file): Ditto.
+ (globify): Ditto.
+ (build_argv): Ditto.
+ (do_exit): Ditto.
+ * debug.cc (regthread): Ditto.
+ (makethread): Ditto.
+ (threadname): Ditto.
+ (find_handle): Ditto.
+ (handle_list): Ditto.
+ (add_handle): Ditto.
+ * debug.h: Reflect changes to __stdcall.
+ * shared.h: Ditto.
+ * winsup.h: Ditto.
+
+Sat Dec 25 12:09:10 1999 Kazuhiro Fujieda <fujieda@jaist.ac.jp>
+
+ * path.cc (symlink): Don't return error if target is a symlink to a
+ nonexistent file.
+
+1999-12-23 DJ Delorie <dj@cygnus.com
+
+ * Makefile.in: add support for "make check"
+ * shared.cc: if $CYGWIN_TESTING is set, use a private shared area
+ * cygrun.c: new, used to isolate dll-in-test
+ * testsuite/*: new, rudimentary testsuite framework
+
+Wed Dec 22 01:05:44 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * dcrt0.cc (globify): Properly handle embedded tildes in variable
+ names. Treat a c:\foo style path spec as "special", i.e., don't
+ interpret the backslashes as quoting characters.
+
+Fri Dec 17 10:49:13 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * path.cc (symlink): Return error if the target exists.
+
+Thu Dec 16 22:36:45 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * path.cc: Change method for accessing com in windows_device_names to
+ allow > 2 com ports.
+
+Thu Dec 16 00:49:30 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * Makefile.in: Only build winver.o and version.o when required.
+
+Sat Dec 11 11:06:45 1999 Corinna Vinschen <corinna@vinschen.de>
+
+ * path.cc (path_conv::path_conv): Ensure that a trailing slash is added
+ to "x:" specifications.
+
+Fri Dec 10 20:22:41 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * debug.cc (WFSO): Make __stdcall.
+ (WFMO): Ditto.
+ * debug.h: Reflect above changes.
+ * exceptions.cc (sig_set_errno): Set errno to be in effect after a
+ signal handler.
+ (handle_sigsuspend): Use set_sig_errno to ensure that the correct errno
+ is set after a signal handler.
+ (interrupt_now): Accomodate default errno field in stack.
+ (intterupt_on_return): Ditto.
+ (sigreturn): Pop, test, and possibly restore saved errno on return from
+ signal handler.
+ * fhandler_console.cc (fhandler_console::read): Set errno to be in
+ effect after a signal handler.
+ * fhandler_serial.cc (fhandler_serial::raw_read): Ditto.
+ * select.cc (cygwin_select): Ditto.
+ (select_stuff:wait): Ditto.
+ (peek_serial): Ditto.
+ * syscalls.cc (_read): Ditto.
+ * wait.cc (wait4): Ditto.
+ * winsup.h (signal_dispatch): Add "saved_errno" field.
+
+Thu Dec 9 23:35:45 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * debug.cc (threadname_init): Use new_muto macro to set up a static
+ buffer for a muto.
+ (debug_init): Ditto.
+ (WFSO): Reinstate wrapper for WaitForSingleObject.
+ (WFMO): Reinstate wrapper for WaitForMultipleObject.
+ * debug.h: Declare the above two wrappers.
+ * exceptions.cc (events_init): Use new_muto macro to set up a static
+ buffer for a muto.
+ * sigproc.cc (sigproc_init): Ditto.
+ * sync.cc (muto::acquire): Don't bump waiters if we already own the
+ muto.
+ * sync.h (new): New operator.
+ (delete): Ditto.
+ (new_muto): New macro.
+
+Dec 08 23:50:00 1999 Corinna Vinschen <corinna@vinschen.de>
+
+ * security.cc (get_nt_attribute): Add debug output. Correct behaviour
+ in case of NULL ACL.
+ * syscalls.cc (stat_worker): Allow remote drives to get stat info from
+ fh.fstat().
+ * include/winnt.h: Add defines for W2K ACL control flags.
+ * include/cygwin/socket.h: Add missing PF_NETBIOS.
+
+Wed Dec 8 23:06:07 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * Makefile.in: Ensure that winver.o is a dependency for building the
+ dll.
+ * mkvers.sh: Attempt to call windres in a fashion that accomodates
+ older and newer versions.
+ * winver.c: Reorganize slightly to accomodate older versions of
+ windres.
+ * fhandler.cc (fhandler_disk_file::fstat): Avoid using Windows "inodes"
+ on disks which do not support them.
+
+Tue Dec 7 21:15:11 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * dll_init.cc (DllList::forkeeLoadDlls): Reverse order of Free/Load
+ Library calls to ensure that references are resolved.
+ * path.cc (mount_info::conv_to_win32_path): Ensure that returned
+ windows paths are always normalized regardless of whether they were in
+ windows format to begin with.
+
+Tue Dec 7 08:48:22 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * environ.cc (parse_options): Properly detect end of known array.
+
+Mon Dec 6 22:32:04 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * mkvers.sh: Generate winver.o from winver.rc and various other things
+ from include/cygwin/version.h
+ * winver.rc: New file (adapted from donation by Mumit Khan
+ <khan@xraylith.wisc.edu>).
+ * configure.in: Find windres.
+ * configure: Regenerate.
+ * Makefile.in: Link winver.o into cygwin1.dll.
+
+Mon Dec 6 13:04:47 1999 Mumit Khan <khan@xraylith.wisc.edu>
+
+ * init.cc (dynamically_loaded): New global variable.
+ (dll_entry): Use.
+ * winsup.h (dynamically_loaded): Declare.
+ * dcrt0.cc (do_global_ctors): Likewise.
+ (set_os_type): Make static again.
+ (dll_crt0_1): Handle dynamically_loaded case.
+ * dll_init.cc (dll_dllcrt0_1): Delete.
+ (dll_dllcrt0): Handle dynamically_loaded case.
+ (dll_noncygwin_dllcrt0): Mark obsolescent.
+ * libccrt0.cc (cygwin_attach_noncygwin_dll): Delete.
+ * pinfo.cc (pinfo_init): Don't inherit parent fds if dynamically
+ loaded.
+ * include/cygwin/cygwin_dll.h (cygwin_attach_noncygwin_dll): Delete
+ prototype.
+ (_cygwin_noncygwin_dll_entry): Mark obsolescent.
+
+Mon Dec 6 11:09:41 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * configure.in: Make threadsafe the default.
+ * configure: regenerate.
+ * utils/strace.cc: Fix a compiler warning.
+
+Sun Dec 5 15:49:43 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * environ.cc (parse_options): Reinstate unions in parse_things, to
+ save space.
+
+Fri Dec 3 22:52:05 1999 Christopher Faylor <cgf@cygnus.com>
+
+ Implement new signal-handling scheme which ensures that a program will
+ not be interrupted while in a system or cygwin DLL.
+ * Makefile.in: Add sync.o and dll_ofiles target.
+ * dcrt0.cc (alloc_stack_hard_way): Add more defensive code to ensure
+ that the stack is really grown.
+ (alloc_stack): Ditto.
+ (dll_crt0_1): Reorganize some initialization routines to ensure that
+ they occur after the heap has been initialized.
+ * debug.cc: Use muto for locks. Eliminate attempts to avoid being
+ interrupted by signals.
+ (threadname_init): New function.
+ (debug_init): Ditto.
+ * debug.h: Declare debug_init and threadname_init.
+ * exceptions.cc (stack_info::stack_info): Don't check for previous use
+ of get().
+ (handle_sigsuspend): Simply using new signal-handling scheme.
+ (interruptible): New function. Determines if PC should be interrupted.
+ (interrupt_now): New function. Causes immediate signal dispatch.
+ (interrupt_on_return): New function. Causes signal dispatch on return
+ from cygwin or system routine.
+ (call_handler): Simplify to use new signal-handling scheme.
+ (set_process_mask): Use mask_sync muto to synchronize setting of
+ process signal mask.
+ (sig_handle_tty_stop): New function. Called when have to stop process
+ now.
+ (sig_handle): Simplify to use new signal-handling scheme.
+ (set_process_mask): Ditto.
+ (events_init): Allocate mask_sync muto.
+ (unused_sig_wrapper): New function. Encapsulates assembly language
+ signal handling support.
+ * fhandler.h (class select_stuff): Accomodate new signal-handling
+ scheme.
+ * fhandler_console.cc (fhandler_console): Simplify to use new
+ signal-handling scheme.
+ * fhandler_serial.cc (fhandler_serial::raw_read): Ditto.
+ * fhandler_termios.cc (bg_check): Ditto.
+ * fhandler_tty.cc (process_input): Ditto.
+ (fhandler_tty_slave::open): Ditto.
+ (fhandler_tty_slave::send_ioctl_request): Ditto.
+ * fork.cc: Ditto.
+ * path.cc (chdir): Ditto.
+ * select.cc: Ditto, throughout.
+ * shared.h: Eliminate unneeded signal enum.
+ * signal.cc (signal): Simplify to use new signal-handling scheme.
+ (sleep): Ditto.
+ (usleep): Ditto.
+ (sigprocmask): Ditto.
+ (sigaction): Ditto.
+ (pause): Use handle_sigsuspend to pause for signal.
+ * sigproc.cc: Change signal_arrived handle to global_signal_arrived
+ class. Change various mutex handles to mutos.
+ (proc_subproc): Simplify to use new signal-handling scheme. Use muto
+ for locking.
+ (get_proc_lock): Ditto.
+ (proc_terminate): Ditto.
+ (sig_dispatch_pending): Make a "C" function. Return status of pending
+ signals.
+ (sigproc_init): Initialize global_signal_arrived. Simplify to use new
+ signal-handling scheme. Initialize sync_proc_subproc muto.
+ (sig_send): Eliminate __SIGSUSPEND considerations. Simplify to use new
+ signal-handling scheme.
+ (__allow_sig_dispatch): Delete.
+ (__block_sig_dispatch): Delete.
+ (__get_signal_mutex): Delete.
+ (__release_signal_mutex): Delete.
+ (__have_signal_mutex): Delete.
+ (wait_sig): Simplify to use new signal-handling scheme.
+ * sigproc.h: Implement signal_arrived classes.
+ * smallprint.c (__small_vsprintf): Avoid printing a leading '*' in
+ function name with %F format.
+ * spawn.cc (spawn_guts): Simplify to use new signal-handling scheme.
+ (iscmd): Don't consider a filename to be a "command" unless it contains
+ a ':'.
+ * syscalls.cc (_read): Ditto.
+ (_open): Ditto.
+ (_close): Ditto.
+ * termios.cc (tcsendbreak): Ditto.
+ (tcdrain): Ditto.
+ (tcflush): Ditto.
+ (tcflow): Ditto.
+ (tcsetattr): Ditto.
+ (tcgetattr): Ditto.
+ * winsup.h: Reorganize include files. Add preliminary __sig_protect
+ implementation.
+ * cygwin/version.h: Bump current version to 1.1.0.
+
+Thu Dec 2 22:19:40 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * sync.cc (muto::muto): Use an event rather than a semaphore for wait
+ synchronization.
+ (muto::acquire): Rewrite to use an event and try to remove races.
+ (muto::release): Ditto.
+
+1999-12-02 DJ Delorie <dj@cygnus.com>
+
+ * environ.cc (parse_options): switch to a static initializer;
+ templates are sensitive to g++ bugs.
+
+Fri Nov 26 12:04:23 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * net.cc (cygwin_bind): Ensure that non-Unix domain socket operations
+ return success correctly.
+
+Wed Nov 24 21:37:58 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * net.cc (cygwin_bind): Guard against incorrectly setting res to zero
+ when there is an error condition.
+
+Tue Nov 23 17:49:55 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * fhandler.cc (fhandler_base::fhandler_base): Use better initialization
+ scheme.
+ * fork.cc (stack_base): Eliminate unneeded asm stuff.
+ * select.cc: Sprinkle in some comments.
+ * include/winnt.h: Add more CONTEXT.
+
+Nov 23 20:51:00 1999 Corinna Vinschen <corinna@vinschen.de>
+
+ * net.cc (cygwin_bind): Use struct sockaddr_un in AF_UNIX code. Set
+ errno to ENAMETOOLONG if length of pathname exceeds limit in AF_UNIX
+ code. Sets errno to EADDRINUSE in AF_UNIX code if file system socket
+ object already exists.
+ * syscalls.cc (setsid): Set errno to EPERM if current process is
+ already process group leader.
+ * uinfo.cc (internal_getlogin): Rearrange for better debug output. Set
+ pi->psid to NULL if SID can't be determined.
+ * include/cygwin/socket.h: Add AF_LOCAL and PF_LOCAL
+ (same as AF_UNIX) for POSIX compatibility.
+ * include/sys/un.h: Add UNIX_PATH_LEN define. Added SUN_LEN macro for
+ POSIX compatibility.
+
+Sun Nov 21 22:55:04 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * environ.cc (parse_options): Return immediately after dealing with
+ NULL argument. Don't try to process it.
+
+Tue Nov 16 23:29:17 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * signal.cc (kill_worker): Guard against NULL dereference when thread
+ safe.
+
+Sat Oct 30 00:59:38 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * Makefile.in: Some general cleanup.
+ * smallprint.c (__small_vsprintf): Accomodate new format for
+ __PRETTY_FUNCTION__.
+
+Wed Oct 27 16:13:36 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * path.cc (mount_info::from_registry): Don't allow the same posix path
+ into the mount table more than once.
+ * utils/mount.cc (main): Add some orthogonality to the options.
+
+Tue Oct 26 21:55:49 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * environ.cc (environ_init): Turn off ntsec by default.
+
+Wed Oct 27 00:14:11 1999 J"orn Rennecke <amylaar@cygnus.co.uk>
+
+ * fhandler.cc (fhandler_base::lseek): Take readahead into account.
+
+Tue Oct 26 16:46:54 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * syscalls.cc (_unlink): Return EISDIR when attempting to unlink a
+ directory.
+
+Mon Oct 25 18:05:23 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * fhandler.cc (fhandler_base::read): Fix previous fix.
+
+Mon Oct 25 13:46:44 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * dll_init.cc (add): Avoid allocating name for "LINK"ed DLLs.
+ (DllList::forkeeLoadDlls): Only reload DLLs if they have been
+ dlopen'ed.
+ * grp.cc (parse_grp): Assign gr_mem when it is determined.
+
+Sun Oct 24 21:55:48 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * dll_init.cc (struct dll): Add module name.
+ (add): Add additional 'name' parameter for recording in dll structure.
+ (reserve_upto): New function.
+ (release_upto): Ditto.
+ (DllList::forkeeLoadedDlls): Ditto.
+ (DllList::forkeeStartLoadDlls): Remove.
+ (DllList::forkeeEndLoadedDlls): Ditto.
+ (DllNameIterator::*): Eliminate class.
+ (LinkedDllNameIterator::*): Ditto.
+ * dll_init.h: Reflect above changes.
+ * fork.cc (fork): Don't generate a list of dlls to load in the parent.
+ Let the child do it. Use new DllList::forkeeLoadDlls to load DLLs.
+ * smallprint.c (__small_vsprintf): No need for a sign on a Win32 error.
+ (small_printf): Move function here from strace().
+ * strace.cc (small_printf): Move to smallprint.c
+ * include/sys/strace.h: Always declare small_printf.
+
+Sun Oct 24 02:22:13 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * fhandler.cc (fhandler_base::read): Work around C bug.
+
+Tue Oct 19 22:10:21 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * dll_init.cc: Add some external symbols to allow thread-safe
+ compilation.
+
+Tue Oct 19 21:09:42 1999 Christopher Faylor <cgf@cygnus.com>
+
+ Make minor changes throughout to accomodate new gcc merge.
+ * Makefile.in: Remvoe -fpermissive option when compiling using g++.
+ * dcrt0.cc (noload): Mark as "unused" to avoid a compiler warning.
+ * exceptions.cc (sigreturn): Make this "extern" since it essentially
+ *is* extern.
+ * fork.cc (sync_with_parent): Modify to cause the macro to be
+ considered void.
+ * heap.cc (sbrk): Remove debugging code.
+ * passwd.cc (getpass): Don't use fprintf to print the prompt.
+ * path.cc (mount_info::conv_to_win32_path): Accomodate compiler
+ warning.
+ * select.cc (cygwin_select): Experimental version of select which
+ handles fd_sets with non-standard FD_SETSIZE.
+ (select_stuff::wait): Ditto.
+ * termios.cc (tcgetattr): Avoid a compiler warning.
+ (cftospeed): Ditto.
+ (cftispeed): Ditto.
+ * uinfo.cc (netapi32_init): Ditto.
+ * winsup.h (api_fatal): Simplify and avoid a compiler warning.
+ * include/sys/strace.h (system_printf): Ditto.
+ (strace_printf_wrap): Modify to cause the macro to be considered void.
+ (strace_printf_wrap1): Ditto.
+
+1999-10-19 DJ Delorie <dj@cygnus.com>
+
+ * Makefile.in (.cc.o): add -fpermissive to avoid g++'s conformance
+ madness.
+ * environ.cc (_findenv): rename to my_findenv to avoid newlib
+ prototype.
+ * syscalls.cc (logout): remove braces around _PATH_UTMP
+
+Sat Oct 16 22:53:02 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * path.cc (mount_info::cygdrive_posix_path): Properly terminate string
+ after Oct 11 change below.
+
+Fri Oct 15 23:02:39 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * exceptions.cc (stack_info): Reimplement stack handling routines in
+ new stack_info class.
+ (stack_info::brute_force): Just fill out the same structure as
+ StackWalk.
+ (stack_info::walk): Just fill out stack info.
+ (stack): Use stack_info class stuff to iterate over and display the
+ stack.
+
+Fri Oct 15 00:32:13 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * include/cygwin/version.h: Bump some versions.
+
+Oct 5 11:45:00 1999 Corinna Vinschen <corinna@vinschen.de>
+
+ * dcrt0.cc (dll_crt0_1): Delete calls to get_WHOEVER_sid. Move call to
+ uinfo_init() to the end of the function.
+ * fhandler.cc (get_file_owner): Substitute call to get_id_from_sid()
+ with call to get_uid_from_sid().
+ (get_file_group): Substitute call to get_id_from_sid() with call to
+ get_gid_from_sid().
+ * fork.cc (fork): Copy new pinfo members to child.
+ * grp.cc (parse_grp): Rewritten. Saves gr_passwd and all user names in
+ gr_mem.
+ (read_etc_group): Variable `group_sem' avoids endless loop.
+ * passwd.cc (read_etc_passwd): Variable `passwd_sem' avoids endless
+ loop.
+ * security.cc (get_sid): New function to generate SID from int values.
+ (get_ssid): New function to generate SID from string.
+ (get_pw_sid): New function to generate SID from pw_gecos entry.
+ (get_gr_sid): New function to generate SID from gr_passwd entry.
+ (get_admin_sid): Rewritten to avoid using heap space.
+ (get_system_sid): Ditto.
+ (get_creator_owner_sid): Ditto.
+ (get_world_sid): Ditto.
+ (get_id_from_sid): Try to read SIDs from /etc/passwd or /etc/group
+ files before using RID or Lookup... function.
+ (legal_sid_type): New function.
+ (lookup_name): Rewritten to use the logon server info, if any.
+ (alloc_sd): Try to use SID from /etc/passwd and /etc/group files before
+ call to lookup_name().
+ (alloc_sd): New parameter for logon server.
+ (set_nt_attribute): Ditto.
+ (set_file_attribute): Ditto.
+ * shared.cc (sec_user): If SID is saved in myself, use it instead of
+ calling lookup_name().
+ * shared.h: struct pinfo got extended user information.
+ * spawn.cc (spawn_guts): method for forcing reread /etc files changed.
+ (_spawnve): Copy new pinfo members to child.
+ * syscalls.cc (chown): Change call to set_file_attribute().
+ (chmod): Ditto.
+ * uinfo.cc (internal_getlogin): New function.
+ (uinfo_init): Calls internal_getlogin() now.
+ (getlogin): Uses myself->username now.
+ * winsup.h: extern HANDLE netapi32_handle; Change prototypes for
+ set_file_attribute(), lookup_name(), get_id_from_sid(). New inline
+ functions get_uid_from_sid() and get_gid_from_sid().
+ * utils/mkgroup.c: Adapt to the new ntsec features.
+ * utils/mkpasswd.c: Ditto.
+
+Thu Oct 14 23:46:03 1999 Christopher Faylor <cgf@cygnus.com>
+
+ Replace calls to GetCurrentProcess() with hMainProc throughout.
+ * autoload.h: Implement LoadDLLinitnow() function to force the loading
+ of a DLL.
+ * cygwin.din: Export cygwin_stackdump.
+ * dcrt0.cc (dll_crt0): Set up hMainProc and hMainThread here.
+ * dll_init.cc (dll_dllcrt0_1): Ditto.
+ * environ.cc (parse_options): New "oldstack" option for forcing the use
+ of the old stack walking code.
+ * exceptions.cc (signals_init): Remove.
+ (err_printf): Remove. Use small_printf throughout.
+ (sfta): New helper function for StackWalk.
+ (sgmb): Ditto.
+ (stack_brute_force): Renamed from old stack walk function. Now uses
+ frame pointer from context handler.
+ (stack_walk): New function. Uses Windows API to walk the stack.
+ (stack): Reimplement to attempt to load imagehlp.dll. If this succeeds
+ use stack_walk() to display stack info, otherwise use
+ stack_brute_force.
+ (cygwin_stackdump): Temporary (?) function for displaying a stack dump
+ from the called location.
+ (stackdump): Accept new parameters for passing to stack().
+ (handle_exceptions): Call stackdump with new parameters needed to walk
+ the stack.
+ * fhandler.cc (fhandler_base::read): Fix potential buffer overrun. Fix
+ end of buffer problems when \r is not followed by a \n.
+ (fhandler_base::lseek): Avoid flushing read ahead when not moving the
+ file pointer.
+ * fhandler_termios.cc (fhandler_termios::set_ctty): Add a debugging
+ statement.
+ * sigproc.cc (sigproc_init): Eliminate obsolete signals_init function.
+ * winsup.h: Add some declarations.
+
+Wed Oct 13 09:02:32 1999 Kazuhiro Fujieda <fujieda@jaist.ac.jp>
+
+ * path.cc (readlink): Return errno correctly when it can't find the
+ target symlink.
+
+Tue Oct 12 13:02:08 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * syscalls.cc (setsid): Only reset sid/pgid when NOT process group
+ leader.
+ * tty.cc (tty_list::allocate_tty): Don't set sid to myself. The first
+ tty open should do that.
+
+Mon Oct 11 23:13:29 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * dcrt0.cc (noload): Issue appropriate Windows error.
+ * fhandler_termios.cc (fhandler_termios::ctty): Don't automatically set
+ sid, etc., unless the current pid associated with the tty's sid does
+ not exist.
+ * path.cc (mount_info::cygdrive_posix_path): Avoid copying beyond the
+ end of buffer or suffer garbage.
+ * pinfo.cc (pinfo_init): Restore sid behavior of a year ago. The sid
+ should be the same as the pid to be equivalent to UNIX.
+ (pinfo_list::operator []): Add more bounds checking.
+
+Sun Oct 10 14:08:30 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * select.cc (select): Return error if n > FD_SETSIZE. This is a
+ temporary fix.
+
+Sun Oct 10 13:56:14 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * path.cc (iscygdrive_device): Be more precise in detecting when a
+ "cygdrive" device. This should allow 'mkdir -p' to work correctly.
+
+Fri Oct 08 08:55:31 1999 Kazuhiro Fujieda <fujieda@jaist.ac.jp>
+
+ * path.cc (symlink_check_one): set errno to EINVAL on socket files
+ same as normal files.
+
+1999-10-06 DJ Delorie <dj@cygnus.com>
+
+ * include/oaidl.h (IDispatch.GetIDsOfNames): Use DISPID* not DISPID
+
+1999-10-06 DJ Delorie <dj@cygnus.com>
+
+ * exceptions.cc (err_printf): new function; print to stderr
+ without strace's clutter. The stacktrace functions use this, so
+ the stacktrace files should be cleaner.
+ (exception): Print segment registers also
+ (stack): include a peek at the function's arguments
+
+Tue Oct 5 16:33:17 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * hinfo.cc (hinfo::extend): Eliminate inappropriate test for boundary
+ condition.
+
+1999-10-04 DJ Delorie <dj@cygnus.com>
+
+ * config/i386/longjmp.c: don't restore %fs (Paul Sokolovsky
+ <paul-ml@is.lg.ua>)
+
+1999-10-04 DJ Delorie <dj@cygnus.com>
+
+ * localtime.c (tzsetwall): Handle Asian Windows strings correctly
+ (from Kazuhiro Fujieda <fujieda@jaist.ac.jp>).
+
+Sat Oct 2 23:00:00 1999 Corinna Vinschen <corinna@vinschen.de>
+
+ * include/lm*.h: Correct multiple problems in lan manager
+ header files.
+
+Sun Oct 3 14:29:53 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * sysdef/imagehlp.def: New file. Definitions for imagehlp.dll.
+ * include/imagehlp.h: Ditto.
+ * include/winbase.h: YA missing structure.
+
+Fri Oct 1 11:16:00 Corinna Vinschen <corinna@vinschen.de>
+
+ * security.cc (alloc_sd): Correct setting of FILE_DELETE_CHILD.
+ (get_file_attribute): Read ntea attributes only if ntsec is disabled.
+ * syscalls.cc (_unlink): Don't queue file into delqueue if DeleteFile
+ returns ERROR_ACCESS_DENIED.
+
+1999-09-30 Mumit Khan <khan@xraylith.wisc.edu>
+
+ * init.cc (dll_entry): Remove static_load case.
+ * dcrt0.c (set_os_type): Make it externally visible.
+ * dll_init.cc (dll_dllcrt0_1): Update noncygwin initialization for
+ post-b20.1 code.
+
+1999-09-30 DJ Delorie <dj@cygnus.com>
+
+ * times.cc: declare _timezone and _daylight properly
+
+Wed Sep 29 23:57:40 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * dcrt0.cc (do_exit): Remove EXIT_SIGNAL mask when exiting. It is not
+ correct given changes to really_exit.
+ * select.cc (peek_serial): Work around apparent Windows bug.
+
+1999-09-29 Norbert Schulze <Norbert.Schulze@rhein-neckar.de>
+
+ * times.cc (timezone): revert 'return TZ if set' patch.
+ * times.cc (timezone): uses now tzset() and _timezone.
+ * times.cc (gettimeofday): ditto.
+ * localtime.c (tzsetwall): no negative minutes if offset is negativ.
+ * localtime.c (tzsetwall): minutes place holder was missing if
+ minutes == 0 and seconds !=0 (h:0:s).
+ * localtime.c (tzsetwall): if timezone has no daylight saving
+ (tz.StandardDate.wMonth==0) generate no daylight saving parameters.
+
+Sat Sep 25 15:11:04 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * fhandler_termios.cc (fhandler_termios::bg_check): Accept a new
+ argument to control whether we should worry about blocking signals.
+ * fhandler.h: Ditto.
+ * syscalls.cc (read_handler): Accept a new argument for passing to
+ bg_check.
+ (read): Inform read_handler if signals are blocked or not.
+ * termios.cc: Throughout, reorganize to always block signals before
+ calling bg_check.
+
+Sat Sep 25 13:36:06 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * fhandler.h (fhandler_termios::line_edit): Add an extra argument.
+ * fhandler_serial.cc (fhandler_serial::open): Maintain consisten
+ fAbortOnError state.
+ * fhandler_termios.cc (fhandler_termios::line_edit): Use new
+ "always_accept" argument to control whether input_done is set
+ regardless of canonical state.
+ * fork.cc (vfork): Duplicate "parent's" fd table.
+ * hinfo.cc (hinfo::dup_worker): New method.
+ (dup2): Use new dup_worker method.
+ (hinfo::fixup_after_fork): Lock dtable prior to operating on it.
+ (hinfo::vfork_child_dup): New method. Duplicates dtable for vfork.
+ (hinfo::vfork_parent_restore): New method. Restores dtable when vfork
+ exits.
+ * net.cc (set_winsock_errno): Make global.
+ * pipe.cc (pipe): Default mode to binary unless *explicitly* set to
+ text.
+ * select.cc (set_bits): Test that {read,write,except}_selected are
+ active before setting a bit.
+ (peek_pipe): Short circuit tests if we're not checking for readable
+ or "except"able handles.
+ (thread_socket): Use read check for exitsock as old method relied on
+ undocumented, unreliable behavior.
+ (start_thread_socket): Perform more setup on exitsock to improve thread
+ exit signalling.
+ (socket_cleanup): Connect to the exitsock to force thread_socket thread
+ exit.
+ * winsup.h (hinfo): Add preliminary vfork stuff.
+ * include/winsock.h: Add shutdown() how types.
+ * include/sys/socket.h: Add socketpair declaration.
+
+1999-09-22 DJ Delorie <dj@cygnus.com>
+
+ * syscalls.cc (chown): never return ENOSYS - just pretend it
+ works.
+
+Wed Sep 22 00:47:56 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * select.cc (MAKEready): Need to initialize 'fd' or open tests in
+ peek fail.
+
+Mon Sep 20 17:07:37 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * smallprint.c (__small_vsprintf): Fix '%+' handling.
+
+Thu Sep 16 21:48:13 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * utils/cygcheck.cc (dump_sysinfo): Deal with a new compiler error.
+ * utils/strace.cc (make_command_line): Change to a void * argument, as
+ is required for SetConsoleCtrlHandler.
+
+Thu Sep 16 20:47:12 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * dcrt0.cc (__api_fatal): Rearrange slightly.
+ * fhandler.h (set_ctty): Change to void.
+ * fhandler_termios.cc (fhandler_termios::set_ctty): Ditto.
+ * select.cc (thread_pipe): Change to a void * argument, as is required
+ for thread functions.
+ (thread_socket): Ditto.
+ (thread_serial): Ditto.
+ * include/winbase.h: Mark ExitProcess as noexit.
+
+Thu Sep 16 18:32:12 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * exceptions.cc (ctrl_c_handler): Make WINAPI, as required by
+ SetConsoleCtrlHandler.
+
+Thu Sep 16 17:48:05 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * debug.cc (thread_stub): Make WINAPI, as required by CreateThread.
+ * fhandler_tty.cc (process_input): Ditto.
+ (process_output): Ditto.
+ (process_ioctl): Ditto.
+ * select.cc (thread_pipe): Ditto.
+ (thread_serial): Ditto.
+ (thread_socket): Ditto.
+ * sigproc.cc (wait_proc): Ditto.
+ (wait_sig): Ditto.
+ * window.cc (winMain): Ditto.
+
+Wed Sep 15 20:58:37 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * exceptions.cc (call_handler): Let fatal signals through regardless of
+ signal_mutex.
+ * fhandler.h (fhandler_base): Make bg_check virtual.
+ (fhandler_termios::bg_check): Eliminate the second argument.
+ * fhandler_console.cc (fhandler_console::ioctl): Check for background
+ operation.
+ * fhandler_termios.cc (fhandler_termios::bg_check): Eliminate the
+ second argument. A negative arg 1 means the same thing.
+ * ioctl.cc (ioctl): Add debugging output.
+ * syscalls.cc (_write): Eliminate second argument to bg_check.
+ * termios.cc (tcsendbreak): Check for background operation.
+ (tcdrain): Ditto.
+ (tcflush): Ditto.
+ (tcflow): Ditto.
+ (tcsetattr): Reorganize on similar lines to above routine.
+
+Wed Sep 15 15:25:04 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * select.cc (peek_pipe): Only set read_ready if bg_check returns <= 0.
+ (peek_console): Ditto. Correct PeekConsole conditional so that the for
+ loop breaks eventually.
+
+Wed Sep 15 00:21:40 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * exceptions.cc (set_console_handler): Allocate security stuff here
+ since it is needed earlier in the process now. Allocate a shared event
+ for use in synchronizing CTRL-C events that happen while the process is
+ still initializing.
+ (ctrl_c_handler): Use the above event to synchronize with the cygwin
+ startup process, waiting for the signal thread to come alive before
+ trying to send a signal.
+ (signals_init): Don't call set_console_handler() here, since it is now
+ handled much earlier in cygwin initialization.
+ * shared.cc (shared_init): Move out security setup.
+ * sigproc.cc (wait_sig): Activate the console_handler_thread_waiter so
+ that any waiting thread which is handling ctrl-c's will wake up and
+ send a signal, if appropriate.
+
+Tue Sep 14 23:49:39 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * exceptions.cc (ctrl_c_handler): Handle ctrl-c events ourself, using
+ the "UNIX way".
+ * fhandler_console (tty_list::get_tty): New function.
+ * shared.h: Add some additional things to tty_min class for handling
+ ctrl-c.
+
+1999-09-14 DJ Delorie <dj@cygnus.com>
+
+ * dir.cc (rmdir): return ENOTDIR for regular files on 9x
+
+Tue Sep 14 00:01:59 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * debug.h (ForceCloseHandle2): New macro.
+ * fhandler.cc (set_inheritance): Accept name of handle as optional
+ third argument. Use this in ForceCloseHandle2/ProtecHandle2.
+ * fhandler.h: Implement bg_check() method.
+ * fhandler_console.cc (get_tty_stuff): Initialize more tty stuff.
+ (fhandler_console::read): Check for background read.
+ * fhandler_termios.cc (fhandler_termios::bg_check): New function.
+ Performs appropriate action given background read or write.
+ * fhandler_tty.cc (fhandler_tty_slave::write): Replace background check
+ code with new method.
+ (fhandler_tty_slave::read): Ditto.
+ (fhandler_tty_common::set_close_on_exec): Pass output_mutex name to
+ set_inheritance.
+ * select.cc: Throughout check that the fd is still open before polling.
+ (peek_pipe): Check for background read.
+ (peek_console): Ditto.
+ * shared.h: Move ntty from tty into tty_min.
+ * syscalls.cc (read_handler): Check for background read.
+ (_write): Check for background write.
+
+Sat Sep 11 16:24:21 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * path.cc (iscygdrive_device): New macro.
+ (mount_info::conv_to_win32_path): Only attempt "cygdrive" translation
+ when passed /cygdrive/something.
+ (mount_info::write_cygdrive_info_to_registry): Store in-memory copy of
+ cygdrive prefix automatically.
+ (mount_info::read_cygdrive_info_from_registry): Reorganize for new
+ write_cygdrive_info_to_registry functionality.
+ (mount): Ditto.
+
+Fri Sep 10 15:44:11 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * syscalls.cc (pathconf): Make first arg 'const'.
+
+1999-09-10 DJ Delorie <dj@cygnus.com>
+
+ * exec.cc (_execve): check for an empty environment
+
+Wed Sep 8 10:24:12 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * dcrt0.cc (dll_crt0_1): Generalize test for initial zeroes in
+ exec/fork block.
+ * fhandler.cc (fhandler_disk_file::open): Don't attempt #! detection on
+ non-disk files.
+ * fhandler.h: Use generic status bit set/clear macros. Use bitmask for
+ fhandler_termios state.
+ * fhandler_console.cc: Rename "tty_stuff" to more descriptive
+ "shared_console_info".
+ (fhandler_console::read): Reset console state before a read if
+ appropriate.
+ (fhandler_console::open): Improve check for setting console state.
+ (fhandler_console::fixup_after_fork): Ditto.
+ (set_console_state_for_spawn): New function.
+ * fhandler_termios.cc (fhandler_termios::tcinit): Use new method for
+ determining if initialized.
+ * fhandler_tty.cc (fhandler_tty::init_console): Avoid sending handle to
+ init or it will be closed.
+ * fork.cc (per_thread::set): Make this method non-inline, temporarily.
+ * select.cc (peek_console): Call set_input_state to ensure that the
+ console is in the correct state.
+ * shared.h (child_info): Make zero element an array for future
+ tweaking.
+ (tty_min): Change initialized element to a bit field. Define bit field
+ macros for manipulating it.
+ * sigproc.cc (wait_sig): Wake up every half second in a (vain?) attempt
+ to work around Windows 98 hanging problem.
+ (wait_subproc): Ditto.
+ * spawn.cc (spawn_guts): Use new "set_console_state_for_spawn" prior to
+ starting a process.
+ * winsup.h: Define generic macros for manipulating a method's status
+ field.
+ (per_thread): Move inline method to fork.
+
+Mon Sep 6 13:36:34 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * fhandler_tty.cc (fhandler_tty_master::init_console): Remove retrieval
+ of stderr handle since it is not required for correct init operation.
+ * hinfo.cc (hinfo_init): Reorganize to accomodate potential closing of
+ console handles by fhandler_console::init.
+ (init_std_file_from_handle): Set standard handle as appropriate.
+ (hinfo::de_linearize_fd_arry): Ditto.
+ * fhandler_console.cc (fhandler_console::init): Conditionally close
+ handle only if it is valid.
+
+Sun Sep 5 22:43:21 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * utils/cygcheck.cc: Make sure that GetDiskFreeSpaceExA is defined as a
+ __stdcall function or the stack will suffer. For now, don't sort mount
+ output as more work copying the individual mntent elements is required.
+
+Sat Sep 4 19:01:00 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * include/glob.h: Ensure that glob*() functions can be properly accessed by
+ programs using the DLL.
+
+Sat Sep 4 18:49:04 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * heap.cc (heap_init): Tweak debugging output.
+ * sigproc.cc (sig_send): Catch obvious impossible values from
+ GetLastError.
+
+Sat Sep 4 18:43:49 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * fhandler_tty.cc (fhandler_tty_slave::open): Protect against signal
+ dispatch.
+ (fhandler_tty_slave::write): Only wait a fixed amount of time to
+ receive a an output_done_event.
+ (fhandler_tty_slave::tcflush): Protect against signal dispatch.
+
+Sat Sep 4 18:30:42 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * exceptions.cc (handle_sig): Temporarily remove OutputDebugString. It
+ seemed to be causing sporadic hangs.
+ (call_handler): Save and restore di and si.
+ (sigreturn): Ditto.
+
+Fri Sep 3 23:07:44 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * fhandler_termios.cc (fhandler_termios::line_edit): Properly deal with
+ sending characters to slave when !iscanon.
+
+Fri Sep 3 18:15:00 1999 Corinna Vinschen <corinna@vinschen.de>
+
+ * fhandler_raw.cc (fhandler_dev_raw::fstat): Add S_ISCHR to mode bits.
+ * fhandler_tape.cc (fhandler_dev_tape::fstat): Erase setting of S_ISCHR
+ since it's set in fhandler_dev_raw::fstat now.
+
+Thu Sep 2 22:11:03 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * path.cc (mount_info::conv_to_win32_path): Fix problem with
+ calculating relative path at root.
+
+Wed Sep 1 23:24:43 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * fhandler.cc (fhandler_base::fhandler_base): Don't use default binmode
+ for console.
+
+Wed Sep 1 20:51:05 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * smallprint.c (__small_vsprintf): Allow field width argument with 'l'
+ modifier. Consolidate processing of field width.
+ * uname.cc (uname): Eliminate space in "release" field.
+
+Tue Aug 24 10:46:24 1999 Kazuhiro Fujieda <fujieda@jaist.ac.jp>
+
+ * fhandler_console.cc (write_normal): Write '\n' corresponding to
+ DWN if the cursor is out of the window.
+
+Wed Aug 25 22:16:46 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * smallprint.c (rn): Deal with positive as well as negative signs.
+ (__small_vprintf): Handle '+', 'l', and '%' format types.
+
+Wed Aug 25 00:38:49 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * dcrt0.cc (dll_crt0_1): Zero heap information in user_data to
+ work around mutant startup code.
+
+Tue Aug 24 00:03:22 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * sigproc.cc (sig_send): One more end-of-process race detection.
+
+Mon Aug 23 21:37:07 1999 Christopher Faylor <cgf@cygnus.com>
+
+ Throughout, remove malloc.h.
+ * debug.cc: Initialize handle list so that it will not be copied on
+ fork.
+ * exceptions.cc (_sigreturn): Zero windows error on exit. It's
+ meaningless after a signal dispatch.
+ * fhandler_console.cc (fhandler_console::de_linearize): Improve error
+ messages.
+ * shared.h: Increment fork magic number.
+ * sigproc.cc (sigproc_terminate): Close all handles prior to calling
+ proc_terminate if running in signal thread.
+ (sig_send): Eliminate bogus ResetEvent on a semaphore. Add code for
+ potentially dealing with problems when this code is interrupted via a
+ signal dispatch.
+ * times.cc (timezone): Use __small_sprintf.
+ * uname.cc (uname): Ditto. Also use strcpy instead of sprintf where
+ appropriate.
+
+1999-08-23 DJ Delorie <dj@envy.delorie.com>
+
+ * localtime.c: export timezone, daylight, tzname as _*
+ * times.cc: don't export timezone, daylight, tzname
+ (timezone): return TZ if set.
+ (cygwin_tzset): not needed.
+
+Thu Aug 19 13:46:47 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * fork.cc (fork): Remove pinfo lock. It is in allocate_pid, now.
+ * spawn.cc (_spawnve): Ditto.
+ * pinfo.cc (pinfo_init): Ditto.
+ (lock_pinfo_for_update): Impreove debug output.
+ (pinfo_list::allocate_pid): Lock pinfo mutex here.
+
+1999-08-19 DJ Delorie <dj@cygnus.com>
+
+ * Makefile.in (tooldir): If we're building natively, drop the
+ $(target_alias) on include and lib's install (i.e. /usr/include
+ instead of /usr/include/i686-cygwin).
+
+Thu Aug 19 01:11:25 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * sigproc.cc (sig_send): Avoid a race with proc thread when executing
+ due to a signal.
+
+Wed Aug 18 16:37:59 1999 Kazuhiro Fujieda <fujieda@jaist.ac.jp>
+
+ * fhandler_console (fhandler_console::fillin_info): Avoid setting
+ scroll_region.Bottom when it is not known.
+ (fhandler_console::write_normal): Add various fixes for console
+ scrolling.
+
+Wed Aug 18 16:18:22 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * sigproc.cc: Add more precise end-of-process detection.
+
+Wed Aug 18 00:03:47 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * sigproc.cc (sig_send): Work around apparent Windows bug which
+ occasionally results in bogus error messages when a signal is
+ dispatched.
+
+1999-08-17 DJ Delorie <dj@cygnus.com>
+
+ * localtime.c (tzsetwall): Deduce TZ more accurately.
+
+Tue Aug 17 18:00:03 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * select.cc (peek_pipe): Correct detection of process group for
+ backgrounded processes.
+
+Tue Aug 17 10:24:49 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * include/winnt.h: Fix typo in IMAGE_FIRST_SECTION definition.
+
+Sun Aug 15 19:11:49 1999 Mumit Khan <khan@xraylith.wisc.edu>
+
+ * gcrt0.c (__eprol): Avoid namespace pollution.
+ (_monstartup): Turn into a constructor function and prevent multiple
+ invocations.
+
+Mon Aug 16 10:03:00 Corinna Vinschen <corinna@vinschen.de>
+
+ * utils/mkgroup.c: Correct call to LookupAccountSid for retrieval of
+ 'None'.
+
+Mon Aug 16 00:24:29 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * debug.cc (locker): Improve signal mutex locking.
+ * exceptions.cc (sig_handle): Pass STOP signals to call_handler to
+ ensure honoring of signal_mutex.
+ (call_handler): Move STOP code here after acquistion of signal_mutex.
+ * fhandler_tty.cc (fhandler_tty_common::__acquire_output_mutex): Track
+ lockers for debugging.
+ (fhandler_tty_common::__release_output_mutex): Ditto.
+ (fhandler_slave::write): Fix faulty signal blocking code.
+ * fork.cc (fork_copy): Remove ancient if 0.
+ (fork): Conditionalize "FORKDEBUG" under DEBUGGING.
+ * sigproc.cc (proc_terminate): Reduce pinfo lock time.
+ (sigproc_terminate): Set sig_loop_wait after getting signal_mutex.
+ (__get_signal_mutex): Reorganize for less strace output when not
+ DEBUGGING.
+ (__release_signal_mutex): Ditto. Reorganize case where !sig_loop_wait.
+ (have_signal_mutex): Returns true if current thread has the mutex.
+ * wait.cc (wait4): Change debugging message.
+
+Sat Aug 14 0:10:00 Corinna Vinschen <corinna@vinschen.de>
+
+ * fhandler.cc (fhandler_base::raw_read): Set correct errno from Win32
+ error when ReadFile fails.
+ (fhandler_base::raw_write): In case of ERROR_DISK_FULL, return
+ bytes_written only if bytes_written > 0.
+ * errno.cc: Map ERROR_DISK_FULL to ENOSPC.
+
+Fri Aug 13 14:22:12 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * select.cc (peek_pipe): Honor ignra argument.
+
+Fri Aug 13 00:45:00 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * spawn.cc (spawn_guts): Ensure that hExeced is set to proper state
+ when parent has exited.
+
+Thu Aug 12 14:09:30 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * sigproc.cc (getsem): Fix typo which prevented sending signals to
+ other processes.
+
+Wed Aug 11 22:06:33 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * cygwin.din: Export glob and globfree.
+ * glob.h: Move to include.
+ * Makefile.in: Correct glob.h dependencies.
+
+Wed Aug 11 19:41:04 1999 Sergey Okhapkin <sos@prospect.com.ru>
+
+ * fhandler.cc (fhandler_disk_file::fstat): Check if the file is unix
+ domain socket.
+ (fhandler_disk_file::open): Call set_socket_p().
+ * fhandler.h: Add new fhandler type flags (FH_LOCAL, FH_FIFO).
+ (fhandler_base): get/set_socket_p - new member functions.
+ (fhandler_socket::addr_family): Add new member, currently unused.
+ (fhandler_socket::get/set_addr_family): Add new functions to access
+ addr_family.
+ * include/sys/un.h: New file.
+ * net.cc: Include <sys/un.h>
+ (cygwin_socket): Always create socket of AF_INET family, store
+ argument's family.
+ (get_inet_addr): New static function. Converts AF_UNIX requests into
+ corresponding AF_INET requests.
+ (cygwin_sendto): Use get_inet_addr().
+ (cygwin_connect): Likewise.
+ (cygwin_accept): Check for sockaddr length.
+ (cygwin_bind): Implement AF_UNIX.
+ * path.h (PATH_SOCKET): Add new enum value.
+ (path_conv::issocket): Add new member function.
+ (SOCKET_COOKIE): Add new define.
+ * syscalls.cc (chmod): Mark socket files with system file attribute.
+
+Wed Aug 11 17:22:46 1999 Corinna Vinschen <corinna@vinschen.de>
+
+ * utils/mkgroup.c (main): Generate "None" group when
+ invoked via mkgroup -l.
+
+Tue Aug 10 21:30:31 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * select.cc (peek_pipe): Handle type ahead where appropriate.
+ * sigproc.cc (proc_can_be_signalled): Revert to previous method for
+ determining signalability.
+ (getsem): Move PID_INITIALIZING test here.
+ * wait.cc (wait4): Improve debug output slightly.
+
+Mon Aug 9 23:27:44 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * dcrt0.cc (do_exit): Add additional check for valid hExeced.
+ * exceptions.cc (call_handler): Implement a raceless way to track
+ pending_signals.
+ * signal.cc (kill_worker): Make calls from non-main threads synchronous
+ or signals from a tty thread don't work right.
+ * sigproc.cc (sig_send): Localize pending_signals assignment to only
+ the wait_sig thread.
+ (__get_signal_mutex): Don't attempt to grab a mutex if signal_mutex
+ hasn't been assigned yet. Add more strace debugging information when
+ -DDEBUGGING.
+ (__release_signal_mutex): Don't attempt to release a mutex if
+ signal_mutex hasn't been assigned yet. Add more strace debugging
+ output.
+ (wait_sig): Attempt to eliminate race in setting of pending_signals.
+ * spawn.cc (spawn_guts): Set hExeced to INVALID_HANDLE_VALUE so that it
+ will be obvious when a process is actually just an execed stub.
+ * strace.cc (strace_vsprintf): Output a "!" after the pid when
+ executing in an execed stub.
+
+Mon Aug 9 17:17:13 1999 Christopher Faylor <cgf@cygnus.com>
+
+ Throughout, eliminate in() and out() macros.
+ * winsup.h (tty_attached): Accept an argument indicating the pinfo
+ structure to query.
+ * exceptions.cc (really_exit): Cosmetic change.
+ * external.cc (fillout_pinfo): Use queried pinfo structure for
+ determining tty number, not *our* number.
+ * net.cc: More workarounds.
+ * path.cc (get_device_number): Supply argument to tty_attached.
+ * syscalls.cc (ctermid): Ditto.
+ * strace.cc (strace_dump): Remove.
+ * include/sys/strace.h: Eliminate obsolete stuff.
+
+Sun Aug 8 22:54:45 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * exceptions.cc (call_handler): Process all signals on return from a
+ signal dispatch.
+ * sigproc.cc (proc_can_be_signalled): Guard against waiting too long
+ when exiting.
+ (proc_exists): Don't report an exited process as "existing".
+ (proc_terminate): Close handle prior to testing for existence so that
+ proc_exists will not always return TRUE. Eliminate use of zap_subproc.
+ (stopped_or_terminated): Eliminate use of zap_subproc.
+ (zap_subproc): Delete.
+
+Sun Aug 8 22:17:36 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * fhandler_tty.cc (fhandler_tty_master::init): hThread must remain
+ open. Previous change to close it was wrong.
+
+Sun Aug 8 20:35:33 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * exceptions.cc: Initalize NO_COPY variables.
+ * pinfo.cc (record_death): Don't be so insistent about getting
+ the pinfo lock.
+ * sigproc.cc (proc_terminate): Tighten the region protected by
+ the pinfo lock.
+ * spawn.cc (spawn_guts): Eliminate the pinfo lock when reparenting
+ as it is no longer required.
+ (_spawnve): Tighten the region protected by the pinfo lock.
+
+Sun Aug 8 18:26:51 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * sigproc.cc (sig_send): Add more unfortunate guards against a
+ system call being interrupted by a signal dispatch.
+
+Sat Aug 7 15:38:42 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * security.cc (get_admin_sid): Ensure that returned buf is not copied
+ on a fork.
+ (get_system_sid): Ditto.
+ (get_create_owner_sid): Ditto.
+ (get_world_sid): Ditto.
+
+Sat Aug 7 15:17:25 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * fhandler_tty.cc (process_input): Reset signal_arrived event prior to
+ calling console read as this is now a requirement for functions which
+ detect signal_arrived.
+ (fhandler_tty_master::write): Allow signals to operate prior to raising
+ SIGTTOU.
+ (fhandler_tty_master::read): Allow signals to operate prior to raising
+ SIGTTIN.
+ * select.cc (peek_pipe): Detect attempt to read from tty not in our
+ process group as a "read_ready" event.
+ * include/shellapi.h: Add missing defines.
+ * utils/ps.cc: Output windows pid as unsigned for Windows 9x.
+
+Sat Aug 7 14:30:00 Corinna Vinschen <corinna@vinschen.de>
+
+ * security.cc (get_creator_owner_sid): New function.
+ * shared.cc (sec_user): calls `get_creator_owner_sid' in creation
+ of the security attributes structure additionally.
+
+Fri Aug 6 13:04:40 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * spawn.cc (spawn_guts): Allow failure from OpenProcess. The parent
+ may have exited due to 7/31 change.
+
+Thu Aug 5 22:54:07 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * sigproc.cc (wait_for_me): Break out as a common function to check
+ that the current process is ready to handle signals.
+ (proc_can_be_signalled): Treat myself differently.
+
+Thu Aug 5 21:24:20 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * fhandler_console.cc (fhandler_console): Don't call tcinit here.
+ (fhandler_console::read): Don't reset signal_arrived here.
+ * syscalls.cc (_read): Set it here instead.
+ * fhandler_termios.cc (fhandler_termios::line_edit): Only call
+ accept_input when input is ready. Ignore iscanon in this case.
+ * fhandler_tty.cc (fhandler_tty_slave::init): Don't call tcinit here.
+
+Thu Aug 5 16:02:25 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * strace.cc (handle_output_debug_string): Ignore errors reading
+ from child memory as they seem to occur due to a process exiting.
+ (close_handle): New, defensive code.
+
+Thu Aug 5 13:32:43 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * strace.cc (remove_handle): New function.
+ (add_child): Speed up slightly.
+ (proc_child): Use output of remove_child in CloseHandle.
+
+Thu Aug 5 12:38:50 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * dcrt0.cc (dll_crt0_1): Don't protect subproc_ready if it is NULL.
+ (do_exit): Avoid calling close_all_files if exiting from exec stub.
+ * net.cc: Reorganize to work around some compiler bugs.
+ * spawn.cc (spawn_guts): Set hExeced only after child stuff has been
+ completely initialized.
+ * syscalls.cc (_open): Protect against signals.
+ * utils/strace.cc (warn): New function.
+ (add_child): Issue warning when can't duplicate child process handle.
+
+Wed Aug 4 21:35:28 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * psapi.h: New file.
+
+Thu Aug 4 10:28:00 Corinna Vinschen <corinna@vinschen.de>
+
+ * security.cc: Eliminate MALLOC_CHECK calls.
+ (lookup_name): New function simplifies the retrieval of user and group
+ names.
+ (alloc_sd): Call `lookup_name' instead of `LookupAccountName'.
+ * shared.cc (sec_user): Call `lookup_name' instead of
+ `LookupAccountName'. Eliminate 'free' call on stack space.
+ * winsup.h: Declare `lookup_name'.
+
+Wed Aug 4 16:24:02 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * a.out.h: Fix cut and paste from mime email typos.
+
+Mon Aug 2 19:08:48 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * Makefile.in: Fix utils dependency. Make clean more assertive.
+ * path.cc (mount_info::conv_to_win32_path): Fill in correct destination
+ when a device name is detected.
+ * syscalls.cc (chown): Always succeed when referencing a cygwin device.
+ (chmod): Ditto.
+ * net.cc (get_ifconf): Eliminate holdover from previous change.
+
+Mon Aug 2 13:07:44 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * dcrt0.cc (do_global_ctors): Remove previous change. It was just
+ wrong.
+
+Sun Aug 1 23:21:28 1999 Christopher Faylor <cgf@cygnus.com>
+
+ Throughout rename 'slave_alive' handle to 'inuse'.
+ * shared.h: Implement tty_attached() macro to determine when an actual
+ tty is associated with the process.
+ (class tty): Add some methods for manipulating an "inuse" event that is
+ common to both master and slave parts of a tty.
+ * dcrt0.cc (do_exit): Use tty_attached() to determine if signal should
+ be sent to process group.
+ * external.cc (fillout_pinfo): Return -1 if tty is not attached (i.e,
+ attached to a console).
+ * fhandler.h: Move more stuff into fhandler_tty_common and out from sub
+ classes.
+ * fhandler_console.cc (fhandler_console::read): Send SIGWINCH signal to
+ *correct* process group.
+ (fhandler_console::open): Fix incorrect argument ordering in set_ctty.
+ (fhandler_console::de_linearize): Remove unneeded handle resets.
+ * fhandler_tty.cc (fhandler_tty_slave::open): Fix incorrect argument
+ ordering in set_ctty. Use tty create_inuse method to create inuse
+ event.
+ (fhandler_tty_slave::close): Delete.
+ (fhandler_tty_slave::dup): Delete.
+ (fhandler_tty_slave::write): Minor cleanup of flow of control.
+ (fhandler_tty_common::dup): Subsume fhandler_tty_slave dup method.
+ (fhandler_pty_master::fhandler_pty_master): Zero inuse field.
+ (fhandler_pty_master::open): Set inuse field.
+ (fhandler_tty_common::close): New, superclass method.
+ (fhandler_tty_common::set_close_on_exec): Handle inuse field.
+ (fhandler_tty_common::fixup_after_fork): Ditto.
+ (fhandler_tty_slave::set_close_on_exec): Delete.
+ (fhandler_tty_slave::fixup_after_fork): Delete.
+ * path.cc (get_device_number): Use tty_attached() to figure out
+ /dev/tty.
+ * select.cc (peek_console): Send SIGWINCH signal to *correct* process
+ group.
+ * tty.cc (tty::master_alive): New method.
+ (tty::create_inuse): New method.
+
+Sun Aug 1 16:23:22 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * net.cc (get_ifconf): Use alloca for temporary buffer.
+
+Sun Aug 1 01:38:20 1999 Christopher Faylor <cgf@cygnus.com>
+
+ Modify de_linearize methods throughout to set unix and msdos path
+ names.
+ * dcrt0.cc (do_exit): Only remove shared memory when we're done with
+ it.
+ * exceptions.cc (try_to_debug): Move static variable outside of the
+ function so that it can more easily be set with gdb.
+ * fhandler_console.cc (fhandler_console::open): Handles are typically
+ hexadecimal in debugging output.
+ (fhandler_console::open): Do not open inherit console handles by
+ default.
+ (fhandler_console::dup): Just use open method to "duplicate" a console
+ handle.
+ (fhandler_console::fixup_after_fork): Do *not* close handles here since
+ they have not been inherited.
+ (fhandler_console::de_linearize): Ditto.
+ * utils/strace.cc (create_child): Correct debugging flags when not
+ tracking forked processes.
+
+Sat Jul 31 20:10:58 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * dcrt0.cc (do_global_ctors): Ensure that ctors are not called more
+ than once per session.
+ * fork.cc (fork): Use sig_protect to protect against signals during
+ fork.
+ * pinfo.cc (lpfu): Show windows pid in debugging message as this is
+ generally more useful.
+ * pinfo.cc (unlock_pinfo): Issue an error if ReleaseMutex fails.
+ (pinfo::record_death): Actually unlock pinfo on exit rather than allow
+ ExitProcess to do this since ExitProcess can sometimes take a *long*
+ time.
+ * spawn.cc (spawn_guts): Ensure that pinfo is always unlocked.
+
+Thu Jul 29 23:43:24 1999 Christopher Faylor <cgf@cygnus.com>
+
+ Throughout, consolidate pgid processing for console and tty into
+ fhandler_termios and tty_min.
+ * debug.h: Make WF?O functions the defaults for dealing with Waits.
+ These functions attempt to work around signal interrupt problems.
+ * debug.cc: Ditto.
+ * exceptions.cc (call_handler): Don't wait a long time for second
+ attempt to get signal mutex.
+ * fhandler_console.cc (fhandler_console::open): Set the "controlling
+ tty".
+ * fhandler_termios.cc: Move the ctty and pgid functions here.
+ (fhandler_termios::line_edit): Fix debug output.
+ * fhandler_tty.cc (fhandler_tty_slave_write): Use sig_protect to
+ protect against output_mutex deadlock.
+ * fork.cc (get_vfork_val): Conditionalize with NEWVFORK.
+ * syscalls.cc (setsid): Add debugging output.
+ (setpgid): Reorganize and add debugging output.
+ * tty.cc (tty::init): Use a method to clear the sid.
+
+Thu Jul 29 23:42:53 1999 Christopher Faylor <cgf@cygnus.com>
+
+ Patch from Egor Duda <deo@logos-m.ru>:
+ * grp.cc (read_etc_group): Use a default /etc/group entry when one
+ doesn't exist.
+ (getgrgid): Ditto.
+ * passwd.cc (read_etc_passwd): Use a default /etc/passwd entry when one
+ doesn't exist.
+ (search_for): Ditto.
+ * uinfo.cc (read_etc_group): Remove some defines.
+ * winsup.h: Move them here.
+
+1999-07-29 Bernd Schmidt <bernds@cygnus.co.uk>
+
+ * Makefile.in (SUBDIRS_AFTER): Build mingw before utils.
+ * utils/Makefile.in (MINGW_LDFLAGS): Add "-B../mingw/"
+
+
+Tue Jul 27 23:31:28 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * dcrt0.cc: Add experimental vfork_storage initialization.
+ (do_exit): Ditto.
+ * exec.cc: Use _spawnve throughout as a common interface for execing a
+ program.
+ * fork.cc (vfork): Add beginnings of true vfork support.
+ * path.cc (sort_by_posix_name): Remove special casing of zero length
+ names since they should now be eliminated earlier on.
+ (sort_by_native_name): Ditto.
+ (mount_info::del_item): Remove hole from mount table specifically, here
+ or suffer weird behavior. Suggested by Andrew Dalgleish
+ <andrewd@axonet.com.au>.
+ * shared.cc: Make SHAREDVER "unsigned" to avoid a compiler warning.
+ * spawn.cc : Accomodate additional argument to _spawnve, throughout.
+ (_spawnve): Make this a global function and take an hToken argument so
+ that it can be used by sexecve. Accomodate experimental vfork
+ functionality.
+ * winsup.h: Add initial support for per-thread vfork stuff.
+ * include/cygwin/version.h: Bump shared memory version number.
+
+Mon Jul 26 20:59:58 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * path.cc (sort_by_posix_name): Report two zero length strings as being
+ equal or suffer an infinite loop.
+ (sort_by_native_name): Ditto.
+ * shared.cc (shared_info::initialize): Refuse to use a different DLL's
+ shared memory.
+ * shared.h: Fix mask for child_info sanity test.
+
+Sun Jul 18 16:30:31 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * security.cc: Various changes from Corinna.
+
+Sat Jul 17 22:33:45 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * fork.cc (fork): Change DuplicateHandle slightly.
+ * security.cc (get_nt_attribute): Ignore error return from
+ set_process_privileges.
+ (set_nt_attribute): Ditto.
+
+Sat Jul 17 00:45:34 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * debug.h: Fix ForceCloseHandle1 in non-debug case.
+
+Fri Jul 16 23:47:31 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * sigproc.cc (proc_can_be_signalled): Accomodate different flavors of
+ myself.
+ * include/ddeml.h: Add missing struct.
+ * include/wingdi.h: Add missing defines.
+
+Fri Jul 16 23:01:30 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * Makefile.in: Attempt to cope when srcdir is a relative pathname.
+ * fork.cc (fork): Pass handle to parent process to fixup_after_fork.
+ Eliminate excess unlock_pinfos.
+ * hinfo.cc (hinfo::fixup_after_fork): Use inherited parent handle
+ rather than try to open the parent process explicitly.
+ * pinfo.cc (record_death): Cosmetic change.
+ * sigproc.cc (wait_sig): Add a debugging statement.
+ * winsup.h: Reflect change of argument for fixup_after_fork.
+
+Fri Jul 16 11:07:55 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * shared.h: Eliminate record_death_nolock. Just pass an argument to
+ record_death.
+ * pinfo.cc (record_death_nolock): Ditto.
+ * dcrt0.cc (__api_fatal): Use record_death with FALSE argument rather
+ than record_death_nolock.
+ * exceptions.cc (really_exit): Ditto.
+ * fork.cc (fork): Remove debugging statement.
+
+Wed Jul 14 22:08:52 1999 Christopher Faylor <cgf@cygnus.com>
+
+ Throughout, make parent_alive a local variable. Rename 'alive_parent'
+ to 'my_parent_is_alive'.
+ * autoload.h: Improve the description of the autoload mechanism.
+ * dcrt0.cc: Define parent_alive here.
+ (dll_crt0_1): When debugging, rotect handles inherited from fork/exec.
+ Force signal thread to finish initializing prior to calling main.
+ (dll_crt0): Reorganize child_info stuff to allow common initialization.
+ Accept parent_alive handle from invoker and ensure that this is not
+ inherited by other processes.
+ (do_exit): Ensure that exit_state is not duplicated by a fork.
+ (__api_fatal): Call 'try_to_debug' directly.
+ * debug.cc: Increase the size of the handle list.
+ (threadname): Add an optional argument to control locking.
+ * exceptions.cc (error_start_init): Make this a "C" function.
+ (try_to_debug): Ditto. Also, use Sleep rather than pause and loop so
+ that gdb can get in to interrupt things.
+ (sig_handle):
+ * external.cc (fillout_pinfo): Reorganize slightly and plan for the
+ future.
+ * fhandler.h: Add an argument to show the name of the handle for error
+ messages to fork_fixup.
+ * fhandler.cc (fhandler_base::fork_fixup): Ditto.
+ (set_inheriting): Rename a variable for clarity.
+ (fhandler_base::fixup_after_fork): Pass in the name of the handle to
+ fork_fixup.
+ * fhandler_tty (fhandler_tty_common:fixup_after_fork): Ditto.
+ (fhandler_tty_slave:fixup_after_fork): Ditto.
+ (fhandler_tty_master:fixup_after_fork): Ditto.
+ * fhandler_windows.cc (fhandler_windows::fixup_after_fork): Ditto.
+ * fhandler_console.cc (fhandler_console::open): Specifically open
+ console with ENABLE_PROCESSED_INPUT.
+ * fork.cc (sync_with_child): Call abort when DEBUGGING and there's an
+ error.
+ (resume_child): Ditto. Also, allow an ERROR_INVALID_HANDLE error if it
+ can't be duplicated as they seem to occur occasionally when the parent
+ copies the stack.
+ (fork): Use init_child_info to initialize structure passed to child.
+ Remove start time setting in favor of common function. Don't mess with
+ parent's parent_alive.
+ * heap.cc (sbrk): Simply code slightly.
+ * hinfo.cc (hinfo::dup2): Improve error handling.
+ * pinfo.cc (set_myself): Set start time here since it is called by
+ everything which sets myself.
+ (pinfo_init): Remove start_time setting in favor of common function.
+ * shared.h (pinfo): Reorganize so that signal stuff falls into section
+ of pinfo which is automatically zeroed when a new pid is initialized.
+ (PROC_MAGIC): Increment to detect cygwin1.dll's memory passing
+ disparities.
+ * sigproc.cc (proc_alive): Make this a function. Wait for target pid
+ to initialize.
+ (my_parent_is_alive): Rename from alive_parent.
+ (proc_can_be_signalled): Renamed from proc_alive macro.
+ (proc_exits): Use proc_can_be_signaleed().
+ (proc_subproc): Don't put parent_alive in child.
+ (proc_terminate): Close hwait_subproc in a race-safe way. Ditto
+ sync_proc_subproc.
+ (sigproc_terminate): Always terminate proc_subproc thread first or it
+ may try to use signal thread as it is going away. Wait for signal
+ thread to exit.
+ (sig_send): Use proc_can_be_signalled().
+ (init_child_info): New function. Initializes memory block passed by
+ spawn/fork.
+ (mutex_stack): Add thread name field.
+ (sig_wait): Set active state after all handles have been set up and
+ before protecting the handles. Use ForceCloseHandle to close
+ subproc_ready as it is now protected. Close signal_mutex here.
+ * sigproc.h: Accomodate alive_parent rename.
+ * spawn.cc Use init_child_info to initilize memory block passed to
+ subprocess.
+ * strace.cc (__system_printf): Write to screen before writing to strace
+ log. Only write to strace log if we're actually stracing.
+ * winsup.h: Declare the 'action on error' functions.
+ * utils/Makefile.in: (Patch from Egor Duda <deo@logos-m.ru>) Compile
+ strace using -mno-cygwin.
+ * utils/strace.cc: Allow ingw concession from Egor Duda. Attempt to
+ allow CTRL-C when stracing.
+
+Thu Jul 14 0:39:00 Corinna Vinschen <corinna@vinschen.de>
+
+ * security.cc (alloc_sd): Delete special handling of uid/gid 513.
+
+Thu Jul 13 15:01:00 Corinna Vinschen <corinna@vinschen.de>
+
+ * fhandler.cc (get_file_owner): Fix typo.
+ * path.cc (path_conv::path_conv) : Change `return' to `goto end' in
+ case of SYMLINK_IGNORE is set.
+
+Mon Jul 5 21:33:00 Corinna Vinschen <corinna@vinschen.de>
+
+ * security.cc (WriteSD): Doesn't set errno if BackupWrite()
+ returns ERROR_INVALID_SECURITY_DESCR (which happens on FAT).
+
+Sat Jul 10 13:17:20 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * utils/strace.cc (error): Actually output error message.
+ (add_child): Duplicate inherited child process handle with all of the
+ privileges that we need.
+
+Fri Jul 9 01:37:23 1999 Geoffrey Noer <noer@cygnus.com>
+
+ * include/cygwin/version.h: Bump CYGWIN_VERSION_API_MINOR to 14
+ in honor of snprintf and vnsprintf additions.
+
+Fri Jul 9 00:04:03 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * path.cc (path_conv::path_conv): Correct buffer overflow condition.
+ * fhandler_console.cc (fhandler_console::open): *Need* to enable
+ processed input or CTRL-C won't stop anything unless it's at a prompt.
+ (fhandler_console::input_tcsetattr): Ditto.
+
+Thu Jul 8 18:27:49 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * Makefile.in: Add malloc debugging options.
+ * dcrt0.cc (api_fatal): Call abort when debugging so that the debugger
+ will pop up.
+ * debug.cc (close_handle): Unlock in pathological case.
+ * fhandler_console.cc (fhandler_console::read): Always respond to
+ windows size changes.
+ (fhandler_console::open): Always set things to ~ENABLE_PROCESSED_INPUT
+ so that we can control INTR character. Don't set pgid here.
+ (fhandler_console::input_tcsetattr): Turn on windows event so that we
+ can see screen resizes.
+ (fhandler_console::init): Don't set pgid here.
+ * fhandler_termios (fhandler_termios::tcinit): Set pgid here.
+ * fhandler.h: Fix set_has_acls method return.
+ * utils/strace.h: Pass CTRL-Cs to child process.
+
+Wed Jul 7 23:59:50 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * Makefile.in: Improve dependencies.
+ * autoload.h: Work around "function unused" messages for autoload init
+ functions.
+ * configure.in: Use CHECK_TOOL to find CC so that it will get the
+ proper host alias.
+ * configure: Regenerate.
+ * dcrt0.cc (do_exit): Minor reorganization of termination function
+ calls.
+ * debug.cc (close_handle): Issue an error when an attempt is makde to
+ close a handle with a name different from the one used to record it
+ previously.
+ * debug.h: Implement new macros for storing arbitrary handle names.
+ * exceptions.cc (handle_signal): Terminate the main thread when exiting
+ due to signal in signal thread.
+ * fhandler.h: Add an extra 'fd' argument to all ready_for_read methods.
+ * select.cc: Ditto, throughout.
+ * fhandler_console (get_tty_stuff): Protect the tty_stuff handle here.
+ * fhandler_termios.cc (fhandler_termios::line_edit): Accomodate fd
+ argument to ready_for_read.
+ * fhandler_tty.cc (fhandler_tty_master::init): Close an unneeded thread
+ handle.
+ * fork.cc (fork): Use standard name when protecting process handle.
+ * spawn.cc (spawn_guts): Ditto.
+ * shared.cc (open_shared_file_map): Protect cygwin_shared handle here.
+ * sigproc.cc: Throughout, close child process handle using standard
+ name.
+ * syscalls.cc (read_handler): Check that fd is still open prior to
+ performing an operation. Supply fd argument for ready_for_read.
+ * (_read): Supply fd argument for read_for_read.
+ * tty.cc (tty_list::terminate): Close unneeded handles as tty is
+ closing down.
+ (tty_list::allocate): Protect against signals.
+
+Mon Jul 5 14:52:40 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * cygwin.din: Export new snprintf and vnsprintf functions courtesy of
+ Egor Duda <deo@logos-m.ru>.
+
+Sun Jul 4 23:54:43 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * exceptions.cc (sigbegin): New function. Called prior to dispatching
+ to signal handler.
+ (sigreturn): New function. Called after signal handler returns.
+ (set_process_mask): Make stdcall.
+ (call_handler): Remove sigwrap asm stuff in favor of new
+ sigbegin/sigreturn scheme.
+ * winsup.h: Change set_process_mask declaration.
+
+Sun Jul 4 22:00:14 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * syscalls.cc (stat_worker): Previous change to check for extension
+ found dots not in the filename part. Fix this.
+
+Sat Jul 3 23:22:55 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * include/wincon.h: Add some missing defines.
+ * environ.cc: Remove extern which is now in winsup.h.
+ * fhandler.cc (get_file_owner): Rename argument. Test for allow_ntsec.
+ (get_file_group): Ditto.
+ (fhandler_disk_file::fstat): Use new method inode checking.
+ * fhandler.h: Rename a method.
+ * security.cc (set_file_attribute): Take an additional argument to
+ determine if ntsec security setting should be used.
+ * dir.cc (mkdir): Pass acl info to set_file_attribute.
+ * syscalls.cc (chown): Ditto.
+ (chmod): Ditto.
+ * winsup.h: Define allow_ntsec here.
+
+Sat Jul 3 15:09:34 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * fhandler.cc (fhandler_disk_file:;fstat): Move check of disk volume to
+ path_conv. Use new methods for determining if file system is ACL
+ capable.
+ (fhandler_disk_file::open): Set "has acls" flag here.
+ * fhandler.h: Store acl information in fhandler base class.
+ * path.cc (path_conv): Set acl information on successful return.
+ * path.h: Add acl info to path_conv class.
+ * security.cc (get_file_attribute): Set ENOSYS if can't get extended
+ attributes.
+ * syscalls.cc (chown): Pass acl information from path_conv to
+ get_file_attributes.
+ (chmod): Ditto.
+ (stat_worker): Ditto.
+ * uinfo.cc: Make all exported functions extern "C".
+ * winsup.h: Add rootdir() declaration.
+
+Fri Jul 2 15:13:08 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * autoload.h: New file.
+
+Thu Jul 1 23:16:34 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * net.cc (cygwin_gethostname): Use new win32_gethostname to
+ disambiguate between cygwin and winsock version.
+ * tty.cc (creat_tty_master): Disambiguate by using cygwin_gethostname
+ to find the hostname.
+ * winsup.h: Declare cygwin_gethostname.
+
+Thu Jul 1 22:36:31 1999 Christopher Faylor <cgf@cygnus.com>
+
+ Throughout, remove check for winsock initialization and indirect
+ references to winsock functions in favor of new dynamic DLL loading
+ method.
+
+ * Makefile.in: Remove unneeded libraries.
+ * cygwin.din: Make gethostname == cygwin_gethostname like other network
+ functions.
+ * dcrt0.cc: Implement new "autoload" functionality for loading DLLs and
+ functions as they are needed. Add autoload functions for user32.dll.
+ (cygwin_dll_func_load): New function.
+ (dll_crt0): Issue a fatal error message if attempt to mix different
+ version DLLs is detected.
+ (api_fatal): Correct inexplicable use of buf + 8 when printing error
+ message into a buffer.
+ * fhandler.h: Cosmetic fixes.
+ * fhandler_tty.cc (fhandler_tty::close): Temporarily "if 0" out code
+ which sends EOF pulse to children. This should only happen when last
+ parent fd closes.
+ * heap.cc (sbrk): Implement new sbrk mechanism which returns memory to
+ Windows when top of heap decreases beyond a page boundary.
+ (getpagesize): New function.
+ * fork.cc (fork): Save new heap values in stuff passed to child.
+ * hinfo.cc (hinfo::build_fhandler): Don't do any checking on a handle
+ if the handle is NULL. Assume that it is a disk file.
+ * net.cc: Redo winsock functions to use dynamic loading scheme.
+ * shared.cc (shared_info::initialize): Cosmetic change.
+ * shared.h: Change magic number for memory block sent to child
+ processes. Accomodate new heap information in child_info.
+ * sigproc.cc (sig_dispatch_pending): Remove some memory debugging checks.
+ (__release_signal_mutex): Ditto.
+ * syscalls.cc (stat_worker): Don't attempt the .exe hack unless the
+ previous attempt to open the file resulted in an "ERROR_FILE_NOT_FOUND"
+ and the file did not already contain an extension.
+ * times.cc: Initialize static NO_COPY variables throughout or they will
+ not actually be NO_COPY.
+ * winsup.h: Rename heap fields in per_process to accomodate new sbrk.
+ Eliminate winsock stuff invalidated by dynamic loading change.
+ * include/winsock.h: Make this file C++ safe.
+
+Sun Jun 27 17:07:34 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * debug.h: Don't define MALLOC_DEBUG by default.
+ * fhandler.cc (fhandler_base::set_name): Always set names to NULL. Add
+ more slop to end of win32_path_name.
+ (fhandler_base::de_linearize): Set names to NULL. They'll be assigned
+ by the caller.
+ (fhandler_disk_file::get_native): Delete.
+ * fhandler.h: Ditto.
+ * hinfo.cc (hinfo::de_linearize_fd_array): Set path names after the
+ structure has been "delinearized".
+ * malloc.cc: Add debugging versions of malloc functions.
+ * syscalls.cc (stat_worker): Eliminate static buffer for thread safety.
+
+Wed Jun 23 22:53:00 Corinna Vinschen <corinna@vinschen.de>
+
+ * fhandler.cc (fhandler_disk_file::fstat): If get_file_attribute()
+ signals a nonexistant acl, fstat sets default attributes now.
+
+Wed Jun 23 10:22:56 1999 Geoffrey Noer <noer@cygnus.com>
+
+ * include/cygwin/version.h: Bump CYGWIN_VERSION_API_MINOR to 13.
+
+Wed Jun 23 10:39:07 1999 Mumit Khan <khan@xraylith.wisc.edu>
+
+ * cygwin.din (gamma, gammaf, lgamma, lgammaf): Export.
+ (j0,j0f,j1,j1f,jn,jnf): Export underscore versions as well.
+
+Mon Jun 21 21:34:06 1999 Christopher Faylor <cgf@cygnus.com>
+
+ Sprinkle MALLOC_CHECK macro throughout. When turned on, this will give
+ a slightly better idea of where memory corruption occurs. Add slightly
+ modified versions of "error_start" code from Egor Duda
+ <deo@logos-m.ru>.
+ * Makefile.in: Add `utils' target.
+ * dcrt0.cc (do_exit): Attempt to detect loop conditions where do_exit
+ is called reentrantly and avoid the previously executed code in this
+ case.
+ * debug.h: Define MALLOC_CHECK macro for use with malloc debugging.
+ * environ.cc (environ_init): Add more slop at end of environ string
+ just to work around buggy programs.
+ (parse_options): Add error_start option to control core dumping or gdb
+ invocation.
+ * exceptions.cc (stackdump): New function. Dumps stack to stderr.
+ (error_start_init): New function. Initialize action on "core dumping"
+ error.
+ (handle_exceptions.cc): Use stackdump command to dump stack. Call
+ try_to_debug.
+ (set_process_mask): Must be __stdcall or compiler get's confused.
+ (sig_handle): Detect SIGQUIT and SIGABRT. Do a "stackdump" for these.
+ * fhandler.cc (get_file_owner): Add an argument to determine if
+ function should check for NT security.
+ (get_file_group): Ditto.
+ (fhandler_base::set_name): Don't free "fhandler_disk_dummy_name" path
+ names.
+ (rootdir): New function, pulled from the pages of syscalls.cc.
+ Determines the root dir of a given path.
+ (fhandler_disk_file::fstat): Get volume information of file in question
+ to determine if inodes are permanent and acls are available. This
+ replaces previous WinNT test.
+ (fhandler_base::~fhandler_base): free "fhandler_disk_dummy_name" path
+ names.
+ * fhandler.h: Change get_file_* declarations.
+ * fhandler_console.cc: Back out most of scroll fixes from April 17.
+ They caused weird scrolling behavior.
+ * fhandler_tty.cc (fhandler_pty_master::accept_input): Add debugging
+ message.
+ * security.cc (get_file_attribute): Add additional "check for ACL"
+ argument.
+ * path.cc (symlink_check_one): Use new argument to get_file_attribute.
+ * sigproc.cc (wait_subproc): Don't exit wait loop if WaitForMultipleObject
+ returns an error. Instead, loop for a while in case this is an expected
+ error.
+ * sigproc.h: Remove __stdcall from set_process_mask.
+ * spawn.cc (linebuf): Use initializers to set initial values.
+ (linebuf::append): Be defensive and ensure that enough space is
+ allocated for the new argument.
+ (linebuf::prepend): Ditto.
+ (spawn_guts): Correct logic which broke up program argument in a #!
+ script.
+ * syscalls.cc (chown): Use new argument to get_file_attribute.
+ (chmod): Use new argument to get_file_owner and get_file_group.
+ (stat_worker): Ditto.
+ (statfs): Break out code that determined the root directory of a given
+ path. Use new rootdir function instead.
+ * winsup.h: Reflect new get_file_attribute argument.
+ * include/sys/strace.h: Add "NOTALL" flag so that voluminous debugging
+ output can be avoided.
+ * utils/strace.cc: Honor NOTALL flag. Run at a higher priority.
+
+Mon Jun 14 18:33:08 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * syscalls.c (stat_worker): Consolidate calls to fh.fstat for both
+ directories and normal files.
+ * fhandler_tty.cc (fhandler_pty_master::close): Ensure that an "EOF
+ pulse" is sent to any executing child processes.
+ * path.cc (symlink_check_one): Check for ':\n' as well as '#!' to
+ determine if a file is executable.
+
+Mon Jun 14 16:04:00 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * fhandler_tty.cc (fhandler_pty_master::accept_input): Set read_retval
+ prior to performing a write to avoid a potential race condition.
+ * fhandler_termios.cc (fhandler_termios::line_edit): Don't set
+ read_retval here. It has to be set in an fhandler_tty accept_input.
+ * select.cc (peek_pipe): Fix typo which caused read_selected to be
+ tested twice rather than except_selected.
+ * shared.h (class tty_min): Remove read_retval from here.
+ (class tty) Put it here.
+
+Mon Jun 14 13:08:58 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * utils/Makefile.in: Consolidate and simplify.
+
+Mon Jun 14 12:43:32 1999 Christopher Faylor <cgf@cygnus.com>
+
+ Throughout, remove reliance on strace_* fields in pinfo class. Use
+ global instead. Remove STRACE_DUMP and STRACE_CACHE logic.
+ * pinfo.cc (set_myself): New function.
+ * dcrt0.cc (dll_crt0_1): Use the new function.
+ * environ.cc (parse_options): Remove strace environment variable logic.
+ (environ_init): Ditto.
+ * exceptions.cc (call_handler): Remove strace mutex considerations.
+ * fhandler_termios (fhandler_termios::line_edit): Remove STRACE_CACHE
+ logic.
+ * localtime.cc: Define 'lint' to eliminate warnings.
+ * smallprint.c (__small_vsprintf): Remove text formatting of windowss
+ errors. This is now done in the 'strace' program.
+ * strace.cc: Define 'strace_active' variable to control whether strace
+ should be carried out.
+ (strace_open): Delete.
+ (strace_init): Delete.
+ (get_strace_mutex): Delete.
+ (release_strace_mutex): Delete.
+ (strace_vsprintf): Preserve last error.
+ (strace_write): Communicate with strace program using
+ OutputDebugString.
+ (strace_dump): Delete.
+ (mark): Gut.
+ * winsup.h: Remove a declaration. Add a new one.
+ * include/sys/strace.h: Modify to accomodate new strace scheme.
+ * utils/Makefile.in: Build strace.exe
+ * utils/strace.cc: New file.
+
+Sat Jun 12 22:22:00 1999 Corinna Vinschen <corinna@vinschen.de>
+
+ * fhandler.cc (fhandler_disk_file::fstat): Must compute i-node numbers
+ via `get_namehash' for Windows 9x.
+
+Sat Jun 12 10:54:00 1999 Corinna Vinschen <corinna@vinschen.de>
+
+ * fhandler.cc (fhandler_base::read): Returns correct value
+ if raw_read fails.
+ * fhandler_raw.cc: More trace output.
+ * fhandler_floppy.cc: Ditto.
+ * fhandler_tape.cc: Ditto.
+
+Thu Jun 10 14:01:05 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * exceptions.c (handle_exceptions): Use ".stackdump"
+ extension instead of ".core".
+ * path.cc (mount_info::read_mounts): Prescan the mount lists
+ for /cygdrive stuff to delete rather than attempting to
+ delete it in the main "add mount loop".
+ (mount_item::getmntent): Fix "system"/"user" determination.
+ * winsup.h: Use void methods in thread classes where
+ appropriate.
+
+Wed Jun 9 23:16:04 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * mkvers.sh: Issue error if can't find version information.
+
+1999-06-09 DJ Delorie <dj@cygnus.com>
+
+ * localtime.c: new file; public domain timezone handling routines.
+ * tz_posixrules.h: new file; POSIX default timezone data
+ * times.cc: comment out localtime, gmtime, replace tzset with
+ cygwin_tzset
+ * Makefile.in: add localtime.c
+
+Wed Jun 9 00:49:04 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * spawn.cc (spawn_guts): Correctly handle #! processing when line
+ ends with white space. Also correctly handle scripts that do not
+ begin with #!.
+
+Mon Jun 7 17:04:36 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * fhandler_console.cc (fhandler_console::open): Need to initialize
+ tc here, too.
+ (fhandler_console::init): Initialize tc earlier.
+
+Mon Jun 7 00:02:51 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * fhandler.h (fhandler_termios): Move tc initialization
+ into init method, etc.
+ (fhandler_tty_common): Ditto.
+ * fhandler_console.cc (fhandler_console::fhandler_console):
+ Move tc initialization to init method.
+ (fhandler_console::init): Initialize tc stuff here.
+ (fhandler_console::dup): Ditto.
+ (fhandler_console::fixup_after_fork): Ditto.
+ (fhandler_console::de_linearize): Ditto.
+ * fhandler_termios (tcinit): Rename constructor.
+ Accept force argument to force termios initialization.
+ * fhandler_tty.cc (fhandler_tty_master::init): Move tc initialization
+ to common_init.
+ (fhandler_tty_common::dup): Use tcinit () to initialize tc field.
+ * tty.cc (tty::common_init): Ditto.
+
+Sun Jun 6 22:19:09 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * tty.cc (tty_list::terminate): Add \n to output message.
+ (tty::init): Clear slave_opened field or we can't reopen
+ ttys.
+
+Fri Jun 4 23:58:17 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * fhandler_tty.cc (fhandler_tty_slave::open): Reorganize
+ slightly to avoid a race with get_ttyp()->was_opened.
+
+1999-06-04 DJ Delorie <dj@cygnus.com>
+
+ * times.cc (totimeval): scale sub properly.
+ (gettimeofday): don't bias by timezone.
+
+Thu Jun 3 13:24:17 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * fhandler.h (fhandler_tty_common): Add two new methods.
+ * fhandler_tty.cc: Use new {acquire,release}_output_mutex
+ methods throughout for output_mutex.
+ (fhandler_tty_common::__acquire_output_mutex): New method.
+ (fhandler_tty_common::__release_output_mutex): New method.
+ * shared.h (get_output_mutex): Rename to open_output_mutex.
+
+Wed Jun 2 16:06:26 1999 Geoffrey Noer <noer@cygnus.com>
+
+ * utils/mkpasswd.c (main): account for long int args to printfs.
+
+Wed Jun 2 16:08:08 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * smallprint.c (__small_vsprintf): Conditionalize display of
+ textual messages under CYGWIN_TEXT_ERROR.
+ * ntea.cc: Remove debugging code.
+
+Wed Jun 2 16:04:00 1999 Corinna Vinschen <corinna@vinschen.de>
+
+ * dcrt0.cc (dll_crt0_1): Call the functions `get_admin_sid',
+ `get_system_sid' and `get_world_sid' before heap initialization
+ to avoid heap fragmentation.
+ * security.cc (get_nt_attribute): Don't allocate memory
+ anymore. All memory is taken from stack.
+ (set_nt_attribute): Ditto.
+ (alloc_sd): Ditto. Change parameters to get a pointer to a
+ preallocated security descriptor and a pointer to it's length.
+ * shared.cc (sec_user): Don't allocate memory anymore. All
+ memory is taken from stack. Change parameters to receive a
+ pointer to a preallocated security buffer.
+ * shared.h: Change prototype for `sec_user' and `sec_user_nih'.
+ * sigproc.cc (getsem): Change call to `sec_user'. Additonally
+ buffer for `sec_user'.
+ * spawn.cc (spawn_guts): Ditto.
+ Change all error output in function `sec_user' and in module
+ `security.cc' from error text to error number output.
+
+Tue Jun 2 21:54:21 1999 Corinna Vinschen <corinna@vinschen.de>
+
+ * net.cc (get_if_flags): Change the UP and RUNNING state
+ of disconnected RAS interfaces to true.
+
+Thu Jun 1 22:47:00 1999 Corinna Vinschen <corinna@vinschen.de>
+
+ * security.cc (get_system_sid): New function to create
+ a SID for the well known group of local system.
+ (alloc_sd): New function.
+ (alloc_sd): Give ALL permissions to `system'.
+ * shared.cc (sec_user): Give ALL permissions to `system'.
+ (sec_user): Provide additionalparameter for a second SID.
+ This is used for `CreateProcessAsUser' call.
+ (sec_user_nih): Ditto.
+ * shared.h: Change prototypes for `sec_user' and
+ `sec_user_nih'.
+ * spawn.cc (spawn_guts): Now using `sec_user' in
+ `CreateProcessAsUser' call, if ntsec is set.
+
+Thu Jun 1 14:17:00 1999 Corinna Vinschen <corinna@vinschen.de>
+
+ * utils/mkpasswd.c: Change to output native names of
+ well known groups `Everyone' (SID 0) and `system' (SID 18).
+ * utils/mkgroup.c: Ditto plus output of native name of
+ well known group `None' (SID 513).
+
+Mon May 31 22:10:57 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * path.h: Use bit mask flags in path_conv to save exec,
+ symlink, binary status. Use methods to access and set
+ these flags.
+ * fhandler.cc: Use methods to access path_conv flags
+ throughout.
+ * path.cc: (symlink-check_one): Accept a bitmask flags
+ variable to accomodate path_conv changes.
+ (path_conv::path_conv): Propagate path_flags from mount
+ table to path_conv class. Avoid walking the mount table
+ twice to find "binary" info.
+ (mount_info::conv_to_win32_path): Accept additional flags
+ argument. Don't add trailing slash if not required.
+ Fill out both paths when cygdrive.
+ (mount_info::cygdrive_win32_path): Change debugging output
+ slightly.
+ (mount_info::set_flags_from_win32_path): Generalize from
+ mount_info::binary_win32_path_p.
+ (mount_item::getmntent): Honor MOUNT_EXEC flag.
+ * shared.h: Add new method to mount_info class.
+ * include/sys/mount.h: Add a comment.
+ * utils/mount.cc: Accept -x to force a mountpoint to default
+ to executable permission. Rename automount stuff to cygdrive.
+
+Mon May 31 19:00:00 1999 Corinna Vinschen <corinna@vinschen.de>
+
+ * environ.cc (environ_init): Set ntsec option by default
+ if running under NT.
+ * security.cc (set_nt_attribute): Delete superfluoues code.
+ * shared.cc (sec_user): Don't set owner in created security
+ descriptor.
+ * sigproc.cc (getsem): Use `sec_user' instead of `sec_user_nih'.
+ * spawn.cc (spawn_guts): Set security attribute of
+ `CreateProcess' to `sec_user' if ntsec is set, `sec_all_nih'
+ otherwise.
+
+Mon May 31 19:27:36 1999 Christopher Faylor <cgf@cygnus.com>
+
+ Throughout, change "automount" to cygdrive.
+ Throughout, change mount flags from signed to unsigned.
+
+ * path.cc (iscygdrive): New macro.
+ (normalize_posix_path): Tack a '/' on the end of constructed
+ path only if there isn't one there already.
+ (mount_info::init): Simplify slightly.
+ (mount_info::conv_to_win32_path): Don't search for automount
+ stuff in the mount table. Instead special case the cygdrive
+ handling so that it will always be acceptable to use /cygdrive
+ regardless of other mounts.
+ (mount_info::cygdrive_posix_path): Rename from
+ build_automount_mountpoint_path. Fully build a posix path
+ given inputs.
+ (mount_info::cygdrive_win32_path): New function.
+ (mount_info::conv_to_posix_path): Precalculate the length
+ of the pathbuf for multiple uses. Just use cygdrive_posix_path
+ to derive a /cygdrive/x/foo style path.
+ (mount_info::read_mounts): Don't read /cygdrive/x mounts from
+ the registry. Delete them.
+ (mount_info::from_registry): Read cygdrive info earlier for
+ subsequent use by other mount routines.
+ (mount_info::add_reg_mount): Cosmetic changes.
+ (mount_info::read_cygdrive_info_from_registry): Always add
+ trailing slash to cygdrive. Precalculate the length of the
+ cygdrive.
+ (mount_item::getmntent): Cosmetic changes.
+ (mount): Return EINVAL on attempt to add a mount point which
+ begins with the current cygdrive.
+ * path.h: Remove unused script_p from path_conv class.
+ * shared.h: Add cygdrive_length to mount_list. Add new
+ cygdrive_win32_path method.
+ * include/sys/mount.h: Use enums for MOUNT_ constants.
+
+1999-05-29 Keith Seitz <keiths@cygnus.com>
+
+ * errno.cc (errmap): Map ERROR_NEGATIVE_SEEK to EINVAL.
+
+Fri May 28 21:43:56 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * times.cc (to_time_t): Rewrite slightly to avoid compiler
+ overoptimization.
+
+Fri May 28 21:10:33 1999 Corinna Vinschen <corinna@vinschen.de>
+
+ * sigproc.cc (getsem): Set security attribute of process
+ semaphore to `sec_user_nih()', if ntsec is set, `sec_none_nih'
+ otherwise.
+
+Wed May 26 22:56:51 1999 Christopher Faylor <cgf@cygnus.com>
+
+ Rename inuse_event and inuse_event_exists to "slave_alive"
+ throughout.
+ * shared.h: Eliminate inuse_event. Replace with a boolean.
+ Elminate slave_opened.
+ Add some function declarations used by new methods.
+ * fhandler_tty.cc (fhandler_pty_master::hit_eof): Use better
+ method for determining EOF for pty master.
+ (fhandler_tty_slave::open): Use method to acquire output_mutex.
+ Always create "inuse_event". Delete call to slave_opened.
+ (fhandler_tty_slave::write): Reorganize debugging output
+ slightly.
+ (fhandler_tty_master::close): Eliminate reference to inuse_event.
+ * tty.cc (tty_list::terminate): Eliminate call to slave_opened.
+ (tty_list::connect_tty): Use new exists() method to find out if
+ a tty exists.
+ (tty_list::allocate_tty): Rename argument for clarity. Use
+ new exists method to determine tty existence.
+ (tty::inuse): Delete.
+ (tty::init): Remove reference to inuse_event.
+ (tty::common_init): Ditto.
+ (tty::slave_opened): Delete.
+ * winsup.h: Move some function declarations to shared.h.
+
+Mon May 24 22:10:34 1999 Corinna Vinschen <corinna@vinschen.de>
+
+ * security.cc (WriteSD): Don't set errno, if BackupWrite()
+ returns ERROR_NOT_SUPPORTED.
+ * security.cc (set_nt_attribute): Change condition for
+ calling LookupAccountName() with domain name again.
+ * shared.cc (sec_user): Ditto.
+
+Mon May 24 22:10:34 1999 Corinna Vinschen <corinna@vinschen.de>
+
+ * include/winnt.h: Temporary erased definitions of QuadPart
+ in LARGE_INTEGER and ULARGE_INTEGER.
+ * security.cc (set_nt_attribute): Set standard attributes so
+ that reading and writing attributes for user and administrators
+ isn't hindered.
+
+Mon May 24 22:10:34 1999 Corinna Vinschen <corinna@vinschen.de>
+
+ * security.cc (ReadSD): New function.
+ * security.cc (WriteSD): Ditto.
+ * security.cc (get_admin_sid): Moved from shared.cc.
+ * security.cc (set_process_privileges): Moved from syscalls.cc,
+ shortened, changed return typ to int. Sets errno now.
+ * security.cc (set_file_attributes): Return type changed to int.
+ * security.cc (get_file_attributes): Ditto.
+ * security.cc (set_nt_attributes): Ditto. Cares for setting
+ of S_ISVTX now.
+ * security.cc (get_nt_attributes): Ditto.
+ * syscalls.cc (rel2abssd): #if 0'ed.
+ * syscalls.cc (set_process_privileges): Moved to security.cc.
+ * syscalls.cc (chown): Rewritten.
+ * syscalls.cc (chmod): Change call order of the functions
+ set_file_attributes() and SetFileAttributesA().
+ * fhandler.cc (fhandler_base::fstat): Change check for
+ return value of get_file_attributes().
+ * ntea.cc (NTReadEA): returns TRUE now, if allow_ntea is unset.
+ * ntea.cc (NTWriteEA): returns TRUE now, if allow_ntea is unset.
+ * shared.cc (get_admin_sid): Moved to security.cc.
+ * path.cc (symlink_check_one): Change check for return value
+ of get_file_attributes().
+
+Mon May 24 22:10:34 1999 Corinna Vinschen <corinna@vinschen.de>
+
+ * security.cc (get_world_sid): Rewrite.
+ * security.cc (world_full_access): Delete.
+ * grp.cc: Use gid 0 as default gid.
+ * grp.cc (read_etc_group): Look for account name of world group.
+ * fhandler.cc (fhandler_base::open): Call `set_file_attribute'
+ only in case of disk file.
+
+Mon May 24 22:10:34 1999 Corinna Vinschen <corinna@vinschen.de>
+
+ * security.cc (get_file_attribute): Patched incorrect test
+ for symlink.
+ * security.cc (set_file_attribute): ditto.
+
+Mon May 24 22:10:34 1999 Corinna Vinschen <corinna@vinschen.de>
+
+ * security.cc: Special handling for user and/or administrators
+ permissions to write (extended) attributes.
+
+Mon May 24 22:10:34 1999 Corinna Vinschen <corinna@vinschen.de>
+
+ * security.cc: Don't allow 513(none) as user or group.
+
+Mon May 24 22:10:34 1999 Corinna Vinschen <corinna@vinschen.de>
+
+ * security.cc: new functions `set_nt_attribute()', `get_nt_attribute()'
+ and `set_file_attribute()' with additional parameters `uid' and `gid',
+ to support real NT security.
+ * winsup.h: Prototype for `set_file_attribute()' with four
+ parameters.
+ * dir.cc (mkdir): Calls `set_file_attribute()' now.
+ * syscalls.cc (chown): ditto.
+ * syscalls.cc (chmod): ditto, with correct uid/gid.
+
+Mon May 24 22:10:34 1999 Corinna Vinschen <corinna@vinschen.de>
+
+ * shared.cc: New function `get_admin_sid()' to get a SID
+ of the administrators group or of administrator.
+ New functions `sec_user()' and `sec_user_nih()' to get
+ SECURITY_ATTRIBUTES with all permissions for the user and
+ the administtrator group.
+ * shared.h: Prototypes for the above new functions `sec_user()'
+ and `sec_user_nih()'.
+ * sigproc.cc (getsem): Create process semaphore with
+ permissions set by `sec_user()'.
+
+Mon May 24 20:29:29 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * fhandler_console.cc (fhandler_console::output_tcsetattr):
+ ONLRET was erroneously used in place of ONLCR.
+ (fhandler_console::read): Honor get_r_no_interrupt () so
+ that interrupts don't screw up tty reading.
+ * fhandler.h: Add some methods to fhandler_tty_master.
+ * fhandler_termios.cc (fhandler_termios::fhandler_termios):
+ ONLRET was erroneously used in place of ONLCR.
+ * fhandler_tty.cc (fhandler_tty_master::init): Associating
+ console capabilities with the tty capabilities is a bad
+ idea. Go back to using the console's own.
+ (fhandler_tty_master::fixup_after_fork): New method.
+ (fhandler_tty_master::de_linearize): New method.
+ (fhandler_tty_master::init_console): New method.
+
+Mon May 24 09:58:02 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * include/rapi.h: Add some more definitions.
+
+Sat May 22 21:45:01 1999 Mumit Khan <khan@xraylith.wisc.edu>
+
+ * scandir.cc (scandir): Handle errno correctly. Do preallocation to
+ reduce realloc calls.
+ (alphasort): Use strcoll, not strcmp.
+
+Sat May 22 19:03:47 1999 Mumit Khan <khan@xraylith.wisc.edu>
+
+ * dll_init.cc (DllList::recordDll): Forkee must reload dlopened
+ DLLs. Also use strcasematch, not strcmp to compare file name.
+
+Wed May 19 14:38:57 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * spawn.cc (linebuf::prepend): Fix possible reference to
+ uninitialized memory.
+ * winsup.h: Remove WINSUP_NO_CLASS_DEFS workaround.
+ * libccrt0.cc: Ditto.
+ * utils/cygwin.cc: Ditto.
+ * utils/mount.cc: Ditto.
+ * utils/ps.cc: Ditto.
+
+Sun May 16 17:22:50 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * include/winnt.h: Revert the previous reversion. The problem
+ with this include file was completely misdiagnosed.
+
+Sun May 16 16:05:07 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * sysdef/rapi.def: New definition file for RAPI.DLL.
+ * include/rapi.h: Preliminary RAPI declarations.
+
+Sun May 16 15:37:15 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * Makefile.in: Remove more obsolete code.
+
+Fri May 14 19:30:53 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * include/winbase.h: Change conditional to correctly refer
+ to UNDER_CE rather than UNICODE.
+
+Tue May 11 21:19:59 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * exceptions.cc (call_handler): Restore previously removed
+ 'leave' command as its absence causes programs to crash. It
+ should never have been deleted.
+
+Tue May 11 12:04:02 1999 Norbert Schulze <Norbert.Schulze@rhein-neckar.de>
+
+ * times.cc (timezone): Properly adjust for daylight savings time.
+ (gettimeofday): Ditto.
+ (localtime): Ditto.
+ (tzset): Ditto.
+
+Mon May 10 23:31:36 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * include/winnt.h: Revert to previous version. There are problems
+ with the previous checkin.
+ * fhandler_console.cc (fhandler_console::de_linearize): Add defensive
+ code to ensure that console handles are opened correctly.
+
+Sun May 9 22:31:31 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * Makefile.in: Forgot to remove a reference to the deleted targets
+ below.
+
+Fri May 7 17:28:12 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * Makefile.in: Remove obsolete code.
+ * exceptions.cc (set_process_mask): Make this a __stdcall.
+ * sigproc.h: Fix declaration of set_process_mask.
+ * include/winnls.h: Add new code page defines.
+ * include/winnt.h: Various fixes from Anders Norlander
+ <anorland@hem2.passagen.se>.
+
+Mon May 3 11:32:32 1999 Mumit Khan <khan@xraylith.wisc.edu>
+
+ * smallprint.c (__small_vsprintf): Display textual messages
+ for "%E" format type.
+ * dlfcn.cc (set_dl_error): Lose the "Win32 ".
+
+Sun May 2 12:22:17 1999 Mumit Khan <khan@xraylith.wisc.edu>
+
+ * utils/Makefile.in (EXE_LDFLAGS): Provide default.
+
+1999-04-30 DJ Delorie <dj@cygnus.com>
+
+ * winsup.h (WINSUP_NO_CLASS_DEFS): if defined, don't include class
+ definitions (work around gcc bug)
+ * libccrt0.cc (WINSUP_NO_CLASS_DEFS): define
+ * utils/cygwin.cc (WINSUP_NO_CLASS_DEFS): define
+ * utils/mount.cc (WINSUP_NO_CLASS_DEFS): define
+ * utils/ps.cc (WINSUP_NO_CLASS_DEFS): define
+
+Thu Apr 29 13:55:57 1999 Mumit Khan <khan@xraylith.wisc.edu>
+
+ * shared.h (read_mounts): Change prototype to accept a reference
+ to reg_key, not a copy.
+ * path.cc (read_mounts): Likewise.
+
+Thu Apr 29 11:06:37 1999 Mumit Khan <khan@xraylith.wisc.edu>
+
+ * configure.in (EXE_LDFLAGS): Always add newlib if part of the
+ build tree.
+ * configure: Regenerate.
+
+ * utils/Makefile.in (INCLUDES): Add newlib include directories.
+ (LDFLAGS): Replace this with
+ (ALL_LDFLAGS): this to avoid being overridden from higher level
+ Makefiles.
+
+Wed Apr 28 17:01:12 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * shared.cc (open_shared): Don't call OpenFileMapping with
+ a null name pointer. If the name is NULL it can't be opened.
+
+Fri Apr 23 00:28:38 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * winsup.h: Always clear memory in thread .create method or
+ suffer uninitialized pointers, etc.
+
+Wed Apr 21 03:56:54 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * fhandler_console.cc (fhandler_console::fhandler_console):
+ Set fork_fixup flag to ensure that shared info is duplicated.
+ (get_tty_stuff): Ensure that tty_stuff is initialized.
+ (fhandler_console::fixup_after_fork): Really force tc and
+ tty_stuff initialization. Close console handles or suffer
+ handle leak. (needs to be fixed)
+ (fhandler_console::de_linearize): Force tc and tty_stuff
+ initialization.
+
+Mon Apr 19 14:54:46 1999 Geoffrey Noer <noer@cygnus.com>
+
+ * include/cygwin/version.h: Bump CYGWIN_VERSION_API_MINOR to 12.
+
+Sat Apr 17 15:35:34 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * fhandler_console (fhandler_console::fixup_after_fork): Make sure
+ that new shared memory for console is initialized.
+ (fhandler_console::scroll_screen): Set region bottom correctly.
+ (fhandler_console::write_normal): Fix win95 problem where attribute
+ was propagated to scrolled region.
+ * include/wingdi.h: Fix GOBJENUMPROC prototype.
+
+Wed Apr 7 20:00:00 1999 John Fortin (fortinj@ibm.net)
+
+ * pthread.cc (pthread_suspend): New function.
+ (pthread_continue): Ditto.
+ * include/pthread.h: added pthread_suspend and pthread_continue
+ prototypes.
+ * cygwin.din: added above functions.
+ * thread.h: Add 'bool suspended' to class MTitem. Prototype
+ __pthread_suspend __pthread_continue.
+ * thread.cc (__pthread_suspend): New function.
+ (__pthread_continue): New function.
+
+Sun Apr 4 23:00:00 1999 John Fortin (fortinj@ibm.net)
+
+ * pthread.cc (pthread_join): New function.
+ (pthread_detach): New function.
+ * include/pthread.h: added pthread_join and pthread_detach prototypes.
+ * cygwin.din: added above functions for exports.
+ * thread.h: Added char joinable to MTitem class. Add void *
+ return_ptr to ThreadItem class to receive pointer from pthread_exit
+ and pthread_join. Add __pthread_join and __pthread_detach prototypes.
+ * thread.cc: Change thread_init_wrapper to set item->return_ptr=ret
+ and comment out item->used = false. Need to look at this more.
+ (__pthread_join): New function.
+ (__pthread_detach): New function.
+ (__pthread_exit): Implement ( was NOT_IMP ).
+ * thread.cc (MTinterface::FindNextUnused) : Use joinable != 'Y' as
+ an additional conditional. We may need to use this info in
+ pthread_join.
+
+Mon Apr 5 23:09:06 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * dcrt0.cc (do_exit): Change a variable name to minimize confusion.
+ * fhandler.h (fhandler_tty): Remove ttyp field in favor of get_ttyp
+ method.
+ * fhandler_tty.cc: Use get_ttyp () method to retrieve pointer to
+ tty device throughout.
+ (fhandler_tty_master::init): Point console tc at tty's tc so
+ that they share the same termios structure.
+ * select.cc (fhandler_tty_common::ready_for_read): Use get_ttyp
+ method.
+ * tty.cc (tty::common_init): Ditto.
+
+Mon Apr 5 00:22:30 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * fhandler_console.cc (fhandler_console::char_command): Make
+ setting of scrolling region cause the cursor to be placed at
+ the beginning of the scrolling region.
+ * thread.cc (__pthread_kill): Defend against item->sigs being
+ uninitialized.
+ (__pthread_sigmask): Defened against item->sigs being uninitialized.
+
+Wed Mar 31 22:52:18 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * dcrt0.cc (dll_crt0): Restore pointer to shared console
+ terminfo structure. This allows subprocesses to set
+ sticky console attributes.
+ * fhandler_console.cc (get_tty_styff): New function. Returns
+ pointer to shared console terminfo structure, allocating shared
+ memory if required.
+ (fhandler_console::fhandler_console): Use get_tty_stuff().
+ (fhandler_console::de_linearize): Ditto.
+ * fork.cc (fork): Save shared console handle for export to
+ subprocesses.
+ * spawn.cc (spawn_guts): Ditto.
+ * shared.cc (open_shared_file_map): Rewrite to use generic
+ open_shared() function.
+ (open_shared): New function. Generic shared memory open
+ used by console and cygwin shared memory.
+ * shared.h: Define new stuff used by above.
+
+Wed Mar 31 01:46:23 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * fhandler.h (fhandler_tty): Set tc = ttyp.
+ * fhandler_tty.cc (fhandler_tty_master::init): Ditto.
+ (fhandler_tty_common::dup): Ditto.
+ * tty.cc (tty::common_init): Ditto.
+
+Wed Mar 31 01:43:06 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * path.cc (mount_info::conv_to_win32_path): Reorganize to
+ correctly handle //x syntax.
+
+Tue Mar 30 14:42:05 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * strace.cc (strace_vsprintf): Fix incorrect buffer reference.
+
+Mon Mar 29 22:46:16 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * debug.cc (__lock): Return value for gcc bug workaround.
+ (__unlock): Ditto.
+ * fhandler_tty.cc (fhandler_tty_master::init): Remove extraneous
+ console initialization. Set termios to sensical values before
+ initializing the console.
+ (fhandler_tty_slave): Add some debugging output.
+ * strace.cc: Conditionalize stuff not required by STRACE_HHMMSS.
+ (strace_vsprintf): Remove dependency on time() for STRACE_HHMMSS.
+
+Mon Mar 29 10:50:00 Corinna Vinschen <corinna.vinschen@cityweb.de>
+
+ * utils/passwd.c (GetPW): Correct cast in call to `NetUserGetInfo'.
+
+Sun Mar 28 16:54:57 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * fhandler.h: Remove tty_stuff field from fhandler_console
+ class. Use global instead to allow all console opens to
+ use same settings.
+ * fhandler_console.cc: Add new global.
+ (fhandler_console::tcgetattr): Use new global for initialization.
+ (fhandler_console::de_linearize): Ditto.
+ * fhandler_termios.cc (fhandler_termios::fhandler_termios): Don't
+ reinitialize an already initialized termios. Do not honor
+ CYGWIN=binmode for console output. It's too confusing.
+ * shared.h: Add `initialized' field to tty_min.
+
+Sun Mar 28 01:55:32 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * path.cc (path_prefix_p_): Add defensive code.
+ (slash_drive_prefix_p): Use macro to detect whether a character
+ is a path separator.
+ (mount_info::conv_to_win32_path): Rewrite to correctly handle
+ relative paths.
+ * strace.cc (strace_printf): Remove extraneous save of LastError.
+ * winsup.h (per_thread): Return TlsSetValue value. This seems
+ to work around a g++ bug.
+
+Thu Mar 25 13:00:00 Corinna Vinschen <corinna.vinschen@cityweb.de>
+
+ * fhandler_raw.cc (fhandler_dev_raw::dup): New method.
+ * fhandler_tape.cc (fhandler_dev_tape::dup(): Ditto.
+ * fhandler.h: Added prototypes for the formentioned methods.
+
+Wed Mar 24 23:00:00 Corinna Vinschen <corinna.vinschen@cityweb.de>
+
+ * fhandler_raw.cc (fhandler_dev_raw::linearize):
+ Only calling base class implementation now.
+ * fhandler_raw.cc (fhandler_dev_raw::de_linearize):
+ Only calling base class implementation and allocating devbuf now.
+ * fhandler_tape.cc (fhandler_dev_tape::linearize): Erased.
+ * fhandler_tape.cc (fhandler_dev_tape::de_linearize): Erased.
+ * fhandler_tape.cc (fhandler_dev_tape::fhandler_dev_tape):
+ Additional call to `set_cb()'.
+ * fhandler_floppy.cc (fhandler_dev_floppy::fhandler_dev_floppy):
+ Ditto.
+ * fhandler.h: Erased prototypes for linearize and de_linearize
+ methods of class fhandler_dev_tape.
+
+Thu Mar 25 14:05:57 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * signal.cc (pause): Make sure that signal has been dispatched
+ prior to pause returning.
+
+Wed Mar 24 20:04:21 1999 Christopher Faylor <cgf@cygnus.com>
+
+ Change get_input_handle to get_io_handle throughout.
+ Change output_handle_ to output_handle throughout.
+ Use sys/termios.h only where needed.
+ * Makefile.in: Add new object.
+ * fhandler.cc (fhandler_base::puts_readahead): New function.
+ Adds a string to the read ahead buffer.
+ (fhandler_base::put_readahead): New function. Adds a character
+ to the read ahead buffer.
+ (fhandler_base::get_readahead): New function. Gets a character
+ from the read ahead buffer.
+ (fhandler_base::peek_readahead): New function. Returns character
+ at beginning or end of read ahead buffer.
+ (fhandler_base::set_readahead_valid): Augmented from fhandler.h.
+ (fhandler_base::eat_readahead): Eat a character from the read
+ ahead buffer.
+ (fhandler_base::de_linearize): Reset read ahead info.
+ (fhandler_base::read): Honor new read ahead mechanism.
+ (fhandler_base::fhandler_base): Don't set binmode to default
+ if it has already been explicitly set.
+ * fhandler.h: Add *BINSET flags to track whether the binary
+ mode has been turned on or off explicitly.
+ (fhandler_base): Add elements for new read ahead method. Remove
+ old `readahead_'.
+ (fhandler_termios): New base class.
+ (fhandler_console): Use fhandler_termios base class.
+ Add new de_linearize method.
+ (fhandler_tty_common): Rewrite to use fhandler_termios base class.
+ (fhandler_pty_master): Ditto.
+ (fhandler_tty_master): Ditto.
+ * fhandler_console (fhandler_console::read): Rewrite to use functions
+ from fhandler_termios and read ahead for line editing.
+ (fhandler_console::read1): Remove.
+ (fhandler_console::open): Interruptible I/O is now handled in the
+ read function. Mark this.
+ (fhandler_console::output_tcsetattr): Use ONLRET to control
+ binary behavior since it is more closely analgous.
+ (fhandler_console::input_tcsetattr): Don't set console flags if
+ there is no change or Windows 95 will eat input.
+ (fhandler_console::tcsetattr): Use ONLRET to control binary behavior
+ since it is more closely analgous.
+ (fhandler_console::fhandler_console): Accomodate fhandler_termios
+ base class.
+ (fhandler_console::init): Ditto.
+ (fhandler_console::igncr_enabled): Ditto.
+ (fhandler_console::char_command): Use new read ahead method.
+ (fhandler_console::de_linearize): New function.
+ * fhandler_serial.cc: Need additional include.
+ * fhandler_tty.cc (fhandler_tty_master::fhandler_tty_master):
+ Accomodate fhandler_termios base class.
+ (fhandler_tty_master::init): Ditto.
+ (fhandler_tty_master::accept_input): New function. Sends
+ (possibly line-edited) input to slave.
+ (process_input): Use line editing capabilities of fhandler_termios
+ base class when processing input.
+ (fhandler_tty_slave::open): Accomodate fhandler_termios base class.
+ (fhandler_tty_slave::tcgetattr): Ditto.
+ (fhandler_tty_slave::ioctl): Ditto.
+ (fhandler_pty_master::fhandler_pty_master): Ditto.
+ (fhandler_pty_master::read): Ditto.
+ (fhandler_tty_slave::dup): Be more paranoid about setting output
+ handle in case of error.
+ * fhandler_tty.h: Accomodate new tty_min base class in tty class.
+ * hinfo.cc (hinfo::build_fhandler): Send tty 'unit' to constructor.
+ * select.cc (peek_console): Send resize event to window regardless
+ of tty setting. Eliminate ReadFile kludge.
+ * shared.h (tty_min): Rename termios field to avoid conflict.
+ * tty.cc (create_tty_master): Send tty number to build_fhandler.
+ (tty::common_init): Remove termios initialization. It's handled
+ via fhandler_termios, now.
+ * fhandler_termios: New file. Contains methods for dealing with
+ fhandler_termios class.
+
+Wed Mar 24 19:22:04 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * exceptions.cc (call_handler): Reorder to work around
+ gcc bug.
+
+Sun Mar 21 21:26:43 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * fhandler_serial.cc (fhandler_serial::raw_read): Protect
+ against uninitialized variable. Output debug info if
+ ClearCommError fails. Clear overlapped I/O on error or
+ signal.
+ (fhandler_serial::tcflow): Output debug info at start of
+ routine.
+ (fhandler_serial::tcsetattr): Add more debugging output.
+ Avoid re-setting parameters if there has been no change.
+ Setting parameters via SetCommState seems to cause loss of
+ input on Windows 9[58].
+
+Wed Mar 17 12:56:25 1999 Geoffrey Noer <noer@cygnus.com>
+
+ * include/winbase.h: Fix AllocateAndInitializeSid proto.
+
+Tue Mar 16 21:55:12 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * exceptions.cc (handle_exceptions): Always wait for sig_send
+ to exit or races can result.
+
+Tue Mar 16 13:04:34 1999 Geoffrey Noer <noer@cygnus.com>
+
+ * include/cygwin/version.h: Bump CYGWIN_VERSION_API_MINOR to 11.
+
+Tue Mar 16 15:44:10 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * cygwin.din: Export telldir/seekdir.
+
+Tue Mar 16 13:50:51 1999 Corinna Vinschen <corinna.vinschen@cityweb.de>
+
+ * dir.cc: Change unused struct member __d_find_first_called to
+ __d_position for use in new functions.
+ (telldir): New function. Returns current position in DIR stream.
+ (seekdir): New function. Seeks to new position in DIR stream.
+
+Mon Mar 15 19:17:23 1999 Geoffrey Noer <noer@cygnus.com>
+
+ * sysdef/comctl32.def: Add InitCommonControlsEx.
+
+Mon Mar 15 19:45:10 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * dir.cc (mkdir): Remove final slash from a directory if
+ appropriate or windwows won't create the directory.
+ * errno.cc: Change text for EAGAIN to something a little
+ more sensical.
+ * exceptions.cc (call_handler): Add a debug message.
+ * fhandler.cc (fhandler_base::open): Don't attempt to set
+ the position of a com device.
+ * fhandler_serial.cc (fhandler_serial::raw_read): Reset
+ overlapped event if not armed. Don't attempt to find out
+ if characters are available if vmin_.
+ (fhandler_serial::raw_write): Clear pending I/O when
+ necessary.
+ (fhandler_serial::open): Set comm state to current rather
+ than zeroing.
+ (fhandler_serial::tcflush): Don't use "queue" as a flag.
+ TCI* defines are not bit masks.
+ * select.cc (peek_serial): Add debugging output.
+ * sigproc.cc (wait_sig): Minor cleanup.
+ * path.cc (nofinalslash): Make global.
+ * winsup.h: Ditto.
+
+Mon Mar 15 16:31:29 1999 Geoffrey Noer <noer@cygnus.com>
+
+ * include/winnt.h: Add RID defs/protos from MSDN docs.
+ (SECURITY_*_RID, DOMAIN_*_RID*, etc.)
+ * include/richedit.h: Add missing SCF_* defines.
+ * include/commctrl.h: Add missing PBM_ defines, PBRANGE struct.
+
+Mon Mar 15 12:54:48 1999 Geoffrey Noer <noer@cygnus.com>
+
+ * Makefile.in: Don't install include/Windows32 since it doesn't
+ exist any more.
+ * include/cygwin/version.h: Bump CYGWIN_VERSION_API_MINOR to 10.
+
+1999-03-12 DJ Delorie <dj@cygnus.com>
+
+ * net.cc (gethostbyname): support a.b.c.d notation internally,
+ in case there's no DNS at least partial support is there.
+
+Wed Mar 10 19:22:46 1999 Geoffrey Noer <noer@cygnus.com>
+
+ * include/commdlg.h: Add missing PageSetupDlg defines.
+
+Tue Mar 9 14:28:14 1999 Geoffrey Noer <noer@cygnus.com>
+
+ * include/*.h: Switch Win32 API header file set to the one written
+ by Anders Norlander <anorland@hem2.passagen.se>. Headers now
+ fit the standard Win32 API header layout and are more complete.
+ These correspond to Anders' headers, version 0.1.5. Please read
+ sysdef/README for more information.
+ * include/Windows32/*.h: Delete in favor of above definitions.
+
+ Changes to support the above:
+ * fhandler_console.cc (fhandler_console::char_command): Add newly
+ needed cast to DWORD *.
+ * fhandler_serial.cc (fhandler_serial::raw_read): Make n, minchars
+ DWORDs.
+ * fhandler_tty.cc: Include limits.h.
+ (fhandler_pty_master::doecho): Second arg is now DWORD.
+ (fhandler_pty_master::process_input_to_sl): Make n, written DWORD.
+ (fhandler_pty_master::process_slave_outpu): Make n DWORD.
+ (fhandler_tty_slave::close): Make towrite, n DWORDs.
+ (fhandler_tty_slave::write): Make n DWORD.
+ * fhandler.h: Adjust fhandler_pty_master::doecho proto.
+ * hinfo.cc: Include file reordering.
+ * malloc.cc: Ditto.
+ * net.cc: Ditto.
+ * fhandler_tape.cc (get_ll): Need to reference .u in
+ LARGE_INTEGER usages.
+ * ntea.cc: Ditto.
+ * pinfo.cc: Include limits.h.
+ * spawn.cc: Ditto.
+ * uinfo.cc: Ditto.
+ * uname.cc (uname): sysinfo struct now has anon union.
+ Adjust sprintf for dwProcessorType being a long now.
+ * syscalls.cc: Include limits.h and lmcons.h. Throughout,
+ reference .u in LARGE_INTEGER usages.
+ (logout): Make rd a DWORD.
+
+ * utils/mkgroup.c: Always include lmaccess.h and lmapibuf.h.
+ Include stdio.h.
+ (enum_groups): Adjust for longs in fprintfs.
+ (main): Ditto.
+ * utils/mkpasswd.c: Include lmaccess.h and lmapibuf.h.
+ (enum_users): Adjust for longs in fprintfs.
+ (main): Ditto.
+ (enum_local_groups): Ditto.
+ * utils/passwd.c: Remove many Win32 API defines now in new
+ Win32 headers. Include lmaccess.h, lmerr.h, lmcons.h,
+ lmapibuf.h.
+ (PrintPW): Adjust for longs in fprintfs.
+
+Wed Mar 3 21:14:45 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * environ.cc (environ_init): Fix off-by-one error in initial
+ environment allocation.
+ * fhandler_serial.cc (fhandler_serial::tcflush): Use different
+ method for flushing since serial handles are now opened for
+ overlapped I/O.
+ * select.cc (cygwin_select): Make degenerate case interruptible.
+ * sigproc.cc (proc_exists): Recognize all kinds of myself pointers
+ as "existing".
+
+Tue Feb 16 23:00:48 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * include/Windows32/Functions.h: Correct two #ifndefs that were
+ switched.
+
+Mon Feb 15 22:41:54 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * spawn.cc (spawn_guts): Fix incorrect arg length when
+ constructing new arguments for #!.
+
+Fri Feb 12 13:25:50 1999 Drew Moseley <dmoseley@cygnus.com>
+
+ * Makefile.in (install-info): Test for file existence before installing.
+
+Fri Feb 12 13:17:49 1999 Corinna Vinschen <corinna.vinschen@cityweb.de>
+
+ * fhandler.cc (fhandler_disk_file::fstat): Handles directories,
+ returns unique i-node number.
+ * syscalls.cc (stat_worker): On WinNT, stat_worker calls
+ fhandler_disk_file::fstat for directories, too.
+
+1999-02-10 DJ Delorie <dj@cygnus.com>
+
+ * doc/doctool.c (scan_directory): check for opendir failing,
+ add closedir.
+
+Tue Feb 9 13:02:25 1999 Geoffrey Noer <noer@cygnus.com>
+
+ * utils/mount.cc: Add fixme.
+ * doc/doctool.c: Correct typo in comment.
+
+Mon Feb 8 17:29:58 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * include/Windows32/UnicodeFunctions.h: Fix incorrect use of
+ BOOL -> WINBOOL.
+ * Windows32/ASCIIFunctions.h: Ditto.
+
+Fri Feb 5 09:38:25 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * path.cc (mount_info::add_item): Ensure that drive names
+ are added using X: notation.
+
+Thu Feb 4 00:28:58 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * path.cc (path_prefix_p_): Recognize ':' as a path separator.
+ (mount_info::conv_to_posix_path): Detect case where a '/' has
+ to be added to a path being constructed.
+ (realpath): Ensure that the full path name is returned.
+
+Wed Feb 3 22:57:42 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * shared.h (mount_info): Add two separate arrays to track
+ reverse sorting of win32/posix paths.
+ * path.cc (sort_by_posix_name): New function. Sorts by
+ posix path.
+ (sort_by_native_name): Rename from sort_by_name.
+ (mount_info::conv_to_win32_path): Use native sort order
+ when iterating through mount table.
+ (mount_info::binary_win32_path_p): Ditto.
+ (mount_info::getmntent): Ditto.
+ (mount_info::conv_to_posix_path): Use posix sort order
+ when iterating through mount table.
+ (sort): Use two arrays to track sorting of mount table.
+ (mount_info::add_item): Simplify slightly.
+
+Wed Feb 3 15:17:54 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * cygwin.din: Remove DATA attribute which was erroneously
+ added to __errno.
+
+Tue Feb 2 23:10:18 1999 Geoffrey Noer <noer@cygnus.com>
+
+ * path.cc: Fix comment regarding UNC paths in mount table.
+ (mount_info::conv_to_win32_path): Add back code to handle
+ //<drive> paths for now. The plan is still to remove it again at
+ a later date.
+ (mount_info::slash_drive_to_win32_path): New. Convert a //<drive>
+ path to a Win32 path. Bring back from among the recently departed
+ path functions.
+ * shared.h: Add mount_info proto for slash_drive_to_win32_path.
+
+Tue Feb 2 22:52:43 1999 Geoffrey Noer <noer@cygnus.com>
+
+ * include/lmaccess.h: Add stub.
+ * include/shlobj.h: Add stub.
+
+Tue Feb 2 22:34:06 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * shared.h: Change magic number associated with fork/exec
+ information as a temporary measure to eliminate strange
+ core dumps with multiple versions of cygwin1.dll.
+
+1999-02-02 Brendan Kehoe <brendan@cygnus.com>
+
+ * Makefile.in (readme.txt): Add missing -I$(srcdir)/doc.
+
+Tue Feb 2 01:10:31 1999 Geoffrey Noer <noer@cygnus.com>
+
+ * sysdef/*: Replace all files with new ones by Anders
+ Norlander <anorland@hem2.passagen.se>. Please read sysdef/README
+ for more information.
+
+Mon Feb 1 14:55:11 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * path.cc (sort_by_name): Sort based on length of native_path
+ to ensure maximal match when converting from native -> UNIX.
+ * cygwin.din: Make more data variables DATA.
+
+Mon Feb 1 13:31:43 1999 Geoffrey Noer <noer@cygnus.com>
+
+ * fhandler_tape.cc: Change all fhandler_tape private functions
+ to be named foo_bar_baz-style instead of FooBarBaz. Add some
+ parens around logical ors/ands for clarity. Respace.
+ * fhandler.h: Change protos here in light of above.
+
+Thu Jan 28 11:00:00 Corinna Vinschen <corinna.vinschen@cityweb.de>
+
+ * errno.cc: Support for Windows errors ERROR_CRC and ERROR_NO_READY
+ and for error ENOMEDIUM.
+
+Wed Jan 27 01:05:39 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * dir.cc (rmdir): Correct errno setting when attempting to rmdir
+ a non-directory.
+
+Tue Jan 26 17:36:12 1999 Geoffrey Noer <noer@cygnus.com>
+
+ * registry.cc (reg_key::build_reg): Add FIXME.
+
+Tue Jan 26 01:30:48 1999 Geoffrey Noer <noer@cygnus.com>
+
+ * path.cc (mount_info::from_registry): Import old v1 mounts
+ only if current mount layout doesn't exist yet in both user
+ and system areas (when had_to_create_mount_areas == 2).
+ (mount_info::import_v1_mounts): New, was upgrade_v1_mounts.
+ (mount_info::from_v1_registry): Add missing comma in reg_key
+ creation call.
+ (mount_info::init): Init had_to_create_mount_areas to zero.
+ * external.cc (cygwin_internal): Fix reference to
+ upgrade_v1_mounts.
+ * shared.h: Change upgrade_v1_mounts proto to import_v1_mounts.
+ Add new had_to_create_mount_areas variable in mount_info class.
+ * registry.cc (reg_key::build_reg): Increment
+ had_to_create_mount_areas whenever we create a new mount area.
+
+ * include/sys/mount.h: Don't define MOUNT_EXEC until we actually
+ implement this functionality.
+
+ * utils/mount.cc (do_mount): Print warning messages after the
+ actual mount attempt so we don't see warnings when mount fails.
+ (usage): Change name of --upgrade-old-mounts flag to
+ --import-old-mounts.
+ (main): Ditto.
+
+Mon Jan 25 23:56:50 1999 Geoffrey Noer <noer@cygnus.com>
+
+ * errno.cc (seterrno_from_win_error): New. Given a Windows
+ error code, set errno accordingly.
+ (seterrno): Just call seterrno_from_win_error with the
+ error code returned by a call to GetLastError.
+ * winsup.h: Define __seterrno_from_win_error.
+ * path.cc: Clean up more function description comments.
+ (mount_info::add_reg_mount): Don't need res, just return the
+ right values.
+ (del_reg_mount): Return int, not void. If we're deleting a
+ system mount, set errno to EACCES and return -1 if we don't
+ have a valid key handle. If mount delete fails, set errno
+ accordingly and return -1. Otherwise, return zero for success.
+ (cygwin_umount): Delete mount from registry first, only remove
+ from internal table if successful.
+ * shared.h: Make del_reg_mount proto return int.
+
+Mon Jan 25 22:40:15 1999 Geoffrey Noer <noer@cygnus.com>
+
+ * path.cc (mount_info::mount_slash): Add mount to registry
+ first, only add to internal table if successful.
+ (mount_info::conv_to_posix_path): Ditto.
+ (mount): Ditto.
+ (mount_info::add_reg_mount): Return int, not void. If we're
+ writing a system mount, first check if we have a valid key handle.
+ If we don't, set errno to EACCES and return -1. Otherwise return
+ zero for success.
+ * shared.h: Make add_reg_mount proto return int.
+
+Mon Jan 25 20:40:26 1999 Geoffrey Noer <noer@cygnus.com>
+
+ * path.cc (mount_info::init): Don't read automount info here.
+ (mount_info::from_registry): Read it here instead. Also, read
+ system registry info in KEY_READ mode.
+ (mount_info::read_mounts): Read mount info with KEY_READ access
+ permissions.
+
+Mon Jan 25 19:12:31 1999 Geoffrey Noer <noer@cygnus.com>
+
+ * path.cc: Improve several function description comments.
+ (mount_info::init): Read automount information from the
+ registry before potentially automounting slash.
+ (mount_info::conv_to_posix_path): Create automount with
+ automount_flags flags.
+ (mount): Now flags is more than just a toggle so we
+ must check it in a different manner. And simply check
+ MOUNT_AUTO as the indicator. If we want to change the
+ automount_prefix, also change automount_flags as appropriate.
+ Fix args to syscall_printf.
+ (write_automount_info_to_registry): New. Was
+ write_automount_prefix_to_registry.
+ (read_automount_info_from_registry): New. Was
+ read_automount_prefix_from_registry.
+ * shared.h: Adjust protos for function renames just mentioned.
+ * include/sys/mount.h: Delete MOUNT_CHANGE_AUTOMOUNT_PREFIX
+ since we don't really need it.
+ * utils.cc (mount): Pass MOUNT_AUTO as indicator of desire to
+ change automount prefix.
+ (show_mounts): Change spacing so there's room for "system,auto"
+ in Type column.
+
+Mon Jan 25 13:17:40 1999 Geoffrey Noer <noer@cygnus.com>
+
+ * path.cc: Change all references from "automount root" to
+ "automount prefix", avoiding potential nomenclature confusion
+ with the root of the file system.
+ (read_automount_prefix_from_registry): New. Was
+ read_automount_root_from_registry.
+ (read_automount_prefix_from_registry): New. Was
+ read_automount_root_from_registry. Also read the default
+ flags for automounts from registry at the same time.
+ (write_automount_prefix_to_registry): New. Was
+ write_automount_root_to_registry. Also set automount flags
+ in registry using new auto_flags arg.
+ (mount): Add flags arg to write_automount_prefix_to_registry call.
+ * shared.h: Add automount_flags variable to mount_info class.
+ Adjust protos for function renames listed above.
+
+ * include/sys/mount.h: Comment out MOUNT_MIXED and MOUNT_SILENT
+ whose values could be reused now that we're using a new mount
+ layout. Change MOUNT_CHANGE_AUTOROOT to
+ MOUNT_CHANGE_AUTOMOUNT_PREFIX.
+
+ * utils/mount.cc (change_automount_prefix): New. Was
+ change_automount_root. Add new flags argument so it's possible
+ to change the default automount flags.
+ (main): Option name change from --change-automount-root to
+ --change-automount-prefix.
+ (usage): Update in light of option changes.
+ * utils/umount.cc (remove_all_automounts): Also need to check
+ for mnt_type looking like "system,auto" now that it's possible
+ for automounts to be located in the system registry.
+
+Mon Jan 25 08:59:04 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * spawn.cc (linebuf::add): Ensure that there is always
+ enough space for line being added. Always null terminate.
+ (linebuf::prepend): Ditto.
+
+Sat Jan 23 01:30:16 1999 Geoffrey Noer <noer@cygnus.com>
+
+ Make mount.exe able to upgrade mounts:
+ * external.cc: Fix file description.
+ (cygwin_internal): Handle CW_READ_V1_MOUNT_TABLES case, in
+ which case call upgrade_v1_mounts to upgrade old registry
+ area mounts.
+ * external.h: Add CW_READ_V1_MOUNT_TABLES to enum.
+ * shared.h: Make upgrade_v1_mounts public.
+
+ * utils/mount.cc: Include winsup.h, external.h, undef errno since
+ it's defined by winsup.h.
+ (usage): Add --upgrade-old-mounts option to usage info.
+ (main): Handle --upgrade-old-mounts flag by calling
+ cygwin_internal with the right constant.
+
+Sat Jan 23 00:40:17 1999 Geoffrey Noer <noer@cygnus.com>
+
+ First pass at mount table backwards compatibility with v1
+ mounts:
+ * path.cc (mount_info::from_registry): For now, upgrade from
+ old v1 mount registry area if nmounts==0 after reading new mount
+ areas.
+ (mount_info::read_v1_mounts): New function. Given a regkey, read
+ the mounts in the old v1 registry layout corresponding to the key.
+ A "which" arg tells us which registry we're reading so that we
+ can include MOUNT_SYSTEM when reading old system mounts.
+ (mount_info::from_v1_registry): New function. Retrieve old v1
+ mount table area mounts.
+ (mount_info::upgrade_v1_mounts): New function. Retrieve old
+ v1 mounts, add them to the current registry mount location.
+ (mount_info::to_registry): New function. For every mount in
+ the internal mount table, add it to the correct registry.
+ * shared.h: Add protos for new mount_info functions --
+ from_v1_registry, read_v1_mounts, upgrade_v1_mounts, to_registry.
+ Don't need class name in protos for
+ build_automount_mountpoint_path, write_automount_root_to_registry,
+ and read_automount_root_from_registry.
+
+Fri Jan 22 22:45:07 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * spawn.cc (spawn_guts): Arg 2 missing from special case
+ command/cmd handling.
+
+Fri Jan 22 22:40:32 1998 Corinna Vinschen <corinna.vinsche@cityweb.de>
+
+ * fhandler_raw.cc (fhandler_dev_raw::raw_read): bytes_to_read
+ corrected to multiple of 512 bytes instead of multiple to
+ devbufsiz. Insert break on ReadFile returned 0 Bytes.
+
+Fri Jan 22 15:50:49 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * mkvers.sh: Fix handling of CVS tag output.
+ * errno.cc: Mark exported data as __declspec(dllexport).
+ * times.cc: Ditto.
+ * fhandler.cc (fhandler_base::open): Yet another stab
+ at correcting handling of binmode/textmode ramifications.
+ * path.cc (hash_path_name): Make /. == '' for purposes
+ of generating a hash.
+
+Fri Jan 22 11:45:28 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * path.cc (slash_unc_prefix_p): Generalize to allow
+ either type of slash.
+ (mount_info::add_item): Don't disallow UNC specs in
+ the mount table.
+ * utils/Makefile.in: Always use current stub library.
+
+Fri Jan 22 08:52:36 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * environ.cc (regopt): Use correct registry key for Program
+ Options given new mount layout.
+ * cygwin.din: export __mb_cur_max from newlib.
+
+Thu Jan 21 16:52:20 1999 Geoffrey Noer <noer@cygnus.com>
+
+ * path.cc (cygwin_split_path): Adjust two FIXMEs.
+ (mount_info::write_automount_root_to_registry): Return int,
+ 0 on success, -1 if path is problematic.
+ (mount): Check return of write_automount_root_to_registry
+ and act appropriately. Do syscall_printf when adjusting automount
+ as well as regular mount.
+ * shared.h: mount_info::write_automount_root_to_registry now
+ returns an int.
+ * utils/mount.cc (main): don't sanity-check automount path
+ here, instead let the DLL take care of that.
+
+Thu Jan 21 17:12:26 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * spawn.cc (spawn_guts): Rewrite argument handling for
+ cleaner, one-pass operation.
+ (linebuf::add): New method for adding arguments to end
+ of the argument list.
+ (linebuf::prepend): New method for pushing arguments on
+ the front of the argument list.
+
+Wed Jan 20 19:06:30 1999 Geoffrey Noer <noer@cygnus.com>
+
+ * path.cc (mount_info::mount_slash): only call add_reg_mount if
+ add_item succeeded.
+ (mount_info::add_item): Fail if native path doesn't start with
+ <drive letter>: or if posix path doesn't start with a slash.
+
+Wed Jan 20 19:06:30 1999 Geoffrey Noer <noer@cygnus.com>
+
+ * fhandler_raw.cc: Correct copyright date, reformat.
+ * fhandler_floppy.cc: Ditto.
+ * fhandler_tape.cc: Ditto.
+
+Wed Jan 20 17:54:02 1999 Geoffrey Noer <noer@cygnus.com>
+
+ Remove //<drive>/ support. Add support for automounts in
+ user registry area.
+ * path.cc: Rewrite, reformat docs at top in light of removing
+ //<drive>/ support and new automount support. Add more function
+ description comments.
+ (slash_drive_prefix_p): Remove function.
+ (build_slash_drive_prefix): Ditto.
+ (slash_drive_to_win32_path): Ditto.
+ (mount_info::init): After everything else, read the automount_root
+ by calling read_automount_root_from_registry().
+ (mount_info::mount_slash): Automount slash with MOUNT_AUTO.
+ (mount_info::conv_to_win32_path): Remove //<drive>/ support code.
+ (mount_info::build_automount_mountpoint_path): Construct the name
+ of an automount POSIX path, given automount_root and the Win32
+ path that needs to be automounted.
+ (mount_info::conv_to_posix_path): Automount missing drive letter
+ and call conv_to_posix_path again if path isn't covered by the
+ mount table but starts with "<letter>:".
+ (mount_info::read_automount_root_from_registry): New function.
+ Read in the value of automount_root from the current_user
+ registry mount area. If there isn't one, use default of
+ "/cygdrive" and write that to the registry by calling
+ write_automount_root_to_registry().
+ (write_automount_root_to_registry): Write a value of
+ automount_root to the user registry area.
+ (mount_info::del_item): Add new flags arg to specify which
+ registry to delete the mount from.
+ (mount_info::del_reg_mount): Ditto.
+ (mount_item::getmntent): Use mount_info mnt_foo strings to store
+ strings passed back in the mntent struct. Otherwise if you
+ delete a mount item while using getmntent, the pointer may
+ change on the user. Add ",auto" to mnt_type if MOUNT_AUTO flag is
+ set.
+ (mount): Add support to set auto_root to path if flags is set
+ to the special MOUNT_CHANGE_AUTOROOT flag otherwise do the normal
+ thing.
+ (umount): Call cygwin_umount with flags value of 0.
+ (cygwin_umount): New exported function. Same as umount but
+ takes an additional flag argument that specifies which registry
+ area from which umount should remove the mount point.
+ * cygwin.din: Export the cygwin_umount call.
+ * shared.h (mount_info): Add public automount_root string.
+ Add public proto for write_automount_root_to_registry().
+ Add private protos for build_automount_mountpoint_path() and
+ read_automount_root_from_registry(). Add flags arg to del_item
+ and del_reg_mount protos. Add strings used by getmntent et al
+ including mnt_type, mnt_opts, mnt_fsname, mnt_dir. (Can't just
+ pass back pointers to mount paths because they may change as
+ a result of a umount call.
+
+ * include/sys/mount.h: Add new MOUNT_AUTO and
+ MOUNT_CHANGE_AUTOROOT flags. Add proto for cygwin_umount
+ function.
+ * include/cygwin/version.h: Bump CYGWIN_VERSION_API_MINOR to 9.
+
+ * utils/mount.cc: Change missing_dir_warning flag to force
+ and init to FALSE instead of TRUE. Throughout swap names and
+ setting as appropriate. Include errno.h.
+ (usage): Remove info about --reset. Add info for new
+ --change-automount-root option.
+ (main): Don't check the --reset flag. Call change_automount_root
+ if invoked with --change-automount-root. Only call do_mount
+ if !mount_already_exists unless force flag is TRUE. Otherwise
+ fail.
+ (mount_already_exists): New helper function. Returns 1
+ if the mount point of the same registry location is already
+ mounted.
+ (reset_mounts): Remove function.
+ (change_automount_root): New function that changes the
+ automount root in the registry via Cygwin by passing the new
+ path to mount() with the special MOUNT_CHANGE_AUTOROOT flag.
+ * utils/umount.cc: Add progname, set to argv[0]. Include string.h.
+ (usage): New function to print out usage info.
+ (main): Loop through argcs. Handle new flags to remove all mounts
+ of a specific type including --remove-all-mounts,
+ --remove-user-mounts, --remove-system-mounts, and
+ --remove-auto-mounts. New flag to specify removing a system
+ mount. Call cygwin_umount instead of umount, providing flags
+ as appropriate.
+ (remove_all_mounts): New function. Remove all mounts in
+ both tables.
+ (remove_all_automounts): Remove all mounts marked auto.
+ (remove_all_user_mounts): Remove all user mounts, including auto
+ mounts.
+ (remove_all_system_mounts): Remove all system mounts.
+
+ * registry.cc (reg_key::get_string): Fix description comment.
+ * strace.cc: Minor reformatting.
+
+Wed Jan 20 17:49:20 1999 DJ Delorie <dj@cygnus.com>
+
+ * fhandler.cc (raw_write): Make sure that a disk full error
+ is properly signalled.
+ (fhandler_base::open): Only tapes are read/write, cd-roms may be
+ read-only (from Corinna).
+
+Wed Jan 20 10:46:48 Corinna Vinschen <corinna.vinschen@cityweb.de>
+
+ [applied by DJ Delorie <dj@cygnus.com>]
+
+ * fhandler_raw.cc (fhandler_dev_raw::writebuf): Writes only
+ as much bytes as needed, instead of full buffer size.
+
+ * fhandler_tape.cc (fhandler_dev_tape::close): Corrected error
+ handling in case of error while writing buffer content to dev.
+
+ * fhandler_floppy.cc (fhandler_dev_floppy::close): Ditto.
+
+ * fhandler_tape.cc (fhandler_dev_tape::writebuf): Delete function
+
+ * fhandler_floppy.cc (fhandler_dev_floppy::writebuf): Ditto.
+
+ Patch suggested by Ron Parker <rdparker@butlermfg.org>
+ * path.cc (mount_info::conv_to_win32_path): Change the
+ recognition of UNC devices, to support also paths of type
+ `\\.\UNC\'.
+
+ * fhandler_tape.cc (fhandler_dev_tape::close): Fixed rewind
+ to block 1 instead of block 0 on rewind tapes in case of
+ uncaught signal (e.g. Ctrl-C).
+
+ * path.cc (get_raw_device_number): New static function,
+ checks path for windows raw device.
+
+ * path.cc (get_device_number): Change for recognition of
+ windows raw device paths by calling `get_raw_device_number()'.
+
+ * path.h: Change prototype for `get_device_number()'.
+
+ * Makefile.in: Added file 'fhandler_raw.o' to dependencies.
+
+ * include/cygwin/rdevio.h: New file to support ioctl commands
+ on random access raw devices. At the time only get/set buffersize
+ for raw_read/raw_write.
+
+ * fhandler.h: Change class hierarchy. 'fhandler_dev_floppy'
+ and 'fhandler_dev_tape' are now derived classes of
+ 'fhandler_dev_raw', which is derived from 'fhandler_base'.
+
+ * fhandler_raw.cc: New file for implementation of class
+ 'fhandler_dev_raw' which is now base class for support of
+ mass storage raw devices.
+
+ * fhandler_dev_tape.cc: Rewritten.
+
+ * fhandler_dev_floppy.cc: Rewritten. Now supporting correct
+ lseek (seeking only to positions on 512 byte boundaries,
+ like supported from WinNT).
+
+ * Makefile.in: Added file 'fhandler_floppy.o' to dependencies.
+
+ * fhandler_floppy.cc: New file to support raw devices
+ including multi volume operations.
+
+ * fhandler.cc: Delete 'fhandler_dev_floppy' implementation.
+
+ * fhandler.h: Extend class fhandler_dev_floppy.
+
+ * fhandler_tape.cc: Rewrite for correct support
+ of multi volume operations. Supports Setmarks now.
+
+ * fhandler.h: Add private method `clear()' to class
+ fhandler_dev_tape.
+
+ * Makefile.in: Add file 'fhandler_tape.o' to dependencies.
+
+ * path.cc (mount_info::conv_to_win32_path): Change the
+ recognition of UNC devices, to support devices, which
+ are not partitions, too.
+
+ * fhandler.h: Extend struct 'fhandler_dev_tape' for tape support.
+ Add method 'fstat' to fhandler_dev_floppy to get S_ISBLK().
+
+ * fhandler.cc (fhandler_base::open): In any case 'access_' has to
+ be GENERIC_READ | GENERIC_WRITE for tapes, to allow tape control.
+ No 'SetFilePointer' for tapes.
+
+ * fhandler_tape.cc: New file to support rewind (/dev/stX) and
+ norewind (/dev/nstX) tapes. Supports ioctl() calls, described
+ in...
+
+ * include/sys/mtio.h, include/cygwin/mtio.h: New header files
+ for tape support.
+
+Sat Jan 16 21:59:36 1999 Geoffrey Noer <noer@cygnus.com>
+
+ * registry.h: Delete; move contents into shared.h except for
+ posix_path_p() routine which disappears.
+ * {Makefile.in, environ.cc, net.cc, path.cc, registry.cc,
+ shared.cc}: No longer include registry.h.
+ * dcrt0.cc (dll_crt0_1): don't check posix_path_p()
+
+ * include/mntent.h (struct mntent): Drop const from strings.
+ * include/sys/mount.h: Change MOUNT_GLOBAL flag that nobody has
+ used yet to MOUNT_SYSTEM. Add MOUNT_EXEC flag.
+ * include/cygwin/version.h: Bump CYGWIN_VERSION_MOUNT_REGISTRY to
+ 2. Change CYGWIN_INFO_CYGWIN_REGISTRY_NAME to "Cygwin".
+ Change CYGWIN_INFO_CYGWIN_MOUNT_REGISTRY_NAME to "mounts v2".
+
+ * registry.cc (reg_key::reg_key): Default key doesn't end in
+ "mounts" any more.
+ (reg_key::kill): Return error code from RegDeleteKeyA.
+ * path.cc: Reformat, reorder functionality, add comments
+ throughout.
+ (mount_info::init): Automount slash if it's not already mounted.
+ (mount_info::mount_slash): New private helper function.
+ (mount_info::binary_win32_path_p): Check flags to determine
+ if mount is binary or not, not binary_p.
+ (mount_info::read_mounts): Remove unneeded access argument. Use
+ RegEnumKeyEx to enumerate mount points in current registry
+ location where each key name returned is a posix_path mount
+ location. Use a subkey reg_key to read the posix_path's
+ corresponding native_path and flags.
+ (mount_info::from_registry): Access HKEY_LOCAL_MACHINE registry
+ with full access privs (which will fail if not administrator).
+ Fix registry path used to initialize HKEY_LOCAL_MACHINE reg_key.
+ (mount_info::to_registry): Delete function. Replaced by
+ add_reg_mount.
+ (mount_info::add_reg_mount): New function which adds a specified
+ mount point to the registry.
+ (mount_info::del_reg_mount): New function which deletes the
+ posix_path argument from the highest priority registry table it
+ can (first user, than system-wide).
+ (sort_by_name): If the two posix_paths are the same, then
+ differentiate between them looking at MOUNT_SYSTEM in their flags.
+ (mount_info::add_item): Also make sure that neither path is NULL.
+ Never claim mount point is busy: replace an existing posix_path
+ as long as it came from the same registry location.
+ (mount_info::del_item): Also make sure that neither path is NULL.
+ (mount_item::getmntent): Use mnt_type field to store user vs.
+ system registry location string. Cast all strings to char *.
+ Handle flags instead of binary_p. Change names of strings
+ returned in mnt_opts field.
+ (mount_item::init): Set flags, instead of dealing with binary_p
+ and silent_p.
+ (mount): Call add_reg_mount instead of to_registry.
+ (umount): Call del_reg_mount instead of to_registry.
+ (path_conv::path_conv): Remove reference to silent_p.
+ * path.h (path_conv): Remove silent_p.
+
+ * utils/mount.cc: Add -s to usage (was a commented-out -g).
+ Or in MOUNT_SYSTEM if -s flag given. Add similar commented-out
+ support for future MOUNT_EXEC flag that will be added with -e.
+ (reset_mounts): Automount slash with zero for flags, not
+ MOUNT_SILENT which we no longer use for anything.
+ * utils/umount.cc: Also print out usage if the first argument
+ starts with a dash.
+
+Fri Jan 15 11:27:51 1999 DJ Delorie <dj@cygnus.com>
+
+ * strace.cc: add macros to protect against buffer overruns
+ (strace_printf): increase buffer from 6000 to 1000 to build devo
+ * include/sys/strace.h: allow -DNOSTRACE again
+
+Fri Jan 15 11:27:51 1999 DJ Delorie <dj@cygnus.com>
+
+ * dcrt0.cc (alloc_stack): add 16384 to work around Win95 page
+ fault during builds
+ * fork.cc (fork): try various things to avoid page faults during
+ win95 builds.
+
+Fri Jan 15 11:18:23 1999 DJ Delorie <dj@cygnus.com>
+
+ * fhandler.cc (raw_write): check for disk full.
+
+Fri Jan 15 11:18:23 1999 DJ Delorie <dj@cygnus.com>
+
+ * init.cc (dll_entry): if the DLL is being LoadLibrary'd,
+ initialize some things.
+ * heap.cc (_sbrk): detect uninitialized heap and initialize
+ * dcrt0.cc (user_data): initialize to something useful.
+ (do_global_ctors): make global for init.cc
+
+Thu Jan 14 02:16:44 1999 Geoffrey Noer <noer@cygnus.com>
+
+ * dll_init.cc: Add missing FIXME in comment.
+ * fhandler_console: Ditto.
+
+Thu Jan 14 00:53:25 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * spawn.cc (iscmd): New function.
+ (spawn_guts): Treat command /c and cmd /c as special
+ cases. Don't quote arguments to these programs if
+ there are exactly three arguments.
+ * dcrt0.cc (dll_crt0_1): Initialize exceptions prior
+ to fork to allow forked processes to "dump core".
+ * errno.cc (seterrno): No need for this to be extern "C".
+ * winsup.h: Ditto.
+
+Wed Jan 13 19:06:08 1999 Geoffrey Noer <noer@cygnus.com>
+
+ * registry.cc: Add comments corresponding to various reg_key
+ functions, minor reformatting.
+ (reg_key::reg_key): Delete already-commented-out function
+
+Wed Jan 13 15:41:34 1999 DJ Delorie <dj@cygnus.com>
+
+ * errno.cc (_sys_errlist): Add "extern" to work around new gcc
+ restrictions.
+
+Mon Jan 11 14:56:27 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * spawn.cc (spawn_guts): Fix problem with #! and relative
+ directories.
+
+Mon Jan 11 09:00:29 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * fhandler_console.cc (fhandler_console::read1): Handle EOF as a
+ specific case.
+
+Sun Jan 10 23:44:22 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * fhandler.h: Define __fmode for convenience. Use throughout.
+ * environ.cc (parse_options): Use O_TEXT when nobinmode.
+ * fhandler.cc (fhandler_base::open): Don't honor __fmode
+ when disk file. Default to O_TEXT if no mode is specified.
+ (fhandler_base::fhandler_base): Don't honor __fmode when disk
+ file. Otherwise default to O_BINARY.
+ * pipe.cc (make_pipe): Default to O_BINARY if no mode specified.
+
+Sat Jan 9 20:58:34 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * Makefile.in: Correct previously messed up patch.
+ * thread.h: Add back a needed include.
+ * sigproc.cc (sigproc_init): Work around problem with older
+ compilers.
+ * wait.cc (wait4): Ditto.
+ * winsup.h (per_thread_waitq): Ditto.
+ * include/Windows32/CommonFunctions.h: Temporary change to
+ work around problems with older compilers.
+
+Fri Jan 8 12:53:53 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * environ.cc (parse_options): Add "forkchunk" debug setting.
+ Takes a value which is used to limit the size of individual memory
+ copies in a fork.
+ * fork.cc (fork_copy): Rewrite slightly to allow copying of
+ individual chunks of memory rather than all in one gulp.
+ Controlled by chunksize global variable.
+
+Thu Jan 7 22:02:18 1999 Christopher Faylor <cgf@cygnus.com>
+
+ patch from Corinna Vinschen <corinna.vinschen@cityweb.de>:
+ * utils/passwd.c: New file.
+ * utils/Makefile.in: Add dependencies for passwd.
+ * syscalls.cc (chmod): Change permission checking in case
+ of readonly test.
+ (stat_dev): Change default permission bits to allow writing
+ for all users.
+ (chown): Retry LookupAccountName with username set to domain\\username,
+ if returned SID-Type is not SidTypeUser.
+
+
+Thu Jan 7 17:50:49 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * fhandler.cc (fhandler_base::set_name): Fix bug which
+ disallowed '%' in a file name.
+
+Thu Jan 7 00:21:41 1999 Geoffrey Noer <noer@cygnus.com>
+
+ * path.cc: Add comments.
+ * path.h: Correct file description comment.
+
+Tue Jan 5 16:07:15 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * fhandler_serial.cc (fhandler_serial::raw_read): Be more defensive
+ about not calling problematic functions when the overlapped I/O is
+ armed. Reset the overlapped event prior to calling read or suffer
+ an "operation aborted".
+ * select.cc (peek_serial): Ditto.
+
+Mon Jan 4 15:16:22 1999 Geoffrey Noer <noer@cygnus.com>
+
+ Eliminate warnings:
+ * utils/mount.cc (show_mounts): make format a const char *.
+ * utils/ps.cc (main): make literal strings const char *s.
+ * utils/cygpath.cc (long_options): cast literal strings to char *s.
+ (main):
+
+Sun Jan 3 20:46:12 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * select.cc (peek_console): Remove #if 0 around NT code workaround.
+
+Sat Jan 2 00:04:01 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * Makefile.in: Remove include directories made obsolete by
+ recent changes to mmap.cc. Also remove libraries that appear
+ to be unnecessary for linking.
+ * mkvers.sh: Put contents of .snapshot-date, if available, into
+ the DLL.
+
+Fri Jan 1 22:44:49 1999 Christopher Faylor <cgf@cygnus.com>
+
+ * fhandler.h (fhandler_serial): Add flag to track state of
+ overlapped serial I/O. Add overlapped_setup method for common
+ setup of overlapped structure.
+ * fhandler_serial.cc (fhandler_serial::overlapped_setup): New
+ method. Sets up the overlapped structure for overlapped serial I/O.
+ (fhandler_serial::raw_read): Use overlapped_armed flag to avoid
+ calling functions which perform overlapped operations if overlapped
+ I/O is in already progress. This should only be the case if a
+ previous operation was interrupted or select has detected serial I/O.
+ (fhandler_serial::open): Use overlapped_setup.
+ (fhandler_serial::fixup_after_fork): Ditto.
+ (fhandler_serial::de_linearize): Ditto.
+ (fhandler_serial::dup): Ditto.
+ (fhandler_serial::tcsetattr): Fix typo which caused IGNPAR
+ to be ignored.
+ * hinfo.cc (hinfo::select_read): Set saw_error to zero explicitly
+ to avoid spurious reporting of select errors.
+ (hinfo::select_write): Ditto.
+ (hinfo::select_except): Ditto.
+ * select.cc (peek_serial): Use overlapped_armed to avoid calling
+ functions which perform overlapped operations if overlapped I/O
+ is already in progress.
diff --git a/winsup/cygwin/Makefile.in b/winsup/cygwin/Makefile.in
new file mode 100644
index 000000000..c7a5cab33
--- /dev/null
+++ b/winsup/cygwin/Makefile.in
@@ -0,0 +1,341 @@
+# Makefile.in for Cygwin.
+# Copyright 1995, 1996, 1997, 1998, 1999, 2000 Cygnus Solutions.
+#
+# This file is part of Cygwin.
+#
+# This software is a copyrighted work licensed under the terms of the
+# Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+# details.
+
+# This makefile requires GNU make.
+
+CONFIG_DIR:=@srcdir@/config/@CONFIG_DIR@
+SHELL:=@SHELL@
+VPATH:=@srcdir@:$(CONFIG_DIR):@srcdir@/regexp
+srcdir:=@srcdir@
+objdir:=.
+
+target_alias:=@target_alias@
+build_alias:=@build_alias@
+host_alias:=@host_alias@
+prefix:=@prefix@
+
+program_transform_name:=@program_transform_name@
+exec_prefix:=@exec_prefix@
+bindir:=@bindir@
+libdir:=@libdir@
+ifeq ($(target_alias),$(host_alias))
+ifeq ($(build_alias),$(host_alias))
+tooldir:=$(exec_prefix)
+else
+tooldir:=$(exec_prefix)/$(target_alias)
+endif
+else
+tooldir:=$(exec_prefix)/$(target_alias)
+endif
+datadir:=@datadir@
+infodir:=@infodir@
+includedir:=@includedir@
+
+INSTALL:=@INSTALL@
+INSTALL_PROGRAM:=@INSTALL_PROGRAM@
+
+#
+# --enable options from configure
+#
+MT_SAFE = @MT_SAFE@
+DEFS = @DEFS@
+
+CC:=@CC@
+# FIXME: Which is it, CC or CC_FOR_TARGET?
+CC_FOR_TARGET:=$(CC)
+CFLAGS:=@CFLAGS@
+CXXFLAGS:=@CXXFLAGS@
+
+# For linking mount, etc. crt0.o isn't accessable in a fresh build.
+EXE_LDFLAGS:=@EXE_LDFLAGS@
+
+AR:=@AR@
+AR_FLAGS:=qv
+RANLIB:=@RANLIB@
+LD:=@LD@
+DLLTOOL:=@DLLTOOL@
+WINDRES:=@WINDRES@
+AS:=@AS@
+
+#
+# Include common definitions for winsup directory
+#
+include $(srcdir)/../Makefile.common
+
+INSTALL_DATA:=$(SHELL) $(updir1)/install-sh -c
+
+COMPILE_CC+=-D__INSIDE_CYGWIN__
+
+@SET_MAKE@
+
+# Setup the testing framework, if you have one
+EXPECT = `if [ -f $${rootme}/../../expect/expect$(EXEEXT) ] ; then \
+ echo $${rootme}/../../expect/expect$(EXEEXT) ; \
+ else echo expect ; fi`
+
+RUNTEST = `if [ -f $${srcdir}/../dejagnu/runtest ] ; then \
+ echo $${srcdir}/../dejagnu/runtest ; \
+ else echo runtest; fi`
+RUNTESTFLAGS =
+
+ifdef MT_SAFE
+MT_SAFE_HEADERS:=thread.h
+MT_SAFE_OBJECTS:=pthread.o thread.o
+endif
+
+# Parameters used in building the cygwin.dll.
+# We build as new-cygwin.dll and rename at install time to overcome
+# native rebuilding issues (we don't want the build tools to see a partially
+# built cygwin.dll and attempt to use it instead of the old one).
+
+DLL_NAME:=cygwin1.dll
+LIB_NAME:=libcygwin.a
+DEF_FILE:=cygwin.def
+DLL_ENTRY:=@DLL_ENTRY@
+
+LIBGMON_A:=libgmon.a
+GMON_START:=gcrt0.o
+
+# Some things want these from libc, but they have their own static
+# data which apps can get to, which is a pain in the dll, so we
+# include them directly into the library.
+
+LIBCOS:=libccrt0.o libcmain.o getopt.o dll_entry.o dll_main.o
+
+# Build all source files in the config directory
+
+EXTRA_DLL_OFILES:=${addsuffix .o,${basename ${notdir ${wildcard $(CONFIG_DIR)/*.c}}}}
+
+EXTRA_OFILES=$(bupdir1)/libiberty/random.o $(bupdir1)/libiberty/strsignal.o
+
+DLL_IMPORTS:=$(w32api_lib)/libkernel32.a $(w32api_lib)/libadvapi32.a
+
+DLL_OFILES:=assert.o dcrt0.o debug.o delqueue.o dir.o dlfcn.o dll_init.o \
+ environ.o errno.o exceptions.o exec.o external.o fcntl.o fhandler.o \
+ fhandler_console.o fhandler_serial.o fhandler_termios.o fhandler_tty.o \
+ fhandler_windows.o fhandler_raw.o fhandler_floppy.o fhandler_tape.o fhandler_zero.o \
+ fork.o glob.o grp.o heap.o hinfo.o init.o ioctl.o localtime.o malloc.o \
+ mmap.o net.o ntea.o passwd.o path.o pinfo.o pipe.o regexp.o regerror.o \
+ regsub.o registry.o resource.o scandir.o security.o select.o shared.o \
+ signal.o sigproc.o smallprint.o spawn.o strace.o strsep.o sync.o \
+ syscalls.o sysconf.o syslog.o termios.o times.o tty.o uinfo.o uname.o \
+ wait.o window.o \
+ $(EXTRA_DLL_OFILES) $(EXTRA_OFILES) $(MT_SAFE_OBJECTS)
+
+GMON_OFILES:= gmon.o mcount.o profil.o
+
+LD_STUFF=--dll $(DLL_OFILES) version.o winver.o $(DLL_IMPORTS) $(LIBM) $(LIBC) $(LIBGCC) -e $(DLL_ENTRY) --image-base=0x61000000
+
+.PHONY: all force dll_ofiles install
+
+.SUFFIXES:
+.SUFFIXES: .c .cc .def .a .o
+
+all: new-$(DLL_NAME) $(LIBGMON_A) $(LIB_NAME) cygrun.exe force
+
+force:
+
+install: all
+ $(INSTALL_DATA) new-$(DLL_NAME) $(bindir)/$(DLL_NAME) ; \
+ $(INSTALL_DATA) $(LIB_NAME) $(tooldir)/lib/$(LIB_NAME); \
+ cd $(srcdir); \
+ for sub in `find include -name '[a-z]*' -type d -print | sort`; do \
+ for i in $$sub/*.h ; do \
+ $(INSTALL_DATA) $$i $(tooldir)/$$sub/`basename $$i` ; \
+ done ; \
+ done
+
+clean:
+ -rm -f *.o *.dll *.a *.exp junk *.base version.cc regexp/*.o winver_stamp
+
+maintainer-clean realclean: clean
+ @echo "This command is intended for maintainers to use;"
+ @echo "it deletes files that may require special tools to rebuild."
+ -rm -fr configure
+
+# Rule to build libcygwin.a
+
+$(LIB_NAME): $(DEF_FILE) $(LIBCOS)
+ $(DLLTOOL) --as=$(AS) --dllname $(DLL_NAME) --def $(DEF_FILE) --output-lib temp.a
+ $(AR) rcv temp.a $(LIBCOS)
+ mv temp.a $(LIB_NAME)
+
+# Rule to make stub library used by "make check"
+
+new-$(LIB_NAME): $(DEF_FILE) $(LIBCOS)
+ $(DLLTOOL) --as=$(AS) --dllname new-$(DLL_NAME) --def $(DEF_FILE) --output-lib temp.a
+ $(AR) rcv temp.a $(LIBCOS)
+ mv temp.a new-$(LIB_NAME)
+
+# Rule to build cygwin.dll
+
+new-$(DLL_NAME): $(DLL_OFILES) $(DEF_FILE) $(DLL_IMPORTS) $(LIBC) $(LIBM) Makefile winver_stamp
+ $(LD) -shared -o $@ -e $(DLL_ENTRY) cygwin.def $(DLL_OFILES) version.o \
+ winver.o $(DLL_IMPORTS) $(LIBM) $(LIBGCC) $(MALLOC_OBJ) $(LIBC) $(LIBGCC)
+
+dll_ofiles: $(DLL_OFILES)
+
+$(LIBGMON_A): $(GMON_OFILES) $(GMON_START)
+ $(AR) rcv $(LIBGMON_A) $(GMON_OFILES)
+
+version.cc winver.o: winver_stamp
+ @ :
+
+winver_stamp: mkvers.sh include/cygwin/version.h winver.rc $(DLL_OFILES)
+ @echo "Making version.o and winver.o";\
+ $(SHELL) ${word 1,$^} ${word 2,$^} ${word 3,$^} $(WINDRES); \
+ touch $@; \
+ $(COMPILE_CXX) -o version.o version.cc
+
+cygrun.exe : $(srcdir)/cygrun.c $(DLL_IMPORTS) $(w32api_lib)/libuser32.a \
+ $(w32api_lib)/libshell32.a
+ $(CC) -o $@ $^
+
+#
+
+# These targets are for the dejagnu testsuites. The file site.exp
+# contains global variables that all the testsuites will use.
+
+# Set to $(target_alias)/ for cross.
+target_subdir = @target_subdir@
+
+site.exp: ./config.status Makefile
+ @echo "Making a new config file..."
+ -@rm -f ./tmp?
+ @touch site.exp
+ -@mv site.exp site.bak
+ @echo "## these variables are automatically generated by make ##" > ./tmp0
+ @echo "# Do not edit here. If you wish to override these values" >> ./tmp0
+ @echo "# add them to the last section" >> ./tmp0
+ @echo "set rootme \"`pwd`\"" >> ./tmp0
+ @echo "set srcdir \"`cd ${srcdir}; pwd`\"" >> ./tmp0
+ @echo "set host_triplet $(host_canonical)" >> ./tmp0
+ @echo "set build_triplet $(build_canonical)" >> ./tmp0
+ @echo "set target_triplet $(target)" >> ./tmp0
+ @echo "set target_alias $(target_alias)" >> ./tmp0
+ @echo "set CC \"$(CC)\"" >> ./tmp0
+# CFLAGS is set even though it's empty to show we reserve the right to set it.
+ @echo "set CFLAGS \"\"" >> ./tmp0
+ echo "set tmpdir $(objdir)/testsuite" >> ./tmp0
+ @echo "set srcdir \"\$${srcdir}/testsuite\"" >> ./tmp0
+ @echo "## All variables above are generated by configure. Do Not Edit ##" >> ./tmp0
+ @cat ./tmp0 > site.exp
+ @cat site.bak | sed \
+ -e '1,/^## All variables above are.*##/ d' >> site.exp
+ -@rm -f ./tmp?
+
+testsuite/site.exp: site.exp
+ if [ -d testsuite ]; then \
+ true; \
+ else \
+ mkdir testsuite; \
+ fi
+ rm -rf testsuite/site.exp
+ cp site.exp testsuite/site.exp
+
+# Note: we set the PATH so that we can pick up new-cygwin1.dll
+
+check: testsuite/site.exp
+ -rootme=`pwd`; export rootme; \
+ srcdir=`cd ${srcdir}; pwd` ; export srcdir ; \
+ cd testsuite; \
+ EXPECT=${EXPECT} ; export EXPECT ; \
+ if [ -f $${rootme}/../expect/expect ] ; then \
+ TCL_LIBRARY=`cd .. ; cd ${srcdir}/../tcl/library ; pwd` ; \
+ export TCL_LIBRARY ; fi ; \
+ PATH=$${rootme}:$${PATH} ;\
+ $(RUNTEST) --tool winsup $(RUNTESTFLAGS)
+
+#
+
+Makefile: cygwin.din
+
+# .h file dependencies
+# This may be overkill, but it's better than the previous situation.
+# As files/dependencies are added and removed from Cygwin, please keep
+# this list up to date.
+
+WINSUP_H:=winsup.h fhandler.h path.h shared.h \
+ sigproc.h include/cygwin/version.h \
+ $(MT_SAFE_HEADERS)
+
+winsup.h: config.h
+assert.o: $(WINSUP_H)
+dcrt0.o: $(WINSUP_H) include/exceptions.h include/glob.h dll_init.h autoload.h
+debug.o: $(WINSUP_H) debug.h sync.h
+delqueue.o: $(WINSUP_H)
+dir.o: $(WINSUP_H)
+dlfcn.o: $(WINSUP_H) dll_init.h
+dll_entry.o: $(WINSUP_H) include/cygwin/cygwin_dll.h
+dll_init.o: $(WINSUP_H) include/exceptions.h dll_init.h
+dll_main.o:
+environ.o: $(WINSUP_H)
+errno.o: $(WINSUP_H)
+exceptions.o: $(WINSUP_H) include/exceptions.h sync.h autoload.h
+exec.o: $(WINSUP_H)
+external.o: $(WINSUP_H) external.h
+fcntl.o: $(WINSUP_H)
+fhandler.o: $(WINSUP_H)
+fhandler_console.o: $(WINSUP_H)
+fhandler_serial.o: $(WINSUP_H)
+fhandler_termios.o: $(WINSUP_H)
+fhandler_tty.o: $(WINSUP_H)
+fhandler_windows.o: $(WINSUP_H)
+fhandler_raw.o: $(WINSUP_H)
+fhandler_floppy.o: $(WINSUP_H)
+fhandler_tape.o: $(WINSUP_H)
+fhandler_zero.o: $(WINSUP_H)
+fork.o: $(WINSUP_H) dll_init.h
+glob.o: include/glob.h
+gmon.o: profil.h gmon.h
+grp.o: $(WINSUP_H)
+heap.o: $(WINSUP_H)
+hinfo.o: $(WINSUP_H)
+init.o: $(WINSUP_H)
+ioctl.o: $(WINSUP_H)
+libccrt0.o: $(WINSUP_H)
+libcmain.o: $(WINSUP_H)
+localtime.o: tz_posixrules.h
+malloc.o: $(WINSUP_H)
+mcount.o: gmon.h
+mmap.o: $(WINSUP_H)
+net.o: $(WINSUP_H) autoload.h
+ntea.o:
+passwd.o: $(WINSUP_H)
+path.o: $(WINSUP_H)
+pinfo.o: $(WINSUP_H)
+pipe.o: $(WINSUP_H)
+profile.o: profil.h
+pthread.o: $(WINSUP_H)
+registry.o: $(WINSUP_H)
+resource.o: $(WINSUP_H)
+scandir.o:
+security.o: $(WINSUP_H)
+select.o: $(WINSUP_H) select.h
+shared.o: $(WINSUP_H)
+signal.o: $(WINSUP_H)
+sigproc.o: $(WINSUP_H) sync.h
+smallprint.o: $(WINSUP_H)
+spawn.o: $(WINSUP_H)
+strace.o: $(WINSUP_H)
+strsep.o:
+sync.o: $(WINSUP_H) sync.h
+syscalls.o: $(WINSUP_H)
+sysconf.o: $(WINSUP_H)
+syslog.o: $(WINSUP_H)
+termios.o: $(WINSUP_H)
+test.o: $(WINSUP_H)
+times.o: $(WINSUP_H)
+tty.o: $(WINSUP_H)
+uinfo.o: $(WINSUP_H)
+uname.o: $(WINSUP_H)
+wait.o: $(WINSUP_H)
+window.o: $(WINSUP_H)
+thread.o: $(WINSUP_H)
+
diff --git a/winsup/cygwin/ROADMAP b/winsup/cygwin/ROADMAP
new file mode 100644
index 000000000..c8ed7eb36
--- /dev/null
+++ b/winsup/cygwin/ROADMAP
@@ -0,0 +1,129 @@
+
+ WINSUP ROADMAP
+
+The purpose of this document is to give the briefest overview of how
+the various parts of cygwin work together and where everything can be
+found. The intended audience is people developing the cygwin dll
+itself. Comments to dj@cygnus.com.
+
+=== cygwin1.dll source files
+
+- overhead
+.h winsup autoload debug external shared sync
+.cc assert dcrt0 debug external init ntea registry security
+ shared smallprint strace sync
+.din cygwin
+.rc winver
+.sgml external shared
+
+- processes
+.h sigproc
+.cc exec fork pinfo resource signal sigproc spawn wait
+
+- signals
+.cc exceptions window
+
+- files and I/O
+.h delqueue fhandler path select
+.cc delqueue dir fhandler* hinfo path pipe select tty
+.sgml hinfo path
+
+- common unix functions
+.h dll_init tz_posixrules
+.cc dlfcn dll_init environ errno fcntl flog grp ioctl localtime
+ malloc passwd scandir strsep syscalls sysconf syslog termios
+.c longjmp setjmp
+.sgml dll_init
+
+- unix emulation
+.cc heap mmap net times unifo uname
+
+
+--- if MT_SAFE
+.h thread
+.cc pthread thread
+
+--- from other places
+regex/*
+../libiberty/{random,strsignal}
+../newlib/* (libc)
+
+=== libcygwin.a source files
+
+libccrt0.cc
+libcmain.cc
+dll_entry.cc
+dll_main.cc
+getopt.c
+
+=== gmon (profiling, -pg)
+
+gcrt0.c
+gmon.c gmon.h
+mcount.c
+profil.c profil.h
+
+=== entry points
+
+- normal cygwin program
+
+newlib/libc/sys/cygwin/crt0.c has mainCRTStartup() and calls cygwin_crt0()
+
+libccrt0.cc has cygwin_crt0() and calls dll_crt0()
+
+dcrt0.cc - has dll_crt0()
+
+Note: dll_init.cc has nothing to do with initializing the cygwin dll.
+It initializes the dlls you have dl_open'd.
+
+- cygwin-built dll
+
+dll_entry.cc - has a macro for wrapping your dll startup function
+ (equivalent of DllMain()) in such a way that you get your
+ cygwin environment set up automatically when your dll is
+ loaded.
+
+dll_main.cc - has empty DllMain() in case you don't have your own
+
+- manually loading cygwin1.dll
+
+init.cc - has dll_entry() which is called by the OS when the dll is
+ loaded. It doesn't do much except note if you linked
+ cygwin1.dll or are manually loading it.
+
+=== About "fhandlers"
+
+An fhandler is a file type handler. This is where the unix device
+emulation happens.
+
+hinfo.cc maps posix file descriptors to a table of file handlers (type
+fhandler) in the dll. It's mostly concerned with managing the table
+of descriptors (open, dup, fork, select). Most of the posix I/O
+system calls (syscalls.cc) use the hinfo table to call the right
+fhandler directly.
+
+fhandler.cc is the base class; specific types are derived as
+appropriate (see fhandler.h). hinfo.cc is in charge of selecting and
+creating a suitable fhandler when you open a file. path.cc handles
+emulated files in /dev (like /dev/null) by returning an FH_* value
+from get_device_number (which hinfo.cc calls in hinfo::build_fhandler).
+
+Note: if you're looking for read() and write(), they call _read() and
+_write() in syscalls.cc. The non-underscored ones are in
+newlib/libc/syscalls and just call the underscored ones.
+
+=== How "fork" works
+
+It all starts in fork() in fork.cc.
+
+Set up a pid in the shared memory area for the new child. Use
+setjmp() to capture state. First time (parent), set up some stuff and
+use CreateProcess to run a second copy of the same executable. The
+second copy will note in the shared memory area that it's a fork, and
+do the longjmp. They sync up and the parent copies all it's program
+memory to the child's address space. There's also code to reload
+dlls, map shared memory and mmap'd files, etc.
+
+Handling the special startup for the child is done in dcrt0.cc in many
+places. This case is triggered by a special StartupInfo structure
+that's passed from the parent to the child in CreateProcessA.
diff --git a/winsup/cygwin/acconfig.h b/winsup/cygwin/acconfig.h
new file mode 100644
index 000000000..5b796e897
--- /dev/null
+++ b/winsup/cygwin/acconfig.h
@@ -0,0 +1,15 @@
+/* Define if DEBUGGING support is requested. */
+#undef DEBUGGING
+
+/* Define if building "extra" thread-safe Cygwin DLL. */
+#undef _CYG_THREAD_FAILSAFE
+
+/* Define if GCC supports builtin memset. */
+#undef HAVE_BUILTIN_MEMSET
+
+/* Define if building thread-safe Cygwin DLL. */
+#undef _MT_SAFE
+
+/* Define if strace log output has date/time stamp. */
+#undef STRACE_HHMMSS
+
diff --git a/winsup/cygwin/ansi.sgml b/winsup/cygwin/ansi.sgml
new file mode 100644
index 000000000..d6a41ab31
--- /dev/null
+++ b/winsup/cygwin/ansi.sgml
@@ -0,0 +1,59 @@
+<sect1 id="std-ansi">
+<title>Compatibility with ANSI</title>
+
+<para>The following functions are compatible with ANSI:</para>
+
+<sect2><title>stdio</title><para>
+
+clearerr, fclose, feof, ferror, fflush, fgetc, fgetpos, fgets, fopen,
+fprintf, fputc, fputs, fread, freopen, fscanf, fseek, fsetpos, ftell,
+fwrite, getc, getchar, gets, perror, printf, putc, putchar, puts,
+remove, rename, rewind, scanf, setbuf, setvbuf, sprintf, sscanf,
+tmpfile, tmpnam, vfprintf, ungetc, vprintf, vsprintf,
+
+</para></sect2>
+<sect2><title>string</title><para>
+
+memchr, memcmp, memcpy, memmove, memset, strcat, strchr, strcmp,
+strcoll, strcpy, strcspn, strerror, strlen, strncat, strncmp, strncpy,
+strpbrk, strrchr, strspn, strstr, strtok, strxfrm
+
+</para></sect2>
+<sect2><title>stdlib</title><para>
+
+abort, abs, assert, atexit, atof, atoi, atol, bsearch, calloc, div,
+exit, free, getenv, labs, ldiv, longjmp, malloc, mblen, mbstowcs,
+mbtowc, qsort, rand, realloc, setjmp, srand, strtod, strtol, strtoul,
+system, wcstombs, wctomb
+
+</para></sect2>
+<sect2><title>time</title><para>
+
+asctime, gmtime, localtime, time, clock, ctime, difftime, mktime,
+strftime
+
+</para></sect2>
+<sect2><title>signals</title><para>
+
+raise, signal
+
+</para></sect2>
+<sect2><title>ctype</title><para>
+
+isalnum, isalpha, iscntrl, isdigit, isgraph, islower, isprint,
+ispunct, isspace, isupper, isxdigit, tolower, toupper
+
+</para></sect2>
+<sect2><title>math</title><para>
+
+acos, asin, atan, atan2, ceil, cos, cosh, exp, fabs, floor, fmod,
+frexp, ldexp, log, log10, modf, pow, sin, sinh, sqrt, tan, tanh
+
+</para></sect2>
+<sect2><title>misc</title><para>
+
+localeconv, setlocale, va_arg, va_end, va_start
+
+</para></sect2>
+
+</sect1> \ No newline at end of file
diff --git a/winsup/cygwin/assert.cc b/winsup/cygwin/assert.cc
new file mode 100644
index 000000000..98acb6d88
--- /dev/null
+++ b/winsup/cygwin/assert.cc
@@ -0,0 +1,50 @@
+/* assert.cc: Handle the assert macro for WIN32.
+
+ Copyright 1997, 1998, 2000 Cygnus Solutions.
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#include "winsup.h"
+
+#include <assert.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+/* This function is called when the assert macro fails. This will
+ override the function of the same name in newlib. */
+
+extern "C" void
+__assert (const char *file, int line, const char *failedexpr)
+{
+ HANDLE h;
+
+ /* If we don't have a console in a Windows program, then bring up a
+ message box for the assertion failure. */
+
+ h = CreateFileA ("CONOUT$", GENERIC_WRITE, FILE_SHARE_WRITE, &sec_none_nih,
+ OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
+ if (h == INVALID_HANDLE_VALUE || h == 0)
+ {
+ char *buf;
+
+ buf = (char *) alloca (100 + strlen (failedexpr));
+ siprintf (buf, "Failed assertion\n\t%s\nat line %d of file %s",
+ failedexpr, line, file);
+ MessageBox (NULL, buf, NULL, MB_OK | MB_ICONERROR | MB_TASKMODAL);
+ }
+ else
+ {
+ CloseHandle (h);
+ (void) fiprintf (stderr,
+ "assertion \"%s\" failed: file \"%s\", line %d\n",
+ failedexpr, file, line);
+ }
+
+ abort ();
+
+ /* NOTREACHED */
+}
diff --git a/winsup/cygwin/config.h.in b/winsup/cygwin/config.h.in
new file mode 100644
index 000000000..e160104f3
--- /dev/null
+++ b/winsup/cygwin/config.h.in
@@ -0,0 +1,38 @@
+/* config.h.in. Generated automatically from configure.in by autoheader. */
+
+/* Define if using alloca.c. */
+#undef C_ALLOCA
+
+/* Define to one of _getb67, GETB67, getb67 for Cray-2 and Cray-YMP systems.
+ This function is required for alloca.c support on those systems. */
+#undef CRAY_STACKSEG_END
+
+/* Define if you have alloca, as a function or macro. */
+#undef HAVE_ALLOCA
+
+/* Define if you have <alloca.h> and it should be used (not on Ultrix). */
+#undef HAVE_ALLOCA_H
+
+/* If using the C implementation of alloca, define if you know the
+ direction of stack growth for your system; otherwise it will be
+ automatically deduced at run-time.
+ STACK_DIRECTION > 0 => grows toward higher addresses
+ STACK_DIRECTION < 0 => grows toward lower addresses
+ STACK_DIRECTION = 0 => direction of growth unknown
+ */
+#undef STACK_DIRECTION
+
+/* Define if DEBUGGING support is requested. */
+#undef DEBUGGING
+
+/* Define if building "extra" thread-safe Cygwin DLL. */
+#undef _CYG_THREAD_FAILSAFE
+
+/* Define if GCC supports builtin memset. */
+#undef HAVE_BUILTIN_MEMSET
+
+/* Define if building thread-safe Cygwin DLL. */
+#undef _MT_SAFE
+
+/* Define if strace log output has date/time stamp. */
+#undef STRACE_HHMMSS
diff --git a/winsup/cygwin/config/i386/longjmp.c b/winsup/cygwin/config/i386/longjmp.c
new file mode 100644
index 000000000..d663e20f7
--- /dev/null
+++ b/winsup/cygwin/config/i386/longjmp.c
@@ -0,0 +1,51 @@
+/* longjmp.c
+
+ Copyright 1996, 1998 Cygnus Solutions.
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#ifdef __i386__
+#if 1
+asm (" .globl _longjmp \n"
+"_longjmp: \n"
+" pushl %ebp \n"
+" movl %esp,%ebp \n"
+" movl 8(%ebp),%edi \n"
+" movl 12(%ebp),%eax \n"
+" testl %eax,%eax \n"
+" jne 0f \n"
+" incl %eax \n"
+"0: \n"
+" movl %eax,0(%edi) \n"
+" movl 24(%edi),%ebp \n"
+" pushfl \n"
+" popl %ebx \n"
+" movw 42(%edi),%ax \n"
+" movw %ax,%ss \n"
+" movl 28(%edi),%esp \n"
+" pushl 32(%edi) \n"
+" pushl %ebx \n"
+" movw 36(%edi),%ax \n"
+" movw %ax,%es \n"
+#if 0
+/* fs is a system register in windows; don't muck with it */
+" movw 38(%edi),%ax \n"
+" movw %ax,%fs \n"
+#endif
+" movw 40(%edi),%ax \n"
+" movw %ax,%gs \n"
+" movl 0(%edi),%eax \n"
+" movl 4(%edi),%ebx \n"
+" movl 8(%edi),%ecx \n"
+" movl 12(%edi),%edx \n"
+" movl 16(%edi),%esi \n"
+" movl 20(%edi),%edi \n"
+" popfl \n"
+" ret \n");
+#endif
+
+#endif /* __i386__ */
diff --git a/winsup/cygwin/config/i386/makefrag b/winsup/cygwin/config/i386/makefrag
new file mode 100644
index 000000000..a8b394221
--- /dev/null
+++ b/winsup/cygwin/config/i386/makefrag
@@ -0,0 +1,17 @@
+# makefrag: included by the main Cygwin Makefile.in
+
+# Copyright 1996, 1998 Cygnus Solutions.
+
+# This file is part of Cygwin.
+
+# This software is a copyrighted work licensed under the terms of the
+# Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+# details.
+
+EXTRA_DLL_OFILES=setjmp.o longjmp.o
+
+setjmp.o:config/i386/setjmp.c
+ $(CC) -c $(ALL_CFLAGS) $<
+
+longjmp.o:config/i386/longjmp.c
+ $(CC) -c $(ALL_CFLAGS) $<
diff --git a/winsup/cygwin/config/i386/profile.h b/winsup/cygwin/config/i386/profile.h
new file mode 100644
index 000000000..ad5f625d0
--- /dev/null
+++ b/winsup/cygwin/config/i386/profile.h
@@ -0,0 +1,58 @@
+/* $NetBSD: profile.h,v 1.6 1995/03/28 18:17:08 jtc Exp $ */
+
+/*
+ * Copyright (c) 1992, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * @(#)profile.h 8.1 (Berkeley) 6/11/93
+ */
+
+#define _MCOUNT_DECL static inline void _mcount
+
+#define MCOUNT \
+void \
+mcount() \
+{ \
+ int selfpc, frompcindex; \
+ /* \
+ * find the return address for mcount, \
+ * and the return address for mcount's caller. \
+ * \
+ * selfpc = pc pushed by mcount call \
+ */ \
+ __asm("movl 4(%%ebp),%0" : "=r" (selfpc)); \
+ /* \
+ * frompcindex = pc pushed by call into self. \
+ */ \
+ __asm("movl (%%ebp),%0;movl 4(%0),%0" : "=r" (frompcindex)); \
+ _mcount(frompcindex, selfpc); \
+}
+
diff --git a/winsup/cygwin/config/i386/setjmp.c b/winsup/cygwin/config/i386/setjmp.c
new file mode 100644
index 000000000..befd7e683
--- /dev/null
+++ b/winsup/cygwin/config/i386/setjmp.c
@@ -0,0 +1,48 @@
+/* setjmp.c
+
+ Copyright 1996, 1998 Cygnus Solutions.
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#ifdef __i386__
+
+#if 1
+asm(" .globl _setjmp \n"
+"_setjmp: \n"
+" pushl %ebp \n"
+" movl %esp,%ebp \n"
+" pushl %edi \n"
+" movl 8(%ebp),%edi \n"
+" movl %eax,0(%edi) \n"
+" movl %ebx,4(%edi) \n"
+" movl %ecx,8(%edi) \n"
+" movl %edx,12(%edi) \n"
+" movl %esi,16(%edi) \n"
+" movl -4(%ebp),%eax \n"
+" movl %eax,20(%edi) \n"
+" movl 0(%ebp),%eax \n"
+" movl %eax,24(%edi) \n"
+" movl %esp,%eax \n"
+" addl $12,%eax \n"
+" movl %eax,28(%edi) \n"
+" movl 4(%ebp),%eax \n"
+" movl %eax,32(%edi) \n"
+" movw %es, %ax \n"
+" movw %ax, 36(%edi) \n"
+" movw %fs, %ax \n"
+" movw %ax, 38(%edi) \n"
+" movw %gs, %ax \n"
+" movw %ax, 40(%edi) \n"
+" movw %ss, %ax \n"
+" movw %ax, 42(%edi) \n"
+" popl %edi \n"
+" movl $0,%eax \n"
+" leave \n"
+" ret \n");
+#endif
+
+#endif /* __i386__ */
diff --git a/winsup/cygwin/configure b/winsup/cygwin/configure
new file mode 100755
index 000000000..f69feda13
--- /dev/null
+++ b/winsup/cygwin/configure
@@ -0,0 +1,2335 @@
+#! /bin/sh
+
+# Guess values for system-dependent variables and create Makefiles.
+# Generated automatically using autoconf version 2.13
+# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.
+#
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+
+# Defaults:
+ac_help=
+ac_default_prefix=/usr/local
+# Any additions from configure.in:
+ac_help="$ac_help
+ --enable-strace-hhmmss strace log output has date/time stamp"
+ac_help="$ac_help
+ --enable-threadsafe=[runtime] Build a cygwin DLL which is thread safe"
+ac_help="$ac_help
+ --enable-extra-threadsafe-checking Build a cygwin DLL which is thread safe with extra consistency checking"
+ac_help="$ac_help
+ --enable-debugging Build a cygwin DLL which has more consistency checking for debugging"
+
+# Initialize some variables set by options.
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+build=NONE
+cache_file=./config.cache
+exec_prefix=NONE
+host=NONE
+no_create=
+nonopt=NONE
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+sitefile=
+srcdir=
+target=NONE
+verbose=
+x_includes=NONE
+x_libraries=NONE
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datadir='${prefix}/share'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+libdir='${exec_prefix}/lib'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+infodir='${prefix}/info'
+mandir='${prefix}/man'
+
+# Initialize some other variables.
+subdirs=
+MFLAGS= MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
+# Maximum number of lines to put in a shell here document.
+ac_max_here_lines=12
+
+ac_prev=
+for ac_option
+do
+
+ # If the previous option needs an argument, assign it.
+ if test -n "$ac_prev"; then
+ eval "$ac_prev=\$ac_option"
+ ac_prev=
+ continue
+ fi
+
+ case "$ac_option" in
+ -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
+ *) ac_optarg= ;;
+ esac
+
+ # Accept the important Cygnus configure options, so we can diagnose typos.
+
+ case "$ac_option" in
+
+ -bindir | --bindir | --bindi | --bind | --bin | --bi)
+ ac_prev=bindir ;;
+ -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+ bindir="$ac_optarg" ;;
+
+ -build | --build | --buil | --bui | --bu)
+ ac_prev=build ;;
+ -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+ build="$ac_optarg" ;;
+
+ -cache-file | --cache-file | --cache-fil | --cache-fi \
+ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+ ac_prev=cache_file ;;
+ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+ cache_file="$ac_optarg" ;;
+
+ -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
+ ac_prev=datadir ;;
+ -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
+ | --da=*)
+ datadir="$ac_optarg" ;;
+
+ -disable-* | --disable-*)
+ ac_feature=`echo $ac_option|sed -e 's/-*disable-//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then
+ { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
+ fi
+ ac_feature=`echo $ac_feature| sed 's/-/_/g'`
+ eval "enable_${ac_feature}=no" ;;
+
+ -enable-* | --enable-*)
+ ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then
+ { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
+ fi
+ ac_feature=`echo $ac_feature| sed 's/-/_/g'`
+ case "$ac_option" in
+ *=*) ;;
+ *) ac_optarg=yes ;;
+ esac
+ eval "enable_${ac_feature}='$ac_optarg'" ;;
+
+ -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+ | --exec | --exe | --ex)
+ ac_prev=exec_prefix ;;
+ -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+ | --exec=* | --exe=* | --ex=*)
+ exec_prefix="$ac_optarg" ;;
+
+ -gas | --gas | --ga | --g)
+ # Obsolete; use --with-gas.
+ with_gas=yes ;;
+
+ -help | --help | --hel | --he)
+ # Omit some internal or obsolete options to make the list less imposing.
+ # This message is too long to be a string in the A/UX 3.1 sh.
+ cat << EOF
+Usage: configure [options] [host]
+Options: [defaults in brackets after descriptions]
+Configuration:
+ --cache-file=FILE cache test results in FILE
+ --help print this message
+ --no-create do not create output files
+ --quiet, --silent do not print \`checking...' messages
+ --site-file=FILE use FILE as the site file
+ --version print the version of autoconf that created configure
+Directory and file names:
+ --prefix=PREFIX install architecture-independent files in PREFIX
+ [$ac_default_prefix]
+ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
+ [same as prefix]
+ --bindir=DIR user executables in DIR [EPREFIX/bin]
+ --sbindir=DIR system admin executables in DIR [EPREFIX/sbin]
+ --libexecdir=DIR program executables in DIR [EPREFIX/libexec]
+ --datadir=DIR read-only architecture-independent data in DIR
+ [PREFIX/share]
+ --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc]
+ --sharedstatedir=DIR modifiable architecture-independent data in DIR
+ [PREFIX/com]
+ --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var]
+ --libdir=DIR object code libraries in DIR [EPREFIX/lib]
+ --includedir=DIR C header files in DIR [PREFIX/include]
+ --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include]
+ --infodir=DIR info documentation in DIR [PREFIX/info]
+ --mandir=DIR man documentation in DIR [PREFIX/man]
+ --srcdir=DIR find the sources in DIR [configure dir or ..]
+ --program-prefix=PREFIX prepend PREFIX to installed program names
+ --program-suffix=SUFFIX append SUFFIX to installed program names
+ --program-transform-name=PROGRAM
+ run sed PROGRAM on installed program names
+EOF
+ cat << EOF
+Host type:
+ --build=BUILD configure for building on BUILD [BUILD=HOST]
+ --host=HOST configure for HOST [guessed]
+ --target=TARGET configure for TARGET [TARGET=HOST]
+Features and packages:
+ --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
+ --enable-FEATURE[=ARG] include FEATURE [ARG=yes]
+ --with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
+ --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
+ --x-includes=DIR X include files are in DIR
+ --x-libraries=DIR X library files are in DIR
+EOF
+ if test -n "$ac_help"; then
+ echo "--enable and --with options recognized:$ac_help"
+ fi
+ exit 0 ;;
+
+ -host | --host | --hos | --ho)
+ ac_prev=host ;;
+ -host=* | --host=* | --hos=* | --ho=*)
+ host="$ac_optarg" ;;
+
+ -includedir | --includedir | --includedi | --included | --include \
+ | --includ | --inclu | --incl | --inc)
+ ac_prev=includedir ;;
+ -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+ | --includ=* | --inclu=* | --incl=* | --inc=*)
+ includedir="$ac_optarg" ;;
+
+ -infodir | --infodir | --infodi | --infod | --info | --inf)
+ ac_prev=infodir ;;
+ -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+ infodir="$ac_optarg" ;;
+
+ -libdir | --libdir | --libdi | --libd)
+ ac_prev=libdir ;;
+ -libdir=* | --libdir=* | --libdi=* | --libd=*)
+ libdir="$ac_optarg" ;;
+
+ -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+ | --libexe | --libex | --libe)
+ ac_prev=libexecdir ;;
+ -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+ | --libexe=* | --libex=* | --libe=*)
+ libexecdir="$ac_optarg" ;;
+
+ -localstatedir | --localstatedir | --localstatedi | --localstated \
+ | --localstate | --localstat | --localsta | --localst \
+ | --locals | --local | --loca | --loc | --lo)
+ ac_prev=localstatedir ;;
+ -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+ | --localstate=* | --localstat=* | --localsta=* | --localst=* \
+ | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
+ localstatedir="$ac_optarg" ;;
+
+ -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+ ac_prev=mandir ;;
+ -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+ mandir="$ac_optarg" ;;
+
+ -nfp | --nfp | --nf)
+ # Obsolete; use --without-fp.
+ with_fp=no ;;
+
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c)
+ no_create=yes ;;
+
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+ no_recursion=yes ;;
+
+ -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+ | --oldin | --oldi | --old | --ol | --o)
+ ac_prev=oldincludedir ;;
+ -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+ oldincludedir="$ac_optarg" ;;
+
+ -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+ ac_prev=prefix ;;
+ -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+ prefix="$ac_optarg" ;;
+
+ -program-prefix | --program-prefix | --program-prefi | --program-pref \
+ | --program-pre | --program-pr | --program-p)
+ ac_prev=program_prefix ;;
+ -program-prefix=* | --program-prefix=* | --program-prefi=* \
+ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+ program_prefix="$ac_optarg" ;;
+
+ -program-suffix | --program-suffix | --program-suffi | --program-suff \
+ | --program-suf | --program-su | --program-s)
+ ac_prev=program_suffix ;;
+ -program-suffix=* | --program-suffix=* | --program-suffi=* \
+ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+ program_suffix="$ac_optarg" ;;
+
+ -program-transform-name | --program-transform-name \
+ | --program-transform-nam | --program-transform-na \
+ | --program-transform-n | --program-transform- \
+ | --program-transform | --program-transfor \
+ | --program-transfo | --program-transf \
+ | --program-trans | --program-tran \
+ | --progr-tra | --program-tr | --program-t)
+ ac_prev=program_transform_name ;;
+ -program-transform-name=* | --program-transform-name=* \
+ | --program-transform-nam=* | --program-transform-na=* \
+ | --program-transform-n=* | --program-transform-=* \
+ | --program-transform=* | --program-transfor=* \
+ | --program-transfo=* | --program-transf=* \
+ | --program-trans=* | --program-tran=* \
+ | --progr-tra=* | --program-tr=* | --program-t=*)
+ program_transform_name="$ac_optarg" ;;
+
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ silent=yes ;;
+
+ -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+ ac_prev=sbindir ;;
+ -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+ | --sbi=* | --sb=*)
+ sbindir="$ac_optarg" ;;
+
+ -sharedstatedir | --sharedstatedir | --sharedstatedi \
+ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+ | --sharedst | --shareds | --shared | --share | --shar \
+ | --sha | --sh)
+ ac_prev=sharedstatedir ;;
+ -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+ | --sha=* | --sh=*)
+ sharedstatedir="$ac_optarg" ;;
+
+ -site | --site | --sit)
+ ac_prev=site ;;
+ -site=* | --site=* | --sit=*)
+ site="$ac_optarg" ;;
+
+ -site-file | --site-file | --site-fil | --site-fi | --site-f)
+ ac_prev=sitefile ;;
+ -site-file=* | --site-file=* | --site-fil=* | --site-fi=* | --site-f=*)
+ sitefile="$ac_optarg" ;;
+
+ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+ ac_prev=srcdir ;;
+ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+ srcdir="$ac_optarg" ;;
+
+ -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+ | --syscon | --sysco | --sysc | --sys | --sy)
+ ac_prev=sysconfdir ;;
+ -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+ sysconfdir="$ac_optarg" ;;
+
+ -target | --target | --targe | --targ | --tar | --ta | --t)
+ ac_prev=target ;;
+ -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+ target="$ac_optarg" ;;
+
+ -v | -verbose | --verbose | --verbos | --verbo | --verb)
+ verbose=yes ;;
+
+ -version | --version | --versio | --versi | --vers)
+ echo "configure generated by autoconf version 2.13"
+ exit 0 ;;
+
+ -with-* | --with-*)
+ ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then
+ { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
+ fi
+ ac_package=`echo $ac_package| sed 's/-/_/g'`
+ case "$ac_option" in
+ *=*) ;;
+ *) ac_optarg=yes ;;
+ esac
+ eval "with_${ac_package}='$ac_optarg'" ;;
+
+ -without-* | --without-*)
+ ac_package=`echo $ac_option|sed -e 's/-*without-//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then
+ { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
+ fi
+ ac_package=`echo $ac_package| sed 's/-/_/g'`
+ eval "with_${ac_package}=no" ;;
+
+ --x)
+ # Obsolete; use --with-x.
+ with_x=yes ;;
+
+ -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+ | --x-incl | --x-inc | --x-in | --x-i)
+ ac_prev=x_includes ;;
+ -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+ x_includes="$ac_optarg" ;;
+
+ -x-libraries | --x-libraries | --x-librarie | --x-librari \
+ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+ ac_prev=x_libraries ;;
+ -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+ x_libraries="$ac_optarg" ;;
+
+ -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; }
+ ;;
+
+ *)
+ if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then
+ echo "configure: warning: $ac_option: invalid host type" 1>&2
+ fi
+ if test "x$nonopt" != xNONE; then
+ { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; }
+ fi
+ nonopt="$ac_option"
+ ;;
+
+ esac
+done
+
+if test -n "$ac_prev"; then
+ { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; }
+fi
+
+trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
+
+# File descriptor usage:
+# 0 standard input
+# 1 file creation
+# 2 errors and warnings
+# 3 some systems may open it to /dev/tty
+# 4 used on the Kubota Titan
+# 6 checking for... messages and results
+# 5 compiler messages saved in config.log
+if test "$silent" = yes; then
+ exec 6>/dev/null
+else
+ exec 6>&1
+fi
+exec 5>./config.log
+
+echo "\
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+" 1>&5
+
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Also quote any args containing shell metacharacters.
+ac_configure_args=
+for ac_arg
+do
+ case "$ac_arg" in
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c) ;;
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;;
+ *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*)
+ ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+ *) ac_configure_args="$ac_configure_args $ac_arg" ;;
+ esac
+done
+
+# NLS nuisances.
+# Only set these to C if already set. These must not be set unconditionally
+# because not all systems understand e.g. LANG=C (notably SCO).
+# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'!
+# Non-C LC_CTYPE values break the ctype check.
+if test "${LANG+set}" = set; then LANG=C; export LANG; fi
+if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi
+if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi
+if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -rf conftest* confdefs.h
+# AIX cpp loses on an empty file, so make sure it contains at least a newline.
+echo > confdefs.h
+
+# A filename unique to this package, relative to the directory that
+# configure is in, which we can look for to find out if srcdir is correct.
+ac_unique_file=init.cc
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+ ac_srcdir_defaulted=yes
+ # Try the directory containing this script, then its parent.
+ ac_prog=$0
+ ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'`
+ test "x$ac_confdir" = "x$ac_prog" && ac_confdir=.
+ srcdir=$ac_confdir
+ if test ! -r $srcdir/$ac_unique_file; then
+ srcdir=..
+ fi
+else
+ ac_srcdir_defaulted=no
+fi
+if test ! -r $srcdir/$ac_unique_file; then
+ if test "$ac_srcdir_defaulted" = yes; then
+ { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; }
+ else
+ { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; }
+ fi
+fi
+srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'`
+
+# Prefer explicitly selected file to automatically selected ones.
+if test -z "$sitefile"; then
+ if test -z "$CONFIG_SITE"; then
+ if test "x$prefix" != xNONE; then
+ CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
+ else
+ CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+ fi
+ fi
+else
+ CONFIG_SITE="$sitefile"
+fi
+for ac_site_file in $CONFIG_SITE; do
+ if test -r "$ac_site_file"; then
+ echo "loading site script $ac_site_file"
+ . "$ac_site_file"
+ fi
+done
+
+if test -r "$cache_file"; then
+ echo "loading cache $cache_file"
+ . $cache_file
+else
+ echo "creating cache $cache_file"
+ > $cache_file
+fi
+
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+ac_exeext=
+ac_objext=o
+if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
+ # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu.
+ if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then
+ ac_n= ac_c='
+' ac_t=' '
+ else
+ ac_n=-n ac_c= ac_t=
+ fi
+else
+ ac_n= ac_c='\c' ac_t=
+fi
+
+
+
+
+ac_aux_dir=
+for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
+ if test -f $ac_dir/install-sh; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install-sh -c"
+ break
+ elif test -f $ac_dir/install.sh; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install.sh -c"
+ break
+ fi
+done
+if test -z "$ac_aux_dir"; then
+ { echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; }
+fi
+ac_config_guess=$ac_aux_dir/config.guess
+ac_config_sub=$ac_aux_dir/config.sub
+ac_configure=$ac_aux_dir/configure # This should be Cygnus configure.
+
+# Find a good install program. We prefer a C program (faster),
+# so one script is as good as another. But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# ./install, which can be erroneously created by make from ./install.sh.
+echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
+echo "configure:577: checking for a BSD compatible install" >&5
+if test -z "$INSTALL"; then
+if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ IFS="${IFS= }"; ac_save_IFS="$IFS"; IFS=":"
+ for ac_dir in $PATH; do
+ # Account for people who put trailing slashes in PATH elements.
+ case "$ac_dir/" in
+ /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;;
+ *)
+ # OSF1 and SCO ODT 3.0 have their own names for install.
+ # Don't use installbsd from OSF since it installs stuff as root
+ # by default.
+ for ac_prog in ginstall scoinst install; do
+ if test -f $ac_dir/$ac_prog; then
+ if test $ac_prog = install &&
+ grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then
+ # AIX install. It has an incompatible calling convention.
+ :
+ else
+ ac_cv_path_install="$ac_dir/$ac_prog -c"
+ break 2
+ fi
+ fi
+ done
+ ;;
+ esac
+ done
+ IFS="$ac_save_IFS"
+
+fi
+ if test "${ac_cv_path_install+set}" = set; then
+ INSTALL="$ac_cv_path_install"
+ else
+ # As a last resort, use the slow shell script. We don't cache a
+ # path for INSTALL within a source directory, because that will
+ # break other packages using the cache if that directory is
+ # removed, or if the path is relative.
+ INSTALL="$ac_install_sh"
+ fi
+fi
+echo "$ac_t""$INSTALL" 1>&6
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+
+
+
+
+
+# Do some error checking and defaulting for the host and target type.
+# The inputs are:
+# configure --host=HOST --target=TARGET --build=BUILD NONOPT
+#
+# The rules are:
+# 1. You are not allowed to specify --host, --target, and nonopt at the
+# same time.
+# 2. Host defaults to nonopt.
+# 3. If nonopt is not specified, then host defaults to the current host,
+# as determined by config.guess.
+# 4. Target and build default to nonopt.
+# 5. If nonopt is not specified, then target and build default to host.
+
+# The aliases save the names the user supplied, while $host etc.
+# will get canonicalized.
+case $host---$target---$nonopt in
+NONE---*---* | *---NONE---* | *---*---NONE) ;;
+*) { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } ;;
+esac
+
+
+# Make sure we can run config.sub.
+if ${CONFIG_SHELL-/bin/sh} $ac_config_sub sun4 >/dev/null 2>&1; then :
+else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; }
+fi
+
+echo $ac_n "checking host system type""... $ac_c" 1>&6
+echo "configure:661: checking host system type" >&5
+
+host_alias=$host
+case "$host_alias" in
+NONE)
+ case $nonopt in
+ NONE)
+ if host_alias=`${CONFIG_SHELL-/bin/sh} $ac_config_guess`; then :
+ else { echo "configure: error: can not guess host type; you must specify one" 1>&2; exit 1; }
+ fi ;;
+ *) host_alias=$nonopt ;;
+ esac ;;
+esac
+
+host=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $host_alias`
+host_cpu=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+host_vendor=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+echo "$ac_t""$host" 1>&6
+
+echo $ac_n "checking target system type""... $ac_c" 1>&6
+echo "configure:682: checking target system type" >&5
+
+target_alias=$target
+case "$target_alias" in
+NONE)
+ case $nonopt in
+ NONE) target_alias=$host_alias ;;
+ *) target_alias=$nonopt ;;
+ esac ;;
+esac
+
+target=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $target_alias`
+target_cpu=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+target_vendor=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+target_os=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+echo "$ac_t""$target" 1>&6
+
+echo $ac_n "checking build system type""... $ac_c" 1>&6
+echo "configure:700: checking build system type" >&5
+
+build_alias=$build
+case "$build_alias" in
+NONE)
+ case $nonopt in
+ NONE) build_alias=$host_alias ;;
+ *) build_alias=$nonopt ;;
+ esac ;;
+esac
+
+build=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $build_alias`
+build_cpu=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+build_vendor=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+build_os=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+echo "$ac_t""$build" 1>&6
+
+test "$host_alias" != "$target_alias" &&
+ test "$program_prefix$program_suffix$program_transform_name" = \
+ NONENONEs,x,x, &&
+ program_prefix=${target_alias}-
+
+
+if test $host != $build; then
+ ac_tool_prefix=${host_alias}-
+else
+ ac_tool_prefix=
+fi
+
+# Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:732: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_CC="${ac_tool_prefix}gcc"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+ echo "$ac_t""$CC" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+
+if test -z "$ac_cv_prog_CC"; then
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:764: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_CC="gcc"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_prog_CC" && ac_cv_prog_CC="gcc"
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+ echo "$ac_t""$CC" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+else
+ CC="gcc"
+fi
+fi
+
+if test -z "$CC"; then
+ # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:800: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_prog_rejected=no
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then
+ ac_prog_rejected=yes
+ continue
+ fi
+ ac_cv_prog_CC="cc"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+if test $ac_prog_rejected = yes; then
+ # We found a bogon in the path, so make sure we never use it.
+ set dummy $ac_cv_prog_CC
+ shift
+ if test $# -gt 0; then
+ # We chose a different compiler from the bogus one.
+ # However, it has the same basename, so the bogon will be chosen
+ # first if we set CC to just the basename; use the full file name.
+ shift
+ set dummy "$ac_dir/$ac_word" "$@"
+ shift
+ ac_cv_prog_CC="$@"
+ fi
+fi
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+ echo "$ac_t""$CC" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; }
+fi
+
+echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
+echo "configure:849: checking whether we are using GNU C" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.c <<EOF
+#ifdef __GNUC__
+ yes;
+#endif
+EOF
+if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:858: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+ ac_cv_prog_gcc=yes
+else
+ ac_cv_prog_gcc=no
+fi
+fi
+
+echo "$ac_t""$ac_cv_prog_gcc" 1>&6
+
+if test $ac_cv_prog_gcc = yes; then
+ GCC=yes
+ ac_test_CFLAGS="${CFLAGS+set}"
+ ac_save_CFLAGS="$CFLAGS"
+ CFLAGS=
+ echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
+echo "configure:873: checking whether ${CC-cc} accepts -g" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ echo 'void f(){}' > conftest.c
+if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then
+ ac_cv_prog_cc_g=yes
+else
+ ac_cv_prog_cc_g=no
+fi
+rm -f conftest*
+
+fi
+
+echo "$ac_t""$ac_cv_prog_cc_g" 1>&6
+ if test "$ac_test_CFLAGS" = set; then
+ CFLAGS="$ac_save_CFLAGS"
+ elif test $ac_cv_prog_cc_g = yes; then
+ CFLAGS="-g -O2"
+ else
+ CFLAGS="-O2"
+ fi
+ if test "$ac_test_CXXFLAGS" != set; then
+ CXXFLAGS='$(CFLAGS)'
+ fi
+else
+ GCC=
+ test "${CFLAGS+set}" = set || CFLAGS="-g"
+fi
+
+
+# Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ar; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:907: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_AR'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$AR"; then
+ ac_cv_prog_AR="$AR" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_AR="${ac_tool_prefix}ar"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+fi
+fi
+AR="$ac_cv_prog_AR"
+if test -n "$AR"; then
+ echo "$ac_t""$AR" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+
+if test -z "$ac_cv_prog_AR"; then
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "ar", so it can be a program name with args.
+set dummy ar; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:939: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_AR'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$AR"; then
+ ac_cv_prog_AR="$AR" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_AR="ar"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_prog_AR" && ac_cv_prog_AR="ar"
+fi
+fi
+AR="$ac_cv_prog_AR"
+if test -n "$AR"; then
+ echo "$ac_t""$AR" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+else
+ AR="ar"
+fi
+fi
+
+
+# Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args.
+set dummy ${ac_tool_prefix}as; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:975: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_AS'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$AS"; then
+ ac_cv_prog_AS="$AS" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_AS="${ac_tool_prefix}as"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+fi
+fi
+AS="$ac_cv_prog_AS"
+if test -n "$AS"; then
+ echo "$ac_t""$AS" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+
+if test -z "$ac_cv_prog_AS"; then
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "as", so it can be a program name with args.
+set dummy as; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1007: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_AS'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$AS"; then
+ ac_cv_prog_AS="$AS" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_AS="as"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_prog_AS" && ac_cv_prog_AS="as"
+fi
+fi
+AS="$ac_cv_prog_AS"
+if test -n "$AS"; then
+ echo "$ac_t""$AS" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+else
+ AS="as"
+fi
+fi
+
+
+# Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ranlib; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1043: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$RANLIB"; then
+ ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+fi
+fi
+RANLIB="$ac_cv_prog_RANLIB"
+if test -n "$RANLIB"; then
+ echo "$ac_t""$RANLIB" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+
+if test -z "$ac_cv_prog_RANLIB"; then
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1075: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$RANLIB"; then
+ ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_RANLIB="ranlib"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_prog_RANLIB" && ac_cv_prog_RANLIB="ranlib"
+fi
+fi
+RANLIB="$ac_cv_prog_RANLIB"
+if test -n "$RANLIB"; then
+ echo "$ac_t""$RANLIB" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+else
+ RANLIB="ranlib"
+fi
+fi
+
+
+# Extract the first word of "${ac_tool_prefix}ld", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ld; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1111: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_LD'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$LD"; then
+ ac_cv_prog_LD="$LD" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_LD="${ac_tool_prefix}ld"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+fi
+fi
+LD="$ac_cv_prog_LD"
+if test -n "$LD"; then
+ echo "$ac_t""$LD" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+
+if test -z "$ac_cv_prog_LD"; then
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "ld", so it can be a program name with args.
+set dummy ld; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1143: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_LD'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$LD"; then
+ ac_cv_prog_LD="$LD" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_LD="ld"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_prog_LD" && ac_cv_prog_LD="ld"
+fi
+fi
+LD="$ac_cv_prog_LD"
+if test -n "$LD"; then
+ echo "$ac_t""$LD" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+else
+ LD="ld"
+fi
+fi
+
+
+# Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args.
+set dummy ${ac_tool_prefix}dlltool; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1179: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_DLLTOOL'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$DLLTOOL"; then
+ ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+fi
+fi
+DLLTOOL="$ac_cv_prog_DLLTOOL"
+if test -n "$DLLTOOL"; then
+ echo "$ac_t""$DLLTOOL" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+
+if test -z "$ac_cv_prog_DLLTOOL"; then
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "dlltool", so it can be a program name with args.
+set dummy dlltool; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1211: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_DLLTOOL'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$DLLTOOL"; then
+ ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_DLLTOOL="dlltool"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_prog_DLLTOOL" && ac_cv_prog_DLLTOOL="dlltool"
+fi
+fi
+DLLTOOL="$ac_cv_prog_DLLTOOL"
+if test -n "$DLLTOOL"; then
+ echo "$ac_t""$DLLTOOL" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+else
+ DLLTOOL="dlltool"
+fi
+fi
+
+
+# Extract the first word of "${ac_tool_prefix}windres", so it can be a program name with args.
+set dummy ${ac_tool_prefix}windres; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1247: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_WINDRES'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$WINDRES"; then
+ ac_cv_prog_WINDRES="$WINDRES" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_WINDRES="${ac_tool_prefix}windres"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+fi
+fi
+WINDRES="$ac_cv_prog_WINDRES"
+if test -n "$WINDRES"; then
+ echo "$ac_t""$WINDRES" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+
+if test -z "$ac_cv_prog_WINDRES"; then
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "windres", so it can be a program name with args.
+set dummy windres; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1279: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_WINDRES'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$WINDRES"; then
+ ac_cv_prog_WINDRES="$WINDRES" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_WINDRES="windres"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_prog_WINDRES" && ac_cv_prog_WINDRES="windres"
+fi
+fi
+WINDRES="$ac_cv_prog_WINDRES"
+if test -n "$WINDRES"; then
+ echo "$ac_t""$WINDRES" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+else
+ WINDRES="windres"
+fi
+fi
+
+
+
+echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
+echo "configure:1314: checking how to run the C preprocessor" >&5
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+ CPP=
+fi
+if test -z "$CPP"; then
+if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ # This must be in double quotes, not single quotes, because CPP may get
+ # substituted into the Makefile and "${CC-cc}" will confuse make.
+ CPP="${CC-cc} -E"
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp.
+ cat > conftest.$ac_ext <<EOF
+#line 1329 "configure"
+#include "confdefs.h"
+#include <assert.h>
+Syntax Error
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1335: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+ :
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ CPP="${CC-cc} -E -traditional-cpp"
+ cat > conftest.$ac_ext <<EOF
+#line 1346 "configure"
+#include "confdefs.h"
+#include <assert.h>
+Syntax Error
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1352: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+ :
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ CPP="${CC-cc} -nologo -E"
+ cat > conftest.$ac_ext <<EOF
+#line 1363 "configure"
+#include "confdefs.h"
+#include <assert.h>
+Syntax Error
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1369: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+ :
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ CPP=/lib/cpp
+fi
+rm -f conftest*
+fi
+rm -f conftest*
+fi
+rm -f conftest*
+ ac_cv_prog_CPP="$CPP"
+fi
+ CPP="$ac_cv_prog_CPP"
+else
+ ac_cv_prog_CPP="$CPP"
+fi
+echo "$ac_t""$CPP" 1>&6
+
+# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works
+# for constant arguments. Useless!
+echo $ac_n "checking for working alloca.h""... $ac_c" 1>&6
+echo "configure:1396: checking for working alloca.h" >&5
+if eval "test \"`echo '$''{'ac_cv_header_alloca_h'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1401 "configure"
+#include "confdefs.h"
+#include <alloca.h>
+int main() {
+char *p = alloca(2 * sizeof(int));
+; return 0; }
+EOF
+if { (eval echo configure:1408: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ ac_cv_header_alloca_h=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ ac_cv_header_alloca_h=no
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$ac_cv_header_alloca_h" 1>&6
+if test $ac_cv_header_alloca_h = yes; then
+ cat >> confdefs.h <<\EOF
+#define HAVE_ALLOCA_H 1
+EOF
+
+fi
+
+echo $ac_n "checking for alloca""... $ac_c" 1>&6
+echo "configure:1429: checking for alloca" >&5
+if eval "test \"`echo '$''{'ac_cv_func_alloca_works'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1434 "configure"
+#include "confdefs.h"
+
+#ifdef __GNUC__
+# define alloca __builtin_alloca
+#else
+# ifdef _MSC_VER
+# include <malloc.h>
+# define alloca _alloca
+# else
+# if HAVE_ALLOCA_H
+# include <alloca.h>
+# else
+# ifdef _AIX
+ #pragma alloca
+# else
+# ifndef alloca /* predefined by HP cc +Olibcalls */
+char *alloca ();
+# endif
+# endif
+# endif
+# endif
+#endif
+
+int main() {
+char *p = (char *) alloca(1);
+; return 0; }
+EOF
+if { (eval echo configure:1462: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ ac_cv_func_alloca_works=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ ac_cv_func_alloca_works=no
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$ac_cv_func_alloca_works" 1>&6
+if test $ac_cv_func_alloca_works = yes; then
+ cat >> confdefs.h <<\EOF
+#define HAVE_ALLOCA 1
+EOF
+
+fi
+
+if test $ac_cv_func_alloca_works = no; then
+ # The SVR3 libPW and SVR4 libucb both contain incompatible functions
+ # that cause trouble. Some versions do not even contain alloca or
+ # contain a buggy version. If you still want to use their alloca,
+ # use ar to extract alloca.o from them instead of compiling alloca.c.
+ ALLOCA=alloca.${ac_objext}
+ cat >> confdefs.h <<\EOF
+#define C_ALLOCA 1
+EOF
+
+
+echo $ac_n "checking whether alloca needs Cray hooks""... $ac_c" 1>&6
+echo "configure:1494: checking whether alloca needs Cray hooks" >&5
+if eval "test \"`echo '$''{'ac_cv_os_cray'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1499 "configure"
+#include "confdefs.h"
+#if defined(CRAY) && ! defined(CRAY2)
+webecray
+#else
+wenotbecray
+#endif
+
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ egrep "webecray" >/dev/null 2>&1; then
+ rm -rf conftest*
+ ac_cv_os_cray=yes
+else
+ rm -rf conftest*
+ ac_cv_os_cray=no
+fi
+rm -f conftest*
+
+fi
+
+echo "$ac_t""$ac_cv_os_cray" 1>&6
+if test $ac_cv_os_cray = yes; then
+for ac_func in _getb67 GETB67 getb67; do
+ echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+echo "configure:1524: checking for $ac_func" >&5
+if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1529 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func(); below. */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+$ac_func();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:1552: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ cat >> confdefs.h <<EOF
+#define CRAY_STACKSEG_END $ac_func
+EOF
+
+ break
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+done
+fi
+
+echo $ac_n "checking stack direction for C alloca""... $ac_c" 1>&6
+echo "configure:1579: checking stack direction for C alloca" >&5
+if eval "test \"`echo '$''{'ac_cv_c_stack_direction'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test "$cross_compiling" = yes; then
+ ac_cv_c_stack_direction=0
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1587 "configure"
+#include "confdefs.h"
+find_stack_direction ()
+{
+ static char *addr = 0;
+ auto char dummy;
+ if (addr == 0)
+ {
+ addr = &dummy;
+ return find_stack_direction ();
+ }
+ else
+ return (&dummy > addr) ? 1 : -1;
+}
+main ()
+{
+ exit (find_stack_direction() < 0);
+}
+EOF
+if { (eval echo configure:1606: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+then
+ ac_cv_c_stack_direction=1
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -fr conftest*
+ ac_cv_c_stack_direction=-1
+fi
+rm -fr conftest*
+fi
+
+fi
+
+echo "$ac_t""$ac_cv_c_stack_direction" 1>&6
+cat >> confdefs.h <<EOF
+#define STACK_DIRECTION $ac_cv_c_stack_direction
+EOF
+
+fi
+
+subdirs="utils doc"
+
+echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6
+echo "configure:1630: checking whether ${MAKE-make} sets \${MAKE}" >&5
+set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftestmake <<\EOF
+all:
+ @echo 'ac_maketemp="${MAKE}"'
+EOF
+# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+eval `${MAKE-make} -f conftestmake 2>/dev/null | grep temp=`
+if test -n "$ac_maketemp"; then
+ eval ac_cv_prog_make_${ac_make}_set=yes
+else
+ eval ac_cv_prog_make_${ac_make}_set=no
+fi
+rm -f conftestmake
+fi
+if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ SET_MAKE=
+else
+ echo "$ac_t""no" 1>&6
+ SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+
+# Test for builtin mem* functions.
+
+ac_ext=C
+# CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='${CXX-g++} -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cxx_cross
+
+cat > conftest.$ac_ext <<EOF
+#line 1667 "configure"
+#include "confdefs.h"
+
+#include <string.h>
+void foo(char *s, int c, size_t n)
+{
+ __builtin_memset(s, c, n);
+}
+
+int main() {
+
+; return 0; }
+EOF
+if { (eval echo configure:1680: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ use_builtin_memset=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ use_builtin_memset=no
+fi
+rm -f conftest*
+if test $use_builtin_memset = "yes"; then
+ cat >> confdefs.h <<\EOF
+#define HAVE_BUILTIN_MEMSET 1
+EOF
+
+fi
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+
+# Check whether --enable-strace-hhmmss or --disable-strace-hhmmss was given.
+if test "${enable_strace_hhmmss+set}" = set; then
+ enableval="$enable_strace_hhmmss"
+ case "${enableval}" in
+yes)
+ cat >> confdefs.h <<\EOF
+#define STRACE_HHMMSS 1
+EOF
+
+ ;;
+no)
+ ;;
+*)
+ { echo "configure: error: bad value ${enableval} given for enable-strace-hhmmss option" 1>&2; exit 1; }
+ ;;
+esac
+
+fi
+
+
+mt_safe_val=1
+MT_SAFE=yes
+PTH_ALLOW=''
+
+# Check whether --enable-threadsafe or --disable-threadsafe was given.
+if test "${enable_threadsafe+set}" = set; then
+ enableval="$enable_threadsafe"
+ case "${enableval}" in
+yes)
+ ;;
+runtime)
+ mt_safe_val=2
+ MT_SAFE=yes
+ ;;
+no)
+ mt_safe_val=0
+ MT_SAFE=no
+ PTH_ALLOW=';'
+ ;;
+esac
+
+fi
+
+
+# Check whether --enable-extra-threadsafe-checking or --disable-extra-threadsafe-checking was given.
+if test "${enable_extra_threadsafe_checking+set}" = set; then
+ enableval="$enable_extra_threadsafe_checking"
+ case "${enableval}" in
+yes)
+ mt_safe_val=1
+ MT_SAFE=yes
+ cat >> confdefs.h <<\EOF
+#define _CYG_THREAD_FAILSAFE 1
+EOF
+
+ ;;
+no)
+ ;;
+esac
+
+fi
+
+
+if test "$MT_SAFE" = "yes"; then
+ cat >> confdefs.h <<EOF
+#define _MT_SAFE $mt_safe_val
+EOF
+
+fi
+
+
+
+
+# Check whether --enable-debugging or --disable-debugging was given.
+if test "${enable_debugging+set}" = set; then
+ enableval="$enable_debugging"
+ case "${enableval}" in
+yes) cat >> confdefs.h <<\EOF
+#define DEBUGGING 1
+EOF
+ ;;
+no) ;;
+esac
+
+fi
+
+
+
+
+
+
+echo $ac_n "checking if newlib is part of the build tree""... $ac_c" 1>&6
+echo "configure:1796: checking if newlib is part of the build tree" >&5
+
+EXE_LDFLAGS=
+if test -d ../newlib
+then
+ echo "$ac_t""yes" 1>&6
+ EXE_LDFLAGS="-B../../newlib/ -B../"
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+
+if test x"$EXE_LDFLAGS" = x
+then
+ echo $ac_n "checking if installed newlib needed""... $ac_c" 1>&6
+echo "configure:1811: checking if installed newlib needed" >&5
+ cat > conftest.$ac_ext <<EOF
+#line 1813 "configure"
+#include "confdefs.h"
+
+int main() {
+/* main already defined */
+
+; return 0; }
+EOF
+if { (eval echo configure:1821: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ echo "$ac_t""no" 1>&6
+
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ echo "$ac_t""yes" 1>&6
+ echo "configure: warning: newlib not found - utility .exe's may not link" 1>&2
+fi
+rm -f conftest*
+fi
+
+
+case "$target_cpu" in
+ i386|i486|i586|i686) DLL_ENTRY="_dll_entry@12"
+ DEF_DLL_ENTRY="dll_entry@12"
+ ALLOCA="_alloca"
+ CONFIG_DIR="i386" ;;
+ powerpc*) DLL_ENTRY="dll_entry"
+ DEF_DLL_ENTRY="dll_entry"
+ ALLOCA=" __allocate_stack"
+ CONFIG_DIR="ppc" ;;
+ *) { echo "configure: error: Invalid target processor \"$target_cpu\"" 1>&2; exit 1; } ;;
+esac
+
+
+
+
+
+trap '' 1 2 15
+cat > confcache <<\EOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs. It is not useful on other systems.
+# If it contains results you don't want to keep, you may remove or edit it.
+#
+# By default, configure uses ./config.cache as the cache file,
+# creating it if it does not exist already. You can give configure
+# the --cache-file=FILE option to use a different cache file; that is
+# what configure does when it calls configure scripts in
+# subdirectories, so they share the cache.
+# Giving --cache-file=/dev/null disables caching, for debugging configure.
+# config.status only pays attention to the cache file if you give it the
+# --recheck option to rerun configure.
+#
+EOF
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, don't put newlines in cache variables' values.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(set) 2>&1 |
+ case `(ac_space=' '; set | grep ac_space) 2>&1` in
+ *ac_space=\ *)
+ # `set' does not quote correctly, so add quotes (double-quote substitution
+ # turns \\\\ into \\, and sed turns \\ into \).
+ sed -n \
+ -e "s/'/'\\\\''/g" \
+ -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p"
+ ;;
+ *)
+ # `set' quotes correctly as required by POSIX, so do not add quotes.
+ sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p'
+ ;;
+ esac >> confcache
+if cmp -s $cache_file confcache; then
+ :
+else
+ if test -w $cache_file; then
+ echo "updating cache $cache_file"
+ cat confcache > $cache_file
+ else
+ echo "not updating unwritable cache $cache_file"
+ fi
+fi
+rm -f confcache
+
+trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# Any assignment to VPATH causes Sun make to only execute
+# the first set of double-colon rules, so remove it if not needed.
+# If there is a colon in the path, we need to keep it.
+if test "x$srcdir" = x.; then
+ ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d'
+fi
+
+trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15
+
+DEFS=-DHAVE_CONFIG_H
+
+# Without the "./", some shells look in PATH for config.status.
+: ${CONFIG_STATUS=./config.status}
+
+echo creating $CONFIG_STATUS
+rm -f $CONFIG_STATUS
+cat > $CONFIG_STATUS <<EOF
+#! /bin/sh
+# Generated automatically by configure.
+# Run this file to recreate the current configuration.
+# This directory was configured as follows,
+# on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+#
+# $0 $ac_configure_args
+#
+# Compiler output produced by configure, useful for debugging
+# configure, is in ./config.log if it exists.
+
+ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]"
+for ac_option
+do
+ case "\$ac_option" in
+ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+ echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion"
+ exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;;
+ -version | --version | --versio | --versi | --vers | --ver | --ve | --v)
+ echo "$CONFIG_STATUS generated by autoconf version 2.13"
+ exit 0 ;;
+ -help | --help | --hel | --he | --h)
+ echo "\$ac_cs_usage"; exit 0 ;;
+ *) echo "\$ac_cs_usage"; exit 1 ;;
+ esac
+done
+
+ac_given_srcdir=$srcdir
+ac_given_INSTALL="$INSTALL"
+
+trap 'rm -fr `echo "Makefile cygwin.def:cygwin.din config.h" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
+EOF
+cat >> $CONFIG_STATUS <<EOF
+
+# Protect against being on the right side of a sed subst in config.status.
+sed 's/%@/@@/; s/@%/@@/; s/%g\$/@g/; /@g\$/s/[\\\\&%]/\\\\&/g;
+ s/@@/%@/; s/@@/@%/; s/@g\$/%g/' > conftest.subs <<\\CEOF
+$ac_vpsub
+$extrasub
+s%@SHELL@%$SHELL%g
+s%@CFLAGS@%$CFLAGS%g
+s%@CPPFLAGS@%$CPPFLAGS%g
+s%@CXXFLAGS@%$CXXFLAGS%g
+s%@FFLAGS@%$FFLAGS%g
+s%@DEFS@%$DEFS%g
+s%@LDFLAGS@%$LDFLAGS%g
+s%@LIBS@%$LIBS%g
+s%@exec_prefix@%$exec_prefix%g
+s%@prefix@%$prefix%g
+s%@program_transform_name@%$program_transform_name%g
+s%@bindir@%$bindir%g
+s%@sbindir@%$sbindir%g
+s%@libexecdir@%$libexecdir%g
+s%@datadir@%$datadir%g
+s%@sysconfdir@%$sysconfdir%g
+s%@sharedstatedir@%$sharedstatedir%g
+s%@localstatedir@%$localstatedir%g
+s%@libdir@%$libdir%g
+s%@includedir@%$includedir%g
+s%@oldincludedir@%$oldincludedir%g
+s%@infodir@%$infodir%g
+s%@mandir@%$mandir%g
+s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g
+s%@INSTALL_SCRIPT@%$INSTALL_SCRIPT%g
+s%@INSTALL_DATA@%$INSTALL_DATA%g
+s%@host@%$host%g
+s%@host_alias@%$host_alias%g
+s%@host_cpu@%$host_cpu%g
+s%@host_vendor@%$host_vendor%g
+s%@host_os@%$host_os%g
+s%@target@%$target%g
+s%@target_alias@%$target_alias%g
+s%@target_cpu@%$target_cpu%g
+s%@target_vendor@%$target_vendor%g
+s%@target_os@%$target_os%g
+s%@build@%$build%g
+s%@build_alias@%$build_alias%g
+s%@build_cpu@%$build_cpu%g
+s%@build_vendor@%$build_vendor%g
+s%@build_os@%$build_os%g
+s%@CC@%$CC%g
+s%@AR@%$AR%g
+s%@AS@%$AS%g
+s%@RANLIB@%$RANLIB%g
+s%@LD@%$LD%g
+s%@DLLTOOL@%$DLLTOOL%g
+s%@WINDRES@%$WINDRES%g
+s%@CPP@%$CPP%g
+s%@ALLOCA@%$ALLOCA%g
+s%@subdirs@%$subdirs%g
+s%@SET_MAKE@%$SET_MAKE%g
+s%@MT_SAFE@%$MT_SAFE%g
+s%@PTH_ALLOW@%$PTH_ALLOW%g
+s%@EXE_LDFLAGS@%$EXE_LDFLAGS%g
+s%@DLL_ENTRY@%$DLL_ENTRY%g
+s%@DEF_DLL_ENTRY@%$DEF_DLL_ENTRY%g
+s%@CONFIG_DIR@%$CONFIG_DIR%g
+
+CEOF
+EOF
+
+cat >> $CONFIG_STATUS <<\EOF
+
+# Split the substitutions into bite-sized pieces for seds with
+# small command number limits, like on Digital OSF/1 and HP-UX.
+ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script.
+ac_file=1 # Number of current file.
+ac_beg=1 # First line for current file.
+ac_end=$ac_max_sed_cmds # Line after last line for current file.
+ac_more_lines=:
+ac_sed_cmds=""
+while $ac_more_lines; do
+ if test $ac_beg -gt 1; then
+ sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file
+ else
+ sed "${ac_end}q" conftest.subs > conftest.s$ac_file
+ fi
+ if test ! -s conftest.s$ac_file; then
+ ac_more_lines=false
+ rm -f conftest.s$ac_file
+ else
+ if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds="sed -f conftest.s$ac_file"
+ else
+ ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file"
+ fi
+ ac_file=`expr $ac_file + 1`
+ ac_beg=$ac_end
+ ac_end=`expr $ac_end + $ac_max_sed_cmds`
+ fi
+done
+if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds=cat
+fi
+EOF
+
+cat >> $CONFIG_STATUS <<EOF
+
+CONFIG_FILES=\${CONFIG_FILES-"Makefile cygwin.def:cygwin.din"}
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then
+ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+ case "$ac_file" in
+ *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
+ ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+ *) ac_file_in="${ac_file}.in" ;;
+ esac
+
+ # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories.
+
+ # Remove last slash and all that follows it. Not all systems have dirname.
+ ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
+ if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
+ # The file is in a subdirectory.
+ test ! -d "$ac_dir" && mkdir "$ac_dir"
+ ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`"
+ # A "../" for each directory in $ac_dir_suffix.
+ ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'`
+ else
+ ac_dir_suffix= ac_dots=
+ fi
+
+ case "$ac_given_srcdir" in
+ .) srcdir=.
+ if test -z "$ac_dots"; then top_srcdir=.
+ else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;;
+ /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;;
+ *) # Relative path.
+ srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix"
+ top_srcdir="$ac_dots$ac_given_srcdir" ;;
+ esac
+
+ case "$ac_given_INSTALL" in
+ [/$]*) INSTALL="$ac_given_INSTALL" ;;
+ *) INSTALL="$ac_dots$ac_given_INSTALL" ;;
+ esac
+
+ echo creating "$ac_file"
+ rm -f "$ac_file"
+ configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure."
+ case "$ac_file" in
+ *Makefile*) ac_comsub="1i\\
+# $configure_input" ;;
+ *) ac_comsub= ;;
+ esac
+
+ ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
+ sed -e "$ac_comsub
+s%@configure_input@%$configure_input%g
+s%@srcdir@%$srcdir%g
+s%@top_srcdir@%$top_srcdir%g
+s%@INSTALL@%$INSTALL%g
+" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file
+fi; done
+rm -f conftest.s*
+
+# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where
+# NAME is the cpp macro being defined and VALUE is the value it is being given.
+#
+# ac_d sets the value in "#define NAME VALUE" lines.
+ac_dA='s%^\([ ]*\)#\([ ]*define[ ][ ]*\)'
+ac_dB='\([ ][ ]*\)[^ ]*%\1#\2'
+ac_dC='\3'
+ac_dD='%g'
+# ac_u turns "#undef NAME" with trailing blanks into "#define NAME VALUE".
+ac_uA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)'
+ac_uB='\([ ]\)%\1#\2define\3'
+ac_uC=' '
+ac_uD='\4%g'
+# ac_e turns "#undef NAME" without trailing blanks into "#define NAME VALUE".
+ac_eA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)'
+ac_eB='$%\1#\2define\3'
+ac_eC=' '
+ac_eD='%g'
+
+if test "${CONFIG_HEADERS+set}" != set; then
+EOF
+cat >> $CONFIG_STATUS <<EOF
+ CONFIG_HEADERS="config.h"
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+fi
+for ac_file in .. $CONFIG_HEADERS; do if test "x$ac_file" != x..; then
+ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+ case "$ac_file" in
+ *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
+ ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+ *) ac_file_in="${ac_file}.in" ;;
+ esac
+
+ echo creating $ac_file
+
+ rm -f conftest.frag conftest.in conftest.out
+ ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
+ cat $ac_file_inputs > conftest.in
+
+EOF
+
+# Transform confdefs.h into a sed script conftest.vals that substitutes
+# the proper values into config.h.in to produce config.h. And first:
+# Protect against being on the right side of a sed subst in config.status.
+# Protect against being in an unquoted here document in config.status.
+rm -f conftest.vals
+cat > conftest.hdr <<\EOF
+s/[\\&%]/\\&/g
+s%[\\$`]%\\&%g
+s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD}%gp
+s%ac_d%ac_u%gp
+s%ac_u%ac_e%gp
+EOF
+sed -n -f conftest.hdr confdefs.h > conftest.vals
+rm -f conftest.hdr
+
+# This sed command replaces #undef with comments. This is necessary, for
+# example, in the case of _POSIX_SOURCE, which is predefined and required
+# on some systems where configure will not decide to define it.
+cat >> conftest.vals <<\EOF
+s%^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*%/* & */%
+EOF
+
+# Break up conftest.vals because some shells have a limit on
+# the size of here documents, and old seds have small limits too.
+
+rm -f conftest.tail
+while :
+do
+ ac_lines=`grep -c . conftest.vals`
+ # grep -c gives empty output for an empty file on some AIX systems.
+ if test -z "$ac_lines" || test "$ac_lines" -eq 0; then break; fi
+ # Write a limited-size here document to conftest.frag.
+ echo ' cat > conftest.frag <<CEOF' >> $CONFIG_STATUS
+ sed ${ac_max_here_lines}q conftest.vals >> $CONFIG_STATUS
+ echo 'CEOF
+ sed -f conftest.frag conftest.in > conftest.out
+ rm -f conftest.in
+ mv conftest.out conftest.in
+' >> $CONFIG_STATUS
+ sed 1,${ac_max_here_lines}d conftest.vals > conftest.tail
+ rm -f conftest.vals
+ mv conftest.tail conftest.vals
+done
+rm -f conftest.vals
+
+cat >> $CONFIG_STATUS <<\EOF
+ rm -f conftest.frag conftest.h
+ echo "/* $ac_file. Generated automatically by configure. */" > conftest.h
+ cat conftest.in >> conftest.h
+ rm -f conftest.in
+ if cmp -s $ac_file conftest.h 2>/dev/null; then
+ echo "$ac_file is unchanged"
+ rm -f conftest.h
+ else
+ # Remove last slash and all that follows it. Not all systems have dirname.
+ ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
+ if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
+ # The file is in a subdirectory.
+ test ! -d "$ac_dir" && mkdir "$ac_dir"
+ fi
+ rm -f $ac_file
+ mv conftest.h $ac_file
+ fi
+fi; done
+
+EOF
+cat >> $CONFIG_STATUS <<EOF
+
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+
+exit 0
+EOF
+chmod +x $CONFIG_STATUS
+rm -fr confdefs* $ac_clean_files
+test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1
+
+if test "$no_recursion" != yes; then
+
+ # Remove --cache-file and --srcdir arguments so they do not pile up.
+ ac_sub_configure_args=
+ ac_prev=
+ for ac_arg in $ac_configure_args; do
+ if test -n "$ac_prev"; then
+ ac_prev=
+ continue
+ fi
+ case "$ac_arg" in
+ -cache-file | --cache-file | --cache-fil | --cache-fi \
+ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+ ac_prev=cache_file ;;
+ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+ ;;
+ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+ ac_prev=srcdir ;;
+ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+ ;;
+ *) ac_sub_configure_args="$ac_sub_configure_args $ac_arg" ;;
+ esac
+ done
+
+ for ac_config_dir in utils doc; do
+
+ # Do not complain, so a configure script can configure whichever
+ # parts of a large source tree are present.
+ if test ! -d $srcdir/$ac_config_dir; then
+ continue
+ fi
+
+ echo configuring in $ac_config_dir
+
+ case "$srcdir" in
+ .) ;;
+ *)
+ if test -d ./$ac_config_dir || mkdir ./$ac_config_dir; then :;
+ else
+ { echo "configure: error: can not create `pwd`/$ac_config_dir" 1>&2; exit 1; }
+ fi
+ ;;
+ esac
+
+ ac_popdir=`pwd`
+ cd $ac_config_dir
+
+ # A "../" for each directory in /$ac_config_dir.
+ ac_dots=`echo $ac_config_dir|sed -e 's%^\./%%' -e 's%[^/]$%&/%' -e 's%[^/]*/%../%g'`
+
+ case "$srcdir" in
+ .) # No --srcdir option. We are building in place.
+ ac_sub_srcdir=$srcdir ;;
+ /*) # Absolute path.
+ ac_sub_srcdir=$srcdir/$ac_config_dir ;;
+ *) # Relative path.
+ ac_sub_srcdir=$ac_dots$srcdir/$ac_config_dir ;;
+ esac
+
+ # Check for guested configure; otherwise get Cygnus style configure.
+ if test -f $ac_sub_srcdir/configure; then
+ ac_sub_configure=$ac_sub_srcdir/configure
+ elif test -f $ac_sub_srcdir/configure.in; then
+ ac_sub_configure=$ac_configure
+ else
+ echo "configure: warning: no configuration information is in $ac_config_dir" 1>&2
+ ac_sub_configure=
+ fi
+
+ # The recursion is here.
+ if test -n "$ac_sub_configure"; then
+
+ # Make the cache file name correct relative to the subdirectory.
+ case "$cache_file" in
+ /*) ac_sub_cache_file=$cache_file ;;
+ *) # Relative path.
+ ac_sub_cache_file="$ac_dots$cache_file" ;;
+ esac
+ case "$ac_given_INSTALL" in
+ [/$]*) INSTALL="$ac_given_INSTALL" ;;
+ *) INSTALL="$ac_dots$ac_given_INSTALL" ;;
+ esac
+
+ echo "running ${CONFIG_SHELL-/bin/sh} $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_sub_srcdir"
+ # The eval makes quoting arguments work.
+ if eval ${CONFIG_SHELL-/bin/sh} $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_sub_srcdir
+ then :
+ else
+ { echo "configure: error: $ac_sub_configure failed for $ac_config_dir" 1>&2; exit 1; }
+ fi
+ fi
+
+ cd $ac_popdir
+ done
+fi
+
+
diff --git a/winsup/cygwin/configure.in b/winsup/cygwin/configure.in
new file mode 100644
index 000000000..0aaea9bbd
--- /dev/null
+++ b/winsup/cygwin/configure.in
@@ -0,0 +1,229 @@
+dnl Autoconf configure script for Cygwin.
+dnl Copyright 1996, 1997, 1998, 2000 Cygnus Solutions.
+dnl
+dnl This file is part of Cygwin.
+dnl
+dnl This software is a copyrighted work licensed under the terms of the
+dnl Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+dnl details.
+dnl
+dnl Process this file with autoconf to produce a configure script.
+
+AC_PREREQ(2.12)dnl
+AC_INIT(init.cc)
+AC_CONFIG_HEADER(config.h)
+
+AC_PROG_INSTALL
+
+dnl FIXME: We temporarily define our own version of AC_PROG_CC. This is
+dnl copied from autoconf 2.12, but does not call AC_PROG_CC_WORKS. We
+dnl are probably using a cross compiler, which will not be able to fully
+dnl link an executable. This should really be fixed in autoconf
+dnl itself.
+
+AC_DEFUN(LIB_AC_PROG_CC,
+[AC_BEFORE([$0], [AC_PROG_CPP])dnl
+AC_CHECK_TOOL(CC, gcc, gcc)
+if test -z "$CC"; then
+ AC_CHECK_PROG(CC, cc, cc, , , /usr/ucb/cc)
+ test -z "$CC" && AC_MSG_ERROR([no acceptable cc found in \$PATH])
+fi
+
+AC_PROG_CC_GNU
+
+if test $ac_cv_prog_gcc = yes; then
+ GCC=yes
+dnl Check whether -g works, even if CFLAGS is set, in case the package
+dnl plays around with CFLAGS (such as to build both debugging and
+dnl normal versions of a library), tasteless as that idea is.
+ ac_test_CFLAGS="${CFLAGS+set}"
+ ac_save_CFLAGS="$CFLAGS"
+ CFLAGS=
+ AC_PROG_CC_G
+ if test "$ac_test_CFLAGS" = set; then
+ CFLAGS="$ac_save_CFLAGS"
+ elif test $ac_cv_prog_cc_g = yes; then
+ CFLAGS="-g -O2"
+ else
+ CFLAGS="-O2"
+ fi
+ if test "$ac_test_CXXFLAGS" != set; then
+ CXXFLAGS='$(CFLAGS)'
+ fi
+else
+ GCC=
+ test "${CFLAGS+set}" = set || CFLAGS="-g"
+fi
+])
+
+AC_CANONICAL_SYSTEM
+
+LIB_AC_PROG_CC
+
+AC_CHECK_TOOL(AR, ar, ar)
+AC_SUBST(AR)
+AC_CHECK_TOOL(AS, as, as)
+AC_SUBST(AS)
+AC_CHECK_TOOL(RANLIB, ranlib, ranlib)
+AC_SUBST(RANLIB)
+AC_CHECK_TOOL(LD, ld, ld)
+AC_SUBST(LD)
+AC_CHECK_TOOL(DLLTOOL, dlltool, dlltool)
+AC_SUBST(DLLTOOL)
+AC_CHECK_TOOL(WINDRES, windres, windres)
+AC_SUBST(WINDRES)
+
+AC_ALLOCA
+AC_CONFIG_SUBDIRS(utils doc)
+AC_PROG_MAKE_SET
+
+dnl check whether gcc supports __builtin_memset.
+# Test for builtin mem* functions.
+AC_LANG_SAVE
+AC_LANG_CPLUSPLUS
+AC_TRY_COMPILE([
+#include <string.h>
+void foo(char *s, int c, size_t n)
+{
+ __builtin_memset(s, c, n);
+}
+], [ ],
+use_builtin_memset=yes, use_builtin_memset=no)
+if test $use_builtin_memset = "yes"; then
+ AC_DEFINE(HAVE_BUILTIN_MEMSET)
+fi
+AC_LANG_RESTORE
+
+AC_ARG_ENABLE(strace-hhmmss,
+[ --enable-strace-hhmmss strace log output has date/time stamp],
+[case "${enableval}" in
+yes)
+ AC_DEFINE(STRACE_HHMMSS)
+ ;;
+no)
+ ;;
+*)
+ AC_MSG_ERROR(bad value ${enableval} given for enable-strace-hhmmss option)
+ ;;
+esac
+])
+
+dnl set default mt safeness and then process the options.
+mt_safe_val=1
+MT_SAFE=yes
+PTH_ALLOW=''
+
+AC_ARG_ENABLE(threadsafe,
+[ --enable-threadsafe=[runtime] Build a cygwin DLL which is thread safe],
+[case "${enableval}" in
+yes)
+ dnl default.
+ ;;
+runtime)
+ mt_safe_val=2
+ MT_SAFE=yes
+ ;;
+no)
+ mt_safe_val=0
+ MT_SAFE=no
+ PTH_ALLOW=';'
+ ;;
+esac
+])
+
+AC_ARG_ENABLE(extra-threadsafe-checking,
+[ --enable-extra-threadsafe-checking Build a cygwin DLL which is thread safe with extra consistency checking],
+[case "${enableval}" in
+yes)
+ mt_safe_val=1
+ MT_SAFE=yes
+ AC_DEFINE(_CYG_THREAD_FAILSAFE)
+ ;;
+no)
+ dnl Don't do anything here to avoid overriding --enable-threadsafe.
+ ;;
+esac
+])
+
+if test "$MT_SAFE" = "yes"; then
+ AC_DEFINE_UNQUOTED(_MT_SAFE,$mt_safe_val)
+fi
+
+dnl Makefile uses MT_SAFE, so we subst as well as defining it.
+AC_SUBST(MT_SAFE)
+AC_SUBST(PTH_ALLOW)
+
+AC_ARG_ENABLE(debugging,
+[ --enable-debugging Build a cygwin DLL which has more consistency checking for debugging],
+[case "${enableval}" in
+yes) AC_DEFINE(DEBUGGING) ;;
+no) ;;
+esac
+])
+
+
+dnl The only time we might want to transform the install names
+dnl is for unix x cygwin. Otherwise we don't. For now we don't
+dnl transform names.
+
+dnl if test "x$cross_compiling" = "xno" -a ; then
+dnl if test "x$program_transform_name" = "xs,x,x,"; then
+dnl program_transform_name=""
+dnl fi
+dnl if test "x$program_transform_name" = "x"; then
+dnl program_transform_name="s,^,$target_alias-,"
+dnl else
+dnl program_transform_name="$program_transform_name -e s,^,$target_alias-,"
+dnl fi
+dnl fi
+
+dnl
+dnl If newlib is part of build tree, always set EXE_LDFLAGS to point to
+dnl it; this is important in cases where the installed newlib is perhaps
+dnl not compatible. Check and warn for installed newlib only if it's not
+dnl part of the build tree.
+dnl
+
+AC_MSG_CHECKING([if newlib is part of the build tree])
+
+EXE_LDFLAGS=
+if test -d ../newlib
+then
+ AC_MSG_RESULT(yes)
+ EXE_LDFLAGS="-B../../newlib/ -B../"
+else
+ AC_MSG_RESULT(no)
+fi
+ AC_SUBST(EXE_LDFLAGS)
+
+if test x"$EXE_LDFLAGS" = x
+then
+ AC_MSG_CHECKING([if installed newlib needed])
+ AC_TRY_LINK(,
+ [/* main already defined */]
+ ,
+ AC_MSG_RESULT(no)
+ ,
+ AC_MSG_RESULT(yes)
+ AC_MSG_WARN(newlib not found - utility .exe's may not link))
+fi
+AC_SUBST(EXE_LDFLAGS)
+
+case "$target_cpu" in
+ i386|i486|i586|i686) DLL_ENTRY="_dll_entry@12"
+ DEF_DLL_ENTRY="dll_entry@12"
+ ALLOCA="_alloca"
+ CONFIG_DIR="i386" ;;
+ powerpc*) DLL_ENTRY="dll_entry"
+ DEF_DLL_ENTRY="dll_entry"
+ ALLOCA=" __allocate_stack"
+ CONFIG_DIR="ppc" ;;
+ *) AC_MSG_ERROR(Invalid target processor \"$target_cpu\") ;;
+esac
+
+AC_SUBST(DLL_ENTRY)
+AC_SUBST(DEF_DLL_ENTRY)
+AC_SUBST(ALLOCA)
+AC_SUBST(CONFIG_DIR)
+AC_OUTPUT(Makefile cygwin.def:cygwin.din)
+
diff --git a/winsup/cygwin/cygwin.din b/winsup/cygwin/cygwin.din
new file mode 100644
index 000000000..fd814133a
--- /dev/null
+++ b/winsup/cygwin/cygwin.din
@@ -0,0 +1,1051 @@
+LIBRARY "cygwin1.dll" BASE=0x61000000
+
+EXPORTS
+__assert
+__eprintf
+__errno
+__infinity
+__main
+__srget
+__swbuf
+__vc__10pinfo_listi
+@ALLOCA@
+cygwin_stackdump
+_strace_wm
+abort
+_abort = abort
+abs
+_abs = abs
+access
+_access = access
+acos
+_acos = acos
+acosf
+_acosf = acosf
+acosh
+_acosh = acosh
+acoshf
+_acoshf = acoshf
+alarm
+_alarm = alarm
+alphasort
+_alphasort = alphasort
+asctime
+_asctime = asctime
+asin
+_asin = asin
+asinf
+_asinf = asinf
+asinh
+_asinh = asinh
+asinhf
+_asinhf = asinhf
+atan
+_atan = atan
+atan2
+_atan2 = atan2
+atan2f
+_atan2f = atan2f
+atanf
+_atanf = atanf
+atanh
+_atanh = atanh
+atanhf
+_atanhf = atanhf
+atexit
+_atexit = atexit
+atof
+_atof = atof
+atoff
+_atoff = atoff
+atoi
+_atoi = atoi
+atol
+_atol = atol
+bcmp
+_bcmp = bcmp
+bcopy
+_bcopy = bcopy
+bsearch
+_bsearch = bsearch
+bzero
+_bzero = bzero
+cabs
+_cabs = cabs
+cabsf
+_cabsf = cabsf
+calloc = export_calloc
+_calloc = export_calloc
+cbrt
+_cbrt = cbrt
+cbrtf
+_cbrtf = cbrtf
+ceil
+_ceil = ceil
+ceilf
+_ceilf = ceilf
+cfgetospeed
+cfgetispeed
+cfsetospeed
+cfsetispeed
+chdir
+_chdir = chdir
+chmod
+_chmod = chmod
+chown
+_chown = chown
+cleanup_glue
+clearerr
+_clearerr = clearerr
+clock
+_clock = clock
+close
+_close = close
+closedir
+_closedir = closedir
+copysign
+_copysign = copysign
+copysignf
+_copysignf = copysignf
+cos
+_cos = cos
+cosf
+_cosf = cosf
+cosh
+_cosh = cosh
+coshf
+_coshf = coshf
+creat
+_creat = creat
+ctime
+_ctime = ctime
+cwait
+_cwait = cwait
+difftime
+_difftime = difftime
+div
+_div = div
+dll_crt0__FP11per_process
+dll_dllcrt0
+dll_noncygwin_dllcrt0
+cygwin_detach_dll
+cygwin32_detach_dll = cygwin_detach_dll
+@DEF_DLL_ENTRY@
+drem
+_drem = drem
+dremf
+_dremf = dremf
+dup
+_dup = dup
+dup2
+_dup2 = dup2
+ecvt
+_ecvt = ecvt
+ecvtbuf
+_ecvtbuf = ecvtbuf
+ecvtf
+_ecvtf = ecvtf
+endgrent
+_endgrent = endgrent
+erf
+_erf = erf
+erfc
+_erfc = erfc
+erfcf
+_erfcf = erfcf
+erff
+_erff = erff
+execl
+_execl = execl
+execle
+_execle = execle
+execlp
+_execlp = execlp
+execv
+_execv = execv
+execve
+_execve = execve
+execvp
+_execvp = execvp
+exit
+_exit
+exp
+_exp = exp
+expf
+_expf = expf
+expm1
+_expm1 = expm1
+expm1f
+_expm1f = expm1f
+fabs
+_fabs = fabs
+fabsf
+_fabsf = fabsf
+fchmod
+_fchmod = fchmod
+fclose
+_fclose = fclose
+fcntl
+_fcntl = fcntl
+fcvt
+_fcvt = fcvt
+fcvtbuf
+_fcvtbuf = fcvtbuf
+fcvtf
+_fcvtf = fcvtf
+fdopen
+_fdopen = fdopen
+feof
+_feof = feof
+ferror
+_ferror = ferror
+fflush
+_fflush = fflush
+fgetc
+_fgetc = fgetc
+fgetpos
+_fgetpos = fgetpos
+fgets
+_fgets = fgets
+ffs
+_ffs = ffs
+fileno
+_fileno = fileno
+finite
+_finite = finite
+finitef
+_finitef = finitef
+fiprintf
+_fiprintf = fiprintf
+floor
+_floor = floor
+floorf
+_floorf = floorf
+fmod
+_fmod = fmod
+fmodf
+_fmodf = fmodf
+fopen
+_fopen = fopen
+fork
+_fork = fork
+fpathconf
+fprintf
+_fprintf = fprintf
+fputc
+_fputc = fputc
+fputs
+_fputs = fputs
+fread
+_fread = fread
+free = export_free
+_free = export_free
+freopen
+_freopen = freopen
+frexp
+_frexp = frexp
+frexpf
+_frexpf = frexpf
+fscanf
+_fscanf = fscanf
+fseek
+_fseek = fseek
+fsetpos
+_fsetpos = fsetpos
+fstat
+_fstat = fstat
+fstatfs
+_fstatfs = fstatfs
+fsync
+_fsync = fsync
+ftell
+_ftell = ftell
+ftime
+_ftime = ftime
+ftruncate
+_ftruncate = ftruncate
+fwrite
+_fwrite = fwrite
+gamma
+_gamma = gamma
+gammaf
+_gammaf = gammaf
+gcvt
+_gcvt = gcvt
+gcvtf
+_gcvtf = gcvtf
+getc
+_getc = getc
+getchar
+_getchar = getchar
+getcwd
+_getcwd = getcwd
+getdtablesize
+_getdtablesize = getdtablesize
+getegid
+_getegid = getegid
+geteuid
+_geteuid = geteuid
+getgid
+_getgid = getgid
+getgrgid
+_getgrgid = getgrgid
+getgrnam
+_getgrnam = getgrnam
+getgroups
+_getgroups = getgroups
+gethostname = cygwin_gethostname
+_gethostname = cygwin_gethostname
+getlogin
+_getlogin = getlogin
+getmntent
+_getmntent = getmntent
+get_osfhandle
+_get_osfhandle = get_osfhandle
+getpagesize
+_getpagesize = getpagesize
+getpass
+_getpass = getpass
+getpid
+_getpid = getpid
+getppid
+_getppid = getppid
+getrusage
+_getrusage = getrusage
+gets
+_gets = gets
+gettimeofday
+_gettimeofday = gettimeofday
+getuid
+_getuid = getuid
+glob
+_glob = glob
+globfree
+_globfree = globfree
+gmtime
+_gmtime = gmtime
+h_errno DATA
+hypot
+_hypot = hypot
+hypotf
+_hypotf = hypotf
+ilogb
+_ilogb = ilogb
+ilogbf
+_ilogbf = ilogbf
+index
+_index = index
+infinity
+_infinity = infinity
+infinityf
+_infinityf = infinityf
+initgroups
+ioctl
+_ioctl = ioctl
+iprintf
+_iprintf = iprintf
+isalnum
+_isalnum = isalnum
+isalpha
+_isalpha = isalpha
+isascii
+_isascii = isascii
+isatty
+_isatty = isatty
+iscntrl
+_iscntrl = iscntrl
+isdigit
+_isdigit = isdigit
+isgraph
+_isgraph = isgraph
+isinf
+_isinf = isinf
+isinff
+_isinff = isinff
+islower
+_islower = islower
+isnan
+_isnan = isnan
+isnanf
+_isnanf = isnanf
+isprint
+_isprint = isprint
+ispunct
+_ispunct = ispunct
+isspace
+_isspace = isspace
+isupper
+_isupper = isupper
+isxdigit
+_isxdigit = isxdigit
+j0
+_j0 = j0
+j0f
+_j0f = j0f
+j1
+_j1 = j1
+j1f
+_j1f = j1f
+jn
+_jn = jn
+jnf
+_jnf = jnf
+kill
+_kill = kill
+labs
+_labs = labs
+ldexp
+_ldexp = ldexp
+ldexpf
+_ldexpf = ldexpf
+ldiv
+_ldiv = ldiv
+lgamma
+_lgamma = lgamma
+lgammaf
+_lgammaf = lgammaf
+link
+_link = link
+localeconv
+_localeconv = localeconv
+localtime
+_localtime = localtime
+log
+_log = log
+log10
+_log10 = log10
+log10f
+_log10f = log10f
+log1p
+_log1p = log1p
+log1pf
+_log1pf = log1pf
+logb
+_logb = logb
+logbf
+_logbf = logbf
+logf
+_logf = logf
+login
+logout
+longjmp
+_longjmp = longjmp
+lseek
+_lseek = lseek
+lstat
+_lstat = lstat
+malloc = export_malloc
+_malloc = export_malloc
+matherr
+_matherr = matherr
+mblen
+_mblen = mblen
+mbstowcs
+_mbstowcs = mbstowcs
+mbtowc
+_mbtowc = mbtowc
+memchr
+_memchr = memchr
+memcmp
+_memcmp = memcmp
+memcpy
+_memcpy = memcpy
+memmove
+_memmove = memmove
+memset
+_memset = memset
+mkdir
+_mkdir = mkdir
+mknod
+_mknod = mknod
+mkstemp
+_mkstemp = mkstemp
+mktemp
+_mktemp = mktemp
+mktime
+_mktime = mktime
+mmap
+mprotect
+msync
+munmap
+modf
+_modf = modf
+modff
+_modff = modff
+nan
+_nan = nan
+nanf
+_nanf = nanf
+nextafter
+_nextafter = nextafter
+nextafterf
+_nextafterf = nextafterf
+open
+_open = open
+opendir
+_opendir = opendir
+pathconf
+_pathconf = pathconf
+perror
+_perror = perror
+pipe
+_pipe
+pow
+_pow = pow
+powf
+_powf = powf
+printf
+_printf = printf
+putc
+_putc = putc
+putchar
+_putchar = putchar
+puts
+_puts = puts
+putw
+_putw = putw
+qsort
+_qsort = qsort
+raise
+_raise = raise
+rand
+_rand = rand
+random
+initstate
+setstate
+read
+_read = read
+readdir
+_readdir = readdir
+readlink
+_readlink = readlink
+readv
+_readv = readv
+realloc = export_realloc
+_realloc = export_realloc
+regcomp
+_regcomp = regcomp
+regexec
+_regexec = regexec
+regerror
+_regerror = regerror
+regfree
+_regfree = regfree
+remainder
+_remainder = remainder
+remainderf
+_remainderf = remainderf
+remove
+_remove = remove
+rename
+_rename = rename
+rewind
+_rewind = rewind
+rewinddir
+_rewinddir = rewinddir
+rindex
+_rindex = rindex
+rint
+_rint = rint
+rintf
+_rintf = rintf
+rmdir
+_rmdir = rmdir
+sbrk
+_sbrk = sbrk
+scalb
+_scalb = scalb
+scalbf
+_scalbf = scalbf
+scalbn
+_scalbn = scalbn
+scalbnf
+_scalbnf = scalbnf
+scandir
+_scandir = scandir
+scanf
+_scanf = scanf
+seekdir
+_seekdir = seekdir
+setbuf
+_setbuf = setbuf
+setdtablesize
+_setdtablesize = setdtablesize
+setgid
+_setgid = setgid
+setjmp
+_setjmp = setjmp
+setlocale
+_setlocale = setlocale
+setpgid
+_setpgid = setpgid
+setsid
+_setsid = setsid
+settimeofday
+_settimeofday = settimeofday
+seteuid
+_seteuid = seteuid
+setegid
+_setegid = setegid
+setuid
+_setuid = setuid
+chroot
+_chroot = chroot
+setvbuf
+_setvbuf = setvbuf
+sigaction
+_sigaction = sigaction
+sigaddset
+_sigaddset = sigaddset
+sigdelset
+_sigdelset = sigdelset
+sigismember
+_sigismember = sigismember
+sigemptyset
+_sigemptyset = sigemptyset
+sigfillset
+_sigfillset = sigfillset
+signal
+_signal = signal
+significand
+_significand = significand
+significandf
+_significandf = significandf
+sigpending
+_sigpending = sigpending
+sigprocmask
+_sigprocmask = sigprocmask
+sigsuspend
+_sigsuspend = sigsuspend
+sin
+_sin = sin
+sinf
+_sinf = sinf
+sinh
+_sinh = sinh
+sinhf
+_sinhf = sinhf
+siprintf
+_siprintf = siprintf
+sleep
+_sleep = sleep
+spawnl
+_spawnl = spawnl
+spawnle
+_spawnle = spawnle
+spawnlp
+_spawnlp = spawnlp
+spawnlpe
+_spawnlpe = spawnlpe
+spawnv
+_spawnv = spawnv
+spawnve
+_spawnve = spawnve
+spawnvp
+_spawnvp = spawnvp
+spawnvpe
+_spawnvpe = spawnvpe
+sprintf
+_sprintf = sprintf
+snprintf
+_snprintf = snprintf
+sqrt
+_sqrt = sqrt
+sqrtf
+_sqrtf = sqrtf
+srand
+_srand = srand
+srandom
+sscanf
+_sscanf = sscanf
+stat
+_stat = stat
+statfs
+_statfs = statfs
+strcasecmp
+_strcasecmp = strcasecmp
+strcat
+_strcat = strcat
+strchr
+_strchr = strchr
+strcmp
+_strcmp = strcmp
+strcoll
+_strcoll = strcoll
+strcpy
+_strcpy = strcpy
+strcspn
+_strcspn = strcspn
+strdup
+_strdup = strdup
+strerror
+_strerror = strerror
+strlen
+_strlen = strlen
+strlwr
+_strlwr = strlwr
+strncasecmp
+_strncasecmp = strncasecmp
+strncat
+_strncat = strncat
+strncmp
+_strncmp = strncmp
+strncpy
+_strncpy = strncpy
+strpbrk
+_strpbrk = strpbrk
+strrchr
+_strrchr = strrchr
+strspn
+_strspn = strspn
+strstr
+_strstr = strstr
+strtod
+_strtod = strtod
+strtodf
+_strtodf = strtodf
+strtok
+_strtok = strtok
+strtol
+_strtol = strtol
+strtoul
+_strtoul = strtoul
+strupr
+_strupr = strupr
+strxfrm
+_strxfrm = strxfrm
+swab
+_swab = swab
+symlink
+_symlink = symlink
+sync
+_sync = sync
+sysconf
+_sysconf = sysconf
+system
+_system = system
+tan
+_tan = tan
+tanf
+_tanf = tanf
+tanh
+_tanh = tanh
+tanhf
+_tanhf = tanhf
+tcdrain
+_tcdrain = tcdrain
+tcflow
+_tcflow = tcflow
+tcflush
+_tcflush = tcflush
+tcgetattr
+_tcgetattr = tcgetattr
+tcgetpgrp
+_tcgetpgrp = tcgetpgrp
+tcsendbreak
+_tcsendbreak = tcsendbreak
+tcsetattr
+_tcsetattr = tcsetattr
+tcsetpgrp
+_tcsetpgrp = tcsetpgrp
+telldir
+_telldir = telldir
+tempnam
+_tempnam = tempnam
+time
+_time = time
+times
+_times = times
+timezone
+tmpfile
+_tmpfile = tmpfile
+tmpnam
+_tmpnam = tmpnam
+toascii
+_toascii = toascii
+tolower
+_tolower = tolower
+toupper
+_toupper = toupper
+truncate
+_truncate = truncate
+ttyname
+_ttyname = ttyname
+tzset
+_tzset = tzset
+umask
+_umask = umask
+uname
+_uname = uname
+ungetc
+_ungetc = ungetc
+unlink
+_unlink = unlink
+utime
+_utime = utime
+utimes
+_utimes = utimes
+vfiprintf
+_vfiprintf = vfiprintf
+vfork
+_vfork = vfork
+vfprintf
+_vfprintf = vfprintf
+vprintf
+_vprintf = vprintf
+vsprintf
+_vsprintf = vsprintf
+vsnprintf
+_vsnprintf = vsnprintf
+wait
+_wait = wait
+waitpid
+_waitpid = waitpid
+wait3
+wait4
+wcstombs
+_wcstombs = wcstombs
+wctomb
+_wctomb = wctomb
+write
+_write = write
+writev
+_writev = writev
+y0
+y0f
+y1
+y1f
+yn
+ynf
+setmode
+_setmode = setmode
+__assertfail
+getw
+_getw = getw
+getwd
+_getwd = getwd
+popen
+_popen = popen
+pclose
+_pclose = pclose
+strftime
+_strftime = strftime
+setgrent
+_setgrent = setgrent
+cuserid
+_cuserid = cuserid
+setpgrp
+_setpgrp = setpgrp
+mount
+_mount = mount
+setmntent
+_setmntent = setmntent
+endmntent
+_endmntent = endmntent
+umount
+_umount = umount
+wcscmp
+_wcscmp = wcscmp
+wcslen
+_wcslen = wcslen
+usleep
+_usleep = usleep
+wprintf
+_wprintf = wprintf
+memccpy
+_memccpy = memccpy
+getpwent
+_getpwent = getpwent
+endpwent
+_endpwent = endpwent
+setpwent
+_setpwent = setpwent
+getpwduid
+_getpwduid = getpwduid
+getpwnam
+_getpwnam = getpwnam
+getpwuid
+_getpwuid = getpwuid
+getpgrp
+_getpgrp = getpgrp
+getgrent
+_getgrent = getgrent
+__empty
+ntohl
+_ntohl = ntohl
+htonl
+_htonl = htonl
+htons
+_htons = htons
+ntohs
+_ntohs = ntohs
+accept = cygwin_accept
+bind = cygwin_bind
+connect = cygwin_connect
+herror = cygwin_herror
+inet_addr = cygwin_inet_addr
+inet_netof
+inet_makeaddr
+listen = cygwin_listen
+getdomainname
+_getdomainname = getdomainname
+gethostbyaddr = cygwin_gethostbyaddr
+gethostbyname = cygwin_gethostbyname
+getpeername = cygwin_getpeername
+getprotobyname = cygwin_getprotobyname
+getprotobynumber = cygwin_getprotobynumber
+getservbyname = cygwin_getservbyname
+getservbyport = cygwin_getservbyport
+getsockname = cygwin_getsockname
+getsockopt = cygwin_getsockopt
+recv = cygwin_recv
+select = cygwin_select
+_select = cygwin_select
+send = cygwin_send
+socket = cygwin_socket
+setsockopt = cygwin_setsockopt
+inet_ntoa = cygwin_inet_ntoa
+recvfrom = cygwin_recvfrom
+sendto = cygwin_sendto
+shutdown = cygwin_shutdown
+sethostent
+endhostent
+setpassent
+_setpassent = setpassent
+strsep
+_strsep = strsep
+syslog
+_syslog = syslog
+closelog
+_closelog = closelog
+openlog
+_openlog = openlog
+vhangup
+_vhangup = vhangup
+nice
+_nice = nice
+cygwin_getshared
+cygwin32_getshared = cygwin_getshared
+cygwin_conv_to_win32_path
+cygwin_conv_to_full_win32_path
+cygwin_conv_to_posix_path
+cygwin_conv_to_full_posix_path
+cygwin_posix_path_list_p
+cygwin_win32_to_posix_path_list_buf_size
+cygwin_posix_to_win32_path_list_buf_size
+cygwin_win32_to_posix_path_list
+cygwin_posix_to_win32_path_list
+cygwin_split_path
+cygwin_umount
+cygwin32_conv_to_win32_path = cygwin_conv_to_win32_path
+cygwin32_conv_to_full_win32_path = cygwin_conv_to_full_win32_path
+cygwin32_conv_to_posix_path = cygwin_conv_to_posix_path
+cygwin32_conv_to_full_posix_path = cygwin_conv_to_full_posix_path
+cygwin32_posix_path_list_p = cygwin_posix_path_list_p
+cygwin32_win32_to_posix_path_list_buf_size = cygwin_win32_to_posix_path_list_buf_size
+cygwin32_posix_to_win32_path_list_buf_size = cygwin_posix_to_win32_path_list_buf_size
+cygwin32_win32_to_posix_path_list = cygwin_win32_to_posix_path_list
+cygwin32_posix_to_win32_path_list = cygwin_posix_to_win32_path_list
+cygwin32_split_path = cygwin_split_path
+cygwin_winpid_to_pid
+cygwin32_winpid_to_pid = cygwin_winpid_to_pid
+realpath
+reent_data DATA
+getenv
+_getenv = getenv
+putenv
+_putenv = putenv
+setenv
+_setenv = setenv
+unsetenv
+_unsetenv = unsetenv
+setitimer
+getitimer
+getpgid
+killpg
+pause
+__cygwin_environ DATA
+_ctype_ DATA
+_sys_errlist DATA
+_sys_nerr DATA
+__mb_cur_max DATA
+_timezone DATA
+_daylight DATA
+_tzname DATA
+ptsname
+grantpt
+unlockpt
+sexecve
+sexecl
+sexecle
+sexeclp
+sexeclpe
+sexecv
+sexecp
+sexecvpe
+ttyslot
+rcmd = cygwin_rcmd
+rresvport = cygwin_rresvport
+rexec = cygwin_rexec
+socketpair
+strsignal
+strtosigno
+ctermid
+dlopen
+dlclose
+dlsym
+dlerror
+dlfork
+sigpause
+cygwin_attach_handle_to_fd
+cygwin32_attach_handle_to_fd = cygwin_attach_handle_to_fd
+cygwin_internal
+cygwin32_internal = cygwin_internal
+@PTH_ALLOW@pthread_create
+@PTH_ALLOW@pthread_attr_init
+@PTH_ALLOW@pthread_attr_destroy
+@PTH_ALLOW@pthread_attr_setstacksize
+@PTH_ALLOW@pthread_attr_getstacksize
+@PTH_ALLOW@pthread_exit
+@PTH_ALLOW@pthread_join
+@PTH_ALLOW@pthread_detach
+@PTH_ALLOW@pthread_suspend
+@PTH_ALLOW@pthread_continue
+@PTH_ALLOW@pthread_key_create
+@PTH_ALLOW@pthread_key_delete
+@PTH_ALLOW@pthread_setspecific
+@PTH_ALLOW@pthread_getspecific
+@PTH_ALLOW@pthread_kill
+@PTH_ALLOW@pthread_sigmask
+@PTH_ALLOW@pthread_self
+@PTH_ALLOW@pthread_equal
+@PTH_ALLOW@pthread_mutex_init
+@PTH_ALLOW@pthread_mutex_lock
+@PTH_ALLOW@pthread_mutex_trylock
+@PTH_ALLOW@pthread_mutex_unlock
+@PTH_ALLOW@pthread_mutex_destroy
+@PTH_ALLOW@sem_init
+@PTH_ALLOW@sem_destroy
+@PTH_ALLOW@sem_wait
+@PTH_ALLOW@sem_trywait
+@PTH_ALLOW@sem_post
+acl
+_acl = acl
+facl
+_facl = facl
+aclcheck
+_aclcheck = aclcheck
+aclsort
+_aclsort = aclsort
+acltomode
+_acltomode = acltomode
+aclfrommode
+_aclfrommode = aclfrommode
+acltopbits
+_acltopbits = acltopbits
+aclfrompbits
+_aclfrompbits = aclfrompbits
+acltotext
+_acltotext = acltotext
+aclfromtext
+_aclfromtext = aclfromtext
diff --git a/winsup/cygwin/dcrt0.cc b/winsup/cygwin/dcrt0.cc
new file mode 100644
index 000000000..10652044e
--- /dev/null
+++ b/winsup/cygwin/dcrt0.cc
@@ -0,0 +1,1063 @@
+/* dcrt0.cc -- essentially the main() for the Cygwin dll
+
+ Copyright 1996, 1997, 1998, 1999, 2000 Cygnus Solutions.
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#include <unistd.h>
+#include <stdlib.h>
+#include "winsup.h"
+#include "glob.h"
+#include "exceptions.h"
+#include "dll_init.h"
+#include "autoload.h"
+#include <ctype.h>
+
+#define MAX_AT_FILE_LEVEL 10
+
+HANDLE NO_COPY hMainProc = NULL;
+HANDLE NO_COPY hMainThread = NULL;
+
+static per_process dummy_user_data = {0};
+per_process NO_COPY *user_data = &dummy_user_data;
+
+per_thread_waitq NO_COPY waitq_storage;
+per_thread_vfork NO_COPY vfork_storage;
+per_thread_signal_dispatch NO_COPY signal_dispatch_storage;
+
+per_thread NO_COPY *threadstuff[] = {&waitq_storage,
+ &vfork_storage,
+ &signal_dispatch_storage,
+ NULL};
+
+BOOL display_title = FALSE;
+BOOL strip_title_path = FALSE;
+BOOL allow_glob = TRUE;
+
+HANDLE NO_COPY parent_alive = NULL;
+
+/* Used in SIGTOMASK for generating a bit for insertion into a sigset_t.
+ This is subtracted from the signal number prior to shifting the bit.
+ In older versions of cygwin, the signal was used as-is to shift the
+ bit for masking. So, we'll temporarily detect this and set it to zero
+ for programs that are linked using older cygwins. This is just a stopgap
+ measure to allow an orderly transfer to the new, correct sigmask method. */
+unsigned int signal_shift_subtract = 1;
+
+extern "C"
+{
+ /* This is an exported copy of environ which can be used by DLLs
+ which use cygwin.dll. */
+ char **__cygwin_environ;
+ /* __progname used in getopt error message */
+ char *__progname;
+ struct _reent reent_data;
+};
+
+static void dll_crt0_1 ();
+
+char *old_title = NULL;
+char title_buf[TITLESIZE + 1];
+
+static void
+do_global_dtors (void)
+{
+ if (user_data->dtors)
+ {
+ void (**pfunc)() = user_data->dtors;
+ while (*++pfunc)
+ (*pfunc) ();
+ }
+}
+
+static void __stdcall
+do_global_ctors (void (**in_pfunc)(), int force)
+{
+ if (!force)
+ {
+ if (user_data->forkee || user_data->run_ctors_p)
+ return; // inherit constructed stuff from parent pid
+ user_data->run_ctors_p = 1;
+ }
+
+ /* Run ctors backwards, so skip the first entry and find how many
+ there are, then run them. */
+
+ void (**pfunc)() = in_pfunc;
+
+ while (*++pfunc)
+ ;
+ while (--pfunc > in_pfunc)
+ (*pfunc) ();
+
+ if (user_data != &dummy_user_data)
+ atexit (do_global_dtors);
+}
+
+/* remember the type of Win32 OS being run for future use. */
+os_type NO_COPY os_being_run;
+
+/* set_os_type: Set global variable os_being_run with type of Win32
+ operating system being run. This information is used internally
+ to manage the inconsistency in Win32 API calls between Win32 OSes. */
+/* Cygwin internal */
+static void
+set_os_type ()
+{
+ OSVERSIONINFO os_version_info;
+ os_version_info.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);
+
+ GetVersionEx (&os_version_info);
+
+ switch (os_version_info.dwPlatformId)
+ {
+ case VER_PLATFORM_WIN32_NT:
+ os_being_run = winNT;
+ break;
+ case VER_PLATFORM_WIN32_WINDOWS:
+ if (os_version_info.dwMinorVersion == 0)
+ os_being_run = win95;
+ else /* os_version_info.dwMinorVersion == 10 */
+ os_being_run = win98;
+ break;
+ case VER_PLATFORM_WIN32s:
+ os_being_run = win32s;
+ break;
+ default:
+ os_being_run = unknown;
+ break;
+ }
+}
+
+host_dependent_constants NO_COPY host_dependent;
+
+/* Constructor for host_dependent_constants. */
+
+void
+host_dependent_constants::init (void)
+{
+ /* fhandler_disk_file::lock needs a platform specific upper word
+ value for locking entire files.
+
+ fhandler_base::open requires host dependent file sharing
+ attributes. */
+
+ switch (os_being_run)
+ {
+ case winNT:
+ win32_upper = 0xffffffff;
+ shared = FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE;
+ break;
+
+ case win98:
+ case win95:
+ case win32s:
+ win32_upper = 0x00000000;
+ shared = FILE_SHARE_READ | FILE_SHARE_WRITE;
+ break;
+
+ default:
+ api_fatal ("unrecognized system type");
+ }
+}
+
+/* Save the program name. It's used in debugging messages and by
+ the fork code (forking spawns a copy of us). Copy it into a temp and
+ then into the final spot because debugging messages use
+ myself->progname. Try getting the absolute path from the
+ module handle, if this fails get the name from the path.
+ This call references $PATH so we can't do this until the environment
+ vars are set up. */
+/* FIXME: What if argv[0] is relative, $PATH changes, and then the program
+ tries to do a fork? */
+
+static void __stdcall
+getprogname (char *argv0)
+{
+ char tmp[MAX_PATH];
+
+ if (user_data->hmodule != 0)
+ {
+ if (GetModuleFileName (user_data->hmodule, tmp, MAX_PATH) == 0)
+ find_exec (argv0, tmp);
+ }
+ else
+ find_exec (argv0, tmp);
+ strcpy (myself->progname, tmp);
+}
+
+/*
+ * Replaces -@file in the command line with the contents of the file.
+ * There may be multiple -@file's in a single command line
+ * A \-@file is replaced with -@file so that echo \-@foo would print
+ * -@foo and not the contents of foo.
+ */
+static int __stdcall
+insert_file (char *name, char *&cmd)
+{
+ HANDLE f;
+ DWORD size;
+
+ f = CreateFile (name + 1,
+ GENERIC_READ, /* open for reading */
+ FILE_SHARE_READ, /* share for reading */
+ &sec_none_nih, /* no security */
+ OPEN_EXISTING, /* existing file only */
+ FILE_ATTRIBUTE_NORMAL, /* normal file */
+ NULL); /* no attr. template */
+
+ if (f == INVALID_HANDLE_VALUE)
+ {
+ debug_printf ("couldn't open file '%s', %E", name);
+ return FALSE;
+ }
+
+ /* This only supports files up to about 4 billion bytes in
+ size. I am making the bold assumption that this is big
+ enough for this feature */
+ size = GetFileSize (f, NULL);
+ if (size == 0xFFFFFFFF)
+ {
+ debug_printf ("couldn't get file size for '%s', %E", name);
+ return FALSE;
+ }
+
+ int new_size = strlen (cmd) + size + 2;
+ char *tmp = (char *) malloc (new_size);
+ if (!tmp)
+ {
+ debug_printf ("malloc failed, %E");
+ return FALSE;
+ }
+
+ /* realloc passed as it should */
+ DWORD rf_read;
+ BOOL rf_result;
+ rf_result = ReadFile (f, tmp, size, &rf_read, NULL);
+ CloseHandle (f);
+ if (!rf_result || (rf_read != size))
+ {
+ debug_printf ("ReadFile failed, %E");
+ return FALSE;
+ }
+
+ tmp[size++] = ' ';
+ strcpy (tmp + size, cmd);
+ cmd = tmp;
+ return TRUE;
+}
+
+static inline int
+isquote (char c)
+{
+ char ch = c;
+ return ch == '"' || ch == '\'';
+}
+
+/* Step over a run of characters delimited by quotes */
+static __inline char *
+quoted (char *word, char *cmd, int winshell)
+{
+ char *p;
+ char quote = *cmd;
+
+ /* If this is being run from a Windows shell then we have
+ to preserve quotes for globify to play with later. */
+ if (winshell)
+ {
+ while (*++cmd)
+ if ((p = strchr (cmd, quote)) == NULL)
+ {
+ cmd = strchr (cmd, '\0'); // no closing quote
+ break;
+ }
+ else if (p[1] == quote)
+ {
+ *p++ = '\\';
+ cmd = p; // a quoted quote
+ }
+ else
+ {
+ cmd = p + 1; // point to after end
+ break;
+ }
+ return cmd;
+ }
+
+ /* When running as a child of a cygwin process, the quoted
+ characters should have been placed here by spawn_guts, so
+ we'll just pinch them out of the command string unless
+ they're quoted with a preceding \ */
+ strcpy (cmd, cmd + 1);
+ while (*cmd)
+ {
+ if (*cmd != quote)
+ cmd++;
+ else if (cmd[1] == quote)
+ strcpy (cmd++, cmd + 1);
+ else
+ {
+ strcpy (cmd, cmd + 1);
+ break;
+ }
+ }
+ return cmd;
+}
+
+/* Perform a glob on word if it contains wildcard characters.
+ Also quote every character between quotes to force glob to
+ treat the characters literally. */
+static int __stdcall
+globify (char *word, char **&argv, int &argc, int &argvlen)
+{
+ if (*word != '~' && strpbrk (word, "?*[\"\'(){}") == NULL)
+ return 0;
+
+ int n = 0;
+ char *p, *s;
+ int dos_spec = isalpha(*word) && word[1] == ':' ? 1 : 0;
+
+ /* We'll need more space if there are quoting characters in
+ word. If that is the case, doubling the size of the
+ string should provide more than enough space. */
+ if (strpbrk (word, "'\""))
+ n = strlen (word);
+ char pattern[strlen (word) + ((dos_spec + 1) * n) + 1];
+
+ /* Fill pattern with characters from word, quoting any
+ characters found within quotes. */
+ for (p = pattern, s = word; *s != '\000'; s++, p++)
+ if (!isquote (*s))
+ {
+ if (dos_spec && *s == '\\')
+ *p++ = '\\';
+ *p = *s;
+ }
+ else
+ {
+ char quote = *s;
+ while (*++s && *s != quote)
+ {
+ if (*s == '\\' && s[1] == quote)
+ s++;
+ *p++ = '\\';
+ *p++ = *s;
+ }
+ if (*s == quote)
+ p--;
+ if (*s == '\0')
+ break;
+ }
+
+ *p = '\0';
+
+ glob_t gl;
+ gl.gl_offs = 0;
+
+ /* Attempt to match the argument. Return just word (minus quoting) if no match. */
+ if (glob (pattern, GLOB_TILDE | GLOB_NOCHECK | GLOB_BRACE | GLOB_QUOTE, NULL, &gl) || !gl.gl_pathc)
+ return 0;
+
+ /* Allocate enough space in argv for the matched filenames. */
+ n = argc;
+ if ((argc += gl.gl_pathc) > argvlen)
+ {
+ argvlen = argc + 10;
+ argv = (char **) realloc (argv, (1 + argvlen) * sizeof (argv[0]));
+ }
+
+ /* Copy the matched filenames to argv. */
+ char **gv = gl.gl_pathv;
+ char **av = argv + n;
+ while (*gv)
+ {
+ debug_printf ("argv[%d] = '%s'\n", n++, *gv);
+ *av++ = *gv++;
+ }
+
+ /* Clean up after glob. */
+ free (gl.gl_pathv);
+ return 1;
+}
+
+/* Build argv, argc from string passed from Windows. */
+
+static void __stdcall
+build_argv (char *cmd, char **&argv, int &argc, int winshell)
+{
+ int argvlen = 0;
+ char *alloc_cmd = NULL; // command allocated by insert_file
+ int nesting = 0; // monitor "nesting" from insert_file
+
+ argc = 0;
+ argvlen = 0;
+ argv = NULL;
+
+ /* Scan command line until there is nothing left. */
+ while (*cmd)
+ {
+ /* Ignore spaces */
+ if (issep (*cmd))
+ {
+ cmd++;
+ continue;
+ }
+
+ /* Found the beginning of an argument. */
+ char *word = cmd;
+ char *sawquote = NULL;
+ while (*cmd)
+ {
+ if (*cmd != '"' && (!winshell || *cmd != '\''))
+ cmd++; // Skip over this character
+ else
+ /* Skip over characters until the closing quote */
+ {
+ sawquote = cmd;
+ cmd = quoted (word, cmd, winshell);
+ }
+ if (issep (*cmd)) // End of argument if space
+ break;
+ }
+ if (*cmd)
+ *cmd++ = '\0'; // Terminate `word'
+
+ /* Possibly look for @file construction assuming that this isn't
+ the very first argument and the @ wasn't quoted */
+ if (argc && sawquote != word && *word == '@')
+ {
+ if (++nesting > MAX_AT_FILE_LEVEL)
+ api_fatal ("Too many levels of nesting for %s", word);
+ if (insert_file (word, cmd))
+ {
+ if (alloc_cmd)
+ free (alloc_cmd); // Free space from previous insert_file
+ alloc_cmd = cmd; // and remember it for next time.
+ continue; // There's new stuff in cmd now
+ }
+ }
+
+ /* See if we need to allocate more space for argv */
+ if (argc >= argvlen)
+ {
+ argvlen = argc + 10;
+ argv = (char **) realloc (argv, (1 + argvlen) * sizeof (argv[0]));
+ }
+
+ /* Add word to argv file after (optional) wildcard expansion. */
+ if (!winshell || !argc || !globify (word, argv, argc, argvlen))
+ {
+ debug_printf ("argv[%d] = '%s'\n", argc, word);
+ argv[argc++] = word;
+ }
+ }
+
+ argv[argc] = NULL;
+ debug_printf ("argv[%d] = '%s'\n", argc, argv[argc]);
+}
+
+/* sanity and sync check */
+void __stdcall
+check_sanity_and_sync (per_process *p)
+{
+ /* Sanity check to make sure developers didn't change the per_process */
+ /* struct without updating SIZEOF_PER_PROCESS [it makes them think twice */
+ /* about changing it]. */
+ if (sizeof (per_process) != SIZEOF_PER_PROCESS)
+ {
+ api_fatal ("per_process sanity check failed");
+ }
+
+ /* Make sure that the app and the dll are in sync. */
+
+ /* Complain if older than last incompatible change */
+ if (p->dll_major < CYGWIN_VERSION_DLL_EPOCH)
+ api_fatal ("cygwin DLL and APP are out of sync -- DLL version mismatch %d < %d",
+ p->dll_major, CYGWIN_VERSION_DLL_EPOCH);
+
+ /* magic_biscuit != 0 if using the old style version numbering scheme. */
+ if (p->magic_biscuit != SIZEOF_PER_PROCESS)
+ api_fatal ("Incompatible cygwin .dll -- incompatible per_process info %d != %d",
+ p->magic_biscuit, SIZEOF_PER_PROCESS);
+
+ /* Complain if incompatible API changes made */
+ if (p->api_major != cygwin_version.api_major)
+ api_fatal ("cygwin DLL and APP are out of sync -- API version mismatch %d < %d",
+ p->api_major, cygwin_version.api_major);
+
+ if (CYGWIN_VERSION_DLL_MAKE_COMBINED (p->dll_major, p->dll_minor) <=
+ CYGWIN_VERSION_DLL_BAD_SIGNAL_MASK)
+ signal_shift_subtract = 0;
+}
+
+static NO_COPY STARTUPINFO si;
+# define ciresrv ((struct child_info_fork *)(si.lpReserved2))
+child_info_fork NO_COPY *child_proc_info = NULL;
+static MEMORY_BASIC_INFORMATION sm;
+
+#define EBP 6
+#define ESP 7
+
+extern void __inline__
+alloc_stack_hard_way (child_info_fork *ci, volatile char *b)
+{
+ void *new_stack_pointer;
+ MEMORY_BASIC_INFORMATION m;
+
+ if (!VirtualAlloc (ci->stacktop,
+ (DWORD) ci->stackbottom - (DWORD) ci->stacktop,
+ MEM_RESERVE, PAGE_NOACCESS))
+ api_fatal ("fork: can't reserve memory for stack %p - %p, %E",
+ ci->stacktop, ci->stackbottom);
+
+ new_stack_pointer = (void *) ((LPBYTE) ci->stackbottom - ci->stacksize);
+
+ if (!VirtualAlloc (new_stack_pointer, ci->stacksize, MEM_COMMIT,
+ PAGE_EXECUTE_READWRITE))
+ api_fatal ("fork: can't commit memory for stack %p(%d), %E",
+ new_stack_pointer, ci->stacksize);
+ if (!VirtualQuery ((LPCVOID) new_stack_pointer, &m, sizeof m))
+ api_fatal ("fork: couldn't get new stack info, %E");
+ m.BaseAddress = (LPVOID)((DWORD)m.BaseAddress - 1);
+ if (!VirtualAlloc ((LPVOID) m.BaseAddress, 1, MEM_COMMIT,
+ PAGE_EXECUTE_READWRITE|PAGE_GUARD))
+ api_fatal ("fork: couldn't allocate new stack guard page %p, %E",
+ m.BaseAddress);
+ if (!VirtualQuery ((LPCVOID) m.BaseAddress, &m, sizeof m))
+ api_fatal ("fork: couldn't get new stack info, %E");
+ ci->stacktop = m.BaseAddress;
+ *b = 0;
+}
+
+/* extend the stack prior to fork longjmp */
+
+extern void __inline__
+alloc_stack (child_info_fork *ci)
+{
+ /* FIXME: adding 16384 seems to avoid a stack copy problem during
+ fork on Win95, but I don't know exactly why yet. DJ */
+ volatile char b[ci->stacksize + 16384];
+
+ if (ci->type == PROC_FORK)
+ ci->stacksize = 0; // flag to fork not to do any funny business
+ else
+ {
+ if (!VirtualQuery ((LPCVOID) &b, &sm, sizeof sm))
+ api_fatal ("fork: couldn't get stack info, %E");
+
+ if (sm.AllocationBase != ci->stacktop)
+ alloc_stack_hard_way (ci, b + sizeof(b) - 1);
+ else
+ ci->stacksize = 0;
+ }
+
+ return;
+}
+
+/* These must be static due to the way we have to deal with forked
+ processes. */
+static NO_COPY LPBYTE info = NULL;
+static NO_COPY int mypid = 0;
+static int argc = 0;
+static char **argv = NULL;
+
+#ifdef _MT_SAFE
+ResourceLocks _reslock NO_COPY;
+MTinterface _mtinterf NO_COPY;
+#endif
+
+/* Take over from libc's crt0.o and start the application. Note the
+ various special cases when Cygwin DLL is being runtime loaded (as
+ opposed to being link-time loaded by Cygwin apps) from a non
+ cygwin app via LoadLibrary. */
+static void
+dll_crt0_1 ()
+{
+ /* According to onno@stack.urc.tue.nl, the exception handler record must
+ be on the stack. */
+ /* FIXME: Verify forked children get their exception handler set up ok. */
+ exception_list cygwin_except_entry;
+
+ do_global_ctors (&__CTOR_LIST__, 1);
+
+#ifdef DEBUGGING
+ if (child_proc_info)
+ switch (child_proc_info->type)
+ {
+ case PROC_FORK:
+ case PROC_FORK1:
+ ProtectHandle (child_proc_info->forker_finished);
+ case PROC_EXEC:
+ ProtectHandle (child_proc_info->subproc_ready);
+ }
+ ProtectHandle (hMainProc);
+ ProtectHandle (hMainThread);
+#endif
+
+ regthread ("main", GetCurrentThreadId ());
+
+ check_sanity_and_sync (user_data);
+
+ /* Nasty static stuff needed by newlib -- point to a local copy of
+ the reent stuff.
+ Note: this MUST be done here (before the forkee code) as the
+ fork copy code doesn't copy the data in libccrt0.cc (that's why we
+ pass in the per_process struct into the .dll from libccrt0). */
+
+ *(user_data->impure_ptr_ptr) = &reent_data;
+ _impure_ptr = &reent_data;
+
+#ifdef _MT_SAFE
+ user_data->resourcelocks = &_reslock;
+ user_data->resourcelocks->Init();
+
+ user_data->threadinterface = &_mtinterf;
+ user_data->threadinterface->Init0();
+#endif
+
+ /* Set the os_being_run global. */
+ set_os_type ();
+
+ /* If we didn't call SetFileApisToOEM, console I/O calls would use a
+ different codepage than other Win32 API calls. In some languages
+ (not English), this would result in "cat > filename" creating a file
+ by a different name than if CreateFile was used to create filename.
+ SetFileApisToOEM prevents this problem by making all calls use the
+ OEM codepage. */
+
+ SetFileApisToOEM ();
+
+ /* Initialize the host dependent constants object. */
+ host_dependent.init ();
+
+ /* Initialize the cygwin subsystem if this is the first process,
+ or attach to the shared data structure if it's already running. */
+ shared_init ();
+
+ if (mypid)
+ set_myself (cygwin_shared->p[mypid]);
+
+ (void) SetErrorMode (SEM_FAILCRITICALERRORS);
+
+ /* Initialize the heap. */
+ heap_init ();
+
+ /* Initialize events. */
+ events_init ();
+
+ threadname_init ();
+ debug_init ();
+
+ /* Initialize SIGSEGV handling, etc... Because the exception handler
+ references data in the shared area, this must be done after
+ shared_init. */
+ init_exceptions (&cygwin_except_entry);
+
+ if (user_data->forkee)
+ {
+ /* If we've played with the stack, stacksize != 0. That means that
+ fork() was invoked from other than the main thread. Make sure that
+ frame pointer is referencing the new stack so that the OS knows what
+ to do when it needs to increase the size of the stack.
+
+ NOTE: Don't do anything that involves the stack until you've completed
+ this step. */
+ if (ciresrv->stacksize)
+ {
+ asm ("movl %0,%%fs:4" : : "r" (ciresrv->stackbottom));
+ asm ("movl %0,%%fs:8" : : "r" (ciresrv->stacktop));
+ }
+
+ longjmp (ciresrv->jmp, ciresrv->cygpid);
+ }
+
+ /* Initialize our process table entry. Don't use the parent info for
+ dynamically loaded case. */
+ pinfo_init ((dynamically_loaded) ? NULL : info);
+
+ if (!old_title && GetConsoleTitle (title_buf, TITLESIZE))
+ old_title = title_buf;
+
+ /* Nasty static stuff needed by newlib - initialize it.
+ Note that impure_ptr has already been set up to point to this above
+ NB. This *MUST* be done here, just after the forkee code as some
+ of the calls below (eg. uinfo_init) do stdio calls - this area must
+ be set to zero before then. */
+
+#ifdef _MT_SAFE
+ user_data->threadinterface->ClearReent();
+ user_data->threadinterface->Init1();
+#else
+ memset (&reent_data, 0, sizeof (reent_data));
+ reent_data._errno = 0;
+ reent_data._stdin = reent_data.__sf + 0;
+ reent_data._stdout = reent_data.__sf + 1;
+ reent_data._stderr = reent_data.__sf + 2;
+#endif
+
+ char *line = GetCommandLineA ();
+ CharToOem (line, line);
+
+ line = strcpy ((char *) alloca (strlen (line) + 1), line);
+
+ /* Set new console title if appropriate. */
+
+ if (display_title && !dynamically_loaded)
+ {
+ char *cp = line;
+ if (strip_title_path)
+ for (char *ptr = cp; *ptr && *ptr != ' '; ptr++)
+ if (isdirsep (*ptr))
+ cp = ptr + 1;
+ set_console_title (cp);
+ }
+
+ /* Allocate dtable */
+ dtable_init ();
+
+ /* Initialize signal/subprocess handling. */
+ sigproc_init ();
+
+ /* Connect to tty. */
+ tty_init ();
+
+ /* Set up standard fds in file descriptor table. */
+ hinfo_init ();
+
+#if 0
+ /* Initialize uid, gid. */
+ uinfo_init ();
+#endif
+
+ syscall_printf ("Application CYGWIN version: %d.%d, api: %d.%d",
+ user_data->dll_major, user_data->dll_minor,
+ user_data->api_major, user_data->api_minor);
+ syscall_printf ("CYGWIN DLL version: %d.%d, api: %d.%d",
+ cygwin_version.dll_major, cygwin_version.dll_minor,
+ cygwin_version.api_major, cygwin_version.api_minor);
+
+ /* Scan the command line and build argv. Expand wildcards if not
+ called from another cygwin process. */
+ build_argv (line, argv, argc,
+ NOTSTATE (myself, PID_CYGPARENT) && allow_glob);
+
+ /* Convert argv[0] to posix rules if it's currently blatantly
+ win32 style. */
+ if ((strchr (argv[0], ':')) || (strchr (argv[0], '\\')))
+ {
+ char *new_argv0 = (char *) alloca (MAX_PATH);
+ cygwin_conv_to_posix_path (argv[0], new_argv0);
+ argv[0] = new_argv0;
+ }
+
+ getprogname (argv[0]);
+ /* Set up __progname for getopt error call. */
+ __progname = argv[0];
+
+ /* Call init of loaded dlls. */
+ DllList::the().initAll();
+
+ set_errno (0);
+ debug_printf ("user_data->main %p", user_data->main);
+
+ /* Flush signals and ensure that signal thread is up and running. Can't
+ do this for noncygwin case since the signal thread is blocked due to
+ LoadLibrary serialization. */
+ if (!dynamically_loaded)
+ sig_send (NULL, __SIGFLUSH);
+
+ /* Initialize uid, gid. */
+ uinfo_init ();
+
+ if (user_data->main && !dynamically_loaded)
+ exit (user_data->main (argc, argv, *user_data->envptr));
+}
+
+/* Wrap the real one, otherwise gdb gets confused about
+ two symbols with the same name, but different addresses.
+
+ UPTR is a pointer to global data that lives on the libc side of the
+ line [if one distinguishes the application from the dll]. */
+
+void
+dll_crt0 (per_process *uptr)
+{
+ char zeros[sizeof (ciresrv->zero)] = {0};
+ /* Set the local copy of the pointer into the user space. */
+ user_data = uptr;
+ user_data->heapbase = user_data->heapptr = user_data->heaptop = NULL;
+
+ set_console_handler ();
+ if (!DuplicateHandle (GetCurrentProcess (), GetCurrentProcess (),
+ GetCurrentProcess (), &hMainProc, 0, FALSE,
+ DUPLICATE_SAME_ACCESS))
+ hMainProc = GetCurrentProcess ();
+
+ DuplicateHandle (hMainProc, GetCurrentThread (), hMainProc,
+ &hMainThread, 0, FALSE, DUPLICATE_SAME_ACCESS);
+
+ GetStartupInfo (&si);
+ if (si.cbReserved2 >= EXEC_MAGIC_SIZE &&
+ memcmp (ciresrv->zero, zeros, sizeof (zeros)) == 0)
+ {
+ switch (ciresrv->type)
+ {
+ case PROC_EXEC:
+ case PROC_SPAWN:
+ case PROC_FORK:
+ case PROC_FORK1:
+ {
+ HANDLE me = hMainProc;
+ child_proc_info = ciresrv;
+ mypid = child_proc_info->cygpid;
+ cygwin_shared_h = child_proc_info->shared_h;
+ console_shared_h = child_proc_info->console_h;
+
+ /* We don't want subprocesses to inherit this */
+ if (!dynamically_loaded)
+ {
+ if (!DuplicateHandle (me, child_proc_info->parent_alive,
+ me, &parent_alive, 0, 0,
+ DUPLICATE_SAME_ACCESS
+ | DUPLICATE_CLOSE_SOURCE))
+ system_printf ("parent_alive DuplicateHandle failed, %E");
+ }
+ else if (parent_alive)
+ parent_alive = NULL;
+
+ switch (child_proc_info->type)
+ {
+ case PROC_EXEC:
+ case PROC_SPAWN:
+ info = si.lpReserved2 + ciresrv->cb;
+ break;
+ case PROC_FORK:
+ case PROC_FORK1:
+ user_data->forkee = child_proc_info->cygpid;
+ user_data->heaptop = child_proc_info->heaptop;
+ user_data->heapbase = child_proc_info->heapbase;
+ user_data->heapptr = child_proc_info->heapptr;
+ alloc_stack (ciresrv); // may never return
+ }
+ break;
+ }
+ default:
+ if ((ciresrv->type & PROC_MAGIC_MASK) == PROC_MAGIC_GENERIC)
+ api_fatal ("conflicting versions of cygwin1.dll detected. Use only the most recent version.\n");
+ }
+ }
+ dll_crt0_1 ();
+}
+
+extern "C" void
+__main (void)
+{
+ do_global_ctors (user_data->ctors, FALSE);
+}
+
+enum
+ {
+ ES_SIGNAL = 1,
+ ES_CLOSEALL = 2,
+ ES_SIGPROCTERMINATE = 3
+ };
+
+extern "C" void __stdcall
+do_exit (int status)
+{
+ BOOL cleanup_pinfo;
+ UINT n = (UINT) status;
+ static int NO_COPY exit_state = 0;
+
+ syscall_printf ("do_exit (%d)", n);
+
+ vfork_save *vf = vfork_storage.val ();
+ if (vf != NULL && vf->pid < 0)
+ {
+ vf->pid = status < 0 ? status : -status;
+ longjmp (vf->j, 1);
+ }
+
+ if (exit_state < ES_SIGNAL)
+ {
+ exit_state = ES_SIGNAL;
+ if (!(n & EXIT_REPARENTING))
+ {
+ signal (SIGCHLD, SIG_IGN);
+ signal (SIGHUP, SIG_IGN);
+ signal (SIGINT, SIG_IGN);
+ signal (SIGQUIT, SIG_IGN);
+ }
+ }
+
+ if ((hExeced && hExeced != INVALID_HANDLE_VALUE) || (n & EXIT_NOCLOSEALL))
+ n &= ~EXIT_NOCLOSEALL;
+ else if (exit_state < ES_CLOSEALL)
+ {
+ exit_state = ES_CLOSEALL;
+ close_all_files ();
+ }
+
+ if (exit_state < ES_SIGPROCTERMINATE)
+ {
+ exit_state = ES_SIGPROCTERMINATE;
+ sigproc_terminate ();
+ }
+
+ if (n & EXIT_REPARENTING)
+ {
+ n &= ~EXIT_REPARENTING;
+ cleanup_pinfo = FALSE;
+ }
+ else
+ {
+ myself->stopsig = 0;
+
+ /* restore console title */
+ if (old_title && display_title)
+ set_console_title (old_title);
+
+ /* Kill orphaned children on group leader exit */
+ if (myself->pid == myself->pgid)
+ {
+ sigproc_printf ("%d == pgrp %d, send SIG{HUP,CONT} to stopped children",
+ myself->pid, myself->pgid);
+ kill_pgrp (myself->pgid, -SIGHUP);
+ }
+
+ /* Kill the foreground process group on session leader exit */
+ if (getpgrp () > 0 && myself->pid == myself->sid && tty_attached (myself))
+ {
+ tty *tp = cygwin_shared->tty[myself->ctty];
+ sigproc_printf ("%d == sid %d, send SIGHUP to children",
+ myself->pid, myself->sid);
+
+ if (tp->getsid () == myself->sid)
+ kill (-tp->getpgid (), SIGHUP);
+ }
+ tty_terminate ();
+ cleanup_pinfo = TRUE;
+ }
+
+ window_terminate ();
+ fill_rusage (&myself->rusage_self, hMainProc);
+
+ events_terminate ();
+
+ if (hExeced && hExeced != INVALID_HANDLE_VALUE)
+ {
+ debug_printf ("Killing(%d) non-cygwin process, handle %p", n, hExeced);
+ TerminateProcess (hExeced, n);
+ ForceCloseHandle1 (hExeced, childhProc);
+ }
+
+ if (cleanup_pinfo)
+ myself->record_death (); // Locks pinfo mutex
+ else
+ sigproc_printf ("not cleanup_pinfo");
+
+ shared_terminate ();
+
+ sigproc_printf ("calling ExitProcess %d", n);
+ minimal_printf ("winpid %d, exit %d", GetCurrentProcessId (), n);
+ ExitProcess (n);
+}
+
+extern "C" void
+_exit (int n)
+{
+ do_exit ((DWORD) n & 0xffff);
+}
+
+extern "C" void
+__api_fatal (const char *fmt, ...)
+{
+ char buf[4096];
+ va_list ap;
+
+ va_start (ap, fmt);
+ __small_vsprintf (buf, fmt, ap);
+ va_end (ap);
+ small_printf ("%s\n", buf);
+
+ /* We are going down without mercy. Make sure we reset
+ our process_state. */
+ if (user_data != NULL)
+ {
+ sigproc_terminate ();
+ myself->record_death (FALSE);
+ }
+#ifdef DEBUGGING
+ (void) try_to_debug ();
+#endif
+ ExitProcess (1);
+}
+
+extern "C" {
+static void noload (char *s) __asm__ ("noload");
+static void __attribute__((unused))
+noload (char *s)
+{
+ api_fatal ("couldn't dynamically determine load address for '%s', %E", s);
+}
+
+__asm__ ("
+.globl cygwin_dll_func_load
+cygwin_dll_func_load:
+ movl (%esp),%eax # 'Return address' contains load info
+ addl $8,%eax # Address of name of function to load
+ pushl %eax # Second argument
+ movl -4(%eax),%eax # Address of Handle to DLL
+ pushl (%eax) # Handle to DLL
+ call _GetProcAddress@8# Load it
+ test %eax,%eax # Success?
+ jne gotit # Yes
+ popl %eax # No. Get back
+ addl $8,%eax # pointer to name
+ pushl %eax # and
+ call noload # issue an error
+gotit:
+ popl %ecx # Pointer to 'return address'
+ movb $0xe0,-1(%ecx) # Turn preceding call to a jmp *%eax
+ movl %eax,(%ecx) # Point dispatch to address loaded above
+ jmp *%eax
+");
+}
+
+LoadDLLinitfunc (user32)
+{
+ HANDLE h;
+
+ if ((h = LoadLibrary ("user32.dll")) != NULL)
+ user32_handle = h;
+ else if (!user32_handle)
+ api_fatal ("could not load user32.dll, %E");
+
+ return 0; /* Already done by another thread? */
+}
+
+LoadDLLinit (user32)
+LoadDLLfunc (CharToOemA, CharToOemA@8, user32)
+LoadDLLfunc (CreateWindowExA, CreateWindowExA@48, user32)
+LoadDLLfunc (DefWindowProcA, DefWindowProcA@16, user32)
+LoadDLLfunc (DispatchMessageA, DispatchMessageA@4, user32)
+LoadDLLfunc (FindWindowA, FindWindowA@8, user32)
+LoadDLLfunc (GetMessageA, GetMessageA@16, user32)
+LoadDLLfunc (GetProcessWindowStation, GetProcessWindowStation@0, user32)
+LoadDLLfunc (GetThreadDesktop, GetThreadDesktop@4, user32)
+LoadDLLfunc (GetUserObjectInformationA, GetUserObjectInformationA@20, user32)
+LoadDLLfunc (KillTimer, KillTimer@8, user32)
+LoadDLLfunc (MessageBoxA, MessageBoxA@16, user32)
+LoadDLLfunc (MsgWaitForMultipleObjects, MsgWaitForMultipleObjects@20, user32)
+LoadDLLfunc (OemToCharW, OemToCharW@8, user32)
+LoadDLLfunc (PeekMessageA, PeekMessageA@20, user32)
+LoadDLLfunc (PostMessageA, PostMessageA@16, user32)
+LoadDLLfunc (PostQuitMessage, PostQuitMessage@4, user32)
+LoadDLLfunc (RegisterClassA, RegisterClassA@4, user32)
+LoadDLLfunc (SendMessageA, SendMessageA@16, user32)
+LoadDLLfunc (SetTimer, SetTimer@16, user32)
+LoadDLLfunc (SetUserObjectSecurity, SetUserObjectSecurity@12, user32)
diff --git a/winsup/cygwin/debug.cc b/winsup/cygwin/debug.cc
new file mode 100644
index 000000000..cbf3179be
--- /dev/null
+++ b/winsup/cygwin/debug.cc
@@ -0,0 +1,326 @@
+/* debug.cc
+
+ Copyright 1998, 1999, 2000 Cygnus Solutions.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#define NO_DEBUG_DEFINES
+#include "winsup.h"
+#include "exceptions.h"
+
+static muto NO_COPY *threadname_lock = NULL;
+#define lock_threadname() \
+ do {if (threadname_lock) threadname_lock->acquire (INFINITE); } while (0)
+
+#define unlock_threadname() \
+ do {if (threadname_lock) threadname_lock->release (); } while (0)
+
+typedef struct
+ {
+ DWORD id;
+ const char *name;
+ } thread_info;
+
+static NO_COPY thread_info threads[32] = {{0}}; // increase as necessary
+#define NTHREADS (sizeof(threads) / sizeof(threads[0]))
+
+void
+threadname_init ()
+{
+ threadname_lock = new_muto (FALSE, NULL);
+}
+
+void __stdcall
+regthread (const char *name, DWORD tid)
+{
+ lock_threadname ();
+ for (DWORD i = 0; i < NTHREADS; i++)
+ if (threads[i].name == NULL || strcmp (threads[i].name, name) == 0 ||
+ threads[i].id == tid)
+ {
+ threads[i].name = name;
+ threads[i].id = tid;
+ break;
+ }
+ unlock_threadname ();
+}
+
+struct thread_start
+ {
+ LONG notavail;
+ LPTHREAD_START_ROUTINE func;
+ VOID *arg;
+ };
+
+/* A place to store arguments to thread_stub since they can't be
+ stored on the stack. An available element is !notavail. */
+thread_start NO_COPY start_buf[NTHREADS] = {{0, NULL,NULL}};
+
+/* Initial stub called by makethread. Performs initial per-thread
+ initialization. */
+static DWORD WINAPI
+thread_stub (VOID *arg)
+{
+ LPTHREAD_START_ROUTINE threadfunc = ((thread_start *) arg)->func;
+ VOID *threadarg = ((thread_start *) arg)->arg;
+
+ exception_list except_entry;
+
+ /* Give up our slot in the start_buf array */
+ InterlockedExchange (&((thread_start *) arg)->notavail, 0);
+
+#ifdef _MT_SAFE
+ /* marco@ddi.nl: Needed for the reent's of this local dll thread
+ I assume that the local threads are using the reent structure of
+ the main thread
+ */
+ if ( !TlsSetValue(user_data->threadinterface->reent_index,
+ &user_data->threadinterface->reents) )
+ api_fatal(" Sig proc MT init failed\n");
+#endif
+
+ /* Initialize this threads ability to respond to things like
+ SIGSEGV or SIGFPE. */
+ init_exceptions (&except_entry);
+
+ return threadfunc (threadarg);
+}
+
+/* Wrapper for CreateThread. Registers the thread name/id and ensures that
+ cygwin threads are properly initialized. */
+HANDLE __stdcall
+makethread (LPTHREAD_START_ROUTINE start, LPVOID param, DWORD flags,
+ const char *name)
+{
+ DWORD tid;
+ HANDLE h;
+ SECURITY_ATTRIBUTES *sa;
+ thread_start *info; /* Various information needed by the newly created thread */
+
+ for (;;)
+ {
+ /* Search the start_buf array for an empty slot to use */
+ for (info = start_buf; info < start_buf + NTHREADS; info++)
+ if (!InterlockedExchange (&info->notavail, 1))
+ goto out;
+
+ /* Should never hit here, but be defensive anyway. */
+ Sleep (0);
+ }
+
+out:
+ info->func = start; /* Real function to start */
+ info->arg = param; /* The single parameter to the thread */
+
+ if (*name != '+')
+ sa = &sec_none_nih; /* The handle should not be inherited by subprocesses. */
+ else
+ {
+ name++;
+ sa = &sec_none; /* The handle should be inherited by subprocesses. */
+ }
+
+ if ((h = CreateThread (sa, 0, thread_stub, (VOID *) info, flags, &tid)))
+ regthread (name, tid); /* Register this name/thread id for debugging output. */
+
+ return h;
+}
+
+/* Return the symbolic name of the current thread for debugging.
+ */
+const char * __stdcall
+threadname (DWORD tid, int lockit)
+{
+ const char *res = NULL;
+ if (!tid)
+ tid = GetCurrentThreadId ();
+
+ if (lockit)
+ lock_threadname ();
+ for (DWORD i = 0; i < NTHREADS && threads[i].name != NULL; i++)
+ if (threads[i].id == tid)
+ {
+ res = threads[i].name;
+ break;
+ }
+ if (lockit)
+ unlock_threadname ();
+
+ if (!res)
+ {
+ static char buf[30] NO_COPY = {0};
+ __small_sprintf (buf, "unknown (%p)", tid);
+ res = buf;
+ }
+
+ return res;
+}
+
+#ifdef DEBUGGING
+/* Here lies extra debugging routines which help track down internal
+ Cygwin problems when compiled with -DDEBUGGING . */
+#include <stdlib.h>
+
+typedef struct _h
+ {
+ BOOL allocated;
+ HANDLE h;
+ const char *name;
+ const char *func;
+ int ln;
+ struct _h *next;
+ } handle_list;
+
+static NO_COPY handle_list starth = {0};
+static NO_COPY handle_list *endh = NULL;
+
+static handle_list NO_COPY freeh[1000] = {{0}};
+#define NFREEH (sizeof (freeh) / sizeof (freeh[0]))
+
+static muto NO_COPY *debug_lock = NULL;
+
+#define lock_debug() \
+ do {if (debug_lock) debug_lock->acquire (INFINITE); } while (0)
+
+#define unlock_debug() \
+ do {if (debug_lock) debug_lock->release (); } while (0)
+
+void
+debug_init ()
+{
+ debug_lock = new_muto (FALSE, NULL);
+}
+
+/* Find a registered handle in the linked list of handles. */
+static handle_list * __stdcall
+find_handle (HANDLE h)
+{
+ handle_list *hl;
+ for (hl = &starth; hl->next != NULL; hl = hl->next)
+ if (hl->next->h == h)
+ goto out;
+ endh = hl;
+ hl = NULL;
+
+out:
+ return hl;
+}
+
+/* Create a new handle record */
+static handle_list * __stdcall
+newh ()
+{
+ handle_list *hl;
+ lock_debug ();
+ for (hl = freeh; hl < freeh + NFREEH; hl++)
+ if (hl->name == NULL)
+ goto out;
+
+ /* All used up??? */
+ if ((hl = (handle_list *)malloc (sizeof *hl)) != NULL)
+ {
+ memset (hl, 0, sizeof (*hl));
+ hl->allocated = TRUE;
+ }
+
+out:
+ unlock_debug ();
+ return hl;
+}
+
+/* Add a handle to the linked list of known handles. */
+void __stdcall
+add_handle (const char *func, int ln, HANDLE h, const char *name)
+{
+ handle_list *hl;
+ lock_debug ();
+
+ if (find_handle (h))
+ goto out; /* Already did this once */
+
+ if ((hl = newh()) == NULL)
+ {
+ unlock_debug ();
+ system_printf ("couldn't allocate memory for %s(%d): %s(%p)",
+ func, ln, name, h);
+ return;
+ }
+ hl->h = h;
+ hl->name = name;
+ hl->func = func;
+ hl->ln = ln;
+ hl->next = NULL;
+ endh->next = hl;
+ endh = hl;
+
+out:
+ unlock_debug ();
+}
+
+/* Close a known handle. Complain if !force and closing a known handle or
+ if the name of the handle being closed does not match the registered name. */
+BOOL __stdcall
+close_handle (const char *func, int ln, HANDLE h, const char *name, BOOL force)
+{
+ BOOL ret;
+ handle_list *hl;
+ lock_debug ();
+
+ if ((hl = find_handle (h)) && !force)
+ {
+ hl = hl->next;
+ unlock_debug (); // race here
+ system_printf ("attempt to close protected handle %s:%d(%s<%p>)",
+ hl->func, hl->ln, hl->name, hl->h);
+ system_printf (" by %s:%d(%s<%p>)", func, ln, name, h);
+ return FALSE;
+ }
+
+ handle_list *hln;
+ if (hl && (hln = hl->next) && strcmp (name, hln->name))
+ {
+ system_printf ("closing protected handle %s:%d(%s<%p>)",
+ hln->func, hln->ln, hln->name, hln->h);
+ system_printf (" by %s:%d(%s<%p>)", func, ln, name, h);
+ }
+ ret = CloseHandle (h);
+ if (hl)
+ {
+ handle_list *hnuke = hl->next;
+ hl->next = hl->next->next;
+ if (hnuke->allocated)
+ free (hnuke);
+ else
+ memset (hnuke, 0, sizeof (*hnuke));
+ }
+
+ unlock_debug ();
+ return ret;
+}
+#endif /*DEBUGGING*/
+
+extern "C" {
+/* Provide a stack frame when calling WaitFor* functions */
+
+#undef WaitForSingleObject
+
+DWORD __stdcall
+WFSO (HANDLE hHandle, DWORD dwMilliseconds)
+{
+ DWORD ret;
+ ret = WaitForSingleObject (hHandle, dwMilliseconds);
+ return ret;
+}
+
+#undef WaitForMultipleObjects
+
+DWORD __stdcall
+WFMO (DWORD nCount, CONST HANDLE *lpHandles, BOOL fWaitAll, DWORD dwMilliseconds)
+{
+ DWORD ret;
+ ret = WaitForMultipleObjects (nCount, lpHandles, fWaitAll, dwMilliseconds);
+ return ret;
+}
+}
diff --git a/winsup/cygwin/debug.h b/winsup/cygwin/debug.h
new file mode 100644
index 000000000..c8e28ba64
--- /dev/null
+++ b/winsup/cygwin/debug.h
@@ -0,0 +1,69 @@
+/* debug.h
+
+ Copyright 1998, 1999, 2000 Cygnus Solutions.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#ifndef MALLOC_DEBUG
+#define MALLOC_CHECK do {} while (0)
+#else
+#define MALLOC_CHECK ({\
+ debug_printf ("checking malloc pool");\
+ (void)mallinfo ();\
+})
+#endif
+
+extern "C" {
+DWORD __stdcall WFSO (HANDLE, DWORD);
+DWORD __stdcall WFMO (DWORD, CONST HANDLE *, BOOL, DWORD);
+}
+
+#define WaitForSingleObject WFSO
+#define WaitForMultipleObject WFMO
+
+#if !defined(_DEBUG_H_)
+#define _DEBUG_H_
+
+void threadname_init ();
+HANDLE __stdcall makethread (LPTHREAD_START_ROUTINE, LPVOID, DWORD, const char *);
+const char * __stdcall threadname (DWORD, int lockit = TRUE);
+void __stdcall regthread (const char *, DWORD);
+
+#ifndef DEBUGGING
+# define ForceCloseHandle CloseHandle
+# define ForceCloseHandle1(h, n) CloseHandle (h)
+# define ForceCloseHandle2(h, n) CloseHandle (h)
+# define ProtectHandle(h) do {} while (0)
+# define ProtectHandle1(h,n) do {} while (0)
+# define ProtectHandle2(h,n) do {} while (0)
+# define debug_init() do {} while (0)
+
+#else
+
+# ifdef NO_DEBUG_DEFINES
+# undef NO_DEBUG_DEFINES
+# else
+# define CloseHandle(h) \
+ close_handle (__PRETTY_FUNCTION__, __LINE__, (h), #h, FALSE)
+# define ForceCloseHandle(h) \
+ close_handle (__PRETTY_FUNCTION__, __LINE__, (h), #h, TRUE)
+# define ForceCloseHandle1(h,n) \
+ close_handle (__PRETTY_FUNCTION__, __LINE__, (h), #n, TRUE)
+# define ForceCloseHandle2(h,n) \
+ close_handle (__PRETTY_FUNCTION__, __LINE__, (h), n, TRUE)
+# define lock_pinfo_for_update(n) lpfu(__PRETTY_FUNCTION__, __LINE__, n)
+# endif
+
+# define ProtectHandle(h) add_handle (__PRETTY_FUNCTION__, __LINE__, (h), #h)
+# define ProtectHandle1(h,n) add_handle (__PRETTY_FUNCTION__, __LINE__, (h), #n)
+# define ProtectHandle2(h,n) add_handle (__PRETTY_FUNCTION__, __LINE__, (h), n)
+
+void debug_init ();
+void __stdcall add_handle (const char *, int, HANDLE, const char *);
+BOOL __stdcall close_handle (const char *, int, HANDLE, const char *, BOOL);
+int __stdcall lpfu (const char *, int, DWORD timeout);
+
+#endif /*DEBUGGING*/
+#endif /*_DEBUG_H_*/
diff --git a/winsup/cygwin/delqueue.cc b/winsup/cygwin/delqueue.cc
new file mode 100644
index 000000000..81d2bd68b
--- /dev/null
+++ b/winsup/cygwin/delqueue.cc
@@ -0,0 +1,99 @@
+/* delqueue.cc
+
+ Copyright 1996, 1998 Cygnus Solutions.
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#include "winsup.h"
+
+/* FIXME: this delqueue module is very flawed and should be rewritten.
+ First, having an array of a fixed size for keeping track of the
+ unlinked but not yet deleted files is bad. Second, some programs
+ will unlink files and then create a new one in the same location
+ and this behavior is not supported in the current code. Probably
+ we should find a move/rename function that will work on open files,
+ and move delqueue files to some special location or some such
+ hack... */
+
+void
+delqueue_list::init ()
+{
+ empty = 1;
+ memset(inuse, 0, MAX_DELQUEUES_PENDING);
+}
+
+void
+delqueue_list::queue_file (const char *dosname)
+{
+ char temp[MAX_PATH], *end;
+ GetFullPathName (dosname, sizeof (temp), temp, &end);
+
+ /* Note about race conditions: The only time we get to this point is
+ when a delete fails because someone's holding the descriptor open.
+ In those cases, other programs will be unable to delete the file
+ also, so any entries referring to that file will not be removed
+ from the queue while we're here. */
+
+ if (!empty)
+ {
+ /* check for duplicates */
+ for (int i=0; i < MAX_DELQUEUES_PENDING; i++)
+ if (inuse[i] && strcmp(name[i], temp) == 0)
+ return;
+ }
+
+ for (int i = 0; i < MAX_DELQUEUES_PENDING; i++)
+ if (!inuse[i])
+ {
+ /* set the name first, in case someone else is running the
+ queue they'll get a valid name */
+ strcpy(name[i], temp);
+ inuse[i] = 1;
+ empty = 0;
+ return;
+ }
+
+ system_printf ("Out of queue slots");
+}
+
+void
+delqueue_list::process_queue ()
+{
+ if (empty)
+ return;
+ /* We set empty to 1 here, rather than later, to avoid a race
+ condition - some other program might queue up a file while we're
+ processing, and it will zero out empty also. */
+ empty = 1; /* but might get set to zero again, below */
+
+ syscall_printf ("Running delqueue");
+
+ for (int i = 0; i < MAX_DELQUEUES_PENDING; i++)
+ if (inuse[i])
+ {
+ if (DeleteFileA (name[i]))
+ {
+ syscall_printf ("Deleted %s", name[i]);
+ inuse[i] = 0;
+ }
+ else
+ {
+ int res = GetLastError ();
+ empty = 0;
+ if (res == ERROR_SHARING_VIOLATION)
+ {
+ /* File still inuse, that's ok */
+ syscall_printf ("Still using %s", name[i]);
+ }
+ else
+ {
+ syscall_printf ("Hmm, don't know what to do with '%s', %E", name[i]);
+ inuse[i] = 0;
+ }
+ }
+ }
+}
diff --git a/winsup/cygwin/dir.cc b/winsup/cygwin/dir.cc
new file mode 100644
index 000000000..48187a20c
--- /dev/null
+++ b/winsup/cygwin/dir.cc
@@ -0,0 +1,340 @@
+/* dir.cc: Posix directory-related routines
+
+ Copyright 1996, 1997, 1998, 1999, 2000 Cygnus Solutions.
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#include <unistd.h>
+#include <stdlib.h>
+#include <sys/stat.h>
+#include <errno.h>
+#include "winsup.h"
+
+#define _COMPILING_NEWLIB
+#include "dirent.h"
+
+/* Cygwin internal */
+/* Return whether the directory of a file is writable. Return 1 if it
+ is. Otherwise, return 0, and set errno appropriately. */
+int __stdcall
+writable_directory (const char *file)
+{
+ char dir[strlen (file) + 1];
+
+ strcpy (dir, file);
+
+ const char *usedir;
+ char *slash = strrchr (dir, '\\');
+ if (slash == NULL)
+ usedir = ".";
+ else
+ {
+ *slash = '\0';
+ usedir = dir;
+ }
+
+ int acc = access (usedir, W_OK);
+
+ return acc == 0;
+}
+
+/* opendir: POSIX 5.1.2.1 */
+extern "C" DIR *
+opendir (const char *dirname)
+{
+ int len;
+ DIR *dir;
+ DIR *res = 0;
+ struct stat statbuf;
+
+ path_conv real_dirname (dirname, SYMLINK_FOLLOW, 1);
+
+ if (real_dirname.error)
+ {
+ set_errno (real_dirname.error);
+ goto failed;
+ }
+
+ if (stat (real_dirname.get_win32 (), &statbuf) == -1)
+ goto failed;
+
+ if (!(statbuf.st_mode & S_IFDIR))
+ {
+ set_errno (ENOTDIR);
+ goto failed;
+ }
+
+ len = strlen (real_dirname.get_win32 ());
+ if (len > MAX_PATH - 3)
+ {
+ set_errno (ENAMETOOLONG);
+ goto failed;
+ }
+
+ if ((dir = (DIR *) malloc (sizeof (DIR))) == NULL)
+ {
+ set_errno (ENOMEM);
+ goto failed;
+ }
+ if ((dir->__d_dirname = (char *) malloc (len + 3)) == NULL)
+ {
+ free (dir);
+ set_errno (ENOMEM);
+ goto failed;
+ }
+ if ((dir->__d_dirent =
+ (struct dirent *) malloc (sizeof (struct dirent))) == NULL)
+ {
+ free (dir->__d_dirname);
+ free (dir);
+ set_errno (ENOMEM);
+ goto failed;
+ }
+ strcpy (dir->__d_dirname, real_dirname.get_win32 ());
+ /* FindFirstFile doesn't seem to like duplicate /'s. */
+ len = strlen (dir->__d_dirname);
+ if (len == 0 || SLASH_P (dir->__d_dirname[len - 1]))
+ strcat (dir->__d_dirname, "*");
+ else
+ strcat (dir->__d_dirname, "\\*"); /**/
+ dir->__d_cookie = __DIRENT_COOKIE;
+ dir->__d_u.__d_data.__handle = INVALID_HANDLE_VALUE;
+ dir->__d_position = 0;
+ dir->__d_dirhash = statbuf.st_ino;
+
+ res = dir;
+
+failed:
+ syscall_printf ("%p = opendir (%s)", res, dirname);
+ return res;
+}
+
+/* readdir: POSIX 5.1.2.1 */
+extern "C" struct dirent *
+readdir (DIR * dir)
+{
+ WIN32_FIND_DATA buf;
+ HANDLE handle;
+ struct dirent *res = 0;
+ int prior_errno;
+
+ if (dir->__d_cookie != __DIRENT_COOKIE)
+ {
+ set_errno (EBADF);
+ syscall_printf ("%p = readdir (%p)", res, dir);
+ return res;
+ }
+
+ if (dir->__d_u.__d_data.__handle != INVALID_HANDLE_VALUE)
+ {
+ if (FindNextFileA (dir->__d_u.__d_data.__handle, &buf) == 0)
+ {
+ prior_errno = get_errno();
+ (void) FindClose (dir->__d_u.__d_data.__handle);
+ dir->__d_u.__d_data.__handle = INVALID_HANDLE_VALUE;
+ __seterrno ();
+ /* POSIX says you shouldn't set errno when readdir can't
+ find any more files; if another error we leave it set. */
+ if (get_errno () == ENMFILE)
+ set_errno (prior_errno);
+ syscall_printf ("%p = readdir (%p)", res, dir);
+ return res;
+ }
+ }
+ else
+ {
+ handle = FindFirstFileA (dir->__d_dirname, &buf);
+
+ if (handle == INVALID_HANDLE_VALUE)
+ {
+ /* It's possible that someone else deleted or emptied the directory
+ or some such between the opendir () call and here. */
+ prior_errno = get_errno ();
+ __seterrno ();
+ /* POSIX says you shouldn't set errno when readdir can't
+ find any more files; if another error we leave it set. */
+ if (get_errno () == ENMFILE)
+ set_errno (prior_errno);
+ syscall_printf ("%p = readdir (%p)", res, dir);
+ return res;
+ }
+ dir->__d_u.__d_data.__handle = handle;
+ }
+
+ /* We get here if `buf' contains valid data. */
+ strcpy (dir->__d_dirent->d_name, buf.cFileName);
+
+ /* Compute d_ino by combining filename hash with the directory hash
+ (which was stored in dir->__d_dirhash when opendir was called). */
+ if (buf.cFileName[0] == '.')
+ {
+ if (buf.cFileName[1] == '\0')
+ dir->__d_dirent->d_ino = dir->__d_dirhash;
+ else if (buf.cFileName[1] != '.' || buf.cFileName[2] != '\0')
+ goto hashit;
+ else
+ {
+ char *p, up[strlen (dir->__d_dirname) + 1];
+ strcpy (up, dir->__d_dirname);
+ if (!(p = strrchr (up, '\\')))
+ goto hashit;
+ *p = '\0';
+ if (!(p = strrchr (up, '\\')))
+ dir->__d_dirent->d_ino = hash_path_name (0, ".");
+ else
+ {
+ *p = '\0';
+ dir->__d_dirent->d_ino = hash_path_name (0, up);
+ }
+ }
+ }
+ else
+ {
+ hashit:
+ ino_t dino = hash_path_name (dir->__d_dirhash, "\\");
+ dir->__d_dirent->d_ino = hash_path_name (dino, buf.cFileName);
+ }
+
+ ++dir->__d_position;
+ res = dir->__d_dirent;
+ syscall_printf ("%p = readdir (%p) (%s)",
+ &dir->__d_dirent, dir, buf.cFileName);
+ return res;
+}
+
+/* telldir */
+extern "C" off_t
+telldir (DIR * dir)
+{
+ if (dir->__d_cookie != __DIRENT_COOKIE)
+ return 0;
+ return dir->__d_position;
+}
+
+/* seekdir */
+extern "C" void
+seekdir (DIR * dir, off_t loc)
+{
+ if (dir->__d_cookie != __DIRENT_COOKIE)
+ return;
+ rewinddir (dir);
+ while (loc > dir->__d_position)
+ if (! readdir (dir))
+ break;
+}
+
+/* rewinddir: POSIX 5.1.2.1 */
+extern "C" void
+rewinddir (DIR * dir)
+{
+ syscall_printf ("rewinddir (%p)", dir);
+
+ if (dir->__d_cookie != __DIRENT_COOKIE)
+ return;
+ if (dir->__d_u.__d_data.__handle != INVALID_HANDLE_VALUE)
+ {
+ (void) FindClose (dir->__d_u.__d_data.__handle);
+ dir->__d_u.__d_data.__handle = INVALID_HANDLE_VALUE;
+ dir->__d_position = 0;
+ }
+}
+
+/* closedir: POSIX 5.1.2.1 */
+extern "C" int
+closedir (DIR * dir)
+{
+ if (dir->__d_cookie != __DIRENT_COOKIE)
+ {
+ set_errno (EBADF);
+ syscall_printf ("-1 = closedir (%p)", dir);
+ return -1;
+ }
+
+ if (dir->__d_u.__d_data.__handle != INVALID_HANDLE_VALUE &&
+ FindClose (dir->__d_u.__d_data.__handle) == 0)
+ {
+ __seterrno ();
+ syscall_printf ("-1 = closedir (%p)", dir);
+ return -1;
+ }
+
+ /* Reset the marker in case the caller tries to use `dir' again. */
+ dir->__d_cookie = 0;
+
+ free (dir->__d_dirname);
+ free (dir->__d_dirent);
+ free (dir);
+ syscall_printf ("0 = closedir (%p)", dir);
+ return 0;
+}
+
+/* mkdir: POSIX 5.4.1.1 */
+extern "C" int
+mkdir (const char *dir, mode_t mode)
+{
+ int res = -1;
+
+ path_conv real_dir (dir, SYMLINK_NOFOLLOW);
+
+ if (real_dir.error)
+ {
+ set_errno (real_dir.error);
+ goto done;
+ }
+
+ nofinalslash(real_dir.get_win32 (), real_dir.get_win32 ());
+ if (! writable_directory (real_dir.get_win32 ()))
+ goto done;
+
+ if (CreateDirectoryA (real_dir.get_win32 (), 0))
+ {
+ set_file_attribute (real_dir.has_acls (), real_dir.get_win32 (),
+ (mode & 0777) & ~myself->umask);
+ res = 0;
+ }
+ else
+ __seterrno ();
+
+done:
+ syscall_printf ("%d = mkdir (%s, %d)", res, dir, mode);
+ return res;
+}
+
+/* rmdir: POSIX 5.5.2.1 */
+extern "C" int
+rmdir (const char *dir)
+{
+ int res = -1;
+
+ path_conv real_dir (dir, SYMLINK_NOFOLLOW);
+
+ if (real_dir.error)
+ {
+ set_errno (real_dir.error);
+ goto done;
+ }
+
+ if (RemoveDirectoryA (real_dir.get_win32 ()))
+ res = 0;
+ else if (os_being_run != winNT && GetLastError() == ERROR_ACCESS_DENIED)
+ {
+ /* Under Windows 95 & 98, ERROR_ACCESS_DENIED is returned
+ if you try to remove a file or a non-empty directory. */
+ if (GetFileAttributes (real_dir.get_win32()) != FILE_ATTRIBUTE_DIRECTORY)
+ set_errno (ENOTDIR);
+ else
+ set_errno (ENOTEMPTY);
+ }
+ else if (GetLastError () == ERROR_DIRECTORY)
+ set_errno (ENOTDIR);
+ else
+ __seterrno ();
+
+done:
+ syscall_printf ("%d = rmdir (%s)", res, dir);
+ return res;
+}
diff --git a/winsup/cygwin/dlfcn.cc b/winsup/cygwin/dlfcn.cc
new file mode 100644
index 000000000..21c6e5bd0
--- /dev/null
+++ b/winsup/cygwin/dlfcn.cc
@@ -0,0 +1,236 @@
+/* dlfcn.cc
+
+ Copyright 1998, 2000 Cygnus Solutions
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include "winsup.h"
+#include <ctype.h>
+#include "dlfcn.h"
+#include "dll_init.h"
+
+#ifdef _MT_SAFE
+#define _dl_error _reent_winsup()->_dl_error
+#define _dl_buffer _reent_winsup()->_dl_buffer
+#else
+static int _dl_error = 0;
+static char _dl_buffer[256];
+#endif
+
+static void __stdcall
+set_dl_error (const char *str)
+{
+ __small_sprintf (_dl_buffer, "%s: %E", str);
+ _dl_error = 1;
+}
+
+//
+// this function checks for existence of a file specified by the
+// directory and name components. If successful, return a pointer
+// the full pathname (static buffer), or else return 0.
+//
+static const char * __stdcall
+check_access (const char *dir, const char *name)
+{
+ static char buf[MAX_PATH];
+ const char *ret = 0;
+
+ buf[0] = 0;
+ strcpy (buf, dir);
+ strcat (buf, "\\");
+ strcat (buf, name);
+
+ if (!access (buf, F_OK))
+ ret = buf;
+ return ret;
+}
+
+//
+// this function looks for an executable file given the name and the
+// environment variable to use for searching (eg., PATH); returns
+// the full pathname (static buffer) if found or NULL if not.
+//
+static const char * __stdcall
+check_path_access (const char *mywinenv, const char *name)
+{
+ static char buf[MAX_PATH];
+ return find_exec (name, buf, mywinenv, TRUE);
+}
+
+//
+// This function simulates the same search as LoadLibary + check
+// environment variable LD_LIBRARY_PATH. If found, return the full
+// pathname (static buffer); if illegal, return the input string
+// unchanged and let the caller deal with it; return NULL otherwise.
+//
+// Note that this should never be called with a NULL string, since
+// that is the introspective case, and the caller should not call
+// this function at all.
+//
+static const char * __stdcall
+get_full_path_of_dll (const char* str)
+{
+ int len = (str) ? strlen (str) : 0;
+
+ // NULL or empty string or too long to be legal win32 pathname?
+ if (len == 0 || len >= MAX_PATH - 1)
+ return str;
+
+ char buf[MAX_PATH];
+ static char name[MAX_PATH];
+ const char *ret = 0;
+
+ strcpy (name, str);
+
+ // add extension if necessary, but leave a trailing '.', if any, alone.
+ // Files with trailing '.'s are handled differently by win32 API.
+ if (str[len - 1] != '.')
+ {
+ // add .dll only if no extension provided. Handle various cases:
+ //
+ // ./shlib --> ./shlib.dll
+ // ./dir/shlib.so --> ./dir/shlib.so
+ // shlib --> shlib.dll
+ // shlib.dll --> shlib.dll
+ // shlib.so --> shlib.so
+ //
+ const char *p = strrchr (str, '.');
+ if (!p || isdirsep (p[1]))
+ strcat (name, ".dll");
+ }
+
+ // deal with fully qualified filename right away. Do the actual
+ // conversion to win32 filename just before returning however.
+ if (isabspath (str))
+ ret = name;
+
+ // current directory
+ if (!ret)
+ {
+ if (GetCurrentDirectory (MAX_PATH, buf) == 0)
+ small_printf ("WARNING: get_full_path_of_dll can't get current directory win32 %E\n");
+ else
+ ret = check_access (buf, name);
+ }
+
+ // LD_LIBRARY_PATH
+ if (!ret)
+ ret = check_path_access ("LD_LIBRARY_PATH=", name);
+
+ if (!ret)
+ {
+ // system directory
+ if (GetSystemDirectory (buf, MAX_PATH) == 0)
+ small_printf ("WARNING: get_full_path_of_dll can't get system directory win32 %E\n");
+ else
+ ret = check_access (buf, name);
+ }
+
+ // 16 bits system directory
+ if (!ret && (os_being_run == winNT))
+ {
+ // we assume last dir was xxxxx\SYSTEM32, so we remove 32
+ len = strlen (buf);
+ buf[len - 2] = 0;
+ ret = check_access (buf, name);
+ }
+
+ // windows directory
+ if (!ret)
+ {
+ if (GetWindowsDirectory (buf, MAX_PATH) == 0)
+ small_printf ("WARNING: get_full_path_of_dll can't get Windows directory win32 %E\n");
+ else
+ ret = check_access (buf, name);
+ }
+
+ // PATH
+ if (!ret)
+ ret = check_path_access ("PATH=", name);
+
+ //
+ // now do a final conversion to win32 pathname. This step is necessary
+ // to resolve symlinks etc so that win32 API finds the underlying file.
+ //
+ if (ret)
+ {
+ path_conv real_filename (ret, SYMLINK_FOLLOW, 1);
+ if (real_filename.error)
+ ret = 0;
+ else
+ {
+ strcpy (name, real_filename.get_win32 ());
+ ret = name;
+ }
+ }
+ return ret;
+}
+
+void *
+dlopen (const char *name, int)
+{
+ SetResourceLock(LOCK_DLL_LIST,READ_LOCK|WRITE_LOCK," dlopen");
+
+ void *ret = 0;
+
+ if (!name)
+ {
+ // handle for the current module
+ ret = (void *) GetModuleHandle (0);
+ }
+ else
+ {
+ // handle for the named library
+ const char *fullpath = get_full_path_of_dll (name);
+ DllList::the().currentDlOpenedLib (fullpath);
+ ret = (void *) LoadLibrary (fullpath);
+ }
+
+ if (!ret)
+ set_dl_error ("dlopen");
+ debug_printf ("ret %p", ret);
+
+ ReleaseResourceLock(LOCK_DLL_LIST,READ_LOCK|WRITE_LOCK," dlopen");
+ return ret;
+}
+
+void *
+dlsym (void *handle, const char *name)
+{
+ void *ret = (void *) GetProcAddress ((HMODULE) handle, name);
+ if (!ret)
+ set_dl_error ("dlsym");
+ debug_printf ("ret %p", ret);
+ return ret;
+}
+
+int
+dlclose (void *handle)
+{
+ SetResourceLock(LOCK_DLL_LIST,READ_LOCK|WRITE_LOCK," dlclose");
+
+ int ret = -1;
+ if (FreeLibrary ((HMODULE) handle))
+ ret = 0;
+ if (ret)
+ set_dl_error ("dlclose");
+
+ ReleaseResourceLock(LOCK_DLL_LIST,READ_LOCK|WRITE_LOCK," dlclose");
+ return ret;
+}
+
+char *
+dlerror ()
+{
+ char *ret = 0;
+ if (_dl_error)
+ ret = _dl_buffer;
+ return ret;
+}
diff --git a/winsup/cygwin/dll_init.cc b/winsup/cygwin/dll_init.cc
new file mode 100644
index 000000000..a1d217576
--- /dev/null
+++ b/winsup/cygwin/dll_init.cc
@@ -0,0 +1,499 @@
+/* dll_init.cc
+
+ Copyright 1998, 1999, 2000 Cygnus Solutions.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#include <stdlib.h>
+#include "winsup.h"
+#include "exceptions.h"
+#include "dll_init.h"
+
+extern void __stdcall check_sanity_and_sync (per_process *);
+
+#ifdef _MT_SAFE
+extern ResourceLocks _reslock NO_COPY;
+extern MTinterface _mtinterf NO_COPY;
+#endif /*_MT_SAFE*/
+
+/* WARNING: debug can't be called before init !!!! */
+
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+// the private structure
+
+typedef enum { NONE, LINK, LOAD } dllType;
+
+struct dll
+{
+ per_process *p;
+ HMODULE handle;
+ const char *name;
+ dllType type;
+};
+
+//-----------------------------------------------------------------------------
+
+#define MAX_DLL_BEFORE_INIT 100 // FIXME: enough ???
+static dll _list_before_init[MAX_DLL_BEFORE_INIT];
+
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+// local variables
+
+static DllList _the;
+static int _last = 0;
+static int _max = MAX_DLL_BEFORE_INIT;
+static dll *_list = _list_before_init;
+static int _initCalled = 0;
+static int _numberOfOpenedDlls = 0;
+static int _forkeeMustReloadDlls = 0;
+static int _in_forkee = 0;
+static const char *_dlopenedLib = 0;
+static int _dlopenIndex = -1;
+
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+
+static int __dll_global_dtors_recorded = 0;
+
+static void
+__dll_global_dtors()
+{
+ _the.doGlobalDestructorsOfDlls();
+}
+
+static void
+doGlobalCTORS (per_process *p)
+{
+ void (**pfunc)() = p->ctors;
+
+ /* Run ctors backwards, so skip the first entry and find how many
+ there are, then run them. */
+
+ if (pfunc)
+ {
+ int i;
+ for (i = 1; pfunc[i]; i++);
+
+ for (int j = i - 1; j > 0; j-- )
+ (pfunc[j]) ();
+ }
+}
+
+static void
+doGlobalDTORS (per_process *p)
+{
+ if (!p)
+ return;
+ void (**pfunc)() = p->dtors;
+ for (int i = 1; pfunc[i]; i++)
+ (pfunc[i]) ();
+}
+
+#define INC 500
+
+static int
+add (HMODULE h, char *name, per_process *p, dllType type)
+{
+ int ret = -1;
+
+ if (p)
+ check_sanity_and_sync (p);
+
+ if (_last == _max)
+ {
+ if (!_initCalled) // we try to load more than MAX_DLL_BEFORE_INIT
+ {
+ small_printf ("try to load more dll than max allowed=%d\n",
+ MAX_DLL_BEFORE_INIT);
+ ExitProcess (1);
+ }
+
+ dll* newArray = new dll[_max+INC];
+ if (_list)
+ {
+ memcpy (newArray, _list, _max * sizeof (dll));
+ if (_list != _list_before_init)
+ delete []_list;
+ }
+ _list = newArray;
+ _max += INC;
+ }
+
+ _list[_last].name = name && type == LOAD ? strdup (name) : NULL;
+ _list[_last].handle = h;
+ _list[_last].p = p;
+ _list[_last].type = type;
+
+ ret = _last++;
+ return ret;
+}
+
+static int
+initOneDll (per_process *p)
+{
+ /* global variable user_data must be initialized */
+ if (user_data == NULL)
+ {
+ small_printf ("WARNING: process not inited while trying to init a DLL!\n");
+ return 0;
+ }
+
+ /* init impure_ptr */
+ *(p->impure_ptr_ptr) = *(user_data->impure_ptr_ptr);
+
+ /* FIXME: init environment (useful?) */
+ *(p->envptr) = *(user_data->envptr);
+
+ /* FIXME: need other initializations? */
+
+ int ret = 1;
+ if (!_in_forkee)
+ {
+ /* global contructors */
+ doGlobalCTORS (p);
+
+ /* entry point of dll (use main of per_process with null args...) */
+ if (p->main)
+ ret = (*(p->main)) (0, 0, 0);
+ }
+
+ return ret;
+}
+
+DllList&
+DllList::the ()
+{
+ return _the;
+}
+
+void
+DllList::currentDlOpenedLib (const char *name)
+{
+ if (_dlopenedLib != 0)
+ small_printf ("WARNING: previous dlopen of %s wasn't correctly performed\n", _dlopenedLib);
+ _dlopenedLib = name;
+ _dlopenIndex = -1;
+}
+
+int
+DllList::recordDll (HMODULE h, per_process *p)
+{
+ int ret = -1;
+
+ /* debug_printf ("Record a dll p=%p\n", p); see WARNING */
+ dllType type = LINK;
+ if (_initCalled)
+ {
+ type = LOAD;
+ _numberOfOpenedDlls++;
+ forkeeMustReloadDlls (1);
+ }
+
+ if (_in_forkee)
+ {
+ ret = 0; // Just a flag
+ goto out;
+ }
+
+ char buf[MAX_PATH];
+ GetModuleFileName (h, buf, MAX_PATH);
+
+ if (type == LOAD && _dlopenedLib !=0)
+ {
+ // it is not the current dlopened lib
+ // so we insert one empty lib to preserve place for current dlopened lib
+ if (!strcasematch (_dlopenedLib, buf))
+ {
+ if (_dlopenIndex == -1)
+ _dlopenIndex = add (0, 0, 0, NONE);
+ ret = add (h, buf, p, type);
+ }
+ else // it is the current dlopened lib
+ {
+ if (_dlopenIndex != -1)
+ {
+ _list[_dlopenIndex].handle = h;
+ _list[_dlopenIndex].p = p;
+ _list[_dlopenIndex].type = type;
+ ret = _dlopenIndex;
+ _dlopenIndex = -1;
+ }
+ else // it this case the dlopened lib doesn't need other lib
+ ret = add (h, buf, p, type);
+ _dlopenedLib = 0;
+ }
+ }
+ else
+ ret = add (h, buf, p, type);
+
+out:
+ if (_initCalled) // main module is already initialized
+ {
+ if (!initOneDll (p))
+ ret = -1;
+ }
+ return ret;
+}
+
+void
+DllList::detachDll (int dll_index)
+{
+ if (dll_index != -1)
+ {
+ dll *aDll = &(_list[dll_index]);
+ doGlobalDTORS (aDll->p);
+ if (aDll->type == LOAD)
+ _numberOfOpenedDlls--;
+ aDll->type = NONE;
+ }
+ else
+ small_printf ("WARNING: try to detach an already detached dll ...\n");
+}
+
+void
+DllList::initAll ()
+{
+ // init for destructors
+ // because initAll isn't called in forked process, this exit function will
+ // be recorded only once
+ if (!__dll_global_dtors_recorded)
+ {
+ atexit (__dll_global_dtors);
+ __dll_global_dtors_recorded = 1;
+ }
+
+ if (!_initCalled)
+ {
+ debug_printf ("call to DllList::initAll");
+ for (int i = 0; i < _last; i++)
+ {
+ per_process *p = _list[i].p;
+ if (p)
+ initOneDll (p);
+ }
+ _initCalled = 1;
+ }
+}
+
+void
+DllList::doGlobalDestructorsOfDlls ()
+{
+ // global destructors in reverse order
+ for (int i = _last - 1; i >= 0; i--)
+ {
+ if (_list[i].type != NONE)
+ {
+ per_process *p = _list[i].p;
+ if (p)
+ doGlobalDTORS (p);
+ }
+ }
+}
+
+int
+DllList::numberOfOpenedDlls ()
+{
+ return _numberOfOpenedDlls;
+}
+
+int
+DllList::forkeeMustReloadDlls ()
+{
+ return _forkeeMustReloadDlls;
+}
+
+void
+DllList::forkeeMustReloadDlls (int i)
+{
+ _forkeeMustReloadDlls = i;
+}
+
+#define A64K (64 * 1024)
+
+/* Mark every memory address up to "here" as reserved. This may force
+ Windows NT to load a DLL in the next available, lowest slot. */
+void
+reserve_upto (const char *name, DWORD here)
+{
+ DWORD size;
+ MEMORY_BASIC_INFORMATION mb;
+ for (DWORD start = 0x10000; start < here; start += size)
+ if (!VirtualQuery ((void *) start, &mb, sizeof (mb)))
+ size = 64 * 1024;
+ else
+ {
+ size = A64K * ((mb.RegionSize + A64K - 1) / A64K);
+ start = A64K * (((DWORD) mb.BaseAddress + A64K - 1) / A64K);
+
+ if (start + size > here)
+ size = here - start;
+ if (mb.State == MEM_FREE &&
+ !VirtualAlloc ((void *) start, size, MEM_RESERVE, PAGE_NOACCESS))
+ api_fatal ("couldn't allocate memory %p(%d) for '%s' alignment, %E\n",
+ start, size, name);
+ }
+}
+
+/* Release all of the memory previously allocated by "upto" above.
+ Note that this may also free otherwise reserved memory. If that becomes
+ a problem, we'll have to keep track of the memory that we reserve above. */
+void
+release_upto (const char *name, DWORD here)
+{
+ DWORD size;
+ MEMORY_BASIC_INFORMATION mb;
+ for (DWORD start = 0x10000; start < here; start += size)
+ if (!VirtualQuery ((void *) start, &mb, sizeof (mb)))
+ size = 64 * 1024;
+ else
+ {
+ size = mb.RegionSize;
+ if (!(mb.State == MEM_RESERVE && mb.AllocationProtect == PAGE_NOACCESS &&
+ ((void *) start < user_data->heapbase || (void *) start > user_data->heaptop)))
+ continue;
+ if (!VirtualFree ((void *) start, 0, MEM_RELEASE))
+ api_fatal ("couldn't release memory %p(%d) for '%s' alignment, %E\n",
+ start, size, name);
+ }
+}
+
+/* Reload DLLs after a fork. Iterates over the list of dynamically loaded DLLs
+ and attempts to load them in the same place as they were loaded in the parent. */
+void
+DllList::forkeeLoadDlls ()
+{
+ _initCalled = 1;
+ _in_forkee = 1;
+ int try2 = 0;
+ for (int i = 0; i < _last; i++)
+ if (_list[i].type == LOAD)
+ {
+ const char *name = _list[i].name;
+ HMODULE handle = _list[i].handle;
+ HMODULE h = LoadLibraryEx (name, NULL, DONT_RESOLVE_DLL_REFERENCES);
+
+ if (h == handle)
+ {
+ FreeLibrary (h);
+ LoadLibrary (name);
+ }
+ else if (try2)
+ api_fatal ("unable to remap %s to same address as parent -- %p", name, h);
+ else
+ {
+ FreeLibrary (h);
+ reserve_upto (name, (DWORD) handle);
+ try2 = 1;
+ i--;
+ continue;
+ }
+ if (try2)
+ {
+ release_upto (name, (DWORD) handle);
+ try2 = 0;
+ }
+ }
+ _in_forkee = 0;
+}
+
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+// iterators
+
+DllListIterator::DllListIterator (int type) : _type (type), _index (-1)
+{
+ operator++ ();
+}
+
+DllListIterator::~DllListIterator ()
+{
+}
+
+DllListIterator::operator per_process* ()
+{
+ return _list[index ()].p;
+}
+
+void
+DllListIterator::operator++ ()
+{
+ _index++;
+ while (_index < _last && (int) (_list[_index].type) != _type)
+ _index++;
+ if (_index == _last)
+ _index = -1;
+}
+
+LinkedDllIterator::LinkedDllIterator () : DllListIterator ((int) LINK)
+{
+}
+
+LinkedDllIterator::~LinkedDllIterator ()
+{
+}
+
+LoadedDllIterator::LoadedDllIterator () : DllListIterator ((int) LOAD)
+{
+}
+
+LoadedDllIterator::~LoadedDllIterator ()
+{
+}
+
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+// the extern symbols
+
+extern "C"
+{
+ /* This is an exported copy of environ which can be used by DLLs
+ which use cygwin.dll. */
+ extern struct _reent reent_data;
+};
+
+extern "C"
+int
+dll_dllcrt0 (HMODULE h, per_process *p)
+{
+ /* Partially initialize Cygwin guts for non-cygwin apps. */
+ if (dynamically_loaded && (! user_data || user_data->magic_biscuit == 0))
+ {
+ dll_crt0 (p);
+ }
+ return _the.recordDll (h, p);
+}
+
+/* OBSOLETE: This function is obsolescent and will go away in the
+ future. Cygwin can now handle being loaded from a noncygwin app
+ using the same entry point. */
+
+extern "C"
+int
+dll_noncygwin_dllcrt0 (HMODULE h, per_process *p)
+{
+ return dll_dllcrt0 (h, p);
+}
+
+extern "C"
+void
+cygwin_detach_dll (int dll_index)
+{
+ _the.detachDll (dll_index);
+}
+
+extern "C"
+void
+dlfork (int val)
+{
+ _the.forkeeMustReloadDlls (val);
+}
+
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
diff --git a/winsup/cygwin/dll_init.h b/winsup/cygwin/dll_init.h
new file mode 100644
index 000000000..ca2cc2c20
--- /dev/null
+++ b/winsup/cygwin/dll_init.h
@@ -0,0 +1,102 @@
+/* dll_init.h
+
+ Copyright 1998 Cygnus Solutions
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+//-----------------------------------------------------------------------------
+// list of loaded DLL (used by fork & init)
+class DllList
+{
+public:
+ static DllList& the ();
+
+ // return dll index used for freeDll
+ int recordDll (HMODULE, per_process*);
+ void detachDll (int dll_index);
+
+ // called after initialization of main module in dll_crt0
+ void initAll ();
+
+ // global destructors of loaded dlls
+ void doGlobalDestructorsOfDlls ();
+
+ // number of dlls dlopened
+ int numberOfOpenedDlls ();
+
+ // boolean to determine if forked process must reload dlls opened with
+ // LoadLibrary or dlopen ...
+ // default = 0 (FALSE)
+ int forkeeMustReloadDlls ();
+ void forkeeMustReloadDlls (int);
+
+ void forkeeLoadDlls ();
+
+ // set name of current library opened with dlopen
+ void currentDlOpenedLib (const char*);
+};
+
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+
+class DllListIterator
+{
+ int _type;
+ int _index;
+
+protected:
+ DllListIterator (int type);
+ int index () const { return _index; }
+
+public:
+ virtual ~DllListIterator();
+
+ int ok() { return _index!=-1; }
+ void operator++ ();
+ void operator++ (int) { operator++ (); }
+ operator per_process* ();
+};
+
+//-----------------------------------------------------------------------------
+
+class LinkedDllIterator : public DllListIterator
+{
+public:
+ LinkedDllIterator ();
+ ~LinkedDllIterator ();
+};
+
+//-----------------------------------------------------------------------------
+
+class LoadedDllIterator : public DllListIterator
+{
+public:
+ LoadedDllIterator ();
+ ~LoadedDllIterator ();
+};
+
+//-----------------------------------------------------------------------------
+
+#define DO_LINKED_DLL(var) \
+{ \
+LinkedDllIterator iterator; \
+while (iterator.ok ()) \
+{ \
+ per_process *var = (per_process *) iterator;
+
+#define DO_LOADED_DLL(var) \
+{ \
+LoadedDllIterator iterator; \
+while (iterator.ok ()) \
+{ \
+ per_process *var = (per_process *) iterator;
+
+#define DLL_DONE \
+ iterator++; \
+} \
+}
+
diff --git a/winsup/cygwin/dll_init.sgml b/winsup/cygwin/dll_init.sgml
new file mode 100644
index 000000000..38070390c
--- /dev/null
+++ b/winsup/cygwin/dll_init.sgml
@@ -0,0 +1,11 @@
+
+<sect1 id="func-cygwin-detach-dll">
+<title>cygwin_detach_dll</title>
+
+<funcsynopsis>
+<funcdef>extern "C" void
+<function>cygwin_detach_dll</function></funcdef>
+<paramdef>int <parameter>dll_index</parameter></paramdef>
+</funcsynopsis>
+
+</sect1>
diff --git a/winsup/cygwin/dtable.cc b/winsup/cygwin/dtable.cc
new file mode 100644
index 000000000..27af8709f
--- /dev/null
+++ b/winsup/cygwin/dtable.cc
@@ -0,0 +1,603 @@
+/* hinfo.cc: file descriptor support.
+
+ Copyright 1996, 1997, 1998, 1999, 2000 Cygnus Solutions.
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#define __INSIDE_CYGWIN_NET__
+
+#include <errno.h>
+#include <sys/socket.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <ctype.h>
+#include <unistd.h>
+#include <fcntl.h>
+
+#define Win32_Winsock
+#include "winsup.h"
+
+hinfo dtable;
+
+/* Set aside space for the table of fds */
+void
+dtable_init (void)
+{
+ if (!dtable.size)
+ dtable.extend(NOFILE_INCR);
+}
+
+void __stdcall
+set_std_handle (int fd)
+{
+ if (fd == 0)
+ SetStdHandle (STD_INPUT_HANDLE, dtable[fd]->get_handle ());
+ else if (fd == 1)
+ SetStdHandle (STD_OUTPUT_HANDLE, dtable[fd]->get_output_handle ());
+ else if (fd == 2)
+ SetStdHandle (STD_ERROR_HANDLE, dtable[fd]->get_output_handle ());
+}
+
+int
+hinfo::extend (int howmuch)
+{
+ int new_size = size + howmuch;
+ fhandler_base **newfds;
+
+ if (howmuch <= 0)
+ return 0;
+
+ /* Try to allocate more space for fd table. We can't call realloc()
+ here to preserve old table if memory allocation fails */
+
+debug_printf ("here size %d", size);
+
+ if (!(newfds = (fhandler_base **) calloc (new_size, sizeof newfds[0])))
+ {
+ debug_printf ("calloc failed");
+ return 0;
+ }
+ if (fds)
+ {
+ memcpy (newfds, fds, size * sizeof (fds[0]));
+ free (fds);
+ }
+
+ size = new_size;
+ fds = newfds;
+ debug_printf ("size %d, fds %d", size, fds);
+ return 1;
+}
+
+/* Initialize the file descriptor/handle mapping table.
+ We only initialize the parent table here. The child table is
+ initialized at each fork () call. */
+
+void
+hinfo_init (void)
+{
+ /* Set these before trying to output anything from strace.
+ Also, always set them even if we're to pick up our parent's fds
+ in case they're missed. */
+
+ if (!parent_alive && NOTSTATE(myself, PID_CYGPARENT))
+ {
+ HANDLE in = GetStdHandle (STD_INPUT_HANDLE);
+ HANDLE out = GetStdHandle (STD_OUTPUT_HANDLE);
+ HANDLE err = GetStdHandle (STD_ERROR_HANDLE);
+
+ dtable.init_std_file_from_handle (0, in, GENERIC_READ, "{stdin}");
+
+ /* STD_ERROR_HANDLE has been observed to be the same as
+ STD_OUTPUT_HANDLE. We need separate handles (e.g. using pipes
+ to pass data from child to parent). */
+ if (out == err)
+ {
+ /* Since this code is not invoked for forked tasks, we don't have
+ to worry about the close-on-exec flag here. */
+ if (!DuplicateHandle (hMainProc, out, hMainProc, &err, 0,
+ 1, DUPLICATE_SAME_ACCESS))
+ {
+ /* If that fails, do this as a fall back. */
+ err = out;
+ system_printf ("couldn't make stderr distinct from stdout");
+ }
+ }
+
+ dtable.init_std_file_from_handle (1, out, GENERIC_WRITE, "{stdout}");
+ dtable.init_std_file_from_handle (2, err, GENERIC_WRITE, "{stderr}");
+ }
+}
+
+int
+hinfo::not_open (int fd)
+{
+ SetResourceLock(LOCK_FD_LIST,READ_LOCK," not_open");
+
+ int res = fd < 0 || fd >= (int)size || fds[fd] == NULL;
+
+ ReleaseResourceLock(LOCK_FD_LIST,READ_LOCK," not open");
+ return res;
+}
+
+int
+hinfo::find_unused_handle (int start)
+{
+ AssertResourceOwner(LOCK_FD_LIST,READ_LOCK);
+
+ do
+ {
+ for (int i = start; i < (int) size; i++)
+ if (not_open (i))
+ return i;
+ }
+ while (extend (NOFILE_INCR));
+ return -1;
+}
+
+void
+hinfo::release (int fd)
+{
+ if (!not_open (fd))
+ {
+MALLOC_CHECK;
+ delete (fds[fd]);
+MALLOC_CHECK;
+ fds[fd] = NULL;
+ }
+}
+
+void
+hinfo::init_std_file_from_handle (int fd, HANDLE handle,
+ DWORD myaccess, const char *name)
+{
+ int bin = __fmode;
+ /* Check to see if we're being redirected - if not then
+ we open then as consoles */
+ if (fd == 0 || fd == 1 || fd == 2)
+ {
+ first_fd_for_open = 0;
+ /* See if we can consoleify it - if it is a console,
+ don't open it in binary. That will screw up our crlfs*/
+ CONSOLE_SCREEN_BUFFER_INFO buf;
+ if (GetConsoleScreenBufferInfo (handle, &buf))
+ {
+ bin = 0;
+ if (ISSTATE (myself, PID_USETTY))
+ name = "/dev/tty";
+ else
+ name = "/dev/conout";
+ }
+ else if (FlushConsoleInputBuffer (handle))
+ {
+ bin = 0;
+ if (ISSTATE (myself, PID_USETTY))
+ name = "/dev/tty";
+ else
+ name = "/dev/conin";
+ }
+ }
+
+ build_fhandler (fd, name, handle)->init (handle, myaccess, bin);
+ set_std_handle (fd);
+ paranoid_printf ("fd %d, handle %p", fd, handle);
+}
+
+extern "C"
+int
+cygwin_attach_handle_to_fd (char *name, int fd, HANDLE handle, mode_t bin,
+ DWORD myaccess)
+{
+ if (fd == -1)
+ fd = dtable.find_unused_handle();
+ fhandler_base *res = dtable.build_fhandler (fd, name, handle);
+ res->init (handle, myaccess, bin);
+ return fd;
+}
+
+fhandler_base *
+hinfo::build_fhandler (int fd, const char *name, HANDLE handle)
+{
+ int unit;
+ DWORD devn;
+
+ if ((devn = get_device_number (name, unit)) == FH_BAD)
+ {
+ struct sockaddr sa;
+ int sal = sizeof (sa);
+ CONSOLE_SCREEN_BUFFER_INFO cinfo;
+ DCB dcb;
+
+ if (handle == NULL)
+ devn = FH_DISK;
+ else if (GetNumberOfConsoleInputEvents (handle, (DWORD *) &cinfo))
+ devn = FH_CONIN;
+ else if (GetConsoleScreenBufferInfo (handle, &cinfo))
+ devn= FH_CONOUT;
+ else if (wsock32_handle && getpeername ((SOCKET) handle, &sa, &sal))
+ devn = FH_SOCKET;
+ else if (GetFileType (handle) == FILE_TYPE_PIPE)
+ devn = FH_PIPE;
+ else if (GetCommState (handle, &dcb))
+ devn = FH_SERIAL;
+ else
+ devn = FH_DISK;
+ }
+
+ return build_fhandler (fd, devn, name, unit);
+}
+
+fhandler_base *
+hinfo::build_fhandler (int fd, DWORD dev, const char *name, int unit)
+{
+ fhandler_base *fh;
+ void *buf = calloc (1, sizeof (fhandler_union) + 100);
+
+ switch (dev & FH_DEVMASK)
+ {
+ case FH_TTYM:
+ fh = new (buf) fhandler_tty_master (name, unit);
+ break;
+ case FH_CONSOLE:
+ case FH_CONIN:
+ case FH_CONOUT:
+ fh = new (buf) fhandler_console (name);
+ break;
+ case FH_PTYM:
+ fh = new (buf) fhandler_pty_master (name);
+ break;
+ case FH_TTYS:
+ if (unit < 0)
+ fh = new (buf) fhandler_tty_slave (name);
+ else
+ fh = new (buf) fhandler_tty_slave (unit, name);
+ break;
+ case FH_WINDOWS:
+ fh = new (buf) fhandler_windows (name);
+ break;
+ case FH_SERIAL:
+ fh = new (buf) fhandler_serial (name, FH_SERIAL, unit);
+ break;
+ case FH_PIPE:
+ case FH_PIPER:
+ case FH_PIPEW:
+ fh = new (buf) fhandler_pipe (name);
+ break;
+ case FH_SOCKET:
+ fh = new (buf) fhandler_socket (name);
+ break;
+ case FH_DISK:
+ fh = new (buf) fhandler_disk_file (NULL);
+ break;
+ case FH_FLOPPY:
+ fh = new (buf) fhandler_dev_floppy (name, unit);
+ break;
+ case FH_TAPE:
+ fh = new (buf) fhandler_dev_tape (name, unit);
+ break;
+ case FH_NULL:
+ fh = new (buf) fhandler_dev_null (name);
+ break;
+ case FH_ZERO:
+ fh = new (buf) fhandler_dev_zero (name);
+ break;
+ default:
+ /* FIXME - this could recurse forever */
+ return build_fhandler (fd, name, NULL);
+ }
+
+ debug_printf ("%s - cb %d, fd %d, fh %p", fh->get_name () ?: "", fh->cb,
+ fd, fh);
+ return fd >= 0 ? (fds[fd] = fh) : fh;
+}
+
+fhandler_base *
+hinfo::dup_worker (fhandler_base *oldfh)
+{
+ fhandler_base *newfh = build_fhandler (-1, oldfh->get_device (), NULL);
+ *newfh = *oldfh;
+ newfh->set_io_handle (NULL);
+ if (oldfh->dup (newfh))
+ {
+ free (newfh);
+ newfh = NULL;
+ return NULL;
+ }
+
+ newfh->set_close_on_exec_flag (0);
+ MALLOC_CHECK;
+ return newfh;
+}
+
+int
+hinfo::dup2 (int oldfd, int newfd)
+{
+ int res = -1;
+ fhandler_base *newfh = NULL; // = NULL to avoid an incorrect warning
+
+ MALLOC_CHECK;
+ debug_printf ("dup2 (%d, %d)", oldfd, newfd);
+
+ if (not_open (oldfd))
+ {
+ syscall_printf("dup2: fd %d not open", oldfd);
+ set_errno (EBADF);
+ goto done;
+ }
+
+ if (newfd == oldfd)
+ {
+ res = 0;
+ goto done;
+ }
+
+ if ((newfh = dup_worker (fds[oldfd])) == NULL)
+ {
+ res = -1;
+ goto done;
+ }
+
+ SetResourceLock(LOCK_FD_LIST,WRITE_LOCK|READ_LOCK,"dup");
+ if (!not_open (newfd))
+ _close (newfd);
+ fds[newfd] = newfh;
+ ReleaseResourceLock(LOCK_FD_LIST,WRITE_LOCK|READ_LOCK,"dup");
+ MALLOC_CHECK;
+
+ if ((res = newfd) <= 2)
+ set_std_handle (res);
+
+ MALLOC_CHECK;
+done:
+ syscall_printf ("%d = dup2 (%d, %d)", res, oldfd, newfd);
+
+ return res;
+}
+
+select_record *
+hinfo::select_read (int fd, select_record *s)
+{
+ if (dtable.not_open (fd))
+ {
+ set_errno (EBADF);
+ return NULL;
+ }
+ fhandler_base *fh = dtable[fd];
+ s = fh->select_read (s);
+ s->fd = fd;
+ s->fh = fh;
+ s->saw_error = 0;
+ debug_printf ("%s fd %d", fh->get_name (), fd);
+ return s;
+}
+
+select_record *
+hinfo::select_write (int fd, select_record *s)
+{
+ if (dtable.not_open (fd))
+ {
+ set_errno (EBADF);
+ return NULL;
+ }
+ fhandler_base *fh = dtable[fd];
+ s = fh->select_write (s);
+ s->fd = fd;
+ s->fh = fh;
+ s->saw_error = 0;
+ debug_printf ("%s fd %d", fh->get_name (), fd);
+ return s;
+}
+
+select_record *
+hinfo::select_except (int fd, select_record *s)
+{
+ if (dtable.not_open (fd))
+ {
+ set_errno (EBADF);
+ return NULL;
+ }
+ fhandler_base *fh = dtable[fd];
+ s = fh->select_except (s);
+ s->fd = fd;
+ s->fh = fh;
+ s->saw_error = 0;
+ debug_printf ("%s fd %d", fh->get_name (), fd);
+ return s;
+}
+
+/*
+ * Function to take an existant hinfo array
+ * and linearize it into a memory buffer.
+ * If memory buffer is NULL, it returns the size
+ * of memory buffer needed to do the linearization.
+ * On error returns -1.
+ */
+
+int
+hinfo::linearize_fd_array (unsigned char *in_buf, int buflen)
+{
+ /* If buf == NULL, just precalculate length */
+ if (in_buf == NULL)
+ {
+ buflen = sizeof (size_t);
+ for (int i = 0, max_used_fd = -1; i < (int)size; i++)
+ if (!not_open (i) && !fds[i]->get_close_on_exec ())
+ {
+ buflen += i - (max_used_fd + 1);
+ buflen += fds[i]->cb + strlen (fds[i]->get_name ()) + 1
+ + strlen (fds[i]->get_win32_name ()) + 1;
+ max_used_fd = i;
+ }
+ debug_printf ("needed buflen %d", buflen);
+ return buflen;
+ }
+
+ debug_printf ("in_buf = %x, buflen = %d", in_buf, buflen);
+
+ /*
+ * Now linearize each open fd (write a 0xff byte for a closed fd).
+ * Write the name of the open fd first (null terminated). This
+ * allows the de_linearizeing code to determine what kind of fhandler_xxx
+ * to create.
+ */
+
+ size_t i;
+ int len, total_size;
+
+ total_size = sizeof (size_t);
+ if (total_size > buflen)
+ {
+ system_printf ("FATAL: linearize_fd_array exceeded buffer size");
+ return -1;
+ }
+
+ unsigned char *buf = in_buf;
+ buf += sizeof (size_t); /* skip over length which is added later */
+
+ for (i = 0, total_size = sizeof (size_t); total_size < buflen; i++)
+ {
+ if (not_open (i) || fds[i]->get_close_on_exec ())
+ {
+ debug_printf ("linearizing closed fd %d",i);
+ *buf = 0xff; /* place holder */
+ len = 1;
+ }
+ else
+ {
+ len = fds[i]->linearize (buf);
+ debug_printf ("fd %d, len %d, name %s, device %p", i, len, buf,
+ fds[i]->get_device ());
+ }
+
+ total_size += len;
+ buf += len;
+ }
+
+ i--;
+ memcpy (in_buf, &i, sizeof (size_t));
+ if (total_size != buflen)
+ system_printf ("out of sync %d != %d", total_size, buflen);
+ return total_size;
+}
+
+/*
+ * Function to take a linearized hinfo array in a memory buffer and
+ * re-create the original hinfo array.
+ */
+
+LPBYTE
+hinfo::de_linearize_fd_array (LPBYTE buf)
+{
+ int len;
+ size_t max_used_fd, inc_size;
+
+ debug_printf ("buf %x", buf);
+
+ /* First get the number of fd's - use this to set the dtablesize.
+ NB. This is the only place in the code this should be done !!
+ */
+
+ memcpy ((char *) &max_used_fd, buf, sizeof (int));
+ buf += sizeof (size_t);
+
+ inc_size = NOFILE_INCR * ((max_used_fd + NOFILE_INCR - 1) / NOFILE_INCR) -
+ size;
+ debug_printf ("max_used_fd %d, inc size %d", max_used_fd, inc_size);
+ if (inc_size > 0 && !extend (inc_size))
+ {
+ system_printf ("out of memory");
+ return NULL;
+ }
+
+ for (size_t i = 0; i <= max_used_fd; i++)
+ {
+ /* 0xFF means closed */
+ if (*buf == 0xff)
+ {
+ fds[i] = NULL;
+ buf++;
+ debug_printf ("closed fd %d", i);
+ continue;
+ }
+ /* fd was open - de_linearize it */
+ /* Get the null-terminated name. It is followed by an image of
+ the actual fhandler_* structure. Use the status field from
+ this to build a new fhandler type. */
+
+ DWORD status;
+ LPBYTE obuf = buf;
+ char *win32;
+ win32 = strchr ((char *)obuf, '\0') + 1;
+ buf = (LPBYTE)strchr ((char *)win32, '\0') + 1;
+ memcpy ((char *)&status, buf + FHSTATOFF, sizeof(DWORD));
+ debug_printf ("fd %d, name %s, win32 name %s, status %p",
+ i, obuf, win32, status);
+ len = build_fhandler (i, status, (const char *) NULL)->
+ de_linearize ((char *) buf, (char *) obuf, win32);
+ set_std_handle (i);
+ buf += len;
+ debug_printf ("len %d", buf - obuf);
+ }
+ first_fd_for_open = 0;
+ return buf;
+}
+
+void
+hinfo::fixup_after_fork (HANDLE parent)
+{
+ SetResourceLock(LOCK_FD_LIST,WRITE_LOCK|READ_LOCK,"dup");
+ for (size_t i = 0; i < size; i++)
+ if (!not_open (i))
+ {
+ fhandler_base *fh = fds[i];
+ if (fh->get_close_on_exec () || fh->get_need_fork_fixup ())
+ {
+ debug_printf ("fd %d(%s)", i, fh->get_name ());
+ fh->fixup_after_fork (parent);
+ }
+ }
+ ReleaseResourceLock(LOCK_FD_LIST,WRITE_LOCK|READ_LOCK,"dup");
+}
+
+int
+hinfo::vfork_child_dup ()
+{
+ fhandler_base **newtable;
+ newtable = (fhandler_base **) calloc (size, sizeof(fds[0]));
+ int res = 1;
+
+ SetResourceLock(LOCK_FD_LIST,WRITE_LOCK|READ_LOCK,"dup");
+ for (size_t i = 0; i < size; i++)
+ if (not_open (i))
+ continue;
+ else if ((newtable[i] = dup_worker (fds[i])) == NULL)
+ {
+ res = 0;
+ set_errno (EBADF);
+ goto out;
+ }
+ fds_on_hold = fds;
+ fds = newtable;
+out:
+ ReleaseResourceLock(LOCK_FD_LIST,WRITE_LOCK|READ_LOCK,"dup");
+ return 1;
+}
+
+void
+hinfo::vfork_parent_restore ()
+{
+ SetResourceLock(LOCK_FD_LIST,WRITE_LOCK|READ_LOCK,"dup");
+
+ close_all_files ();
+ fhandler_base **deleteme = fds;
+ fds = fds_on_hold;
+ fds_on_hold = NULL;
+ free (deleteme);
+
+ ReleaseResourceLock(LOCK_FD_LIST,WRITE_LOCK|READ_LOCK,"dup");
+ return;
+}
diff --git a/winsup/cygwin/dtable.sgml b/winsup/cygwin/dtable.sgml
new file mode 100644
index 000000000..9f292ee73
--- /dev/null
+++ b/winsup/cygwin/dtable.sgml
@@ -0,0 +1,20 @@
+
+<sect1 id="func-cygwin-attach-handle-to-fd">
+<title>cygwin_attach_handle_to_fd</title>
+
+<funcsynopsis>
+<funcdef>extern "C" int
+<function>cygwin_attach_handle_to_fd</function></funcdef>
+<paramdef>char *<parameter>name</parameter></paramdef>
+<paramdef>int <parameter>fd</parameter></paramdef>
+<paramdef>HANDLE <parameter>handle</parameter></paramdef>
+<paramdef>int <parameter>bin</parameter></paramdef>
+<paramdef>int <parameter>access</parameter></paramdef>
+</funcsynopsis>
+
+<para>This function can be used to turn a Win32 "handle" into a
+posix-style file handle. <parameter>fd</parameter> may be -1 to
+make cygwin allocate a handle; the actual handle is returned
+in all cases.</para>
+
+</sect1>
diff --git a/winsup/cygwin/environ.cc b/winsup/cygwin/environ.cc
new file mode 100644
index 000000000..249e95c99
--- /dev/null
+++ b/winsup/cygwin/environ.cc
@@ -0,0 +1,567 @@
+/* environ.cc: Cygwin-adopted functions from newlib to manipulate
+ process's environment.
+
+ Copyright 1997, 1998, 1999, 2000 Cygnus Solutions.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#include "winsup.h"
+#include <stdlib.h>
+#include <stddef.h>
+#include <ctype.h>
+#include <fcntl.h>
+
+#define environ (*user_data->envptr)
+
+extern BOOL allow_glob;
+extern BOOL allow_ntea;
+extern BOOL strip_title_path;
+extern DWORD chunksize;
+extern BOOL oldstack;
+BOOL threadsafe;
+BOOL reset_com = TRUE;
+static BOOL envcache = TRUE;
+
+/* List of names which are converted from dos to unix
+ * on the way in and back again on the way out.
+ *
+ * PATH needs to be here because CreateProcess uses it and gdb uses
+ * CreateProcess. HOME is here because most shells use it and would be
+ * confused by Windows style path names.
+ */
+static int return_MAX_PATH (const char *) {return MAX_PATH;}
+static win_env conv_envvars[] =
+ {
+ {"PATH=", 5, NULL, NULL, cygwin_win32_to_posix_path_list,
+ cygwin_posix_to_win32_path_list,
+ cygwin_win32_to_posix_path_list_buf_size,
+ cygwin_posix_to_win32_path_list_buf_size},
+ {"HOME=", 5, NULL, NULL, cygwin_conv_to_full_posix_path, cygwin_conv_to_full_win32_path,
+ return_MAX_PATH, return_MAX_PATH},
+ {"LD_LIBRARY_PATH=", 16, NULL, NULL, cygwin_conv_to_full_posix_path,
+ cygwin_conv_to_full_win32_path, return_MAX_PATH, return_MAX_PATH},
+ {NULL}
+ };
+
+void
+win_env::add_cache (const char *in_posix, const char *in_native)
+{
+ posix = (char *) realloc (posix, strlen (in_posix) + 1);
+ strcpy (posix, in_posix);
+ if (in_native)
+ {
+ native = (char *) realloc (native, namelen + 1 + strlen (in_native));
+ (void) strcpy (native, name);
+ (void) strcpy (native + namelen, in_native);
+ }
+ else
+ {
+ native = (char *) realloc (native, namelen + 1 + win32_len (in_posix));
+ (void) strcpy (native, name);
+ towin32 (in_posix, native + namelen);
+ }
+ debug_printf ("posix %s", posix);
+ debug_printf ("native %s", native);
+}
+
+
+/* Check for a "special" environment variable name. *env is the pointer
+ * to the beginning of the environment variable name. n is the length
+ * of the name including a mandatory '='. Returns a pointer to the
+ * appropriate conversion structure.
+ */
+win_env *
+getwinenv (const char *env, const char *in_posix)
+{
+ for (int i = 0; conv_envvars[i].name != NULL; i++)
+ if (strncasematch (env, conv_envvars[i].name, conv_envvars[i].namelen))
+ {
+ win_env *we = conv_envvars + i;
+ const char *val;
+ if (!environ || !(val = in_posix ?: getenv(we->name)))
+ debug_printf ("can't set native for %s since no environ yet",
+ we->name);
+ else if (!envcache || !we->posix || strcmp (val, we->posix))
+ we->add_cache (val);
+ return we;
+ }
+ return NULL;
+}
+
+/* Convert windows path specs to POSIX, if appropriate.
+ */
+static void __stdcall
+posify (char **here, const char *value)
+{
+ char *src = *here;
+ win_env *conv;
+ int len = strcspn (src, "=") + 1;
+
+ if (!(conv = getwinenv (src)))
+ return;
+
+ /* Turn all the items from c:<foo>;<bar> into their
+ mounted equivalents - if there is one. */
+
+ char *outenv = (char *) malloc (1 + len + conv->posix_len (value));
+ memcpy (outenv, src, len);
+ conv->toposix (value, outenv + len);
+ conv->add_cache (outenv + len, value);
+
+ debug_printf ("env var converted to %s", outenv);
+ *here = outenv;
+ free (src);
+}
+
+/*
+ * my_findenv --
+ * Returns pointer to value associated with name, if any, else NULL.
+ * Sets offset to be the offset of the name/value combination in the
+ * environment array, for use by setenv(3) and unsetenv(3).
+ * Explicitly removes '=' in argument name.
+ */
+
+static char * __stdcall
+my_findenv (const char *name, int *offset)
+{
+ register int len;
+ register char **p;
+ const char *c;
+
+ c = name;
+ len = 0;
+ while (*c && *c != '=')
+ {
+ c++;
+ len++;
+ }
+
+ for (p = environ; *p; ++p)
+ if (!strncmp (*p, name, len))
+ if (*(c = *p + len) == '=')
+ {
+ *offset = p - environ;
+ return (char *) (++c);
+ }
+ return NULL;
+}
+
+/*
+ * getenv --
+ * Returns ptr to value associated with name, if any, else NULL.
+ */
+
+extern "C"
+char *
+getenv (const char *name)
+{
+ int offset;
+
+ return my_findenv (name, &offset);
+}
+
+/* putenv --
+ * Sets an environment variable
+ */
+
+extern "C"
+int
+putenv (const char *str)
+{
+ register char *p, *equal;
+ int rval;
+
+ if (!(p = strdup (str)))
+ return 1;
+ if (!(equal = index (p, '=')))
+ {
+ (void) free (p);
+ return 1;
+ }
+ *equal = '\0';
+ rval = setenv (p, equal + 1, 1);
+ (void) free (p);
+ return rval;
+}
+
+/*
+ * setenv --
+ * Set the value of the environment variable "name" to be
+ * "value". If rewrite is set, replace any current value.
+ */
+
+extern "C"
+int
+setenv (const char *name, const char *value, int rewrite)
+{
+ register char *C;
+ unsigned int l_value;
+ int offset;
+
+ if (*value == '=') /* no `=' in value */
+ ++value;
+ l_value = strlen (value);
+ if ((C = my_findenv (name, &offset)))
+ { /* find if already exists */
+ if (!rewrite)
+ return 0;
+ if (strlen (C) >= l_value)
+ { /* old larger; copy over */
+ while ((*C++ = *value++));
+ return 0;
+ }
+ }
+ else
+ { /* create new slot */
+ register int cnt;
+ register char **P;
+
+ for (P = environ, cnt = 0; *P; ++P, ++cnt)
+ ;
+ __cygwin_environ = environ = (char **) realloc ((char *) environ,
+ (size_t) (sizeof (char *) * (cnt + 2)));
+ if (!environ)
+ return -1;
+ environ[cnt + 1] = NULL;
+ offset = cnt;
+ }
+
+ for (C = (char *) name; *C && *C != '='; ++C); /* no `=' in name */
+
+ if (!(environ[offset] = /* name + `=' + value */
+ (char *) malloc ((size_t) ((int) (C - name) + l_value + 2))))
+ return -1;
+ for (C = environ[offset]; (*C = *name++) && *C != '='; ++C);
+ *C++ = '=';
+ strcpy (C, value);
+
+ win_env *spenv;
+ if ((spenv = getwinenv (environ[offset])))
+ spenv->add_cache (value);
+
+ return 0;
+}
+
+/*
+ * unsetenv(name) --
+ * Delete environment variable "name".
+ */
+
+extern "C"
+void
+unsetenv (const char *name)
+{
+ register char **P;
+ int offset;
+
+ while (my_findenv (name, &offset)) /* if set multiple times */
+ for (P = &environ[offset];; ++P)
+ if (!(*P = *(P + 1)))
+ break;
+}
+
+/* Turn environment variable part of a=b string into uppercase. */
+
+static void __inline
+ucenv (char *p, char *eq)
+{
+ /* Amazingly, NT has a case sensitive environment name list,
+ but only sometimes.
+ It's normal to have NT set your "Path" to something.
+ Later, you set "PATH" to something else. This alters "Path".
+ But if you try and do a naive getenv on "PATH" you'll get nothing.
+
+ So we upper case the labels here to prevent confusion later but
+ we only do it for the first process in a session group. */
+ for (; p < eq; p++)
+ if (islower (*p))
+ *p = toupper (*p);
+}
+
+/* Parse CYGWIN options */
+
+static NO_COPY BOOL export_settings = FALSE;
+
+enum settings
+ {
+ justset,
+ isfunc,
+ setbit,
+ set_process_state,
+ };
+
+/* The structure below is used to set up an array which is used to
+ * parse the CYGWIN environment variable or, if enabled, options from
+ * the registry.
+ */
+struct parse_thing
+ {
+ const char *name;
+ union parse_setting
+ {
+ BOOL *b;
+ DWORD *x;
+ int *i;
+ void (*func)(const char *);
+ } setting;
+
+ enum settings disposition;
+ char *remember;
+ union parse_values
+ {
+ DWORD i;
+ const char *s;
+ } values[2];
+ } known[] =
+{
+ {"binmode", {&__fmode}, justset, NULL, {{O_TEXT}, {O_BINARY}}},
+ {"envcache", {&envcache}, justset, NULL, {{TRUE}, {FALSE}}},
+ {"error_start", {func: &error_start_init}, isfunc, NULL, {{0}, {0}}},
+ {"export", {&export_settings}, justset, NULL, {{FALSE}, {TRUE}}},
+ {"forkchunk", {x: &chunksize}, justset, NULL, {{8192}, {0}}},
+ {"glob", {&allow_glob}, justset, NULL, {{FALSE}, {TRUE}}},
+ {"ntea", {&allow_ntea}, justset, NULL, {{FALSE}, {TRUE}}},
+ {"ntsec", {&allow_ntsec}, justset, NULL, {{FALSE}, {TRUE}}},
+ {"oldstack", {&oldstack}, justset, NULL, {{FALSE}, {TRUE}}},
+ {"reset_com", {&reset_com}, justset, NULL, {{FALSE}, {TRUE}}},
+ {"strip_title", {&strip_title_path}, justset, NULL, {{FALSE}, {TRUE}}},
+ {"title", {&display_title}, justset, NULL, {{FALSE}, {TRUE}}},
+ {"tty", {NULL}, set_process_state, NULL, {{0}, {PID_USETTY}}},
+ {"threadsafe", {&threadsafe}, justset, NULL, {{TRUE}, {FALSE}}},
+ {NULL, {0}, justset, 0, {{0}, {0}}}
+};
+
+/* Parse a string of the form "something=stuff somethingelse=more-stuff",
+ * silently ignoring unknown "somethings".
+ */
+static void __stdcall
+parse_options (char *buf)
+{
+ int istrue;
+ char *p;
+ parse_thing *k;
+
+ if (buf == NULL)
+ {
+ char newbuf[MAX_PATH + 7] = "CYGWIN";
+ for (k = known; k->name != NULL; k++)
+ if (k->remember)
+ {
+ strcat (strcat (newbuf, " "), k->remember);
+ free (k->remember);
+ k->remember = NULL;
+ }
+ if (!export_settings)
+ return;
+ newbuf[sizeof ("CYGWIN") - 1] = '=';
+ debug_printf ("%s", newbuf);
+ putenv (newbuf);
+ return;
+ }
+
+ buf = strcpy ((char *) alloca (strlen (buf) + 1), buf);
+ for (p = strtok (buf, " \t"); p != NULL; p = strtok (NULL, " \t"))
+ {
+ if (!(istrue = !strncasematch (p, "no", 2)))
+ p += 2;
+ else if (!(istrue = *p != '-'))
+ p++;
+
+ char ch, *eq;
+ if ((eq = strchr (p, '=')) != NULL || (eq = strchr (p, ':')) != NULL)
+ ch = *eq, *eq++ = '\0';
+ else
+ ch = 0;
+
+ for (parse_thing *k = known; k->name != NULL; k++)
+ if (strcasematch (p, k->name))
+ {
+ switch (k->disposition)
+ {
+ case isfunc:
+ k->setting.func ((!eq || !istrue) ?
+ k->values[istrue].s : eq);
+ debug_printf ("%s (called func)", k->name);
+ break;
+ case justset:
+ if (!istrue || !eq)
+ *k->setting.x = k->values[istrue].i;
+ else
+ *k->setting.x = strtol (eq, NULL, 0);
+ debug_printf ("%s %d", k->name, *k->setting.x);
+ break;
+ case set_process_state:
+ k->setting.x = &myself->process_state;
+ /* fall through */
+ case setbit:
+ *k->setting.x &= ~k->values[istrue].i;
+ if (istrue || (eq && strtol (eq, NULL, 0)))
+ *k->setting.x |= k->values[istrue].i;
+ debug_printf ("%s %x", k->name, *k->setting.x);
+ break;
+ }
+
+ if (eq)
+ *--eq = ch;
+
+ int n = eq - p;
+ p = strdup (p);
+ if (n > 0)
+ p[n] = ':';
+ k->remember = p;
+ break;
+ }
+ }
+ debug_printf ("returning");
+ return;
+}
+
+/* Set options from the registry. */
+
+static void __stdcall
+regopt (const char *name)
+{
+ MALLOC_CHECK;
+ /* FIXME: should not be under mount */
+ reg_key r (KEY_READ, CYGWIN_INFO_PROGRAM_OPTIONS_NAME, NULL);
+ char buf[MAX_PATH];
+ char lname[strlen(name) + 1];
+ strlwr (strcpy (lname, name));
+ MALLOC_CHECK;
+ if (r.get_string (lname, buf, sizeof (buf) - 1, "") == ERROR_SUCCESS)
+ parse_options (buf);
+ MALLOC_CHECK;
+}
+
+/* Initialize the environ array. Look for the CYGWIN environment
+ * environment variable and set appropriate options from it.
+ */
+void
+environ_init (void)
+{
+ const char * const rawenv = GetEnvironmentStrings ();
+ int envsize, i;
+ char *newp, **envp;
+ const char *p;
+ int sawTERM = 0;
+
+ /* Allocate space for environment + trailing NULL + CYGWIN env. */
+ envp = (char **) malloc ((4 + (envsize = 100)) * sizeof (char *));
+
+ regopt ("default");
+ if (myself->progname[0])
+ regopt (myself->progname);
+
+#ifdef NTSEC_ON_BY_DEFAULT
+ /* Set ntsec explicit as default, if NT is running */
+ if (os_being_run == winNT)
+ allow_ntsec = TRUE;
+#endif
+
+ /* Current directory information is recorded as variables of the
+ form "=X:=X:\foo\bar; these must be changed into something legal
+ (we could just ignore them but maybe an application will
+ eventually want to use them). */
+ for (i = 0, p = rawenv; *p != '\0'; p = strchr (p, '\0') + 1, i++)
+ {
+ newp = strdup (p);
+ if (i >= envsize)
+ envp = (char **) realloc (envp, (4 + (envsize += 100)) *
+ sizeof (char *));
+ envp[i] = newp;
+ if (*newp == '=')
+ *newp = '!';
+ char *eq;
+ if ((eq = strchr (newp, '=')) == NULL)
+ eq = strchr (newp, '\0');
+ if (!parent_alive)
+ ucenv (newp, eq);
+ if (strncmp (newp, "TERM=", 5) == 0)
+ sawTERM = 1;
+ if (strncmp (newp, "CYGWIN=", sizeof("CYGWIN=") - 1) == 0)
+ parse_options (newp + sizeof("CYGWIN=") - 1);
+ if (*eq)
+ posify (envp + i, *++eq ? eq : --eq);
+ debug_printf ("%s", envp[i]);
+ }
+
+ if (!sawTERM)
+ envp[i++] = strdup ("TERM=cygwin");
+ envp[i] = NULL;
+ __cygwin_environ = *user_data->envptr = envp;
+ FreeEnvironmentStringsA ((char *) rawenv);
+ parse_options (NULL);
+ MALLOC_CHECK;
+}
+
+/* Function called by qsort to sort environment strings.
+ */
+static int
+env_sort (const void *a, const void *b)
+{
+ const char **p = (const char **) a;
+ const char **q = (const char **) b;
+
+ return strcmp (*p, *q);
+}
+
+/* Create a Windows-style environment block, i.e. a typical character buffer
+ * filled with null terminated strings, terminated by double null characters.
+ * Converts environment variables noted in conv_envvars into win32 form
+ * prior to placing them in the string.
+ */
+char *
+winenv (const char * const *envp)
+{
+ int len, n, tl;
+ const char * const *srcp;
+ const char * *dstp;
+
+ for (n = 0; envp[n]; n++)
+ continue;
+
+ const char *newenvp[n + 1];
+
+ for (tl = 0, srcp = envp, dstp = newenvp; *srcp; srcp++, dstp++)
+ {
+ len = strcspn (*srcp, "=") + 1;
+ win_env *conv;
+
+ if ((conv = getwinenv (*srcp, *srcp + len)))
+ *dstp = conv->native;
+ else
+ *dstp = *srcp;
+ tl += strlen (*dstp) + 1;
+ if ((*dstp)[0] == '!' && isalpha((*dstp)[1]) && (*dstp)[2] == ':' &&
+ (*dstp)[3] == '=')
+ {
+ char *p = (char *) alloca (strlen (*dstp) + 1);
+ strcpy (p, *dstp);
+ *p = '=';
+ *dstp = p;
+ }
+ }
+
+ *dstp = NULL; /* Terminate */
+
+ int envlen = dstp - newenvp;
+ debug_printf ("env count %d, bytes %d", envlen, tl);
+
+ /* Windows programs expect the environment block to be sorted. */
+ qsort (newenvp, envlen, sizeof (char *), env_sort);
+
+ /* Create an environment block suitable for passing to CreateProcess. */
+ char *ptr, *envblock;
+ envblock = (char *) malloc (tl + 2);
+ for (srcp = newenvp, ptr = envblock; *srcp; srcp++)
+ {
+ len = strlen (*srcp);
+ memcpy (ptr, *srcp, len + 1);
+ ptr += len + 1;
+ }
+ *ptr = '\0'; /* Two null bytes at the end */
+
+ return envblock;
+}
diff --git a/winsup/cygwin/errno.cc b/winsup/cygwin/errno.cc
new file mode 100644
index 000000000..40e161654
--- /dev/null
+++ b/winsup/cygwin/errno.cc
@@ -0,0 +1,669 @@
+/* errno.cc: errno-related functions
+
+ Copyright 1996, 1997, 1998, 1999 Cygnus Solutions.
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#define _REENT_ONLY
+#include <stdio.h>
+#include "winsup.h"
+#include <errno.h>
+
+/* Table to map Windows error codes to Errno values. */
+/* FIXME: Doing things this way is a little slow. It's trivial to change
+ this into a big case statement if necessary. Left as is for now. */
+
+#define X(w, e) {ERROR_##w, #w, e}
+
+static const struct
+ {
+ int w; /* windows version of error */
+ const char *s; /* text of windows version */
+ int e; /* errno version of error */
+ }
+errmap[] =
+{
+ /* FIXME: Some of these choices are arbitrary! */
+ X (INVALID_FUNCTION, EBADRQC),
+ X (FILE_NOT_FOUND, ENOENT),
+ X (PATH_NOT_FOUND, ENOENT),
+ X (TOO_MANY_OPEN_FILES, EMFILE),
+ X (ACCESS_DENIED, EACCES),
+ X (INVALID_HANDLE, EBADF),
+ X (NOT_ENOUGH_MEMORY, ENOMEM),
+ X (INVALID_DATA, EINVAL),
+ X (OUTOFMEMORY, ENOMEM),
+ X (INVALID_DRIVE, ENODEV),
+ X (NOT_SAME_DEVICE, EXDEV),
+ X (NO_MORE_FILES, ENMFILE),
+ X (WRITE_PROTECT, EROFS),
+ X (BAD_UNIT, ENODEV),
+ X (SHARING_VIOLATION, EACCES),
+ X (LOCK_VIOLATION, EACCES),
+ X (SHARING_BUFFER_EXCEEDED, ENOLCK),
+ X (HANDLE_EOF, ENODATA),
+ X (HANDLE_DISK_FULL, ENOSPC),
+ X (NOT_SUPPORTED, ENOSYS),
+ X (REM_NOT_LIST, ENONET),
+ X (DUP_NAME, ENOTUNIQ),
+ X (BAD_NETPATH, ENXIO),
+ X (FILE_EXISTS, EEXIST),
+ X (CANNOT_MAKE, EPERM),
+ X (INVALID_PARAMETER, EINVAL),
+ X (NO_PROC_SLOTS, EAGAIN),
+ X (BROKEN_PIPE, EPIPE),
+ X (OPEN_FAILED, EIO),
+ X (NO_MORE_SEARCH_HANDLES, ENFILE),
+ X (CALL_NOT_IMPLEMENTED, ENOSYS),
+ X (INVALID_NAME, ENOENT),
+ X (WAIT_NO_CHILDREN, ECHILD),
+ X (CHILD_NOT_COMPLETE, EBUSY),
+ X (DIR_NOT_EMPTY, ENOTEMPTY),
+ X (SIGNAL_REFUSED, EIO),
+ X (BAD_PATHNAME, EINVAL),
+ X (SIGNAL_PENDING, EBUSY),
+ X (MAX_THRDS_REACHED, EAGAIN),
+ X (BUSY, EBUSY),
+ X (ALREADY_EXISTS, EEXIST),
+ X (NO_SIGNAL_SENT, EIO),
+ X (FILENAME_EXCED_RANGE, EINVAL),
+ X (META_EXPANSION_TOO_LONG, EINVAL),
+ X (INVALID_SIGNAL_NUMBER, EINVAL),
+ X (THREAD_1_INACTIVE, EINVAL),
+ X (BAD_PIPE, EINVAL),
+ X (PIPE_BUSY, EBUSY),
+ X (NO_DATA, EPIPE),
+ X (PIPE_NOT_CONNECTED, ECOMM),
+ X (MORE_DATA, EAGAIN),
+ X (DIRECTORY, EISDIR),
+ X (PIPE_CONNECTED, EBUSY),
+ X (PIPE_LISTENING, ECOMM),
+ X (NO_TOKEN, EINVAL),
+ X (PROCESS_ABORTED, EFAULT),
+ X (BAD_DEVICE, ENODEV),
+ X (BAD_USERNAME, EINVAL),
+ X (NOT_CONNECTED, ENOLINK),
+ X (OPEN_FILES, EAGAIN),
+ X (ACTIVE_CONNECTIONS, EAGAIN),
+ X (DEVICE_IN_USE, EAGAIN),
+ X (INVALID_AT_INTERRUPT_TIME, EINTR),
+ X (IO_DEVICE, EIO),
+ X (NOT_OWNER, EPERM),
+ X (END_OF_MEDIA, ENOSPC),
+ X (EOM_OVERFLOW, ENOSPC),
+ X (BEGINNING_OF_MEDIA, ESPIPE),
+ X (SETMARK_DETECTED, ESPIPE),
+ X (NO_DATA_DETECTED, ENOSPC),
+ X (POSSIBLE_DEADLOCK, EDEADLOCK),
+ X (CRC, EIO),
+ X (NEGATIVE_SEEK, EINVAL),
+ X (NOT_READY, ENOMEDIUM),
+ X (DISK_FULL, ENOSPC),
+ { 0, NULL, 0}
+};
+
+/* seterrno_from_win_error: Given a Windows error code, set errno
+ as appropriate. */
+void
+seterrno_from_win_error (const char *file, int line, int code)
+{
+ int i;
+
+ for (i = 0; errmap[i].w != 0; ++i)
+ if (code == errmap[i].w)
+ break;
+
+ if (errmap[i].w != 0)
+ {
+ if (strace_active)
+ strace_printf (_STRACE_SYSCALL, "%s:%d seterrno: %d (%s) -> %d",
+ file, line, code, errmap[i].s, errmap[i].e);
+ set_errno (errmap[i].e);
+ }
+ else
+ {
+ if (strace_active)
+ strace_printf (_STRACE_SYSCALL, "%s:%d seterrno: unknown error %d", file, line, code);
+ set_errno (EACCES);
+ }
+}
+
+/* seterrno: Set `errno' based on GetLastError (). */
+void
+seterrno (const char *file, int line)
+{
+ seterrno_from_win_error (file, line, GetLastError ());
+}
+
+extern char *_user_strerror _PARAMS ((int));
+
+extern const char __declspec(dllexport) * const _sys_errlist[]=
+{
+/* NOERROR 0 */ "No error",
+/* EPERM 1 */ "Not super-user",
+/* ENOENT 2 */ "No such file or directory",
+/* ESRCH 3 */ "No such process",
+/* EINTR 4 */ "Interrupted system call",
+/* EIO 5 */ "I/O error",
+/* ENXIO 6 */ "No such device or address",
+/* E2BIG 7 */ "Arg list too long",
+/* ENOEXEC 8 */ "Exec format error",
+/* EBADF 9 */ "Bad file number",
+/* ECHILD 10 */ "No children",
+/* EAGAIN 11 */ "Resource temporarily unavailable",
+/* ENOMEM 12 */ "Not enough core",
+/* EACCES 13 */ "Permission denied",
+/* EFAULT 14 */ "Bad address",
+/* ENOTBLK 15 */ "Block device required",
+/* EBUSY 16 */ "Mount device busy",
+/* EEXIST 17 */ "File exists",
+/* EXDEV 18 */ "Cross-device link",
+/* ENODEV 19 */ "No such device",
+/* ENOTDIR 20 */ "Not a directory",
+/* EISDIR 21 */ "Is a directory",
+/* EINVAL 22 */ "Invalid argument",
+/* ENFILE 23 */ "Too many open files in system",
+/* EMFILE 24 */ "Too many open files",
+/* ENOTTY 25 */ "Not a typewriter",
+/* ETXTBSY 26 */ "Text file busy",
+/* EFBIG 27 */ "File too large",
+/* ENOSPC 28 */ "No space left on device",
+/* ESPIPE 29 */ "Illegal seek",
+/* EROFS 30 */ "Read only file system",
+/* EMLINK 31 */ "Too many links",
+/* EPIPE 32 */ "Broken pipe",
+/* EDOM 33 */ "Math arg out of domain of func",
+/* ERANGE 34 */ "Math result not representable",
+/* ENOMSG 35 */ "No message of desired type",
+/* EIDRM 36 */ "Identifier removed",
+/* ECHRNG 37 */ "Channel number out of range",
+/* EL2NSYNC 38 */ "Level 2 not synchronized",
+/* EL3HLT 39 */ "Level 3 halted",
+/* EL3RST 40 */ "Level 3 reset",
+/* ELNRNG 41 */ "Link number out of range",
+/* EUNATCH 42 */ "Protocol driver not attached",
+/* ENOCSI 43 */ "No CSI structure available",
+/* EL2HLT 44 */ "Level 2 halted",
+/* EDEADLK 45 */ "Deadlock condition",
+/* ENOLCK 46 */ "No record locks available",
+ "47",
+ "48",
+ "49",
+/* EBADE 50 */ "Invalid exchange",
+/* EBADR 51 */ "Invalid request descriptor",
+/* EXFULL 52 */ "Exchange full",
+/* ENOANO 53 */ "No anode",
+/* EBADRQC 54 */ "Invalid request code",
+/* EBADSLT 55 */ "Invalid slot",
+/* EDEADLOCK 56 */ "File locking deadlock error",
+/* EBFONT 57 */ "Bad font file fmt",
+ "58",
+ "59",
+/* ENOSTR 60 */ "Device not a stream",
+/* ENODATA 61 */ "No data (for no delay io)",
+/* ETIME 62 */ "Timer expired",
+/* ENOSR 63 */ "Out of streams resources",
+/* ENONET 64 */ "Machine is not on the network",
+/* ENOPKG 65 */ "Package not installed",
+/* EREMOTE 66 */ "The object is remote",
+/* ENOLINK 67 */ "The link has been severed",
+/* EADV 68 */ "Advertise error",
+/* ESRMNT 69 */ "Srmount error",
+/* ECOMM 70 */ "Communication error on send",
+/* EPROTO 71 */ "Protocol error",
+ "72",
+ "73",
+/* EMULTIHOP 74 */ "Multihop attempted",
+/* ELBIN 75 */ "Inode is remote (not really error)",
+/* EDOTDOT 76 */ "Cross mount point (not really error)",
+/* EBADMSG 77 */ "Trying to read unreadable message",
+ "78",
+ "79",
+/* ENOTUNIQ 80 */ "Given log. name not unique",
+/* EBADFD 81 */ "f.d. invalid for this operation",
+/* EREMCHG 82 */ "Remote address changed",
+/* ELIBACC 83 */ "Can't access a needed shared lib",
+/* ELIBBAD 84 */ "Accessing a corrupted shared lib",
+/* ELIBSCN 85 */ ".lib section in a.out corrupted",
+/* ELIBMAX 86 */ "Attempting to link in too many libs",
+/* ELIBEXEC 87 */ "Attempting to exec a shared library",
+/* ENOSYS 88 */ "Function not implemented",
+/* ENMFILE 89 */ "No more files",
+/* ENOTEMPTY 90 */ "Directory not empty",
+/* ENAMETOOLONG 91 */ "File or path name too long",
+/* ELOOP 92 */ "Too many symbolic links",
+ "93",
+ "94",
+/* EOPNOTSUPP 95 */ "Operation not supported on transport endpoint",
+/* EPFNOSUPPORT 96 */ "Protocol family not supported",
+ "97",
+ "98",
+ "99",
+ "100",
+ "101",
+ "102",
+ "103",
+/* ECONNRESET 104 */ "Connection reset by peer",
+/* ENOBUFS 105 */ "No buffer space available",
+/* EAFNOSUPPORT 106 */ "Address family not supported by protocol",
+/* EPROTOTYPE 107 */ "Protocol wrong type for transport endpoint",
+/* ENOTSOCK 108 */ "Socket operation on non-socket"
+/* ENOPROTOOPT 109 */ "Protocol not available",
+/* ESHUTDOWN 110 */ "Cannot send after transport endpoint shutdown",
+/* ECONNREFUSED 111 */ "Connection refused",
+/* EADDRINUSE 112 */ "Address already in use"
+/* ECONNABORTED 113 */ "Connection aborted",
+/* ENETUNREACH 114 */ "Network is unreachable",
+/* ENETDOWN 115 */ "Network is down",
+/* ETIMEDOUT 116 */ "Connection timed out",
+/* EHOSTDOWN 117 */ "Host is down",
+/* EHOSTUNREACH 118 */ "No route to host",
+/* EINPROGRESS 119 */ "Operation now in progress",
+/* EALREADY 120 */ "Operation already in progress",
+/* EDESTADDRREQ 121 */ "Destination address required",
+/* EMSGSIZE 122 */ "Message too long",
+/* EPROTONOSUPPORT 123 */ "Protocol not supported",
+/* ESOCKTNOSUPPORT 124 */ "Socket type not supported",
+/* EADDRNOTAVAIL 125 */ "Cannot assign requested address",
+/* ENETRESET 126 */ "Network dropped connection because of reset",
+/* EISCONN 127 */ "Transport endpoint is already connected",
+/* ENOTCONN 128 */ "Transport endpoint is not connected",
+/* ETOOMANYREFS 129 */ "Too many references: cannot splice",
+/* EPROCLIM 130 */ "Process limit exceeded",
+/* EUSERS 131 */ "Too many users",
+/* EDQUOT 132 */ "Quota exceeded",
+/* ESTALE 133 */ "Stale NFS file handle",
+/* ENOTSUP 134 */ "134",
+/* ENOMEDIUM 135 */ "no medium"
+};
+
+int __declspec(dllexport) _sys_nerr =
+ sizeof (_sys_errlist) / sizeof (_sys_errlist[0]);
+
+/* FIXME: Why is strerror() a long switch and not just:
+ return sys_errlist[errnum];
+ (or moral equivalent).
+ Some entries in sys_errlist[] don't match the corresponding
+ entries in strerror(). This seems odd.
+*/
+
+/* CYGWIN internal */
+/* strerror: convert from errno values to error strings */
+extern "C" char *
+strerror (int errnum)
+{
+ const char *error;
+ switch (errnum)
+ {
+ case EPERM:
+ error = "Not owner";
+ break;
+ case ENOENT:
+ error = "No such file or directory";
+ break;
+ case ESRCH:
+ error = "No such process";
+ break;
+ case EINTR:
+ error = "Interrupted system call";
+ break;
+ case EIO:
+ error = "I/O error";
+ break;
+ case ENXIO:
+ error = "No such device or address";
+ break;
+ case E2BIG:
+ error = "Arg list too long";
+ break;
+ case ENOEXEC:
+ error = "Exec format error";
+ break;
+ case EBADF:
+ error = "Bad file number";
+ break;
+ case ECHILD:
+ error = "No children";
+ break;
+ case EAGAIN:
+ error = "No more processes";
+ break;
+ case ENOMEM:
+ error = "Not enough memory";
+ break;
+ case EACCES:
+ error = "Permission denied";
+ break;
+ case EFAULT:
+ error = "Bad address";
+ break;
+ case ENOTBLK:
+ error = "Block device required";
+ break;
+ case EBUSY:
+ error = "Device or resource busy";
+ break;
+ case EEXIST:
+ error = "File exists";
+ break;
+ case EXDEV:
+ error = "Cross-device link";
+ break;
+ case ENODEV:
+ error = "No such device";
+ break;
+ case ENOTDIR:
+ error = "Not a directory";
+ break;
+ case EISDIR:
+ error = "Is a directory";
+ break;
+ case EINVAL:
+ error = "Invalid argument";
+ break;
+ case ENFILE:
+ error = "Too many open files in system";
+ break;
+ case EMFILE:
+ error = "Too many open files";
+ break;
+ case ENOTTY:
+ error = "Not a character device";
+ break;
+ case ETXTBSY:
+ error = "Text file busy";
+ break;
+ case EFBIG:
+ error = "File too large";
+ break;
+ case ENOSPC:
+ error = "No space left on device";
+ break;
+ case ESPIPE:
+ error = "Illegal seek";
+ break;
+ case EROFS:
+ error = "Read-only file system";
+ break;
+ case EMLINK:
+ error = "Too many links";
+ break;
+ case EPIPE:
+ error = "Broken pipe";
+ break;
+ case EDOM:
+ error = "Math arg out of domain of func";
+ break;
+ case ERANGE:
+ error = "Math result out of range";
+ break;
+ case ENOMSG:
+ error = "No message of desired type";
+ break;
+ case EIDRM:
+ error = "Identifier removed";
+ break;
+ case ECHRNG:
+ error = "Channel number out of range";
+ break;
+ case EL2NSYNC:
+ error = "Level 2 not synchronized";
+ break;
+ case EL3HLT:
+ error = "Level 3 halted";
+ break;
+ case EL3RST:
+ error = "Level 3 reset";
+ break;
+ case ELNRNG:
+ error = "Link number out of range";
+ break;
+ case EUNATCH:
+ error = "Protocol driver not attached";
+ break;
+ case ENOCSI:
+ error = "No CSI structure available";
+ break;
+ case EL2HLT:
+ error = "Level 2 halted";
+ break;
+ case EDEADLK:
+ error = "Deadlock condition";
+ break;
+ case ENOLCK:
+ error = "No lock";
+ break;
+ case EBADE:
+ error = "Invalid exchange";
+ break;
+ case EBADR:
+ error = "Invalid request descriptor";
+ break;
+ case EXFULL:
+ error = "Exchange full";
+ break;
+ case ENOANO:
+ error = "No anode";
+ break;
+ case EBADRQC:
+ error = "Invalid request code";
+ break;
+ case EBADSLT:
+ error = "Invalid slot";
+ break;
+ case EDEADLOCK:
+ error = "File locking deadlock error";
+ break;
+ case EBFONT:
+ error = "Bad font file fmt";
+ break;
+ case ENOSTR:
+ error = "Not a stream";
+ break;
+ case ENODATA:
+ error = "No data (for no delay io)";
+ break;
+ case ETIME:
+ error = "Stream ioctl timeout";
+ break;
+ case ENOSR:
+ error = "No stream resources";
+ break;
+ case ENONET:
+ error = "Machine is not on the network";
+ break;
+ case ENOPKG:
+ error = "No package";
+ break;
+ case EREMOTE:
+ error = "Resource is remote";
+ break;
+ case ENOLINK:
+ error = "Virtual circuit is gone";
+ break;
+ case EADV:
+ error = "Advertise error";
+ break;
+ case ESRMNT:
+ error = "Srmount error";
+ break;
+ case ECOMM:
+ error = "Communication error";
+ break;
+ case EPROTO:
+ error = "Protocol error";
+ break;
+ case EMULTIHOP:
+ error = "Multihop attempted";
+ break;
+ case ELBIN:
+ error = "Inode is remote (not really error)";
+ break;
+ case EDOTDOT:
+ error = "Cross mount point (not really error)";
+ break;
+ case EBADMSG:
+ error = "Bad message";
+ break;
+ case ENOTUNIQ:
+ error = "Given log. name not unique";
+ break;
+ case EBADFD:
+ error = "f.d. invalid for this operation";
+ break;
+ case EREMCHG:
+ error = "Remote address changed";
+ break;
+ case ELIBACC:
+ error = "Cannot access a needed shared library";
+ break;
+ case ELIBBAD:
+ error = "Accessing a corrupted shared library";
+ break;
+ case ELIBSCN:
+ error = ".lib section in a.out corrupted";
+ break;
+ case ELIBMAX:
+ error = "Attempting to link in more shared libraries than system limit";
+ break;
+ case ELIBEXEC:
+ error = "Cannot exec a shared library directly";
+ break;
+ case ENOSYS:
+ error = "Function not implemented";
+ break;
+ case ENMFILE:
+ error = "No more files";
+ break;
+ case ENOTEMPTY:
+ error = "Directory not empty";
+ break;
+ case ENAMETOOLONG:
+ error = "File or path name too long";
+ break;
+ case ELOOP:
+ error = "Too many symbolic links";
+ break;
+ case EOPNOTSUPP:
+ error = "Operation not supported on transport endpoint";
+ break;
+ case EPFNOSUPPORT:
+ error = "Protocol family not supported";
+ break;
+ case ECONNRESET:
+ error = "Connection reset by peer";
+ break;
+ case ENOBUFS:
+ error = "No buffer space available; the socket cannot be connected";
+ break;
+ case EAFNOSUPPORT:
+ error = "Addresses in the specified family cannot be used with this socket";
+ break;
+ case EPROTOTYPE:
+ error = "errno EPROTOTYPE triggered";
+ break;
+ case ENOTSOCK:
+ error = "The descriptor is a file, not a socket";
+ break;
+ case ENOPROTOOPT:
+ error = "This option is unsupported";
+ break;
+ case ESHUTDOWN:
+ error = "errno ESHUTDOWN triggered";
+ break;
+ case ECONNREFUSED:
+ error = "Connection refused";
+ break;
+ case EADDRINUSE:
+ error = "Address already in use";
+ break;
+ case ECONNABORTED:
+ error = "The connection was aborted";
+ break;
+ case ENETUNREACH:
+ error ="The network can't be reached from this host at this time";
+ break;
+ case ENETDOWN:
+ error = "Network failed.";
+ break;
+ case ETIMEDOUT:
+ error = "Attempt to connect timed out without establishing a connection";
+ break;
+ case EHOSTDOWN:
+ error = "errno EHOSTDOWN triggered";
+ break;
+ case EHOSTUNREACH:
+ error = "errno EHOSTUNREACH triggered";
+ break;
+ case EINPROGRESS:
+ error = "errno EINPROGRESS triggered";
+ break;
+ case EALREADY:
+ error = "errno EALREADY triggered";
+ break;
+ case EDESTADDRREQ:
+ error = "errno EDESTADDRREQ triggered";
+ break;
+ case EMSGSIZE:
+ error = "errno EMSGSIZE triggered";
+ break;
+
+ case EPROTONOSUPPORT:
+ error = "errno EPROTONOSUPPORT triggered";
+ break;
+ case ESOCKTNOSUPPORT:
+ error = "errno ESOCKTNOSUPPORT triggered";
+ break;
+ case EADDRNOTAVAIL:
+ error = "errno EADDRNOTAVAIL triggered";
+ break;
+ case ENETRESET:
+ error = "errno ENETRESET triggered";
+ break;
+ case EISCONN:
+ error = "The socket is already connected";
+ break;
+ case ENOTCONN:
+ error = "The socket is not connected";
+ break;
+ case ETOOMANYREFS:
+ error = "errno ETOOMANYREFS triggered";
+ break;
+ case EPROCLIM:
+ error = "errno EPROCLIM triggered";
+ break;
+ case EUSERS:
+ error = "errno EUSERS triggered";
+ break;
+ case EDQUOT:
+ error = "errno EDQUOT triggered";
+ break;
+ case ESTALE:
+ error = "errno ESTALE triggered";
+ break;
+ case ENOTSUP:
+ error = "errno ENOTSUP triggered";
+ break;
+ case ENOMEDIUM:
+ error = "no medium";
+ break;
+ default:
+#ifdef _MT_SAFE
+ char *buf= _reent_winsup()->_strerror_buf;
+#else
+ static NO_COPY char buf[20];
+#endif
+ __small_sprintf (buf, "error %d", errnum);
+ error = buf;
+ break;
+ }
+
+ /* FIXME: strerror should really be const in the appropriate newlib
+ include files. */
+ return (char *) error;
+}
+
diff --git a/winsup/cygwin/exceptions.cc b/winsup/cygwin/exceptions.cc
new file mode 100644
index 000000000..fad70f887
--- /dev/null
+++ b/winsup/cygwin/exceptions.cc
@@ -0,0 +1,1066 @@
+/* exceptions.cc
+
+ Copyright 1996, 1997, 1998, 1999, 2000 Cygnus Solutions.
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#include <stdio.h>
+#include <errno.h>
+
+#define Win32_Winsock
+#include "winsup.h"
+#include "exceptions.h"
+#undef DECLSPEC_IMPORT
+#define DECLSPEC_IMPORT
+#include <imagehlp.h>
+#include "autoload.h"
+
+char debugger_command[2 * MAX_PATH + 20];
+
+extern "C" {
+static int handle_exceptions (EXCEPTION_RECORD *, void *, CONTEXT *, void *);
+extern void sigreturn ();
+extern void sigdelayed ();
+extern void siglast ();
+extern DWORD __sigfirst, __siglast;
+};
+
+static BOOL WINAPI ctrl_c_handler (DWORD);
+static void really_exit (int);
+
+/* This is set to indicate that we have already exited. */
+
+static NO_COPY int exit_already = 0;
+static NO_COPY muto *mask_sync = NULL;
+
+HANDLE NO_COPY console_handler_thread_waiter = NULL;
+
+static const struct
+{
+ unsigned int code;
+ const char *name;
+} status_info[] NO_COPY =
+{
+#define X(s) s, #s
+ { X (STATUS_ABANDONED_WAIT_0) },
+ { X (STATUS_ACCESS_VIOLATION) },
+ { X (STATUS_ARRAY_BOUNDS_EXCEEDED) },
+ { X (STATUS_BREAKPOINT) },
+ { X (STATUS_CONTROL_C_EXIT) },
+ { X (STATUS_DATATYPE_MISALIGNMENT) },
+ { X (STATUS_FLOAT_DENORMAL_OPERAND) },
+ { X (STATUS_FLOAT_DIVIDE_BY_ZERO) },
+ { X (STATUS_FLOAT_INEXACT_RESULT) },
+ { X (STATUS_FLOAT_INVALID_OPERATION) },
+ { X (STATUS_FLOAT_OVERFLOW) },
+ { X (STATUS_FLOAT_STACK_CHECK) },
+ { X (STATUS_FLOAT_UNDERFLOW) },
+ { X (STATUS_GUARD_PAGE_VIOLATION) },
+ { X (STATUS_ILLEGAL_INSTRUCTION) },
+ { X (STATUS_INTEGER_DIVIDE_BY_ZERO) },
+ { X (STATUS_INTEGER_OVERFLOW) },
+ { X (STATUS_INVALID_DISPOSITION) },
+ { X (STATUS_IN_PAGE_ERROR) },
+ { X (STATUS_NONCONTINUABLE_EXCEPTION) },
+ { X (STATUS_NO_MEMORY) },
+ { X (STATUS_PENDING) },
+ { X (STATUS_PRIVILEGED_INSTRUCTION) },
+ { X (STATUS_SINGLE_STEP) },
+ { X (STATUS_STACK_OVERFLOW) },
+ { X (STATUS_TIMEOUT) },
+ { X (STATUS_USER_APC) },
+ { X (STATUS_WAIT_0) },
+ { 0, 0 }
+#undef X
+};
+
+/* Initialization code. */
+
+#ifdef __i386__
+
+// Set up the exception handler for the current thread. The PowerPC & Mips
+// use compiler generated tables to set up the exception handlers for each
+// region of code, and the kernel walks the call list until it finds a region
+// of code that handles exceptions. The x86 on the other hand uses segment
+// register fs, offset 0 to point to the current exception handler.
+
+asm (".equ __except_list,0");
+
+extern exception_list *_except_list asm ("%fs:__except_list");
+
+static void
+init_exception_handler (exception_list *el)
+{
+ el->handler = handle_exceptions;
+ el->prev = _except_list;
+ _except_list = el;
+}
+
+#define INIT_EXCEPTION_HANDLER(el) init_exception_handler (el)
+#endif
+
+void
+set_console_handler ()
+{
+ /* Initialize global security attribute stuff */
+
+ sec_none.nLength = sec_none_nih.nLength =
+ sec_all.nLength = sec_all_nih.nLength = sizeof (SECURITY_ATTRIBUTES);
+ sec_none.bInheritHandle = sec_all.bInheritHandle = TRUE;
+ sec_none_nih.bInheritHandle = sec_all_nih.bInheritHandle = FALSE;
+ sec_none.lpSecurityDescriptor = sec_none_nih.lpSecurityDescriptor = NULL;
+ sec_all.lpSecurityDescriptor = sec_all_nih.lpSecurityDescriptor =
+ get_null_sd ();
+
+ /* Allocate the event needed for ctrl_c_handler synchronization with
+ wait_sig. */
+ if (!console_handler_thread_waiter)
+ CreateEvent (&sec_none_nih, TRUE, TRUE, NULL);
+ (void) SetConsoleCtrlHandler (ctrl_c_handler, FALSE);
+ if (!SetConsoleCtrlHandler (ctrl_c_handler, TRUE))
+ system_printf ("SetConsoleCtrlHandler failed, %E");
+}
+
+extern "C" void
+init_exceptions (exception_list *el)
+{
+#ifdef INIT_EXCEPTION_HANDLER
+ INIT_EXCEPTION_HANDLER (el);
+#endif
+}
+
+extern "C" void
+error_start_init (const char *buf)
+{
+ if (!buf || !*buf)
+ {
+ debugger_command[0] = '\0';
+ return;
+ }
+
+ char myself_posix_name[MAX_PATH];
+
+ /* FIXME: gdb cannot use win32 paths, but what if debugger isn't gdb? */
+ cygwin_conv_to_posix_path (myself->progname, myself_posix_name);
+ __small_sprintf (debugger_command, "%s %s", buf, myself_posix_name);
+}
+
+/* Utilities for dumping the stack, etc. */
+
+static void
+exception (EXCEPTION_RECORD *e, CONTEXT *in)
+{
+ const char *exception_name = 0;
+
+ if (e)
+ {
+ for (int i = 0; status_info[i].name; i++)
+ {
+ if (status_info[i].code == e->ExceptionCode)
+ {
+ exception_name = status_info[i].name;
+ break;
+ }
+ }
+ }
+
+#ifdef __i386__
+#define HAVE_STATUS
+ if (exception_name)
+ small_printf ("Exception: %s at eip=%08x\r\n", exception_name, in->Eip);
+ else
+ small_printf ("Exception %d at eip=%08x\r\n", e->ExceptionCode, in->Eip);
+ small_printf ("eax=%08x ebx=%08x ecx=%08x edx=%08x esi=%08x edi=%08x\r\n",
+ in->Eax, in->Ebx, in->Ecx, in->Edx, in->Esi, in->Edi);
+ small_printf ("ebp=%08x esp=%08x program=%s\r\n",
+ in->Ebp, in->Esp, myself->progname);
+ small_printf ("cs=%04x ds=%04x es=%04x fs=%04x gs=%04x ss=%04x\r\n",
+ in->SegCs, in->SegDs, in->SegEs, in->SegFs, in->SegGs, in->SegSs);
+#endif
+
+#ifndef HAVE_STATUS
+ system_printf ("Had an exception");
+#endif
+}
+
+extern "C" {
+static LPVOID __stdcall
+sfta(HANDLE, DWORD)
+{
+ return NULL;
+}
+
+static DWORD __stdcall
+sgmb(HANDLE, DWORD)
+{
+ return 4;
+}
+
+#ifdef __i386__
+/* Print a stack backtrace. */
+
+#define HAVE_STACK_TRACE
+
+/* Set from CYGWIN environment variable if want to use old method. */
+BOOL NO_COPY oldstack = 0;
+
+/* The function used to load the imagehlp DLL. Returns TRUE if the
+ DLL was found. */
+static LoadDLLinitfunc (imagehlp)
+{
+ imagehlp_handle = LoadLibrary ("imagehlp.dll");
+ return !!imagehlp_handle;
+}
+
+LoadDLLinit (imagehlp) /* Set up storage for imagehlp.dll autoload */
+LoadDLLfunc (StackWalk, StackWalk@36, imagehlp)
+
+/* A class for manipulating the stack. */
+class stack_info
+{
+ int first_time; /* True if just starting to iterate. */
+ HANDLE hproc; /* Handle of process to inspect. */
+ HANDLE hthread; /* Handle of thread to inspect. */
+ int (stack_info::*get) (HANDLE, HANDLE); /* Gets the next stack frame */
+public:
+ STACKFRAME sf; /* For storing the stack information */
+ int walk (HANDLE, HANDLE); /* Uses the StackWalk function */
+ int brute_force (HANDLE, HANDLE); /* Uses the "old" method */
+ void init (CONTEXT *); /* Called the first time that stack info is needed */
+
+ /* The constructor remembers hproc and hthread and determines which stack walking
+ method to use */
+ stack_info (int use_old_stack, HANDLE hp, HANDLE ht): hproc(hp), hthread(ht)
+ {
+ if (!use_old_stack && LoadDLLinitnow (imagehlp))
+ get = &stack_info::walk;
+ else
+ get = &stack_info::brute_force;
+ }
+ /* Postfix ++ iterates over the stack, returning zero when nothing is left. */
+ int operator ++(int) { return (this->*get) (hproc, hthread); }
+};
+
+/* The number of parameters used in STACKFRAME */
+#define NPARAMS (sizeof(thestack->sf.Params) / sizeof(thestack->sf.Params[0]))
+
+/* This is the main stack frame info for this process. */
+static stack_info *thestack = NULL;
+static signal_dispatch sigsave;
+
+/* Initialize everything needed to start iterating. */
+void
+stack_info::init (CONTEXT *cx)
+{
+ first_time = 1;
+ memset (&sf, 0, sizeof(sf));
+ sf.AddrPC.Offset = cx->Eip;
+ sf.AddrPC.Mode = AddrModeFlat;
+ sf.AddrStack.Offset = cx->Esp;
+ sf.AddrStack.Mode = AddrModeFlat;
+ sf.AddrFrame.Offset = cx->Ebp;
+ sf.AddrFrame.Mode = AddrModeFlat;
+}
+
+/* Walk the stack by looking at successive stored 'bp' frames.
+ This is not foolproof. */
+int
+stack_info::brute_force (HANDLE, HANDLE)
+{
+ char **ebp;
+ if (first_time)
+ /* Everything is filled out already */
+ ebp = (char **) sf.AddrFrame.Offset;
+ else if ((ebp = (char **) *(char **) sf.AddrFrame.Offset) != NULL)
+ {
+ sf.AddrFrame.Offset = (DWORD) ebp;
+ sf.AddrPC.Offset = sf.AddrReturn.Offset;
+ }
+ else
+ return 0;
+
+ first_time = 0;
+ if (!sf.AddrPC.Offset)
+ return 0; /* stack frames are exhausted */
+
+ /* The return address always follows the stack pointer */
+ sf.AddrReturn.Offset = (DWORD) *++ebp;
+
+ /* The arguments follow the return address */
+ for (unsigned i = 0; i < NPARAMS; i++)
+ sf.Params[i] = (DWORD) *++ebp;
+ return 1;
+}
+
+/* Use Win32 StackWalk() API to display the stack. This is theoretically
+ more foolproof than the brute force method above. */
+int
+stack_info::walk (HANDLE hproc, HANDLE hthread)
+{
+#ifdef SOMEDAY
+ /* It would be nice to get more information (like DLL symbols and module name)
+ for each stack frame but in order to do that we have to call SymInitialize.
+ It doesn't seem to be possible to do this inside of an excaption handler for
+ some reason. */
+ static int initialized = 0;
+ if (!initialized && !SymInitialize(hproc, NULL, TRUE))
+ small_printf("SymInitialize error, %E\n");
+ initialized = 1;
+#endif
+
+ return StackWalk (IMAGE_FILE_MACHINE_I386, hproc, hthread, &sf, NULL, NULL,
+ sfta, sgmb, NULL) && !!sf.AddrFrame.Offset;
+}
+
+/* Dump the stack using either the old method or the new Win32 API method */
+void
+stack (HANDLE hproc, HANDLE hthread, CONTEXT *cx)
+{
+ int i;
+
+ /* Set this up if it's the first time. */
+ if (!thestack)
+ thestack = new stack_info (oldstack, hproc, hthread);
+
+ thestack->init (cx); /* Initialize from the input CONTEXT */
+ small_printf ("Stack trace:\r\nFrame Function Args\r\n");
+ for (i = 0; i < 16 && (*thestack)++ ; i++)
+ {
+ small_printf ("%08x %08x ", thestack->sf.AddrFrame.Offset,
+ thestack->sf.AddrPC.Offset);
+ for (unsigned j = 0; j < NPARAMS; j++)
+ small_printf ("%s%08x", j == 0 ? " (" : ", ", thestack->sf.Params[j]);
+ small_printf (")\r\n");
+ }
+ small_printf ("End of stack trace%s",
+ i == 16 ? " (more stack frames may be present)" : "");
+}
+
+/* Temporary (?) function for external callers to get a stack dump */
+extern "C" void
+cygwin_stackdump()
+{
+ CONTEXT c;
+ c.ContextFlags = CONTEXT_FULL;
+ HANDLE h1 = GetCurrentProcess ();
+ HANDLE h2 = GetCurrentThread ();
+ GetThreadContext (h2, &c);
+ stack(h1, h2, &c);
+}
+
+static int NO_COPY keep_looping = 0;
+
+extern "C" int
+try_to_debug ()
+{
+ debug_printf ("debugger_command %s", debugger_command);
+ if (*debugger_command == '\0')
+ return 0;
+
+ __small_sprintf (strchr (debugger_command, '\0'), " %u", GetCurrentProcessId ());
+
+ BOOL dbg;
+
+ PROCESS_INFORMATION pi = {0};
+
+ STARTUPINFO si = {0};
+ si.lpReserved = NULL;
+ si.lpDesktop = NULL;
+ si.dwFlags = 0;
+ si.cb = sizeof (si);
+
+ /* FIXME: need to know handles of all running threads to
+ suspend_all_threads_except (current_thread_id);
+ */
+
+ /* if any of these mutexes is owned, we will fail to start any cygwin app
+ until trapped app exits */
+
+ ReleaseMutex (pinfo_mutex);
+ ReleaseMutex (title_mutex);
+
+ dbg = CreateProcess (NULL,
+ debugger_command,
+ NULL,
+ NULL,
+ FALSE,
+ CREATE_NEW_CONSOLE | CREATE_NEW_PROCESS_GROUP,
+ NULL,
+ NULL,
+ &si,
+ &pi);
+ if (!dbg)
+ {
+ system_printf ("Failed to start debugger: %E");
+ /* FIXME: need to know handles of all running threads to
+ resume_all_threads_except (current_thread_id);
+ */
+ }
+ else
+ {
+ keep_looping = 1;
+ while (keep_looping)
+ Sleep (10000);
+ }
+
+ return 0;
+}
+
+void
+stackdump (HANDLE hproc, HANDLE hthread, EXCEPTION_RECORD *e, CONTEXT *in)
+{
+ char *p;
+ if (myself->progname[0])
+ {
+ /* write to progname.stackdump if possible */
+ if ((p = strrchr (myself->progname, '\\')))
+ p++;
+ else
+ p = myself->progname;
+ char corefile[strlen(p) + sizeof(".stackdump")];
+ __small_sprintf (corefile, "%s.stackdump", p);
+ HANDLE h = CreateFile (corefile, GENERIC_WRITE, 0, &sec_none_nih,
+ CREATE_ALWAYS, 0, 0);
+ if (h != INVALID_HANDLE_VALUE)
+ {
+ system_printf ("Dumping stack trace to %s", corefile);
+ SetStdHandle (STD_ERROR_HANDLE, h);
+ }
+ }
+ if (e)
+ exception (e, in);
+ stack (hproc, hthread, in);
+}
+
+/* Main exception handler. */
+
+static int
+handle_exceptions (EXCEPTION_RECORD *e, void *arg, CONTEXT *in, void *x)
+{
+ int sig;
+
+ /* If we've already exited, don't do anything here. Returning 1
+ tells Windows to keep looking for an exception handler. */
+ if (exit_already)
+ return 1;
+
+ /* Coerce win32 value to posix value. */
+ switch (e->ExceptionCode)
+ {
+ case STATUS_FLOAT_DENORMAL_OPERAND:
+ case STATUS_FLOAT_DIVIDE_BY_ZERO:
+ case STATUS_FLOAT_INEXACT_RESULT:
+ case STATUS_FLOAT_INVALID_OPERATION:
+ case STATUS_FLOAT_OVERFLOW:
+ case STATUS_FLOAT_STACK_CHECK:
+ case STATUS_FLOAT_UNDERFLOW:
+ case STATUS_INTEGER_DIVIDE_BY_ZERO:
+ case STATUS_INTEGER_OVERFLOW:
+ sig = SIGFPE;
+ break;
+
+ case STATUS_ILLEGAL_INSTRUCTION:
+ case STATUS_PRIVILEGED_INSTRUCTION:
+ case STATUS_NONCONTINUABLE_EXCEPTION:
+ sig = SIGILL;
+ break;
+
+ case STATUS_TIMEOUT:
+ sig = SIGALRM;
+ break;
+
+ case STATUS_ACCESS_VIOLATION:
+ case STATUS_DATATYPE_MISALIGNMENT:
+ case STATUS_ARRAY_BOUNDS_EXCEEDED:
+ case STATUS_GUARD_PAGE_VIOLATION:
+ case STATUS_IN_PAGE_ERROR:
+ case STATUS_NO_MEMORY:
+ case STATUS_INVALID_DISPOSITION:
+ case STATUS_STACK_OVERFLOW:
+ sig = SIGSEGV;
+ break;
+
+ case STATUS_CONTROL_C_EXIT:
+ sig = SIGINT;
+ break;
+
+ case STATUS_INVALID_HANDLE:
+ /* CloseHandle will throw this exception if it is given an
+ invalid handle. We don't care about the exception; we just
+ want CloseHandle to return an error. This can be revisited
+ if gcc ever supports Windows style structured exception
+ handling. */
+ return 0;
+
+ default:
+ /* If we don't recognize the exception, we have to assume that
+ we are doing structured exception handling, and we let
+ something else handle it. */
+ return 1;
+ }
+
+ debug_printf ("In cygwin_except_handler exc %p at %p sp %p", e->ExceptionCode, in->Eip, in->Esp);
+ debug_printf ("In cygwin_except_handler sig = %d at %p", sig, in->Eip);
+
+ if (myself->getsig(sig).sa_mask & SIGTOMASK (sig))
+ syscall_printf ("signal %d, masked %p", sig, myself->getsig(sig).sa_mask);
+
+ if (!myself->progname[0]
+ || (void *) myself->getsig(sig).sa_handler == (void *) SIG_DFL
+ || (void *) myself->getsig(sig).sa_handler == (void *) SIG_IGN
+ || (void *) myself->getsig(sig).sa_handler == (void *) SIG_ERR)
+ {
+ static NO_COPY int traced = 0;
+
+ /* Print the exception to the console */
+ if (e)
+ {
+ for (int i = 0; status_info[i].name; i++)
+ {
+ if (status_info[i].code == e->ExceptionCode)
+ {
+ system_printf ("Exception: %s", status_info[i].name);
+ break;
+ }
+ }
+ }
+
+ /* Another exception could happen while tracing or while exiting.
+ Only do this once. */
+ if (traced++)
+ system_printf ("Error while dumping state (probably corrupted stack)");
+ else
+ {
+ HANDLE hthread;
+ DuplicateHandle (hMainProc, GetCurrentThread (),
+ hMainProc, &hthread, 0, FALSE, DUPLICATE_SAME_ACCESS);
+ stackdump (hMainProc, hthread, e, in);
+ }
+ try_to_debug ();
+ really_exit (EXIT_SIGNAL | sig);
+ }
+
+ debug_printf ("In cygwin_except_handler calling %p",
+ myself->getsig(sig).sa_handler);
+
+ DWORD *bp = (DWORD *)in->Esp;
+ for (DWORD *bpend = bp - 8; bp > bpend; bp--)
+ if (*bp == in->SegCs && bp[-1] == in->Eip)
+ {
+ bp -= 2;
+ break;
+ }
+
+ in->Ebp = (DWORD) bp;
+ sigsave.cx = in;
+ sig_send (NULL, sig); // Signal myself
+ sigsave.cx = NULL;
+ return 0;
+}
+#endif /* __i386__ */
+
+#ifndef HAVE_STACK_TRACE
+void
+stack (void)
+{
+ system_printf ("Stack trace not yet supported on this machine.");
+}
+#endif
+}
+
+/* Utilities to call a user supplied exception handler. */
+
+#define SIG_NONMASKABLE (SIGTOMASK (SIGCONT) | SIGTOMASK (SIGKILL) | SIGTOMASK (SIGSTOP))
+
+#ifdef __i386__
+#define HAVE_CALL_HANDLER
+
+/* Non-raceable sigsuspend
+ * Note: This implementation is based on the Single UNIX Specification
+ * man page. This indicates that sigsuspend always returns -1 and that
+ * attempts to block unblockable signals will be silently ignored.
+ * This is counter to what appears to be documented in some UNIX
+ * man pages, e.g. Linux.
+ */
+int __stdcall
+handle_sigsuspend (sigset_t tempmask)
+{
+ sigset_t oldmask = myself->getsigmask (); // Remember for restoration
+
+ set_process_mask (tempmask & ~SIG_NONMASKABLE);// Let signals we're
+ // interested in through.
+ sigproc_printf ("old mask %x, new mask %x", oldmask, tempmask);
+
+ sig_dispatch_pending (0);
+ WaitForSingleObject (signal_arrived, INFINITE);
+
+ set_sig_errno (EINTR); // Per POSIX
+
+ /* A signal dispatch function will have been added to our stack and will
+ be hit eventually. Set the old mask to be restored when the signal
+ handler returns. */
+
+ sigsave.oldmask = oldmask; // Will be restored by signal handler
+ return -1;
+}
+
+extern DWORD exec_exit; // Possible exit value for exec
+extern int pending_signals;
+
+extern __inline int
+interruptible (DWORD pc)
+{
+ DWORD pchigh = pc & 0xf0000000;
+ return ((pc >= (DWORD) &__sigfirst) && (pc <= (DWORD) &__siglast)) ||
+ !(pchigh == 0xb0000000 || pchigh == 0x70000000 || pchigh == 0x60000000);
+}
+
+void
+interrupt_now (CONTEXT *ctx, int sig, struct sigaction& siga, void *handler)
+{
+ DWORD oldmask = myself->getsigmask ();
+ set_process_mask (myself->getsigmask () | siga.sa_mask | SIGTOMASK (sig));
+
+ DWORD *sp = (DWORD *) ctx->Esp;
+ *(--sp) = ctx->Eip; /* ctxinal IP where program was suspended */
+ *(--sp) = ctx->EFlags;
+ *(--sp) = ctx->Esi;
+ *(--sp) = ctx->Edi;
+ *(--sp) = ctx->Edx;
+ *(--sp) = ctx->Ecx;
+ *(--sp) = ctx->Ebx;
+ *(--sp) = ctx->Eax;
+ *(--sp) = (DWORD)-1; /* no saved errno. */
+ *(--sp) = oldmask;
+ *(--sp) = sig;
+ *(--sp) = (DWORD) sigreturn;
+
+ ctx->Esp = (DWORD) sp;
+ ctx->Eip = (DWORD) handler;
+
+ SetThreadContext (myself->getthread2signal(), ctx); /* Restart the thread */
+}
+
+int
+interrupt_on_return (CONTEXT *ctx, int sig, struct sigaction& siga, void *handler)
+{
+ int i;
+
+ if (sigsave.sig)
+ return 0; /* Already have a signal stacked up */
+
+ /* Set this up if it's the first time. */
+ /* FIXME: Eventually augment to handle more than one thread */
+ if (!thestack)
+ thestack = new stack_info (oldstack, hMainProc, hMainThread);
+
+ thestack->init (ctx); /* Initialize from the input CONTEXT */
+ for (i = 0; i < 32 && (*thestack)++ ; i++)
+ if (interruptible (thestack->sf.AddrReturn.Offset))
+ {
+ DWORD *addr_retaddr = ((DWORD *)thestack->sf.AddrFrame.Offset) + 1;
+ if (*addr_retaddr != thestack->sf.AddrReturn.Offset)
+ break;
+ sigsave.retaddr = *addr_retaddr;
+ *addr_retaddr = (DWORD) sigdelayed;
+ sigsave.oldmask = myself->getsigmask (); // Remember for restoration
+ set_process_mask (myself->getsigmask () | siga.sa_mask | SIGTOMASK (sig));
+ sigsave.func = (void (*)(int)) handler;
+ sigsave.sig = sig;
+ sigsave.saved_errno = -1; // Flag: no errno to save
+ break;
+ }
+
+ return 1;
+}
+
+extern "C" void __stdcall
+set_sig_errno (int e)
+{
+ set_errno (e);
+ sigsave.saved_errno = e;
+}
+
+static int
+call_handler (int sig, struct sigaction& siga, void *handler)
+{
+ CONTEXT *cx, orig;
+ int res;
+
+ if (hExeced != NULL && hExeced != INVALID_HANDLE_VALUE)
+ {
+ SetEvent (signal_arrived); // For an EINTR case
+ sigproc_printf ("armed signal_arrived");
+ exec_exit = sig; // Maybe we'll exit with this value
+ return 1;
+ }
+
+ /* Suspend the running thread, grab its context somewhere safe
+ and run the exception handler in the context of the thread -
+ we have to do that since sometimes they don't return - and if
+ this thread doesn't return, you won't ever get another exception. */
+
+ sigproc_printf ("Suspending %p (mainthread)", myself->getthread2signal());
+ HANDLE hth = myself->getthread2signal ();
+ res = SuspendThread (hth);
+ sigproc_printf ("suspend said %d, %E", res);
+
+ /* Clear any waiting threads prior to dispatching to handler function */
+ proc_subproc(PROC_CLEARWAIT, 0);
+
+ if (sigsave.cx)
+ {
+ cx = sigsave.cx;
+ sigsave.cx = NULL;
+ }
+ else
+ {
+ cx = &orig;
+ /* FIXME - this does not preserve FPU state */
+ orig.ContextFlags = CONTEXT_CONTROL | CONTEXT_INTEGER;
+ if (!GetThreadContext (hth, cx))
+ {
+ system_printf ("couldn't get context of main thread, %E");
+ ResumeThread (hth);
+ goto out;
+ }
+ }
+
+ if (cx == &orig && interruptible (cx->Eip))
+ interrupt_now (cx, sig, siga, handler);
+ else if (!interrupt_on_return (cx, sig, siga, handler))
+ {
+ pending_signals = 1; /* FIXME: Probably need to be more tricky here */
+ sig_set_pending (sig);
+ }
+
+ (void) ResumeThread (hth);
+ (void) SetEvent (signal_arrived); // For an EINTR case
+ sigproc_printf ("armed signal_arrived %p, res %d", signal_arrived, res);
+
+out:
+ sigproc_printf ("returning");
+ return 1;
+}
+#endif /* i386 */
+
+#ifndef HAVE_CALL_HANDLER
+#error "Need to supply machine dependent call_handler"
+#endif
+
+/* Keyboard interrupt handler. */
+static BOOL WINAPI
+ctrl_c_handler (DWORD type)
+{
+ if (type == CTRL_LOGOFF_EVENT)
+ return TRUE;
+
+ /* Wait for sigproc_init to tell us that it's safe to send something.
+ This event will always be in a signalled state when wait_sig is
+ ready to process signals. */
+ (void) WaitForSingleObject (console_handler_thread_waiter, 5000);
+
+ if ((type == CTRL_CLOSE_EVENT) || (type == CTRL_SHUTDOWN_EVENT))
+ /* Return FALSE to prevent an "End task" dialog box from appearing
+ for each Cygwin process window that's open when the computer
+ is shut down or console window is closed. */
+ {
+ sig_send (NULL, SIGHUP);
+ return FALSE;
+ }
+ tty_min *t = cygwin_shared->tty.get_tty(myself->ctty);
+ /* Ignore this if we're not the process group lead since it should be handled
+ *by* the process group leader. */
+ if (t->getpgid () != myself->pid ||
+ (GetTickCount () - t->last_ctrl_c) < MIN_CTRL_C_SLOP)
+ return TRUE;
+ else
+ /* Otherwise we just send a SIGINT to the process group and return TRUE (to indicate
+ that we have handled the signal). At this point, type should be
+ a CTRL_C_EVENT or CTRL_BREAK_EVENT. */
+ {
+ t->last_ctrl_c = GetTickCount ();
+ kill (-myself->pid, SIGINT);
+ t->last_ctrl_c = GetTickCount ();
+ return TRUE;
+ }
+}
+
+/* Set the signal mask for this process.
+ * Note that some signals are unmaskable, as in UNIX.
+ */
+extern "C" void __stdcall
+set_process_mask (sigset_t newmask)
+{
+ mask_sync->acquire (INFINITE);
+ newmask &= ~SIG_NONMASKABLE;
+ sigproc_printf ("old mask = %x, new mask = %x", myself->getsigmask (), newmask);
+ myself->setsigmask (newmask); // Set a new mask
+ mask_sync->release ();
+ return;
+}
+
+extern "C" {
+static void
+sig_handle_tty_stop (int sig)
+{
+#if 0
+ HANDLE waitbuf[2];
+
+ /* Be sure that process's main thread isn't an owner of vital
+ mutex to prevent cygwin subsystem lockups */
+ waitbuf[0] = pinfo_mutex;
+ waitbuf[1] = title_mutex;
+ WaitForMultipleObjects (2, waitbuf, TRUE, INFINITE);
+ ReleaseMutex (pinfo_mutex);
+ ReleaseMutex (title_mutex);
+#endif
+ myself->stopsig = sig;
+ myself->process_state |= PID_STOPPED;
+ /* See if we have a living parent. If so, send it a special signal.
+ * It will figure out exactly which pid has stopped by scanning
+ * its list of subprocesses.
+ */
+ if (my_parent_is_alive ())
+ {
+ pinfo *parent = procinfo(myself->ppid);
+ sig_send (parent, __SIGCHILDSTOPPED);
+ }
+ sigproc_printf ("process %d stopped by signal %d, parent_alive %p",
+ myself->pid, sig, parent_alive);
+ /* There is a small race here with the above two mutexes */
+ SuspendThread (hMainThread);
+ return;
+}
+}
+
+int __stdcall
+sig_handle (int sig)
+{
+ int rc = 0;
+
+ sigproc_printf ("signal %d", sig);
+
+ struct sigaction thissig = myself->getsig(sig);
+ void *handler = (void *) thissig.sa_handler;
+
+ myself->rusage_self.ru_nsignals++;
+
+ /* Clear pending SIGCONT on stop signals */
+ if (sig == SIGSTOP || sig == SIGTSTP || sig == SIGTTIN || sig == SIGTTOU)
+ sig_clear (SIGCONT);
+
+ if (sig == SIGKILL)
+ goto exit_sig;
+
+ if (sig == SIGSTOP)
+ goto stop;
+
+ /* FIXME: Should we still do this if SIGCONT has a handler? */
+ if (sig == SIGCONT)
+ {
+ myself->stopsig = 0;
+ myself->process_state &= ~PID_STOPPED;
+ /* Clear pending stop signals */
+ sig_clear (SIGSTOP);
+ sig_clear (SIGTSTP);
+ sig_clear (SIGTTIN);
+ sig_clear (SIGTTOU);
+ /* Windows 95 hangs on resuming non-suspended thread */
+ SuspendThread (hMainThread);
+ while (ResumeThread (hMainThread) > 1)
+ ;
+ /* process pending signals */
+ sig_dispatch_pending ();
+ }
+
+#if 0
+ char sigmsg[24];
+ __small_sprintf (sigmsg, "cygwin: signal %d\n", sig);
+ OutputDebugString (sigmsg);
+#endif
+
+ if (handler == (void *) SIG_DFL)
+ {
+ if (sig == SIGCHLD || sig == SIGIO || sig == SIGCONT || sig == SIGWINCH)
+ {
+ sigproc_printf ("default signal %d ignored", sig);
+ goto done;
+ }
+
+ if (sig == SIGTSTP || sig == SIGTTIN || sig == SIGTTOU)
+ goto stop;
+
+ goto exit_sig;
+ }
+
+ if (handler == (void *) SIG_IGN)
+ {
+ sigproc_printf ("signal %d ignored", sig);
+ goto done;
+ }
+
+ if (handler == (void *) SIG_ERR)
+ goto exit_sig;
+
+ if ((sig == SIGCHLD) && (thissig.sa_flags & SA_NOCLDSTOP))
+ goto done;
+
+ goto dosig;
+
+stop:
+ handler = (void *) sig_handle_tty_stop;
+
+dosig:
+ /* Dispatch to the appropriate function. */
+ sigproc_printf ("signal %d, about to call %p", sig, thissig.sa_handler);
+ rc = call_handler (sig, thissig, handler);
+
+done:
+ sigproc_printf ("returning %d", rc);
+ return rc;
+
+exit_sig:
+ if (sig == SIGQUIT || sig == SIGABRT)
+ {
+ stackdump (NULL, NULL, NULL, NULL);
+ try_to_debug ();
+ }
+ sigproc_printf ("signal %d, about to call do_exit", sig);
+ TerminateThread (hMainThread, 0);
+ /* FIXME: This just works around the problem so that we don't attempt to
+ use a resource lock when exiting. */
+ user_data->resourcelocks->Delete();
+ user_data->resourcelocks->Init();
+ do_exit (EXIT_SIGNAL | (sig << 8));
+ /* Never returns */
+}
+
+/* Cover function to `do_exit' to handle exiting even in presence of more
+ exceptions. We use to call exit, but a SIGSEGV shouldn't cause atexit
+ routines to run. */
+
+static void
+really_exit (int rc)
+{
+ /* If the exception handler gets a trap, we could recurse awhile.
+ If this is non-zero, skip the cleaning up and exit NOW. */
+
+ if (exit_already++)
+ {
+ /* We are going down - reset our process_state without locking. */
+ myself->record_death (FALSE);
+ ExitProcess (rc);
+ }
+
+ do_exit (rc);
+}
+
+HANDLE NO_COPY pinfo_mutex = NULL;
+HANDLE NO_COPY title_mutex = NULL;
+
+void
+events_init (void)
+{
+ /* pinfo_mutex protects access to process table */
+
+ if (!(pinfo_mutex = CreateMutex (&sec_all_nih, FALSE,
+ shared_name ("pinfo_mutex", 0))))
+ api_fatal ("catastrophic failure - unable to create pinfo_mutex, %E");
+
+ ProtectHandle (pinfo_mutex);
+
+ /* title_mutex protects modification of console title. It's neccessary
+ while finding console window handle */
+
+ if (!(title_mutex = CreateMutex (&sec_all_nih, FALSE,
+ shared_name ("title_mutex", 0))))
+ api_fatal ("can't create title mutex, %E");
+
+ ProtectHandle (title_mutex);
+ mask_sync = new_muto (FALSE, NULL);
+}
+
+void
+events_terminate (void)
+{
+//CloseHandle (pinfo_mutex); // Use implicit close on exit to avoid race
+ ForceCloseHandle (title_mutex);
+ exit_already = 1;
+}
+
+#define pid_offset (unsigned)(((pinfo *)NULL)->pid)
+extern "C" {
+void unused_sig_wrapper()
+{
+/* Signal cleanup stuff. Cleans up stack (too bad that we didn't
+ prototype signal handlers as __stdcall), calls _set_process_mask
+ to restore any mask, restores any potentially clobbered registered
+ and returns to orignal caller. */
+__asm__ volatile ("
+ .text
+___sigfirst:
+ .globl __raise
+__raise:
+ pushl %%ebp
+ movl %%esp,%%ebp
+ movl 8(%%ebp),%%eax
+ pushl %%eax
+ movl $_myself,%%eax
+ pushl %6(%%eax)
+ call __kill
+ mov %%ebp,%%esp
+ popl %%ebp
+ ret
+
+_sigreturn:
+ addl $4,%%esp
+ call _set_process_mask@4
+ popl %%eax # saved errno
+ testl %%eax,%%eax # lt 0
+ jl 1f # yup. ignore it
+ movl %1,%%ebx
+ movl %%eax,(%%ebx)
+1: popl %%eax
+ popl %%ebx
+ popl %%ecx
+ popl %%edx
+ popl %%edi
+ popl %%esi
+ popf
+ ret
+
+_sigdelayed:
+ # addl 4,%%esp
+ cmpl $0,_pending_signals
+ je 2f
+ pushl $0
+ call _sig_dispatch_pending@4
+2: pushl %2 # original return address
+ pushf
+ pushl %%esi
+ pushl %%edi
+ pushl %%edx
+ pushl %%ecx
+ pushl %%ebx
+ pushl %%eax
+ pushl %7 # saved errno
+ pushl %3 # oldmask
+ pushl %4 # signal argument
+ pushl $_sigreturn
+ movl $0,%0
+ pushl $_signal_arrived
+ call _ResetEvent@4
+ jmp *%5
+
+___siglast:
+" : "=m" (sigsave.sig) : "m" (&_impure_ptr->_errno),
+ "g" (sigsave.retaddr), "g" (sigsave.oldmask), "g" (sigsave.sig),
+ "g" (sigsave.func), "o" (pid_offset), "g" (sigsave.saved_errno)
+ );
+}
+}
diff --git a/winsup/cygwin/exec.cc b/winsup/cygwin/exec.cc
new file mode 100644
index 000000000..54d2c9577
--- /dev/null
+++ b/winsup/cygwin/exec.cc
@@ -0,0 +1,204 @@
+/* exec.cc: exec system call support.
+
+ Copyright 1996, 1997, 1998, 2000 Cygnus Solutions.
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#include <unistd.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <ctype.h>
+#include <process.h>
+#include "winsup.h"
+
+/* This is called _execve and not execve because the real execve is defined
+ in libc/posix/execve.c. It calls us. */
+
+extern "C"
+pid_t
+_execve (const char *path, const char *const argv[], const char *const envp[])
+{
+ static char *const empty_env[] = { 0 };
+ MALLOC_CHECK;
+ if (!envp)
+ envp = empty_env;
+ return _spawnve (NULL, _P_OVERLAY, path, argv, envp);
+}
+
+extern "C"
+int
+execl (const char *path, const char *arg0, ...)
+{
+ int i;
+ va_list args;
+ const char *argv[1024];
+
+ va_start (args, arg0);
+ argv[0] = arg0;
+ i = 1;
+ do
+ argv[i] = va_arg (args, const char *);
+ while (argv[i++] != NULL);
+ va_end (args);
+ MALLOC_CHECK;
+ return _execve (path, (char * const *) argv, *user_data->envptr);
+}
+
+extern "C"
+int
+execv (const char *path, char * const *argv)
+{
+ MALLOC_CHECK;
+ return _execve (path, (char * const *) argv, *user_data->envptr);
+}
+
+/* the same as a standard exec() calls family, but with NT security support */
+
+extern "C"
+pid_t
+sexecve (HANDLE hToken, const char *path, const char *const argv[],
+ const char *const envp[])
+{
+ _spawnve (hToken, _P_OVERLAY, path, argv, envp);
+ return -1;
+}
+
+extern "C"
+int
+sexecl (HANDLE hToken, const char *path, const char *arg0, ...)
+{
+ int i;
+ va_list args;
+ const char *argv[1024];
+
+ va_start (args, arg0);
+ argv[0] = arg0;
+ i = 1;
+
+ do
+ argv[i] = va_arg (args, const char *);
+ while (argv[i++] != NULL);
+
+ va_end (args);
+
+ MALLOC_CHECK;
+ return sexecve (hToken, path, (char * const *) argv, *user_data->envptr);
+}
+
+extern "C"
+int
+sexecle (HANDLE hToken, const char *path, const char *arg0, ...)
+{
+ int i;
+ va_list args;
+ const char * const *envp;
+ const char *argv[1024];
+
+ va_start (args, arg0);
+ argv[0] = arg0;
+ i = 1;
+
+ do
+ argv[i] = va_arg (args, const char *);
+ while (argv[i++] != NULL);
+
+ envp = va_arg (args, const char * const *);
+ va_end (args);
+
+ MALLOC_CHECK;
+ return sexecve(hToken, path, (char * const *) argv, (char * const *) envp);
+}
+
+extern "C"
+int
+sexeclp (HANDLE hToken, const char *path, const char *arg0, ...)
+{
+ int i;
+ va_list args;
+ const char *argv[1024];
+
+ va_start (args, arg0);
+ argv[0] = arg0;
+ i = 1;
+
+ do
+ argv[i] = va_arg (args, const char *);
+ while (argv[i++] != NULL);
+
+ va_end (args);
+
+ MALLOC_CHECK;
+ return sexecvpe (hToken, path, (const char * const *) argv,
+ *user_data->envptr);
+}
+
+extern "C"
+int
+sexeclpe (HANDLE hToken, const char *path, const char *arg0, ...)
+{
+ int i;
+ va_list args;
+ const char * const *envp;
+ const char *argv[1024];
+
+ va_start (args, arg0);
+ argv[0] = arg0;
+ i = 1;
+
+ do
+ argv[i] = va_arg (args, const char *);
+ while (argv[i++] != NULL);
+
+ envp = va_arg (args, const char * const *);
+ va_end (args);
+
+ MALLOC_CHECK;
+ return sexecvpe (hToken, path, argv, envp);
+}
+
+extern "C"
+int
+sexecv (HANDLE hToken, const char *path, const char * const *argv)
+{
+ MALLOC_CHECK;
+ return sexecve (hToken, path, argv, *user_data->envptr);
+}
+
+extern "C"
+int
+sexecp (HANDLE hToken, const char *path, const char * const *argv)
+{
+ MALLOC_CHECK;
+ return sexecvpe (hToken, path, argv, *user_data->envptr);
+}
+
+/*
+ * Copy string, until c or <nul> is encountered.
+ * NUL-terminate the destination string (s1).
+ * Return pointer to terminating byte in dst string.
+ */
+
+char * __stdcall
+strccpy (char *s1, const char **s2, char c)
+{
+ while (**s2 && **s2 != c)
+ *s1++ = *((*s2)++);
+ *s1 = 0;
+
+ MALLOC_CHECK;
+ return s1;
+}
+
+extern "C"
+int
+sexecvpe (HANDLE hToken, const char *file, const char * const *argv,
+ const char *const *envp)
+{
+ char buf[MAXNAMLEN];
+ MALLOC_CHECK;
+ return sexecve (hToken, find_exec (file, buf), argv, envp);
+}
diff --git a/winsup/cygwin/external.cc b/winsup/cygwin/external.cc
new file mode 100644
index 000000000..539e0ba7e
--- /dev/null
+++ b/winsup/cygwin/external.cc
@@ -0,0 +1,107 @@
+/* external.cc: Interface to Cygwin internals from external programs.
+
+ Copyright 1997, 1998, 1999 Cygnus Solutions.
+
+ Written by Christopher Faylor <cgf@cygnus.com>
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#include "winsup.h"
+#include "external.h"
+
+static external_pinfo *
+fillout_pinfo (DWORD pid)
+{
+ BOOL nextpid;
+ pinfo *p = NULL;
+ int i;
+ static external_pinfo ep;
+
+ if ((nextpid = !!(pid & CW_NEXTPID)))
+ pid ^= CW_NEXTPID;
+ for (i = 0; i < cygwin_shared->p.size(); i++, p = NULL)
+ {
+ p = cygwin_shared->p.vec + i;
+ if (!pid || (DWORD) p->pid == pid)
+ {
+ if (nextpid && pid)
+ {
+ pid = 0;
+ nextpid = 0;
+ }
+ else if (p->pid && NOTSTATE(p, PID_CLEAR))
+ break;
+ }
+ }
+
+ if (p == NULL)
+ return 0;
+
+ memset (&ep, 0, sizeof ep);
+ ep.ctty = tty_attached (p) ? p->ctty : -1;
+ ep.pid = p->pid;
+ ep.ppid = p->ppid;
+ ep.hProcess = p->hProcess;
+ ep.dwProcessId = p->dwProcessId;
+//ep.dwSpawnedProcessId = p->dwSpawnedProcessId;
+ ep.uid = p->uid;
+ ep.gid = p->gid;
+ ep.pgid = p->pgid;
+ ep.sid = p->sid;
+ ep.umask = p->umask;
+ ep.start_time = p->start_time;
+ ep.rusage_self = p->rusage_self;
+ ep.rusage_children = p->rusage_children;
+ strcpy (ep.progname, p->progname);
+ ep.strace_mask = 0;
+ ep.strace_file = 0;
+
+ ep.process_state = p->process_state;
+ return &ep;
+}
+
+extern "C" DWORD
+cygwin_internal (cygwin_getinfo_types t, ...)
+{
+ va_list arg;
+ va_start (arg, t);
+
+ switch (t)
+ {
+ case CW_LOCK_PINFO:
+ return lock_pinfo_for_update (va_arg (arg, DWORD));
+ break;
+
+ case CW_UNLOCK_PINFO:
+ unlock_pinfo ();
+ return 1;
+
+ case CW_GETTHREADNAME:
+ return (DWORD) threadname (va_arg (arg, DWORD));
+
+ case CW_SETTHREADNAME:
+ {
+ char *name = va_arg (arg, char *);
+ regthread (name, va_arg (arg, DWORD));
+ return 1;
+ }
+
+ case CW_GETPINFO:
+ return (DWORD) fillout_pinfo (va_arg (arg, DWORD));
+
+ case CW_GETVERSIONINFO:
+ return (DWORD) cygwin_version_strings;
+
+ case CW_READ_V1_MOUNT_TABLES:
+ /* Upgrade old v1 registry mounts to new location. */
+ cygwin_shared->mount.import_v1_mounts ();
+ return 0;
+
+ default:
+ return (DWORD) -1;
+ }
+}
diff --git a/winsup/cygwin/external.sgml b/winsup/cygwin/external.sgml
new file mode 100644
index 000000000..a41d34936
--- /dev/null
+++ b/winsup/cygwin/external.sgml
@@ -0,0 +1,16 @@
+
+<sect1 id="func-cygwin-internal">
+<title>cygwin_internal</title>
+
+<funcsynopsis>
+<funcdef>extern "C" DWORD
+<function>cygwin_internal</function></funcdef>
+<paramdef>cygwin_getinfo_types <parameter>t</parameter></paramdef>
+<paramdef><parameter>...</parameter></paramdef>
+</funcsynopsis>
+
+<para>This function gives you access to various internal data and functions.
+Stay away unless you know what you're doing.</para>
+
+</sect1>
+
diff --git a/winsup/cygwin/fcntl.cc b/winsup/cygwin/fcntl.cc
new file mode 100644
index 000000000..a82a10521
--- /dev/null
+++ b/winsup/cygwin/fcntl.cc
@@ -0,0 +1,106 @@
+/* fcntl.cc: fcntl syscall
+
+ Copyright 1996, 1997, 1998 Cygnus Solutions.
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#include <fcntl.h>
+#include <stdarg.h>
+#include <errno.h>
+#include <unistd.h>
+#include "winsup.h"
+
+extern "C"
+int
+_fcntl (int fd, int cmd,...)
+{
+ va_list args;
+ int arg = 0;
+ int res;
+ SetResourceLock(LOCK_FD_LIST,WRITE_LOCK|READ_LOCK, "_fcntl");
+
+ if (dtable.not_open (fd))
+ {
+ set_errno (EBADF);
+ res = -1;
+ goto done;
+ }
+
+ switch (cmd)
+ {
+ case F_DUPFD:
+ va_start (args, cmd);
+ arg = va_arg (args,int);
+ va_end (args);
+ res = dup2 (fd, dtable.find_unused_handle (arg));
+ goto done;
+
+ case F_GETFD:
+ res = dtable[fd]->get_close_on_exec () ? FD_CLOEXEC : 0;
+ goto done;
+
+ case F_SETFD:
+ va_start (args, cmd);
+ arg = va_arg (args, int);
+ va_end (args);
+ dtable[fd]->set_close_on_exec (arg);
+ res = 0;
+ goto done;
+
+ case F_GETFL:
+ {
+ res = dtable[fd]->get_flags ();
+ goto done;
+ }
+ case F_SETFL:
+ {
+ int temp = 0;
+
+ va_start (args, cmd);
+ arg = va_arg (args, int);
+ va_end (args);
+
+ if (arg & O_RDONLY)
+ temp |= GENERIC_READ;
+ if (arg & O_WRONLY)
+ temp |= GENERIC_WRITE;
+
+ syscall_printf ("fcntl (%d, F_SETFL, %d)", arg);
+
+ dtable[fd]->set_access (temp);
+ dtable[fd]->set_flags (arg);
+
+ res = 0;
+ goto done;
+ }
+
+ case F_GETLK:
+ case F_SETLK:
+ case F_SETLKW:
+ {
+ struct flock *fl;
+ va_start (args, cmd);
+ fl = va_arg (args,struct flock *);
+ va_end (args);
+ res = dtable[fd]->lock (cmd, fl);
+ goto done;
+ }
+ default:
+ set_errno (EINVAL);
+ res = -1;
+ goto done;
+ }
+
+ set_errno (ENOSYS);
+ res = -1;
+
+ done:
+ ReleaseResourceLock(LOCK_FD_LIST,WRITE_LOCK|READ_LOCK,"_fcntl");
+
+ syscall_printf ("%d = fcntl (%d, %d, %d)", res, fd, cmd, arg);
+ return res;
+}
diff --git a/winsup/cygwin/fhandler.cc b/winsup/cygwin/fhandler.cc
new file mode 100644
index 000000000..58521d48b
--- /dev/null
+++ b/winsup/cygwin/fhandler.cc
@@ -0,0 +1,1501 @@
+/* fhandler.cc. See console.cc for fhandler_console functions.
+
+ Copyright 1996, 1997, 1998, 1999, 2000 Cygnus Solutions.
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#include <sys/fcntl.h>
+#include <errno.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include "winsup.h"
+
+static NO_COPY const int CHUNK_SIZE = 1024; /* Used for crlf conversions */
+
+static char fhandler_disk_dummy_name[] = "some disk file";
+
+int
+fhandler_base::puts_readahead (const char *s, size_t len = (size_t) -1)
+{
+ int success = 1;
+ while ((((len == (size_t) -1) && *s) || len--) &&
+ (success = put_readahead (*s++) > 0))
+ continue;
+ return success;
+}
+
+int
+fhandler_base::put_readahead (char value)
+{
+ char *newrabuf;
+ if (raixput < rabuflen)
+ /* Nothing to do */;
+ else if ((newrabuf = (char *) realloc (rabuf, rabuflen += 32)))
+ rabuf = newrabuf;
+ else
+ return 0;
+
+ rabuf[raixput++] = value;
+ ralen++;
+ return 1;
+}
+
+int
+fhandler_base::get_readahead ()
+{
+ int chret = -1;
+ if (raixget < ralen)
+ chret = ((unsigned char)rabuf[raixget++]) & 0xff;
+ /* FIXME - not thread safe */
+ if (raixget >= ralen)
+ raixget = raixput = ralen = 0;
+ return chret;
+}
+
+int
+fhandler_base::peek_readahead (int queryput)
+{
+ int chret = -1;
+ if (!queryput && raixget < ralen)
+ chret = ((unsigned char) rabuf[raixget]) & 0xff;
+ else if (queryput && raixput > 0)
+ chret = ((unsigned char) rabuf[raixput - 1]) & 0xff;
+ return chret;
+}
+
+void
+fhandler_base::set_readahead_valid (int val, int ch = -1)
+{
+ if (!val)
+ ralen = raixget = raixput = 0;
+ if (ch != -1)
+ put_readahead(ch);
+}
+
+int
+fhandler_base::eat_readahead (int n)
+{
+ int oralen = ralen;
+ if (n < 0)
+ n = ralen;
+ if (n > 0 && ralen)
+ {
+ if ((ralen -= n) < 0)
+ ralen = 0;
+
+ if (raixget >= ralen)
+ raixget = raixput = ralen = 0;
+ else if (raixput > ralen)
+ raixput = ralen;
+ }
+
+ return oralen;
+}
+
+uid_t __stdcall
+get_file_owner (int use_ntsec, const char *filename)
+{
+ if (use_ntsec && allow_ntsec)
+ {
+ extern LONG ReadSD(const char *, PSECURITY_DESCRIPTOR, LPDWORD);
+ DWORD sd_size = 4096;
+ char psd_buffer[4096];
+ PSECURITY_DESCRIPTOR psd = (PSECURITY_DESCRIPTOR) psd_buffer;
+ PSID psid;
+ BOOL bOwnerDefaulted = TRUE;
+
+ if (ReadSD (filename, psd, &sd_size) <= 0)
+ return getuid();
+
+ if (!GetSecurityDescriptorOwner (psd, &psid, &bOwnerDefaulted))
+ return getuid ();
+
+ return psid ? get_uid_from_sid (psid) : getuid ();
+ }
+
+ return getuid();
+}
+
+gid_t __stdcall
+get_file_group (int use_ntsec, const char *filename)
+{
+ if (use_ntsec && allow_ntsec)
+ {
+ extern LONG ReadSD(const char *, PSECURITY_DESCRIPTOR, LPDWORD);
+ DWORD sd_size = 4096;
+ char psd_buffer[4096];
+ PSECURITY_DESCRIPTOR psd = (PSECURITY_DESCRIPTOR) psd_buffer;
+ PSID psid;
+ BOOL bGroupDefaulted = TRUE;
+
+ if (ReadSD (filename, psd, &sd_size) <= 0)
+ return getgid();
+
+ if (!GetSecurityDescriptorGroup (psd, &psid, &bGroupDefaulted))
+ return getgid ();
+
+ return psid ? get_gid_from_sid (psid) : getuid ();
+ }
+
+ return getgid ();
+}
+
+/**********************************************************************/
+/* fhandler_base */
+
+/* Record the file name.
+ Filenames are used mostly for debugging messages, and it's hoped that
+ in cases where the name is really required, the filename wouldn't ever
+ be too long (e.g. devices or some such).
+*/
+
+void
+fhandler_base::set_name (const char *unix, const char *win32, int unit)
+{
+ if (!no_free_names ())
+ {
+ if (unix_path_name_ != NULL && unix_path_name_ != fhandler_disk_dummy_name)
+ free (unix_path_name_);
+ if (win32_path_name_ != NULL && unix_path_name_ != fhandler_disk_dummy_name)
+ free (win32_path_name_);
+ }
+
+ unix_path_name_ = win32_path_name_ = NULL;
+ if (unix == NULL || !*unix)
+ return;
+
+ unix_path_name_ = strdup (unix);
+ if (unix_path_name_ == NULL)
+ {
+ system_printf ("fatal error. strdup failed");
+ exit (ENOMEM);
+ }
+
+ if (win32)
+ win32_path_name_ = strdup (win32);
+ else
+ {
+ const char *fmt = get_native_name ();
+ win32_path_name_ = (char *) malloc (strlen(fmt) + 16);
+ __small_sprintf (win32_path_name_, fmt, unit);
+ }
+
+ if (win32_path_name_ == NULL)
+ {
+ system_printf ("fatal error. strdup failed");
+ exit (ENOMEM);
+ }
+}
+
+/* Normal file i/o handlers. */
+
+/* Cover function to ReadFile to achieve (as much as possible) Posix style
+ semantics and use of errno. */
+int
+fhandler_base::raw_read (void *ptr, size_t ulen)
+{
+ DWORD bytes_read;
+
+ if (!ReadFile (get_handle(), ptr, ulen, &bytes_read, 0))
+ {
+ int errcode;
+
+ /* Some errors are not really errors. Detect such cases here. */
+
+ errcode = GetLastError ();
+ switch (errcode)
+ {
+ case ERROR_BROKEN_PIPE:
+ /* This is really EOF. */
+ bytes_read = 0;
+ break;
+ case ERROR_MORE_DATA:
+ /* `bytes_read' is supposedly valid. */
+ break;
+ default:
+ syscall_printf ("ReadFile %s failed, %E", unix_path_name_);
+ __seterrno_from_win_error (errcode);
+ return -1;
+ break;
+ }
+ }
+
+ return bytes_read;
+}
+
+int
+fhandler_base::linearize (unsigned char *buf)
+{
+ unsigned char *orig_buf = buf;
+#define cbuf ((char *)buf)
+ strcpy (cbuf, get_name() ?: "");
+ char *p = strcpy (strchr (cbuf, '\0') + 1, get_win32_name ());
+ buf = (unsigned char *)memcpy (strchr (p, '\0') + 1, this, cb);
+ debug_printf ("access_ %p, status %p, io_handle %p, output_handle %p",
+ access_, status, get_io_handle (), get_output_handle ());
+ return (buf + cb) - orig_buf;
+#undef cbuf
+}
+
+int
+fhandler_base::de_linearize (const char *buf, const char *unix_name,
+ const char *win32_name)
+{
+ int thiscb = cb;
+ memcpy(this, buf, cb);
+ unix_path_name_ = win32_path_name_ = NULL;
+ set_name (unix_name, win32_name);
+ debug_printf ("access_ %p, status %p, io_handle %p, output_handle %p",
+ access_, status, get_io_handle (), get_output_handle ());
+ if (thiscb != cb)
+ system_printf ("mismatch in linearize/delinearize %d != %d", thiscb, cb);
+ raixput = raixget = ralen = rabuflen = 0;
+ rabuf = NULL;
+ return cb;
+}
+
+/* Cover function to WriteFile to provide Posix interface and semantics
+ (as much as possible). */
+int
+fhandler_base::raw_write (const void *ptr, size_t len)
+{
+ DWORD bytes_written;
+
+ if (!WriteFile (get_handle(), ptr, len, &bytes_written, 0))
+ {
+ if (GetLastError () == ERROR_DISK_FULL && bytes_written > 0)
+ return bytes_written;
+ __seterrno ();
+ if (get_errno () == EPIPE)
+ raise (SIGPIPE);
+ return -1;
+ }
+ return bytes_written;
+}
+
+/* Open system call handler function.
+ Path is now already checked for symlinks */
+int
+fhandler_base::open (int flags, mode_t mode)
+{
+ int res = 0;
+ HANDLE x;
+ int file_attributes;
+ int shared;
+ int creation_distribution;
+
+ syscall_printf ("(%s, %p)", get_win32_name (), flags);
+
+ set_flags (flags);
+
+ if (get_win32_name () == NULL)
+ {
+ set_errno (ENOENT);
+ goto done;
+ }
+
+ if (get_device () == FH_TAPE)
+ {
+ access_ = GENERIC_READ | GENERIC_WRITE;
+ }
+ else if ((flags & (O_RDONLY | O_WRONLY | O_RDWR)) == O_RDONLY)
+ {
+ access_ = GENERIC_READ;
+ }
+ else if ((flags & (O_RDONLY | O_WRONLY | O_RDWR)) == O_WRONLY)
+ {
+ access_ = GENERIC_WRITE;
+ }
+ else
+ {
+ access_ = GENERIC_READ | GENERIC_WRITE;
+ }
+
+ /* FIXME: O_EXCL handling? */
+
+ if ((flags & O_TRUNC) && ((flags & O_ACCMODE) != O_RDONLY))
+ {
+ if (flags & O_CREAT)
+ {
+ creation_distribution = CREATE_ALWAYS;
+ }
+ else
+ {
+ creation_distribution = TRUNCATE_EXISTING;
+ }
+ }
+ else if (flags & O_CREAT)
+ creation_distribution = OPEN_ALWAYS;
+ else
+ creation_distribution = OPEN_EXISTING;
+
+ if ((flags & O_EXCL) && (flags & O_CREAT))
+ {
+ creation_distribution = CREATE_NEW;
+ }
+
+ if (flags & O_APPEND)
+ set_append_p();
+
+ /* These flags are host dependent. */
+ shared = host_dependent.shared;
+
+ file_attributes = FILE_ATTRIBUTE_NORMAL;
+ if (flags & O_DIROPEN)
+ file_attributes |= FILE_FLAG_BACKUP_SEMANTICS;
+ if (get_device () == FH_SERIAL)
+ file_attributes |= FILE_FLAG_OVERLAPPED;
+
+ x = CreateFileA (get_win32_name (), access_, shared,
+ &sec_none, creation_distribution,
+ file_attributes,
+ 0);
+
+ syscall_printf ("%d = CreateFileA (%s, %p, %p, %p, %p, %p, 0)",
+ x,
+ get_win32_name (), access_, shared,
+ &sec_none, creation_distribution,
+ file_attributes);
+
+ if (x == INVALID_HANDLE_VALUE)
+ {
+ if (GetLastError () == ERROR_INVALID_HANDLE)
+ set_errno (ENOENT);
+ else
+ __seterrno ();
+ goto done;
+ }
+
+ if (flags & O_CREAT && get_device () == FH_DISK)
+ set_file_attribute (has_acls (), get_win32_name (), mode);
+
+ namehash_ = hash_path_name (0, get_win32_name ());
+ set_io_handle (x);
+ rpos_ = 0;
+ rsize_ = -1;
+ int bin;
+ if (flags & (O_BINARY | O_TEXT))
+ bin = flags & O_TEXT ? 0 : O_BINARY;
+ else if (get_device () == FH_DISK)
+ bin = get_w_binary () || get_r_binary ();
+ else
+ bin = (__fmode & O_BINARY) || get_w_binary () || get_r_binary ();
+
+ set_r_binary (bin);
+ set_w_binary (bin);
+ syscall_printf ("filemode set to %s", bin ? "binary" : "text");
+
+ if (get_device () != FH_TAPE
+ && get_device () != FH_FLOPPY
+ && get_device () != FH_SERIAL)
+ {
+ if (flags & O_APPEND)
+ SetFilePointer (get_handle(), 0, 0, FILE_END);
+ else
+ SetFilePointer (get_handle(), 0, 0, FILE_BEGIN);
+ }
+
+ res = 1;
+done:
+ syscall_printf ("%d = fhandler_base::open (%s, %p)", res, get_win32_name (),
+ flags);
+ return res;
+}
+
+/* states:
+ open buffer in binary mode? Just do the read.
+
+ open buffer in text mode? Scan buffer for control zs and handle
+ the first one found. Then scan buffer, converting every \r\n into
+ an \n. If last char is an \r, look ahead one more char, if \n then
+ modify \r, if not, remember char.
+*/
+int
+fhandler_base::read (void *in_ptr, size_t in_len)
+{
+ int len = (int) in_len;
+ char *ctrlzpos;
+ char *ptr = (char *) in_ptr;
+
+ int c;
+ int copied_chars = 0;
+
+ while (len)
+ if ((c = get_readahead ()) < 0)
+ break;
+ else
+ {
+ ptr[copied_chars++] = (unsigned char) (c & 0xff);
+ len--;
+ }
+
+ if (len)
+ {
+ int readlen = raw_read (ptr + copied_chars, len);
+ if (copied_chars == 0)
+ copied_chars = readlen; /* Propagate error or EOF */
+ else if (readlen > 0) /* FIXME: should flag EOF for next read */
+ copied_chars += readlen;
+ }
+
+ if (copied_chars <= 0 || get_r_binary ())
+ return copied_chars;
+
+ /* Scan buffer for a control-z and shorten the buffer to that length */
+
+ ctrlzpos = (char *) memchr ((char *) ptr, 0x1a, copied_chars);
+ if (ctrlzpos)
+ {
+ lseek ((ctrlzpos - ((char *) ptr + copied_chars)), SEEK_CUR);
+ copied_chars = ctrlzpos - (char *) ptr;
+ }
+
+ if (copied_chars == 0)
+ return 0;
+
+ /* Scan buffer and turn \r\n into \n */
+ register char *src= (char *) ptr;
+ register char *dst = (char *) ptr;
+ register char *end = src + copied_chars - 1;
+
+ /* Read up to the last but one char - the last char needs special handling */
+ while (src < end)
+ {
+ *dst = *src++;
+ if (*dst != '\r' || *src != '\n')
+ dst++;
+ }
+
+ c = *src;
+ /* if last char is a '\r' then read one more to see if we should
+ translate this one too */
+ if (c == '\r')
+ {
+ char c1 = 0;
+ len = raw_read (&c1, 1);
+ if (len <= 0)
+ /* nothing */;
+ else if (c1 == '\n')
+ c = '\n';
+ else
+ set_readahead_valid (1, c1);
+ }
+
+ *dst++ = c;
+ copied_chars = dst - (char *) ptr;
+
+ rpos_ += copied_chars;
+
+#ifndef NOSTRACE
+ if (strace_active)
+ {
+ char buf[16 * 6 + 1];
+ char *p = buf;
+
+ for (int i = 0; i < copied_chars && i < 16; ++i)
+ {
+ unsigned char c = ((unsigned char *) ptr)[i];
+ /* >= 33 so space prints in hex */
+ __small_sprintf (p, c >= 33 && c <= 127 ? " %c" : " %p", c);
+ p += strlen (p);
+ }
+ debug_printf ("read %d bytes (%s%s)", copied_chars, buf,
+ copied_chars > 16 ? " ..." : "");
+ }
+#endif
+
+ return copied_chars;
+}
+
+int
+fhandler_base::write (const void *ptr, size_t len)
+{
+ int res;
+
+ if (get_append_p ())
+ SetFilePointer (get_handle(), 0, 0, FILE_END);
+ else if (os_being_run != winNT && get_check_win95_lseek_bug ())
+ {
+ /* Note: this bug doesn't happen on NT4, even though the documentation
+ for WriteFile() says that it *may* happen on any OS. */
+ int actual_length, current_position;
+ set_check_win95_lseek_bug (0); /* don't do it again */
+ actual_length = GetFileSize (get_handle (), NULL);
+ current_position = SetFilePointer (get_handle (), 0, 0, FILE_CURRENT);
+ if (current_position > actual_length)
+ {
+ /* Oops, this is the bug case - Win95 uses whatever is on the disk
+ instead of some known (safe) value, so we must seek back and
+ fill in the gap with zeros. - DJ */
+ char zeros[512];
+ int number_of_zeros_to_write = current_position - actual_length;
+ memset(zeros, 0, 512);
+ SetFilePointer (get_handle (), 0, 0, FILE_END);
+ while (number_of_zeros_to_write > 0)
+ {
+ DWORD zeros_this_time = (number_of_zeros_to_write > 512
+ ? 512 : number_of_zeros_to_write);
+ DWORD written;
+ if (!WriteFile (get_handle (), zeros, zeros_this_time, &written,
+ NULL))
+ {
+ __seterrno ();
+ if (get_errno () == EPIPE)
+ raise (SIGPIPE);
+ /* This might fail, but it's the best we can hope for */
+ SetFilePointer (get_handle (), current_position, 0, FILE_BEGIN);
+ return -1;
+
+ }
+ if (written < zeros_this_time) /* just in case */
+ {
+ set_errno (ENOSPC);
+ /* This might fail, but it's the best we can hope for */
+ SetFilePointer (get_handle (), current_position, 0, FILE_BEGIN);
+ return -1;
+ }
+ number_of_zeros_to_write -= written;
+ }
+ }
+ }
+
+ if (get_w_binary ())
+ {
+ res = raw_write (ptr, len);
+ }
+ else
+ {
+#ifdef NOTDEF
+ /* Keep track of previous \rs, we don't want to turn existing
+ \r\n's into \r\n\n's */
+ register int pr = 0;
+
+ /* Copy things in chunks */
+ char buf[CHUNK_SIZE];
+
+ for (unsigned int i = 0; i < len; i += sizeof (buf) / 2)
+ {
+ register const char *src = (char *)ptr + i;
+ int todo;
+ if ((todo = len - i) > sizeof (buf) / 2)
+ todo = sizeof (buf) / 2;
+ register const char *end = src + todo;
+ register char *dst = buf;
+ while (src < end)
+ {
+ if (*src == '\n' && !pr)
+ {
+ /* Emit a cr lf here */
+ *dst ++ = '\r';
+ *dst ++ = '\n';
+ }
+ else if (*src == '\r')
+ {
+ *dst ++ = '\r';
+ pr = 1;
+ }
+ else
+ {
+ *dst ++ = *src;
+ pr = 0;
+ }
+ src++;
+ }
+ int want = dst - buf;
+ if ((res = raw_write (buf, want)) != want)
+ {
+ if (res == -1)
+ return -1;
+ /* FIXME: */
+ /* Tricky... Didn't write everything we wanted.. How can
+ we work out exactly which chars were sent? We don't...
+ This will only happen in pretty nasty circumstances. */
+ rpos_ += i;
+ return i;
+ }
+ }
+#else
+ /* This is the Microsoft/DJGPP way. Still not ideal, but it's
+ compatible. */
+
+ int left_in_data = len;
+ char *data = (char *)ptr;
+
+ while (left_in_data > 0)
+ {
+ char buf[CHUNK_SIZE], *buf_ptr = buf;
+ int left_in_buf = CHUNK_SIZE;
+
+ while (left_in_buf > 0 && left_in_data > 0)
+ {
+ if (*data == '\n')
+ {
+ if (left_in_buf == 1)
+ {
+ /* Not enough room for \r and \n */
+ break;
+ }
+ *buf_ptr++ = '\r';
+ left_in_buf--;
+ }
+ *buf_ptr++ = *data++;
+ left_in_buf--;
+ left_in_data--;
+ }
+
+ /* We've got a buffer-full, or we're out of data. Write it out */
+ int want = buf_ptr - buf;
+ if ((res = raw_write (buf, want)) != want)
+ {
+ if (res == -1)
+ return -1;
+ /* FIXME: */
+ /* Tricky... Didn't write everything we wanted.. How can
+ we work out exactly which chars were sent? We don't...
+ This will only happen in pretty nasty circumstances. */
+ int i = (len-left_in_data) - left_in_buf;
+ rpos_ += i;
+ /* just in case the math is off, guarantee it looks like
+ a disk full error */
+ if (i >= (int)len)
+ i = len-1;
+ if (i < 0)
+ i = 0;
+ return i;
+ }
+ }
+#endif
+
+ /* Done everything, update by the chars that the user sent */
+ rpos_ += len;
+ /* Length of file has changed */
+ rsize_ = -1;
+ res = len;
+ debug_printf ("after write, name %s, rpos %d", unix_path_name_, rpos_);
+ }
+ return res;
+}
+
+off_t
+fhandler_base::lseek (off_t offset, int whence)
+{
+ off_t res;
+
+ /* Seeks on text files is tough, we rewind and read till we get to the
+ right place. */
+
+ if (whence != SEEK_CUR || offset != 0)
+ {
+ if (whence == SEEK_CUR)
+ offset -= ralen - raixget;
+ set_readahead_valid (0);
+ }
+
+ debug_printf ("lseek (%s, %d, %d)", unix_path_name_, offset, whence);
+
+#if 0 /* lseek has no business messing about with text-mode stuff */
+
+ if (!get_r_binary ())
+ {
+ int newplace;
+
+ if (whence == 0)
+ {
+ newplace = offset;
+ }
+ else if (whence ==1)
+ {
+ newplace = rpos + offset;
+ }
+ else
+ {
+ /* Seek from the end of a file.. */
+ if (rsize == -1)
+ {
+ /* Find the size of the file by reading till the end */
+
+ char b[CHUNK_SIZE];
+ while (read (b, sizeof (b)) > 0)
+ ;
+ rsize = rpos;
+ }
+ newplace = rsize + offset;
+ }
+
+ if (rpos > newplace)
+ {
+ SetFilePointer (handle, 0, 0, 0);
+ rpos = 0;
+ }
+
+ /* You can never shrink something more than 50% by turning CRLF into LF,
+ so we binary chop looking for the right place */
+
+ while (rpos < newplace)
+ {
+ char b[CHUNK_SIZE];
+ size_t span = (newplace - rpos) / 2;
+ if (span == 0)
+ span = 1;
+ if (span > sizeof (b))
+ span = sizeof (b);
+
+ debug_printf ("lseek (%s, %d, %d) span %d, rpos %d newplace %d",
+ name, offset, whence,span,rpos, newplace);
+ read (b, span);
+ }
+
+ debug_printf ("Returning %d", newplace);
+ return newplace;
+ }
+#endif /* end of deleted code dealing with text mode */
+
+ DWORD win32_whence = whence == SEEK_SET ? FILE_BEGIN
+ : (whence == SEEK_CUR ? FILE_CURRENT : FILE_END);
+
+ res = SetFilePointer (get_handle(), offset, 0, win32_whence);
+ if (res == -1)
+ {
+ __seterrno ();
+ }
+ else
+ {
+ /* When next we write(), we will check to see if *this* seek went beyond
+ the end of the file, and back-seek and fill with zeros if so - DJ */
+ set_check_win95_lseek_bug ();
+
+ /* If this was a SEEK_CUR with offset 0, we still might have
+ readahead that we have to take into account when calculating
+ the actual position for the application. */
+ if (whence == SEEK_CUR)
+ res -= ralen - raixget;
+ }
+
+ return res;
+}
+
+int
+fhandler_base::close (void)
+{
+ int res = -1;
+
+ syscall_printf ("handle %p", get_handle());
+ if (CloseHandle (get_handle()))
+ res = 0;
+ else
+ {
+ paranoid_printf ("CloseHandle (%d <%s>) failed", get_handle(),
+ get_name ());
+
+ __seterrno ();
+ }
+ return res;
+}
+
+int
+fhandler_base::ioctl (unsigned int cmd, void *buf)
+{
+ if (cmd == FIONBIO)
+ syscall_printf ("ioctl (FIONBIO, %p)", buf);
+ else
+ syscall_printf ("ioctl (%x, %p)", cmd, buf);
+
+ set_errno (EINVAL);
+ return -1;
+}
+
+int
+fhandler_base::lock (int, struct flock *)
+{
+ set_errno (ENOSYS);
+ return -1;
+}
+
+int
+fhandler_base::fstat (struct stat *buf)
+{
+ return stat_dev (get_device (), get_unit (), get_namehash (), buf);
+ return 0;
+}
+
+extern "C" char * __stdcall
+rootdir(char *full_path)
+{
+ /* Possible choices:
+ * d:... -> d:/
+ * \\server\share... -> \\server\share\
+ * else current drive.
+ */
+ char *root=full_path;
+
+ if (full_path[1] == ':')
+ strcpy (full_path + 2, "\\");
+ else if (full_path[0] == '\\' && full_path[1] == '\\')
+ {
+ char *cp = full_path + 2;
+ while (*cp && *cp != '\\')
+ cp++;
+ if (!*cp)
+ {
+ set_errno (ENOTDIR);
+ return NULL;
+ }
+ cp++;
+ while (*cp && *cp != '\\')
+ cp++;
+ strcpy (cp, "\\");
+ }
+ else
+ root = NULL;
+
+ return root;
+}
+
+int
+fhandler_disk_file::fstat (struct stat *buf)
+{
+ int res = 0; // avoid a compiler warning
+ BY_HANDLE_FILE_INFORMATION local;
+ int old_errno = get_errno ();
+
+ memset (buf, 0, sizeof (*buf));
+
+ if (is_device ())
+ return stat_dev (get_device (), get_unit (), get_namehash (), buf);
+
+ /* NT 3.51 seems to have a bug when attempting to get vol serial
+ numbers. This loop gets around this. */
+ for (int i = 0; i < 2; i++)
+ {
+ if (!(res = GetFileInformationByHandle (get_handle (), &local)))
+ break;
+ if (local.dwVolumeSerialNumber && (long) local.dwVolumeSerialNumber != -1)
+ break;
+ }
+ debug_printf ("%d = GetFileInformationByHandle (%s, %d)",
+ res, get_win32_name (), get_handle ());
+ if (res == 0)
+ {
+ /* GetFileInformationByHandle will fail if it's given stdin/out/err
+ or a pipe*/
+ DWORD lsize, hsize;
+
+ if (GetFileType (get_handle ()) != FILE_TYPE_DISK)
+ buf->st_mode = S_IFCHR;
+
+ lsize = GetFileSize (get_handle (), &hsize);
+ if (lsize == 0xffffffff && GetLastError () != NO_ERROR)
+ buf->st_mode = S_IFCHR;
+ else
+ buf->st_size = lsize;
+ /* We expect these to fail! */
+ buf->st_mode |= STD_RBITS | STD_WBITS;
+ buf->st_blksize = S_BLKSIZE;
+ buf->st_ino = get_namehash ();
+ syscall_printf ("0 = fstat (, %p)", buf);
+ return 0;
+ }
+
+ if (!get_win32_name ())
+ {
+ set_errno (ENOENT);
+ return -1;
+ }
+
+ set_errno (old_errno);
+
+ buf->st_atime = to_time_t (&local.ftLastAccessTime);
+ buf->st_mtime = to_time_t (&local.ftLastWriteTime);
+ buf->st_ctime = to_time_t (&local.ftCreationTime);
+ buf->st_nlink = local.nNumberOfLinks;
+ buf->st_dev = local.dwVolumeSerialNumber;
+ buf->st_size = local.nFileSizeLow;
+
+ /* Allocate some place to determine the root directory. */
+ char root[strlen (get_win32_name ()) + 1];
+ strcpy (root, get_win32_name ());
+
+ /* Assume that if a drive has ACL support it MAY have valid "inodes".
+ It definitely does not have valid inodes if it does not have ACL
+ support. */
+ switch (has_acls () ? GetDriveType (rootdir (root)) : DRIVE_UNKNOWN)
+ {
+ case DRIVE_FIXED:
+ case DRIVE_REMOVABLE:
+ case DRIVE_CDROM:
+ case DRIVE_RAMDISK:
+ /* Although the documentation indicates otherwise, it seems like
+ "inodes" on these devices are persistent, at least across reboots. */
+ buf->st_ino = local.nFileIndexHigh | local.nFileIndexLow;
+ break;
+ default:
+ /* Either the nFileIndex* fields are unreliable or unavailable. Use the
+ next best alternative. */
+ buf->st_ino = get_namehash ();
+ break;
+ }
+
+ buf->st_blksize = S_BLKSIZE;
+ buf->st_blocks = (buf->st_size + S_BLKSIZE-1) / S_BLKSIZE;
+ buf->st_uid = get_file_owner (has_acls (), get_win32_name ());
+ buf->st_gid = get_file_group (has_acls (), get_win32_name ());
+
+ /* Using a side effect: get_file_attibutes checks for
+ directory. This is used, to set S_ISVTX, if needed. */
+ if (local.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
+ buf->st_mode |= S_IFDIR;
+ if (! get_file_attribute (has_acls (), get_win32_name (), &buf->st_mode))
+ {
+ buf->st_mode &= ~S_IFMT;
+ if (get_symlink_p ())
+ buf->st_mode |= S_IFLNK;
+ else if (get_socket_p ())
+ buf->st_mode |= S_IFSOCK;
+ else if (local.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
+ buf->st_mode |= S_IFDIR;
+ else
+ buf->st_mode |= S_IFREG;
+ }
+ else
+ {
+ buf->st_mode = 0;
+ buf->st_mode |= STD_RBITS;
+
+ if (! (local.dwFileAttributes & FILE_ATTRIBUTE_READONLY))
+ buf->st_mode |= STD_WBITS;
+ /* | S_IWGRP | S_IWOTH; we don't give write to group etc */
+
+ if (get_symlink_p ())
+ buf->st_mode |= S_IFLNK;
+ else if (get_socket_p ())
+ buf->st_mode |= S_IFSOCK;
+ else
+ switch (GetFileType (get_handle ()))
+ {
+ case FILE_TYPE_CHAR:
+ case FILE_TYPE_UNKNOWN:
+ buf->st_mode |= S_IFCHR;
+ break;
+ case FILE_TYPE_DISK:
+ if (local.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
+ buf->st_mode |= S_IFDIR | STD_XBITS;
+ else
+ {
+ buf->st_mode |= S_IFREG;
+ if (get_execable_p ())
+ buf->st_mode |= STD_XBITS;
+ }
+ break;
+ case FILE_TYPE_PIPE:
+ buf->st_mode |= S_IFSOCK;
+ break;
+ }
+ }
+
+ syscall_printf ("0 = fstat (, %p) st_atime=%x st_size=%d, st_mode=%p, st_ino=%d, sizeof=%d",
+ buf, buf->st_atime, buf->st_size, buf->st_mode,
+ (int) buf->st_ino, sizeof (*buf));
+
+ return 0;
+}
+
+void
+fhandler_base::init (HANDLE f, DWORD a, mode_t bin)
+{
+ set_io_handle (f);
+ set_r_binary (bin);
+ set_w_binary (bin);
+ access_ = a;
+ a &= GENERIC_READ | GENERIC_WRITE;
+ if (a == GENERIC_READ)
+ set_flags (O_RDONLY);
+ if (a == GENERIC_WRITE)
+ set_flags (O_WRONLY);
+ if (a == (GENERIC_READ | GENERIC_WRITE))
+ set_flags (O_RDWR);
+ debug_printf ("created new fhandler_base for handle %p", f);
+}
+
+void
+fhandler_base::dump (void)
+{
+ paranoid_printf ("here");
+}
+
+void
+fhandler_base::set_io_handle (HANDLE x)
+{
+ debug_printf ("set handle to %p", x);
+ io_handle = x;
+}
+
+int
+fhandler_base::dup (fhandler_base *child)
+{
+ debug_printf ("in fhandler_base dup");
+
+ HANDLE nh;
+ if (!DuplicateHandle (hMainProc, get_handle(), hMainProc, &nh, 0, TRUE,
+ DUPLICATE_SAME_ACCESS))
+ {
+ system_printf ("dup(%s) failed, handle %x, %E",
+ get_name (), get_handle());
+ __seterrno ();
+ return -1;
+ }
+
+ child->set_io_handle (nh);
+ return 0;
+}
+
+/* Base terminal handlers. These just return errors. */
+
+int
+fhandler_base::tcflush (int queue)
+{
+ set_errno (ENOTTY);
+ return -1;
+}
+
+int
+fhandler_base::tcsendbreak (int duration)
+{
+ set_errno (ENOTTY);
+ return -1;
+}
+
+int
+fhandler_base::tcdrain (void)
+{
+ set_errno (ENOTTY);
+ return -1;
+}
+
+int
+fhandler_base::tcflow (int action)
+{
+ set_errno (ENOTTY);
+ return -1;
+}
+
+int
+fhandler_base::tcsetattr (int a, const struct termios *t)
+{
+ set_errno (ENOTTY);
+ return -1;
+}
+
+int
+fhandler_base::tcgetattr (struct termios *t)
+{
+ set_errno (ENOTTY);
+ return -1;
+}
+
+int
+fhandler_base::tcsetpgrp (const pid_t pid)
+{
+ set_errno (ENOTTY);
+ return -1;
+}
+
+int
+fhandler_base::tcgetpgrp (void)
+{
+ set_errno (ENOTTY);
+ return -1;
+}
+
+/* Normal I/O constructor */
+fhandler_base::fhandler_base (DWORD devtype, const char *name, int unit):
+ access_ (0),
+ io_handle (NULL),
+ rpos_ (0),
+ rsize_ (0),
+ namehash_ (0),
+ openflags_ (0),
+ rabuf (NULL),
+ ralen (0),
+ raixget (0),
+ raixput (0),
+ rabuflen (0)
+{
+ status = devtype;
+ int bin = __fmode & O_TEXT ? 0 : 1;
+ if (status != FH_DISK && status != FH_CONSOLE)
+ {
+ if (!get_r_binset ())
+ set_r_binary (bin);
+ if (!get_w_binset ())
+ set_w_binary (bin);
+ }
+ unix_path_name_ = win32_path_name_ = NULL;
+ set_name (name, NULL, unit);
+}
+
+/* Normal I/O destructor */
+fhandler_base::~fhandler_base (void)
+{
+ if (!no_free_names ())
+ {
+ if (unix_path_name_ != NULL && unix_path_name_ != fhandler_disk_dummy_name)
+ free (unix_path_name_);
+ if (win32_path_name_ != NULL && win32_path_name_ != fhandler_disk_dummy_name)
+ free (win32_path_name_);
+ }
+ unix_path_name_ = win32_path_name_ = NULL;
+}
+
+/**********************************************************************/
+/* fhandler_disk_file */
+
+fhandler_disk_file::fhandler_disk_file (const char *name) :
+ fhandler_base (FH_DISK, name)
+{
+ set_cb (sizeof *this);
+ set_no_free_names ();
+ unix_path_name_ = win32_path_name_ = fhandler_disk_dummy_name;
+}
+
+int
+fhandler_disk_file::open (const char *path, int flags, mode_t mode)
+{
+ syscall_printf ("(%s, %p)", path, flags);
+
+ /* O_NOSYMLINK is an internal flag for implementing lstat, nothing more. */
+ path_conv real_path (path, (flags & O_NOSYMLINK) ? SYMLINK_NOFOLLOW:SYMLINK_FOLLOW);
+
+ if (real_path.error &&
+ (flags & O_NOSYMLINK || real_path.error != ENOENT || !(flags & O_CREAT)))
+ {
+ set_errno (real_path.error);
+ syscall_printf ("0 = fhandler_disk_file::open (%s, %p)", path, flags);
+ return 0;
+ }
+
+ set_name (path, real_path.get_win32 ());
+ set_no_free_names (0);
+ return open (real_path, flags, mode);
+}
+
+int
+fhandler_disk_file::open (path_conv& real_path, int flags, mode_t mode)
+{
+ if (get_win32_name () == fhandler_disk_dummy_name)
+ {
+ win32_path_name_ = real_path.get_win32 ();
+ set_no_free_names ();
+ }
+ /* If necessary, do various other things to see if path is a program. */
+ if (!real_path.isexec ())
+ real_path.set_exec (check_execable_p (get_win32_name ()));
+
+ if (real_path.isbinary ())
+ {
+ set_r_binary (1);
+ set_w_binary (1);
+ }
+
+ set_has_acls (real_path.has_acls ());
+
+ int res = this->fhandler_base::open (flags, mode);
+
+ if (!res)
+ goto out;
+
+ extern BOOL allow_ntea;
+
+ if (!real_path.isexec () && !allow_ntea &&
+ GetFileType (get_handle ()) == FILE_TYPE_DISK)
+ {
+ DWORD done;
+ char magic[3];
+ /* FIXME should we use /etc/magic ? */
+ magic[0] = magic[1] = magic[2] = '\0';
+ ReadFile (get_handle (), magic, 3, &done, 0);
+ if ((magic[0] == ':' && magic[1] == '\n') ||
+ (magic[0] == '#' && magic[1] == '!'))
+ real_path.set_exec ();
+ if (!(flags & O_APPEND))
+ SetFilePointer (get_handle(), 0, 0, FILE_BEGIN);
+ }
+
+ if (flags & O_APPEND)
+ SetFilePointer (get_handle(), 0, 0, FILE_END);
+
+ set_symlink_p (real_path.issymlink ());
+ set_execable_p (real_path.isexec ());
+ set_socket_p (real_path.issocket ());
+
+out:
+ syscall_printf ("%d = fhandler_disk_file::open (%s, %p)", res,
+ get_win32_name (), flags);
+ return res;
+}
+
+int
+fhandler_disk_file::close ()
+{
+ int res;
+ if ((res = this->fhandler_base::close ()) == 0)
+ cygwin_shared->delqueue.process_queue ();
+ return res;
+}
+
+/*
+ * FIXME !!!
+ * The correct way to do this to get POSIX locking
+ * semantics is to keep a linked list of posix lock
+ * requests and map them into Win32 locks. The problem
+ * is that Win32 does not deal correctly with overlapping
+ * lock requests. Also another pain is that Win95 doesn't do
+ * non-blocking or non exclusive locks at all. For '95 just
+ * convert all lock requests into blocking,exclusive locks.
+ * This shouldn't break many apps but denying all locking
+ * would.
+ * For now just convert to Win32 locks and hope for the best.
+ */
+
+int
+fhandler_disk_file::lock (int cmd, struct flock *fl)
+{
+ DWORD win32_start;
+ DWORD win32_len;
+ DWORD win32_upper;
+ DWORD startpos;
+
+ /*
+ * We don't do getlck calls yet.
+ */
+
+ if (cmd == F_GETLK)
+ {
+ set_errno (ENOSYS);
+ return -1;
+ }
+
+ /*
+ * Calculate where in the file to start from,
+ * then adjust this by fl->l_start.
+ */
+
+ switch (fl->l_whence)
+ {
+ case SEEK_SET:
+ startpos = 0;
+ break;
+ case SEEK_CUR:
+ if ((startpos = lseek (0, SEEK_CUR)) < 0)
+ return -1;
+ break;
+ case SEEK_END:
+ {
+ BY_HANDLE_FILE_INFORMATION finfo;
+ if (GetFileInformationByHandle (get_handle(), &finfo) == 0)
+ {
+ __seterrno ();
+ return -1;
+ }
+ startpos = finfo.nFileSizeLow; /* Nowhere to keep high word */
+ break;
+ }
+ default:
+ set_errno (EINVAL);
+ return -1;
+ }
+
+ /*
+ * Now the fun starts. Adjust the start and length
+ * fields until they make sense.
+ */
+
+ win32_start = startpos + fl->l_start;
+ if (fl->l_len < 0)
+ {
+ win32_start -= fl->l_len;
+ win32_len = -fl->l_len;
+ }
+ else
+ win32_len = fl->l_len;
+
+ if (win32_start < 0)
+ {
+ win32_len -= win32_start;
+ if (win32_len <= 0)
+ {
+ /* Failure ! */
+ set_errno (EINVAL);
+ return -1;
+ }
+ win32_start = 0;
+ }
+
+ /*
+ * Special case if len == 0 for POSIX means lock
+ * to the end of the entire file (and all future extensions).
+ */
+ if (win32_len == 0)
+ {
+ win32_len = 0xffffffff;
+ win32_upper = host_dependent.win32_upper;
+ }
+ else
+ win32_upper = 0;
+
+ BOOL res;
+
+ if (os_being_run == winNT)
+ {
+ DWORD lock_flags = (cmd == F_SETLK) ? LOCKFILE_FAIL_IMMEDIATELY : 0;
+ lock_flags |= (fl->l_type == F_WRLCK) ? LOCKFILE_EXCLUSIVE_LOCK : 0;
+
+ OVERLAPPED ov;
+
+ ov.Internal = 0;
+ ov.InternalHigh = 0;
+ ov.Offset = win32_start;
+ ov.OffsetHigh = 0;
+ ov.hEvent = (HANDLE) 0;
+
+ if (fl->l_type == F_UNLCK)
+ {
+ res = UnlockFileEx (get_handle (), 0, win32_len, win32_upper, &ov);
+ }
+ else
+ {
+ res = LockFileEx (get_handle (), lock_flags, 0, win32_len,
+ win32_upper, &ov);
+ /* Deal with the fail immediately case. */
+ /*
+ * FIXME !! I think this is the right error to check for
+ * but I must admit I haven't checked....
+ */
+ if ((res == 0) && (lock_flags & LOCKFILE_FAIL_IMMEDIATELY) &&
+ (GetLastError () == ERROR_LOCK_FAILED))
+ {
+ set_errno (EAGAIN);
+ return -1;
+ }
+ }
+ }
+ else
+ {
+ /* Windows 95 -- use primitive lock call */
+ if (fl->l_type == F_UNLCK)
+ res = UnlockFile (get_handle (), win32_start, 0, win32_len,
+ win32_upper);
+ else
+ res = LockFile (get_handle (), win32_start, 0, win32_len, win32_upper);
+ }
+
+ if (res == 0)
+ {
+ __seterrno ();
+ return -1;
+ }
+
+ return 0;
+}
+
+/* Perform various heuristics on PATH to see if it's a program. */
+
+int
+fhandler_disk_file::check_execable_p (const char *path)
+{
+ int len = strlen (path);
+ const char *ch = path + (len > 4 ? len - 4 : len);
+
+ if (strcasematch (".exe", ch)
+ || strcasematch (".bat", ch)
+ || strcasematch (".com", ch))
+ return 1;
+ return 0;
+}
+
+/**********************************************************************/
+/* /dev/null */
+
+fhandler_dev_null::fhandler_dev_null (const char *name) :
+ fhandler_base (FH_NULL, name)
+{
+ set_cb (sizeof *this);
+}
+
+void
+fhandler_dev_null::dump (void)
+{
+ paranoid_printf ("here");
+}
+
+/**********************************************************************/
+/* fhandler_pipe */
+
+fhandler_pipe::fhandler_pipe (const char *name) :
+ fhandler_base (FH_PIPE, name)
+{
+ set_cb (sizeof *this);
+}
+
+off_t
+fhandler_pipe::lseek (off_t offset, int whence)
+{
+ debug_printf ("(%d, %d)", offset, whence);
+ set_errno (ESPIPE);
+ return -1;
+}
+
+void __stdcall
+set_inheritance (HANDLE &h, int not_inheriting, const char *name)
+{
+ HANDLE newh;
+
+ if (!DuplicateHandle (hMainProc, h, hMainProc, &newh, 0, !not_inheriting,
+ DUPLICATE_SAME_ACCESS))
+ debug_printf ("DuplicateHandle %E");
+#ifndef DEBUGGING
+ else
+ {
+ CloseHandle (h);
+ h = newh;
+ }
+#else
+ else if (!name)
+ {
+ CloseHandle (h);
+ h = newh;
+ }
+ else
+ {
+ ForceCloseHandle2 (h, name);
+ h = newh;
+ ProtectHandle2 (h, name);
+ }
+#endif
+}
+
+void
+fhandler_base::fork_fixup (HANDLE parent, HANDLE &h, const char *name)
+{
+ if (!DuplicateHandle (parent, h, hMainProc, &h, 0, !get_close_on_exec (),
+ DUPLICATE_SAME_ACCESS))
+ system_printf ("%s - %E, handle %s<%p>", get_name (), name, h);
+}
+
+void
+fhandler_base::set_close_on_exec (int val)
+{
+ set_inheritance (io_handle, val);
+ set_close_on_exec_flag (val);
+ debug_printf ("set close_on_exec for %s to %d", get_name (), val);
+}
+
+void
+fhandler_base::fixup_after_fork (HANDLE parent)
+{
+ debug_printf ("inheriting '%s' from parent", get_name ());
+ fork_fixup (parent, io_handle, "io_handle");
+}
diff --git a/winsup/cygwin/fhandler.h b/winsup/cygwin/fhandler.h
new file mode 100644
index 000000000..cf1924809
--- /dev/null
+++ b/winsup/cygwin/fhandler.h
@@ -0,0 +1,804 @@
+/* fhandler.h
+
+ Copyright 1996, 1997, 1998, 1999, 2000 Cygnus Solutions.
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#ifndef _FHANDLER_H_
+#define _FHANDLER_H_
+
+#include <sys/ioctl.h>
+
+/* Classes
+
+ Code is located in fhandler.cc unless another file name is given.
+
+ fhandler_base normal I/O
+
+ fhandler_disk_file
+ fhandler_serial Adds vmin and vtime.
+ fhandler_dev_null Not really I/O
+ fhandler_dev_zero Faked
+
+ fhandler_dev_raw (fhandler_raw.cc)
+ fhandler_dev_floppy (fhandler_floppy.cc)
+ fhandler_dev_tape (fhandler_tape.cc)
+
+ fhandler_pipe
+ fhandler_socket (net.cc)
+
+ fhandler_tty_slave (tty.cc)
+ fhandler_pty_master (tty.cc)
+ fhandler_tty_master (tty.cc)
+
+ fhandler_console Out with ansi control. (console.cc)
+
+ fhandler_windows Windows messages I/O (fhandler_windows.cc)
+
+ fhandler_proc Interesting possibility, not implemented yet
+*/
+
+enum
+{
+ FH_RBINARY = 0x00001000, /* binary read mode */
+ FH_WBINARY = 0x00002000, /* binary write mode */
+ FH_CLOEXEC = 0x00004000, /* close-on-exec */
+ FH_RBINSET = 0x00008000, /* binary read mode has been explicitly set */
+ FH_WBINSET = 0x00010000, /* binary write mode has been explicitly set */
+ FH_APPEND = 0x00020000, /* always append */
+ FH_ASYNC = 0x00040000, /* async I/O */
+ FH_HADEOF = 0x00080000, /* EOF seen */
+
+ FH_SYMLINK = 0x00100000, /* is a symlink */
+ FH_EXECABL = 0x00200000, /* file looked like it would run:
+ * ends in .exe or .bat or begins with #! */
+ FH_W95LSBUG= 0x00400000, /* set when lseek is called as a flag that
+ * _write should check if we've moved beyond
+ * EOF, zero filling if so. */
+ FH_NOFRNAME= 0x00800000, /* Set if shouldn't free unix_path_name_ and
+ windows_path_name_ on destruction. */
+ FH_NOEINTR = 0x01000000, /* Set if I/O should be uninterruptible. */
+ FH_FFIXUP = 0x02000000, /* Set if need to fixup after fork. */
+ FH_LOCAL = 0x04000000, /* File is unix domain socket */
+ FH_FIFO = 0x08000000, /* File is FIFO */
+ FH_HASACLS = 0x40000000, /* True if fs of file has ACLS */
+
+ /* Device flags */
+
+ /* Slow devices */
+ FH_CONSOLE = 0x00000001, /* is a console */
+ FH_CONIN = 0x00000002, /* console input */
+ FH_CONOUT = 0x00000003, /* console output */
+ FH_TTYM = 0x00000004, /* is a tty master */
+ FH_TTYS = 0x00000005, /* is a tty slave */
+ FH_PTYM = 0x00000006, /* is a pty master */
+ FH_SERIAL = 0x00000007, /* is a serial port */
+ FH_PIPE = 0x00000008, /* is a pipe */
+ FH_PIPER = 0x00000009, /* read end of a pipe */
+ FH_PIPEW = 0x0000000a, /* write end of a pipe */
+ FH_SOCKET = 0x0000000b, /* is a socket */
+ FH_WINDOWS = 0x0000000c, /* is a window */
+
+ FH_SLOW = 0x00000010, /* "slow" device if below this */
+
+ /* Fast devices */
+ FH_DISK = 0x00000010, /* is a disk */
+ FH_FLOPPY = 0x00000011, /* is a floppy */
+ FH_TAPE = 0x00000012, /* is a tape */
+ FH_NULL = 0x00000013, /* is the null device */
+ FH_ZERO = 0x00000014, /* is the zero device */
+
+ FH_NDEV = 0x00000015, /* Maximum number of devices */
+ FH_DEVMASK = 0x00000fff, /* devices live here */
+ FH_BAD = 0xffffffff
+};
+
+#define FHDEVN(n) ((n) & FH_DEVMASK)
+#define FHISSETF(x) __ISSETF (this, x, FH)
+#define FHSETF(x) __SETF (this, x, FH)
+#define FHCLEARF(x) __CLEARF (this, x, FH)
+#define FHCONDSETF(n, x) __CONDSETF(n, this, x, FH)
+
+#define FHSTATOFF 0
+
+extern const char *windows_device_names[];
+#define __fmode (*(user_data->fmode_ptr))
+
+class select_record;
+class path_conv;
+class fhandler_disk_file;
+
+class fhandler_base
+{
+private:
+ DWORD status;
+public:
+ int cb;
+private:
+ int access_;
+ HANDLE io_handle;
+
+ int rpos_; /* Used in text reading */
+ int rsize_;
+
+ unsigned long namehash_; /* hashed filename, used as inode num */
+
+ /* Full unix path name of this file */
+ /* File open flags from open () and fcntl () calls */
+ int openflags_;
+
+protected:
+ char *rabuf; /* used for crlf conversion in text files */
+ size_t ralen;
+ size_t raixget;
+ size_t raixput;
+ size_t rabuflen;
+
+ char *unix_path_name_;
+ char *win32_path_name_;
+
+public:
+ void set_name (const char *unix, const char *win32 = NULL, int unit = 0);
+
+ virtual fhandler_base& operator =(fhandler_base &x)
+ {
+ memcpy (this, &x, sizeof *this);
+ unix_path_name_ = x.unix_path_name_ ? strdup (x.unix_path_name_) : NULL;
+ win32_path_name_ = x.win32_path_name_ ? strdup (x.win32_path_name_) : NULL;
+ return *this;
+ };
+ fhandler_base (DWORD dev, const char *name = 0, int unit = 0);
+ virtual ~fhandler_base ();
+
+ /* Non-virtual simple accessor functions. */
+ void set_io_handle (HANDLE);
+
+ void set_cb (size_t size) { cb = size; }
+ DWORD get_device () { return status & FH_DEVMASK; }
+ virtual int get_unit () { return 0; }
+ virtual BOOL is_slow () { return get_device () < FH_SLOW; }
+
+ int get_access () { return access_; }
+ void set_access (int x) { access_ = x; }
+
+ int get_async () { return FHISSETF (ASYNC); }
+ void set_async (int x) { FHCONDSETF (x, ASYNC); }
+
+ int get_flags () { return openflags_; }
+ void set_flags (int x) { openflags_ = x; }
+
+ int get_w_binary () { return FHISSETF (WBINARY); }
+ int get_r_binary () { return FHISSETF (RBINARY); }
+
+ int get_w_binset () { return FHISSETF (WBINSET); }
+ int get_r_binset () { return FHISSETF (RBINSET); }
+
+ void set_w_binary (int b) { FHCONDSETF (b, WBINARY); FHSETF (WBINSET); }
+ void set_r_binary (int b) { FHCONDSETF (b, RBINARY); FHSETF (RBINSET); }
+
+ int get_r_no_interrupt () { return FHISSETF (NOEINTR); }
+ void set_r_no_interrupt (int b) { FHCONDSETF (b, NOEINTR); }
+
+ int get_close_on_exec () { return FHISSETF (CLOEXEC); }
+ int set_close_on_exec_flag (int b) { return FHCONDSETF (b, CLOEXEC); }
+
+ void set_check_win95_lseek_bug (int b = 1) { FHCONDSETF (b, W95LSBUG); }
+ int get_check_win95_lseek_bug () { return FHISSETF (W95LSBUG); }
+
+ int get_need_fork_fixup () { return FHISSETF (FFIXUP); }
+ void set_need_fork_fixup () { FHSETF (FFIXUP); }
+
+ virtual void set_close_on_exec (int val);
+ virtual void fixup_after_fork (HANDLE parent);
+
+ int get_symlink_p () { return FHISSETF (SYMLINK); }
+ void set_symlink_p (int val) { FHCONDSETF (val, SYMLINK); }
+ void set_symlink_p () { FHSETF (SYMLINK); }
+
+ int get_socket_p () { return FHISSETF (LOCAL); }
+ void set_socket_p (int val) { FHCONDSETF (val, LOCAL); }
+ void set_socket_p () { FHSETF (LOCAL); }
+
+ int get_execable_p () { return FHISSETF (EXECABL); }
+ void set_execable_p (int val) { FHCONDSETF (val, EXECABL); }
+ void set_execable_p () { FHSETF (EXECABL); }
+
+ int get_append_p () { return FHISSETF (APPEND); }
+ void set_append_p (int val) { FHCONDSETF (val, APPEND); }
+ void set_append_p () { FHSETF (APPEND); }
+
+ int get_readahead_valid () { return raixget < ralen; }
+ int puts_readahead (const char *s, size_t len = (size_t) -1);
+ int put_readahead (char value);
+
+ int get_readahead ();
+ int peek_readahead (int queryput = 0);
+
+ int eat_readahead (int n);
+
+ void set_readahead_valid (int val, int ch = -1);
+
+ int has_acls () { return FHISSETF (HASACLS); }
+ void set_has_acls (int val) { FHCONDSETF (val, HASACLS); }
+
+ int no_free_names () { return FHISSETF (NOFRNAME); }
+ void set_no_free_names (int val) { FHCONDSETF (val, NOFRNAME); }
+ void set_no_free_names () { FHSETF (NOFRNAME); }
+
+ const char *get_name () { return unix_path_name_; }
+ const char *get_win32_name () { return win32_path_name_; }
+ unsigned long get_namehash () { return namehash_; }
+
+
+ /* fixup fd possibly non-inherited handles after fork */
+ void fork_fixup (HANDLE parent, HANDLE &h, const char *name);
+
+ /* Potentially overridden virtual functions. */
+ virtual int open (const char *, int flags, mode_t mode = 0)
+ {
+ return open (flags, mode);
+ }
+ virtual int open (int flags, mode_t mode = 0);
+ virtual int close ();
+ virtual int fstat (struct stat *buf);
+ virtual int ioctl (unsigned int cmd, void *);
+ virtual char const * ttyname () { return get_name(); }
+ virtual int read (void *ptr, size_t len);
+ virtual int write (const void *ptr, size_t len);
+ virtual off_t lseek (off_t offset, int whence);
+ virtual int lock (int, struct flock *);
+ virtual void dump ();
+ virtual int dup (fhandler_base *child);
+
+ void *operator new (size_t, void *p) {return p;}
+
+ virtual void init (HANDLE, DWORD, mode_t);
+
+ virtual int tcflush (int);
+ virtual int tcsendbreak (int);
+ virtual int tcdrain ();
+ virtual int tcflow (int);
+ virtual int tcsetattr (int a, const struct termios *t);
+ virtual int tcgetattr (struct termios *t);
+ virtual int tcsetpgrp (const pid_t pid);
+ virtual int tcgetpgrp ();
+ virtual int is_tty () { return 0; }
+ virtual BOOL is_device () { return TRUE; }
+ virtual char *ptsname () { return NULL;}
+ virtual class fhandler_socket *is_socket () { return 0; }
+ virtual class fhandler_console *is_console () { return 0; }
+ virtual int is_windows () {return 0; }
+
+ virtual int raw_read (void *ptr, size_t ulen);
+ virtual int raw_write (const void *ptr, size_t ulen);
+
+ /* Function to save state of a fhandler_base into memory. */
+ virtual int linearize (unsigned char *);
+ /* Function to de-linearize into a fd */
+ virtual int de_linearize (const char *, const char *, const char *);
+
+ /* Virtual accessor functions to hide the fact
+ that some fd's have two handles. */
+ virtual HANDLE get_handle () const { return io_handle; }
+ virtual HANDLE get_io_handle () const { return io_handle; }
+ virtual HANDLE get_output_handle () const { return io_handle; }
+ virtual BOOL hit_eof () {return FALSE;}
+ virtual select_record *select_read (select_record *s);
+ virtual select_record *select_write (select_record *s);
+ virtual select_record *select_except (select_record *s);
+ virtual int ready_for_read (int fd, DWORD howlong, int ignra);
+ virtual const char * get_native_name ()
+ {
+ return windows_device_names[FHDEVN (status)];
+ }
+ virtual int bg_check (int, int x = 0) {return 1;}
+};
+
+class fhandler_socket: public fhandler_base
+{
+private:
+ int addr_family;
+public:
+ fhandler_socket (const char *name = 0);
+ fhandler_socket (unsigned int, const char *name = 0);
+ ~fhandler_socket ();
+ int get_socket () const { return (int) get_handle(); }
+ fhandler_socket * is_socket () { return this; }
+ int write (const void *ptr, size_t len);
+ int read (void *ptr, size_t len);
+ int ioctl (unsigned int cmd, void *);
+ off_t lseek (off_t offset, int whence) { return 0; }
+ int close ();
+
+ select_record *select_read (select_record *s);
+ select_record *select_write (select_record *s);
+ select_record *select_except (select_record *s);
+ int ready_for_read (int fd, DWORD howlong, int ignra);
+ int get_addr_family () {return addr_family;}
+ void set_addr_family (int af) {addr_family = af;}
+};
+
+class fhandler_pipe: public fhandler_base
+{
+public:
+ fhandler_pipe (const char *name = 0);
+ off_t lseek (off_t offset, int whence);
+ /* This strange test is due to the fact that we can't rely on
+ Windows shells to "do the right thing" with pipes. Apparently
+ the can keep one end of the pipe open when it shouldn't be. */
+ BOOL is_slow () {return os_being_run == winNT;}
+ select_record *select_read (select_record *s);
+ select_record *select_write (select_record *s);
+ select_record *select_except (select_record *s);
+ int ready_for_read (int fd, DWORD howlong, int ignra);
+};
+
+class fhandler_dev_raw: public fhandler_base
+{
+protected:
+ char *devbuf;
+ size_t devbufsiz;
+ size_t devbufstart;
+ size_t devbufend;
+ int eom_detected : 1;
+ int eof_detected : 1;
+ int lastblk_to_read : 1;
+ int is_writing : 1;
+ int has_written : 1;
+ int unit;
+
+ virtual void clear (void);
+ virtual int writebuf (void);
+
+ /* returns not null, if `win_error' determines an end of media condition */
+ virtual int is_eom(int win_error) = 0;
+ /* returns not null, if `win_error' determines an end of file condition */
+ virtual int is_eof(int win_error) = 0;
+
+ fhandler_dev_raw (DWORD dev, const char *name, int unit);
+
+public:
+ ~fhandler_dev_raw (void);
+
+ /* Function to de-linearize into a fd */
+ int de_linearize (const char *, const char *, const char *);
+
+ int open (const char *path, int flags, mode_t mode = 0);
+ int close (void);
+
+ int raw_read (void *ptr, size_t ulen);
+ int raw_write (const void *ptr, size_t ulen);
+
+ int fstat (struct stat *buf);
+
+ int dup (fhandler_base *child);
+
+ int ioctl (unsigned int cmd, void *buf);
+};
+
+class fhandler_dev_floppy: public fhandler_dev_raw
+{
+protected:
+ virtual int is_eom (int win_error);
+ virtual int is_eof (int win_error);
+
+public:
+ fhandler_dev_floppy (const char *name, int unit);
+
+ virtual int open (const char *path, int flags, mode_t mode = 0);
+ virtual int close (void);
+
+ virtual off_t lseek (off_t offset, int whence);
+
+ virtual int ioctl (unsigned int cmd, void *buf);
+};
+
+class fhandler_dev_tape: public fhandler_dev_raw
+{
+ int norewind;
+ int lasterr;
+
+protected:
+ virtual void clear (void);
+
+ virtual int is_eom (int win_error);
+ virtual int is_eof (int win_error);
+
+public:
+ fhandler_dev_tape (const char *name, int unit);
+
+ virtual int open (const char *path, int flags, mode_t mode = 0);
+ virtual int close (void);
+
+ virtual off_t lseek (off_t offset, int whence);
+
+ virtual int fstat (struct stat *buf);
+
+ virtual int dup (fhandler_base *child);
+
+ virtual int ioctl (unsigned int cmd, void *buf);
+
+private:
+ int tape_write_marks (int marktype, DWORD len);
+ int tape_get_pos (unsigned long *ret);
+ int tape_set_pos (int mode, long count, BOOLEAN sfm_func = FALSE);
+ int tape_erase (int mode);
+ int tape_prepare (int action);
+ BOOLEAN tape_get_feature (DWORD parm);
+ int tape_get_blocksize (long *min, long *def, long *max, long *cur);
+ int tape_set_blocksize (long count);
+ int tape_status (struct mtget *get);
+ int tape_compression (long count);
+};
+
+/* Standard disk file */
+
+class fhandler_disk_file: public fhandler_base
+{
+private:
+ int check_execable_p (const char *path);
+
+public:
+ fhandler_disk_file (const char *name);
+
+ int open (const char *path, int flags, mode_t mode = 0);
+ int open (path_conv& real_path, int flags, mode_t mode);
+ int close ();
+ int lock (int, struct flock *);
+ BOOL is_device () { return FALSE; }
+ int fstat (struct stat *buf);
+};
+
+class fhandler_serial: public fhandler_base
+{
+private:
+ unsigned int vmin_; /* from termios */
+ unsigned int vtime_; /* from termios */
+ pid_t pgrp_;
+
+public:
+ int overlapped_armed;
+ OVERLAPPED io_status;
+
+ /* Constructor */
+ fhandler_serial (const char *name, DWORD devtype = FH_SERIAL, int unit = 0);
+
+ int open (const char *path, int flags, mode_t mode);
+ int close ();
+ void init (HANDLE h, DWORD a, mode_t flags);
+ void overlapped_setup ();
+ int dup (fhandler_base *child);
+ int raw_read (void *ptr, size_t ulen);
+ int raw_write (const void *ptr, size_t ulen);
+ int tcsendbreak (int);
+ int tcdrain ();
+ int tcflow (int);
+ int tcsetattr (int a, const struct termios *t);
+ int tcgetattr (struct termios *t);
+ off_t lseek (off_t offset, int whence) { return 0; }
+ int tcflush (int);
+ void dump ();
+ int is_tty () { return 1; }
+ void fixup_after_fork (HANDLE parent);
+ int de_linearize (const char *, const char *, const char *);
+
+ /* We maintain a pgrp so that tcsetpgrp and tcgetpgrp work, but we
+ don't use it for permissions checking. fhandler_tty_slave does
+ permission checking on pgrps. */
+ virtual int tcgetpgrp () { return pgrp_; }
+ virtual int tcsetpgrp (const pid_t pid) { pgrp_ = pid; return 0; }
+ select_record *select_read (select_record *s);
+ select_record *select_write (select_record *s);
+ select_record *select_except (select_record *s);
+ int ready_for_read (int fd, DWORD howlong, int ignra);
+};
+
+class fhandler_termios: public fhandler_base
+{
+protected:
+ HANDLE output_handle;
+ virtual void doecho (const void *str, DWORD len) {};
+ virtual int accept_input () {return 1;};
+public:
+ tty_min *tc;
+ fhandler_termios (DWORD dev, const char *name = 0, int unit = 0) :
+ fhandler_base (dev, name, unit)
+ {
+ // nothing to do
+ }
+ HANDLE restart_output_event;
+ HANDLE get_output_handle () const { return output_handle; }
+ int line_edit (const char *rptr, int nread, int always_accept = 0);
+ void set_output_handle (HANDLE h) { output_handle = h; }
+ void tcinit (tty_min *this_tc, int force = FALSE);
+ virtual int is_tty () { return 1; }
+ int tcgetpgrp ();
+ int tcsetpgrp (int pid);
+ void set_ctty (int ttynum, int flags);
+ int bg_check (int sig, int blocksigs = 1);
+};
+
+/* This is a input and output console handle */
+class fhandler_console: public fhandler_termios
+{
+private:
+
+/* Output state */
+
+ // enum {normal, gotesc, gotsquare, gotarg1, gotcommand} state;
+#define normal 1
+#define gotesc 2
+#define gotsquare 3
+#define gotarg1 4
+#define gotrsquare 5
+#define gotcommand 6
+#define gettitle 7
+#define eattitle 8
+#define MAXARGS 10
+ int state_;
+ int args_[MAXARGS];
+ int nargs_;
+
+ DWORD default_color;
+
+/* Output calls */
+
+ BOOL fillin_info ();
+ void clear_screen (int, int, int, int);
+ void scroll_screen (int, int, int, int, int, int);
+ void cursor_set (BOOL, int, int);
+ void cursor_get (int *, int *);
+ void cursor_rel (int, int);
+ const unsigned char * write_normal (unsigned const char*, unsigned const char *);
+ void char_command (char);
+ int output_tcsetattr (int a, const struct termios *t);
+
+/* Input calls */
+ int igncr_enabled ();
+ int input_tcsetattr (int a, const struct termios *t);
+
+public:
+
+ fhandler_console (const char *name);
+
+ fhandler_console* is_console () { return this; }
+
+ int open (const char *path, int flags, mode_t mode = 0);
+
+ int write (const void *ptr, size_t len);
+ void doecho (const void *str, DWORD len) { (void) write (str, len); }
+ int read (void *ptr, size_t len);
+ int close ();
+
+ int tcflush (int);
+ int tcsetattr (int a, const struct termios *t);
+ int tcgetattr (struct termios *t);
+
+ int tcsetpgrp (const pid_t pid) { tc->pgid = pid; return 0; }
+
+ /* Special dup as we must dup two handles */
+ int dup (fhandler_base *child);
+
+ int ioctl (unsigned int cmd, void *);
+ void init (HANDLE, DWORD, mode_t);
+
+ select_record *select_read (select_record *s);
+ select_record *select_write (select_record *s);
+ select_record *select_except (select_record *s);
+ int ready_for_read (int fd, DWORD howlong, int ignra);
+ int de_linearize (const char *, const char *, const char *);
+ void set_close_on_exec (int val);
+ void fixup_after_fork (HANDLE parent);
+ void set_input_state ()
+ {
+ if (TTYISSETF (RSTCONS))
+ input_tcsetattr (0, &tc->ti);
+ }
+};
+
+class fhandler_tty_common: public fhandler_termios
+{
+public:
+ fhandler_tty_common (DWORD dev, const char *name = 0, int unit = 0) :
+ fhandler_termios (dev, name, unit),
+ ttynum (unit)
+ {
+ // nothing to do
+ }
+ HANDLE output_done_event; // Raised by master when tty's output buffer
+ // written. Write status in tty::write_retval.
+ HANDLE ioctl_request_event; // Raised by slave to perform ioctl() request.
+ // Ioctl() request in tty::cmd/arg.
+ HANDLE ioctl_done_event; // Raised by master on ioctl() completion.
+ // Ioctl() status in tty::ioctl_retval.
+ HANDLE output_mutex;
+ HANDLE inuse; // used to indicate that a tty is in use
+
+
+ DWORD __acquire_output_mutex (const char *fn, int ln, DWORD ms);
+ void __release_output_mutex (const char *fn, int ln);
+
+ int ttynum; // Master tty num.
+ virtual int dup (fhandler_base *child);
+
+ tty *get_ttyp () { return (tty *)tc; }
+ int get_unit () { return ttynum; }
+
+ int close ();
+ void set_close_on_exec (int val);
+ void fixup_after_fork (HANDLE parent);
+ select_record *select_read (select_record *s);
+ select_record *select_write (select_record *s);
+ select_record *select_except (select_record *s);
+ int ready_for_read (int fd, DWORD howlong, int ignra);
+};
+
+class fhandler_tty_slave: public fhandler_tty_common
+{
+ void send_ioctl_request ();
+
+public:
+ /* Constructor */
+ fhandler_tty_slave (const char *name);
+ fhandler_tty_slave (int, const char *name);
+
+ int open (const char *path, int flags, mode_t mode = 0);
+ int write (const void *ptr, size_t len);
+ int read (void *ptr, size_t len);
+ void init (HANDLE, DWORD, mode_t);
+
+ int tcsetattr (int a, const struct termios *t);
+ int tcgetattr (struct termios *t);
+ int tcflush (int);
+ int ioctl (unsigned int cmd, void *);
+
+ off_t lseek (off_t offset, int whence) { return 0; }
+};
+
+class fhandler_pty_master: public fhandler_tty_common
+{
+ int pktmode; // non-zero if pty in a packet mode.
+public:
+ int neednl_; // Next read should start with \n
+
+ /* Constructor */
+ fhandler_pty_master (const char *name, DWORD devtype = FH_PTYM, int unit = -1);
+
+ int process_slave_output (char *buf, size_t len);
+ void doecho (const void *str, DWORD len);
+ int accept_input ();
+ int open (const char *path, int flags, mode_t mode = 0);
+ int write (const void *ptr, size_t len);
+ int read (void *ptr, size_t len);
+ int close ();
+
+ int tcsetattr (int a, const struct termios *t);
+ int tcgetattr (struct termios *t);
+ int tcflush (int);
+ int ioctl (unsigned int cmd, void *);
+
+ off_t lseek (off_t offset, int whence) { return 0; }
+ char *ptsname ();
+
+ void set_close_on_exec (int val);
+ void fixup_after_fork (HANDLE parent);
+ BOOL hit_eof ();
+};
+
+class fhandler_tty_master: public fhandler_pty_master
+{
+public:
+ /* Constructor */
+ fhandler_tty_master (const char *name, int unit);
+ fhandler_console *console; // device handler to perform real i/o.
+ HANDLE hThread; // process_output thread handle.
+
+ int init (int);
+ int init_console ();
+ void fixup_after_fork (HANDLE parent);
+ int de_linearize (const char *, const char *, const char *);
+};
+
+class fhandler_dev_null: public fhandler_base
+{
+public:
+ fhandler_dev_null (const char *name);
+
+ void dump ();
+ select_record *select_read (select_record *s);
+ select_record *select_write (select_record *s);
+ select_record *select_except (select_record *s);
+};
+
+class fhandler_dev_zero: public fhandler_base
+{
+public:
+ fhandler_dev_zero (const char *name);
+ int open (const char *path, int flags, mode_t mode = 0);
+ int write (const void *ptr, size_t len);
+ int read (void *ptr, size_t len);
+ off_t lseek (off_t offset, int whence);
+ int close (void);
+
+ void dump ();
+};
+
+class fhandler_windows: public fhandler_base
+{
+private:
+ HWND hWnd_; // the window whose messages are to be retrieved by read() call
+ int method_; // write method (Post or Send)
+public:
+ fhandler_windows (const char *name = 0);
+ int is_windows (void) { return 1; }
+ int open (const char *path, int flags, mode_t mode = 0);
+ int write (const void *ptr, size_t len);
+ int read (void *ptr, size_t len);
+ int ioctl (unsigned int cmd, void *);
+ off_t lseek (off_t offset, int whence) { return 0; }
+ int close (void) { return 0; }
+
+ void set_close_on_exec (int val);
+ void fixup_after_fork (HANDLE parent);
+ select_record *select_read (select_record *s);
+ select_record *select_write (select_record *s);
+ select_record *select_except (select_record *s);
+ int ready_for_read (int fd, DWORD howlong, int ignra);
+};
+
+#if 0
+/* You can't do this */
+typedef union
+{
+ fhandler_normal normal;
+ fhandler_dev_null dev_null;
+ fhandler bare;
+ fhandler_serial tty;
+} fhandler_union;
+#else
+#define fhandler_union fhandler_console
+#endif
+struct select_record
+{
+ int fd;
+ HANDLE h;
+ fhandler_base *fh;
+ BOOL saw_error;
+ BOOL windows_handle;
+ BOOL read_ready, write_ready, except_ready;
+ BOOL read_selected, write_selected, except_selected;
+ select_record (fhandler_base *in_fh = NULL) {memset (this, 0, sizeof(select_record)); fh = in_fh;}
+ int (*startup) (select_record *me, class select_stuff *stuff);
+ int (*poll) (select_record *me, fd_set *readfds, fd_set *writefds,
+ fd_set *exceptfds);
+ int (*verify) (select_record *me, fd_set *readfds, fd_set *writefds,
+ fd_set *exceptfds);
+ void (*cleanup) (select_record *me, class select_stuff *stuff);
+ struct select_record *next;
+};
+
+class select_stuff
+{
+public:
+ ~select_stuff ();
+ BOOL always_ready, windows_used;
+ int total;
+ select_record start;
+ void *device_specific[FH_NDEV];
+
+ int test_and_set (int i, fd_set *readfds, fd_set *writefds,
+ fd_set *exceptfds);
+ int poll (fd_set *readfds, fd_set *writefds, fd_set *exceptfds);
+ int wait (fd_set *readfds, fd_set *writefds, fd_set *exceptfds, DWORD ms);
+};
+
+uid_t __stdcall get_file_owner (int, const char *);
+gid_t __stdcall get_file_group (int, const char *);
+
+void __stdcall set_inheritance (HANDLE &h, int val, const char *name = NULL);
+
+#endif /* _FHANDLER_H_ */
diff --git a/winsup/cygwin/fhandler_console.cc b/winsup/cygwin/fhandler_console.cc
new file mode 100644
index 000000000..188c79c56
--- /dev/null
+++ b/winsup/cygwin/fhandler_console.cc
@@ -0,0 +1,1387 @@
+/* fhandler_console.cc
+
+ Copyright 1996, 1997, 1998, 1999, 2000 Cygnus Solutions.
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+/* FIXMES:
+ Should the constructor call tcinit() explicitly rather than having
+ it sprinkled throughout here? */
+
+#include <sys/termios.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <unistd.h>
+#include "winsup.h"
+#include <ctype.h>
+
+/*
+ * Scroll the screen context.
+ * x1, y1 - ul corner
+ * x2, y2 - dr corner
+ * xn, yn - new ul corner
+ * Negative values represents current screen dimensions
+ */
+static struct
+ {
+ short Top, Bottom;
+ } scroll_region = {0, -1};
+
+#define srTop (info.winTop + scroll_region.Top)
+#define srBottom ((scroll_region.Bottom < 0) ? info.winBottom : info.winTop + scroll_region.Bottom)
+
+#define use_tty ISSTATE (myself, PID_USETTY)
+
+const char * get_nonascii_key (INPUT_RECORD& input_rec);
+
+HANDLE console_shared_h;
+
+static tty_min NO_COPY *shared_console_info = NULL;
+
+/* Allocate and initialize the shared record for the current console.
+ Returns a pointer to shared_console_info. */
+static __inline tty_min *
+get_tty_stuff (int force = 0)
+{
+ if (shared_console_info && !force)
+ return shared_console_info;
+
+ shared_console_info = (tty_min *) open_shared (NULL, console_shared_h,
+ sizeof (*shared_console_info),
+ NULL);
+ ProtectHandle (console_shared_h);
+ shared_console_info->setntty (TTY_CONSOLE);
+ shared_console_info->setsid (myself->sid);
+ return shared_console_info;
+}
+
+/* Return the tty structure associated with a given tty number. If the
+ tty number is < 0, just return a dummy record. */
+tty_min *
+tty_list::get_tty (int n)
+{
+ static tty_min nada;
+ if (n == TTY_CONSOLE)
+ return get_tty_stuff ();
+ else if (n >= 0)
+ return &cygwin_shared->tty.ttys[n];
+ else
+ return &nada;
+}
+
+
+/* Determine if a console is associated with this process prior to a spawn.
+ If it is, then we'll return 1. If the console has been initialized, then
+ set it into a more friendly state for non-cygwin apps. */
+int __stdcall
+set_console_state_for_spawn ()
+{
+ HANDLE h = CreateFileA ("CONIN$", GENERIC_READ, FILE_SHARE_WRITE,
+ &sec_none_nih, OPEN_EXISTING,
+ FILE_ATTRIBUTE_NORMAL, NULL);
+
+ if (h == INVALID_HANDLE_VALUE || h == NULL)
+ return 0;
+
+ if (shared_console_info != NULL)
+ {
+# define tc shared_console_info /* ACK. Temporarily define for use in TTYSETF macro */
+ SetConsoleMode (h, ENABLE_LINE_INPUT | ENABLE_ECHO_INPUT | ENABLE_PROCESSED_INPUT);
+ TTYSETF (RSTCONS);
+#if 0
+ char ch;
+ DWORD n;
+ /* NOTE -- This ReadFile is apparently necessary for correct functioning on
+ Windows NT 4.0. Without this, the next ReadFile returns garbage. */
+ (void) ReadFile (h, &ch, 0, &n, NULL);
+#endif
+# undef tc
+ }
+
+ CloseHandle (h);
+ return 1;
+}
+
+int
+fhandler_console::read (void *pv, size_t buflen)
+{
+ if (!buflen)
+ return 0;
+
+ HANDLE h = get_io_handle ();
+ int copied_chars = 0;
+
+#define buf ((char *) pv)
+
+ int ch;
+ set_input_state ();
+ while (buflen)
+ if ((ch = get_readahead ()) < 0)
+ break;
+ else
+ {
+ buf[copied_chars++] = (unsigned char)(ch & 0xff);
+ buflen--;
+ }
+
+ if (copied_chars)
+ return copied_chars;
+
+ HANDLE w4[2];
+ DWORD nwait;
+
+ w4[0] = h;
+ nwait = 2;
+ w4[1] = signal_arrived;
+
+ for (;;)
+ {
+ int bgres;
+ if ((bgres = bg_check (SIGTTIN)) <= 0)
+ return bgres;
+
+ switch (WaitForMultipleObjects (nwait, w4, FALSE, INFINITE))
+ {
+ case WAIT_OBJECT_0:
+ break;
+ case WAIT_OBJECT_0 + 1:
+ set_sig_errno (EINTR);
+ return -1;
+ default:
+ __seterrno ();
+ return -1;
+ }
+ DWORD nread;
+ INPUT_RECORD input_rec;
+ const char *toadd;
+
+ if (!ReadConsoleInput (h, &input_rec, 1, &nread))
+ {
+ syscall_printf ("ReadConsoleInput failed, %E");
+ __seterrno ();
+ return -1; /* seems to be failure */
+ }
+
+#define ich (input_rec.Event.KeyEvent.uChar.AsciiChar)
+
+ /* check if we're just disposing of this one */
+
+ if (input_rec.EventType == WINDOW_BUFFER_SIZE_EVENT)
+ {
+ kill_pgrp (tc->getpgid (), SIGWINCH);
+ continue;
+ }
+debug_printf ("ich %d, keydown %d, type %d", ich, input_rec.Event.KeyEvent.bKeyDown, input_rec.EventType);
+ if (input_rec.EventType != KEY_EVENT ||
+ !input_rec.Event.KeyEvent.bKeyDown)
+ continue;
+
+ if (ich == 0) /* arrow/function keys */
+ {
+ toadd = get_nonascii_key (input_rec);
+ if (!toadd)
+ continue;
+ nread = strlen (toadd);
+ }
+ else if (!(input_rec.Event.KeyEvent.dwControlKeyState & LEFT_ALT_PRESSED))
+ toadd = &ich;
+ else
+ {
+ static char tmp[2];
+ tmp[0] = '\033';
+ tmp[1] = tolower (ich);
+ toadd = tmp;
+ nread = 2;
+ }
+
+ if (line_edit (toadd, nread))
+ break;
+#undef ich
+ }
+
+ while (buflen)
+ if ((ch = get_readahead ()) < 0)
+ break;
+ else
+ {
+ buf[copied_chars++] = (unsigned char)(ch & 0xff);
+ buflen--;
+ }
+#undef buf
+
+ return copied_chars;
+}
+
+static struct
+ {
+ SHORT winTop;
+ SHORT winBottom;
+ COORD dwWinSize;
+ COORD dwCursorPosition;
+ WORD wAttributes;
+ } info;
+
+BOOL
+fhandler_console::fillin_info (void)
+{
+ BOOL ret;
+ CONSOLE_SCREEN_BUFFER_INFO linfo;
+
+ if ((ret = GetConsoleScreenBufferInfo (get_output_handle(), &linfo)))
+ {
+ info.winTop = linfo.srWindow.Top;
+ info.winBottom = linfo.srWindow.Bottom;
+ info.dwWinSize.Y = 1 + linfo.srWindow.Bottom - linfo.srWindow.Top;
+ info.dwWinSize.X = 1 + linfo.srWindow.Right - linfo.srWindow.Left;
+ info.dwCursorPosition = linfo.dwCursorPosition;
+ info.wAttributes = linfo.wAttributes;
+ }
+ else
+ {
+ memset (&info, 0, sizeof info);
+ info.dwWinSize.Y = 25;
+ info.dwWinSize.X = 80;
+ info.winBottom = 24;
+ }
+
+ return ret;
+}
+
+void
+fhandler_console::scroll_screen (int x1, int y1, int x2, int y2, int xn, int yn)
+{
+ SMALL_RECT sr1, sr2;
+ CHAR_INFO fill;
+ COORD dest;
+
+ (void)fillin_info ();
+ sr1.Left = x1 >= 0 ? x1 : info.dwWinSize.X - 1;
+ if (y1 == 0)
+ sr1.Top = info.winTop;
+ else
+ sr1.Top = y1 > 0 ? y1 : info.winBottom;
+ sr1.Right = x2 >= 0 ? x2 : info.dwWinSize.X - 1;
+ if (y2 == 0)
+ sr1.Bottom = info.winTop;
+ else
+ sr1.Bottom = y2 > 0 ? y2 : info.winBottom;
+ sr2.Top = srTop;
+ sr2.Left = 0;
+ sr2.Bottom = srBottom;
+ sr2.Right = info.dwWinSize.X - 1;
+ if (sr1.Bottom > sr2.Bottom && sr1.Top <= sr2.Bottom)
+ sr1.Bottom = sr2.Bottom;
+ dest.X = xn >= 0 ? xn : info.dwWinSize.X - 1;
+ if (yn == 0)
+ dest.Y = info.winTop;
+ else
+ dest.Y = yn > 0 ? yn : info.winBottom;
+ fill.Char.AsciiChar = ' ';
+ fill.Attributes = default_color;
+ ScrollConsoleScreenBuffer (get_output_handle (), &sr1, &sr2, dest, &fill);
+
+ /* ScrollConsoleScreenBuffer on Windows 95 is buggy - when scroll distance
+ * is more than half of screen, filling doesn't work as expected */
+
+ if (sr1.Top != sr1.Bottom)
+ if (dest.Y <= sr1.Top) /* forward scroll */
+ clear_screen (0, 1 + dest.Y + sr1.Bottom - sr1.Top, sr2.Right, sr2.Bottom);
+ else /* reverse scroll */
+ clear_screen (0, sr1.Top, sr2.Right, dest.Y - 1);
+}
+
+int
+fhandler_console::open (const char *, int flags, mode_t)
+{
+ HANDLE h;
+
+ tcinit (get_tty_stuff ());
+
+ set_io_handle (INVALID_HANDLE_VALUE);
+ set_output_handle (INVALID_HANDLE_VALUE);
+
+ set_flags (flags);
+
+ /* Open the input handle as handle_ */
+ h = CreateFileA ("CONIN$", GENERIC_READ|GENERIC_WRITE,
+ FILE_SHARE_READ | FILE_SHARE_WRITE, &sec_none,
+ OPEN_EXISTING, 0, 0);
+
+ if (h == INVALID_HANDLE_VALUE)
+ {
+ __seterrno ();
+ return 0;
+ }
+ set_io_handle (h);
+ set_r_no_interrupt (1); // Handled explicitly in read code
+
+ h = CreateFileA ("CONOUT$", GENERIC_READ|GENERIC_WRITE,
+ FILE_SHARE_WRITE | FILE_SHARE_WRITE, &sec_none,
+ OPEN_EXISTING, 0, 0);
+
+ if (h == INVALID_HANDLE_VALUE)
+ {
+ __seterrno ();
+ return 0;
+ }
+ set_output_handle (h);
+
+ if (fillin_info ())
+ default_color = info.wAttributes;
+
+ DWORD cflags;
+ if (GetConsoleMode (get_io_handle (), &cflags))
+ {
+ cflags |= ENABLE_PROCESSED_INPUT;
+ SetConsoleMode (get_io_handle (), ENABLE_WINDOW_INPUT | cflags);
+ }
+
+ TTYCLEARF (RSTCONS);
+ set_ctty (TTY_CONSOLE, flags);
+ debug_printf("opened conin$ %p, conout$ %p",
+ get_io_handle (), get_output_handle ());
+
+ return 1;
+}
+
+int
+fhandler_console::close (void)
+{
+ CloseHandle (get_io_handle ());
+ CloseHandle (get_output_handle ());
+ set_io_handle (INVALID_HANDLE_VALUE);
+ set_output_handle (INVALID_HANDLE_VALUE);
+ return 0;
+}
+
+/*
+ * Special console dup to duplicate input and output
+ * handles.
+ */
+
+int
+fhandler_console::dup (fhandler_base *child)
+{
+ fhandler_console *fhc = (fhandler_console *) child;
+
+ if (!fhc->open(get_name (), get_flags (), 0))
+ system_printf ("error opening console, %E");
+
+ fhc->state_ = state_;
+ fhc->default_color = default_color;
+
+ return 0;
+}
+
+int
+fhandler_console::ioctl (unsigned int cmd, void *buf)
+{
+ switch (cmd)
+ {
+ case TIOCGWINSZ:
+ int st;
+
+ st = fillin_info ();
+ if (st)
+ {
+ /* *not* the buffer size, the actual screen size... */
+ /* based on Left Top Right Bottom of srWindow */
+ ((struct winsize *) buf)->ws_row = info.dwWinSize.Y;
+ ((struct winsize *) buf)->ws_col = info.dwWinSize.X;
+ syscall_printf ("WINSZ: (row=%d,col=%d)",
+ ((struct winsize *) buf)->ws_row,
+ ((struct winsize *) buf)->ws_col);
+ return 0;
+ }
+ else
+ {
+ syscall_printf ("WINSZ failed");
+ __seterrno ();
+ return -1;
+ }
+ return 0;
+ case TIOCSWINSZ:
+ (void) bg_check (SIGTTOU, 0);
+ return 0;
+ }
+
+ return fhandler_base::ioctl (cmd, buf);
+}
+
+int
+fhandler_console::tcflush (int queue)
+{
+ int res = 0;
+ if (queue == TCIFLUSH
+ || queue == TCIOFLUSH)
+ {
+ if (!FlushConsoleInputBuffer (get_io_handle ()))
+ {
+ __seterrno ();
+ res = -1;
+ }
+ }
+ return res;
+}
+
+int
+fhandler_console::output_tcsetattr (int, struct termios const *t)
+{
+ /* Ignore the optional_actions stuff, since all output is emitted
+ instantly */
+
+ /* Enable/disable LF -> CRLF conversions */
+ set_w_binary ((t->c_oflag & ONLCR) ? 0 : 1);
+
+ /* All the output bits we can ignore */
+
+ DWORD flags = ENABLE_PROCESSED_OUTPUT | ENABLE_WRAP_AT_EOL_OUTPUT;
+
+ int res = SetConsoleMode (get_output_handle (), flags) ? 0 : -1;
+ syscall_printf ("%d = tcsetattr (,%x) (ENABLE FLAGS %x) (lflag %x oflag %x)",
+ res, t, flags, t->c_lflag, t->c_oflag);
+ return res;
+}
+
+int
+fhandler_console::input_tcsetattr (int, struct termios const *t)
+{
+ /* Ignore the optional_actions stuff, since all output is emitted
+ instantly */
+
+ DWORD oflags;
+
+ if (!GetConsoleMode (get_io_handle (), &oflags))
+ oflags = 0;
+ DWORD flags = 0;
+
+ /* Enable/disable LF -> CRLF conversions */
+ set_r_binary ((t->c_iflag & INLCR) ? 0 : 1);
+
+ /* There's some disparity between what we need and what's
+ available. We've got ECHO and ICANON, they've
+ got ENABLE_ECHO_INPUT and ENABLE_LINE_INPUT. */
+
+ tc->ti = *t;
+
+ if (t->c_lflag & ECHO)
+ {
+ flags |= ENABLE_ECHO_INPUT;
+ }
+ if (t->c_lflag & ICANON)
+ {
+ flags |= ENABLE_LINE_INPUT;
+ }
+
+ if (flags & ENABLE_ECHO_INPUT
+ && !(flags & ENABLE_LINE_INPUT))
+ {
+ /* This is illegal, so turn off the echo here, and fake it
+ when we read the characters */
+
+ flags &= ~ENABLE_ECHO_INPUT;
+ }
+
+ if (t->c_lflag & ISIG)
+ {
+ flags |= ENABLE_PROCESSED_INPUT;
+ }
+ /* What about ENABLE_WINDOW_INPUT
+ and ENABLE_MOUSE_INPUT ? */
+
+ if (use_tty)
+ {
+ flags = 0; // ENABLE_PROCESSED_OUTPUT | ENABLE_WRAP_AT_EOL_OUTPUT;
+ tc->ti.c_iflag = 0;
+ tc->ti.c_lflag = 0;
+ }
+
+ flags |= ENABLE_WINDOW_INPUT;
+
+ int res;
+ if (flags == oflags)
+ res = 0;
+ else
+ {
+ res = SetConsoleMode (get_io_handle (), flags) ? 0 : -1;
+ if (res < 0)
+ __seterrno ();
+ syscall_printf ("%d = tcsetattr (,%x) enable flags %p, c_lflag %p iflag %p",
+ res, t, flags, t->c_lflag, t->c_iflag);
+ }
+
+ TTYCLEARF (RSTCONS);
+ return res;
+}
+
+int
+fhandler_console::tcsetattr (int a, struct termios const *t)
+{
+ int res = output_tcsetattr (a, t);
+ if (res != 0)
+ return res;
+ return input_tcsetattr (a, t);
+}
+
+int
+fhandler_console::tcgetattr (struct termios *t)
+{
+ int res;
+ *t = tc->ti;
+
+ t->c_cflag |= CS8;
+
+#if 0
+ if (!get_r_binary ())
+ t->c_iflag |= IGNCR;
+ if (!get_w_binary ())
+ t->c_oflag |= ONLCR;
+#endif
+
+ DWORD flags;
+
+ if (!GetConsoleMode (get_io_handle (), &flags))
+ {
+ __seterrno ();
+ res = -1;
+ }
+ else
+ {
+ if (flags & ENABLE_ECHO_INPUT)
+ t->c_lflag |= ECHO;
+
+ if (flags & ENABLE_LINE_INPUT)
+ t->c_lflag |= ICANON;
+
+ if (flags & ENABLE_PROCESSED_INPUT)
+ t->c_lflag |= ISIG;
+
+ /* What about ENABLE_WINDOW_INPUT
+ and ENABLE_MOUSE_INPUT ? */
+
+ /* All the output bits we can ignore */
+ res = 0;
+ }
+ syscall_printf ("%d = tcgetattr (%p) enable flags %p, t->lflag %p, t->iflag %p",
+ res, t, flags, t->c_lflag, t->c_iflag);
+ return res;
+}
+
+/*
+ * Constructor.
+ */
+
+fhandler_console::fhandler_console (const char *name) :
+ fhandler_termios (FH_CONSOLE, name, -1)
+{
+ set_cb (sizeof *this);
+ state_ = normal;
+ set_need_fork_fixup ();
+}
+
+/*
+ * Clear the screen context from x1/y1 to x2/y2 cell.
+ * Negative values represents current screen dimensions
+ */
+void
+fhandler_console::clear_screen (int x1, int y1, int x2, int y2)
+{
+ COORD tlc;
+ DWORD done;
+ int num;
+
+ (void)fillin_info ();
+
+ if (x1 < 0)
+ x1 = info.dwWinSize.X-1;
+ if (y1 < 0)
+ y1 = info.winBottom;
+ if (x2 < 0)
+ x2 = info.dwWinSize.X-1;
+ if (y2 < 0)
+ y2 = info.winBottom;
+
+ num = abs (y1 - y2) * info.dwWinSize.X + abs (x1 - x2) + 1;
+
+ if ((y2 * info.dwWinSize.X + x2) > (y1 * info.dwWinSize.X + x1))
+ {
+ tlc.X = x1;
+ tlc.Y = y1;
+ }
+ else
+ {
+ tlc.X = x2;
+ tlc.Y = y2;
+ }
+ FillConsoleOutputCharacterA (get_output_handle (), ' ',
+ num,
+ tlc,
+ &done);
+ FillConsoleOutputAttribute (get_output_handle (),
+ default_color,
+ num,
+ tlc,
+ &done);
+}
+
+void
+fhandler_console::cursor_set (BOOL rel_to_top, int x, int y)
+{
+ COORD pos;
+
+ (void)fillin_info ();
+ if (y > info.winBottom)
+ y = info.winBottom;
+ else if (y < 0)
+ y = 0;
+ else if (rel_to_top)
+ y += info.winTop;
+
+ if (x > info.dwWinSize.X)
+ x = info.dwWinSize.X - 1;
+ else if (x < 0)
+ x = 0;
+
+ pos.X = x;
+ pos.Y = y;
+ SetConsoleCursorPosition (get_output_handle (), pos);
+}
+
+void
+fhandler_console::cursor_rel (int x, int y)
+{
+ fillin_info ();
+ x += info.dwCursorPosition.X;
+ y += info.dwCursorPosition.Y;
+ cursor_set (FALSE, x, y);
+}
+
+void
+fhandler_console::cursor_get (int *x, int *y)
+{
+ fillin_info ();
+ *y = info.dwCursorPosition.Y;
+ *x = info.dwCursorPosition.X;
+}
+
+#define BAK 1
+#define ESC 2
+#define NOR 0
+#define IGN 4
+#if 0
+#define ERR 5
+#else
+#define ERR NOR
+#endif
+#define DWN 6
+#define BEL 7
+#define TAB 8 /* We should't let the console deal with these */
+#define CR 13
+#define LF 10
+
+static const char base_chars[256] =
+{
+/*00 01 02 03 04 05 06 07 */ IGN, ERR, ERR, NOR, NOR, NOR, NOR, BEL,
+/*08 09 0A 0B 0C 0D 0E 0F */ BAK, TAB, DWN, ERR, ERR, CR, ERR, IGN,
+/*10 11 12 13 14 15 16 17 */ NOR, NOR, ERR, ERR, ERR, ERR, ERR, ERR,
+/*18 19 1A 1B 1C 1D 1E 1F */ NOR, NOR, ERR, ESC, ERR, ERR, ERR, ERR,
+/* ! " # $ % & ' */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR,
+/*( ) * + , - . / */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR,
+/*0 1 2 3 4 5 6 7 */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR,
+/*8 9 : ; < = > ? */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR,
+/*@ A B C D E F G */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR,
+/*H I J K L M N O */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR,
+/*P Q R S T U V W */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR,
+/*X Y Z [ \ ] ^ _ */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR,
+/*` a b c d e f g */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR,
+/*h i j k l m n o */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR,
+/*p q r s t u v w */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR,
+/*x y z { | } ~ 7F */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR,
+/*80 81 82 83 84 85 86 87 */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR,
+/*88 89 8A 8B 8C 8D 8E 8F */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR,
+/*90 91 92 93 94 95 96 97 */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR,
+/*98 99 9A 9B 9C 9D 9E 9F */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR,
+/*A0 A1 A2 A3 A4 A5 A6 A7 */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR,
+/*A8 A9 AA AB AC AD AE AF */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR,
+/*B0 B1 B2 B3 B4 B5 B6 B7 */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR,
+/*B8 B9 BA BB BC BD BE BF */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR,
+/*C0 C1 C2 C3 C4 C5 C6 C7 */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR,
+/*C8 C9 CA CB CC CD CE CF */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR,
+/*D0 D1 D2 D3 D4 D5 D6 D7 */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR,
+/*D8 D9 DA DB DC DD DE DF */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR,
+/*E0 E1 E2 E3 E4 E5 E6 E7 */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR,
+/*E8 E9 EA EB EC ED EE EF */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR,
+/*F0 F1 F2 F3 F4 F5 F6 F7 */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR,
+/*F8 F9 FA FB FC FD FE FF */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR };
+
+/*#define syscall_printf small_printf*/
+
+static int savex, savey; /* for CSI s, CSI u */
+
+void
+fhandler_console::char_command (char c)
+{
+ // Keep the background intensity with the colr since there doesn't seem
+ // to be a way to set this with termcap/terminfo.
+ static int fg = default_color & (FOREGROUND_BLUE | FOREGROUND_GREEN |
+ FOREGROUND_RED),
+ bg = default_color & (BACKGROUND_BLUE | BACKGROUND_GREEN |
+ BACKGROUND_RED | BACKGROUND_INTENSITY),
+ bold = default_color & FOREGROUND_INTENSITY;
+ int x, y;
+ char buf[40];
+
+ switch (c)
+ {
+ case 'm': /* Set Graphics Rendition */
+ int i;
+
+ for (i = 0; i <= nargs_; i++)
+ switch (args_[i])
+ {
+ case 0: /* normal color */
+ fg = default_color & (FOREGROUND_BLUE | FOREGROUND_GREEN |
+ FOREGROUND_RED);
+ bg = default_color & (BACKGROUND_BLUE | BACKGROUND_GREEN |
+ BACKGROUND_RED | BACKGROUND_INTENSITY);
+ bold = default_color & FOREGROUND_INTENSITY;
+ break;
+ case 1: /* bold */
+ fg = default_color & (FOREGROUND_BLUE | FOREGROUND_GREEN |
+ FOREGROUND_RED);
+ bg = default_color & (BACKGROUND_BLUE | BACKGROUND_GREEN |
+ BACKGROUND_RED | BACKGROUND_INTENSITY);
+ bold = FOREGROUND_INTENSITY;
+ break;
+ case 4: /* underline - simulate with cyan */
+ fg = FOREGROUND_BLUE | FOREGROUND_GREEN;
+ bg = default_color & (BACKGROUND_BLUE | BACKGROUND_GREEN |
+ BACKGROUND_RED | BACKGROUND_INTENSITY);
+ bold = default_color & FOREGROUND_INTENSITY;
+ break;
+ case 5: /* blink mode */
+ fg = default_color & (FOREGROUND_BLUE | FOREGROUND_GREEN |
+ FOREGROUND_RED);
+ bg = default_color & (BACKGROUND_BLUE | BACKGROUND_GREEN |
+ BACKGROUND_RED | BACKGROUND_INTENSITY);
+ bold = default_color & FOREGROUND_INTENSITY;
+ break;
+ case 7: /* reverse */
+ fg = (default_color & BACKGROUND_BLUE) ? FOREGROUND_BLUE : 0;
+ fg |= (default_color & BACKGROUND_GREEN) ? FOREGROUND_GREEN : 0;
+ fg |= (default_color & BACKGROUND_RED) ? FOREGROUND_RED : 0;
+ fg |= (default_color & BACKGROUND_INTENSITY) ?
+ FOREGROUND_INTENSITY : 0;
+ bg = (default_color & FOREGROUND_BLUE) ? BACKGROUND_BLUE : 0;
+ bg |= (default_color & FOREGROUND_GREEN) ? BACKGROUND_GREEN : 0;
+ bg |= (default_color & FOREGROUND_RED) ? BACKGROUND_RED : 0;
+ bg |= (default_color & FOREGROUND_INTENSITY) ?
+ BACKGROUND_INTENSITY : 0;
+ break;
+ case 8: /* invisible */
+ fg = (default_color & BACKGROUND_BLUE) ? FOREGROUND_BLUE : 0;
+ fg |= (default_color & BACKGROUND_GREEN) ? FOREGROUND_GREEN : 0;
+ fg |= (default_color & BACKGROUND_RED) ? FOREGROUND_RED : 0;
+ bg = default_color & (BACKGROUND_BLUE | BACKGROUND_GREEN |
+ BACKGROUND_RED | BACKGROUND_INTENSITY);
+ bold = (default_color & BACKGROUND_INTENSITY) ?
+ FOREGROUND_INTENSITY : 0;
+ break;
+ case 9: /* dim */
+ fg = default_color & (FOREGROUND_BLUE | FOREGROUND_GREEN |
+ FOREGROUND_RED);
+ bg = default_color & (BACKGROUND_BLUE | BACKGROUND_GREEN |
+ BACKGROUND_RED | BACKGROUND_INTENSITY);
+ bold = (fg == 0) ? FOREGROUND_INTENSITY : 0;
+ break;
+ case 30: /* BLACK foreground */
+ fg = 0;
+ break;
+ case 31: /* RED foreground */
+ fg = FOREGROUND_RED;
+ break;
+ case 32: /* GREEN foreground */
+ fg = FOREGROUND_GREEN;
+ break;
+ case 33: /* YELLOW foreground */
+ fg = FOREGROUND_RED | FOREGROUND_GREEN;
+ break;
+ case 34: /* BLUE foreground */
+ fg = FOREGROUND_BLUE;
+ break;
+ case 35: /* MAGENTA foreground */
+ fg = FOREGROUND_RED | FOREGROUND_BLUE;
+ break;
+ case 36: /* CYAN foreground */
+ fg = FOREGROUND_BLUE | FOREGROUND_GREEN;
+ break;
+ case 37: /* WHITE foreg */
+ fg = FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED;
+ break;
+ case 40: /* BLACK background */
+ bg = 0;
+ break;
+ case 41: /* RED background */
+ bg = BACKGROUND_RED;
+ break;
+ case 42: /* GREEN background */
+ bg = BACKGROUND_GREEN;
+ break;
+ case 43: /* YELLOW background */
+ bg = BACKGROUND_RED | BACKGROUND_GREEN;
+ break;
+ case 44: /* BLUE background */
+ bg = BACKGROUND_BLUE;
+ break;
+ case 45: /* MAGENTA background */
+ bg = BACKGROUND_RED | BACKGROUND_BLUE;
+ break;
+ case 46: /* CYAN background */
+ bg = BACKGROUND_BLUE | BACKGROUND_GREEN;
+ break;
+ case 47: /* WHITE background */
+ bg = BACKGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_RED;
+ break;
+ default:
+ fg = default_color & (FOREGROUND_BLUE | FOREGROUND_GREEN |
+ FOREGROUND_RED);
+ bg = default_color & (BACKGROUND_BLUE | BACKGROUND_GREEN |
+ BACKGROUND_RED | BACKGROUND_INTENSITY);
+ bold = default_color & FOREGROUND_INTENSITY;
+ break;
+ }
+ SetConsoleTextAttribute (get_output_handle (), fg | bg | bold);
+ break;
+ case 'h':
+ case 'l':
+ /* Ignore */
+ break;
+ case 'J':
+ switch (args_[0])
+ {
+ case 0: /* Clear to end of screen */
+ cursor_get (&x, &y);
+ clear_screen (x, y, -1, -1);
+ break;
+ case 1: /* Clear from beginning of screen to cursor */
+ cursor_get (&x, &y);
+ clear_screen (0, 0, x, y);
+ break;
+ case 2: /* Clear screen */
+ clear_screen (0, 0, -1, -1);
+ cursor_set (TRUE, 0,0);
+ break;
+ default:
+ goto bad_escape;
+ }
+ break;
+
+ case 'A':
+ cursor_rel (0, -(args_[0] ? args_[0] : 1));
+ break;
+ case 'B':
+ cursor_rel (0, args_[0] ? args_[0] : 1);
+ break;
+ case 'C':
+ cursor_rel (args_[0] ? args_[0] : 1, 0);
+ break;
+ case 'D':
+ cursor_rel (-(args_[0] ? args_[0] : 1),0);
+ break;
+ case 'K':
+ switch (args_[0])
+ {
+ case 0: /* Clear to end of line */
+ cursor_get (&x, &y);
+ clear_screen (x, y, -1, y);
+ break;
+ case 2: /* Clear line */
+ cursor_get (&x, &y);
+ clear_screen (0, y, -1, y);
+ break;
+ case 1: /* Clear from bol to cursor */
+ cursor_get (&x, &y);
+ clear_screen (0, y, x, y);
+ break;
+ default:
+ goto bad_escape;
+ }
+ break;
+ case 'H':
+ case 'f':
+ cursor_set (TRUE, (args_[1] ? args_[1] : 1) - 1,
+ (args_[0] ? args_[0] : 1) - 1);
+ break;
+ case 'G': /* hpa - position cursor at column n - 1 */
+ cursor_get (&x, &y);
+ cursor_set (FALSE, (args_[0] ? args_[0] - 1 : 0), y);
+ break;
+ case 'd': /* vpa - position cursor at line n */
+ cursor_get (&x, &y);
+ cursor_set (TRUE, x, (args_[0] ? args_[0] - 1 : 0));
+ break;
+ case 's': /* Save cursor position */
+ cursor_get (&savex, &savey);
+ break;
+ case 'u': /* Restore cursor position */
+ cursor_set (FALSE, savex, savey);
+ break;
+ case 'I': /* TAB */
+ cursor_get (&x, &y);
+ cursor_set (FALSE, 8*(x/8+1), y);
+ break;
+ case 'L': /* AL - insert blank lines */
+ args_[0] = args_[0] ? args_[0] : 1;
+ cursor_get (&x, &y);
+ scroll_screen (0, y, -1, -1, 0, y + args_[0]);
+ break;
+ case 'M': /* DL - delete lines */
+ args_[0] = args_[0] ? args_[0] : 1;
+ cursor_get (&x, &y);
+ scroll_screen (0, y + args_[0], -1, -1, 0, y);
+ break;
+ case '@': /* IC - insert chars */
+ args_[0] = args_[0] ? args_[0] : 1;
+ cursor_get (&x, &y);
+ scroll_screen (x, y, -1, y, x + args_[0], y);
+ break;
+ case 'P': /* DC - delete chars */
+ args_[0] = args_[0] ? args_[0] : 1;
+ cursor_get (&x, &y);
+ scroll_screen (x + args_[0], y, -1, y, x, y);
+ break;
+ case 'S': /* SF - Scroll forward */
+ args_[0] = args_[0] ? args_[0] : 1;
+ scroll_screen(0, args_[0], -1, -1, 0, 0);
+ break;
+ case 'T': /* SR - Scroll down */
+ fillin_info ();
+ args_[0] = args_[0] ? args_[0] : 1;
+ scroll_screen (0, 0, -1, -1, 0, info.winTop + args_[0]);
+ break;
+ case 'X': /* ec - erase chars */
+ args_[0] = args_[0] ? args_[0] : 1;
+ cursor_get (&x, &y);
+ scroll_screen (x + args_[0], y, -1, y, x, y);
+ scroll_screen (x, y, -1, y, x + args_[0], y);
+ break;
+ case 'Z': /* Back tab */
+ cursor_get (&x, &y);
+ cursor_set (FALSE, ((8 * (x / 8 + 1)) - 8), y);
+ break;
+ case 'b': /* Repeat char #1 #2 times */
+ while (args_[1]--)
+ WriteFile (get_output_handle (), &args_[0], 1, (DWORD *) &x, 0);
+ break;
+ case 'c': /* u9 - Terminal enquire string */
+ strcpy (buf, "\033[?6c");
+ puts_readahead (buf);
+ break;
+ case 'n':
+ switch (args_[0])
+ {
+ case 6: /* u7 - Cursor position request */
+ cursor_get (&x, &y);
+ y -= info.winTop;
+ /* x -= info.winLeft; // not available yet */
+ __small_sprintf (buf, "\033[%d;%dR", y + 1, x + 1);
+ puts_readahead (buf);
+ break;
+ default:
+ goto bad_escape;
+ }
+ break;
+ case 'r': /* Set Scroll region */
+ scroll_region.Top = args_[0] ? args_[0] - 1 : 0;
+ scroll_region.Bottom = args_[1] ? args_[1] - 1 : -1;
+ cursor_set (TRUE, 0, 0);
+ break;
+ case 'g': /* TAB set/clear */
+ break;
+ default:
+bad_escape:
+ break;
+ }
+}
+
+const unsigned char *
+fhandler_console::write_normal (const unsigned char *src,
+ const unsigned char *end)
+{
+ /* Scan forward to see what a char which needs special treatment */
+ DWORD done;
+ const unsigned char *found = src;
+
+ while (found < end)
+ {
+ if (base_chars[*found] != NOR)
+ break;
+ found++;
+ }
+ /* Print all the base ones out */
+ if (found != src)
+ {
+ if (! WriteFile (get_output_handle (), src, found - src, &done, 0))
+ {
+ debug_printf ("write failed, handle %p", get_output_handle ());
+ __seterrno ();
+ return 0;
+ }
+ src += done;
+ }
+ if (src < end)
+ {
+ int x, y;
+ switch (base_chars[*src])
+ {
+ case BEL:
+ Beep (412, 100);
+ break;
+ case ESC:
+ state_ = gotesc;
+ break;
+ case DWN: /* WriteFile("\n") always adds CR... */
+ cursor_get (&x, &y);
+ if (y >= srBottom)
+ {
+ if (y < info.winBottom || scroll_region.Top)
+ {
+ scroll_screen (0, srTop + 1, -1, srBottom, 0, srTop);
+ y--;
+ }
+ else
+ WriteFile (get_output_handle (), "\n", 1, &done, 0);
+ }
+ if (!get_w_binary ())
+ x = 0;
+ cursor_set (FALSE, x, y + 1);
+ break;
+ case BAK:
+ cursor_rel (-1, 0);
+ break;
+ case IGN:
+ cursor_rel (1, 0);
+ break;
+ case CR:
+ cursor_get (&x, &y);
+ cursor_set (FALSE, 0, y);
+ break;
+ case ERR:
+ WriteFile (get_output_handle (), src, 1, &done, 0);
+ break;
+ case TAB:
+ cursor_get (&x, &y);
+ cursor_set (FALSE, 8 * (x / 8 + 1), y);
+ break;
+ }
+ src ++;
+ }
+ return src;
+}
+
+int
+fhandler_console::write (const void *vsrc, size_t len)
+{
+ /* Run and check for ansi sequences */
+ unsigned const char *src = (unsigned char *) vsrc;
+ unsigned const char *end = src + len;
+ static NO_COPY unsigned rarg;
+ static NO_COPY char my_title_buf[TITLESIZE + 1];
+
+ debug_printf ("%x, %d", vsrc, len);
+
+ while (src < end)
+ {
+ debug_printf ("at %d(%c) state is %d", *src, isprint (*src) ? *src : ' ',
+ state_);
+ switch (state_)
+ {
+ case normal:
+ src = write_normal (src, end);
+ if (src == 0) /* write_normal fail */
+ return -1;
+ break;
+ case gotesc:
+ if (*src == '[')
+ {
+ state_ = gotsquare;
+ for (nargs_ = 0; nargs_ < MAXARGS; nargs_++)
+ args_[nargs_] = 0;
+ nargs_ = 0;
+ }
+ else if (*src == ']')
+ {
+ rarg = 0;
+ my_title_buf[0] = '\0';
+ state_ = gotrsquare;
+ }
+ else if (*src == 'M') /* Reverse Index */
+ {
+ fillin_info ();
+ scroll_screen (0, 0, -1, -1, 0, info.winTop + 1);
+ state_ = normal;
+ }
+ else if (*src == 'c') /* Reset Linux terminal */
+ {
+ clear_screen (0, 0, -1, -1);
+ cursor_set (TRUE, 0, 0);
+ state_ = normal;
+ }
+ else if (*src == '8') /* Restore cursor position */
+ {
+ cursor_set (FALSE, savex, savey);
+ state_ = normal;
+ }
+ else if (*src == '7') /* Save cursor position */
+ {
+ cursor_get (&savex, &savey);
+ state_ = normal;
+ }
+ else if (*src == 'R')
+ state_ = normal;
+ else
+ {
+ state_ = normal;
+ }
+ src++;
+ break;
+ case gotarg1:
+ if (isdigit (*src))
+ {
+ args_[nargs_] = args_[nargs_] * 10 + *src - '0';
+ src++;
+ }
+ else if (*src == ';')
+ {
+ src++;
+ nargs_++;
+ if (nargs_ >= MAXARGS)
+ nargs_--;
+ }
+ else
+ {
+ state_ = gotcommand;
+ }
+ break;
+ case gotcommand:
+ char_command (*src++);
+ state_ = normal;
+ break;
+ case gotrsquare:
+ if (isdigit(*src))
+ rarg = rarg * 10 + (*src - '0');
+ else if (*src == ';' && (rarg == 2 || rarg == 0))
+ state_ = gettitle;
+ else
+ state_ = eattitle;
+ src++;
+ break;
+ case eattitle:
+ case gettitle:
+ {
+ int n = strlen (my_title_buf);
+ if (*src < ' ' || *src >= '\177')
+ {
+ if (*src == '\007' && state_ == gettitle)
+ {
+ if (old_title)
+ strcpy (old_title, my_title_buf);
+ set_console_title (my_title_buf);
+ }
+ state_ = normal;
+ }
+ else if (n < TITLESIZE)
+ {
+ my_title_buf[n++] = *src;
+ my_title_buf[n] = '\0';
+ }
+ src++;
+ break;
+ }
+ case gotsquare:
+ if (*src == ';')
+ {
+ state_ = gotarg1;
+ nargs_++;
+ src++;
+ }
+ else if (isalpha (*src))
+ {
+ state_ = gotcommand;
+ }
+ else if (*src != '@' && !isalpha (*src) && !isdigit (*src))
+ {
+ /* ignore any extra chars between [ and first arg or command */
+ src++;
+ }
+ else
+ state_ = gotarg1;
+ break;
+ }
+ }
+ syscall_printf ("%d = write_console (,..%d)", len, len);
+
+ return len;
+}
+
+static struct {
+ int vk;
+ const char *val[4];
+} keytable[] = {
+ /* NORMAL */ /* SHIFT */ /* CTRL */ /* ALT */
+ {VK_LEFT, {"\033[D", NULL, NULL, NULL}},
+ {VK_RIGHT, {"\033[C", NULL, NULL, NULL}},
+ {VK_UP, {"\033[A", NULL, NULL, NULL}},
+ {VK_DOWN, {"\033[B", NULL, NULL, NULL}},
+ {VK_PRIOR, {"\033[5~", NULL, NULL, NULL}},
+ {VK_NEXT, {"\033[6~", NULL, NULL, NULL}},
+ {VK_HOME, {"\033[1~", NULL, NULL, NULL}},
+ {VK_END, {"\033[4~", NULL, NULL, NULL}},
+ {VK_INSERT, {"\033[2~", NULL, NULL, NULL}},
+ {VK_DELETE, {"\033[3~", NULL, NULL, NULL}},
+ {VK_F1, {"\033[[A", "\033[23~", NULL, NULL}},
+ {VK_F2, {"\033[[B", "\033[24~", NULL, NULL}},
+ {VK_F3, {"\033[[C", "\033[25~", NULL, NULL}},
+ {VK_F4, {"\033[[D", "\033[26~", NULL, NULL}},
+ {VK_F5, {"\033[[E", "\033[28~", NULL, NULL}},
+ {VK_F6, {"\033[17~", "\033[29~", "\036", NULL}},
+ {VK_F7, {"\033[18~", "\033[31~", NULL, NULL}},
+ {VK_F8, {"\033[19~", "\033[32~", NULL, NULL}},
+ {VK_F9, {"\033[20~", "\033[33~", NULL, NULL}},
+ {VK_F10, {"\033[21~", "\033[34~", NULL, NULL}},
+ {VK_F11, {"\033[23~", NULL, NULL, NULL}},
+ {VK_F12, {"\033[24~", NULL, NULL, NULL}},
+ {VK_NUMPAD5, {"\033[G", NULL, NULL, NULL}},
+ {'6', {NULL, NULL, "\036", NULL}},
+ {0, {"", NULL, NULL, NULL}}
+};
+
+const char *
+get_nonascii_key (INPUT_RECORD& input_rec)
+{
+#define NORMAL 0
+#define SHIFT 1
+#define CONTROL 2
+#define ALT 3
+ int modifier_index = NORMAL;
+
+ if (input_rec.Event.KeyEvent.dwControlKeyState & SHIFT_PRESSED)
+ modifier_index = SHIFT;
+ else if (input_rec.Event.KeyEvent.dwControlKeyState &
+ (LEFT_CTRL_PRESSED | RIGHT_CTRL_PRESSED))
+ modifier_index = CONTROL;
+ else if (input_rec.Event.KeyEvent.dwControlKeyState &
+ (LEFT_ALT_PRESSED | RIGHT_ALT_PRESSED))
+ modifier_index = ALT;
+
+ for (int i = 0; keytable[i].vk; i++)
+ if (input_rec.Event.KeyEvent.wVirtualKeyCode == keytable[i].vk)
+ return keytable[i].val[modifier_index];
+
+ return NULL;
+}
+
+void
+fhandler_console::init (HANDLE f, DWORD a, mode_t bin)
+{
+ this->fhandler_termios::init (f, bin, a);
+
+ /* Ensure both input and output console handles are open */
+ int mode = 0;
+
+ a &= GENERIC_READ | GENERIC_WRITE;
+ if (a == GENERIC_READ)
+ mode = O_RDONLY;
+ if (a == GENERIC_WRITE)
+ mode = O_WRONLY;
+ if (a == (GENERIC_READ | GENERIC_WRITE))
+ mode = O_RDWR;
+ open (0, mode);
+ if (f != INVALID_HANDLE_VALUE)
+ CloseHandle (f); /* Reopened by open */
+
+ output_tcsetattr (0, &tc->ti);
+}
+
+int
+fhandler_console::igncr_enabled (void)
+{
+ return tc->ti.c_iflag & IGNCR;
+}
+
+void
+fhandler_console::set_close_on_exec (int val)
+{
+ this->fhandler_base::set_close_on_exec (val);
+ set_inheritance (output_handle, val);
+}
+
+void
+fhandler_console::fixup_after_fork (HANDLE parent)
+{
+ HANDLE h = get_handle ();
+ HANDLE oh = get_output_handle ();
+
+ /* Windows does not allow duplication of console handles between processes
+ so open the console explicitly. */
+
+ if (!open(get_name (), get_flags (), 0))
+ system_printf ("error opening console after fork, %E");
+
+ if (!get_close_on_exec ())
+ {
+ CloseHandle (h);
+ CloseHandle (oh);
+ }
+}
+
+void __stdcall
+set_console_title (char *title)
+{
+ int rc;
+ char buf[257];
+ strncpy(buf, title, sizeof(buf) - 1);
+ buf[sizeof(buf) - 1] = '\0';
+ if ((rc = WaitForSingleObject (title_mutex, 15000)) != WAIT_OBJECT_0)
+ sigproc_printf ("wait for title mutex failed rc %d, %E", rc);
+ SetConsoleTitle (buf);
+ ReleaseMutex (title_mutex);
+ debug_printf ("title '%s'", buf);
+}
+
+int
+fhandler_console::de_linearize (const char *buf, const char *unix_name,
+ const char *win32_name)
+{
+ int res = fhandler_base::de_linearize (buf, unix_name, win32_name);
+ HANDLE h = get_handle ();
+ HANDLE oh = get_output_handle ();
+
+ if (!open(get_name (), get_flags (), 0))
+ {
+ int sawerr = 0;
+ if (!get_io_handle ())
+ {
+ system_printf ("error opening input console handle after exec, errno %d, %E", get_errno ());
+ sawerr = 1;
+ }
+ if (!get_output_handle ())
+ {
+ system_printf ("error opening input console handle after exec, errno %d, %E", get_errno ());
+ sawerr = 1;
+ }
+
+ if (!sawerr)
+ system_printf ("error opening console after exec, errno %d, %E", get_errno ());
+ }
+
+ CloseHandle (h);
+ CloseHandle (oh);
+ return res;
+}
diff --git a/winsup/cygwin/fhandler_floppy.cc b/winsup/cygwin/fhandler_floppy.cc
new file mode 100644
index 000000000..7c589824d
--- /dev/null
+++ b/winsup/cygwin/fhandler_floppy.cc
@@ -0,0 +1,90 @@
+/* fhandler_floppy.cc. See fhandler.h for a description of the
+ fhandler classes.
+
+ Copyright 1999 Cygnus Solutions.
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#include <sys/termios.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <unistd.h>
+#include "winsup.h"
+
+/**********************************************************************/
+/* fhandler_dev_floppy */
+
+int
+fhandler_dev_floppy::is_eom (int win_error)
+{
+ int ret = (win_error == ERROR_INVALID_PARAMETER);
+ if (ret)
+ debug_printf ("end of medium");
+ return ret;
+}
+
+int
+fhandler_dev_floppy::is_eof (int win_error)
+{
+ int ret = 0;
+ if (ret)
+ debug_printf ("end of file");
+ return ret;
+}
+
+fhandler_dev_floppy::fhandler_dev_floppy (const char *name, int unit) : fhandler_dev_raw (FH_FLOPPY, name, unit)
+{
+ set_cb (sizeof *this);
+}
+
+int
+fhandler_dev_floppy::open (const char *path, int flags, mode_t)
+{
+ /* The correct size of the buffer would be 512 bytes,
+ * which is the atomic size, supported by WinNT.
+ * Unfortunately, the performance is worse than
+ * access to file system on same device!
+ * Setting buffer size to a relatively big value
+ * increases performance by means.
+ * The new ioctl call with 'rdevio.h' header file
+ * supports changing this value.
+ *
+ * Let's be smart: Let's take a multiplier of typical tar
+ * and cpio buffer sizes by default!
+ */
+ devbufsiz = 61440L; /* 512L; */
+ return fhandler_dev_raw::open (path, flags);
+}
+
+int
+fhandler_dev_floppy::close (void)
+{
+ int ret;
+
+ ret = writebuf ();
+ if (ret)
+ {
+ fhandler_dev_raw::close ();
+ return ret;
+ }
+ return fhandler_dev_raw::close ();
+}
+
+off_t
+fhandler_dev_floppy::lseek (off_t offset, int whence)
+{
+ /* FIXME: Need to implement better. */
+ offset = (offset / 512) * 512;
+ return fhandler_base::lseek (offset, whence);
+}
+
+int
+fhandler_dev_floppy::ioctl (unsigned int cmd, void *buf)
+{
+ return fhandler_dev_raw::ioctl (cmd, buf);
+}
+
diff --git a/winsup/cygwin/fhandler_raw.cc b/winsup/cygwin/fhandler_raw.cc
new file mode 100644
index 000000000..a1c166627
--- /dev/null
+++ b/winsup/cygwin/fhandler_raw.cc
@@ -0,0 +1,495 @@
+/* fhandler_raw.cc. See fhandler.h for a description of the fhandler classes.
+
+ Copyright 1999, 2000 Cygnus Solutions.
+
+ This file is part of Cygwin.
+
+ This software is a copyrighted work licensed under the terms of the
+ Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+ details. */
+
+#include <sys/termios.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <unistd.h>
+#include "winsup.h"
+
+#include <cygwin/rdevio.h>
+#include <sys/mtio.h>
+
+/**********************************************************************/
+/* fhandler_dev_raw */
+
+void
+fhandler_dev_raw::clear (void)
+{
+ devbuf = NULL;
+ devbufsiz = 0;
+ devbufstart = 0;
+ devbufend = 0;
+ eom_detected = 0;
+ eof_detected = 0;
+ lastblk_to_read = 0;
+ unit = 0;
+}
+
+int
+fhandler_dev_raw::writebuf (void)
+{
+ DWORD written;
+ int ret = 0;
+
+ if (is_writing && devbuf && devbufend)
+ {
+ memset (devbuf + devbufend, 0, devbufsiz - devbufend);
+ DWORD to_write = ((devbufend - 1) / 512 + 1) * 512;
+ ret = 0;
+
+ if (!WriteFile (get_handle (), devbuf, to_write, &written, 0))
+ {
+ ret = GetLastError ();
+ if (is_eom (ret))
+ eom_detected = 1;
+ }
+
+ if (written)
+ has_written = 1;
+
+ syscall_printf ("%d = WriteFile(%d, %d, write %d, written %d, 0)\n",
+ ret, get_handle (), devbuf, to_write, written);
+ devbufstart = devbufend = 0;
+ }
+ is_writing = 0;
+ return ret;
+}
+
+fhandler_dev_raw::fhandler_dev_raw (DWORD devtype, const char *name, int unit) : fhandler_base (devtype, name)
+{
+ clear ();
+ this->unit = unit;
+}
+
+fhandler_dev_raw::~fhandler_dev_raw (void)
+{
+ delete[]devbuf;
+ clear ();
+}
+
+int
+fhandler_dev_raw::de_linearize (const char *buf, const char *unix_name,
+ const char *win32_name)
+{
+ int ret = fhandler_base::de_linearize (buf, unix_name, win32_name);
+ if (devbufsiz > 1L)
+ {
+ devbuf = new char[devbufsiz];
+ devbufstart = devbufend = 0;
+ }
+ return ret;
+}
+
+int
+fhandler_dev_raw::open (const char *path, int flags, mode_t)
+{
+ path_conv real_path (path, SYMLINK_IGNORE);
+ int ret;
+
+ set_name (path, real_path.get_win32 ());
+
+ /* Always open a raw device existing */
+ ret = fhandler_base::open (path, flags & ~(O_CREAT | O_TRUNC));
+ if (ret)
+ {
+ if (devbufsiz > 1L)
+ {
+ devbuf = new char[devbufsiz];
+ }
+ }
+ else
+ {
+ devbufsiz = 0;
+ }
+ return ret;
+}
+
+int
+fhandler_dev_raw::close (void)
+{
+ return fhandler_base::close ();
+}
+
+int
+fhandler_dev_raw::fstat (struct stat *buf)
+{
+ if (!buf)
+ {
+ set_errno (EINVAL);
+ return -1;
+ }
+
+ memset (buf, 0, sizeof *buf);
+ buf->st_mode = S_IFCHR |
+ S_IRUSR | S_IWUSR |
+ S_IRGRP | S_IWGRP |
+ S_IROTH | S_IWOTH;
+ buf->st_nlink = 1;
+ buf->st_blksize = devbuf ? devbufsiz : 1;
+ buf->st_dev = buf->st_rdev = get_device () << 8 | (unit & 0xff);
+
+ return 0;
+}
+
+int
+fhandler_dev_raw::raw_read (void *ptr, size_t ulen)
+{
+ DWORD bytes_read = 0;
+ DWORD read2;
+ DWORD bytes_to_read;
+ int ret;
+ size_t len = ulen;
+ char *tgt;
+
+ /* In mode O_RDWR the buffer has to be written to device first */
+ ret = writebuf ();
+ if (ret)
+ {
+ set_errno (is_eom (ret) ? ENOSPC : EACCES);
+ return -1;
+ }
+
+ /* Checking a previous end of file */
+ if (eof_detected && !lastblk_to_read)
+ {
+ eof_detected = 0;
+ return 0;
+ }
+
+ /* Checking a previous end of media */
+ if (eom_detected && !lastblk_to_read)
+ {
+ set_errno (ENOSPC);
+ return -1;
+ }
+
+ if (devbuf)
+ {
+ while (len > 0)
+ {
+ if (devbufstart < devbufend)
+ {
+ bytes_to_read = min (len, devbufend - devbufstart);
+ debug_printf ("read %d bytes from buffer (rest %d)\n",
+ bytes_to_read, devbufstart - devbufend);
+ memcpy (ptr, devbuf + devbufstart, bytes_to_read);
+ len -= bytes_to_read;
+ ptr = (void *) ((char *) ptr + bytes_to_read);
+ bytes_read += bytes_to_read;
+ devbufstart += bytes_to_read;
+
+ if (lastblk_to_read)
+ {
+ lastblk_to_read = 0;
+ break;
+ }
+ }
+ if (len > 0)
+ {
+ if (len >= devbufsiz)
+ {
+ bytes_to_read = (len / 512) * 512;
+ tgt = (char *) ptr;
+ debug_printf ("read %d bytes direct from file\n",
+ bytes_to_read);
+ }
+ else
+ {
+ bytes_to_read = devbufsiz;
+ tgt = devbuf;
+ debug_printf ("read %d bytes from file into buffer\n",
+ bytes_to_read);
+ }
+ if (!ReadFile (get_handle (), tgt, bytes_to_read, &read2, 0))
+ {
+ ret = GetLastError ();
+ syscall_printf ("ReadFile %s failed with error %d\n",
+ get_name (), ret);
+ if (!is_eof (ret) && !is_eom (ret))
+ {
+ debug_printf ("return -1, set errno to EACCES");
+ set_errno (EACCES);
+ return -1;
+ }
+
+ if (is_eof (ret))
+ eof_detected = 1;
+ else
+ eom_detected = 1;
+
+ if (!read2)
+ {
+ if (!bytes_read && is_eom (ret))
+ {
+ debug_printf ("return -1, set errno to ENOSPC");
+ set_errno (ENOSPC);
+ return -1;
+ }
+ break;
+ }
+ lastblk_to_read = 1;
+ }
+ if (! read2)
+ break;
+ if (tgt == devbuf)
+ {
+ devbufstart = 0;
+ devbufend = read2;
+ }
+ else
+ {
+ len -= bytes_to_read;
+ ptr = (void *) ((char *) ptr + bytes_to_read);
+ bytes_read += bytes_to_read;
+ }
+ }
+ }
+ }
+ else if (!ReadFile (get_handle (), ptr, len, &bytes_read, 0))
+ {
+ ret = GetLastError ();
+ syscall_printf ("ReadFile %s failed with error %d\n",
+ get_name (), ret);
+ if (!is_eof (ret) && !is_eom (ret))
+ {
+ debug_printf ("return -1, set errno to EACCES");
+ set_errno (EACCES);
+ return -1;
+ }
+ if (bytes_read)
+ {
+ if (is_eof (ret))
+ eof_detected = 1;
+ else
+ eom_detected = 1;
+ }
+ else if (is_eom (ret))
+ {
+ debug_printf ("return -1, set errno to ENOSPC");
+ set_errno (ENOSPC);
+ return -1;
+ }
+ }
+
+ return bytes_read;
+}
+
+int
+fhandler_dev_raw::raw_write (const void *ptr, size_t len)
+{
+ DWORD bytes_written = 0;
+ DWORD bytes_to_write;
+ DWORD written;
+ char *p = (char *) ptr;
+ char *tgt;
+ int ret;
+
+ /* Checking a previous end of media on tape */
+ if (eom_detected)
+ {
+ set_errno (ENOSPC);
+ return -1;
+ }
+
+ if (!is_writing)
+ devbufstart = devbufend = 0;
+ is_writing = 1;
+
+ if (devbuf)
+ {
+ while (len > 0)
+ {
+ if ((len < devbufsiz || devbufend > 0) && devbufend < devbufsiz)
+ {
+ bytes_to_write = min (len, devbufsiz - devbufend);
+ memcpy (devbuf + devbufend, p, bytes_to_write);
+ bytes_written += bytes_to_write;
+ devbufend += bytes_to_write;
+ p += bytes_to_write;
+ len -= bytes_to_write;
+ }
+ else
+ {
+ if (devbufend == devbufsiz)
+ {
+ bytes_to_write = devbufsiz;
+ tgt = devbuf;
+ }
+ else
+ {
+ bytes_to_write = (len / devbufsiz) * devbufsiz;
+ tgt = p;
+ }
+
+ ret = 0;
+ if (!WriteFile (get_handle (), tgt, bytes_to_write, &written, 0))
+ ret = GetLastError ();
+ syscall_printf ("%d = WriteFile(%d, %d, write %d, written %d, 0)\n",
+ ret, get_handle (), tgt, bytes_to_write, written);
+ if (written)
+ has_written = 1;
+
+ if (ret)
+ {
+ if (!is_eom (ret))
+ {
+ __seterrno ();
+ return -1;
+ }
+
+ eom_detected = 1;
+
+ if (!written && !bytes_written)
+ {
+ set_errno (ENOSPC);
+ return -1;
+ }
+
+ if (tgt == p)
+ bytes_written += written;
+
+ break; // from while (len > 0)
+ }
+
+ if (tgt == devbuf)
+ {
+ if (written != devbufsiz)
+ memmove (devbuf, devbuf + written, devbufsiz - written);
+ devbufend = devbufsiz - written;
+ }
+ else
+ {
+ len -= written;
+ p += written;
+ bytes_written += written;
+ }
+ }
+ }
+ }
+ else if (len > 0)
+ {
+ if (!WriteFile (get_handle (), ptr, len, &bytes_written, 0))
+ {
+ ret = GetLastError ();
+ syscall_printf ("WriteFile %s failed with error %d\n",
+ get_name (), ret);
+ if (bytes_written)
+ has_written = 1;
+ if (!is_eom (ret))
+ {
+ set_errno (EACCES);
+ return -1;
+ }
+ eom_detected = 1;
+ if (!bytes_written)
+ {
+ set_errno (ENOSPC);
+ return -1;
+ }
+ }
+ has_written = 1;
+ }
+ return bytes_written;
+}
+
+int
+fhandler_dev_raw::dup (fhandler_base *child)
+{
+ int ret = fhandler_base::dup (child);
+
+ if (! ret)
+ {
+ fhandler_dev_raw *fhc = (fhandler_dev_raw *) child;
+
+ fhc->devbufsiz = devbufsiz;
+ if (devbufsiz > 1L)
+ {
+ fhc->devbuf = new char[devbufsiz];
+ memcpy (fhc->devbuf, devbuf, devbufend);
+ }
+ fhc->devbufstart = devbufstart;
+ fhc->devbufend = devbufend;
+ fhc->eom_detected = eom_detected;
+ fhc->eof_detected = eof_detected;
+ fhc->lastblk_to_read = lastblk_to_read;
+ fhc->unit = unit;
+ }
+ return ret;
+}
+
+int
+fhandler_dev_raw::ioctl (unsigned int cmd, void *buf)
+{
+ int ret = NO_ERROR;
+
+ if (cmd == RDIOCDOP)
+ {
+ struct rdop *op = (struct rdop *) buf;
+
+ if (!op)
+ ret = ERROR_INVALID_PARAMETER;
+ else
+ switch (op->rd_op)
+ {
+ case RDSETBLK:
+ if (get_device () == FH_TAPE)
+ {
+ struct mtop mop;
+
+ mop.mt_op = MTSETBLK;
+ mop.mt_count = op->rd_parm;
+ ret = ioctl (MTIOCTOP, &mop);
+ }
+ else if (op->rd_parm % 512)
+ ret = ERROR_INVALID_PARAMETER;
+ else if (devbuf && op->rd_parm < devbufend - devbufstart)
+ ret = ERROR_INVALID_PARAMETER;
+ else if (!devbuf || op->rd_parm != devbufsiz)
+ {
+ char *buf = new char[op->rd_parm];
+ if (devbuf)
+ {
+ memcpy (buf, devbuf + devbufstart, devbufend - devbufstart);
+ devbufend -= devbufstart;
+ delete[]devbuf;
+ }
+ else
+ devbufend = 0;
+
+ devbufstart = 0;
+ devbuf = buf;
+ devbufsiz = op->rd_parm;
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ else if (cmd == RDIOCGET)
+ {
+ struct rdget *get = (struct rdget *) buf;
+
+ if (!get)
+ ret = ERROR_INVALID_PARAMETER;
+ else
+ get->bufsiz = devbufsiz ? devbufsiz : 1L;
+ }
+ else
+ return fhandler_base::ioctl (cmd, buf);
+
+ if (ret != NO_ERROR)
+ {
+ SetLastError (ret);
+ __seterrno ();
+ return -1;
+ }
+ return 0;
+}
diff --git a/winsup/cygwin/fhandler_serial.cc b/winsup/cygwin/fhandler_serial.cc
new file mode 100644
index 000000000..de4c7fedd
--- /dev/null
+++ b/winsup/cygwin/fhandler_serial.cc
@@ -0,0 +1,883 @@
+/* fhandler_serial.cc
+
+ Copyright 1996, 1997, 1998, 1999, 2000 Cygnus Solutions.
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#include <fcntl.h>
+#include <errno.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include "winsup.h"
+
+/**********************************************************************/
+/* fhandler_serial */
+
+fhandler_serial::fhandler_serial (const char *name, DWORD devtype, int unit) :
+ fhandler_base (devtype, name, unit)
+{
+ set_cb (sizeof *this);
+ vmin_ = 0;
+ vtime_ = 0;
+ pgrp_ = myself->pgid;
+ set_need_fork_fixup ();
+}
+
+void
+fhandler_serial::overlapped_setup ()
+{
+ memset (&io_status, 0, sizeof (io_status));
+ io_status.hEvent = CreateEvent (&sec_none_nih, TRUE, FALSE, NULL);
+ ProtectHandle (io_status.hEvent);
+ overlapped_armed = 0;
+}
+
+int
+fhandler_serial::raw_read (void *ptr, size_t ulen)
+{
+ int tot;
+ DWORD n;
+ HANDLE w4[2];
+ DWORD minchars = vmin_ ?: ulen;
+
+ w4[0] = io_status.hEvent;
+ w4[1] = signal_arrived;
+
+ debug_printf ("ulen %d, vmin_ %d, vtime_ %d, hEvent %p", ulen, vmin_, vtime_,
+ io_status.hEvent);
+ if (!overlapped_armed)
+ {
+ (void) SetCommMask (get_handle (), EV_RXCHAR);
+ ResetEvent (io_status.hEvent);
+ }
+
+ for (n = 0, tot = 0; ulen; ulen -= n, ptr = (char *)ptr + n)
+ {
+ DWORD ev;
+ COMSTAT st;
+ DWORD inq = 1;
+
+ n = 0;
+
+ if (!vtime_ && !vmin_)
+ inq = ulen;
+ else if (vtime_)
+ {
+ inq = ulen; // non-interruptible -- have to use kernel timeouts
+ // also note that this is not strictly correct.
+ // if vmin > ulen then things won't work right.
+ overlapped_armed = -1;
+ }
+ if (!overlapped_armed)
+ {
+ if (!ClearCommError (get_handle (), &ev, &st))
+ goto err;
+ else if (ev)
+ termios_printf ("error detected %x", ev);
+ else if (st.cbInQue)
+ inq = st.cbInQue;
+ else if ((size_t)tot >= minchars)
+ break;
+ else if (WaitCommEvent (get_handle (), &ev, &io_status))
+ {
+ debug_printf ("WaitCommEvent succeeded: ev %x", ev);
+ if (!ev)
+ continue;
+ }
+ else if (GetLastError () != ERROR_IO_PENDING)
+ goto err;
+ else
+ {
+ overlapped_armed = 1;
+ switch (WaitForMultipleObjects (2, w4, FALSE, INFINITE))
+ {
+ case WAIT_OBJECT_0:
+ if (!GetOverlappedResult (get_handle (), &io_status, &n, FALSE))
+ goto err;
+ debug_printf ("n %d, ev %x", n, ev);
+ break;
+ case WAIT_OBJECT_0 + 1:
+ tot = -1;
+ PurgeComm (get_handle (), PURGE_RXABORT);
+ overlapped_armed = 0;
+ set_sig_errno (EINTR);
+ goto out;
+ default:
+ goto err;
+ }
+ }
+ }
+
+ overlapped_armed = 0;
+ ResetEvent (io_status.hEvent);
+ if (inq > ulen)
+ inq = ulen;
+ debug_printf ("inq %d", inq);
+ if (ReadFile (get_handle(), ptr, min (inq, ulen), &n, &io_status))
+ /* Got something */;
+ else if (GetLastError () != ERROR_IO_PENDING)
+ goto err;
+ else if (!GetOverlappedResult (get_handle (), &io_status, &n, TRUE))
+ goto err;
+
+ tot += n;
+ debug_printf ("vtime_ %d, vmin_ %d, n %d, tot %d", vtime_, vmin_, n, tot);
+ if (vtime_ || !vmin_ || !n)
+ break;
+ continue;
+
+ err:
+ PurgeComm (get_handle (), PURGE_RXABORT);
+ debug_printf ("err %E");
+ if (GetLastError () == ERROR_OPERATION_ABORTED)
+ n = 0;
+ else
+ {
+ tot = -1;
+ __seterrno ();
+ break;
+ }
+ }
+
+out:
+ return tot;
+}
+
+/* Cover function to WriteFile to provide Posix interface and semantics
+ (as much as possible). */
+int
+fhandler_serial::raw_write (const void *ptr, size_t len)
+{
+ DWORD bytes_written;
+
+ if (overlapped_armed)
+ PurgeComm (get_handle (), PURGE_TXABORT | PURGE_RXABORT);
+ ResetEvent (io_status.hEvent);
+
+ for (;;)
+ {
+ overlapped_armed = TRUE;
+ if (WriteFile (get_handle(), ptr, len, &bytes_written, &io_status))
+ break;
+
+ switch (GetLastError ())
+ {
+ case ERROR_OPERATION_ABORTED:
+ continue;
+ case ERROR_IO_PENDING:
+ break;
+ default:
+ goto err;
+ }
+
+ if (!GetOverlappedResult (get_handle (), &io_status, &bytes_written, TRUE))
+ goto err;
+
+ break;
+ }
+
+ overlapped_armed = FALSE;
+ return bytes_written;
+
+err:
+ __seterrno ();
+ return -1;
+}
+
+void
+fhandler_serial::dump (void)
+{
+ paranoid_printf ("here");
+}
+
+void
+fhandler_serial::init (HANDLE f, DWORD flags, mode_t bin)
+{
+ fhandler_base::init (f, flags, bin);
+ (void) open (NULL, flags, bin ? O_BINARY : 0);
+}
+
+int
+fhandler_serial::open (const char *name, int flags, mode_t mode)
+{
+ int res;
+ COMMTIMEOUTS to;
+ extern BOOL reset_com;
+
+ syscall_printf ("fhandler_serial::open (%s, %p, %p)",
+ get_name (), flags, mode);
+
+ if (name && !(res = this->fhandler_base::open (flags, mode)))
+ return 0;
+ else
+ res = 1;
+
+ (void) SetCommMask (get_handle (), EV_RXCHAR);
+
+ set_r_no_interrupt (1); // Handled explicitly in read code
+
+ overlapped_setup ();
+
+ memset (&to, 0, sizeof (to));
+ (void) SetCommTimeouts (get_handle (), &to);
+
+ /* Reset serial port to known state of 9600-8-1-no flow control
+ on open for better behavior under Win 95.
+
+ FIXME: This should only be done when explicitly opening the com
+ port. It should not be reset if an fd is inherited.
+ Using __progname in this way, to determine how far along in the
+ initialization we are, is really a terrible kludge and should
+ be fixed ASAP.
+ */
+ extern char *__progname;
+ if (reset_com && __progname)
+ {
+ DCB state;
+ GetCommState (get_handle (), &state);
+ syscall_printf ("setting initial state on %s (reset_com %d)",
+ get_name (), reset_com);
+ state.BaudRate = CBR_9600;
+ state.ByteSize = 8;
+ state.StopBits = ONESTOPBIT;
+ state.Parity = NOPARITY; /* FIXME: correct default? */
+ state.fBinary = TRUE; /* binary xfer */
+ state.EofChar = 0; /* no end-of-data in binary mode */
+ state.fNull = FALSE; /* don't discard nulls in binary mode */
+ state.fParity = FALSE; /* ignore parity errors */
+ state.fErrorChar = FALSE;
+ state.fTXContinueOnXoff = TRUE; /* separate TX and RX flow control */
+ state.fOutX = FALSE; /* disable transmission flow control */
+ state.fInX = FALSE; /* disable reception flow control */
+ state.XonChar = 0x11;
+ state.XoffChar = 0x13;
+ state.fOutxDsrFlow = FALSE; /* disable DSR flow control */
+ state.fRtsControl = RTS_CONTROL_ENABLE; /* ignore lead control except
+ DTR */
+ state.fOutxCtsFlow = FALSE; /* disable output flow control */
+ state.fDtrControl = DTR_CONTROL_ENABLE; /* assert DTR */
+ state.fDsrSensitivity = FALSE; /* don't assert DSR */
+ state.fAbortOnError = TRUE;
+ if (!SetCommState (get_handle (), &state))
+ system_printf ("couldn't set initial state for %s, %E", get_name ());
+ }
+
+ SetCommMask (get_handle (), EV_RXCHAR);
+ syscall_printf ("%p = fhandler_serial::open (%s, %p, %p)",
+ res, get_name (), flags, mode);
+ return res;
+}
+
+int
+fhandler_serial::close ()
+{
+ (void) ForceCloseHandle (io_status.hEvent);
+ return fhandler_base::close ();
+}
+
+/* tcsendbreak: POSIX 7.2.2.1 */
+/* Break for 250-500 milliseconds if duration == 0 */
+/* Otherwise, units for duration are undefined */
+int
+fhandler_serial::tcsendbreak (int duration)
+{
+ unsigned int sleeptime = 300;
+
+ if (duration > 0)
+ sleeptime *= duration;
+
+ if (SetCommBreak (get_handle ()) == 0)
+ return -1;
+
+ /* FIXME: need to send zero bits during duration */
+ usleep (sleeptime);
+
+ if (ClearCommBreak (get_handle ()) == 0)
+ return -1;
+
+ syscall_printf ("0 = fhandler_serial:tcsendbreak (%d)", duration);
+
+ return 0;
+}
+
+/* tcdrain: POSIX 7.2.2.1 */
+int
+fhandler_serial::tcdrain (void)
+{
+ if (FlushFileBuffers (get_handle ()) == 0)
+ return -1;
+
+ return 0;
+}
+
+/* tcflow: POSIX 7.2.2.1 */
+int
+fhandler_serial::tcflow (int action)
+{
+ DWORD win32action = 0;
+ DCB dcb;
+ char xchar;
+
+ termios_printf ("action %d", action);
+
+ switch (action)
+ {
+ case TCOOFF:
+ win32action = SETXOFF;
+ break;
+ case TCOON:
+ win32action = SETXON;
+ break;
+ case TCION:
+ case TCIOFF:
+ if (GetCommState (get_handle (), &dcb) == 0)
+ return -1;
+ if (action == TCION)
+ xchar = (dcb.XonChar ? dcb.XonChar : 0x11);
+ else
+ xchar = (dcb.XoffChar ? dcb.XoffChar : 0x13);
+ if (TransmitCommChar (get_handle (), xchar) == 0)
+ return -1;
+ return 0;
+ break;
+ default:
+ return -1;
+ break;
+ }
+
+ if (EscapeCommFunction (get_handle (), win32action) == 0)
+ return -1;
+
+ return 0;
+}
+
+/* tcflush: POSIX 7.2.2.1 */
+int
+fhandler_serial::tcflush (int queue)
+{
+ if (queue == TCOFLUSH || queue == TCIOFLUSH)
+ PurgeComm (get_handle (), PURGE_TXABORT | PURGE_TXCLEAR);
+
+ if (queue == TCIFLUSH | queue == TCIOFLUSH)
+ /* Input flushing by polling until nothing turns up
+ (we stop after 1000 chars anyway) */
+ for (int max = 1000; max > 0; max--)
+ {
+ DWORD ev;
+ COMSTAT st;
+ if (!PurgeComm (get_handle (), PURGE_RXABORT | PURGE_RXCLEAR))
+ break;
+ Sleep (100);
+ if (!ClearCommError (get_handle (), &ev, &st) || !st.cbInQue)
+ break;
+ }
+
+ return 0;
+}
+
+/* tcsetattr: POSIX 7.2.1.1 */
+int
+fhandler_serial::tcsetattr (int action, const struct termios *t)
+{
+ /* Possible actions:
+ TCSANOW: immediately change attributes.
+ TCSADRAIN: flush output, then change attributes.
+ TCSAFLUSH: flush output and discard input, then change attributes.
+ */
+
+ BOOL dropDTR = FALSE;
+ COMMTIMEOUTS to;
+ DCB ostate, state;
+ unsigned int ovtime = vtime_, ovmin = vmin_;
+
+ termios_printf ("action %d", action);
+ if ((action == TCSADRAIN) || (action == TCSAFLUSH))
+ {
+ FlushFileBuffers (get_handle ());
+ termios_printf ("flushed file buffers");
+ }
+ if (action == TCSAFLUSH)
+ PurgeComm (get_handle (), (PURGE_RXABORT | PURGE_RXCLEAR));
+
+ /* get default/last comm state */
+ if (!GetCommState (get_handle (), &ostate))
+ return -1;
+
+ state = ostate;
+
+ /* -------------- Set baud rate ------------------ */
+ /* FIXME: WIN32 also has 14400, 56000, 128000, and 256000.
+ Unix also has 230400. */
+
+ switch (t->c_ospeed)
+ {
+ case B0: /* drop DTR */
+ dropDTR = TRUE;
+ state.BaudRate = 0;
+ break;
+ case B110:
+ state.BaudRate = CBR_110;
+ break;
+ case B300:
+ state.BaudRate = CBR_300;
+ break;
+ case B600:
+ state.BaudRate = CBR_600;
+ break;
+ case B1200:
+ state.BaudRate = CBR_1200;
+ break;
+ case B2400:
+ state.BaudRate = CBR_2400;
+ break;
+ case B4800:
+ state.BaudRate = CBR_4800;
+ break;
+ case B9600:
+ state.BaudRate = CBR_9600;
+ break;
+ case B19200:
+ state.BaudRate = CBR_19200;
+ break;
+ case B38400:
+ state.BaudRate = CBR_38400;
+ break;
+ case B57600:
+ state.BaudRate = CBR_57600;
+ break;
+ case B115200:
+ state.BaudRate = CBR_115200;
+ break;
+ default:
+ /* Unsupported baud rate! */
+ termios_printf ("Invalid t->c_ospeed %d", t->c_ospeed);
+ set_errno (EINVAL);
+ return -1;
+ }
+
+ /* -------------- Set byte size ------------------ */
+
+ switch (t->c_cflag & CSIZE)
+ {
+ case CS5:
+ state.ByteSize = 5;
+ break;
+ case CS6:
+ state.ByteSize = 6;
+ break;
+ case CS7:
+ state.ByteSize = 7;
+ break;
+ case CS8:
+ state.ByteSize = 8;
+ break;
+ default:
+ /* Unsupported byte size! */
+ termios_printf ("Invalid t->c_cflag byte size %d",
+ t->c_cflag & CSIZE);
+ set_errno (EINVAL);
+ return -1;
+ }
+
+ /* -------------- Set stop bits ------------------ */
+
+ if (t->c_cflag & CSTOPB)
+ state.StopBits = TWOSTOPBITS;
+ else
+ state.StopBits = ONESTOPBIT;
+
+ /* -------------- Set parity ------------------ */
+
+ if (t->c_cflag & PARENB)
+ state.Parity = (t->c_cflag & PARODD) ? ODDPARITY : EVENPARITY;
+ else
+ state.Parity = NOPARITY;
+
+ state.fBinary = TRUE; /* Binary transfer */
+ state.EofChar = 0; /* No end-of-data in binary mode */
+ state.fNull = FALSE; /* Don't discard nulls in binary mode */
+
+ /* -------------- Parity errors ------------------ */
+ /* fParity combines the function of INPCK and NOT IGNPAR */
+
+ if ((t->c_iflag & INPCK) && !(t->c_iflag & IGNPAR))
+ state.fParity = TRUE; /* detect parity errors */
+ else
+ state.fParity = FALSE; /* ignore parity errors */
+
+ /* Only present in Win32, Unix has no equivalent */
+ state.fErrorChar = FALSE;
+ state.ErrorChar = 0;
+
+ /* -------------- Set software flow control ------------------ */
+ /* Set fTXContinueOnXoff to FALSE. This prevents the triggering of a
+ premature XON when the remote device interprets a received character
+ as XON (same as IXANY on the remote side). Otherwise, a TRUE
+ value separates the TX and RX functions. */
+
+ state.fTXContinueOnXoff = TRUE; /* separate TX and RX flow control */
+
+ /* Transmission flow control */
+ if (t->c_iflag & IXON)
+ state.fOutX = TRUE; /* enable */
+ else
+ state.fOutX = FALSE; /* disable */
+
+ /* Reception flow control */
+ if (t->c_iflag & IXOFF)
+ state.fInX = TRUE; /* enable */
+ else
+ state.fInX = FALSE; /* disable */
+
+ /* XoffLim and XonLim are left at default values */
+
+ state.XonChar = (t->c_cc[VSTART] ? t->c_cc[VSTART] : 0x11);
+ state.XoffChar = (t->c_cc[VSTOP] ? t->c_cc[VSTOP] : 0x13);
+
+ /* -------------- Set hardware flow control ------------------ */
+
+ /* Disable DSR flow control */
+ state.fOutxDsrFlow = FALSE;
+
+ /* Some old flavors of Unix automatically enabled hardware flow
+ control when software flow control was not enabled. Since newer
+ Unices tend to require explicit setting of hardware flow-control,
+ this is what we do. */
+
+ /* RTS/CTS flow control */
+ if (t->c_cflag & CRTSCTS)
+ { /* enable */
+ state.fOutxCtsFlow = TRUE;
+ state.fRtsControl = RTS_CONTROL_HANDSHAKE;
+ }
+ else
+ { /* disable */
+ state.fRtsControl = RTS_CONTROL_ENABLE;
+ state.fOutxCtsFlow = FALSE;
+ }
+
+ if (t->c_cflag & CRTSXOFF)
+ state.fRtsControl = RTS_CONTROL_HANDSHAKE;
+
+ /* -------------- DTR ------------------ */
+ /* Assert DTR on device open */
+
+ state.fDtrControl = DTR_CONTROL_ENABLE;
+
+ /* -------------- DSR ------------------ */
+ /* Assert DSR at the device? */
+
+ if (t->c_cflag & CLOCAL)
+ state.fDsrSensitivity = FALSE; /* no */
+ else
+ state.fDsrSensitivity = TRUE; /* yes */
+
+ /* -------------- Error handling ------------------ */
+ /* Since read/write operations terminate upon error, we
+ will use ClearCommError() to resume. */
+
+ state.fAbortOnError = TRUE;
+
+ /* -------------- Set state and exit ------------------ */
+ if (memcmp (&ostate, &state, sizeof (state)) != 0)
+ SetCommState (get_handle (), &state);
+
+ set_r_binary ((t->c_iflag & IGNCR) ? 0 : 1);
+ set_w_binary ((t->c_oflag & ONLCR) ? 0 : 1);
+
+ if (dropDTR == TRUE)
+ EscapeCommFunction (get_handle (), CLRDTR);
+ else
+ {
+ /* FIXME: Sometimes when CLRDTR is set, setting
+ state.fDtrControl = DTR_CONTROL_ENABLE will fail. This
+ is a problem since a program might want to change some
+ parameters while DTR is still down. */
+
+ EscapeCommFunction (get_handle (), SETDTR);
+ }
+
+ /*
+ The following documentation on was taken from "Linux Serial Programming
+ HOWTO". It explains how MIN (t->c_cc[VMIN] || vmin_) and TIME
+ (t->c_cc[VTIME] || vtime_) is to be used.
+
+ In non-canonical input processing mode, input is not assembled into
+ lines and input processing (erase, kill, delete, etc.) does not
+ occur. Two parameters control the behavior of this mode: c_cc[VTIME]
+ sets the character timer, and c_cc[VMIN] sets the minimum number of
+ characters to receive before satisfying the read.
+
+ If MIN > 0 and TIME = 0, MIN sets the number of characters to receive
+ before the read is satisfied. As TIME is zero, the timer is not used.
+
+ If MIN = 0 and TIME > 0, TIME serves as a timeout value. The read will
+ be satisfied if a single character is read, or TIME is exceeded (t =
+ TIME *0.1 s). If TIME is exceeded, no character will be returned.
+
+ If MIN > 0 and TIME > 0, TIME serves as an inter-character timer. The
+ read will be satisfied if MIN characters are received, or the time
+ between two characters exceeds TIME. The timer is restarted every time
+ a character is received and only becomes active after the first
+ character has been received.
+
+ If MIN = 0 and TIME = 0, read will be satisfied immediately. The
+ number of characters currently available, or the number of characters
+ requested will be returned. According to Antonino (see contributions),
+ you could issue a fcntl(fd, F_SETFL, FNDELAY); before reading to get
+ the same result.
+ */
+
+ if (t->c_lflag & ICANON)
+ {
+ vmin_ = MAXDWORD;
+ vtime_ = 0;
+ }
+ else
+ {
+ vtime_ = t->c_cc[VTIME] * 100;
+ vmin_ = t->c_cc[VMIN];
+ }
+
+ debug_printf ("vtime %d, vmin %d\n", vtime_, vmin_);
+
+ if (ovmin == vmin_ && ovtime == vtime_)
+ return 0;
+
+ memset (&to, 0, sizeof (to));
+
+ if ((vmin_ > 0) && (vtime_ == 0))
+ {
+ /* Returns immediately with whatever is in buffer on a ReadFile();
+ or blocks if nothing found. We will keep calling ReadFile(); until
+ vmin_ characters are read */
+ to.ReadIntervalTimeout = to.ReadTotalTimeoutMultiplier = MAXDWORD;
+ to.ReadTotalTimeoutConstant = MAXDWORD - 1;
+ }
+ else if ((vmin_ == 0) && (vtime_ > 0))
+ {
+ /* set timeoout constant appropriately and we will only try to
+ read one character in ReadFile() */
+ to.ReadTotalTimeoutConstant = vtime_;
+ to.ReadIntervalTimeout = to.ReadTotalTimeoutMultiplier = MAXDWORD;
+ }
+ else if ((vmin_ > 0) && (vtime_ > 0))
+ {
+ /* time applies to the interval time for this case */
+ to.ReadIntervalTimeout = vtime_;
+ }
+ else if ((vmin_ == 0) && (vtime_ == 0))
+ {
+ /* returns immediately with whatever is in buffer as per
+ Time-Outs docs in Win32 SDK API docs */
+ to.ReadIntervalTimeout = MAXDWORD;
+ }
+
+ debug_printf ("ReadTotalTimeoutConstant %d, ReadIntervalTimeout %d, ReadTotalTimeoutMultiplier %d",
+ to.ReadTotalTimeoutConstant, to.ReadIntervalTimeout, to.ReadTotalTimeoutMultiplier);
+ int res = SetCommTimeouts (get_handle (), &to);
+ if (!res)
+ {
+ system_printf ("SetCommTimeout failed, %E");
+ __seterrno ();
+ return -1;
+ }
+
+ return 0;
+}
+
+/* tcgetattr: POSIX 7.2.1.1 */
+int
+fhandler_serial::tcgetattr (struct termios *t)
+{
+ DCB state;
+
+ /* Get current Win32 comm state */
+ if (GetCommState (get_handle (), &state) == 0)
+ return -1;
+
+ /* for safety */
+ memset (t, 0, sizeof (*t));
+
+ /* -------------- Baud rate ------------------ */
+
+ switch (state.BaudRate)
+ {
+ case 0:
+ /* FIXME: need to drop DTR */
+ t->c_cflag = t->c_ospeed = t->c_ispeed = B0;
+ break;
+ case CBR_110:
+ t->c_cflag = t->c_ospeed = t->c_ispeed = B110;
+ break;
+ case CBR_300:
+ t->c_cflag = t->c_ospeed = t->c_ispeed = B300;
+ break;
+ case CBR_600:
+ t->c_cflag = t->c_ospeed = t->c_ispeed = B600;
+ break;
+ case CBR_1200:
+ t->c_cflag = t->c_ospeed = t->c_ispeed = B1200;
+ break;
+ case CBR_2400:
+ t->c_cflag = t->c_ospeed = t->c_ispeed = B2400;
+ break;
+ case CBR_4800:
+ t->c_cflag = t->c_ospeed = t->c_ispeed = B4800;
+ break;
+ case CBR_9600:
+ t->c_cflag = t->c_ospeed = t->c_ispeed = B9600;
+ break;
+ case CBR_19200:
+ t->c_cflag = t->c_ospeed = t->c_ispeed = B19200;
+ break;
+ case CBR_38400:
+ t->c_cflag = t->c_ospeed = t->c_ispeed = B38400;
+ break;
+ case CBR_57600:
+ t->c_cflag = t->c_ospeed = t->c_ispeed = B57600;
+ break;
+ case CBR_115200:
+ t->c_cflag = t->c_ospeed = t->c_ispeed = B115200;
+ break;
+ default:
+ /* Unsupported baud rate! */
+ termios_printf ("Invalid baud rate %d", state.BaudRate);
+ set_errno (EINVAL);
+ return -1;
+ }
+
+ /* -------------- Byte size ------------------ */
+
+ switch (state.ByteSize)
+ {
+ case 5:
+ t->c_cflag |= CS5;
+ break;
+ case 6:
+ t->c_cflag |= CS6;
+ break;
+ case 7:
+ t->c_cflag |= CS7;
+ break;
+ case 8:
+ t->c_cflag |= CS8;
+ break;
+ default:
+ /* Unsupported byte size! */
+ termios_printf ("Invalid byte size %d", state.ByteSize);
+ set_errno (EINVAL);
+ return -1;
+ }
+
+ /* -------------- Stop bits ------------------ */
+
+ if (state.StopBits == TWOSTOPBITS)
+ t->c_cflag |= CSTOPB;
+
+ /* -------------- Parity ------------------ */
+
+ if (state.Parity == ODDPARITY)
+ t->c_cflag |= (PARENB | PARODD);
+ if (state.Parity == EVENPARITY)
+ t->c_cflag |= PARENB;
+
+ /* -------------- Parity errors ------------------ */
+
+ /* fParity combines the function of INPCK and NOT IGNPAR */
+ if (state.fParity == TRUE)
+ t->c_iflag |= INPCK;
+ else
+ t->c_iflag |= IGNPAR; /* not necessarily! */
+
+ /* -------------- Software flow control ------------------ */
+
+ /* transmission flow control */
+ if (state.fOutX)
+ t->c_iflag |= IXON;
+
+ /* reception flow control */
+ if (state.fInX)
+ t->c_iflag |= IXOFF;
+
+ t->c_cc[VSTART] = (state.XonChar ? state.XonChar : 0x11);
+ t->c_cc[VSTOP] = (state.XoffChar ? state.XoffChar : 0x13);
+
+ /* -------------- Hardware flow control ------------------ */
+ /* Some old flavors of Unix automatically enabled hardware flow
+ control when software flow control was not enabled. Since newer
+ Unices tend to require explicit setting of hardware flow-control,
+ this is what we do. */
+
+ /* Input flow-control */
+ if ((state.fRtsControl == RTS_CONTROL_HANDSHAKE) &&
+ (state.fOutxCtsFlow == TRUE))
+ t->c_cflag |= CRTSCTS;
+ if (state.fRtsControl == RTS_CONTROL_HANDSHAKE)
+ t->c_cflag |= CRTSXOFF;
+
+ /* -------------- CLOCAL --------------- */
+ /* DSR is only lead toggled only by CLOCAL. Check it to see if
+ CLOCAL was called. */
+ /* FIXME: If tcsetattr() hasn't been called previously, this may
+ give a false CLOCAL. */
+
+ if (state.fDsrSensitivity == FALSE)
+ t->c_cflag |= CLOCAL;
+
+ /* FIXME: need to handle IGNCR */
+#if 0
+ if (!get_r_binary ())
+ t->c_iflag |= IGNCR;
+#endif
+
+ if (!get_w_binary ())
+ t->c_oflag |= ONLCR;
+
+ debug_printf ("vmin_ %d, vtime_ %d", vmin_, vtime_);
+ if (vmin_ == MAXDWORD)
+ {
+ t->c_lflag |= ICANON;
+ t->c_cc[VTIME] = t->c_cc[VMIN] = 0;
+ }
+ else
+ {
+ t->c_cc[VTIME] = vtime_ / 100;
+ t->c_cc[VMIN] = vmin_;
+ }
+
+ return 0;
+}
+
+void
+fhandler_serial::fixup_after_fork (HANDLE parent)
+{
+ if (get_close_on_exec ())
+ this->fhandler_base::fixup_after_fork (parent);
+ overlapped_setup ();
+ debug_printf ("io_status.hEvent %p", io_status.hEvent);
+}
+
+int
+fhandler_serial::de_linearize (const char *buf, const char *unix_name,
+ const char *win32_name)
+{
+ int res = fhandler_base::de_linearize (buf, unix_name, win32_name);
+ overlapped_setup ();
+ debug_printf ("io_status.hEvent %p", io_status.hEvent);
+ return res;
+}
+
+int
+fhandler_serial::dup (fhandler_base *child)
+{
+ fhandler_serial *fhc = (fhandler_serial *) child;
+ overlapped_setup ();
+ fhc->vmin_ = vmin_;
+ fhc->vtime_ = vtime_;
+ return fhandler_base::dup (child);
+}
diff --git a/winsup/cygwin/fhandler_tape.cc b/winsup/cygwin/fhandler_tape.cc
new file mode 100644
index 000000000..7b25e9f4b
--- /dev/null
+++ b/winsup/cygwin/fhandler_tape.cc
@@ -0,0 +1,829 @@
+/* fhandler_tape.cc. See fhandler.h for a description of the fhandler
+ classes.
+
+ Copyright 1999, 2000 Cygnus Solutions.
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#include <sys/termios.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <unistd.h>
+#include "winsup.h"
+
+#include <sys/mtio.h>
+
+/**********************************************************************/
+/* fhandler_dev_tape */
+
+void
+fhandler_dev_tape::clear (void)
+{
+ norewind = 0;
+ lasterr = 0;
+ fhandler_dev_raw::clear ();
+}
+
+int
+fhandler_dev_tape::is_eom (int win_error)
+{
+ int ret = ((win_error == ERROR_END_OF_MEDIA)
+ || (win_error == ERROR_EOM_OVERFLOW)
+ || (win_error == ERROR_NO_DATA_DETECTED));
+ if (ret)
+ debug_printf ("end of medium");
+ return ret;
+}
+
+int
+fhandler_dev_tape::is_eof (int win_error)
+{
+ int ret = ((win_error == ERROR_FILEMARK_DETECTED)
+ || (win_error == ERROR_SETMARK_DETECTED));
+ if (ret)
+ debug_printf ("end of file");
+ return ret;
+}
+
+fhandler_dev_tape::fhandler_dev_tape (const char *name, int unit) : fhandler_dev_raw (FH_TAPE, name, unit)
+{
+ set_cb (sizeof *this);
+}
+
+int
+fhandler_dev_tape::open (const char *path, int flags, mode_t)
+{
+ int ret;
+ int minor;
+
+ if (get_device_number (path, minor) != FH_TAPE)
+ {
+ set_errno (EINVAL);
+ return -1;
+ }
+
+ norewind = (minor >= 128);
+ devbufsiz = 1L;
+
+ ret = fhandler_dev_raw::open (path, flags);
+ if (ret)
+ {
+ struct mtget get;
+ struct mtop op;
+ struct mtpos pos;
+
+ if (! ioctl (MTIOCGET, &get))
+ {
+ devbufsiz = get.mt_dsreg;
+ }
+
+ if (devbufsiz > 1L)
+ {
+ devbuf = new char [ devbufsiz ];
+ }
+
+ /*
+ * The following rewind in position 0 solves a problem which appears
+ * in case of multi volume archives: The last ReadFile on first medium
+ * returns ERROR_NO_DATA_DETECTED. After media change, all subsequent
+ * ReadFile calls return ERROR_NO_DATA_DETECTED, too!
+ * The call to tape_set_pos seems to reset some internal flags!
+ */
+ if ((! ioctl (MTIOCPOS, &pos)) && (! pos.mt_blkno))
+ {
+ op.mt_op = MTREW;
+ ioctl (MTIOCTOP, &op);
+ }
+
+ if (flags & O_APPEND)
+ {
+ /* In append mode, seek to beginning of next filemark */
+ op.mt_op = MTFSFM;
+ op.mt_count = 1;
+ ioctl (MTIOCTOP, &op);
+ }
+ }
+
+ return ret;
+}
+
+int
+fhandler_dev_tape::close (void)
+{
+ struct mtop op;
+ int ret = 0;
+
+ if (is_writing)
+ {
+ ret = writebuf ();
+ if ((has_written) && (! eom_detected))
+ {
+ /* if last operation was writing, write a filemark */
+ debug_printf ("writing filemark\n");
+ op.mt_op = MTWEOF;
+ op.mt_count = 1;
+ ioctl (MTIOCTOP, &op);
+ }
+ }
+
+ // To protected reads on signaling (e.g. Ctrl-C)
+ eof_detected = 1;
+
+ if (! norewind)
+ {
+ debug_printf ("rewinding\n");
+ op.mt_op = MTREW;
+ ioctl (MTIOCTOP, &op);
+ }
+
+ if (ret)
+ {
+ fhandler_dev_raw::close ();
+ return ret;
+ }
+
+ return fhandler_dev_raw::close ();
+}
+
+int
+fhandler_dev_tape::fstat (struct stat *buf)
+{
+ int ret;
+
+ if (! (ret = fhandler_dev_raw::fstat (buf)))
+ {
+ struct mtget get;
+
+ if (! ioctl (MTIOCGET, &get))
+ {
+ buf->st_blocks = get.mt_capacity / buf->st_blksize;
+ }
+ }
+
+ return ret;
+}
+
+off_t
+fhandler_dev_tape::lseek (off_t offset, int whence)
+{
+ struct mtop op;
+ struct mtpos pos;
+
+ debug_printf ("lseek (%s, %d, %d)\n", get_name (), offset, whence);
+
+ writebuf ();
+ eom_detected = eof_detected = 0;
+ lastblk_to_read = 0;
+ devbufstart = devbufend = 0;
+
+ if (ioctl (MTIOCPOS, &pos))
+ {
+ return (off_t) -1;
+ }
+
+ switch (whence)
+ {
+ case SEEK_END:
+ op.mt_op = MTFSF;
+ op.mt_count = 1;
+ if (ioctl (MTIOCTOP, &op))
+ return -1;
+ break;
+ case SEEK_SET:
+ if (whence == SEEK_SET && offset < 0)
+ {
+ set_errno (EINVAL);
+ return -1;
+ }
+ break;
+ case SEEK_CUR:
+ break;
+ default:
+ set_errno (EINVAL);
+ return -1;
+ }
+
+ op.mt_op = MTFSR;
+ op.mt_count = offset / devbufsiz
+ - (whence == SEEK_SET ? pos.mt_blkno : 0);
+
+ if (op.mt_count < 0)
+ {
+ op.mt_op = MTBSR;
+ op.mt_count = -op.mt_count;
+ }
+
+ if (ioctl (MTIOCTOP, &op) || ioctl (MTIOCPOS, &pos))
+ return -1;
+
+ return (pos.mt_blkno * devbufsiz);
+}
+
+int
+fhandler_dev_tape::dup (fhandler_base *child)
+{
+ fhandler_dev_tape *fhc = (fhandler_dev_tape *) child;
+
+ fhc->norewind = norewind;
+ fhc->lasterr = lasterr;
+ return fhandler_dev_raw::dup (child);
+}
+
+int
+fhandler_dev_tape::ioctl (unsigned int cmd, void *buf)
+{
+ int ret = NO_ERROR;
+ unsigned long block;
+
+ if (cmd == MTIOCTOP)
+ {
+ struct mtop *op = (struct mtop *) buf;
+
+ if (! op)
+ ret = ERROR_INVALID_PARAMETER;
+ else
+ switch (op->mt_op)
+ {
+ case MTRESET:
+ break;
+ case MTFSF:
+ ret = tape_set_pos (TAPE_SPACE_FILEMARKS, op->mt_count);
+ break;
+ case MTBSF:
+ ret = tape_set_pos (TAPE_SPACE_FILEMARKS, -op->mt_count);
+ break;
+ case MTFSR:
+ ret = tape_set_pos (TAPE_SPACE_RELATIVE_BLOCKS, op->mt_count);
+ break;
+ case MTBSR:
+ ret = tape_set_pos (TAPE_SPACE_RELATIVE_BLOCKS, -op->mt_count);
+ break;
+ case MTWEOF:
+ ret = tape_write_marks (TAPE_FILEMARKS, op->mt_count);
+ break;
+ case MTREW:
+ ret = tape_set_pos (TAPE_REWIND, 0);
+ break;
+ case MTOFFL:
+ ret = tape_prepare (TAPE_UNLOAD);
+ break;
+ case MTNOP:
+ break;
+ case MTRETEN:
+ if (! tape_get_feature (TAPE_DRIVE_END_OF_DATA))
+ {
+ ret = ERROR_INVALID_PARAMETER;
+ break;
+ }
+ if (! (ret = tape_set_pos (TAPE_REWIND, 0, FALSE)))
+ {
+ ret = tape_prepare (TAPE_TENSION);
+ }
+ break;
+ case MTBSFM:
+ ret = tape_set_pos (TAPE_SPACE_FILEMARKS, -op->mt_count, TRUE);
+ break;
+ case MTFSFM:
+ ret = tape_set_pos (TAPE_SPACE_FILEMARKS, op->mt_count, TRUE);
+ break;
+ case MTEOM:
+ if (tape_get_feature (TAPE_DRIVE_END_OF_DATA))
+ {
+ ret = tape_set_pos (TAPE_SPACE_END_OF_DATA, 0);
+ }
+ else
+ {
+ ret = tape_set_pos (TAPE_SPACE_FILEMARKS, 32767);
+ }
+ break;
+ case MTERASE:
+ ret = tape_erase (TAPE_ERASE_SHORT);
+ break;
+ case MTRAS1:
+ case MTRAS2:
+ case MTRAS3:
+ ret = ERROR_INVALID_PARAMETER;
+ break;
+ case MTSETBLK:
+ {
+ long min, max;
+
+ if (! tape_get_feature (TAPE_DRIVE_SET_BLOCK_SIZE))
+ {
+ ret = ERROR_INVALID_PARAMETER;
+ break;
+ }
+ ret = tape_get_blocksize (&min, NULL, &max, NULL);
+ if (ret)
+ {
+ break;
+ }
+ if (op->mt_count < min || op->mt_count > max)
+ {
+ ret = ERROR_INVALID_PARAMETER;
+ break;
+ }
+ if (devbuf && (size_t) op->mt_count == devbufsiz)
+ {
+ ret = 0;
+ break;
+ }
+ if (devbuf && (size_t) op->mt_count < devbufend - devbufstart)
+ {
+ ret = ERROR_INVALID_PARAMETER;
+ break;
+ }
+ if (! (ret = tape_set_blocksize (op->mt_count)))
+ {
+ char *buf = new char [ op->mt_count ];
+ if (devbuf)
+ {
+ memcpy(buf,devbuf + devbufstart, devbufend - devbufstart);
+ devbufend -= devbufstart;
+ delete [] devbuf;
+ }
+ else
+ {
+ devbufend = 0;
+ }
+ devbufstart = 0;
+ devbuf = buf;
+ devbufsiz = op->mt_count;
+ }
+ }
+ break;
+ case MTSETDENSITY:
+ ret = ERROR_INVALID_PARAMETER;
+ break;
+ case MTSEEK:
+ if (tape_get_feature (TAPE_DRIVE_ABSOLUTE_BLK))
+ {
+ ret = tape_set_pos (TAPE_ABSOLUTE_BLOCK, op->mt_count);
+ break;
+ }
+ if (! (ret = tape_get_pos (&block)))
+ {
+ ret = tape_set_pos (TAPE_SPACE_RELATIVE_BLOCKS,
+ op->mt_count - block);
+ }
+ break;
+ case MTTELL:
+ if (! (ret = tape_get_pos (&block)))
+ op->mt_count = block;
+ break;
+ case MTSETDRVBUFFER:
+ ret = ERROR_INVALID_PARAMETER;
+ break;
+ case MTFSS:
+ ret = tape_set_pos (TAPE_SPACE_SETMARKS, op->mt_count);
+ break;
+ case MTBSS:
+ ret = tape_set_pos (TAPE_SPACE_SETMARKS, -op->mt_count);
+ break;
+ case MTWSM:
+ ret = tape_write_marks (TAPE_SETMARKS, op->mt_count);
+ break;
+ case MTLOCK:
+ ret = tape_prepare (TAPE_LOCK);
+ break;
+ case MTUNLOCK:
+ ret = tape_prepare (TAPE_UNLOCK);
+ break;
+ case MTLOAD:
+ ret = tape_prepare (TAPE_LOAD);
+ break;
+ case MTUNLOAD:
+ ret = tape_prepare (TAPE_UNLOAD);
+ break;
+ case MTCOMPRESSION:
+ ret = tape_compression (op->mt_count);
+ break;
+ case MTSETPART:
+ case MTMKPART:
+ default:
+ ret = ERROR_INVALID_PARAMETER;
+ break;
+ }
+ }
+ else if (cmd == MTIOCGET)
+ ret = tape_status ((struct mtget *) buf);
+ else if (cmd == MTIOCPOS)
+ {
+ ret = ERROR_INVALID_PARAMETER;
+ if (buf && (ret = tape_get_pos (&block)))
+ ((struct mtpos *) buf)->mt_blkno = block;
+ }
+ else
+ return fhandler_dev_raw::ioctl (cmd, buf);
+
+ if (ret != NO_ERROR)
+ {
+ SetLastError (ret);
+ __seterrno ();
+ return -1;
+ }
+
+ return 0;
+}
+
+/* ------------------------------------------------------------------ */
+/* Private functions used by `ioctl' */
+/* ------------------------------------------------------------------ */
+
+static int
+tape_error (DWORD lasterr, const char *txt)
+{
+ if (lasterr)
+ debug_printf ("%s: error: %d\n", txt, lasterr);
+
+ return lasterr;
+}
+
+int
+fhandler_dev_tape::tape_write_marks (int marktype, DWORD len)
+{
+ syscall_printf ("write_tapemark\n");
+ while (((lasterr = WriteTapemark (get_handle (),
+ marktype,
+ len,
+ FALSE)) == ERROR_MEDIA_CHANGED)
+ || (lasterr == ERROR_BUS_RESET))
+ ;
+
+ return tape_error (lasterr, "tape_write_marks");
+}
+
+int
+fhandler_dev_tape::tape_get_pos (unsigned long *ret)
+{
+ DWORD part, low, high;
+
+ while (((lasterr = GetTapePosition (get_handle (),
+ TAPE_ABSOLUTE_POSITION,
+ &part,
+ &low,
+ &high)) == ERROR_MEDIA_CHANGED)
+ || (lasterr == ERROR_BUS_RESET))
+ ;
+ if (! tape_error (lasterr, "tape_get_pos") && ret)
+ *ret = low;
+
+ return lasterr;
+}
+
+static int _tape_set_pos (HANDLE hTape, int mode, long count)
+{
+ int err;
+
+ while (((err = SetTapePosition (hTape,
+ mode,
+ 1,
+ count,
+ count < 0 ? -1 : 0,
+ FALSE)) == ERROR_MEDIA_CHANGED)
+ || (err == ERROR_BUS_RESET))
+ ;
+
+ return err;
+}
+
+int
+fhandler_dev_tape::tape_set_pos (int mode, long count, BOOLEAN sfm_func)
+{
+ unsigned long pos, tgtpos;
+
+ switch (mode)
+ {
+ case TAPE_SPACE_RELATIVE_BLOCKS:
+ lasterr = tape_get_pos (&pos);
+
+ if (lasterr)
+ return lasterr;
+
+ tgtpos = pos + count;
+
+ while (((lasterr = _tape_set_pos (get_handle (),
+ mode,
+ count)) == ERROR_FILEMARK_DETECTED)
+ || (lasterr == ERROR_SETMARK_DETECTED))
+ {
+ lasterr = tape_get_pos (&pos);
+ if (lasterr)
+ return lasterr;
+ count = tgtpos - pos;
+ }
+
+ if (lasterr == ERROR_BEGINNING_OF_MEDIA && ! tgtpos)
+ lasterr = NO_ERROR;
+
+ break;
+ case TAPE_SPACE_FILEMARKS:
+ if (count < 0)
+ {
+ if (pos > 0)
+ {
+ if ((! _tape_set_pos (get_handle (),
+ TAPE_SPACE_RELATIVE_BLOCKS,
+ -1))
+ || (sfm_func))
+ ++count;
+ _tape_set_pos (get_handle (), TAPE_SPACE_RELATIVE_BLOCKS, 1);
+ }
+
+ while (! (lasterr = _tape_set_pos (get_handle (), mode, -1))
+ && count++ < 0)
+ ;
+
+ if (lasterr == ERROR_BEGINNING_OF_MEDIA)
+ {
+ if (! count)
+ lasterr = NO_ERROR;
+ }
+ else if (! sfm_func)
+ lasterr = _tape_set_pos (get_handle (), mode, 1);
+ }
+ else
+ {
+ if (sfm_func)
+ {
+ if (_tape_set_pos (get_handle (),
+ TAPE_SPACE_RELATIVE_BLOCKS,
+ 1) == ERROR_FILEMARK_DETECTED)
+ ++count;
+ _tape_set_pos (get_handle (), TAPE_SPACE_RELATIVE_BLOCKS, -1);
+ }
+
+ if (! (lasterr = _tape_set_pos (get_handle (), mode, count))
+ && sfm_func)
+ lasterr = _tape_set_pos (get_handle (), mode, -1);
+ }
+ break;
+ case TAPE_SPACE_SETMARKS:
+ case TAPE_ABSOLUTE_BLOCK:
+ case TAPE_SPACE_END_OF_DATA:
+ case TAPE_REWIND:
+ lasterr = _tape_set_pos (get_handle (), mode, count);
+ break;
+ }
+
+ return tape_error (lasterr, "tape_set_pos");
+}
+
+int
+fhandler_dev_tape::tape_erase (int mode)
+{
+ DWORD varlen;
+ TAPE_GET_DRIVE_PARAMETERS dp;
+
+ while (((lasterr = GetTapeParameters (get_handle (),
+ GET_TAPE_DRIVE_INFORMATION,
+ (varlen = sizeof dp, &varlen),
+ &dp)) == ERROR_MEDIA_CHANGED)
+ || (lasterr == ERROR_BUS_RESET))
+ ;
+
+ switch (mode)
+ {
+ case TAPE_ERASE_SHORT:
+ if (! lasterr && ! (dp.FeaturesLow & TAPE_DRIVE_ERASE_SHORT))
+ mode = TAPE_ERASE_LONG;
+ break;
+ case TAPE_ERASE_LONG:
+ if (! lasterr && ! (dp.FeaturesLow & TAPE_DRIVE_ERASE_LONG))
+ mode = TAPE_ERASE_SHORT;
+ break;
+ }
+
+ return tape_error (EraseTape (get_handle (), mode, FALSE), "tape_erase");
+}
+
+int
+fhandler_dev_tape::tape_prepare (int action)
+{
+ while (((lasterr = PrepareTape (get_handle (),
+ action,
+ FALSE)) == ERROR_MEDIA_CHANGED)
+ || (lasterr == ERROR_BUS_RESET))
+ ;
+ return tape_error (lasterr, "tape_prepare");
+}
+
+BOOLEAN
+fhandler_dev_tape::tape_get_feature (DWORD parm)
+{
+ DWORD varlen;
+ TAPE_GET_DRIVE_PARAMETERS dp;
+
+ while (((lasterr = GetTapeParameters (get_handle (),
+ GET_TAPE_DRIVE_INFORMATION,
+ (varlen = sizeof dp, &varlen),
+ &dp)) == ERROR_MEDIA_CHANGED)
+ || (lasterr == ERROR_BUS_RESET))
+ ;
+
+ if (lasterr)
+ return FALSE;
+
+ return ((parm & TAPE_DRIVE_HIGH_FEATURES)
+ ? ((dp.FeaturesHigh & parm) != 0)
+ : ((dp.FeaturesLow & parm) != 0));
+}
+
+int
+fhandler_dev_tape::tape_get_blocksize (long *min, long *def, long *max, long *cur)
+{
+ DWORD varlen;
+ TAPE_GET_DRIVE_PARAMETERS dp;
+ TAPE_GET_MEDIA_PARAMETERS mp;
+
+ while (((lasterr = GetTapeParameters (get_handle (),
+ GET_TAPE_DRIVE_INFORMATION,
+ (varlen = sizeof dp, &varlen),
+ &dp)) == ERROR_MEDIA_CHANGED)
+ || (lasterr == ERROR_BUS_RESET))
+ ;
+
+ if (lasterr)
+ return tape_error (lasterr, "tape_get_blocksize");
+
+ while (((lasterr = GetTapeParameters (get_handle (),
+ GET_TAPE_MEDIA_INFORMATION,
+ (varlen = sizeof mp, &varlen),
+ &mp)) == ERROR_MEDIA_CHANGED)
+ || (lasterr == ERROR_BUS_RESET))
+ ;
+
+ if (lasterr)
+ return tape_error (lasterr, "tape_get_blocksize");
+
+ if (min)
+ *min = (long) dp.MinimumBlockSize;
+ if (def)
+ *def = (long) dp.DefaultBlockSize;
+ if (max)
+ *max = (long) dp.MaximumBlockSize;
+ if (cur)
+ *cur = (long) mp.BlockSize;
+
+ return tape_error (lasterr, "tape_get_blocksize");
+}
+
+int
+fhandler_dev_tape::tape_set_blocksize (long count)
+{
+ long min, max;
+ TAPE_SET_MEDIA_PARAMETERS mp;
+
+ lasterr = tape_get_blocksize (&min, NULL, &max, NULL);
+
+ if (lasterr)
+ return lasterr;
+
+ if (count < min || count > max)
+ return tape_error (ERROR_INVALID_PARAMETER, "tape_set_blocksize");
+
+ mp.BlockSize = count;
+
+ return tape_error (SetTapeParameters (get_handle (),
+ SET_TAPE_MEDIA_INFORMATION,
+ &mp),
+ "tape_set_blocksize");
+}
+
+static long long
+get_ll (PLARGE_INTEGER i)
+{
+ long long l = 0;
+
+ l = i->HighPart;
+ l <<= 32;
+ l |= i->LowPart;
+ return l;
+}
+
+int
+fhandler_dev_tape::tape_status (struct mtget *get)
+{
+ DWORD varlen;
+ TAPE_GET_DRIVE_PARAMETERS dp;
+ TAPE_GET_MEDIA_PARAMETERS mp;
+ int notape = 0;
+
+ if (! get)
+ return ERROR_INVALID_PARAMETER;
+
+ while (((lasterr = GetTapeParameters (get_handle (),
+ GET_TAPE_DRIVE_INFORMATION,
+ (varlen = sizeof dp, &varlen),
+ &dp)) == ERROR_MEDIA_CHANGED)
+ || (lasterr == ERROR_BUS_RESET))
+ ;
+
+ if ((lasterr) || (lasterr = GetTapeParameters (get_handle (),
+ GET_TAPE_MEDIA_INFORMATION,
+ (varlen = sizeof mp, &varlen),
+ &mp)))
+ notape = 1;
+
+ memset (get, 0, sizeof *get);
+
+ get->mt_type = MT_ISUNKNOWN;
+
+ if (! notape && (dp.FeaturesLow & TAPE_DRIVE_TAPE_REMAINING))
+ {
+ get->mt_remaining = get_ll (&mp.Remaining);
+ get->mt_resid = get->mt_remaining >> 10;
+ }
+
+ if ((dp.FeaturesHigh & TAPE_DRIVE_SET_BLOCK_SIZE) && ! notape)
+ get->mt_dsreg = mp.BlockSize;
+ else
+ get->mt_dsreg = dp.DefaultBlockSize;
+
+ if (notape)
+ get->mt_gstat |= GMT_DR_OPEN (-1);
+
+ if (! notape)
+ {
+ if (dp.FeaturesLow & TAPE_DRIVE_GET_ABSOLUTE_BLK)
+ tape_get_pos ((unsigned long *) &get->mt_blkno);
+
+ if (! get->mt_blkno)
+ get->mt_gstat |= GMT_BOT (-1);
+
+ get->mt_gstat |= GMT_ONLINE (-1);
+
+ if ((dp.FeaturesLow & TAPE_DRIVE_WRITE_PROTECT) && mp.WriteProtected)
+ get->mt_gstat |= GMT_WR_PROT (-1);
+
+ if (dp.FeaturesLow & TAPE_DRIVE_TAPE_CAPACITY)
+ get->mt_capacity = get_ll (&mp.Capacity);
+ }
+
+ if ((dp.FeaturesLow & TAPE_DRIVE_COMPRESSION) && dp.Compression)
+ get->mt_gstat |= GMT_HW_COMP (-1);
+
+ if ((dp.FeaturesLow & TAPE_DRIVE_ECC) && dp.ECC)
+ get->mt_gstat |= GMT_HW_ECC (-1);
+
+ if ((dp.FeaturesLow & TAPE_DRIVE_PADDING) && dp.DataPadding)
+ get->mt_gstat |= GMT_PADDING (-1);
+
+ if ((dp.FeaturesLow & TAPE_DRIVE_REPORT_SMKS) && dp.ReportSetmarks)
+ get->mt_gstat |= GMT_IM_REP_EN (-1);
+
+ get->mt_erreg = lasterr;
+
+ get->mt_minblksize = dp.MinimumBlockSize;
+ get->mt_maxblksize = dp.MaximumBlockSize;
+ get->mt_defblksize = dp.DefaultBlockSize;
+ get->mt_featureslow = dp.FeaturesLow;
+ get->mt_featureshigh = dp.FeaturesHigh;
+
+ return 0;
+}
+
+int
+fhandler_dev_tape::tape_compression (long count)
+{
+ DWORD varlen;
+ TAPE_GET_DRIVE_PARAMETERS dpg;
+ TAPE_SET_DRIVE_PARAMETERS dps;
+
+ while (((lasterr = GetTapeParameters (get_handle (),
+ GET_TAPE_DRIVE_INFORMATION,
+ (varlen = sizeof dpg, &varlen),
+ &dpg)) == ERROR_MEDIA_CHANGED)
+ || (lasterr == ERROR_BUS_RESET))
+ ;
+
+ if (lasterr)
+ return tape_error (lasterr, "tape_compression");
+
+ if (! (dpg.FeaturesLow & TAPE_DRIVE_COMPRESSION))
+ return ERROR_INVALID_PARAMETER;
+
+ if (count)
+ {
+ dps.ECC = dpg.ECC;
+ dps.Compression = count ? TRUE : FALSE;
+ dps.DataPadding = dpg.DataPadding;
+ dps.ReportSetmarks = dpg.ReportSetmarks;
+ dps.EOTWarningZoneSize = dpg.EOTWarningZoneSize;
+ lasterr = SetTapeParameters (get_handle (),
+ SET_TAPE_DRIVE_INFORMATION,
+ &dps);
+
+ if (lasterr)
+ return tape_error (lasterr, "tape_compression");
+
+ dpg.Compression = dps.Compression;
+ }
+
+ return 0;
+}
+
diff --git a/winsup/cygwin/fhandler_termios.cc b/winsup/cygwin/fhandler_termios.cc
new file mode 100644
index 000000000..5c34178e6
--- /dev/null
+++ b/winsup/cygwin/fhandler_termios.cc
@@ -0,0 +1,293 @@
+/* fhandler_termios.cc
+
+ Copyright 1996, 1997, 1998 Cygnus Solutions.
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#include <stdlib.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <errno.h>
+#include "winsup.h"
+#include <ctype.h>
+
+/* Common functions shared by tty/console */
+
+void
+fhandler_termios::tcinit (tty_min *this_tc, int force)
+{
+ /* Initial termios values */
+
+ tc = this_tc;
+
+ if (force || !TTYISSETF (INITIALIZED))
+ {
+ tc->ti.c_iflag = BRKINT | ICRNL | IXON;
+ tc->ti.c_oflag = OPOST | ONLCR;
+ tc->ti.c_cflag = B38400 | CS8 | CREAD;
+ tc->ti.c_lflag = ISIG | ICANON | ECHO | IEXTEN;
+
+ tc->ti.c_cc[VDISCARD] = CFLUSH;
+ tc->ti.c_cc[VEOL] = CEOL;
+ tc->ti.c_cc[VEOL2] = CEOL2;
+ tc->ti.c_cc[VEOF] = CEOF;
+ tc->ti.c_cc[VERASE] = CERASE;
+ tc->ti.c_cc[VINTR] = CINTR;
+ tc->ti.c_cc[VKILL] = CKILL;
+ tc->ti.c_cc[VLNEXT] = CLNEXT;
+ tc->ti.c_cc[VMIN] = 1;
+ tc->ti.c_cc[VQUIT] = CQUIT;
+ tc->ti.c_cc[VREPRINT] = CRPRNT;
+ tc->ti.c_cc[VSTART] = CSTART;
+ tc->ti.c_cc[VSTOP] = CSTOP;
+ tc->ti.c_cc[VSUSP] = CSUSP;
+ tc->ti.c_cc[VSWTC] = CSWTCH;
+ tc->ti.c_cc[VTIME] = 0;
+ tc->ti.c_cc[VWERASE] = CWERASE;
+
+ tc->ti.c_ispeed = tc->ti.c_ospeed = B38400;
+ tc->pgid = myself->pgid;
+ TTYSETF (INITIALIZED);
+ }
+}
+
+int
+fhandler_termios::tcsetpgrp (const pid_t pgid)
+{
+ termios_printf ("pgid %d, sid %d, tsid %d", pgid,
+ myself->sid, tc->getsid ());
+ if (myself->sid != tc->getsid ())
+ {
+ set_errno (EPERM);
+ return -1;
+ }
+ tc->setpgid (pgid);
+ return 0;
+}
+
+int
+fhandler_termios::tcgetpgrp ()
+{
+ return tc->pgid;
+}
+
+void
+fhandler_termios::set_ctty (int ttynum, int flags)
+{
+ if ((myself->ctty < 0 || myself->ctty == ttynum) && !(flags & O_NOCTTY))
+ {
+ myself->ctty = ttynum;
+ syscall_printf ("attached tty%d sid %d, pid %d, tty->pgid %d, tty->sid %d",
+ ttynum, myself->sid, myself->pid, tc->pgid, tc->getsid ());
+
+ pinfo *p = procinfo (tc->getsid ());
+ if (myself->sid == myself->pid &&
+ (p == myself || !proc_exists (p)))
+ {
+ paranoid_printf ("resetting tty%d sid. Was %d, now %d. pgid was %d, now %d.",
+ ttynum, tc->getsid(), myself->sid, tc->getpgid (), myself->pgid);
+ /* We are the session leader */
+ tc->setsid (myself->sid);
+ tc->setpgid (myself->pgid);
+ }
+ else
+ myself->sid = tc->getsid ();
+ if (tc->getpgid () == 0)
+ tc->setpgid (myself->pgid);
+ }
+}
+
+int
+fhandler_termios::bg_check (int sig, int blocksigs)
+{
+ if (!myself->pgid || tc->getpgid () == myself->pgid ||
+ myself->ctty != tc->ntty ||
+ ((sig == SIGTTOU) && !(tc->ti.c_lflag & TOSTOP)))
+ return 1;
+
+ if (sig < 0)
+ sig = -sig;
+
+ termios_printf("bg I/O pgid %d, tpgid %d, ctty %d",
+ myself->pgid, tc->getpgid (), myself->ctty);
+
+ if (tc->getsid () == 0)
+ {
+ /* The pty has been closed by the master. Return an EOF
+ indication. FIXME: There is nothing to stop somebody
+ from reallocating this pty. I think this is the case
+ which is handled by unlockpt on a Unix system. */
+ termios_printf ("closed by master");
+ return 0;
+ }
+
+ /* If the process group is no more or if process is ignoring or blocks 'sig',
+ return with error */
+ int pgid_gone = !proc_exists (procinfo (myself->pgid));
+ int sigs_ignored =
+ ((void *) myself->getsig(sig).sa_handler == (void *) SIG_IGN) ||
+ (myself->getsigmask () & SIGTOMASK (sig));
+
+ if (pgid_gone)
+ goto setEIO;
+ else if (!sigs_ignored)
+ /* nothing */;
+ else if (sig == SIGTTOU)
+ return 1; /* Just allow the output */
+ else
+ goto setEIO; /* This is an output error */
+
+ _raise (sig);
+ return 1;
+
+setEIO:
+ set_errno (EIO);
+ return -1;
+}
+
+#define set_input_done(x) input_done = input_done || (x)
+
+int
+fhandler_termios::line_edit (const char *rptr, int nread, int always_accept)
+{
+ char c;
+ int input_done = 0;
+ int iscanon = tc->ti.c_lflag & ICANON;
+
+ while (nread-- > 0)
+ {
+ c = *rptr++;
+
+ termios_printf ("char %c", c);
+
+ /* Check for special chars */
+
+ if (c == '\r')
+ {
+ if (tc->ti.c_iflag & IGNCR)
+ continue;
+ if (tc->ti.c_iflag & ICRNL)
+ {
+ c = '\n';
+ set_input_done (iscanon);
+ }
+ }
+ else if (c == '\n')
+ {
+ if (tc->ti.c_iflag & INLCR)
+ c = '\r';
+ else
+ set_input_done (iscanon);
+ }
+
+ if (tc->ti.c_iflag & ISTRIP)
+ c &= 0x7f;
+ if (tc->ti.c_lflag & ISIG)
+ {
+ int sig;
+ if (c == tc->ti.c_cc[VINTR])
+ sig = SIGINT;
+ else if (c == tc->ti.c_cc[VQUIT])
+ sig = SIGQUIT;
+ else if (c == tc->ti.c_cc[VSUSP])
+ sig = SIGTSTP;
+ else
+ goto not_a_sig;
+
+ termios_printf ("got interrupt %d, sending signal %d", c, sig);
+ kill_pgrp (tc->getpgid (), sig);
+ tc->ti.c_lflag &= ~FLUSHO;
+ goto restart_output;
+ }
+ not_a_sig:
+ if (tc->ti.c_iflag & IXON)
+ {
+ if (c == tc->ti.c_cc[VSTOP])
+ {
+ tc->OutputStopped++;
+ continue;
+ }
+ else if (c == tc->ti.c_cc[VSTART])
+ {
+ restart_output:
+ tc->OutputStopped = 0;
+ SetEvent (restart_output_event);
+ continue;
+ }
+ else if ((tc->ti.c_iflag & IXANY) && tc->OutputStopped)
+ goto restart_output;
+ }
+ if (tc->ti.c_lflag & IEXTEN && c == tc->ti.c_cc[VDISCARD])
+ {
+ tc->ti.c_lflag ^= FLUSHO;
+ continue;
+ }
+ if (!iscanon)
+ /* nothing */;
+ else if (c == tc->ti.c_cc[VERASE])
+ {
+ if (eat_readahead (1))
+ doecho ("\b \b", 3);
+ continue;
+ }
+ else if (c == tc->ti.c_cc[VWERASE])
+ {
+ int ch;
+ do
+ if (!eat_readahead (1))
+ break;
+ else
+ doecho ("\b \b", 3);
+ while ((ch = peek_readahead (1)) >= 0 && !isspace (ch));
+ continue;
+ }
+ else if (c == tc->ti.c_cc[VKILL])
+ {
+ int nchars = eat_readahead (-1);
+ while (nchars--)
+ doecho ("\b \b", 3);
+ continue;
+ }
+ else if (c == tc->ti.c_cc[VREPRINT])
+ {
+ doecho ("\n\r", 2);
+ doecho (rabuf, ralen);
+ continue;
+ }
+ else if (c == tc->ti.c_cc[VEOF])
+ {
+ termios_printf ("EOF");
+ input_done = 1;
+ continue;
+ }
+ else if (c == tc->ti.c_cc[VEOL] ||
+ c == tc->ti.c_cc[VEOL2] ||
+ c == '\n')
+ {
+ set_input_done (1);
+ termios_printf ("EOL");
+ }
+
+ if (tc->ti.c_iflag & IUCLC && isupper (c))
+ c = tolower (c);
+
+ if (tc->ti.c_lflag & ECHO)
+ doecho (&c, 1);
+ put_readahead (c);
+ }
+
+ if (!iscanon || always_accept)
+ set_input_done (ralen > 0);
+
+ /* FIXME: It's not clear that this code will ever do anything.
+ Currently, it doesn't look like accept_input will ever return
+ a negative number. */
+ if (input_done)
+ (void) accept_input ();
+
+ return input_done;
+}
diff --git a/winsup/cygwin/fhandler_tty.cc b/winsup/cygwin/fhandler_tty.cc
new file mode 100644
index 000000000..c4ede333a
--- /dev/null
+++ b/winsup/cygwin/fhandler_tty.cc
@@ -0,0 +1,1070 @@
+/* fhandler_tty.cc
+
+ Copyright 1997, 1998, 2000 Cygnus Solutions.
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#include <stdio.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <errno.h>
+#include "winsup.h"
+#include <ctype.h>
+#include <limits.h>
+
+/* Tty master stuff */
+
+fhandler_tty_master NO_COPY *tty_master;
+
+static DWORD WINAPI process_input (void *); // Input queue thread
+static DWORD WINAPI process_output (void *); // Output queue thread
+static DWORD WINAPI process_ioctl (void *); // Ioctl requests thread
+
+fhandler_tty_master::fhandler_tty_master (const char *name, int unit) :
+ fhandler_pty_master (name, FH_TTYM, unit)
+{
+ set_cb (sizeof *this);
+ console = NULL;
+ hThread = NULL;
+}
+
+int
+fhandler_tty_master::init (int ntty)
+{
+ HANDLE h;
+ termios_printf ("Creating master for tty%d", ntty);
+
+ if (init_console ())
+ {
+ termios_printf ("can't create fhandler");
+ return -1;
+ }
+
+ termios ti;
+ memset (&ti, 0, sizeof (ti));
+ console->tcsetattr (0, &ti);
+
+ ttynum = ntty;
+
+ cygwin_shared->tty[ttynum]->common_init (this);
+
+ h = makethread (process_input, NULL, 0, "ttyin");
+ if (h == NULL)
+ {
+ termios_printf ("can't create input thread");
+ return -1;
+ }
+ else
+ {
+ SetThreadPriority (h, THREAD_PRIORITY_HIGHEST);
+ CloseHandle (h);
+ }
+
+ h = makethread (process_ioctl, NULL, 0, "ttyioctl");
+ if (h == NULL)
+ {
+ termios_printf ("can't create ioctl thread");
+ return -1;
+ }
+ else
+ {
+ SetThreadPriority (h, THREAD_PRIORITY_HIGHEST);
+ CloseHandle (h);
+ }
+
+ hThread = makethread (process_output, NULL, 0, "ttyout");
+ if (hThread != NULL)
+ SetThreadPriority (hThread, THREAD_PRIORITY_HIGHEST);
+ else
+ {
+ termios_printf ("can't create output thread");
+ return -1;
+ }
+
+ return 0;
+}
+
+#ifdef DEBUGGING
+static class mutex_stack
+{
+public:
+ const char *fn;
+ int ln;
+ const char *tname;
+} ostack[100];
+
+static int osi = 0;
+#endif /*DEBUGGING*/
+
+DWORD
+fhandler_tty_common::__acquire_output_mutex (const char *fn, int ln,
+ DWORD ms)
+{
+ if (strace_active)
+ strace_printf (_STRACE_TERMIOS, "%F (%d): tty output_mutex: waiting %d ms", fn, ln, ms);
+ DWORD res = WaitForSingleObject (output_mutex, ms);
+ if (res == WAIT_OBJECT_0)
+ {
+#ifdef DEBUGGING
+ ostack[osi].fn = fn;
+ ostack[osi].ln = ln;
+ ostack[osi].tname = threadname (0, 0);
+ termios_printf ("acquired for %s:%d, osi %d", fn, ln, osi);
+ osi++;
+#endif
+ }
+ if (strace_active)
+ strace_printf (_STRACE_TERMIOS, "%F (%d): tty output_mutex: acquired", fn, ln, res);
+ return res;
+}
+
+void
+fhandler_tty_common::__release_output_mutex (const char *fn, int ln)
+{
+ if (ReleaseMutex (output_mutex))
+ {
+#ifdef DEBUGGING
+ if (osi > 0)
+ osi--;
+ termios_printf ("released at %s:%d, osi %d", fn, ln, osi);
+ termios_printf(" for %s:%d (%s)", ostack[osi].fn, ostack[osi].ln, ostack[osi].tname);
+ ostack[osi].ln = -ln;
+#endif
+ }
+ if (strace_active)
+ strace_printf (_STRACE_TERMIOS, "%F (%d): tty output_mutex released", fn, ln);
+}
+
+#define acquire_output_mutex(ms) \
+ __acquire_output_mutex (__PRETTY_FUNCTION__, __LINE__, ms);
+
+#define release_output_mutex() \
+ __release_output_mutex (__PRETTY_FUNCTION__, __LINE__);
+
+/* Process tty input. */
+
+void
+fhandler_pty_master::doecho (const void *str, DWORD len)
+{
+ acquire_output_mutex (INFINITE);
+ WriteFile (get_ttyp ()->to_master, str, len, &len, NULL);
+// WaitForSingleObject (output_done_event, INFINITE);
+ release_output_mutex ();
+}
+
+int
+fhandler_pty_master::accept_input ()
+{
+ DWORD written;
+ DWORD n;
+ const char dummy[1] = {'X'};
+ const char *buf;
+
+ n = get_ttyp ()->read_retval = eat_readahead (-1);
+
+ if (n != 0)
+ buf = rabuf;
+ else
+ {
+ n = 1;
+ buf = dummy;
+ termios_printf ("sending EOF to slave");
+ }
+ termios_printf ("about to write %d chars to slave", n);
+ if (!WriteFile (get_output_handle (), buf, n, &written, NULL))
+ return -1;
+ return get_ttyp ()->read_retval;
+}
+
+static DWORD WINAPI
+process_input (void *arg)
+{
+ char rawbuf[INP_BUFFER_SIZE];
+
+ while (1)
+ {
+ int nraw = tty_master->console->read ((void *) rawbuf,
+ (size_t) INP_BUFFER_SIZE);
+ tty_master->line_edit (rawbuf, nraw);
+ }
+}
+
+BOOL
+fhandler_pty_master::hit_eof ()
+{
+ if (get_ttyp ()->was_opened && !get_ttyp ()->slave_alive ())
+ {
+ /* We have the only remaining open handle to this pty, and
+ the slave pty has been opened at least once. We treat
+ this as EOF. */
+ termios_printf ("all other handles closed");
+ return 1;
+ }
+ return 0;
+}
+
+/* Process tty output requests */
+
+int
+fhandler_pty_master::process_slave_output (char *buf, size_t len)
+{
+ size_t rlen;
+ char outbuf[OUT_BUFFER_SIZE];
+ DWORD n;
+ int column = 0;
+
+again:
+
+ if (len == 0)
+ return 0;
+
+ if (neednl_)
+ {
+ /* We need to return a left over \n character, resulting from
+ \r\n conversion. Note that we already checked for FLUSHO and
+ OutputStopped at the time that we read the character, so we
+ don't check again here. */
+ buf[0] = '\n';
+ neednl_ = 0;
+ return 1;
+ }
+
+ /* Set RLEN to the number of bytes to read from the pipe. */
+ rlen = len;
+ if (get_ttyp ()->ti.c_oflag & OPOST && get_ttyp ()->ti.c_oflag & ONLCR)
+ {
+ /* We are going to expand \n to \r\n, so don't read more than
+ half of the number of bytes requested. */
+ rlen /= 2;
+ if (rlen == 0)
+ rlen = 1;
+ }
+ if (rlen > sizeof outbuf)
+ rlen = sizeof outbuf;
+
+ HANDLE handle = get_io_handle ();
+
+ /* Doing a busy wait like this is quite inefficient, but nothing
+ else seems to work completely. Windows should provide some sort
+ of overlapped I/O for pipes, or something, but it doesn't. */
+ DWORD avail;
+ while (1)
+ {
+ if (! PeekNamedPipe (handle, NULL, 0, NULL, &avail, NULL))
+ {
+ if (GetLastError () == ERROR_BROKEN_PIPE)
+ return 0;
+ __seterrno ();
+ return -1;
+ }
+ if (avail > 0)
+ break;
+ if (hit_eof ())
+ return 0;
+ Sleep (10);
+ }
+
+ if (ReadFile (handle, outbuf, rlen, &n, NULL) == FALSE)
+ {
+ if (GetLastError () == ERROR_BROKEN_PIPE)
+ return 0;
+ __seterrno ();
+ return -1;
+ }
+
+ termios_printf ("len=%u", n);
+
+ if (get_ttyp ()->ti.c_lflag & FLUSHO)
+ {
+ get_ttyp ()->write_retval = n;
+ if (output_done_event != NULL)
+ SetEvent (output_done_event);
+ goto again;
+ }
+
+ if (get_ttyp ()->OutputStopped)
+ WaitForSingleObject (restart_output_event, INFINITE);
+
+ if (get_ttyp ()->ti.c_oflag & OPOST) // post-process output
+ {
+ char *iptr = outbuf, *optr = buf;
+
+ while (n--)
+ {
+ switch (*iptr)
+ {
+ case '\r':
+ if ((get_ttyp ()->ti.c_oflag & ONOCR) && column == 0)
+ {
+ iptr++;
+ continue;
+ }
+ if (get_ttyp ()->ti.c_oflag & OCRNL)
+ *iptr = '\n';
+ else
+ column = 0;
+ break;
+ case '\n':
+ if (get_ttyp ()->ti.c_oflag & ONLCR)
+ {
+ *optr++ = '\r';
+ column = 0;
+ }
+ if (get_ttyp ()->ti.c_oflag & ONLRET)
+ column = 0;
+ break;
+ default:
+ column++;
+ break;
+ }
+
+ /* Don't store data past the end of the user's buffer. This
+ can happen if the user requests a read of 1 byte when
+ doing \r\n expansion. */
+ if (optr - buf >= (int) len)
+ {
+ neednl_ = 1;
+ if (*iptr != '\n' || n != 0)
+ system_printf ("internal error: %d unexpected characters", n);
+ break;
+ }
+
+ *optr++ = *iptr++;
+ }
+ return optr - buf;
+ }
+ else // raw output mode
+ {
+ memcpy (buf, outbuf, n);
+ return n;
+ }
+}
+
+static DWORD WINAPI
+process_output (void *arg)
+{
+ char buf[OUT_BUFFER_SIZE*2];
+ int n;
+
+ while (1)
+ {
+ n = tty_master->process_slave_output (buf, OUT_BUFFER_SIZE);
+ if (n < 0)
+ {
+ termios_printf ("ReadFile %E");
+ ExitThread (0);
+ }
+ if (n == 0)
+ {
+ /* End of file. */
+ ExitThread (0);
+ }
+ n = tty_master->console->write ((void *) buf, (size_t) n);
+ tty_master->get_ttyp ()->write_retval = n == -1 ? -get_errno () : n;
+ SetEvent (tty_master->output_done_event);
+ }
+}
+
+
+/* Process tty ioctl requests */
+
+static DWORD WINAPI
+process_ioctl (void *arg)
+{
+ while (1)
+ {
+ WaitForSingleObject (tty_master->ioctl_request_event, INFINITE);
+ termios_printf ("ioctl() request");
+ tty_master->get_ttyp ()->ioctl_retval =
+ tty_master->console->ioctl (tty_master->get_ttyp ()->cmd,
+ (void *) &tty_master->get_ttyp ()->arg);
+ SetEvent (tty_master->ioctl_done_event);
+ }
+}
+
+/**********************************************************************/
+/* Tty slave stuff */
+
+fhandler_tty_slave::fhandler_tty_slave(int num, const char *name) :
+ fhandler_tty_common (FH_TTYS, name, num)
+{
+ set_cb (sizeof *this);
+ ttynum = num;
+ /* FIXME: This is wasteful. We should rewrite the set_name path to eliminate the
+ need for double allocates. */
+ unix_path_name_ = (char *) realloc (unix_path_name_, strlen(win32_path_name_) + 1);
+ strcpy (unix_path_name_, win32_path_name_);
+ unix_path_name_[0] = unix_path_name_[4] = '/';
+ debug_printf ("unix '%s', win32 '%s'", unix_path_name_, win32_path_name_);
+ inuse = NULL;
+}
+
+fhandler_tty_slave::fhandler_tty_slave(const char *name) :
+ fhandler_tty_common (FH_TTYS, name, 0)
+{
+ set_cb (sizeof *this);
+ debug_printf ("here");
+ inuse = NULL;
+}
+
+int
+fhandler_tty_slave::open (const char *, int flags, mode_t)
+{
+ tcinit (cygwin_shared->tty[ttynum]);
+
+ attach_tty (ttynum);
+ set_ctty (ttynum, flags);
+
+ set_flags (flags);
+ /* Create synchronisation events */
+ char buf[40];
+
+ /* output_done_event may or may not exist. It will exist if the tty
+ was opened by fhandler_tty_master::init, normally called at
+ startup if use_tty is non-zero. It will not exist if this is a
+ pty opened by fhandler_pty_master::open. In the former case, tty
+ output is handled by a separate thread which controls output. */
+ __small_sprintf (buf, OUTPUT_DONE_EVENT, ttynum);
+ output_done_event = OpenEvent (EVENT_ALL_ACCESS, TRUE, buf);
+
+ if (!(output_mutex = get_ttyp()->open_output_mutex (TRUE)))
+ {
+ termios_printf ("open output mutex failed, %E");
+ __seterrno ();
+ return 0;
+ }
+
+ /* The ioctl events may or may not exist. See output_done_event,
+ above. */
+ __small_sprintf (buf, IOCTL_REQUEST_EVENT, ttynum);
+ ioctl_request_event = OpenEvent (EVENT_ALL_ACCESS, TRUE, buf);
+ __small_sprintf (buf, IOCTL_DONE_EVENT, ttynum);
+ ioctl_done_event = OpenEvent (EVENT_ALL_ACCESS, TRUE, buf);
+
+ /* FIXME: Needs a method to eliminate tty races */
+ {
+ acquire_output_mutex (500);
+ inuse = get_ttyp ()->create_inuse (TTY_SLAVE_ALIVE);
+ get_ttyp ()->was_opened = TRUE;
+ release_output_mutex ();
+ }
+
+ /* Duplicate tty handles. */
+
+ if (!get_ttyp ()->from_slave || !get_ttyp ()->to_slave)
+ {
+ termios_printf ("tty handles have been closed");
+ set_errno (EACCES);
+ return 0;
+ }
+
+ HANDLE tty_owner = OpenProcess (PROCESS_DUP_HANDLE, FALSE,
+ get_ttyp ()->master_pid);
+ if (tty_owner == NULL)
+ {
+ termios_printf ("can't open tty(%d) handle process %d",
+ ttynum, get_ttyp ()->master_pid);
+ __seterrno ();
+ return 0;
+ }
+
+ HANDLE nh;
+ if (!DuplicateHandle (tty_owner, get_ttyp ()->from_master, hMainProc, &nh, 0, TRUE,
+ DUPLICATE_SAME_ACCESS))
+ {
+ termios_printf ("can't duplicate input, %E");
+ __seterrno ();
+ return 0;
+ }
+ set_io_handle (nh);
+ termios_printf ("duplicated from_master %p->%p from tty_owner %p",
+ get_ttyp ()->from_master, nh, tty_owner);
+ if (!DuplicateHandle (tty_owner, get_ttyp ()->to_master, hMainProc, &nh, 0, TRUE,
+ DUPLICATE_SAME_ACCESS))
+ {
+ termios_printf ("can't duplicate output, %E");
+ __seterrno ();
+ return 0;
+ }
+ set_output_handle (nh);
+ CloseHandle (tty_owner);
+
+ termios_printf("tty%d opened", ttynum);
+
+ return 1;
+}
+
+void
+fhandler_tty_slave::init (HANDLE f, DWORD a, mode_t)
+{
+ int mode = 0;
+
+ a &= GENERIC_READ | GENERIC_WRITE;
+ if (a == GENERIC_READ)
+ mode = O_RDONLY;
+ if (a == GENERIC_WRITE)
+ mode = O_WRONLY;
+ if (a == (GENERIC_READ | GENERIC_WRITE))
+ mode = O_RDWR;
+
+ open (0, mode);
+}
+
+int
+fhandler_tty_slave::write (const void *ptr, size_t len)
+{
+ DWORD n, towrite = len;
+
+ termios_printf("tty%d, write(%x, %d)", ttynum, ptr, len);
+
+ acquire_output_mutex (INFINITE);
+
+ while (len)
+ {
+ n = min (OUT_BUFFER_SIZE, len);
+ char *buf = (char *)ptr;
+ ptr = (char *) ptr + n;
+ len -= n;
+
+ if (WriteFile (get_output_handle (), buf, n, &n, NULL) == FALSE)
+ {
+ termios_printf ("WriteFile failed, %E");
+ towrite = (DWORD) -1;
+ _raise (SIGHUP); /* FIXME: Should this be SIGTTOU? */
+ break;
+ }
+
+ if (output_done_event != NULL)
+ {
+ termios_printf("tty%d waiting for output_done", ttynum);
+ WaitForSingleObject (output_done_event, n * 1000);
+ }
+
+ if (get_ttyp ()->write_retval < 0)
+ {
+ set_errno (-get_ttyp ()->write_retval);
+ towrite = (DWORD) -1;
+ break;
+ }
+ }
+ release_output_mutex ();
+ return towrite;
+}
+
+int
+fhandler_tty_slave::read (void *ptr, size_t len)
+{
+ DWORD n;
+ int totalread = 0;
+ int vmin = INT_MAX;
+ int vtime = 0; /* Initialized to prevent -Wuninitialized warning */
+ char buf[INP_BUFFER_SIZE];
+
+ termios_printf("read(%x, %d) handle %d", ptr, len, get_handle ());
+
+ if (!(get_ttyp ()->ti.c_lflag & ICANON))
+ {
+ vmin = get_ttyp ()->ti.c_cc[VMIN];
+ vtime = get_ttyp ()->ti.c_cc[VTIME];
+ }
+
+ while (len)
+ {
+ wait:
+ termios_printf ("reading %d bytes (vtime %d)",
+ min ((unsigned) vmin, min (len, sizeof (buf))), vtime);
+ if (ReadFile (get_handle (), (unsigned *) buf,
+ min ((unsigned) vmin, min (len, sizeof (buf))), &n, NULL) == FALSE)
+ {
+ termios_printf ("read failed, %E");
+ _raise (SIGHUP);
+ }
+ if (get_ttyp ()->read_retval < 0) // read error
+ {
+ set_errno (-get_ttyp ()->read_retval);
+ totalread = -1;
+ break;
+ }
+ if (get_ttyp ()->read_retval == 0) //EOF
+ {
+ termios_printf ("saw EOF");
+ break;
+ }
+ len -= n;
+ totalread += n;
+ memcpy (ptr, buf, n);
+ ptr = (char *) ptr + n;
+ if (get_ttyp ()->ti.c_lflag & ICANON)
+ break;
+ else if (totalread >= vmin)
+ break;
+
+ if (!PeekNamedPipe (get_handle (), NULL, 0, NULL, &n, NULL))
+ {
+ termios_printf("PeekNamedPipe failed, %E");
+ break;
+ }
+ if (n == 0)
+ {
+ if (get_flags () & (O_NONBLOCK | O_NDELAY))
+ break;
+
+ /* We can't enter to blocking Readfile - signals will be lost!
+ * So, poll the pipe for data.
+ * FIXME: try to avoid polling...
+ * FIXME: Current EINTR scheme does not take vmin/vtime into account.
+ */
+ if (!(get_ttyp ()->ti.c_lflag & ICANON))
+ {
+ termios_printf("vmin %d vtime %d", vmin, vtime);
+ if (vmin == 0 && vtime == 0)
+ return 0; // min = 0, time = 0
+ if (vtime == 0)
+ goto wait; // min > 0, time = 0
+ while (vtime--)
+ {
+ PeekNamedPipe (get_handle (), NULL, 0, NULL, &n, NULL);
+ if (n)
+ break;
+ Sleep(10);
+ }
+ if (vtime == 0)
+ return totalread;
+ }
+ }
+ }
+ termios_printf ("%d=read(%x, %d)", totalread, ptr, len);
+ return totalread;
+}
+
+int
+fhandler_tty_common::dup (fhandler_base *child)
+{
+ fhandler_tty_slave *fts = (fhandler_tty_slave *) child;
+ int errind;
+
+ termios_printf ("here");
+ fts->ttynum = ttynum;
+ fts->tcinit (get_ttyp ());
+
+ attach_tty (ttynum);
+
+ HANDLE nh;
+
+ if (output_done_event == NULL)
+ fts->output_done_event = NULL;
+ else if (!DuplicateHandle (hMainProc, output_done_event, hMainProc,
+ &fts->output_done_event, 0, 1,
+ DUPLICATE_SAME_ACCESS))
+ {
+ errind = 1;
+ goto err;
+ }
+ if (ioctl_request_event == NULL)
+ fts->ioctl_request_event = NULL;
+ else if (!DuplicateHandle (hMainProc, ioctl_request_event, hMainProc,
+ &fts->ioctl_request_event, 0, 1,
+ DUPLICATE_SAME_ACCESS))
+ {
+ errind = 2;
+ goto err;
+ }
+ if (ioctl_done_event == NULL)
+ fts->ioctl_done_event = NULL;
+ else if (!DuplicateHandle (hMainProc, ioctl_done_event, hMainProc,
+ &fts->ioctl_done_event, 0, 1,
+ DUPLICATE_SAME_ACCESS))
+ {
+ errind = 3;
+ goto err;
+ }
+ if (!DuplicateHandle (hMainProc, output_mutex, hMainProc,
+ &fts->output_mutex, 0, 1,
+ DUPLICATE_SAME_ACCESS))
+ {
+ errind = 4;
+ goto err;
+ }
+ if (!DuplicateHandle (hMainProc, get_handle (), hMainProc,
+ &nh, 0, 1,
+ DUPLICATE_SAME_ACCESS))
+ {
+ errind = 5;
+ goto err;
+ }
+ fts->set_io_handle (nh);
+
+ if (!DuplicateHandle (hMainProc, get_output_handle (), hMainProc,
+ &nh, 0, 1,
+ DUPLICATE_SAME_ACCESS))
+ {
+ errind = 6;
+ goto err;
+ }
+ fts->set_output_handle (nh);
+
+ if (inuse == NULL)
+ fts->inuse = NULL;
+ else if (!DuplicateHandle (hMainProc, inuse, hMainProc,
+ &fts->inuse, 0, 1,
+ DUPLICATE_SAME_ACCESS))
+ {
+ errind = 7;
+ goto err;
+ }
+ return 0;
+
+err:
+ __seterrno ();
+ termios_printf ("dup %d failed in DuplicateHandle, %E", errind);
+ return -1;
+}
+
+int
+fhandler_tty_slave::tcgetattr (struct termios *t)
+{
+ *t = get_ttyp ()->ti;
+ return 0;
+}
+
+int
+fhandler_tty_slave::tcsetattr (int a, const struct termios *t)
+{
+ acquire_output_mutex (INFINITE);
+ get_ttyp ()->ti = *t;
+ release_output_mutex ();
+ return 0;
+}
+
+int
+fhandler_tty_slave::tcflush (int a)
+{
+ return 0;
+}
+
+void
+fhandler_tty_slave::send_ioctl_request (void)
+{
+ if (ioctl_request_event == NULL || ioctl_done_event == NULL) // slave of pty
+ return;
+
+ acquire_output_mutex (INFINITE);
+ SetEvent (ioctl_request_event);
+ WaitForSingleObject (ioctl_done_event, INFINITE);
+ release_output_mutex ();
+}
+
+int
+fhandler_tty_slave::ioctl (unsigned int cmd, void *arg)
+{
+ termios_printf ("ioctl (%x)", cmd);
+
+ if (myself->pgid && get_ttyp ()->getpgid () != myself->pgid &&
+ myself->ctty == ttynum && (get_ttyp ()->ti.c_lflag & TOSTOP))
+ {
+ /* background process */
+ termios_printf("bg ioctl pgid %d, tpgid %d, ctty %d",
+ myself->pgid, get_ttyp ()->getpgid (), myself->ctty);
+ _raise (SIGTTOU);
+ }
+ get_ttyp ()->cmd = cmd;
+ get_ttyp ()->ioctl_retval = 0;
+ switch (cmd)
+ {
+ case TIOCGWINSZ:
+ get_ttyp ()->arg.winsize = get_ttyp ()->winsize;
+ send_ioctl_request ();
+ * (struct winsize *) arg = get_ttyp ()->arg.winsize;
+ get_ttyp ()->winsize = get_ttyp ()->arg.winsize;
+ break;
+ case TIOCSWINSZ:
+ get_ttyp ()->ioctl_retval = -1;
+ get_ttyp ()->arg.winsize = * (struct winsize *) arg;
+ send_ioctl_request ();
+ break;
+ case FIONBIO:
+ if (* (int *) arg)
+ set_flags (get_flags () | O_NONBLOCK);
+ else
+ set_flags (get_flags () & ~O_NONBLOCK);
+ break;
+ default:
+ set_errno (EINVAL);
+ return -1;
+ }
+ termios_printf ("%d = ioctl (%x)", get_ttyp ()->ioctl_retval, cmd);
+ return get_ttyp ()->ioctl_retval;
+}
+
+/*******************************************************
+ fhandler_pty_master
+*/
+fhandler_pty_master::fhandler_pty_master (const char *name, DWORD devtype, int unit) :
+ fhandler_tty_common (devtype, name, unit)
+{
+ set_cb (sizeof *this);
+ ioctl_request_event = NULL;
+ ioctl_done_event = NULL;
+ restart_output_event = NULL;
+ pktmode = neednl_ = 0;
+ inuse = NULL;
+}
+
+int
+fhandler_pty_master::open (const char *, int flags, mode_t)
+{
+ ttynum = cygwin_shared->tty.allocate_tty (0);
+ if (ttynum < 0)
+ return 0;
+
+ cygwin_shared->tty[ttynum]->common_init (this);
+ inuse = get_ttyp ()->create_inuse (TTY_MASTER_ALIVE);
+ set_flags (flags);
+
+ termios_printf ("opened pty master tty%d<%p>", ttynum, this);
+ return 1;
+}
+
+int
+fhandler_tty_common::close ()
+{
+termios_printf ("here %p", this);
+ if (output_done_event && !CloseHandle (output_done_event))
+ termios_printf ("CloseHandle (output_done_event), %E");
+ if (ioctl_done_event && !CloseHandle (ioctl_done_event))
+ termios_printf ("CloseHandle (ioctl_done_event), %E");
+ if (ioctl_request_event && !CloseHandle (ioctl_request_event))
+ termios_printf ("CloseHandle (ioctl_request_event), %E");
+ if (restart_output_event && !CloseHandle (restart_output_event))
+ termios_printf ("CloseHandle (restart_output_event), %E");
+ if (inuse && !CloseHandle (inuse))
+ termios_printf ("CloseHandle (inuse), %E");
+ if (!ForceCloseHandle (output_mutex))
+ termios_printf ("CloseHandle (output_mutex<%p>), %E", output_mutex);
+ if (!CloseHandle (get_handle ()))
+ termios_printf ("CloseHandle (get_handle ()<%p>), %E", get_handle ());
+ if (!CloseHandle (get_output_handle ()))
+ termios_printf ("CloseHandle (get_output_handle ()<%p>), %E", get_output_handle ());
+
+ inuse = NULL;
+ termios_printf ("tty%d closed", ttynum);
+ return 0;
+}
+
+int
+fhandler_pty_master::close ()
+{
+#if 0
+ while (accept_input () > 0)
+ continue;
+#endif
+ this->fhandler_tty_common::close ();
+
+ if (!get_ttyp ()->master_alive ())
+ {
+ termios_printf ("freeing tty%d (%d)", ttynum, get_ttyp ()->ntty);
+ if (get_ttyp ()->to_slave)
+ CloseHandle (get_ttyp ()->to_slave);
+ if (get_ttyp ()->from_slave)
+ CloseHandle (get_ttyp ()->from_slave);
+ if (get_ttyp ()->from_master)
+ CloseHandle (get_ttyp ()->from_master);
+ if (get_ttyp ()->to_master)
+ CloseHandle (get_ttyp ()->to_master);
+ get_ttyp ()->init ();
+ }
+
+ return 0;
+}
+
+int
+fhandler_pty_master::write (const void *ptr, size_t len)
+{
+ line_edit ((char *) ptr, len);
+ return len;
+}
+
+int
+fhandler_pty_master::read (void *ptr, size_t len)
+{
+ DWORD n;
+ char *cptr = (char *) ptr;
+
+ if (! PeekNamedPipe (get_handle (), NULL, 0, NULL, &n, NULL))
+ {
+ if (GetLastError () == ERROR_BROKEN_PIPE)
+ {
+ /* On Unix, a read from a broken pipe returns EOF. */
+ return 0;
+ }
+ __seterrno ();
+ return -1;
+ }
+ if (n == 0
+ && (get_flags () & (O_NONBLOCK | O_NDELAY)) != 0)
+ {
+ set_errno (EAGAIN);
+ return -1;
+ }
+ if (pktmode)
+ {
+ *cptr++ = TIOCPKT_DATA;
+ len--;
+ }
+ n = process_slave_output (cptr, len);
+ if (n < 0)
+ return -1;
+ if (output_done_event != NULL)
+ SetEvent (output_done_event);
+ if (pktmode && n > 0)
+ n++;
+ return n;
+}
+
+int
+fhandler_pty_master::tcgetattr (struct termios *t)
+{
+ *t = cygwin_shared->tty[ttynum]->ti;
+ return 0;
+}
+
+int
+fhandler_pty_master::tcsetattr (int a, const struct termios *t)
+{
+ cygwin_shared->tty[ttynum]->ti = *t;
+ return 0;
+}
+
+int
+fhandler_pty_master::tcflush (int a)
+{
+ return 0;
+}
+
+int
+fhandler_pty_master::ioctl (unsigned int cmd, void *arg)
+{
+ switch (cmd)
+ {
+ case TIOCPKT:
+ pktmode = * (int *) arg;
+ break;
+ case TIOCGWINSZ:
+ * (struct winsize *) arg = get_ttyp ()->winsize;
+ break;
+ case TIOCSWINSZ:
+ get_ttyp ()->winsize = * (struct winsize *) arg;
+ _kill (-get_ttyp ()->getpgid (), SIGWINCH);
+ break;
+ case FIONBIO:
+ if (* (int *) arg)
+ set_flags (get_flags () | O_NONBLOCK);
+ else
+ set_flags (get_flags () & ~O_NONBLOCK);
+ break;
+ default:
+ set_errno (EINVAL);
+ return -1;
+ }
+ return 0;
+}
+
+char *
+fhandler_pty_master::ptsname (void)
+{
+ static char buf[32];
+
+ __small_sprintf (buf, "/dev/tty%d", ttynum);
+ return buf;
+}
+
+void
+fhandler_tty_common::set_close_on_exec (int val)
+{
+ this->fhandler_base::set_close_on_exec (val);
+ if (output_done_event)
+ set_inheritance (output_done_event, val);
+ if (ioctl_request_event)
+ set_inheritance (ioctl_request_event, val);
+ if (ioctl_done_event)
+ set_inheritance (ioctl_done_event, val);
+ if (inuse)
+ set_inheritance (inuse, val);
+ set_inheritance (output_mutex, val, "output_mutex");
+ set_inheritance (output_handle, val);
+}
+
+void
+fhandler_tty_common::fixup_after_fork (HANDLE parent)
+{
+ this->fhandler_base::fixup_after_fork (parent);
+ if (output_done_event)
+ fork_fixup (parent, output_done_event, "output_done_event");
+ if (ioctl_request_event)
+ fork_fixup (parent, ioctl_request_event, "ioctl_request_event");
+ if (ioctl_done_event)
+ fork_fixup (parent, ioctl_done_event, "ioctl_done_event");
+ if (output_mutex)
+ {
+ fork_fixup (parent, output_mutex, "output_mutex");
+ ProtectHandle (output_mutex);
+ }
+ fork_fixup (parent, output_handle, "output_handle");
+ fork_fixup (parent, inuse, "inuse");
+}
+
+void
+fhandler_pty_master::set_close_on_exec (int val)
+{
+ this->fhandler_tty_common::set_close_on_exec (val);
+ set_inheritance (restart_output_event, val);
+
+ /* FIXME: There is a console handle leak here. */
+ if (get_ttyp ()->master_pid == GetCurrentProcessId ())
+ {
+ get_ttyp ()->from_slave = get_handle ();
+ get_ttyp ()->to_slave = get_output_handle ();
+ }
+}
+
+void
+fhandler_pty_master::fixup_after_fork (HANDLE child)
+{
+ this->fhandler_tty_common::fixup_after_fork (child);
+ if (restart_output_event)
+ fork_fixup (child, restart_output_event, "restart_output_event");
+}
+
+void
+fhandler_tty_master::fixup_after_fork (HANDLE child)
+{
+ this->fhandler_pty_master::fixup_after_fork (child);
+ console->fixup_after_fork (child);
+}
+
+int
+fhandler_tty_master::de_linearize (const char *buf, const char *unix_name,
+ const char *win32_name)
+{
+ int res = fhandler_base::de_linearize (buf, unix_name, win32_name);
+ console->close ();
+ init_console ();
+ return res;
+}
+
+int
+fhandler_tty_master::init_console ()
+{
+ console = (fhandler_console *) dtable.build_fhandler (-1, FH_CONSOLE, "/dev/ttym");
+ if (console == NULL)
+ return -1;
+
+ console->init (INVALID_HANDLE_VALUE, GENERIC_READ | GENERIC_WRITE, O_BINARY);
+ console->set_r_no_interrupt (1);
+ return 0;
+}
diff --git a/winsup/cygwin/fhandler_windows.cc b/winsup/cygwin/fhandler_windows.cc
new file mode 100644
index 000000000..eee8286e1
--- /dev/null
+++ b/winsup/cygwin/fhandler_windows.cc
@@ -0,0 +1,145 @@
+/* fhandler_windows.cc: code to access windows message queues.
+
+ Copyright 1998 Cygnus Solutions.
+
+ Written by Sergey S. Okhapkin (sos@prospect.com.ru).
+ Feedback and testing by Andy Piper (andyp@parallax.co.uk).
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#include <errno.h>
+#include "winsup.h"
+
+/*
+The following unix-style calls are supported:
+
+ open ("/dev/windows", flags, mode=0)
+ - create a unix fd for message queue.
+ O_NONBLOCK flag controls the read() call behavior.
+
+ read (fd, buf, len)
+ - return next message from queue. buf must point to MSG
+ structure, len must be >= sizeof (MSG). If read is set to
+ non-blocking and the queue is empty, read call returns -1
+ immediately with errno set to EAGAIN, otherwise it blocks
+ untill the message will be received.
+
+ write (fd, buf, len)
+ - send a message pointed by buf. len argument ignored.
+
+ ioctl (fd, command, *param)
+ - control read()/write() behavior.
+ ioctl (fd, WINDOWS_POST, NULL): write() will PostMessage();
+ ioctl (fd, WINDOWS_SEND, NULL): write() will SendMessage();
+ ioctl (fd, WINDOWS_HWND, &hWnd): read() messages for
+ hWnd window.
+
+ select () call marks read fd when any message posted to queue.
+*/
+
+fhandler_windows::fhandler_windows (const char *name) :
+ fhandler_base (FH_WINDOWS, name)
+{
+ set_cb (sizeof *this);
+ hWnd_ = NULL;
+ method_ = WINDOWS_POST;
+}
+
+int
+fhandler_windows::open (const char *, int flags, mode_t)
+{
+ set_flags (flags);
+ set_close_on_exec_flag (1);
+ return 1;
+}
+
+int
+fhandler_windows::write (const void *buf, size_t)
+{
+ MSG *ptr = (MSG *) buf;
+
+ if (method_ == WINDOWS_POST)
+ {
+ if (!PostMessage (ptr->hwnd, ptr->message, ptr->wParam, ptr->lParam))
+ {
+ __seterrno ();
+ return -1;
+ }
+ else
+ return sizeof (MSG);
+ }
+ else
+ return SendMessage (ptr->hwnd, ptr->message, ptr->wParam, ptr->lParam);
+}
+
+int
+fhandler_windows::read (void *buf, size_t len)
+{
+ MSG *ptr = (MSG *) buf;
+ int ret;
+
+ if (len < sizeof (MSG))
+ {
+ set_errno (EINVAL);
+ return -1;
+ }
+
+ ret = GetMessage (ptr, hWnd_, 0, 0);
+
+ if (ret == -1)
+ {
+ __seterrno ();
+ }
+ set_errno (0);
+ return ret;
+}
+
+int
+fhandler_windows::ioctl (unsigned int cmd, void *val)
+{
+ switch (cmd)
+ {
+ case WINDOWS_POST:
+ case WINDOWS_SEND:
+ method_ = cmd;
+ break;
+ case WINDOWS_HWND:
+ if (val == NULL)
+ {
+ set_errno (EINVAL);
+ return -1;
+ }
+ hWnd_ = * ((HWND *) val);
+ break;
+ default:
+ set_errno (EINVAL);
+ return -1;
+ }
+ return 0;
+}
+
+void
+fhandler_windows::set_close_on_exec (int val)
+{
+ if (get_handle ())
+ this->fhandler_base::set_close_on_exec (val);
+ else
+ this->fhandler_base::set_close_on_exec_flag (val);
+ void *h = hWnd_;
+ if (h)
+ set_inheritance (h, val);
+}
+
+void
+fhandler_windows::fixup_after_fork (HANDLE parent)
+{
+ if (get_handle ())
+ this->fhandler_base::fixup_after_fork (parent);
+ void *h = hWnd_;
+ if (h)
+ fork_fixup (parent, h, "hWnd_");
+}
diff --git a/winsup/cygwin/fhandler_zero.cc b/winsup/cygwin/fhandler_zero.cc
new file mode 100644
index 000000000..eb76037fb
--- /dev/null
+++ b/winsup/cygwin/fhandler_zero.cc
@@ -0,0 +1,58 @@
+/* fhandler_dev_zero.cc: code to access /dev/zero
+
+ Copyright 2000 Cygnus Solutions.
+
+ Written by DJ Delorie (dj@cygnus.com)
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#include <errno.h>
+#include "winsup.h"
+
+fhandler_dev_zero::fhandler_dev_zero (const char *name)
+ : fhandler_base (FH_ZERO, name)
+{
+ set_cb (sizeof *this);
+}
+
+int
+fhandler_dev_zero::open (const char *path, int flags, mode_t mode = 0)
+{
+ set_flags (flags);
+ return 1;
+}
+
+int
+fhandler_dev_zero::write (const void *ptr, size_t len)
+{
+ return len;
+}
+
+int
+fhandler_dev_zero::read (void *ptr, size_t len)
+{
+ memset(ptr, 0, len);
+ return len;
+}
+
+off_t
+fhandler_dev_zero::lseek (off_t offset, int whence)
+{
+ return 0;
+}
+
+int
+fhandler_dev_zero::close (void)
+{
+ return 0;
+}
+
+void
+fhandler_dev_zero::dump ()
+{
+ paranoid_printf("here, fhandler_dev_zero");
+}
diff --git a/winsup/cygwin/fork.cc b/winsup/cygwin/fork.cc
new file mode 100644
index 000000000..c08eab292
--- /dev/null
+++ b/winsup/cygwin/fork.cc
@@ -0,0 +1,625 @@
+/* fork.cc
+
+ Copyright 1996, 1997, 1998, 1999 Cygnus Solutions.
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <stdarg.h>
+#include <errno.h>
+#include "winsup.h"
+#include "dll_init.h"
+
+DWORD chunksize = 0;
+/* Timeout to wait for child to start, parent to init child, etc. */
+/* FIXME: Once things stabilize, bump up to a few minutes. */
+#define FORK_WAIT_TIMEOUT (300 * 1000) /* 300 seconds */
+
+#define dll_data_start &_data_start__
+#define dll_data_end &_data_end__
+#define dll_bss_start &_bss_start__
+#define dll_bss_end &_bss_end__
+
+void
+per_thread::set (void *s)
+ {
+ if (s == PER_THREAD_FORK_CLEAR)
+ {
+ tls = TlsAlloc ();
+ s = NULL;
+ }
+ TlsSetValue (get_tls (), s);
+ }
+
+static void
+stack_base (child_info_fork &ch)
+{
+ MEMORY_BASIC_INFORMATION m;
+ memset (&m, 0, sizeof m);
+ if (!VirtualQuery ((LPCVOID) &m, &m, sizeof m))
+ system_printf ("couldn't get memory info, %E");
+
+ ch.stacktop = m.AllocationBase;
+ ch.stackbottom = (LPBYTE) m.BaseAddress + m.RegionSize;
+ ch.stacksize = (DWORD) ch.stackbottom - (DWORD) &m;
+ debug_printf ("bottom %p, top %p, stack %p, size %d, reserve %d",
+ ch.stackbottom, ch.stacktop, &m, ch.stacksize,
+ (DWORD) ch.stackbottom - (DWORD) ch.stacktop);
+}
+
+/* Copy memory from parent to child.
+ The result is a boolean indicating success. */
+
+static int
+fork_copy (PROCESS_INFORMATION &pi, const char *what, ...)
+{
+ va_list args;
+ char *low;
+ int pass = 0;
+
+ va_start (args, what);
+
+ while ((low = va_arg (args, char *)))
+ {
+ char *high = va_arg (args, char *);
+ DWORD todo = chunksize ?: high - low;
+ char *here;
+
+ for (here = low; here < high; here += todo)
+ {
+ DWORD done = 0;
+ if (here + todo > high)
+ todo = high - here;
+ int res = WriteProcessMemory (pi.hProcess, here, here, todo, &done);
+ debug_printf ("child handle %p, low %p, high %p, res %d", pi.hProcess,
+ low, high, res);
+ if (!res || todo != done)
+ {
+ if (!res)
+ __seterrno ();
+ /* If this happens then there is a bug in our fork
+ implementation somewhere. */
+ system_printf ("%s pass %d failed, %p..%p, done %d, %E",
+ what, pass, low, high, done);
+ goto err;
+ }
+ }
+
+ pass++;
+ }
+
+ debug_printf ("done");
+ return 1;
+
+err:
+ TerminateProcess (pi.hProcess, 1);
+ set_errno (EAGAIN);
+ return 0;
+}
+
+/* Wait for child to finish what it's doing and signal us.
+ We don't want to wait forever here.If there's a problem somewhere
+ it'll hang the entire system (since all forks are mutex'd). If we
+ time out, set errno = EAGAIN and hope the app tries again. */
+static int
+sync_with_child (PROCESS_INFORMATION &pi, HANDLE subproc_ready,
+ BOOL hang_child, const char *s)
+{
+ /* We also add the child process handle to the wait. If the child fails
+ to initialize (eg. because of a missing dll). Then this
+ handle will become signalled. This stops a *looong* timeout wait.
+ */
+ HANDLE w4[2];
+
+ debug_printf ("waiting for child. reason: %s", s);
+ w4[1] = pi.hProcess;
+ w4[0] = subproc_ready;
+ DWORD rc = WaitForMultipleObjects (2, w4, FALSE, FORK_WAIT_TIMEOUT);
+
+ if (rc == WAIT_OBJECT_0 ||
+ WaitForSingleObject (subproc_ready, 0) == WAIT_OBJECT_0)
+ /* That's ok */;
+ else if (rc == WAIT_FAILED || rc == WAIT_TIMEOUT)
+ {
+ if (rc != WAIT_FAILED)
+ system_printf ("WaitForMultipleObjects timed out");
+ else
+ system_printf ("WaitForMultipleObjects failed, %E");
+ set_errno (EAGAIN);
+ syscall_printf ("-1 = fork(), WaitForMultipleObjects failed");
+ TerminateProcess (pi.hProcess, 1);
+ return 0;
+ }
+ else
+ {
+ /* Child died. Clean up and exit. */
+ DWORD errcode;
+ GetExitCodeProcess (pi.hProcess, &errcode);
+ /* Fix me. This is not enough. The fork should not be considered
+ * to have failed if the process was essentially killed by a signal.
+ */
+ if (errcode != STATUS_CONTROL_C_EXIT)
+ {
+ system_printf ("child %d(%p) died before initialization with status code %p",
+ pi.dwProcessId, pi.hProcess, errcode);
+ system_printf ("*** child state %s", s);
+#ifdef DEBUGGING
+ abort ();
+#endif
+ }
+ set_errno (EAGAIN);
+ syscall_printf ("Child died before subproc_ready signalled");
+ return 0;
+ }
+
+ debug_printf ("child signalled me");
+ if (hang_child)
+ {
+ int n = SuspendThread (pi.hThread);
+ debug_printf ("suspend count %d", n); \
+ }
+ return 1;
+}
+
+static int
+resume_child (PROCESS_INFORMATION &pi, HANDLE subproc_ready,
+ HANDLE forker_finished)
+{
+ int rc;
+
+ debug_printf ("here");
+ SetEvent (forker_finished);
+
+ rc = ResumeThread (pi.hThread);
+
+ debug_printf ("rc %d", rc);
+ if (rc == 1)
+ return 1; // Successful resumption
+
+ /* Can't resume the thread. Not sure why this would happen unless
+ there's a bug in the system. Things seem to be working OK now
+ though, so flag this with EAGAIN, but print a message on the
+ console. */
+ small_printf ("fork: ResumeThread failed, rc = %d, %E\n", rc);
+ set_errno (EAGAIN);
+ syscall_printf ("-1 = fork(), ResumeThread failed");
+ TerminateProcess (pi.hProcess, 1);
+ return 0;
+}
+
+/* Notify parent that it is time for the next step.
+ Note that this has to be a macro since the parent may be messing with
+ our stack. */
+#define sync_with_parent(s, hang_self) \
+((void) ({ \
+ debug_printf ("signalling parent: %s", s); \
+ /* Tell our parent we're waiting. */ \
+ if (!SetEvent (child_proc_info->subproc_ready)) \
+ api_fatal ("fork child - SetEvent failed, %E"); \
+ if (hang_self) \
+ { \
+ /* Wait for the parent to fill in our stack and heap. \
+ Don't wait forever here. If our parent dies we don't want to clog \
+ the system. If the wait fails, we really can't continue so exit. */ \
+ DWORD psync_rc = WaitForSingleObject (child_proc_info->forker_finished, FORK_WAIT_TIMEOUT); \
+ switch (psync_rc) \
+ { \
+ case WAIT_TIMEOUT: \
+ api_fatal ("sync_with_parent - WFSO timed out"); \
+ break; \
+ case WAIT_FAILED: \
+ if (GetLastError () == ERROR_INVALID_HANDLE && \
+ WaitForSingleObject (child_proc_info->forker_finished, 1) != WAIT_FAILED) \
+ break; \
+ api_fatal ("sync_with_parent - WFSO failed, fork_finished %p, %E", child_proc_info->forker_finished); \
+ break; \
+ default: \
+ break; \
+ } \
+ debug_printf ("awake"); \
+ } \
+ 0; \
+}))
+
+static volatile void grow_stack_slack();
+
+static void *
+stack_dummy (int here)
+{
+ return &here;
+}
+
+extern "C" int
+fork ()
+{
+ int res;
+ DWORD rc;
+ HANDLE hParent;
+ pinfo *child;
+ HANDLE subproc_ready, forker_finished;
+ void *stack_here;
+ int x;
+ PROCESS_INFORMATION pi = {0};
+
+ MALLOC_CHECK;
+
+ /* FIXME: something is broken when copying the stack from the parent
+ to the child; we try various tricks here to make sure that the
+ stack is good enough to prevent page faults, but the true cause
+ is still unknown. DJ */
+ volatile char dummy[4096];
+ dummy[0] = dummy[4095] = 0; // Just to leave some slack in the stack
+
+ grow_stack_slack ();
+
+ debug_printf ("entering");
+ /* Calculate how much of stack to copy to child */
+ stack_here = stack_dummy (0);
+
+ if (ISSTATE(myself, PID_SPLIT_HEAP))
+ {
+ system_printf ("The heap has been split, CYGWIN can't fork this process.");
+ system_printf ("Increase the heap_chunk_size in the registry and try again.");
+ set_errno (ENOMEM);
+ syscall_printf ("-1 = fork (), split heap");
+ return -1;
+ }
+
+ /* Don't start the fork until we have the lock. */
+ child = cygwin_shared->p.allocate_pid ();
+ if (!child)
+ {
+ set_errno (EAGAIN);
+ syscall_printf ("-1 = fork (), process table full");
+ return -1;
+ }
+
+ static child_info_fork ch;
+ x = setjmp (ch.jmp);
+
+ if (x == 0)
+ {
+
+ /* This will help some of the confusion. */
+ fflush (stdout);
+
+ debug_printf ("parent pid %d, child pid %d", myself->pid, child->pid);
+
+ subproc_ready = CreateEvent (&sec_all, FALSE, FALSE, NULL);
+ forker_finished = CreateEvent (&sec_all, FALSE, FALSE, NULL);
+ ProtectHandle (subproc_ready);
+ ProtectHandle (forker_finished);
+
+ /* If we didn't obtain all the resources we need to fork, allow the program
+ to continue, but record the fact that fork won't work. */
+ if (forker_finished == NULL || subproc_ready == NULL)
+ {
+ system_printf ("unable to allocate fork() resources.");
+ system_printf ("fork() disabled.");
+ return -1;
+ }
+
+ subproc_init ();
+
+ debug_printf ("about to call setjmp");
+ /* Parent. */
+#ifdef DEBUGGING
+ /* The ProtectHandle call allocates memory so we need to make sure
+ that enough is set aside here so that the sbrk pointer does not
+ move when ProtectHandle is called after the child is started.
+ Otherwise the sbrk pointers in the parent will not agree with
+ the child and when user_data is (regrettably) copied over,
+ the user_data->ptr field will not be accurate. */
+ free (malloc (4096));
+#endif
+
+ init_child_info (PROC_FORK1, &ch, child->pid, subproc_ready);
+
+ ch.forker_finished = forker_finished;
+ ch.heaptop = user_data->heaptop;
+ ch.heapbase = user_data->heapbase;
+ ch.heapptr = user_data->heapptr;
+
+ stack_base (ch);
+
+ /* Initialize things that are done later in dll_crt0_1 that aren't done
+ for the forkee. */
+ strcpy(child->progname, myself->progname);
+
+ STARTUPINFO si = {0};
+
+ si.cb = sizeof (STARTUPINFO);
+ si.lpReserved2 = (LPBYTE)&ch;
+ si.cbReserved2 = sizeof(ch);
+
+ int c_flags = GetPriorityClass (hMainProc) /*|
+ CREATE_NEW_PROCESS_GROUP*/;
+
+ /* If we don't have a console, then don't create a console for the
+ child either. */
+ HANDLE console_handle = CreateFileA ("CONOUT$", GENERIC_WRITE,
+ FILE_SHARE_WRITE, &sec_none_nih,
+ OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,
+ NULL);
+
+ syscall_printf ("CreateProcessA (%s, %s,0,0,1,%x, 0,0,%p,%p)",
+ myself->progname, myself->progname, c_flags, &si, &pi);
+ if (console_handle != INVALID_HANDLE_VALUE && console_handle != 0)
+ CloseHandle (console_handle);
+ else
+ c_flags |= DETACHED_PROCESS;
+
+ hParent = NULL;
+ if (!DuplicateHandle (hMainProc, hMainProc, hMainProc, &hParent, 0, 1,
+ DUPLICATE_SAME_ACCESS))
+ {
+ system_printf ("couldn't create handle to myself for child, %E");
+ goto cleanup;
+ }
+
+ rc = CreateProcessA (myself->progname, /* image to run */
+ myself->progname, /* what we send in arg0 */
+ &sec_none_nih, /* process security attrs */
+ &sec_none_nih, /* thread security attrs */
+ TRUE, /* inherit handles from parent */
+ c_flags,
+ NULL, /* environment filled in later */
+ 0, /* use current drive/directory */
+ &si,
+ &pi);
+
+ CloseHandle (hParent);
+
+ if (!rc)
+ {
+ __seterrno ();
+ syscall_printf ("-1 = fork(), CreateProcessA failed");
+ child->process_state = PID_NOT_IN_USE;
+ ForceCloseHandle(subproc_ready);
+ ForceCloseHandle(forker_finished);
+ subproc_ready = forker_finished = NULL;
+ return -1;
+ }
+
+ ProtectHandle (pi.hThread);
+ /* Protect the handle but name it similarly to the way it will
+ be called in subproc handling. */
+ ProtectHandle1 (pi.hProcess, childhProc);
+
+ /* Fill in fields in the child's process table entry. */
+ child->ppid = myself->pid;
+ child->hProcess = pi.hProcess;
+ child->dwProcessId = pi.dwProcessId;
+ child->uid = myself->uid;
+ child->gid = myself->gid;
+ child->pgid = myself->pgid;
+ child->sid = myself->sid;
+ child->ctty = myself->ctty;
+ child->umask = myself->umask;
+ child->copysigs(myself);
+ child->process_state |= PID_INITIALIZING |
+ (myself->process_state & PID_USETTY);
+ memcpy (child->username, myself->username, MAX_USER_NAME);
+ child->psid = myself->psid;
+ memcpy (child->sidbuf, myself->sidbuf, 40);
+ memcpy (child->logsrv, myself->logsrv, 256);
+ memcpy (child->domain, myself->domain, MAX_COMPUTERNAME_LENGTH+1);
+ set_child_mmap_ptr (child);
+
+ /* Wait for subproc to initialize itself. */
+ if (!sync_with_child(pi, subproc_ready, TRUE, "waiting for longjmp"))
+ goto cleanup;
+
+ /* CHILD IS STOPPED */
+ debug_printf ("child is alive (but stopped)");
+
+ /* Initialize, in order: data, bss, heap, stack, dll data, dll bss
+ Note: variables marked as NO_COPY will not be copied
+ since they are placed in a protected segment. */
+
+
+ MALLOC_CHECK;
+ rc = fork_copy (pi, "user/cygwin data",
+ user_data->data_start, user_data->data_end,
+ user_data->bss_start, user_data->bss_end,
+ ch.heapbase, ch.heapptr,
+ stack_here, ch.stackbottom,
+ dll_data_start, dll_data_end,
+ dll_bss_start, dll_bss_end, NULL);
+
+ MALLOC_CHECK;
+ if (!rc)
+ goto cleanup;
+
+ /* Now fill data/bss of linked dll */
+ DO_LINKED_DLL (p)
+ {
+ debug_printf ("copying data/bss of a linked dll");
+ if (!fork_copy (pi, "linked dll data/bss", p->data_start, p->data_end,
+ p->bss_start, p->bss_end,
+ NULL))
+ goto cleanup;
+ }
+ DLL_DONE;
+
+ proc_register (child);
+ int load_dll = DllList::the().forkeeMustReloadDlls() &&
+ DllList::the().numberOfOpenedDlls();
+
+ /* Start thread, and wait for it to reload dlls. */
+ if (!resume_child (pi, subproc_ready, forker_finished) ||
+ !sync_with_child (pi, subproc_ready, load_dll, "child loading dlls"))
+ goto cleanup;
+
+ /* child reload dlls & then write their data and bss */
+ if (load_dll)
+ {
+ /* CHILD IS STOPPED */
+ /* write memory of reloaded dlls */
+ DO_LOADED_DLL (p)
+ {
+ debug_printf ("copying data/bss for a loaded dll");
+ if (!fork_copy (pi, "loaded dll data/bss", p->data_start, p->data_end,
+ p->bss_start, p->bss_end,
+ NULL))
+ goto cleanup;
+ }
+ DLL_DONE;
+ /* Start the child up again. */
+ (void) resume_child (pi, subproc_ready, forker_finished);
+ }
+
+ ForceCloseHandle (subproc_ready);
+ ForceCloseHandle (pi.hThread);
+ ForceCloseHandle (forker_finished);
+ forker_finished = NULL;
+ pi.hThread = NULL;
+
+ res = child->pid;
+ }
+ else
+ {
+ /**** Child *****/
+
+ /* We arrive here via a longjmp from "crt0". */
+ (void) stack_dummy (0); // Just to make sure
+ debug_printf ("child is running %d", x);
+
+ debug_printf ("self %p, pid %d, ppid %d",
+ myself, x, myself ? myself->ppid : -1);
+
+ sync_with_parent ("after longjmp.", TRUE);
+ ProtectHandle (hParent);
+
+#ifdef DEBUGGING
+ char c;
+ if (GetEnvironmentVariable ("FORKDEBUG", &c, 1))
+ try_to_debug ();
+#endif
+
+ /* If we've played with the stack, stacksize != 0. That means that
+ fork() was invoked from other than the main thread. Make sure that
+ when the "main" thread exits it calls do_exit, like a normal process.
+ Exit with a status code of 0. */
+ if (child_proc_info->stacksize)
+ {
+ ((DWORD *)child_proc_info->stackbottom)[-17] = (DWORD)do_exit;
+ ((DWORD *)child_proc_info->stackbottom)[-15] = (DWORD)0;
+ }
+
+ MALLOC_CHECK;
+
+ dtable.fixup_after_fork (hParent);
+ ForceCloseHandle (hParent);
+
+ MALLOC_CHECK;
+
+ /* reload dlls if necessary */
+ if (!DllList::the().forkeeMustReloadDlls() ||
+ !DllList::the().numberOfOpenedDlls())
+ sync_with_parent ("performed fork fixup.", FALSE);
+ else
+ {
+ DllList::the().forkeeLoadDlls();
+ sync_with_parent ("loaded dlls", TRUE);
+ }
+
+ (void) ForceCloseHandle (child_proc_info->subproc_ready);
+ (void) ForceCloseHandle (child_proc_info->forker_finished);
+
+ if (recreate_mmaps_after_fork (myself->mmap_ptr))
+ api_fatal ("recreate_mmaps_after_fork_failed");
+
+ res = 0;
+ /* Set thread local stuff to zero. Under Windows 95/98 this is sometimes
+ non-zero, for some reason.
+ FIXME: There is a memory leak here after a fork. */
+ for (per_thread **t = threadstuff; *t; t++)
+ if ((*t)->clear_on_fork ())
+ (*t)->set ();
+
+ /* Initialize signal/process handling */
+ sigproc_init ();
+ }
+
+
+ MALLOC_CHECK;
+ syscall_printf ("%d = fork()", res);
+ return res;
+
+/* Common cleanup code for failure cases */
+cleanup:
+ /* Remember to de-allocate the fd table. */
+ child->process_state = PID_NOT_IN_USE;
+ if (pi.hProcess)
+ ForceCloseHandle1 (pi.hProcess, childhProc);
+ if (pi.hThread)
+ ForceCloseHandle (pi.hThread);
+ if (subproc_ready)
+ ForceCloseHandle (subproc_ready);
+ if (forker_finished)
+ ForceCloseHandle (forker_finished);
+ forker_finished = subproc_ready = child->hProcess = NULL;
+ return -1;
+}
+
+static volatile void
+grow_stack_slack ()
+{
+ volatile char dummy[16384];
+ dummy[0] = dummy[16383] = 0; // Just to make some slack in the stack
+}
+
+#ifdef NEWVFORK
+/* Dummy function to force second assignment below to actually be
+ carried out */
+static vfork_save *
+get_vfork_val ()
+{
+ return vfork_storage.val ();
+}
+#endif
+
+extern "C"
+int
+vfork ()
+{
+#ifndef NEWVFORK
+ return fork ();
+#else
+ vfork_save *vf = get_vfork_val ();
+
+ if (vf == NULL)
+ vf = vfork_storage.create ();
+
+ if (!setjmp (vf->j))
+ {
+ vf->pid = -1;
+ __asm__ volatile ("movl %%ebp,%0": "=r" (vf->vfork_ebp):);
+ __asm__ volatile ("movl (%%ebp),%0": "=r" (vf->caller_ebp):);
+ __asm__ volatile ("movl 4(%%ebp),%0": "=r" (vf->retaddr):);
+ return dtable.vfork_child_dup () ? 0 : -1;
+ }
+
+ dtable.vfork_parent_restore ();
+
+ vf = get_vfork_val ();
+ if (vf->pid < 0)
+ {
+ int exitval = -vf->pid;
+ if ((vf->pid = fork ()) == 0)
+ exit (exitval);
+ }
+
+ vf->vfork_ebp[0] = vf->caller_ebp;
+ vf->vfork_ebp[1] = vf->retaddr;
+ return vf->pid;
+#endif
+}
diff --git a/winsup/cygwin/gcrt0.c b/winsup/cygwin/gcrt0.c
new file mode 100644
index 000000000..e565f092f
--- /dev/null
+++ b/winsup/cygwin/gcrt0.c
@@ -0,0 +1,41 @@
+/* gcrt0.c
+
+ Copyright 1998 Cygnus Solutions.
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#include <sys/types.h>
+#include <stdlib.h>
+
+extern u_char etext asm ("etext");
+extern u_char eprol asm ("__eprol");
+extern void _mcleanup (void);
+extern void monstartup (u_long, u_long);
+
+void _monstartup (void) __attribute__((__constructor__));
+
+/* startup initialization for -pg support */
+
+void
+_monstartup (void)
+{
+ static int called;
+
+ /* Guard against multiple calls that may happen if DLLs are linked
+ with profile option set as well. Addede side benefit is that it
+ makes profiling backward compatible (GCC used to emit a call to
+ _monstartup when compiling main with profiling enabled). */
+ if (called++)
+ return;
+
+ monstartup ((u_long) &eprol, (u_long) &etext);
+ atexit (&_mcleanup);
+}
+
+asm (".text");
+asm ("__eprol:");
+
diff --git a/winsup/cygwin/glob.c b/winsup/cygwin/glob.c
new file mode 100644
index 000000000..eaede4942
--- /dev/null
+++ b/winsup/cygwin/glob.c
@@ -0,0 +1,871 @@
+/* $NetBSD: __glob13.c,v 1.1.2.1 1997/10/22 06:41:27 thorpej Exp $ */
+
+/*
+ * Copyright (c) 1989, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Guido van Rossum.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+
+/*
+ * glob(3) -- a superset of the one defined in POSIX 1003.2.
+ *
+ * The [!...] convention to negate a range is supported (SysV, Posix, ksh).
+ *
+ * Optional extra services, controlled by flags not defined by POSIX:
+ *
+ * GLOB_QUOTE:
+ * Escaping convention: \ inhibits any special meaning the following
+ * character might have (except \ at end of string is retained).
+ * GLOB_MAGCHAR:
+ * Set in gl_flags if pattern contained a globbing character.
+ * GLOB_NOMAGIC:
+ * Same as GLOB_NOCHECK, but it will only append pattern if it did
+ * not contain any magic characters. [Used in csh style globbing]
+ * GLOB_ALTDIRFUNC:
+ * Use alternately specified directory access functions.
+ * GLOB_TILDE:
+ * expand ~user/foo to the /home/dir/of/user/foo
+ * GLOB_BRACE:
+ * expand {1,2}{a,b} to 1a 1b 2a 2b
+ * gl_matchc:
+ * Number of matches in the current invocation of glob.
+ */
+
+/* CYGNUS LOCAL: don't include */
+/* #include "namespace.h" */
+/* end CYGNUS LOCAL */
+
+#include <sys/param.h>
+#include <sys/stat.h>
+
+#include <ctype.h>
+#include <dirent.h>
+#include <errno.h>
+#include <glob.h>
+
+#include <pwd.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#ifdef __weak_alias
+#ifdef __LIBC12_SOURCE__
+__weak_alias(glob,_glob);
+__weak_alias(globfree,_globfree);
+#else
+#error "XXX THESE ARE NOT RIGHT!"
+__weak_alias(__glob13,___glob13);
+__weak_alias(__globfree13,___globfree13);
+#endif /* __LIBC12_SOURCE__ */
+#endif /* __weak_alias */
+
+#ifdef __LIBC12_SOURCE__
+#define STAT stat12
+#else
+#define STAT stat
+#endif
+
+#define DOLLAR '$'
+#define DOT '.'
+#define EOS '\0'
+#define LBRACKET '['
+#define NOT '!'
+#define QUESTION '?'
+#define QUOTE '\\'
+#define RANGE '-'
+#define RBRACKET ']'
+#define SEP '/'
+#define STAR '*'
+#define TILDE '~'
+#define UNDERSCORE '_'
+#define LBRACE '{'
+#define RBRACE '}'
+#define SLASH '/'
+#define COMMA ','
+
+#ifndef DEBUG
+
+#define M_QUOTE 0x8000
+#define M_PROTECT 0x4000
+#define M_MASK 0xffff
+#define M_ASCII 0x00ff
+
+typedef u_short Char;
+
+#else
+
+#define M_QUOTE 0x80
+#define M_PROTECT 0x40
+#define M_MASK 0xff
+#define M_ASCII 0x7f
+
+typedef char Char;
+
+#endif
+
+
+#define CHAR(c) ((Char)((c)&M_ASCII))
+#define META(c) ((Char)((c)|M_QUOTE))
+#define M_ALL META('*')
+#define M_END META(']')
+#define M_NOT META('!')
+#define M_ONE META('?')
+#define M_RNG META('-')
+#define M_SET META('[')
+#define ismeta(c) (((c)&M_QUOTE) != 0)
+
+
+static int compare __P((const void *, const void *));
+static void g_Ctoc __P((const Char *, char *));
+static int g_lstat __P((Char *, struct STAT *, glob_t *));
+static DIR *g_opendir __P((Char *, glob_t *));
+static Char *g_strchr __P((Char *, int));
+#ifdef notdef
+static Char *g_strcat __P((Char *, const Char *));
+#endif
+static int g_stat __P((Char *, struct STAT *, glob_t *));
+static int glob0 __P((const Char *, glob_t *));
+static int glob1 __P((Char *, glob_t *));
+static int glob2 __P((Char *, Char *, Char *, glob_t *));
+static int glob3 __P((Char *, Char *, Char *, Char *, glob_t *));
+static int globextend __P((const Char *, glob_t *));
+static const Char * globtilde __P((const Char *, Char *, glob_t *));
+static int globexp1 __P((const Char *, glob_t *));
+static int globexp2 __P((const Char *, const Char *, glob_t *, int *));
+static int match __P((Char *, Char *, Char *));
+#ifdef DEBUG
+static void qprintf __P((const char *, Char *));
+#endif
+
+#undef MAXPATHLEN
+#define MAXPATHLEN 16384
+
+int
+glob(pattern, flags, errfunc, pglob)
+ const char *pattern;
+ int flags, (*errfunc) __P((const char *, int));
+ glob_t *pglob;
+{
+ const u_char *patnext;
+ int c;
+ Char *bufnext, *bufend, patbuf[MAXPATHLEN+1];
+
+ patnext = (u_char *) pattern;
+ if (!(flags & GLOB_APPEND)) {
+ pglob->gl_pathc = 0;
+ pglob->gl_pathv = NULL;
+ if (!(flags & GLOB_DOOFFS))
+ pglob->gl_offs = 0;
+ }
+ pglob->gl_flags = flags & ~GLOB_MAGCHAR;
+ pglob->gl_errfunc = errfunc;
+ pglob->gl_matchc = 0;
+
+ bufnext = patbuf;
+ bufend = bufnext + MAXPATHLEN;
+ if (flags & GLOB_QUOTE) {
+ /* Protect the quoted characters. */
+ while (bufnext < bufend && (c = *patnext++) != EOS)
+ if (c == QUOTE) {
+ if ((c = *patnext++) == EOS) {
+ c = QUOTE;
+ --patnext;
+ }
+ *bufnext++ = c | M_PROTECT;
+ }
+ else
+ *bufnext++ = c;
+ }
+ else
+ while (bufnext < bufend && (c = *patnext++) != EOS)
+ *bufnext++ = c;
+ *bufnext = EOS;
+
+ if (flags & GLOB_BRACE)
+ return globexp1(patbuf, pglob);
+ else
+ return glob0(patbuf, pglob);
+}
+
+/*
+ * Expand recursively a glob {} pattern. When there is no more expansion
+ * invoke the standard globbing routine to glob the rest of the magic
+ * characters
+ */
+static int globexp1(pattern, pglob)
+ const Char *pattern;
+ glob_t *pglob;
+{
+ const Char* ptr = pattern;
+ int rv;
+
+ /* Protect a single {}, for find(1), like csh */
+ if (pattern[0] == LBRACE && pattern[1] == RBRACE && pattern[2] == EOS)
+ return glob0(pattern, pglob);
+
+ while ((ptr = (const Char *) g_strchr((Char *) ptr, LBRACE)) != NULL)
+ if (!globexp2(ptr, pattern, pglob, &rv))
+ return rv;
+
+ return glob0(pattern, pglob);
+}
+
+
+/*
+ * Recursive brace globbing helper. Tries to expand a single brace.
+ * If it succeeds then it invokes globexp1 with the new pattern.
+ * If it fails then it tries to glob the rest of the pattern and returns.
+ */
+static int globexp2(ptr, pattern, pglob, rv)
+ const Char *ptr, *pattern;
+ glob_t *pglob;
+ int *rv;
+{
+ int i;
+ Char *lm, *ls;
+ const Char *pe, *pm, *pl;
+ Char patbuf[MAXPATHLEN + 1];
+
+ /* copy part up to the brace */
+ for (lm = patbuf, pm = pattern; pm != ptr; *lm++ = *pm++)
+ continue;
+ ls = lm;
+
+ /* Find the balanced brace */
+ for (i = 0, pe = ++ptr; *pe; pe++)
+ if (*pe == LBRACKET) {
+ /* Ignore everything between [] */
+ for (pm = pe++; *pe != RBRACKET && *pe != EOS; pe++)
+ continue;
+ if (*pe == EOS) {
+ /*
+ * We could not find a matching RBRACKET.
+ * Ignore and just look for RBRACE
+ */
+ pe = pm;
+ }
+ }
+ else if (*pe == LBRACE)
+ i++;
+ else if (*pe == RBRACE) {
+ if (i == 0)
+ break;
+ i--;
+ }
+
+ /* Non matching braces; just glob the pattern */
+ if (i != 0 || *pe == EOS) {
+ *rv = glob0(patbuf, pglob);
+ return 0;
+ }
+
+ for (i = 0, pl = pm = ptr; pm <= pe; pm++)
+ switch (*pm) {
+ case LBRACKET:
+ /* Ignore everything between [] */
+ for (pl = pm++; *pm != RBRACKET && *pm != EOS; pm++)
+ continue;
+ if (*pm == EOS) {
+ /*
+ * We could not find a matching RBRACKET.
+ * Ignore and just look for RBRACE
+ */
+ pm = pl;
+ }
+ break;
+
+ case LBRACE:
+ i++;
+ break;
+
+ case RBRACE:
+ if (i) {
+ i--;
+ break;
+ }
+ /* FALLTHROUGH */
+ case COMMA:
+ if (i && *pm == COMMA)
+ break;
+ else {
+ /* Append the current string */
+ for (lm = ls; (pl < pm); *lm++ = *pl++)
+ continue;
+ /*
+ * Append the rest of the pattern after the
+ * closing brace
+ */
+ for (pl = pe + 1; (*lm++ = *pl++) != EOS;)
+ continue;
+
+ /* Expand the current pattern */
+#ifdef DEBUG
+ qprintf("globexp2:", patbuf);
+#endif
+ *rv = globexp1(patbuf, pglob);
+
+ /* move after the comma, to the next string */
+ pl = pm + 1;
+ }
+ break;
+
+ default:
+ break;
+ }
+ *rv = 0;
+ return 0;
+}
+
+
+
+/*
+ * expand tilde from the passwd file.
+ */
+static const Char *
+globtilde(pattern, patbuf, pglob)
+ const Char *pattern;
+ Char *patbuf;
+ glob_t *pglob;
+{
+ struct passwd *pwd;
+ char *h;
+ const Char *p;
+ Char *b;
+
+ if (*pattern != TILDE || !(pglob->gl_flags & GLOB_TILDE))
+ return pattern;
+
+ /* Copy up to the end of the string or / */
+ for (p = pattern + 1, h = (char *) patbuf; *p && *p != SLASH;
+ *h++ = *p++)
+ continue;
+
+ *h = EOS;
+
+ if (((char *) patbuf)[0] == EOS) {
+ /*
+ * handle a plain ~ or ~/ by expanding $HOME
+ * first and then trying the password file
+ */
+ if ((h = getenv("HOME")) == NULL) {
+ if ((pwd = getpwuid(getuid())) == NULL)
+ return pattern;
+ else
+ h = pwd->pw_dir;
+ }
+ }
+ else {
+ /*
+ * Expand a ~user
+ */
+ if ((pwd = getpwnam((char*) patbuf)) == NULL)
+ return pattern;
+ else
+ h = pwd->pw_dir;
+ }
+
+ /* Copy the home directory */
+ for (b = patbuf; *h; *b++ = *h++)
+ continue;
+
+ /* Append the rest of the pattern */
+ while ((*b++ = *p++) != EOS)
+ continue;
+
+ return patbuf;
+}
+
+
+/*
+ * The main glob() routine: compiles the pattern (optionally processing
+ * quotes), calls glob1() to do the real pattern matching, and finally
+ * sorts the list (unless unsorted operation is requested). Returns 0
+ * if things went well, nonzero if errors occurred. It is not an error
+ * to find no matches.
+ */
+static int
+glob0(pattern, pglob)
+ const Char *pattern;
+ glob_t *pglob;
+{
+ const Char *qpatnext;
+ int c, err, oldpathc;
+ Char *bufnext, patbuf[MAXPATHLEN+1];
+
+ qpatnext = globtilde(pattern, patbuf, pglob);
+ oldpathc = pglob->gl_pathc;
+ bufnext = patbuf;
+
+ /* We don't need to check for buffer overflow any more. */
+ while ((c = *qpatnext++) != EOS) {
+ switch (c) {
+ case LBRACKET:
+ c = *qpatnext;
+ if (c == NOT)
+ ++qpatnext;
+ if (*qpatnext == EOS ||
+ g_strchr((Char *) qpatnext+1, RBRACKET) == NULL) {
+ *bufnext++ = LBRACKET;
+ if (c == NOT)
+ --qpatnext;
+ break;
+ }
+ *bufnext++ = M_SET;
+ if (c == NOT)
+ *bufnext++ = M_NOT;
+ c = *qpatnext++;
+ do {
+ *bufnext++ = CHAR(c);
+ if (*qpatnext == RANGE &&
+ (c = qpatnext[1]) != RBRACKET) {
+ *bufnext++ = M_RNG;
+ *bufnext++ = CHAR(c);
+ qpatnext += 2;
+ }
+ } while ((c = *qpatnext++) != RBRACKET);
+ pglob->gl_flags |= GLOB_MAGCHAR;
+ *bufnext++ = M_END;
+ break;
+ case QUESTION:
+ pglob->gl_flags |= GLOB_MAGCHAR;
+ *bufnext++ = M_ONE;
+ break;
+ case STAR:
+ pglob->gl_flags |= GLOB_MAGCHAR;
+ /* collapse adjacent stars to one,
+ * to avoid exponential behavior
+ */
+ if (bufnext == patbuf || bufnext[-1] != M_ALL)
+ *bufnext++ = M_ALL;
+ break;
+ default:
+ *bufnext++ = CHAR(c);
+ break;
+ }
+ }
+ *bufnext = EOS;
+#ifdef DEBUG
+ qprintf("glob0:", patbuf);
+#endif
+
+ if ((err = glob1(patbuf, pglob)) != 0)
+ return(err);
+
+ /*
+ * If there was no match we are going to append the pattern
+ * if GLOB_NOCHECK was specified or if GLOB_NOMAGIC was specified
+ * and the pattern did not contain any magic characters
+ * GLOB_NOMAGIC is there just for compatibility with csh.
+ */
+ if (pglob->gl_pathc == oldpathc &&
+ ((pglob->gl_flags & GLOB_NOCHECK) ||
+ ((pglob->gl_flags & GLOB_NOMAGIC) &&
+ !(pglob->gl_flags & GLOB_MAGCHAR))))
+ return(globextend(pattern, pglob));
+ else if (!(pglob->gl_flags & GLOB_NOSORT))
+ qsort(pglob->gl_pathv + pglob->gl_offs + oldpathc,
+ pglob->gl_pathc - oldpathc, sizeof(char *), compare);
+ return(0);
+}
+
+static int
+compare(p, q)
+ const void *p, *q;
+{
+ return(strcmp(*(char **)p, *(char **)q));
+}
+
+static int
+glob1(pattern, pglob)
+ Char *pattern;
+ glob_t *pglob;
+{
+ Char pathbuf[MAXPATHLEN+1];
+
+ /* A null pathname is invalid -- POSIX 1003.1 sect. 2.4. */
+ if (*pattern == EOS)
+ return(0);
+ return(glob2(pathbuf, pathbuf, pattern, pglob));
+}
+
+/*
+ * The functions glob2 and glob3 are mutually recursive; there is one level
+ * of recursion for each segment in the pattern that contains one or more
+ * meta characters.
+ */
+static int
+glob2(pathbuf, pathend, pattern, pglob)
+ Char *pathbuf, *pathend, *pattern;
+ glob_t *pglob;
+{
+ struct STAT sb;
+ Char *p, *q;
+ int anymeta;
+
+ /*
+ * Loop over pattern segments until end of pattern or until
+ * segment with meta character found.
+ */
+ for (anymeta = 0;;) {
+ if (*pattern == EOS) { /* End of pattern? */
+ *pathend = EOS;
+ if (g_lstat(pathbuf, &sb, pglob))
+ return(0);
+
+ if (((pglob->gl_flags & GLOB_MARK) &&
+ pathend[-1] != SEP) && (S_ISDIR(sb.st_mode)
+ || (S_ISLNK(sb.st_mode) &&
+ (g_stat(pathbuf, &sb, pglob) == 0) &&
+ S_ISDIR(sb.st_mode)))) {
+ *pathend++ = SEP;
+ *pathend = EOS;
+ }
+ ++pglob->gl_matchc;
+ return(globextend(pathbuf, pglob));
+ }
+
+ /* Find end of next segment, copy tentatively to pathend. */
+ q = pathend;
+ p = pattern;
+ while (*p != EOS && *p != SEP) {
+ if (ismeta(*p))
+ anymeta = 1;
+ *q++ = *p++;
+ }
+
+ if (!anymeta) { /* No expansion, do next segment. */
+ pathend = q;
+ pattern = p;
+ while (*pattern == SEP)
+ *pathend++ = *pattern++;
+ } else /* Need expansion, recurse. */
+ return(glob3(pathbuf, pathend, pattern, p, pglob));
+ }
+ /* NOTREACHED */
+}
+
+static int
+glob3(pathbuf, pathend, pattern, restpattern, pglob)
+ Char *pathbuf, *pathend, *pattern, *restpattern;
+ glob_t *pglob;
+{
+ register struct dirent *dp;
+ DIR *dirp;
+ int err;
+ char buf[MAXPATHLEN];
+
+ /*
+ * The readdirfunc declaration can't be prototyped, because it is
+ * assigned, below, to two functions which are prototyped in glob.h
+ * and dirent.h as taking pointers to differently typed opaque
+ * structures.
+ */
+ struct dirent *(*readdirfunc) __P((void *));
+
+ *pathend = EOS;
+ errno = 0;
+
+ if ((dirp = g_opendir(pathbuf, pglob)) == NULL) {
+ /* TODO: don't call for ENOENT or ENOTDIR? */
+ if (pglob->gl_errfunc) {
+ g_Ctoc(pathbuf, buf);
+ if (pglob->gl_errfunc(buf, errno) ||
+ pglob->gl_flags & GLOB_ERR)
+ return (GLOB_ABEND);
+ }
+ return(0);
+ }
+
+ err = 0;
+
+ /* Search directory for matching names. */
+ if (pglob->gl_flags & GLOB_ALTDIRFUNC)
+ readdirfunc = pglob->gl_readdir;
+ else
+ readdirfunc = (struct dirent *(*)__P((void *))) readdir;
+ while ((dp = (*readdirfunc)(dirp))) {
+ register u_char *sc;
+ register Char *dc;
+
+ /* Initial DOT must be matched literally. */
+ if (dp->d_name[0] == DOT && *pattern != DOT)
+ continue;
+ for (sc = (u_char *) dp->d_name, dc = pathend;
+ (*dc++ = *sc++) != EOS;)
+ continue;
+ if (!match(pathend, pattern, restpattern)) {
+ *pathend = EOS;
+ continue;
+ }
+ err = glob2(pathbuf, --dc, restpattern, pglob);
+ if (err)
+ break;
+ }
+
+ if (pglob->gl_flags & GLOB_ALTDIRFUNC)
+ (*pglob->gl_closedir)(dirp);
+ else
+ closedir(dirp);
+ return(err);
+}
+
+
+/*
+ * Extend the gl_pathv member of a glob_t structure to accomodate a new item,
+ * add the new item, and update gl_pathc.
+ *
+ * This assumes the BSD realloc, which only copies the block when its size
+ * crosses a power-of-two boundary; for v7 realloc, this would cause quadratic
+ * behavior.
+ *
+ * Return 0 if new item added, error code if memory couldn't be allocated.
+ *
+ * Invariant of the glob_t structure:
+ * Either gl_pathc is zero and gl_pathv is NULL; or gl_pathc > 0 and
+ * gl_pathv points to (gl_offs + gl_pathc + 1) items.
+ */
+static int
+globextend(path, pglob)
+ const Char *path;
+ glob_t *pglob;
+{
+ register char **pathv;
+ register int i;
+ u_int newsize;
+ char *copy;
+ const Char *p;
+
+ newsize = sizeof(*pathv) * (2 + pglob->gl_pathc + pglob->gl_offs);
+ pathv = pglob->gl_pathv ?
+ realloc((char *)pglob->gl_pathv, newsize) :
+ malloc(newsize);
+ if (pathv == NULL)
+ return(GLOB_NOSPACE);
+
+ if (pglob->gl_pathv == NULL && pglob->gl_offs > 0) {
+ /* first time around -- clear initial gl_offs items */
+ pathv += pglob->gl_offs;
+ for (i = pglob->gl_offs; --i >= 0; )
+ *--pathv = NULL;
+ }
+ pglob->gl_pathv = pathv;
+
+ for (p = path; *p++;)
+ continue;
+ if ((copy = malloc(p - path)) != NULL) {
+ g_Ctoc(path, copy);
+ pathv[pglob->gl_offs + pglob->gl_pathc++] = copy;
+ }
+ pathv[pglob->gl_offs + pglob->gl_pathc] = NULL;
+ return(copy == NULL ? GLOB_NOSPACE : 0);
+}
+
+
+/*
+ * pattern matching function for filenames. Each occurrence of the *
+ * pattern causes a recursion level.
+ */
+static int
+match(name, pat, patend)
+ register Char *name, *pat, *patend;
+{
+ int ok, negate_range;
+ Char c, k;
+
+ while (pat < patend) {
+ c = *pat++;
+ switch (c & M_MASK) {
+ case M_ALL:
+ if (pat == patend)
+ return(1);
+ do
+ if (match(name, pat, patend))
+ return(1);
+ while (*name++ != EOS);
+ return(0);
+ case M_ONE:
+ if (*name++ == EOS)
+ return(0);
+ break;
+ case M_SET:
+ ok = 0;
+ if ((k = *name++) == EOS)
+ return(0);
+ if ((negate_range = ((*pat & M_MASK) == M_NOT)) != EOS)
+ ++pat;
+ while (((c = *pat++) & M_MASK) != M_END)
+ if ((*pat & M_MASK) == M_RNG) {
+ if (c <= k && k <= pat[1])
+ ok = 1;
+ pat += 2;
+ } else if (c == k)
+ ok = 1;
+ if (ok == negate_range)
+ return(0);
+ break;
+ default:
+ if (*name++ != c)
+ return(0);
+ break;
+ }
+ }
+ return(*name == EOS);
+}
+
+/* Free allocated data belonging to a glob_t structure. */
+void
+globfree(pglob)
+ glob_t *pglob;
+{
+ register int i;
+ register char **pp;
+
+ if (pglob->gl_pathv != NULL) {
+ pp = pglob->gl_pathv + pglob->gl_offs;
+ for (i = pglob->gl_pathc; i--; ++pp)
+ if (*pp)
+ free(*pp);
+ free(pglob->gl_pathv);
+ }
+}
+
+static DIR *
+g_opendir(str, pglob)
+ register Char *str;
+ glob_t *pglob;
+{
+ char buf[MAXPATHLEN];
+
+ if (!*str)
+ strcpy(buf, ".");
+ else
+ g_Ctoc(str, buf);
+
+ if (pglob->gl_flags & GLOB_ALTDIRFUNC)
+ return((*pglob->gl_opendir)(buf));
+
+ return(opendir(buf));
+}
+
+static int
+g_lstat(fn, sb, pglob)
+ register Char *fn;
+ struct STAT *sb;
+ glob_t *pglob;
+{
+ char buf[MAXPATHLEN];
+
+ g_Ctoc(fn, buf);
+ if (pglob->gl_flags & GLOB_ALTDIRFUNC)
+ return((*pglob->gl_lstat)(buf, sb));
+ return(lstat(buf, sb));
+}
+
+static int
+g_stat(fn, sb, pglob)
+ register Char *fn;
+ struct STAT *sb;
+ glob_t *pglob;
+{
+ char buf[MAXPATHLEN];
+
+ g_Ctoc(fn, buf);
+ if (pglob->gl_flags & GLOB_ALTDIRFUNC)
+ return((*pglob->gl_stat)(buf, sb));
+ return(stat(buf, sb));
+}
+
+static Char *
+g_strchr(str, ch)
+ Char *str;
+ int ch;
+{
+ do {
+ if (*str == ch)
+ return (str);
+ } while (*str++);
+ return (NULL);
+}
+
+#ifdef notdef
+static Char *
+g_strcat(dst, src)
+ Char *dst;
+ const Char* src;
+{
+ Char *sdst = dst;
+
+ while (*dst++)
+ continue;
+ --dst;
+ while((*dst++ = *src++) != EOS)
+ continue;
+
+ return (sdst);
+}
+#endif
+
+static void
+g_Ctoc(str, buf)
+ register const Char *str;
+ char *buf;
+{
+ register char *dc;
+
+ for (dc = buf; (*dc++ = *str++) != EOS;)
+ continue;
+}
+
+#ifdef DEBUG
+static void
+qprintf(str, s)
+ const char *str;
+ register Char *s;
+{
+ register Char *p;
+
+ (void)printf("%s:\n", str);
+ for (p = s; *p; p++)
+ (void)printf("%c", CHAR(*p));
+ (void)printf("\n");
+ for (p = s; *p; p++)
+ (void)printf("%c", *p & M_PROTECT ? '"' : ' ');
+ (void)printf("\n");
+ for (p = s; *p; p++)
+ (void)printf("%c", ismeta(*p) ? '_' : ' ');
+ (void)printf("\n");
+}
+#endif
diff --git a/winsup/cygwin/gmon.c b/winsup/cygwin/gmon.c
new file mode 100644
index 000000000..6187a7c8f
--- /dev/null
+++ b/winsup/cygwin/gmon.c
@@ -0,0 +1,277 @@
+/*-
+ * Copyright (c) 1983, 1992, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#if !defined(lint) && defined(LIBC_SCCS)
+static char rcsid[] = "$OpenBSD: gmon.c,v 1.8 1997/07/23 21:11:27 kstailey Exp $";
+#endif
+
+#include <fcntl.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <sys/param.h>
+#include <sys/types.h>
+#include <gmon.h>
+
+#include <profil.h>
+
+/* XXX needed? */
+//extern char *minbrk __asm ("minbrk");
+
+struct gmonparam _gmonparam = { GMON_PROF_OFF };
+
+static int s_scale;
+/* see profil(2) where this is describe (incorrectly) */
+#define SCALE_1_TO_1 0x10000L
+
+#define ERR(s) write(2, s, sizeof(s))
+
+void moncontrol __P((int));
+
+static void *
+fake_sbrk(int size)
+{
+ return malloc(size);
+}
+
+void
+monstartup(lowpc, highpc)
+ u_long lowpc;
+ u_long highpc;
+{
+ register int o;
+ char *cp;
+ struct gmonparam *p = &_gmonparam;
+
+ /*
+ * round lowpc and highpc to multiples of the density we're using
+ * so the rest of the scaling (here and in gprof) stays in ints.
+ */
+ p->lowpc = ROUNDDOWN(lowpc, HISTFRACTION * sizeof(HISTCOUNTER));
+ p->highpc = ROUNDUP(highpc, HISTFRACTION * sizeof(HISTCOUNTER));
+ p->textsize = p->highpc - p->lowpc;
+ p->kcountsize = p->textsize / HISTFRACTION;
+ p->hashfraction = HASHFRACTION;
+ p->fromssize = p->textsize / p->hashfraction;
+ p->tolimit = p->textsize * ARCDENSITY / 100;
+ if (p->tolimit < MINARCS)
+ p->tolimit = MINARCS;
+ else if (p->tolimit > MAXARCS)
+ p->tolimit = MAXARCS;
+ p->tossize = p->tolimit * sizeof(struct tostruct);
+
+ cp = fake_sbrk(p->kcountsize + p->fromssize + p->tossize);
+ if (cp == (char *)-1) {
+ ERR("monstartup: out of memory\n");
+ return;
+ }
+#ifdef notdef
+ bzero(cp, p->kcountsize + p->fromssize + p->tossize);
+#endif
+ p->tos = (struct tostruct *)cp;
+ cp += p->tossize;
+ p->kcount = (u_short *)cp;
+ cp += p->kcountsize;
+ p->froms = (u_short *)cp;
+
+ /* XXX minbrk needed? */
+ //minbrk = fake_sbrk(0);
+ p->tos[0].link = 0;
+
+ o = p->highpc - p->lowpc;
+ if (p->kcountsize < o) {
+#ifndef notdef
+ s_scale = ((float)p->kcountsize / o ) * SCALE_1_TO_1;
+#else /* avoid floating point */
+ int quot = o / p->kcountsize;
+
+ if (quot >= 0x10000)
+ s_scale = 1;
+ else if (quot >= 0x100)
+ s_scale = 0x10000 / quot;
+ else if (o >= 0x800000)
+ s_scale = 0x1000000 / (o / (p->kcountsize >> 8));
+ else
+ s_scale = 0x1000000 / ((o << 8) / p->kcountsize);
+#endif
+ } else
+ s_scale = SCALE_1_TO_1;
+
+ moncontrol(1);
+}
+
+void
+_mcleanup()
+{
+ int fd;
+ int hz;
+ int fromindex;
+ int endfrom;
+ u_long frompc;
+ int toindex;
+ struct rawarc rawarc;
+ struct gmonparam *p = &_gmonparam;
+ struct gmonhdr gmonhdr, *hdr;
+ char *proffile;
+#ifdef DEBUG
+ int log, len;
+ char dbuf[200];
+#endif
+
+ if (p->state == GMON_PROF_ERROR)
+ ERR("_mcleanup: tos overflow\n");
+
+ hz = PROF_HZ;
+ moncontrol(0);
+
+#ifdef nope
+ if ((profdir = getenv("PROFDIR")) != NULL) {
+ extern char *__progname;
+ char *s, *t, *limit;
+ pid_t pid;
+ long divisor;
+
+ /* If PROFDIR contains a null value, no profiling
+ output is produced */
+ if (*profdir == '\0') {
+ return;
+ }
+
+ limit = buf + sizeof buf - 1 - 10 - 1 -
+ strlen(__progname) - 1;
+ t = buf;
+ s = profdir;
+ while((*t = *s) != '\0' && t < limit) {
+ t++;
+ s++;
+ }
+ *t++ = '/';
+
+ /*
+ * Copy and convert pid from a pid_t to a string. For
+ * best performance, divisor should be initialized to
+ * the largest power of 10 less than PID_MAX.
+ */
+ pid = getpid();
+ divisor=10000;
+ while (divisor > pid) divisor /= 10; /* skip leading zeros */
+ do {
+ *t++ = (pid/divisor) + '0';
+ pid %= divisor;
+ } while (divisor /= 10);
+ *t++ = '.';
+
+ s = __progname;
+ while ((*t++ = *s++) != '\0')
+ ;
+
+ proffile = buf;
+ } else {
+ proffile = "gmon.out";
+ }
+#else
+ proffile = "gmon.out";
+#endif
+
+ fd = open(proffile , O_CREAT|O_TRUNC|O_WRONLY|O_BINARY, 0666);
+ if (fd < 0) {
+ perror( proffile );
+ return;
+ }
+#ifdef DEBUG
+ log = open("gmon.log", O_CREAT|O_TRUNC|O_WRONLY, 0664);
+ if (log < 0) {
+ perror("mcount: gmon.log");
+ return;
+ }
+ len = sprintf(dbuf, "[mcleanup1] kcount 0x%x ssiz %d\n",
+ p->kcount, p->kcountsize);
+ write(log, dbuf, len);
+#endif
+ hdr = (struct gmonhdr *)&gmonhdr;
+ hdr->lpc = p->lowpc;
+ hdr->hpc = p->highpc;
+ hdr->ncnt = p->kcountsize + sizeof(gmonhdr);
+ hdr->version = GMONVERSION;
+ hdr->profrate = hz;
+ write(fd, (char *)hdr, sizeof *hdr);
+ write(fd, p->kcount, p->kcountsize);
+ endfrom = p->fromssize / sizeof(*p->froms);
+ for (fromindex = 0; fromindex < endfrom; fromindex++) {
+ if (p->froms[fromindex] == 0)
+ continue;
+
+ frompc = p->lowpc;
+ frompc += fromindex * p->hashfraction * sizeof(*p->froms);
+ for (toindex = p->froms[fromindex]; toindex != 0;
+ toindex = p->tos[toindex].link) {
+#ifdef DEBUG
+ len = sprintf(dbuf,
+ "[mcleanup2] frompc 0x%x selfpc 0x%x count %d\n" ,
+ frompc, p->tos[toindex].selfpc,
+ p->tos[toindex].count);
+ write(log, dbuf, len);
+#endif
+ rawarc.raw_frompc = frompc;
+ rawarc.raw_selfpc = p->tos[toindex].selfpc;
+ rawarc.raw_count = p->tos[toindex].count;
+ write(fd, &rawarc, sizeof rawarc);
+ }
+ }
+ close(fd);
+}
+
+/*
+ * Control profiling
+ * profiling is what mcount checks to see if
+ * all the data structures are ready.
+ */
+void
+moncontrol(mode)
+ int mode;
+{
+ struct gmonparam *p = &_gmonparam;
+
+ if (mode) {
+ /* start */
+ profil((char *)p->kcount, p->kcountsize, p->lowpc,
+ s_scale);
+ p->state = GMON_PROF_ON;
+ } else {
+ /* stop */
+ profil((char *)0, 0, 0, 0);
+ p->state = GMON_PROF_OFF;
+ }
+}
+
+
diff --git a/winsup/cygwin/gmon.h b/winsup/cygwin/gmon.h
new file mode 100644
index 000000000..be016791e
--- /dev/null
+++ b/winsup/cygwin/gmon.h
@@ -0,0 +1,166 @@
+/* $OpenBSD: gmon.h,v 1.3 1996/04/21 22:31:46 deraadt Exp $ */
+/* $NetBSD: gmon.h,v 1.5 1996/04/09 20:55:30 cgd Exp $ */
+
+/*-
+ * Copyright (c) 1982, 1986, 1992, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * @(#)gmon.h 8.2 (Berkeley) 1/4/94
+ */
+
+#ifndef _SYS_GMON_H_
+#define _SYS_GMON_H_
+
+#ifndef __P
+#define __P(x) x
+#endif
+
+#include <profile.h>
+
+/*
+ * Structure prepended to gmon.out profiling data file.
+ */
+struct gmonhdr {
+ u_long lpc; /* base pc address of sample buffer */
+ u_long hpc; /* max pc address of sampled buffer */
+ int ncnt; /* size of sample buffer (plus this header) */
+ int version; /* version number */
+ int profrate; /* profiling clock rate */
+ int spare[3]; /* reserved */
+};
+#define GMONVERSION 0x00051879
+
+/*
+ * histogram counters are unsigned shorts (according to the kernel).
+ */
+#define HISTCOUNTER unsigned short
+
+/*
+ * fraction of text space to allocate for histogram counters here, 1/2
+ */
+#define HISTFRACTION 2
+
+/*
+ * Fraction of text space to allocate for from hash buckets.
+ * The value of HASHFRACTION is based on the minimum number of bytes
+ * of separation between two subroutine call points in the object code.
+ * Given MIN_SUBR_SEPARATION bytes of separation the value of
+ * HASHFRACTION is calculated as:
+ *
+ * HASHFRACTION = MIN_SUBR_SEPARATION / (2 * sizeof(short) - 1);
+ *
+ * For example, on the VAX, the shortest two call sequence is:
+ *
+ * calls $0,(r0)
+ * calls $0,(r0)
+ *
+ * which is separated by only three bytes, thus HASHFRACTION is
+ * calculated as:
+ *
+ * HASHFRACTION = 3 / (2 * 2 - 1) = 1
+ *
+ * Note that the division above rounds down, thus if MIN_SUBR_FRACTION
+ * is less than three, this algorithm will not work!
+ *
+ * In practice, however, call instructions are rarely at a minimal
+ * distance. Hence, we will define HASHFRACTION to be 2 across all
+ * architectures. This saves a reasonable amount of space for
+ * profiling data structures without (in practice) sacrificing
+ * any granularity.
+ */
+#define HASHFRACTION 2
+
+/*
+ * percent of text space to allocate for tostructs with a minimum.
+ */
+#define ARCDENSITY 2
+#define MINARCS 50
+#define MAXARCS ((1 << (8 * sizeof(HISTCOUNTER))) - 2)
+
+struct tostruct {
+ u_long selfpc;
+ long count;
+ u_short link;
+ u_short pad;
+};
+
+/*
+ * a raw arc, with pointers to the calling site and
+ * the called site and a count.
+ */
+struct rawarc {
+ u_long raw_frompc;
+ u_long raw_selfpc;
+ long raw_count;
+};
+
+/*
+ * general rounding functions.
+ */
+#define ROUNDDOWN(x,y) (((x)/(y))*(y))
+#define ROUNDUP(x,y) ((((x)+(y)-1)/(y))*(y))
+
+/*
+ * The profiling data structures are housed in this structure.
+ */
+struct gmonparam {
+ int state;
+ u_short *kcount;
+ u_long kcountsize;
+ u_short *froms;
+ u_long fromssize;
+ struct tostruct *tos;
+ u_long tossize;
+ long tolimit;
+ u_long lowpc;
+ u_long highpc;
+ u_long textsize;
+ u_long hashfraction;
+};
+extern struct gmonparam _gmonparam;
+
+/*
+ * Possible states of profiling.
+ */
+#define GMON_PROF_ON 0
+#define GMON_PROF_BUSY 1
+#define GMON_PROF_ERROR 2
+#define GMON_PROF_OFF 3
+
+/*
+ * Sysctl definitions for extracting profiling information from the kernel.
+ */
+#define GPROF_STATE 0 /* int: profiling enabling variable */
+#define GPROF_COUNT 1 /* struct: profile tick count buffer */
+#define GPROF_FROMS 2 /* struct: from location hash bucket */
+#define GPROF_TOS 3 /* struct: destination/count structure */
+#define GPROF_GMONPARAM 4 /* struct: profiling parameters (see above) */
+#endif /* !_SYS_GMONH_ */
diff --git a/winsup/cygwin/grp.cc b/winsup/cygwin/grp.cc
new file mode 100644
index 000000000..5263c536b
--- /dev/null
+++ b/winsup/cygwin/grp.cc
@@ -0,0 +1,283 @@
+/* grp.cc
+
+ Copyright 1996, 1997, 1998, 2000 Cygnus Solutions.
+
+ Original stubs by Jason Molenda of Cygnus Support, crash@cygnus.com
+ First implementation by Gunther Ebert, gunther.ebert@ixos-leipzig.de
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#include <grp.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include "winsup.h"
+
+/* Read /etc/group only once for better performance. This is done
+ on the first call that needs information from it. */
+
+#define MAX_DOMAIN_NAME 100
+
+static NO_COPY const char *etc_group = "/etc/group";
+static struct group *group_buf = NULL; /* group contents in memory */
+static int curr_lines = 0;
+static int max_lines = 0;
+
+/* Position in the group cache */
+#ifdef _MT_SAFE
+#define grp_pos _reent_winsup()->_grp_pos
+#else
+static int grp_pos = 0;
+#endif
+
+/* Set to 1 when /etc/group has been read in by read_etc_group (). */
+/* Functions in this file need to check the value of group_in_memory_p
+ and read in the group file if it isn't set. */
+/* FIXME: This should be static but this is called in uinfo_init outside
+ this file */
+int group_in_memory_p = 0;
+
+static int
+parse_grp (struct group &grp, const char *line)
+{
+ int len = strlen(line);
+ char *newline = (char *) malloc (len + 1);
+ (void) memcpy (newline, line, len + 1);
+
+ if (newline[--len] == '\n')
+ newline[len] = '\0';
+
+ char *dp = strchr (newline, ':');
+
+ if (!dp)
+ return 0;
+
+ *dp++ = '\0';
+ grp.gr_name = newline;
+
+ grp.gr_passwd = dp;
+ dp = strchr (grp.gr_passwd, ':');
+ if (dp)
+ {
+ *dp++ = '\0';
+ if (!strlen (grp.gr_passwd))
+ grp.gr_passwd = NULL;
+
+ grp.gr_gid = atoi (dp);
+ dp = strchr (dp, ':');
+ if (dp)
+ {
+ if (*++dp)
+ {
+ int i = 0;
+ char *cp;
+
+ for (cp = dp; (cp = strchr (cp, ',')) != NULL; ++cp)
+ ++i;
+ char **namearray = (char **) calloc (i + 2, sizeof (char *));
+ if (namearray)
+ {
+ i = 0;
+ for (cp = dp; (cp = strchr (dp, ',')) != NULL; dp = cp + 1)
+ {
+ *cp = '\0';
+ namearray[i++] = dp;
+ }
+ namearray[i++] = dp;
+ namearray[i] = NULL;
+ }
+ grp.gr_mem = namearray;
+ }
+ else
+ grp.gr_mem = NULL;
+ return 1;
+ }
+ }
+ return 0;
+}
+
+/* Read one line from /etc/group into the group cache */
+static void
+add_grp_line (const char *line)
+{
+ if (curr_lines == max_lines)
+ {
+ max_lines += 10;
+ group_buf = (struct group *) realloc (group_buf, max_lines * sizeof (struct group));
+ }
+ if (parse_grp (group_buf[curr_lines], line))
+ curr_lines++;
+}
+
+extern PSID get_admin_sid ();
+
+/* Cygwin internal */
+/* Read in /etc/group and save contents in the group cache */
+/* This sets group_in_memory_p to 1 so functions in this file can
+ tell that /etc/group has been read in */
+/* FIXME: should be static but this is called in uinfo_init outside this
+ file */
+void
+read_etc_group ()
+{
+ extern int group_sem;
+ char linebuf [ 200 ];
+ char group_name [ MAX_USER_NAME ];
+ DWORD group_name_len = MAX_USER_NAME;
+
+ strncpy (group_name, "Administrators", sizeof (group_name));
+
+ ++group_sem;
+ FILE *f = fopen (etc_group, "r");
+ --group_sem;
+
+ if (f)
+ {
+ while (fgets (linebuf, sizeof (linebuf), f) != NULL)
+ {
+ if (strlen (linebuf))
+ add_grp_line (linebuf);
+ }
+
+ fclose (f);
+ }
+ else /* /etc/group doesn't exist -- create default one in memory */
+ {
+ char domain_name [ MAX_DOMAIN_NAME ];
+ DWORD domain_name_len = MAX_DOMAIN_NAME;
+ SID_NAME_USE acType;
+ debug_printf ("Emulating /etc/group");
+ if (! LookupAccountSidA (NULL ,
+ get_admin_sid () ,
+ group_name,
+ &group_name_len,
+ domain_name,
+ &domain_name_len,
+ &acType))
+ {
+ strcpy (group_name, "unknown");
+ debug_printf ("Failed to get local admins group name. %E");
+ }
+
+ snprintf (linebuf, sizeof (linebuf), "%s::%u:\n", group_name, DEFAULT_GID);
+ add_grp_line (linebuf);
+ }
+
+ group_in_memory_p = 1;
+}
+
+extern "C"
+struct group *
+getgrgid (gid_t gid)
+{
+ struct group * default_grp = NULL;
+ if (!group_in_memory_p)
+ read_etc_group();
+
+ for (int i = 0; i < curr_lines; i++)
+ {
+ if (group_buf[i].gr_gid == DEFAULT_GID)
+ default_grp = group_buf + i;
+ if (group_buf[i].gr_gid == gid)
+ return group_buf + i;
+ }
+
+ return default_grp;
+}
+
+extern "C"
+struct group *
+getgrnam (const char *name)
+{
+ if (!group_in_memory_p)
+ read_etc_group();
+
+ for (int i = 0; i < curr_lines; i++)
+ if (strcasematch (group_buf[i].gr_name, name))
+ return group_buf + i;
+
+ /* Didn't find requested group */
+ return NULL;
+}
+
+extern "C"
+void
+endgrent()
+{
+ grp_pos = 0;
+}
+
+extern "C"
+struct group *
+getgrent()
+{
+ if (!group_in_memory_p)
+ read_etc_group();
+
+ if (grp_pos < curr_lines)
+ return group_buf + grp_pos++;
+
+ return NULL;
+}
+
+extern "C"
+void
+setgrent ()
+{
+ grp_pos = 0;
+}
+
+int
+getgroups (int gidsetsize, gid_t *grouplist, gid_t gid, const char *username)
+{
+ if (!group_in_memory_p)
+ read_etc_group();
+
+ int cnt = 0;
+
+ for (int i = 0; i < curr_lines; ++i)
+ if (gid == group_buf[i].gr_gid)
+ {
+ if (cnt < gidsetsize)
+ grouplist[cnt] = group_buf[i].gr_gid;
+ ++cnt;
+ if (gidsetsize && cnt >= gidsetsize)
+ goto out;
+ }
+ else if (group_buf[i].gr_mem)
+ for (int gi = 0; group_buf[i].gr_mem[gi]; ++gi)
+ if (! strcasecmp (username, group_buf[i].gr_mem[gi]))
+ {
+ if (cnt < gidsetsize)
+ grouplist[cnt] = group_buf[i].gr_gid;
+ ++cnt;
+ if (gidsetsize && cnt >= gidsetsize)
+ goto out;
+ }
+out:
+ return cnt;
+}
+
+extern "C"
+int
+getgroups (int gidsetsize, gid_t *grouplist)
+{
+#if 0
+ if (gidsetsize <= 0)
+ return 0;
+ grouplist[0] = myself->gid;
+ return 1;
+#else
+ return getgroups (gidsetsize, grouplist, myself->gid, myself->username);
+#endif
+}
+
+extern "C"
+int
+initgroups (const char *user, gid_t grp)
+{
+ return 0;
+}
diff --git a/winsup/cygwin/heap.cc b/winsup/cygwin/heap.cc
new file mode 100644
index 000000000..7bbe882d8
--- /dev/null
+++ b/winsup/cygwin/heap.cc
@@ -0,0 +1,140 @@
+/* heap.cc: Cygwin heap manager.
+
+ Copyright 1996, 1997, 1998, 1999 Cygnus Solutions.
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#include <errno.h>
+#include "winsup.h"
+
+#define brksize ((char *) user_data->heaptop - (char *) user_data->heapbase)
+#define brk (user_data->heapptr)
+#define brkbase (user_data->heapbase)
+#define brktop (user_data->heaptop)
+#define brkchunk (cygwin_shared->heap_chunk_size ())
+#define assert(x)
+
+static unsigned page_const = 0;
+
+static int __inline
+getpagesize(void)
+{
+ SYSTEM_INFO si;
+ GetSystemInfo(&si);
+ return (int)si.dwPageSize;
+}
+
+/* Initialize the heap at process start up. */
+
+void
+heap_init ()
+{
+ /* If we're the forkee, we must allocate the heap at exactly the same place
+ as our parent. If not, we don't care where it ends up. */
+
+ page_const = getpagesize();
+ if (brkbase)
+ {
+ DWORD chunk = brkchunk; /* allocation chunk */
+ /* total size commited in parent */
+ DWORD allocsize = (char *) brktop - (char *) brkbase;
+ /* round up by chunk size */
+ DWORD reserve_size = chunk * ((allocsize + (chunk - 1)) / chunk);
+
+ /* Loop until we've managed to reserve an adequate amount of memory. */
+ char *p;
+ for (;;)
+ {
+ p = (char *) VirtualAlloc (brkbase, reserve_size,
+ MEM_RESERVE, PAGE_READWRITE);
+ if (p)
+ break;
+ if ((reserve_size -= page_const) <= allocsize)
+ break;
+ }
+ if (p == NULL)
+ api_fatal ("1. unable to allocate heap, heap_chunk_size %d, pid %d, %E",
+ brkchunk, myself->pid);
+ if (p != brkbase)
+ api_fatal ("heap allocated but not at %p", brkbase);
+ if (! VirtualAlloc (brkbase, allocsize, MEM_COMMIT, PAGE_READWRITE))
+ api_fatal ("MEM_COMMIT failed, %E");
+ }
+ else
+ {
+ /* Initialize page mask and default heap size. Preallocate a heap
+ * to assure contiguous memory. */
+ brk = brktop = brkbase = VirtualAlloc(NULL, brkchunk, MEM_RESERVE, PAGE_NOACCESS);
+ if (brkbase == NULL)
+ api_fatal ("2. unable to allocate heap, heap_chunk_size %d, %E",
+ brkchunk);
+ }
+
+ page_const--;
+ malloc_init ();
+}
+
+#define pround(n) (((size_t)(n) + page_const) & ~page_const)
+
+/* FIXME: This function no longer handles "split heaps". */
+
+extern "C" void *
+_sbrk(int n)
+{
+ char *newtop, *newbrk;
+ unsigned commitbytes, newbrksize;
+
+ if (n == 0)
+ return brk; /* Just wanted to find current brk address */
+
+ newbrk = (char *) brk + n; /* Where new brk will be */
+ newtop = (char *) pround (newbrk); /* Actual top of allocated memory -
+ on page boundary */
+
+ if (newtop == brktop)
+ goto good;
+
+ if (n < 0)
+ { /* Freeing memory */
+ assert(newtop < brktop);
+ n = (char *) brktop - newtop;
+ if (VirtualFree(newtop, n, MEM_DECOMMIT)) /* Give it back to OS */
+ goto good; /* Didn't take */
+ else
+ goto err;
+ }
+
+ assert(newtop > brktop);
+
+ /* Need to grab more pages from the OS. If this fails it may be because
+ * we have used up previously reserved memory. Or, we're just plumb out
+ * of memory. */
+ commitbytes = pround (newtop - (char *) brktop);
+ if (VirtualAlloc(brktop, commitbytes, MEM_COMMIT, PAGE_READWRITE) != NULL)
+ goto good;
+
+ /* Couldn't allocate memory. Maybe we can reserve some more.
+ Reserve either the maximum of the standard brkchunk or the requested
+ amount. Then attempt to actually allocate it. */
+
+ if ((newbrksize = brkchunk) < commitbytes)
+ newbrksize = commitbytes;
+
+ if ((VirtualAlloc(brktop, newbrksize, MEM_RESERVE, PAGE_NOACCESS) != NULL) &&
+ (VirtualAlloc(brktop, commitbytes, MEM_COMMIT, PAGE_READWRITE) != NULL))
+ goto good;
+
+err:
+ set_errno (ENOMEM);
+ return (void *) -1;
+
+good:
+ void *oldbrk = brk;
+ brk = newbrk;
+ brktop = newtop;
+ return oldbrk;
+}
diff --git a/winsup/cygwin/include/a.out.h b/winsup/cygwin/include/a.out.h
new file mode 100644
index 000000000..493c63cce
--- /dev/null
+++ b/winsup/cygwin/include/a.out.h
@@ -0,0 +1,421 @@
+#ifndef _A_OUT_H_
+#define _A_OUT_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+#define COFF_IMAGE_WITH_PE
+#define COFF_LONG_SECTION_NAMES
+
+/*** coff information for Intel 386/486. */
+
+
+/********************** FILE HEADER **********************/
+
+struct external_filehdr {
+ short f_magic; /* magic number */
+ 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 */
+ short f_opthdr; /* sizeof(optional hdr) */
+ 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 I386PTXMAGIC 0x154
+#define I386AIXMAGIC 0x175
+
+/* This is Lynx's all-platform magic number for executables. */
+
+#define LYNXCOFFMAGIC 0415
+
+#define I386BADMAG(x) (((x).f_magic != I386MAGIC) \
+ && (x).f_magic != I386AIXMAGIC \
+ && (x).f_magic != I386PTXMAGIC \
+ && (x).f_magic != LYNXCOFFMAGIC)
+
+#define FILHDR struct external_filehdr
+#define FILHSZ 20
+
+
+/********************** 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;
+
+#define AOUTSZ 28
+#define AOUTHDRSZ 28
+
+#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 */
+
+
+/* define some NT default values */
+/* #define NT_IMAGE_BASE 0x400000 moved to internal.h */
+#define NT_SECTION_ALIGNMENT 0x1000
+#define NT_FILE_ALIGNMENT 0x200
+#define NT_DEF_RESERVE 0x100000
+#define NT_DEF_COMMIT 0x1000
+
+/********************** SECTION HEADER **********************/
+
+
+struct external_scnhdr {
+ char s_name[8]; /* section name */
+ unsigned long s_paddr; /* physical address, offset
+ of last addr in scn */
+ 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 40
+
+/*
+ * names of "special" sections
+ */
+#define _TEXT ".text"
+#define _DATA ".data"
+#define _BSS ".bss"
+#define _COMMENT ".comment"
+#define _LIB ".lib"
+
+/********************** 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; /* function name symbol index, iff l_lnno 0 */
+ unsigned long l_paddr; /* (physical) address of line number */
+ } l_addr;
+ unsigned short l_lnno; /* line number */
+};
+
+#define LINENO struct external_lineno
+#define LINESZ 6
+
+/********************** 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;
+ unsigned long e_offset;
+ } e;
+ } e;
+ unsigned long e_value;
+ unsigned short e_scnum;
+ unsigned short e_type;
+ char e_sclass[1];
+ char e_numaux[1];
+};
+
+#define N_BTMASK (0xf)
+#define N_TMASK (0x30)
+#define N_BTSHFT (4)
+#define N_TSHIFT (2)
+
+union external_auxent {
+ struct {
+ unsigned long x_tagndx; /* 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; /* size of function */
+ } x_misc;
+ union {
+ struct { /* if ISFCN, tag, or .bb */
+ unsigned long x_lnnoptr;/* ptr to fcn line # */
+ unsigned long x_endndx; /* entry ndx past block end */
+ } x_fcn;
+ struct { /* if ISARY, up to 4 dimen. */
+ char x_dimen[E_DIMNUM][2];
+ } x_ary;
+ } x_fcnary;
+ unsigned short x_tvndx; /* tv index */
+ } x_sym;
+
+ union {
+ char x_fname[E_FILNMLEN];
+ struct {
+ unsigned long x_zeroes;
+ unsigned long x_offset;
+ } x_n;
+ } x_file;
+
+ struct {
+ unsigned long x_scnlen; /* section length */
+ unsigned short x_nreloc; /* # relocation entries */
+ unsigned short x_nlinno; /* # line numbers */
+ unsigned long x_checksum; /* section COMDAT checksum */
+ unsigned short x_associated;/* COMDAT associated section index */
+ char x_comdat[1]; /* COMDAT selection number */
+ } x_scn;
+
+ struct {
+ unsigned long x_tvfill; /* tv fill value */
+ unsigned short x_tvlen; /* length of .tv */
+ char x_tvran[2][2]; /* tv range */
+ } x_tv; /* info about .tv section (in auxent of symbol .tv)) */
+
+};
+
+#define SYMENT struct external_syment
+#define SYMESZ 18
+#define AUXENT union external_auxent
+#define AUXESZ 18
+
+#define _ETEXT "etext"
+
+/********************** RELOCATION DIRECTIVES **********************/
+
+struct external_reloc {
+ char r_vaddr[4];
+ char r_symndx[4];
+ char r_type[2];
+};
+
+#define RELOC struct external_reloc
+#define RELSZ 10
+
+/* end of coff/i386.h */
+
+/* PE COFF header information */
+
+#ifndef _PE_H
+#define _PE_H
+
+/* NT specific file attributes */
+#define IMAGE_FILE_RELOCS_STRIPPED 0x0001
+#define IMAGE_FILE_EXECUTABLE_IMAGE 0x0002
+#define IMAGE_FILE_LINE_NUMS_STRIPPED 0x0004
+#define IMAGE_FILE_LOCAL_SYMS_STRIPPED 0x0008
+#define IMAGE_FILE_BYTES_REVERSED_LO 0x0080
+#define IMAGE_FILE_32BIT_MACHINE 0x0100
+#define IMAGE_FILE_DEBUG_STRIPPED 0x0200
+#define IMAGE_FILE_SYSTEM 0x1000
+#define IMAGE_FILE_DLL 0x2000
+#define IMAGE_FILE_BYTES_REVERSED_HI 0x8000
+
+/* additional flags to be set for section headers to allow the NT loader to
+ read and write to the section data (to replace the addresses of data in
+ dlls for one thing); also to execute the section in .text's case=
+ */
+#define IMAGE_SCN_MEM_DISCARDABLE 0x02000000
+#define IMAGE_SCN_MEM_EXECUTE 0x20000000
+#define IMAGE_SCN_MEM_READ 0x40000000
+#define IMAGE_SCN_MEM_WRITE 0x80000000
+
+/*
+ * Section characteristics added for ppc-nt
+ */
+
+#define IMAGE_SCN_TYPE_NO_PAD 0x00000008 /* Reserved. */
+
+#define IMAGE_SCN_CNT_CODE 0x00000020 /* Section contains code. */
+#define IMAGE_SCN_CNT_INITIALIZED_DATA 0x00000040 /* Section contains initialized data. */
+#define IMAGE_SCN_CNT_UNINITIALIZED_DATA 0x00000080 /* Section contains uninitialized data. */
+
+#define IMAGE_SCN_LNK_OTHER 0x00000100 /* Reserved. */
+#define IMAGE_SCN_LNK_INFO 0x00000200 /* Section contains comments or some other type of information. */
+#define IMAGE_SCN_LNK_REMOVE 0x00000800 /* Section contents will not become part of image. */
+#define IMAGE_SCN_LNK_COMDAT 0x00001000 /* Section contents comdat. */
+
+#define IMAGE_SCN_MEM_FARDATA 0x00008000
+
+#define IMAGE_SCN_MEM_PURGEABLE 0x00020000
+#define IMAGE_SCN_MEM_16BIT 0x00020000
+#define IMAGE_SCN_MEM_LOCKED 0x00040000
+#define IMAGE_SCN_MEM_PRELOAD 0x00080000
+
+#define IMAGE_SCN_ALIGN_1BYTES 0x00100000
+#define IMAGE_SCN_ALIGN_2BYTES 0x00200000
+#define IMAGE_SCN_ALIGN_4BYTES 0x00300000
+#define IMAGE_SCN_ALIGN_8BYTES 0x00400000
+#define IMAGE_SCN_ALIGN_16BYTES 0x00500000 /* Default alignment if no others are specified. */
+#define IMAGE_SCN_ALIGN_32BYTES 0x00600000
+#define IMAGE_SCN_ALIGN_64BYTES 0x00700000
+
+
+#define IMAGE_SCN_LNK_NRELOC_OVFL 0x01000000 /* Section contains extended relocations. */
+#define IMAGE_SCN_MEM_NOT_CACHED 0x04000000 /* Section is not cachable. */
+#define IMAGE_SCN_MEM_NOT_PAGED 0x08000000 /* Section is not pageable. */
+#define IMAGE_SCN_MEM_SHARED 0x10000000 /* Section is shareable. */
+
+/* COMDAT selection codes. */
+
+#define IMAGE_COMDAT_SELECT_NODUPLICATES (1) /* Warn if duplicates. */
+#define IMAGE_COMDAT_SELECT_ANY (2) /* No warning. */
+#define IMAGE_COMDAT_SELECT_SAME_SIZE (3) /* Warn if different size. */
+#define IMAGE_COMDAT_SELECT_EXACT_MATCH (4) /* Warn if different. */
+#define IMAGE_COMDAT_SELECT_ASSOCIATIVE (5) /* Base on other section. */
+
+/* Magic values that are true for all dos/nt implementations */
+#define DOSMAGIC 0x5a4d
+#define NT_SIGNATURE 0x00004550
+
+/* NT allows long filenames, we want to accommodate this. This may break
+ some of the bfd functions */
+#undef FILNMLEN
+#define FILNMLEN 18 /* # characters in a file name */
+
+
+#ifdef COFF_IMAGE_WITH_PE
+/* The filehdr is only weired in images */
+
+#undef FILHDR
+struct external_PE_filehdr
+{
+ /* DOS header fields */
+ unsigned short e_magic; /* Magic number, 0x5a4d */
+ unsigned short e_cblp; /* Bytes on last page of file, 0x90 */
+ unsigned short e_cp; /* Pages in file, 0x3 */
+ unsigned short e_crlc; /* Relocations, 0x0 */
+ unsigned short e_cparhdr; /* Size of header in paragraphs, 0x4 */
+ unsigned short e_minalloc; /* Minimum extra paragraphs needed, 0x0 */
+ unsigned short e_maxalloc; /* Maximum extra paragraphs needed, 0xFFFF */
+ unsigned short e_ss; /* Initial (relative) SS value, 0x0 */
+ unsigned short e_sp; /* Initial SP value, 0xb8 */
+ unsigned short e_csum; /* Checksum, 0x0 */
+ unsigned short e_ip; /* Initial IP value, 0x0 */
+ unsigned short e_cs; /* Initial (relative) CS value, 0x0 */
+ unsigned short e_lfarlc; /* File address of relocation table, 0x40 */
+ unsigned short e_ovno; /* Overlay number, 0x0 */
+ char e_res[4][2]; /* Reserved words, all 0x0 */
+ unsigned short e_oemid; /* OEM identifier (for e_oeminfo), 0x0 */
+ unsigned short e_oeminfo; /* OEM information; e_oemid specific, 0x0 */
+ char e_res2[10][2]; /* Reserved words, all 0x0 */
+ unsigned long e_lfanew; /* File address of new exe header, 0x80 */
+ char dos_message[16][4]; /* other stuff, always follow DOS header */
+ unsigned int nt_signature; /* required NT signature, 0x4550 */
+
+ /* From standard header */
+
+ 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 */
+};
+
+
+#define FILHDR struct external_PE_filehdr
+#undef FILHSZ
+#define FILHSZ 152
+
+#endif
+
+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 all data used for this file */
+
+ /* NT extra fields; see internal.h for descriptions */
+ unsigned long ImageBase;
+ unsigned long SectionAlignment;
+ unsigned long FileAlignment;
+ unsigned short MajorOperatingSystemVersion;
+ unsigned short MinorOperatingSystemVersion;
+ unsigned short MajorImageVersion;
+ unsigned short MinorImageVersion;
+ unsigned short MajorSubsystemVersion;
+ unsigned short MinorSubsystemVersion;
+ char Reserved1[4];
+ unsigned long SizeOfImage;
+ unsigned long SizeOfHeaders;
+ unsigned long CheckSum;
+ unsigned short Subsystem;
+ unsigned short DllCharacteristics;
+ unsigned long SizeOfStackReserve;
+ unsigned long SizeOfStackCommit;
+ unsigned long SizeOfHeapReserve;
+ unsigned long SizeOfHeapCommit;
+ unsigned long LoaderFlags;
+ unsigned long NumberOfRvaAndSizes;
+ /* IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]; */
+ char DataDirectory[16][2][4]; /* 16 entries, 2 elements/entry, 4 chars */
+
+} PEAOUTHDR;
+
+
+#undef AOUTSZ
+#define AOUTSZ (AOUTHDRSZ + 196)
+
+#undef E_FILNMLEN
+#define E_FILNMLEN 18 /* # characters in a file name */
+#endif
+
+/* end of coff/pe.h */
+
+#define DT_NON (0) /* no derived type */
+#define DT_PTR (1) /* pointer */
+#define DT_FCN (2) /* function */
+#define DT_ARY (3) /* array */
+
+#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))
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _A_OUT_H_ */
+
diff --git a/winsup/cygwin/include/arpa/ftp.h b/winsup/cygwin/include/arpa/ftp.h
new file mode 100644
index 000000000..7d39a3e7a
--- /dev/null
+++ b/winsup/cygwin/include/arpa/ftp.h
@@ -0,0 +1,109 @@
+/*
+ * Copyright (c) 1983, 1989, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * @(#)ftp.h 8.1 (Berkeley) 6/2/93
+ */
+
+#ifndef _ARPA_FTP_H
+#define _ARPA_FTP_H
+
+/* Definitions for FTP; see RFC-765. */
+
+/*
+ * Reply codes.
+ */
+#define PRELIM 1 /* positive preliminary */
+#define COMPLETE 2 /* positive completion */
+#define CONTINUE 3 /* positive intermediate */
+#define TRANSIENT 4 /* transient negative completion */
+#define ERROR 5 /* permanent negative completion */
+
+/*
+ * Type codes
+ */
+#define TYPE_A 1 /* ASCII */
+#define TYPE_E 2 /* EBCDIC */
+#define TYPE_I 3 /* image */
+#define TYPE_L 4 /* local byte size */
+
+#ifdef FTP_NAMES
+char *typenames[] = {"0", "ASCII", "EBCDIC", "Image", "Local" };
+#endif
+
+/*
+ * Form codes
+ */
+#define FORM_N 1 /* non-print */
+#define FORM_T 2 /* telnet format effectors */
+#define FORM_C 3 /* carriage control (ASA) */
+#ifdef FTP_NAMES
+char *formnames[] = {"0", "Nonprint", "Telnet", "Carriage-control" };
+#endif
+
+/*
+ * Structure codes
+ */
+#define STRU_F 1 /* file (no record structure) */
+#define STRU_R 2 /* record structure */
+#define STRU_P 3 /* page structure */
+#ifdef FTP_NAMES
+char *strunames[] = {"0", "File", "Record", "Page" };
+#endif
+
+/*
+ * Mode types
+ */
+#define MODE_S 1 /* stream */
+#define MODE_B 2 /* block */
+#define MODE_C 3 /* compressed */
+#ifdef FTP_NAMES
+char *modenames[] = {"0", "Stream", "Block", "Compressed" };
+#endif
+
+/*
+ * Record Tokens
+ */
+#define REC_ESC '\377' /* Record-mode Escape */
+#define REC_EOR '\001' /* Record-mode End-of-Record */
+#define REC_EOF '\002' /* Record-mode End-of-File */
+
+/*
+ * Block Header
+ */
+#define BLK_EOR 0x80 /* Block is End-of-Record */
+#define BLK_EOF 0x40 /* Block is End-of-File */
+#define BLK_ERRORS 0x20 /* Block is suspected of containing errors */
+#define BLK_RESTART 0x10 /* Block is Restart Marker */
+
+#define BLK_BYTECOUNT 2 /* Bytes in this block */
+
+#endif /* !_ARPA_FTP_H */
diff --git a/winsup/cygwin/include/arpa/inet.h b/winsup/cygwin/include/arpa/inet.h
new file mode 100644
index 000000000..5b6966ce3
--- /dev/null
+++ b/winsup/cygwin/include/arpa/inet.h
@@ -0,0 +1,25 @@
+#ifndef _ARPA_INET_H
+#define _ARPA_INET_H
+
+#include <netinet/in.h>
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#ifndef __INSIDE_CYGWIN_NET__
+unsigned long inet_addr (const char *);
+int inet_aton (const char *, struct in_addr *);
+unsigned long inet_lnaof (struct in_addr);
+struct in_addr inet_makeaddr (unsigned long , unsigned long);
+unsigned int inet_netof (struct in_addr);
+unsigned int inet_network (const char *);
+char *inet_ntoa (struct in_addr);
+#endif
+
+#ifdef __cplusplus
+};
+#endif
+
+#endif /* _ARPA_INET_H */
diff --git a/winsup/cygwin/include/arpa/telnet.h b/winsup/cygwin/include/arpa/telnet.h
new file mode 100644
index 000000000..3e523ea97
--- /dev/null
+++ b/winsup/cygwin/include/arpa/telnet.h
@@ -0,0 +1,322 @@
+/*
+ * Copyright (c) 1983, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * @(#)telnet.h 8.2 (Berkeley) 12/15/93
+ */
+
+#ifndef _ARPA_TELNET_H
+#define _ARPA_TELNET_H
+
+/*
+ * Definitions for the TELNET protocol.
+ */
+#define IAC 255 /* interpret as command: */
+#define DONT 254 /* you are not to use option */
+#define DO 253 /* please, you use option */
+#define WONT 252 /* I won't use option */
+#define WILL 251 /* I will use option */
+#define SB 250 /* interpret as subnegotiation */
+#define GA 249 /* you may reverse the line */
+#define EL 248 /* erase the current line */
+#define EC 247 /* erase the current character */
+#define AYT 246 /* are you there */
+#define AO 245 /* abort output--but let prog finish */
+#define IP 244 /* interrupt process--permanently */
+#define BREAK 243 /* break */
+#define DM 242 /* data mark--for connect. cleaning */
+#define NOP 241 /* nop */
+#define SE 240 /* end sub negotiation */
+#define EOR 239 /* end of record (transparent mode) */
+#define ABORT 238 /* Abort process */
+#define SUSP 237 /* Suspend process */
+#define xEOF 236 /* End of file: EOF is already used... */
+
+#define SYNCH 242 /* for telfunc calls */
+
+#ifdef TELCMDS
+char *telcmds[] = {
+ "EOF", "SUSP", "ABORT", "EOR",
+ "SE", "NOP", "DMARK", "BRK", "IP", "AO", "AYT", "EC",
+ "EL", "GA", "SB", "WILL", "WONT", "DO", "DONT", "IAC", 0,
+};
+#else
+extern char *telcmds[];
+#endif
+
+#define TELCMD_FIRST xEOF
+#define TELCMD_LAST IAC
+#define TELCMD_OK(x) ((unsigned int)(x) <= TELCMD_LAST && \
+ (unsigned int)(x) >= TELCMD_FIRST)
+#define TELCMD(x) telcmds[(x)-TELCMD_FIRST]
+
+/* telnet options */
+#define TELOPT_BINARY 0 /* 8-bit data path */
+#define TELOPT_ECHO 1 /* echo */
+#define TELOPT_RCP 2 /* prepare to reconnect */
+#define TELOPT_SGA 3 /* suppress go ahead */
+#define TELOPT_NAMS 4 /* approximate message size */
+#define TELOPT_STATUS 5 /* give status */
+#define TELOPT_TM 6 /* timing mark */
+#define TELOPT_RCTE 7 /* remote controlled transmission and echo */
+#define TELOPT_NAOL 8 /* negotiate about output line width */
+#define TELOPT_NAOP 9 /* negotiate about output page size */
+#define TELOPT_NAOCRD 10 /* negotiate about CR disposition */
+#define TELOPT_NAOHTS 11 /* negotiate about horizontal tabstops */
+#define TELOPT_NAOHTD 12 /* negotiate about horizontal tab disposition */
+#define TELOPT_NAOFFD 13 /* negotiate about formfeed disposition */
+#define TELOPT_NAOVTS 14 /* negotiate about vertical tab stops */
+#define TELOPT_NAOVTD 15 /* negotiate about vertical tab disposition */
+#define TELOPT_NAOLFD 16 /* negotiate about output LF disposition */
+#define TELOPT_XASCII 17 /* extended ascic character set */
+#define TELOPT_LOGOUT 18 /* force logout */
+#define TELOPT_BM 19 /* byte macro */
+#define TELOPT_DET 20 /* data entry terminal */
+#define TELOPT_SUPDUP 21 /* supdup protocol */
+#define TELOPT_SUPDUPOUTPUT 22 /* supdup output */
+#define TELOPT_SNDLOC 23 /* send location */
+#define TELOPT_TTYPE 24 /* terminal type */
+#define TELOPT_EOR 25 /* end or record */
+#define TELOPT_TUID 26 /* TACACS user identification */
+#define TELOPT_OUTMRK 27 /* output marking */
+#define TELOPT_TTYLOC 28 /* terminal location number */
+#define TELOPT_3270REGIME 29 /* 3270 regime */
+#define TELOPT_X3PAD 30 /* X.3 PAD */
+#define TELOPT_NAWS 31 /* window size */
+#define TELOPT_TSPEED 32 /* terminal speed */
+#define TELOPT_LFLOW 33 /* remote flow control */
+#define TELOPT_LINEMODE 34 /* Linemode option */
+#define TELOPT_XDISPLOC 35 /* X Display Location */
+#define TELOPT_OLD_ENVIRON 36 /* Old - Environment variables */
+#define TELOPT_AUTHENTICATION 37/* Authenticate */
+#define TELOPT_ENCRYPT 38 /* Encryption option */
+#define TELOPT_NEW_ENVIRON 39 /* New - Environment variables */
+#define TELOPT_EXOPL 255 /* extended-options-list */
+#define TELOPT_ENVIRON TELOPT_OLD_ENVIRON
+
+#define NTELOPTS (1+TELOPT_NEW_ENVIRON)
+#ifdef TELOPTS
+char *telopts[NTELOPTS+1] = {
+ "BINARY", "ECHO", "RCP", "SUPPRESS GO AHEAD", "NAME",
+ "STATUS", "TIMING MARK", "RCTE", "NAOL", "NAOP",
+ "NAOCRD", "NAOHTS", "NAOHTD", "NAOFFD", "NAOVTS",
+ "NAOVTD", "NAOLFD", "EXTEND ASCII", "LOGOUT", "BYTE MACRO",
+ "DATA ENTRY TERMINAL", "SUPDUP", "SUPDUP OUTPUT",
+ "SEND LOCATION", "TERMINAL TYPE", "END OF RECORD",
+ "TACACS UID", "OUTPUT MARKING", "TTYLOC",
+ "3270 REGIME", "X.3 PAD", "NAWS", "TSPEED", "LFLOW",
+ "LINEMODE", "XDISPLOC", "OLD-ENVIRON", "AUTHENTICATION",
+ "ENCRYPT", "NEW-ENVIRON",
+ 0,
+};
+#define TELOPT_FIRST TELOPT_BINARY
+#define TELOPT_LAST TELOPT_NEW_ENVIRON
+#define TELOPT_OK(x) ((unsigned int)(x) <= TELOPT_LAST)
+#define TELOPT(x) telopts[(x)-TELOPT_FIRST]
+#endif
+
+/* sub-option qualifiers */
+#define TELQUAL_IS 0 /* option is... */
+#define TELQUAL_SEND 1 /* send option */
+#define TELQUAL_INFO 2 /* ENVIRON: informational version of IS */
+#define TELQUAL_REPLY 2 /* AUTHENTICATION: client version of IS */
+#define TELQUAL_NAME 3 /* AUTHENTICATION: client version of IS */
+
+#define LFLOW_OFF 0 /* Disable remote flow control */
+#define LFLOW_ON 1 /* Enable remote flow control */
+#define LFLOW_RESTART_ANY 2 /* Restart output on any char */
+#define LFLOW_RESTART_XON 3 /* Restart output only on XON */
+
+/*
+ * LINEMODE suboptions
+ */
+
+#define LM_MODE 1
+#define LM_FORWARDMASK 2
+#define LM_SLC 3
+
+#define MODE_EDIT 0x01
+#define MODE_TRAPSIG 0x02
+#define MODE_ACK 0x04
+#define MODE_SOFT_TAB 0x08
+#define MODE_LIT_ECHO 0x10
+
+#define MODE_MASK 0x1f
+
+/* Not part of protocol, but needed to simplify things... */
+#define MODE_FLOW 0x0100
+#define MODE_ECHO 0x0200
+#define MODE_INBIN 0x0400
+#define MODE_OUTBIN 0x0800
+#define MODE_FORCE 0x1000
+
+#define SLC_SYNCH 1
+#define SLC_BRK 2
+#define SLC_IP 3
+#define SLC_AO 4
+#define SLC_AYT 5
+#define SLC_EOR 6
+#define SLC_ABORT 7
+#define SLC_EOF 8
+#define SLC_SUSP 9
+#define SLC_EC 10
+#define SLC_EL 11
+#define SLC_EW 12
+#define SLC_RP 13
+#define SLC_LNEXT 14
+#define SLC_XON 15
+#define SLC_XOFF 16
+#define SLC_FORW1 17
+#define SLC_FORW2 18
+
+#define NSLC 18
+
+/*
+ * For backwards compatability, we define SLC_NAMES to be the
+ * list of names if SLC_NAMES is not defined.
+ */
+#define SLC_NAMELIST "0", "SYNCH", "BRK", "IP", "AO", "AYT", "EOR", \
+ "ABORT", "EOF", "SUSP", "EC", "EL", "EW", "RP", \
+ "LNEXT", "XON", "XOFF", "FORW1", "FORW2", 0,
+#ifdef SLC_NAMES
+char *slc_names[] = {
+ SLC_NAMELIST
+};
+#else
+extern char *slc_names[];
+#define SLC_NAMES SLC_NAMELIST
+#endif
+
+#define SLC_NAME_OK(x) ((unsigned int)(x) <= NSLC)
+#define SLC_NAME(x) slc_names[x]
+
+#define SLC_NOSUPPORT 0
+#define SLC_CANTCHANGE 1
+#define SLC_VARIABLE 2
+#define SLC_DEFAULT 3
+#define SLC_LEVELBITS 0x03
+
+#define SLC_FUNC 0
+#define SLC_FLAGS 1
+#define SLC_VALUE 2
+
+#define SLC_ACK 0x80
+#define SLC_FLUSHIN 0x40
+#define SLC_FLUSHOUT 0x20
+
+#define OLD_ENV_VAR 1
+#define OLD_ENV_VALUE 0
+#define NEW_ENV_VAR 0
+#define NEW_ENV_VALUE 1
+#define ENV_ESC 2
+#define ENV_USERVAR 3
+
+#define ENV_VALUE 0
+#define ENV_VAR 1
+
+/*
+ * AUTHENTICATION suboptions
+ */
+
+/*
+ * Who is authenticating who ...
+ */
+#define AUTH_WHO_CLIENT 0 /* Client authenticating server */
+#define AUTH_WHO_SERVER 1 /* Server authenticating client */
+#define AUTH_WHO_MASK 1
+
+/*
+ * amount of authentication done
+ */
+#define AUTH_HOW_ONE_WAY 0
+#define AUTH_HOW_MUTUAL 2
+#define AUTH_HOW_MASK 2
+
+#define AUTHTYPE_NULL 0
+#define AUTHTYPE_KERBEROS_V4 1
+#define AUTHTYPE_KERBEROS_V5 2
+#define AUTHTYPE_SPX 3
+#define AUTHTYPE_MINK 4
+#define AUTHTYPE_CNT 5
+
+#define AUTHTYPE_TEST 99
+
+#ifdef AUTH_NAMES
+char *authtype_names[] = {
+ "NULL", "KERBEROS_V4", "KERBEROS_V5", "SPX", "MINK", 0,
+};
+#else
+extern char *authtype_names[];
+#endif
+
+#define AUTHTYPE_NAME_OK(x) ((unsigned int)(x) < AUTHTYPE_CNT)
+#define AUTHTYPE_NAME(x) authtype_names[x]
+
+/*
+ * ENCRYPTion suboptions
+ */
+#define ENCRYPT_IS 0 /* I pick encryption type ... */
+#define ENCRYPT_SUPPORT 1 /* I support encryption types ... */
+#define ENCRYPT_REPLY 2 /* Initial setup response */
+#define ENCRYPT_START 3 /* Am starting to send encrypted */
+#define ENCRYPT_END 4 /* Am ending encrypted */
+#define ENCRYPT_REQSTART 5 /* Request you start encrypting */
+#define ENCRYPT_REQEND 6 /* Request you send encrypting */
+#define ENCRYPT_ENC_KEYID 7
+#define ENCRYPT_DEC_KEYID 8
+#define ENCRYPT_CNT 9
+
+#define ENCTYPE_ANY 0
+#define ENCTYPE_DES_CFB64 1
+#define ENCTYPE_DES_OFB64 2
+#define ENCTYPE_CNT 3
+
+#ifdef ENCRYPT_NAMES
+char *encrypt_names[] = {
+ "IS", "SUPPORT", "REPLY", "START", "END",
+ "REQUEST-START", "REQUEST-END", "ENC-KEYID", "DEC-KEYID",
+ 0,
+};
+char *enctype_names[] = {
+ "ANY", "DES_CFB64", "DES_OFB64", 0,
+};
+#else
+extern char *encrypt_names[];
+extern char *enctype_names[];
+#endif
+
+
+#define ENCRYPT_NAME_OK(x) ((unsigned int)(x) < ENCRYPT_CNT)
+#define ENCRYPT_NAME(x) encrypt_names[x]
+
+#define ENCTYPE_NAME_OK(x) ((unsigned int)(x) < ENCTYPE_CNT)
+#define ENCTYPE_NAME(x) enctype_names[x]
+#endif /* _ARPA_TELNET_H */
diff --git a/winsup/cygwin/include/asm/byteorder.h b/winsup/cygwin/include/asm/byteorder.h
new file mode 100644
index 000000000..5ccd9850a
--- /dev/null
+++ b/winsup/cygwin/include/asm/byteorder.h
@@ -0,0 +1,93 @@
+#ifndef _I386_BYTEORDER_H
+#define _I386_BYTEORDER_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if 0
+#undef ntohl
+#undef ntohs
+#undef htonl
+#undef htons
+#endif
+
+#ifndef __LITTLE_ENDIAN
+#define __LITTLE_ENDIAN 1234
+#endif
+
+#ifndef __LITTLE_ENDIAN_BITFIELD
+#define __LITTLE_ENDIAN_BITFIELD
+#endif
+
+#if 1
+extern unsigned long int ntohl(unsigned long int);
+extern unsigned short int ntohs(unsigned short int);
+extern unsigned long int htonl(unsigned long int);
+extern unsigned short int htons(unsigned short int);
+
+extern __inline__ unsigned long int __ntohl(unsigned long int);
+extern __inline__ unsigned short int __ntohs(unsigned short int);
+extern __inline__ unsigned long int __constant_ntohl(unsigned long int);
+extern __inline__ unsigned short int __constant_ntohs(unsigned short int);
+
+extern __inline__ unsigned long int
+__ntohl(unsigned long int x)
+{
+ __asm__("xchgb %b0,%h0\n\t" /* swap lower bytes */
+ "rorl $16,%0\n\t" /* swap words */
+ "xchgb %b0,%h0" /* swap higher bytes */
+ :"=q" (x)
+ : "0" (x));
+ return x;
+}
+
+#define __constant_ntohl(x) \
+ ((unsigned long int)((((unsigned long int)(x) & 0x000000ffU) << 24) | \
+ (((unsigned long int)(x) & 0x0000ff00U) << 8) | \
+ (((unsigned long int)(x) & 0x00ff0000U) >> 8) | \
+ (((unsigned long int)(x) & 0xff000000U) >> 24)))
+
+extern __inline__ unsigned short int
+__ntohs(unsigned short int x)
+{
+ __asm__("xchgb %b0,%h0" /* swap bytes */
+ : "=q" (x)
+ : "0" (x));
+ return x;
+}
+
+#define __constant_ntohs(x) \
+ ((unsigned short int)((((unsigned short int)(x) & 0x00ff) << 8) | \
+ (((unsigned short int)(x) & 0xff00) >> 8))) \
+
+#define __htonl(x) __ntohl(x)
+#define __htons(x) __ntohs(x)
+#define __constant_htonl(x) __constant_ntohl(x)
+#define __constant_htons(x) __constant_ntohs(x)
+
+#ifdef __OPTIMIZE__
+# define ntohl(x) \
+(__builtin_constant_p((long)(x)) ? \
+ __constant_ntohl((x)) : \
+ __ntohl((x)))
+# define ntohs(x) \
+(__builtin_constant_p((short)(x)) ? \
+ __constant_ntohs((x)) : \
+ __ntohs((x)))
+# define htonl(x) \
+(__builtin_constant_p((long)(x)) ? \
+ __constant_htonl((x)) : \
+ __htonl((x)))
+# define htons(x) \
+(__builtin_constant_p((short)(x)) ? \
+ __constant_htons((x)) : \
+ __htons((x)))
+#endif
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/winsup/cygwin/include/asm/socket.h b/winsup/cygwin/include/asm/socket.h
new file mode 100644
index 000000000..167919765
--- /dev/null
+++ b/winsup/cygwin/include/asm/socket.h
@@ -0,0 +1,58 @@
+#ifndef _ASM_SOCKET_H
+#define _ASM_SOCKET_H
+
+#include <cygwin/if.h>
+
+#define IOCPARM_MASK 0x7f /* parameters must be < 128 bytes */
+#define IOC_VOID 0x20000000 /* no parameters */
+#define IOC_OUT 0x40000000 /* copy out parameters */
+#define IOC_IN 0x80000000 /* copy in parameters */
+
+#define _IO(x,y) (IOC_VOID|(x<<8)|y)
+#define _IOR(x,y,t) (IOC_OUT|(((long)sizeof(t)&IOCPARM_MASK)<<16)|(x<<8)|y)
+#define _IOW(x,y,t) (IOC_IN|(((long)sizeof(t)&IOCPARM_MASK)<<16)|(x<<8)|y)
+
+#define SIOCATMARK _IOR('s', 7, u_long) /* at oob mark? */
+#define FIONREAD _IOR('f', 127, u_long) /* get # bytes to read */
+#define FIONBIO 0x8004667e /* To be compatible with termiost version */
+#define REAL_FIONBIO _IOW('f', 126, u_long) /* set/clear non-blocking i/o */
+#define FIOASYNC _IOW('f', 125, u_long) /* set/clear async i/o */
+#define SIOCSHIWAT _IOW('s', 0, u_long) /* set high watermark */
+#define SIOCGHIWAT _IOR('s', 1, u_long) /* get high watermark */
+#define SIOCSLOWAT _IOW('s', 2, u_long) /* set low watermark */
+#define SIOCGLOWAT _IOR('s', 3, u_long) /* get low watermark */
+
+/* Needed for if queries */
+#define SIOCGIFCONF _IOW('s', 100, struct ifconf) /* get if list */
+#define SIOCGIFFLAGS _IOW('s', 101, struct ifreq) /* Get if flags */
+#define SIOCGIFADDR _IOW('s', 102, struct ifreq) /* Get if addr */
+#define SIOCGIFBRDADDR _IOW('s', 103, struct ifreq) /* Get if broadcastaddr */
+#define SIOCGIFNETMASK _IOW('s', 104, struct ifreq) /* Get if netmask */
+
+#define SOL_SOCKET 0xffff /* options for socket level */
+
+#define SO_DEBUG 0x0001 /* turn on debugging info recording */
+#define SO_ACCEPTCONN 0x0002 /* socket has had listen() */
+#define SO_REUSEADDR 0x0004 /* allow local address reuse */
+#define SO_KEEPALIVE 0x0008 /* keep connections alive */
+#define SO_DONTROUTE 0x0010 /* just use interface addresses */
+#define SO_BROADCAST 0x0020 /* permit sending of broadcast msgs */
+#define SO_USELOOPBACK 0x0040 /* bypass hardware when possible */
+#define SO_LINGER 0x0080 /* linger on close if data present */
+#define SO_OOBINLINE 0x0100 /* leave received OOB data in line */
+#define SO_DONTLINGER (u_int)(~SO_LINGER)
+
+/*
+ * Additional options.
+ */
+#define SO_SNDBUF 0x1001 /* send buffer size */
+#define SO_RCVBUF 0x1002 /* receive buffer size */
+#define SO_SNDLOWAT 0x1003 /* send low-water mark */
+#define SO_RCVLOWAT 0x1004 /* receive low-water mark */
+#define SO_SNDTIMEO 0x1005 /* send timeout */
+#define SO_RCVTIMEO 0x1006 /* receive timeout */
+#define SO_ERROR 0x1007 /* get error status and clear */
+#define SO_TYPE 0x1008 /* get socket type */
+
+#endif /* _ASM_SOCKET_H */
+
diff --git a/winsup/cygwin/include/asm/types.h b/winsup/cygwin/include/asm/types.h
new file mode 100644
index 000000000..be1177d3c
--- /dev/null
+++ b/winsup/cygwin/include/asm/types.h
@@ -0,0 +1,13 @@
+#ifndef _ASM_TYPES_H
+#define _ASM_TYPES_H
+
+typedef __signed__ char __s8;
+typedef unsigned char __u8;
+
+typedef __signed__ short __s16;
+typedef unsigned short __u16;
+
+typedef __signed__ int __s32;
+typedef unsigned int __u32;
+
+#endif /* _ASM_TYPES_H */
diff --git a/winsup/cygwin/include/cygwin/acl.h b/winsup/cygwin/include/cygwin/acl.h
new file mode 100644
index 000000000..d54655a5a
--- /dev/null
+++ b/winsup/cygwin/include/cygwin/acl.h
@@ -0,0 +1,81 @@
+/* cygwin/acl.h header file for Cygwin.
+
+ Copyright 1999, 2000 Cygnus Solutions.
+ Written by C. Vinschen.
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#ifndef _CYGWIN_ACL_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+#define _CYGWIN_ACL_H
+
+#include <_ansi.h>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+
+/* Values for `cmd' in calls to acl(2) and facl(2) */
+#define SETACL (0x0)
+#define GETACL (0x1)
+#define GETACLCNT (0x2)
+
+#define MIN_ACL_ENTRIES (4) // minimal acl entries from GETACLCNT
+#define MAX_ACL_ENTRIES (256) // max entries of each type
+
+// Return values of aclcheck(3) in case of error */
+#define GRP_ERROR (0x1)
+#define USER_ERROR (0x2)
+#define CLASS_ERROR (0x3)
+#define OTHER_ERROR (0x4)
+#define DUPLICATE_ERROR (0x5)
+#define ENTRY_ERROR (0x6)
+#define MISS_ERROR (0x7) // which = -1
+#define MEM_ERROR (0x8) // which = -1
+
+// Values for entry type of struct acl
+#define USER_OBJ (0x0001) // owner
+#define USER (0x0002) // additional user
+#define GROUP_OBJ (0x0004) // owning group
+#define GROUP (0x0008) // additional group
+#define CLASS_OBJ (0x0010) // mask entry
+#define OTHER_OBJ (0x0020) // others
+#define ACL_DEFAULT (0x1000) // default flag
+#define DEF_USER_OBJ (ACL_DEFAULT|USER_OBJ) // default owner
+#define DEF_USER (ACL_DEFAULT|USER) // default additional user
+#define DEF_GROUP_OBJ (ACL_DEFAULT|GROUP_OBJ) // default owning group
+#define DEF_GROUP (ACL_DEFAULT|GROUP) // default additional group
+#define DEF_CLASS_OBJ (ACL_DEFAULT|CLASS_OBJ) // default mask entry
+#define DEF_OTHER_OBJ (ACL_DEFAULT|OTHER_OBJ) // default others
+// Values with equivalent meanings
+#define USER_OWNER USER_OBJ
+#define GROUP_OWNER GROUP_OBJ
+#define MASK CLASS_OBJ
+#define OTHER OTHER_OBJ
+
+typedef struct acl {
+ int a_type; /* entry type */
+ uid_t a_id; /* UID | GID */
+ mode_t a_perm; /* permissions */
+} aclent_t;
+
+int _EXFUN(acl,(const char *path, int cmd, int nentries, aclent_t *aclbufp));
+int _EXFUN(facl,(int fd, int cmd, int nentries, aclent_t *aclbufp));
+int _EXFUN(aclcheck,(aclent_t *aclbufp, int nentries, int *which));
+int _EXFUN(aclsort,(int nentries, int calclass, aclent_t *aclbufp));
+int _EXFUN(acltomode,(aclent_t *aclbufp, int nentries, mode_t *modep));
+int _EXFUN(aclfrommode,(aclent_t *aclbufp, int nentries, mode_t *modep));
+int _EXFUN(acltopbits,(aclent_t *aclbufp, int nentries, mode_t *pbitsp));
+int _EXFUN(aclfrompbits,(aclent_t *aclbufp, int nentries, mode_t *pbitsp));
+char *_EXFUN(acltotext,(aclent_t *aclbufp, int aclcnt));
+aclent_t *_EXFUN(aclfromtext,(char *acltextp, int *aclcnt));
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* _CYGWIN_ACL_H */
diff --git a/winsup/cygwin/include/cygwin/cygwin_dll.h b/winsup/cygwin/include/cygwin/cygwin_dll.h
new file mode 100644
index 000000000..08cdbdf00
--- /dev/null
+++ b/winsup/cygwin/include/cygwin/cygwin_dll.h
@@ -0,0 +1,96 @@
+/* cygwin_dll.h
+
+ Copyright 1998 Cygnus Solutions
+
+This file is part of Cygwin32.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin32 license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#ifndef __CYGWIN_CYGWIN_DLL_H__
+#define __CYGWIN_CYGWIN_DLL_H__
+
+#include <windows.h>
+
+#ifdef __cplusplus
+#define CDECL_BEGIN extern "C" {
+#define CDECL_END }
+#else
+#define CDECL_BEGIN
+#define CDECL_END
+#endif
+
+#define DECLARE_CYGWIN_DLL(Entry) \
+ \
+CDECL_BEGIN \
+ int WINAPI _cygwin_dll_entry (HANDLE h, DWORD reason, void *ptr); \
+ int WINAPI _cygwin_noncygwin_dll_entry (HANDLE h, DWORD reason, void *ptr); \
+ \
+ int WINAPI Entry (HANDLE h, DWORD reason, void *ptr); \
+ extern int cygwin_attach_dll (); \
+ extern void cygwin_detach_dll (); \
+CDECL_END \
+ \
+static HANDLE storedHandle; \
+static DWORD storedReason; \
+static void* storedPtr; \
+ \
+static int __dllMain (int a, char **b, char **c) \
+{ \
+ return Entry (storedHandle, storedReason, storedPtr); \
+} \
+ \
+static int dll_index; \
+ \
+int WINAPI _cygwin_dll_entry (HANDLE h, DWORD reason, void *ptr) \
+{ \
+ int ret; \
+ ret = 1; \
+ \
+ switch (reason) \
+ { \
+ case DLL_PROCESS_ATTACH: \
+ { \
+ storedHandle = h; \
+ storedReason = reason; \
+ storedPtr = ptr; \
+ dll_index = cygwin_attach_dll (h, &__dllMain); \
+ if (dll_index == -1) \
+ ret = 0; \
+ } \
+ break; \
+ \
+ case DLL_PROCESS_DETACH: \
+ { \
+ ret = Entry (h, reason, ptr); \
+ if (ret) \
+ { \
+ cygwin_detach_dll (dll_index); \
+ dll_index = -1; \
+ } \
+ } \
+ break; \
+ \
+ case DLL_THREAD_ATTACH: \
+ { \
+ ret = Entry (h, reason, ptr); \
+ } \
+ break; \
+ \
+ case DLL_THREAD_DETACH: \
+ { \
+ ret = Entry (h, reason, ptr); \
+ } \
+ break; \
+ } \
+ return ret; \
+} \
+ \
+/* OBSOLETE: This is only provided for source level compatibility. */ \
+int WINAPI _cygwin_noncygwin_dll_entry (HANDLE h, DWORD reason, void *ptr) \
+{ \
+ return _cygwin_dll_entry (h, reason, ptr); \
+} \
+
+#endif /* __CYGWIN_CYGWIN_DLL_H__ */
diff --git a/winsup/cygwin/include/cygwin/icmp.h b/winsup/cygwin/include/cygwin/icmp.h
new file mode 100644
index 000000000..7e7aedccd
--- /dev/null
+++ b/winsup/cygwin/include/cygwin/icmp.h
@@ -0,0 +1 @@
+/* icmp.h */
diff --git a/winsup/cygwin/include/cygwin/if.h b/winsup/cygwin/include/cygwin/if.h
new file mode 100644
index 000000000..f16b82992
--- /dev/null
+++ b/winsup/cygwin/include/cygwin/if.h
@@ -0,0 +1,74 @@
+#ifndef _CYGWIN_IF_H_
+#define _CYGWIN_IF_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+#include <sys/types.h>
+#include <sys/socket.h>
+
+/* Standard interface flags. */
+#define IFF_UP 0x1 /* interface is up */
+#define IFF_BROADCAST 0x2 /* broadcast address valid */
+#define IFF_LOOPBACK 0x8 /* is a loopback net */
+#define IFF_NOTRAILERS 0x20 /* avoid use of trailers */
+#define IFF_RUNNING 0x40 /* resources allocated */
+#define IFF_PROMISC 0x100 /* receive all packets */
+#define IFF_MULTICAST 0x1000 /* Supports multicast */
+
+/*
+ * Interface request structure used for socket
+ * ioctl's. All interface ioctl's must have parameter
+ * definitions which begin with ifr_name. The
+ * remainder may be interface specific.
+ */
+
+struct ifreq
+{
+#define IFNAMSIZ 16
+ union
+ {
+ char ifrn_name[IFNAMSIZ]; /* if name, e.g. "en0" */
+ } ifr_ifrn;
+
+ union {
+ struct sockaddr ifru_addr;
+ struct sockaddr ifru_broadaddr;
+ struct sockaddr ifru_netmask;
+ short ifru_flags;
+ int ifru_metric;
+ int ifru_mtu;
+ } ifr_ifru;
+};
+
+#define ifr_name ifr_ifrn.ifrn_name /* interface name */
+#define ifr_addr ifr_ifru.ifru_addr /* address */
+#define ifr_broadaddr ifr_ifru.ifru_broadaddr /* broadcast address */
+#define ifr_netmask ifr_ifru.ifru_netmask /* interface net mask */
+#define ifr_flags ifr_ifru.ifru_flags /* flags */
+
+/*
+ * Structure used in SIOCGIFCONF request.
+ * Used to retrieve interface configuration
+ * for machine (useful for programs which
+ * must know all networks accessible).
+ */
+
+struct ifconf
+{
+ int ifc_len; /* size of buffer */
+ union
+ {
+ caddr_t ifcu_buf;
+ struct ifreq *ifcu_req;
+ } ifc_ifcu;
+};
+#define ifc_buf ifc_ifcu.ifcu_buf /* buffer address */
+#define ifc_req ifc_ifcu.ifcu_req /* array of structures */
+
+#ifdef __cplusplus
+};
+#endif /* __cplusplus */
+
+#endif /* _CYGWIN_IF_H_ */
diff --git a/winsup/cygwin/include/cygwin/in.h b/winsup/cygwin/include/cygwin/in.h
new file mode 100644
index 000000000..d9ab331b3
--- /dev/null
+++ b/winsup/cygwin/include/cygwin/in.h
@@ -0,0 +1,188 @@
+/*
+ * INET An implementation of the TCP/IP protocol suite for the LINUX
+ * operating system. INET is implemented using the BSD Socket
+ * interface as the means of communication with the user level.
+ *
+ * Definitions of the Internet Protocol.
+ *
+ * Version: @(#)in.h 1.0.1 04/21/93
+ *
+ * Authors: Original taken from the GNU Project <netinet/in.h> file.
+ * Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version
+ * 2 of the License, or (at your option) any later version.
+ */
+#ifndef _CYGWIN_IN_H
+#define _CYGWIN_IN_H
+
+#include <cygwin/types.h>
+
+/* Standard well-defined IP protocols. */
+enum {
+ IPPROTO_IP = 0, /* Dummy protocol for TCP */
+ IPPROTO_ICMP = 1, /* Internet Control Message Protocol */
+ IPPROTO_IGMP = 2, /* Internet Gateway Management Protocol */
+ IPPROTO_IPIP = 4, /* IPIP tunnels (older KA9Q tunnels use 94) */
+ IPPROTO_TCP = 6, /* Transmission Control Protocol */
+ IPPROTO_EGP = 8, /* Exterior Gateway Protocol */
+ IPPROTO_PUP = 12, /* PUP protocol */
+ IPPROTO_UDP = 17, /* User Datagram Protocol */
+ IPPROTO_IDP = 22, /* XNS IDP protocol */
+
+ IPPROTO_RAW = 255, /* Raw IP packets */
+ IPPROTO_MAX
+};
+
+/* Standard well-known ports. *//* from winsup/include/netinet/in.h */
+enum
+ {
+ IPPORT_ECHO = 7, /* Echo service. */
+ IPPORT_DISCARD = 9, /* Discard transmissions service. */
+ IPPORT_SYSTAT = 11, /* System status service. */
+ IPPORT_DAYTIME = 13, /* Time of day service. */
+ IPPORT_NETSTAT = 15, /* Network status service. */
+ IPPORT_FTP = 21, /* File Transfer Protocol. */
+ IPPORT_TELNET = 23, /* Telnet protocol. */
+ IPPORT_SMTP = 25, /* Simple Mail Transfer Protocol. */
+ IPPORT_TIMESERVER = 37, /* Timeserver service. */
+ IPPORT_NAMESERVER = 42, /* Domain Name Service. */
+ IPPORT_WHOIS = 43, /* Internet Whois service. */
+ IPPORT_MTP = 57,
+
+ IPPORT_TFTP = 69, /* Trivial File Transfer Protocol. */
+ IPPORT_RJE = 77,
+ IPPORT_FINGER = 79, /* Finger service. */
+ IPPORT_TTYLINK = 87,
+ IPPORT_SUPDUP = 95, /* SUPDUP protocol. */
+
+
+ IPPORT_EXECSERVER = 512, /* execd service. */
+ IPPORT_LOGINSERVER = 513, /* rlogind service. */
+ IPPORT_CMDSERVER = 514,
+ IPPORT_EFSSERVER = 520,
+
+ /* UDP ports. */
+ IPPORT_BIFFUDP = 512,
+ IPPORT_WHOSERVER = 513,
+ IPPORT_ROUTESERVER = 520,
+
+ /* Ports less than this value are reserved for privileged processes. */
+ IPPORT_RESERVED = 1024,
+
+ /* Ports greater this value are reserved for (non-privileged) servers. */
+ IPPORT_USERRESERVED = 5000
+ };
+
+
+/* Internet address. */
+struct in_addr {
+ unsigned int s_addr;
+};
+
+/* Request struct for multicast socket ops */
+
+struct ip_mreq
+{
+ struct in_addr imr_multiaddr; /* IP multicast address of group */
+ struct in_addr imr_interface; /* local IP address of interface */
+};
+
+
+/* Structure describing an Internet (IP) socket address. */
+#define __SOCK_SIZE__ 16 /* sizeof(struct sockaddr) */
+struct sockaddr_in {
+ short int sin_family; /* Address family */
+ unsigned short int sin_port; /* Port number */
+ struct in_addr sin_addr; /* Internet address */
+
+ /* Pad to size of `struct sockaddr'. */
+ unsigned char __pad[__SOCK_SIZE__ - sizeof(short int) -
+ sizeof(unsigned short int) - sizeof(struct in_addr)];
+};
+#define sin_zero __pad /* for BSD UNIX comp. -FvK */
+
+
+/*
+ * Definitions of the bits in an Internet address integer.
+ * On subnets, host and network parts are found according
+ * to the subnet mask, not these masks.
+ */
+#define IN_CLASSA(a) ((((long int) (a)) & 0x80000000) == 0)
+#define IN_CLASSA_NET 0xff000000
+#define IN_CLASSA_NSHIFT 24
+#define IN_CLASSA_HOST (0xffffffff & ~IN_CLASSA_NET)
+#define IN_CLASSA_MAX 128
+
+#define IN_CLASSB(a) ((((long int) (a)) & 0xc0000000) == 0x80000000)
+#define IN_CLASSB_NET 0xffff0000
+#define IN_CLASSB_NSHIFT 16
+#define IN_CLASSB_HOST (0xffffffff & ~IN_CLASSB_NET)
+#define IN_CLASSB_MAX 65536
+
+#define IN_CLASSC(a) ((((long int) (a)) & 0xe0000000) == 0xc0000000)
+#define IN_CLASSC_NET 0xffffff00
+#define IN_CLASSC_NSHIFT 8
+#define IN_CLASSC_HOST (0xffffffff & ~IN_CLASSC_NET)
+
+#define IN_CLASSD(a) ((((long int) (a)) & 0xf0000000) == 0xe0000000)
+#define IN_MULTICAST(a) IN_CLASSD(a)
+#define IN_MULTICAST_NET 0xF0000000
+
+#define IN_EXPERIMENTAL(a) ((((long int) (a)) & 0xe0000000) == 0xe0000000)
+#define IN_BADCLASS(a) ((((long int) (a)) & 0xf0000000) == 0xf0000000)
+
+/* Address to accept any incoming messages. */
+#define INADDR_ANY ((unsigned long int) 0x00000000)
+
+/* Address to send to all hosts. */
+#define INADDR_BROADCAST ((unsigned long int) 0xffffffff)
+
+/* Address indicating an error return. */
+#define INADDR_NONE 0xffffffff
+
+/* Network number for local host loopback. */
+#define IN_LOOPBACKNET 127
+
+/* Address to loopback in software to local host. */
+#define INADDR_LOOPBACK 0x7f000001 /* 127.0.0.1 */
+#define IN_LOOPBACK(a) ((((long int) (a)) & 0xff000000) == 0x7f000000)
+
+/* Defines for Multicast INADDR */
+#define INADDR_UNSPEC_GROUP 0xe0000000 /* 224.0.0.0 */
+#define INADDR_ALLHOSTS_GROUP 0xe0000001 /* 224.0.0.1 */
+#define INADDR_MAX_LOCAL_GROUP 0xe00000ff /* 224.0.0.255 */
+
+/* <asm/byteorder.h> contains the htonl type stuff.. */
+
+#include <asm/byteorder.h>
+
+/* Some random defines to make it easier in the kernel.. */
+#ifdef __KERNEL__
+
+#define LOOPBACK(x) (((x) & htonl(0xff000000)) == htonl(0x7f000000))
+#define MULTICAST(x) (((x) & htonl(0xf0000000)) == htonl(0xe0000000))
+
+#endif
+
+/*
+ * IPv6 definitions as we start to include them. This is just
+ * a beginning dont get excited 8)
+ */
+
+struct in_addr6
+{
+ unsigned char s6_addr[16];
+};
+
+struct sockaddr_in6
+{
+ unsigned short sin6_family;
+ unsigned short sin6_port;
+ unsigned long sin6_flowinfo;
+ struct in_addr6 sin6_addr;
+};
+
+#endif /* _CYGWIN_IN_H */
diff --git a/winsup/cygwin/include/cygwin/mtio.h b/winsup/cygwin/include/cygwin/mtio.h
new file mode 100644
index 000000000..53ed42c76
--- /dev/null
+++ b/winsup/cygwin/include/cygwin/mtio.h
@@ -0,0 +1,190 @@
+/*
+ * cygwin/mtio.h header file for Cygwin.
+ *
+ * Original written by H. Bergman for Linux.
+ * Changed for Cygwin by C. Vinschen.
+ */
+
+#ifndef _CYGWIN_MTIO_H
+#define _CYGWIN_MTIO_H
+
+#include <sys/ioctl.h>
+#include <asm/socket.h>
+
+/*
+ * Structures and definitions for mag tape io control commands
+ */
+
+/* structure for MTIOCTOP - mag tape op command */
+struct mtop {
+ short mt_op; /* operations defined below */
+ int mt_count; /* how many of them */
+};
+
+/* Magnetic Tape operations [Not all operations supported by all drivers]: */
+#define MTRESET 0 /* +reset drive in case of problems */
+#define MTFSF 1 /* forward space over FileMark,
+ * position at first record of next file
+ */
+#define MTBSF 2 /* backward space FileMark (position before FM) */
+#define MTFSR 3 /* forward space record */
+#define MTBSR 4 /* backward space record */
+#define MTWEOF 5 /* write an end-of-file record (mark) */
+#define MTREW 6 /* rewind */
+#define MTOFFL 7 /* rewind and put the drive offline (eject?) */
+#define MTNOP 8 /* no op, set status only (read with MTIOCGET) */
+#define MTRETEN 9 /* retension tape */
+#define MTBSFM 10 /* +backward space FileMark, position at FM */
+#define MTFSFM 11 /* +forward space FileMark, position at FM */
+#define MTEOM 12 /* goto end of recorded media (for appending files).
+ * MTEOM positions after the last FM, ready for
+ * appending another file.
+ */
+#define MTERASE 13 /* erase tape -- be careful! */
+
+#define MTRAS1 14 /* run self test 1 (nondestructive) */
+#define MTRAS2 15 /* run self test 2 (destructive) */
+#define MTRAS3 16 /* reserved for self test 3 */
+
+#define MTSETBLK 20 /* set block length (SCSI) */
+#define MTSETDENSITY 21 /* set tape density (SCSI) */
+#define MTSEEK 22 /* seek to block (Tandberg, etc.) */
+#define MTTELL 23 /* tell block (Tandberg, etc.) */
+#define MTSETDRVBUFFER 24 /* set the drive buffering according to SCSI-2 */
+ /* ordinary buffered operation with code 1 */
+#define MTFSS 25 /* space forward over setmarks */
+#define MTBSS 26 /* space backward over setmarks */
+#define MTWSM 27 /* write setmarks */
+
+#define MTLOCK 28 /* lock the drive door */
+#define MTUNLOCK 29 /* unlock the drive door */
+#define MTLOAD 30 /* execute the SCSI load command */
+#define MTUNLOAD 31 /* execute the SCSI unload command */
+#define MTCOMPRESSION 32/* control compression with SCSI mode page 15 */
+#define MTSETPART 33 /* Change the active tape partition */
+#define MTMKPART 34 /* Format the tape with one or two partitions */
+
+/* structure for MTIOCGET - mag tape get status command */
+
+struct mtget {
+ long mt_type; /* type of magtape device
+ * Cygwin: MT_ISUNKNOWN */
+ long mt_resid; /* residual count: (not sure)
+ * number of bytes ignored, or
+ * number of files not skipped, or
+ * number of records not skipped.
+ * Cygwin: remaining KB.
+ */
+ /* the following registers are device dependent */
+ long mt_dsreg; /* status register */
+ long mt_gstat; /* generic (device independent) status */
+ long mt_erreg; /* error register */
+ /* The next two fields are not always used */
+ long mt_fileno; /* number of current file on tape */
+ long mt_blkno; /* current block number */
+ /* The next are Windows NT specific */
+ long long mt_capacity; /* Tape capacity in bytes */
+ long long mt_remaining; /* Remaining bytes */
+ int mt_minblksize;
+ int mt_maxblksize;
+ int mt_defblksize;
+ unsigned long mt_featureslow;
+ unsigned long mt_featureshigh;
+};
+
+/* structure for MTIOCPOS - mag tape get position command */
+
+struct mtpos {
+ long mt_blkno; /* current block number */
+};
+
+
+/* mag tape io control commands */
+#define MTIOCTOP _IOW('m', 1, struct mtop) /* do a mag tape op */
+#define MTIOCGET _IOR('m', 2, struct mtget) /* get tape status */
+#define MTIOCPOS _IOR('m', 3, struct mtpos) /* get tape position */
+
+/* Generic Mag Tape (device independent) status macros for examining
+ * mt_gstat -- HP-UX compatible.
+ * There is room for more generic status bits here, but I don't
+ * know which of them are reserved. At least three or so should
+ * be added to make this really useful.
+ */
+#define GMT_EOF(x) ((x) & 0x80000000)
+#define GMT_BOT(x) ((x) & 0x40000000)
+#define GMT_EOT(x) ((x) & 0x20000000)
+#define GMT_SM(x) ((x) & 0x10000000) /* DDS setmark */
+#define GMT_EOD(x) ((x) & 0x08000000) /* DDS EOD */
+#define GMT_WR_PROT(x) ((x) & 0x04000000)
+/* #define GMT_ ? ((x) & 0x02000000) */
+#define GMT_ONLINE(x) ((x) & 0x01000000)
+#define GMT_D_6250(x) ((x) & 0x00800000)
+#define GMT_D_1600(x) ((x) & 0x00400000)
+#define GMT_D_800(x) ((x) & 0x00200000)
+#define GMT_PADDING(x) ((x) & 0x00100000) /* data padding */
+#define GMT_HW_ECC(x) ((x) & 0x00080000) /* HW error correction */
+#define GMT_DR_OPEN(x) ((x) & 0x00040000) /* door open (no tape) */
+#define GMT_HW_COMP(x) ((x) & 0x00020000) /* HW compression */
+#define GMT_IM_REP_EN(x) ((x) & 0x00010000) /* immediate report mode */
+/* 16 generic status bits unused */
+
+
+/* SCSI-tape specific definitions */
+/* Bitfield shifts in the status mt_dsreg */
+#define MT_ST_BLKSIZE_SHIFT 0
+#define MT_ST_BLKSIZE_MASK 0xffffff
+#define MT_ST_DENSITY_SHIFT 24
+#define MT_ST_DENSITY_MASK 0xff000000
+
+#define MT_ST_SOFTERR_SHIFT 0
+#define MT_ST_SOFTERR_MASK 0xffff
+
+/*
+ * Constants for mt_type. Not all of these are supported,
+ * and these are not all of the ones that are supported.
+ */
+#define MT_ISUNKNOWN 0x01
+#define MT_ISQIC02 0x02 /* Generic QIC-02 tape streamer */
+#define MT_ISWT5150 0x03 /* Wangtek 5150EQ, QIC-150, QIC-02 */
+#define MT_ISARCHIVE_5945L2 0x04 /* Archive 5945L-2, QIC-24, QIC-02? */
+#define MT_ISCMSJ500 0x05 /* CMS Jumbo 500 (QIC-02?) */
+#define MT_ISTDC3610 0x06 /* Tandberg 6310, QIC-24 */
+#define MT_ISARCHIVE_VP60I 0x07 /* Archive VP60i, QIC-02 */
+#define MT_ISARCHIVE_2150L 0x08 /* Archive Viper 2150L */
+#define MT_ISARCHIVE_2060L 0x09 /* Archive Viper 2060L */
+#define MT_ISARCHIVESC499 0x0A /* Archive SC-499 QIC-36 controller */
+#define MT_ISQIC02_ALL_FEATURES 0x0F /* Generic QIC-02 with all features */
+#define MT_ISWT5099EEN24 0x11 /* Wangtek 5099-een24, 60MB, QIC-24 */
+#define MT_ISTEAC_MT2ST 0x12 /* Teac MT-2ST 155mb drive, Teac DC-1 card (Wangtek type) */
+#define MT_ISEVEREX_FT40A 0x32 /* Everex FT40A (QIC-40) */
+#define MT_ISDDS1 0x51 /* DDS device without partitions */
+#define MT_ISDDS2 0x52 /* DDS device with partitions */
+#define MT_ISSCSI1 0x71 /* Generic ANSI SCSI-1 tape unit */
+#define MT_ISSCSI2 0x72 /* Generic ANSI SCSI-2 tape unit */
+
+struct mt_tape_info {
+ long t_type; /* device type id (mt_type) */
+ char *t_name; /* descriptive name */
+};
+
+#define MT_TAPE_INFO { \
+ {MT_ISUNKNOWN, "Unknown type of tape device"}, \
+ {MT_ISQIC02, "Generic QIC-02 tape streamer"}, \
+ {MT_ISWT5150, "Wangtek 5150, QIC-150"}, \
+ {MT_ISARCHIVE_5945L2, "Archive 5945L-2"}, \
+ {MT_ISCMSJ500, "CMS Jumbo 500"}, \
+ {MT_ISTDC3610, "Tandberg TDC 3610, QIC-24"}, \
+ {MT_ISARCHIVE_VP60I, "Archive VP60i, QIC-02"}, \
+ {MT_ISARCHIVE_2150L, "Archive Viper 2150L"}, \
+ {MT_ISARCHIVE_2060L, "Archive Viper 2060L"}, \
+ {MT_ISARCHIVESC499, "Archive SC-499 QIC-36 controller"}, \
+ {MT_ISQIC02_ALL_FEATURES, "Generic QIC-02 tape, all features"}, \
+ {MT_ISWT5099EEN24, "Wangtek 5099-een24, 60MB"}, \
+ {MT_ISTEAC_MT2ST, "Teac MT-2ST 155mb data cassette drive"}, \
+ {MT_ISEVEREX_FT40A, "Everex FT40A, QIC-40"}, \
+ {MT_ISSCSI1, "Generic SCSI-1 tape"}, \
+ {MT_ISSCSI2, "Generic SCSI-2 tape"}, \
+ {0, NULL} \
+}
+
+#endif /* _CYGWIN_MTIO_H */
diff --git a/winsup/cygwin/include/cygwin/rdevio.h b/winsup/cygwin/include/cygwin/rdevio.h
new file mode 100644
index 000000000..49726fe0e
--- /dev/null
+++ b/winsup/cygwin/include/cygwin/rdevio.h
@@ -0,0 +1,30 @@
+/*
+ * cygwin/rdevio.h header file for Cygwin.
+ *
+ * Written by C. Vinschen.
+ */
+
+#ifndef _CYGWIN_RDEVIO_H
+#define _CYGWIN_RDEVIO_H
+
+/* structure for RDIOCDOP - raw device operation */
+struct rdop {
+ short rd_op;
+ unsigned long rd_parm;
+};
+
+/* Raw device operations */
+#define RDSETBLK 1 /* set buffer for driver */
+
+/* structure for RDIOCGET - get raw device */
+struct rdget {
+ unsigned long bufsiz;
+};
+
+/*
+ * ioctl commands
+*/
+#define RDIOCDOP _IOW('r', 128, struct rdop)
+#define RDIOCGET _IOR('r', 129, struct rdget)
+
+#endif /* _CYGWIN_RDEVIO_H */
diff --git a/winsup/cygwin/include/cygwin/socket.h b/winsup/cygwin/include/cygwin/socket.h
new file mode 100644
index 000000000..fad1efdf0
--- /dev/null
+++ b/winsup/cygwin/include/cygwin/socket.h
@@ -0,0 +1,152 @@
+#ifndef _CYGWIN_SOCKET_H
+#define _CYGWIN_SOCKET_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+struct sockaddr {
+ unsigned short sa_family; /* address family, AF_xxx */
+ char sa_data[14]; /* 14 bytes of protocol address */
+};
+
+#include <asm/socket.h> /* arch-dependent defines */
+#include <cygwin/sockios.h> /* the SIOCxxx I/O controls */
+#include <cygwin/uio.h> /* iovec support */
+#include <sys/types.h>
+
+struct linger {
+ unsigned short l_onoff; /* Linger active */
+ unsigned short l_linger; /* How long to linger for */
+};
+
+struct msghdr
+{
+ void * msg_name; /* Socket name */
+ int msg_namelen; /* Length of name */
+ struct iovec * msg_iov; /* Data blocks */
+ int msg_iovlen; /* Number of blocks */
+ void * msg_accrights; /* Per protocol magic (eg BSD file descriptor passing) */
+ int msg_accrightslen; /* Length of rights list */
+};
+
+/* Socket types. */
+#define SOCK_STREAM 1 /* stream (connection) socket */
+#define SOCK_DGRAM 2 /* datagram (conn.less) socket */
+#define SOCK_RAW 3 /* raw socket */
+#define SOCK_RDM 4 /* reliably-delivered message */
+#define SOCK_SEQPACKET 5 /* sequential packet socket */
+#define SOCK_PACKET 10 /* CYGWIN specific way of */
+ /* getting packets at the dev */
+ /* level. For writing rarp and */
+ /* other similar things on the */
+ /* user level. */
+
+/* Supported address families. */
+/*
+ * Address families.
+ */
+#define AF_UNSPEC 0 /* unspecified */
+#define AF_UNIX 1 /* local to host (pipes, portals) */
+#define AF_LOCAL 1 /* POSIX name for AF_UNIX */
+#define AF_INET 2 /* internetwork: UDP, TCP, etc. */
+#define AF_IMPLINK 3 /* arpanet imp addresses */
+#define AF_PUP 4 /* pup protocols: e.g. BSP */
+#define AF_CHAOS 5 /* mit CHAOS protocols */
+#define AF_NS 6 /* XEROX NS protocols */
+#define AF_ISO 7 /* ISO protocols */
+#define AF_OSI AF_ISO /* OSI is ISO */
+#define AF_ECMA 8 /* european computer manufacturers */
+#define AF_DATAKIT 9 /* datakit protocols */
+#define AF_CCITT 10 /* CCITT protocols, X.25 etc */
+#define AF_SNA 11 /* IBM SNA */
+#define AF_DECnet 12 /* DECnet */
+#define AF_DLI 13 /* Direct data link interface */
+#define AF_LAT 14 /* LAT */
+#define AF_HYLINK 15 /* NSC Hyperchannel */
+#define AF_APPLETALK 16 /* AppleTalk */
+#define AF_NETBIOS 17 /* NetBios-style addresses */
+
+#define AF_MAX 18
+/*
+ * Protocol families, same as address families for now.
+ */
+#define PF_UNSPEC AF_UNSPEC
+#define PF_UNIX AF_UNIX
+#define PF_LOCAL AF_LOCAL
+#define PF_INET AF_INET
+#define PF_IMPLINK AF_IMPLINK
+#define PF_PUP AF_PUP
+#define PF_CHAOS AF_CHAOS
+#define PF_NS AF_NS
+#define PF_ISO AF_ISO
+#define PF_OSI AF_OSI
+#define PF_ECMA AF_ECMA
+#define PF_DATAKIT AF_DATAKIT
+#define PF_CCITT AF_CCITT
+#define PF_SNA AF_SNA
+#define PF_DECnet AF_DECnet
+#define PF_DLI AF_DLI
+#define PF_LAT AF_LAT
+#define PF_HYLINK AF_HYLINK
+#define PF_APPLETALK AF_APPLETALK
+#define PF_NETBIOS AF_NETBIOS
+
+#define PF_MAX AF_MAX
+
+/* Maximum queue length specificable by listen. */
+#define SOMAXCONN 5
+
+/* Flags we can use with send/ and recv. */
+#define MSG_OOB 0x1 /* process out-of-band data */
+#define MSG_PEEK 0x2 /* peek at incoming message */
+#define MSG_DONTROUTE 0x4 /* send without using routing tables */
+
+/* Setsockoptions(2) level. Thanks to BSD these must match IPPROTO_xxx */
+#define SOL_IP 0
+#define SOL_IPX 256
+#define SOL_AX25 257
+#define SOL_ATALK 258
+#define SOL_NETROM 259
+#define SOL_TCP 6
+#define SOL_UDP 17
+
+/* IP options */
+#define IPTOS_LOWDELAY 0x10
+#define IPTOS_THROUGHPUT 0x08
+#define IPTOS_RELIABILITY 0x04
+
+/* These need to appear somewhere around here */
+#define IP_DEFAULT_MULTICAST_TTL 1
+#define IP_DEFAULT_MULTICAST_LOOP 1
+#define IP_MAX_MEMBERSHIPS 20
+
+/* IP options for use with WinSock */
+
+#define IP_OPTIONS 1
+#define IP_MULTICAST_IF 2
+#define IP_MULTICAST_TTL 3
+#define IP_MULTICAST_LOOP 4
+#define IP_ADD_MEMBERSHIP 5
+#define IP_DROP_MEMBERSHIP 6
+#define IP_TTL 7
+#define IP_TOS 8
+#define IP_DONTFRAGMENT 9
+
+/* IPX options */
+#define IPX_TYPE 1
+
+/* TCP options - this way around because someone left a set in the c library includes */
+#define TCP_NODELAY 0x0001
+#define TCP_MAXSEG 2
+
+/* The various priorities. */
+#define SOPRI_INTERACTIVE 0
+#define SOPRI_NORMAL 1
+#define SOPRI_BACKGROUND 2
+
+#ifdef __cplusplus
+};
+#endif /* __cplusplus */
+
+#endif /* _CYGWIN_SOCKET_H */
diff --git a/winsup/cygwin/include/cygwin/sockios.h b/winsup/cygwin/include/cygwin/sockios.h
new file mode 100644
index 000000000..2e756954e
--- /dev/null
+++ b/winsup/cygwin/include/cygwin/sockios.h
@@ -0,0 +1 @@
+/* sockios.h */
diff --git a/winsup/cygwin/include/cygwin/types.h b/winsup/cygwin/include/cygwin/types.h
new file mode 100644
index 000000000..51e349710
--- /dev/null
+++ b/winsup/cygwin/include/cygwin/types.h
@@ -0,0 +1 @@
+/* types.h */
diff --git a/winsup/cygwin/include/cygwin/uio.h b/winsup/cygwin/include/cygwin/uio.h
new file mode 100644
index 000000000..18c77ae65
--- /dev/null
+++ b/winsup/cygwin/include/cygwin/uio.h
@@ -0,0 +1 @@
+/* uio.h */
diff --git a/winsup/cygwin/include/cygwin/version.h b/winsup/cygwin/include/cygwin/version.h
new file mode 100644
index 000000000..eea5d9b91
--- /dev/null
+++ b/winsup/cygwin/include/cygwin/version.h
@@ -0,0 +1,159 @@
+/* version.h -- Cygwin version numbers and accompanying documentation.
+
+ Copyright 1996, 1997, 1998, 1999 Cygnus Solutions.
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+/* Cygwin versioning is relatively complicated because of its status
+ as a shared library. Let's start with how versioning used to be done.
+
+ Historical versioning in Cygwin 16.0 to 19.5:
+
+ In the olden days of Cygwin, we had a dll major and minor version
+ and a registry version. The major number started at 16 because the
+ "b15" GNU-Win32 release of the compiler tools was out when this
+ scheme was started. We incremented the DLL name frequently (for
+ every official release) and towards the end of this period every
+ release used a different shared memory area to prevent DLLs from
+ interfering with each other (embedding a build timestamp into the
+ name of the shared memory area). This turned out to be a Bad Idea
+ (tm) because people needed to mingle separate releases and have
+ them work together more than we thought they would. This was
+ especially problematic when tty info needed to be retained when an
+ old Cygwin executable executed a newer one.
+
+ In the old scheme, we incremented the major number whenever a
+ change to the dll invalidated existing executables. This can
+ happen for a number of reasons, including when functions are
+ removed from the export list of the dll. The minor number was
+ incremented when a change was made that we wanted to record, but
+ that didn't invalidate existing executables. Both numbers were
+ recorded in the executable and in the dll.
+
+ In October 1998 (starting with Cygwin 19.6), we started a new
+ means of Cygwin versioning: */
+
+ /* The DLL major and minor numbers correspond to the "version of
+ the Cygwin library". This version is used to track important
+ changes to the DLL and is mainly informative in nature. */
+
+ /* The current cygwin version is 1.1.0 */
+
+#define CYGWIN_VERSION_DLL_MAJOR 1001
+#define CYGWIN_VERSION_DLL_MINOR 0
+
+ /* Major numbers before CYGWIN_VERSION_DLL_EPOCH are
+ incompatible. */
+
+#define CYGWIN_VERSION_DLL_EPOCH 19
+
+ /* CYGWIN_VERSION_DLL_COMBINED gives us a single number
+ representing the combined DLL major and minor numbers. */
+
+#define CYGWIN_VERSION_DLL_MAKE_COMBINED(maj, min) (((maj) * 1000) + min)
+#define CYGWIN_VERSION_DLL_COMBINED \
+ CYGWIN_VERSION_DLL_MAKE_COMBINED (CYGWIN_DLL_VERSION_MAJOR, CYGWIN_DLL_VERSION_MINOR)
+
+ /* Every version of cygwin <= this uses an old, incorrect method
+ to determine signal masks. */
+
+#define CYGWIN_VERSION_DLL_BAD_SIGNAL_MASK 19005
+
+ /* API versions <= this had a termios structure whose members were
+ too small to accomodate modern settings. */
+#define CYGWIN_VERSION_DLL_OLD_TERMIOS 00005
+#define CYGWIN_VERSION_DLL_IS_OLD_TERMIOS \
+ (CYGWIN_VERSION_DLL_MAKE_COMBINED (user_data->api_major, user_data->api_minor) <= \
+ CYGWIN_VERSION_DLL_OLD_TERMIOS)
+
+ /* We used to use the DLL major/minor to track
+ non-backward-compatible interface changes to the API. Now we
+ use an API major/minor number for this purpose. */
+
+ /* API_MAJOR 0.0: Initial version. API_MINOR changes:
+ 1: Export cygwin32_ calls as cygwin_ as well.
+ 2: Export j1, jn, y1, yn.
+ 3: Export dll_noncygwin_dllcrt0.
+ 4: New socket ioctls, revamped ifconf support.
+ 5: Thread support/exports.
+ 6: Change in termios handling.
+ 7: Export scandir and alphasort.
+ 8: Export _ctype_, _sys_errlist, _sys_nerr.
+ 9: Mount-related changes, new cygwin_umount export.
+ Raw device support (tape, floppies).
+ 10: Fast math routine support added.
+ 11: Export seekdir, telldir.
+ 12: Export pthread_join, pthread_detach.
+ 13: Export math funcs gamma and friends, also _j0, _j1, etc.
+ 14: Export snprintf and vnsprintf.
+ 15: Export glob
+ 16: Export cygwin_stackdump
+ */
+
+#define CYGWIN_VERSION_API_MAJOR 0
+#define CYGWIN_VERSION_API_MINOR 16
+
+ /* There is also a compatibity version number associated with the
+ shared memory regions. It is incremented when incompatible
+ changes are made to the shared memory region *or* to any named
+ shared mutexes, semaphores, etc. The arbitrary starting
+ version was 0 (cygwin release 98r2). */
+
+#define CYGWIN_VERSION_SHARED_DATA 3
+
+ /* An identifier used in the names used to create shared objects.
+ The full names include the CYGWIN_VERSION_SHARED_DATA version
+ as well as this identifier. */
+
+#define CYGWIN_VERSION_DLL_IDENTIFIER "cygwin1"
+
+ /* The Cygwin mount table interface in the Win32 registry also
+ has a version number associated with it in case that is
+ changed in a non-backwards compatible fashion. Increment this
+ version number whenever incompatible changes in mount table
+ registry usage are made.
+
+ 1: Original number version.
+ 2: New mount registry layout, system-wide mount accessibility.
+ */
+
+#define CYGWIN_VERSION_MOUNT_REGISTRY 2
+
+ /* Identifiers used in the Win32 registry. */
+
+#define CYGWIN_INFO_CYGNUS_REGISTRY_NAME "Cygnus Solutions"
+#define CYGWIN_INFO_CYGWIN_REGISTRY_NAME "Cygwin"
+#define CYGWIN_INFO_PROGRAM_OPTIONS_NAME "Program Options"
+#define CYGWIN_INFO_CYGWIN_MOUNT_REGISTRY_NAME "mounts v2"
+
+ /* In addition to the above version number strings, the build
+ process adds some strings that may be useful in
+ debugging/identifying a particular Cygwin DLL:
+
+ The mkvers.sh script at the top level produces a .cc file
+ which initializes a cygwin_version structure based on the
+ above version information and creates a string table for
+ grepping via "fgrep '%%%' cygwinwhatever.dll" if you are
+ using GNU grep. Otherwise you may want to do a
+ "strings cygwinwhatever.dll | fgrep '%%%'" instead.
+
+ This will produce output such as:
+
+ %%% Cygwin dll_identifier: cygwin
+ %%% Cygwin api_major: 0
+ %%% Cygwin api_minor: 0
+ %%% Cygwin dll_major: 19
+ %%% Cygwin dll_minor: 6
+ %%% Cygwin shared_data: 1
+ %%% Cygwin registry: b15
+ %%% Cygwin build date: Wed Oct 14 16:26:51 EDT 1998
+ %%% Cygwin shared id: cygwinS1
+
+ This information can also be obtained through a call to
+ cygwin_internal (CW_GETVERSIONINFO).
+ */
+
diff --git a/winsup/cygwin/include/dlfcn.h b/winsup/cygwin/include/dlfcn.h
new file mode 100644
index 000000000..753da0277
--- /dev/null
+++ b/winsup/cygwin/include/dlfcn.h
@@ -0,0 +1,41 @@
+/* dlfcn.h
+
+ Copyright 1998 Cygnus Solutions
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#ifndef _DLFCN_H
+#define _DLFCN_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* declarations used for dynamic linking support routines */
+extern void *dlopen (const char *, int);
+extern void *dlsym (void *, const char *);
+extern int dlclose (void *);
+extern char *dlerror (void);
+
+/* specific to CYGWIN */
+#define FORK_RELOAD 1
+#define FORK_NO_RELOAD 0
+
+extern void dlfork (int);
+
+/* following doesn't exist in Win32 API .... */
+
+/* valid values for mode argument to dlopen */
+#define RTLD_LAZY 1 /* lazy function call binding */
+#define RTLD_NOW 2 /* immediate function call binding */
+#define RTLD_GLOBAL 4 /* symbols in this dlopen'ed obj are visible to other dlopen'ed objs */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _DLFCN_H */
diff --git a/winsup/cygwin/include/exceptions.h b/winsup/cygwin/include/exceptions.h
new file mode 100644
index 000000000..44528bb25
--- /dev/null
+++ b/winsup/cygwin/include/exceptions.h
@@ -0,0 +1,120 @@
+/* exceptions.h
+
+ Copyright 1996, 1997, 1998 Cygnus Solutions.
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#ifndef _EXCEPTIONS_H
+#define _EXCEPTIONS_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/* Documentation on the innards of exception handling (i.e. from the
+ perspective of a compiler implementor) apparently doesn't exist. Sigh.
+ However, the following came from Onno Hovers <onno@stack.urc.tue.nl>
+
+The first pointer to the chain of handlers is in the thread environment block
+at FS:[0]. This chain has the following format:
+
+typedef struct __EXCEPTION_FRAME
+{
+ struct __EXCEPTION_FRAME *Prev; /-* pointer to the previous frame *-/
+ PEXCEPTION_HANDLER Handler; /-* handler function *-/
+}
+
+You register an exception handler in your compiler with this simple ASM
+sequence:
+ PUSH _MyExceptionHandler
+ PUSH FS:[0]
+ MOV FS:[0],ESP
+An exception frame MUST be on the stack! The frame may have more fields and
+both Visual C++ and Borland C++ use more fields for themselves.
+
+When an exception occurs the system calls all handlers starting with the
+handler at FS:0, and then the previous etc. until one handler returns
+ExceptionContinueExecution, which is 0. If a handler does not want to handle
+the exception it should just return ExceptionContinueSearch, which is 1.
+
+The handler has the following parameters:
+ehandler (
+ PEXCEPTION_RECORD erecord,
+ PEXCEPTION_FRAME myframe,
+ PCONTEXT context, /-* context before and after *-/
+ PVOID dispatch ) /-* something *-/
+
+When a handler wants to handle the exception, it has some alternatives:
+
+-one is to do do something about the exception condition, like emulating
+an invalid instruction, mapping memory where there was a page fault, etc.
+If the handler wants to have the context of the thread that causes the
+exception changed, it should make that change in the context passed to the
+handler.
+
+-the second alternative is to call all exception handlers again, indicating
+that you want them to clean up. This way all the __finally blocks get
+executed. After doing that you change the context passed to the handler so
+the code starts executing in the except block. For this purpose you could
+call RtlUnwind. This (undocumented) function calls all exception handlers
+up to but not including the exception frame passed to it. If NULL is passed
+as exception frame RtlUnwind calls all exception handlers and then exits the
+process. The parameters to RtlUnwind are:
+
+RtlUnwind (
+ PEXCEPTION_FRAME endframe,
+ PVOID unusedEip,
+ PEXCEPTION_RECORD erecord,
+ DWORD returnEax)
+
+You should set unusedEip to the address where RtlUnwind should return like
+this:
+ PUSH 0
+ PUSH OFFSET ReturnUnwind
+ PUSH 0
+ PUSH 0
+ CALL RtlUnwind
+ReturnUnwind:
+ .....
+
+If no EXCEPTION_RECORD is passed, RtlUnwind makes a default exception
+record. In any case, the ExceptionFlags part of this record has the
+EH_UNWINDING (=2), flag set. (and EH_EXIT_UNWIND (=4), when NULL is passed as the end
+frame.).
+
+The handler for a exception as well as a for unwinds may be executed in the
+thread causing the exception, but may also be executed in another (special
+exception) thread. So it is not wise to make any assumptions about that!
+
+As an alternative you may consider the SetUnhandledExceptionFilter API
+to install your own exception filter. This one is documented.
+*/
+
+/* The January 1994 MSJ has an article entitled "Clearer, More Comprehensive
+ Error Processing with Win32 Structured Exception Handling". It goes into
+ a teensy bit of detail of the innards of exception handling (i.e. what we
+ have to do). */
+
+typedef int (exception_handler)
+ (EXCEPTION_RECORD *, void *, CONTEXT *, void *);
+
+typedef struct _exception_list
+{
+ struct _exception_list *prev;
+ exception_handler *handler;
+
+ /* We're apparently free to add more stuff here.
+ At present we don't need any. */
+} exception_list;
+
+void init_exceptions (exception_list *);
+
+#ifdef __cplusplus
+};
+#endif /* __cplusplus */
+
+#endif /* _EXCEPTIONS_H */
diff --git a/winsup/cygwin/include/fcntl.h b/winsup/cygwin/include/fcntl.h
new file mode 100644
index 000000000..90cfab0d4
--- /dev/null
+++ b/winsup/cygwin/include/fcntl.h
@@ -0,0 +1,7 @@
+#ifndef _FCNTL_H
+#define _FCNTL_H
+
+#include <sys/fcntl.h>
+#define O_NDELAY _FNDELAY
+
+#endif /* _FCNTL_H */
diff --git a/winsup/cygwin/include/features.h b/winsup/cygwin/include/features.h
new file mode 100644
index 000000000..206902f7d
--- /dev/null
+++ b/winsup/cygwin/include/features.h
@@ -0,0 +1 @@
+/* features.h */
diff --git a/winsup/cygwin/include/getopt.h b/winsup/cygwin/include/getopt.h
new file mode 100644
index 000000000..851ac67e2
--- /dev/null
+++ b/winsup/cygwin/include/getopt.h
@@ -0,0 +1,66 @@
+/*
+ * Copyright (c) 1987, 1993, 1994, 1996
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef __GETOPT_H__
+#define __GETOPT_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct option {
+ char * name;
+ int has_arg;
+ int * flag;
+ int val;
+};
+
+extern int opterr; /* if error message should be printed */
+extern int optind; /* index into parent argv vector */
+extern int optopt; /* character checked for validity */
+extern int optreset; /* reset getopt */
+extern char *optarg; /* argument associated with option */
+
+int getopt (int, char * const *, const char *);
+
+int getopt_long (int, char **, char *, struct option *, int *);
+
+#define no_argument 0
+#define required_argument 1
+#define optional_argument 2
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __GETOPT_H__ */
diff --git a/winsup/cygwin/include/glob.h b/winsup/cygwin/include/glob.h
new file mode 100644
index 000000000..3fdf3e8ae
--- /dev/null
+++ b/winsup/cygwin/include/glob.h
@@ -0,0 +1,111 @@
+/* $NetBSD: glob.h,v 1.6.2.2 1997/11/04 23:38:33 thorpej Exp $ */
+
+/*
+ * Copyright (c) 1989, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Guido van Rossum.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * @(#)glob.h 8.1 (Berkeley) 6/2/93
+ */
+
+#ifndef _GLOB_H_
+#define _GLOB_H_
+
+/* CYGNUS LOCAL: end */
+
+#include <sys/cdefs.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+typedef struct {
+ int gl_pathc; /* Count of total paths so far. */
+ int gl_matchc; /* Count of paths matching pattern. */
+ int gl_offs; /* Reserved at beginning of gl_pathv. */
+ int gl_flags; /* Copy of flags parameter to glob. */
+ char **gl_pathv; /* List of paths matching pattern. */
+ /* Copy of errfunc parameter to glob. */
+ int (*gl_errfunc) __P((const char *, int));
+
+ /*
+ * Alternate filesystem access methods for glob; replacement
+ * versions of closedir(3), readdir(3), opendir(3), stat(2)
+ * and lstat(2).
+ */
+ void (*gl_closedir) __P((void *));
+ struct dirent *(*gl_readdir) __P((void *));
+ void *(*gl_opendir) __P((const char *));
+#ifdef __LIBC12_SOURCE__
+ int (*gl_lstat) __P((const char *, struct stat12 *));
+ int (*gl_stat) __P((const char *, struct stat12 *));
+#else
+ int (*gl_lstat) __P((const char *, struct stat *));
+ int (*gl_stat) __P((const char *, struct stat *));
+#endif
+} glob_t;
+
+#define GLOB_APPEND 0x0001 /* Append to output from previous call. */
+#define GLOB_DOOFFS 0x0002 /* Use gl_offs. */
+#define GLOB_ERR 0x0004 /* Return on error. */
+#define GLOB_MARK 0x0008 /* Append / to matching directories. */
+#define GLOB_NOCHECK 0x0010 /* Return pattern itself if nothing matches. */
+#define GLOB_NOSORT 0x0020 /* Don't sort. */
+
+#ifndef _POSIX_SOURCE
+#define GLOB_ALTDIRFUNC 0x0040 /* Use alternately specified directory funcs. */
+#define GLOB_BRACE 0x0080 /* Expand braces ala csh. */
+#define GLOB_MAGCHAR 0x0100 /* Pattern had globbing characters. */
+#define GLOB_NOMAGIC 0x0200 /* GLOB_NOCHECK without magic chars (csh). */
+#define GLOB_QUOTE 0x0400 /* Quote special chars with \. */
+#define GLOB_TILDE 0x0800 /* Expand tilde names from the passwd file. */
+#endif
+
+#define GLOB_NOSPACE (-1) /* Malloc call failed. */
+#define GLOB_ABEND (-2) /* Unignored error. */
+
+__BEGIN_DECLS
+/* CYGNUS LOCAL: normal protos */
+
+#undef DLLEXPORT
+#ifdef __INSIDE_CYGWIN__
+# define DLLEXPORT
+#else
+# define DLLEXPORT __declspec(dllimport)
+#endif
+int DLLEXPORT glob(const char *, int, int (*)(const char *, int), glob_t *);
+void DLLEXPORT globfree(glob_t *);
+
+#undef DLLEXPORT
+/* end CYGNUS LOCAL */
+__END_DECLS
+
+#endif /* !_GLOB_H_ */
diff --git a/winsup/cygwin/include/icmp.h b/winsup/cygwin/include/icmp.h
new file mode 100644
index 000000000..7e7aedccd
--- /dev/null
+++ b/winsup/cygwin/include/icmp.h
@@ -0,0 +1 @@
+/* icmp.h */
diff --git a/winsup/cygwin/include/io.h b/winsup/cygwin/include/io.h
new file mode 100644
index 000000000..e757816b3
--- /dev/null
+++ b/winsup/cygwin/include/io.h
@@ -0,0 +1,28 @@
+/* io.h
+
+ Copyright 1999, 2000 Cygnus Solutions.
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#ifndef _IO_H_
+#define _IO_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/*
+ * Function to return a Win32 HANDLE from a fd.
+ */
+extern long get_osfhandle(int);
+extern int setmode (int __fd, int __mode);
+
+#ifdef __cplusplus
+};
+#endif /* __cplusplus */
+
+#endif /* _IO_H_ */
diff --git a/winsup/cygwin/include/lastlog.h b/winsup/cygwin/include/lastlog.h
new file mode 100644
index 000000000..4a5a8f87f
--- /dev/null
+++ b/winsup/cygwin/include/lastlog.h
@@ -0,0 +1,12 @@
+#ifndef _LASTLOG_H
+#define _LASTLOG_H
+
+#include <utmp.h>
+
+struct lastlog {
+ long ll_time;
+ char ll_line[UT_LINESIZE];
+ char ll_host[UT_HOSTSIZE];
+};
+
+#endif
diff --git a/winsup/cygwin/include/limits.h b/winsup/cygwin/include/limits.h
new file mode 100644
index 000000000..397ba2030
--- /dev/null
+++ b/winsup/cygwin/include/limits.h
@@ -0,0 +1,144 @@
+/* limits.h
+
+ Copyright 1999, 2000 Cygnus Solutions.
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#ifndef _LIMITS_H___
+#ifndef _MACH_MACHLIMITS_H_
+
+/* _MACH_MACHLIMITS_H_ is used on OSF/1. */
+#define _LIMITS_H___
+#define _MACH_MACHLIMITS_H_
+
+/* Number of bits in a `char'. */
+#undef CHAR_BIT
+#define CHAR_BIT 8
+
+/* Maximum length of a multibyte character. */
+#ifndef MB_LEN_MAX
+#define MB_LEN_MAX 1
+#endif
+
+/* Minimum and maximum values a `signed char' can hold. */
+#undef SCHAR_MIN
+#define SCHAR_MIN (-128)
+#undef SCHAR_MAX
+#define SCHAR_MAX 127
+
+/* Maximum value an `unsigned char' can hold. (Minimum is 0). */
+#undef UCHAR_MAX
+#define UCHAR_MAX 255
+
+/* Minimum and maximum values a `char' can hold. */
+#ifdef __CHAR_UNSIGNED__
+#undef CHAR_MIN
+#define CHAR_MIN 0
+#undef CHAR_MAX
+#define CHAR_MAX 255
+#else
+#undef CHAR_MIN
+#define CHAR_MIN (-128)
+#undef CHAR_MAX
+#define CHAR_MAX 127
+#endif
+
+/* Minimum and maximum values a `signed short int' can hold. */
+#undef SHRT_MIN
+#define SHRT_MIN (-32768)
+#undef SHRT_MAX
+#define SHRT_MAX 32767
+
+/* Maximum value an `unsigned short int' can hold. (Minimum is 0). */
+#undef USHRT_MAX
+#define USHRT_MAX 65535
+
+/* Minimum and maximum values a `signed int' can hold. */
+#ifndef __INT_MAX__
+#define __INT_MAX__ 2147483647
+#endif
+#undef INT_MIN
+#define INT_MIN (-INT_MAX-1)
+#undef INT_MAX
+#define INT_MAX __INT_MAX__
+
+/* Maximum value an `unsigned int' can hold. (Minimum is 0). */
+#undef UINT_MAX
+#define UINT_MAX (INT_MAX * 2U + 1)
+
+/* Minimum and maximum values a `signed long int' can hold.
+ (Same as `int'). */
+#ifndef __LONG_MAX__
+#ifndef __alpha__
+#define __LONG_MAX__ 2147483647L
+#else
+#define __LONG_MAX__ 9223372036854775807L
+# endif /* __alpha__ */
+#endif
+#undef LONG_MIN
+#define LONG_MIN (-LONG_MAX-1)
+#undef LONG_MAX
+#define LONG_MAX __LONG_MAX__
+
+/* Maximum value an `unsigned long int' can hold. (Minimum is 0). */
+#undef ULONG_MAX
+#define ULONG_MAX (LONG_MAX * 2UL + 1)
+
+#if defined (__GNU_LIBRARY__) ? defined (__USE_GNU) : !defined (__STRICT_ANSI__)
+/* Minimum and maximum values a `signed long long int' can hold. */
+#ifndef __LONG_LONG_MAX__
+#define __LONG_LONG_MAX__ 9223372036854775807LL
+#endif
+#undef LONG_LONG_MIN
+#define LONG_LONG_MIN (-LONG_LONG_MAX-1)
+#undef LONG_LONG_MAX
+#define LONG_LONG_MAX __LONG_LONG_MAX__
+
+/* Maximum value an `unsigned long long int' can hold. (Minimum is 0). */
+#undef ULONG_LONG_MAX
+#define ULONG_LONG_MAX (LONG_LONG_MAX * 2ULL + 1)
+#endif
+
+/* Maximum number of iovcnt in a writev */
+#undef IOV_MAX
+#define IOV_MAX (__INT_MAX__-1)
+
+/* Maximum size of ssize_t */
+#undef SSIZE_MAX
+#define SSIZE_MAX (__LONG_MAX__)
+
+/* Maximum length of a path */
+#define PATH_MAX (260 - 1 /*NUL*/)
+
+/* Max num groups for a user, value taken from NT documentation */
+/* Must match <sys/param.h> NGROUPS */
+#define NGROUPS_MAX 16
+
+/* WaitForMultipleObjects can't handle waiting for more than 64 objects.
+ This limits how many children we can fork/spawn off. */
+#define CHILD_MAX 63
+
+/* POSIX values */
+/* These should never vary from one system type to another */
+/* They represent the minimum values that POSIX systems must support.
+ POSIX-conforming apps must not require larger values. */
+#define _POSIX_ARG_MAX 4096
+#define _POSIX_CHILD_MAX 6
+#define _POSIX_LINK_MAX 8
+#define _POSIX_MAX_CANON 255
+#define _POSIX_MAX_INPUT 255
+#define _POSIX_NAME_MAX 14
+#define _POSIX_NGROUPS_MAX 0
+#define _POSIX_OPEN_MAX 16
+#define _POSIX_PATH_MAX 255
+#define _POSIX_PIPE_BUF 512
+#define _POSIX_SSIZE_MAX 32767
+#define _POSIX_STREAM_MAX 8
+#define _POSIX_TZNAME_MAX 3
+
+#endif /* _MACH_MACHLIMITS_H_ */
+#endif /* _LIMITS_H___ */
diff --git a/winsup/cygwin/include/mapi.h b/winsup/cygwin/include/mapi.h
new file mode 100644
index 000000000..5e1769f1d
--- /dev/null
+++ b/winsup/cygwin/include/mapi.h
@@ -0,0 +1,102 @@
+/* mapi.h
+
+ Copyright 1997, 1998 Cygnus Solutions.
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#ifndef _MAPI_H
+#define _MAPI_H
+
+/* Currently this doesn't include all the definitions. It does cover
+ the parts of Simple MAPI required to send mail. */
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+ /* FIXME: should this be elsewhere? */
+typedef unsigned long FLAGS;
+
+ /* FIXME: should this be elsewhere? */
+#define SUCCESS_SUCCESS 0
+
+ /* FIXME: should this be elsewhere? */
+typedef unsigned long LHANDLE, FAR *LPLHANDLE;
+
+
+#define MAPI_E_AMBIGUOUS_RECIPIENT 0x15
+#define MAPI_E_ATTACHMENT_NOT_FOUND 0xb
+#define MAPI_E_ATTACHMENT_OPEN_FAILURE 0xc
+#define MAPI_E_BAD_RECIPTYPE 0xf
+#define MAPI_E_FAILURE 0x2
+#define MAPI_E_INSUFFICIENT_MEMORY 0x5
+#define MAPI_E_INVALID_RECIPS 0x19
+#define MAPI_E_LOGIN_FAILURE 0x3
+#define MAPI_E_TEXT_TOO_LARGE 0x12
+#define MAPI_E_TOO_MANY_FILES 0x9
+#define MAPI_E_TOO_MANY_RECIPIENTS 0xa
+#define MAPI_E_UNKNOWN_RECIPIENT 0xe
+#define MAPI_E_USER_ABORT 0x1
+#define MAPI_E_TEXT_TOO_LARGE 0x12
+#define MAPI_DIALOG 0x8
+#define MAPI_NEW_SESSION 0x2
+#define MAPI_LOGON_UI 0x1
+#define MAPI_RECEIPT_REQUESTED 0x2
+#define MAPI_SENT 0x4
+#define MAPI_UNREAD 0x1
+#define MAPI_OLE 0x1
+#define MAPI_OLE_STATIC 0x2
+
+#define MAPI_ORIG 0
+#define MAPI_TO 1
+#define MAPI_CC 2
+#define MAPI_BCC 3
+
+typedef struct
+{
+ ULONG ulReserved;
+ ULONG flFlags;
+ ULONG nPosition;
+ LPTSTR lpszPathName;
+ LPTSTR lpszFileName;
+ LPVOID lpFileType;
+} MapiFileDesc, FAR *lpMapiFileDesc;
+
+typedef struct
+{
+ ULONG ulReserved;
+ ULONG ulRecipClass;
+ LPTSTR lpszName;
+ LPTSTR lpszAddress;
+ ULONG ulEIDSize;
+ LPVOID lpEntryID;
+} MapiRecipDesc, FAR *lpMapiRecipDesc;
+
+typedef struct
+{
+ ULONG ulReserved;
+ LPTSTR lpszSubject;
+ LPTSTR lpszNoteText;
+ LPTSTR lpszMessageType;
+ LPTSTR lpszDateReceived;
+ LPTSTR lpszConversationID;
+ FLAGS flFlags;
+ lpMapiRecipDesc lpOriginator;
+ ULONG nRecipCount;
+ lpMapiRecipDesc lpRecips;
+ ULONG nFileCount;
+ lpMapiFileDesc lpFiles;
+} MapiMessage, FAR *lpMapiMessage;
+
+ULONG FAR PASCAL MAPISendMail (LHANDLE, ULONG, lpMapiMessage, FLAGS, ULONG);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _MAPI_H */
diff --git a/winsup/cygwin/include/memory.h b/winsup/cygwin/include/memory.h
new file mode 100644
index 000000000..dd2bd6cbf
--- /dev/null
+++ b/winsup/cygwin/include/memory.h
@@ -0,0 +1,7 @@
+#ifndef _MEMORY_H
+#define _MEMORY_H
+
+/* This allows more things to compile. */
+#include <string.h>
+
+#endif /* _MEMORY_H */
diff --git a/winsup/cygwin/include/mntent.h b/winsup/cygwin/include/mntent.h
new file mode 100644
index 000000000..0f0580a8e
--- /dev/null
+++ b/winsup/cygwin/include/mntent.h
@@ -0,0 +1,35 @@
+#ifndef _MNTENT_H
+#define _MNTENT_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct mntent
+{
+ char *mnt_fsname;
+ char *mnt_dir;
+ char *mnt_type;
+ char *mnt_opts;
+ int mnt_freq;
+ int mnt_passno;
+};
+
+FILE *setmntent (const char *__filep, const char *__type);
+struct mntent *getmntent (FILE *__filep);
+int addmntent (FILE *__filep, const struct mntent *__mnt);
+int endmntent (FILE *__filep);
+char *hasmntopt (const struct mntent *__mnt, const char *__opt);
+
+/* This next file doesn't exist, it is in the registry,
+ however applications need the define to pass to
+ the above calls.
+*/
+#ifndef MOUNTED
+#define MOUNTED "/etc/mtab"
+#endif
+#ifdef __cplusplus
+};
+#endif
+
+#endif /* _MNTENT_H */
diff --git a/winsup/cygwin/include/net/if.h b/winsup/cygwin/include/net/if.h
new file mode 100644
index 000000000..b7df5264e
--- /dev/null
+++ b/winsup/cygwin/include/net/if.h
@@ -0,0 +1,6 @@
+#ifndef _NET_IF_H
+#define _NET_IF_H
+
+#include <cygwin/if.h>
+
+#endif /* _NET_IF_H */
diff --git a/winsup/cygwin/include/netdb.h b/winsup/cygwin/include/netdb.h
new file mode 100644
index 000000000..d1acc5e0a
--- /dev/null
+++ b/winsup/cygwin/include/netdb.h
@@ -0,0 +1,167 @@
+/* Original linux netdb.h merged with winsock.h types */
+
+/*-
+ * Copyright (c) 1980, 1983, 1988, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * @(#)netdb.h 8.1 (Berkeley) 6/2/93
+ * netdb.h,v 1.1.1.1 1995/02/18 05:34:07 hjl Exp
+ * -
+ * Portions Copyright (c) 1993 by Digital Equipment Corporation.
+ *
+ * Permission to use, copy, modify and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies, and that
+ * the name of Digital Equipment Corporation not be used in advertising or
+ * publicity pertaining to distribution of the document or software without
+ * specific, written prior permission.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
+ * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT
+ * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
+ * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
+ * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+ * SOFTWARE.
+ * -
+ * --Copyright--
+ */
+
+#ifndef _NETDB_H_
+#define _NETDB_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Structures returned by network data base library. All addresses are
+ * supplied in host order, and returned in network order (suitable for
+ * use in system calls).
+ */
+
+ /* Different from the linux versions - note the shorts.. */
+struct hostent {
+ const char *h_name; /* official name of host */
+ char **h_aliases; /* alias list */
+ short h_addrtype; /* host address type */
+ short h_length; /* length of address */
+ char **h_addr_list; /* list of addresses from name server */
+#define h_addr h_addr_list[0] /* address, for backward compatiblity */
+};
+
+/*
+ * Assumption here is that a network number
+ * fits in an unsigned long -- probably a poor one.
+ */
+
+struct netent {
+ char *n_name; /* official name of net */
+ char **n_aliases; /* alias list */
+ short n_addrtype; /* net address type */
+ unsigned long n_net; /* network # */
+};
+
+struct servent {
+ char *s_name; /* official service name */
+ char **s_aliases; /* alias list */
+ short s_port; /* port # */
+ char *s_proto; /* protocol to use */
+};
+
+struct protoent
+{
+ char *p_name; /* official protocol name */
+ char **p_aliases; /* alias list */
+ short p_proto; /* protocol # */
+};
+
+struct rpcent {
+ char *r_name; /* name of server for this rpc program */
+ char **r_aliases; /* alias list */
+ int r_number; /* rpc program number */
+};
+
+/*
+ * Error return codes from gethostbyname() and gethostbyaddr()
+ * (left in extern int h_errno).
+ */
+
+#ifdef __INSIDE_CYGWIN_NET__
+extern int h_errno;
+#else
+extern __declspec(dllimport) int h_errno;
+#endif
+
+#define NETDB_INTERNAL -1 /* see errno */
+#define NETDB_SUCCESS 0 /* no problem */
+#define HOST_NOT_FOUND 1 /* Authoritative Answer Host not found */
+#define TRY_AGAIN 2 /* Non-Authoritive Host not found, or SERVERFAIL */
+#define NO_RECOVERY 3 /* Non recoverable errors, FORMERR, REFUSED, NOTIMP */
+#define NO_DATA 4 /* Valid name, no data record of requested type */
+#define NO_ADDRESS NO_DATA /* no address, look for MX record */
+
+#ifndef __INSIDE_CYGWIN_NET__
+void endhostent (void);
+void endnetent (void);
+void endprotoent (void);
+void endservent (void);
+void endrpcent (void);
+struct hostent *gethostbyaddr (const char *, int, int);
+struct hostent *gethostbyname (const char *);
+struct hostent *gethostent (void);
+struct netent *getnetbyaddr (long, int); /* u_long? */
+struct netent *getnetbyname (const char *);
+struct netent *getnetent (void);
+struct protoent *getprotobyname (const char *);
+struct protoent *getprotobynumber (int);
+struct protoent *getprotoent (void);
+struct servent *getservbyname (const char *, const char *);
+struct servent *getservbyport (int, const char *);
+struct servent *getservent (void);
+struct rpcent *getrpcent (void);
+struct rpcent *getrpcbyname (const char *);
+struct rpcent *getrpcbynumber (int);
+void herror (const char *);
+void sethostent (int);
+void setnetent (int);
+void setprotoent (int);
+void setservent (int);
+void setrpcent (int);
+#endif
+
+#ifdef __cplusplus
+};
+#endif
+
+#endif /* !_NETDB_H_ */
+
diff --git a/winsup/cygwin/include/netinet/in.h b/winsup/cygwin/include/netinet/in.h
new file mode 100644
index 000000000..8536f551e
--- /dev/null
+++ b/winsup/cygwin/include/netinet/in.h
@@ -0,0 +1,6 @@
+#ifndef _NETINET_IN_H
+#define _NETINET_IN_H
+
+#include <cygwin/in.h>
+
+#endif /* _NETINET_IN_H */
diff --git a/winsup/cygwin/include/netinet/ip.h b/winsup/cygwin/include/netinet/ip.h
new file mode 100644
index 000000000..f50d7da2b
--- /dev/null
+++ b/winsup/cygwin/include/netinet/ip.h
@@ -0,0 +1,6 @@
+#ifndef _NETINET_IP_H
+#define _NETINET_IP_H
+
+#include <cygwin/ip.h>
+
+#endif /* _NETINET_IP_H */
diff --git a/winsup/cygwin/include/netinet/ip_icmp.h b/winsup/cygwin/include/netinet/ip_icmp.h
new file mode 100644
index 000000000..547a03a85
--- /dev/null
+++ b/winsup/cygwin/include/netinet/ip_icmp.h
@@ -0,0 +1,6 @@
+#ifndef _NETINET_IP_ICMP_H
+#define _NETINET_IP_ICMP_H
+
+#include <cygwin/icmp.h>
+
+#endif /* _NETINET_IP_ICMP_H */
diff --git a/winsup/cygwin/include/paths.h b/winsup/cygwin/include/paths.h
new file mode 100644
index 000000000..c4180873f
--- /dev/null
+++ b/winsup/cygwin/include/paths.h
@@ -0,0 +1,9 @@
+#ifndef _PATHS_H_
+#define _PATHS_H_
+
+#define _PATH_DEV "/dev/"
+#define _PATH_BSHELL "/bin/sh"
+#define _PATH_LASTLOG "/var/log/lastlog"
+#define _PATH_UTMP "/var/run/utmp"
+#define _PATH_WTMP "/var/log/wtmp"
+#endif /* _PATHS_H_ */
diff --git a/winsup/cygwin/include/pthread.h b/winsup/cygwin/include/pthread.h
new file mode 100644
index 000000000..4826e0897
--- /dev/null
+++ b/winsup/cygwin/include/pthread.h
@@ -0,0 +1,92 @@
+/* pthread.h: POSIX pthread interface
+
+ Copyright 1996, 1997, 1998 Cygnus Solutions.
+
+ Written by Marco Fuykschot <marco@ddi.nl>
+
+ This file is part of Cygwin.
+
+ This software is a copyrighted work licensed under the terms of the
+ Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+ details. */
+
+#include <sys/types.h>
+#include <signal.h>
+
+#ifndef _PTHREAD_H
+#define _PTHREAD_H
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#define TFD(n) void*(*n)(void*)
+
+typedef int pthread_t;
+typedef int pthread_mutex_t;
+typedef int sem_t;
+
+typedef struct pthread_key
+ {
+ }
+pthread_key_t;
+
+typedef struct pthread_attr
+ {
+ size_t stacksize;
+ }
+pthread_attr_t;
+
+typedef struct pthread_mutexattr
+ {
+ }
+pthread_mutexattr_t;
+
+/* ThreadCreation */
+int pthread_create (pthread_t * thread, const pthread_attr_t * attr, TFD (function), void *arg);
+int pthread_attr_init (pthread_attr_t * attr);
+int pthread_attr_destroy (pthread_attr_t * attr);
+int pthread_attr_setstacksize (pthread_attr_t * attr, size_t size);
+int pthread_attr_getstacksize (pthread_attr_t * attr, size_t * size);
+/*
+ pthread_attr_setstackaddr(...);
+ pthread_attr_getstackaddr(...);
+*/
+
+/* Thread Exit */
+int pthread_exit (void *value_ptr);
+
+/* Thread SpecificData */
+int pthread_key_create (pthread_key_t * key);
+int pthread_key_delete (pthread_key_t * key);
+int pthread_setspecific (pthread_key_t * key, const void *value);
+void *pthread_getspecific (pthread_key_t * key);
+
+/* Thread signal */
+int pthread_kill (pthread_t * thread, int sig);
+int pthread_sigmask (int operation, const sigset_t * set, sigset_t * old_set);
+
+/* ID */
+pthread_t pthread_self ();
+int pthread_equal (pthread_t t1, pthread_t t2);
+
+/* Mutexes */
+int pthread_mutex_init (pthread_mutex_t * mutex, const pthread_mutexattr_t *);
+int pthread_mutex_lock (pthread_mutex_t * mutext);
+int pthread_mutex_trylock (pthread_mutex_t * mutext);
+int pthread_mutex_unlock (pthread_mutex_t * mutext);
+int pthread_mutex_destroy (pthread_mutex_t * mutext);
+
+/* Solaris Semaphores */
+int sem_init (sem_t * sem, int pshared, unsigned int value);
+int sem_destroy (sem_t * sem);
+int sem_wait (sem_t * sem);
+int sem_trywait (sem_t * sem);
+int sem_post (sem_t * sem);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _PTHREAD_H */
diff --git a/winsup/cygwin/include/strings.h b/winsup/cygwin/include/strings.h
new file mode 100644
index 000000000..e9d2839f2
--- /dev/null
+++ b/winsup/cygwin/include/strings.h
@@ -0,0 +1,6 @@
+#ifndef _STRINGS_H
+#define _STRINGS_H
+
+#include <string.h>
+
+#endif /* _STRINGS_H */
diff --git a/winsup/cygwin/include/sys/acl.h b/winsup/cygwin/include/sys/acl.h
new file mode 100644
index 000000000..3fbef06da
--- /dev/null
+++ b/winsup/cygwin/include/sys/acl.h
@@ -0,0 +1,17 @@
+/* sys/acl.h header file for Cygwin.
+
+ Copyright 1999, 2000 Cygnus Solutions.
+ Written by C. Vinschen.
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#ifndef _SYS_ACL_H
+#define _SYS_ACL_H
+
+#include <cygwin/acl.h>
+
+#endif /* _SYS_ACL_H */
diff --git a/winsup/cygwin/include/sys/cdefs.h b/winsup/cygwin/include/sys/cdefs.h
new file mode 100644
index 000000000..bb99f7d0b
--- /dev/null
+++ b/winsup/cygwin/include/sys/cdefs.h
@@ -0,0 +1,12 @@
+#ifndef _SYS_CDEFS_H
+#define _SYS_CDEFS_H
+#ifdef __cplusplus
+#define __BEGIN_DECLS extern "C" {
+#define __END_DECLS }
+#else
+#define __BEGIN_DECLS
+#define __END_DECLS
+#endif
+#define __P(protos) protos /* full-blown ANSI C */
+#endif
+
diff --git a/winsup/cygwin/include/sys/copying.dj b/winsup/cygwin/include/sys/copying.dj
new file mode 100644
index 000000000..7d048f70d
--- /dev/null
+++ b/winsup/cygwin/include/sys/copying.dj
@@ -0,0 +1,41 @@
+This is the file "copying.dj". It does not apply to any sources
+copyrighted by UCB Berkeley or the Free Software Foundation.
+
+ Copyright Information for sources and executables that are marked
+ Copyright (C) DJ Delorie
+ 24 Kirsten Ave
+ Rochester NH 03867-2954
+
+This document is Copyright (C) DJ Delorie and may be distributed
+verbatim, but changing it is not allowed.
+
+Source code copyright DJ Delorie is distributed under the terms of the
+GNU General Public Licence, with the following exceptions:
+
+* Any existing copyright or authorship information in any given source
+file must remain intact. If you modify a source file, a notice to that
+effect must be added to the authorship information in the source file.
+
+* binaries provided in djgpp may be distributed without sources ONLY if
+the recipient is given sufficient information to obtain a copy of djgpp
+themselves. This primarily applies to go32.exe, emu387, stub.exe, and
+the graphics drivers.
+
+* modified versions of the binaries provided in djgpp must be
+distributed under the terms of the GPL.
+
+* objects and libraries linked into an application may be distributed
+without sources.
+
+-----
+
+Changes to source code copyright BSD or FSF are copyright DJ Delorie, but
+fall under the terms of the original copyright.
+
+A copy of the file "COPYING" is included with this document. If you did not
+receive a copy of "COPYING", you may obtain one from whence this document
+was obtained, or by writing:
+ Free Software Foundation
+ 675 Mass Ave
+ Cambridge, MA 02139
+ USA
diff --git a/winsup/cygwin/include/sys/cygwin.h b/winsup/cygwin/include/sys/cygwin.h
new file mode 100644
index 000000000..3a3dd6e9b
--- /dev/null
+++ b/winsup/cygwin/include/sys/cygwin.h
@@ -0,0 +1,44 @@
+#ifndef _SYS_CYGWIN_H
+#define _SYS_CYGWIN_H
+
+#include <sys/types.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern pid_t cygwin32_winpid_to_pid (int);
+extern void cygwin32_win32_to_posix_path_list (const char *, char *);
+extern int cygwin32_win32_to_posix_path_list_buf_size (const char *);
+extern void cygwin32_posix_to_win32_path_list (const char *, char *);
+extern int cygwin32_posix_to_win32_path_list_buf_size (const char *);
+extern int cygwin32_conv_to_win32_path (const char *, char *);
+extern int cygwin32_conv_to_full_win32_path (const char *, char *);
+extern void cygwin32_conv_to_posix_path (const char *, char *);
+extern void cygwin32_conv_to_full_posix_path (const char *, char *);
+extern int cygwin32_posix_path_list_p (const char *);
+extern void cygwin32_split_path (const char *, char *, char *);
+
+extern pid_t cygwin_winpid_to_pid (int);
+extern int cygwin_win32_to_posix_path_list (const char *, char *);
+extern int cygwin_win32_to_posix_path_list_buf_size (const char *);
+extern int cygwin_posix_to_win32_path_list (const char *, char *);
+extern int cygwin_posix_to_win32_path_list_buf_size (const char *);
+extern int cygwin_conv_to_win32_path (const char *, char *);
+extern int cygwin_conv_to_full_win32_path (const char *, char *);
+extern int cygwin_conv_to_posix_path (const char *, char *);
+extern int cygwin_conv_to_full_posix_path (const char *, char *);
+extern int cygwin_posix_path_list_p (const char *);
+extern void cygwin_split_path (const char *, char *, char *);
+
+#ifdef _GNU_H_WINDOWS32_BASE
+/* included if <windows.h> is included */
+extern int cygwin32_attach_handle_to_fd (char *, int, HANDLE, int, int);
+extern int cygwin_attach_handle_to_fd (char *, int, HANDLE, mode_t, unsigned);
+#endif
+
+#ifdef __cplusplus
+};
+#endif
+
+#endif /* _SYS_CYGWIN_H */
diff --git a/winsup/cygwin/include/sys/file.h b/winsup/cygwin/include/sys/file.h
new file mode 100644
index 000000000..79f5f65f5
--- /dev/null
+++ b/winsup/cygwin/include/sys/file.h
@@ -0,0 +1,31 @@
+/* This is file FILE.H */
+/*
+** Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954
+**
+** This file is distributed under the terms listed in the document
+** "copying.dj", available from DJ Delorie at the address above.
+** A copy of "copying.dj" should accompany this file; if not, a copy
+** should be available from where this file was obtained. This file
+** may not be distributed without a verbatim copy of "copying.dj".
+**
+** This file is distributed WITHOUT ANY WARRANTY; without even the implied
+** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+*/
+
+#ifndef _FILE_H_
+#define _FILE_H_
+
+#include <fcntl.h>
+
+#define L_SET 0
+#define L_CURR 1
+#define L_INCR 1
+#define L_XTND 2
+
+
+#define F_OK 0 /* does file exist */
+#define X_OK 1 /* is it executable by caller */
+#define W_OK 2 /* is it writable by caller */
+#define R_OK 4 /* is it readable by caller */
+
+#endif
diff --git a/winsup/cygwin/include/sys/ioctl.h b/winsup/cygwin/include/sys/ioctl.h
new file mode 100644
index 000000000..8164de85e
--- /dev/null
+++ b/winsup/cygwin/include/sys/ioctl.h
@@ -0,0 +1,20 @@
+/* sys/ioctl.h */
+
+#ifndef _SYS_IOCTL_H
+#define _SYS_IOCTL_H
+
+#include <sys/cdefs.h>
+
+/* /dev/windows ioctls */
+
+#define WINDOWS_POST 0 /* Set write() behavior to PostMessage() */
+#define WINDOWS_SEND 1 /* Set write() behavior to SendMessage() */
+#define WINDOWS_HWND 2 /* Set hWnd for read() calls */
+
+__BEGIN_DECLS
+
+int ioctl (int __fd, int __cmd, void *);
+
+__END_DECLS
+
+#endif
diff --git a/winsup/cygwin/include/sys/mman.h b/winsup/cygwin/include/sys/mman.h
new file mode 100644
index 000000000..9f36bc323
--- /dev/null
+++ b/winsup/cygwin/include/sys/mman.h
@@ -0,0 +1,40 @@
+#ifndef _SYS_MMAN_H_
+#define _SYS_MMAN_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+#include <stddef.h>
+#include <sys/types.h>
+
+#define PROT_NONE 0
+#define PROT_READ 1
+#define PROT_WRITE 2
+#define PROT_EXEC 4
+
+#define MAP_FILE 0
+#define MAP_SHARED 1
+#define MAP_PRIVATE 2
+#define MAP_TYPE 0xF
+#define MAP_FIXED 0x10
+#define MAP_ANONYMOUS 0x20
+#define MAP_ANON MAP_ANONYMOUS
+
+/*
+ * Flags for msync.
+ */
+#define MS_ASYNC 1
+#define MS_SYNC 2
+#define MS_INVALIDATE 4
+
+extern caddr_t mmap (caddr_t __addr, size_t __len, int __prot, int __flags, int __fd, off_t __off);
+extern int munmap (caddr_t __addr, size_t __len);
+extern int mprotect (caddr_t __addr, size_t __len, int __prot);
+extern int msync (caddr_t __addr, size_t __len, int __flags);
+
+#ifdef __cplusplus
+};
+#endif /* __cplusplus */
+
+#endif /* _SYS_MMAN_H_ */
diff --git a/winsup/cygwin/include/sys/mount.h b/winsup/cygwin/include/sys/mount.h
new file mode 100644
index 000000000..2c4ad30a3
--- /dev/null
+++ b/winsup/cygwin/include/sys/mount.h
@@ -0,0 +1,25 @@
+#ifndef _SYS_MOUNT_H
+#define _SYS_MOUNT_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+enum
+ {
+ /* MOUNT_SYMLINK = 1, place holder. Do not use it. */
+ MOUNT_BINARY = 2, /* "binary" format read/writes */
+ MOUNT_SYSTEM = 8, /* mount point came from system table */
+ MOUNT_EXEC = 16, /* Any file in the mounted directory gets 'x' bit */
+ MOUNT_AUTO = 32 /* mount point refers to auto device mount */
+ };
+
+int mount (const char *, const char *, unsigned __flags);
+int umount (const char *);
+int cygwin_umount (const char *__path, unsigned __flags);
+
+#ifdef __cplusplus
+};
+#endif
+
+#endif /* _SYS_MOUNT_H */
diff --git a/winsup/cygwin/include/sys/mtio.h b/winsup/cygwin/include/sys/mtio.h
new file mode 100644
index 000000000..e21e4fff5
--- /dev/null
+++ b/winsup/cygwin/include/sys/mtio.h
@@ -0,0 +1,11 @@
+/*
+ * sys/mtio.h header file for Cygwin.
+ *
+ */
+
+#ifndef _SYS_MTIO_H
+#define _SYS_MTIO_H
+
+#include <cygwin/mtio.h>
+
+#endif /* _SYS_MTIO_H */
diff --git a/winsup/cygwin/include/sys/resource.h b/winsup/cygwin/include/sys/resource.h
new file mode 100644
index 000000000..42907bc7b
--- /dev/null
+++ b/winsup/cygwin/include/sys/resource.h
@@ -0,0 +1,40 @@
+#ifndef _SYS_RESOURCE_H_
+#define _SYS_RESOURCE_H_
+
+#include <sys/time.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define RUSAGE_SELF 0 /* calling process */
+#define RUSAGE_CHILDREN -1 /* terminated child processes */
+
+struct rusage {
+ struct timeval ru_utime; /* user time used */
+ struct timeval ru_stime; /* system time used */
+ long ru_maxrss;
+ long ru_ixrss; /* XXX: 0 */
+ long ru_idrss; /* XXX: sum of rm_asrss */
+ long ru_isrss; /* XXX: 0 */
+ long ru_minflt; /* any page faults not requiring I/O */
+ long ru_majflt; /* any page faults requiring I/O */
+ long ru_nswap; /* swaps */
+ long ru_inblock; /* block input operations */
+ long ru_oublock; /* block output operations */
+ long ru_msgsnd; /* messages sent */
+ long ru_msgrcv; /* messages received */
+ long ru_nsignals; /* signals received */
+ long ru_nvcsw; /* voluntary context switches */
+ long ru_nivcsw; /* involuntary " */
+#define ru_last ru_nivcsw
+};
+
+int getrusage (int __who, struct rusage *__rusage);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
diff --git a/winsup/cygwin/include/sys/select.h b/winsup/cygwin/include/sys/select.h
new file mode 100644
index 000000000..d4e811437
--- /dev/null
+++ b/winsup/cygwin/include/sys/select.h
@@ -0,0 +1,35 @@
+/* select.h
+ Copyright 1998 Cygnus Solutions.
+
+ Written by Geoffrey Noer <noer@cygnus.com>
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#ifndef _SYS_SELECT_H
+#define _SYS_SELECT_H
+
+#if !defined (_POSIX_SOURCE) && !defined (__INSIDE_CYGWIN_NET__)
+
+#include <sys/cdefs.h>
+
+/* Get fd_set, and macros like FD_SET */
+#include <sys/types.h>
+
+/* Get definition of timeval. */
+#include <sys/time.h>
+#include <time.h>
+
+__BEGIN_DECLS
+
+int select __P ((int __n, fd_set *__readfds, fd_set *__writefds,
+ fd_set *__exceptfds, struct timeval *__timeout));
+
+__END_DECLS
+
+#endif /* !_POSIX_SOURCE, !__INSIDE_CYGWIN_NET__ */
+
+#endif /* sys/select.h */
diff --git a/winsup/cygwin/include/sys/smallprint.h b/winsup/cygwin/include/sys/smallprint.h
new file mode 100644
index 000000000..617e12a8c
--- /dev/null
+++ b/winsup/cygwin/include/sys/smallprint.h
@@ -0,0 +1,17 @@
+#ifndef _SYS_SMALLPRINT_H
+#define _SYS_SMALLPRINT_H
+
+#include <stdarg.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+int __small_sprintf (char *__dst, const char *__fmt, ...);
+int __small_vsprintf (char *__dst, const char *__fmt, va_list __ap);
+
+#ifdef __cplusplus
+};
+#endif
+
+#endif /* _SYS_SMALLPRINT_H */
diff --git a/winsup/cygwin/include/sys/socket.h b/winsup/cygwin/include/sys/socket.h
new file mode 100644
index 000000000..13217a068
--- /dev/null
+++ b/winsup/cygwin/include/sys/socket.h
@@ -0,0 +1,38 @@
+#ifndef _SYS_SOCKET_H
+#define _SYS_SOCKET_H
+
+#include <features.h>
+#include <cygwin/socket.h>
+#include <sys/time.h>
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#ifndef __INSIDE_CYGWIN_NET__
+ int accept (int, struct sockaddr *__peer, int *);
+ int bind (int, struct sockaddr *__my_addr, int __addrlen);
+ int connect (int, const struct sockaddr *, int);
+ int getpeername (int, struct sockaddr *__peer, int *);
+ int getsockname (int, struct sockaddr *__addr, int *);
+ int listen (int, int __n);
+ int recv (int, void *__buff, int __len, unsigned int __flags);
+ int recvfrom (int, char *__buff, int __len, int __flags,
+ struct sockaddr *__from, int *__fromlen);
+ int send (int, const void *__buff, int __len, unsigned int __flags);
+ int sendto (int, const void *, int, unsigned int, const struct sockaddr *, int);
+ int setsockopt (int __s, int __level, int __optname, const void *optval, int __optlen);
+ int getsockopt (int __s, int __level, int __optname, void *__optval, int *__optlen);
+ int shutdown (int, int);
+ int socket (int __family, int __type, int __protocol);
+ int socketpair (int __domain, int __type, int __protocol, int *__socket_vec);
+
+ struct servent *getservbyname (const char *__name, const char *__proto);
+#endif
+
+#ifdef __cplusplus
+};
+#endif
+
+#endif /* _SYS_SOCKET_H */
diff --git a/winsup/cygwin/include/sys/strace.h b/winsup/cygwin/include/sys/strace.h
new file mode 100644
index 000000000..7ee509983
--- /dev/null
+++ b/winsup/cygwin/include/sys/strace.h
@@ -0,0 +1,96 @@
+/* sys/strace.h */
+
+/* This file contains routines for tracing system calls and other internal
+ phenomenon.
+
+ When tracing system calls, try to use the same style throughout:
+
+ result = syscall (arg1, arg2, arg3) [optional extra stuff]
+
+ If a system call can block (eg: read, write, wait), print another message
+ before hanging so the user will know why the program has stopped.
+
+ Note: __seterrno will also print a trace message. Have that printed
+ *first*. This will make it easy to always know what __seterrno is
+ refering to. For the same reason, try not to have __seterrno messages
+ printed alone.
+*/
+
+#ifndef _SYS_STRACE_H
+#define _SYS_STRACE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define _STRACE_INTERFACE_ACTIVATE_ADDR -1
+
+/* Bitmasks of tracing messages to print. */
+
+#define _STRACE_ALL 0x00001 // so behaviour of strace=1 is unchanged
+#define _STRACE_FLUSH 0x00002 // flush output buffer after every message
+#define _STRACE_INHERIT 0x00004 // children inherit mask from parent
+#define _STRACE_UHOH 0x00008 // unusual or weird phenomenon
+#define _STRACE_SYSCALL 0x00010 // system calls
+#define _STRACE_STARTUP 0x00020 // argc/envp printout at startup
+#define _STRACE_DEBUG 0x00040 // info to help debugging
+#define _STRACE_PARANOID 0x00080 // paranoid info
+#define _STRACE_TERMIOS 0x00100 // info for debugging termios stuff
+#define _STRACE_SELECT 0x00200 // info on ugly select internals
+#define _STRACE_WM 0x00400 // trace windows messages (enable _strace_wm)
+#define _STRACE_SIGP 0x00800 // trace signal and process handling
+#define _STRACE_MINIMAL 0x01000 // very minimal strace output
+#define _STRACE_EXITDUMP 0x04000 // dump strace cache on exit
+#define _STRACE_CACHE 0x08000 // cache strace messages
+#define _STRACE_NOMUTEX 0x10000 // don't use mutex for synchronization
+#define _STRACE_MALLOC 0x20000 // trace malloc calls
+#define _STRACE_THREAD 0x40000 // thread-locking calls
+#define _STRACE_NOTALL 0x80000 // don't include if _STRACE_ALL
+
+void small_printf (const char *, ...);
+
+#ifdef NOSTRACE
+#define strace_printf(category, fmt...) 0
+#define strace_printf_wrap(category, fmt...) 0
+#define strace_printf_wrap1(category, fmt...) 0
+#define strace_wm(category, msg...) 0
+#else
+/* Output message to strace log */
+void strace_printf (unsigned, const char *, ...);
+void __system_printf (const char *, ...);
+
+#define system_printf(fmt, args...) \
+ __system_printf("%F: " fmt, __PRETTY_FUNCTION__ , ## args)
+
+void _strace_wm (int __message, int __word, int __lon);
+
+#define strace_printf_wrap(what, fmt, args...) \
+ ((void) ({\
+ if (strace_active) \
+ strace_printf(_STRACE_ ## what, "%F: " fmt, __PRETTY_FUNCTION__ , ## args); \
+ 0; \
+ }))
+#define strace_printf_wrap1(what, fmt, args...) \
+ ((void) ({\
+ if (strace_active) \
+ strace_printf((_STRACE_ ## what) | _STRACE_NOTALL, "%F: " fmt, __PRETTY_FUNCTION__ , ## args); \
+ 0; \
+ }))
+#endif /*NOSTRACE*/
+
+#define debug_printf(fmt, args...) strace_printf_wrap(DEBUG, fmt , ## args)
+#define syscall_printf(fmt, args...) strace_printf_wrap(SYSCALL, fmt , ## args)
+#define paranoid_printf(fmt, args...) strace_printf_wrap(PARANOID, fmt , ## args)
+#define termios_printf(fmt, args...) strace_printf_wrap(TERMIOS, fmt , ## args)
+#define select_printf(fmt, args...) strace_printf_wrap(SELECT, fmt , ## args)
+#define wm_printf(fmt, args...) strace_printf_wrap(WM, fmt , ## args)
+#define sigproc_printf(fmt, args...) strace_printf_wrap(SIGP, fmt , ## args)
+#define minimal_printf(fmt, args...) strace_printf_wrap1(MINIMAL, fmt , ## args)
+#define malloc_printf(fmt, args...) strace_printf_wrap1(MALLOC, fmt , ## args)
+#define thread_printf(fmt, args...) strace_printf_wrap1(THREAD, fmt , ## args)
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SYS_STRACE_H */
diff --git a/winsup/cygwin/include/sys/syslog.h b/winsup/cygwin/include/sys/syslog.h
new file mode 100644
index 000000000..65c6688f2
--- /dev/null
+++ b/winsup/cygwin/include/sys/syslog.h
@@ -0,0 +1,73 @@
+#ifndef _SYS_LOG_H
+#define _SYS_LOG_H
+
+#include <sys/cdefs.h>
+#define LOG_EMERG 0
+#define LOG_ALERT 1
+#define LOG_CRIT 2
+#define LOG_ERR 3
+#define LOG_WARNING 4
+#define LOG_NOTICE 5
+#define LOG_INFO 6
+#define LOG_DEBUG 7
+
+#define LOG_PRIMASK 0x07
+
+#define LOG_PRI(p) ((p) & LOG_PRIMASK)
+#define LOG_MAKEPRI(fac, pri) (((fac) << 3) | (pri))
+
+#define LOG_KERN (0<<3)
+#define LOG_USER (1<<3)
+#define LOG_MAIL (2<<3)
+#define LOG_DAEMON (3<<3)
+#define LOG_AUTH (4<<3)
+#define LOG_SYSLOG (5<<3)
+#define LOG_LPR (6<<3)
+#define LOG_NEWS (7<<3)
+#define LOG_UUCP (8<<3)
+#define LOG_CRON (9<<3)
+#define LOG_AUTHPRIV (10<<3)
+#define LOG_FTP (11<<3)
+
+/* Codes through 15 are reserved for system use */
+#define LOG_LOCAL0 (16<<3)
+#define LOG_LOCAL1 (17<<3)
+#define LOG_LOCAL2 (18<<3)
+#define LOG_LOCAL3 (19<<3)
+#define LOG_LOCAL4 (20<<3)
+#define LOG_LOCAL5 (21<<3)
+#define LOG_LOCAL6 (22<<3)
+#define LOG_LOCAL7 (23<<3)
+
+#define LOG_NFACILITIES 24
+#define LOG_FACMASK 0x03f8
+#define LOG_FAC(p) (((p) & LOG_FACMASK) >> 3)
+
+#define LOG_MASK(pri) (1 << (pri))
+#define LOG_UPTO(pri) ((1 << ((pri)+1)) - 1)
+
+/*
+ * Option flags for openlog.
+ *
+ * LOG_ODELAY no longer does anything.
+ * LOG_NDELAY is the inverse of what it used to be.
+ */
+#define LOG_PID 0x01 /* log the pid with each message */
+#define LOG_CONS 0x02 /* log on the console if errors in sending */
+#define LOG_ODELAY 0x04 /* delay open until first syslog() (default) */
+#define LOG_NDELAY 0x08 /* don't delay open */
+#define LOG_NOWAIT 0x10 /* don't wait for console forks: DEPRECATED */
+#define LOG_PERROR 0x20 /* log to stderr as well */
+
+__BEGIN_DECLS
+
+
+void closelog (void);
+void openlog (const char *, int, int);
+int setlogmask (int);
+void syslog (int, const char *, ...);
+
+__END_DECLS
+
+
+#endif /* _SYS_LOG_H */
diff --git a/winsup/cygwin/include/sys/sysmacros.h b/winsup/cygwin/include/sys/sysmacros.h
new file mode 100644
index 000000000..ecf3a3ae7
--- /dev/null
+++ b/winsup/cygwin/include/sys/sysmacros.h
@@ -0,0 +1,8 @@
+#ifndef _SYS_SYSMACROS_H
+#define _SYS_SYSMACROS_H
+
+#define major(dev) ((int)(((dev) >> 8) & 0xff))
+#define minor(dev) ((int)((dev) & 0xff))
+#define makedev(major, minor) (((major) << 8) | (minor))
+
+#endif /* _SYS_SYSMACROS_H */
diff --git a/winsup/cygwin/include/sys/termio.h b/winsup/cygwin/include/sys/termio.h
new file mode 100644
index 000000000..75b815146
--- /dev/null
+++ b/winsup/cygwin/include/sys/termio.h
@@ -0,0 +1,2 @@
+#include <sys/termios.h>
+
diff --git a/winsup/cygwin/include/sys/termios.h b/winsup/cygwin/include/sys/termios.h
new file mode 100644
index 000000000..b0a242a33
--- /dev/null
+++ b/winsup/cygwin/include/sys/termios.h
@@ -0,0 +1,295 @@
+/* sys/termios.h */
+
+#ifndef _SYS_TERMIOS_H
+#define _SYS_TERMIOS_H
+
+#define TCOOFF 0
+#define TCOON 1
+#define TCIOFF 2
+#define TCION 3
+
+#define TCGETA 5
+#define TCSETA 6
+#define TCSETAW 7
+#define TCSETAF 8
+
+#define TCIFLUSH 0
+#define TCOFLUSH 1
+#define TCIOFLUSH 2
+#define TCFLSH 3
+
+#define TCSAFLUSH 1
+#define TCSANOW 2
+#define TCSADRAIN 3
+#define TCSADFLUSH 4
+
+#define TIOCPKT 6
+
+#define TIOCPKT_DATA 0
+#define TIOCPKT_FLUSHREAD 1
+#define TIOCPKT_FLUSHWRITE 2
+#define TIOCPKT_STOP 4
+#define TIOCPKT_START 8
+#define TIOCPKT_NOSTOP 16
+#define TIOCPKT_DOSTOP 32
+
+#define FIONBIO 0x8004667e /* To be compatible with socket version */
+
+#define CTRL(ch) ((ch)&0x1F)
+
+#define CNUL 0
+#define CDEL 0x0007f
+#define CESC '\\'
+#define CINTR CTRL('C')
+#define CQUIT 0x0001c
+#define CERASE CTRL('H')
+#define CKILL CTRL('U')
+#define CEOT CTRL('D')
+#define CEOL 0
+#define CEOL2 0
+#define CEOF CTRL('D')
+#define CSTART CTRL('Q')
+#define CSTOP CTRL('S')
+#define CSWTCH 0x0001a
+#define NSWTCH 0
+#define CSUSP CTRL('Z')
+#define CDSUSP CTRL('Y')
+#define CRPRNT CTRL('R')
+#define CFLUSH CTRL('O')
+#define CWERASE CTRL('W')
+#define CLNEXT CTRL('V')
+
+/* iflag bits */
+#define IGNBRK 0x00001
+#define BRKINT 0x00002
+#define IGNPAR 0x00004
+#define IMAXBEL 0x00008
+#define INPCK 0x00010
+#define ISTRIP 0x00020
+#define INLCR 0x00040
+#define IGNCR 0x00080
+#define ICRNL 0x00100
+#define IXON 0x00400
+#define IXOFF 0x01000
+#define IUCLC 0x04000
+#define IXANY 0x08000
+#define PARMRK 0x10000
+
+/* oflag bits */
+
+#define OPOST 0x00001
+#define OLCUC 0x00002
+#define OCRNL 0x00004
+#define ONLCR 0x00008
+#define ONOCR 0x00010
+#define ONLRET 0x00020
+#define OFILL 0x00040
+#define CRDLY 0x00180
+#define CR0 0x00000
+#define CR1 0x00080
+#define CR2 0x00100
+#define CR3 0x00180
+#define NLDLY 0x00200
+#define NL0 0x00000
+#define NL1 0x00200
+#define BSDLY 0x00400
+#define BS0 0x00000
+#define BS1 0x00400
+#define TABDLY 0x01800
+#define TAB0 0x00000
+#define TAB1 0x00800
+#define TAB2 0x01000
+#define TAB3 0x01800
+#define XTABS 0x01800
+#define VTDLY 0x02000
+#define VT0 0x00000
+#define VT1 0x02000
+#define FFDLY 0x04000
+#define FF0 0x00000
+#define FF1 0x04000
+#define OFDEL 0x08000
+
+/* cflag bits */
+
+/* Baud rate values. These must fit in speed_t, which is unsigned
+ char. See also the extended baud rates below. These baud rates
+ set an additional bit. */
+#define CBAUD 0x0100f
+#define B0 0x00000
+#define B50 0x00001
+#define B75 0x00002
+#define B110 0x00003
+#define B134 0x00004
+#define B150 0x00005
+#define B200 0x00006
+#define B300 0x00007
+#define B600 0x00008
+#define B1200 0x00009
+#define B1800 0x0000a
+#define B2400 0x0000b
+#define B4800 0x0000c
+#define B9600 0x0000d
+#define B19200 0x0000e
+#define B38400 0x0000f
+
+#define CSIZE 0x00030
+#define CS5 0x00000
+#define CS6 0x00010
+#define CS7 0x00020
+#define CS8 0x00030
+#define CSTOPB 0x00040
+#define CREAD 0x00080
+#define PARENB 0x00100
+#define PARODD 0x00200
+#define HUPCL 0x00400
+#define CLOCAL 0x00800
+#define CBAUDEX 0x0100f
+#define B57600 0x01001
+#define B115200 0x01002
+#define B128000 0x01003
+#define B256000 0x01003
+#define CRTSXOFF 0x04000
+#define CRTSCTS 0x08000
+
+/* lflag bits */
+#define ISIG 0x0001
+#define ICANON 0x0002
+#define ECHO 0x0004
+#define ECHOE 0x0008
+#define ECHOK 0x0010
+#define ECHONL 0x0020
+#define NOFLSH 0x0040
+#define TOSTOP 0x0080
+#define IEXTEN 0x0100
+#define FLUSHO 0x0200
+#define ECHOKE 0x0400
+#define ECHOCTL 0x0800
+
+#define VDISCARD 1
+#define VEOL 2
+#define VEOL2 3
+#define VEOF 4
+#define VERASE 5
+#define VINTR 6
+#define VKILL 7
+#define VLNEXT 8
+#define VMIN 9
+#define VQUIT 10
+#define VREPRINT 11
+#define VSTART 12
+#define VSTOP 13
+#define VSUSP 14
+#define VSWTC 15
+#define VTIME 16
+#define VWERASE 17
+
+#define NCCS 18
+
+typedef unsigned char cc_t;
+typedef unsigned int tcflag_t;
+typedef unsigned int speed_t;
+typedef unsigned short otcflag_t;
+typedef unsigned char ospeed_t;
+
+struct __oldtermios {
+ otcflag_t c_iflag;
+ otcflag_t c_oflag;
+ otcflag_t c_cflag;
+ otcflag_t c_lflag;
+ char c_line;
+ cc_t c_cc[NCCS];
+ ospeed_t c_ispeed;
+ ospeed_t c_ospeed;
+};
+
+struct termios {
+ tcflag_t c_iflag;
+ tcflag_t c_oflag;
+ tcflag_t c_cflag;
+ tcflag_t c_lflag;
+ char c_line;
+ cc_t c_cc[NCCS];
+ speed_t c_ispeed;
+ speed_t c_ospeed;
+};
+
+#ifdef CYGWIN_VERSION_DLL_IS_OLD_TERMIOS
+#ifdef __GNUC__
+# define __tonew_termios(ti) \
+ ({ \
+ struct termios *__newti; \
+ \
+ if (!CYGWIN_VERSION_DLL_IS_OLD_TERMIOS) \
+ __newti = (struct termios *) ti; \
+ else \
+ { \
+ __newti = (struct termios *) alloca(sizeof(struct termios)); \
+ __newti->c_iflag = ((struct __oldtermios *)ti)->c_iflag; \
+ __newti->c_oflag = ((struct __oldtermios *)ti)->c_oflag; \
+ __newti->c_cflag = ((struct __oldtermios *)ti)->c_cflag; \
+ __newti->c_lflag = ((struct __oldtermios *)ti)->c_lflag; \
+ __newti->c_line = ((struct __oldtermios *)ti)->c_line; \
+ __newti->c_ispeed = ((struct __oldtermios *)ti)->c_ispeed; \
+ __newti->c_ospeed = ((struct __oldtermios *)ti)->c_ospeed; \
+ memcpy (__newti->c_cc, ((struct __oldtermios *)ti)->c_cc, sizeof(__newti->c_cc)); \
+ } \
+ __newti; \
+ })
+
+# define __makenew_termios(ti) \
+ (CYGWIN_VERSION_DLL_IS_OLD_TERMIOS ? \
+ (struct termios *) alloca (sizeof (struct termios)) : (ti))
+
+# define __toapp_termios(toti, fromti) \
+ ({ \
+ if (!CYGWIN_VERSION_DLL_IS_OLD_TERMIOS) \
+ toti = fromti; \
+ else \
+ { \
+ ((struct __oldtermios *)toti)->c_iflag = fromti->c_iflag; \
+ ((struct __oldtermios *)toti)->c_oflag = fromti->c_oflag; \
+ ((struct __oldtermios *)toti)->c_cflag = fromti->c_cflag; \
+ ((struct __oldtermios *)toti)->c_lflag = fromti->c_lflag; \
+ ((struct __oldtermios *)toti)->c_line = fromti->c_line; \
+ ((struct __oldtermios *)toti)->c_ispeed = fromti->c_ispeed; \
+ ((struct __oldtermios *)toti)->c_ospeed = fromti->c_ospeed; \
+ memcpy (((struct __oldtermios*)toti)->c_cc, fromti->c_cc, sizeof(fromti->c_cc)); \
+ } \
+ toti; \
+ })
+#endif /*__GNUC__*/
+#endif
+
+#define termio termios
+
+#define cfgetospeed(tp) ((tp)->c_ospeed)
+#define cfgetispeed(tp) ((tp)->c_ispeed)
+#define cfsetospeed(tp,s) (((tp)->c_ospeed = (s)), 0)
+#define cfsetispeed(tp,s) (((tp)->c_ispeed = (s)), 0)
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+int tcgetattr (int, struct termios *);
+int tcsetattr (int, int, const struct termios *);
+int tcsendbreak (int, int);
+int tcdrain (int);
+int tcflush (int, int);
+int tcflow (int, int);
+
+#ifdef __cplusplus
+}
+#endif
+
+/* Extra stuff to make porting stuff easier. */
+struct winsize
+{
+ unsigned short ws_row, ws_col;
+ unsigned short ws_xpixel, ws_ypixel;
+};
+
+#define TIOCGWINSZ (('T' << 8) | 1)
+#define TIOCSWINSZ (('T' << 8) | 2)
+
+#endif /* _SYS_TERMIOS_H */
diff --git a/winsup/cygwin/include/sys/ttychars.h b/winsup/cygwin/include/sys/ttychars.h
new file mode 100644
index 000000000..2d313646f
--- /dev/null
+++ b/winsup/cygwin/include/sys/ttychars.h
@@ -0,0 +1 @@
+/* ttychars.h */
diff --git a/winsup/cygwin/include/sys/uio.h b/winsup/cygwin/include/sys/uio.h
new file mode 100644
index 000000000..dad9dc17f
--- /dev/null
+++ b/winsup/cygwin/include/sys/uio.h
@@ -0,0 +1,25 @@
+#ifndef _UIO_H_
+#define _UIO_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/* For size_t */
+#include <stddef.h>
+/* For ssize_t */
+#include <sys/types.h>
+
+/*
+ * Define the uio buffers used for writev, readv.
+ */
+
+struct iovec {
+ caddr_t iov_base;
+ int iov_len;
+};
+
+#ifdef __cplusplus
+};
+#endif /* __cplusplus */
+#endif /* _UIO_H_ */
diff --git a/winsup/cygwin/include/sys/un.h b/winsup/cygwin/include/sys/un.h
new file mode 100644
index 000000000..6f49c7b06
--- /dev/null
+++ b/winsup/cygwin/include/sys/un.h
@@ -0,0 +1,16 @@
+#ifndef _SYS_UN_H
+#define _SYS_UN_H
+
+/* POSIX requires only at least 100 bytes */
+#define UNIX_PATH_LEN 108
+
+struct sockaddr_un {
+ unsigned short sun_family; /* address family AF_LOCAL/AF_UNIX */
+ char sun_path[UNIX_PATH_LEN]; /* 108 bytes of socket address */
+};
+
+/* Evaluates the actual length of `sockaddr_un' structure. */
+#define SUN_LEN(p) ((size_t)(((struct sockaddr_un *) NULL)->sun_path) \
+ + strlen ((p)->sun_path))
+
+#endif
diff --git a/winsup/cygwin/include/sys/utsname.h b/winsup/cygwin/include/sys/utsname.h
new file mode 100644
index 000000000..bbfa9a6d0
--- /dev/null
+++ b/winsup/cygwin/include/sys/utsname.h
@@ -0,0 +1,23 @@
+#ifndef _SYS_UTSNAME_H
+#define _SYS_UTSNAME_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct utsname
+{
+ char sysname[20];
+ char nodename[20];
+ char release[20];
+ char version[20];
+ char machine[20];
+};
+
+int uname (struct utsname *);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/winsup/cygwin/include/sys/vfs.h b/winsup/cygwin/include/sys/vfs.h
new file mode 100644
index 000000000..4d3b0b6e0
--- /dev/null
+++ b/winsup/cygwin/include/sys/vfs.h
@@ -0,0 +1,28 @@
+#ifndef _SYS_VFS_H_
+#define _SYS_VFS_H_
+
+struct statfs {
+ long f_type; /* type of filesystem (see below) */
+ long f_bsize; /* optimal transfer block size */
+ long f_blocks; /* total data blocks in file system */
+ long f_bfree; /* free blocks in fs */
+ long f_bavail; /* free blocks avail to non-superuser */
+ long f_files; /* total file nodes in file system */
+ long f_ffree; /* free file nodes in fs */
+ long f_fsid; /* file system id */
+ long f_namelen; /* maximum length of filenames */
+ long f_spare[6]; /* spare for later */
+};
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+int statfs (const char *__path, struct statfs *__buf);
+int fstatfs (int __fd, struct statfs *__buf);
+
+#ifdef __cplusplus
+};
+#endif /* __cplusplus */
+
+#endif /*_SYS_VFS_H_*/
diff --git a/winsup/cygwin/include/sys/wait.h b/winsup/cygwin/include/sys/wait.h
new file mode 100644
index 000000000..a9648eec2
--- /dev/null
+++ b/winsup/cygwin/include/sys/wait.h
@@ -0,0 +1,63 @@
+#ifndef _SYS_WAIT_H
+#define _SYS_WAIT_H
+
+#include <sys/types.h>
+#include <sys/resource.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define WNOHANG 1
+#define WUNTRACED 2
+
+/* A status looks like:
+ <2 bytes info> <2 bytes code>
+
+ <code> == 0, child has exited, info is the exit value
+ <code> == 1..7e, child has exited, info is the signal number.
+ <code> == 7f, child has stopped, info was the signal number.
+ <code> == 80, there was a core dump.
+*/
+
+#define WIFEXITED(w) (((w) & 0xff) == 0)
+#define WIFSIGNALED(w) (((w) & 0x7f) > 0 && (((w) & 0x7f) < 0x7f))
+#define WIFSTOPPED(w) (((w) & 0xff) == 0x7f)
+#define WEXITSTATUS(w) (((w) >> 8) & 0xff)
+#define WTERMSIG(w) ((w) & 0x7f)
+#define WSTOPSIG WEXITSTATUS
+
+pid_t wait (int *);
+pid_t waitpid (pid_t, int *, int);
+pid_t wait3 (int *__status, int __options, struct rusage *__rusage);
+pid_t wait4 (pid_t __pid, int *__status, int __options, struct rusage *__rusage);
+
+union wait
+ {
+ int w_status;
+ struct
+ {
+ unsigned int __w_termsig:7; /* Terminating signal. */
+ unsigned int __w_coredump:1; /* Set if dumped core. */
+ unsigned int __w_retcode:8; /* Return code if exited normally. */
+ unsigned int:16;
+ } __wait_terminated;
+ struct
+ {
+ unsigned int __w_stopval:8; /* W_STOPPED if stopped. */
+ unsigned int __w_stopsig:8; /* Stopping signal. */
+ unsigned int:16;
+ } __wait_stopped;
+ };
+
+#define w_termsig __wait_terminated.__w_termsig
+#define w_coredump __wait_terminated.__w_coredump
+#define w_retcode __wait_terminated.__w_retcode
+#define w_stopsig __wait_stopped.__w_stopsig
+#define w_stopval __wait_stopped.__w_stopval
+
+#ifdef __cplusplus
+};
+#endif
+
+#endif
diff --git a/winsup/cygwin/include/syslog.h b/winsup/cygwin/include/syslog.h
new file mode 100644
index 000000000..ac2c0dc49
--- /dev/null
+++ b/winsup/cygwin/include/syslog.h
@@ -0,0 +1,6 @@
+#ifndef _SYSLOG_H
+#define _SYSLOG_H
+
+#include <sys/syslog.h>
+
+#endif /* _SYSLOG_H */
diff --git a/winsup/cygwin/include/termio.h b/winsup/cygwin/include/termio.h
new file mode 100644
index 000000000..8a9b3395f
--- /dev/null
+++ b/winsup/cygwin/include/termio.h
@@ -0,0 +1,6 @@
+#ifndef _TERMIO_H
+#define _TERMIO_H
+
+#include <sys/termio.h>
+
+#endif
diff --git a/winsup/cygwin/include/tzfile.h b/winsup/cygwin/include/tzfile.h
new file mode 100644
index 000000000..9cce33cd1
--- /dev/null
+++ b/winsup/cygwin/include/tzfile.h
@@ -0,0 +1,10 @@
+#ifndef _TZFILE_H
+#define _TZFILE_H
+
+#define SECSPERDAY (60*60*24)
+#define DAYSPERNYEAR 365
+#define DAYSPERLYEAR 366
+
+#define isleap(y) (((y) % 4) == 0 && ((y) % 100) != 0 || ((y) % 400) == 0)
+#endif
+
diff --git a/winsup/cygwin/init.cc b/winsup/cygwin/init.cc
new file mode 100644
index 000000000..a159def55
--- /dev/null
+++ b/winsup/cygwin/init.cc
@@ -0,0 +1,58 @@
+/* init.cc for WIN32.
+
+ Copyright 1996, 1997, 1998, 1999 Cygnus Solutions.
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#include <stdlib.h>
+#include <ctype.h>
+#include "winsup.h"
+
+extern "C"
+{
+ int WINAPI dll_entry (HANDLE h, DWORD reason, void *ptr);
+};
+
+extern "C" void *export_malloc (unsigned int);
+extern "C" void *export_realloc (void *,unsigned int);
+extern "C" void *export_calloc (unsigned int,unsigned int);
+extern "C" void export_free (void *);
+
+extern void do_global_ctors (void (**in_pfunc)(), int force);
+
+int NO_COPY dynamically_loaded;
+
+int
+WINAPI dll_entry (HANDLE hdll, DWORD reason, void *static_load)
+{
+ switch (reason)
+ {
+ case DLL_PROCESS_ATTACH:
+ dynamically_loaded = (static_load == NULL);
+ break;
+ case DLL_THREAD_ATTACH:
+ break;
+ case DLL_PROCESS_DETACH:
+ break;
+ case DLL_THREAD_DETACH:
+#if 0 // FIXME: REINSTATE SOON
+ waitq *w;
+ if ((w = waitq_storage.get ()) != NULL)
+ {
+ if (w->thread_ev != NULL)
+ {
+ system_printf ("closing %p", w->thread_ev);
+ (void) CloseHandle (w->thread_ev);
+ }
+ memset (w, 0, sizeof(*w)); // FIXME: memory leak
+ }
+ // FIXME: Need to add other per_thread stuff here
+#endif
+ break;
+ }
+ return 1;
+}
diff --git a/winsup/cygwin/ioctl.cc b/winsup/cygwin/ioctl.cc
new file mode 100644
index 000000000..1fb5f3b59
--- /dev/null
+++ b/winsup/cygwin/ioctl.cc
@@ -0,0 +1,44 @@
+/* ioctl.cc: ioctl routines.
+
+ Copyright 1996, 1998 Cygnus Solutions.
+
+ Written by Doug Evans of Cygnus Support
+ dje@cygnus.com
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#include <sys/ioctl.h>
+#include <errno.h>
+#include "winsup.h"
+
+extern "C"
+int
+ioctl (int fd, int cmd, void *buf)
+{
+ if (dtable.not_open (fd))
+ {
+ set_errno (EBADF);
+ return -1;
+ }
+
+ debug_printf ("fd %d, cmd %x\n", fd, cmd);
+ fhandler_base *fh = dtable[fd];
+ if (fh->is_tty () && fh->get_device () != FH_PTYM)
+ switch (cmd)
+ {
+ case TCGETA:
+ return tcgetattr (fd, (struct termios *) buf);
+ case TCSETA:
+ return tcsetattr (fd, TCSANOW, (struct termios *) buf);
+ case TCSETAW:
+ return tcsetattr (fd, TCSADRAIN, (struct termios *) buf);
+ case TCSETAF:
+ return tcsetattr (fd, TCSAFLUSH, (struct termios *) buf);
+ }
+
+ return fh->ioctl (cmd, buf);
+}
diff --git a/winsup/cygwin/malloc_wrapper.cc b/winsup/cygwin/malloc_wrapper.cc
new file mode 100644
index 000000000..aa4891b8e
--- /dev/null
+++ b/winsup/cygwin/malloc_wrapper.cc
@@ -0,0 +1,221 @@
+/* malloc.cc for WIN32.
+
+ Copyright 1996, 1997, 1998 Cygnus Solutions.
+
+ Written by Steve Chamberlain of Cygnus Support
+ sac@cygnus.com
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#include "winsup.h"
+#include <stdlib.h>
+
+/* we provide these stubs to call into a user's
+ provided malloc if there is one - otherwise
+ functions we provide - like strdup will cause
+ problems if malloced on our heap and free'd on theirs.
+*/
+
+static int export_malloc_called = 0;
+static int use_internal_malloc = 1;
+
+#undef in
+#undef out
+#define in(x)
+#define out(x)
+
+#ifdef MALLOC_DEBUG
+extern "C" void * _sbrk (size_t incr_arg);
+
+#if 0
+extern "C" void *
+_sbrk_r (struct _reent *, size_t incr_arg)
+{
+ return _sbrk (incr_arg);
+}
+#endif
+
+extern "C" void *
+_malloc_r (struct _reent *, size_t size)
+{
+ export_malloc_called = 1;
+ return malloc (size);
+}
+#undef malloc
+
+extern "C" void *
+_calloc_r (struct _reent *, size_t nmemb, size_t size)
+{
+ export_malloc_called = 1;
+ return calloc (nmemb, size);
+}
+#undef calloc
+
+extern "C" void
+_free_r (struct _reent *, void *p)
+{
+ export_malloc_called = 1;
+ free (p);
+}
+#undef free
+
+extern "C" void *
+_realloc_r (struct _reent *, void *p, size_t size)
+{
+ export_malloc_called = 1;
+ return realloc (p, size);
+}
+#undef realloc
+
+extern "C" char *
+strdup_dbg (const char *s, const char *file, int line)
+{
+ char *p;
+ export_malloc_called = 1;
+ if ((p = (char *) malloc_dbg (strlen (s) + 1, file, line)) != NULL)
+ strcpy (p, s);
+ return p;
+}
+
+#undef strdup
+extern "C" char *
+strdup (const char *s)
+{
+ return strdup_dbg (s, __FILE__, __LINE__);
+}
+#else
+/* Call though the application pointer,
+ which either points to export_malloc, or the application's
+ own version. */
+
+void *
+malloc (size_t size)
+{
+ void *res;
+ res = user_data->malloc (size);
+ return res;
+}
+
+void
+free (void *p)
+{
+ user_data->free (p);
+}
+
+void *
+realloc (void *p, size_t size)
+{
+ void *res;
+ res = user_data->realloc (p, size);
+ return res;
+}
+
+void *
+calloc (size_t nmemb, size_t size)
+{
+ void *res;
+ res = user_data->calloc (nmemb, size);
+ return res;
+}
+#endif
+
+/* These routines are used by the application if it
+ doesn't provide its own malloc. */
+
+extern "C"
+void
+export_free (void *p)
+{
+ malloc_printf ("(%p), called by %x", p, ((int *)&p)[-1]);
+ if (use_internal_malloc)
+ _free_r (_impure_ptr, p);
+ else
+ user_data->free (p);
+}
+
+extern "C"
+void *
+export_malloc (int size)
+{
+ void *res;
+ export_malloc_called = 1;
+ if (use_internal_malloc)
+ res = _malloc_r (_impure_ptr, size);
+ else
+ res = user_data->malloc (size);
+ malloc_printf ("(%d) = %x, called by %x", size, res, ((int *)&size)[-1]);
+ return res;
+}
+
+extern "C"
+void *
+export_realloc (void *p, int size)
+{
+ void *res;
+ if (use_internal_malloc)
+ res = _realloc_r (_impure_ptr, p, size);
+ else
+ res = user_data->realloc (p, size);
+ malloc_printf ("(%x, %d) = %x, called by %x", p, size, res, ((int *)&p)[-1]);
+ return res;
+}
+
+extern "C"
+void *
+export_calloc (size_t nmemb, size_t size)
+{
+ void *res;
+ if (use_internal_malloc)
+ res = _calloc_r (_impure_ptr, nmemb, size);
+ else
+ res = user_data->calloc (nmemb, size);
+ malloc_printf ("(%d, %d) = %x, called by %x", nmemb, size, res, ((int *)&nmemb)[-1]);
+ return res;
+}
+
+/* We use a critical section to lock access to the malloc data
+ structures. This permits malloc to be called from different
+ threads. Note that it does not make malloc reentrant, and it does
+ not permit a signal handler to call malloc. The malloc code in
+ newlib will call __malloc_lock and __malloc_unlock at appropriate
+ times. */
+
+static NO_COPY CRITICAL_SECTION malloc_critical_section;
+
+void
+malloc_init ()
+{
+ InitializeCriticalSection (&malloc_critical_section);
+ /* Check if mallock is provided by application. If so, redirect all
+ calls to export_malloc/free/realloc to application provided. This may
+ happen if some other dll calls cygwin's malloc, but main code provides
+ its own malloc */
+ if (!user_data->forkee)
+ {
+#ifdef MALLOC_DEBUG
+ _free_r (NULL, _malloc_r (NULL, 16));
+#else
+ free (malloc (16));
+#endif
+ if (!export_malloc_called)
+ use_internal_malloc = 0;
+ }
+}
+
+extern "C"
+void
+__malloc_lock (struct _reent *ptr)
+{
+ SetResourceLock(LOCK_MEMORY_LIST,WRITE_LOCK|READ_LOCK," __malloc_lock");
+}
+
+extern "C"
+void
+__malloc_unlock (struct _reent *ptr)
+{
+ ReleaseResourceLock(LOCK_MEMORY_LIST,WRITE_LOCK|READ_LOCK," __malloc_unlock");
+}
diff --git a/winsup/cygwin/mcount.c b/winsup/cygwin/mcount.c
new file mode 100644
index 000000000..a8c5e3ea6
--- /dev/null
+++ b/winsup/cygwin/mcount.c
@@ -0,0 +1,174 @@
+/*-
+ * Copyright (c) 1983, 1992, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#if !defined(lint) && !defined(_KERNEL) && defined(LIBC_SCCS)
+static char rcsid[] = "$OpenBSD: mcount.c,v 1.6 1997/07/23 21:11:27 kstailey Exp $";
+#endif
+
+#include <sys/param.h>
+#include <sys/types.h>
+#include <sys/strace.h>
+#include <gmon.h>
+
+/*
+ * mcount is called on entry to each function compiled with the profiling
+ * switch set. _mcount(), which is declared in a machine-dependent way
+ * with _MCOUNT_DECL, does the actual work and is either inlined into a
+ * C routine or called by an assembly stub. In any case, this magic is
+ * taken care of by the MCOUNT definition in <machine/profile.h>.
+ *
+ * _mcount updates data structures that represent traversals of the
+ * program's call graph edges. frompc and selfpc are the return
+ * address and function address that represents the given call graph edge.
+ *
+ * Note: the original BSD code used the same variable (frompcindex) for
+ * both frompcindex and frompc. Any reasonable, modern compiler will
+ * perform this optimization.
+ */
+//_MCOUNT_DECL __P((u_long frompc, u_long selfpc));
+_MCOUNT_DECL(frompc, selfpc) /* _mcount; may be static, inline, etc */
+ register u_long frompc, selfpc;
+{
+ register u_short *frompcindex;
+ register struct tostruct *top, *prevtop;
+ register struct gmonparam *p;
+ register long toindex;
+
+ p = &_gmonparam;
+ /*
+ * check that we are profiling
+ * and that we aren't recursively invoked.
+ */
+ if (p->state != GMON_PROF_ON)
+ return;
+ p->state = GMON_PROF_BUSY;
+ /*
+ * check that frompcindex is a reasonable pc value.
+ * for example: signal catchers get called from the stack,
+ * not from text space. too bad.
+ */
+ frompc -= p->lowpc;
+ if (frompc > p->textsize)
+ goto done;
+
+#if (HASHFRACTION & (HASHFRACTION - 1)) == 0
+ if (p->hashfraction == HASHFRACTION)
+ frompcindex =
+ &p->froms[frompc / (HASHFRACTION * sizeof(*p->froms))];
+ else
+#endif
+ frompcindex =
+ &p->froms[frompc / (p->hashfraction * sizeof(*p->froms))];
+ toindex = *frompcindex;
+ if (toindex == 0) {
+ /*
+ * first time traversing this arc
+ */
+ toindex = ++p->tos[0].link;
+ if (toindex >= p->tolimit)
+ /* halt further profiling */
+ goto overflow;
+
+ *frompcindex = toindex;
+ top = &p->tos[toindex];
+ top->selfpc = selfpc;
+ top->count = 1;
+ top->link = 0;
+ goto done;
+ }
+ top = &p->tos[toindex];
+ if (top->selfpc == selfpc) {
+ /*
+ * arc at front of chain; usual case.
+ */
+ top->count++;
+ goto done;
+ }
+ /*
+ * have to go looking down chain for it.
+ * top points to what we are looking at,
+ * prevtop points to previous top.
+ * we know it is not at the head of the chain.
+ */
+ for (; /* goto done */; ) {
+ if (top->link == 0) {
+ /*
+ * top is end of the chain and none of the chain
+ * had top->selfpc == selfpc.
+ * so we allocate a new tostruct
+ * and link it to the head of the chain.
+ */
+ toindex = ++p->tos[0].link;
+ if (toindex >= p->tolimit)
+ goto overflow;
+
+ top = &p->tos[toindex];
+ top->selfpc = selfpc;
+ top->count = 1;
+ top->link = *frompcindex;
+ *frompcindex = toindex;
+ goto done;
+ }
+ /*
+ * otherwise, check the next arc on the chain.
+ */
+ prevtop = top;
+ top = &p->tos[top->link];
+ if (top->selfpc == selfpc) {
+ /*
+ * there it is.
+ * increment its count
+ * move it to the head of the chain.
+ */
+ top->count++;
+ toindex = prevtop->link;
+ prevtop->link = top->link;
+ top->link = *frompcindex;
+ *frompcindex = toindex;
+ goto done;
+ }
+ }
+done:
+ p->state = GMON_PROF_ON;
+ return;
+overflow:
+ p->state = GMON_PROF_ERROR;
+ return;
+}
+
+/*
+ * Actual definition of mcount function. Defined in <machine/profile.h>,
+ * which is included by <sys/gmon.h>
+ */
+MCOUNT
+
diff --git a/winsup/cygwin/misc-std.sgml b/winsup/cygwin/misc-std.sgml
new file mode 100644
index 000000000..1c02311f0
--- /dev/null
+++ b/winsup/cygwin/misc-std.sgml
@@ -0,0 +1,73 @@
+<sect1 id="std-misc">
+<title>Compatibility with Miscellaneous Other Standards</title>
+
+<para>The following functions are compatible with miscellaneous other
+standards:</para>
+
+
+<sect2><title>Networking</title><para>
+
+<para>(Standardized by POSIX 1.g, which is probably still in draft?)</para>
+
+<para>accept, bind, connect, getdomainname, gethostbyaddr,
+gethostbyname, getpeername, getprotobyname, getprotobynumber,
+getservbyname, getservbyport, getsockname, getsockopt, herror, htonl,
+htons, inet_addr, inet_makeaddr, inet_netof, inet_ntoa, listen, ntohl,
+ntohs, rcmd, recv, recvfrom, rexec, rresvport, send, sendto,
+setsockopt, shutdown, socket, socketpair</para>
+
+<para>Of these networking calls, rexec, rcmd and rresvport are
+implemented in MS IP stack but may not be implemented in other
+vendors' stacks. </para>
+
+</sect2>
+
+<sect2><title>Other</title><para>
+
+chroot, closelog, cwait, dlclose, dlerror, dlfork, dlopen, dlsym,
+endgrent, ffs, fstatfs, ftime, get_osfhandle, getdtablesize, getgrent,
+gethostname, getitimer, getmntent, getpagesize, getpgid, getpwent,
+gettimeofday, grantpt, initgroups, ioctl, killpg, login, logout,
+lstat, mknod, memccpy, nice, openlog, pclose, popen, ptsname, putenv,
+random, readv, realpath, regfree, rexec, select, setegid setenv,
+seterrno, seteuid, setitimer, setmntent, setmode, setpassent, setpgrp,
+setpwent, settimeofday, sexecl, sexecle, sexeclp, sexeclpe, sexeclpe,
+sexecp, sexecv, sexecve, sexecvpe, sigpause, spawnl, spawnle, spawnlp,
+spawnlpe, spawnv, spawnve, spawnvp, spawnvpe, srandom, statfs,
+strsignal, strtosigno, swab, syslog, timezone, truncate, ttyslot,
+unlockpt, unsetenv, usleep, utimes, vfork, vhangup, wait3, wait4,
+wcscmp, wcslen, wprintf, writev
+
+<sect2><title>Implementation Notes</title>
+
+<para> <function>initgroups</function> does nothing</para>
+
+<para> <function>chroot</function>, <function>mknod</function>,
+<function>settimeofday</function>, and <function>vhangup</function>
+always return -1 and sets errno to ENOSYS.</para>
+
+<para> <function>nice</function> allows Cygwin programs to alter their
+current runtime priority through the use of its incr argument. Cygwin
+processes can be set to IDLE_PRIORITY_CLASS, NORMAL_PRIORITY_CLASS,
+HIGH_PRIORITY_CLASS, or REALTIME_PRIORITY_CLASS with the
+<function>nice</function> call. NORMAL_PRIORITY_CLASS is the
+default. If you pass a positive number to nice(), then the priority
+level will decrease by one (within the above list of priorities). A
+negative number would make it increase by one. It is not possible to
+change it by more than one at a time without making repeated calls.
+An increment above REALTIME_PRIORITY_CLASS results in the process
+staying at that priority. Likewise, a decrement to
+IDLE_PRIORITY_CLASS has it stay at that priority. Note that in the
+Win32 API, there are 32 priorities. So currently we only give access
+to four of these through <function>nice</function>.
+
+<para> <function>seteuid</function>, <function>setegid</function>, and
+<function>settimeofday</function> always return 0 and sets errno to
+ENOSYS.</para>
+
+<para><function>vfork</function> just calls
+<function>fork</function></para>
+
+</sect2>
+
+</sect1>
diff --git a/winsup/cygwin/mkvers.sh b/winsup/cygwin/mkvers.sh
new file mode 100755
index 000000000..cda56195a
--- /dev/null
+++ b/winsup/cygwin/mkvers.sh
@@ -0,0 +1,165 @@
+#!/bin/sh
+# mkvers.sh - Make version information for cygwin DLL
+#
+# Copyright 1998, 1999, 2000 Cygnus Solutions.
+#
+# This file is part of Cygwin.
+#
+# This software is a copyrighted work licensed under the terms of the
+# Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+# details.
+
+exec 9> version.cc
+trap "rm -f /tmp/version.cc" 1 2 15
+
+#
+# Arg 1 is the name of the version include file
+#
+incfile="$1"
+rcfile="$2"
+windres="$3"
+
+[ -r $incfile ] || {
+ echo "**** Couldn't open file '$incfile'. Aborting."
+}
+
+#
+# Load the current date so we can work on individual fields
+#
+build_date=`date`
+set -$- $build_date
+#
+# Translate the month into a number
+#
+case "$2" in
+ Jan) m=01 ;;
+ Feb) m=02 ;;
+ Mar) m=03 ;;
+ Apr) m=04 ;;
+ May) m=05 ;;
+ Jun) m=06 ;;
+ Jul) m=07 ;;
+ Aug) m=08 ;;
+ Sep) m=09 ;;
+ Oct) m=10 ;;
+ Nov) m=11 ;;
+ Dec) m=12 ;;
+esac
+
+if [ "$3" -le 10 ]; then
+ d=0$3
+else
+ d=$3
+fi
+#
+# Set date into YYYY-MM-DD HH:MM:SS format
+#
+builddate="${6-$5}-$m-$d $4"
+
+set -$- ''
+
+#
+# Output the initial part of version.cc
+#
+cat <<EOF 1>&9
+#include <winsup.h>
+
+#define strval(x) #x
+#define str(x) strval(x)
+#define shared_data_version str(CYGWIN_VERSION_SHARED_DATA)
+
+const char *cygwin_version_strings =
+ "BEGIN_CYGWIN_VERSION_INFO\n"
+EOF
+
+#
+# Split version file into dir and filename components
+#
+dir=`dirname $incfile`
+fn=`basename $incfile`
+
+#
+# Look in the include file CVS directory for a CVS Tag file. This file,
+# if it exists, will contain the name of the sticky tag associated with
+# the current build. Save that for output later.
+#
+cvs_tag="`sed 's%^.\(.*\)%\1%' $dir/CVS/Tag 2>/dev/null`"
+
+[ -n "$cvs_tag" ] && cvs_tag=" CVS tag"'
+'"$cvs_tag"
+
+#
+# Look in the source directory containing the include/cygwin/version.h
+# file for a ".snapshot-date" file. If one is found then this information
+# will be saved for output to the DLL.
+#
+dir=`echo $dir | sed -e 's%/include/cygwin.*$%%' -e 's%include/cygwin.*$%.%'`
+if [ -r "$dir/.snapshot-date" ]; then
+ read snapshot < "$dir/.snapshot-date"
+ snapshot="snapshot date
+$snapshot"
+fi
+
+#
+# Scan the version.h file for strings that begin with CYGWIN_INFO or
+# CYGWIN_VERSION. Perform crude parsing on the lines to get the values
+# associated with these values and then pipe it into a while loop which
+# outputs these values in C palatable format for inclusion in the DLL
+# with a '%% ' identifier that will introduce "interesting" strings.
+# These strings are strictly for use by a user to scan the DLL for
+# interesting information.
+#
+(sed -n -e 's%#define CYGWIN_\(INFO\|VERSION\)_\([A-Z_]*\)[ ][ ]*\([a-zA-Z0-9"][^/]*\).*%_\2\
+\3%p' $incfile | sed -e 's/["\\]//g' -e '/^_/y/ABCDEFGHIJKLMNOPQRSTUVWXYZ_/abcdefghijklmnopqrstuvwxyz /';
+echo ' build date'; echo $build_date; [ -n "$cvs_tag" ] && echo "$cvs_tag";\
+[ -n "$snapshot" ] && echo "$snapshot"
+) | while read var; do
+ read val
+cat <<EOF
+ "%%% Cygwin $var: $val\n"
+EOF
+done | tee /tmp/mkvers.$$ 1>&9
+
+trap "rm -f /tmp/mkvers.$$" 0 1 2 15
+
+#
+# Finally, output the shared ID and set up the cygwin_version structure
+# for use by Cygwin itself.
+#
+cat <<EOF 1>&9
+#ifdef DEBUGGING
+ "%%% Cygwin shared id: " CYGWIN_VERSION_DLL_IDENTIFIER "S" shared_data_version "-$builddate\n"
+#else
+ "%%% Cygwin shared id: " CYGWIN_VERSION_DLL_IDENTIFIER "S" shared_data_version "\n"
+#endif
+ "END_CYGWIN_VERSION_INFO\n\0";
+
+cygwin_version_info cygwin_version =
+{
+ CYGWIN_VERSION_API_MAJOR, CYGWIN_VERSION_API_MINOR,
+ CYGWIN_VERSION_DLL_MAJOR, CYGWIN_VERSION_DLL_MINOR,
+ CYGWIN_VERSION_SHARED_DATA,
+ CYGWIN_VERSION_MOUNT_REGISTRY,
+ "$builddate",
+#ifdef DEBUGGING
+ CYGWIN_VERSION_DLL_IDENTIFIER "S" shared_data_version "-$builddate"
+#else
+ CYGWIN_VERSION_DLL_IDENTIFIER "S" shared_data_version
+#endif
+};
+EOF
+
+#
+# Generate winver.o using cygwin/version.h information.
+# Turn the cygwin major number from some large number to something like 1.1.0.
+#
+eval `sed -n 's/^.*dll \(m[ai][jn]or\): \([0-9]*\)[^0-9]*$/\1=\2/p' /tmp/mkvers.$$`
+cygverhigh=`expr $major / 1000`
+cygverlow=`expr $major % 1000`
+cygwin_ver="$cygverhigh.$cygverlow.$minor"
+if [ -n "$cvs_tag" ]; then
+ cygwin_ver="$cygwin_ver ($cvs_tag)"
+fi
+
+set -$- $builddate
+$windres --include-dir $dir/../w32api/include --include-dir $dir/include --define CYGWIN_BUILD_DATE="$1" --define CYGWIN_BUILD_TIME="$2" --define CYGWIN_VERSION='"'"$cygwin_ver"'"' $rcfile winver.o
diff --git a/winsup/cygwin/mmap.cc b/winsup/cygwin/mmap.cc
new file mode 100644
index 000000000..c0cffc285
--- /dev/null
+++ b/winsup/cygwin/mmap.cc
@@ -0,0 +1,474 @@
+/* mmap.cc
+
+ Copyright 1996, 1997, 1998, 2000 Cygnus Solutions.
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#include <stdlib.h>
+#include <stddef.h>
+#include <sys/mman.h>
+#include <errno.h>
+
+#include "winsup.h"
+
+/*
+ * Simple class used to keep a record of all current
+ * mmap areas in a process. Needed so that
+ * they can be duplicated after a fork().
+ */
+
+class mmap_record
+{
+ private:
+ HANDLE mapping_handle_;
+ DWORD access_mode_;
+ DWORD offset_;
+ DWORD size_to_map_;
+ void *base_address_;
+
+ public:
+ mmap_record (HANDLE h, DWORD ac, DWORD o, DWORD s, void *b) :
+ mapping_handle_ (h), access_mode_ (ac), offset_ (o),
+ size_to_map_ (s), base_address_ (b) { ; }
+
+ /* Default Copy constructor/operator=/destructor are ok */
+
+ /* Simple accessors */
+ HANDLE get_handle () const { return mapping_handle_; }
+ DWORD get_access () const { return access_mode_; }
+ DWORD get_offset () const { return offset_; }
+ DWORD get_size () const { return size_to_map_; }
+ void *get_address () const { return base_address_; }
+};
+
+class list {
+public:
+ mmap_record *recs;
+ int nrecs, maxrecs;
+ int fd;
+ list ();
+ ~list ();
+ void add_record (mmap_record r);
+ void erase (int i);
+};
+
+list::list ()
+{
+ recs = (mmap_record *) malloc (10 * sizeof(mmap_record));
+ nrecs = 0;
+ maxrecs = 10;
+ fd = 0;
+}
+
+list::~list ()
+{
+ free (recs);
+}
+
+void
+list::add_record (mmap_record r)
+{
+ if (nrecs == maxrecs)
+ {
+ maxrecs += 5;
+ recs = (mmap_record *) realloc (recs, maxrecs * sizeof (mmap_record));
+ }
+ recs[nrecs++] = r;
+}
+
+void
+list::erase (int i)
+{
+ while (i < nrecs-1)
+ recs[i] = recs[i+1];
+ nrecs--;
+}
+
+class map {
+public:
+ list **lists;
+ int nlists, maxlists;
+ map ();
+ ~map ();
+ list *get_list_by_fd (int fd);
+ list *add_list (list *l, int fd);
+ void erase (int i);
+};
+
+map::map ()
+{
+ lists = (list **) malloc (10 * sizeof(list *));
+ nlists = 0;
+ maxlists = 10;
+}
+
+map::~map ()
+{
+ free (lists);
+}
+
+list *
+map::get_list_by_fd (int fd)
+{
+ int i;
+ for (i=0; i<nlists; i++)
+ if (lists[i]->fd == fd)
+ return lists[i];
+ return 0;
+}
+
+list *
+map::add_list (list *l, int fd)
+{
+ l->fd = fd;
+ if (nlists == maxlists)
+ {
+ maxlists += 5;
+ lists = (list **) realloc (lists, maxlists * sizeof (list *));
+ }
+ lists[nlists++] = l;
+ return lists[nlists-1];
+}
+
+void
+map::erase (int i)
+{
+ while (i < nlists-1)
+ lists[i] = lists[i+1];
+ nlists--;
+}
+
+/*
+ * Code to keep a record of all mmap'ed areas in a process.
+ * Needed to duplicate tham in a child of fork().
+ * mmap_record classes are kept in an STL list in an STL map, keyed
+ * by file descriptor. This is *NOT* duplicated accross a fork(), it
+ * needs to be specially handled by the fork code.
+ */
+
+static NO_COPY map *mmapped_areas;
+
+extern "C"
+caddr_t
+mmap (caddr_t addr, size_t len, int prot, int flags, int fd, off_t off)
+{
+ syscall_printf ("addr %x, len %d, prot %x, flags %x, fd %d, off %d",
+ addr, len, prot, flags, fd, off);
+
+ SetResourceLock(LOCK_MMAP_LIST,READ_LOCK|WRITE_LOCK," mmap");
+
+ /* Windows 95 does not have fixed addresses */
+ if ((os_being_run != winNT) && (flags & MAP_FIXED))
+ {
+ set_errno (EINVAL);
+ syscall_printf ("-1 = mmap(): win95 and MAP_FIXED");
+ return (caddr_t) -1;
+ }
+
+ if (mmapped_areas == 0)
+ {
+ /* First mmap call, create STL map */
+ mmapped_areas = new map;
+ if (mmapped_areas == 0)
+ {
+ set_errno (ENOMEM);
+ syscall_printf ("-1 = mmap(): ENOMEM");
+ return (caddr_t) -1;
+ }
+ }
+
+ DWORD access = (prot & PROT_WRITE) ? FILE_MAP_WRITE : FILE_MAP_READ;
+ if (flags & MAP_PRIVATE)
+ access = FILE_MAP_COPY;
+ DWORD protect;
+
+ if (access & FILE_MAP_COPY)
+ protect = PAGE_WRITECOPY;
+ else if (access & FILE_MAP_WRITE)
+ protect = PAGE_READWRITE;
+ else
+ protect = PAGE_READONLY;
+
+ HANDLE hFile;
+
+ if (fd == -1)
+ hFile = (HANDLE) 0xFFFFFFFF;
+ else
+ {
+ /* Ensure that fd is open */
+ if (dtable.not_open (fd))
+ {
+ set_errno (EBADF);
+ syscall_printf ("-1 = mmap(): EBADF");
+ ReleaseResourceLock(LOCK_MMAP_LIST,READ_LOCK|WRITE_LOCK," mmap");
+ return (caddr_t) -1;
+ }
+ hFile = dtable[fd]->get_handle ();
+ }
+
+ HANDLE h = CreateFileMapping (hFile, &sec_none, protect, 0, len, NULL);
+ if (h == 0)
+ {
+ __seterrno ();
+ syscall_printf ("-1 = mmap(): CreateFileMapping failed with %E");
+ ReleaseResourceLock(LOCK_MMAP_LIST,READ_LOCK|WRITE_LOCK," mmap");
+ return (caddr_t) -1;
+ }
+
+ void *base;
+
+ if (flags & MAP_FIXED)
+ {
+ base = MapViewOfFileEx (h, access, 0, off, len, addr);
+ if (base != addr)
+ {
+ __seterrno ();
+ syscall_printf ("-1 = mmap(): MapViewOfFileEx failed with %E");
+ CloseHandle (h);
+ ReleaseResourceLock(LOCK_MMAP_LIST,READ_LOCK|WRITE_LOCK," mmap");
+ return (caddr_t) -1;
+ }
+ }
+ else
+ {
+ base = MapViewOfFile (h, access, 0, off, len);
+ if (base == 0)
+ {
+ __seterrno ();
+ syscall_printf ("-1 = mmap(): MapViewOfFile failed with %E");
+ CloseHandle (h);
+ ReleaseResourceLock(LOCK_MMAP_LIST,READ_LOCK|WRITE_LOCK," mmap");
+ return (caddr_t) -1;
+ }
+ }
+
+ /* Now we should have a successfully mmaped area.
+ Need to save it so forked children can reproduce it.
+ */
+
+ mmap_record mmap_rec (h, access, off, len, base);
+
+ /* Get list of mmapped areas for this fd, create a new one if
+ one does not exist yet.
+ */
+
+ list *l = mmapped_areas->get_list_by_fd (fd);
+ if (l == 0)
+ {
+ /* Create a new one */
+ l = new list;
+ if (l == 0)
+ {
+ UnmapViewOfFile (base);
+ CloseHandle (h);
+ set_errno (ENOMEM);
+ syscall_printf ("-1 = mmap(): ENOMEM");
+ ReleaseResourceLock(LOCK_MMAP_LIST,READ_LOCK|WRITE_LOCK," mmap");
+ return (caddr_t) -1;
+ }
+ l = mmapped_areas->add_list (l, fd);
+ }
+
+ /* Insert into the list */
+ l->add_record (mmap_rec);
+
+ syscall_printf ("%x = mmap() succeeded", base);
+ ReleaseResourceLock(LOCK_MMAP_LIST,READ_LOCK|WRITE_LOCK," mmap");
+ return (caddr_t) base;
+}
+
+/* munmap () removes an mmapped area. It insists that base area
+ requested is the same as that mmapped, error if not. */
+
+extern "C"
+int
+munmap (caddr_t addr, size_t len)
+{
+ syscall_printf ("munmap (addr %x, len %d)", addr, len);
+
+ SetResourceLock(LOCK_MMAP_LIST,WRITE_LOCK|READ_LOCK," munmap");
+ /* Check if a mmap'ed area was ever created */
+ if (mmapped_areas == 0)
+ {
+ syscall_printf ("-1 = munmap(): mmapped_areas == 0");
+ set_errno (EINVAL);
+ ReleaseResourceLock(LOCK_MMAP_LIST,WRITE_LOCK|READ_LOCK," munmap");
+ return -1;
+ }
+
+ /* Iterate through the map, looking for the mmapped area.
+ Error if not found. */
+
+ int it;
+ for (it = 0; it < mmapped_areas->nlists; ++it)
+ {
+ list *l = mmapped_areas->lists[it];
+ if (l != 0)
+ {
+ int li;
+ for (li = 0; li < l->nrecs; ++li)
+ {
+ mmap_record rec = l->recs[li];
+ if (rec.get_address () == addr)
+ {
+ /* Unmap the area */
+ UnmapViewOfFile (addr);
+ CloseHandle (rec.get_handle ());
+ /* Delete the entry. */
+ l->erase (li);
+ syscall_printf ("0 = munmap(): %x", addr);
+ ReleaseResourceLock(LOCK_MMAP_LIST,WRITE_LOCK|READ_LOCK," munmap");
+ return 0;
+ }
+ }
+ }
+ }
+ set_errno (EINVAL);
+
+ syscall_printf ("-1 = munmap(): EINVAL");
+
+ ReleaseResourceLock(LOCK_MMAP_LIST,WRITE_LOCK|READ_LOCK," munmap");
+ return -1;
+}
+
+/* Sync file with memory. Ignore flags for now. */
+
+extern "C"
+int
+msync (caddr_t addr, size_t len, int flags)
+{
+ syscall_printf ("addr = %x, len = %d, flags = %x",
+ addr, len, flags);
+
+ if (FlushViewOfFile (addr, len) == 0)
+ {
+ syscall_printf ("-1 = msync: %E");
+ __seterrno ();
+ return -1;
+ }
+ syscall_printf ("0 = msync");
+ return 0;
+}
+
+/* Set memory protection */
+
+extern "C"
+int
+mprotect (caddr_t addr, size_t len, int prot)
+{
+ DWORD old_prot;
+ DWORD new_prot = 0;
+
+ syscall_printf ("mprotect (addr %x, len %d, prot %x)", addr, len, prot);
+
+ if (prot == PROT_NONE)
+ new_prot = PAGE_NOACCESS;
+ else
+ {
+ switch (prot)
+ {
+ case PROT_READ | PROT_WRITE | PROT_EXEC:
+ new_prot = PAGE_EXECUTE_READWRITE;
+ break;
+ case PROT_READ | PROT_WRITE:
+ new_prot = PAGE_READWRITE;
+ break;
+ case PROT_READ | PROT_EXEC:
+ new_prot = PAGE_EXECUTE_READ;
+ break;
+ case PROT_READ:
+ new_prot = PAGE_READONLY;
+ break;
+ default:
+ syscall_printf ("-1 = mprotect (): invalid prot value");
+ set_errno (EINVAL);
+ return -1;
+ }
+ }
+
+ if (VirtualProtect (addr, len, new_prot, &old_prot) == 0)
+ {
+ __seterrno ();
+ syscall_printf ("-1 = mprotect (): %E");
+ return -1;
+ }
+
+ syscall_printf ("0 = mprotect ()");
+ return 0;
+}
+
+/*
+ * Call to re-create all the file mappings in a forked
+ * child. Called from the child in initialization. At this
+ * point we are passed a valid mmaped_areas map, and all the
+ * HANDLE's are valid for the child, but none of the
+ * mapped areas are in our address space. We need to iterate
+ * through the map, doing the MapViewOfFile calls.
+ */
+
+int __stdcall
+recreate_mmaps_after_fork (void *param)
+{
+ map *areas = (map *)param;
+ void *base;
+
+ debug_printf ("recreate_mmaps_after_fork, mmapped_areas %p", areas);
+
+ /* Check if a mmapped area was ever created */
+ if (areas == 0)
+ return 0;
+
+ /* Iterate through the map */
+
+ int it;
+
+ for (it = 0; it < areas->nlists; ++it)
+ {
+ list *l = areas->lists[it];
+ if (l != 0)
+ {
+ int li;
+ for (li = 0; li < l->nrecs; ++li)
+ {
+ mmap_record rec = l->recs[li];
+
+ debug_printf ("h %x, access %x, offset %d, size %d, address %p",
+ rec.get_handle (), rec.get_access (), rec.get_offset (),
+ rec.get_size (), rec.get_address ());
+
+ /* Now re-create the MapViewOfFileEx call */
+ base = MapViewOfFileEx (rec.get_handle (),
+ rec.get_access (), 0,
+ rec.get_offset (),
+ rec.get_size (),
+ rec.get_address ());
+ if (base != rec.get_address ())
+ {
+ system_printf ("base address %p fails to match requested address %p",
+ rec.get_address ());
+ return -1;
+ }
+ }
+ }
+ }
+
+ /* Now set our mmap record in case the child forks. */
+ mmapped_areas = areas;
+
+ debug_printf ("succeeded");
+
+ return 0;
+}
+
+/* Set a child mmap ptr from our static one. Used to set child mmap
+ pointer for fork. */
+
+void __stdcall
+set_child_mmap_ptr (pinfo *child)
+{
+ child->mmap_ptr = (void *) mmapped_areas;
+}
diff --git a/winsup/cygwin/net.cc b/winsup/cygwin/net.cc
new file mode 100644
index 000000000..1cff9b309
--- /dev/null
+++ b/winsup/cygwin/net.cc
@@ -0,0 +1,1827 @@
+/* net.cc: network-related routines.
+
+ Copyright 1996, 1997, 1998, 1999, 2000 Cygnus Solutions.
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+/* #define DEBUG_NEST_ON 1 */
+
+#define __INSIDE_CYGWIN_NET__
+
+#include <errno.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+
+#define Win32_Winsock
+#include "winsup.h"
+#include <netdb.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include "autoload.h"
+#include <winsock.h>
+
+/* We only want to initialize WinSock in a child process if socket
+ handles are inheritted. This global allows us to know whether this
+ should be done or not */
+int number_of_sockets = 0;
+
+extern "C"
+{
+int h_errno;
+
+int __stdcall rcmd (char **ahost, unsigned short inport, char *locuser,
+ char *remuser, char *cmd, SOCKET *fd2p);
+int __stdcall rexec (char **ahost, unsigned short inport, char *locuser,
+ char *password, char *cmd, SOCKET *fd2p);
+int __stdcall rresvport (int *);
+int sscanf (const char *, const char *, ...);
+} /* End of "C" section */
+
+/* Cygwin internal */
+static SOCKET
+duplicate_socket (SOCKET sock)
+{
+ /* Do not duplicate socket on Windows NT because of problems with
+ MS winsock proxy server.
+ */
+ if (os_being_run == winNT)
+ return sock;
+
+ SOCKET newsock;
+ if (DuplicateHandle (hMainProc, (HANDLE) sock, hMainProc, (HANDLE *) &newsock,
+ 0, TRUE, DUPLICATE_SAME_ACCESS))
+ {
+ closesocket (sock);
+ sock = newsock;
+ }
+ else
+ small_printf ("DuplicateHandle failed %E");
+ return sock;
+}
+
+/* htonl: standards? */
+extern "C"
+unsigned long int
+htonl (unsigned long int x)
+{
+ MARK ();
+ return ((((x & 0x000000ffU) << 24) |
+ ((x & 0x0000ff00U) << 8) |
+ ((x & 0x00ff0000U) >> 8) |
+ ((x & 0xff000000U) >> 24)));
+}
+
+/* ntohl: standards? */
+extern "C"
+unsigned long int
+ntohl (unsigned long int x)
+{
+ return htonl (x);
+}
+
+/* htons: standards? */
+extern "C"
+unsigned short
+htons (unsigned short x)
+{
+ MARK ();
+ return ((((x & 0x000000ffU) << 8) |
+ ((x & 0x0000ff00U) >> 8)));
+}
+
+/* ntohs: standards? */
+extern "C"
+unsigned short
+ntohs (unsigned short x)
+{
+ return htons (x);
+}
+
+/* Cygwin internal */
+static void
+dump_protoent (struct protoent *p)
+{
+ if (p)
+ debug_printf ("protoent %s %x %x", p->p_name, p->p_aliases, p->p_proto);
+}
+
+/* exported as inet_ntoa: standards? */
+extern "C"
+char *
+cygwin_inet_ntoa (struct in_addr in)
+{
+ char *res = inet_ntoa (in);
+ return res;
+}
+
+/* exported as inet_addr: standards? */
+extern "C"
+unsigned long
+cygwin_inet_addr (const char *cp)
+{
+ unsigned long res = inet_addr (cp);
+ return res;
+}
+
+/* inet_netof is in the standard BSD sockets library. It is useless
+ for modern networks, since it assumes network values which are no
+ longer meaningful, but some existing code calls it. */
+
+extern "C"
+unsigned long
+inet_netof (struct in_addr in)
+{
+ unsigned long i, res;
+
+
+ i = ntohl (in.s_addr);
+ if (IN_CLASSA (i))
+ res = (i & IN_CLASSA_NET) >> IN_CLASSA_NSHIFT;
+ else if (IN_CLASSB (i))
+ res = (i & IN_CLASSB_NET) >> IN_CLASSB_NSHIFT;
+ else
+ res = (i & IN_CLASSC_NET) >> IN_CLASSC_NSHIFT;
+
+
+ return res;
+}
+
+/* inet_makeaddr is in the standard BSD sockets library. It is
+ useless for modern networks, since it assumes network values which
+ are no longer meaningful, but some existing code calls it. */
+
+extern "C"
+struct in_addr
+inet_makeaddr (int net, int lna)
+{
+ unsigned long i;
+ struct in_addr in;
+
+
+ if (net < IN_CLASSA_MAX)
+ i = (net << IN_CLASSA_NSHIFT) | (lna & IN_CLASSA_HOST);
+ else if (net < IN_CLASSB_MAX)
+ i = (net << IN_CLASSB_NSHIFT) | (lna & IN_CLASSB_HOST);
+ else if (net < 0x1000000)
+ i = (net << IN_CLASSC_NSHIFT) | (lna & IN_CLASSC_HOST);
+ else
+ i = net | lna;
+
+ in.s_addr = htonl (i);
+
+
+ return in;
+}
+
+struct tl
+{
+ int w;
+ const char *s;
+ int e;
+};
+
+static struct tl errmap[] =
+{
+ {WSAEWOULDBLOCK, "WSAEWOULDBLOCK", EWOULDBLOCK},
+ {WSAEINPROGRESS, "WSAEINPROGRESS", EINPROGRESS},
+ {WSAEALREADY, "WSAEALREADY", EALREADY},
+ {WSAENOTSOCK, "WSAENOTSOCK", ENOTSOCK},
+ {WSAEDESTADDRREQ, "WSAEDESTADDRREQ", EDESTADDRREQ},
+ {WSAEMSGSIZE, "WSAEMSGSIZE", EMSGSIZE},
+ {WSAEPROTOTYPE, "WSAEPROTOTYPE", EPROTOTYPE},
+ {WSAENOPROTOOPT, "WSAENOPROTOOPT", ENOPROTOOPT},
+ {WSAEPROTONOSUPPORT, "WSAEPROTONOSUPPORT", EPROTONOSUPPORT},
+ {WSAESOCKTNOSUPPORT, "WSAESOCKTNOSUPPORT", ESOCKTNOSUPPORT},
+ {WSAEOPNOTSUPP, "WSAEOPNOTSUPP", EOPNOTSUPP},
+ {WSAEPFNOSUPPORT, "WSAEPFNOSUPPORT", EPFNOSUPPORT},
+ {WSAEAFNOSUPPORT, "WSAEAFNOSUPPORT", EAFNOSUPPORT},
+ {WSAEADDRINUSE, "WSAEADDRINUSE", EADDRINUSE},
+ {WSAEADDRNOTAVAIL, "WSAEADDRNOTAVAIL", EADDRNOTAVAIL},
+ {WSAENETDOWN, "WSAENETDOWN", ENETDOWN},
+ {WSAENETUNREACH, "WSAENETUNREACH", ENETUNREACH},
+ {WSAENETRESET, "WSAENETRESET", ENETRESET},
+ {WSAECONNABORTED, "WSAECONNABORTED", ECONNABORTED},
+ {WSAECONNRESET, "WSAECONNRESET", ECONNRESET},
+ {WSAENOBUFS, "WSAENOBUFS", ENOBUFS},
+ {WSAEISCONN, "WSAEISCONN", EISCONN},
+ {WSAENOTCONN, "WSAENOTCONN", ENOTCONN},
+ {WSAESHUTDOWN, "WSAESHUTDOWN", ESHUTDOWN},
+ {WSAETOOMANYREFS, "WSAETOOMANYREFS", ETOOMANYREFS},
+ {WSAETIMEDOUT, "WSAETIMEDOUT", ETIMEDOUT},
+ {WSAECONNREFUSED, "WSAECONNREFUSED", ECONNREFUSED},
+ {WSAELOOP, "WSAELOOP", ELOOP},
+ {WSAENAMETOOLONG, "WSAENAMETOOLONG", ENAMETOOLONG},
+ {WSAEHOSTDOWN, "WSAEHOSTDOWN", EHOSTDOWN},
+ {WSAEHOSTUNREACH, "WSAEHOSTUNREACH", EHOSTUNREACH},
+ {WSAENOTEMPTY, "WSAENOTEMPTY", ENOTEMPTY},
+ {WSAEPROCLIM, "WSAEPROCLIM", EPROCLIM},
+ {WSAEUSERS, "WSAEUSERS", EUSERS},
+ {WSAEDQUOT, "WSAEDQUOT", EDQUOT},
+ {WSAESTALE, "WSAESTALE", ESTALE},
+ {WSAEREMOTE, "WSAEREMOTE", EREMOTE},
+ {WSAEINVAL, "WSAEINVAL", EINVAL},
+ {WSAEFAULT, "WSAEFAULT", EFAULT},
+ {0}
+};
+
+/* Cygwin internal */
+void
+set_winsock_errno ()
+{
+ int i;
+ int why = WSAGetLastError ();
+ for (i = 0; errmap[i].w != 0; ++i)
+ if (why == errmap[i].w)
+ break;
+
+ if (errmap[i].w != 0)
+ {
+ syscall_printf ("%d (%s) -> %d", why, errmap[i].s, errmap[i].e);
+ set_errno (errmap[i].e);
+ }
+ else
+ {
+ syscall_printf ("unknown error %d", why);
+ set_errno (EPERM);
+ }
+}
+
+static struct tl host_errmap[] =
+{
+ {WSAHOST_NOT_FOUND, "WSAHOST_NOT_FOUND", HOST_NOT_FOUND},
+ {WSATRY_AGAIN, "WSATRY_AGAIN", TRY_AGAIN},
+ {WSANO_RECOVERY, "WSANO_RECOVERY", NO_RECOVERY},
+ {WSANO_DATA, "WSANO_DATA", NO_DATA},
+ {0}
+};
+
+/* Cygwin internal */
+static void
+set_host_errno ()
+{
+ int i;
+
+ int why = WSAGetLastError ();
+ for (i = 0; i < host_errmap[i].w != 0; ++i)
+ if (why == host_errmap[i].w)
+ break;
+
+ if (host_errmap[i].w != 0)
+ h_errno = host_errmap[i].e;
+ else
+ h_errno = NETDB_INTERNAL;
+}
+
+/* exported as getprotobyname: standards? */
+extern "C"
+struct protoent *
+cygwin_getprotobyname (const char *p)
+{
+
+ struct protoent *res = getprotobyname (p);
+ if (!res)
+ set_winsock_errno ();
+
+ dump_protoent (res);
+ return res;
+}
+
+/* exported as getprotobynumber: standards? */
+extern "C"
+struct protoent *
+cygwin_getprotobynumber (int number)
+{
+
+ struct protoent *res = getprotobynumber (number);
+ if (!res)
+ set_winsock_errno ();
+
+ dump_protoent (res);
+ return res;
+}
+
+void
+fdsock (int fd, const char *name, SOCKET soc)
+{
+ fhandler_base *fh = dtable.build_fhandler(fd, FH_SOCKET, name);
+ fh->set_io_handle ((HANDLE) soc);
+ fh->set_flags (O_RDWR);
+}
+
+/* exported as socket: standards? */
+extern "C"
+int
+cygwin_socket (int af, int type, int protocol)
+{
+ int res = -1;
+ SetResourceLock(LOCK_FD_LIST,WRITE_LOCK|READ_LOCK," socket");
+
+ SOCKET soc;
+
+ int fd = dtable.find_unused_handle ();
+
+ if (fd < 0)
+ {
+ set_errno (ENMFILE);
+ }
+ else
+ {
+ debug_printf ("socket (%d, %d, %d)", af, type, protocol);
+
+ soc = socket (AF_INET, type, 0);
+
+ if (soc == INVALID_SOCKET)
+ {
+ set_winsock_errno ();
+ goto done;
+ }
+
+ soc = duplicate_socket (soc);
+
+ const char *name;
+ if (af == AF_INET)
+ name = (type == SOCK_STREAM ? "/dev/tcp" : "/dev/udp");
+ else
+ name = (type == SOCK_STREAM ? "/dev/streamsocket" : "/dev/dgsocket");
+
+ fdsock (fd, name, soc);
+ res = fd;
+ fhandler_socket *h = (fhandler_socket *) dtable[fd];
+
+ h->set_addr_family (af);
+ }
+
+done:
+ syscall_printf ("%d = socket (%d, %d, %d)", res, af, type, protocol);
+ ReleaseResourceLock(LOCK_FD_LIST,WRITE_LOCK|READ_LOCK," socket");
+ return res;
+}
+
+/* cygwin internal: map sockaddr into internet domain address */
+
+static int get_inet_addr (const struct sockaddr *in, int inlen,
+ struct sockaddr_in *out, int *outlen)
+{
+ if (in->sa_family == AF_INET)
+ {
+ *out = * (sockaddr_in *)in;
+ *outlen = inlen;
+ return 1;
+ }
+ else if (in->sa_family == AF_UNIX)
+ {
+ sockaddr_in sin;
+ char buf[32];
+
+ memset (buf, 0, sizeof buf);
+ int fd = open (in->sa_data, O_RDONLY);
+ if (fd == -1)
+ return 0;
+ if (read (fd, buf, sizeof buf) == -1)
+ return 0;
+ sin.sin_family = AF_INET;
+ sscanf (buf + strlen (SOCKET_COOKIE), "%hu", &sin.sin_port);
+ sin.sin_port = htons (sin.sin_port);
+ sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
+ *out = sin;
+ *outlen = sizeof sin;
+ return 1;
+ }
+ else
+ {
+ set_errno (EAFNOSUPPORT);
+ return 0;
+ }
+}
+
+/* exported as sendto: standards? */
+extern "C"
+int
+cygwin_sendto (int fd,
+ const void *buf,
+ int len,
+ unsigned int flags,
+ const struct sockaddr *to,
+ int tolen)
+{
+ fhandler_socket *h = (fhandler_socket *) dtable[fd];
+ sockaddr_in sin;
+
+ if (get_inet_addr (to, tolen, &sin, &tolen) == 0)
+ return -1;
+
+ int res = sendto (h->get_socket (), (const char *) buf, len,
+ flags, to, tolen);
+ if (res == SOCKET_ERROR)
+ {
+ set_winsock_errno ();
+ res = -1;
+ }
+ return res;
+}
+
+/* exported as recvfrom: standards? */
+extern "C"
+int
+cygwin_recvfrom (int fd,
+ char *buf,
+ int len,
+ int flags,
+ struct sockaddr *from,
+ int *fromlen)
+{
+ fhandler_socket *h = (fhandler_socket *) dtable[fd];
+
+ debug_printf ("recvfrom %d", h->get_socket ());
+
+ int res = recvfrom (h->get_socket (), buf, len, flags, from, fromlen);
+ if (res == SOCKET_ERROR)
+ {
+ set_winsock_errno ();
+ res = -1;
+ }
+
+ return res;
+}
+
+/* Cygwin internal */
+fhandler_socket *
+get (int fd)
+{
+ if (dtable.not_open (fd))
+ {
+ set_errno (EINVAL);
+ return 0;
+ }
+
+ return dtable[fd]->is_socket ();
+}
+
+/* exported as setsockopt: standards? */
+extern "C"
+int
+cygwin_setsockopt (int fd,
+ int level,
+ int optname,
+ const void *optval,
+ int optlen)
+{
+ fhandler_socket *h = get (fd);
+ int res = -1;
+ const char *name = "error";
+
+ if (h)
+ {
+ /* For the following debug_printf */
+ switch (optname)
+ {
+ case SO_DEBUG:
+ name="SO_DEBUG";
+ break;
+ case SO_ACCEPTCONN:
+ name="SO_ACCEPTCONN";
+ break;
+ case SO_REUSEADDR:
+ name="SO_REUSEADDR";
+ break;
+ case SO_KEEPALIVE:
+ name="SO_KEEPALIVE";
+ break;
+ case SO_DONTROUTE:
+ name="SO_DONTROUTE";
+ break;
+ case SO_BROADCAST:
+ name="SO_BROADCAST";
+ break;
+ case SO_USELOOPBACK:
+ name="SO_USELOOPBACK";
+ break;
+ case SO_LINGER:
+ name="SO_LINGER";
+ break;
+ case SO_OOBINLINE:
+ name="SO_OOBINLINE";
+ break;
+ }
+
+ res = setsockopt (h->get_socket (), level, optname,
+ (const char *) optval, optlen);
+
+ if (optlen == 4)
+ syscall_printf ("setsockopt optval=%x", *(long *) optval);
+
+ if (res)
+ set_winsock_errno ();
+ }
+
+ syscall_printf ("%d = setsockopt (%d, %d, %x (%s), %x, %d)",
+ res, fd, level, optname, name, optval, optlen);
+ return res;
+}
+
+/* exported as getsockopt: standards? */
+extern "C"
+int
+cygwin_getsockopt (int fd,
+ int level,
+ int optname,
+ void *optval,
+ int *optlen)
+{
+ fhandler_socket *h = get (fd);
+ int res = -1;
+ const char *name = "error";
+ if (h)
+ {
+ /* For the following debug_printf */
+ switch (optname)
+ {
+ case SO_DEBUG:
+ name="SO_DEBUG";
+ break;
+ case SO_ACCEPTCONN:
+ name="SO_ACCEPTCONN";
+ break;
+ case SO_REUSEADDR:
+ name="SO_REUSEADDR";
+ break;
+ case SO_KEEPALIVE:
+ name="SO_KEEPALIVE";
+ break;
+ case SO_DONTROUTE:
+ name="SO_DONTROUTE";
+ break;
+ case SO_BROADCAST:
+ name="SO_BROADCAST";
+ break;
+ case SO_USELOOPBACK:
+ name="SO_USELOOPBACK";
+ break;
+ case SO_LINGER:
+ name="SO_LINGER";
+ break;
+ case SO_OOBINLINE:
+ name="SO_OOBINLINE";
+ break;
+ }
+
+ res = getsockopt (h->get_socket (), level, optname,
+ (char *) optval, (int *) optlen);
+
+ if (res)
+ set_winsock_errno ();
+ }
+
+ syscall_printf ("%d = getsockopt (%d, %d, %x (%s), %x, %d)",
+ res, fd, level, optname, name, optval, optlen);
+ return res;
+}
+
+/* exported as connect: standards? */
+extern "C"
+int
+cygwin_connect (int fd,
+ const struct sockaddr *name,
+ int namelen)
+{
+ int res;
+ fhandler_socket *sock = get (fd);
+ sockaddr_in sin;
+
+ if (get_inet_addr (name, namelen, &sin, &namelen) == 0)
+ return -1;
+
+ if (!sock)
+ {
+ res = -1;
+ }
+ else
+ {
+ res = connect (sock->get_socket (), (sockaddr *) &sin, namelen);
+ if (res)
+ set_winsock_errno ();
+ }
+ return res;
+}
+
+/* exported as getservbyname: standards? */
+extern "C"
+struct servent *
+cygwin_getservbyname (const char *name, const char *proto)
+{
+ struct servent *p = getservbyname (name, proto);
+ if (!p)
+ set_winsock_errno ();
+
+ syscall_printf ("%x = getservbyname (%s, %s)", p, name, proto);
+ return p;
+}
+
+/* exported as getservbyport: standards? */
+extern "C"
+struct servent *
+cygwin_getservbyport (int port, const char *proto)
+{
+ struct servent *p = getservbyport (port, proto);
+ if (!p)
+ set_winsock_errno ();
+
+ syscall_printf ("%x = getservbyport (%d, %s)", p, port, proto);
+ return p;
+}
+
+extern "C"
+int
+cygwin_gethostname (char *name, size_t len)
+{
+ int PASCAL win32_gethostname(char*,int);
+
+ if (wsock32_handle == NULL ||
+ win32_gethostname (name, len) == SOCKET_ERROR)
+ {
+ DWORD local_len = len;
+
+ if (!GetComputerNameA (name, &local_len))
+ {
+ set_winsock_errno ();
+ return -1;
+ }
+ }
+ debug_printf ("name %s\n", name);
+ h_errno = 0;
+ return 0;
+}
+
+/* exported as gethostbyname: standards? */
+extern "C"
+struct hostent *
+cygwin_gethostbyname (const char *name)
+{
+ static unsigned char tmp_addr[4];
+ static struct hostent tmp;
+ static char *tmp_aliases[1] = {0};
+ static char *tmp_addr_list[2] = {0,0};
+ static int a, b, c, d;
+ if (sscanf(name, "%d.%d.%d.%d", &a, &b, &c, &d) == 4)
+ {
+ /* In case you don't have DNS, at least x.x.x.x still works */
+ memset(&tmp, 0, sizeof(tmp));
+ tmp_addr[0] = a;
+ tmp_addr[1] = b;
+ tmp_addr[2] = c;
+ tmp_addr[3] = d;
+ tmp_addr_list[0] = (char *)tmp_addr;
+ tmp.h_name = name;
+ tmp.h_aliases = tmp_aliases;
+ tmp.h_addrtype = 2;
+ tmp.h_length = 4;
+ tmp.h_addr_list = tmp_addr_list;
+ return &tmp;
+ }
+
+ struct hostent *ptr = gethostbyname (name);
+ if (!ptr)
+ {
+ set_winsock_errno ();
+ set_host_errno ();
+ }
+ else
+ {
+ debug_printf ("h_name %s", ptr->h_name);
+ h_errno = 0;
+ }
+ return ptr;
+}
+
+/* exported as accept: standards? */
+extern "C"
+int
+cygwin_accept (int fd, struct sockaddr *peer, int *len)
+{
+ int res = -1;
+
+ fhandler_socket *sock = get (fd);
+ if (sock)
+ {
+ /* accept on NT fails if len < sizeof (sockaddr_in)
+ * some programs set len to
+ * sizeof(name.sun_family) + strlen(name.sun_path) for UNIX domain
+ */
+ if (len && ((unsigned) *len < sizeof (struct sockaddr_in)))
+ *len = sizeof (struct sockaddr_in);
+
+ res = accept (sock->get_socket (), peer, len); // can't use a blocking call inside a lock
+
+ SetResourceLock(LOCK_FD_LIST,WRITE_LOCK|READ_LOCK," accept");
+
+ int res_fd = dtable.find_unused_handle ();
+ if (res_fd == -1)
+ {
+ /* FIXME: what is correct errno? */
+ set_errno (EMFILE);
+ goto done;
+ }
+ if ((SOCKET) res == (SOCKET) INVALID_SOCKET)
+ set_winsock_errno ();
+ else
+ {
+ res = duplicate_socket (res);
+
+ fdsock (res_fd, sock->get_name (), res);
+ res = res_fd;
+ }
+ }
+done:
+ syscall_printf ("%d = accept (%d, %x, %x)", res, fd, peer, len);
+ ReleaseResourceLock(LOCK_FD_LIST,WRITE_LOCK|READ_LOCK," accept");
+ return res;
+}
+
+/* exported as bind: standards? */
+extern "C"
+int
+cygwin_bind (int fd, struct sockaddr *my_addr, int addrlen)
+{
+ int res = -1;
+
+ fhandler_socket *sock = get (fd);
+ if (sock)
+ {
+ if (my_addr->sa_family == AF_UNIX)
+ {
+#define un_addr ((struct sockaddr_un *) my_addr)
+ struct sockaddr_in sin;
+ int len = sizeof sin;
+ int fd;
+
+ if (strlen (un_addr->sun_path) >= UNIX_PATH_LEN)
+ {
+ set_errno (ENAMETOOLONG);
+ goto out;
+ }
+ sin.sin_family = AF_INET;
+ sin.sin_port = 0;
+ sin.sin_addr.s_addr = htonl (INADDR_LOOPBACK);
+ if (bind (sock->get_socket (), (sockaddr *) &sin, len))
+ {
+ syscall_printf ("AF_UNIX: bind failed %d", get_errno ());
+ set_winsock_errno ();
+ goto out;
+ }
+ if (getsockname (sock->get_socket (), (sockaddr *) &sin, &len))
+ {
+ syscall_printf ("AF_UNIX: getsockname failed %d", get_errno ());
+ set_winsock_errno ();
+ goto out;
+ }
+
+ sin.sin_port = ntohs (sin.sin_port);
+ debug_printf ("AF_UNIX: socket bound to port %u", sin.sin_port);
+
+ /* bind must fail if file system socket object already exists
+ so _open() is called with O_EXCL flag. */
+ fd = _open (un_addr->sun_path,
+ O_WRONLY | O_CREAT | O_EXCL | O_BINARY,
+ 0);
+ if (fd < 0)
+ {
+ if (get_errno () == EEXIST)
+ set_errno (EADDRINUSE);
+ goto out;
+ }
+
+ char buf[sizeof (SOCKET_COOKIE) + 10];
+ __small_sprintf (buf, "%s%u", SOCKET_COOKIE, sin.sin_port);
+ len = strlen (buf) + 1;
+
+ /* Note that the terminating nul is written. */
+ if (_write (fd, buf, len) != len)
+ {
+ save_errno here;
+ _close (fd);
+ _unlink (un_addr->sun_path);
+ }
+ else
+ {
+ _close (fd);
+ chmod (un_addr->sun_path,
+ (S_IFSOCK | S_IRWXU | S_IRWXG | S_IRWXO) & ~myself->umask);
+ res = 0;
+ }
+#undef un_addr
+ }
+ else if (bind (sock->get_socket (), my_addr, addrlen))
+ set_winsock_errno ();
+ else
+ res = 0;
+ }
+
+out:
+ syscall_printf ("%d = bind (%d, %x, %d)", res, fd, my_addr, addrlen);
+ return res;
+}
+
+/* exported as getsockname: standards? */
+extern "C"
+int
+cygwin_getsockname (int fd, struct sockaddr *addr, int *namelen)
+{
+ int res = -1;
+
+ fhandler_socket *sock = get (fd);
+ if (sock)
+ {
+ res = getsockname (sock->get_socket (), addr, namelen);
+ if (res)
+ set_winsock_errno ();
+
+ }
+ syscall_printf ("%d = getsockname (%d, %x, %d)", res, fd, addr, namelen);
+ return res;
+}
+
+/* exported as gethostbyaddr: standards? */
+extern "C"
+struct hostent *
+cygwin_gethostbyaddr (const char *addr, int len, int type)
+{
+ struct hostent *ptr = gethostbyaddr (addr, len, type);
+ if (!ptr)
+ {
+ set_winsock_errno ();
+ set_host_errno ();
+ }
+ else
+ {
+ debug_printf ("h_name %s", ptr->h_name);
+ h_errno = 0;
+ }
+ return ptr;
+}
+
+/* exported as listen: standards? */
+extern "C"
+int
+cygwin_listen (int fd, int backlog)
+{
+ int res = -1;
+
+
+ fhandler_socket *sock = get (fd);
+ if (sock)
+ {
+ res = listen (sock->get_socket (), backlog);
+ if (res)
+ set_winsock_errno ();
+ }
+ syscall_printf ("%d = listen (%d, %d)", res, fd, backlog);
+ return res;
+}
+
+/* exported as shutdown: standards? */
+extern "C"
+int
+cygwin_shutdown (int fd, int how)
+{
+ int res = -1;
+
+
+ fhandler_socket *sock = get (fd);
+ if (sock)
+ {
+ res = shutdown (sock->get_socket (), how);
+ if (res)
+ set_winsock_errno ();
+ }
+ syscall_printf ("%d = shutdown (%d, %d)", res, fd, how);
+ return res;
+}
+
+/* exported as herror: standards? */
+extern "C"
+void
+cygwin_herror (const char *p)
+{
+ debug_printf ("********%d*************", __LINE__);
+}
+
+/* exported as getpeername: standards? */
+extern "C"
+int
+cygwin_getpeername (int fd, struct sockaddr *name, int *len)
+{
+ fhandler_socket *h = (fhandler_socket *) dtable[fd];
+
+ debug_printf ("getpeername %d", h->get_socket ());
+ int res = getpeername (h->get_socket (), name, len);
+ if (res)
+ set_winsock_errno ();
+
+ debug_printf ("%d = getpeername %d", res, h->get_socket ());
+ return res;
+}
+
+/* exported as recv: standards? */
+extern "C"
+int
+cygwin_recv (int fd, void *buf, int len, unsigned int flags)
+{
+ fhandler_socket *h = (fhandler_socket *) dtable[fd];
+
+ int res = recv (h->get_socket (), (char *) buf, len, flags);
+ if (res == SOCKET_ERROR)
+ {
+ set_winsock_errno ();
+ res = -1;
+ }
+
+#if 0
+ if (res > 0 && res < 200)
+ for (int i=0; i < res; i++)
+ system_printf ("%d %x %c", i, ((char *) buf)[i], ((char *) buf)[i]);
+#endif
+
+ syscall_printf ("%d = recv (%d, %x, %x, %x)", res, fd, buf, len, flags);
+
+ return res;
+}
+
+/* exported as send: standards? */
+extern "C"
+int
+cygwin_send (int fd, const void *buf, int len, unsigned int flags)
+{
+ fhandler_socket *h = (fhandler_socket *) dtable[fd];
+
+ int res = send (h->get_socket (), (const char *) buf, len, flags);
+ if (res == SOCKET_ERROR)
+ {
+ set_winsock_errno ();
+ res = -1;
+ }
+
+ syscall_printf ("%d = send (%d, %x, %d, %x)", res, fd, buf, len, flags);
+
+ return res;
+}
+
+/* getdomainname: standards? */
+extern "C"
+int
+getdomainname (char *domain, int len)
+{
+ /*
+ * This works for Win95 only if the machine is configured to use MS-TCP.
+ * If a third-party TCP is being used this will fail.
+ * FIXME: On Win95, is there a way to portably check the TCP stack
+ * in use and include paths for the Domain name in each ?
+ * Punt for now and assume MS-TCP on Win95.
+ */
+ reg_key r (HKEY_LOCAL_MACHINE, KEY_READ,
+ (os_being_run != winNT) ? "System" : "SYSTEM",
+ "CurrentControlSet", "Services",
+ (os_being_run != winNT) ? "MSTCP" : "Tcpip",
+ NULL);
+
+ /* FIXME: Are registry keys case sensitive? */
+ if (r.error () || r.get_string ("Domain", domain, len, "") != ERROR_SUCCESS)
+ {
+ __seterrno ();
+ return -1;
+ }
+
+ return 0;
+}
+
+/* Cygwin internal */
+/* Fill out an ifconf struct.
+ *
+ * Windows NT:
+ * Look at the Bind value in
+ * HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Linkage\
+ * This is a REG_MULTI_SZ with strings of the form:
+ * \Device\<Netcard>, where netcard is the name of the net device.
+ * Then look under:
+ * HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\<NetCard>\
+ * Parameters\Tcpip
+ * at the IPAddress, Subnetmask and DefaultGateway values for the
+ * required values.
+ *
+ * Windows 9x:
+ * We originally just did a gethostbyname, assuming that it's pretty
+ * unlikely Win9x will ever have more than one netcard. When this
+ * succeeded, we got the interface plus a loopback.
+ * Currently, we read all
+ * "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Class\NetTrans\*"
+ * entries from the Registry and use all entries that have legal
+ * "IPAddress" and "IPMask" values.
+ */
+static int
+get_ifconf (struct ifconf *ifc, int what)
+{
+ if (os_being_run == winNT)
+ {
+ HKEY key;
+ DWORD type, size;
+ unsigned long lip, lnp;
+ int cnt = 1;
+ char *binding = (char *) 0;
+ struct sockaddr_in *sa;
+
+ /* Union maps buffer to correct struct */
+ struct ifreq *ifr = ifc->ifc_req;
+
+ /* Ensure we have space for two struct ifreqs, fail if not. */
+ if (ifc->ifc_len < (int) (2 * sizeof (struct ifreq)))
+ {
+ set_errno (EFAULT);
+ return -1;
+ }
+
+ /* Set up interface lo0 first */
+ strcpy (ifr->ifr_name, "lo0");
+ memset (&ifr->ifr_addr, '\0', sizeof (ifr->ifr_addr));
+ switch (what)
+ {
+ case SIOCGIFCONF:
+ case SIOCGIFADDR:
+ sa = (struct sockaddr_in *) &ifr->ifr_addr;
+ sa->sin_addr.s_addr = htonl (INADDR_LOOPBACK);
+ break;
+ case SIOCGIFBRDADDR:
+ lip = htonl (INADDR_LOOPBACK);
+ lnp = cygwin_inet_addr ("255.0.0.0");
+ sa = (struct sockaddr_in *) &ifr->ifr_broadaddr;
+ sa->sin_addr.s_addr = lip & lnp | ~lnp;
+ break;
+ case SIOCGIFNETMASK:
+ sa = (struct sockaddr_in *) &ifr->ifr_netmask;
+ sa->sin_addr.s_addr = cygwin_inet_addr ("255.0.0.0");
+ break;
+ default:
+ set_errno (EINVAL);
+ return -1;
+ }
+ sa->sin_family = AF_INET;
+ sa->sin_port = 0;
+
+ if (RegOpenKeyEx (HKEY_LOCAL_MACHINE,
+ "SYSTEM\\"
+ "CurrentControlSet\\"
+ "Services\\"
+ "Tcpip\\"
+ "Linkage",
+ 0, KEY_READ, &key) == ERROR_SUCCESS)
+ {
+ if (RegQueryValueEx (key, "Bind",
+ NULL, &type,
+ NULL, &size) == ERROR_SUCCESS)
+ {
+ binding = (char *) alloca (size);
+ if (RegQueryValueEx (key, "Bind",
+ NULL, &type,
+ (unsigned char *) binding,
+ &size) != ERROR_SUCCESS)
+ {
+ binding = NULL;
+ }
+ }
+ RegCloseKey (key);
+ }
+
+ if (binding)
+ {
+ char *bp, eth[2];
+ char cardkey[256], ipaddress[256], netmask[256];
+
+ eth[0] = '/';
+ eth[1] = '\0';
+ for (bp = binding; *bp; bp += strlen(bp) + 1)
+ {
+ bp += strlen ("\\Device\\");
+ strcpy (cardkey, "SYSTEM\\CurrentControlSet\\Services\\");
+ strcat (cardkey, bp);
+ strcat (cardkey, "\\Parameters\\Tcpip");
+
+ if (RegOpenKeyEx (HKEY_LOCAL_MACHINE, cardkey,
+ 0, KEY_READ, &key) != ERROR_SUCCESS)
+ continue;
+
+ if (RegQueryValueEx (key, "IPAddress",
+ NULL, &type,
+ (unsigned char *) &ipaddress,
+ (size = 256, &size)) == ERROR_SUCCESS
+ && RegQueryValueEx (key, "SubnetMask",
+ NULL, &type,
+ (unsigned char *) &netmask,
+ (size = 256, &size)) == ERROR_SUCCESS)
+ {
+ char *ip, *np;
+ char sub[2];
+ char dhcpaddress[256], dhcpnetmask[256];
+
+ sub[0] = '/';
+ sub[1] = '\0';
+ if (strncmp (bp, "NdisWan", 7))
+ ++*eth;
+ for (ip = ipaddress, np = netmask;
+ *ip && *np;
+ ip += strlen (ip) + 1, np += strlen (np) + 1)
+ {
+ if ((caddr_t) ++ifr > ifc->ifc_buf
+ + ifc->ifc_len
+ - sizeof (struct ifreq))
+ break;
+
+ if (! strncmp (bp, "NdisWan", 7))
+ {
+ strcpy (ifr->ifr_name, "ppp");
+ strcat (ifr->ifr_name, bp + 7);
+ }
+ else
+ {
+ strcpy (ifr->ifr_name, "eth");
+ strcat (ifr->ifr_name, eth);
+ }
+ ++*sub;
+ if (*sub >= '1')
+ strcat (ifr->ifr_name, sub);
+ memset (&ifr->ifr_addr, '\0', sizeof ifr->ifr_addr);
+ if (cygwin_inet_addr (ip) == 0L
+ && RegQueryValueEx (key, "DhcpIPAddress",
+ NULL, &type,
+ (unsigned char *) &dhcpaddress,
+ (size = 256, &size))
+ == ERROR_SUCCESS
+ && RegQueryValueEx (key, "DhcpSubnetMask",
+ NULL, &type,
+ (unsigned char *) &dhcpnetmask,
+ (size = 256, &size))
+ == ERROR_SUCCESS)
+ {
+ switch (what)
+ {
+ case SIOCGIFCONF:
+ case SIOCGIFADDR:
+ sa = (struct sockaddr_in *) &ifr->ifr_addr;
+ sa->sin_addr.s_addr =
+ cygwin_inet_addr (dhcpaddress);
+ break;
+ case SIOCGIFBRDADDR:
+ lip = cygwin_inet_addr (dhcpaddress);
+ lnp = cygwin_inet_addr (dhcpnetmask);
+ sa = (struct sockaddr_in *) &ifr->ifr_broadaddr;
+ sa->sin_addr.s_addr = lip & lnp | ~lnp;
+ break;
+ case SIOCGIFNETMASK:
+ sa = (struct sockaddr_in *) &ifr->ifr_netmask;
+ sa->sin_addr.s_addr =
+ cygwin_inet_addr (dhcpnetmask);
+ break;
+ }
+ }
+ else
+ {
+ switch (what)
+ {
+ case SIOCGIFCONF:
+ case SIOCGIFADDR:
+ sa = (struct sockaddr_in *) &ifr->ifr_addr;
+ sa->sin_addr.s_addr = cygwin_inet_addr (ip);
+ break;
+ case SIOCGIFBRDADDR:
+ lip = cygwin_inet_addr (ip);
+ lnp = cygwin_inet_addr (np);
+ sa = (struct sockaddr_in *) &ifr->ifr_broadaddr;
+ sa->sin_addr.s_addr = lip & lnp | ~lnp;
+ break;
+ case SIOCGIFNETMASK:
+ sa = (struct sockaddr_in *) &ifr->ifr_netmask;
+ sa->sin_addr.s_addr = cygwin_inet_addr (np);
+ break;
+ }
+ }
+ sa->sin_family = AF_INET;
+ sa->sin_port = 0;
+ ++cnt;
+ }
+ }
+ RegCloseKey (key);
+ }
+ }
+
+ /* Set the correct length */
+ ifc->ifc_len = cnt * sizeof (struct ifreq);
+ }
+ else /* Windows 9x */
+ {
+ HKEY key, subkey;
+ FILETIME update;
+ LONG res;
+ DWORD type, size;
+ unsigned long lip, lnp;
+ char ifname[256], ip[256], np[256];
+ int cnt = 1;
+ struct sockaddr_in *sa;
+
+ /* Union maps buffer to correct struct */
+ struct ifreq *ifr = ifc->ifc_req;
+ char eth[2];
+
+ eth[0] = '/';
+ eth[1] = '\0';
+
+ /* Ensure we have space for two struct ifreqs, fail if not. */
+ if (ifc->ifc_len < (int) (2 * sizeof (struct ifreq)))
+ {
+ set_errno (EFAULT);
+ return -1;
+ }
+
+ /* Set up interface lo0 first */
+ strcpy (ifr->ifr_name, "lo0");
+ memset (&ifr->ifr_addr, '\0', sizeof ifr->ifr_addr);
+ switch (what)
+ {
+ case SIOCGIFCONF:
+ case SIOCGIFADDR:
+ sa = (struct sockaddr_in *) &ifr->ifr_addr;
+ sa->sin_addr.s_addr = htonl (INADDR_LOOPBACK);
+ break;
+ case SIOCGIFBRDADDR:
+ lip = htonl(INADDR_LOOPBACK);
+ lnp = cygwin_inet_addr ("255.0.0.0");
+ sa = (struct sockaddr_in *) &ifr->ifr_broadaddr;
+ sa->sin_addr.s_addr = lip & lnp | ~lnp;
+ break;
+ case SIOCGIFNETMASK:
+ sa = (struct sockaddr_in *) &ifr->ifr_netmask;
+ sa->sin_addr.s_addr = cygwin_inet_addr ("255.0.0.0");
+ break;
+ default:
+ set_errno (EINVAL);
+ return -1;
+ }
+ sa->sin_family = AF_INET;
+ sa->sin_port = 0;
+
+ if (RegOpenKeyEx (HKEY_LOCAL_MACHINE,
+ "SYSTEM\\"
+ "CurrentControlSet\\"
+ "Services\\"
+ "Class\\"
+ "NetTrans",
+ 0, KEY_READ, &key) == ERROR_SUCCESS)
+ {
+ for (int i = 0;
+ (res = RegEnumKeyEx (key, i, ifname,
+ (size = sizeof ifname, &size),
+ 0, 0, 0, &update)) != ERROR_NO_MORE_ITEMS;
+ ++i)
+ {
+ if (res != ERROR_SUCCESS
+ || RegOpenKeyEx (key, ifname, 0,
+ KEY_READ, &subkey) != ERROR_SUCCESS)
+ continue;
+ if (RegQueryValueEx (subkey, "IPAddress", 0,
+ &type, (unsigned char *) ip,
+ (size = sizeof ip, &size)) == ERROR_SUCCESS
+ || RegQueryValueEx (subkey, "IPMask", 0,
+ &type, (unsigned char *) np,
+ (size = sizeof np, &size)) == ERROR_SUCCESS)
+ {
+ if ((caddr_t)++ifr > ifc->ifc_buf
+ + ifc->ifc_len
+ - sizeof(struct ifreq))
+ break;
+ ++*eth;
+ strcpy (ifr->ifr_name, "eth");
+ strcat (ifr->ifr_name, eth);
+ switch (what)
+ {
+ case SIOCGIFCONF:
+ case SIOCGIFADDR:
+ sa = (struct sockaddr_in *) &ifr->ifr_addr;
+ sa->sin_addr.s_addr = cygwin_inet_addr (ip);
+ break;
+ case SIOCGIFBRDADDR:
+ lip = cygwin_inet_addr (ip);
+ lnp = cygwin_inet_addr (np);
+ sa = (struct sockaddr_in *) &ifr->ifr_broadaddr;
+ sa->sin_addr.s_addr = lip & lnp | ~lnp;
+ break;
+ case SIOCGIFNETMASK:
+ sa = (struct sockaddr_in *) &ifr->ifr_netmask;
+ sa->sin_addr.s_addr = cygwin_inet_addr (np);
+ break;
+ }
+ sa->sin_family = AF_INET;
+ sa->sin_port = 0;
+ ++cnt;
+ }
+ RegCloseKey (subkey);
+ }
+ }
+
+ /* Set the correct length */
+ ifc->ifc_len = cnt * sizeof (struct ifreq);
+ }
+
+ return 0;
+}
+
+/* exported as rcmd: standards? */
+extern "C"
+int
+cygwin_rcmd (char **ahost, unsigned short inport, char *locuser,
+ char *remuser, char *cmd, int *fd2p)
+{
+ int res = -1;
+ SOCKET fd2s;
+
+ int res_fd = dtable.find_unused_handle ();
+ if (res_fd == -1)
+ goto done;
+
+ if (fd2p)
+ {
+ *fd2p = dtable.find_unused_handle (res_fd + 1);
+ if (*fd2p == -1)
+ goto done;
+ }
+
+ res = rcmd (ahost, inport, locuser, remuser, cmd, fd2p? &fd2s: NULL);
+ if (res == (int) INVALID_SOCKET)
+ goto done;
+ else
+ {
+ res = duplicate_socket (res);
+
+ fdsock (res_fd, "/dev/tcp", res);
+ res = res_fd;
+ }
+ if (fd2p)
+ {
+ fd2s = duplicate_socket (fd2s);
+
+ fdsock (*fd2p, "/dev/tcp", fd2s);
+ }
+done:
+ syscall_printf ("%d = rcmd (...)", res);
+ return res;
+}
+
+/* exported as rresvport: standards? */
+extern "C"
+int
+cygwin_rresvport (int *port)
+{
+ int res = -1;
+
+ int res_fd = dtable.find_unused_handle ();
+ if (res_fd == -1)
+ goto done;
+ res = rresvport (port);
+
+ if (res == (int) INVALID_SOCKET)
+ goto done;
+ else
+ {
+ res = duplicate_socket (res);
+
+ fdsock (res_fd, "/dev/tcp", res);
+ res = res_fd;
+ }
+done:
+ syscall_printf ("%d = rresvport (%d)", res, port ? *port : 0);
+ return res;
+}
+
+/* exported as rexec: standards? */
+extern "C"
+int
+cygwin_rexec (char **ahost, unsigned short inport, char *locuser,
+ char *password, char *cmd, int *fd2p)
+{
+ int res = -1;
+ SOCKET fd2s;
+
+ int res_fd = dtable.find_unused_handle ();
+ if (res_fd == -1)
+ goto done;
+ if (fd2p)
+ {
+ *fd2p = dtable.find_unused_handle (res_fd + 1);
+ if (*fd2p == -1)
+ goto done;
+ }
+ res = rexec (ahost, inport, locuser, password, cmd, fd2p ? &fd2s : NULL);
+ if (res == (int) INVALID_SOCKET)
+ goto done;
+ else
+ {
+ res = duplicate_socket (res);
+
+ fdsock (res_fd, "/dev/tcp", res);
+ res = res_fd;
+ }
+ if (fd2p)
+ {
+ fd2s = duplicate_socket (fd2s);
+
+ fdsock (*fd2p, "/dev/tcp", fd2s);
+#if 0 /* ??? */
+ fhandler_socket *h;
+ p->hmap.vec[*fd2p].h = h =
+ new (&p->hmap.vec[*fd2p].item) fhandler_socket (fd2s, "/dev/tcp");
+#endif
+ }
+done:
+ syscall_printf ("%d = rexec (...)", res);
+ return res;
+}
+
+/* socketpair: standards? */
+/* Win32 supports AF_INET only, so ignore domain and protocol arguments */
+extern "C"
+int
+socketpair (int, int type, int, int *sb)
+{
+ int res = -1;
+ SOCKET insock, outsock, newsock;
+ struct sockaddr_in sock_in;
+ int len = sizeof (sock_in);
+
+ SetResourceLock(LOCK_FD_LIST,WRITE_LOCK|READ_LOCK," socketpair");
+
+ sb[0] = dtable.find_unused_handle ();
+ if (sb[0] == -1)
+ {
+ set_errno (EMFILE);
+ goto done;
+ }
+ sb[1] = dtable.find_unused_handle (sb[0] + 1);
+ if (sb[1] == -1)
+ {
+ set_errno (EMFILE);
+ goto done;
+ }
+
+ /* create a listening socket */
+ newsock = socket (AF_INET, type, 0);
+ if (newsock == INVALID_SOCKET)
+ {
+ set_winsock_errno ();
+ goto done;
+ }
+
+ /* bind the socket to any unused port */
+ sock_in.sin_family = AF_INET;
+ sock_in.sin_port = 0;
+ sock_in.sin_addr.s_addr = INADDR_ANY;
+
+ if (bind (newsock, (struct sockaddr *) &sock_in, sizeof (sock_in)) < 0)
+ {
+ set_winsock_errno ();
+ closesocket (newsock);
+ goto done;
+ }
+
+ if (getsockname (newsock, (struct sockaddr *) &sock_in, &len) < 0)
+ {
+ debug_printf ("getsockname error");
+ set_winsock_errno ();
+ closesocket (newsock);
+ goto done;
+ }
+
+ listen (newsock, 2);
+
+ /* create a connecting socket */
+ outsock = socket (AF_INET, type, 0);
+ if (outsock == INVALID_SOCKET)
+ {
+ debug_printf ("can't create outsock");
+ set_winsock_errno ();
+ closesocket (newsock);
+ goto done;
+ }
+
+ sock_in.sin_addr.s_addr = htonl (INADDR_LOOPBACK);
+
+ /* Do a connect and accept the connection */
+ if (connect (outsock, (struct sockaddr *) &sock_in,
+ sizeof (sock_in)) < 0)
+ {
+ debug_printf ("connect error");
+ set_winsock_errno ();
+ closesocket (newsock);
+ closesocket (outsock);
+ goto done;
+ }
+
+ insock = accept (newsock, (struct sockaddr *) &sock_in, &len);
+ if (insock == INVALID_SOCKET)
+ {
+ debug_printf ("accept error");
+ set_winsock_errno ();
+ closesocket (newsock);
+ closesocket (outsock);
+ goto done;
+ }
+
+ closesocket (newsock);
+ res = 0;
+
+ insock = duplicate_socket (insock);
+
+ fdsock (sb[0], "/dev/tcp", insock);
+
+ outsock = duplicate_socket (outsock);
+ fdsock (sb[1], "/dev/tcp", outsock);
+
+done:
+ syscall_printf ("%d = socketpair (...)", res);
+ ReleaseResourceLock(LOCK_FD_LIST,WRITE_LOCK|READ_LOCK," socketpair");
+ return res;
+}
+
+/**********************************************************************/
+/* fhandler_socket */
+
+fhandler_socket::fhandler_socket (const char *name) :
+ fhandler_base (FH_SOCKET, name)
+{
+ set_cb (sizeof *this);
+ number_of_sockets++;
+}
+
+/* sethostent: standards? */
+extern "C"
+void
+sethostent (int)
+{
+}
+
+/* endhostent: standards? */
+extern "C"
+void
+endhostent (void)
+{
+}
+
+fhandler_socket::~fhandler_socket ()
+{
+ if (--number_of_sockets < 0)
+ {
+ number_of_sockets = 0;
+ system_printf("socket count < 0");
+ }
+}
+
+int
+fhandler_socket::read (void *ptr, size_t len)
+{
+ int res = recv (get_socket (), (char *) ptr, len, 0);
+ if (res == SOCKET_ERROR)
+ {
+ set_winsock_errno ();
+ }
+ return res;
+}
+
+int
+fhandler_socket::write (const void *ptr, size_t len)
+{
+ int res = send (get_socket (), (const char *) ptr, len, 0);
+ if (res == SOCKET_ERROR)
+ {
+ set_winsock_errno ();
+ if (get_errno () == ECONNABORTED || get_errno () == ECONNRESET)
+ _raise (SIGPIPE);
+ }
+ return res;
+}
+
+/* Cygwin internal */
+int
+fhandler_socket::close ()
+{
+ int res = 0;
+
+ if (closesocket (get_socket ()))
+ {
+ set_winsock_errno ();
+ res = -1;
+ }
+
+ return res;
+}
+
+/* Cygwin internal */
+/*
+ * Return the flags settings for an interface.
+ */
+static int
+get_if_flags (struct ifreq *ifr)
+{
+ struct sockaddr_in *sa = (struct sockaddr_in *) &ifr->ifr_addr;
+
+ short flags = IFF_NOTRAILERS | IFF_UP | IFF_RUNNING;
+ if (sa->sin_addr.s_addr == INADDR_LOOPBACK)
+ flags |= IFF_LOOPBACK;
+ else
+ flags |= IFF_BROADCAST;
+
+ ifr->ifr_flags = flags;
+ return 0;
+}
+
+#define ASYNC_MASK (FD_READ|FD_WRITE|FD_OOB|FD_ACCEPT|FD_CONNECT)
+
+/* Cygwin internal */
+int
+fhandler_socket::ioctl (unsigned int cmd, void *p)
+{
+ int res;
+ struct ifconf *ifc;
+ struct ifreq *ifr;
+
+ switch (cmd)
+ {
+ case SIOCGIFCONF:
+ ifc = (struct ifconf *) p;
+ if (ifc == 0)
+ {
+ set_errno (EINVAL);
+ return -1;
+ }
+ res = get_ifconf (ifc, cmd);
+ if (res)
+ debug_printf ("error in get_ifconf\n");
+ break;
+ case SIOCGIFFLAGS:
+ ifr = (struct ifreq *) p;
+ if (ifr == 0)
+ {
+ set_errno (EINVAL);
+ return -1;
+ }
+ res = get_if_flags (ifr);
+ break;
+ case SIOCGIFBRDADDR:
+ case SIOCGIFNETMASK:
+ case SIOCGIFADDR:
+ {
+ char buf[2048];
+ struct ifconf ifc;
+ ifc.ifc_len = sizeof(buf);
+ ifc.ifc_buf = buf;
+ struct ifreq *ifrp;
+
+ struct ifreq *ifr = (struct ifreq *) p;
+ if (ifr == 0)
+ {
+ debug_printf("ifr == NULL\n");
+ set_errno (EINVAL);
+ return -1;
+ }
+
+ res = get_ifconf (&ifc, cmd);
+ if (res)
+ {
+ debug_printf ("error in get_ifconf\n");
+ break;
+ }
+
+ debug_printf(" name: %s\n", ifr->ifr_name);
+ for (ifrp = ifc.ifc_req;
+ (caddr_t) ifrp < ifc.ifc_buf + ifc.ifc_len;
+ ++ifrp)
+ {
+ debug_printf("testname: %s\n", ifrp->ifr_name);
+ if (! strcmp (ifrp->ifr_name, ifr->ifr_name))
+ {
+ switch (cmd)
+ {
+ case SIOCGIFADDR:
+ ifr->ifr_addr = ifrp->ifr_addr;
+ break;
+ case SIOCGIFBRDADDR:
+ ifr->ifr_broadaddr = ifrp->ifr_broadaddr;
+ break;
+ case SIOCGIFNETMASK:
+ ifr->ifr_netmask = ifrp->ifr_netmask;
+ break;
+ }
+ break;
+ }
+ }
+ if ((caddr_t) ifrp >= ifc.ifc_buf + ifc.ifc_len)
+ {
+ set_errno (EINVAL);
+ return -1;
+ }
+ break;
+ }
+ case FIOASYNC:
+ res = WSAAsyncSelect (get_socket (), gethwnd (), WM_ASYNCIO,
+ *(int *) p ? ASYNC_MASK : 0);
+ syscall_printf ("Async I/O on socket %s",
+ *(int *) p ? "started" : "cancelled");
+ set_async (*(int *) p);
+ break;
+ default:
+ /* We must cancel WSAAsyncSelect (if any) before settting socket to
+ * blocking mode
+ */
+ if (cmd == FIONBIO && *(int *) p == 0)
+ WSAAsyncSelect (get_socket (), gethwnd (), 0, 0);
+ res = ioctlsocket (get_socket (), cmd, (unsigned long *) p);
+ if (res == SOCKET_ERROR)
+ set_winsock_errno ();
+ if (cmd == FIONBIO)
+ {
+ syscall_printf ("socket is now %sblocking",
+ *(int *) p ? "un" : "");
+ /* Start AsyncSelect if async socket unblocked */
+ if (*(int *) p && get_async ())
+ WSAAsyncSelect (get_socket (), gethwnd (), WM_ASYNCIO, ASYNC_MASK);
+ }
+ break;
+ }
+ syscall_printf ("%d = ioctl_socket (%x, %x)", res, cmd, p);
+ return res;
+}
+
+/* Initialize WinSock */
+LoadDLLinitfunc (wsock32)
+{
+ WSADATA p;
+ int res;
+ HANDLE h;
+
+ if ((h = LoadLibrary ("wsock32.dll")) != NULL)
+ wsock32_handle = h;
+ else if (!wsock32_handle)
+ api_fatal ("could not load wsock32.dll. Is TCP/IP installed?");
+ else
+ return 0; /* Already done by another thread? */
+
+ res = WSAStartup ((2<<8) | 2, &p);
+
+ debug_printf ("res %d", res);
+ debug_printf ("wVersion %d", p.wVersion);
+ debug_printf ("wHighVersion %d", p.wHighVersion);
+ debug_printf ("szDescription %s",p.szDescription);
+ debug_printf ("szSystemStatus %s",p.szSystemStatus);
+ debug_printf ("iMaxSockets %d", p.iMaxSockets);
+ debug_printf ("iMaxUdpDg %d", p.iMaxUdpDg);
+ debug_printf ("lpVendorInfo %d", p.lpVendorInfo);
+
+ if (FIONBIO != REAL_FIONBIO)
+ debug_printf ("**************** FIONBIO != REAL_FIONBIO");
+
+ return 0;
+}
+
+LoadDLLinit (wsock32)
+
+LoadDLLfunc (WSAAsyncSelect, WSAAsyncSelect@16, wsock32)
+LoadDLLfunc (WSACleanup, WSACleanup@0, wsock32)
+LoadDLLfunc (WSAGetLastError, WSAGetLastError@0, wsock32)
+LoadDLLfunc (WSAStartup, WSAStartup@8, wsock32)
+LoadDLLfunc (__WSAFDIsSet, __WSAFDIsSet@8, wsock32)
+LoadDLLfunc (accept, accept@12, wsock32)
+LoadDLLfunc (bind, bind@12, wsock32)
+LoadDLLfunc (closesocket, closesocket@4, wsock32)
+LoadDLLfunc (connect, connect@12, wsock32)
+LoadDLLfunc (gethostbyaddr, gethostbyaddr@12, wsock32)
+LoadDLLfunc (gethostbyname, gethostbyname@4, wsock32)
+LoadDLLfunc (gethostname, gethostname@8, wsock32)
+LoadDLLfunc (getpeername, getpeername@12, wsock32)
+LoadDLLfunc (getprotobyname, getprotobyname@4, wsock32)
+LoadDLLfunc (getprotobynumber, getprotobynumber@4, wsock32)
+LoadDLLfunc (getservbyname, getservbyname@8, wsock32)
+LoadDLLfunc (getservbyport, getservbyport@8, wsock32)
+LoadDLLfunc (getsockname, getsockname@12, wsock32)
+LoadDLLfunc (getsockopt, getsockopt@20, wsock32)
+LoadDLLfunc (inet_addr, inet_addr@4, wsock32)
+LoadDLLfunc (inet_ntoa, inet_ntoa@4, wsock32)
+LoadDLLfunc (ioctlsocket, ioctlsocket@12, wsock32)
+LoadDLLfunc (listen, listen@8, wsock32)
+LoadDLLfunc (rcmd, rcmd@24, wsock32)
+LoadDLLfunc (recv, recv@16, wsock32)
+LoadDLLfunc (recvfrom, recvfrom@24, wsock32)
+LoadDLLfunc (rexec, rexec@24, wsock32)
+LoadDLLfunc (rresvport, rresvport@4, wsock32)
+LoadDLLfunc (select, select@20, wsock32)
+LoadDLLfunc (send, send@16, wsock32)
+LoadDLLfunc (sendto, sendto@24, wsock32)
+LoadDLLfunc (setsockopt, setsockopt@20, wsock32)
+LoadDLLfunc (shutdown, shutdown@8, wsock32)
+LoadDLLfunc (socket, socket@12, wsock32)
diff --git a/winsup/cygwin/ntea.cc b/winsup/cygwin/ntea.cc
new file mode 100644
index 000000000..278eb771f
--- /dev/null
+++ b/winsup/cygwin/ntea.cc
@@ -0,0 +1,335 @@
+/* ntea.cc: code for manipulating NTEA information
+
+ Copyright 1997, 1998, 2000 Cygnus Solutions.
+
+ Written by Sergey S. Okhapkin (sos@prospect.com.ru)
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#include <winsup.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+/* Default to not using NTEA information */
+BOOL allow_ntea = FALSE;
+
+/*
+From Windows NT DDK:
+
+FILE_FULL_EA_INFORMATION provides extended attribute information.
+This structure is used primarily by network drivers.
+
+Members
+
+NextEntryOffset
+The offset of the next FILE_FULL_EA_INFORMATION-type entry. This member is
+zero if no other entries follow this one.
+
+Flags
+Can be zero or can be set with FILE_NEED_EA, indicating that the file to which
+the EA belongs cannot be interpreted without understanding the associated
+extended attributes.
+
+EaNameLength
+The length in bytes of the EaName array. This value does not include a
+zero-terminator to EaName.
+
+EaValueLength
+The length in bytes of each EA value in the array.
+
+EaName
+An array of characters naming the EA for this entry.
+
+Comments
+This structure is longword-aligned. If a set of FILE_FULL_EA_INFORMATION
+entries is buffered, NextEntryOffset value in each entry, except the last,
+falls on a longword boundary.
+The value(s) associated with each entry follows the EaName array. That is, an
+EA's values are located at EaName + (EaNameLength + 1).
+*/
+
+typedef struct _FILE_FULL_EA_INFORMATION {
+ ULONG NextEntryOffset;
+ UCHAR Flags;
+ UCHAR EaNameLength;
+ USHORT EaValueLength;
+ CHAR EaName[1];
+} FILE_FULL_EA_INFORMATION, *PFILE_FULL_EA_INFORMATION;
+
+/* Functions prototypes */
+
+int NTReadEA (const char *file, const char *attrname, char *buf, int len);
+static PFILE_FULL_EA_INFORMATION NTReadEARaw (HANDLE file, int *len);
+BOOL NTWriteEA(const char *file, const char *attrname, char *buf, int len);
+
+/*
+ * NTReadEA - read file's Extended Attribute.
+ *
+ * Parameters:
+ * file - pointer to filename
+ * attrname- pointer to EA name (case insensitivy. EAs are sored in upper
+ * case).
+ * attrbuf - pointer to buffer to store EA's value.
+ * len - length of attrbuf.
+ * Return value:
+ * 0 - if file or attribute "attrname" not found.
+ * N - number of bytes stored in attrbuf if succes.
+ * -1 - attrbuf too small for EA value.
+ */
+
+int __stdcall
+NTReadEA (const char *file, const char *attrname, char *attrbuf, int len)
+{
+ /* return immediately if NTEA usage is turned off */
+ if (! allow_ntea)
+ return FALSE;
+
+ HANDLE hFileSource;
+ int eafound = 0;
+ PFILE_FULL_EA_INFORMATION ea, sea;
+ int easize;
+
+ hFileSource = CreateFile (file, FILE_READ_EA,
+ FILE_SHARE_READ | FILE_SHARE_WRITE,
+ &sec_none_nih, // sa
+ OPEN_EXISTING,
+ FILE_FLAG_BACKUP_SEMANTICS,
+ NULL
+ );
+
+ if (hFileSource == INVALID_HANDLE_VALUE)
+ return 0;
+
+ /* Read in raw array of EAs */
+ ea = sea = NTReadEARaw (hFileSource, &easize);
+
+ /* Search for requested attribute */
+ while (sea)
+ {
+ if (strcasematch (ea->EaName, attrname)) /* EA found */
+ {
+ if (ea->EaValueLength > len)
+ {
+ eafound = -1; /* buffer too small */
+ break;
+ }
+ memcpy (attrbuf, ea->EaName + (ea->EaNameLength + 1),
+ ea->EaValueLength);
+ eafound = ea->EaValueLength;
+ break;
+ }
+ if ((ea->NextEntryOffset == 0) || ((int) ea->NextEntryOffset > easize))
+ break;
+ ea = (PFILE_FULL_EA_INFORMATION) ((char *) ea + ea->NextEntryOffset);
+ }
+
+ if (sea)
+ free (sea);
+ CloseHandle (hFileSource);
+
+ return eafound;
+}
+
+/*
+ * NTReadEARaw - internal routine to read EAs array to malloced buffer. The
+ * caller should free this buffer after usage.
+ * Parameters:
+ * hFileSource - handle to file. This handle should have FILE_READ_EA
+ * rights.
+ * len - pointer to int variable where length of buffer will
+ * be stored.
+ * Return value:
+ * pointer to buffer with file's EAs, or NULL if any error occured.
+ */
+
+static
+PFILE_FULL_EA_INFORMATION
+NTReadEARaw (HANDLE hFileSource, int *len)
+{
+ WIN32_STREAM_ID StreamId;
+ DWORD dwBytesWritten;
+ LPVOID lpContext;
+ DWORD StreamSize;
+ PFILE_FULL_EA_INFORMATION eafound = NULL;
+
+ lpContext = NULL;
+ StreamSize = sizeof (WIN32_STREAM_ID) - sizeof (WCHAR**);
+
+ /* Read the WIN32_STREAM_ID in */
+
+ while (BackupRead (hFileSource, (LPBYTE) &StreamId, StreamSize,
+ &dwBytesWritten,
+ FALSE, // don't abort yet
+ FALSE, // don't process security
+ &lpContext))
+ {
+ DWORD sl,sh;
+
+ if (dwBytesWritten == 0) /* No more Stream IDs */
+ break;
+ /* skip StreamName */
+ if (StreamId.dwStreamNameSize)
+ {
+ unsigned char *buf;
+ buf = (unsigned char *) malloc (StreamId.dwStreamNameSize);
+
+ if (buf == NULL)
+ break;
+
+ if (!BackupRead (hFileSource, buf, // buffer to read
+ StreamId.dwStreamNameSize, // num bytes to read
+ &dwBytesWritten,
+ FALSE, // don't abort yet
+ FALSE, // don't process security
+ &lpContext)) // Stream name read error
+ {
+ free (buf);
+ break;
+ }
+ free (buf);
+ }
+
+ /* Is it EA stream? */
+ if (StreamId.dwStreamId == BACKUP_EA_DATA)
+ {
+ unsigned char *buf;
+ buf = (unsigned char *) malloc (StreamId.Size.LowPart);
+
+ if (buf == NULL)
+ break;
+ if (!BackupRead (hFileSource, buf, // buffer to read
+ StreamId.Size.LowPart, // num bytes to write
+ &dwBytesWritten,
+ FALSE, // don't abort yet
+ FALSE, // don't process security
+ &lpContext))
+ {
+ free (buf); /* EA read error */
+ break;
+ }
+ eafound = (PFILE_FULL_EA_INFORMATION) buf;
+ *len = StreamId.Size.LowPart;
+ break;
+ }
+ /* Skip current stream */
+ if (!BackupSeek (hFileSource,
+ StreamId.Size.LowPart,
+ StreamId.Size.HighPart,
+ &sl,
+ &sh,
+ &lpContext))
+ break;
+ }
+
+ /* free context */
+ BackupRead (
+ hFileSource,
+ NULL, // buffer to write
+ 0, // number of bytes to write
+ &dwBytesWritten,
+ TRUE, // abort
+ FALSE, // don't process security
+ &lpContext);
+
+ return eafound;
+}
+
+/*
+ * NTWriteEA - write file's Extended Attribute.
+ *
+ * Parameters:
+ * file - pointer to filename
+ * attrname- pointer to EA name (case insensitivy. EAs are sored in upper
+ * case).
+ * buf - pointer to buffer with EA value.
+ * len - length of buf.
+ * Return value:
+ * TRUE if success, FALSE otherwice.
+ * Note: if len=0 given EA will be deleted.
+ */
+
+BOOL __stdcall
+NTWriteEA (const char *file, const char *attrname, char *buf, int len)
+{
+ /* return immediately if NTEA usage is turned off */
+ if (! allow_ntea)
+ return TRUE;
+
+ HANDLE hFileSource;
+ WIN32_STREAM_ID StreamId;
+ DWORD dwBytesWritten;
+ LPVOID lpContext;
+ DWORD StreamSize, easize;
+ BOOL bSuccess=FALSE;
+ PFILE_FULL_EA_INFORMATION ea;
+
+ hFileSource = CreateFile (file, FILE_WRITE_EA,
+ FILE_SHARE_READ | FILE_SHARE_WRITE,
+ &sec_none_nih, // sa
+ OPEN_EXISTING,
+ FILE_FLAG_BACKUP_SEMANTICS,
+ NULL);
+
+ if (hFileSource == INVALID_HANDLE_VALUE)
+ return FALSE;
+
+ lpContext = NULL;
+ StreamSize = sizeof (WIN32_STREAM_ID) - sizeof (WCHAR**);
+
+ /* FILE_FULL_EA_INFORMATION structure is longword-aligned */
+ easize = sizeof (*ea) - sizeof (WCHAR**) + strlen (attrname) + 1 + len
+ + (sizeof (DWORD) - 1);
+ easize &= ~(sizeof (DWORD) - 1);
+
+ if ((ea = (PFILE_FULL_EA_INFORMATION) malloc (easize)) == NULL)
+ goto cleanup;
+
+ memset (ea, 0, easize);
+ ea->EaNameLength = strlen (attrname);
+ ea->EaValueLength = len;
+ strcpy (ea->EaName, attrname);
+ memcpy (ea->EaName + (ea->EaNameLength + 1), buf, len);
+
+ StreamId.dwStreamId = BACKUP_EA_DATA;
+ StreamId.dwStreamAttributes = 0;
+ StreamId.Size.HighPart = 0;
+ StreamId.Size.LowPart = easize;
+ StreamId.dwStreamNameSize = 0;
+
+ if (!BackupWrite (hFileSource, (LPBYTE) &StreamId, StreamSize,
+ &dwBytesWritten,
+ FALSE, // don't abort yet
+ FALSE, // don't process security
+ &lpContext))
+ goto cleanup;
+
+ if (!BackupWrite (hFileSource, (LPBYTE) ea, easize,
+ &dwBytesWritten,
+ FALSE, // don't abort yet
+ FALSE, // don't process security
+ &lpContext))
+ goto cleanup;
+
+ bSuccess = TRUE;
+ /* free context */
+
+cleanup:
+ BackupRead (hFileSource,
+ NULL, // buffer to write
+ 0, // number of bytes to write
+ &dwBytesWritten,
+ TRUE, // abort
+ FALSE, // don't process security
+ &lpContext);
+
+ CloseHandle (hFileSource);
+ if (ea)
+ free (ea);
+
+ return bSuccess;
+}
diff --git a/winsup/cygwin/passwd.cc b/winsup/cygwin/passwd.cc
new file mode 100644
index 000000000..51c5450b4
--- /dev/null
+++ b/winsup/cygwin/passwd.cc
@@ -0,0 +1,275 @@
+/* passwd.cc: getpwnam () and friends
+
+ Copyright 1996, 1997, 1998 Cygnus Solutions.
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#include <stdlib.h>
+#include <pwd.h>
+#include <stdio.h>
+#include <errno.h>
+#include "winsup.h"
+
+/* Read /etc/passwd only once for better performance. This is done
+ on the first call that needs information from it. */
+
+static struct passwd *passwd_buf = NULL; /* passwd contents in memory */
+static int curr_lines = 0;
+static int max_lines = 0;
+
+/* Set to 1 when /etc/passwd has been read in by read_etc_passwd (). */
+/* Functions in this file need to check the value of passwd_in_memory_p
+ and read in the password file if it isn't set. */
+static int passwd_in_memory_p = 0;
+
+/* Position in the passwd cache */
+#ifdef _MT_SAFE
+#define pw_pos _reent_winsup()->_pw_pos
+#else
+static int pw_pos = 0;
+#endif
+
+/* Remove a : teminated string from the buffer, and increment the pointer */
+static char *
+grab_string (char **p)
+{
+ char *src = *p;
+ char *res = src;
+
+ while (*src && *src != ':' && *src != '\n')
+ src++;
+
+ if (*src == ':')
+ {
+ *src = 0;
+ src++;
+ }
+ *p = src;
+ return res;
+}
+
+/* same, for ints */
+static int
+grab_int (char **p)
+{
+ char *src = *p;
+ int val = atoi (src);
+ while (*src && *src != ':' && *src != '\n')
+ src++;
+ if (*src == ':')
+ src++;
+ *p = src;
+ return val;
+}
+
+/* Parse /etc/passwd line into passwd structure. */
+void
+parse_pwd (struct passwd &res, char *buf)
+{
+ /* Allocate enough room for the passwd struct and all the strings
+ in it in one go */
+ size_t len = strlen (buf);
+ char *mybuf = (char *) malloc (len + 1);
+ (void) memcpy (mybuf, buf, len + 1);
+ if (mybuf[--len] == '\n')
+ mybuf[len] = '\0';
+
+ res.pw_name = strlwr(grab_string (&mybuf));
+ res.pw_passwd = grab_string (&mybuf);
+ res.pw_uid = grab_int (&mybuf);
+ res.pw_gid = grab_int (&mybuf);
+ res.pw_comment = 0;
+ res.pw_gecos = grab_string (&mybuf);
+ res.pw_dir = grab_string (&mybuf);
+ res.pw_shell = grab_string (&mybuf);
+}
+
+/* Add one line from /etc/passwd into the password cache */
+static void
+add_pwd_line (char *line)
+{
+ if (curr_lines >= max_lines)
+ {
+ max_lines += 10;
+ passwd_buf = (struct passwd *) realloc (passwd_buf, max_lines * sizeof (struct passwd));
+ }
+ parse_pwd (passwd_buf[curr_lines++], line);
+}
+
+/* Read in /etc/passwd and save contents in the password cache.
+ This sets passwd_in_memory_p to 1 so functions in this file can
+ tell that /etc/passwd has been read in */
+static void
+read_etc_passwd ()
+{
+ extern int passwd_sem;
+ char linebuf[1024];
+ ++passwd_sem;
+ FILE *f = fopen ("/etc/passwd", "r");
+ --passwd_sem;
+
+ if (f)
+ {
+ while (fgets (linebuf, sizeof (linebuf), f) != NULL)
+ {
+ if (strlen (linebuf))
+ add_pwd_line (linebuf);
+ }
+
+ fclose (f);
+ }
+ else
+ {
+ debug_printf ("Emulating /etc/passwd");
+ char user_name [ MAX_USER_NAME ];
+ DWORD user_name_len = MAX_USER_NAME;
+ if (! GetUserNameA (user_name, &user_name_len))
+ {
+ strncpy (user_name, "Administrator", MAX_USER_NAME);
+ debug_printf ("Failed to get current user name. %E");
+ }
+ snprintf (linebuf, sizeof (linebuf), "%s::%u:%u::%s:/bin/sh", user_name,
+ DEFAULT_UID, DEFAULT_GID, getenv ("HOME") ?: "/");
+ add_pwd_line (linebuf);
+ }
+ passwd_in_memory_p = 1;
+}
+
+/* Cygwin internal */
+static struct passwd *
+search_for (uid_t uid, const char *name)
+{
+ struct passwd *res = 0;
+ struct passwd *default_pw = 0;
+
+ for (int i = 0; i < curr_lines; i++)
+ {
+ res = passwd_buf + i;
+ if (res->pw_uid == DEFAULT_UID)
+ default_pw = res;
+ /* on Windows NT user names are case-insensitive */
+ if (name)
+ {
+ if (strcasematch (name, res->pw_name))
+ return res;
+ }
+ else if (uid == res->pw_uid)
+ return res;
+ }
+
+ return default_pw;
+}
+
+extern "C"
+struct passwd *
+getpwuid (uid_t uid)
+{
+ if (!passwd_in_memory_p)
+ read_etc_passwd();
+
+ return search_for (uid, 0);
+}
+
+extern "C"
+struct passwd *
+getpwnam (const char *name)
+{
+ if (!passwd_in_memory_p)
+ read_etc_passwd();
+
+ return search_for (0, name);
+}
+
+extern "C"
+struct passwd *
+getpwent (void)
+{
+ if (!passwd_in_memory_p)
+ read_etc_passwd();
+
+ if (pw_pos < curr_lines)
+ return passwd_buf + pw_pos++;
+
+ return NULL;
+}
+
+extern "C"
+struct passwd *
+getpwduid (uid_t uid)
+{
+ if (!passwd_in_memory_p)
+ read_etc_passwd();
+
+ return NULL;
+}
+
+extern "C"
+void
+setpwent (void)
+{
+ if (!passwd_in_memory_p)
+ read_etc_passwd();
+
+ pw_pos = 0;
+}
+
+extern "C"
+void
+endpwent (void)
+{
+ if (!passwd_in_memory_p)
+ read_etc_passwd();
+
+ pw_pos = 0;
+}
+
+extern "C"
+int
+setpassent ()
+{
+ if (!passwd_in_memory_p)
+ read_etc_passwd();
+
+ return 0;
+}
+
+extern "C"
+char *
+getpass (const char * prompt)
+{
+#ifdef _MT_SAFE
+ char *pass=_reent_winsup()->_pass;
+#else
+ static char pass[_PASSWORD_LEN];
+#endif
+ struct termios ti, newti;
+
+ if (!passwd_in_memory_p)
+ read_etc_passwd();
+
+ if (dtable.not_open (0))
+ {
+ set_errno (EBADF);
+ pass[0] = '\0';
+ }
+ else
+ {
+ fhandler_base *fhstdin = dtable[0];
+ fhstdin->tcgetattr (&ti);
+ newti = ti;
+ newti.c_lflag &= ~ECHO;
+ fhstdin->tcsetattr (TCSANOW, &newti);
+ fputs (prompt, stderr);
+ fgets (pass, _PASSWORD_LEN, stdin);
+ fprintf (stderr, "\n");
+ for (int i=0; pass[i]; i++)
+ if (pass[i] == '\r' || pass[i] == '\n')
+ pass[i] = '\0';
+ fhstdin->tcsetattr (TCSANOW, &ti);
+ }
+ return pass;
+}
diff --git a/winsup/cygwin/path.cc b/winsup/cygwin/path.cc
new file mode 100644
index 000000000..8fcfb4633
--- /dev/null
+++ b/winsup/cygwin/path.cc
@@ -0,0 +1,2836 @@
+/* path.cc: path support.
+
+ Copyright 1996, 1997, 1998, 1999, 2000 Cygnus Solutions.
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+/* This module's job is to
+ - convert between POSIX and Win32 style filenames,
+ - support the `mount' functionality,
+ - support symlinks for files and directories
+
+ Pathnames are handled as follows:
+
+ - / is equivalent to \
+ - Paths beginning with // (or \\) are not translated (i.e. looked
+ up in the mount table) and are assumed to be UNC path names.
+ - Paths containing a : are not translated (paths like
+ /foo/bar/baz:qux: don't make much sense but having the rule written
+ this way allows one to use strchr).
+
+ The goal in the above set of rules is to allow both POSIX and Win32
+ flavors of pathnames without either interfering. The rules are
+ intended to be as close to a superset of both as possible.
+
+ A possible future enhancement would be to allow people to
+ disable/enable the mount table handling to support pure Win32
+ pathnames. Hopefully this won't be needed. The suggested way to
+ do this would be an environment variable because
+ a) we need something that is inherited from parent to child,
+ b) environment variables can be passed from the DOS shell to a
+ cygwin app,
+ c) it allows disabling the feature on an app by app basis within
+ the same session (whereas playing about with the registry wouldn't
+ -- without getting too complicated). Example:
+ CYGWIN=pathrules[=@]{win32,posix}. If CYGWIN=pathrules=win32,
+ mount table handling is disabled. [The intent is to have CYGWIN be
+ a catchall for tweaking various cygwin.dll features].
+
+ Note that you can have more than one path to a file. The mount
+ table is always prefered when translating Win32 paths to POSIX
+ paths. Win32 paths in mount table entries may be UNC paths or
+ standard Win32 paths starting with <drive-letter>:
+
+ In converting from a Win32 to a POSIX pathname, if there is no
+ mount point that will allow the conversion to take place, a user
+ mount point will be automatically created under
+ cygdrive/<drive> and the translation will be redone, this
+ time successfully.
+
+ Text vs Binary issues are not considered here in path style
+ decisions.
+
+ / and \ are treated as equivalent. One or the other is prefered in
+ certain situations (e.g. / is preferred in result of getcwd, \ is
+ preferred in arguments to Win32 api calls), but this code will
+ translate as necessary.
+
+ Apps wishing to translate to/from pure Win32 and POSIX-like
+ pathnames can use cygwin_foo.
+
+ Removing mounted filesystem support would simplify things greatly,
+ but having it gives us a mechanism of treating disk that lives on a
+ UNIX machine as having UNIX semantics [it allows one to edit a text
+ file on that disk and not have cr's magically appear and perhaps
+ break apps running on UNIX boxes]. It also useful to be able to
+ layout a hierarchy without changing the underlying directories.
+
+ The semantics of mounting file systems is not intended to precisely
+ follow normal UNIX systems.
+
+ Each DOS drive is defined to have a current directory. Supporting
+ this would complicate things so for now things are defined so that
+ c: means c:\.
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/mount.h>
+#include <mntent.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <errno.h>
+#include "winsup.h"
+#include <ctype.h>
+
+static int symlink_check_one (const char *path, char *buf, int buflen,
+ DWORD& fileattr, unsigned *pflags,
+ const suffix_info *suffixes,
+ char *&found_suffix);
+static int normalize_win32_path (const char *cwd, const char *src, char *dst);
+static char *getcwd_inner (char *buf, size_t ulen, int posix_p);
+static void slashify (const char *src, char *dst, int trailing_slash_p);
+static void backslashify (const char *src, char *dst, int trailing_slash_p);
+static int path_prefix_p_ (const char *path1, const char *path2, int len1);
+static int get_current_directory_name ();
+
+static NO_COPY const char escape_char = '^';
+
+/********************** Path Helper Functions *************************/
+
+#define path_prefix_p(p1, p2, l1) \
+ ((tolower(*(p1))==tolower(*(p2))) && \
+ path_prefix_p_(p1, p2, l1))
+
+#define SYMLINKATTR(x) \
+ (((x) & (FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_DIRECTORY)) == \
+ FILE_ATTRIBUTE_SYSTEM)
+
+/* Return non-zero if PATH1 is a prefix of PATH2.
+ Both are assumed to be of the same path style and / vs \ usage.
+ Neither may be "".
+ LEN1 = strlen (PATH1). It's passed because often it's already known.
+
+ Examples:
+ /foo/ is a prefix of /foo <-- may seem odd, but desired
+ /foo is a prefix of /foo/
+ / is a prefix of /foo/bar
+ / is not a prefix of foo/bar
+ foo/ is a prefix foo/bar
+ /foo is not a prefix of /foobar
+*/
+
+/* Determine if path prefix matches current cygdrive */
+#define iscygdrive(path) \
+ (path_prefix_p (cygwin_shared->mount.cygdrive, (path), cygwin_shared->mount.cygdrive_len))
+
+#define iscygdrive_device(path) \
+ (iscygdrive(path) && isalpha(path[cygwin_shared->mount.cygdrive_len]) && \
+ (isdirsep(path[cygwin_shared->mount.cygdrive_len + 1]) || \
+ !path[cygwin_shared->mount.cygdrive_len + 1]))
+
+/******************** Directory-related Support **************************/
+
+/* Cache getcwd value. FIXME: We need a lock for these in order to
+ support multiple threads. */
+
+#ifdef _MT_SAFE
+#define current_directory_name _reent_winsup()->_current_directory_name
+#define current_directory_posix_name _reent_winsup()->_current_directory_posix_name
+#define current_directory_hash _reent_winsup()->_current_directory_hash
+#else
+static char *current_directory_name;
+static char *current_directory_posix_name;
+static unsigned long current_directory_hash;
+#endif
+
+static int
+path_prefix_p_ (const char *path1, const char *path2, int len1)
+{
+ /* Handle case where PATH1 has trailing '/' and when it doesn't. */
+ if (len1 > 0 && SLASH_P (path1[len1 - 1]))
+ len1--;
+
+ if (len1 == 0)
+ return SLASH_P (path2[0]) && !SLASH_P (path2[1]);
+
+ if (!strncasematch (path1, path2, len1))
+ return 0;
+
+ return SLASH_P (path2[len1]) || path2[len1] == 0 || path1[len1 - 1] == ':';
+}
+
+/* Convert an arbitrary path SRC to a pure Win32 path, suitable for
+ passing to Win32 API routines.
+
+ If an error occurs, `error' is set to the errno value.
+ Otherwise it is set to 0.
+
+ follow_mode values:
+ SYMLINK_FOLLOW - convert to PATH symlink points to
+ SYMLINK_NOFOLLOW - convert to PATH of symlink itself
+ SYMLINK_IGNORE - do not check PATH for symlinks
+ SYMLINK_CONTENTS - just return symlink contents
+*/
+
+path_conv::path_conv (const char *src, symlink_follow follow_mode,
+ int use_full_path, const suffix_info *suffixes)
+{
+ /* This array is used when expanding symlinks. It is MAX_PATH * 2
+ in length so that we can hold the expanded symlink plus a
+ trailer. */
+ char work_buf[MAX_PATH * 3 + 3];
+ char tmp_buf[MAX_PATH];
+ char path_buf[MAX_PATH];
+
+ char *rel_path, *full_path;
+
+ if ((error = check_null_empty_path (src)))
+ return;
+
+ if (use_full_path)
+ rel_path = path_buf, full_path = this->path;
+ else
+ rel_path = this->path, full_path = path_buf;
+
+ char *sym_buf = work_buf + MAX_PATH + 1;
+ /* This loop handles symlink expansion. */
+ int loop = 0;
+ path_flags = 0;
+ known_suffix = NULL;
+ fileattr = (DWORD) -1;
+ for (;;)
+ {
+ MALLOC_CHECK;
+ /* Must look up path in mount table, etc. */
+ error = cygwin_shared->mount.conv_to_win32_path (src, rel_path,
+ full_path,
+ devn, unit, &path_flags);
+ MALLOC_CHECK;
+ if (error != 0)
+ return;
+ if (devn != FH_BAD)
+ {
+ fileattr = 0;
+ return;
+ }
+
+ /* Eat trailing slashes */
+ char *tail = strchr (full_path, '\0');
+ /* If path is only a drivename, Windows interprets it as
+ the current working directory on this drive instead of
+ the root dir which is what we want. So we need
+ the trailing backslash in this case. */
+ while (tail > full_path + 3 && (*--tail == '\\'))
+ *tail = '\0';
+ if (full_path[0] && full_path[1] == ':' && full_path[2] == '\0')
+ strcat (full_path, "\\");
+
+ if (follow_mode == SYMLINK_IGNORE)
+ {
+ fileattr = GetFileAttributesA (path);
+ goto out;
+ }
+
+ /* Make a copy of the path that we can munge up */
+ char path_copy[strlen (full_path) + 2];
+ strcpy (path_copy, full_path);
+
+ tail = path_copy + 1 + (tail - full_path); // Point to end of copy
+
+ *sym_buf = '\0'; // Paranoid
+
+ /* Scan path_copy from right to left looking either for a symlink
+ or an actual existing file. If an existing file is found, just
+ return. If a symlink is found exit the for loop.
+ Also: be careful to preserve the errno returned from
+ symlink_check_one as the caller may need it. */
+ /* FIXME: Do we have to worry about multiple \'s here? */
+ int component = 0; // Number of translated components
+ DWORD attr;
+ for (;;)
+ {
+ save_errno s (0);
+ unsigned dummy_flags, *fp;
+ const suffix_info *suff;
+
+ /* Don't allow symlink_check_one to set anything in the path_conv
+ class if we're working on an inner component of the path */
+ if (component)
+ {
+ fp = &dummy_flags;
+ suff = NULL;
+ }
+ else
+ {
+ fp = &path_flags;
+ suff = suffixes;
+ }
+ MALLOC_CHECK;
+ int len = symlink_check_one (path_copy, sym_buf, MAX_PATH, attr,
+ fp, suff, known_suffix);
+ MALLOC_CHECK;
+
+ /* If symlink_check_one found an existing non-symlink file, then
+ it returns a length of 0 and sets errno to EINVAL. It also sets
+ any suffix found into `sym_buf'. */
+ if (!len && get_errno () == EINVAL)
+ {
+ if (component == 0)
+ {
+ fileattr = attr;
+ if (follow_mode == SYMLINK_CONTENTS)
+ goto out;
+ else if (*sym_buf)
+ {
+ known_suffix = strchr (this->path, '\0');
+ strcpy (known_suffix, sym_buf);
+ }
+ else if (known_suffix)
+ known_suffix = this->path + (known_suffix - path_copy);
+ }
+ goto out; // file found
+ }
+ /* Found a symlink if len > 0. If component == 0, then the
+ src path itself was a symlink. If !follow_mode then
+ we're done. Otherwise we have to insert the path found
+ into the full path that we are building and perform all of
+ these operations again on the newly derived path. */
+ else if (len > 0)
+ {
+ if (component == 0)
+ {
+ if (follow_mode != SYMLINK_FOLLOW)
+ {
+ set_symlink (); // last component of path's a symlink.
+ fileattr = attr;
+ if (follow_mode == SYMLINK_CONTENTS)
+ strcpy (path, sym_buf);
+ goto out;
+ }
+ }
+ break;
+ }
+
+ s.reset (); // remember errno from symlink_check_one
+
+ if (!(tail = strrchr (path_copy, '\\')) ||
+ (tail > path_copy && tail[-1] == ':'))
+ goto out; // all done
+
+ /* Haven't found a valid pathname component yet.
+ Pinch off the tail and try again. */
+ *tail = '\0';
+ component++;
+ }
+
+ /* Arrive here if above loop detected a symlink. */
+ if (++loop > MAX_LINK_DEPTH)
+ {
+ error = ELOOP; // Eep.
+ return;
+ }
+ MALLOC_CHECK;
+
+ tail = full_path + (tail - path_copy);
+ int taillen = strlen (tail);
+ int buflen = strlen (sym_buf);
+ if (buflen + taillen > MAX_PATH)
+ {
+ error = ENAMETOOLONG;
+ strcpy (path, "::ENAMETOOLONG::");
+ return;
+ }
+
+ /* Copy tail of full_path to discovered symlink. */
+ char *p;
+ for (p = sym_buf + buflen; *tail; tail++)
+ *p++ = *tail == '\\' ? '/' : *tail;
+ *p = '\0';
+
+ /* If symlink referred to an absolute path, then we
+ just use sym_buf and loop. Otherwise tack the head of
+ path_copy before sym_buf and translate it back from a
+ Win32-style path to a POSIX-style one. */
+ if (isabspath (sym_buf))
+ src = sym_buf;
+ else if (!(tail = strrchr (path_copy, '\\')))
+ system_printf ("problem parsing %s - '%s'", src, full_path);
+ else
+ {
+ int headlen = 1 + tail - path_copy;
+ p = sym_buf - headlen;
+ memcpy (p, path_copy, headlen);
+ MALLOC_CHECK;
+ error = cygwin_shared->mount.conv_to_posix_path (p, tmp_buf, 1);
+ MALLOC_CHECK;
+ if (error)
+ return;
+ src = tmp_buf;
+ }
+ }
+out:
+ DWORD serial, volflags;
+
+ char root[strlen(full_path) + 10];
+ strcpy (root, full_path);
+ if (!rootdir (root) ||
+ !GetVolumeInformation (root, NULL, 0, &serial, NULL, &volflags, NULL, 0))
+ set_has_acls (FALSE);
+ else
+ set_has_acls (volflags & FS_PERSISTENT_ACLS);
+}
+
+#define deveq(s) (strcasematch (name, (s)))
+#define deveqn(s, n) (strncasematch (name, (s), (n)))
+
+static __inline int
+digits (const char *name)
+{
+ char *p;
+ int n = strtol(name, &p, 10);
+
+ return p > name && !*p ? n : -1;
+}
+
+const char *windows_device_names[] =
+{
+ NULL,
+ "\\dev\\console",
+ "conin",
+ "conout",
+ "\\dev\\ttym",
+ "\\dev\\tty%d",
+ "\\dev\\ptym",
+ "\\\\.\\com%d",
+ "\\dev\\pipe",
+ "\\dev\\piper",
+ "\\dev\\pipew",
+ "\\dev\\socket",
+ "\\dev\\windows",
+
+ NULL, NULL, NULL,
+
+ "\\dev\\disk",
+ "\\dev\\fd%d",
+ "\\dev\\st%d",
+ "nul",
+ "\\dev\\zero",
+};
+
+static int
+get_raw_device_number (const char *uxname, const char *w32path, int &unit)
+{
+ DWORD devn = FH_BAD;
+
+ if (strncasecmp (w32path, "\\\\.\\tape", 8) == 0)
+ {
+ devn = FH_TAPE;
+ unit = digits (w32path + 8);
+ // norewind tape devices have leading n in name
+ if (! strncasecmp (uxname, "/dev/n", 6))
+ unit += 128;
+ }
+ else if (isalpha (w32path[4]) && w32path[5] == ':')
+ {
+ devn = FH_FLOPPY;
+ unit = tolower (w32path[4]) - 'a';
+ }
+ else if (strncasecmp (w32path, "\\\\.\\physicaldrive", 17) == 0)
+ {
+ devn = FH_FLOPPY;
+ unit = digits (w32path + 17) + 128;
+ }
+ return devn;
+}
+
+int __stdcall
+get_device_number (const char *name, int &unit, BOOL from_conv)
+{
+ DWORD devn = FH_BAD;
+ unit = 0;
+
+ if ((*name == '/' && deveqn ("/dev/", 5)) ||
+ (*name == '\\' && deveqn ("\\dev\\", 5)))
+ {
+ name += 5;
+ if (deveq ("tty"))
+ {
+ if (tty_attached (myself))
+ {
+ unit = myself->ctty;
+ devn = FH_TTYS;
+ }
+ else if (myself->ctty > 0)
+ devn = FH_CONSOLE;
+ }
+ else if (deveqn ("tty", 3) && (unit = digits (name + 3)) >= 0)
+ devn = FH_TTYS;
+ else if (deveq ("ttym"))
+ devn = FH_TTYM;
+ else if (deveq ("ptmx"))
+ devn = FH_PTYM;
+ else if (deveq ("windows"))
+ devn = FH_WINDOWS;
+ else if (deveq ("conin"))
+ devn = FH_CONIN;
+ else if (deveq ("conout"))
+ devn = FH_CONOUT;
+ else if (deveq ("null"))
+ devn = FH_NULL;
+ else if (deveq ("zero"))
+ devn = FH_ZERO;
+ else if (deveqn ("com", 3) && (unit = digits (name + 3)) >= 0)
+ devn = FH_SERIAL;
+ else if (deveq ("pipe") || deveq ("piper") || deveq ("pipew"))
+ devn = FH_PIPE;
+ else if (deveq ("tcp") || deveq ("udp") || deveq ("streamsocket")
+ || deveq ("dgsocket"))
+ devn = FH_SOCKET;
+ else if (! from_conv)
+ devn = get_raw_device_number (name - 5,
+ path_conv (name - 5,
+ SYMLINK_IGNORE).get_win32 (),
+ unit);
+ }
+ else if (deveqn ("com", 3) && (unit = digits (name + 3)) >= 0)
+ devn = FH_SERIAL;
+
+ return devn;
+}
+
+/* Return TRUE if src_path is a Win32 device name, filling out the device
+ name in win32_path */
+
+static BOOL
+win32_device_name (const char *src_path, char *win32_path,
+ DWORD &devn, int &unit)
+{
+ const char *devfmt;
+
+ devn = get_device_number (src_path, unit, TRUE);
+
+ if (devn == FH_BAD)
+ return FALSE;
+
+ if ((devfmt = windows_device_names[FHDEVN (devn)]) == NULL)
+ return FALSE;
+ __small_sprintf (win32_path, devfmt, unit);
+ return TRUE;
+}
+
+/* Normalize a POSIX path.
+ \'s are converted to /'s in the process.
+ All duplicate /'s, except for 2 leading /'s, are deleted.
+ The result is 0 for success, or an errno error value. */
+
+static __inline int
+normalize_posix_path (const char *cwd, const char *src, char *dst)
+{
+ const char *src_start = src;
+ char *dst_start = dst;
+
+ if (! SLASH_P (src[0]))
+ {
+ if (strlen (cwd) + 1 + strlen (src) >= MAX_PATH)
+ {
+ debug_printf ("ENAMETOOLONG = normalize_posix_path (%s)", src);
+ return ENAMETOOLONG;
+ }
+ strcpy (dst, cwd);
+ dst = strchr (dst, '\0');
+ if (dst > dst_start && !isdirsep(dst[-1]))
+ *dst++ = '/';
+ }
+ /* Two leading /'s? If so, preserve them. */
+ else if (SLASH_P (src[1]))
+ {
+ *dst++ = '/';
+ *dst++ = '/';
+ src += 2;
+ if (SLASH_P(*src))
+ { /* Starts with three or more slashes - reset. */
+ dst = dst_start;
+ *dst++ = '/';
+ src = src_start + 1;
+ }
+ }
+
+ while (*src)
+ {
+ /* Strip runs of /'s. */
+ if (SLASH_P (*src))
+ {
+ *dst++ = '/';
+ src++;
+ while (SLASH_P(*src))
+ src++;
+ }
+ /* Ignore "./". */
+ else if (src[0] == '.' && SLASH_P (src[1])
+ && (src == src_start || SLASH_P (src[-1])))
+ {
+ src += 2;
+ while(SLASH_P(src[0]))
+ src++;
+ }
+ /* Backup if "..". */
+ else if (src[0] == '.' && src[1] == '.'
+ /* dst must be greater than dst_start */
+ && isdirsep (dst[-1])
+ && (SLASH_P (src[2]) || src[2] == 0))
+ {
+ /* Back up over /, but not if it's the first one. */
+ if (dst > dst_start + 1)
+ dst--;
+ /* Now back up to the next /. */
+ while (dst > dst_start + 1 && !isdirsep (dst[-1]))
+ dst--;
+ src += 2;
+ while (SLASH_P (*src))
+ src++;
+ }
+ /* Otherwise, add char to result. */
+ else
+ {
+ if (*src == '\\')
+ *dst++ = '/';
+ else
+ *dst++ = *src;
+ ++src;
+ }
+ }
+ *dst = 0;
+ debug_printf ("%s = normalize_posix_path (%s)", dst_start, src_start);
+ return 0;
+}
+
+/* Normalize a Win32 path.
+ /'s are converted to \'s in the process.
+ All duplicate \'s, except for 2 leading \'s, are deleted.
+
+ The result is 0 for success, or an errno error value.
+ FIXME: A lot of this should be mergeable with the POSIX critter. */
+
+static int
+normalize_win32_path (const char *cwd, const char *src, char *dst)
+{
+ const char *src_start = src;
+ char *dst_start = dst;
+
+ if (! SLASH_P (src[0])
+ && strchr (src, ':') == NULL)
+ {
+ if (strlen (cwd) + 1 + strlen (src) >= MAX_PATH)
+ {
+ debug_printf ("ENAMETOOLONG = normalize_win32_path (%s)", src);
+ return ENAMETOOLONG;
+ }
+ strcpy (dst, cwd);
+ dst += strlen (dst);
+ *dst++ = '\\';
+ }
+ /* Two leading \'s? If so, preserve them. */
+ else if (SLASH_P (src[0]) && SLASH_P (src[1]))
+ {
+ *dst++ = '\\';
+ ++src;
+ }
+
+ while (*src)
+ {
+ /* Strip duplicate /'s. */
+ if (SLASH_P (src[0]) && SLASH_P (src[1]))
+ src++;
+ /* Ignore "./". */
+ else if (src[0] == '.' && SLASH_P (src[1])
+ && (src == src_start || SLASH_P (src[-1])))
+ {
+ src += 2;
+ }
+
+ /* Backup if "..". */
+ else if (src[0] == '.' && src[1] == '.'
+ /* dst must be greater than dst_start */
+ && dst[-1] == '\\'
+ && (SLASH_P (src[2]) || src[2] == 0))
+ {
+ /* Back up over /, but not if it's the first one. */
+ if (dst > dst_start + 1)
+ dst--;
+ /* Now back up to the next /. */
+ while (dst > dst_start + 1 && dst[-1] != '\\' && dst[-2] != ':')
+ dst--;
+ src += 2;
+ if (SLASH_P (*src))
+ src++;
+ }
+ /* Otherwise, add char to result. */
+ else
+ {
+ if (*src == '/')
+ *dst++ = '\\';
+ else
+ *dst++ = *src;
+ ++src;
+ }
+ }
+ *dst = 0;
+ debug_printf ("%s = normalize_win32_path (%s)", dst_start, src_start);
+ return 0;
+}
+
+
+/* Various utilities. */
+
+/* slashify: Convert all back slashes in src path to forward slashes
+ in dst path. Add a trailing slash to dst when trailing_slash_p arg
+ is set to 1. */
+
+static void
+slashify (const char *src, char *dst, int trailing_slash_p)
+{
+ const char *start = src;
+
+ while (*src)
+ {
+ if (*src == '\\')
+ *dst++ = '/';
+ else
+ *dst++ = *src;
+ ++src;
+ }
+ if (trailing_slash_p
+ && src > start
+ && !isdirsep (src[-1]))
+ *dst++ = '/';
+ *dst++ = 0;
+}
+
+/* backslashify: Convert all forward slashes in src path to back slashes
+ in dst path. Add a trailing slash to dst when trailing_slash_p arg
+ is set to 1. */
+
+static void
+backslashify (const char *src, char *dst, int trailing_slash_p)
+{
+ const char *start = src;
+
+ while (*src)
+ {
+ if (*src == '/')
+ *dst++ = '\\';
+ else
+ *dst++ = *src;
+ ++src;
+ }
+ if (trailing_slash_p
+ && src > start
+ && !isdirsep (src[-1]))
+ *dst++ = '\\';
+ *dst++ = 0;
+}
+
+/* nofinalslash: Remove trailing / and \ from SRC (except for the
+ first one). It is ok for src == dst. */
+
+void __stdcall
+nofinalslash (const char *src, char *dst)
+{
+ int len = strlen (src);
+ if (src != dst)
+ memcpy (dst, src, len + 1);
+ while (len > 1 && SLASH_P (dst[--len]))
+ dst[len] = '\0';
+}
+
+/* slash_drive_prefix_p: Return non-zero if PATH begins with
+ //<letter>. */
+
+static int
+slash_drive_prefix_p (const char *path)
+{
+ return (isdirsep(path[0])
+ && isdirsep(path[1])
+ && isalpha (path[2])
+ && (path[3] == 0 || path[3] == '/'));
+}
+
+/* slash_unc_prefix_p: Return non-zero if PATH begins with //UNC/SHARE */
+
+int __stdcall
+slash_unc_prefix_p (const char *path)
+{
+ char *p = NULL;
+ int ret = (isdirsep (path[0])
+ && isdirsep (path[1])
+ && isalpha (path[2])
+ && path[3] != 0
+ && !isdirsep (path[3])
+ && ((p = strchr(&path[3], '/')) != NULL));
+ if (!ret || p == NULL)
+ return ret;
+ return ret && isalnum (p[1]);
+}
+
+/* conv_path_list: Convert a list of path names to/from Win32/POSIX.
+
+ SRC is not a const char * because we temporarily modify it to ease
+ the implementation.
+
+ I believe Win32 always has '.' in $PATH. POSIX obviously doesn't.
+ We certainly don't want to handle that here, but it is something for
+ the caller to think about. */
+
+static void
+conv_path_list (const char *src, char *dst, int to_posix_p)
+{
+ char *s;
+ char *d = dst;
+ char src_delim = to_posix_p ? ';' : ':';
+ char dst_delim = to_posix_p ? ':' : ';';
+ int (*conv_fn) (const char *, char *) = (to_posix_p
+ ? cygwin_conv_to_posix_path
+ : cygwin_conv_to_win32_path);
+
+ do
+ {
+ s = strchr (src, src_delim);
+ if (s)
+ {
+ *s = 0;
+ (*conv_fn) (src[0] != 0 ? src : ".", d);
+ d += strlen (d);
+ *d++ = dst_delim;
+ *s = src_delim;
+ src = s + 1;
+ }
+ else
+ {
+ /* Last one. */
+ (*conv_fn) (src[0] != 0 ? src : ".", d);
+ }
+ }
+ while (s != NULL);
+}
+
+/************************* mount_info class ****************************/
+
+/* init: Initialize the mount table. */
+
+void
+mount_info::init ()
+{
+ int found_slash = 0;
+
+ nmounts = 0;
+ had_to_create_mount_areas = 0;
+
+ /* Fetch the mount table and cygdrive-related information from
+ the registry. */
+ from_registry ();
+
+ /* If slash isn't already mounted, mount system directory as slash. */
+ if (nmounts != 0)
+ for (int i = 0; i < nmounts; i++)
+ {
+ if (strcmp (mount[i].posix_path, "/") == 0)
+ {
+ found_slash = 1;
+ break;
+ }
+ }
+
+ if (!found_slash)
+ mount_slash ();
+}
+
+/* mount_slash: mount the system partition as slash. */
+
+void
+mount_info::mount_slash ()
+{
+ char drivestring[MAX_PATH];
+ GetSystemDirectory (drivestring, MAX_PATH);
+ drivestring[2] = 0; /* truncate path to "<drive>:" */
+
+ if (add_reg_mount (drivestring, "/", 0) == 0)
+ add_item (drivestring, "/", 0);
+}
+
+/* conv_to_win32_path: Ensure src_path is a pure Win32 path and store
+ the result in win32_path.
+
+ If win32_path != NULL, the relative path, if possible to keep, is
+ stored in win32_path. If the relative path isn't possible to keep,
+ the full path is stored.
+
+ If full_win32_path != NULL, the full path is stored there.
+
+ The result is zero for success, or an errno value.
+
+ {,full_}win32_path must have sufficient space (i.e. MAX_PATH bytes). */
+
+int
+mount_info::conv_to_win32_path (const char *src_path, char *win32_path,
+ char *full_win32_path, DWORD &devn, int &unit, unsigned *flags)
+{
+ int src_path_len = strlen (src_path);
+ int trailing_slash_p = (src_path_len > 0
+ && SLASH_P (src_path[src_path_len - 1]));
+ MALLOC_CHECK;
+ int isrelpath;
+ unsigned dummy_flags;
+
+ devn = FH_BAD;
+ unit = 0;
+
+ if (!flags)
+ flags = &dummy_flags;
+
+ *flags = 0;
+ debug_printf ("conv_to_win32_path (%s)", src_path);
+
+ if (src_path_len >= MAX_PATH)
+ {
+ debug_printf ("ENAMETOOLONG = conv_to_win32_path (%s)", src_path);
+ return ENAMETOOLONG;
+ }
+
+ int i, rc;
+ char *dst = NULL;
+ mount_item *mi = NULL; /* initialized to avoid compiler warning */
+ char pathbuf[MAX_PATH];
+
+ /* The rule is :'s can't appear in [our] POSIX path names so this is a safe
+ test; if ':' is present it already be in Win32 form. */
+ if (strchr (src_path, ':') != NULL)
+ {
+ debug_printf ("%s already win32", src_path);
+ rc = normalize_win32_path ("", src_path, pathbuf);
+ if (rc)
+ return rc;
+ /* FIXME: Do we have to worry about trailing_slash_p here? */
+ if (win32_path != NULL)
+ strcpy (win32_path, pathbuf);
+ if (full_win32_path != NULL)
+ strcpy (full_win32_path, pathbuf);
+ *flags = set_flags_from_win32_path (pathbuf);
+ goto out;
+ }
+
+ /* Normalize the path, taking out ../../ stuff, we need to do this
+ so that we can move from one mounted directory to another with relative
+ stuff.
+
+ eg mounting c:/foo /foo
+ d:/bar /bar
+
+ cd /bar
+ ls ../foo
+
+ should look in c:/foo, not d:/foo.
+
+ We do this by first getting an absolute UNIX-style path and then
+ converting it to a DOS-style path, looking up the appropriate drive
+ in the mount table. */
+
+ char cwd[MAX_PATH];
+
+ /* No need to fetch cwd if path is absolute. */
+ if ((isrelpath = ! SLASH_P (*src_path)))
+ getcwd_inner (cwd, MAX_PATH, TRUE); /* FIXME: check rc */
+ else
+ strcpy (cwd, "/"); /* some innocuous value */
+
+ rc = normalize_posix_path (cwd, src_path, pathbuf);
+ MALLOC_CHECK;
+ if (rc != 0)
+ {
+ debug_printf ("%d = conv_to_win32_path (%s)", rc, src_path);
+ *flags = 0;
+ return rc;
+ }
+ nofinalslash (pathbuf, pathbuf);
+
+ /* Determine where the destination should be placed. */
+ if (full_win32_path != NULL)
+ dst = full_win32_path;
+ else if (win32_path != NULL)
+ dst = win32_path;
+
+ if (dst == NULL)
+ goto out; /* Sanity check. */
+
+ /* See if this is a cygwin "device" */
+ if (win32_device_name (pathbuf, dst, devn, unit))
+ {
+ *flags = MOUNT_BINARY; /* FIXME: Is this a sensible default for devices? */
+ goto fillin;
+ }
+
+ /* Check if the cygdrive prefix was specified. If so, just strip
+ off the prefix and transform it into an MS-DOS path. */
+ MALLOC_CHECK;
+ if (iscygdrive_device (pathbuf))
+ {
+ if (!cygdrive_win32_path (pathbuf, dst, trailing_slash_p))
+ return ENOENT;
+ *flags = cygdrive_flags;
+ goto fillin;
+ }
+
+ /* Check the mount table for prefix matches. */
+ for (i = 0; i < nmounts; i++)
+ {
+ mi = mount + posix_sorted[i];
+ if (path_prefix_p (mi->posix_path, pathbuf, mi->posix_pathlen))
+ break;
+ }
+
+ if (i >= nmounts)
+ {
+ if (slash_drive_prefix_p (pathbuf))
+ slash_drive_to_win32_path (pathbuf, dst, trailing_slash_p);
+ else
+ backslashify (src_path, dst, trailing_slash_p); /* just convert */
+ *flags = 0;
+ }
+ else
+ {
+ int n = mi->native_pathlen;
+ memcpy (dst, mi->native_path, n);
+ char *p = pathbuf + mi->posix_pathlen;
+ if (!trailing_slash_p && !*p)
+ dst[n] = '\0';
+ else
+ {
+ /* Do not add trailing \ to UNC device names like \\.\a: */
+ if (*p != '/' && /* FIXME: this test seems wrong. */
+ (strncmp (mi->native_path, "\\\\.\\", 4) != 0 ||
+ strncmp (mi->native_path + 4, "UNC\\", 4) == 0))
+ dst[n++] = '\\';
+ strcpy (dst + n, p);
+ }
+ backslashify (dst, dst, trailing_slash_p);
+ *flags = mi->flags;
+ }
+
+fillin:
+ /* Compute relative path if asked to and able to. */
+ unsigned cwdlen;
+ cwdlen = 0; /* avoid a (hopefully) bogus compiler warning */
+ if (win32_path == NULL)
+ /* nothing to do */;
+ else if (isrelpath &&
+ path_prefix_p (current_directory_name, dst,
+ cwdlen = strlen (current_directory_name)))
+ {
+ if (strlen (dst) == cwdlen)
+ dst += cwdlen;
+ else
+ dst += isdirsep (current_directory_name[cwdlen - 1]) ? cwdlen : cwdlen + 1;
+
+ memmove (win32_path, dst, strlen (dst) + 1);
+ if (!*win32_path)
+ {
+ strcpy (win32_path, ".");
+ if (trailing_slash_p)
+ strcat (win32_path, "\\");
+ }
+ }
+ else if (win32_path != dst)
+ strcpy (win32_path, dst);
+
+out:
+ MALLOC_CHECK;
+ debug_printf ("%s(rel), %s(abs) %p(flags) = conv_to_win32_path (%s)",
+ win32_path, full_win32_path, *flags,
+ src_path);
+ return 0;
+}
+
+/* Convert PATH (for which slash_drive_prefix_p returns 1) to WIN32 form. */
+
+void
+mount_info::slash_drive_to_win32_path (const char *path, char *buf,
+ int trailing_slash_p)
+{
+ buf[0] = path[2];
+ buf[1] = ':';
+ if (path[3] == '0')
+ strcpy (buf + 2, "\\");
+ else
+ backslashify (path + 3, buf + 2, trailing_slash_p);
+}
+
+/* cygdrive_posix_path: Build POSIX path used as the
+ mount point for cygdrives created when there is no other way to
+ obtain a POSIX path from a Win32 one. */
+
+void
+mount_info::cygdrive_posix_path (const char *src, char *dst, int trailing_slash_p)
+{
+ int len = cygdrive_len;
+
+ memcpy (dst, cygdrive, len + 1);
+
+ /* Now finish the path off with the drive letter to be used.
+ The cygdrive prefix always ends with a trailing slash so
+ the drive letter is added after the path. */
+ dst[len++] = tolower (src[0]);
+ if (!src[2])
+ dst[len++] = '\000';
+ else
+ {
+ dst[len++] = '/';
+ strcpy (dst + len, src + 3);
+ }
+ slashify (dst, dst, trailing_slash_p);
+}
+
+int
+mount_info::cygdrive_win32_path (const char *src, char *dst, int trailing_slash_p)
+{
+ const char *p = src + cygdrive_len;
+ if (!isalpha (*p) || (!isdirsep (p[1]) && p[1]))
+ return 0;
+ dst[0] = *p;
+ dst[1] = ':';
+ strcpy (dst + 2, p + 1);
+ backslashify (dst, dst, trailing_slash_p || !dst[2]);
+ debug_printf ("src '%s', dst '%s'", src, dst);
+ return 1;
+}
+
+/* conv_to_posix_path: Ensure src_path is a POSIX path.
+
+ The result is zero for success, or an errno value.
+ posix_path must have sufficient space (i.e. MAX_PATH bytes).
+ If keep_rel_p is non-zero, relative paths stay that way. */
+
+int
+mount_info::conv_to_posix_path (const char *src_path, char *posix_path,
+ int keep_rel_p)
+{
+ int src_path_len = strlen (src_path);
+ int trailing_slash_p = (src_path_len > 0
+ && SLASH_P (src_path[src_path_len - 1]));
+ int relative_path_p = (! SLASH_P (*src_path)
+ && strchr (src_path, ':') == NULL);
+
+ debug_printf ("conv_to_posix_path (%s, %s)", src_path,
+ keep_rel_p ? "keep-rel" : "no-keep-rel");
+ MALLOC_CHECK;
+
+ if (src_path_len >= MAX_PATH)
+ {
+ debug_printf ("ENAMETOOLONG");
+ return ENAMETOOLONG;
+ }
+
+ /* FIXME: For now, if the path is relative and it's supposed to stay
+ that way, skip mount table processing. */
+ MALLOC_CHECK;
+ if (keep_rel_p && relative_path_p)
+ {
+ slashify (src_path, posix_path, 0);
+ debug_printf ("%s = conv_to_posix_path (%s)", posix_path, src_path);
+ return 0;
+ }
+
+ char pathbuf[MAX_PATH];
+ char cwd[MAX_PATH];
+
+ /* No need to fetch cwd if path is absolute. */
+ if (relative_path_p)
+ getcwd_inner (cwd, MAX_PATH, 0); /* FIXME: check rc */
+ else
+ strcpy (cwd, "/"); /* some innocuous value */
+ MALLOC_CHECK;
+ int rc = normalize_win32_path (cwd, src_path, pathbuf);
+ MALLOC_CHECK;
+ if (rc != 0)
+ {
+ debug_printf ("%d = conv_to_posix_path (%s)", rc, src_path);
+ return rc;
+ }
+ nofinalslash (pathbuf, pathbuf);
+ MALLOC_CHECK;
+
+ int pathbuflen = strlen (pathbuf);
+ for (int i = 0; i < nmounts; ++i)
+ {
+ mount_item &mi = mount[native_sorted[i]];
+ if (! path_prefix_p (mi.native_path, pathbuf, mi.native_pathlen))
+ continue;
+
+ /* SRC_PATH is in the mount table. */
+ int nextchar;
+ if (!pathbuf[mi.native_pathlen])
+ nextchar = 0;
+ else if (isdirsep (pathbuf[mi.native_pathlen]))
+ nextchar = -1;
+ else
+ nextchar = 1;
+
+ int addslash = nextchar > 0 ? 1 : 0;
+ if ((mi.posix_pathlen + (pathbuflen - mi.native_pathlen) + addslash) >= MAX_PATH)
+ return ENAMETOOLONG;
+ strcpy (posix_path, mi.posix_path);
+ if (addslash)
+ strcat (posix_path, "/");
+ if (nextchar)
+ slashify (pathbuf + mi.native_pathlen,
+ posix_path + addslash + (mi.posix_pathlen == 1 ? 0 : mi.posix_pathlen),
+ trailing_slash_p);
+ goto out;
+ }
+
+ /* Not in the database. This should [theoretically] only happen if either
+ the path begins with //, or / isn't mounted, or the path has a drive
+ letter not covered by the mount table. If it's a relative path then the
+ caller must want an absolute path (otherwise we would have returned
+ above). So we always return an absolute path at this point. */
+ if ((isalpha (pathbuf[0])) && (pathbuf[1] == ':'))
+ cygdrive_posix_path (pathbuf, posix_path, trailing_slash_p &&
+ pathbuflen > 3);
+ else
+ {
+ /* The use of src_path and not pathbuf here is intentional.
+ We couldn't translate the path, so just ensure no \'s are present. */
+ slashify (src_path, posix_path, trailing_slash_p);
+ }
+
+out:
+ debug_printf ("%s = conv_to_posix_path (%s)", posix_path, src_path);
+ MALLOC_CHECK;
+ return 0;
+}
+
+/* Return flags associated with a mount point given the win32 path. */
+
+unsigned
+mount_info::set_flags_from_win32_path (const char *p)
+{
+ for (int i = 0; i < nmounts; i++)
+ {
+ mount_item &mi = mount[native_sorted[i]];
+ if (path_prefix_p (mi.native_path, p, mi.native_pathlen))
+ return mi.flags;
+ }
+ return 0;
+}
+
+/* read_mounts: Given a specific regkey, read mounts from under its
+ key. */
+
+void
+mount_info::read_mounts (reg_key& r)
+{
+ char posix_path[MAX_PATH];
+ HKEY key = r.get_key ();
+ DWORD i, posix_path_size;
+
+loop:
+ for (i = 0; ;i++)
+ {
+ posix_path_size = MAX_PATH;
+ LONG err = RegEnumKeyEx (key, i, posix_path, &posix_path_size, NULL,
+ NULL, NULL, NULL);
+
+ if (err != ERROR_SUCCESS)
+ break;
+
+ if (iscygdrive (posix_path))
+ {
+ /* This shouldn't be in the mount table. */
+ (void) r.kill (posix_path);
+ goto loop;
+ }
+ }
+
+ /* Loop through subkeys */
+ /* FIXME: we would like to not check MAX_MOUNTS but the heap in the
+ shared area is currently statically allocated so we can't have an
+ arbitrarily large number of mounts. */
+ for (DWORD i = 0; i < MAX_MOUNTS; i++)
+ {
+ char native_path[MAX_PATH];
+ int mount_flags;
+
+ posix_path_size = MAX_PATH;
+ /* FIXME: if maximum posix_path_size is 256, we're going to
+ run into problems if we ever try to store a mount point that's
+ over 256 but is under MAX_PATH! */
+ LONG err = RegEnumKeyEx (key, i, posix_path, &posix_path_size, NULL,
+ NULL, NULL, NULL);
+
+ if (err == ERROR_NO_MORE_ITEMS)
+ break;
+ else if (err != ERROR_SUCCESS)
+ {
+ debug_printf ("RegEnumKeyEx failed, error %d!\n", err);
+ break;
+ }
+
+ if (iscygdrive (posix_path))
+ {
+ /* This shouldn't be in the mount table. */
+ // (void) r.kill (posix_path);
+ continue;
+ }
+
+ /* Get a reg_key based on i. */
+ reg_key subkey = reg_key (key, KEY_READ, posix_path, NULL);
+
+ /* Check the mount table for prefix matches. */
+ for (int j = 0; j < nmounts; j++)
+ if (strcasematch (mount[j].posix_path, posix_path))
+ goto next; /* Can't have more than one */
+
+ /* Fetch info from the subkey. */
+ subkey.get_string ("native", native_path, sizeof (native_path), "");
+ mount_flags = subkey.get_int ("flags", 0);
+
+ /* Add mount_item corresponding to registry mount point. */
+ cygwin_shared->mount.add_item (native_path, posix_path, mount_flags);
+ next:
+ continue;
+ }
+}
+
+/* from_registry: Build the entire mount table from the registry. Also,
+ read in cygdrive-related information from its registry location. */
+
+void
+mount_info::from_registry ()
+{
+ /* Use current mount areas if either user or system mount areas
+ already exist. Otherwise, import old mounts. */
+
+ reg_key r;
+
+ /* Retrieve cygdrive-related information. */
+ read_cygdrive_info_from_registry ();
+
+ nmounts = 0;
+
+ /* First read mounts from user's table. */
+ read_mounts (r);
+
+ /* Then read mounts from system-wide mount table. */
+ reg_key r1 (HKEY_LOCAL_MACHINE, KEY_READ, "SOFTWARE",
+ CYGWIN_INFO_CYGNUS_REGISTRY_NAME,
+ CYGWIN_INFO_CYGWIN_REGISTRY_NAME,
+ CYGWIN_INFO_CYGWIN_MOUNT_REGISTRY_NAME,
+ NULL);
+ read_mounts (r1);
+
+ /* If we had to create both user and system mount areas, import
+ old mounts. */
+ if (had_to_create_mount_areas == 2)
+ import_v1_mounts ();
+
+ sort ();
+}
+
+/* add_reg_mount: Add mount item to registry. Return zero on success,
+ non-zero on failure. */
+/* FIXME: Need a mutex to avoid collisions with other tasks. */
+
+int
+mount_info::add_reg_mount (const char * native_path, const char * posix_path, unsigned mountflags)
+{
+ /* Add the mount to the right registry location, depending on
+ whether MOUNT_SYSTEM is set in the mount flags. */
+ if (!(mountflags & MOUNT_SYSTEM)) /* current_user mount */
+ {
+ /* reg_key for user mounts in HKEY_CURRENT_USER. */
+ reg_key reg_user;
+
+ /* Start by deleting existing mount if one exists. */
+ reg_user.kill (posix_path);
+
+ /* Create the new mount. */
+ reg_key subkey = reg_key (reg_user.get_key (),
+ KEY_ALL_ACCESS,
+ posix_path, NULL);
+ subkey.set_string ("native", native_path);
+ subkey.set_int ("flags", mountflags);
+ }
+ else /* local_machine mount */
+ {
+ /* reg_key for system mounts in HKEY_LOCAL_MACHINE. */
+ reg_key reg_sys (HKEY_LOCAL_MACHINE, KEY_ALL_ACCESS, "SOFTWARE",
+ CYGWIN_INFO_CYGNUS_REGISTRY_NAME,
+ CYGWIN_INFO_CYGWIN_REGISTRY_NAME,
+ CYGWIN_INFO_CYGWIN_MOUNT_REGISTRY_NAME,
+ NULL);
+
+ if (reg_sys.get_key () == INVALID_HANDLE_VALUE)
+ {
+ set_errno (EACCES);
+ return -1;
+ }
+
+ /* Start by deleting existing mount if one exists. */
+ reg_sys.kill (posix_path);
+
+ /* Create the new mount. */
+ reg_key subkey = reg_key (reg_sys.get_key (),
+ KEY_ALL_ACCESS,
+ posix_path, NULL);
+ subkey.set_string ("native", native_path);
+ subkey.set_int ("flags", mountflags);
+ }
+
+ return 0; /* Success! */
+}
+
+/* del_reg_mount: delete mount item from registry indicated in flags.
+ Return zero on success, non-zero on failure.*/
+/* FIXME: Need a mutex to avoid collisions with other tasks. */
+
+int
+mount_info::del_reg_mount (const char * posix_path, unsigned flags)
+{
+ int killres;
+
+ if ((flags & MOUNT_SYSTEM) == 0) /* Delete from user registry */
+ {
+ reg_key reg_user (KEY_ALL_ACCESS,
+ CYGWIN_INFO_CYGWIN_MOUNT_REGISTRY_NAME, NULL);
+ killres = reg_user.kill (posix_path);
+ }
+ else /* Delete from system registry */
+ {
+ reg_key reg_sys (HKEY_LOCAL_MACHINE, KEY_ALL_ACCESS, "SOFTWARE",
+ CYGWIN_INFO_CYGNUS_REGISTRY_NAME,
+ CYGWIN_INFO_CYGWIN_REGISTRY_NAME,
+ CYGWIN_INFO_CYGWIN_MOUNT_REGISTRY_NAME,
+ NULL);
+
+ if (reg_sys.get_key () == INVALID_HANDLE_VALUE)
+ {
+ set_errno (EACCES);
+ return -1;
+ }
+
+ killres = reg_sys.kill (posix_path);
+ }
+
+ if (killres != ERROR_SUCCESS)
+ {
+ __seterrno_from_win_error (killres);
+ return -1;
+ }
+
+ return 0; /* Success! */
+}
+
+/* read_cygdrive_info_from_registry: Read the default prefix and flags
+ to use when creating cygdrives from the special user registry
+ location used to store cygdrive information. */
+
+void
+mount_info::read_cygdrive_info_from_registry ()
+{
+ /* reg_key for user mounts in HKEY_CURRENT_USER. */
+ reg_key r;
+
+ if (r.get_string ("cygdrive prefix", cygdrive, sizeof (cygdrive), "") != 0)
+ {
+ /* Didn't find it so write the default to the registry and use it. */
+ write_cygdrive_info_to_registry ("/cygdrive", MOUNT_AUTO);
+ }
+ else
+ {
+ /* Fetch cygdrive_flags from registry; returns MOUNT_AUTO on error. */
+ cygdrive_flags = r.get_int ("cygdrive flags", MOUNT_AUTO);
+ slashify (cygdrive, cygdrive, 1);
+ cygdrive_len = strlen(cygdrive);
+ }
+}
+
+/* write_cygdrive_info_to_registry: Write the default prefix and flags
+ to use when creating cygdrives to the special user registry
+ location used to store cygdrive information. */
+
+int
+mount_info::write_cygdrive_info_to_registry (const char *cygdrive_prefix, unsigned flags)
+{
+ /* reg_key for user mounts in HKEY_CURRENT_USER. */
+ reg_key r;
+
+ /* Verify cygdrive prefix starts with a forward slash and if there's
+ another character, it's not a slash. */
+ if ((cygdrive_prefix == NULL) || (*cygdrive_prefix == 0) ||
+ (cygdrive_prefix[0] != '/') ||
+ ((cygdrive_prefix[1] != '\0') && (SLASH_P (cygdrive_prefix[1]))))
+ {
+ set_errno (EINVAL);
+ return -1;
+ }
+
+ char hold_cygdrive_prefix[strlen (cygdrive_prefix) + 1];
+ /* Ensure that there is never a final slash */
+ nofinalslash (cygdrive_prefix, hold_cygdrive_prefix);
+
+ r.set_string ("cygdrive prefix", hold_cygdrive_prefix);
+ r.set_int ("cygdrive flags", flags);
+
+ /* This also needs to go in the in-memory copy of "cygdrive" */
+ slashify (cygdrive_prefix, cygwin_shared->mount.cygdrive, 1);
+ cygwin_shared->mount.cygdrive_flags = flags;
+ cygwin_shared->mount.cygdrive_len = strlen(cygwin_shared->mount.cygdrive);
+
+ return 0;
+}
+
+struct mntent *
+mount_info::getmntent (int x)
+{
+ if (x < 0 || x >= nmounts)
+ return NULL;
+
+ return mount[native_sorted[x]].getmntent ();
+}
+
+static mount_item *mounts_for_sort;
+
+/* sort_by_posix_name: qsort callback to sort the mount entries. Sort
+ user mounts ahead of system mounts to the same POSIX path. */
+/* FIXME: should the user should be able to choose whether to
+ prefer user or system mounts??? */
+static int
+sort_by_posix_name (const void *a, const void *b)
+{
+ mount_item *ap = mounts_for_sort + (*((int*) a));
+ mount_item *bp = mounts_for_sort + (*((int*) b));
+
+ /* Base weighting on longest posix path first so that the most
+ obvious path will be chosen. */
+ size_t alen = strlen (ap->posix_path);
+ size_t blen = strlen (bp->posix_path);
+
+ int res = blen - alen;
+
+ if (res)
+ return res; /* Path lengths differed */
+
+ /* The two paths were the same length, so just determine normal
+ lexical sorted order. */
+ res = strcmp (ap->posix_path, bp->posix_path);
+
+ if (res == 0)
+ {
+ /* need to select between user and system mount to same POSIX path */
+ if ((bp->flags & MOUNT_SYSTEM) == 0) /* user mount */
+ return 1;
+ else
+ return -1;
+ }
+
+ return res;
+}
+
+/* sort_by_native_name: qsort callback to sort the mount entries. Sort
+ user mounts ahead of system mounts to the same POSIX path. */
+/* FIXME: should the user should be able to choose whether to
+ prefer user or system mounts??? */
+static int
+sort_by_native_name (const void *a, const void *b)
+{
+ mount_item *ap = mounts_for_sort + (*((int*) a));
+ mount_item *bp = mounts_for_sort + (*((int*) b));
+
+ /* Base weighting on longest win32 path first so that the most
+ obvious path will be chosen. */
+ size_t alen = strlen (ap->native_path);
+ size_t blen = strlen (bp->native_path);
+
+ int res = blen - alen;
+
+ if (res)
+ return res; /* Path lengths differed */
+
+ /* The two paths were the same length, so just determine normal
+ lexical sorted order. */
+ res = strcasecmp (ap->posix_path, bp->posix_path);
+
+ if (res == 0)
+ {
+ /* need to select between user and system mount to same POSIX path */
+ if ((bp->flags & MOUNT_SYSTEM) == 0) /* user mount */
+ return 1;
+ else
+ return -1;
+ }
+
+ return res;
+}
+
+void
+mount_info::sort ()
+{
+ for (int i = 0; i < nmounts; i++)
+ native_sorted[i] = posix_sorted[i] = i;
+ /* Sort them into reverse length order, otherwise we won't
+ be able to look for /foo in /. */
+ mounts_for_sort = mount; /* ouch. */
+ qsort (posix_sorted, nmounts, sizeof (posix_sorted[0]), sort_by_posix_name);
+ qsort (native_sorted, nmounts, sizeof (native_sorted[0]), sort_by_native_name);
+}
+
+/* Add an entry to the in-memory mount table.
+ Returns 0 on success, -1 on failure and errno is set.
+
+ This is where all argument validation is done. It may not make sense to
+ do this when called internally, but it's cleaner to keep it all here. */
+
+int
+mount_info::add_item (const char *native, const char *posix, unsigned mountflags)
+{
+ /* Can't add more than MAX_MOUNTS. */
+ if (nmounts == MAX_MOUNTS)
+ {
+ set_errno (EMFILE);
+ return -1;
+ }
+
+ /* Something's wrong if either path is NULL or empty, or if it's
+ not a UNC or absolute path. */
+
+ if ((native == NULL) || (*native == 0) ||
+ (posix == NULL) || (*posix == 0) ||
+ (!slash_unc_prefix_p (native) && !isabspath (native)))
+ {
+ set_errno (EINVAL);
+ return -1;
+ }
+
+ /* Make sure both paths do not end in /. */
+ char nativetmp[MAX_PATH];
+ char posixtmp[MAX_PATH];
+
+ if (slash_drive_prefix_p (native))
+ slash_drive_to_win32_path (native, nativetmp, 0);
+ else
+ {
+ backslashify (native, nativetmp, 0);
+ nofinalslash (nativetmp, nativetmp);
+ }
+
+ slashify (posix, posixtmp, 0);
+ nofinalslash (posixtmp, posixtmp);
+
+ debug_printf ("%s[%s], %s[%s], %p",
+ native, nativetmp, posix, posixtmp, mountflags);
+
+ /* Duplicate /'s in path are an error. */
+ for (char *p = posixtmp + 1; *p; ++p)
+ {
+ if (p[-1] == '/' && p[0] == '/')
+ {
+ set_errno (EINVAL);
+ return -1;
+ }
+ }
+
+ /* Write over an existing mount item with the same POSIX path if
+ it exists and is from the same registry area. */
+ for (int i = 0; i < nmounts; i++)
+ {
+ if ((strcmp (mount[i].posix_path, posixtmp) == 0) &&
+ ((mount[i].flags & MOUNT_SYSTEM) == (mountflags & MOUNT_SYSTEM)))
+ {
+ /* replace existing mount item */
+ mount[i].init (nativetmp, posixtmp, mountflags);
+ goto sortit;
+ }
+ }
+
+ mount[nmounts++].init (nativetmp, posixtmp, mountflags);
+
+sortit:
+ sort ();
+
+ return 0;
+}
+
+/* Delete a mount table entry where path is either a Win32 or POSIX
+ path. Since the mount table is really just a table of aliases,
+ deleting / is ok (although running without a slash mount is
+ strongly discouraged because some programs may run erratically
+ without one). If MOUNT_SYSTEM is set in flags, remove from system
+ registry, otherwise remove the user registry mount.
+*/
+
+int
+mount_info::del_item (const char *path, unsigned flags)
+{
+ char pathtmp[MAX_PATH];
+
+ /* Something's wrong if path is NULL or empty. */
+ if ((path == NULL) || (*path == 0))
+ {
+ set_errno (EINVAL);
+ return -1;
+ }
+
+ slashify (path, pathtmp, 0);
+ nofinalslash (pathtmp, pathtmp);
+
+ debug_printf ("%s[%s]", path, pathtmp);
+
+ for (int i = 0; i < nmounts; i++)
+ {
+ /* Delete if paths and mount locations match. */
+ if (((strcmp (mount[i].posix_path, pathtmp) == 0
+ || strcmp (mount[i].native_path, pathtmp) == 0)) &&
+ ((mount[i].flags & MOUNT_SYSTEM) == (flags & MOUNT_SYSTEM)))
+ {
+ nmounts--; /* One less mount table entry */
+ /* Fill in the hole if not at the end of the table */
+ if (i < nmounts)
+ memcpy (mount + i, mount + i + 1,
+ sizeof (mount[i]) * (nmounts - i));
+ sort (); /* Resort the table */
+ return 0;
+ }
+ }
+ set_errno (EINVAL);
+ return -1;
+}
+
+/* read_v1_mounts: Given a reg_key to an old mount table registry area,
+ read in the mounts. The "which" arg contains zero if we're reading
+ the user area and MOUNT_SYSTEM if we're reading the system area.
+ This way we can store the mounts read in the appropriate place when
+ they are written back to the new registry layout. */
+
+void
+mount_info::read_v1_mounts (reg_key r, unsigned which)
+{
+ unsigned mountflags = 0;
+
+ /* MAX_MOUNTS was 30 when we stopped using the v1 layout */
+ for (int i = 0; i < 30; i++)
+ {
+ char key_name[10];
+ char win32path[MAX_PATH];
+ char unixpath[MAX_PATH];
+
+ __small_sprintf (key_name, "%02x", i);
+
+ reg_key k (r.get_key (), KEY_ALL_ACCESS, key_name, NULL);
+
+ /* The registry names are historical but useful so are left alone. */
+ k.get_string ("native", win32path, sizeof (win32path), "");
+ k.get_string ("unix", unixpath, sizeof (unixpath), "");
+
+ /* Does this entry contain something? */
+ if (*win32path != 0)
+ {
+ mountflags = 0;
+
+ if (k.get_int ("fbinary", 0))
+ mountflags |= MOUNT_BINARY;
+
+ /* Or in zero or MOUNT_SYSTEM depending on which table
+ we're reading. */
+ mountflags |= which;
+
+ cygwin_shared->mount.add_item (win32path, unixpath, mountflags);
+ }
+ }
+}
+
+/* from_v1_registry: Build the entire mount table from the old v1 registry
+ mount area. */
+
+void
+mount_info::from_v1_registry ()
+{
+ reg_key r (HKEY_CURRENT_USER, KEY_ALL_ACCESS,
+ "SOFTWARE",
+ "Cygnus Solutions",
+ "CYGWIN.DLL setup",
+ "b15.0",
+ "mounts",
+ NULL);
+
+ nmounts = 0;
+
+ /* First read mounts from user's table. */
+ read_v1_mounts (r, 0);
+
+ /* Then read mounts from system-wide mount table. */
+ reg_key r1 (HKEY_LOCAL_MACHINE, KEY_ALL_ACCESS,
+ "SOFTWARE",
+ "Cygnus Solutions",
+ "CYGWIN.DLL setup",
+ "b15.0",
+ "mounts",
+ NULL);
+ read_v1_mounts (r1, MOUNT_SYSTEM);
+
+ /* Note: we don't need to sort internal table here since it is
+ done in main from_registry call after this function would be
+ run. */
+}
+
+/* import_v1_mounts: If v1 mounts are present, load them and write
+ the new entries to the new registry area. */
+
+void
+mount_info::import_v1_mounts ()
+{
+ /* Read in old mounts into memory. */
+ from_v1_registry ();
+
+ /* Write all mounts to the new registry. */
+ to_registry ();
+}
+
+/* to_registry: For every mount point in memory, add a corresponding
+ registry mount point. */
+
+void
+mount_info::to_registry ()
+{
+ for (int i = 0; i < MAX_MOUNTS; i++)
+ {
+ if (i < nmounts)
+ {
+ mount_item *p = mount + i;
+
+ add_reg_mount (p->native_path, p->posix_path, p->flags);
+
+ debug_printf ("%02x: %s, %s, %d",
+ i, p->native_path, p->posix_path, p->flags);
+ }
+ }
+}
+
+/************************* mount_item class ****************************/
+
+struct mntent *
+mount_item::getmntent ()
+{
+#ifdef _MT_SAFE
+ struct mntent &ret=_reent_winsup()->_ret;
+#else
+ static NO_COPY struct mntent ret;
+#endif
+
+ /* Pass back pointers to mount_info strings reserved for use by
+ getmntent rather than pointers to strings in the internal mount
+ table because the mount table might change, causing weird effects
+ from the getmntent user's point of view. */
+
+ strcpy (cygwin_shared->mount.mnt_fsname, native_path);
+ ret.mnt_fsname = cygwin_shared->mount.mnt_fsname;
+ strcpy (cygwin_shared->mount.mnt_dir, posix_path);
+ ret.mnt_dir = cygwin_shared->mount.mnt_dir;
+
+ if (!(flags & MOUNT_SYSTEM)) /* user mount */
+ strcpy (cygwin_shared->mount.mnt_type, (char *) "user");
+ else /* system mount */
+ strcpy (cygwin_shared->mount.mnt_type, (char *) "system");
+
+ if ((flags & MOUNT_AUTO)) /* cygdrive */
+ strcat (cygwin_shared->mount.mnt_type, (char *) ",auto");
+
+ ret.mnt_type = cygwin_shared->mount.mnt_type;
+
+ /* mnt_opts is a string that details mount params such as
+ binary or textmode, or exec. We don't print
+ `silent' here; it's a magic internal thing. */
+
+ if (! (flags & MOUNT_BINARY))
+ strcpy (cygwin_shared->mount.mnt_opts, (char *) "textmode");
+ else
+ strcpy (cygwin_shared->mount.mnt_opts, (char *) "binmode");
+
+ if (flags & MOUNT_EXEC)
+ strcat (cygwin_shared->mount.mnt_opts, (char *) ",exec");
+
+ ret.mnt_opts = cygwin_shared->mount.mnt_opts;
+
+ ret.mnt_freq = 1;
+ ret.mnt_passno = 1;
+ return &ret;
+}
+
+/* Fill in the fields of a mount table entry. */
+
+void
+mount_item::init (const char *native, const char *posix, unsigned mountflags)
+{
+ strcpy ((char *) native_path, native);
+ strcpy ((char *) posix_path, posix);
+
+ native_pathlen = strlen (native_path);
+ posix_pathlen = strlen (posix_path);
+
+ flags = mountflags;
+}
+
+/********************** Mount System Calls **************************/
+
+/* Mount table system calls.
+ Note that these are exported to the application. */
+
+/* mount: Add a mount to the mount table in memory and to the registry
+ that will cause paths under win32_path to be translated to paths
+ under posix_path. */
+
+extern "C"
+int
+mount (const char *win32_path, const char *posix_path, unsigned flags)
+{
+ int res = -1;
+
+ if (flags & MOUNT_AUTO) /* normal mount */
+ {
+ /* When flags include MOUNT_AUTO, take this to mean that
+ we actually want to change the cygdrive prefix and flags
+ without actually mounting anything. */
+ res = cygwin_shared->mount.write_cygdrive_info_to_registry (posix_path, flags);
+ win32_path = NULL;
+ }
+ else
+ {
+ if (iscygdrive (posix_path))
+ {
+ set_errno (EINVAL);
+ return res; /* Don't try to add cygdrive prefix. */
+ }
+
+ res = cygwin_shared->mount.add_reg_mount (win32_path, posix_path, flags);
+
+ if (res == 0)
+ cygwin_shared->mount.add_item (win32_path, posix_path, flags);
+ }
+
+ syscall_printf ("%d = mount (%s, %s, %p)", res, win32_path, posix_path, flags);
+ return res;
+}
+
+/* umount: The standard umount call only has a path parameter. Since
+ it is not possible for this call to specify whether to remove the
+ mount from the user or global mount registry table, assume the user
+ table. */
+
+extern "C"
+int
+umount (const char *path)
+{
+ return cygwin_umount (path, 0);
+}
+
+/* cygwin_umount: This is like umount but takes an additional flags
+ parameter that specifies whether to umount from the user or system-wide
+ registry area. */
+
+extern "C"
+int
+cygwin_umount (const char *path, unsigned flags)
+{
+ int res = cygwin_shared->mount.del_reg_mount (path, flags);
+
+ if (res == 0)
+ cygwin_shared->mount.del_item (path, flags);
+
+ syscall_printf ("%d = cygwin_umount (%s, %d)", res, path, flags);
+ return res;
+}
+
+#ifdef _MT_SAFE
+#define iteration _reent_winsup()->_iteration
+#else
+static int iteration;
+#endif
+
+extern "C"
+FILE *
+setmntent (const char *filep, const char *)
+{
+ iteration = 0;
+ return (FILE *) filep;
+}
+
+extern "C"
+struct mntent *
+getmntent (FILE *)
+{
+ return cygwin_shared->mount.getmntent (iteration++);
+}
+
+extern "C"
+int
+endmntent (FILE *)
+{
+ return 1;
+}
+
+/********************** Symbolic Link Support **************************/
+
+/* Create a symlink from FROMPATH to TOPATH. */
+
+extern "C"
+int
+symlink (const char *topath, const char *frompath)
+{
+ HANDLE h;
+ int res = -1;
+
+ path_conv win32_path (frompath, SYMLINK_NOFOLLOW);
+ if (win32_path.error)
+ {
+ set_errno (win32_path.error);
+ goto done;
+ }
+
+ syscall_printf ("symlink (%s, %s)", topath, win32_path.get_win32 ());
+
+ if (topath[0] == 0)
+ {
+ set_errno (EINVAL);
+ goto done;
+ }
+ if (strlen (topath) >= MAX_PATH)
+ {
+ set_errno (ENAMETOOLONG);
+ goto done;
+ }
+
+ if (win32_path.is_device () ||
+ win32_path.file_attributes () != (DWORD) -1)
+ {
+ set_errno (EEXIST);
+ goto done;
+ }
+
+ h = CreateFileA(win32_path.get_win32 (), GENERIC_WRITE, 0, &sec_none_nih,
+ CREATE_NEW, FILE_ATTRIBUTE_NORMAL, 0);
+ if (h == INVALID_HANDLE_VALUE)
+ __seterrno ();
+ else
+ {
+ char buf[sizeof (SYMLINK_COOKIE) + MAX_PATH + 10];
+
+ __small_sprintf (buf, "%s%s", SYMLINK_COOKIE, topath);
+ DWORD len = strlen (buf) + 1;
+
+ /* Note that the terminating nul is written. */
+ DWORD written;
+ if (!WriteFile (h, buf, len, &written, NULL) || written != len)
+ {
+ __seterrno ();
+ CloseHandle (h);
+ DeleteFileA (win32_path.get_win32 ());
+ }
+ else
+ {
+ CloseHandle (h);
+ chmod (frompath, S_IFLNK | S_IRWXU | S_IRWXG | S_IRWXO);
+ res = 0;
+ }
+ }
+
+done:
+ syscall_printf ("%d = symlink (%s, %s)", res, topath, frompath);
+ return res;
+}
+
+static __inline char *
+has_suffix (const char *path, const suffix_info *suffixes)
+{
+ char *ext = strrchr (path, '.');
+ if (ext)
+ for (const suffix_info *ex = suffixes; ex->name != NULL; ex++)
+ if (strcasematch (ext, ex->name))
+ return ext;
+ return NULL;
+}
+
+static int __inline
+next_suffix (char *ext_here, const suffix_info *&suffixes)
+{
+ if (!suffixes)
+ return 1;
+
+ while (suffixes && suffixes->name)
+ if (!suffixes->addon)
+ suffixes++;
+ else
+ {
+ strcpy (ext_here, suffixes->name);
+ suffixes++;
+ return 1;
+ }
+ return 0;
+}
+
+/* Check if PATH is a symlink. PATH must be a valid Win32 path name.
+
+ If PATH is a symlink, put the value of the symlink--the file to
+ which it points--into BUF. The value stored in BUF is not
+ necessarily null terminated. BUFLEN is the length of BUF; only up
+ to BUFLEN characters will be stored in BUF. BUF may be NULL, in
+ which case nothing will be stored.
+
+ Set *SYML if PATH is a symlink.
+
+ Set *EXEC if PATH appears to be executable. This is an efficiency
+ hack because we sometimes have to open the file anyhow. *EXEC will
+ not be set for every executable file.
+
+ Return -1 on error, 0 if PATH is not a symlink, or the length
+ stored into BUF if PATH is a symlink. */
+
+static int
+symlink_check_one (const char *in_path, char *buf, int buflen, DWORD& fileattr,
+ unsigned *pflags, const suffix_info *suffixes, char *&known_suffix)
+{
+ HANDLE h;
+ int res = 0;
+ char extbuf[buflen + 5];
+ char *ext_here;
+ const char *path = in_path;
+
+ if (!suffixes)
+ ext_here = NULL;
+ else if ((known_suffix = has_suffix (in_path, suffixes)) != NULL)
+ {
+ suffixes = NULL;
+ ext_here = NULL;
+ }
+ else
+ {
+ path = strcpy (extbuf, in_path);
+ ext_here = strchr (path, '\0');
+ }
+
+ *buf = '\0';
+ do
+ {
+ if (!next_suffix (ext_here, suffixes))
+ break;
+ fileattr = GetFileAttributesA (path);
+ if (fileattr == (DWORD) -1)
+ {
+ /* The GetFileAttributesA call can fail for reasons that don't
+ matter, so we just return 0. For example, getting the
+ attributes of \\HOST will typically fail. */
+ debug_printf ("GetFileAttributesA (%s) failed", path);
+ __seterrno ();
+ continue;
+ }
+
+ /* Windows allows path\. even when `path' isn't a directory.
+ Detect this scenario and disallow it, since it is non-UNIX like. */
+ char *p = strchr (path, '\0');
+ if (p > path + 1 && p[-1] == '.' && SLASH_P (p[-2]) &&
+ !(fileattr & FILE_ATTRIBUTE_DIRECTORY))
+ {
+ debug_printf ("\\. specified on non-directory");
+ set_errno (ENOTDIR);
+ return 0;
+ }
+
+ /* A symlink will have the `system' file attribute. */
+ /* Only files can be symlinks (which can be symlinks to directories). */
+ if (!SYMLINKATTR (fileattr))
+ goto file_not_symlink;
+
+ /* Check the file's extended attributes, if it has any. */
+ int unixattr = 0;
+ if (fileattr & FILE_ATTRIBUTE_DIRECTORY)
+ unixattr |= S_IFDIR;
+
+ if (! get_file_attribute (TRUE, path, &unixattr))
+ {
+ if (unixattr & STD_XBITS)
+ *pflags |= PATH_EXEC;
+ if (! S_ISLNK (unixattr))
+ ;
+ }
+
+ /* Open the file. */
+
+ h = CreateFileA (path, GENERIC_READ, FILE_SHARE_READ, &sec_none_nih, OPEN_EXISTING,
+ FILE_ATTRIBUTE_NORMAL, 0);
+
+ res = -1;
+ if (h == INVALID_HANDLE_VALUE)
+ __seterrno ();
+ else
+ {
+ char cookie_buf[sizeof (SYMLINK_COOKIE) - 1];
+ DWORD got;
+
+ if (! ReadFile (h, cookie_buf, sizeof (cookie_buf), &got, 0))
+ set_errno (EIO);
+ else if (got == sizeof (cookie_buf)
+ && memcmp (cookie_buf, SYMLINK_COOKIE,
+ sizeof (cookie_buf)) == 0)
+ {
+ /* It's a symlink. */
+ *pflags = PATH_SYMLINK;
+
+ res = ReadFile (h, buf, buflen, &got, 0);
+ if (!res)
+ set_errno (EIO);
+ else
+ {
+ /* Versions prior to b16 stored several trailing
+ NULs with the path (to fill the path out to 1024
+ chars). Current versions only store one trailing
+ NUL. The length returned is the path without
+ *any* trailing NULs. We also have to handle (or
+ at least not die from) corrupted paths. */
+ if (memchr (buf, 0, got) != NULL)
+ res = strlen (buf);
+ else
+ res = got;
+ }
+ }
+ else if (got == sizeof (cookie_buf)
+ && memcmp (cookie_buf, SOCKET_COOKIE,
+ sizeof (cookie_buf)) == 0)
+ {
+ res = 0;
+ *pflags |= PATH_SOCKET;
+ goto close_and_return;
+ }
+ else if (*pflags & PATH_EXEC)
+ goto close_and_return;
+ else if (!(*pflags & PATH_EXEC))
+ {
+ /* Not a symlink, see if executable. */
+ if (got >= 2 &&
+ ((cookie_buf[0] == '#' && cookie_buf[1] == '!') ||
+ (cookie_buf[0] == ':' && cookie_buf[1] == '\n')))
+ *pflags |= PATH_EXEC;
+ close_and_return:
+ CloseHandle (h);
+ goto file_not_symlink;
+ }
+ }
+ CloseHandle (h);
+ break;
+ }
+ while (suffixes);
+ goto out;
+
+file_not_symlink:
+ set_errno (EINVAL);
+ if (ext_here)
+ strcpy (buf, ext_here);
+ res = 0;
+
+out:
+ syscall_printf ("%d = symlink_check_one (%s, %p, %d) (%p)",
+ res, path, buf, buflen, *pflags);
+
+ return res;
+}
+
+/* readlink system call */
+
+extern "C"
+int
+readlink (const char *path, char *buf, int buflen)
+{
+ path_conv pathbuf (path, SYMLINK_CONTENTS);
+ if (pathbuf.error)
+ {
+ set_errno (pathbuf.error);
+ syscall_printf ("-1 = readlink (%s, %p, %d)", path, buf, buflen);
+ return -1;
+ }
+
+ if (!pathbuf.issymlink ())
+ {
+ if (pathbuf.fileattr != (DWORD) -1)
+ set_errno (EINVAL);
+ return -1;
+ }
+
+ int len = strlen (pathbuf.get_win32 ());
+ if (len > (buflen - 1))
+ {
+ set_errno (ENAMETOOLONG);
+ return -1;
+ }
+ memcpy (buf, pathbuf.get_win32 (), len);
+ buf[len] = '\0';
+
+ /* errno set by symlink_check_one if error */
+ return len;
+}
+
+/* Some programs rely on st_dev/st_ino being unique for each file.
+ Hash the path name and hope for the best. The hash arg is not
+ always initialized to zero since readdir needs to compute the
+ dirent ino_t based on a combination of the hash of the directory
+ done during the opendir call and the hash or the filename within
+ the directory. FIXME: Not bullet-proof. */
+/* Cygwin internal */
+
+unsigned long __stdcall
+hash_path_name (unsigned long hash, const char *name)
+{
+ if (!*name)
+ return hash;
+
+ /* Perform some initial permutations on the pathname if this is
+ not "seeded" */
+ if (!hash)
+ {
+ /* Simplistic handling of drives. If there is a drive specified,
+ make sure that the initial letter is upper case. If there is
+ no \ after the ':' assume access through the root directory
+ of that drive.
+ FIXME: Should really honor MS-Windows convention of using
+ the environment to track current directory on various drives. */
+ if (name[1] == ':')
+ {
+ char *nn, *newname = (char *) alloca (strlen (name) + 2);
+ nn = strncpy (newname, name, 2);
+ if (islower (*nn))
+ *newname = toupper (*nn);
+ *(nn += 2) = '\0';
+ name += 2;
+ if (*name != '\\')
+ {
+ *nn = '\\';
+ *++nn = '\0';
+ }
+ strcpy (nn, name);
+ name = newname;
+ goto hashit;
+ }
+
+ /* Fill out the hashed path name with the current working directory if
+ this is not an absolute path and there is no pre-specified hash value.
+ Otherwise the inodes same will differ depending on whether a file is
+ referenced with an absolute value or relatively. */
+
+ if (*name != '\\' && (current_directory_name == NULL ||
+ get_current_directory_name ()))
+ {
+ hash = current_directory_hash;
+ if (name[0] == '.' && name[1] == '\0')
+ return hash;
+ hash = hash_path_name (hash, "\\");
+ }
+ }
+
+hashit:
+ /* Build up hash. Ignore single trailing slash or \a\b\ != \a\b or
+ \a\b\. but allow a single \ if that's all there is. */
+ do
+ {
+ hash += *name + (*name << 17);
+ hash ^= hash >> 2;
+ }
+ while (*++name != '\0' &&
+ !(*name == '\\' && (!name[1] || (name[1] == '.' && !name[2]))));
+ return hash;
+}
+
+static int
+get_current_directory_name ()
+{
+ DWORD dlen, len;
+
+ for (dlen = 256; ; dlen *= 2)
+ {
+ current_directory_name = (char *) realloc (current_directory_name, dlen + 2);
+ if ((len = GetCurrentDirectoryA (dlen, current_directory_name)) < dlen)
+ break;
+ }
+
+ if (len == 0)
+ __seterrno ();
+ else
+ current_directory_hash = hash_path_name (0, current_directory_name);
+
+ return len;
+}
+
+/* getcwd */
+
+static char *
+getcwd_inner (char *buf, size_t ulen, int posix_p)
+{
+ char *resbuf = NULL;
+ size_t len = ulen;
+
+ if (current_directory_name == NULL && !get_current_directory_name ())
+ return NULL;
+
+ if (!posix_p)
+ {
+ if (strlen (current_directory_name) >= len)
+ set_errno (ERANGE);
+ else
+ {
+ strcpy (buf, current_directory_name);
+ resbuf = buf;
+ }
+
+ syscall_printf ("%p (%s) = getcwd_inner (%p, %d, win32) (cached)",
+ resbuf, resbuf ? resbuf : "", buf, len);
+ return resbuf;
+ }
+ else if (current_directory_posix_name != NULL)
+ {
+ if (strlen (current_directory_posix_name) >= len)
+ set_errno (ERANGE);
+ else
+ {
+ strcpy (buf, current_directory_posix_name);
+ resbuf = buf;
+ }
+
+ syscall_printf ("%p (%s) = getcwd_inner (%p, %d, posix) (cached)",
+ resbuf, resbuf ? resbuf : "", buf, len);
+ return resbuf;
+ }
+
+ /* posix_p required and current_directory_posix_name == NULL */
+
+ char temp[MAX_PATH];
+
+ /* Turn from Win32 style to our style. */
+ cygwin_shared->mount.conv_to_posix_path (current_directory_name, temp, 0);
+
+ size_t tlen = strlen (temp);
+
+ current_directory_posix_name = (char *) realloc (
+ current_directory_posix_name, tlen + 1);
+ if (current_directory_posix_name != NULL)
+ strcpy (current_directory_posix_name, temp);
+
+ if (tlen >= ulen)
+ {
+ /* len was too small */
+ set_errno (ERANGE);
+ }
+ else
+ {
+ strcpy (buf, temp);
+ resbuf = buf;
+ }
+
+ syscall_printf ("%p (%s) = getcwd_inner (%p, %d, %s)",
+ resbuf, resbuf ? resbuf : "",
+ buf, len, posix_p ? "posix" : "win32");
+ return resbuf;
+}
+
+char *
+getcwd (char *buf, size_t ulen)
+{
+ char *res;
+
+ if (buf == NULL || ulen == 0)
+ {
+ buf = (char *) alloca (MAX_PATH);
+ res = getcwd_inner (buf, MAX_PATH, 1);
+ res = strdup (buf);
+ }
+ else
+ {
+ res = getcwd_inner (buf, ulen, 1);
+ }
+
+ return res;
+}
+
+/* getwd: standards? */
+extern "C"
+char *
+getwd (char *buf)
+{
+ return getcwd (buf, MAX_PATH);
+}
+
+/* chdir: POSIX 5.2.1.1 */
+extern "C"
+int
+chdir (const char *dir)
+{
+ path_conv path (dir);
+
+ if (path.error)
+ {
+ set_errno (path.error);
+ syscall_printf ("-1 = chdir (%s)", dir);
+ return -1;
+ }
+
+ char *native_dir = path.get_win32 ();
+
+ /* Check to see if path translates to something like C:.
+ If it does, append a \ to the native directory specification to
+ defeat the Windows 95 (i.e. MS-DOS) tendency of returning to
+ the last directory visited on the given drive. */
+ if (isalpha (native_dir[0]) && native_dir[1] == ':' && !native_dir[2])
+ {
+ native_dir[2] = '\\';
+ native_dir[3] = '\0';
+ }
+ int res = SetCurrentDirectoryA (native_dir);
+ if (!res)
+ __seterrno ();
+
+ /* Clear the cache until we need to retrieve the directory again. */
+ if (current_directory_name != NULL)
+ {
+ free (current_directory_name);
+ current_directory_name = NULL;
+ }
+ if (current_directory_posix_name != NULL)
+ {
+ free (current_directory_posix_name);
+ current_directory_posix_name = NULL;
+ }
+
+ syscall_printf ("%d = chdir (%s) (dos %s)", res ? 0 : -1, dir, native_dir);
+ return res ? 0 : -1;
+}
+
+/******************** Exported Path Routines *********************/
+
+/* Cover functions to the path conversion routines.
+ These are exported to the world as cygwin_foo by cygwin.din. */
+
+extern "C"
+int
+cygwin_conv_to_win32_path (const char *path, char *win32_path)
+{
+ path_conv p (path, SYMLINK_FOLLOW, 0);
+ if (p.error)
+ {
+ set_errno (p.error);
+ return -1;
+ }
+
+ strcpy (win32_path, p.get_win32 ());
+ return 0;
+}
+
+extern "C"
+int
+cygwin_conv_to_full_win32_path (const char *path, char *win32_path)
+{
+ path_conv p (path, SYMLINK_FOLLOW, 1);
+ if (p.error)
+ {
+ set_errno (p.error);
+ return -1;
+ }
+
+ strcpy (win32_path, p.get_win32 ());
+ return 0;
+}
+
+/* This is exported to the world as cygwin_foo by cygwin.din. */
+
+extern "C"
+int
+cygwin_conv_to_posix_path (const char *path, char *posix_path)
+{
+ if (check_null_empty_path_errno (path))
+ return -1;
+ cygwin_shared->mount.conv_to_posix_path (path, posix_path, 1);
+ return 0;
+}
+
+extern "C"
+int
+cygwin_conv_to_full_posix_path (const char *path, char *posix_path)
+{
+ if (check_null_empty_path_errno (path))
+ return -1;
+ cygwin_shared->mount.conv_to_posix_path (path, posix_path, 0);
+ return 0;
+}
+
+/* The realpath function is supported on some UNIX systems. */
+
+extern "C"
+char *
+realpath (const char *path, char *resolved)
+{
+ int err;
+
+ path_conv real_path (path, SYMLINK_FOLLOW, 1);
+
+ if (real_path.error)
+ err = real_path.error;
+ else
+ {
+ err = cygwin_shared->mount.conv_to_posix_path (real_path.get_win32 (), resolved, 0);
+ if (err == 0)
+ return resolved;
+ }
+
+ /* FIXME: on error, we are supposed to put the name of the path
+ component which could not be resolved into RESOLVED. */
+ resolved[0] = '\0';
+
+ set_errno (err);
+ return NULL;
+}
+
+/* Return non-zero if path is a POSIX path list.
+ This is exported to the world as cygwin_foo by cygwin.din.
+
+DOCTOOL-START
+<sect1 id="add-func-cygwin-posix-path-list-p">
+ <para>Rather than use a mode to say what the "proper" path list
+ format is, we allow any, and give apps the tools they need to
+ convert between the two. If a ';' is present in the path list it's
+ a Win32 path list. Otherwise, if the first path begins with
+ [letter]: (in which case it can be the only element since if it
+ wasn't a ';' would be present) it's a Win32 path list. Otherwise,
+ it's a POSIX path list.</para>
+</sect1>
+DOCTOOL-END
+ */
+
+extern "C"
+int
+cygwin_posix_path_list_p (const char *path)
+{
+ int posix_p = ! (strchr (path, ';')
+ || (isalpha (path[0]) && path[1] == ':'));
+ return posix_p;
+}
+
+/* These are used for apps that need to convert env vars like PATH back and
+ forth. The conversion is a two step process. First, an upper bound on the
+ size of the buffer needed is computed. Then the conversion is done. This
+ allows the caller to use alloca if it wants. */
+
+static int
+conv_path_list_buf_size (const char *path_list, int to_posix_p)
+{
+ int i, num_elms, max_mount_path_len, size;
+ const char *p;
+
+ /* The theory is that an upper bound is
+ current_size + (num_elms * max_mount_path_len) */
+
+ char delim = to_posix_p ? ';' : ':';
+ p = path_list;
+ for (num_elms = 1; (p = strchr (p, delim)) != NULL; ++num_elms)
+ ++p;
+
+ /* 7: strlen ("//c") + slop, a conservative initial value */
+ for (max_mount_path_len = 7, i = 0; i < cygwin_shared->mount.nmounts; ++i)
+ {
+ int mount_len = (to_posix_p
+ ? cygwin_shared->mount.mount[i].posix_pathlen
+ : cygwin_shared->mount.mount[i].native_pathlen);
+ if (max_mount_path_len < mount_len)
+ max_mount_path_len = mount_len;
+ }
+
+ /* 100: slop */
+ size = strlen (path_list) + (num_elms * max_mount_path_len) + 100;
+ return size;
+}
+
+extern "C"
+int
+cygwin_win32_to_posix_path_list_buf_size (const char *path_list)
+{
+ return conv_path_list_buf_size (path_list, 1);
+}
+
+extern "C"
+int
+cygwin_posix_to_win32_path_list_buf_size (const char *path_list)
+{
+ return conv_path_list_buf_size (path_list, 0);
+}
+
+extern "C"
+int
+cygwin_win32_to_posix_path_list (const char *win32, char *posix)
+{
+ conv_path_list (win32, posix, 1);
+ return 0;
+}
+
+extern "C"
+int
+cygwin_posix_to_win32_path_list (const char *posix, char *win32)
+{
+ conv_path_list (posix, win32, 0);
+ return 0;
+}
+
+/* cygwin_split_path: Split a path into directory and file name parts.
+ Buffers DIR and FILE are assumed to be big enough.
+
+ Examples (path -> `dir' / `file'):
+ / -> `/' / `'
+ "" -> `.' / `'
+ . -> `.' / `.' (FIXME: should this be `.' / `'?)
+ .. -> `.' / `..' (FIXME: should this be `..' / `'?)
+ foo -> `.' / `foo'
+ foo/bar -> `foo' / `bar'
+ foo/bar/ -> `foo' / `bar'
+ /foo -> `/' / `foo'
+ /foo/bar -> `/foo' / `bar'
+ c: -> `c:/' / `'
+ c:/ -> `c:/' / `'
+ c:foo -> `c:/' / `foo'
+ c:/foo -> `c:/' / `foo'
+ */
+
+extern "C"
+void
+cygwin_split_path (const char *path, char *dir, char *file)
+{
+ int dir_started_p = 0;
+
+ /* Deal with drives.
+ Remember that c:foo <==> c:/foo. */
+ if (isalpha (path[0]) && path[1] == ':')
+ {
+ *dir++ = *path++;
+ *dir++ = *path++;
+ *dir++ = '/';
+ if (! *path)
+ {
+ *dir = 0;
+ *file = 0;
+ return;
+ }
+ if (SLASH_P (*path))
+ ++path;
+ dir_started_p = 1;
+ }
+
+ /* Determine if there are trailing slashes and "delete" them if present.
+ We pretend as if they don't exist. */
+ const char *end = path + strlen (path);
+ /* path + 1: keep leading slash. */
+ while (end > path + 1 && SLASH_P (end[-1]))
+ --end;
+
+ /* At this point, END points to one beyond the last character
+ (with trailing slashes "deleted"). */
+
+ /* Point LAST_SLASH at the last slash (duh...). */
+ const char *last_slash;
+ for (last_slash = end - 1; last_slash >= path; --last_slash)
+ if (SLASH_P (*last_slash))
+ break;
+
+ if (last_slash == path)
+ {
+ *dir++ = '/';
+ *dir = 0;
+ }
+ else if (last_slash > path)
+ {
+ memcpy (dir, path, last_slash - path);
+ dir[last_slash - path] = 0;
+ }
+ else
+ {
+ if (dir_started_p)
+ ; /* nothing to do */
+ else
+ *dir++ = '.';
+ *dir = 0;
+ }
+
+ memcpy (file, last_slash + 1, end - last_slash - 1);
+ file[end - last_slash - 1] = 0;
+}
+
+/********************** String Helper Functions ************************/
+
+#define CHXOR ('a' ^ 'A')
+#define ch_case_eq(ch1, ch2) \
+ ({ \
+ unsigned char x; \
+ !((x = ((unsigned char)ch1 ^ (unsigned char)ch2)) && \
+ (x != CHXOR || !isalpha (ch1))); \
+ })
+
+int __stdcall
+strncasematch (const char *s1, const char *s2, size_t n)
+{
+ if (s1 == s2)
+ return 1;
+
+ n++;
+ while (--n && *s1)
+ {
+ if (!ch_case_eq (*s1, *s2))
+ return 0;
+ s1++; s2++;
+ }
+ return !n || *s2 == '\0';
+}
+
+int __stdcall
+strcasematch (const char *s1, const char *s2)
+{
+ if (s1 == s2)
+ return 1;
+
+ while (*s1)
+ {
+ if (!ch_case_eq (*s1, *s2))
+ return 0;
+ s1++; s2++;
+ }
+ return *s2 == '\0';
+}
+
+char * __stdcall
+strcasestr (const char *searchee, const char *lookfor)
+{
+ if (*searchee == 0)
+ {
+ if (*lookfor)
+ return NULL;
+ return (char *) searchee;
+ }
+
+ while (*searchee)
+ {
+ int i = 0;
+ while (1)
+ {
+ if (lookfor[i] == 0)
+ return (char *) searchee;
+
+ if (!ch_case_eq (lookfor[i], searchee[i]))
+ break;
+ lookfor++;
+ }
+ searchee++;
+ }
+
+ return NULL;
+}
diff --git a/winsup/cygwin/path.h b/winsup/cygwin/path.h
new file mode 100644
index 000000000..3c0efccae
--- /dev/null
+++ b/winsup/cygwin/path.h
@@ -0,0 +1,98 @@
+/* path.h: path data structures
+
+ Copyright 1996, 1997, 1998, 2000 Cygnus Solutions.
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+struct suffix_info
+{
+ const char *name;
+ int addon;
+ suffix_info (const char *s, int addit = 0) {name = s, addon = addit;}
+};
+
+enum symlink_follow
+{
+ SYMLINK_FOLLOW,
+ SYMLINK_NOFOLLOW,
+ SYMLINK_IGNORE,
+ SYMLINK_CONTENTS
+};
+
+#include <sys/mount.h>
+
+enum
+{
+ PATH_SYMLINK = 1,
+ PATH_BINARY = MOUNT_BINARY,
+ PATH_EXEC = MOUNT_EXEC,
+ PATH_SOCKET = 0x40000000,
+ PATH_HASACLS = 0x80000000
+};
+
+
+class path_conv
+{
+ char path[MAX_PATH];
+ public:
+
+ unsigned path_flags;
+
+ int has_acls () {return path_flags & PATH_HASACLS;}
+ int hasgood_inode () {return path_flags & PATH_HASACLS;} // Not strictly correct
+ int isbinary () {return path_flags & PATH_BINARY;}
+ int issymlink () {return path_flags & PATH_SYMLINK;}
+ int issocket () {return path_flags & PATH_SOCKET;}
+ int isexec () {return path_flags & PATH_EXEC;}
+
+ void set_binary () {path_flags |= PATH_BINARY;}
+ void set_symlink () {path_flags |= PATH_SYMLINK;}
+ void set_exec (int x = 1) {path_flags |= x ? PATH_EXEC : 0;}
+ void set_has_acls (int x = 1) {path_flags |= x ? PATH_HASACLS : 0;}
+
+ char *known_suffix;
+
+ int error;
+ DWORD devn;
+ int unit;
+
+ DWORD fileattr;
+
+ path_conv (const char * const, symlink_follow follow_mode = SYMLINK_FOLLOW,
+ int use_full_path = 0, const suffix_info *suffixes = NULL);
+ inline char *get_win32 () { return path; }
+ BOOL is_device () {return devn != FH_BAD;}
+ DWORD get_devn () {return devn == FH_BAD ? FH_DISK : devn;}
+ short get_unitn () {return devn == FH_BAD ? 0 : unit;}
+ DWORD file_attributes () {return fileattr;}
+};
+
+/* Symlink marker */
+#define SYMLINK_COOKIE "!<symlink>"
+
+/* Socket marker */
+#define SOCKET_COOKIE "!<socket >"
+
+/* Maximum depth of symlinks (after which ELOOP is issued). */
+#define MAX_LINK_DEPTH 10
+
+extern suffix_info std_suffixes[];
+
+int __stdcall get_device_number (const char *name, int &unit, BOOL from_conv = FALSE);
+int __stdcall slash_unc_prefix_p (const char *path);
+
+/* Common macros for checking for invalid path names */
+#define check_null_empty_path(src) \
+ (!(src) ? EFAULT : *(src) ? 0 : ENOENT)
+
+#define check_null_empty_path_errno(src) \
+({ \
+ int __err; \
+ if ((__err = check_null_empty_path(src))) \
+ set_errno (__err); \
+ __err; \
+})
diff --git a/winsup/cygwin/path.sgml b/winsup/cygwin/path.sgml
new file mode 100644
index 000000000..6030c8f78
--- /dev/null
+++ b/winsup/cygwin/path.sgml
@@ -0,0 +1,205 @@
+<sect1 id="func-cygwin-posix-to-win32-path-list">
+<title>cygwin_posix_to_win32_path_list</title>
+
+<funcsynopsis>
+<funcdef>extern "C" void
+<function>cygwin_posix_to_win32_path_list</function></funcdef>
+<paramdef>const char *<parameter>posix</parameter></paramdef>
+<paramdef>char *<parameter>win32</parameter></paramdef>
+</funcsynopsis>
+
+<para>Given a POSIX path-style string (i.e. /foo:/bar) convert it to
+the equivalent Win32 path-style string (i.e. d:\;e:\bar).
+<parameter>win32</parameter> must point to a sufficiently large
+buffer.</para>
+
+<example>
+<title>Example use of cygwin_posix_to_win32_path_list</title>
+<programlisting>
+char *_epath;
+char *_win32epath;
+_epath = _win32epath = getenv (NAME);
+/* If we have a POSIX path list, convert to win32 path list */
+if (_epath != NULL && *_epath != 0
+ && cygwin_posix_path_list_p (_epath))
+ {
+ _win32epath = (char *) xmalloc
+ (cygwin_posix_to_win32_path_list_buf_size (_epath));
+ cygwin_posix_to_win32_path_list (_epath, _win32epath);
+ }
+</programlisting>
+</example>
+
+<para>See also <link linkend="func-cygwin-posix-to-win32-path-list-buf-size">
+cygwin_posix_to_win32_path_list_buf_size</link></para>
+
+</sect1>
+
+<sect1 id="func-cygwin-win32-to-posix-path-list">
+<title>cygwin_win32_to_posix_path_list</title>
+
+<funcsynopsis>
+<funcdef>extern "C" void
+<function>cygwin_win32_to_posix_path_list</function></funcdef>
+<paramdef>const char *<parameter>win32</parameter></paramdef>
+<paramdef>char *<parameter>posix</parameter></paramdef>
+</funcsynopsis>
+
+<para>Given a Win32 path-style string (i.e. d:\;e:\bar) convert it to
+the equivalent POSIX path-style string (i.e. /foo:/bar).
+<parameter>posix</parameter> must point to a sufficiently large
+buffer. See also <link
+linkend="func-cygwin-win32-to-posix-path-list-buf-size">
+cygwin_win32_to_posix_path_list_buf_size</link></para>
+
+</sect1>
+
+<sect1 id="func-cygwin-posix-to-win32-path-list-buf-size">
+<title>cygwin_posix_to_win32_path_list_buf_size</title>
+
+<funcsynopsis>
+<funcdef>extern "C" int
+<function>cygwin_posix_to_win32_path_list_buf_size</function></funcdef>
+<paramdef>const char *<parameter>path_list</parameter></paramdef>
+</funcsynopsis>
+
+<para>Returns the number of bytes needed to hold the result of calling
+<link linkend="func-cygwin-posix-to-win32-path-list">
+cygwin_posix_to_win32_path_list</link>.</para>
+
+</sect1>
+
+<sect1 id="func-cygwin-win32-to-posix-path-list-buf-size">
+<title>cygwin_win32_to_posix_path_list_buf_size</title>
+
+<funcsynopsis>
+<funcdef>extern "C" int
+<function>cygwin_win32_to_posix_path_list_buf_size</function></funcdef>
+<paramdef>const char *<parameter>path_list</parameter></paramdef>
+</funcsynopsis>
+
+<para>Tells you how many bytes are needed for the results of <link
+linkend="func-cygwin-win32-to-posix-path-list">
+cygwin_win32_to_posix_path_list</link>.</para>
+
+</sect1>
+
+<sect1 id="func-cygwin-conv-to-posix-path">
+<title>cygwin_conv_to_posix_path</title>
+
+<funcsynopsis>
+<funcdef>extern "C" void
+<function>cygwin_conv_to_posix_path</function></funcdef>
+<paramdef>const char *<parameter>path</parameter></paramdef>
+<paramdef>char *<parameter>posix_path</parameter></paramdef>
+</funcsynopsis>
+
+<para>Converts a Win32 path to a POSIX path. If
+<parameter>path</parameter> is already a POSIX path, leaves it alone.
+If <parameter>path</parameter> is relative, then
+<parameter>posix_path</parameter> will also be relative. Note that
+<parameter>posix_path</parameter> must point to a buffer of sufficient
+size; use MAX_PATH if needed.</para>
+
+</sect1>
+
+<sect1 id="func-cygwin-conv-to-win32-path">
+<title>cygwin_conv_to_win32_path</title>
+
+<funcsynopsis>
+<funcdef>extern "C" void
+<function>cygwin_conv_to_win32_path</function></funcdef>
+<paramdef>const char *<parameter>path</parameter></paramdef>
+<paramdef>char *<parameter>win32_path</parameter></paramdef>
+</funcsynopsis>
+
+<para>Converts a POSIX path to a Win32 path. If
+<parameter>path</parameter> is already a Win32 path, leaves it alone.
+If <parameter>path</parameter> is relative, then
+<parameter>win32_path</parameter> will also be relative. Note that
+<parameter>win32_path</parameter> must point to a buffer of sufficient
+size; use MAX_PATH if needed.</para>
+
+</sect1>
+<sect1 id="func-cygwin-conv-to-full-posix-path">
+<title>cygwin_conv_to_full_posix_path</title>
+
+<funcsynopsis>
+<funcdef>extern "C" void
+<function>cygwin_conv_to_full_posix_path</function></funcdef>
+<paramdef>const char *<parameter>path</parameter></paramdef>
+<paramdef>char *<parameter>posix_path</parameter></paramdef>
+</funcsynopsis>
+
+<para>Converts a Win32 path to a POSIX path. If
+<parameter>path</parameter> is already a POSIX path, leaves it alone.
+If <parameter>path</parameter> is relative, then
+<parameter>posix_path</parameter> will be converted to an absolute
+path. Note that <parameter>posix_path</parameter> must point to a
+buffer of sufficient size; use MAX_PATH if needed.</para>
+
+</sect1>
+
+<sect1 id="func-cygwin-conv-to-full-win32-path">
+<title>cygwin_conv_to_full_win32_path</title>
+
+<funcsynopsis>
+<funcdef>extern "C" void
+<function>cygwin_conv_to_full_win32_path</function></funcdef>
+<paramdef>const char *<parameter>path</parameter></paramdef>
+<paramdef>char *<parameter>win32_path</parameter></paramdef>
+</funcsynopsis>
+
+<para>Converts a POSIX path to a Win32 path. If
+<parameter>path</parameter> is already a Win32 path, leaves it alone.
+If <parameter>path</parameter> is relative, then
+<parameter>win32_path</parameter> will be converted to an absolute
+path. Note that <parameter>win32_path</parameter> must point to a
+buffer of sufficient size; use MAX_PATH if needed.</para>
+
+</sect1>
+
+<sect1 id="func-cygwin-posix-path-list-p">
+<title>cygwin_posix_path_list_p</title>
+
+<funcsynopsis>
+<funcdef>extern "C" int
+<function>posix_path_list_p</function></funcdef>
+<paramdef>const char *<parameter>path</parameter></paramdef>
+</funcsynopsis>
+
+<para>This function tells you if the supplied
+<parameter>path</parameter> is a POSIX-style path (i.e. posix names,
+forward slashes, colon delimiters) or a Win32-style path (drive
+letters, reverse slashes, semicolon delimiters. The return value is
+true if the path is a POSIX path. Note that "_p" means "predicate", a
+lisp term meaning that the function tells you something about the
+parameter.</para>
+
+</sect1>
+
+<sect1 id="func-cygwin-split-path">
+<title>cygwin_split_path</title>
+
+<funcsynopsis>
+<funcdef>extern "C" void
+<function>cygwin_split_path</function>
+</funcdef>
+<paramdef>const char * <parameter>path</parameter></paramdef>
+<paramdef>char * <parameter>dir</parameter></paramdef>
+<paramdef>char * <parameter>file</parameter></paramdef>
+</funcsynopsis>
+
+<para>Split a path into the directory and the file portions. Both
+<parameter>dir</parameter> and <parameter>file</parameter> are
+expected to point to buffers of sufficient size. </para>
+
+<example>
+<title>Example use of cygwin_split_path</title>
+<programlisting>
+char dir[200], file[100];
+cygwin_split_path("c:/foo/bar.c", dir, file);
+printf("dir=%s, file=%s\n", dir, file);
+</programlisting>
+</example>
+</sect1>
diff --git a/winsup/cygwin/pinfo.cc b/winsup/cygwin/pinfo.cc
new file mode 100644
index 000000000..789a47920
--- /dev/null
+++ b/winsup/cygwin/pinfo.cc
@@ -0,0 +1,413 @@
+/* pinfo.cc: process table support
+
+ Copyright 1996, 1997, 1998, 2000 Cygnus Solutions.
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#include <stdlib.h>
+#include <time.h>
+#include <errno.h>
+#include <limits.h>
+#include "winsup.h"
+
+/* The first pid used; also the lowest value allowed. */
+#define PBASE 1000
+
+static char NO_COPY pinfo_dummy[sizeof(pinfo)] = {0};
+
+pinfo NO_COPY *myself = (pinfo *)&pinfo_dummy; // Avoid myself != NULL checks
+
+/* Initialize the process table.
+ This is done once when the dll is first loaded. */
+
+void
+pinfo_list::init (void)
+{
+ next_pid = PBASE; /* Next pid to try to allocate. */
+
+ /* We assume the shared data area is already initialized to zeros.
+ Note that SIG_DFL is zero. */
+}
+
+pinfo * __stdcall
+set_myself (pinfo *p)
+{
+ myself = p;
+ if (!p)
+ return NULL;
+
+ myself->start_time = time (NULL); /* Register our starting time. */
+
+ char buf[30];
+ __small_sprintf (buf, "cYg%8x %x %x", _STRACE_INTERFACE_ACTIVATE_ADDR,
+ &strace_active);
+ OutputDebugString (buf);
+ return myself;
+}
+
+/* Initialize the process table entry for the current task.
+ This is not called for fork'd tasks, only exec'd ones. */
+void __stdcall
+pinfo_init (LPBYTE info)
+{
+ if (info != NULL)
+ {
+ /* The process was execed. Reuse entry from the original
+ owner of this pid. */
+ environ_init (); /* Needs myself but affects calls below */
+
+ /* spawn has already set up a pid structure for us so we'll use that */
+
+ myself->process_state |= PID_CYGPARENT;
+
+ /* Inherit file descriptor information from parent in info.
+ */
+ LPBYTE b = dtable.de_linearize_fd_array (info);
+ extern char title_buf[];
+ if (b && *b)
+ old_title = strcpy (title_buf, (char *)b);
+ }
+ else
+ {
+ /* Invent our own pid. */
+
+ if (!set_myself (cygwin_shared->p.allocate_pid ()))
+ api_fatal ("No more processes");
+
+ (void) GetModuleFileName (NULL, myself->progname,
+ sizeof(myself->progname));
+ myself->ppid = myself->pgid = myself->sid = myself->pid;
+ myself->ctty = -1;
+ myself->uid = USHRT_MAX;
+
+ environ_init (); /* call after myself has been set up */
+ }
+
+ debug_printf ("pid %d, pgid %d", myself->pid, myself->pgid);
+}
+
+/* [] operator. This is the mechanism for table lookups. */
+/* Returns the index into the pinfo_list table for pid arg */
+
+pinfo *
+pinfo_list::operator[] (pid_t pid)
+{
+ if (pid <= 0)
+ return NULL;
+
+ pinfo *p = vec + (pid % size ());
+
+ if (p->pid != pid || p->process_state == PID_NOT_IN_USE)
+ return NULL;
+ else
+ return p;
+}
+
+struct sigaction&
+pinfo::getsig(int sig)
+{
+#ifdef _MT_SAFE
+ if ( thread2signal )
+ return thread2signal->sigs[sig];
+ return sigs[sig];
+#else
+ return sigs[sig];
+#endif
+};
+
+sigset_t&
+pinfo::getsigmask ()
+{
+#ifdef _MT_SAFE
+ if ( thread2signal )
+ return *thread2signal->sigmask;
+ return sig_mask;
+#else
+ return sig_mask;
+#endif
+};
+
+void
+pinfo::setsigmask (sigset_t _mask)
+{
+#ifdef _MT_SAFE
+ if ( thread2signal )
+ *(thread2signal->sigmask) = _mask;
+ sig_mask=_mask;
+#else
+ sig_mask=_mask;
+#endif
+}
+
+LONG *
+pinfo::getsigtodo(int sig)
+{
+#ifdef _MT_SAFE
+ if ( thread2signal )
+ return thread2signal->sigtodo + __SIGOFFSET + sig;
+ return _sigtodo + __SIGOFFSET + sig;
+#else
+ return _sigtodo + __SIGOFFSET + sig;
+#endif
+}
+
+extern HANDLE hMainThread;
+
+HANDLE
+pinfo::getthread2signal()
+{
+#ifdef _MT_SAFE
+ if ( thread2signal )
+ return thread2signal->win32_obj_id;
+ return hMainThread;
+#else
+ return hMainThread;
+#endif
+}
+
+void
+pinfo::setthread2signal(void *_thr)
+{
+#ifdef _MT_SAFE
+ // assert has myself lock
+ thread2signal=(ThreadItem*)_thr;
+#else
+#endif
+}
+
+void
+pinfo::copysigs(pinfo *_other)
+{
+ sigs = _other->sigs;
+}
+
+pinfo * __stdcall
+procinfo (int pid)
+{
+ return cygwin_shared->p[pid];
+}
+
+#ifdef DEBUGGING
+/*
+ * Code to lock/unlock the process table.
+ */
+
+int __stdcall
+lpfu (const char *func, int ln, DWORD timeout)
+{
+ int rc;
+ DWORD t;
+
+ debug_printf ("timeout %d, pinfo_mutex %p", timeout, pinfo_mutex);
+ t = (timeout == INFINITE) ? 10000 : timeout;
+ SetLastError(0);
+ while ((rc = WaitForSingleObject (pinfo_mutex, t)) != WAIT_OBJECT_0)
+ {
+ if (rc == WAIT_ABANDONED_0)
+ break;
+ system_printf ("%s:%d having problems getting lock", func, ln);
+ system_printf ("*** %s, rc %d, %E", cygwin_shared->p.lock_info, rc);
+ if (t == timeout)
+ break;
+ }
+
+ __small_sprintf (cygwin_shared->p.lock_info, "%s(%d), pid %d ", func, ln,
+ (user_data && myself) ? (int)myself->dwProcessId : -1);
+ return rc;
+}
+
+void
+unlock_pinfo (void)
+{
+
+ debug_printf ("handle %d", pinfo_mutex);
+
+ if (!cygwin_shared->p.lock_info[0])
+ system_printf ("lock_info not set?");
+ else
+ strcat (cygwin_shared->p.lock_info, " unlocked");
+ if (!ReleaseMutex (pinfo_mutex))
+ system_printf ("ReleaseMutext (pinfo_mutex<%p>) failed, %E", pinfo_mutex);
+}
+#else
+/*
+ * Code to lock/unlock the process table.
+ */
+
+int __stdcall
+lock_pinfo_for_update (DWORD timeout)
+{
+ DWORD rc;
+ DWORD t;
+
+ debug_printf ("timeout %d, pinfo_mutex %p", timeout, pinfo_mutex);
+ t = (timeout == INFINITE) ? 10000 : timeout;
+ SetLastError(0);
+ while ((rc = WaitForSingleObject (pinfo_mutex, t)) != WAIT_OBJECT_0)
+ {
+ if (rc == WAIT_ABANDONED_0)
+ break;
+ system_printf ("rc %d, pinfo_mutex %p, %E", pinfo_mutex, rc);
+ if (t == timeout)
+ break;
+ if (rc == WAIT_FAILED)
+ /* sigh, must be properly fixed up later. */
+ return rc;
+ Sleep(10); /* to prevent 100% CPU in those rare cases */
+ }
+
+ return (int)rc;
+}
+
+void
+unlock_pinfo (void)
+{
+
+ debug_printf ("handle %d", pinfo_mutex);
+
+ ReleaseMutex (pinfo_mutex);
+}
+#endif
+
+
+/* Allocate a process table entry by finding an empty slot in the
+ fixed-size process table. We could use a linked list, but this
+ would probably be too slow.
+
+ Try to allocate next_pid, incrementing next_pid and trying again
+ up to size() times at which point we reach the conclusion that
+ table is full. Eventually at this point we would grow the table
+ by size() and start over. If we find a pid to use,
+
+ If all else fails, sweep through the loop looking for processes that
+ may have died abnormally without registering themselves as "dead".
+ Clear out these pinfo structures. Then scan the table again.
+
+ Note that the process table is in the shared data space and thus
+ is susceptible to corruption. The amount of time spent scanning the
+ table is presumably quite small compared with the total time to
+ create a process.
+*/
+
+pinfo *
+pinfo_list::allocate_pid (void)
+{
+
+ pinfo *newp;
+
+ lock_pinfo_for_update (INFINITE);
+ for (int tries = 0; ; tries++)
+ {
+ for (int i = next_pid; i < (next_pid + size ()); i++)
+ {
+ /* i mod size() gives place to check */
+ newp = vec + (i % size());
+ if (newp->process_state == PID_NOT_IN_USE)
+ {
+ debug_printf ("found empty slot %d for pid %d",
+ (i % size ()), i);
+ next_pid = i;
+ goto gotit;
+ }
+ }
+
+ if (tries > 0)
+ break;
+
+ /* try once to remove bogus dead processes */
+ debug_printf ("clearing out deadwood");
+ for (newp = vec; newp < vec + size(); newp++)
+ proc_exists (newp);
+ }
+
+ /* The process table is full. */
+ debug_printf ("process table is full");
+ unlock_pinfo ();
+
+ return NULL;
+
+gotit:
+
+ /* Set new pid based on the position of this element in the pinfo list */
+ newp->pid = next_pid;
+
+ /* Determine next slot to consider, wrapping if we hit the end of
+ * the array. Since allocation involves looping through size () pids,
+ * don't allow next_pid to be greater than SHRT_MAX - size ().
+ */
+ if (next_pid < (SHRT_MAX - size ()))
+ next_pid++;
+ else
+ next_pid = PBASE;
+
+ newp->process_state = PID_IN_USE;
+ unlock_pinfo ();
+
+ memset (newp, 0, PINFO_ZERO);
+ debug_printf ("pid %d, state %x", newp->pid, newp->process_state);
+ return newp;
+}
+
+void
+pinfo::record_death (int lock)
+{
+ int unlock = lock ? 0 : lock_pinfo_for_update (999);
+ if (dwProcessId == GetCurrentProcessId () && !my_parent_is_alive ())
+ {
+ process_state = PID_NOT_IN_USE;
+ hProcess = NULL;
+ }
+
+ if (unlock)
+ unlock_pinfo ();
+}
+
+/* DOCTOOL-START
+
+<sect1 id="func-cygwin-winpid-to-pid">
+ <title>cygwin_winpid_to_pid</title>
+
+ <funcsynopsis>
+ <funcdef>extern "C" pid_t
+ <function>cygwin_winpid_to_pid</function>
+ </funcdef>
+ <paramdef>int <parameter>winpid</parameter></paramdef>
+ </funcsynopsis>
+
+ <para>Given a windows pid, converts to the corresponding Cygwin
+pid, if any. Returns -1 if windows pid does not correspond to
+a cygwin pid.</para>
+ <example>
+ <title>Example use of cygwin_winpid_to_pid</title>
+ <programlisting>
+ extern "C" cygwin_winpid_to_pid (int winpid);
+ pid_t mypid;
+ mypid = cygwin_winpid_to_pid (windows_pid);
+ </programlisting>
+ </example>
+</sect1>
+
+ DOCTOOL-END */
+
+extern "C" pid_t
+cygwin_winpid_to_pid (int winpid)
+{
+ for (int i = 0; i < cygwin_shared->p.size (); i++)
+ {
+ pinfo *p = &cygwin_shared->p.vec[i];
+
+ if (p->process_state == PID_NOT_IN_USE)
+ continue;
+
+ /* FIXME: signed vs unsigned comparison: winpid can be < 0 !!! */
+ if (p->dwProcessId == (DWORD)winpid)
+ return p->pid;
+ }
+
+ set_errno (ESRCH);
+ return (pid_t) -1;
+}
diff --git a/winsup/cygwin/pipe.cc b/winsup/cygwin/pipe.cc
new file mode 100644
index 000000000..2ba99cd10
--- /dev/null
+++ b/winsup/cygwin/pipe.cc
@@ -0,0 +1,93 @@
+/* pipe.cc: pipe for WIN32.
+
+ Copyright 1996, 1998, 1999 Cygnus Solutions.
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#include <unistd.h>
+#include <sys/fcntl.h>
+#include <errno.h>
+#include "winsup.h"
+
+static int
+make_pipe (int fildes[2], unsigned int psize, int mode)
+{
+ SetResourceLock(LOCK_FD_LIST,WRITE_LOCK|READ_LOCK," make_pipe");
+
+ HANDLE r, w;
+ int fdr, fdw;
+ SECURITY_ATTRIBUTES *sa = (mode & O_NOINHERIT) ? &sec_none_nih : &sec_none;
+
+ if ((fdr = dtable.find_unused_handle ()) < 0)
+ set_errno (ENMFILE);
+ else if ((fdw = dtable.find_unused_handle (fdr + 1)) < 0)
+ set_errno ( ENMFILE);
+ else if (!CreatePipe (&r, &w, sa, psize))
+ __seterrno ();
+ else
+ {
+ fhandler_base *fhr = dtable.build_fhandler (fdr, FH_PIPE, "/dev/piper");
+ fhandler_base *fhw = dtable.build_fhandler (fdw, FH_PIPE, "/dev/pipew");
+
+ int binmode = mode & O_TEXT ? 0 : 1;
+ fhr->init (r, GENERIC_READ, binmode);
+ fhw->init (w, GENERIC_WRITE, binmode);
+ if (mode & O_NOINHERIT)
+ {
+ fhr->set_close_on_exec_flag (1);
+ fhw->set_close_on_exec_flag (1);
+ }
+
+ fildes[0] = fdr;
+ fildes[1] = fdw;
+
+ debug_printf ("0 = pipe (%p) (%d:%p, %d:%p)", fildes,
+ fdr, fhr->get_handle (), fdw, fhw->get_handle ());
+
+ ReleaseResourceLock(LOCK_FD_LIST,WRITE_LOCK|READ_LOCK," make_pipe");
+ return 0;
+ }
+
+ syscall_printf ("-1 = pipe (%p)", fildes);
+ ReleaseResourceLock(LOCK_FD_LIST,WRITE_LOCK|READ_LOCK," make_pipe");
+ return -1;
+}
+
+extern "C" int
+pipe (int filedes[2])
+{
+ return make_pipe (filedes, 16384, (!__fmode || __fmode == O_BINARY) ? O_BINARY : O_TEXT);
+}
+
+extern "C" int
+_pipe (int filedes[2], unsigned int psize, int mode)
+{
+ int res = make_pipe (filedes, psize, mode);
+ /* This type of pipe is not interruptible so set the appropriate flag. */
+ if (!res)
+ dtable[filedes[0]]->set_r_no_interrupt (1);
+ return res;
+}
+
+int
+dup (int fd)
+{
+ int res;
+ SetResourceLock(LOCK_FD_LIST,WRITE_LOCK|READ_LOCK," dup");
+
+ res = dup2 (fd, dtable.find_unused_handle ());
+
+ ReleaseResourceLock(LOCK_FD_LIST,WRITE_LOCK|READ_LOCK," dup");
+
+ return res;
+}
+
+int
+dup2 (int oldfd, int newfd)
+{
+ return dtable.dup2 (oldfd, newfd);
+}
diff --git a/winsup/cygwin/posix.sgml b/winsup/cygwin/posix.sgml
new file mode 100644
index 000000000..5d00f5709
--- /dev/null
+++ b/winsup/cygwin/posix.sgml
@@ -0,0 +1,88 @@
+<sect1 id="std-posix">
+<title>Compatibility with POSIX.1</title>
+
+<para>The following functions are compatible with POSIX.1:</para>
+
+<sect2><title>Process Primitives (Section 3) </title><para>
+
+fork, execl, execle, execlp, execv, execve, execvp, wait, waitpid,
+_exit, kill, sigemptyset, sigfillset, sigaddset, sigdelset,
+sigismember, sigaction, pthread_sigmask, sigprocmask, sigpending,
+sigsuspend, alarm, pause, sleep, pthread_kill, pthread_sigmask
+
+<sect2><title>Process Environment (Section 4) </title><para>
+
+getpid, getppid, getuid, geteuid, getgid, getegid, setuid, setgid,
+getgroups, getlogin, getpgrp, setsid, setpgid, uname, time, times,
+getenv, ctermid, ttyname, isatty, sysconf
+
+<sect2><title>Files and Directories (Section 5) </title><para>
+
+opendir, readdir, rewinddir, closedir, chdir, getcwd, open, creat,
+umask, link, mkdir, unlink, rmdir, rename, stat, fstat, access, chmod,
+fchmod, chown, utime, ftruncate, pathconf, fpathconf
+
+<sect2><title>Input and Output Primitives (Section 6) </title><para>
+
+pipe, dup, dup2, close, read, write, fcntl, lseek, fsync
+
+<sect2><title>Device- and Class-Specific Functions (Section 7) </title><para>
+
+cfgetispeed, cfgetospeed, cfsetispeed, cfsetospeed, tcdrain, tcflow,
+tcflush, tcgetattr, tcgetpgrp, tcsendbreak, tcsetattr, tcsetpgrp
+
+<sect2><title>Language-Specific Services for the C Programming Language (Section 8) </title><para>
+
+abort, exit, fclose, fdopen, fflush, fgetc, fgets, fileno, fopen,
+fprintf, fputc, fputs, fread, freopen, fscanf, fseek, ftell, fwrite,
+getc, getchar, gets, perror, printf, putc, putchar, puts, remove,
+rewind, scanf, setlocale, siglongjmp, sigsetjmp, tmpfile, tmpnam,
+tzset
+
+<sect2><title>System Databases (Section 9) </title><para>
+
+getgrgid, getgrnam, getpwnam, getpwuid
+
+<sect2><title>Synchronization (Section 11) </title><para>
+
+sem_init, sem_destroy, sem_wait, sem_trywait, sem_post,
+pthread_mutex_init, pthread_mutex_destroy, pthread_mutex_lock,
+pthread_mutex_trylock, pthread_mutex_unlock
+
+<sect2><title>Memory Management (Section 12) </title><para>
+
+mmap, mprotect, msync, munmap
+
+<sect2><title>Thread Management (Section 16) </title><para>
+
+pthread_attr_init, pthread_attr_destroy, pthread_attr_setstacksize,
+pthread_attr_getstacksize, pthread_create, pthread_exit, pthread_self,
+pthread_equal
+
+<sect2><title>Thread-Specific Data Functions (Section 17) </title><para>
+
+pthread_key_create, pthread_setspecific, pthread_getspecific,
+pthread_key_delete
+
+</sect2>
+
+<sect2><title>Implementation Details</title>
+
+<para><function>setuid</function> and <function>setgid</function>
+always return ENOSYS.</para>
+
+<para><function>link</function> will copy the file if it can't
+implement a true symbolic link. Currently, symbolic links work, if at
+all, only under Windows NT.</para>
+
+<para><function>chown</function> always returns zero.</para>
+
+<para><function>fcntl</function> doesn't support F_GETLK - it returns
+-1 and sets errno to ENOSYS.</para>
+
+<para><function>lseek</function> only works properly on binary
+files.</para>
+
+</sect2>
+
+</sect1> \ No newline at end of file
diff --git a/winsup/cygwin/profil.c b/winsup/cygwin/profil.c
new file mode 100644
index 000000000..956519b4e
--- /dev/null
+++ b/winsup/cygwin/profil.c
@@ -0,0 +1,173 @@
+/* profil.c -- win32 profil.c equivalent
+
+ Copyright 1998 Cygnus Solutions.
+
+ This file is part of Cygwin.
+
+ This software is a copyrighted work licensed under the terms of the
+ Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+ details. */
+
+#include <windows.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <errno.h>
+#include <math.h>
+
+#include <profil.h>
+
+#define SLEEPTIME (1000 / PROF_HZ)
+
+/* global profinfo for profil() call */
+static struct profinfo prof;
+
+/* Get the pc for thread THR */
+
+static u_long
+get_thrpc (HANDLE thr)
+{
+ CONTEXT ctx;
+ u_long pc;
+ int res;
+
+ res = SuspendThread (thr);
+ if (res == -1)
+ return (u_long) - 1;
+ ctx.ContextFlags = CONTEXT_CONTROL | CONTEXT_INTEGER;
+ pc = (u_long) - 1;
+ if (GetThreadContext (thr, &ctx))
+ pc = ctx.Eip;
+ ResumeThread (thr);
+ return pc;
+}
+
+/* Display cell of profile buffer */
+#if 0
+static void
+print_prof (struct profinfo *p)
+{
+ printf ("profthr %x\ttarget thr %x\n", p->profthr, p->targthr);
+ printf ("pc: %x - %x\n", p->lowpc, p->highpc);
+ printf ("scale: %x\n", p->scale);
+ return;
+}
+#endif
+
+/* Everytime we wake up use the main thread pc to hash into the cell in the
+ profile buffer ARG. */
+
+static DWORD CALLBACK
+profthr_func (LPVOID arg)
+{
+ struct profinfo *p = (struct profinfo *) arg;
+ u_long pc, idx;
+
+ for (;;)
+ {
+ pc = (u_long) get_thrpc (p->targthr);
+ if (pc >= p->lowpc && pc < p->highpc)
+ {
+ idx = PROFIDX (pc, p->lowpc, p->scale);
+ p->counter[idx]++;
+ }
+#if 0
+ print_prof (p);
+#endif
+ Sleep (SLEEPTIME);
+ }
+ return 0;
+}
+
+/* Stop profiling to the profiling buffer pointed to by P. */
+
+static int
+profile_off (struct profinfo *p)
+{
+ if (p->profthr)
+ {
+ TerminateThread (p->profthr, 0);
+ CloseHandle (p->profthr);
+ }
+ if (p->targthr)
+ CloseHandle (p->targthr);
+ return 0;
+}
+
+/* Create a timer thread and pass it a pointer P to the profiling buffer. */
+
+static int
+profile_on (struct profinfo *p)
+{
+ int thrid;
+
+ /* get handle for this thread */
+ if (!DuplicateHandle (GetCurrentProcess (), GetCurrentThread (),
+ GetCurrentProcess (), &p->targthr, 0, FALSE,
+ DUPLICATE_SAME_ACCESS))
+ {
+ errno = ESRCH;
+ return -1;
+ }
+
+ p->profthr = CreateThread (0, 0, profthr_func, (void *) p, 0, &thrid);
+ if (!p->profthr)
+ {
+ CloseHandle (p->targthr);
+ p->targthr = 0;
+ errno = EAGAIN;
+ return -1;
+ }
+ return 0;
+}
+
+/*
+ * start or stop profiling
+ *
+ * profiling goes into the SAMPLES buffer of size SIZE (which is treated
+ * as an array of u_shorts of size size/2)
+ *
+ * each bin represents a range of pc addresses from OFFSET. The number
+ * of pc addresses in a bin depends on SCALE. (A scale of 65536 maps
+ * each bin to two addresses, A scale of 32768 maps each bin to 4 addresses,
+ * a scale of 1 maps each bin to 128k addreses). Scale may be 1 - 65536,
+ * or zero to turn off profiling
+ */
+int
+profile_ctl (struct profinfo * p, char *samples, size_t size,
+ u_long offset, u_int scale)
+{
+ u_long maxbin;
+
+ if (scale > 65536)
+ {
+ errno = EINVAL;
+ return -1;
+ }
+
+ profile_off (p);
+ if (scale)
+ {
+ memset (samples, 0, size);
+ memset (p, 0, sizeof *p);
+ maxbin = size >> 1;
+ prof.counter = (u_short *) samples;
+ prof.lowpc = offset;
+ prof.highpc = PROFADDR (maxbin, offset, scale);
+ prof.scale = scale;
+
+ return profile_on (p);
+ }
+ return 0;
+}
+
+/* Equivalent to unix profil()
+ Every SLEEPTIME interval, the user's program counter (PC) is examined:
+ offset is subtracted and the result is multiplied by scale.
+ The word pointed to by this address is incremented. Buf is unused. */
+
+int
+profil (char *samples, size_t size, u_long offset, u_int scale)
+{
+ return profile_ctl (&prof, samples, size, offset, scale);
+}
+
diff --git a/winsup/cygwin/profil.h b/winsup/cygwin/profil.h
new file mode 100644
index 000000000..c62f92251
--- /dev/null
+++ b/winsup/cygwin/profil.h
@@ -0,0 +1,44 @@
+/* profil.h: gprof profiling header file
+
+ Copyright 1998 Cygnus Solutions.
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+/* profiling frequency. (No larger than 1000) */
+#define PROF_HZ 100
+
+/* convert an addr to an index */
+#define PROFIDX(pc, base, scale) \
+ ({ \
+ size_t i = (pc - base) / 2; \
+ if (sizeof (unsigned long long int) > sizeof (size_t)) \
+ i = (unsigned long long int) i * scale / 65536; \
+ else \
+ i = i / 65536 * scale + i % 65536 * scale / 65536; \
+ i; \
+ })
+
+/* convert an index into an address */
+#define PROFADDR(idx, base, scale) \
+ ((base) + ((((idx) << 16) / (scale)) << 1))
+
+/* convert a bin size into a scale */
+#define PROFSCALE(range, bins) (((bins) << 16) / ((range) >> 1))
+
+typedef void *_WINHANDLE;
+
+struct profinfo {
+ _WINHANDLE targthr; /* thread to profile */
+ _WINHANDLE profthr; /* profiling thread */
+ u_short *counter; /* profiling counters */
+ u_long lowpc, highpc; /* range to be profiled */
+ u_int scale; /* scale value of bins */
+};
+
+int profile_ctl(struct profinfo *, char *, size_t, u_long, u_int);
+int profil(char *, size_t, u_long, u_int);
+
diff --git a/winsup/cygwin/pthread.cc b/winsup/cygwin/pthread.cc
new file mode 100644
index 000000000..f535318fe
--- /dev/null
+++ b/winsup/cygwin/pthread.cc
@@ -0,0 +1,203 @@
+/* pthread.cc: posix pthread interface for Cygwin
+
+ Copyright 1998 Cygnus Solutions.
+
+ Written by Marco Fuykschot <marco@ddi.nl>
+
+ This file is part of Cygwin.
+
+ This software is a copyrighted work licensed under the terms of the
+ Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+ details. */
+
+#include "winsup.h"
+
+extern "C" {
+/* ThreadCreation */
+int
+pthread_create (pthread_t * thread, const pthread_attr_t * attr, void *(*start_routine) (void *), void *arg)
+{
+ return __pthread_create (thread, attr, start_routine, arg);
+}
+
+int
+pthread_attr_init (pthread_attr_t * attr)
+{
+ return __pthread_attr_init (attr);
+}
+
+int
+pthread_attr_destroy (pthread_attr_t * attr)
+{
+ return __pthread_attr_destroy (attr);
+}
+
+int
+pthread_attr_setstacksize (pthread_attr_t * attr, size_t size)
+{
+ return __pthread_attr_setstacksize (attr, size);
+}
+
+int
+pthread_attr_getstacksize (pthread_attr_t * attr, size_t * size)
+{
+ return __pthread_attr_getstacksize (attr, size);
+}
+
+
+/*
+ pthread_attr_setstackaddr(...){};
+ pthread_attr_getstackaddr(...){};
+ */
+
+/* Thread Exit */
+int
+pthread_exit (void * value_ptr)
+{
+ return __pthread_exit (value_ptr);
+}
+
+int
+pthread_join(pthread_t thread, void **return_val)
+{
+ return __pthread_join(&thread, (void **)return_val);
+}
+
+int
+pthread_detach(pthread_t thread)
+{
+ return __pthread_detach(&thread);
+}
+
+int
+pthread_suspend(pthread_t thread)
+{
+ return __pthread_suspend(&thread);
+}
+
+int
+pthread_continue(pthread_t thread)
+{
+ return __pthread_continue(&thread);
+}
+
+unsigned long
+pthread_getsequence_np (pthread_t * thread)
+{
+ return __pthread_getsequence_np (thread);
+}
+
+/* Thread SpecificData */
+int
+pthread_key_create (pthread_key_t * key)
+{
+ return __pthread_key_create (key);
+}
+
+int
+pthread_key_delete (pthread_key_t * key)
+{
+ return __pthread_key_delete (key);
+}
+
+int
+pthread_setspecific (pthread_key_t * key, const void *value)
+{
+ return __pthread_setspecific (key, value);
+}
+
+void *
+pthread_getspecific (pthread_key_t * key)
+{
+ return (void *) __pthread_getspecific (key);
+}
+
+/* Thread signal */
+int
+pthread_kill (pthread_t * thread, int sig)
+{
+ return __pthread_kill (thread, sig);
+}
+
+int
+pthread_sigmask (int operation, const sigset_t * set, sigset_t * old_set)
+{
+ return __pthread_sigmask (operation, set, old_set);
+}
+
+/* ID */
+
+pthread_t
+pthread_self ()
+{
+ return __pthread_self ();
+}
+
+int
+pthread_equal (pthread_t t1, pthread_t t2)
+{
+ return __pthread_equal ( &t1, &t2);
+}
+
+/* Mutexes */
+int
+pthread_mutex_init (pthread_mutex_t * mutex, const pthread_mutexattr_t * attr)
+{
+ return __pthread_mutex_init (mutex, attr);
+}
+
+int
+pthread_mutex_lock (pthread_mutex_t * mutex)
+{
+ return __pthread_mutex_lock (mutex);
+}
+
+int
+pthread_mutex_trylock (pthread_mutex_t * mutex)
+{
+ return __pthread_mutex_trylock (mutex);
+}
+
+int
+pthread_mutex_unlock (pthread_mutex_t * mutex)
+{
+ return __pthread_mutex_unlock (mutex);
+}
+
+int
+pthread_mutex_destroy (pthread_mutex_t * mutex)
+{
+ return __pthread_mutex_destroy (mutex);
+}
+
+/* Semaphores */
+int
+sem_init (sem_t * sem, int pshared, unsigned int value)
+{
+ return __sem_init (sem, pshared, value);
+}
+
+int
+sem_destroy (sem_t * sem)
+{
+ return __sem_destroy (sem);
+}
+
+int
+sem_wait (sem_t * sem)
+{
+ return __sem_wait (sem);
+}
+
+int
+sem_trywait (sem_t * sem)
+{
+ return __sem_trywait (sem);
+}
+
+int
+sem_post (sem_t * sem)
+{
+ return __sem_post (sem);
+}
+}
diff --git a/winsup/cygwin/regexp/COPYRIGHT b/winsup/cygwin/regexp/COPYRIGHT
new file mode 100644
index 000000000..48b3f4339
--- /dev/null
+++ b/winsup/cygwin/regexp/COPYRIGHT
@@ -0,0 +1,22 @@
+This entire subtree is copyright the University of Toronto.
+The following copyright notice applies to all files found here. None of
+these files contain AT&T proprietary source code.
+_____________________________________________________________________________
+
+ Copyright (c) 1986 by University of Toronto.
+ Written by Henry Spencer. Not derived from licensed software.
+
+ Permission is granted to anyone to use this software for any
+ purpose on any computer system, and to redistribute it freely,
+ subject to the following restrictions:
+
+ 1. The author is not responsible for the consequences of use of
+ this software, no matter how awful, even if they arise
+ from defects in it.
+
+ 2. The origin of this software must not be misrepresented, either
+ by explicit claim or by omission.
+
+ 3. Altered versions must be plainly marked as such, and must not
+ be misrepresented as being the original software.
+
diff --git a/winsup/cygwin/regexp/README b/winsup/cygwin/regexp/README
new file mode 100644
index 000000000..37d6f51c7
--- /dev/null
+++ b/winsup/cygwin/regexp/README
@@ -0,0 +1,84 @@
+This is a nearly-public-domain reimplementation of the V8 regexp(3) package.
+It gives C programs the ability to use egrep-style regular expressions, and
+does it in a much cleaner fashion than the analogous routines in SysV.
+
+ Copyright (c) 1986 by University of Toronto.
+ Written by Henry Spencer. Not derived from licensed software.
+
+ Permission is granted to anyone to use this software for any
+ purpose on any computer system, and to redistribute it freely,
+ subject to the following restrictions:
+
+ 1. The author is not responsible for the consequences of use of
+ this software, no matter how awful, even if they arise
+ from defects in it.
+
+ 2. The origin of this software must not be misrepresented, either
+ by explicit claim or by omission.
+
+ 3. Altered versions must be plainly marked as such, and must not
+ be misrepresented as being the original software.
+
+Barring a couple of small items in the BUGS list, this implementation is
+believed 100% compatible with V8. It should even be binary-compatible,
+sort of, since the only fields in a "struct regexp" that other people have
+any business touching are declared in exactly the same way at the same
+location in the struct (the beginning).
+
+This implementation is *NOT* AT&T/Bell code, and is not derived from licensed
+software. Even though U of T is a V8 licensee. This software is based on
+a V8 manual page sent to me by Dennis Ritchie (the manual page enclosed
+here is a complete rewrite and hence is not covered by AT&T copyright).
+The software was nearly complete at the time of arrival of our V8 tape.
+I haven't even looked at V8 yet, although a friend elsewhere at U of T has
+been kind enough to run a few test programs using the V8 regexp(3) to resolve
+a few fine points. I admit to some familiarity with regular-expression
+implementations of the past, but the only one that this code traces any
+ancestry to is the one published in Kernighan & Plauger (from which this
+one draws ideas but not code).
+
+Simplistically: put this stuff into a source directory, copy regexp.h into
+/usr/include, inspect Makefile for compilation options that need changing
+to suit your local environment, and then do "make r". This compiles the
+regexp(3) functions, compiles a test program, and runs a large set of
+regression tests. If there are no complaints, then put regexp.o, regsub.o,
+and regerror.o into your C library, and regexp.3 into your manual-pages
+directory.
+
+Note that if you don't put regexp.h into /usr/include *before* compiling,
+you'll have to add "-I." to CFLAGS before compiling.
+
+The files are:
+
+Makefile instructions to make everything
+regexp.3 manual page
+regexp.h header file, for /usr/include
+regexp.c source for regcomp() and regexec()
+regsub.c source for regsub()
+regerror.c source for default regerror()
+regmagic.h internal header file
+try.c source for test program
+timer.c source for timing program
+tests test list for try and timer
+
+This implementation uses nondeterministic automata rather than the
+deterministic ones found in some other implementations, which makes it
+simpler, smaller, and faster at compiling regular expressions, but slower
+at executing them. In theory, anyway. This implementation does employ
+some special-case optimizations to make the simpler cases (which do make
+up the bulk of regular expressions actually used) run quickly. In general,
+if you want blazing speed you're in the wrong place. Replacing the insides
+of egrep with this stuff is probably a mistake; if you want your own egrep
+you're going to have to do a lot more work. But if you want to use regular
+expressions a little bit in something else, you're in luck. Note that many
+existing text editors use nondeterministic regular-expression implementations,
+so you're in good company.
+
+This stuff should be pretty portable, given appropriate option settings.
+If your chars have less than 8 bits, you're going to have to change the
+internal representation of the automaton, although knowledge of the details
+of this is fairly localized. There are no "reserved" char values except for
+NUL, and no special significance is attached to the top bit of chars.
+The string(3) functions are used a fair bit, on the grounds that they are
+probably faster than coding the operations in line. Some attempts at code
+tuning have been made, but this is invariably a bit machine-specific.
diff --git a/winsup/cygwin/regexp/regexp.h b/winsup/cygwin/regexp/regexp.h
new file mode 100644
index 000000000..9e9cd9eb6
--- /dev/null
+++ b/winsup/cygwin/regexp/regexp.h
@@ -0,0 +1,24 @@
+/*
+ * Definitions etc. for regexp(3) routines.
+ *
+ * Caveat: this is V8 regexp(3) [actually, a reimplementation thereof],
+ * not the System V one.
+ *
+ * $Id$
+ */
+
+#define NSUBEXP 10
+typedef struct regexp {
+ char *startp[NSUBEXP];
+ char *endp[NSUBEXP];
+ char regstart; /* Internal use only. */
+ char reganch; /* Internal use only. */
+ char *regmust; /* Internal use only. */
+ int regmlen; /* Internal use only. */
+ char program[1]; /* Unwarranted chumminess with compiler. */
+} regexp;
+
+extern regexp *regcomp();
+extern int regexec();
+extern void regsub();
+extern void regerror();
diff --git a/winsup/cygwin/regexp/regmagic.h b/winsup/cygwin/regexp/regmagic.h
new file mode 100644
index 000000000..9eb4eaf96
--- /dev/null
+++ b/winsup/cygwin/regexp/regmagic.h
@@ -0,0 +1,7 @@
+/* $Id$ */
+
+/*
+ * The first byte of the regexp internal "program" is actually this magic
+ * number; the start node begins in the second byte.
+ */
+#define MAGIC 0234
diff --git a/winsup/cygwin/registry.cc b/winsup/cygwin/registry.cc
new file mode 100644
index 000000000..321b13fc9
--- /dev/null
+++ b/winsup/cygwin/registry.cc
@@ -0,0 +1,176 @@
+/* registry.cc: registry interface
+
+ Copyright 1996, 1997, 1998, 1999 Cygnus Solutions.
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#include "winsup.h"
+
+char cygnus_class[] = "cygnus";
+
+reg_key::reg_key (HKEY top, REGSAM access, ...)
+{
+ va_list av;
+ va_start (av, access);
+ build_reg (top, access, av);
+ va_end (av);
+}
+
+reg_key::reg_key (REGSAM access, ...)
+{
+ va_list av;
+
+ new (this) reg_key (HKEY_CURRENT_USER, access, "SOFTWARE",
+ CYGWIN_INFO_CYGNUS_REGISTRY_NAME,
+ CYGWIN_INFO_CYGWIN_REGISTRY_NAME, NULL);
+
+ HKEY top = key;
+ va_start (av, access);
+ build_reg (top, KEY_READ, av);
+ va_end (av);
+ if (top != key)
+ RegCloseKey (top);
+}
+
+reg_key::reg_key (REGSAM access)
+{
+ new (this) reg_key (HKEY_CURRENT_USER, access, "SOFTWARE",
+ CYGWIN_INFO_CYGNUS_REGISTRY_NAME,
+ CYGWIN_INFO_CYGWIN_REGISTRY_NAME,
+ CYGWIN_INFO_CYGWIN_MOUNT_REGISTRY_NAME, NULL);
+}
+
+void
+reg_key::build_reg (HKEY top, REGSAM access, va_list av)
+{
+ char *name;
+ HKEY r = top;
+
+ /* FIXME: Most of the time a valid mount area should exist. Perhaps
+ we should just try an open of the correct key first and only resort
+ to this method in the unlikely situation that it's the first time
+ the current mount areas are being used. */
+
+ while ((name = va_arg (av, char *)) != NULL)
+ {
+ DWORD disp;
+ int res = RegCreateKeyExA (r,
+ name,
+ 0,
+ cygnus_class,
+ REG_OPTION_NON_VOLATILE,
+ access,
+ &sec_none_nih,
+ &key,
+ &disp);
+ if (r != top)
+ RegCloseKey (r);
+ r = key;
+ if (res != ERROR_SUCCESS)
+ {
+ key = (HKEY) INVALID_HANDLE_VALUE;
+ debug_printf ("failed to create key %s in the registry", name);
+ break;
+ }
+
+ /* If we're considering the mounts key, check if it had to
+ be created and set had_to_create appropriately. */
+ if (strcmp (name, CYGWIN_INFO_CYGWIN_MOUNT_REGISTRY_NAME) == 0)
+ if (disp == REG_CREATED_NEW_KEY)
+ cygwin_shared->mount.had_to_create_mount_areas++;
+ }
+}
+
+/* Given the current registry key, return the specific int value
+ requested. Return def on failure. */
+
+int
+reg_key::get_int (const char *name, int def)
+{
+ DWORD type;
+ DWORD dst;
+ DWORD size = sizeof (dst);
+
+ LONG res = RegQueryValueExA (key,
+ name,
+ 0,
+ &type,
+ (unsigned char *) &dst, &size);
+
+ if (type != REG_DWORD || res != ERROR_SUCCESS)
+ return def;
+
+ return dst;
+}
+
+/* Given the current registry key, set a specific int value. */
+
+int
+reg_key::set_int (const char *name, int val)
+{
+ DWORD value = val;
+ return (int) RegSetValueExA (key, name, 0, REG_DWORD,
+ (unsigned char *) &value, sizeof (value));
+}
+
+/* Given the current registry key, return the specific string value
+ requested. Return zero on success, non-zero on failure. */
+
+int
+reg_key::get_string (const char *name, char *dst, size_t max, const char * def)
+{
+ DWORD size = max;
+ DWORD type;
+ LONG res = RegQueryValueExA (key, name, 0, &type, (unsigned char *) dst,
+ &size);
+
+ if ((def != 0) && ((type != REG_SZ) || (res != ERROR_SUCCESS)))
+ {
+ strcpy (dst, def);
+ }
+ return (int) res;
+}
+
+/* Given the current registry key, set a specific string value. */
+
+int
+reg_key::set_string (const char *name, const char *src)
+{
+ return (int) RegSetValueExA (key, name, 0, REG_SZ, (unsigned char*) src,
+ strlen (src) + 1);
+}
+
+int
+reg_key::setone_string (const char *src, const char *name)
+{
+ return (int) RegSetValueExA (key, name, 0, REG_SZ,
+ (const unsigned char *) src, strlen (src) + 1);
+}
+
+/* Return the handle to key. */
+
+HKEY
+reg_key::get_key ()
+{
+ return key;
+}
+
+/* Delete subkey of current key. Returns the error code from the
+ RegDeleteKeyA invocation. */
+
+int
+reg_key::kill (const char *name)
+{
+ return RegDeleteKeyA (key, name);
+}
+
+reg_key::~reg_key ()
+{
+ if (key != (HKEY) INVALID_HANDLE_VALUE)
+ RegCloseKey (key);
+ key = (HKEY) INVALID_HANDLE_VALUE;
+}
diff --git a/winsup/cygwin/resource.cc b/winsup/cygwin/resource.cc
new file mode 100644
index 000000000..9f1f46c1c
--- /dev/null
+++ b/winsup/cygwin/resource.cc
@@ -0,0 +1,94 @@
+/* resource.cc: getrusage () and friends.
+
+ Copyright 1996, 1997, 1998, 2000 Cygnus Solutions.
+
+ Written by Steve Chamberlain (sac@cygnus.com), Doug Evans (dje@cygnus.com),
+ Geoffrey Noer (noer@cygnus.com) of Cygnus Support.
+ Rewritten by Sergey S. Okhapkin (sos@prospect.com.ru)
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#include <errno.h>
+#include "winsup.h"
+
+/* add timeval values */
+static void
+add_timeval (struct timeval *tv1, struct timeval *tv2)
+{
+ tv1->tv_sec += tv2->tv_sec;
+ tv1->tv_usec += tv2->tv_usec;
+ if (tv1->tv_usec >= 1000000)
+ {
+ tv1->tv_usec -= 1000000;
+ tv1->tv_sec++;
+ }
+}
+
+/* add rusage values of r2 to r1 */
+void __stdcall
+add_rusage (struct rusage *r1, struct rusage *r2)
+{
+ add_timeval (&r1->ru_utime, &r2->ru_utime);
+ add_timeval (&r1->ru_stime, &r2->ru_stime);
+ r1->ru_maxrss += r2->ru_maxrss;
+ r1->ru_ixrss += r2->ru_ixrss;
+ r1->ru_idrss += r2->ru_idrss;
+ r1->ru_isrss += r2->ru_isrss;
+ r1->ru_minflt += r2->ru_minflt;
+ r1->ru_majflt += r2->ru_majflt;
+ r1->ru_nswap += r2->ru_nswap;
+ r1->ru_inblock += r2->ru_inblock;
+ r1->ru_oublock += r2->ru_oublock;
+ r1->ru_msgsnd += r2->ru_msgsnd;
+ r1->ru_msgrcv += r2->ru_msgrcv;
+ r1->ru_nsignals += r2->ru_nsignals;
+ r1->ru_nvcsw += r2->ru_nvcsw;
+ r1->ru_nivcsw += r2->ru_nivcsw;
+}
+
+/* FIXME: what about other fields? */
+void __stdcall
+fill_rusage (struct rusage *r, HANDLE h)
+{
+ FILETIME creation_time = {0,0};
+ FILETIME exit_time = {0,0};
+ FILETIME kernel_time = {0,0};
+ FILETIME user_time = {0,0};
+
+ struct timeval tv;
+
+ GetProcessTimes (h, &creation_time, &exit_time, &kernel_time, &user_time);
+ totimeval (&tv, &kernel_time, 0, 0);
+ add_timeval (&r->ru_stime, &tv);
+ totimeval (&tv, &user_time, 0, 0);
+ add_timeval (&r->ru_utime, &tv);
+}
+
+extern "C"
+int
+getrusage (int intwho, struct rusage *rusage_in)
+{
+ int res = 0;
+ struct rusage r;
+
+ if (intwho == RUSAGE_SELF)
+ {
+ memset (&r, 0, sizeof (r));
+ fill_rusage (&r, hMainProc);
+ *rusage_in = r;
+ }
+ else if (intwho == RUSAGE_CHILDREN)
+ *rusage_in = myself->rusage_children;
+ else
+ {
+ set_errno (EINVAL);
+ res = -1;
+ }
+
+ syscall_printf ("%d = getrusage (%d, %p)", res, intwho, rusage_in);
+ return res;
+}
diff --git a/winsup/cygwin/scandir.cc b/winsup/cygwin/scandir.cc
new file mode 100644
index 000000000..bbe582f12
--- /dev/null
+++ b/winsup/cygwin/scandir.cc
@@ -0,0 +1,101 @@
+/* scandir.cc
+
+ Copyright 1998 Cygnus Solutions.
+
+ Written by Corinna Vinschen <corinna.vinschen@cityweb.de>
+
+ This file is part of Cygwin.
+
+ This software is a copyrighted work licensed under the terms of the
+ Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+ details. */
+
+#include <dirent.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include "winsup.h"
+
+extern "C"
+int
+scandir (const char *dir,
+ struct dirent ***namelist,
+ int (*select) (const struct dirent *),
+ int (*compar) (const struct dirent **, const struct dirent **))
+{
+ DIR *dirp;
+ struct dirent *ent, *etmp, **nl = NULL, **ntmp;
+ int count = 0;
+ int allocated = 0;
+
+ if (!(dirp = opendir (dir)))
+ return -1;
+
+ int prior_errno = get_errno ();
+ set_errno (0);
+
+ while ((ent = readdir (dirp)))
+ {
+ if (!select || select (ent))
+ {
+
+ /* Ignore error from readdir/select. See POSIX specs. */
+ set_errno (0);
+
+ if (count == allocated)
+ {
+
+ if (allocated == 0)
+ allocated = 10;
+ else
+ allocated *= 2;
+
+ ntmp = (struct dirent **) realloc (nl, allocated * sizeof *nl);
+ if (!ntmp)
+ {
+ set_errno (ENOMEM);
+ break;
+ }
+ nl = ntmp;
+ }
+
+ if (!(etmp = (struct dirent *) malloc (sizeof *ent)))
+ {
+ set_errno (ENOMEM);
+ break;
+ }
+ *etmp = *ent;
+ nl[count++] = etmp;
+ }
+ }
+
+ if ((prior_errno = get_errno ()) != 0)
+ {
+ closedir (dirp);
+ if (nl)
+ {
+ while (count > 0)
+ free (nl[--count]);
+ free (nl);
+ }
+ /* Ignore errors from closedir() and what not else. */
+ set_errno (prior_errno);
+ return -1;
+ }
+
+ closedir (dirp);
+ set_errno (prior_errno);
+
+ qsort (nl, count, sizeof *nl, (int (*)(const void *, const void *)) compar);
+ if (namelist)
+ *namelist = nl;
+ return count;
+}
+
+extern "C"
+int
+alphasort (const struct dirent **a, const struct dirent **b)
+{
+ return strcoll ((*a)->d_name, (*b)->d_name);
+}
+
diff --git a/winsup/cygwin/security.cc b/winsup/cygwin/security.cc
new file mode 100644
index 000000000..df62f1a7d
--- /dev/null
+++ b/winsup/cygwin/security.cc
@@ -0,0 +1,2084 @@
+/* security.cc: NT security functions
+
+ Copyright 1997, 1998, 1999, 2000 Cygnus Solutions.
+
+ Originaly written by Gunther Ebert, gunther.ebert@ixos-leipzig.de
+ Extensions by Corinna Vinschen <corinna.vinschen@cityweb.de>
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#include <grp.h>
+#include <pwd.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <limits.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/acl.h>
+#include "winsup.h"
+#include <ctype.h>
+
+#define MAX_SID_LEN 40
+
+extern BOOL allow_ntea;
+BOOL allow_ntsec = FALSE;
+
+SID_IDENTIFIER_AUTHORITY sid_auth[] = {
+ {SECURITY_NULL_SID_AUTHORITY},
+ {SECURITY_WORLD_SID_AUTHORITY},
+ {SECURITY_LOCAL_SID_AUTHORITY},
+ {SECURITY_CREATOR_SID_AUTHORITY},
+ {SECURITY_NON_UNIQUE_AUTHORITY},
+ {SECURITY_NT_AUTHORITY}
+};
+
+#define DONT_INHERIT (0)
+#define INHERIT_ALL (CONTAINER_INHERIT_ACE|OBJECT_INHERIT_ACE)
+#define INHERIT_ONLY (INHERIT_ONLY_ACE|CONTAINER_INHERIT_ACE|OBJECT_INHERIT_ACE)
+
+PSID
+get_sid (PSID psid, DWORD s, DWORD cnt, DWORD *r)
+{
+ DWORD i;
+
+ if (! psid || s > 5 || cnt < 1 || cnt > 8)
+ return NULL;
+
+ InitializeSid(psid, &sid_auth[s], cnt);
+ for (i = 0; i < cnt; ++i)
+ memcpy ((char *) psid + 8 + sizeof (DWORD) * i, &r[i], sizeof (DWORD));
+ return psid;
+}
+
+PSID
+get_ssid (PSID psid, const char *sid_str)
+{
+ char sid_buf[256];
+ char *t;
+ DWORD cnt = 0;
+ DWORD s = 0;
+ DWORD i, r[8];
+
+ if (! sid_str || strncmp (sid_str, "S-1-", 4))
+ return NULL;
+
+ strcpy (sid_buf, sid_str);
+
+ for (t = sid_buf + 4, i = 0; cnt < 8 && (t = strtok (t, "-")); t = NULL, ++i)
+ if (i == 0)
+ s = strtoul (t, NULL, 10);
+ else
+ r[cnt++] = strtoul (t, NULL, 10);
+
+ return get_sid (psid, s, cnt, r);
+}
+
+BOOL
+get_pw_sid (PSID sid, struct passwd *pw)
+{
+ char *sp = strrchr (pw->pw_gecos, ',');
+
+ if (!sp)
+ return FALSE;
+ return get_ssid (sid, ++sp) != NULL;
+}
+
+BOOL
+get_gr_sid (PSID sid, struct group *gr)
+{
+ return get_ssid (sid, gr->gr_passwd) != NULL;
+}
+
+PSID
+get_admin_sid ()
+{
+ static NO_COPY char admin_sid_buf[MAX_SID_LEN];
+ static NO_COPY PSID admin_sid = NULL;
+
+ if (!admin_sid)
+ {
+ admin_sid = (PSID) admin_sid_buf;
+ get_ssid (admin_sid, "S-1-5-32-544");
+ }
+ return admin_sid;
+}
+
+PSID
+get_system_sid ()
+{
+ static NO_COPY char system_sid_buf[MAX_SID_LEN];
+ static NO_COPY PSID system_sid = NULL;
+
+ if (!system_sid)
+ {
+ system_sid = (PSID) system_sid_buf;
+ get_ssid (system_sid, "S-1-5-18");
+ }
+ return system_sid;
+}
+
+PSID
+get_creator_owner_sid ()
+{
+ static NO_COPY char owner_sid_buf[MAX_SID_LEN];
+ static NO_COPY PSID owner_sid = NULL;
+
+ if (!owner_sid)
+ {
+ owner_sid = (PSID) owner_sid_buf;
+ get_ssid (owner_sid, "S-1-3-0");
+ }
+ return owner_sid;
+}
+
+PSID
+get_world_sid ()
+{
+ static NO_COPY char world_sid_buf[MAX_SID_LEN];
+ static NO_COPY PSID world_sid = NULL;
+
+ if (!world_sid)
+ {
+ world_sid = (PSID) world_sid_buf;
+ get_ssid (world_sid, "S-1-1-0");
+ }
+ return world_sid;
+}
+
+int passwd_sem = 0;
+int group_sem = 0;
+
+static int
+get_id_from_sid (PSID psid, BOOL search_grp, int *type)
+{
+ if (!IsValidSid (psid))
+ {
+ __seterrno ();
+ small_printf ("IsValidSid failed with %E");
+ return -1;
+ }
+
+ /* First try to get SID from passwd or group entry */
+ if (allow_ntsec)
+ {
+ char sidbuf[MAX_SID_LEN];
+ PSID sid = (PSID) sidbuf;
+ int id = -1;
+
+ if (! search_grp)
+ {
+ if (passwd_sem > 0)
+ return 0;
+ ++passwd_sem;
+
+ struct passwd *pw;
+ while ((pw = getpwent ()) != NULL)
+ {
+ if (get_pw_sid (sid, pw) && EqualSid (psid, sid))
+ {
+ id = pw->pw_uid;
+ break;
+ }
+ }
+ endpwent ();
+ --passwd_sem;
+ if (id >= 0)
+ {
+ if (type)
+ *type = USER;
+ return id;
+ }
+ }
+ if (search_grp || type)
+ {
+ if (group_sem > 0)
+ return 0;
+ ++group_sem;
+
+ struct group *gr;
+ while ((gr = getgrent ()) != NULL)
+ {
+ if (get_gr_sid (sid, gr) && EqualSid (psid, sid))
+ {
+ id = gr->gr_gid;
+ break;
+ }
+ }
+ endgrent ();
+ --group_sem;
+ if (id >= 0)
+ {
+ if (type)
+ *type = GROUP;
+ return id;
+ }
+ }
+ }
+
+ /* We use the RID as default UID/GID */
+ int id = *GetSidSubAuthority(psid, *GetSidSubAuthorityCount(psid) - 1);
+
+ /*
+ * The RID maybe -1 if accountname == computername.
+ * In this case we search for the accountname in the passwd and group files.
+ * If type is needed, we search in each case.
+ */
+ if (id == -1 || type)
+ {
+ char account[MAX_USER_NAME];
+ char domain[MAX_COMPUTERNAME_LENGTH+1];
+ DWORD acc_len = MAX_USER_NAME;
+ DWORD dom_len = MAX_COMPUTERNAME_LENGTH+1;
+ SID_NAME_USE acc_type;
+
+ if (!LookupAccountSid (NULL, psid, account, &acc_len,
+ domain, &dom_len, &acc_type))
+ {
+ __seterrno ();
+ return -1;
+ }
+
+ switch (acc_type)
+ {
+ case SidTypeGroup:
+ case SidTypeAlias:
+ case SidTypeWellKnownGroup:
+ if (type)
+ *type = GROUP;
+ if (id == -1)
+ {
+ struct group *gr = getgrnam (account);
+ if (gr)
+ id = gr->gr_gid;
+ }
+ break;
+ case SidTypeUser:
+ if (type)
+ *type = USER;
+ if (id == -1)
+ {
+ struct passwd *pw = getpwnam (account);
+ if (pw)
+ id = pw->pw_uid;
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ if (id == -1)
+ id = getuid ();
+ return id;
+}
+
+int
+get_id_from_sid (PSID psid, BOOL search_grp)
+{
+ return get_id_from_sid (psid, search_grp, NULL);
+}
+
+static BOOL
+legal_sid_type (SID_NAME_USE type)
+{
+ return type == SidTypeUser || type == SidTypeGroup
+ || SidTypeAlias || SidTypeWellKnownGroup;
+}
+
+BOOL
+is_grp_member (uid_t uid, gid_t gid)
+{
+ extern int getgroups (int, gid_t *, gid_t, const char *);
+ BOOL grp_member = TRUE;
+
+ if (!group_sem && !passwd_sem)
+ {
+ struct passwd *pw = getpwuid (uid);
+ gid_t grps[NGROUPS_MAX];
+ int cnt = getgroups (NGROUPS_MAX, grps,
+ pw ? pw->pw_gid : myself->gid,
+ pw ? pw->pw_name : myself->username);
+ int i;
+ for (i = 0; i < cnt; ++i)
+ if (grps[i] == gid)
+ break;
+ grp_member = (i < cnt);
+ }
+ return grp_member;
+}
+
+BOOL
+lookup_name (const char *name, const char *logsrv, PSID ret_sid)
+{
+ char sidbuf[MAX_SID_LEN];
+ PSID sid = (PSID) sidbuf;
+ DWORD sidlen;
+ char domuser[MAX_COMPUTERNAME_LENGTH+MAX_USER_NAME+1];
+ char dom[MAX_COMPUTERNAME_LENGTH+1];
+ DWORD domlen;
+ SID_NAME_USE acc_type;
+
+ debug_printf ("name : %s", name ? name : "NULL");
+
+ if (! name)
+ return FALSE;
+
+ if (logsrv && *logsrv)
+ {
+ if (LookupAccountName (logsrv, name,
+ sid, (sidlen = MAX_SID_LEN, &sidlen),
+ dom, (domlen = MAX_COMPUTERNAME_LENGTH, &domlen),
+ &acc_type)
+ && legal_sid_type (acc_type))
+ goto got_it;
+ if (acc_type == SidTypeDomain)
+ {
+ strcat (strcat (strcpy (domuser, dom), "\\"), name);
+ if (LookupAccountName (logsrv, domuser,
+ sid,(sidlen = MAX_SID_LEN, &sidlen),
+ dom,(domlen = MAX_COMPUTERNAME_LENGTH,&domlen),
+ &acc_type))
+ goto got_it;
+ }
+ }
+ if (LookupAccountName (NULL, name,
+ sid, (sidlen = MAX_SID_LEN, &sidlen),
+ dom, (domlen = 100, &domlen),
+ &acc_type)
+ && legal_sid_type (acc_type))
+ goto got_it;
+ if (acc_type == SidTypeDomain)
+ {
+ strcat (strcat (strcpy (domuser, dom), "\\"), name);
+ if (LookupAccountName (NULL, domuser,
+ sid, (sidlen = MAX_SID_LEN, &sidlen),
+ dom, (domlen = MAX_COMPUTERNAME_LENGTH, &domlen),
+ &acc_type))
+ goto got_it;
+ }
+ debug_printf ("LookupAccountName(%s) %E", name);
+ __seterrno ();
+ return FALSE;
+
+got_it:
+ debug_printf ("sid : [%d]", *GetSidSubAuthority((PSID) sid,
+ *GetSidSubAuthorityCount((PSID) sid) - 1));
+
+ if (ret_sid)
+ memcpy (ret_sid, sid, sidlen);
+
+ return TRUE;
+}
+
+/* ReadSD reads a security descriptor from a file.
+ In case of error, -1 is returned and errno is set.
+ If the file doesn't have a SD, 0 is returned.
+ Otherwise, the size of the SD is returned and
+ the SD is copied to the buffer, pointed to by sdBuf.
+ sdBufSize contains the size of the buffer. If
+ it's too small, to contain the complete SD, 0 is
+ returned and sdBufSize is set to the needed size
+ of the buffer.
+*/
+
+LONG
+ReadSD(const char *file, PSECURITY_DESCRIPTOR sdBuf, LPDWORD sdBufSize)
+{
+ /* Check parameters */
+ if (! sdBufSize)
+ {
+ set_errno (EINVAL);
+ return -1;
+ }
+
+ /* Open file for read */
+ HANDLE hFile = CreateFile (file, GENERIC_READ,
+ FILE_SHARE_READ | FILE_SHARE_WRITE,
+ &sec_none_nih, OPEN_EXISTING,
+ FILE_ATTRIBUTE_NORMAL | FILE_FLAG_BACKUP_SEMANTICS,
+ NULL);
+
+ if (hFile == INVALID_HANDLE_VALUE)
+ {
+ __seterrno ();
+ return -1;
+ }
+
+ /* step through the backup streams and search for the security data */
+ WIN32_STREAM_ID header;
+ DWORD bytes_read = 0;
+ LPVOID context = NULL;
+ PSECURITY_DESCRIPTOR psd = NULL;
+ DWORD datasize;
+ LONG ret = 0;
+
+ while (BackupRead (hFile, (LPBYTE) &header,
+ 3 * sizeof (DWORD) + sizeof (LARGE_INTEGER),
+ &bytes_read, FALSE, TRUE, &context))
+ {
+ if (header.dwStreamId != BACKUP_SECURITY_DATA)
+ continue;
+
+ /* security data found */
+ datasize = header.Size.LowPart + header.dwStreamNameSize;
+ char b[datasize];
+
+ if (! BackupRead (hFile, (LPBYTE) b, datasize, &bytes_read,
+ FALSE, TRUE, &context))
+ {
+ __seterrno ();
+ ret = -1;
+ break;
+ }
+
+ /* Check validity of the SD */
+ psd = (PSECURITY_DESCRIPTOR) &b[header.dwStreamNameSize];
+ if (! IsValidSecurityDescriptor (psd))
+ continue;
+
+ /* It's a valid SD */
+ datasize -= header.dwStreamNameSize;
+ debug_printf ("SD-Size: %d", datasize);
+
+ /* buffer to small? */
+ if (*sdBufSize < datasize)
+ {
+ *sdBufSize = datasize;
+ ret = 0;
+ break;
+ }
+
+ if (sdBuf)
+ memcpy (sdBuf, psd, datasize);
+
+ ret = *sdBufSize = datasize;
+ break;
+
+ }
+ BackupRead (hFile, NULL, 0, &bytes_read, TRUE, TRUE, &context);
+ CloseHandle (hFile);
+ return ret;
+}
+
+LONG
+WriteSD(const char *file, PSECURITY_DESCRIPTOR sdBuf, DWORD sdBufSize)
+{
+ /* Check parameters */
+ if (! sdBuf || ! sdBufSize)
+ {
+ set_errno (EINVAL);
+ return -1;
+ }
+
+ HANDLE hFile = CreateFile (file,
+ WRITE_OWNER | WRITE_DAC,
+ FILE_SHARE_READ | FILE_SHARE_WRITE,
+ &sec_none_nih,
+ OPEN_EXISTING,
+ FILE_ATTRIBUTE_NORMAL | FILE_FLAG_BACKUP_SEMANTICS,
+ NULL);
+
+ if (hFile == INVALID_HANDLE_VALUE)
+ {
+ __seterrno ();
+ return -1;
+ }
+
+ LPVOID context = NULL;
+ DWORD bytes_written = 0;
+ WIN32_STREAM_ID header;
+
+ memset (&header, 0, sizeof (header));
+ /* write new security info header */
+ header.dwStreamId = BACKUP_SECURITY_DATA;
+ header.dwStreamAttributes = STREAM_CONTAINS_SECURITY;
+ header.Size.HighPart = 0;
+ header.Size.LowPart = sdBufSize;
+ header.dwStreamNameSize = 0;
+ if (!BackupWrite (hFile, (LPBYTE) &header,
+ 3 * sizeof (DWORD) + sizeof (LARGE_INTEGER),
+ &bytes_written, FALSE, TRUE, &context))
+ {
+ __seterrno ();
+ CloseHandle (hFile);
+ return -1;
+ }
+
+ /* write new security descriptor */
+ if (!BackupWrite (hFile, (LPBYTE) sdBuf,
+ header.Size.LowPart + header.dwStreamNameSize,
+ &bytes_written, FALSE, TRUE, &context))
+ {
+ /* Samba returns ERROR_NOT_SUPPORTED.
+ FAT returns ERROR_INVALID_SECURITY_DESCR.
+ This shouldn't return as error, but better be ignored. */
+ DWORD ret = GetLastError ();
+ if (ret != ERROR_NOT_SUPPORTED && ret != ERROR_INVALID_SECURITY_DESCR)
+ {
+ __seterrno ();
+ BackupWrite (hFile, NULL, 0, &bytes_written, TRUE, TRUE, &context);
+ CloseHandle (hFile);
+ return -1;
+ }
+ }
+
+ /* terminate the restore process */
+ BackupWrite (hFile, NULL, 0, &bytes_written, TRUE, TRUE, &context);
+ CloseHandle (hFile);
+ return 0;
+}
+
+static int
+set_process_privileges ()
+{
+ HANDLE hProcess = NULL;
+ HANDLE hToken = NULL;
+ LUID restore_priv;
+ LUID backup_priv;
+ char buf[sizeof (TOKEN_PRIVILEGES) + 2 * sizeof (LUID_AND_ATTRIBUTES)];
+ TOKEN_PRIVILEGES *new_priv = (TOKEN_PRIVILEGES *) buf;
+ int ret = -1;
+
+ hProcess = OpenProcess (PROCESS_ALL_ACCESS, FALSE, GetCurrentProcessId ());
+ if (! hProcess)
+ {
+ __seterrno ();
+ goto out;
+ }
+
+ if (! OpenProcessToken (hProcess,
+ TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES,
+ &hToken))
+ {
+ __seterrno ();
+ goto out;
+ }
+
+ if (! LookupPrivilegeValue (NULL, SE_RESTORE_NAME, &restore_priv))
+ {
+ __seterrno ();
+ goto out;
+ }
+ if (! LookupPrivilegeValue (NULL, SE_BACKUP_NAME, &backup_priv))
+ {
+ __seterrno ();
+ goto out;
+ }
+
+ new_priv->PrivilegeCount = 2;
+ new_priv->Privileges[0].Luid = restore_priv;
+ new_priv->Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
+ new_priv->Privileges[1].Luid = backup_priv;
+ new_priv->Privileges[1].Attributes = SE_PRIVILEGE_ENABLED;
+
+ if (! AdjustTokenPrivileges (hToken, FALSE, new_priv, 0, NULL, NULL))
+ {
+ __seterrno ();
+ goto out;
+ }
+
+ ret = 0;
+
+ if (ret == -1)
+ __seterrno ();
+
+out:
+ if (hToken)
+ CloseHandle (hToken);
+ if (hProcess)
+ CloseHandle (hProcess);
+
+ syscall_printf ("%d = set_process_privileges ()", ret);
+ return ret;
+}
+
+static int
+get_nt_attribute (const char *file, int *attribute)
+{
+ if (os_being_run != winNT)
+ return 0;
+
+ syscall_printf ("file: %s", file);
+
+ if (set_process_privileges () < 0)
+ return -1;
+
+ /* Yeah, sounds too much, but I've seen SDs of 2100 bytes! */
+ DWORD sd_size = 4096;
+ char sd_buf[4096];
+ PSECURITY_DESCRIPTOR psd = (PSECURITY_DESCRIPTOR) sd_buf;
+
+ int ret;
+ if ((ret = ReadSD (file, psd, &sd_size)) <= 0)
+ {
+ debug_printf ("ReadSD %E");
+ return ret;
+ }
+
+ PSID owner_sid;
+ PSID group_sid;
+ BOOL dummy;
+
+ if (! GetSecurityDescriptorOwner (psd, &owner_sid, &dummy))
+ debug_printf ("GetSecurityDescriptorOwner %E");
+ if (! GetSecurityDescriptorGroup (psd, &group_sid, &dummy))
+ debug_printf ("GetSecurityDescriptorGroup %E");
+
+ PACL acl;
+ BOOL acl_exists;
+
+ if (! GetSecurityDescriptorDacl (psd, &acl_exists, &acl, &dummy))
+ {
+ __seterrno ();
+ debug_printf ("GetSecurityDescriptorDacl %E");
+ return -1;
+ }
+
+ if (! acl_exists || ! acl)
+ {
+ *attribute |= S_IRWXU | S_IRWXG | S_IRWXO;
+ syscall_printf ("file: %s No ACL = %x", file, *attribute);
+ return 0;
+ }
+
+ BOOL grp_member = is_grp_member (get_uid_from_sid (owner_sid),
+ get_gid_from_sid (group_sid));
+
+ ACCESS_ALLOWED_ACE *ace;
+ int allow = 0;
+ int deny = 0;
+ int *flags, *anti;
+
+ for (DWORD i = 0; i < acl->AceCount; ++i)
+ {
+ if (!GetAce (acl, i, (PVOID *) &ace))
+ continue;
+ if (ace->Header.AceFlags & INHERIT_ONLY_ACE)
+ continue;
+ switch (ace->Header.AceType)
+ {
+ case ACCESS_ALLOWED_ACE_TYPE:
+ flags = &allow;
+ anti = &deny;
+ break;
+ case ACCESS_DENIED_ACE_TYPE:
+ flags = &deny;
+ anti = &allow;
+ break;
+ default:
+ continue;
+ }
+
+ PSID ace_sid = (PSID) &ace->SidStart;
+ if (owner_sid && EqualSid (ace_sid, owner_sid))
+ {
+ if (ace->Mask & FILE_READ_DATA)
+ *flags |= S_IRUSR;
+ if (ace->Mask & FILE_WRITE_DATA)
+ *flags |= S_IWUSR;
+ if (ace->Mask & FILE_EXECUTE)
+ *flags |= S_IXUSR;
+ }
+ else if (group_sid && EqualSid (ace_sid, group_sid))
+ {
+ if (ace->Mask & FILE_READ_DATA)
+ *flags |= S_IRGRP
+ | ((grp_member && !(*anti & S_IRUSR)) ? S_IRUSR : 0);
+ if (ace->Mask & FILE_WRITE_DATA)
+ *flags |= S_IWGRP
+ | ((grp_member && !(*anti & S_IWUSR)) ? S_IWUSR : 0);
+ if (ace->Mask & FILE_EXECUTE)
+ *flags |= S_IXGRP
+ | ((grp_member && !(*anti & S_IXUSR)) ? S_IXUSR : 0);
+ }
+ else if (EqualSid (ace_sid, get_world_sid ()))
+ {
+ if (ace->Mask & FILE_READ_DATA)
+ *flags |= S_IROTH
+ | ((!(*anti & S_IRGRP)) ? S_IRGRP : 0)
+ | ((!(*anti & S_IRUSR)) ? S_IRUSR : 0);
+ if (ace->Mask & FILE_WRITE_DATA)
+ *flags |= S_IWOTH
+ | ((!(*anti & S_IWGRP)) ? S_IWGRP : 0)
+ | ((!(*anti & S_IWUSR)) ? S_IWUSR : 0);
+ if (ace->Mask & FILE_EXECUTE)
+ {
+ *flags |= S_IXOTH
+ | ((!(*anti & S_IXGRP)) ? S_IXGRP : 0)
+ | ((!(*anti & S_IXUSR)) ? S_IXUSR : 0);
+ // Sticky bit for directories according to linux rules.
+ // No sense for files.
+ if (! (ace->Mask & FILE_DELETE_CHILD)
+ && S_ISDIR(*attribute)
+ && !(*anti & S_ISVTX))
+ *flags |= S_ISVTX;
+ }
+ }
+ }
+ *attribute &= ~(S_IRWXU|S_IRWXG|S_IRWXO|S_ISVTX);
+ *attribute |= allow;
+ *attribute &= ~deny;
+ syscall_printf ("file: %s %x", file, *attribute);
+ return 0;
+}
+
+int
+get_file_attribute (int use_ntsec, const char *file, int *attribute)
+{
+ if (!attribute)
+ {
+ set_errno (EINVAL);
+ return -1;
+ }
+
+ int res;
+
+ if (use_ntsec && allow_ntsec)
+ {
+ res = get_nt_attribute (file, attribute);
+ if (!res)
+ return 0;
+ }
+
+ res = NTReadEA (file, ".UNIXATTR", (char *) attribute, sizeof (*attribute));
+
+ // symlinks are anything for everyone!
+ if ((*attribute & S_IFLNK) == S_IFLNK)
+ *attribute |= S_IRWXU | S_IRWXG | S_IRWXO;
+
+ if (res > 0)
+ return 0;
+ set_errno (ENOSYS);
+ return -1;
+}
+
+BOOL add_access_allowed_ace (PACL acl, int offset, DWORD attributes,
+ PSID sid, size_t &len_add, DWORD inherit)
+{
+ if (! AddAccessAllowedAce (acl, ACL_REVISION, attributes, sid))
+ {
+ __seterrno ();
+ return FALSE;
+ }
+ ACCESS_ALLOWED_ACE *ace;
+ if (GetAce(acl, offset, (PVOID *) &ace))
+ ace->Header.AceFlags |= inherit;
+ len_add += sizeof (ACCESS_DENIED_ACE) - sizeof (DWORD)
+ + GetLengthSid (sid);
+ return TRUE;
+}
+
+BOOL add_access_denied_ace (PACL acl, int offset, DWORD attributes,
+ PSID sid, size_t &len_add, DWORD inherit)
+{
+ if (! AddAccessDeniedAce (acl, ACL_REVISION, attributes, sid))
+ {
+ __seterrno ();
+ return FALSE;
+ }
+ ACCESS_DENIED_ACE *ace;
+ if (GetAce(acl, offset, (PVOID *) &ace))
+ ace->Header.AceFlags |= inherit;
+ len_add += sizeof (ACCESS_DENIED_ACE) - sizeof (DWORD)
+ + GetLengthSid (sid);
+ return TRUE;
+}
+
+PSECURITY_DESCRIPTOR
+alloc_sd (uid_t uid, gid_t gid, const char *logsrv, int attribute,
+ PSECURITY_DESCRIPTOR sd_ret, DWORD *sd_size_ret)
+{
+ BOOL dummy;
+
+ if (os_being_run != winNT)
+ return NULL;
+
+ if (! sd_ret || ! sd_size_ret)
+ {
+ set_errno (EINVAL);
+ return NULL;
+ }
+
+ // Get SID and name of new owner
+ char owner[MAX_USER_NAME];
+ char *owner_sid_buf[MAX_SID_LEN];
+ PSID owner_sid = NULL;
+ struct passwd *pw = getpwuid (uid);
+ strcpy (owner, pw ? pw->pw_name : getlogin ());
+ owner_sid = (PSID) owner_sid_buf;
+ if ((! pw || ! get_pw_sid (owner_sid, pw))
+ && ! lookup_name (owner, logsrv, owner_sid))
+ return NULL;
+ debug_printf ("owner: %s [%d]", owner,
+ *GetSidSubAuthority((PSID) owner_sid,
+ *GetSidSubAuthorityCount((PSID) owner_sid) - 1));
+
+ // Get SID and name of new group
+ char *group_sid_buf[MAX_SID_LEN];
+ PSID group_sid = NULL;
+ struct group *grp = getgrgid (gid);
+ if (grp)
+ {
+ group_sid = (PSID) group_sid_buf;
+ if ((! grp || ! get_gr_sid (group_sid, grp))
+ && ! lookup_name (grp->gr_name, logsrv, group_sid))
+ return NULL;
+ }
+ else
+ debug_printf ("no group");
+
+ // Initialize local security descriptor
+ SECURITY_DESCRIPTOR sd;
+ PSECURITY_DESCRIPTOR psd = NULL;
+ if (! InitializeSecurityDescriptor (&sd, SECURITY_DESCRIPTOR_REVISION))
+ {
+ __seterrno ();
+ return NULL;
+ }
+
+ if (! SetSecurityDescriptorOwner(&sd, owner_sid, FALSE))
+ {
+ __seterrno ();
+ return NULL;
+ }
+ if (group_sid
+ && ! SetSecurityDescriptorGroup(&sd, group_sid, FALSE))
+ {
+ __seterrno ();
+ return NULL;
+ }
+
+ // Initialize local access control list
+ char acl_buf[3072];
+ PACL acl = (PACL) acl_buf;
+ if (! InitializeAcl (acl, 3072, ACL_REVISION))
+ {
+ __seterrno ();
+ return NULL;
+ }
+
+ // VTX bit may only be set if executable for `other' is set.
+ // For correct handling under WinNT, FILE_DELETE_CHILD has to
+ // be (un)set in each ACE.
+ if (! (attribute & S_IXOTH))
+ attribute &= ~S_ISVTX;
+
+ // From here fill ACL
+ size_t acl_len = sizeof (ACL);
+ int ace_off = 0;
+
+ // Construct allow attribute for owner
+ DWORD owner_allow = (STANDARD_RIGHTS_ALL & ~DELETE)
+ | FILE_WRITE_ATTRIBUTES | FILE_WRITE_EA;
+ if (attribute & S_IRUSR)
+ owner_allow |= FILE_GENERIC_READ;
+ if (attribute & S_IWUSR)
+ owner_allow |= FILE_GENERIC_WRITE | DELETE;
+ if (attribute & S_IXUSR)
+ owner_allow |= FILE_GENERIC_EXECUTE;
+ if (! (attribute & S_ISVTX))
+ owner_allow |= FILE_DELETE_CHILD;
+
+ // Construct allow attribute for group
+ DWORD group_allow = STANDARD_RIGHTS_READ
+ | FILE_READ_ATTRIBUTES | FILE_READ_EA;
+ if (attribute & S_IRGRP)
+ group_allow |= FILE_GENERIC_READ;
+ if (attribute & S_IWGRP)
+ group_allow |= STANDARD_RIGHTS_ALL | FILE_GENERIC_WRITE | DELETE;
+ if (attribute & S_IXGRP)
+ group_allow |= FILE_GENERIC_EXECUTE;
+ if (! (attribute & S_ISVTX))
+ group_allow |= FILE_DELETE_CHILD;
+
+ // Construct allow attribute for everyone
+ DWORD other_allow = STANDARD_RIGHTS_READ
+ | FILE_READ_ATTRIBUTES | FILE_READ_EA;
+ if (attribute & S_IROTH)
+ other_allow |= FILE_GENERIC_READ;
+ if (attribute & S_IWOTH)
+ other_allow |= STANDARD_RIGHTS_ALL | FILE_GENERIC_WRITE | DELETE;
+ if (attribute & S_IXOTH)
+ other_allow |= FILE_GENERIC_EXECUTE;
+ if (! (attribute & S_ISVTX))
+ other_allow |= FILE_DELETE_CHILD;
+
+ // Construct deny attributes for owner and group
+ DWORD owner_deny = 0;
+ if (is_grp_member (uid, gid))
+ owner_deny = ~owner_allow & (group_allow | other_allow);
+ else
+ owner_deny = ~owner_allow & other_allow;
+ owner_deny &= ~(STANDARD_RIGHTS_READ
+ | FILE_READ_ATTRIBUTES | FILE_READ_EA
+ | FILE_WRITE_ATTRIBUTES | FILE_WRITE_EA);
+ DWORD group_deny = ~group_allow & other_allow;
+ group_deny &= ~(STANDARD_RIGHTS_READ | FILE_READ_ATTRIBUTES | FILE_READ_EA);
+
+ // Set deny ACE for owner
+ if (owner_deny
+ && ! add_access_denied_ace (acl, ace_off++, owner_deny,
+ owner_sid, acl_len, INHERIT_ALL))
+ return NULL;
+ // Set allow ACE for owner
+ if (! add_access_allowed_ace (acl, ace_off++, owner_allow,
+ owner_sid, acl_len, INHERIT_ALL))
+ return NULL;
+ // Set deny ACE for group
+ if (group_deny
+ && ! add_access_denied_ace (acl, ace_off++, group_deny,
+ group_sid, acl_len, INHERIT_ALL))
+ return NULL;
+ // Set allow ACE for group
+ if (! add_access_allowed_ace (acl, ace_off++, group_allow,
+ group_sid, acl_len, INHERIT_ALL))
+ return NULL;
+
+ // Get owner and group from current security descriptor
+ PSID cur_owner_sid = NULL;
+ PSID cur_group_sid = NULL;
+ if (! GetSecurityDescriptorOwner (sd_ret, &cur_owner_sid, &dummy))
+ debug_printf ("GetSecurityDescriptorOwner %E");
+ if (! GetSecurityDescriptorGroup (sd_ret, &cur_group_sid, &dummy))
+ debug_printf ("GetSecurityDescriptorGroup %E");
+
+ // Fill ACL with unrelated ACEs from current security descriptor
+ PACL oacl;
+ BOOL acl_exists;
+ ACCESS_ALLOWED_ACE *ace;
+ if (GetSecurityDescriptorDacl (sd_ret, &acl_exists, &oacl, &dummy)
+ && acl_exists && oacl)
+ for (DWORD i = 0; i < oacl->AceCount; ++i)
+ if (GetAce (oacl, i, (PVOID *) &ace))
+ {
+ PSID ace_sid = (PSID) &ace->SidStart;
+ // Check for related ACEs
+ if ((cur_owner_sid && EqualSid (ace_sid, cur_owner_sid))
+ || (owner_sid && EqualSid (ace_sid, owner_sid))
+ || (cur_group_sid && EqualSid (ace_sid, cur_group_sid))
+ || (group_sid && EqualSid (ace_sid, group_sid))
+ || (EqualSid (ace_sid, get_world_sid ())))
+ continue;
+ // Add unrelated ACCESS_DENIED_ACE to the beginning but
+ // behind the owner_deny, ACCESS_ALLOWED_ACE to the end
+ // but in front of the `everyone' ACE.
+ if (! AddAce(acl, ACL_REVISION,
+ ace->Header.AceType == ACCESS_DENIED_ACE_TYPE ?
+ (owner_deny ? 1 : 0) : MAXDWORD,
+ (LPVOID) ace, ace->Header.AceSize))
+ {
+ __seterrno ();
+ return NULL;
+ }
+ acl_len += ace->Header.AceSize;
+ ++ace_off;
+ }
+
+ // Set allow ACE for everyone
+ if (! add_access_allowed_ace (acl, ace_off++, other_allow,
+ get_world_sid (), acl_len, INHERIT_ALL))
+ return NULL;
+
+ // Set AclSize to computed value
+ acl->AclSize = acl_len;
+ debug_printf ("ACL-Size: %d", acl_len);
+
+ // Create DACL for local security descriptor
+ if (! SetSecurityDescriptorDacl (&sd, TRUE, acl, FALSE))
+ {
+ __seterrno ();
+ return NULL;
+ }
+
+ // Make self relative security descriptor
+ *sd_size_ret = 0;
+ MakeSelfRelativeSD (&sd, sd_ret, sd_size_ret);
+ if (*sd_size_ret <= 0)
+ {
+ __seterrno ();
+ return NULL;
+ }
+ if (! MakeSelfRelativeSD (&sd, sd_ret, sd_size_ret))
+ {
+ __seterrno ();
+ return NULL;
+ }
+ psd = sd_ret;
+ debug_printf ("Created SD-Size: %d", *sd_size_ret);
+
+ return psd;
+}
+
+static int
+set_nt_attribute (const char *file, uid_t uid, gid_t gid,
+ const char *logsrv, int attribute)
+{
+ if (os_being_run != winNT)
+ return 0;
+
+ if (set_process_privileges () < 0)
+ return -1;
+
+ DWORD sd_size = 4096;
+ char sd_buf[4096];
+ PSECURITY_DESCRIPTOR psd = (PSECURITY_DESCRIPTOR) sd_buf;
+
+ int ret;
+ if ((ret = ReadSD (file, psd, &sd_size)) <= 0)
+ {
+ debug_printf ("ReadSD %E");
+ return ret;
+ }
+
+ sd_size = 4096;
+ if (! (psd = alloc_sd (uid, gid, logsrv, attribute, psd, &sd_size)))
+ return -1;
+
+ return WriteSD (file, psd, sd_size);
+}
+
+int
+set_file_attribute (int use_ntsec, const char *file,
+ uid_t uid, gid_t gid,
+ int attribute, const char *logsrv)
+{
+ // symlinks are anything for everyone!
+ if ((attribute & S_IFLNK) == S_IFLNK)
+ attribute |= S_IRWXU | S_IRWXG | S_IRWXO;
+
+ BOOL ret = NTWriteEA (file, ".UNIXATTR",
+ (char *) &attribute, sizeof (attribute));
+ if (!use_ntsec || !allow_ntsec)
+ {
+ if (! ret)
+ {
+ __seterrno ();
+ return -1;
+ }
+ return 0;
+ }
+
+ int ret2 = set_nt_attribute (file, uid, gid, logsrv, attribute);
+ syscall_printf ("%d = set_file_attribute (%s, %d, %d, %p)",
+ ret2, file, uid, gid, attribute);
+ return ret2;
+}
+
+int
+set_file_attribute (int use_ntsec, const char *file, int attribute)
+{
+ return set_file_attribute (use_ntsec, file,
+ myself->uid, myself->gid,
+ attribute, myself->logsrv);
+}
+
+static int
+searchace (aclent_t *aclp, int nentries, int type, int id = -1)
+{
+ int i;
+
+ for (i = 0; i < nentries; ++i)
+ if ((aclp[i].a_type == type && (id < 0 || aclp[i].a_id == id))
+ || !aclp[i].a_type)
+ return i;
+ return -1;
+}
+
+static int
+setacl (const char *file, int nentries, aclent_t *aclbufp)
+{
+ DWORD sd_size = 4096;
+ char sd_buf[4096];
+ PSECURITY_DESCRIPTOR psd = (PSECURITY_DESCRIPTOR) sd_buf;
+
+ if (ReadSD (file, psd, &sd_size) <= 0)
+ {
+ debug_printf ("ReadSD %E");
+ return -1;
+ }
+
+ BOOL dummy;
+
+ // Get owner SID
+ PSID owner_sid = NULL;
+ if (! GetSecurityDescriptorOwner (psd, &owner_sid, &dummy))
+ {
+ __seterrno ();
+ return -1;
+ }
+ char owner_buf[MAX_SID_LEN];
+ if (!CopySid (MAX_SID_LEN, (PSID) owner_buf, owner_sid))
+ {
+ __seterrno ();
+ return -1;
+ }
+ owner_sid = (PSID) owner_buf;
+
+ // Get group SID
+ PSID group_sid = NULL;
+ if (! GetSecurityDescriptorGroup (psd, &group_sid, &dummy))
+ {
+ __seterrno ();
+ return -1;
+ }
+ char group_buf[MAX_SID_LEN];
+ if (!CopySid (MAX_SID_LEN, (PSID) group_buf, group_sid))
+ {
+ __seterrno ();
+ return -1;
+ }
+ group_sid = (PSID) group_buf;
+
+ // Initialize local security descriptor
+ SECURITY_DESCRIPTOR sd;
+ if (! InitializeSecurityDescriptor (&sd, SECURITY_DESCRIPTOR_REVISION))
+ {
+ __seterrno ();
+ return -1;
+ }
+ if (! SetSecurityDescriptorOwner(&sd, owner_sid, FALSE))
+ {
+ __seterrno ();
+ return -1;
+ }
+ if (group_sid
+ && ! SetSecurityDescriptorGroup(&sd, group_sid, FALSE))
+ {
+ __seterrno ();
+ return -1;
+ }
+
+ // Fill access control list
+ char acl_buf[3072];
+ PACL acl = (PACL) acl_buf;
+ size_t acl_len = sizeof (ACL);
+ int ace_off = 0;
+
+ char sidbuf[MAX_SID_LEN];
+ PSID sid = (PSID) sidbuf;
+ struct passwd *pw;
+ struct group *gr;
+ int pos;
+
+ if (! InitializeAcl (acl, 3072, ACL_REVISION))
+ {
+ __seterrno ();
+ return -1;
+ }
+ for (int i = 0; i < nentries; ++i)
+ {
+ DWORD allow = STANDARD_RIGHTS_READ
+ | FILE_READ_ATTRIBUTES | FILE_READ_EA;
+ if (aclbufp[i].a_perm & S_IROTH)
+ allow |= FILE_GENERIC_READ;
+ if (aclbufp[i].a_perm & S_IWOTH)
+ allow |= STANDARD_RIGHTS_ALL | FILE_GENERIC_WRITE
+ | DELETE | FILE_DELETE_CHILD;
+ if (aclbufp[i].a_perm & S_IXOTH)
+ allow |= FILE_GENERIC_EXECUTE;
+ // Set inherit property
+ DWORD inheritance = (aclbufp[i].a_type & ACL_DEFAULT)
+ ? INHERIT_ONLY : DONT_INHERIT;
+ // If a specific acl contains a corresponding default entry with
+ // identical permissions, only one Windows ACE with proper
+ // inheritance bits is created.
+ if (!(aclbufp[i].a_type & ACL_DEFAULT)
+ && (pos = searchace (aclbufp, nentries,
+ aclbufp[i].a_type | ACL_DEFAULT,
+ (aclbufp[i].a_type & (USER|GROUP))
+ ? aclbufp[i].a_id : -1)) >= 0
+ && pos < nentries
+ && aclbufp[i].a_perm == aclbufp[pos].a_perm)
+ {
+ inheritance = INHERIT_ALL;
+ // This eliminates the corresponding default entry.
+ aclbufp[pos].a_type = 0;
+ }
+ switch (aclbufp[i].a_type)
+ {
+ case USER_OBJ:
+ case DEF_USER_OBJ:
+ allow |= STANDARD_RIGHTS_ALL & ~DELETE;
+ if (! add_access_allowed_ace (acl, ace_off++, allow,
+ owner_sid, acl_len, inheritance))
+ return -1;
+ break;
+ case USER:
+ case DEF_USER:
+ if (!(pw = getpwuid (aclbufp[i].a_id))
+ || ! get_pw_sid (sid, pw)
+ || ! add_access_allowed_ace (acl, ace_off++, allow,
+ sid, acl_len, inheritance))
+ return -1;
+ break;
+ case GROUP_OBJ:
+ case DEF_GROUP_OBJ:
+ if (! add_access_allowed_ace (acl, ace_off++, allow,
+ group_sid, acl_len, inheritance))
+ return -1;
+ break;
+ case GROUP:
+ case DEF_GROUP:
+ if (!(gr = getgrgid (aclbufp[i].a_id))
+ || ! get_gr_sid (sid, gr)
+ || ! add_access_allowed_ace (acl, ace_off++, allow,
+ sid, acl_len, inheritance))
+ return -1;
+ break;
+ case OTHER_OBJ:
+ case DEF_OTHER_OBJ:
+ if (! add_access_allowed_ace (acl, ace_off++, allow,
+ get_world_sid(), acl_len, inheritance))
+ return -1;
+ break;
+ }
+ }
+ // Set AclSize to computed value
+ acl->AclSize = acl_len;
+ debug_printf ("ACL-Size: %d", acl_len);
+ // Create DACL for local security descriptor
+ if (! SetSecurityDescriptorDacl (&sd, TRUE, acl, FALSE))
+ {
+ __seterrno ();
+ return -1;
+ }
+ // Make self relative security descriptor in psd
+ sd_size = 0;
+ MakeSelfRelativeSD (&sd, psd, &sd_size);
+ if (sd_size <= 0)
+ {
+ __seterrno ();
+ return -1;
+ }
+ if (! MakeSelfRelativeSD (&sd, psd, &sd_size))
+ {
+ __seterrno ();
+ return -1;
+ }
+ debug_printf ("Created SD-Size: %d", sd_size);
+ return WriteSD (file, psd, sd_size);
+}
+
+static void
+getace (aclent_t &acl, int type, int id, DWORD win_ace_mask, DWORD win_ace_type)
+{
+ acl.a_type = type;
+ acl.a_id = id;
+
+ if (win_ace_mask & FILE_READ_DATA)
+ if (win_ace_type == ACCESS_ALLOWED_ACE_TYPE)
+ acl.a_perm |= (acl.a_perm & S_IRGRP) ? 0 : S_IRUSR;
+ else if (win_ace_type == ACCESS_DENIED_ACE_TYPE)
+ acl.a_perm &= ~S_IRGRP;
+
+ if (win_ace_mask & FILE_WRITE_DATA)
+ if (win_ace_type == ACCESS_ALLOWED_ACE_TYPE)
+ acl.a_perm |= (acl.a_perm & S_IWGRP) ? 0 : S_IWUSR;
+ else if (win_ace_type == ACCESS_DENIED_ACE_TYPE)
+ acl.a_perm &= ~S_IWGRP;
+
+ if (win_ace_mask & FILE_EXECUTE)
+ if (win_ace_type == ACCESS_ALLOWED_ACE_TYPE)
+ acl.a_perm |= (acl.a_perm & S_IXGRP) ? 0 : S_IXUSR;
+ else if (win_ace_type == ACCESS_DENIED_ACE_TYPE)
+ acl.a_perm &= ~S_IXGRP;
+}
+
+static int
+getacl (const char *file, DWORD attr, int nentries, aclent_t *aclbufp)
+{
+ DWORD sd_size = 4096;
+ char sd_buf[4096];
+ PSECURITY_DESCRIPTOR psd = (PSECURITY_DESCRIPTOR) sd_buf;
+
+ int ret;
+ if ((ret = ReadSD (file, psd, &sd_size)) <= 0)
+ {
+ debug_printf ("ReadSD %E");
+ return ret;
+ }
+
+ PSID owner_sid;
+ PSID group_sid;
+ BOOL dummy;
+ uid_t uid;
+ gid_t gid;
+
+ if (! GetSecurityDescriptorOwner (psd, &owner_sid, &dummy))
+ {
+ debug_printf ("GetSecurityDescriptorOwner %E");
+ __seterrno ();
+ return -1;
+ }
+ uid = get_uid_from_sid (owner_sid);
+
+ if (! GetSecurityDescriptorGroup (psd, &group_sid, &dummy))
+ {
+ debug_printf ("GetSecurityDescriptorGroup %E");
+ __seterrno ();
+ return -1;
+ }
+ gid = get_gid_from_sid (group_sid);
+
+ aclent_t lacl[MAX_ACL_ENTRIES];
+ memset (&lacl, 0, MAX_ACL_ENTRIES * sizeof (aclent_t));
+ lacl[0].a_type = USER_OBJ;
+ lacl[0].a_id = uid;
+ lacl[1].a_type = GROUP_OBJ;
+ lacl[1].a_id = gid;
+ lacl[2].a_type = OTHER_OBJ;
+
+ PACL acl;
+ BOOL acl_exists;
+
+ if (! GetSecurityDescriptorDacl (psd, &acl_exists, &acl, &dummy))
+ {
+ __seterrno ();
+ debug_printf ("GetSecurityDescriptorDacl %E");
+ return -1;
+ }
+
+ int pos, i;
+
+ if (! acl_exists || ! acl)
+ {
+ for (pos = 0; pos < MIN_ACL_ENTRIES; ++pos)
+ lacl[pos].a_perm = S_IRWXU | S_IRWXG | S_IRWXO;
+ pos = nentries < MIN_ACL_ENTRIES ? nentries : MIN_ACL_ENTRIES;
+ memcpy (aclbufp, lacl, pos * sizeof (aclent_t));
+ return pos;
+ }
+
+ for (i = 0; i < acl->AceCount && (!nentries || i < nentries); ++i)
+ {
+ ACCESS_ALLOWED_ACE *ace;
+
+ if (!GetAce (acl, i, (PVOID *) &ace))
+ continue;
+
+ PSID ace_sid = (PSID) &ace->SidStart;
+ int id;
+ int type = 0;
+
+ if (EqualSid (ace_sid, owner_sid))
+ {
+ type = USER_OBJ;
+ id = uid;
+ }
+ else if (EqualSid (ace_sid, group_sid))
+ {
+ type = GROUP_OBJ;
+ id = gid;
+ }
+ else if (EqualSid (ace_sid, get_world_sid ()))
+ {
+ type = OTHER_OBJ;
+ id = 0;
+ }
+ else
+ {
+ id = get_id_from_sid (ace_sid, FALSE, &type);
+ if (type != GROUP)
+ {
+ int type2 = 0;
+ int id2 = get_id_from_sid (ace_sid, TRUE, &type2);
+ if (type2 == GROUP)
+ {
+ id = id2;
+ type = GROUP;
+ }
+ }
+ }
+ if (!type)
+ continue;
+ if (!(ace->Header.AceFlags & INHERIT_ONLY_ACE))
+ {
+ if ((pos = searchace (lacl, MAX_ACL_ENTRIES, type, id)) >= 0)
+ getace (lacl[pos], type, id, ace->Mask, ace->Header.AceType);
+ }
+ if ((ace->Header.AceFlags & INHERIT_ALL)
+ && (attr & FILE_ATTRIBUTE_DIRECTORY))
+ {
+ type |= ACL_DEFAULT;
+ if ((pos = searchace (lacl, MAX_ACL_ENTRIES, type, id)) >= 0)
+ getace (lacl[pos], type, id, ace->Mask, ace->Header.AceType);
+ }
+ }
+ if ((pos = searchace (lacl, MAX_ACL_ENTRIES, 0)) < 0)
+ pos = MAX_ACL_ENTRIES;
+ for (i = 0; i < pos; ++i)
+ {
+ lacl[i].a_perm = (lacl[i].a_perm & S_IRWXU)
+ & ~((lacl[i].a_perm & S_IRWXG) << 3);
+ lacl[i].a_perm |= (lacl[i].a_perm & S_IRWXU) >> 3
+ | (lacl[i].a_perm & S_IRWXU) >> 6;
+ }
+ if ((searchace (lacl, MAX_ACL_ENTRIES, USER) >= 0
+ || searchace (lacl, MAX_ACL_ENTRIES, GROUP) >= 0)
+ && (pos = searchace (lacl, MAX_ACL_ENTRIES, CLASS_OBJ)) >= 0)
+ {
+ lacl[pos].a_type = CLASS_OBJ;
+ lacl[pos].a_perm =
+ lacl[searchace (lacl, MAX_ACL_ENTRIES, GROUP_OBJ)].a_perm;
+ }
+ int dgpos;
+ if ((searchace (lacl, MAX_ACL_ENTRIES, DEF_USER) >= 0
+ || searchace (lacl, MAX_ACL_ENTRIES, DEF_GROUP) >= 0)
+ && (dgpos = searchace (lacl, MAX_ACL_ENTRIES, DEF_GROUP_OBJ)) >= 0
+ && (pos = searchace (lacl, MAX_ACL_ENTRIES, DEF_CLASS_OBJ)) >= 0
+ && (attr & FILE_ATTRIBUTE_DIRECTORY))
+ {
+ lacl[pos].a_type = DEF_CLASS_OBJ;
+ lacl[pos].a_perm = lacl[dgpos].a_perm;
+ }
+ if ((pos = searchace (lacl, MAX_ACL_ENTRIES, 0)) < 0)
+ pos = MAX_ACL_ENTRIES;
+ if (pos > nentries)
+ pos = nentries;
+ if (aclbufp)
+ memcpy (aclbufp, lacl, pos * sizeof (aclent_t));
+ aclsort (pos, 0, aclbufp);
+ syscall_printf ("%d = getacl (%s)", pos, file);
+ return pos;
+}
+
+int
+acl_access (const char *path, int flags)
+{
+ aclent_t acls[MAX_ACL_ENTRIES];
+ int cnt;
+
+ if ((cnt = acl (path, GETACL, MAX_ACL_ENTRIES, acls)) < 1)
+ return -1;
+
+ // Only check existance.
+ if (!(flags & (R_OK|W_OK|X_OK)))
+ return 0;
+
+ for (int i = 0; i < cnt; ++i)
+ {
+ switch (acls[i].a_type)
+ {
+ case USER_OBJ:
+ case USER:
+ if (acls[i].a_id != myself->uid)
+ {
+ // Check if user is a NT group:
+ // Take SID from passwd, search SID in group, check is_grp_member
+ char owner_sidbuf[MAX_SID_LEN];
+ PSID owner_sid = (PSID) owner_sidbuf;
+ char group_sidbuf[MAX_SID_LEN];
+ PSID group_sid = (PSID) group_sidbuf;
+ struct passwd *pw;
+ struct group *gr = NULL;
+
+ if (group_sem > 0)
+ continue;
+ ++group_sem;
+ if ((pw = getpwuid (acls[i].a_id)) != NULL
+ && get_pw_sid (owner_sid, pw))
+ {
+ while ((gr = getgrent ()))
+ if (get_gr_sid (group_sid, gr)
+ && EqualSid (owner_sid, group_sid)
+ && is_grp_member (myself->uid, gr->gr_gid))
+ break;
+ endgrent ();
+ }
+ --group_sem;
+ if (! gr)
+ continue;
+ }
+ break;
+ case GROUP_OBJ:
+ case GROUP:
+ if (acls[i].a_id != myself->gid &&
+ !is_grp_member (myself->uid, acls[i].a_id))
+ continue;
+ break;
+ case OTHER_OBJ:
+ break;
+ default:
+ continue;
+ }
+ if ((!(flags & R_OK) || (acls[i].a_perm & S_IREAD))
+ && (!(flags & W_OK) || (acls[i].a_perm & S_IWRITE))
+ && (!(flags & X_OK) || (acls[i].a_perm & S_IEXEC)))
+ return 0;
+ }
+ set_errno (EACCES);
+ return -1;
+}
+
+extern "C"
+int
+acl (const char *path, int cmd, int nentries, aclent_t *aclbufp)
+{
+ if (set_process_privileges () < 0)
+ return -1;
+
+ path_conv real_path (path);
+ if (real_path.error)
+ {
+ set_errno (real_path.error);
+ syscall_printf ("-1 = acl (%s)", path);
+ return -1;
+ }
+ if (!real_path.has_acls ())
+ {
+ struct stat st;
+ int ret = -1;
+
+ switch (cmd)
+ {
+ case SETACL:
+ set_errno (ENOSYS);
+ break;
+ case GETACL:
+ if (nentries < 1)
+ set_errno (EINVAL);
+ else if (! stat (path, &st))
+ {
+ aclent_t lacl[4];
+ if (nentries > 0)
+ {
+ lacl[0].a_type = USER_OBJ;
+ lacl[0].a_id = st.st_uid;
+ lacl[0].a_perm = (st.st_mode & S_IRWXU)
+ | (st.st_mode & S_IRWXU) >> 3
+ | (st.st_mode & S_IRWXU) >> 6;
+ }
+ if (nentries > 1)
+ {
+ lacl[1].a_type = GROUP_OBJ;
+ lacl[1].a_id = st.st_gid;
+ lacl[1].a_perm = (st.st_mode & S_IRWXG)
+ | (st.st_mode & S_IRWXG) << 3
+ | (st.st_mode & S_IRWXG) >> 3;
+ }
+ if (nentries > 2)
+ {
+ lacl[2].a_type = OTHER_OBJ;
+ lacl[2].a_id = 0;
+ lacl[2].a_perm = (st.st_mode & S_IRWXO)
+ | (st.st_mode & S_IRWXO) << 6
+ | (st.st_mode & S_IRWXO) << 3;
+ }
+ if (nentries > 3)
+ {
+ lacl[3].a_type = CLASS_OBJ;
+ lacl[3].a_id = 0;
+ lacl[3].a_perm = (st.st_mode & S_IRWXG)
+ | (st.st_mode & S_IRWXG) << 3
+ | (st.st_mode & S_IRWXG) >> 3;
+ }
+ if (nentries > 4)
+ nentries = 4;
+ if (aclbufp)
+ memcpy (aclbufp, lacl, nentries * sizeof (aclent_t));
+ ret = nentries;
+ }
+ break;
+ case GETACLCNT:
+ ret = 4;
+ break;
+ }
+ syscall_printf ("%d = acl (%s)", ret, path);
+ return ret;
+ }
+ switch (cmd)
+ {
+ case SETACL:
+ if (!aclsort(nentries, 0, aclbufp))
+ return setacl (real_path.get_win32 (),
+ nentries, aclbufp);
+ break;
+ case GETACL:
+ if (nentries < 1)
+ break;
+ return getacl (real_path.get_win32 (),
+ real_path.file_attributes (),
+ nentries, aclbufp);
+ case GETACLCNT:
+ return getacl (real_path.get_win32 (),
+ real_path.file_attributes (),
+ 0, NULL);
+ default:
+ break;
+ }
+ set_errno (EINVAL);
+ syscall_printf ("-1 = acl (%s)", path);
+ return -1;
+}
+
+extern "C"
+int
+facl (int fd, int cmd, int nentries, aclent_t *aclbufp)
+{
+ if (dtable.not_open (fd))
+ {
+ syscall_printf ("-1 = facl (%d)", fd);
+ set_errno (EBADF);
+ return -1;
+ }
+ const char *path = dtable[fd]->get_name ();
+ if (path == NULL)
+ {
+ syscall_printf ("-1 = facl (%d) (no name)", fd);
+ set_errno (ENOSYS);
+ return -1;
+ }
+ syscall_printf ("facl (%d): calling acl (%s)", fd, path);
+ return acl (path, cmd, nentries, aclbufp);
+}
+
+extern "C"
+int
+aclcheck (aclent_t *aclbufp, int nentries, int *which)
+{
+ BOOL has_user_obj = FALSE;
+ BOOL has_group_obj = FALSE;
+ BOOL has_other_obj = FALSE;
+ BOOL has_class_obj = FALSE;
+ BOOL has_ug_objs = FALSE;
+ BOOL has_def_user_obj = FALSE;
+ BOOL has_def_group_obj = FALSE;
+ BOOL has_def_other_obj = FALSE;
+ BOOL has_def_class_obj = FALSE;
+ BOOL has_def_ug_objs = FALSE;
+ int pos2;
+
+ for (int pos = 0; pos < nentries; ++pos)
+ switch (aclbufp[pos].a_type)
+ {
+ case USER_OBJ:
+ if (has_user_obj)
+ {
+ if (which)
+ *which = pos;
+ return USER_ERROR;
+ }
+ has_user_obj = TRUE;
+ break;
+ case GROUP_OBJ:
+ if (has_group_obj)
+ {
+ if (which)
+ *which = pos;
+ return GRP_ERROR;
+ }
+ has_group_obj = TRUE;
+ break;
+ case OTHER_OBJ:
+ if (has_other_obj)
+ {
+ if (which)
+ *which = pos;
+ return OTHER_ERROR;
+ }
+ has_other_obj = TRUE;
+ break;
+ case CLASS_OBJ:
+ if (has_class_obj)
+ {
+ if (which)
+ *which = pos;
+ return CLASS_ERROR;
+ }
+ has_class_obj = TRUE;
+ break;
+ case USER:
+ case GROUP:
+ if ((pos2 = searchace (aclbufp + pos + 1, nentries - pos - 1,
+ aclbufp[pos].a_type, aclbufp[pos].a_id)) >= 0)
+ {
+ if (which)
+ *which = pos2;
+ return DUPLICATE_ERROR;
+ }
+ has_ug_objs = TRUE;
+ break;
+ case DEF_USER_OBJ:
+ if (has_def_user_obj)
+ {
+ if (which)
+ *which = pos;
+ return USER_ERROR;
+ }
+ has_def_user_obj = TRUE;
+ break;
+ case DEF_GROUP_OBJ:
+ if (has_def_group_obj)
+ {
+ if (which)
+ *which = pos;
+ return GRP_ERROR;
+ }
+ has_def_group_obj = TRUE;
+ break;
+ case DEF_OTHER_OBJ:
+ if (has_def_other_obj)
+ {
+ if (which)
+ *which = pos;
+ return OTHER_ERROR;
+ }
+ has_def_other_obj = TRUE;
+ break;
+ case DEF_CLASS_OBJ:
+ if (has_def_class_obj)
+ {
+ if (which)
+ *which = pos;
+ return CLASS_ERROR;
+ }
+ has_def_class_obj = TRUE;
+ break;
+ case DEF_USER:
+ case DEF_GROUP:
+ if ((pos2 = searchace (aclbufp + pos + 1, nentries - pos - 1,
+ aclbufp[pos].a_type, aclbufp[pos].a_id)) >= 0)
+ {
+ if (which)
+ *which = pos2;
+ return DUPLICATE_ERROR;
+ }
+ has_def_ug_objs = TRUE;
+ break;
+ default:
+ return ENTRY_ERROR;
+ }
+ if (!has_user_obj
+ || !has_group_obj
+ || !has_other_obj
+#if 0
+ // These checks are not ok yet since CLASS_OBJ isn't fully implemented.
+ || (has_ug_objs && !has_class_obj)
+ || (has_def_ug_objs && !has_def_class_obj)
+#endif
+ )
+ {
+ if (which)
+ *which = -1;
+ return MISS_ERROR;
+ }
+ return 0;
+}
+
+extern "C"
+int acecmp (const void *a1, const void *a2)
+{
+#define ace(i) ((const aclent_t *) a##i)
+ int ret = ace(1)->a_type - ace(2)->a_type;
+ if (!ret)
+ ret = ace(1)->a_id - ace(2)->a_id;
+ return ret;
+#undef ace
+}
+
+extern "C"
+int
+aclsort (int nentries, int calclass, aclent_t *aclbufp)
+{
+ if (aclcheck (aclbufp, nentries, NULL))
+ return -1;
+ if (!aclbufp || nentries < 1)
+ {
+ set_errno (EINVAL);
+ return -1;
+ }
+ qsort((void *) aclbufp, nentries, sizeof (aclent_t), acecmp);
+ return 0;
+}
+
+extern "C"
+int
+acltomode (aclent_t *aclbufp, int nentries, mode_t *modep)
+{
+ int pos;
+
+ if (!aclbufp || nentries < 1 || ! modep)
+ {
+ set_errno (EINVAL);
+ return -1;
+ }
+ *modep = 0;
+ if ((pos = searchace (aclbufp, nentries, USER_OBJ)) < 0)
+ {
+ set_errno (EINVAL);
+ return -1;
+ }
+ *modep |= aclbufp[pos].a_perm & S_IRWXU;
+ if ((pos = searchace (aclbufp, nentries, GROUP_OBJ)) < 0)
+ {
+ set_errno (EINVAL);
+ return -1;
+ }
+ if (searchace (aclbufp, nentries, CLASS_OBJ) < 0)
+ pos = searchace (aclbufp, nentries, CLASS_OBJ);
+ *modep |= (aclbufp[pos].a_perm & S_IRWXU) >> 3;
+ if ((pos = searchace (aclbufp, nentries, OTHER_OBJ)) < 0)
+ {
+ set_errno (EINVAL);
+ return -1;
+ }
+ *modep |= (aclbufp[pos].a_perm & S_IRWXU) >> 6;
+ return 0;
+}
+
+extern "C"
+int
+aclfrommode(aclent_t *aclbufp, int nentries, mode_t *modep)
+{
+ int pos;
+
+ if (!aclbufp || nentries < 1 || ! modep)
+ {
+ set_errno (EINVAL);
+ return -1;
+ }
+ if ((pos = searchace (aclbufp, nentries, USER_OBJ)) < 0)
+ {
+ set_errno (EINVAL);
+ return -1;
+ }
+ aclbufp[pos].a_perm = (*modep & S_IRWXU)
+ | (*modep & S_IRWXU) >> 3
+ | (*modep & S_IRWXU) >> 6;
+ if ((pos = searchace (aclbufp, nentries, GROUP_OBJ)) < 0)
+ {
+ set_errno (EINVAL);
+ return -1;
+ }
+ if (searchace (aclbufp, nentries, CLASS_OBJ) < 0)
+ pos = searchace (aclbufp, nentries, CLASS_OBJ);
+ aclbufp[pos].a_perm = (*modep & S_IRWXG)
+ | (*modep & S_IRWXG) << 3
+ | (*modep & S_IRWXG) >> 3;
+ if ((pos = searchace (aclbufp, nentries, OTHER_OBJ)) < 0)
+ {
+ set_errno (EINVAL);
+ return -1;
+ }
+ aclbufp[pos].a_perm = (*modep & S_IRWXO)
+ | (*modep & S_IRWXO) << 6
+ | (*modep & S_IRWXO) << 3;
+ return 0;
+}
+
+extern "C"
+int
+acltopbits (aclent_t *aclbufp, int nentries, mode_t *pbitsp)
+{
+ return acltomode (aclbufp, nentries, pbitsp);
+}
+
+extern "C"
+int
+aclfrompbits (aclent_t *aclbufp, int nentries, mode_t *pbitsp)
+{
+ return aclfrommode (aclbufp, nentries, pbitsp);
+}
+
+static char *
+permtostr (mode_t perm)
+{
+ static char pbuf[4];
+
+ pbuf[0] = (perm & S_IREAD) ? 'r' : '-';
+ pbuf[1] = (perm & S_IWRITE) ? 'w' : '-';
+ pbuf[2] = (perm & S_IEXEC) ? 'x' : '-';
+ pbuf[3] = '\0';
+ return pbuf;
+}
+
+extern "C"
+char *
+acltotext (aclent_t *aclbufp, int aclcnt)
+{
+ if (!aclbufp || aclcnt < 1 || aclcnt > MAX_ACL_ENTRIES
+ || aclcheck (aclbufp, aclcnt, NULL))
+ {
+ set_errno (EINVAL);
+ return NULL;
+ }
+ char buf[32000];
+ buf[0] = '\0';
+ BOOL first = TRUE;
+
+ for (int pos = 0; pos < aclcnt; ++pos)
+ {
+ if (!first)
+ strcat (buf, ",");
+ first = FALSE;
+ if (aclbufp[pos].a_type & ACL_DEFAULT)
+ strcat (buf, "default");
+ switch (aclbufp[pos].a_type)
+ {
+ case USER_OBJ:
+ sprintf (buf + strlen (buf), "user::%s",
+ permtostr (aclbufp[pos].a_perm));
+ break;
+ case USER:
+ sprintf (buf + strlen (buf), "user:%d:%s",
+ aclbufp[pos].a_id, permtostr (aclbufp[pos].a_perm));
+ break;
+ case GROUP_OBJ:
+ sprintf (buf + strlen (buf), "group::%s",
+ permtostr (aclbufp[pos].a_perm));
+ break;
+ case GROUP:
+ sprintf (buf + strlen (buf), "group:%d:%s",
+ aclbufp[pos].a_id, permtostr (aclbufp[pos].a_perm));
+ break;
+ case CLASS_OBJ:
+ sprintf (buf + strlen (buf), "mask::%s",
+ permtostr (aclbufp[pos].a_perm));
+ break;
+ case OTHER_OBJ:
+ sprintf (buf + strlen (buf), "other::%s",
+ permtostr (aclbufp[pos].a_perm));
+ break;
+ default:
+ set_errno (EINVAL);
+ return NULL;
+ }
+ }
+ return strdup (buf);
+}
+
+static mode_t
+permfromstr (char *perm)
+{
+ mode_t mode = 0;
+
+ if (strlen (perm) != 3)
+ return 01000;
+ if (perm[0] == 'r')
+ mode |= S_IRUSR | S_IRGRP | S_IROTH;
+ else if (perm[0] != '-')
+ return 01000;
+ if (perm[1] == 'w')
+ mode |= S_IWUSR | S_IWGRP | S_IWOTH;
+ else if (perm[1] != '-')
+ return 01000;
+ if (perm[2] == 'x')
+ mode |= S_IXUSR | S_IXGRP | S_IXOTH;
+ else if (perm[2] != '-')
+ return 01000;
+ return mode;
+}
+
+extern "C"
+aclent_t *
+aclfromtext (char *acltextp, int *aclcnt)
+{
+ if (!acltextp)
+ {
+ set_errno (EINVAL);
+ return NULL;
+ }
+ char buf[strlen (acltextp) + 1];
+ aclent_t lacl[MAX_ACL_ENTRIES];
+ memset (lacl, 0, sizeof lacl);
+ int pos = 0;
+ for (char *c = strtok (buf, ","); c; c = strtok (NULL, ","))
+ {
+ if (!strncmp (c, "default", 7))
+ {
+ lacl[pos].a_type |= ACL_DEFAULT;
+ c += 7;
+ }
+ if (!strncmp (c, "user:", 5))
+ {
+ if (c[5] == ':')
+ lacl[pos].a_type |= USER_OBJ;
+ else
+ {
+ lacl[pos].a_type |= USER;
+ c += 5;
+ if (isalpha (*c))
+ {
+ struct passwd *pw = getpwnam (c);
+ if (!pw)
+ {
+ set_errno (EINVAL);
+ return NULL;
+ }
+ lacl[pos].a_id = pw->pw_uid;
+ c = strchr (c, ':');
+ }
+ else if (isdigit (*c))
+ lacl[pos].a_id = strtol (c, &c, 10);
+ if (!c || *c != ':')
+ {
+ set_errno (EINVAL);
+ return NULL;
+ }
+ }
+ }
+ else if (!strncmp (c, "group:", 6))
+ {
+ if (c[5] == ':')
+ lacl[pos].a_type |= GROUP_OBJ;
+ else
+ {
+ lacl[pos].a_type |= GROUP;
+ c += 5;
+ if (isalpha (*c))
+ {
+ struct group *gr = getgrnam (c);
+ if (!gr)
+ {
+ set_errno (EINVAL);
+ return NULL;
+ }
+ lacl[pos].a_id = gr->gr_gid;
+ c = strchr (c, ':');
+ }
+ else if (isdigit (*c))
+ lacl[pos].a_id = strtol (c, &c, 10);
+ if (!c || *c != ':')
+ {
+ set_errno (EINVAL);
+ return NULL;
+ }
+ }
+ }
+ else if (!strncmp (c, "mask:", 5))
+ {
+ if (c[5] == ':')
+ lacl[pos].a_type |= CLASS_OBJ;
+ else
+ {
+ set_errno (EINVAL);
+ return NULL;
+ }
+ }
+ else if (!strncmp (c, "other:", 6))
+ {
+ if (c[5] == ':')
+ lacl[pos].a_type |= OTHER_OBJ;
+ else
+ {
+ set_errno (EINVAL);
+ return NULL;
+ }
+ }
+ if ((lacl[pos].a_perm = permfromstr (c)) == 01000)
+ {
+ set_errno (EINVAL);
+ return NULL;
+ }
+ ++pos;
+ }
+ aclent_t *aclp = (aclent_t *) malloc (pos * sizeof (aclent_t));
+ if (aclp)
+ memcpy (aclp, lacl, pos * sizeof (aclent_t));
+ return aclp;
+}
+
diff --git a/winsup/cygwin/select.cc b/winsup/cygwin/select.cc
new file mode 100644
index 000000000..84518e1b2
--- /dev/null
+++ b/winsup/cygwin/select.cc
@@ -0,0 +1,1380 @@
+/* select.cc
+
+ Copyright 1996, 1997, 1998, 1999, 2000 Cygnus Solutions.
+
+ Written by Christopher Faylor of Cygnus Solutions
+ cgf@cygnus.com
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+/*
+ * The following line means that the BSD socket
+ * definitions for fd_set, FD_ISSET etc. are used in this
+ * file.
+ */
+
+#define __INSIDE_CYGWIN_NET__
+#define Win32_Winsock
+
+#include <errno.h>
+#include <sys/socket.h>
+#include <stdlib.h>
+#include <sys/time.h>
+
+#include "winsup.h"
+#include <netdb.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <winsock.h>
+#include "select.h"
+
+/*
+ * All these defines below should be in sys/types.h
+ * but because of the includes above, they may not have
+ * been included. We create special UNIX_xxxx versions here.
+ */
+
+#ifndef NBBY
+#define NBBY 8 /* number of bits in a byte */
+#endif /* NBBY */
+
+/*
+ * Select uses bit masks of file descriptors in longs.
+ * These macros manipulate such bit fields (the filesystem macros use chars).
+ * FD_SETSIZE may be defined by the user, but the default here
+ * should be >= NOFILE (param.h).
+ */
+
+typedef long fd_mask;
+#define UNIX_NFDBITS (sizeof (fd_mask) * NBBY) /* bits per mask */
+#ifndef unix_howmany
+#define unix_howmany(x,y) (((x)+((y)-1))/(y))
+#endif
+
+#define unix_fd_set fd_set
+
+#define NULL_fd_set ((fd_set *)NULL)
+#define sizeof_fd_set(n) \
+ ((unsigned) (NULL_fd_set->fds_bits + unix_howmany((n), UNIX_NFDBITS)))
+#define UNIX_FD_SET(n, p) \
+ ((p)->fds_bits[(n)/UNIX_NFDBITS] |= (1L << ((n) % UNIX_NFDBITS)))
+#define UNIX_FD_CLR(n, p) \
+ ((p)->fds_bits[(n)/UNIX_NFDBITS] &= ~(1L << ((n) % UNIX_NFDBITS)))
+#define UNIX_FD_ISSET(n, p) \
+ ((p)->fds_bits[(n)/UNIX_NFDBITS] & (1L << ((n) % UNIX_NFDBITS)))
+#define UNIX_FD_ZERO(p, n) \
+ bzero ((caddr_t)(p), sizeof_fd_set ((n)))
+
+#define allocfd_set(n) ((fd_set *) alloca (sizeof_fd_set (n)))
+#define copyfd_set(to, from, n) memcpy (to, from, sizeof_fd_set (n));
+
+/* Make a fhandler_foo::ready_for_ready method.
+ Assumption: The "ready_for_read" methods are called with one level of
+ signal blocking. */
+#define MAKEready(what) \
+int \
+fhandler_##what::ready_for_read (int fd, DWORD howlong, int ignra) \
+{ \
+ select_record me (this); \
+ me.fd = fd; \
+ (void) select_read (&me); \
+ while (!peek_##what (&me, ignra) && howlong == INFINITE) \
+ if (fd >= 0 && dtable.not_open (fd)) \
+ break; \
+ else if (WaitForSingleObject (signal_arrived, 10) == WAIT_OBJECT_0) \
+ break; \
+ return me.read_ready; \
+}
+
+#define set_handle_or_return_if_not_open(h, s) \
+ h = (s)->fh->get_handle (); \
+ if (dtable.not_open ((s)->fd)) \
+ { \
+ (s)->saw_error = TRUE; \
+ set_errno (EBADF); \
+ return -1; \
+ } \
+
+/* The main select code.
+ */
+extern "C"
+int
+cygwin_select (int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
+ struct timeval *to)
+{
+ select_stuff sel;
+ fd_set *dummy_readfds = allocfd_set (n);
+ fd_set *dummy_writefds = allocfd_set (n);
+ fd_set *dummy_exceptfds = allocfd_set (n);
+
+#if 0
+ if (n > FD_SETSIZE)
+ {
+ set_errno (EINVAL);
+ return -1;
+ }
+#endif
+
+ select_printf ("%d, %p, %p, %p, %p", n, readfds, writefds, exceptfds, to);
+
+ memset (&sel, 0, sizeof (sel));
+ if (!readfds)
+ {
+ UNIX_FD_ZERO (dummy_readfds, n);
+ readfds = dummy_readfds;
+ }
+ if (!writefds)
+ {
+ UNIX_FD_ZERO (dummy_writefds, n);
+ writefds = dummy_writefds;
+ }
+ if (!exceptfds)
+ {
+ UNIX_FD_ZERO (dummy_exceptfds, n);
+ exceptfds = dummy_exceptfds;
+ }
+
+ for (int i = 0; i < n; i++)
+ if (!sel.test_and_set (i, readfds, writefds, exceptfds))
+ {
+ select_printf ("aborting due to test_and_set error");
+ return -1; /* Invalid fd, maybe? */
+ }
+
+ /* Convert to milliseconds or INFINITE if to == NULL */
+ DWORD ms = to ? (to->tv_sec * 1000) + (to->tv_usec / 1000) : INFINITE;
+ if (ms == 0 && to->tv_usec)
+ ms = 1; /* At least 1 ms granularity */
+
+ if (to)
+ select_printf ("to->tv_sec %d, to->tv_usec %d, ms %d", to->tv_sec, to->tv_usec, ms);
+ else
+ select_printf ("to NULL, ms %x", ms);
+
+ select_printf ("sel.total %d, sel.always_ready %d", sel.total, sel.always_ready);
+
+ /* Degenerate case. No fds to wait for. Just wait. */
+ if (sel.total == 0)
+ {
+ if (WaitForSingleObject (signal_arrived, ms) == WAIT_OBJECT_0)
+ {
+ select_printf ("signal received");
+ set_sig_errno (EINTR);
+ return -1;
+ }
+ return 0;
+ }
+
+ /* If one of the selected fds is "always ready" just poll everything and return
+ the result. There is no need to wait. */
+ if (sel.always_ready || ms == 0)
+ {
+ UNIX_FD_ZERO (readfds, n);
+ UNIX_FD_ZERO (writefds, n);
+ UNIX_FD_ZERO (exceptfds, n);
+ return sel.poll (readfds, writefds, exceptfds);
+ }
+
+ /* Wait for an fd to come alive */
+ return sel.wait (readfds, writefds, exceptfds, ms);
+}
+
+/* Cleanup */
+select_stuff::~select_stuff ()
+{
+ select_record *s = &start;
+
+ select_printf ("calling cleanup routines");
+ while ((s = s->next))
+ if (s->cleanup)
+ s->cleanup (s, this);
+
+ select_record *snext = start.next;
+
+ select_printf ("deleting select records");
+ while ((s = snext))
+ {
+ snext = s->next;
+ delete s;
+ }
+}
+
+/* Add a record to the select chain */
+int
+select_stuff::test_and_set (int i, fd_set *readfds, fd_set *writefds,
+ fd_set *exceptfds)
+{
+ select_record *s = NULL;
+ if (UNIX_FD_ISSET (i, readfds) && (s = dtable.select_read (i, s)) == NULL)
+ return 0; /* error */
+ if (UNIX_FD_ISSET (i, writefds) && (s = dtable.select_write (i, s)) == NULL)
+ return 0; /* error */
+ if (UNIX_FD_ISSET (i, exceptfds) && (s = dtable.select_except (i, s)) == NULL)
+ return 0; /* error */
+ if (s == NULL)
+ return 1; /* nothing to do */
+
+ if (s->read_ready || s->write_ready || s->except_ready)
+ always_ready = TRUE;
+
+ if (s->windows_handle || s->windows_handle || s->windows_handle)
+ windows_used = TRUE;
+
+ s->next = start.next;
+ start.next = s;
+ total++;
+ return 1;
+}
+
+/* Poll every fd in the select chain. Set appropriate fd in mask. */
+int
+select_stuff::poll (fd_set *readfds, fd_set *writefds, fd_set *exceptfds)
+{
+ int n = 0;
+ select_record *s = &start;
+ while ((s = s->next))
+ n += s->poll (s, readfds, writefds, exceptfds);
+ select_printf ("returning %d", n);
+ return n;
+}
+
+/* The heart of select. Waits for an fd to do something interesting. */
+int
+select_stuff::wait (fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
+ DWORD ms)
+{
+ int wait_ret;
+ HANDLE w4[total + 1];
+ select_record *s = &start;
+ int m = 0;
+
+ w4[m++] = signal_arrived; /* Always wait for the arrival of a signal. */
+ /* Loop through the select chain, starting up anything appropriate and
+ counting the number of active fds. */
+ while ((s = s->next))
+ {
+ if (!s->startup (s, this))
+ {
+ __seterrno ();
+ return -1;
+ }
+ if (s->h == NULL)
+ continue;
+ for (int i = 1; i < m; i++)
+ if (w4[i] == s->h)
+ goto next_while;
+ w4[m++] = s->h;
+ next_while:
+ continue;
+ }
+
+ int n = m - 1;
+ DWORD start_time = GetTickCount (); /* Record the current time for later use. */
+
+ /* Allocate some fd_set structures using the number of fds as a guide. */
+ fd_set *r = allocfd_set (n);
+ fd_set *w = allocfd_set (n);
+ fd_set *e = allocfd_set (n);
+ UNIX_FD_ZERO (r, n);
+ UNIX_FD_ZERO (w, n);
+ UNIX_FD_ZERO (e, n);
+ debug_printf ("n %d, ms %u", n, ms);
+ for (;;)
+ {
+ if (!windows_used)
+ wait_ret = WaitForMultipleObjects (m, w4, FALSE, ms);
+ else
+ wait_ret = MsgWaitForMultipleObjects (m, w4, FALSE, ms, QS_ALLINPUT);
+
+ switch (wait_ret)
+ {
+ case WAIT_OBJECT_0:
+ select_printf ("signal received");
+ set_sig_errno (EINTR);
+ return -1;
+ case WAIT_FAILED:
+ select_printf ("WaitForMultipleObjects failed");
+ __seterrno ();
+ return -1;
+ case WAIT_TIMEOUT:
+ select_printf ("timed out");
+ goto out;
+ }
+
+ select_printf ("woke up. wait_ret %d. verifying", wait_ret);
+ s = &start;
+ int gotone = FALSE;
+ while ((s = s->next))
+ if (s->saw_error)
+ return -1; /* Somebody detected an error */
+ else if ((((wait_ret >= m && s->windows_handle) || s->h == w4[wait_ret])) &&
+ s->verify (s, r, w, e))
+ gotone = TRUE;
+
+ select_printf ("gotone %d", gotone);
+ if (gotone)
+ goto out;
+
+ if (ms == INFINITE)
+ {
+ select_printf ("looping");
+ continue;
+ }
+ select_printf ("recalculating ms");
+
+ DWORD now = GetTickCount ();
+ if (now > (start_time + ms))
+ {
+ select_printf ("timed out after verification");
+ goto out;
+ }
+ ms -= (now - start_time);
+ start_time = now;
+ select_printf ("ms now %u", ms);
+ }
+
+out:
+ copyfd_set (readfds, r, n);
+ copyfd_set (writefds, w, n);
+ copyfd_set (exceptfds, e, n);
+
+ return poll (readfds, writefds, exceptfds);
+}
+
+static int
+set_bits (select_record *me, fd_set *readfds, fd_set *writefds,
+ fd_set *exceptfds)
+{
+ int ready = 0;
+ select_printf ("me %p, testing fd %d (%s)", me, me->fd, me->fh->get_name ());
+ if (me->read_selected && me->read_ready)
+ {
+ UNIX_FD_SET (me->fd, readfds);
+ ready++;
+ }
+ if (me->write_selected && me->write_ready)
+ {
+ UNIX_FD_SET (me->fd, writefds);
+ ready++;
+ }
+ if (me->except_ready && me->except_ready)
+ {
+ UNIX_FD_SET (me->fd, exceptfds);
+ ready++;
+ }
+ select_printf ("ready %d", ready);
+ return ready;
+}
+
+static int
+verify_true (select_record *me, fd_set *readfds, fd_set *writefds,
+ fd_set *exceptfds)
+{
+ return 1;
+}
+
+static int
+verify_ok (select_record *me, fd_set *readfds, fd_set *writefds,
+ fd_set *exceptfds)
+{
+ return set_bits (me, readfds, writefds, exceptfds);
+}
+
+static int
+no_startup (select_record *me, select_stuff *stuff)
+{
+ return 1;
+}
+
+static int
+no_verify (select_record *, fd_set *, fd_set *, fd_set *)
+{
+ return 0;
+}
+
+static int
+peek_pipe (select_record *s, int ignra)
+{
+ int n = 0;
+ int gotone = 0;
+ fhandler_base *fh = s->fh;
+
+ HANDLE h;
+ set_handle_or_return_if_not_open (h, s);
+
+ /* Don't perform complicated tests if we don't need to. */
+ if (!s->read_selected && !s->except_selected)
+ goto out;
+
+ if (s->read_selected && fh->bg_check (SIGTTIN) <= 0)
+ {
+ gotone = s->read_ready = 1;
+ goto out;
+ }
+
+ if (!ignra && fh->get_readahead_valid ())
+ {
+ select_printf ("readahead");
+ gotone = s->read_ready = 1;
+ goto out;
+ }
+
+ else if (!PeekNamedPipe (h, NULL, 0, NULL, (DWORD *) &n, NULL))
+ {
+ select_printf ("%s, PeekNamedPipe failed, %E", fh->get_name ());
+ n = -1;
+ }
+
+ if (n < 0)
+ {
+ select_printf ("%s, n %d", fh->get_name (), n);
+ if (s->except_selected)
+ gotone += s->except_ready = TRUE;
+ if (s->read_selected)
+ gotone += s->read_ready = TRUE;
+ }
+ if (n > 0 && s->read_selected)
+ {
+ select_printf ("%s, ready for read", fh->get_name ());
+ gotone += s->read_ready = TRUE;
+ }
+ if (!gotone && s->fh->hit_eof ())
+ {
+ select_printf ("%s, saw EOF", fh->get_name ());
+ if (s->except_selected)
+ gotone = s->except_ready = TRUE;
+ if (s->read_selected)
+ gotone += s->read_ready = TRUE;
+ }
+
+out:
+ return gotone || s->write_ready;
+}
+
+static int
+poll_pipe (select_record *me, fd_set *readfds, fd_set *writefds,
+ fd_set *exceptfds)
+{
+ return peek_pipe (me, 0) ?
+ set_bits (me, readfds, writefds, exceptfds) :
+ 0;
+}
+
+MAKEready(pipe)
+
+static int start_thread_pipe (select_record *me, select_stuff *stuff);
+
+struct pipeinf
+ {
+ HANDLE thread;
+ BOOL stop_thread_pipe;
+ select_record *start;
+ };
+
+static DWORD WINAPI
+thread_pipe (void *arg)
+{
+ pipeinf *pi = (pipeinf *)arg;
+ BOOL gotone = FALSE;
+
+ for (;;)
+ {
+ select_record *s = pi->start;
+ while ((s = s->next))
+ if (s->startup == start_thread_pipe)
+ {
+ if (peek_pipe (s, 0))
+ gotone = TRUE;
+ if (pi->stop_thread_pipe)
+ {
+ select_printf ("stopping");
+ goto out;
+ }
+ }
+ if (gotone)
+ break;
+ Sleep (10);
+ }
+out:
+ return 0;
+}
+
+static int
+start_thread_pipe (select_record *me, select_stuff *stuff)
+{
+ if (stuff->device_specific[FHDEVN(FH_PIPE)])
+ {
+ me->h = ((pipeinf *) stuff->device_specific[FHDEVN(FH_PIPE)])->thread;
+ return 1;
+ }
+ pipeinf *pi = new pipeinf;
+ pi->start = &stuff->start;
+ pi->stop_thread_pipe = FALSE;
+ pi->thread = me->h = makethread (thread_pipe, (LPVOID)pi, 0, "select_pipe");
+ if (!me->h)
+ return 0;
+ stuff->device_specific[FHDEVN(FH_PIPE)] = (void *)pi;
+ return 1;
+}
+
+static void
+pipe_cleanup (select_record *me, select_stuff *stuff)
+{
+ pipeinf *pi = (pipeinf *)stuff->device_specific[FHDEVN(FH_PIPE)];
+ if (pi && pi->thread)
+ {
+ pi->stop_thread_pipe = TRUE;
+ WaitForSingleObject (pi->thread, INFINITE);
+ CloseHandle (pi->thread);
+ delete pi;
+ stuff->device_specific[FHDEVN(FH_PIPE)] = NULL;
+ }
+}
+
+select_record *
+fhandler_pipe::select_read (select_record *s)
+{
+ if (!s)
+ s = new select_record;
+ s->startup = start_thread_pipe;
+ s->poll = poll_pipe;
+ s->verify = verify_ok;
+ s->read_selected = TRUE;
+ s->cleanup = pipe_cleanup;
+ return s;
+}
+
+select_record *
+fhandler_pipe::select_write (select_record *s)
+{
+ if (!s)
+ {
+ s = new select_record;
+ s->startup = no_startup;
+ s->poll = poll_pipe;
+ s->verify = no_verify;
+ }
+ s->write_selected = TRUE;
+ s->write_ready = TRUE;
+ return s;
+}
+
+select_record *
+fhandler_pipe::select_except (select_record *s)
+{
+ if (!s)
+ s = new select_record;
+ s->startup = start_thread_pipe;
+ s->poll = poll_pipe;
+ s->verify = verify_ok;
+ s->cleanup = pipe_cleanup;
+ s->except_selected = TRUE;
+ return s;
+}
+
+static int
+peek_console (select_record *me, int ignra)
+{
+ extern const char * get_nonascii_key (INPUT_RECORD& input_rec);
+ fhandler_console *fh = (fhandler_console *)me->fh;
+
+ if (!me->read_selected)
+ return me->write_ready;
+
+ if (!ignra && fh->get_readahead_valid ())
+ {
+ select_printf ("readahead");
+ return me->read_ready = 1;
+ }
+
+ INPUT_RECORD irec;
+ DWORD events_read;
+ HANDLE h;
+ set_handle_or_return_if_not_open (h, me);
+
+ for (;;)
+ if (fh->bg_check (SIGTTIN) <= 0)
+ return me->read_ready = 1;
+ else if (!PeekConsoleInput (h, &irec, 1, &events_read) || !events_read)
+ break;
+ else
+ {
+ if (irec.EventType == WINDOW_BUFFER_SIZE_EVENT)
+ kill_pgrp (fh->tc->getpgid (), SIGWINCH);
+ else if (irec.EventType == KEY_EVENT && irec.Event.KeyEvent.bKeyDown == TRUE &&
+ (irec.Event.KeyEvent.uChar.AsciiChar || get_nonascii_key (irec)))
+ return me->read_ready = 1;
+
+ /* Read and discard the event */
+ ReadConsoleInput (h, &irec, 1, &events_read);
+ }
+
+ return me->write_ready;
+}
+
+static int
+poll_console (select_record *me, fd_set *readfds, fd_set *writefds,
+ fd_set *exceptfds)
+{
+ return peek_console (me, 0) ?
+ set_bits (me, readfds, writefds, exceptfds) :
+ 0;
+}
+
+MAKEready (console)
+
+select_record *
+fhandler_console::select_read (select_record *s)
+{
+ if (!s)
+ {
+ s = new select_record;
+ s->startup = no_startup;
+ s->poll = poll_console;
+ s->verify = poll_console;
+ }
+
+ s->h = get_handle ();
+ s->read_selected = TRUE;
+ return s;
+}
+
+select_record *
+fhandler_console::select_write (select_record *s)
+{
+ if (!s)
+ {
+ s = new select_record;
+ s->startup = no_startup;
+ s->poll = poll_console;
+ s->verify = no_verify;
+ }
+
+ s->write_selected = TRUE;
+ s->write_ready = TRUE;
+ return s;
+}
+
+select_record *
+fhandler_console::select_except (select_record *s)
+{
+ if (!s)
+ {
+ s = new select_record;
+ s->startup = no_startup;
+ s->poll = poll_console;
+ s->verify = no_verify;
+ }
+
+ s->except_selected = TRUE;
+ return s;
+}
+
+int
+fhandler_tty_common::ready_for_read (int fd, DWORD howlong, int ignra)
+{
+#if 0
+ if (myself->pgid && get_ttyp ()->getpgid () != myself->pgid &&
+ myself->ctty == ttynum) // background process?
+ return 1; // Yes. Let read return an error
+#endif
+ return ((fhandler_pipe*)this)->fhandler_pipe::ready_for_read (fd, howlong, ignra);
+}
+
+select_record *
+fhandler_tty_common::select_read (select_record *s)
+{
+ return ((fhandler_pipe*)this)->fhandler_pipe::select_read (s);
+}
+
+select_record *
+fhandler_tty_common::select_write (select_record *s)
+{
+ return ((fhandler_pipe *)this)->fhandler_pipe::select_write (s);
+}
+
+select_record *
+fhandler_tty_common::select_except (select_record *s)
+{
+ return ((fhandler_pipe *)this)->fhandler_pipe::select_except (s);
+}
+
+select_record *
+fhandler_dev_null::select_read (select_record *s)
+{
+ if (!s)
+ {
+ s = new select_record;
+ s->startup = no_startup;
+ s->poll = set_bits;
+ s->verify = no_verify;
+ }
+ s->h = get_handle ();
+ s->read_selected = TRUE;
+ return s;
+}
+
+select_record *
+fhandler_dev_null::select_write (select_record *s)
+{
+ if (!s)
+ {
+ s = new select_record;
+ s->startup = no_startup;
+ s->poll = set_bits;
+ s->verify = no_verify;
+ }
+ s->h = get_handle ();
+ s->write_selected = TRUE;
+ return s;
+}
+
+select_record *
+fhandler_dev_null::select_except (select_record *s)
+{
+ if (!s)
+ {
+ s = new select_record;
+ s->startup = no_startup;
+ s->poll = set_bits;
+ s->verify = no_verify;
+ }
+ s->h = get_handle ();
+ s->except_selected = TRUE;
+ s->except_ready = TRUE;
+ return s;
+}
+
+static int start_thread_serial (select_record *me, select_stuff *stuff);
+
+struct serialinf
+ {
+ HANDLE thread;
+ BOOL stop_thread_serial;
+ select_record *start;
+ };
+
+static int
+peek_serial (select_record *s, int)
+{
+ DWORD ev;
+ COMSTAT st;
+
+ fhandler_serial *fh = (fhandler_serial *)s->fh;
+
+ if (fh->get_readahead_valid () || fh->overlapped_armed < 0)
+ return s->read_ready = 1;
+
+ select_printf ("fh->overlapped_armed %d", fh->overlapped_armed);
+
+ HANDLE h;
+ set_handle_or_return_if_not_open (h, s);
+ int ready = 0;
+ (void) SetCommMask (h, EV_RXCHAR);
+
+ if (!fh->overlapped_armed)
+ {
+ DWORD ev;
+ COMSTAT st;
+
+ ResetEvent (fh->io_status.hEvent);
+
+ if (!ClearCommError (h, &ev, &st))
+ {
+ debug_printf ("ClearCommError");
+ goto err;
+ }
+ else if (st.cbInQue)
+ return s->read_ready = 1;
+ else if (WaitCommEvent (h, &ev, &fh->io_status))
+ return s->read_ready = 1;
+ else if (GetLastError () == ERROR_IO_PENDING)
+ fh->overlapped_armed = 1;
+ else
+ {
+ debug_printf ("WaitCommEvent");
+ goto err;
+ }
+ }
+
+ HANDLE w4[2];
+ DWORD to;
+
+ w4[0] = fh->io_status.hEvent;
+ w4[1] = signal_arrived;
+ to = 10;
+
+ switch (WaitForMultipleObjects (2, w4, FALSE, to))
+ {
+ case WAIT_OBJECT_0:
+ if (!ClearCommError (h, &ev, &st))
+ {
+ debug_printf ("ClearCommError");
+ goto err;
+ }
+ else if (!st.cbInQue)
+ Sleep (to);
+ else
+ {
+ return s->read_ready = 1;
+ select_printf ("got something");
+ }
+ PurgeComm (h, PURGE_TXABORT | PURGE_RXABORT);
+ break;
+ case WAIT_OBJECT_0 + 1:
+ PurgeComm (h, PURGE_TXABORT | PURGE_RXABORT);
+ select_printf ("interrupt");
+ set_sig_errno (EINTR);
+ ready = -1;
+ break;
+ case WAIT_TIMEOUT:
+ PurgeComm (h, PURGE_TXABORT | PURGE_RXABORT);
+ break;
+ default:
+ PurgeComm (h, PURGE_TXABORT | PURGE_RXABORT);
+ debug_printf ("WaitForMultipleObjects");
+ goto err;
+ }
+
+ return ready;
+
+err:
+ if (GetLastError () == ERROR_OPERATION_ABORTED)
+ {
+ select_printf ("operation aborted");
+ return ready;
+ }
+
+ __seterrno ();
+ s->saw_error = TRUE;
+ select_printf ("error %E");
+ return -1;
+}
+
+static DWORD WINAPI
+thread_serial (void *arg)
+{
+ serialinf *si = (serialinf *)arg;
+ BOOL gotone= FALSE;
+
+ for (;;)
+ {
+ select_record *s = si->start;
+ while ((s = s->next))
+ if (s->startup == start_thread_serial)
+ {
+ if (peek_serial (s, 0))
+ gotone = TRUE;
+ }
+ if (si->stop_thread_serial)
+ {
+ select_printf ("stopping");
+ break;
+ }
+ if (gotone)
+ break;
+ }
+
+ select_printf ("exiting");
+ return 0;
+}
+
+static int
+start_thread_serial (select_record *me, select_stuff *stuff)
+{
+ if (stuff->device_specific[FHDEVN(FH_SERIAL)])
+ {
+ me->h = ((pipeinf *) stuff->device_specific[FHDEVN(FH_SERIAL)])->thread;
+ return 1;
+ }
+ serialinf *si = new serialinf;
+ si->start = &stuff->start;
+ si->stop_thread_serial = FALSE;
+ si->thread = me->h = makethread (thread_serial, (LPVOID)si, 0, "select_serial");
+ if (!me->h)
+ return 0;
+ stuff->device_specific[FHDEVN(FH_SERIAL)] = (void *)si;
+ return 1;
+}
+
+static void
+serial_cleanup (select_record *me, select_stuff *stuff)
+{
+ serialinf *si = (serialinf *)stuff->device_specific[FHDEVN(FH_SERIAL)];
+ if (si && si->thread)
+ {
+ si->stop_thread_serial = TRUE;
+ WaitForSingleObject (si->thread, INFINITE);
+ CloseHandle (si->thread);
+ delete si;
+ stuff->device_specific[FHDEVN(FH_SERIAL)] = NULL;
+ }
+}
+
+static int
+poll_serial (select_record *me, fd_set *readfds, fd_set *writefds,
+ fd_set *exceptfds)
+
+{
+ return peek_serial (me, 0) ?
+ set_bits (me, readfds, writefds, exceptfds) :
+ 0;
+}
+
+MAKEready (serial)
+
+select_record *
+fhandler_serial::select_read (select_record *s)
+{
+ if (!s)
+ {
+ s = new select_record;
+ s->startup = start_thread_serial;
+ s->poll = poll_serial;
+ s->verify = verify_ok;
+ s->cleanup = serial_cleanup;
+ }
+ s->read_selected = TRUE;
+ return s;
+}
+
+select_record *
+fhandler_serial::select_write (select_record *s)
+{
+ if (!s)
+ {
+ s = new select_record;
+ s->startup = no_startup;
+ s->poll = set_bits;
+ s->verify = verify_ok;
+ }
+ s->h = get_handle ();
+ s->write_selected = TRUE;
+ s->write_ready = TRUE;
+ return s;
+}
+
+select_record *
+fhandler_serial::select_except (select_record *s)
+{
+ if (!s)
+ {
+ s = new select_record;
+ s->startup = no_startup;
+ s->poll = set_bits;
+ s->verify = verify_ok;
+ }
+ s->h = NULL;
+ s->except_selected = FALSE; // Can't do this
+ return s;
+}
+
+int
+fhandler_base::ready_for_read (int, DWORD, int)
+{
+ return 1;
+}
+
+select_record *
+fhandler_base::select_read (select_record *s)
+{
+ if (!s)
+ {
+ s = new select_record;
+ s->startup = no_startup;
+ s->poll = set_bits;
+ s->verify = verify_ok;
+ }
+ s->h = get_handle ();
+ s->read_selected = TRUE;
+ s->read_ready = TRUE;
+ return s;
+}
+
+select_record *
+fhandler_base::select_write (select_record *s)
+{
+ if (!s)
+ {
+ s = new select_record;
+ s->startup = no_startup;
+ s->poll = set_bits;
+ s->verify = verify_ok;
+ }
+ s->h = get_handle ();
+ s->write_selected = TRUE;
+ s->write_ready = TRUE;
+ return s;
+}
+
+select_record *
+fhandler_base::select_except (select_record *s)
+{
+ if (!s)
+ {
+ s = new select_record;
+ s->startup = no_startup;
+ s->poll = set_bits;
+ s->verify = verify_ok;
+ }
+ s->h = NULL;
+ s->write_selected = TRUE;
+ return s;
+}
+
+struct socketinf
+ {
+ HANDLE thread;
+ winsock_fd_set readfds, writefds, exceptfds;
+ SOCKET exitsock;
+ struct sockaddr_in sin;
+ select_record *start;
+ };
+
+static int
+peek_socket (select_record *me, int)
+{
+ winsock_fd_set ws_readfds, ws_writefds, ws_exceptfds;
+ struct timeval tv = {0};
+ WINSOCK_FD_ZERO (&ws_readfds);
+ WINSOCK_FD_ZERO (&ws_writefds);
+ WINSOCK_FD_ZERO (&ws_exceptfds);
+ int gotone = 0;
+
+ HANDLE h;
+ set_handle_or_return_if_not_open (h, me);
+ select_printf ("considering handle %p", h);
+
+ if (me->read_selected)
+ {
+ select_printf ("adding read fd_set %s, fd %d", me->fh->get_name (),
+ me->fd);
+ WINSOCK_FD_SET (h, &ws_readfds);
+ }
+ if (me->write_selected)
+ {
+ select_printf ("adding write fd_set %s, fd %d", me->fh->get_name (),
+ me->fd);
+ WINSOCK_FD_SET (h, &ws_writefds);
+ }
+ if (me->except_selected)
+ {
+ select_printf ("adding except fd_set %s, fd %d", me->fh->get_name (),
+ me->fd);
+ WINSOCK_FD_SET (h, &ws_exceptfds);
+ }
+ int r = WINSOCK_SELECT (0, &ws_readfds, &ws_writefds, &ws_exceptfds, &tv);
+ select_printf ("WINSOCK_SELECT returned %d", r);
+ if (r == -1)
+ {
+ select_printf ("error %d", WSAGetLastError ());
+ return 0;
+ }
+
+ if (WINSOCK_FD_ISSET (h, &ws_readfds))
+ gotone = me->read_ready = TRUE;
+ if (WINSOCK_FD_ISSET (h, &ws_writefds))
+ gotone = me->write_ready = TRUE;
+ if (WINSOCK_FD_ISSET (h, &ws_exceptfds))
+ gotone = me->except_ready = TRUE;
+ return gotone;
+}
+
+static int
+poll_socket (select_record *me, fd_set *readfds, fd_set *writefds,
+ fd_set *exceptfds)
+{
+ return peek_socket (me, 0) ?
+ set_bits (me, readfds, writefds, exceptfds) :
+ 0;
+}
+
+MAKEready (socket)
+
+static int start_thread_socket (select_record *, select_stuff *);
+
+static DWORD WINAPI
+thread_socket (void *arg)
+{
+ socketinf *si = (socketinf *)arg;
+
+ select_printf ("stuff_start %p", &si->start);
+ int r = WINSOCK_SELECT (0, &si->readfds, &si->writefds, &si->exceptfds, NULL);
+ select_printf ("Win32 select returned %d", r);
+ if (r == -1)
+ select_printf ("error %d", WSAGetLastError ());
+ select_record *s = si->start;
+ while ((s = s->next))
+ if (s->startup == start_thread_socket)
+ {
+ HANDLE h = s->fh->get_handle ();
+ select_printf ("s %p, testing fd %d (%s)", s, s->fd, s->fh->get_name ());
+ if (WINSOCK_FD_ISSET (h, &si->readfds))
+ {
+ select_printf ("read_ready");
+ s->read_ready = TRUE;
+ }
+ if (WINSOCK_FD_ISSET (h, &si->writefds))
+ {
+ select_printf ("write_ready");
+ s->write_ready = TRUE;
+ }
+ if (WINSOCK_FD_ISSET (h, &si->exceptfds))
+ {
+ select_printf ("except_ready");
+ s->except_ready = TRUE;
+ }
+ }
+
+ if (WINSOCK_FD_ISSET (si->exitsock, &si->readfds))
+ select_printf ("saw exitsock read");
+
+ return 0;
+}
+
+extern "C" unsigned long htonl (unsigned long);
+
+static int
+start_thread_socket (select_record *me, select_stuff *stuff)
+{
+ socketinf *si;
+
+ if ((si = (socketinf *)stuff->device_specific[FHDEVN(FH_SOCKET)]))
+ {
+ me->h = si->thread;
+ return 1;
+ }
+
+ si = new socketinf;
+ WINSOCK_FD_ZERO (&si->readfds);
+ WINSOCK_FD_ZERO (&si->writefds);
+ WINSOCK_FD_ZERO (&si->exceptfds);
+ select_record *s = &stuff->start;
+ while ((s = s->next))
+ if (s->startup == start_thread_socket)
+ {
+ HANDLE h = s->fh->get_handle ();
+ select_printf ("Handle %p", h);
+ if (s->read_selected)
+ {
+ WINSOCK_FD_SET (h, &si->readfds);
+ select_printf ("Added to readfds");
+ }
+ if (s->write_selected)
+ {
+ WINSOCK_FD_SET (h, &si->writefds);
+ select_printf ("Added to writefds");
+ }
+ if (s->except_selected)
+ {
+ WINSOCK_FD_SET (h, &si->exceptfds);
+ select_printf ("Added to exceptfds");
+ }
+ }
+
+ if ((si->exitsock = socket (PF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
+ {
+ set_winsock_errno ();
+ select_printf ("cannot create socket, %E");
+ return -1;
+ }
+ /* Allow rapid reuse of the port. */
+ int tmp = 1;
+ (void) setsockopt (si->exitsock, SOL_SOCKET, SO_REUSEADDR, (char *) &tmp, sizeof (tmp));
+
+ int sin_len = sizeof(si->sin);
+ memset (&si->sin, 0, sizeof (si->sin));
+ si->sin.sin_family = AF_INET;
+ si->sin.sin_addr.s_addr = htonl (INADDR_LOOPBACK);
+ if (bind (si->exitsock, (struct sockaddr *) &si->sin, sizeof (si->sin)) < 0)
+ {
+ select_printf ("cannot bind socket, %E");
+ goto err;
+ }
+
+ if (getsockname (si->exitsock, (struct sockaddr *) &si->sin, &sin_len) < 0)
+ {
+ select_printf ("getsockname error");
+ goto err;
+ }
+
+ if (listen (si->exitsock, 1))
+ {
+ select_printf ("listen failed, %E");
+ goto err;
+ }
+
+ select_printf ("exitsock %p", si->exitsock);
+ WINSOCK_FD_SET ((HANDLE) si->exitsock, &si->readfds);
+ WINSOCK_FD_SET ((HANDLE) si->exitsock, &si->exceptfds);
+ stuff->device_specific[FHDEVN(FH_SOCKET)] = (void *) si;
+ si->start = &stuff->start;
+ select_printf ("stuff_start %p", &stuff->start);
+ si->thread = me->h = makethread (thread_socket, (LPVOID)si, 0,
+ "select_socket");
+ return !!me->h;
+
+err:
+ set_winsock_errno ();
+ closesocket (si->exitsock);
+ return -1;
+}
+
+void
+socket_cleanup (select_record *me, select_stuff *stuff)
+{
+ socketinf *si = (socketinf *)stuff->device_specific[FHDEVN(FH_SOCKET)];
+ select_printf ("si %p si->thread %p", si, si ? si->thread : NULL);
+ if (si && si->thread)
+ {
+ select_printf ("connection to si->exitsock %p", si->exitsock);
+ SOCKET s = socket (AF_INET, SOCK_STREAM, 0);
+ /* Connecting to si->exitsock will cause any executing select to wake
+ up. When this happens then the exitsock condition will cause the
+ thread to terminate. */
+ if (connect (s, (struct sockaddr *) &si->sin, sizeof (si->sin)) < 0)
+ {
+ set_winsock_errno ();
+ select_printf ("connect failed");
+ /* FIXME: now what? */
+ }
+ closesocket (s);
+
+ /* Wait for thread to go away */
+ WaitForSingleObject (si->thread, INFINITE);
+ closesocket (si->exitsock);
+ CloseHandle (si->thread);
+ stuff->device_specific[FHDEVN(FH_SOCKET)] = NULL;
+ delete si;
+ }
+ select_printf ("returning");
+}
+
+select_record *
+fhandler_socket::select_read (select_record *s)
+{
+ if (!s)
+ {
+ s = new select_record;
+ s->startup = start_thread_socket;
+ s->poll = poll_socket;
+ s->verify = verify_true;
+ s->cleanup = socket_cleanup;
+ }
+ s->read_selected = TRUE;
+ return s;
+}
+
+select_record *
+fhandler_socket::select_write (select_record *s)
+{
+ if (!s)
+ {
+ s = new select_record;
+ s->startup = start_thread_socket;
+ s->poll = poll_socket;
+ s->verify = verify_true;
+ s->cleanup = socket_cleanup;
+ }
+ s->write_selected = TRUE;
+ return s;
+}
+
+select_record *
+fhandler_socket::select_except (select_record *s)
+{
+ if (!s)
+ {
+ s = new select_record;
+ s->startup = start_thread_socket;
+ s->poll = poll_socket;
+ s->verify = verify_true;
+ s->cleanup = socket_cleanup;
+ }
+ s->except_selected = TRUE;
+ return s;
+}
+
+static int
+peek_windows (select_record *me, int)
+{
+ MSG m;
+ HANDLE h;
+ set_handle_or_return_if_not_open (h, me);
+ if (PeekMessage (&m, (HWND) h, 0, 0, PM_NOREMOVE))
+ {
+ me->read_ready = TRUE;
+ select_printf ("window %d(%p) ready", me->fd, me->fh->get_handle ());
+ return 1;
+ }
+
+ select_printf ("window %d(%p) not ready", me->fd, me->fh->get_handle ());
+ return me->write_ready;
+}
+
+static int
+poll_windows (select_record *me, fd_set *readfds, fd_set *writefds,
+ fd_set *exceptfds)
+{
+
+ return peek_windows (me, 0) ?
+ set_bits (me, readfds, writefds, exceptfds) :
+ 0;
+}
+
+MAKEready (windows)
+
+select_record *
+fhandler_windows::select_read (select_record *s)
+{
+ if (!s)
+ {
+ s = new select_record;
+ s->startup = no_startup;
+ s->poll = poll_windows;
+ s->verify = poll_windows;
+ }
+ s->h = get_handle ();
+ s->read_selected = TRUE;
+ s->h = get_handle ();
+ s->windows_handle = TRUE;
+ return s;
+}
+
+select_record *
+fhandler_windows::select_write (select_record *s)
+{
+ if (!s)
+ {
+ s = new select_record;
+ s->startup = no_startup;
+ s->poll = set_bits;
+ s->verify = verify_ok;
+ }
+ s->h = get_handle ();
+ s->write_selected = TRUE;
+ s->write_ready = TRUE;
+ s->windows_handle = TRUE;
+ return s;
+}
+
+select_record *
+fhandler_windows::select_except (select_record *s)
+{
+ if (!s)
+ {
+ s = new select_record;
+ s->startup = no_startup;
+ s->poll = set_bits;
+ s->verify = verify_ok;
+ }
+ s->h = get_handle ();
+ s->except_selected = TRUE;
+ s->except_ready = TRUE;
+ s->windows_handle = TRUE;
+ return s;
+}
diff --git a/winsup/cygwin/select.h b/winsup/cygwin/select.h
new file mode 100644
index 000000000..286951ebc
--- /dev/null
+++ b/winsup/cygwin/select.h
@@ -0,0 +1,56 @@
+/* select.h
+
+ Copyright 1998 Cygnus Solutions.
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+/* Winsock select() types and macros */
+
+/*
+ * Use this struct to interface to
+ * the system provided select.
+ */
+typedef struct winsock_fd_set
+{
+ unsigned int fd_count;
+ HANDLE fd_array[1024]; /* Dynamically allocated. */
+} winsock_fd_set;
+
+/*
+ * Define the Win32 winsock definitions to have a prefix WINSOCK_
+ * so we can be explicit when we are using them.
+ */
+#define WINSOCK_FD_ISSET(fd, set) __WSAFDIsSet ((SOCKET)fd, (fd_set *)set)
+#define WINSOCK_FD_SET(fd, set) do { \
+ (set)->fd_array[(set)->fd_count++]=fd;\
+} while(0)
+#define WINSOCK_FD_ZERO(set) ((set)->fd_count = 0)
+#define WINSOCK_FD_CLR(fd, set) do { \
+ u_int __i; \
+ for (__i = 0; __i < (set)->fd_count ; __i++) { \
+ if ((set)->fd_array[__i] == fd) { \
+ while (__i < (set)->fd_count-1) { \
+ (set)->fd_array[__i] = \
+ (set)->fd_array[__i+1]; \
+ __i++; \
+ } \
+ (set)->fd_count--; \
+ break; \
+ } \
+ } \
+} while(0)
+
+extern "C" int PASCAL __WSAFDIsSet(SOCKET, fd_set*);
+extern "C" int PASCAL win32_select(int, fd_set*, fd_set*, fd_set*, const struct timeval*);
+
+/*
+ * call to winsock's select() -
+ * type coercion need to appease confused prototypes
+ */
+#define WINSOCK_SELECT(nfd, rd, wr, ex, timeo) \
+ win32_select (nfd, (fd_set *)rd, (fd_set *)wr, (fd_set *)ex, timeo)
+
diff --git a/winsup/cygwin/shared.cc b/winsup/cygwin/shared.cc
new file mode 100644
index 000000000..f153cfe19
--- /dev/null
+++ b/winsup/cygwin/shared.cc
@@ -0,0 +1,287 @@
+/* shared.cc: shared data area support.
+
+ Copyright 1996, 1997, 1998, 1999, 2000 Cygnus Solutions.
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#include <unistd.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <grp.h>
+#include <pwd.h>
+#include "winsup.h"
+
+#define SHAREDVER (unsigned)(cygwin_version.api_major << 16 | \
+ cygwin_version.api_minor)
+
+shared_info NO_COPY *cygwin_shared = NULL;
+
+/* The handle of the shared data area. */
+HANDLE cygwin_shared_h = NULL;
+
+/* General purpose security attribute objects for global use. */
+SECURITY_ATTRIBUTES NO_COPY sec_none;
+SECURITY_ATTRIBUTES NO_COPY sec_none_nih;
+SECURITY_ATTRIBUTES NO_COPY sec_all;
+SECURITY_ATTRIBUTES NO_COPY sec_all_nih;
+
+char * __stdcall
+shared_name (const char *str, int num)
+{
+ static NO_COPY char buf[MAX_PATH] = {0};
+ char envbuf[6];
+
+ __small_sprintf (buf, "%s.%s.%d", cygwin_version.shared_id, str, num);
+ if (GetEnvironmentVariable("CYGWIN_TESTING", envbuf, 5))
+ strcat(buf, cygwin_version.dll_build_date);
+ return buf;
+}
+
+/* Open the shared memory map. */
+static void __stdcall
+open_shared_file_map ()
+{
+ cygwin_shared = (shared_info *) open_shared ("shared",
+ cygwin_shared_h,
+ sizeof (*cygwin_shared),
+ (void *)0xa000000);
+ ProtectHandle (cygwin_shared);
+}
+
+void * __stdcall
+open_shared (const char *name, HANDLE &shared_h, DWORD size, void *addr)
+{
+ void *shared;
+
+ if (!shared_h)
+ {
+ char *mapname;
+ if (!name)
+ mapname = NULL;
+ else
+ {
+ mapname = shared_name (name, 0);
+ shared_h = OpenFileMappingA (FILE_MAP_READ | FILE_MAP_WRITE,
+ TRUE, mapname);
+ }
+ if (!shared_h &&
+ !(shared_h = CreateFileMappingA ((HANDLE) 0xffffffff,
+ &sec_all,
+ PAGE_READWRITE,
+ 0,
+ size,
+ mapname)))
+ api_fatal ("CreateFileMappingA, %E. Terminating.");
+ }
+
+ shared = (shared_info *) MapViewOfFileEx (shared_h,
+ FILE_MAP_READ | FILE_MAP_WRITE,
+ 0, 0, 0, addr);
+
+ if (!shared)
+ {
+ /* Probably win95, so try without specifying the address. */
+ shared = (shared_info *) MapViewOfFileEx (shared_h,
+ FILE_MAP_READ|FILE_MAP_WRITE,
+ 0,0,0,0);
+ }
+
+ if (!shared)
+ api_fatal ("MapViewOfFileEx, %E. Terminating.");
+
+ debug_printf ("name %s, shared %p, h %p", name, shared, shared_h);
+
+ /* FIXME: I couldn't find anywhere in the documentation a note about
+ whether the memory is initialized to zero. The code assumes it does
+ and since this part seems to be working, we'll leave it as is. */
+ return shared;
+}
+
+void
+shared_info::initialize ()
+{
+ /* Ya, Win32 provides a way for a dll to watch when it's first loaded.
+ We may eventually want to use it but for now we have this. */
+ if (inited)
+ {
+ if (inited != SHAREDVER)
+ api_fatal ("shared region is corrupted. inited %x", inited);
+ return;
+ }
+
+ /* Initialize the mount table. */
+ mount.init ();
+
+ /* Initialize the process table. */
+ p.init ();
+
+ /* Initialize the queue of deleted files. */
+ delqueue.init ();
+
+ /* Initialize tty table. */
+ tty.init ();
+
+ /* Fetch misc. registry entries. */
+
+ reg_key reg (KEY_READ, NULL);
+
+ /* Note that reserving a huge amount of heap space does not result in
+ swapping since we are not committing it. */
+ /* FIXME: We should not be restricted to a fixed size heap no matter
+ what the fixed size is. */
+
+ heap_chunk_in_mb = reg.get_int ("heap_chunk_in_mb", 128);
+ if (heap_chunk_in_mb < 4)
+ {
+ heap_chunk_in_mb = 4;
+ reg.set_int ("heap_chunk_in_mb", heap_chunk_in_mb);
+ }
+
+ inited = SHAREDVER;
+}
+
+void __stdcall
+shared_init ()
+{
+ open_shared_file_map ();
+
+ cygwin_shared->initialize ();
+}
+
+void __stdcall
+shared_terminate ()
+{
+ if (cygwin_shared_h)
+ ForceCloseHandle (cygwin_shared_h);
+}
+
+unsigned
+shared_info::heap_chunk_size ()
+{
+ return heap_chunk_in_mb << 20;
+}
+
+/* For apps that wish to access the shared data. */
+
+shared_info *
+cygwin_getshared ()
+{
+ return cygwin_shared;
+}
+
+/*
+ * Function to return a common SECURITY_DESCRIPTOR * that
+ * allows all access.
+ */
+
+static NO_COPY SECURITY_DESCRIPTOR *null_sdp = 0;
+
+SECURITY_DESCRIPTOR *__stdcall
+get_null_sd ()
+{
+ static NO_COPY SECURITY_DESCRIPTOR sd;
+
+ if (null_sdp == 0)
+ {
+ InitializeSecurityDescriptor (&sd, SECURITY_DESCRIPTOR_REVISION);
+ SetSecurityDescriptorDacl (&sd, TRUE, 0, FALSE);
+ null_sdp = &sd;
+ }
+ return null_sdp;
+}
+
+extern PSID get_admin_sid ();
+extern PSID get_system_sid ();
+extern PSID get_creator_owner_sid ();
+
+PSECURITY_ATTRIBUTES __stdcall
+sec_user (PVOID sa_buf, PSID sid2, BOOL inherit)
+{
+ if (! sa_buf)
+ return inherit ? &sec_none_nih : &sec_none;
+
+ PSECURITY_ATTRIBUTES psa = (PSECURITY_ATTRIBUTES) sa_buf;
+ PSECURITY_DESCRIPTOR psd = (PSECURITY_DESCRIPTOR)
+ ((char *) sa_buf + sizeof (*psa));
+ PACL acl = (PACL) ((char *) sa_buf + sizeof (*psa) + sizeof (*psd));
+
+ char sid_buf[40];
+ PSID sid = (PSID) sid_buf;
+
+ if (myself->psid)
+ CopySid (40, sid, myself->psid);
+ else if (! lookup_name (getlogin (), myself->logsrv, sid))
+ return inherit ? &sec_none_nih : &sec_none;
+
+ size_t acl_len = sizeof (ACL)
+ + 4 * (sizeof (ACCESS_ALLOWED_ACE) - sizeof (DWORD))
+ + GetLengthSid (sid)
+ + GetLengthSid (get_admin_sid ())
+ + GetLengthSid (get_system_sid ())
+ + GetLengthSid (get_creator_owner_sid ());
+ if (sid2)
+ acl_len += sizeof (ACCESS_ALLOWED_ACE) - sizeof (DWORD)
+ + GetLengthSid (sid2);
+
+ if (! InitializeAcl (acl, acl_len, ACL_REVISION))
+ debug_printf("InitializeAcl %E");
+
+ if (! AddAccessAllowedAce (acl, ACL_REVISION,
+ SPECIFIC_RIGHTS_ALL | STANDARD_RIGHTS_ALL,
+ sid))
+ debug_printf("AddAccessAllowedAce(%s) %E", getlogin());
+
+ if (! AddAccessAllowedAce (acl, ACL_REVISION,
+ SPECIFIC_RIGHTS_ALL | STANDARD_RIGHTS_ALL,
+ get_admin_sid ()))
+ debug_printf("AddAccessAllowedAce(admin) %E");
+
+ if (! AddAccessAllowedAce (acl, ACL_REVISION,
+ SPECIFIC_RIGHTS_ALL | STANDARD_RIGHTS_ALL,
+ get_system_sid ()))
+ debug_printf("AddAccessAllowedAce(system) %E");
+
+ if (! AddAccessAllowedAce (acl, ACL_REVISION,
+ SPECIFIC_RIGHTS_ALL | STANDARD_RIGHTS_ALL,
+ get_creator_owner_sid ()))
+ debug_printf("AddAccessAllowedAce(creator_owner) %E");
+
+ if (sid2)
+ if (! AddAccessAllowedAce (acl, ACL_REVISION,
+ SPECIFIC_RIGHTS_ALL | STANDARD_RIGHTS_ALL,
+ sid2))
+ debug_printf("AddAccessAllowedAce(sid2) %E");
+
+ if (! InitializeSecurityDescriptor (psd,
+ SECURITY_DESCRIPTOR_REVISION))
+ debug_printf("InitializeSecurityDescriptor %E");
+
+/*
+ * Setting the owner lets the created security attribute not work
+ * on NT4 SP3 Server. Don't know why, but the function still does
+ * what it should do also if the owner isn't set.
+*/
+#if 0
+ if (! SetSecurityDescriptorOwner (psd, sid, FALSE))
+ debug_printf("SetSecurityDescriptorOwner %E");
+#endif
+
+ if (! SetSecurityDescriptorDacl (psd, TRUE, acl, FALSE))
+ debug_printf("SetSecurityDescriptorDacl %E");
+
+ psa->nLength = sizeof (SECURITY_ATTRIBUTES);
+ psa->lpSecurityDescriptor = psd;
+ psa->bInheritHandle = inherit;
+ return psa;
+}
+
+SECURITY_ATTRIBUTES *__stdcall
+sec_user_nih (PVOID sa_buf, PSID sid2)
+{
+ return sec_user (sa_buf, sid2, FALSE);
+}
+
diff --git a/winsup/cygwin/shared.sgml b/winsup/cygwin/shared.sgml
new file mode 100644
index 000000000..f43d654e2
--- /dev/null
+++ b/winsup/cygwin/shared.sgml
@@ -0,0 +1,17 @@
+
+<sect1 id="func-cygwin-getshared">
+<title>cygwin_getshared</title>
+
+<funcsynopsis>
+<funcdef>shared_info *
+<function>cygwin_getshared</function></funcdef>
+<void>
+</funcsynopsis>
+
+<para>Returns a pointer to an internal Cygwin memory structure
+containing shared information used by cooperating cygwin processes.
+This function is intended for use only by "system" programs like
+<filename>mount</filename> and <filename>ps</filename>.
+</para>
+
+</sect1>
diff --git a/winsup/cygwin/signal.cc b/winsup/cygwin/signal.cc
new file mode 100644
index 000000000..5682b868b
--- /dev/null
+++ b/winsup/cygwin/signal.cc
@@ -0,0 +1,367 @@
+/* signal.cc
+
+ Copyright 1996, 1997, 1998, 1999, 2000 Cygnus Solutions.
+
+ Written by Steve Chamberlain of Cygnus Support, sac@cygnus.com
+ Significant changes by Sergey Okhapkin <sos@prospect.com.ru>
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#include <errno.h>
+#include "winsup.h"
+
+extern "C"
+_sig_func_ptr
+signal (int sig, _sig_func_ptr func)
+{
+ _sig_func_ptr prev;
+
+ /* check that sig is in right range */
+ if (sig < 0 || sig >= NSIG)
+ {
+ set_errno (EINVAL);
+ syscall_printf ("SIG_ERR = signal (%d, %p)", sig, func);
+ return (_sig_func_ptr) SIG_ERR;
+ }
+
+ prev = myself->getsig(sig).sa_handler;
+ myself->getsig(sig).sa_handler = func;
+ myself->getsig(sig).sa_mask = 0;
+ syscall_printf ("%p = signal (%d, %p)", prev, sig, func);
+ return prev;
+}
+
+extern "C"
+unsigned int
+sleep (unsigned int seconds)
+{
+ int res;
+ unsigned start_time;
+
+ start_time = GetTickCount ();
+
+ syscall_printf ("sleep (%d)", seconds);
+ res = WaitForSingleObject (signal_arrived, seconds * 1000);
+ if (res == WAIT_TIMEOUT)
+ {
+ syscall_printf ("0 = sleep (%d)", seconds);
+ return 0;
+ }
+ return (GetTickCount () - start_time)/1000;
+}
+
+extern "C"
+unsigned int
+usleep (unsigned int useconds)
+{
+ syscall_printf ("usleep (%d)", useconds);
+ WaitForSingleObject (signal_arrived, (useconds + 500) / 1000);
+ syscall_printf ("0 = usleep (%d)", useconds);
+ return 0;
+}
+
+extern "C"
+int
+sigprocmask (int sig, const sigset_t *set, sigset_t *oldset)
+{
+ /* check that sig is in right range */
+ if (sig < 0 || sig >= NSIG)
+ {
+ set_errno (EINVAL);
+ syscall_printf ("SIG_ERR = sigprocmask sig %d out of range", sig);
+ return -1;
+ }
+
+ /* gcc can call sigprocmask when a builtin contructor is activated.
+ This can happen prior to the setup of myself */
+ if (!user_data)
+ return 0;
+
+ if (oldset)
+ *oldset = myself->getsigmask ();
+ if (set)
+ {
+ sigset_t newmask = myself->getsigmask ();
+ switch (sig)
+ {
+ case SIG_BLOCK:
+ /* add set to current mask */
+ newmask |= *set;
+ break;
+ case SIG_UNBLOCK:
+ /* remove set from current mask */
+ newmask &= ~*set;
+ break;
+ case SIG_SETMASK:
+ /* just set it */
+ newmask = *set;
+ break;
+ default:
+ set_errno (EINVAL);
+ return -1;
+ }
+ (void) set_process_mask (newmask);
+ }
+ return 0;
+}
+
+#if 0
+/* This is called _raise because the real raise is in newlib. */
+int
+_raise (int sig)
+{
+ if (!user_data)
+ {
+ set_errno (ESRCH);
+ return -1;
+ }
+
+ return _kill (myself->pid, sig);
+}
+#endif
+
+static int
+kill_worker (pid_t pid, int sig)
+{
+ int res = 0;
+ pinfo *dest = procinfo (pid);
+ BOOL sendSIGCONT;
+
+ if (!dest)
+ {
+ set_errno (ESRCH);
+ return -1;
+ }
+
+ dest->setthread2signal(NULL);
+
+ if ((sendSIGCONT = (sig < 0)))
+ sig = -sig;
+
+#if 0
+ if (dest == myself && !sendSIGCONT)
+ dest = myself_nowait_nonmain;
+#endif
+ if (sig == 0)
+ res = proc_exists (dest) ? 0 : -1;
+ else if ((res = sig_send (dest, sig)))
+ {
+ sigproc_printf ("%d = sig_send, %E ", res);
+ res = -1;
+ }
+ else if (sendSIGCONT)
+ (void) sig_send (dest, SIGCONT);
+
+ syscall_printf ("%d = kill_worker (%d, %d)", res, pid, sig);
+ return res;
+}
+
+/* This is called _kill because the real kill is in newlib. */
+int
+_kill (pid_t pid, int sig)
+{
+ syscall_printf ("kill (%d, %d)", pid, sig);
+ /* check that sig is in right range */
+ if (sig < 0 || sig >= NSIG)
+ {
+ set_errno (EINVAL);
+ syscall_printf ("sig %d out of range", sig);
+ return -1;
+ }
+
+ /* Silently ignore stop signals from a member of orphaned process group.
+ FIXME: Why??? */
+ if (ISSTATE(myself, PID_ORPHANED) &&
+ (sig == SIGTSTP || sig == SIGTTIN || sig == SIGTTOU))
+ sig = 0;
+
+ return (pid > 0) ? kill_worker (pid, sig) : kill_pgrp (-pid, sig);
+}
+
+int
+kill_pgrp (pid_t pid, int sig)
+{
+ int res = 0;
+ int found = 0;
+ int killself = 0;
+
+ sigproc_printf ("pid %d, sig %d", pid, sig);
+
+ for (int i = 0; i < cygwin_shared->p.size (); i++)
+ {
+ pinfo *p = &cygwin_shared->p.vec[i];
+
+ if (!proc_exists (p))
+ continue;
+
+ /* Is it a process we want to kill? */
+ if (pid == 0 && (p->pgid != myself->pgid || p->ctty != myself->ctty))
+ continue;
+ if (pid > 1 && p->pgid != pid)
+ continue;
+ if (sig < 0 && NOTSTATE(p, PID_STOPPED))
+ continue;
+ sigproc_printf ("killing pid %d, pgrp %d, p->ctty %d, myself->ctty %d",
+ p->pid, p->pgid, p->ctty, myself->ctty);
+ if (p == myself)
+ killself++;
+ else if (kill_worker (p->pid, sig))
+ res = -1;
+ found++;
+ }
+
+ if (killself && kill_worker (myself->pid, sig))
+ res = -1;
+
+ if (!found)
+ {
+ set_errno (ESRCH);
+ res = -1;
+ }
+ syscall_printf ("%d = kill (%d, %d)", res, pid, sig);
+ return res;
+}
+
+extern "C"
+int
+killpg (int pgrp, int sig)
+{
+ return _kill (-pgrp, sig);
+}
+
+extern "C"
+int
+sigaction (int sig,
+ const struct sigaction *newaction,
+ struct sigaction *oldaction)
+{
+ /* check that sig is in right range */
+ if (sig < 0 || sig >= NSIG)
+ {
+ set_errno (EINVAL);
+ syscall_printf ("SIG_ERR = sigaction sig %d out of range", sig);
+ return -1;
+ }
+
+ if (oldaction)
+ *oldaction = myself->getsig(sig);
+
+ if (newaction)
+ {
+ if ((sig == SIGKILL || sig == SIGSTOP) && newaction->sa_handler != SIG_DFL)
+ {
+ set_errno (EINVAL);
+ return -1;
+ }
+ myself->getsig(sig) = *newaction;
+ if (newaction->sa_handler == SIG_IGN)
+ sig_clear (sig);
+ if (newaction->sa_handler == SIG_DFL && sig == SIGCHLD)
+ sig_clear (sig);
+ }
+
+ return 0;
+}
+
+extern "C"
+int
+sigaddset (sigset_t *set, const int sig)
+{
+ /* check that sig is in right range */
+ if (sig <= 0 || sig >= NSIG)
+ {
+ set_errno (EINVAL);
+ syscall_printf ("SIG_ERR = sigaddset sig %d out of range", sig);
+ return -1;
+ }
+
+ *set |= SIGTOMASK (sig);
+ return 0;
+}
+
+extern "C"
+int
+sigdelset (sigset_t *set, const int sig)
+{
+ /* check that sig is in right range */
+ if (sig <= 0 || sig >= NSIG)
+ {
+ set_errno (EINVAL);
+ syscall_printf ("SIG_ERR = sigdelset sig %d out of range", sig);
+ return -1;
+ }
+
+ *set &= ~SIGTOMASK (sig);
+ return 0;
+}
+
+extern "C"
+int
+sigismember (const sigset_t *set, int sig)
+{
+ /* check that sig is in right range */
+ if (sig <= 0 || sig >= NSIG)
+ {
+ set_errno (EINVAL);
+ syscall_printf ("SIG_ERR = sigdelset sig %d out of range", sig);
+ return -1;
+ }
+
+ if (*set & SIGTOMASK (sig))
+ return 1;
+ else
+ return 0;
+}
+
+extern "C"
+int
+sigemptyset (sigset_t *set)
+{
+ *set = (sigset_t) 0;
+ return 0;
+}
+
+extern "C"
+int
+sigfillset (sigset_t *set)
+{
+ *set = ~((sigset_t) 0);
+ return 0;
+}
+
+extern "C"
+int
+sigpending (sigset_t *set)
+{
+ unsigned bit;
+ *set = 0;
+ for (int sig = 1; sig < NSIG; sig++)
+ if (*myself->getsigtodo(sig) && myself->getsigmask () & (bit = SIGTOMASK (sig)))
+ *set |= bit;
+ return 0;
+}
+
+extern "C"
+int
+sigsuspend (const sigset_t *set)
+{
+ return handle_sigsuspend (*set);
+}
+
+extern "C"
+int
+sigpause (int signal_mask)
+{
+ return handle_sigsuspend ((sigset_t) signal_mask);
+}
+
+extern "C"
+int
+pause (void)
+{
+ return handle_sigsuspend (myself->getsigmask ());
+}
diff --git a/winsup/cygwin/sigproc.cc b/winsup/cygwin/sigproc.cc
new file mode 100644
index 000000000..97a0f3a35
--- /dev/null
+++ b/winsup/cygwin/sigproc.cc
@@ -0,0 +1,1345 @@
+/* sigproc.cc: inter/intra signal and sub process handler
+
+ Copyright 1997, 1998, 1999, 2000 Cygnus Solutions.
+
+ Written by Christopher Faylor <cgf@cygnus.com>
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#include <stdlib.h>
+#include <time.h>
+#include <sys/wait.h>
+#include <errno.h>
+#include <stdlib.h>
+#include "winsup.h"
+
+extern BOOL allow_ntsec;
+
+/*
+ * Convenience defines
+ */
+#define WSSC 60000 // Wait for signal completion
+#define WPSP 40000 // Wait for proc_subproc mutex
+#define WSPX 20000 // Wait for wait_sig to terminate
+#define WWSP 20000 // Wait for wait_subproc to terminate
+
+#define WAIT_SIG_PRIORITY THREAD_PRIORITY_HIGHEST
+
+#define TOTSIGS (NSIG + __SIGOFFSET)
+
+#define sip_printf(fmt, args...) sigproc_printf (fmt , ## args)
+
+#define wake_wait_subproc() SetEvent (events[0])
+
+#define no_signals_available() (!hwait_sig || !sig_loop_wait)
+
+/*
+ * Global variables
+ */
+const char *__sp_fn ;
+int __sp_ln;
+
+char NO_COPY myself_nowait_dummy[1] = {'0'};// Flag to sig_send that signal goes to
+ // current process but no wait is required
+char NO_COPY myself_nowait_nonmain_dummy[1] = {'1'};// Flag to sig_send that signal goes to
+ // current process but no wait is required
+ // if this is not the main thread.
+
+HANDLE NO_COPY signal_arrived; // Event signaled when a signal has
+ // resulted in a user-specified
+ // function call
+/*
+ * Common variables
+ */
+
+
+/* How long to wait for message/signals. Normally this is infinite.
+ * On termination, however, these are set to zero as a flag to exit.
+ */
+
+#define Static static NO_COPY
+
+Static DWORD proc_loop_wait = 500; // Wait for subprocesses to exit
+Static DWORD sig_loop_wait = 500; // Wait for signals to arrive
+
+Static HANDLE sigcatch_nonmain = NULL; // The semaphore signaled when
+ // signals are available for
+ // processing from non-main thread
+Static HANDLE sigcatch_main = NULL; // Signalled when main thread sends a
+ // signal
+Static HANDLE sigcatch_nosync = NULL; // Signal wait_sig to scan sigtodo
+ // but not to bother with any
+ // synchronization
+Static HANDLE sigcomplete_main = NULL; // Event signaled when a signal has
+ // finished processing for the main
+ // thread
+Static HANDLE sigcomplete_nonmain = NULL;// Semaphore raised for non-main
+ // threads when a signal has finished
+ // processing
+Static HANDLE hwait_sig = NULL; // Handle of wait_sig thread
+Static HANDLE hwait_subproc = NULL; // Handle of sig_subproc thread
+
+Static HANDLE wait_sig_inited = NULL; // Control synchronization of
+ // message queue startup
+Static muto *sync_proc_subproc = NULL; // Control access to
+ // subproc stuff
+
+/* Used by WaitForMultipleObjects. These are handles to child processes.
+ */
+Static HANDLE events[PSIZE + 1] = {0}; // All my children's handles++
+#define hchildren (events + 1) // Where the children handles begin
+Static pinfo *pchildren[PSIZE] = {NULL};// All my children info
+Static pinfo *zombies[PSIZE] = {NULL}; // All my deceased children info
+Static int nchildren = 0; // Number of active children
+Static int nzombies = 0; // Number of deceased children
+
+Static waitq waitq_head = {0}; // Start of queue for wait'ing threads
+Static waitq waitq_main; // Storage for main thread
+
+DWORD NO_COPY maintid = 0; // ID of the main thread
+Static DWORD sigtid = 0; // ID of the signal thread
+
+int NO_COPY pending_signals = 0; // TRUE if signals pending
+
+/* Functions
+ */
+static int __stdcall checkstate (waitq *);
+static BOOL __inline get_proc_lock (DWORD, DWORD);
+static HANDLE __stdcall getsem (pinfo *, const char *, int, int);
+static void __stdcall remove_child (int);
+static void __stdcall remove_zombie (int);
+static DWORD WINAPI wait_sig (VOID *arg);
+static int __stdcall stopped_or_terminated (waitq *, pinfo *);
+static DWORD WINAPI wait_subproc (VOID *);
+
+/* Determine if the parent process is alive.
+ */
+
+BOOL __stdcall
+my_parent_is_alive ()
+{
+ DWORD res;
+ if (!parent_alive)
+ {
+ debug_printf ("No parent_alive mutex");
+ res = FALSE;
+ }
+ else
+ for (int i = 0; i < 2; i++)
+ switch (res = WaitForSingleObject (parent_alive, 0))
+ {
+ case WAIT_OBJECT_0:
+ debug_printf ("parent dead.");
+ res = FALSE;
+ goto out;
+ case WAIT_TIMEOUT:
+ debug_printf ("parent still alive");
+ res = TRUE;
+ goto out;
+ case WAIT_FAILED:
+ DWORD werr = GetLastError ();
+ if (werr == ERROR_INVALID_HANDLE && i == 0)
+ continue;
+ system_printf ("WFSO for parent_alive(%p) failed, error %d",
+ parent_alive, werr);
+ res = FALSE;
+ goto out;
+ }
+out:
+ return res;
+}
+
+__inline static void
+wait_for_me ()
+{
+ /* See if this is the first signal call after initialization.
+ * If so, wait for notification that all initialization has completed.
+ * Then set the handle to NULL to avoid checking this again.
+ */
+ if (wait_sig_inited)
+ {
+ (void) WaitForSingleObject (wait_sig_inited, INFINITE);
+ (void) ForceCloseHandle (wait_sig_inited);
+ wait_sig_inited = NULL;
+ }
+}
+
+static BOOL __stdcall
+proc_can_be_signalled (pinfo *p)
+{
+ if (p == myself_nowait || p == myself_nowait_nonmain || p == myself)
+ {
+ wait_for_me ();
+ return 1;
+ }
+
+ return ISSTATE (p, PID_INITIALIZING) ||
+ (((p)->process_state & (PID_ACTIVE | PID_IN_USE)) ==
+ (PID_ACTIVE | PID_IN_USE));
+}
+
+/* Test to determine if a process really exists and is processing
+ * signals.
+ */
+BOOL __stdcall
+proc_exists (pinfo *p)
+{
+ HANDLE h;
+
+ if (p == NULL)
+ return FALSE;
+
+ if (p == myself || p == myself_nowait_nonmain || p == myself_nowait)
+ return TRUE;
+
+ if (p->process_state == PID_NOT_IN_USE || !p->dwProcessId)
+ return FALSE;
+
+ sip_printf ("checking for existence of pid %d, window pid %d", p->pid,
+ p->dwProcessId);
+ if (p->ppid == myself->pid && p->hProcess != NULL)
+ {
+ sip_printf ("it's mine, process_state %x", p->process_state);
+ return proc_can_be_signalled (p);
+ }
+
+ /* Note: Process is alive if OpenProcess() call fails due to permissions */
+ if (((h = OpenProcess (STANDARD_RIGHTS_REQUIRED, FALSE, p->dwProcessId))
+ != NULL) || (GetLastError () == ERROR_ACCESS_DENIED))
+ {
+ sip_printf ("it exists, %p", h);
+ if (h)
+ {
+ DWORD rc = WaitForSingleObject (h, 0);
+ CloseHandle (h);
+ if (rc == WAIT_OBJECT_0)
+ return 0;
+ }
+ return proc_can_be_signalled (p);
+ }
+
+ sip_printf ("it doesn't exist");
+ /* If the parent pid does not exist, clean this process out of the pinfo
+ * table. It must have died abnormally.
+ */
+ if ((p->pid == p->ppid) || (p->ppid == 1) || !proc_exists (procinfo (p->ppid)))
+ {
+ p->hProcess = NULL;
+ p->process_state = PID_NOT_IN_USE;
+ }
+ return FALSE;
+}
+
+/* Handle all subprocess requests
+ */
+#define vchild ((pinfo *) val)
+int __stdcall
+proc_subproc (DWORD what, DWORD val)
+{
+ int rc = 1;
+ int potential_match;
+ DWORD exitcode;
+ pinfo *child;
+ int send_sigchld = 0;
+ waitq *w;
+
+#define wval ((waitq *) val)
+
+ sip_printf ("args: %x, %d", what, val);
+
+ if (!get_proc_lock (what, val)) // Serialize access to this function
+ {
+ sip_printf ("I am not ready");
+ goto out1;
+ }
+
+ switch (what)
+ {
+ /* Add a new subprocess to the children arrays.
+ * (usually called from the main thread)
+ */
+ case PROC_ADDCHILD:
+ if (nchildren >= PSIZE - 1)
+ system_printf ("nchildren too large %d", nchildren);
+ if (WaitForSingleObject (vchild->hProcess, 0) != WAIT_TIMEOUT)
+ {
+ system_printf ("invalid process handle %p. pid %d, win pid %d",
+ vchild->hProcess, vchild->pid, vchild->dwProcessId);
+ rc = 0;
+ break;
+ }
+
+ pchildren[nchildren] = vchild;
+ hchildren[nchildren] = vchild->hProcess;
+ ProtectHandle (vchild->hProcess);
+ sip_printf ("added pid %d to wait list, slot %d, winpid %p, handle %p",
+ vchild->pid, nchildren, vchild->dwProcessId,
+ vchild->hProcess);
+
+ nchildren++;
+ wake_wait_subproc ();
+ break;
+
+ /* A child is in the stopped state. Scan wait() queue to see if anyone
+ * should be notified. (Called from wait_sig thread)
+ */
+ case PROC_CHILDSTOPPED:
+ child = myself; // Just to avoid accidental NULL dereference
+ sip_printf ("Received stopped notification");
+ goto scan_wait;
+
+ /* A child process had terminated.
+ * Possibly this is just due to an exec(). Cygwin implements an exec()
+ * as a "handoff" from one windows process to another. If child->hProcess
+ * is different from what is recorded in hchildren, then this is an exec().
+ * Otherwise this is a normal child termination event.
+ * (called from wait_subproc thread)
+ */
+ case PROC_CHILDTERMINATED:
+ rc = 0;
+ child = pchildren[val];
+ if (GetExitCodeProcess (hchildren[val], &exitcode) &&
+ hchildren[val] != child->hProcess)
+ {
+ sip_printf ("pid %d[%d], reparented old hProcess %p, new %p",
+ child->pid, val, hchildren[val], child->hProcess);
+ ForceCloseHandle1 (hchildren[val], childhProc);
+ hchildren[val] = child->hProcess; /* Filled out by child */
+ ProtectHandle1 (child->hProcess, childhProc);
+ wake_wait_subproc ();
+ break; // This was an exec()
+ }
+
+ sip_printf ("pid %d[%d] terminated, handle %p, nchildren %d, nzombies %d",
+ child->pid, val, hchildren[val], nchildren, nzombies);
+ remove_child (val); // Remove from children arrays
+ zombies[nzombies++] = child; // Add to zombie array
+ wake_wait_subproc (); // Notify wait_subproc thread that
+ // nchildren has changed.
+ child->process_state = PID_ZOMBIE;// Walking dead
+ if (!proc_loop_wait) // Don't bother if wait_subproc is
+ break; // exiting
+
+ send_sigchld = 1;
+
+ scan_wait:
+ /* Scan the linked list of wait()ing threads. If a wait's parameters
+ * match this pid, then activate it.
+ */
+ for (w = &waitq_head; w->next != NULL; w = w->next)
+ {
+ if ((potential_match = checkstate (w)) > 0)
+ sip_printf ("released waiting thread");
+ else if (potential_match < 0)
+ sip_printf ("only found non-terminated children");
+ else if (potential_match == 0) // nothing matched
+ {
+ sip_printf ("waiting thread found no children");
+ HANDLE oldw = w->next->ev;
+ w->next->ev = NULL;
+ if (!SetEvent (oldw))
+ system_printf ("couldn't wake up wait event %p, %E", oldw);
+ w->next = w->next->next;
+ }
+ if (w->next == NULL)
+ break;
+ }
+
+ sip_printf ("finished processing terminated/stopped child");
+ if (!send_sigchld)
+ break; // No need to send a SIGCHLD
+
+ /* Send a SIGCHLD to myself. */
+ sync_proc_subproc->release (); // Avoid a potential deadlock
+ rc = sig_send (NULL, SIGCHLD); // Send a SIGCHLD
+ goto out1; // Don't try to unlock. We don't have a lock.
+
+
+ /* Clear all waiting threads. Called from exceptions.cc prior to
+ * the main thread's dispatch to a signal handler function.
+ * (called from wait_sig thread)
+ */
+ case PROC_CLEARWAIT:
+ /* Clear all "wait"ing threads. */
+ sip_printf ("clear waiting threads");
+ for (w = &waitq_head; w->next != NULL; w = w->next)
+ {
+ sip_printf ("clearing waiting thread, pid %d", w->next->pid);
+ w->next->status = -1; /* flag that a signal was received */
+ if (!SetEvent (w->next->ev))
+ system_printf ("Couldn't wake up wait event, %E");
+ }
+ waitq_head.next = NULL;
+ sip_printf ("finished clearing");
+ break;
+
+ /* Handle a wait4() operation. Allocates an event for the calling
+ * thread which is signaled when the appropriate pid exits or stops.
+ * (usually called from the main thread)
+ */
+ case PROC_WAIT:
+ wval->ev = NULL; // Don't know event flag yet
+
+ if (wval->pid <= 0)
+ child = NULL; // Not looking for a specific pid
+ else if ((child = procinfo (wval->pid)) == NULL)
+ goto out; // invalid pid. flag no such child
+
+ wval->status = 0; // Don't know status yet
+
+ /* Put waitq structure at the end of a linked list. */
+ for (w = &waitq_head; w->next != NULL; w = w->next)
+ if (w->next == wval && (w->next = w->next->next) == NULL)
+ break;
+
+ wval->next = NULL; /* This will be last in the list */
+ sip_printf ("wval->pid %d, wval->options %d", wval->pid, wval->options);
+
+ /* If the first time for this thread, create a new event, otherwise
+ * reset the event.
+ */
+ if ((wval->ev = wval->thread_ev) == NULL)
+ {
+ wval->ev = wval->thread_ev = CreateEvent (&sec_none_nih, TRUE,
+ FALSE, NULL);
+ ProtectHandle (wval->ev);
+ }
+ ResetEvent (wval->ev);
+
+ /* Scan list of children to see if any have died.
+ * If so, the event flag is set so that the wait* ()
+ * process will return immediately.
+ *
+ * If no children were found and the wait option was WNOHANG,
+ * then set the pid to 0 and remove the waitq value from
+ * consideration.
+ */
+ w->next = wval; /* set at end of wait queue */
+ if ((potential_match = checkstate (w)) <= 0)
+ {
+ if (!potential_match)
+ {
+ w->next = NULL; // don't want to keep looking
+ wval->ev = NULL; // flag that there are no children
+ sip_printf ("no appropriate children, %p, %p",
+ wval->thread_ev, wval->ev);
+ }
+ else if (wval->options & WNOHANG)
+ {
+ w->next = NULL; // don't want to keep looking
+ wval->pid = 0; // didn't find a pid
+ if (!SetEvent (wval->ev)) // wake up wait4 () immediately
+ system_printf ("Couldn't wake up wait event, %E");
+ sip_printf ("WNOHANG and no terminated children, %p, %p",
+ wval->thread_ev, wval->ev);
+ }
+ }
+ if (w->next != NULL)
+ sip_printf ("wait activated %p, %p", wval->thread_ev, wval->ev);
+ else if (wval->ev != NULL)
+ sip_printf ("wait activated %p. Reaped zombie.", wval->ev);
+ else
+ sip_printf ("wait not activated %p, %p", wval->thread_ev, wval->ev);
+ break;
+ }
+
+out:
+ sync_proc_subproc->release (); // Release the lock
+out1:
+ sip_printf ("returning %d", rc);
+ return rc;
+}
+
+/* Terminate the wait_subproc thread.
+ * Called on process exit.
+ * Also called by spawn_guts to disassociate any subprocesses from this
+ * process. Subprocesses will then know to clean up after themselves and
+ * will not become zombies.
+ */
+void __stdcall
+proc_terminate (void)
+{
+ sip_printf ("nchildren %d, nzombies %d", nchildren, nzombies);
+ /* Signal processing is assumed to be blocked in this routine. */
+ if (hwait_subproc)
+ {
+ int rc;
+ proc_loop_wait = 0; // Tell wait_subproc thread to exit
+ wake_wait_subproc (); // Wake wait_subproc loop
+
+ /* Wait for wait_subproc thread to exit (but not *too* long) */
+ if ((rc = WaitForSingleObject (hwait_subproc, WWSP)) != WAIT_OBJECT_0)
+ if (rc == WAIT_TIMEOUT)
+ system_printf ("WFSO(hwait_subproc) timed out");
+ else
+ system_printf ("WFSO(hwait_subproc), rc %d, %E", rc);
+
+ HANDLE h = hwait_subproc;
+ hwait_subproc = NULL;
+ ForceCloseHandle1 (h, hwait_subproc);
+
+ sync_proc_subproc->acquire(WPSP);
+ (void) proc_subproc (PROC_CLEARWAIT, 0);
+
+ lock_pinfo_for_update (INFINITE);
+ /* Clean out zombie processes from the pid list. */
+ int i;
+ for (i = 0; i < nzombies; i++)
+ {
+ pinfo *child;
+ if ((child = zombies[i])->hProcess)
+ {
+ ForceCloseHandle1 (child->hProcess, childhProc);
+ child->hProcess = NULL;
+ }
+ child->process_state = PID_NOT_IN_USE;
+ }
+
+ /* Disassociate my subprocesses */
+ for (i = 0; i < nchildren; i++)
+ {
+ pinfo *child;
+ if ((child = pchildren[i])->process_state == PID_NOT_IN_USE)
+ continue; // Should never happen
+ if (!child->hProcess)
+ sip_printf ("%d(%d) hProcess cleared already?", child->pid,
+ child->dwProcessId);
+ else
+ {
+ ForceCloseHandle1 (child->hProcess, childhProc);
+ child->hProcess = NULL;
+ if (!proc_exists (child))
+ {
+ sip_printf ("%d(%d) doesn't exist", child->pid,
+ child->dwProcessId);
+ child->process_state = PID_NOT_IN_USE; /* a reaped child */
+ }
+ else
+ {
+ sip_printf ("%d(%d) closing active child handle", child->pid,
+ child->dwProcessId);
+ child->ppid = 1;
+ if (child->pgid == myself->pid)
+ child->process_state |= PID_ORPHANED;
+ }
+ }
+ }
+ unlock_pinfo ();
+ nchildren = nzombies = 0;
+
+ /* Attempt to close and release sync_proc_subproc in a
+ * non-raceable manner.
+ */
+ muto *m = sync_proc_subproc;
+ sync_proc_subproc = NULL;
+ delete m;
+ }
+ sip_printf ("leaving");
+}
+
+/* Clear pending signal from the sigtodo array
+ */
+void __stdcall
+sig_clear (int sig)
+{
+ (void) InterlockedExchange (myself->getsigtodo(sig), 0L);
+ return;
+}
+
+/* Force the wait_sig thread to wake up and scan the sigtodo array.
+ */
+extern "C" int __stdcall
+sig_dispatch_pending (int force)
+{
+ if (!hwait_sig)
+ return 0;
+
+ int was_pending = pending_signals;
+#ifdef DEBUGGING
+ sip_printf ("pending_signals %d", was_pending);
+#endif
+ if (!was_pending && !force)
+#ifdef DEBUGGING
+ sip_printf ("no need to wake anything up");
+#else
+ ;
+#endif
+ else
+ {
+ wait_for_me ();
+ if (ReleaseSemaphore (sigcatch_nosync, 1, NULL))
+#ifdef DEBUGGING
+ sip_printf ("woke up wait_sig");
+#else
+ ;
+#endif
+ else if (no_signals_available ())
+ /*sip_printf ("I'm going away now")*/;
+ else
+ system_printf ("%E releasing sigcatch_nosync(%p)", sigcatch_nosync);
+ }
+ return was_pending;
+}
+
+/* Message initialization. Called from dll_crt0_1
+ *
+ * This routine starts the signal handling thread. The wait_sig_inited
+ * event is used to signal that the thread is ready to handle signals.
+ * We don't wait for this during initialization but instead detect it
+ * in sig_send to gain a little concurrency.
+ */
+void __stdcall
+sigproc_init ()
+{
+ wait_sig_inited = CreateEvent (&sec_none_nih, FALSE, FALSE, NULL);
+ ProtectHandle (wait_sig_inited);
+
+ /* local event signaled when main thread has been dispatched
+ to a signal handler function. */
+ signal_arrived = CreateEvent(&sec_none_nih, TRUE, FALSE, NULL);
+
+ maintid = GetCurrentThreadId ();// For use in determining if signals
+ // should be blocked.
+
+ if (!(hwait_sig = makethread (wait_sig, NULL, 0, "sig")))
+ {
+ system_printf ("cannot create wait_sig thread, %E");
+ api_fatal ("terminating");
+ }
+
+ ProtectHandle (hwait_sig);
+
+ /* sync_proc_subproc is used by proc_subproc. It serialises
+ * access to the children and zombie arrays.
+ */
+ sync_proc_subproc = new_muto (FALSE, NULL);
+
+ /* Initialize waitq structure for main thread. A waitq structure is
+ * allocated for each thread that executes a wait to allow multiple threads
+ * to perform waits. Pre-allocate a waitq structure for the main thread.
+ */
+ waitq *w;
+ if ((w = (waitq *)waitq_storage.get ()) == NULL)
+ {
+ w = &waitq_main;
+ waitq_storage.set (w);
+ }
+ memset (w, 0, sizeof *w); // Just to be safe
+
+ sip_printf ("process/signal handling enabled(%x)", myself->process_state);
+ return;
+}
+
+/* Called on process termination to terminate signal and process threads.
+ */
+void __stdcall
+sigproc_terminate (void)
+{
+ HANDLE h = hwait_sig;
+ hwait_sig = NULL;
+
+ if (GetCurrentThreadId () == sigtid)
+ {
+ ForceCloseHandle (sigcomplete_main);
+ for (int i = 0; i < 20; i++)
+ (void) ReleaseSemaphore (sigcomplete_nonmain, 1, NULL);
+ ForceCloseHandle (sigcomplete_nonmain);
+ ForceCloseHandle (sigcatch_main);
+ ForceCloseHandle (sigcatch_nonmain);
+ ForceCloseHandle (sigcatch_nosync);
+ }
+ proc_terminate (); // Terminate process handling thread
+
+ if (!sig_loop_wait)
+ sip_printf ("sigproc_terminate: sigproc handling not active");
+ else
+ {
+ sigproc_printf ("entering");
+ sig_loop_wait = 0; // Tell wait_sig to exit when it is
+ // finished with anything it is doing
+ sig_dispatch_pending (TRUE); // wake up and die
+
+ /* If !hwait_sig, then the process probably hasn't even finished
+ * its initialization phase.
+ */
+ if (hwait_sig)
+ {
+ if (GetCurrentThreadId () != sigtid)
+ WaitForSingleObject (h, 10000);
+ ForceCloseHandle1 (h, hwait_sig);
+
+ /* Exiting thread. Cleanup. Don't set to inactive if a child has been
+ execed with the same pid. */
+ if (!myself->dwProcessId || myself->dwProcessId == GetCurrentProcessId ())
+ myself->process_state &= ~PID_ACTIVE;
+ else
+ sip_printf ("Did not clear PID_ACTIVE since %d != %d",
+ myself->dwProcessId, GetCurrentProcessId ());
+
+ /* In case of a sigsuspend */
+ SetEvent (signal_arrived);
+
+ if (GetCurrentThreadId () != sigtid)
+ {
+ ForceCloseHandle (sigcomplete_main);
+ ForceCloseHandle (sigcomplete_nonmain);
+ ForceCloseHandle (sigcatch_main);
+ ForceCloseHandle (sigcatch_nonmain);
+ ForceCloseHandle (sigcatch_nosync);
+ }
+ }
+ sip_printf ("done");
+ }
+
+ /* Set this so that subsequent tests will succeed. */
+ if (!myself->dwProcessId)
+ myself->dwProcessId = GetCurrentProcessId ();
+
+ return;
+}
+
+/* Send a signal to another process by raising its signal semaphore.
+ * If pinfo *p == NULL, send to the current process.
+ * If sending to this process, wait for notification that a signal has
+ * completed before returning.
+ */
+int __stdcall
+sig_send (pinfo *p, int sig)
+{
+ int rc = 1;
+ DWORD tid = GetCurrentThreadId ();
+ BOOL its_me;
+ HANDLE thiscatch = NULL;
+ HANDLE thiscomplete = NULL;
+ BOOL wait_for_completion;
+
+ if (p == myself_nowait_nonmain)
+ p = (tid == maintid) ? myself : myself_nowait;
+ if (!(its_me = (p == NULL || p == myself || p == myself_nowait)))
+ wait_for_completion = FALSE;
+ else
+ {
+ if (no_signals_available ())
+ goto out; // Either exiting or not yet initializing
+ wait_for_me ();
+ wait_for_completion = p != myself_nowait;
+ p = myself;
+ }
+
+ /* It is possible that the process is not yet ready to receive messages
+ * or that it has exited. Detect this.
+ */
+ if (!proc_can_be_signalled (p)) /* Is the process accepting messages? */
+ {
+ sip_printf ("invalid pid %d(%x), signal %d",
+ p->pid, p->process_state, sig);
+ set_errno (ESRCH);
+ goto out;
+ }
+
+ sip_printf ("pid %d, signal %d, its_me %d", p->pid, sig, its_me);
+
+ if (its_me)
+ {
+ if (!wait_for_completion)
+ thiscatch = sigcatch_nosync;
+ else if (tid != maintid)
+ {
+ thiscatch = sigcatch_nonmain;
+ thiscomplete = sigcomplete_nonmain;
+ }
+ else
+ {
+ thiscatch = sigcatch_main;
+ thiscomplete = sigcomplete_main;
+ ResetEvent (thiscomplete);
+ }
+ }
+ else if (!(thiscatch = getsem (p, "sigcatch", 0, 0)))
+ goto out; // Couldn't get the semaphore. getsem issued
+ // an error, if appropriate.
+
+#if WHEN_MULTI_THREAD_SIGNALS_WORK
+ signal_dispatch *sd;
+ sd = signal_dispatch_storage.get ();
+ if (sd == NULL)
+ sd = signal_dispatch_storage.create ();
+#endif
+ /* Increment the sigtodo array to signify which signal to assert.
+ */
+ (void) InterlockedIncrement (p->getsigtodo(sig));
+
+ /* Notify the process that a signal has arrived.
+ */
+ SetLastError (0);
+ if (!ReleaseSemaphore (thiscatch, 1, NULL) && (int) GetLastError () > 0)
+ {
+ /* Couldn't signal the semaphore. This probably means that the
+ * process is exiting.
+ */
+ if (!its_me)
+ ForceCloseHandle (thiscatch);
+ else
+ {
+ if (no_signals_available ())
+ sip_printf ("I'm going away now");
+ else if ((int) GetLastError () == -1)
+ rc = WaitForSingleObject (thiscomplete, 500);
+ else
+ system_printf ("error sending signal %d to pid %d, semaphore %p, %E",
+ sig, p->pid, thiscatch);
+ }
+ goto out;
+ }
+
+ /* No need to wait for signal completion unless this was a signal to
+ * this process.
+ *
+ * If it was a signal to this process, wait for a dispatched signal.
+ * Otherwise just wait for the wait_sig to signal that it has finished
+ * processing the signal.
+ */
+ if (!wait_for_completion)
+ {
+ rc = WAIT_OBJECT_0;
+ sip_printf ("Not waiting for sigcomplete. its_me %d sig %d", its_me, sig);
+ if (!its_me)
+ ForceCloseHandle (thiscatch);
+ }
+ else
+ {
+ sip_printf ("Waiting for thiscomplete %p", thiscomplete);
+
+ SetLastError (0);
+ rc = WaitForSingleObject (thiscomplete, WSSC);
+ /* Check for strangeness due to this thread being redirected by the
+ signal handler. Sometimes a WAIT_TIMEOUT will occur when the
+ thread hasn't really timed out. So, check again.
+ FIXME: This isn't foolproof. */
+ if (rc != WAIT_OBJECT_0 &&
+ WaitForSingleObject (thiscomplete, 0) == WAIT_OBJECT_0)
+ rc = WAIT_OBJECT_0;
+ }
+
+ if (rc == WAIT_OBJECT_0)
+ rc = 0; // Successful exit
+ else
+ {
+ /* It's an error unless sig_loop_wait == 0 (the process is exiting). */
+ if (!no_signals_available ())
+ system_printf ("wait for sig_complete event failed, sig %d, rc %d, %E",
+ sig, rc);
+ set_errno (ENOSYS);
+ rc = -1;
+ }
+
+out:
+ sip_printf ("returning %d from sending signal %d", rc, sig);
+ return rc;
+}
+
+/* Set pending signal from the sigtodo array
+ */
+void __stdcall
+sig_set_pending (int sig)
+{
+ (void) InterlockedIncrement (myself->getsigtodo(sig));
+ return;
+}
+
+/* Initialize the wait_subproc thread.
+ * Called from fork() or spawn() to initialize the handling of subprocesses.
+ */
+void __stdcall
+subproc_init (void)
+{
+ if (hwait_subproc)
+ return;
+
+ /* A "wakeup" handle which can be toggled to make wait_subproc reexamine
+ * the hchildren array.
+ */
+ events[0] = CreateEvent (&sec_none_nih, FALSE, FALSE, NULL);
+ if (!(hwait_subproc = makethread (wait_subproc, NULL, 0, "+proc")))
+ system_printf ("cannot create wait_subproc thread, %E");
+ ProtectHandle (events[0]);
+ ProtectHandle (hwait_subproc);
+ sip_printf ("started wait_subproc thread %p", hwait_subproc);
+}
+
+/* Initialize some of the memory block passed to child processes
+ by fork/spawn/exec. */
+
+void __stdcall
+init_child_info (DWORD chtype, child_info *ch, int pid, HANDLE subproc_ready)
+{
+ subproc_init ();
+ memset (ch, 0, sizeof *ch);
+ ch->cb = sizeof *ch;
+ ch->type = chtype;
+ ch->cygpid = pid;
+ ch->shared_h = cygwin_shared_h;
+ ch->console_h = console_shared_h;
+ ch->subproc_ready = subproc_ready;
+ if (chtype != PROC_EXEC || !parent_alive)
+ ch->parent_alive = hwait_subproc;
+ else if (parent_alive)
+ DuplicateHandle (hMainProc, parent_alive, hMainProc, &ch->parent_alive,
+ 0, 1, DUPLICATE_SAME_ACCESS);
+}
+
+/* Check the state of all of our children to see if any are stopped or
+ * terminated.
+ */
+static int __stdcall
+checkstate (waitq *w)
+{
+ int i, x, potential_match = 0;
+ pinfo *child;
+
+ sip_printf ("nchildren %d, nzombies %d", nchildren, nzombies);
+
+ /* Check already dead processes first to see if they match the criteria
+ * given in w->next.
+ */
+ for (i = 0; i < nzombies; i++)
+ if ((x = stopped_or_terminated (w, child = zombies[i])) < 0)
+ potential_match = -1;
+ else if (x > 0)
+ {
+ remove_zombie (i);
+ potential_match = 1;
+ goto out;
+ }
+
+ sip_printf ("checking alive children");
+
+ /* No dead terminated children matched. Check for stopped children. */
+ for (i = 0; i < nchildren; i++)
+ if ((x = stopped_or_terminated (w, pchildren[i])) < 0)
+ potential_match = -1;
+ else if (x > 0)
+ {
+ potential_match = 1;
+ break;
+ }
+
+out:
+ sip_printf ("returning %d", potential_match);
+ return potential_match;
+}
+
+/* Get or create a process specific semaphore used in message passing.
+ */
+static HANDLE __stdcall
+getsem (pinfo *p, const char *str, int init, int max)
+{
+ HANDLE h;
+
+ if (p != NULL)
+ {
+ if (!proc_can_be_signalled (p))
+ {
+ set_errno (ESRCH);
+ return NULL;
+ }
+ int wait = 10000;
+ sip_printf ("pid %d, ppid %d, wait %d, initializing %x", p->pid, p->ppid, wait,
+ ISSTATE (p, PID_INITIALIZING));
+ for (int i = 0; ISSTATE (p, PID_INITIALIZING) && i < wait; i++)
+ Sleep (1);
+ }
+
+ SetLastError (0);
+ if (p == NULL)
+ {
+ char sa_buf[1024];
+
+ DWORD winpid = GetCurrentProcessId ();
+ h = CreateSemaphore (allow_ntsec ? sec_user (sa_buf) : &sec_none_nih,
+ init, max, str = shared_name (str, winpid));
+ p = myself;
+ }
+ else
+ {
+ h = OpenSemaphore (SEMAPHORE_ALL_ACCESS, FALSE,
+ str = shared_name (str, p->dwProcessId));
+
+ if (h == NULL)
+ {
+ if (GetLastError () == ERROR_FILE_NOT_FOUND && !proc_exists (p))
+ set_errno (ESRCH);
+ else
+ set_errno (EPERM);
+ return NULL;
+ }
+ }
+
+ if (!h)
+ {
+ system_printf ("can't %s %s, %E", p ? "open" : "create", str);
+ set_errno (ESRCH);
+ }
+ return h;
+}
+
+/* Get the sync_proc_subproc muto to control access to
+ * children, zombie arrays.
+ * Attempt to handle case where process is exiting as we try to grab
+ * the mutex.
+ */
+static BOOL __inline
+get_proc_lock (DWORD what, DWORD val)
+{
+ Static int lastwhat = -1;
+ if (!sync_proc_subproc)
+ return FALSE;
+ if (sync_proc_subproc->acquire (WPSP))
+ {
+ lastwhat = what;
+ return TRUE;
+ }
+ if (!sync_proc_subproc)
+ return FALSE;
+ system_printf ("Couldn't aquire sync_proc_subproc for(%d,%d), %E, last %d",
+ what, val, lastwhat);
+ return TRUE;
+}
+
+/* Remove a child from pchildren/hchildren by swapping it with the
+ * last child in the list.
+ */
+static void __stdcall
+remove_child (int ci)
+{
+ sip_printf ("removing [%d], pid %d, handle %p, nchildren %d",
+ ci, pchildren[ci]->pid, hchildren[ci], nchildren);
+ if (ci < --nchildren)
+ {
+ pchildren[ci] = pchildren[nchildren];
+ hchildren[ci] = hchildren[nchildren];
+ }
+
+ return;
+}
+
+/* Remove a zombie from zombies by swapping it with the last child in the list.
+ */
+static void __stdcall
+remove_zombie (int ci)
+{
+ sip_printf ("removing %d, pid %d, nzombies %d", ci, zombies[ci]->pid,
+ nzombies);
+ if (ci < --nzombies)
+ zombies[ci] = zombies[nzombies];
+
+ return;
+}
+
+/* Check status of child process vs. waitq member.
+ *
+ * parent_w is the pointer to the parent of the waitq member in question.
+ * child is the subprocess being considered.
+ *
+ * Returns
+ * 1 if stopped or terminated child matches parent_w->next criteria
+ * -1 if a non-stopped/terminated child matches parent_w->next criteria
+ * 0 if child does not match parent_w->next criteria
+ */
+static int __stdcall
+stopped_or_terminated (waitq *parent_w, pinfo *child)
+{
+ int potential_match;
+ waitq *w = parent_w->next;
+
+ sip_printf ("considering pid %d", child->pid);
+ if (w->pid == -1)
+ potential_match = 1;
+ else if (w->pid == 0)
+ potential_match = child->pgid == myself->pgid;
+ else if (w->pid < 0)
+ potential_match = child->pgid == -w->pid;
+ else
+ potential_match = (w->pid == child->pid);
+
+ if (!potential_match)
+ return 0;
+
+ BOOL terminated;
+
+ if ((terminated = child->process_state == PID_ZOMBIE) ||
+ (w->options & WUNTRACED) && child->stopsig)
+ {
+ parent_w->next = w->next; /* successful wait. remove from wait queue */
+ w->pid = child->pid;
+
+ if (!terminated)
+ {
+ sip_printf ("stopped child");
+ w->status = (child->stopsig << 8) | 0x7f;
+ child->stopsig = 0;
+ }
+ else
+ {
+ DWORD status;
+ if (!GetExitCodeProcess (child->hProcess, &status))
+ status = 0xffff;
+ if (status & EXIT_SIGNAL)
+ w->status = (status >> 8) & 0xff; /* exited due to signal */
+ else
+ w->status = (status & 0xff) << 8; /* exited via "exit ()" */
+
+ add_rusage (&myself->rusage_children, &child->rusage_children);
+ add_rusage (&myself->rusage_children, &child->rusage_self);
+
+ if (w->rusage)
+ {
+ add_rusage ((struct rusage *) w->rusage, &child->rusage_children);
+ add_rusage ((struct rusage *) w->rusage, &child->rusage_self);
+ }
+ ForceCloseHandle1 (child->hProcess, childhProc);
+ child->hProcess = NULL;
+ child->process_state = PID_NOT_IN_USE; /* a reaped child */
+ }
+
+ if (!SetEvent (w->ev)) /* wake up wait4 () immediately */
+ system_printf ("couldn't wake up wait event %p, %E", w->ev);
+ return 1;
+ }
+
+ return -potential_match;
+}
+
+/* Process signals by waiting for a semaphore to become signaled.
+ * Then scan an in-memory array representing queued signals.
+ * Executes in a separate thread.
+ *
+ * Signals sent from this process are sent a completion signal so
+ * that returns from kill/raise do not occur until the signal has
+ * has been handled, as per POSIX.
+ */
+static DWORD WINAPI
+wait_sig (VOID *arg)
+{
+ /* Initialization */
+ (void) SetThreadPriority (hwait_sig, WAIT_SIG_PRIORITY);
+
+ /* sigcatch_nosync - semaphore incremented by sig_dispatch_pending and
+ * by foreign processes to force an examination of
+ * the sigtodo array.
+ * sigcatch_main - ditto for local main thread.
+ * sigcatch_nonmain - ditto for local non-main threads.
+ *
+ * sigcomplete_main - event used to signal main thread on signal
+ * completion
+ * sigcomplete_nonmain - semaphore signaled for non-main thread on signal
+ * completion
+ */
+ sigcatch_nosync = getsem (NULL, "sigcatch", 0, MAXLONG);
+ sigcatch_nonmain = CreateSemaphore (&sec_none_nih, 0, MAXLONG, NULL);
+ sigcatch_main = CreateSemaphore (&sec_none_nih, 0, MAXLONG, NULL);
+ sigcomplete_nonmain = CreateSemaphore (&sec_none_nih, 0, MAXLONG, NULL);
+ sigcomplete_main = CreateEvent (&sec_none_nih, TRUE, FALSE, NULL);
+ sigproc_printf ("sigcatch_nonmain %p", sigcatch_nonmain);
+
+ /* Setting dwProcessId flags that this process is now capable of receiving
+ * signals. Prior to this, dwProcessId was set to the windows pid of
+ * of the original windows process which spawned us unless this was a
+ * "toplevel" process.
+ */
+ myself->dwProcessId = GetCurrentProcessId ();
+ myself->process_state |= PID_ACTIVE;
+ myself->process_state &= ~PID_INITIALIZING;
+
+ ProtectHandle (sigcatch_nosync);
+ ProtectHandle (sigcatch_nonmain);
+ ProtectHandle (sigcatch_main);
+ ProtectHandle (sigcomplete_nonmain);
+ ProtectHandle (sigcomplete_main);
+
+ /* If we've been execed, then there is still a stub left in the previous
+ * windows process waiting to see if it's started a cygwin process or not.
+ * Signalling subproc_ready indicates that we are a cygwin process.
+ */
+ if (child_proc_info && child_proc_info->type == PROC_EXEC)
+ {
+ debug_printf ("subproc_ready %p", child_proc_info->subproc_ready);
+ if (!SetEvent (child_proc_info->subproc_ready))
+ system_printf ("SetEvent (subproc_ready) failed, %E");
+ ForceCloseHandle (child_proc_info->subproc_ready);
+ }
+
+ SetEvent (wait_sig_inited);
+ sigtid = GetCurrentThreadId ();
+
+ /* If we got something like a SIGINT while we were initializing, the
+ signal thread should be waiting for this event. This signals the
+ thread that it's ok to send the signal since the wait_sig thread
+ is now active. */
+ extern HANDLE console_handler_thread_waiter;
+ SetEvent (console_handler_thread_waiter);
+
+ HANDLE catchem[] = {sigcatch_main, sigcatch_nonmain, sigcatch_nosync};
+ sigproc_printf ("Ready. dwProcessid %d", myself->dwProcessId);
+ for (;;)
+ {
+ DWORD rc = WaitForMultipleObjects (3, catchem, FALSE, sig_loop_wait);
+
+ /* sigproc_terminate sets sig_loop_wait to zero to indicate that
+ * this thread should terminate.
+ */
+ if (rc == WAIT_TIMEOUT)
+ if (!sig_loop_wait)
+ break; // Exiting
+ else
+ continue;
+
+ if (rc == WAIT_FAILED)
+ {
+ if (sig_loop_wait != 0)
+ system_printf ("WFMO failed, %E");
+ break;
+ }
+
+ rc -= WAIT_OBJECT_0;
+ int dispatched = FALSE;
+ sip_printf ("awake");
+ /* A sigcatch semaphore has been signaled. Scan the sigtodo
+ * array looking for any unprocessed signals.
+ */
+ pending_signals = 0;
+ for (int sig = -__SIGOFFSET; sig < NSIG; sig++)
+ {
+#ifdef NOSIGQUEUE
+ if (InterlockedExchange (myself->getsigtodo(sig), 0L) > 0)
+#else
+ while (InterlockedDecrement (myself->getsigtodo(sig)) >= 0)
+#endif
+ {
+ if (sig > 0 && sig != SIGCONT && sig != SIGKILL && sig != SIGSTOP &&
+ (sigismember (& myself->getsigmask (), sig) ||
+ myself->process_state & PID_STOPPED))
+ {
+ sip_printf ("sig %d blocked", sig);
+ break;
+ }
+
+ /* Found a signal to process */
+ sip_printf ("processing signal %d", sig);
+ switch (sig)
+ {
+ case __SIGFLUSH:
+ /* just forcing the loop */
+ break;
+
+ /* Internal signal to force a flush of strace data to disk. */
+ case __SIGSTRACE:
+ // proc_strace (); // Dump cached strace_printf stuff.
+ break;
+
+ /* Signalled from a child process that it has stopped */
+ case __SIGCHILDSTOPPED:
+ sip_printf ("Received child stopped notification");
+ dispatched |= sig_handle (SIGCHLD);
+ if (proc_subproc (PROC_CHILDSTOPPED, 0))
+ dispatched |= 1;
+ break;
+
+ /* A normal UNIX signal */
+ default:
+ sip_printf ("Got signal %d", sig);
+ dispatched |= sig_handle (sig);
+ goto nextsig;
+ }
+ }
+#ifndef NOSIGQUEUE
+ /* Decremented too far. */
+ if (InterlockedIncrement (myself->getsigtodo(sig)) > 0)
+ pending_signals = 1;
+#endif
+ nextsig:
+ continue;
+ }
+
+ /* Signal completion of signal handling depending on which semaphore
+ * woke up the WaitForMultipleObjects above.
+ */
+ switch (rc)
+ {
+ case 0:
+ SetEvent (sigcomplete_main);
+ break;
+ case 1:
+ ReleaseSemaphore (sigcomplete_nonmain, 1, NULL);
+ break;
+ default:
+ /* Signal from another process. No need to synchronize. */
+ break;
+ }
+
+ if (dispatched < 0)
+ pending_signals = 1;
+ sip_printf ("looping");
+ }
+
+ sip_printf ("done");
+ return 0;
+}
+
+/* Wait for subprocesses to terminate. Executes in a separate thread. */
+static DWORD WINAPI
+wait_subproc (VOID *arg)
+{
+ sip_printf ("starting");
+ int errloop = 0;
+
+ for (;;)
+ {
+ DWORD rc = WaitForMultipleObjects (nchildren + 1, events, FALSE,
+ proc_loop_wait);
+ if (rc == WAIT_TIMEOUT)
+ if (!proc_loop_wait)
+ break; // Exiting
+ else
+ continue;
+
+ if (rc == WAIT_FAILED)
+ {
+ if (!proc_loop_wait)
+ break;
+
+ /* It's ok to get an ERROR_INVALID_HANDLE since another thread may have
+ closed a handle in the children[] array. So, we try looping a couple
+ of times to stabilize. FIXME - this is not foolproof. Probably, this
+ thread should be responsible for closing the children. */
+ if (++errloop < 10 && GetLastError () == ERROR_INVALID_HANDLE)
+ continue;
+
+ system_printf ("wait failed. nchildren %d, wait %d, %E",
+ nchildren, proc_loop_wait);
+
+ for (int i = 0; i < nchildren + 1; i++)
+ if ((rc = WaitForSingleObject (events[i], 0)) == WAIT_OBJECT_0 ||
+ rc == WAIT_TIMEOUT)
+ continue;
+ else
+ system_printf ("event[%d] %p, %E", i, events[0]);
+ break;
+ }
+
+ errloop = 0;
+ rc -= WAIT_OBJECT_0;
+ if (rc-- != 0)
+ (void)proc_subproc (PROC_CHILDTERMINATED, rc);
+ sip_printf ("looping");
+ }
+
+ ForceCloseHandle (events[0]);
+ events[0] = NULL;
+ sip_printf ("done");
+ return 0;
+}
diff --git a/winsup/cygwin/sigproc.h b/winsup/cygwin/sigproc.h
new file mode 100644
index 000000000..b1b4eafc0
--- /dev/null
+++ b/winsup/cygwin/sigproc.h
@@ -0,0 +1,66 @@
+/* sigproc.h
+
+ Copyright 1997, 1998, 2000 Cygnus Solutions.
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#define EXIT_SIGNAL 0x010000
+#define EXIT_REPARENTING 0x020000
+#define EXIT_NOCLOSEALL 0x040000
+
+enum procstuff
+{
+ PROC_ADDCHILD = 1, // add a new subprocess to list
+ PROC_CHILDSTOPPED = 2, // a child stopped
+ PROC_CHILDTERMINATED = 3, // a child died
+ PROC_CLEARWAIT = 4, // clear all waits - signal arrived
+ PROC_WAIT = 5 // setup for wait() for subproc
+};
+
+typedef struct struct_waitq
+{
+ int pid;
+ int options;
+ int status;
+ HANDLE ev;
+ void *rusage; /* pointer to potential rusage */
+ struct struct_waitq *next;
+ HANDLE thread_ev;
+} waitq;
+
+extern HANDLE signal_arrived;
+
+BOOL __stdcall my_parent_is_alive ();
+extern "C" int __stdcall sig_dispatch_pending (int force = FALSE) __asm__ ("sig_dispatch_pending");
+extern "C" void __stdcall set_process_mask (sigset_t newmask);
+int __stdcall sig_handle (int);
+void __stdcall sig_clear (int);
+void __stdcall sig_set_pending (int);
+int __stdcall handle_sigsuspend (sigset_t);
+
+void __stdcall proc_terminate ();
+void __stdcall sigproc_init ();
+void __stdcall subproc_init ();
+void __stdcall sigproc_terminate ();
+BOOL __stdcall proc_exists (pinfo *);
+int __stdcall proc_subproc (DWORD, DWORD);
+int __stdcall sig_send (pinfo *, int);
+
+extern char myself_nowait_dummy[];
+extern char myself_nowait_nonmain_dummy[];
+extern DWORD maintid;
+extern HANDLE hExeced; // Process handle of new window
+ // process created by spawn_guts()
+
+#define WAIT_SIG_EXITING (WAIT_OBJECT_0 + 1)
+
+#define allow_sig_dispatch(n) __allow_sig_dispatch (__FILE__, __LINE__, (n))
+
+#define myself_nowait ((pinfo *)myself_nowait_dummy)
+#define myself_nowait_nonmain ((pinfo *)myself_nowait_nonmain_dummy)
+#define proc_register(child) \
+ proc_subproc (PROC_ADDCHILD, (DWORD) (child))
diff --git a/winsup/cygwin/smallprint.c b/winsup/cygwin/smallprint.c
new file mode 100644
index 000000000..3bfbda2da
--- /dev/null
+++ b/winsup/cygwin/smallprint.c
@@ -0,0 +1,229 @@
+/* smallprint.c: small print routines for WIN32
+
+ Copyright 1996, 1998, 2000 Cygnus Solutions.
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#include <stdarg.h>
+#include <string.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <windows.h>
+
+int __small_sprintf (char *dst, const char *fmt,...);
+int __small_vsprintf (char *dst, const char *fmt, va_list ap);
+
+static char *
+rn (char *dst, int base, int dosign, int val, int len, int pad)
+{
+ /* longest number is 4294967295, 10 digits */
+ unsigned uval;
+ char res[10];
+ static const char str[16] = "0123456789ABCDEF";
+ int l = 0;
+
+ if (dosign && val < 0)
+ {
+ *dst++ = '-';
+ uval = -val;
+ }
+ else if (dosign > 0 && val > 0)
+ {
+ *dst++ = '+';
+ uval = val;
+ }
+ else
+ {
+ uval = val;
+ }
+
+ do
+ {
+ res[l++] = str[uval % base];
+ uval /= base;
+ }
+ while (uval);
+
+ while (len -- > l)
+ *dst++ = pad;
+
+ while (l > 0)
+ {
+ *dst++ = res[--l];
+ }
+
+ return dst;
+}
+
+int
+__small_vsprintf (char *dst, const char *fmt, va_list ap)
+{
+ char tmp[MAX_PATH + 1];
+ char *orig = dst;
+ const char *s;
+
+ while (*fmt)
+ {
+ int i, n = 0x7fff;
+ if (*fmt != '%')
+ *dst++ = *fmt++;
+ else
+ {
+ int len = 0;
+ char pad = ' ';
+ int addsign = -1;
+
+ switch (*++fmt)
+ {
+ case '+':
+ addsign = 1;
+ fmt++;
+ break;
+ case '%':
+ *dst++ = *fmt++;
+ continue;
+ }
+
+ for (;;)
+ {
+ char c = *fmt++;
+ switch (c)
+ {
+ case '0':
+ if (len == 0)
+ {
+ pad = '0';
+ continue;
+ }
+ case '1': case '2': case '3': case '4':
+ case '5': case '6': case '7': case '8': case '9':
+ len = len * 10 + (c - '0');
+ continue;
+ case 'l':
+ continue;
+ case 'c':
+ {
+ int c = va_arg (ap,int);
+ if (c > ' ' && c <= 127)
+ *dst++ = c;
+ else
+ {
+ *dst++ = '0';
+ *dst++ = 'x';
+ dst = rn (dst, 16, 0, c, len, pad);
+ }
+ }
+ break;
+ case 'E':
+ strcpy (dst, "Win32 error ");
+ dst = rn (dst + sizeof ("Win32 error"), 10, 0, GetLastError (), len, pad);
+ break;
+ case 'd':
+ dst = rn (dst, 10, addsign, va_arg (ap, int), len, pad);
+ break;
+ case 'u':
+ dst = rn (dst, 10, 0, va_arg (ap, int), len, pad);
+ break;
+ case 'p':
+ *dst++ = '0';
+ *dst++ = 'x';
+ /* fall through */
+ case 'x':
+ dst = rn (dst, 16, 0, va_arg (ap, int), len, pad);
+ break;
+ case 'P':
+ if (!GetModuleFileName (NULL, tmp, MAX_PATH))
+ s = "cygwin program";
+ else
+ s = tmp;
+ goto fillin;
+ case '.':
+ n = strtol (fmt, (char **)&fmt, 10);
+ if (*fmt++ != 's')
+ goto endfor;
+ case 's':
+ s = va_arg (ap, char *);
+ if (s == NULL)
+ s = "(null)";
+ fillin:
+ for (i = 0; *s && i < n; i++)
+ *dst++ = *s++;
+ break;
+ case 'F':
+ {
+ const char *p, *pe;
+ s = va_arg (ap, char *);
+ for (p = s; (pe = strchr (p, '(')); p = pe + 1)
+ if (isalnum ((int)pe[-1]) || pe[-1] == '_')
+ break;
+ else if (isspace((int)pe[-1]))
+ {
+ pe--;
+ break;
+ }
+ if (!pe)
+ pe = strchr (s, '\0');
+ for (p = pe; p > s; p--)
+ if (p != pe && *p == ' ')
+ {
+ p++;
+ break;
+ }
+ if (*p == '*')
+ p++;
+ while (p < pe)
+ *dst++ = *p++;
+ break;
+ }
+ default:
+ *dst++ = '?';
+ *dst++ = fmt[-1];
+ }
+ endfor:
+ break;
+ }
+ }
+ }
+ *dst = 0;
+ return dst - orig;
+}
+
+int
+__small_sprintf (char *dst, const char *fmt,...)
+{
+ int r;
+ va_list ap;
+ va_start (ap, fmt);
+ r = __small_vsprintf (dst, fmt, ap);
+ va_end (ap);
+ return r;
+}
+
+void
+small_printf (const char *fmt,...)
+{
+ char buf[2000];
+ va_list ap;
+ DWORD done;
+ int count;
+
+#if 0 /* Turn on to force console errors */
+ extern SECURITY_ATTRIBUTES sec_none;
+ HANDLE h = CreateFileA ("CONOUT$", GENERIC_READ|GENERIC_WRITE,
+ FILE_SHARE_WRITE | FILE_SHARE_WRITE, &sec_none,
+ OPEN_EXISTING, 0, 0);
+ if (h)
+ SetStdHandle (STD_ERROR_HANDLE, h);
+#endif
+
+ va_start (ap, fmt);
+ count = __small_vsprintf (buf, fmt, ap);
+ va_end (ap);
+
+ WriteFile (GetStdHandle (STD_ERROR_HANDLE), buf, count, &done, 0);
+ FlushFileBuffers (GetStdHandle (STD_ERROR_HANDLE));
+}
diff --git a/winsup/cygwin/spawn.cc b/winsup/cygwin/spawn.cc
new file mode 100644
index 000000000..510031911
--- /dev/null
+++ b/winsup/cygwin/spawn.cc
@@ -0,0 +1,980 @@
+/* spawn.cc
+
+ Copyright 1996, 1997, 1998, 1999, 2000 Cygnus Solutions.
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#include <stdlib.h>
+#include <stdarg.h>
+#include <unistd.h>
+#include <process.h>
+#include <sys/wait.h>
+#include <errno.h>
+#include <limits.h>
+#include "winsup.h"
+#include <ctype.h>
+#include "paths.h"
+
+extern BOOL allow_ntsec;
+
+#define LINE_BUF_CHUNK (MAX_PATH * 2)
+
+suffix_info std_suffixes[] =
+{
+ suffix_info (".exe", 1), suffix_info ("", 1),
+ suffix_info (".com"), suffix_info (".cmd"),
+ suffix_info (".bat"), suffix_info (".dll"),
+ suffix_info (NULL)
+};
+
+/* Add .exe to PROG if not already present and see if that exists.
+ If not, return PROG (converted from posix to win32 rules if necessary).
+ The result is always BUF.
+
+ Returns (possibly NULL) suffix */
+
+static const char *
+perhaps_suffix (const char *prog, char *buf)
+{
+ char *ext;
+
+ debug_printf ("prog '%s'", prog);
+ path_conv temp (prog, SYMLINK_FOLLOW, 1, std_suffixes);
+ strcpy (buf, temp.get_win32 ());
+
+ if (temp.file_attributes () & FILE_ATTRIBUTE_DIRECTORY)
+ ext = NULL;
+ else if (temp.known_suffix)
+ ext = buf + (temp.known_suffix - temp.get_win32 ());
+ else
+ ext = strchr (buf, '\0');
+
+ debug_printf ("buf %s, suffix found '%s'", buf, ext);
+ return ext;
+}
+
+/* Find an executable name, possibly by appending known executable
+ suffixes to it. The win32-translated name is placed in 'buf'.
+ Any found suffix is returned in known_suffix.
+
+ If the file is not found and !null_if_not_found then the win32 version
+ of name is placed in buf and returned. Otherwise the contents of buf
+ is undefined and NULL is returned. */
+
+const char * __stdcall
+find_exec (const char *name, char *buf, const char *mywinenv,
+ int null_if_notfound, const char **known_suffix)
+{
+ const char *suffix = "";
+ debug_printf ("find_exec (%s)", name);
+ char *retval = buf;
+
+ /* Check to see if file can be opened as is first.
+ Win32 systems always check . first, but PATH may not be set up to
+ do this. */
+ if ((suffix = perhaps_suffix (name, buf)) != NULL)
+ goto out;
+
+ win_env *winpath;
+ const char *path;
+ char tmp[MAX_PATH];
+
+ /* Return the error condition if this is an absolute path or if there
+ is no PATH to search. */
+ if (strchr (name, '/') || strchr (name, '\\') ||
+ isalpha (name[0]) && name[1] == ':' ||
+ !(winpath = getwinenv (mywinenv)) ||
+ !(path = winpath->get_native ()) ||
+ *path == '\0')
+ goto errout;
+
+ debug_printf ("%s%s", mywinenv, path);
+
+ /* Iterate over the specified path, looking for the file with and
+ without executable extensions. */
+ do
+ {
+ char *eotmp = strccpy (tmp, &path, ';');
+ /* An empty path or '.' means the current directory, but we've
+ already tried that. */
+ if (tmp[0] == '\0' || (tmp[0] == '.' && tmp[1] == '\0'))
+ continue;
+
+ *eotmp++ = '\\';
+ strcpy (eotmp, name);
+
+ debug_printf ("trying %s", tmp);
+
+ if ((suffix = perhaps_suffix (tmp, buf)) != NULL)
+ goto out;
+ }
+ while (*path && *++path);
+
+errout:
+ /* Couldn't find anything in the given path.
+ Take the appropriate action based on null_if_not_found. */
+ if (null_if_notfound)
+ retval = NULL;
+ else
+ strcpy (buf, path_conv (name).get_win32 ());
+
+out:
+ debug_printf ("%s = find_exec (%s)", buf, name);
+ if (known_suffix)
+ *known_suffix = suffix ?: strchr (buf, '\0');
+ return retval;
+}
+
+/* Utility for spawn_guts. */
+
+static HANDLE
+handle (int n, int direction)
+{
+ fhandler_base *fh = dtable[n];
+
+ if (!fh)
+ return INVALID_HANDLE_VALUE;
+ if (fh->get_close_on_exec ())
+ return INVALID_HANDLE_VALUE;
+ if (direction == 0)
+ return fh->get_handle ();
+ return fh->get_output_handle ();
+}
+
+/* Cover function for CreateProcess.
+
+ This function is used by both the routines that search $PATH and those
+ that do not. This should work out ok as according to the documentation,
+ CreateProcess only searches $PATH if PROG has no directory elements.
+
+ Spawning doesn't fit well with Posix's fork/exec (one can argue the merits
+ of either but that's beside the point). If we're exec'ing we want to
+ record the child pid for fork. If we're spawn'ing we don't want to do
+ this. It is up to the caller to handle both cases.
+
+ The result is the process id. The handle of the created process is
+ stored in H.
+*/
+
+HANDLE NO_COPY hExeced = NULL;
+DWORD NO_COPY exec_exit = 0;
+
+int
+iscmd (const char *argv0, const char *what)
+{
+ int n;
+ n = strlen (argv0) - strlen (what);
+ if (n >= 2 && argv0[1] != ':')
+ return 0;
+ return n >= 0 && strcasecmp (argv0 + n, what) == 0 &&
+ (n == 0 || isdirsep (argv0[n - 1]));
+}
+
+class linebuf
+{
+public:
+ size_t ix;
+ char *buf;
+ size_t alloced;
+ linebuf () : ix (0), buf (NULL), alloced (0)
+ {
+ }
+ ~linebuf () {/* if (buf) free (buf);*/}
+ void add (const char *what, int len);
+ void add (const char *what) {add (what, strlen (what));}
+ void prepend (const char *what, int len);
+};
+
+void
+linebuf::add (const char *what, int len)
+{
+ size_t newix;
+ if ((newix = ix + len) >= alloced || !buf)
+ {
+ alloced += LINE_BUF_CHUNK + newix;
+ buf = (char *) realloc (buf, alloced + 1);
+ }
+ memcpy (buf + ix, what, len);
+ ix = newix;
+ buf[ix] = '\0';
+}
+
+void
+linebuf::prepend (const char *what, int len)
+{
+ int buflen;
+ size_t newix;
+ if ((newix = ix + len) >= alloced)
+ {
+ alloced += LINE_BUF_CHUNK + newix;
+ buf = (char *) realloc (buf, alloced + 1);
+ buf[ix] = '\0';
+ }
+ if ((buflen = strlen (buf)))
+ memmove (buf + len, buf, buflen + 1);
+ else
+ buf[newix] = '\0';
+ memcpy (buf, what, len);
+ ix = newix;
+}
+
+int __stdcall
+spawn_guts (HANDLE hToken, const char * prog_arg, const char *const *argv,
+ const char *const envp[], pinfo *child, int mode)
+{
+ int i;
+ BOOL rc;
+ int argc;
+
+ hExeced = NULL;
+
+ MALLOC_CHECK;
+
+ if (prog_arg == NULL)
+ {
+ syscall_printf ("prog_arg is NULL");
+ set_errno(EINVAL);
+ return -1;
+ }
+
+ syscall_printf ("spawn_guts (%.132s)", prog_arg);
+
+ if (argv == NULL)
+ {
+ syscall_printf ("argv is NULL");
+ set_errno(EINVAL);
+ return (-1);
+ }
+
+ /* CreateProcess takes one long string that is the command line (sigh).
+ We need to quote any argument that has whitespace or embedded "'s. */
+
+ for (argc = 0; argv[argc]; argc++)
+ /* nothing */;
+
+ char *real_path;
+ char real_path_buf[MAX_PATH];
+
+ linebuf one_line;
+
+ if (argc == 3 && argv[1][0] == '/' && argv[1][1] == 'c' &&
+ (iscmd (argv[0], "command.com") || iscmd (argv[0], "cmd.exe")))
+ {
+ one_line.add (argv[0]);
+ one_line.add (" ");
+ one_line.add (argv[1]);
+ one_line.add (" ");
+ real_path = NULL;
+ one_line.add (argv[2]);
+ strcpy (real_path_buf, argv[0]);
+ goto skip_arg_parsing;
+ }
+
+ MALLOC_CHECK;
+
+ real_path = real_path_buf;
+
+ const char *saved_prog_arg;
+ const char *newargv0, **firstarg;
+ const char *ext;
+
+ if ((ext = perhaps_suffix (prog_arg, real_path)) == NULL)
+ {
+ set_errno (ENOENT);
+ return -1;
+ }
+
+ MALLOC_CHECK;
+ saved_prog_arg = prog_arg;
+ newargv0 = argv[0];
+ firstarg = &newargv0;
+
+ /* If the file name ends in either .exe, .com, .bat, or .cmd we assume
+ that it is NOT a script file */
+ while (*ext == '\0')
+ {
+ HANDLE hnd = CreateFileA (real_path,
+ GENERIC_READ,
+ FILE_SHARE_READ | FILE_SHARE_WRITE,
+ &sec_none_nih,
+ OPEN_EXISTING,
+ FILE_ATTRIBUTE_NORMAL,
+ 0);
+ if (hnd == INVALID_HANDLE_VALUE)
+ {
+ __seterrno ();
+ return -1;
+ }
+
+ DWORD done;
+
+ char buf[2 * MAX_PATH + 1];
+ buf[0] = buf[1] = buf[2] = buf[sizeof(buf) - 1] = '\0';
+ if (! ReadFile (hnd, buf, sizeof (buf) - 1, &done, 0))
+ {
+ CloseHandle (hnd);
+ __seterrno ();
+ return -1;
+ }
+
+ CloseHandle (hnd);
+
+ if (buf[0] == 'M' && buf[1] == 'Z')
+ break;
+
+ debug_printf ("%s is a script", prog_arg);
+
+ char *ptr, *pgm, *arg1;
+
+ if (buf[0] != '#' || buf[1] != '!')
+ {
+ strcpy (buf, "sh"); /* shell script without magic */
+ pgm = buf;
+ ptr = buf + 2;
+ arg1 = NULL;
+ }
+ else
+ {
+ pgm = buf + 2;
+ pgm += strspn (pgm, " \t");
+ for (ptr = pgm, arg1 = NULL;
+ *ptr && *ptr != '\r' && *ptr != '\n';
+ ptr++)
+ if (!arg1 && (*ptr == ' ' || *ptr == '\t'))
+ {
+ /* Null terminate the initial command and step over
+ any additional white space. If we've hit the
+ end of the line, exit the loop. Otherwise, position
+ we've found the first argument. Position the current
+ pointer on the last known white space. */
+ *ptr = '\0';
+ char *newptr = ptr + 1;
+ newptr += strspn (newptr, " \t");
+ if (!*newptr || *newptr == '\r' || *newptr == '\n')
+ break;
+ arg1 = newptr;
+ ptr = newptr - 1;
+ }
+
+
+ *ptr = '\0';
+ }
+
+ char buf2[MAX_PATH + 1];
+
+ /* pointers:
+ * pgm interpreter name
+ * arg1 optional string
+ * ptr end of string
+ */
+
+ if (!arg1)
+ one_line.prepend (" ", 1);
+ else
+ {
+ one_line.prepend ("\" ", 2);
+ one_line.prepend (arg1, strlen (arg1));
+ one_line.prepend (" \"", 2);
+ }
+
+ find_exec (pgm, real_path, "PATH=", 0, &ext);
+ cygwin_conv_to_posix_path (real_path, buf2);
+ one_line.prepend (buf2, strlen (buf2));
+
+ /* If script had absolute path, add it to script name now!
+ * This is necessary if script has been found via PATH.
+ * For example, /usr/local/bin/tkman started as "tkman":
+ * #!/usr/local/bin/wish -f
+ * ...
+ * We should run /usr/local/bin/wish -f /usr/local/bin/tkman,
+ * but not /usr/local/bin/wish -f tkman!
+ * We don't modify anything, if script has qulified path.
+ */
+ if (firstarg)
+ *firstarg = saved_prog_arg;
+
+ debug_printf ("prog_arg '%s', copy '%s'", prog_arg, one_line.buf);
+ firstarg = NULL;
+ }
+
+ for (; *argv; argv++)
+ {
+ char *p = NULL;
+ const char *a = newargv0 ?: *argv;
+
+ MALLOC_CHECK;
+
+ newargv0 = NULL;
+ int len = strlen (a);
+ if (len != 0 && !(p = strpbrk (a, " \t\n\r\"")))
+ one_line.add (a, len);
+ else
+ {
+ one_line.add ("\"", 1);
+ for (; p; a = p, p = strchr (p, '"'))
+ {
+ one_line.add (a, ++p - a);
+ if (p[-1] == '"')
+ one_line.add ("\"", 1);
+ }
+ if (*a)
+ one_line.add (a);
+ one_line.add ("\"", 1);
+ }
+ MALLOC_CHECK;
+ one_line.add (" ", 1);
+ MALLOC_CHECK;
+ }
+
+ MALLOC_CHECK;
+ if (one_line.ix)
+ one_line.buf[one_line.ix - 1] = '\0';
+ else
+ one_line.add ("", 1);
+ MALLOC_CHECK;
+
+skip_arg_parsing:
+ PROCESS_INFORMATION pi = {0};
+
+ STARTUPINFO si = {0};
+ si.lpReserved = NULL;
+ si.lpDesktop = NULL;
+ si.dwFlags = STARTF_USESTDHANDLES;
+ si.hStdInput = handle (0, 0); /* Get input handle */
+ si.hStdOutput = handle (1, 1); /* Get output handle */
+ si.hStdError = handle (2, 1); /* Get output handle */
+ si.cb = sizeof (si);
+
+ /* Pass fd table to a child */
+
+ MALLOC_CHECK;
+ int len = dtable.linearize_fd_array (0, 0);
+ MALLOC_CHECK;
+ if (len == -1)
+ {
+ system_printf ("FATAL error in linearize_fd_array");
+ return -1;
+ }
+ int titlelen = 1 + (old_title && mode == _P_OVERLAY ? strlen (old_title) : 0);
+ si.cbReserved2 = len + titlelen + sizeof(child_info);
+ si.lpReserved2 = (LPBYTE) alloca (si.cbReserved2);
+
+# define ciresrv ((child_info *)si.lpReserved2)
+ HANDLE spr = NULL;
+ DWORD chtype;
+ if (mode != _P_OVERLAY)
+ chtype = PROC_SPAWN;
+ else
+ {
+ spr = CreateEvent(&sec_all, TRUE, FALSE, NULL);
+ ProtectHandle (spr);
+ chtype = PROC_EXEC;
+ }
+
+ init_child_info (chtype, ciresrv, child->pid, spr);
+
+ LPBYTE resrv = si.lpReserved2 + sizeof *ciresrv;
+# undef ciresrv
+
+ if (dtable.linearize_fd_array (resrv, len) < 0)
+ {
+ system_printf ("FATAL error in second linearize_fd_array");
+ return -1;
+ }
+
+ if (titlelen > 1)
+ strcpy ((char *) resrv + len, old_title);
+ else
+ resrv[len] = '\0';
+
+ /* We print the translated program and arguments here so the user can see
+ what was done to it. */
+ syscall_printf ("spawn_guts (%s, %.132s)", real_path, one_line.buf);
+
+ int flags = CREATE_DEFAULT_ERROR_MODE | CREATE_SUSPENDED |
+ GetPriorityClass (hMainProc);
+
+ if (mode == _P_DETACH || !set_console_state_for_spawn ())
+ flags |= DETACHED_PROCESS;
+
+ MALLOC_CHECK;
+ /* Build windows style environment list */
+ char *envblock = winenv (envp);
+ MALLOC_CHECK;
+
+ /* Preallocated buffer for `sec_user' call */
+ char sa_buf[1024];
+
+ if (hToken)
+ {
+ /* allow the child to interact with our window station/desktop */
+ HANDLE hwst, hdsk;
+ SECURITY_INFORMATION dsi = DACL_SECURITY_INFORMATION;
+ DWORD n;
+ char wstname[1024];
+ char dskname[1024];
+
+ hwst = GetProcessWindowStation();
+ SetUserObjectSecurity(hwst, &dsi, get_null_sd ());
+ GetUserObjectInformation(hwst, UOI_NAME, wstname, 1024, &n);
+ hdsk = GetThreadDesktop(GetCurrentThreadId());
+ SetUserObjectSecurity(hdsk, &dsi, get_null_sd ());
+ GetUserObjectInformation(hdsk, UOI_NAME, dskname, 1024, &n);
+ strcat (wstname, "\\");
+ strcat (wstname, dskname);
+ si.lpDesktop = wstname;
+ /* force the new process to reread /etc/passwd and /etc/group */
+ child->uid = USHRT_MAX;
+ child->username[0] = '\0';
+
+ char tu[1024];
+ PSID sid = NULL;
+ DWORD ret_len;
+ if (GetTokenInformation (hToken, TokenUser,
+ (LPVOID) &tu, sizeof tu,
+ &ret_len))
+ sid = ((TOKEN_USER *) &tu)->User.Sid;
+ else
+ system_printf ("GetTokenInformation: %E");
+
+ rc = CreateProcessAsUser (hToken,
+ real_path, /* image name - with full path */
+ one_line.buf, /* what was passed to exec */
+ /* process security attrs */
+ allow_ntsec && sid ? sec_user (sa_buf, sid)
+ : &sec_all_nih,
+ /* thread security attrs */
+ allow_ntsec && sid ? sec_user (sa_buf, sid)
+ : &sec_all_nih,
+ TRUE, /* inherit handles from parent */
+ flags,
+ envblock,/* environment */
+ 0, /* use current drive/directory */
+ &si,
+ &pi);
+ }
+ else
+ rc = CreateProcessA (real_path, /* image name - with full path */
+ one_line.buf, /* what was passed to exec */
+ /* process security attrs */
+ allow_ntsec ? sec_user (sa_buf) : &sec_all_nih,
+ /* thread security attrs */
+ allow_ntsec ? sec_user (sa_buf) : &sec_all_nih,
+ TRUE, /* inherit handles from parent */
+ flags,
+ envblock,/* environment */
+ 0, /* use current drive/directory */
+ &si,
+ &pi);
+
+ MALLOC_CHECK;
+ free (envblock);
+ MALLOC_CHECK;
+
+ /* Set errno now so that debugging messages from it appear before our
+ final debugging message [this is a general rule for debugging
+ messages]. */
+ if (!rc)
+ __seterrno ();
+
+ MALLOC_CHECK;
+ /* Name the handle similarly to proc_subproc. */
+ ProtectHandle1 (pi.hProcess, childhProc);
+ ProtectHandle (pi.hThread);
+ MALLOC_CHECK;
+
+ /* We print the original program name here so the user can see that too. */
+ syscall_printf ("%d = spawn_guts (%s, %.132s)",
+ rc ? pi.dwProcessId : (unsigned int) -1,
+ prog_arg, one_line.buf);
+
+ if (!rc)
+ {
+ if (spr)
+ ForceCloseHandle (spr);
+ return -1;
+ }
+
+ /* Set up child's signal handlers */
+ for (i = 0; i < NSIG; i++)
+ {
+ child->getsig(i).sa_mask = 0;
+ if (myself->getsig(i).sa_handler != SIG_IGN || (mode != _P_OVERLAY))
+ child->getsig(i).sa_handler = SIG_DFL;
+ }
+
+ if (mode == _P_OVERLAY)
+ {
+ close_all_files ();
+ strcpy (child->progname, real_path_buf);
+ proc_terminate ();
+ hExeced = pi.hProcess;
+ }
+ else
+ {
+ child->dwProcessId = pi.dwProcessId;
+ child->hProcess = pi.hProcess;
+ child->process_state |= PID_INITIALIZING;
+ proc_register (child);
+ }
+
+ sigproc_printf ("spawned windows pid %d", pi.dwProcessId);
+ /* Start the child running */
+ ResumeThread (pi.hThread);
+ ForceCloseHandle (pi.hThread);
+
+ if (hToken)
+ CloseHandle (hToken);
+
+ DWORD res;
+
+ if (mode == _P_OVERLAY)
+ {
+ BOOL exited;
+
+ HANDLE waitbuf[3] = {pi.hProcess, signal_arrived, spr};
+ int nwait = 3;
+
+ SetThreadPriority (GetCurrentThread (), THREAD_PRIORITY_HIGHEST);
+ res = 0;
+ DWORD timeout = INFINITE;
+ exec_exit = 1;
+ exited = FALSE;
+ MALLOC_CHECK;
+ waitfor:
+ switch (WaitForMultipleObjects (nwait, waitbuf, FALSE, timeout))
+ {
+ case WAIT_TIMEOUT:
+ syscall_printf ("WFMO timed out after signal");
+ if (WaitForSingleObject (pi.hProcess, 0) != WAIT_OBJECT_0)
+ {
+ sigproc_printf ("subprocess still alive after signal");
+ res = exec_exit;
+ }
+ else
+ {
+ sigproc_printf ("subprocess exited after signal");
+ case WAIT_OBJECT_0:
+ sigproc_printf ("subprocess exited");
+ if (!GetExitCodeProcess (pi.hProcess, &res))
+ res = exec_exit;
+ exited = TRUE;
+ }
+ if (nwait > 2)
+ if (WaitForSingleObject (spr, 1) == WAIT_OBJECT_0)
+ res |= EXIT_REPARENTING;
+ else if (!(res & EXIT_REPARENTING))
+ {
+ MALLOC_CHECK;
+ close_all_files ();
+ MALLOC_CHECK;
+ }
+ break;
+ case WAIT_OBJECT_0 + 1:
+ sigproc_printf ("signal arrived");
+ timeout = 10;
+ goto waitfor;
+ case WAIT_OBJECT_0 + 2:
+ res = EXIT_REPARENTING;
+ MALLOC_CHECK;
+ ForceCloseHandle (spr);
+ MALLOC_CHECK;
+ if (!parent_alive)
+ {
+ nwait = 1;
+ sigproc_terminate ();
+ goto waitfor;
+ }
+ break;
+ case WAIT_FAILED:
+ DWORD r;
+ system_printf ("wait failed: nwait %d, pid %d, winpid %d, %E",
+ nwait, myself->pid, myself->dwProcessId);
+ system_printf ("waitbuf[0] %p %d", waitbuf[0],
+ GetHandleInformation (waitbuf[0], &r));
+ system_printf ("waitbuf[1] %p = %d", waitbuf[1],
+ GetHandleInformation (waitbuf[1], &r));
+ set_errno (ECHILD);
+ return -1;
+ }
+
+ if (nwait > 2)
+ ForceCloseHandle (spr);
+
+ sigproc_printf ("res = %x", res);
+
+ if (res & EXIT_REPARENTING)
+ {
+ /* Try to reparent child process.
+ * Make handles to child available to parent process and exit with
+ * EXIT_REPARENTING status. Wait() syscall in parent will then wait
+ * for newly created child.
+ */
+ if (my_parent_is_alive ())
+ {
+ pinfo *parent = procinfo (myself->ppid);
+ sigproc_printf ("parent = %p", parent);
+ HANDLE hP = OpenProcess (PROCESS_ALL_ACCESS, FALSE,
+ parent->dwProcessId);
+ sigproc_printf ("parent's handle = %d", hP);
+ if (hP == NULL && GetLastError () == ERROR_INVALID_PARAMETER)
+ res = 1;
+ else if (hP)
+ {
+ ProtectHandle (hP);
+ res = DuplicateHandle (hMainProc, pi.hProcess, hP,
+ &myself->hProcess, 0, FALSE,
+ DUPLICATE_SAME_ACCESS);
+ sigproc_printf ("Dup hP %d", res);
+ ForceCloseHandle (hP);
+ }
+ if (!res)
+ {
+ system_printf ("Reparent failed, parent handle %p, %E", hP);
+ system_printf ("my dwProcessId %d, myself->dwProcessId %d",
+ GetCurrentProcessId(), myself->dwProcessId);
+ system_printf ("myself->process_state %x",
+ myself->process_state);
+ system_printf ("myself->hProcess %x", myself->hProcess);
+ }
+ }
+ res = EXIT_REPARENTING;
+ ForceCloseHandle1 (hExeced, childhProc);
+ hExeced = INVALID_HANDLE_VALUE;
+ }
+ else if (exited)
+ {
+ ForceCloseHandle1 (hExeced, childhProc);
+ hExeced = INVALID_HANDLE_VALUE; // stop do_exit from attempting to terminate child
+ }
+
+ MALLOC_CHECK;
+ do_exit (res | EXIT_NOCLOSEALL);
+ }
+
+ if (mode == _P_WAIT)
+ {
+ waitpid (child->pid, (int *) &res, 0);
+ }
+ else if (mode == _P_DETACH)
+ {
+ /* Lose all memory of this child. */
+ res = 0;
+ }
+ else if ((mode == _P_NOWAIT) || (mode == _P_NOWAITO))
+ {
+ res = child->pid;
+ }
+
+ return (int) res;
+}
+
+extern "C"
+int
+cwait (int *result, int pid, int)
+{
+ return waitpid (pid, result, 0);
+}
+
+/*
+ * Helper function for spawn runtime calls.
+ * Doesn't search the path.
+ */
+
+extern "C" int
+_spawnve (HANDLE hToken, int mode, const char *path, const char *const *argv,
+ const char *const *envp)
+{
+ pinfo *child;
+ int ret;
+ vfork_save *vf = vfork_storage.val ();
+
+ if (vf != NULL && (vf->pid < 0) && mode == _P_OVERLAY)
+ mode = _P_NOWAIT;
+ else
+ vf = NULL;
+
+ syscall_printf ("_spawnve (%s, %s, %x)", path, argv[0], envp);
+
+ switch (mode)
+ {
+ case _P_OVERLAY:
+ /* We do not pass _P_SEARCH_PATH here. execve doesn't search PATH.*/
+ /* Just act as an exec if _P_OVERLAY set. */
+ spawn_guts (hToken, path, argv, envp, myself, mode);
+ /* Errno should be set by spawn_guts. */
+ ret = -1;
+ break;
+ case _P_NOWAIT:
+ case _P_NOWAITO:
+ case _P_WAIT:
+ case _P_DETACH:
+ child = cygwin_shared->p.allocate_pid ();
+ if (!child)
+ {
+ set_errno (EAGAIN);
+ syscall_printf ("-1 = spawnve (), process table full");
+ return -1;
+ }
+ strcpy (child->progname, path);
+ child->ppid = myself->pid;
+ child->uid = myself->uid;
+ child->gid = myself->gid;
+ child->pgid = myself->pgid;
+ child->sid = myself->sid;
+ child->ctty = myself->ctty;
+ child->umask = myself->umask;
+ child->process_state |= PID_INITIALIZING;
+ memcpy (child->username, myself->username, MAX_USER_NAME);
+ child->psid = myself->psid;
+ memcpy (child->sidbuf, myself->sidbuf, 40);
+ memcpy (child->logsrv, myself->logsrv, 256);
+ memcpy (child->domain, myself->domain, MAX_COMPUTERNAME_LENGTH+1);
+ subproc_init ();
+ ret = spawn_guts (hToken, path, argv, envp, child, mode);
+ if (ret == -1)
+ child->process_state = PID_NOT_IN_USE;
+
+ if (vf)
+ {
+ vf->pid = child->pid;
+ longjmp (vf->j, 1);
+ }
+ break;
+ default:
+ set_errno (EINVAL);
+ ret = -1;
+ break;
+ }
+ return ret;
+}
+
+/*
+ * spawn functions as implemented in the MS runtime library.
+ * Most of these based on (and copied from) newlib/libc/posix/execXX.c
+ */
+
+extern "C"
+int
+spawnl (int mode, const char *path, const char *arg0, ...)
+{
+ int i;
+ va_list args;
+ const char *argv[256];
+
+ va_start (args, arg0);
+ argv[0] = arg0;
+ i = 1;
+
+ do
+ argv[i] = va_arg (args, const char *);
+ while (argv[i++] != NULL);
+
+ va_end (args);
+
+ return _spawnve (NULL, mode, path, (char * const *) argv,
+ *user_data->envptr);
+}
+
+extern "C"
+int
+spawnle (int mode, const char *path, const char *arg0, ...)
+{
+ int i;
+ va_list args;
+ const char * const *envp;
+ const char *argv[256];
+
+ va_start (args, arg0);
+ argv[0] = arg0;
+ i = 1;
+
+ do
+ argv[i] = va_arg (args, const char *);
+ while (argv[i++] != NULL);
+
+ envp = va_arg (args, const char * const *);
+ va_end (args);
+
+ return _spawnve (NULL, mode, path, (char * const *) argv,
+ (char * const *) envp);
+}
+
+extern "C"
+int
+spawnlp (int mode, const char *path, const char *arg0, ...)
+{
+ int i;
+ va_list args;
+ const char *argv[256];
+
+ va_start (args, arg0);
+ argv[0] = arg0;
+ i = 1;
+
+ do
+ argv[i] = va_arg (args, const char *);
+ while (argv[i++] != NULL);
+
+ va_end (args);
+
+ return spawnvpe (mode, path, (char * const *) argv, *user_data->envptr);
+}
+
+extern "C"
+int
+spawnlpe (int mode, const char *path, const char *arg0, ...)
+{
+ int i;
+ va_list args;
+ const char * const *envp;
+ const char *argv[256];
+
+ va_start (args, arg0);
+ argv[0] = arg0;
+ i = 1;
+
+ do
+ argv[i] = va_arg (args, const char *);
+ while (argv[i++] != NULL);
+
+ envp = va_arg (args, const char * const *);
+ va_end (args);
+
+ return spawnvpe (mode, path, (char * const *) argv, envp);
+}
+
+extern "C"
+int
+spawnv (int mode, const char *path, const char * const *argv)
+{
+ return _spawnve (NULL, mode, path, argv, *user_data->envptr);
+}
+
+extern "C"
+int
+spawnve (int mode, const char *path, char * const *argv,
+ const char * const *envp)
+{
+ return _spawnve (NULL, mode, path, argv, envp);
+}
+
+extern "C"
+int
+spawnvp (int mode, const char *path, const char * const *argv)
+{
+ return spawnvpe (mode, path, argv, *user_data->envptr);
+}
+
+extern "C"
+int
+spawnvpe (int mode, const char *file, const char * const *argv,
+ const char * const *envp)
+{
+ char buf[MAXNAMLEN];
+ return _spawnve (NULL, mode, find_exec (file, buf), argv, envp);
+}
diff --git a/winsup/cygwin/strace.cc b/winsup/cygwin/strace.cc
new file mode 100644
index 000000000..d66d9c7b2
--- /dev/null
+++ b/winsup/cygwin/strace.cc
@@ -0,0 +1,409 @@
+/* strace.cc: system/windows tracing
+
+ Copyright 1996, 1997, 1998, 1999, 2000 Cygnus Solutions.
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#include <ctype.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <time.h>
+#include "winsup.h"
+
+#define PROTECT(x) x[sizeof(x)-1] = 0
+#define CHECK(x) if (x[sizeof(x)-1] != 0) { small_printf("array bound exceeded %d\n", __LINE__); ExitProcess(1); }
+
+DWORD NO_COPY strace_active = 0;
+
+/* 'twould be nice to declare this in winsup.h but winsup.h doesn't require
+ stdarg.h, so we declare it here instead. */
+
+#ifndef NOSTRACE
+
+#ifndef STRACE_HHMMSS
+static long long hires_frequency = 0;
+static int hires_initted = 0;
+
+static int strace_microseconds()
+{
+ static int first_microsec = 0;
+ int microsec;
+ if (!hires_initted)
+ {
+ hires_initted = 1;
+ QueryPerformanceFrequency ((LARGE_INTEGER *) &hires_frequency);
+ if (hires_frequency == 0)
+ hires_initted = 2;
+ }
+ if (hires_initted == 2)
+ {
+ int count = GetTickCount ();
+ microsec = count * 1000;
+ }
+ else
+ {
+ long long thiscount;
+ QueryPerformanceCounter ((LARGE_INTEGER *) &thiscount);
+ thiscount = (long long) (((double) thiscount/(double) hires_frequency)
+ * 1000000.0);
+ microsec = thiscount;
+ }
+ if (first_microsec == 0)
+ first_microsec = microsec;
+ return microsec - first_microsec;
+}
+#endif
+
+/* sprintf analog for use by output routines. */
+static int
+strace_vsprintf (char *buf, const char *infmt, va_list ap)
+{
+ int count;
+ char fmt[80], unkfmt[80];
+ static int nonewline = FALSE;
+ DWORD err = GetLastError ();
+
+#ifndef STRACE_HHMMSS
+ static int lmicrosec = 0;
+ int microsec = strace_microseconds ();
+ int dmicrosec = lmicrosec ? microsec - lmicrosec : 0;
+ lmicrosec = microsec;
+
+ __small_sprintf (fmt, "%5d %7d [%s] %s ",
+ dmicrosec, microsec, threadname (0), "%s %d%s");
+ __small_sprintf (unkfmt, "%6d %7d [%s] %s ",
+ dmicrosec, microsec, threadname (0),
+ "(unknown)");
+#else
+ SYSTEMTIME st;
+ GetLocalTime (&st);
+ const char *tn = threadname (0);
+ __small_sprintf (fmt, "%02d:%02d:%02d [%s] %s ",
+ st.wHour, st.wMinute, st.wSecond, tn, "%s %d%s");
+ __small_sprintf (unkfmt, "%02d:%02d:%02d [%s] %s ",
+ st.wHour, st.wMinute, st.wSecond, tn, "***");
+#endif
+
+ SetLastError (err);
+ if (nonewline)
+ {
+ count = 0;
+ if (strncmp (infmt, "%F: ", 4) == 0)
+ {
+ infmt += 4;
+ (void) va_arg (ap, char *);
+ }
+ }
+ else
+ {
+ char *p, progname[sizeof (myself->progname)];
+ static BOOL NO_COPY output_path_once = FALSE;
+ if (!output_path_once)
+ output_path_once = !!(p = myself->progname);
+ else
+ {
+ if ((p = strrchr (myself->progname, '\\')) != NULL)
+ p++;
+ else
+ p = myself->progname;
+ strcpy (progname, p);
+ if ((p = strrchr (progname, '.')) != NULL)
+ *p = '\000';
+ p = progname;
+ }
+ count = __small_sprintf (buf, fmt, p && *p ? p : "(unknown)",
+ myself->pid, hExeced ? "!" : "");
+ }
+
+ count += __small_vsprintf (buf + count, infmt, ap);
+ char *p;
+ for (p = buf + count; p > buf; p--)
+ switch (p[-1])
+ {
+ case '\n':
+ p[-1] = '\0';
+ break;
+ case '\b':
+ *--p = '\0';
+ nonewline = TRUE;
+ goto done;
+ default:
+ goto addnl;
+ }
+
+addnl:
+ *p++ = '\n';
+ *p = '\0';
+ nonewline = FALSE;
+
+done:
+ return p - buf;
+}
+
+/* Write to strace file or strace queue. */
+static void
+strace_write (unsigned category, const char *buf, int count)
+{
+# define PREFIX (3 + 8 + 1 + 8 + 1)
+ char outbuf[PREFIX + 1 + count + 1];
+# define outstuff (outbuf + 12)
+ __small_sprintf (outstuff, "%x %s", category, buf);
+ __small_sprintf (outbuf, "cYg%08x", strlen (outstuff) + 1);
+ outstuff[-1] = ' ';
+ OutputDebugString (outbuf);
+}
+
+/* Printf function used when tracing system calls.
+ Warning: DO NOT SET ERRNO HERE! */
+
+void
+strace_printf (unsigned category, const char *fmt,...)
+{
+ DWORD err = GetLastError ();
+ if (strace_active)
+ {
+ int count;
+ va_list ap;
+ char buf[10000];
+
+ PROTECT(buf);
+ va_start (ap, fmt);
+ SetLastError (err);
+ count = strace_vsprintf (buf, fmt, ap);
+ va_end (ap);
+ CHECK(buf);
+
+ strace_write (category, buf, count);
+ }
+ SetLastError (err);
+}
+
+void __stdcall
+mark (const char *fn, int i)
+{
+}
+
+static const struct tab
+{
+ int v;
+ const char *n;
+}
+ta[] =
+{
+ { WM_NULL, "WM_NULL" },
+ { WM_CREATE, "WM_CREATE" },
+ { WM_DESTROY, "WM_DESTROY" },
+ { WM_MOVE, "WM_MOVE" },
+ { WM_SIZE, "WM_SIZE" },
+ { WM_ACTIVATE, "WM_ACTIVATE" },
+ { WM_SETFOCUS, "WM_SETFOCUS" },
+ { WM_KILLFOCUS, "WM_KILLFOCUS" },
+ { WM_ENABLE, "WM_ENABLE" },
+ { WM_SETREDRAW, "WM_SETREDRAW" },
+ { WM_SETTEXT, "WM_SETTEXT" },
+ { WM_GETTEXT, "WM_GETTEXT" },
+ { WM_GETTEXTLENGTH, "WM_GETTEXTLENGTH" },
+ { WM_PAINT, "WM_PAINT" },
+ { WM_CLOSE, "WM_CLOSE" },
+ { WM_QUERYENDSESSION, "WM_QUERYENDSESSION" },
+ { WM_QUIT, "WM_QUIT" },
+ { WM_QUERYOPEN, "WM_QUERYOPEN" },
+ { WM_ERASEBKGND, "WM_ERASEBKGND" },
+ { WM_SYSCOLORCHANGE, "WM_SYSCOLORCHANGE" },
+ { WM_ENDSESSION, "WM_ENDSESSION" },
+ { WM_SHOWWINDOW, "WM_SHOWWINDOW" },
+ { WM_WININICHANGE, "WM_WININICHANGE" },
+ { WM_DEVMODECHANGE, "WM_DEVMODECHANGE" },
+ { WM_ACTIVATEAPP, "WM_ACTIVATEAPP" },
+ { WM_FONTCHANGE, "WM_FONTCHANGE" },
+ { WM_TIMECHANGE, "WM_TIMECHANGE" },
+ { WM_CANCELMODE, "WM_CANCELMODE" },
+ { WM_SETCURSOR, "WM_SETCURSOR" },
+ { WM_MOUSEACTIVATE, "WM_MOUSEACTIVATE" },
+ { WM_CHILDACTIVATE, "WM_CHILDACTIVATE" },
+ { WM_QUEUESYNC, "WM_QUEUESYNC" },
+ { WM_GETMINMAXINFO, "WM_GETMINMAXINFO" },
+ { WM_PAINTICON, "WM_PAINTICON" },
+ { WM_ICONERASEBKGND, "WM_ICONERASEBKGND" },
+ { WM_NEXTDLGCTL, "WM_NEXTDLGCTL" },
+ { WM_SPOOLERSTATUS, "WM_SPOOLERSTATUS" },
+ { WM_DRAWITEM, "WM_DRAWITEM" },
+ { WM_MEASUREITEM, "WM_MEASUREITEM" },
+ { WM_DELETEITEM, "WM_DELETEITEM" },
+ { WM_VKEYTOITEM, "WM_VKEYTOITEM" },
+ { WM_CHARTOITEM, "WM_CHARTOITEM" },
+ { WM_SETFONT, "WM_SETFONT" },
+ { WM_GETFONT, "WM_GETFONT" },
+ { WM_SETHOTKEY, "WM_SETHOTKEY" },
+ { WM_GETHOTKEY, "WM_GETHOTKEY" },
+ { WM_QUERYDRAGICON, "WM_QUERYDRAGICON" },
+ { WM_COMPAREITEM, "WM_COMPAREITEM" },
+ { WM_COMPACTING, "WM_COMPACTING" },
+ { WM_WINDOWPOSCHANGING, "WM_WINDOWPOSCHANGING" },
+ { WM_WINDOWPOSCHANGED, "WM_WINDOWPOSCHANGED" },
+ { WM_POWER, "WM_POWER" },
+ { WM_COPYDATA, "WM_COPYDATA" },
+ { WM_CANCELJOURNAL, "WM_CANCELJOURNAL" },
+ { WM_NCCREATE, "WM_NCCREATE" },
+ { WM_NCDESTROY, "WM_NCDESTROY" },
+ { WM_NCCALCSIZE, "WM_NCCALCSIZE" },
+ { WM_NCHITTEST, "WM_NCHITTEST" },
+ { WM_NCPAINT, "WM_NCPAINT" },
+ { WM_NCACTIVATE, "WM_NCACTIVATE" },
+ { WM_GETDLGCODE, "WM_GETDLGCODE" },
+ { WM_NCMOUSEMOVE, "WM_NCMOUSEMOVE" },
+ { WM_NCLBUTTONDOWN, "WM_NCLBUTTONDOWN" },
+ { WM_NCLBUTTONUP, "WM_NCLBUTTONUP" },
+ { WM_NCLBUTTONDBLCLK, "WM_NCLBUTTONDBLCLK" },
+ { WM_NCRBUTTONDOWN, "WM_NCRBUTTONDOWN" },
+ { WM_NCRBUTTONUP, "WM_NCRBUTTONUP" },
+ { WM_NCRBUTTONDBLCLK, "WM_NCRBUTTONDBLCLK" },
+ { WM_NCMBUTTONDOWN, "WM_NCMBUTTONDOWN" },
+ { WM_NCMBUTTONUP, "WM_NCMBUTTONUP" },
+ { WM_NCMBUTTONDBLCLK, "WM_NCMBUTTONDBLCLK" },
+ { WM_KEYFIRST, "WM_KEYFIRST" },
+ { WM_KEYDOWN, "WM_KEYDOWN" },
+ { WM_KEYUP, "WM_KEYUP" },
+ { WM_CHAR, "WM_CHAR" },
+ { WM_DEADCHAR, "WM_DEADCHAR" },
+ { WM_SYSKEYDOWN, "WM_SYSKEYDOWN" },
+ { WM_SYSKEYUP, "WM_SYSKEYUP" },
+ { WM_SYSCHAR, "WM_SYSCHAR" },
+ { WM_SYSDEADCHAR, "WM_SYSDEADCHAR" },
+ { WM_KEYLAST, "WM_KEYLAST" },
+ { WM_INITDIALOG, "WM_INITDIALOG" },
+ { WM_COMMAND, "WM_COMMAND" },
+ { WM_SYSCOMMAND, "WM_SYSCOMMAND" },
+ { WM_TIMER, "WM_TIMER" },
+ { WM_HSCROLL, "WM_HSCROLL" },
+ { WM_VSCROLL, "WM_VSCROLL" },
+ { WM_INITMENU, "WM_INITMENU" },
+ { WM_INITMENUPOPUP, "WM_INITMENUPOPUP" },
+ { WM_MENUSELECT, "WM_MENUSELECT" },
+ { WM_MENUCHAR, "WM_MENUCHAR" },
+ { WM_ENTERIDLE, "WM_ENTERIDLE" },
+ { WM_CTLCOLORMSGBOX, "WM_CTLCOLORMSGBOX" },
+ { WM_CTLCOLOREDIT, "WM_CTLCOLOREDIT" },
+ { WM_CTLCOLORLISTBOX, "WM_CTLCOLORLISTBOX" },
+ { WM_CTLCOLORBTN, "WM_CTLCOLORBTN" },
+ { WM_CTLCOLORDLG, "WM_CTLCOLORDLG" },
+ { WM_CTLCOLORSCROLLBAR, "WM_CTLCOLORSCROLLBAR" },
+ { WM_CTLCOLORSTATIC, "WM_CTLCOLORSTATIC" },
+ { WM_MOUSEFIRST, "WM_MOUSEFIRST" },
+ { WM_MOUSEMOVE, "WM_MOUSEMOVE" },
+ { WM_LBUTTONDOWN, "WM_LBUTTONDOWN" },
+ { WM_LBUTTONUP, "WM_LBUTTONUP" },
+ { WM_LBUTTONDBLCLK, "WM_LBUTTONDBLCLK" },
+ { WM_RBUTTONDOWN, "WM_RBUTTONDOWN" },
+ { WM_RBUTTONUP, "WM_RBUTTONUP" },
+ { WM_RBUTTONDBLCLK, "WM_RBUTTONDBLCLK" },
+ { WM_MBUTTONDOWN, "WM_MBUTTONDOWN" },
+ { WM_MBUTTONUP, "WM_MBUTTONUP" },
+ { WM_MBUTTONDBLCLK, "WM_MBUTTONDBLCLK" },
+ { WM_MOUSELAST, "WM_MOUSELAST" },
+ { WM_PARENTNOTIFY, "WM_PARENTNOTIFY" },
+ { WM_ENTERMENULOOP, "WM_ENTERMENULOOP" },
+ { WM_EXITMENULOOP, "WM_EXITMENULOOP" },
+ { WM_MDICREATE, "WM_MDICREATE" },
+ { WM_MDIDESTROY, "WM_MDIDESTROY" },
+ { WM_MDIACTIVATE, "WM_MDIACTIVATE" },
+ { WM_MDIRESTORE, "WM_MDIRESTORE" },
+ { WM_MDINEXT, "WM_MDINEXT" },
+ { WM_MDIMAXIMIZE, "WM_MDIMAXIMIZE" },
+ { WM_MDITILE, "WM_MDITILE" },
+ { WM_MDICASCADE, "WM_MDICASCADE" },
+ { WM_MDIICONARRANGE, "WM_MDIICONARRANGE" },
+ { WM_MDIGETACTIVE, "WM_MDIGETACTIVE" },
+ { WM_MDISETMENU, "WM_MDISETMENU" },
+ { WM_DROPFILES, "WM_DROPFILES" },
+ { WM_MDIREFRESHMENU, "WM_MDIREFRESHMENU" },
+ { WM_CUT, "WM_CUT" },
+ { WM_COPY, "WM_COPY" },
+ { WM_PASTE, "WM_PASTE" },
+ { WM_CLEAR, "WM_CLEAR" },
+ { WM_UNDO, "WM_UNDO" },
+ { WM_RENDERFORMAT, "WM_RENDERFORMAT" },
+ { WM_RENDERALLFORMATS, "WM_RENDERALLFORMATS" },
+ { WM_DESTROYCLIPBOARD, "WM_DESTROYCLIPBOARD" },
+ { WM_DRAWCLIPBOARD, "WM_DRAWCLIPBOARD" },
+ { WM_PAINTCLIPBOARD, "WM_PAINTCLIPBOARD" },
+ { WM_VSCROLLCLIPBOARD, "WM_VSCROLLCLIPBOARD" },
+ { WM_SIZECLIPBOARD, "WM_SIZECLIPBOARD" },
+ { WM_ASKCBFORMATNAME, "WM_ASKCBFORMATNAME" },
+ { WM_CHANGECBCHAIN, "WM_CHANGECBCHAIN" },
+ { WM_HSCROLLCLIPBOARD, "WM_HSCROLLCLIPBOARD" },
+ { WM_QUERYNEWPALETTE, "WM_QUERYNEWPALETTE" },
+ { WM_PALETTEISCHANGING, "WM_PALETTEISCHANGING" },
+ { WM_PALETTECHANGED, "WM_PALETTECHANGED" },
+ { WM_HOTKEY, "WM_HOTKEY" },
+ { WM_PENWINFIRST, "WM_PENWINFIRST" },
+ { WM_PENWINLAST, "WM_PENWINLAST" },
+ { WM_ASYNCIO, "ASYNCIO" },
+ { 0, 0 }};
+
+void _strace_wm (int message, int word, int lon)
+{
+ if (strace_active)
+ {
+ int i;
+
+ for (i = 0; ta[i].n; i++)
+ {
+ if (ta[i].v == message)
+ {
+ strace_printf (_STRACE_WM, "wndproc %d %s %d %d", message, ta[i].n, word, lon);
+ return;
+ }
+ }
+ strace_printf (_STRACE_WM, "wndproc %d unknown %d %d", message, word, lon);
+ }
+}
+
+/* Print a message on stderr (bypassing anything that could prevent the
+ message from being printed, for example a buggy or corrupted stdio).
+ This is used, for example, to print diagnostics of fatal errors. */
+
+void
+__system_printf (const char *fmt,...)
+{
+ char buf[6000];
+ va_list ap;
+ int count;
+
+ PROTECT (buf);
+ va_start (ap, fmt);
+ count = strace_vsprintf (buf, fmt, ap);
+ va_end (ap);
+ CHECK (buf);
+
+ DWORD done;
+ WriteFile (GetStdHandle (STD_ERROR_HANDLE), buf, count, &done, 0);
+ FlushFileBuffers (GetStdHandle (STD_ERROR_HANDLE));
+
+#ifndef NOSTRACE
+ if (strace_active)
+ strace_write (1, buf, count);
+#endif
+
+#ifdef DEBUGGING
+// try_to_debug ();
+#endif
+}
+
+#else
+
+/* empty functions for when strace is disabled */
+
+void
+strace_init (const char *buf)
+{}
+
+extern "C" {
+void _strace_wm (int message, int word, int lon)
+{}
+}
+#endif /*NOSTRACE*/
diff --git a/winsup/cygwin/strsep.cc b/winsup/cygwin/strsep.cc
new file mode 100644
index 000000000..0a421f6e1
--- /dev/null
+++ b/winsup/cygwin/strsep.cc
@@ -0,0 +1,65 @@
+/* strsep.cc: strsep call */
+
+#include <stdio.h>
+
+/*-
+ * Copyright (c) 1990, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+extern "C"
+char *
+strsep (char **stringp,
+ const char *delim)
+{
+ register char *s;
+ register const char *spanp;
+ register int c, sc;
+ char *tok;
+
+ if ((s = *stringp) == NULL)
+ return (NULL);
+ for (tok = s;;) {
+ c = *s++;
+ spanp = delim;
+ do {
+ if ((sc = *spanp++) == c) {
+ if (c == 0)
+ s = NULL;
+ else
+ s[-1] = 0;
+ *stringp = s;
+ return (tok);
+ }
+ } while (sc != 0);
+ }
+ /* NOTREACHED */
+}
diff --git a/winsup/cygwin/sync.cc b/winsup/cygwin/sync.cc
new file mode 100644
index 000000000..89d92ce06
--- /dev/null
+++ b/winsup/cygwin/sync.cc
@@ -0,0 +1,112 @@
+/* sync.cc: Synchronization functions for cygwin.
+
+ This file implements the methods for controlling the "muto" class
+ which is intended to operate similarly to a mutex but attempts to
+ avoid making expensive calls to the kernel.
+
+ Copyright 1999 Cygnus Solutions.
+
+ Written by Christopher Faylor <cgf@cygnus.com>
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#include <stdlib.h>
+#include <time.h>
+#include <sys/wait.h>
+#include <errno.h>
+#include <stdlib.h>
+#include "winsup.h"
+
+/* Constructor */
+muto::muto(int inh, const char *name) : sync (0), visits(0), waiters(-1), tid (0)
+{
+ /* Create event which is used in the fallback case when blocking is necessary */
+ if (!(bruteforce = CreateEvent (inh ? &sec_all_nih : &sec_none_nih, FALSE, FALSE, name)))
+ {
+ DWORD oerr = GetLastError ();
+ SetLastError (oerr);
+ return;
+ }
+}
+
+/* Destructor */
+muto::~muto ()
+{
+ /* Just need to close the event handle */
+ if (bruteforce)
+ CloseHandle (bruteforce);
+}
+
+/* Acquire the lock. Argument is the number of milliseconds to wait for
+ the lock. Multiple visits from the same thread are allowed and should
+ be handled correctly. */
+int
+muto::acquire (DWORD ms)
+{
+ DWORD this_tid = GetCurrentThreadId ();
+
+ if (tid != this_tid)
+ {
+ /* Increment the waiters part of the class. Need to do this first to
+ avoid potential races. */
+ LONG was_waiting = InterlockedIncrement (&waiters);
+
+ /* This is deceptively simple. Basically, it allows multiple attempts to
+ lock the same muto to succeed without attempting to manipulate sync.
+ If the muto is already locked then this thread will wait for ms until
+ it is signalled by muto::release. Then it will attempt to grab the
+ sync field. If it succeeds, then this thread owns the mutex.
+
+ There is a pathological condition where a thread times out waiting for
+ bruteforce but the release code triggers the bruteforce event. In this
+ case, it is possible for a thread which is going to wait for bruteforce
+ to wake up immediately. It will then attempt to grab sync but will fail
+ and go back to waiting. */
+ while (tid != this_tid && (was_waiting || InterlockedExchange (&sync, 1) != 0))
+ {
+ switch (WaitForSingleObject (bruteforce, ms))
+ {
+ case WAIT_OBJECT_0:
+ was_waiting = 0;
+ break;
+ default:
+ InterlockedDecrement (&waiters);
+ return 0; /* failed. */
+ }
+ }
+ }
+
+ tid = this_tid; /* register this thread. */
+ return ++visits; /* Increment visit count. */
+}
+
+/* Return the muto lock. Needs to be called once per every acquire. */
+int
+muto::release ()
+{
+ DWORD this_tid = GetCurrentThreadId ();
+
+ if (tid != this_tid || !visits)
+ {
+ SetLastError (ERROR_NOT_OWNER); /* Didn't have the lock. */
+ return 0; /* failed. */
+ }
+
+ /* FIXME: Need to check that other thread has not exited, too. */
+ if (!--visits)
+ {
+ tid = 0; /* We were the last unlocker. */
+ InterlockedExchange (&sync, 0); /* Reset trigger. */
+ /* This thread had incremented waiters but had never decremented it.
+ Decrement it now. If it is >= 0 then there are possibly other
+ threads waiting for the lock, so trigger bruteforce. */
+ if (InterlockedDecrement (&waiters) >= 0)
+ (void) SetEvent (bruteforce); /* Wake up one of the waiting threads */
+ }
+
+ return 1; /* success. */
+}
diff --git a/winsup/cygwin/sync.h b/winsup/cygwin/sync.h
new file mode 100644
index 000000000..18cff7800
--- /dev/null
+++ b/winsup/cygwin/sync.h
@@ -0,0 +1,48 @@
+/* sync.h: Header file for cygwin synchronization primitives.
+
+ Copyright 1999 Cygnus Solutions.
+
+ Written by Christopher Faylor <cgf@cygnus.com>
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+/* FIXME: Note that currently this class cannot be allocated via `new' since
+ there are issues with malloc and fork. */
+class muto
+{
+ LONG sync; /* Used to serialize access to this class. */
+ LONG visits; /* Count of number of times a thread has called acquire. */
+ LONG waiters; /* Number of threads waiting for lock. */
+ HANDLE bruteforce; /* event handle used to control waiting for lock. */
+ DWORD tid; /* Thread Id of lock owner. */
+public:
+ void *operator new (size_t, void *p) {return p;}
+ void *operator new (size_t n) {return ::new muto; }
+ void operator delete (void *p) {;} /* can't handle allocated mutos
+ currently */
+
+ /* This simple constructor is used for cases where no bruteforce
+ event handling is required. */
+ muto(): sync(0), visits(0), waiters(-1), bruteforce(0), tid(0) {;}
+ /* A more complicated constructor. */
+ muto(int inh, const char *name);
+ ~muto ();
+ int acquire (DWORD ms = INFINITE); /* Acquire the lock. */
+ int release (); /* Release the lock. */
+
+ /* Return true if caller thread owns the lock. */
+ int ismine () {return tid == GetCurrentThreadId ();}
+};
+
+/* Use a statically allocated buffer as the storage for a muto */
+#define new_muto(__inh, __name) \
+({ \
+ static NO_COPY char __mbuf[sizeof(class muto) + 100] = {0}; \
+ muto *m; \
+ m = new (__mbuf) muto ((__inh), (__name)); \
+ m; \
+})
diff --git a/winsup/cygwin/syscalls.cc b/winsup/cygwin/syscalls.cc
new file mode 100644
index 000000000..650f71566
--- /dev/null
+++ b/winsup/cygwin/syscalls.cc
@@ -0,0 +1,1939 @@
+/* syscalls.cc: syscalls
+
+ Copyright 1996, 1997, 1998, 1999, 2000 Cygnus Solutions.
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#include <sys/stat.h>
+#include <sys/vfs.h> /* needed for statfs */
+#include <fcntl.h>
+#include <pwd.h>
+#include <grp.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <process.h>
+#include <utmp.h>
+#include <sys/uio.h>
+#include <errno.h>
+#include <limits.h>
+#include "winsup.h"
+#include <lmcons.h> /* for UNLEN */
+#include <unistd.h>
+
+extern BOOL allow_ntsec;
+
+/* Close all files and process any queued deletions.
+ Lots of unix style applications will open a tmp file, unlink it,
+ but never call close. This function is called by _exit to
+ ensure we don't leave any such files lying around. */
+
+void __stdcall
+close_all_files (void)
+{
+ for (int i = 0; i < (int)dtable.size; i++)
+ if (!dtable.not_open (i))
+ _close (i);
+
+ cygwin_shared->delqueue.process_queue ();
+}
+
+extern "C"
+int
+_unlink (const char *ourname)
+{
+ int res = -1;
+
+ path_conv win32_name (ourname, SYMLINK_NOFOLLOW);
+
+ if (win32_name.error)
+ {
+ set_errno (win32_name.error);
+ goto done;
+ }
+
+ syscall_printf ("_unlink (%s)", win32_name.get_win32 ());
+
+ DWORD atts;
+ atts = win32_name.file_attributes ();
+ if (atts != 0xffffffff && atts & FILE_ATTRIBUTE_DIRECTORY)
+ {
+ syscall_printf ("unlinking a directory");
+ set_errno (EPERM);
+ goto done;
+ }
+
+ /* Windows won't check the directory mode, so we do that ourselves. */
+ if (! writable_directory (win32_name.get_win32 ()))
+ {
+ syscall_printf ("non-writable directory");
+ goto done;
+ }
+
+ if (DeleteFileA (win32_name.get_win32 ()))
+ res = 0;
+ else
+ {
+ res = GetLastError ();
+
+ /* if access denied, chmod to be writable in case it is not
+ and try again */
+ /* FIXME!!! Should check whether ourname is directory or file
+ and only try again if permissions are not sufficient */
+ if (res == ERROR_ACCESS_DENIED)
+ {
+ /* chmod ourname to be writable here */
+ res = chmod (ourname, 0777);
+
+ if (DeleteFileA (win32_name.get_win32 ()))
+ {
+ res = 0;
+ goto done;
+ }
+ res = GetLastError ();
+ }
+
+ /* If we get ERROR_SHARING_VIOLATION, the file may still be open -
+ Windows NT doesn't support deleting a file while it's open. */
+ if (res == ERROR_SHARING_VIOLATION)
+ {
+ cygwin_shared->delqueue.queue_file (win32_name.get_win32 ());
+ res = 0;
+ }
+ else
+ {
+ __seterrno ();
+ res = -1;
+ }
+ }
+
+done:
+ syscall_printf ("%d = unlink (%s)", res, ourname);
+ return res;
+}
+
+extern "C"
+pid_t
+_getpid ()
+{
+ return myself->pid;
+}
+
+/* getppid: POSIX 4.1.1.1 */
+extern "C"
+pid_t
+getppid ()
+{
+ return myself->ppid;
+}
+
+/* setsid: POSIX 4.3.2.1 */
+extern "C"
+pid_t
+setsid (void)
+{
+ /* FIXME: for now */
+ if (myself->pgid != _getpid ())
+ {
+ myself->ctty = -1;
+ myself->sid = _getpid ();
+ myself->pgid = _getpid ();
+ syscall_printf ("sid %d, pgid %d, ctty %d", myself->sid, myself->pgid, myself->ctty);
+ return myself->sid;
+ }
+ set_errno (EPERM);
+ return -1;
+}
+
+static int
+read_handler (int fd, void *ptr, size_t len, int blocksigs)
+{
+ int res;
+ fhandler_base *fh = dtable[fd];
+
+ if (dtable.not_open (fd))
+ {
+ set_errno (EBADF);
+ return -1;
+ }
+
+ if ((fh->get_flags() & (O_NONBLOCK | O_NDELAY)) && !fh->ready_for_read (fd, 0, 0))
+ {
+ syscall_printf ("nothing to read");
+ set_errno (EAGAIN);
+ return -1;
+ }
+
+ /* Check to see if this is a background read from a "tty",
+ sending a SIGTTIN, if appropriate */
+ res = fh->bg_check (SIGTTIN, blocksigs);
+ if (res > 0)
+ {
+ myself->process_state |= PID_TTYIN;
+ res = fh->read (ptr, len);
+ myself->process_state &= ~PID_TTYIN;
+ }
+ syscall_printf ("%d = read (%d<%s>, %p, %d)", res, fd, fh->get_name (), ptr, len);
+ return res;
+}
+
+extern "C" int
+_read (int fd, void *ptr, size_t len)
+{
+ if (dtable.not_open (fd))
+ {
+ set_errno (EBADF);
+ return -1;
+ }
+
+ fhandler_base *fh = dtable[fd];
+
+ /* Could block, so let user know we at least got here. */
+ syscall_printf ("read (%d, %p, %d)", fd, ptr, len);
+
+ if (!fh->is_slow () || (fh->get_flags () & (O_NONBLOCK | O_NDELAY)) ||
+ fh->get_r_no_interrupt ())
+ {
+ debug_printf ("non-interruptible read\n");
+ return read_handler (fd, ptr, len, 0);
+ }
+
+ if (fh->ready_for_read (fd, INFINITE, 0))
+ return read_handler (fd, ptr, len, 1);
+
+ set_sig_errno (EINTR);
+ syscall_printf ("%d = read (%d<%s>, %p, %d), errno %d", -1, fd, fh->get_name (),
+ ptr, len, get_errno ());
+ MALLOC_CHECK;
+ return -1;
+}
+
+extern "C"
+int
+_write (int fd, const void *ptr, size_t len)
+{
+ int res = -1;
+
+ if (dtable.not_open (fd))
+ {
+ set_errno (EBADF);
+ goto done;
+ }
+
+ /* Could block, so let user know we at least got here. */
+ if (fd == 1 || fd == 2)
+ paranoid_printf ("write (%d, %p, %d)", fd, ptr, len);
+ else
+ syscall_printf ("write (%d, %p, %d)", fd, ptr, len);
+
+ fhandler_base *fh;
+ fh = dtable[fd];
+
+ res = fh->bg_check (SIGTTOU, 0);
+ if (res > 0)
+ {
+ myself->process_state |= PID_TTYOU;
+ res = fh->write (ptr, len);
+ myself->process_state &= ~PID_TTYOU;
+ }
+
+done:
+ if (fd == 1 || fd == 2)
+ paranoid_printf ("%d = write (%d, %p, %d)", res, fd, ptr, len);
+ else
+ syscall_printf ("%d = write (%d, %p, %d)", res, fd, ptr, len);
+
+ MALLOC_CHECK;
+ return (ssize_t)res;
+}
+
+/*
+ * FIXME - should really move this interface into fhandler, and implement
+ * write in terms of it. There are devices in Win32 that could do this with
+ * overlapped I/O much more efficiently - we should eventually use
+ * these.
+ */
+
+extern "C"
+ssize_t
+writev (int fd, const struct iovec *iov, int iovcnt)
+{
+ int i;
+ ssize_t len, total;
+ char *base;
+
+ if (iovcnt < 1 || iovcnt > IOV_MAX)
+ {
+ set_errno (EINVAL);
+ return -1;
+ }
+
+ /* Ensure that the sum of the iov_len values is less than
+ SSIZE_MAX (per spec), if so, we must fail with no output (per spec).
+ */
+ total = 0;
+ for (i = 0; i < iovcnt; ++i)
+ {
+ total += iov[i].iov_len;
+ if (total > SSIZE_MAX)
+ {
+ set_errno (EINVAL);
+ return -1;
+ }
+ }
+ /* Now write the data */
+ for (i = 0, total = 0; i < iovcnt; i++, iov++)
+ {
+ len = iov->iov_len;
+ base = iov->iov_base;
+ while (len > 0)
+ {
+ register int nbytes;
+ nbytes = write (fd, base, len);
+ if (nbytes < 0 && total == 0)
+ return -1;
+ if (nbytes <= 0)
+ return total;
+ len -= nbytes;
+ total += nbytes;
+ base += nbytes;
+ }
+ }
+ return total;
+}
+
+/*
+ * FIXME - should really move this interface into fhandler, and implement
+ * read in terms of it. There are devices in Win32 that could do this with
+ * overlapped I/O much more efficiently - we should eventually use
+ * these.
+ */
+
+extern "C"
+ssize_t
+readv (int fd, const struct iovec *iov, int iovcnt)
+{
+ int i;
+ ssize_t len, total;
+ char *base;
+
+ for (i = 0, total = 0; i < iovcnt; i++, iov++)
+ {
+ len = iov->iov_len;
+ base = iov->iov_base;
+ while (len > 0)
+ {
+ register int nbytes;
+ nbytes = read (fd, base, len);
+ if (nbytes < 0 && total == 0)
+ return -1;
+ if (nbytes <= 0)
+ return total;
+ len -= nbytes;
+ total += nbytes;
+ base += nbytes;
+ }
+ }
+ return total;
+}
+
+/* _open */
+/* newlib's fcntl.h defines _open as taking variable args so we must
+ correspond. The third arg if it exists is: mode_t mode. */
+extern "C"
+int
+_open (const char *unix_path, int flags, ...)
+{
+ int fd;
+ int res = -1;
+ va_list ap;
+ mode_t mode = 0;
+ fhandler_base *fh;
+
+ syscall_printf ("open (%s, %p)", unix_path, flags);
+ if (!check_null_empty_path_errno(unix_path))
+ {
+ SetResourceLock(LOCK_FD_LIST,WRITE_LOCK|READ_LOCK," open ");
+
+ /* check for optional mode argument */
+ va_start (ap, flags);
+ mode = va_arg (ap, mode_t);
+ va_end (ap);
+
+ fd = dtable.find_unused_handle ();
+
+ if (fd < 0)
+ set_errno (ENMFILE);
+ else if ((fh = dtable.build_fhandler (fd, unix_path, NULL)) == NULL)
+ res = -1; // errno already set
+ else if (!fh->open (unix_path, flags, (mode & 0777) & ~myself->umask))
+ {
+ dtable.release (fd);
+ res = -1;
+ }
+ else if ((res = fd) <= 2)
+ set_std_handle (res);
+ ReleaseResourceLock(LOCK_FD_LIST,WRITE_LOCK|READ_LOCK," open");
+ }
+
+ syscall_printf ("%d = open (%s, %p)", res, unix_path, flags);
+ return res;
+}
+
+extern "C"
+off_t
+_lseek (int fd, off_t pos, int dir)
+{
+ off_t res;
+
+ if (dtable.not_open (fd))
+ {
+ set_errno (EBADF);
+ res = -1;
+ }
+ else
+ {
+ res = dtable[fd]->lseek (pos, dir);
+ }
+ syscall_printf ("%d = lseek (%d, %d, %d)", res, fd, pos, dir);
+
+ return res;
+}
+
+extern "C"
+int
+_close (int fd)
+{
+ int res;
+
+ syscall_printf ("close (%d)", fd);
+
+ MALLOC_CHECK;
+ if (dtable.not_open (fd))
+ {
+ debug_printf ("handle %d not open", fd);
+ set_errno (EBADF);
+ res = -1;
+ }
+ else
+ {
+ SetResourceLock(LOCK_FD_LIST,WRITE_LOCK|READ_LOCK," close");
+ res = dtable[fd]->close ();
+ dtable.release (fd);
+ ReleaseResourceLock(LOCK_FD_LIST,WRITE_LOCK|READ_LOCK," close");
+ }
+
+ syscall_printf ("%d = close (%d)", res, fd);
+ MALLOC_CHECK;
+ return res;
+}
+
+extern "C"
+int
+isatty (int fd)
+{
+ int res;
+
+ if (dtable.not_open (fd))
+ {
+ syscall_printf ("0 = isatty (%d)", fd);
+ return 0;
+ }
+
+ res = dtable[fd]->is_tty ();
+ syscall_printf ("%d = isatty (%d)", res, fd);
+ return res;
+}
+
+/* Under NT, try to make a hard link using backup API. If that
+ fails or we are Win 95, just copy the file.
+ FIXME: We should actually be checking partition type, not OS.
+ Under NTFS, we should support hard links. On FAT partitions,
+ we should just copy the file.
+*/
+
+extern "C"
+int
+_link (const char *a, const char *b)
+{
+ int res = -1;
+ path_conv real_a (a, SYMLINK_NOFOLLOW);
+
+ if (real_a.error)
+ {
+ set_errno (real_a.error);
+ syscall_printf ("-1 = link (%s, %s)", a, b);
+ return -1;
+ }
+
+ path_conv real_b (b, SYMLINK_NOFOLLOW);
+
+ if (real_b.error)
+ {
+ set_errno (real_b.error);
+ syscall_printf ("-1 = link (%s, %s)", a, b);
+ return -1;
+ }
+
+ /* Try to make hard link first on Windows NT */
+ if (os_being_run == winNT)
+ {
+ HANDLE hFileSource;
+
+ WIN32_STREAM_ID StreamId;
+ DWORD dwBytesWritten;
+ LPVOID lpContext;
+ DWORD cbPathLen;
+ DWORD StreamSize;
+ WCHAR wbuf[MAX_PATH];
+ char buf[MAX_PATH];
+
+ BOOL bSuccess;
+
+ hFileSource = CreateFile (
+ real_a.get_win32 (),
+ FILE_WRITE_ATTRIBUTES,
+ FILE_SHARE_READ | FILE_SHARE_WRITE /*| FILE_SHARE_DELETE*/,
+ &sec_none_nih, // sa
+ OPEN_EXISTING,
+ 0,
+ NULL
+ );
+
+ if (hFileSource == INVALID_HANDLE_VALUE)
+ {
+ syscall_printf ("cannot open source, %E");
+ goto docopy;
+ }
+
+ lpContext = NULL;
+ cygwin_conv_to_full_win32_path (real_b.get_win32 (), buf);
+ OemToCharW (buf, wbuf);
+ cbPathLen = (strlen (buf) + 1) * sizeof (WCHAR);
+
+ StreamId.dwStreamId = BACKUP_LINK;
+ StreamId.dwStreamAttributes = 0;
+ StreamId.dwStreamNameSize = 0;
+ StreamId.Size.HighPart = 0;
+ StreamId.Size.LowPart = cbPathLen;
+
+ StreamSize = sizeof (WIN32_STREAM_ID) - sizeof (WCHAR**) +
+ StreamId.dwStreamNameSize;
+
+ /* Write the WIN32_STREAM_ID */
+ bSuccess = BackupWrite (
+ hFileSource,
+ (LPBYTE) &StreamId, // buffer to write
+ StreamSize, // number of bytes to write
+ &dwBytesWritten,
+ FALSE, // don't abort yet
+ FALSE, // don't process security
+ &lpContext);
+
+ if (bSuccess)
+ {
+ /* write the buffer containing the path */
+ /* FIXME: BackupWrite sometimes traps if linkname is invalid.
+ Need to handle. */
+ bSuccess = BackupWrite (
+ hFileSource,
+ (LPBYTE) wbuf, // buffer to write
+ cbPathLen, // number of bytes to write
+ &dwBytesWritten,
+ FALSE, // don't abort yet
+ FALSE, // don't process security
+ &lpContext
+ );
+
+ if (!bSuccess)
+ syscall_printf ("cannot write linkname, %E");
+
+ /* Free context */
+ BackupWrite (
+ hFileSource,
+ NULL, // buffer to write
+ 0, // number of bytes to write
+ &dwBytesWritten,
+ TRUE, // abort
+ FALSE, // don't process security
+ &lpContext
+ );
+ }
+ else
+ syscall_printf ("cannot write streamId, %E");
+
+ CloseHandle (hFileSource);
+
+ if (!bSuccess)
+ goto docopy;
+
+ res = 0;
+ goto done;
+ }
+docopy:
+ /* do this with a copy */
+ if (CopyFileA (real_a.get_win32 (), real_b.get_win32 (), 1))
+ res = 0;
+ else
+ __seterrno ();
+
+done:
+ syscall_printf ("%d = link (%s, %s)", res, a, b);
+ return res;
+}
+
+#if 0
+static BOOL
+rel2abssd (PSECURITY_DESCRIPTOR psd_rel, PSECURITY_DESCRIPTOR psd_abs,
+ DWORD abslen)
+{
+#ifdef _MT_SAFE
+ struct _winsup_t *r=_reent_winsup();
+ char *dacl_buf=r->_dacl_buf;
+ char *sacl_buf=r->_sacl_buf;
+ char *ownr_buf=r->_ownr_buf;
+ char *grp_buf=r->_grp_buf;
+#else
+ static char dacl_buf[1024];
+ static char sacl_buf[1024];
+ static char ownr_buf[1024];
+ static char grp_buf[1024];
+#endif
+ DWORD dacl_len = 1024;
+ DWORD sacl_len = 1024;
+ DWORD ownr_len = 1024;
+ DWORD grp_len = 1024;
+
+ BOOL res = MakeAbsoluteSD (psd_rel, psd_abs, &abslen, (PACL) dacl_buf,
+ &dacl_len, (PACL) sacl_buf, &sacl_len,
+ (PSID) ownr_buf, &ownr_len, (PSID) grp_buf,
+ &grp_len);
+
+ syscall_printf ("%d = rel2abssd (...)", res);
+ return res;
+}
+#endif
+
+/* chown: POSIX 5.6.5.1 */
+/*
+ * chown() is only implemented for Windows NT. Under other operating
+ * systems, it is only a stub that always returns zero.
+ *
+ * Note: the SetFileSecurity API in NT can only set the current
+ * user as file owner so we have to use the Backup API instead.
+ */
+extern "C"
+int
+chown (const char * name, uid_t uid, gid_t gid)
+{
+ int res;
+
+ if (os_being_run != winNT) // real chown only works on NT
+ res = 0; // return zero (and do nothing) under Windows 9x
+ else
+ {
+ /* we need Win32 path names because of usage of Win32 API functions */
+ path_conv win32_path (name);
+
+ if (win32_path.error)
+ {
+ set_errno (win32_path.error);
+ res = -1;
+ goto done;
+ }
+
+ /* FIXME: This makes chown on a device succeed always. Someday we'll want
+ to actually allow chown to work properly on devices. */
+ if (win32_path.is_device ())
+ {
+ res = 0;
+ goto done;
+ }
+
+ DWORD attrib = 0;
+ if (win32_path.file_attributes () & FILE_ATTRIBUTE_DIRECTORY)
+ attrib |= S_IFDIR;
+ int has_acls;
+ has_acls = allow_ntsec && win32_path.has_acls ();
+ res = get_file_attribute (has_acls, win32_path.get_win32 (), (int *) &attrib);
+ if (!res)
+ res = set_file_attribute (win32_path.has_acls (),
+ win32_path.get_win32 (),
+ uid, gid, attrib,
+ myself->logsrv);
+
+ if (res != 0 && get_errno () == ENOSYS)
+ {
+ /* fake - if not supported, pretend we're like win95
+ where it just works */
+ res = 0;
+ }
+ }
+
+done:
+ syscall_printf ("%d = chown (%s,...)", res, name);
+ return res;
+}
+
+/* umask: POSIX 5.3.3.1 */
+extern "C"
+mode_t
+umask (mode_t mask)
+{
+ mode_t oldmask;
+
+ oldmask = myself->umask;
+ myself->umask = mask & 0777;
+ return oldmask;
+}
+
+/* chmod: POSIX 5.6.4.1 */
+extern "C"
+int
+chmod (const char *path, mode_t mode)
+{
+ int res = -1;
+
+ path_conv win32_path (path);
+
+ if (win32_path.error)
+ {
+ set_errno (win32_path.error);
+ goto done;
+ }
+
+ /* FIXME: This makes chmod on a device succeed always. Someday we'll want
+ to actually allow chmod to work properly on devices. */
+ if (win32_path.is_device ())
+ {
+ res = 0;
+ goto done;
+ }
+
+ if (win32_path.file_attributes () == (DWORD)-1)
+ __seterrno ();
+ else
+ {
+ DWORD attr = win32_path.file_attributes ();
+ /* temporary erase read only bit, to be able to set file security */
+ SetFileAttributesA (win32_path.get_win32 (),
+ attr & ~FILE_ATTRIBUTE_READONLY);
+
+ int has_acls = allow_ntsec && win32_path.has_acls ();
+ uid_t uid = get_file_owner (has_acls, win32_path.get_win32 ());
+ if (! set_file_attribute (has_acls, win32_path.get_win32 (),
+ uid,
+ get_file_group (has_acls,
+ win32_path.get_win32 ()),
+ mode,
+ myself->logsrv)
+ && allow_ntsec)
+ res = 0;
+
+ /* if the mode we want has any write bits set, we can't
+ be read only. */
+ if (mode & (S_IWUSR | S_IWGRP | S_IWOTH))
+ attr &= ~FILE_ATTRIBUTE_READONLY;
+ else
+ attr |= FILE_ATTRIBUTE_READONLY;
+
+ if (S_ISLNK (mode) || S_ISSOCK (mode))
+ attr |= FILE_ATTRIBUTE_SYSTEM;
+
+ if (!SetFileAttributesA (win32_path.get_win32 (), attr))
+ __seterrno ();
+ else
+ {
+ /* Correct NTFS security attributes have higher priority */
+ if (res == 0 || !allow_ntsec)
+ res = 0;
+ }
+ }
+
+done:
+ syscall_printf ("%d = chmod (%s, %p)", res, path, mode);
+ return res;
+}
+
+/* fchmod: P96 5.6.4.1 */
+
+extern "C"
+int
+fchmod (int fd, mode_t mode)
+{
+ if (dtable.not_open (fd))
+ {
+ syscall_printf ("-1 = fchmod (%d, 0%o)", fd, mode);
+ set_errno (EBADF);
+ return -1;
+ }
+
+ const char *path = dtable[fd]->get_name ();
+
+ if (path == NULL)
+ {
+ syscall_printf ("-1 = fchmod (%d, 0%o) (no name)", fd, mode);
+ set_errno (ENOSYS);
+ return -1;
+ }
+
+ syscall_printf ("fchmod (%d, 0%o): calling chmod (%s, 0%o)",
+ fd, mode, path, mode);
+ return chmod (path, mode);
+}
+
+/* Cygwin internal */
+static int
+num_entries (const char *win32_name)
+{
+ WIN32_FIND_DATA buf;
+ HANDLE handle;
+ char buf1[MAX_PATH];
+ int count = 0;
+
+ strcpy (buf1, win32_name);
+ int len = strlen (buf1);
+ if (len == 0 || isdirsep (buf1[len - 1]))
+ strcat (buf1, "*");
+ else
+ strcat (buf1, "/*"); /* */
+
+ handle = FindFirstFileA (buf1, &buf);
+
+ if (handle == INVALID_HANDLE_VALUE)
+ return 0;
+ count ++;
+ while (FindNextFileA (handle, &buf))
+ {
+ if ((buf.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
+ count ++;
+ }
+ FindClose (handle);
+ return count;
+}
+
+extern "C"
+int
+_fstat (int fd, struct stat *buf)
+{
+ int r;
+
+ if (dtable.not_open (fd))
+ {
+ syscall_printf ("-1 = fstat (%d, %p)", fd, buf);
+ set_errno (EBADF);
+ r = -1;
+ }
+ else
+ {
+ memset (buf, 0, sizeof (struct stat));
+ r = dtable[fd]->fstat (buf);
+ syscall_printf ("%d = fstat (%d, %x)", r,fd,buf);
+ }
+
+ return r;
+}
+
+/* fsync: P96 6.6.1.1 */
+extern "C"
+int
+fsync (int fd)
+{
+ if (dtable.not_open (fd))
+ {
+ syscall_printf ("-1 = fsync (%d)", fd);
+ set_errno (EBADF);
+ return -1;
+ }
+
+ HANDLE h = dtable[fd]->get_handle ();
+
+ if (FlushFileBuffers (h) == 0)
+ {
+ __seterrno ();
+ return -1;
+ }
+ return 0;
+}
+
+/* sync: standards? */
+extern "C"
+int
+sync ()
+{
+ return 0;
+}
+
+int __stdcall
+stat_dev (DWORD devn, int unit, unsigned long ino, struct stat *buf)
+{
+ switch (devn)
+ {
+ case FH_CONOUT:
+ case FH_PIPEW:
+ buf->st_mode = STD_WBITS;
+ break;
+ case FH_CONIN:
+ case FH_PIPER:
+ buf->st_mode = STD_RBITS;
+ break;
+ default:
+ buf->st_mode = STD_RBITS | S_IWUSR | S_IWGRP | S_IWOTH;
+ break;
+ }
+
+ buf->st_mode |= S_IFCHR;
+ buf->st_blksize = S_BLKSIZE;
+ buf->st_nlink = 1;
+ buf->st_dev = buf->st_rdev = FHDEVN (devn) << 8 | (unit & 0xff);
+ buf->st_ino = ino;
+ buf->st_atime = buf->st_mtime = buf->st_ctime = time (NULL);
+ return 0;
+}
+
+/* Cygwin internal */
+static int
+stat_worker (const char *caller, const char *name, struct stat *buf,
+ int nofollow)
+{
+ int res = -1;
+ int atts;
+ char *win32_name;
+ char drive[4] = "X:\\";
+ MALLOC_CHECK;
+
+ debug_printf ("%s (%s, %p)", caller, name, buf);
+
+ path_conv real_path (name, nofollow ? SYMLINK_NOFOLLOW : SYMLINK_FOLLOW, 1);
+ if (real_path.error)
+ {
+ set_errno (real_path.error);
+ goto done;
+ }
+
+ memset (buf, 0, sizeof (struct stat));
+
+ win32_name = real_path.get_win32 ();
+ if (real_path.is_device ())
+ return stat_dev (real_path.get_devn (), real_path.get_unitn (),
+ hash_path_name (0, win32_name), buf);
+
+ atts = real_path.file_attributes ();
+
+/* FIXME: this is of dubious merit and is fundamentally flawed.
+ E.g., what if the .exe file is a symlink? This is not accounted
+ for here. Also, what about all of the other special extensions?
+
+ This could be "fixed" by passing the appropriate extension list
+ to path_conv but I'm not sure that this is really justified. */
+
+ /* If we can't find the name, try again with a .exe suffix
+ [but only if not already present]. */
+ if (atts == -1 && GetLastError () == ERROR_FILE_NOT_FOUND &&
+ !(strrchr (win32_name, '.') > strrchr (win32_name, '\\')))
+ {
+ debug_printf ("trying with .exe suffix");
+ strcat (win32_name, ".exe");
+ atts = (int) GetFileAttributesA (win32_name);
+ if (atts == -1)
+ strchr (win32_name, '\0')[4] = '\0';
+ }
+
+ debug_printf ("%d = GetFileAttributesA (%s)", atts, win32_name);
+
+ drive[0] = win32_name[0];
+ UINT dtype;
+
+ if (atts == -1 || !(atts & FILE_ATTRIBUTE_DIRECTORY) ||
+ (os_being_run == winNT
+ && (((dtype = GetDriveType (drive)) != DRIVE_NO_ROOT_DIR
+ //&& dtype != DRIVE_REMOTE
+ && dtype != DRIVE_UNKNOWN))))
+ {
+ fhandler_disk_file fh (NULL);
+
+ if (fh.open (real_path, O_RDONLY | O_BINARY | O_DIROPEN |
+ (nofollow ? O_NOSYMLINK : 0), 0))
+ {
+ res = fh.fstat (buf);
+ fh.close ();
+ if (atts != -1 && (atts & FILE_ATTRIBUTE_DIRECTORY))
+ buf->st_nlink = num_entries (win32_name);
+ }
+ }
+ else
+ {
+ WIN32_FIND_DATA wfd;
+ HANDLE handle;
+ /* hmm, the number of links to a directory includes the
+ number of entries in the directory, since all the things
+ in the directory point to it */
+ buf->st_nlink += num_entries (win32_name);
+ buf->st_dev = FHDEVN(FH_DISK) << 8;
+ buf->st_ino = hash_path_name (0, real_path.get_win32 ());
+ buf->st_mode = S_IFDIR | STD_RBITS | STD_XBITS;
+ if ((atts & FILE_ATTRIBUTE_READONLY) == 0)
+ buf->st_mode |= STD_WBITS;
+
+ int has_acls = allow_ntsec && real_path.has_acls ();
+
+ buf->st_uid = get_file_owner (has_acls, real_path.get_win32 ());
+ buf->st_gid = get_file_group (has_acls, real_path.get_win32 ());
+
+ if ((handle = FindFirstFile (real_path.get_win32(), &wfd)) != INVALID_HANDLE_VALUE)
+ {
+ buf->st_atime = to_time_t (&wfd.ftLastAccessTime);
+ buf->st_mtime = to_time_t (&wfd.ftLastWriteTime);
+ buf->st_ctime = to_time_t (&wfd.ftCreationTime);
+ buf->st_size = wfd.nFileSizeLow;
+ buf->st_blksize = S_BLKSIZE;
+ buf->st_blocks = (buf->st_size + S_BLKSIZE-1) / S_BLKSIZE;
+ FindClose (handle);
+ }
+ res = 0;
+ }
+
+ done:
+ MALLOC_CHECK;
+ syscall_printf ("%d = %s (%s, %p)", res, caller, name, buf);
+ return res;
+}
+
+extern "C"
+int
+_stat (const char *name, struct stat *buf)
+{
+ return stat_worker ("stat", name, buf, 0);
+}
+
+/* lstat: Provided by SVR4 and 4.3+BSD, POSIX? */
+extern "C"
+int
+lstat (const char *name, struct stat *buf)
+{
+ return stat_worker ("lstat", name, buf, 1);
+}
+
+extern int acl_access (const char *, int);
+
+extern "C"
+int
+access (const char *fn, int flags)
+{
+ // flags were incorrectly specified
+ if (flags & ~(F_OK|R_OK|W_OK|X_OK))
+ {
+ set_errno (EINVAL);
+ return -1;
+ }
+
+ if (allow_ntsec)
+ return acl_access (fn, flags);
+
+ struct stat st;
+ int r = stat (fn, &st);
+ if (r)
+ return -1;
+ r = -1;
+ if (flags & R_OK)
+ {
+ if (st.st_uid == myself->uid)
+ {
+ if (!(st.st_mode & S_IRUSR))
+ goto done;
+ }
+ else if (st.st_gid == myself->gid)
+ {
+ if (!(st.st_mode & S_IRGRP))
+ goto done;
+ }
+ else if (!(st.st_mode & S_IROTH))
+ goto done;
+ }
+ if (flags & W_OK)
+ {
+ if (st.st_uid == myself->uid)
+ {
+ if (!(st.st_mode & S_IWUSR))
+ goto done;
+ }
+ else if (st.st_gid == myself->gid)
+ {
+ if (!(st.st_mode & S_IWGRP))
+ goto done;
+ }
+ else if (!(st.st_mode & S_IWOTH))
+ goto done;
+ }
+ if (flags & X_OK)
+ {
+ if (st.st_uid == myself->uid)
+ {
+ if (!(st.st_mode & S_IXUSR))
+ goto done;
+ }
+ else if (st.st_gid == myself->gid)
+ {
+ if (!(st.st_mode & S_IXGRP))
+ goto done;
+ }
+ else if (!(st.st_mode & S_IXOTH))
+ goto done;
+ }
+ r = 0;
+done:
+ if (r)
+ set_errno (EACCES);
+ return r;
+}
+
+extern "C"
+int
+_rename (const char *oldpath, const char *newpath)
+{
+ int res = 0;
+
+ path_conv real_old (oldpath, SYMLINK_NOFOLLOW);
+
+ if (real_old.error)
+ {
+ set_errno (real_old.error);
+ syscall_printf ("-1 = rename (%s, %s)", oldpath, newpath);
+ return -1;
+ }
+
+ path_conv real_new (newpath, SYMLINK_NOFOLLOW);
+
+ if (real_new.error)
+ {
+ set_errno (real_new.error);
+ syscall_printf ("-1 = rename (%s, %s)", oldpath, newpath);
+ return -1;
+ }
+
+ if (! writable_directory (real_old.get_win32 ())
+ || ! writable_directory (real_new.get_win32 ()))
+ {
+ syscall_printf ("-1 = rename (%s, %s)", oldpath, newpath);
+ return -1;
+ }
+
+ int oldatts = GetFileAttributesA (real_old.get_win32 ());
+ int newatts = GetFileAttributesA (real_new.get_win32 ());
+
+ if (oldatts == -1) /* file to move doesn't exist */
+ {
+ syscall_printf ("file to move doesn't exist");
+ return (-1);
+ }
+
+ if (newatts != -1 && newatts & FILE_ATTRIBUTE_READONLY)
+ {
+ /* Destination file exists and is read only, change that or else
+ the rename won't work. */
+ SetFileAttributesA (real_new.get_win32 (), newatts & ~ FILE_ATTRIBUTE_READONLY);
+ }
+
+ /* First make sure we have the permissions */
+ if (!MoveFileEx (real_old.get_win32 (), real_new.get_win32 (), MOVEFILE_REPLACE_EXISTING))
+ {
+ res = -1;
+
+ /* !!! fixme, check for windows version before trying this.. */
+ if (GetLastError () == ERROR_CALL_NOT_IMPLEMENTED)
+ {
+ /* How sad, we must be on win95, try it the stupid way */
+ syscall_printf ("try win95 hack");
+ for (;;)
+ {
+ if (MoveFile (real_old.get_win32 (), real_new.get_win32 ()))
+ {
+ res = 0;
+ break;
+ }
+
+ if (GetLastError () != ERROR_ALREADY_EXISTS)
+ {
+ syscall_printf ("%s already_exists", real_new.get_win32 ());
+ break;
+ }
+
+ if (!DeleteFileA (real_new.get_win32 ()) &&
+ GetLastError () != ERROR_FILE_NOT_FOUND)
+ {
+ syscall_printf ("deleting %s to be paranoid",
+ real_new.get_win32 ());
+ break;
+ }
+ }
+ }
+ if (res)
+ __seterrno ();
+ }
+
+ if (res == 0)
+ {
+ /* make the new file have the permissions of the old one */
+ SetFileAttributesA (real_new.get_win32 (), oldatts);
+ }
+
+ syscall_printf ("%d = rename (%s, %s)", res, real_old.get_win32 (),
+ real_new.get_win32 ());
+
+ return res;
+}
+
+extern "C"
+int
+system (const char *cmdstring)
+{
+ int res;
+ const char* command[4];
+ _sig_func_ptr oldint, oldquit;
+ sigset_t child_block, old_mask;
+
+ if (cmdstring == (const char *) NULL)
+ return 1;
+
+ oldint = signal (SIGINT, SIG_IGN);
+ oldquit = signal (SIGQUIT, SIG_IGN);
+ sigemptyset (&child_block);
+ sigaddset (&child_block, SIGCHLD);
+ (void) sigprocmask (SIG_BLOCK, &child_block, &old_mask);
+
+ command[0] = "sh";
+ command[1] = "-c";
+ command[2] = cmdstring;
+ command[3] = (const char *) NULL;
+
+ if ((res = spawnvp (_P_WAIT, "sh", command)) == -1)
+ {
+ // when exec fails, return value should be as if shell
+ // executed exit (127)
+ res = 127;
+ }
+
+ signal (SIGINT, oldint);
+ signal (SIGQUIT, oldquit);
+ (void) sigprocmask (SIG_SETMASK, &old_mask, 0);
+ return res;
+}
+
+extern "C"
+void
+setdtablesize (int size)
+{
+ if (size > (int)dtable.size)
+ dtable.extend (size);
+}
+
+extern "C"
+int
+getdtablesize ()
+{
+ return dtable.size;
+}
+
+extern "C"
+size_t
+getpagesize ()
+{
+ return sysconf (_SC_PAGESIZE);
+}
+
+/* FIXME: not all values are correct... */
+extern "C"
+long int
+fpathconf (int fd, int v)
+{
+ switch (v)
+ {
+ case _PC_LINK_MAX:
+ return _POSIX_LINK_MAX;
+ case _PC_MAX_CANON:
+ case _PC_MAX_INPUT:
+ if (isatty (fd))
+ return _POSIX_MAX_CANON;
+ else
+ {
+ set_errno (EBADF);
+ return -1;
+ }
+ case _PC_NAME_MAX:
+ case _PC_PATH_MAX:
+ return PATH_MAX;
+ case _PC_PIPE_BUF:
+ return 4096;
+ case _PC_CHOWN_RESTRICTED:
+ case _PC_NO_TRUNC:
+ return -1;
+ case _PC_VDISABLE:
+ if (isatty (fd))
+ return -1;
+ else
+ {
+ set_errno (EBADF);
+ return -1;
+ }
+ default:
+ set_errno (EINVAL);
+ return -1;
+ }
+}
+
+extern "C"
+long int
+pathconf (const char *file, int v)
+{
+ switch (v)
+ {
+ case _PC_PATH_MAX:
+ return PATH_MAX - strlen (file);
+ case _PC_NAME_MAX:
+ return PATH_MAX;
+ case _PC_LINK_MAX:
+ return _POSIX_LINK_MAX;
+ case _PC_MAX_CANON:
+ case _PC_MAX_INPUT:
+ return _POSIX_MAX_CANON;
+ case _PC_PIPE_BUF:
+ return 4096;
+ case _PC_CHOWN_RESTRICTED:
+ case _PC_NO_TRUNC:
+ return -1;
+ case _PC_VDISABLE:
+ return -1;
+ default:
+ set_errno (EINVAL);
+ return -1;
+ }
+}
+
+extern "C"
+char *
+ctermid (char *str)
+{
+ static NO_COPY char buf[16];
+ if (str == NULL)
+ str = buf;
+ if (!tty_attached (myself))
+ strcpy (str, "/dev/conin");
+ else
+ __small_sprintf (str, "/dev/tty%d", myself->ctty);
+ return str;
+}
+
+extern "C"
+char *
+ttyname (int fd)
+{
+ if (dtable.not_open (fd) || !dtable[fd]->is_tty ())
+ {
+ return 0;
+ }
+ return (char *)(dtable[fd]->ttyname ());
+}
+
+/* Set a file descriptor into text or binary mode, returning the
+ previous mode. */
+
+extern "C"
+int
+setmode (int fd, int mode)
+{
+ if (dtable.not_open (fd))
+ {
+ set_errno (EBADF);
+ return -1;
+ }
+ if (mode != O_BINARY && mode != O_TEXT)
+ {
+ set_errno (EINVAL);
+ return -1;
+ }
+
+ fhandler_base *p = dtable[fd];
+
+ /* Note that we have no way to indicate the case that writes are
+ binary but not reads, or vice-versa. These cases can arise when
+ using the tty or console interface. People using those
+ interfaces should not use setmode. */
+
+ int res;
+ if (p->get_w_binary () && p->get_r_binary ())
+ res = O_BINARY;
+ else
+ res = O_TEXT;
+
+ if (mode & O_BINARY)
+ {
+ p->set_w_binary (1);
+ p->set_r_binary (1);
+ }
+ else
+ {
+ p->set_w_binary (0);
+ p->set_r_binary (0);
+ }
+
+ return res;
+}
+
+/* ftruncate: P96 5.6.7.1 */
+extern "C"
+int
+ftruncate (int fd, off_t length)
+{
+ int res = -1;
+
+ if (dtable.not_open (fd))
+ {
+ set_errno (EBADF);
+ }
+ else
+ {
+ HANDLE h = dtable[fd]->get_handle ();
+ off_t prev_loc;
+
+ if (h)
+ {
+ /* remember curr file pointer location */
+ prev_loc = dtable[fd]->lseek (0, SEEK_CUR);
+
+ dtable[fd]->lseek (length, SEEK_SET);
+ if (!SetEndOfFile (h))
+ {
+ __seterrno ();
+ }
+ else
+ res = 0;
+
+ /* restore original file pointer location */
+ dtable[fd]->lseek (prev_loc, 0);
+ }
+ }
+ syscall_printf ("%d = ftruncate (%d, %d)", res, fd, length);
+
+ return res;
+}
+
+/* truncate: Provided by SVR4 and 4.3+BSD. Not part of POSIX.1 or XPG3 */
+/* FIXME: untested */
+extern "C"
+int
+truncate (const char *pathname, off_t length)
+{
+ int fd;
+ int res = -1;
+
+ fd = open (pathname, O_RDWR);
+
+ if (fd == -1)
+ {
+ set_errno (EBADF);
+ }
+ else
+ {
+ res = ftruncate (fd, length);
+ close (fd);
+ }
+ syscall_printf ("%d = truncate (%s, %d)", res, pathname, length);
+
+ return res;
+}
+
+extern "C"
+long
+get_osfhandle (int fd)
+{
+ long res = -1;
+
+ if (dtable.not_open (fd))
+ {
+ set_errno ( EBADF);
+ }
+ else
+ {
+ res = (long) dtable[fd]->get_handle ();
+ }
+ syscall_printf ("%d = get_osfhandle(%d)", res, fd);
+
+ return res;
+}
+
+extern "C"
+int
+statfs (const char *fname, struct statfs *sfs)
+{
+ char full_path[MAX_PATH];
+
+ if (!sfs)
+ {
+ set_errno (EFAULT);
+ return -1;
+ }
+ cygwin_conv_to_full_win32_path (fname, full_path);
+
+ char *root = rootdir (full_path);
+
+ syscall_printf ("statfs %s", root);
+
+ DWORD spc, bps, freec, totalc;
+
+ if (!GetDiskFreeSpace (root, &spc, &bps, &freec, &totalc))
+ {
+ __seterrno ();
+ return -1;
+ }
+
+ DWORD vsn, maxlen, flags;
+
+ if (!GetVolumeInformation (root, NULL, 0, &vsn, &maxlen, &flags, NULL, 0))
+ {
+ __seterrno ();
+ return -1;
+ }
+ sfs->f_type = flags;
+ sfs->f_bsize = spc*bps;
+ sfs->f_blocks = totalc;
+ sfs->f_bfree = sfs->f_bavail = freec;
+ sfs->f_files = -1;
+ sfs->f_ffree = -1;
+ sfs->f_fsid = vsn;
+ sfs->f_namelen = maxlen;
+ return 0;
+}
+
+extern "C"
+int
+fstatfs (int fd, struct statfs *sfs)
+{
+ if (dtable.not_open (fd))
+ {
+ set_errno (EBADF);
+ return -1;
+ }
+ fhandler_disk_file *f = (fhandler_disk_file *) dtable[fd];
+ return statfs (f->get_name (), sfs);
+}
+
+/* setpgid: POSIX 4.3.3.1 */
+extern "C"
+int
+setpgid (pid_t pid, pid_t pgid)
+{
+ int res = -1;
+ if (pid == 0)
+ pid = getpid ();
+ if (pgid == 0)
+ pgid = pid;
+
+ if (pgid < 0)
+ {
+ set_errno (EINVAL);
+ goto out;
+ }
+ pinfo *p;
+ p = procinfo (pid);
+ if (p == NULL)
+ {
+ set_errno (ESRCH);
+ goto out;
+ }
+ /* A process may only change the process group of itself and its children */
+ if (p == myself || p->ppid == myself->pid)
+ {
+ p->pgid = pgid;
+ res = 0;
+ }
+ else
+ {
+ set_errno (EPERM);
+ goto out;
+ }
+out:
+ syscall_printf ("pid %d, pgid %d, res %d", pid, pgid, res);
+ return res;
+}
+
+extern "C"
+pid_t
+getpgid (pid_t pid)
+{
+ if (pid == 0)
+ pid = getpid ();
+
+ pinfo *p = procinfo (pid);
+ if (p == 0)
+ {
+ set_errno (ESRCH);
+ return -1;
+ }
+ return p->pgid;
+}
+
+extern "C"
+int
+setpgrp (void)
+{
+ return setpgid (0, 0);
+}
+
+extern "C"
+pid_t
+getpgrp (void)
+{
+ return getpgid (0);
+}
+
+extern "C"
+char *
+ptsname (int fd)
+{
+ if (dtable.not_open (fd))
+ {
+ set_errno (EBADF);
+ return 0;
+ }
+ return (char *)(dtable[fd]->ptsname ());
+}
+
+/* FIXME: what is this? */
+extern "C"
+int
+regfree ()
+{
+ return 0;
+}
+
+/* mknod was the call to create directories before the introduction
+ of mkdir in 4.2BSD and SVR3. Use of mknod required superuser privs
+ so the mkdir command had to be setuid root.
+ Although mknod hasn't been implemented yet, some GNU tools (e.g. the
+ fileutils) assume its existence so we must provide a stub that always
+ fails. */
+extern "C"
+int
+mknod ()
+{
+ set_errno (ENOSYS);
+ return -1;
+}
+
+/* setgid: POSIX 4.2.2.1 */
+/* FIXME: unimplemented! */
+extern "C"
+int
+setgid (gid_t a)
+{
+ set_errno (ENOSYS);
+ return 0;
+}
+
+/* setuid: POSIX 4.2.2.1 */
+/* FIXME: unimplemented! */
+extern "C"
+int
+setuid (uid_t b)
+{
+ set_errno (ENOSYS);
+ return 0;
+}
+
+/* seteuid: standards? */
+extern "C"
+int
+seteuid (uid_t c)
+{
+ set_errno (ENOSYS);
+ return 0;
+}
+
+/* setegid: from System V. */
+extern "C"
+int
+setegid (gid_t a)
+{
+ set_errno (ENOSYS);
+ return 0;
+}
+
+/* chroot: privileged Unix system call. */
+extern "C"
+int
+chroot (const char *path)
+{
+ set_errno (ENOSYS);
+ return -1;
+}
+
+extern "C"
+int
+creat (const char *path, mode_t mode)
+{
+ return open (path, O_WRONLY | O_CREAT | O_TRUNC, mode);
+}
+
+extern "C"
+void
+__assertfail ()
+{
+ exit (99);
+}
+
+extern "C"
+int
+getw (FILE *fp)
+{
+ int w, ret;
+ ret = fread (&w, sizeof (int), 1, fp);
+ return ret != 1 ? EOF : w;
+}
+
+extern "C"
+int
+putw (int w, FILE *fp)
+{
+ int ret;
+ ret = fwrite (&w, sizeof (int), 1, fp);
+ if (feof (fp) || ferror (fp))
+ return -1;
+ return 0;
+}
+
+extern "C"
+int
+wcscmp (wchar_t *s1, wchar_t *s2)
+{
+ while (*s1 && *s1 == *s2)
+ {
+ s1++;
+ s2++;
+ }
+
+ return (*(unsigned short *) s1) - (*(unsigned short *) s2);
+}
+
+extern "C"
+int
+wcslen (wchar_t *s1)
+{
+ int l = 0;
+ while (s1[l])
+ l++;
+ return l;
+}
+
+/* FIXME: to do this right, maybe work out the usoft va_list machine
+ and use wsvprintfW instead?
+*/
+extern "C"
+int
+wprintf (const char *fmt, ...)
+{
+ va_list ap;
+ int ret;
+
+ va_start (ap, fmt);
+ ret = vprintf (fmt, ap);
+ va_end (ap);
+ return ret;
+}
+
+extern "C"
+int
+vhangup ()
+{
+ set_errno (ENOSYS);
+ return -1;
+}
+
+extern "C"
+_PTR
+memccpy (_PTR out, const _PTR in, int c, size_t len)
+{
+ const char *inc = (char *) in;
+ char *outc = (char *) out;
+
+ while (len)
+ {
+ char x = *inc++;
+ *outc++ = x;
+ if (x == c)
+ return outc;
+ len --;
+ }
+ return 0;
+}
+
+extern "C"
+int
+nice (int incr)
+{
+ DWORD priority[] =
+ {
+ IDLE_PRIORITY_CLASS,
+ IDLE_PRIORITY_CLASS,
+ NORMAL_PRIORITY_CLASS,
+ HIGH_PRIORITY_CLASS,
+ REALTIME_PRIORITY_CLASS,
+ REALTIME_PRIORITY_CLASS
+ };
+ int curr = 2;
+
+ switch (GetPriorityClass (hMainProc))
+ {
+ case IDLE_PRIORITY_CLASS:
+ curr = 1;
+ break;
+ case NORMAL_PRIORITY_CLASS:
+ curr = 2;
+ break;
+ case HIGH_PRIORITY_CLASS:
+ curr = 3;
+ break;
+ case REALTIME_PRIORITY_CLASS:
+ curr = 4;
+ break;
+ }
+ if (incr > 0)
+ incr = -1;
+ else if (incr < 0)
+ incr = 1;
+
+ if (SetPriorityClass (hMainProc, priority[curr + incr]) == FALSE)
+ {
+ __seterrno ();
+ return -1;
+ }
+
+ return 0;
+}
+
+/*
+ * Find the first bit set in I.
+ */
+
+extern "C"
+int
+ffs (int i)
+{
+ static const unsigned char table[] =
+ {
+ 0,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+ 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
+ 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
+ 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
+ 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
+ 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
+ 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
+ 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8
+ };
+ unsigned long int a;
+ unsigned long int x = i & -i;
+
+ a = x <= 0xffff ? (x <= 0xff ? 0 : 8) : (x <= 0xffffff ? 16 : 24);
+
+ return table[x >> a] + a;
+}
+
+extern "C"
+void
+swab (const void *src, void *dst, ssize_t n)
+{
+ const char *from = (const char *) src;
+ char *to = (char *) dst;
+
+ while (n > 1)
+ {
+ const char b0 = from[--n], b1 = from[--n];
+ to[n] = b0;
+ to[n + 1] = b1;
+ }
+}
+
+extern "C"
+void
+login (struct utmp *ut)
+{
+ register int fd;
+ int currtty = ttyslot ();
+
+ if (currtty >= 0 && (fd = open (_PATH_UTMP, O_WRONLY | O_CREAT | O_BINARY,
+ 0644)) >= 0)
+ {
+ (void) lseek (fd, (long) (currtty * sizeof (struct utmp)), SEEK_SET);
+ (void) write (fd, (char *) ut, sizeof (struct utmp));
+ (void) close (fd);
+ }
+ if ((fd = open (_PATH_WTMP, O_WRONLY | O_APPEND | O_BINARY, 0)) >= 0)
+ {
+ (void) write (fd, (char *) ut, sizeof (struct utmp));
+ (void) close (fd);
+ }
+}
+
+/* It isn't possible to use unix-style I/O function in logout code because
+cygwin's I/O subsystem may be inaccessible at logout() call time.
+*/
+extern "C"
+int
+logout (char *line)
+{
+ int res = 0;
+ HANDLE ut_fd;
+ static const char path_utmp[] = _PATH_UTMP;
+
+ path_conv win32_path (path_utmp);
+ if (win32_path.error)
+ return 0;
+
+ ut_fd = CreateFile (win32_path.get_win32 (),
+ GENERIC_READ | GENERIC_WRITE,
+ FILE_SHARE_READ | FILE_SHARE_WRITE,
+ &sec_none_nih,
+ OPEN_EXISTING,
+ FILE_ATTRIBUTE_NORMAL,
+ NULL);
+ if (ut_fd != INVALID_HANDLE_VALUE)
+ {
+ struct utmp *ut;
+ struct utmp ut_buf[100];
+ off_t pos = 0; /* Position in file */
+ DWORD rd;
+
+ while (!res && ReadFile (ut_fd, ut_buf, sizeof ut_buf, &rd, NULL)
+ && rd != 0)
+ {
+ struct utmp *ut_end = (struct utmp *) ((char *) ut_buf + rd);
+
+ for (ut = ut_buf; ut < ut_end; ut++, pos += sizeof (*ut))
+ if (ut->ut_name[0]
+ && strncmp (ut->ut_line, line, sizeof (ut->ut_line)) == 0)
+ /* Found the entry for LINE; mark it as logged out. */
+ {
+ /* Zero out entries describing who's logged in. */
+ bzero (ut->ut_name, sizeof (ut->ut_name));
+ bzero (ut->ut_host, sizeof (ut->ut_host));
+ time (&ut->ut_time);
+
+ /* Now seek back to the position in utmp at which UT occured,
+ and write the new version of UT there. */
+ if ((SetFilePointer (ut_fd, pos, 0, FILE_BEGIN) != 0xFFFFFFFF)
+ && (WriteFile (ut_fd, (char *) ut, sizeof (*ut),
+ &rd, NULL)))
+ {
+ res = 1;
+ break;
+ }
+ }
+ }
+
+ CloseHandle (ut_fd);
+ }
+
+ return res;
+}
diff --git a/winsup/cygwin/sysconf.cc b/winsup/cygwin/sysconf.cc
new file mode 100644
index 000000000..6dcb08afc
--- /dev/null
+++ b/winsup/cygwin/sysconf.cc
@@ -0,0 +1,62 @@
+/* sysconf.cc
+
+ Copyright 1996, 1997, 1998 Cygnus Solutions.
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#include <unistd.h>
+#include <errno.h>
+#include <time.h>
+#include <limits.h>
+#include "winsup.h"
+
+/* sysconf: POSIX 4.8.1.1 */
+/* Allows a portable app to determine quantities of resources or
+ presence of an option at execution time. */
+long int
+sysconf (int in)
+{
+ switch (in)
+ {
+ case _SC_ARG_MAX:
+ /* FIXME: what's the right value? _POSIX_ARG_MAX is only 4K */
+ return 1048576;
+ case _SC_OPEN_MAX:
+ /* FIXME: this returns the current limit which can increase
+ if and when hinfo::find_unused_handle is called. Perhaps
+ we should return NOFILE or OPEN_MAX instead? */
+ return dtable.size;
+ case _SC_PAGESIZE:
+ {
+ SYSTEM_INFO b;
+ GetSystemInfo (&b);
+ return b.dwPageSize;
+ }
+ case _SC_CLK_TCK:
+ return CLOCKS_PER_SEC;
+ case _SC_JOB_CONTROL:
+ return _POSIX_JOB_CONTROL;
+ case _SC_CHILD_MAX:
+ return CHILD_MAX;
+ case _SC_NGROUPS_MAX:
+ return NGROUPS_MAX;
+ case _SC_SAVED_IDS:
+ return _POSIX_SAVED_IDS;
+ case _SC_VERSION:
+ return _POSIX_VERSION;
+#if 0 /* FIXME -- unimplemented */
+ case _SC_TZNAME_MAX:
+ return _POSIX_TZNAME_MAX;
+ case _SC_STREAM_MAX:
+ return _POSIX_STREAM_MAX;
+#endif
+ }
+
+ /* Invalid input or unimplemented sysconf name */
+ set_errno (EINVAL);
+ return -1;
+}
diff --git a/winsup/cygwin/syslog.cc b/winsup/cygwin/syslog.cc
new file mode 100644
index 000000000..2c0290c4e
--- /dev/null
+++ b/winsup/cygwin/syslog.cc
@@ -0,0 +1,395 @@
+/* syslog.cc
+
+ Copyright 1996, 1997, 1998 Cygnus Solutions.
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <syslog.h>
+#include <stdarg.h>
+#include <unistd.h>
+#include "winsup.h"
+
+/* FIXME: These should probably be in the registry. */
+/* FIXME: The Win95 path should be whatever slash is */
+
+#define WIN95_EVENT_LOG_PATH "C:\\CYGWIN_SYSLOG.TXT"
+#define CYGWIN_LOG_NAME "Cygwin"
+
+/*
+ * Utility function to help enable moving
+ * WIN95_EVENT_LOG_PATH into registry later.
+ */
+static const char *
+get_win95_event_log_path ()
+{
+ return WIN95_EVENT_LOG_PATH;
+}
+
+/* FIXME: For MT safe code these will need to be replaced */
+
+#ifdef _MT_SAFE
+#define process_ident _reent_winsup()->_process_ident
+#define process_logopt _reent_winsup()->_process_logopt
+#define process_facility _reent_winsup()->_process_facility
+ /* Default priority logmask */
+#define process_logmask _reent_winsup()->_process_logmask
+#else
+static char *process_ident = 0;
+static int process_logopt = 0;
+static int process_facility = 0;
+
+/* Default priority logmask */
+static int process_logmask = LOG_UPTO (LOG_DEBUG);
+#endif
+
+/*
+ * openlog: save the passed args. Don't open the
+ * system log (NT) or log file (95) yet.
+ */
+extern "C"
+void
+openlog (const char *ident, int logopt, int facility)
+{
+ debug_printf ("openlog called with (%s, %d, %d)",
+ ident ? ident : "<NULL>", logopt, facility);
+
+ if (process_ident != 0)
+ {
+ free (process_ident);
+ process_ident = 0;
+ }
+ if (ident)
+ {
+ process_ident = (char *) malloc (strlen (ident) + 1);
+ if (process_ident == 0)
+ {
+ debug_printf ("failed to allocate memory for process_ident");
+ return;
+ }
+ strcpy (process_ident, ident);
+ }
+ process_logopt = logopt;
+ process_facility = facility;
+}
+
+/* setlogmask: set the log priority mask and return previous mask.
+ If maskpri is zero, just return previous. */
+#if 0
+/* FIXME: nobody calls setlogmask? */
+int
+setlogmask (int maskpri)
+{
+ if (maskpri == 0)
+ return process_logmask;
+
+ int old_mask = process_logmask;
+ process_logmask = maskpri & LOG_PRIMASK;
+
+ return old_mask;
+}
+#endif
+
+/* Private class used to handle formatting of syslog message */
+/* It is named pass_handler because it does a two-pass handling of log
+ strings. The first pass counts the length of the string, and the second
+ one builds the string. */
+
+class pass_handler
+{
+ private:
+ FILE *fp_;
+ char *message_;
+ int total_len_;
+
+ void shutdown ();
+
+ /* Explicitly disallow copies */
+ pass_handler (const pass_handler &);
+ pass_handler & operator = (const pass_handler &);
+
+ public:
+ pass_handler ();
+ ~pass_handler ();
+
+ int initialize (int);
+
+ int print (const char *,...);
+ int print_va (const char *, va_list);
+ char *get_message () const { return message_; }
+};
+
+pass_handler::pass_handler () : fp_ (0), message_ (0), total_len_ (0)
+{
+ ;
+}
+
+pass_handler::~pass_handler ()
+{
+ shutdown ();
+}
+
+void
+pass_handler::shutdown ()
+{
+ if (fp_ != 0)
+ {
+ fclose (fp_);
+ fp_ = 0;
+ }
+ if (message_ != 0)
+ delete[] message_;
+}
+
+int
+pass_handler::initialize (int pass_number)
+{
+ shutdown ();
+ if (pass_number == 0)
+ {
+ fp_ = fopen ("/dev/null", "wb");
+ if (fp_ == 0)
+ {
+ debug_printf ("failed to open /dev/null");
+ return -1;
+ }
+ total_len_ = 0;
+ }
+ else
+ {
+ message_ = new char[total_len_ + 1];
+ if (message_ == 0)
+ {
+ debug_printf ("failed to allocate message_");
+ return -1;
+ }
+ message_[0] = '\0';
+ }
+ return 0;
+}
+
+int
+pass_handler::print (const char *fmt, ...)
+{
+ va_list ap;
+ va_start (ap, fmt);
+ int ret = print_va (fmt, ap);
+ va_end (ap);
+ return ret;
+}
+
+int
+pass_handler::print_va (const char *fmt, va_list list)
+{
+ if (fp_ != 0)
+ {
+ int len = vfprintf (fp_, fmt, list);
+ if (len < 0)
+ return -1;
+ total_len_ += len;
+ return 0;
+ }
+ else if (message_ != 0)
+ {
+ char *printpos = &message_[strlen (message_)];
+ vsprintf (printpos, fmt, list);
+ return 0;
+ }
+ debug_printf ("FAILURE ! fp_ and message_ both 0!! ");
+ return -1;
+}
+
+/*
+ * syslog: creates the log message and writes to system
+ * log (NT) or log file (95). FIXME. WinNT log error messages
+ * don't look pretty, but in order to fix this we have to
+ * embed resources in the code and tell the NT registry
+ * where we are, blech (what happens if we move ?).
+ * We could, however, add the resources in Cygwin and
+ * always point to that.
+ */
+
+extern "C"
+void
+syslog (int priority, const char *message, ...)
+{
+ debug_printf ("%x %s", priority, message);
+ /* If the priority fails the current mask, reject */
+ if (((priority & LOG_PRIMASK) & process_logmask) == 0)
+ {
+ debug_printf ("failing message %x due to priority mask %x",
+ priority, process_logmask);
+ return;
+ }
+
+ /* Translate %m in the message to error text */
+ char *errtext = strerror (get_errno ());
+ int errlen = strlen (errtext);
+ int numfound = 0;
+
+ for (const char *cp = message; *cp; cp++)
+ if (*cp == '%' && cp[1] == 'm')
+ numfound++;
+
+ char *newmessage = new char [strlen (message) + (errlen * numfound)];
+
+ if (newmessage == 0)
+ {
+ debug_printf ("failed to allocate newmessage");
+ return;
+ }
+
+ char *dst = newmessage;
+ for (const char *cp2 = message; *cp2; cp2++)
+ if (*cp2 == '%' && cp2[1] == 'm')
+ {
+ cp2++;
+ strcpy (dst, errtext);
+ while (*dst)
+ dst++;
+ }
+ else
+ *dst++ = *cp2;
+
+ *dst = '\0';
+ message = newmessage;
+
+ /* Work out the priority type - we ignore the facility for now.. */
+ WORD eventType;
+ switch (LOG_PRI (priority))
+ {
+ case LOG_ERR:
+ eventType = EVENTLOG_ERROR_TYPE;
+ break;
+ case LOG_WARNING:
+ eventType = EVENTLOG_WARNING_TYPE;
+ break;
+ case LOG_INFO:
+ eventType = EVENTLOG_INFORMATION_TYPE;
+ break;
+ default:
+ eventType = EVENTLOG_ERROR_TYPE;
+ break;
+ }
+
+ /* We need to know how long the buffer needs to be.
+ The only legal way I can see of doing this is to
+ do a vfprintf to /dev/null, and count the bytes
+ output, then do it again to a malloc'ed string. This
+ is ugly, slow, but prevents core dumps :-).
+ */
+ int pass_number = 0;
+ va_list ap;
+
+ pass_handler pass;
+ for (; pass_number < 2; ++pass_number)
+ {
+ if (pass.initialize (pass_number) == -1)
+ return;
+
+ /* Deal with ident_string */
+ if (process_ident != 0)
+ {
+ if (pass.print ("%s : ", process_ident) == -1)
+ return;
+ }
+ if (process_logopt & LOG_PID)
+ {
+ if (pass.print ("Win32 Process Id = 0x%X : Cygwin Process Id = 0x%X : ",
+ GetCurrentProcessId(), getpid ()) == -1)
+ return;
+ }
+
+ if (os_being_run != winNT)
+ {
+ /* Add a priority string - not needed for NT
+ as NT has its own priority codes. */
+ switch (LOG_PRI (priority))
+ {
+ case LOG_ERR:
+ pass.print ("%s : ", "LOG_ERR");
+ break;
+ case LOG_WARNING:
+ pass.print ("%s : ", "LOG_WARNING");
+ break;
+ case LOG_INFO:
+ pass.print ("%s : ", "LOG_INFO");
+ break;
+ default:
+ pass.print ("%s : ", "LOG_ERR");
+ break;
+ }
+ }
+
+ /* Print out the variable part */
+ va_start (ap, message);
+ if (pass.print_va (message, ap) == -1)
+ return;
+ va_end (ap);
+
+ }
+ const char *msg_strings[1];
+ char *total_msg = pass.get_message ();
+ int len = strlen (total_msg);
+ if (len != 0 && (total_msg[len - 1] == '\n'))
+ total_msg[len - 1] = '\0';
+
+ msg_strings[0] = total_msg;
+
+ if (os_being_run == winNT)
+ {
+ /* For NT, open the event log and send the message */
+ HANDLE hEventSrc = RegisterEventSourceA (NULL, (process_ident != 0) ?
+ process_ident : CYGWIN_LOG_NAME);
+ if (hEventSrc == 0)
+ {
+ debug_printf ("RegisterEventSourceA failed with %E");
+ return;
+ }
+ ReportEventA (hEventSrc, eventType, 0, 0,
+ NULL, 1, 0, msg_strings, NULL);
+ DeregisterEventSource (hEventSrc);
+ }
+ else
+ {
+ /* Under Windows 95, append the message to the log file */
+ FILE *fp = fopen (get_win95_event_log_path (), "a");
+ if (fp == 0)
+ {
+ debug_printf ("failed to open file %s",
+ get_win95_event_log_path ());
+ return;
+ }
+ /* Now to prevent several syslog messages from being
+ interleaved, we must lock the first byte of the file
+ This works on Win32 even if we created the file above.
+ */
+ HANDLE fHandle = dtable[fileno (fp)]->get_handle ();
+ if (LockFile (fHandle, 0, 0, 1, 0) == FALSE)
+ {
+ debug_printf ("failed to lock file %s", get_win95_event_log_path());
+ fclose (fp);
+ return;
+ }
+ fputs (msg_strings[0], fp);
+ fputc ('\n', fp);
+ UnlockFile (fHandle, 0, 0, 1, 0);
+ if (ferror (fp))
+ {
+ debug_printf ("error in writing syslog");
+ }
+ fclose (fp);
+ }
+}
+
+extern "C"
+void
+closelog (void)
+{
+ ;
+}
diff --git a/winsup/cygwin/termios.cc b/winsup/cygwin/termios.cc
new file mode 100644
index 000000000..69aaf1943
--- /dev/null
+++ b/winsup/cygwin/termios.cc
@@ -0,0 +1,274 @@
+/* termios.cc: termios for WIN32.
+
+ Copyright 1996, 1997, 1998, 2000 Cygnus Solutions.
+
+ Written by Doug Evans and Steve Chamberlain of Cygnus Support
+ dje@cygnus.com, sac@cygnus.com
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#include <errno.h>
+#include "winsup.h"
+
+/* tcsendbreak: POSIX 7.2.2.1 */
+extern "C"
+int
+tcsendbreak (int fd, int duration)
+{
+ int res = -1;
+
+ if (dtable.not_open (fd))
+ {
+ set_errno (EBADF);
+ goto out;
+ }
+
+ fhandler_base *fh;
+ fh = dtable[fd];
+
+ if (!fh->is_tty ())
+ set_errno (ENOTTY);
+ else
+ {
+ if ((res = fh->bg_check (-SIGTTOU)) > 0)
+ res = fh->tcsendbreak (duration);
+ }
+
+out:
+ syscall_printf ("%d = tcsendbreak (%d, %d )", res, fd, duration);
+ return res;
+}
+
+/* tcdrain: POSIX 7.2.2.1 */
+extern "C"
+int
+tcdrain (int fd)
+{
+ int res = -1;
+
+ termios_printf ("tcdrain");
+
+ if (dtable.not_open (fd))
+ {
+ set_errno (EBADF);
+ goto out;
+ }
+
+ fhandler_base *fh;
+ fh = dtable[fd];
+
+ if (!fh->is_tty ())
+ set_errno (ENOTTY);
+ else
+ {
+ if ((res = fh->bg_check (-SIGTTOU)) > 0)
+ res = fh->tcdrain ();
+ }
+
+out:
+ syscall_printf ("%d = tcdrain (%d)", res, fd);
+ return res;
+}
+
+/* tcflush: POSIX 7.2.2.1 */
+extern "C"
+int
+tcflush (int fd, int queue)
+{
+ int res = -1;
+
+ if (dtable.not_open (fd))
+ {
+ set_errno (EBADF);
+ goto out;
+ }
+
+ fhandler_base *fh;
+ fh = dtable[fd];
+
+ if (!fh->is_tty ())
+ set_errno (ENOTTY);
+ else
+ {
+ if ((res = fh->bg_check (-SIGTTOU)) > 0)
+ res = fh->tcflush (queue);
+ }
+
+out:
+ termios_printf ("%d = tcflush (%d, %d)", res, fd, queue);
+ return res;
+}
+
+/* tcflow: POSIX 7.2.2.1 */
+extern "C"
+int
+tcflow (int fd, int action)
+{
+ int res = -1;
+
+ if (dtable.not_open (fd))
+ {
+ set_errno (EBADF);
+ goto out;
+ }
+
+ fhandler_base *fh;
+ fh = dtable[fd];
+
+ if (!fh->is_tty ())
+ set_errno (ENOTTY);
+ else
+ {
+ if ((res = fh->bg_check (-SIGTTOU)) > 0)
+ res = fh->tcflow (action);
+ }
+
+out:
+ syscall_printf ("%d = tcflow (%d, %d)", res, fd, action);
+ return res;
+}
+
+/* tcsetattr: POSIX96 7.2.1.1 */
+extern "C"
+int
+tcsetattr (int fd, int a, const struct termios *t)
+{
+ int res = -1;
+
+ t = __tonew_termios (t);
+ if (dtable.not_open (fd))
+ {
+ set_errno (EBADF);
+ goto out;
+ }
+
+ fhandler_base *fh;
+ fh = dtable[fd];
+
+ if (!fh->is_tty ())
+ set_errno (ENOTTY);
+ else
+ {
+ if ((res = fh->bg_check (-SIGTTOU)) > 0)
+ res = fh->tcsetattr (a, t);
+ }
+
+out:
+ termios_printf ("iflag %x, oflag %x, cflag %x, lflag %x, VMIN %d, VTIME %d",
+ t->c_iflag, t->c_oflag, t->c_cflag, t->c_lflag, t->c_cc[VMIN],
+ t->c_cc[VTIME]);
+ termios_printf ("%d = tcsetattr (%d, %d, %x)", res, fd, a, t);
+ return res;
+}
+
+/* tcgetattr: POSIX 7.2.1.1 */
+extern "C"
+int
+tcgetattr (int fd, struct termios *in_t)
+{
+ int res = -1;
+ struct termios *t = __makenew_termios (in_t);
+
+ if (dtable.not_open (fd))
+ set_errno (EBADF);
+ else if (!dtable[fd]->is_tty ())
+ set_errno (ENOTTY);
+ else
+ {
+ if ((res = dtable[fd]->tcgetattr (t)) == 0)
+ (void) __toapp_termios (in_t, t);
+ }
+
+ if (res)
+ termios_printf ("%d = tcgetattr (%d, %x)", res, fd, in_t);
+ else
+ termios_printf ("iflag %x, oflag %x, cflag %x, lflag %x, VMIN %d, VTIME %d",
+ t->c_iflag, t->c_oflag, t->c_cflag, t->c_lflag, t->c_cc[VMIN],
+ t->c_cc[VTIME]);
+
+ return res;
+}
+
+/* tcgetpgrp: POSIX 7.2.3.1 */
+extern "C"
+int
+tcgetpgrp (int fd)
+{
+ int res = -1;
+
+ if (dtable.not_open (fd))
+ set_errno (EBADF);
+ else if (!dtable[fd]->is_tty ())
+ set_errno (ENOTTY);
+ else
+ res = dtable[fd]->tcgetpgrp ();
+
+ termios_printf ("%d = tcgetpgrp (%d)", res, fd);
+ return res;
+}
+
+/* tcsetpgrp: POSIX 7.2.4.1 */
+extern "C"
+int
+tcsetpgrp (int fd, pid_t pgid)
+{
+ int res = -1;
+
+ if (dtable.not_open (fd))
+ set_errno (EBADF);
+ else if (!dtable[fd]->is_tty ())
+ set_errno (ENOTTY);
+ else
+ res = dtable[fd]->tcsetpgrp (pgid);
+
+ termios_printf ("%d = tcsetpgrp (%d, %x)", res, fd, pgid);
+ return res;
+}
+
+/* NIST PCTS requires not macro-only implementation */
+#undef cfgetospeed
+#undef cfgetispeed
+#undef cfsetospeed
+#undef cfsetispeed
+
+/* cfgetospeed: POSIX96 7.1.3.1 */
+extern "C"
+speed_t
+cfgetospeed (struct termios *tp)
+{
+ return __tonew_termios(tp)->c_ospeed;
+}
+
+/* cfgetispeed: POSIX96 7.1.3.1 */
+extern "C"
+speed_t
+cfgetispeed (struct termios *tp)
+{
+ return __tonew_termios(tp)->c_ispeed;
+}
+
+/* cfsetospeed: POSIX96 7.1.3.1 */
+extern "C"
+int
+cfsetospeed (struct termios *in_tp, speed_t speed)
+{
+ struct termios *tp = __tonew_termios (in_tp);
+ tp->c_ospeed = speed;
+ (void) __toapp_termios (in_tp, tp);
+ return 0;
+}
+
+/* cfsetispeed: POSIX96 7.1.3.1 */
+extern "C"
+int
+cfsetispeed (struct termios *in_tp, speed_t speed)
+{
+ struct termios *tp = __tonew_termios (in_tp);
+ tp->c_ispeed = speed;
+ (void) __toapp_termios (in_tp, tp);
+ return 0;
+}
diff --git a/winsup/cygwin/thread.cc b/winsup/cygwin/thread.cc
new file mode 100644
index 000000000..0ed42e7d8
--- /dev/null
+++ b/winsup/cygwin/thread.cc
@@ -0,0 +1,1001 @@
+/* thread.cc: Locking and threading module functions
+
+ Copyright 1998, 2000 Cygnus Solutions.
+
+ Written by Marco Fuykschot <marco@ddi.nl>
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#ifdef _MT_SAFE
+#include <errno.h>
+#include "winsup.h"
+#include <assert.h>
+
+#include <stdlib.h>
+#include <syslog.h>
+
+extern int threadsafe;
+
+#define MT_INTERFACE user_data->threadinterface
+
+#define NOT_IMP(n) system_printf("not implemented %s\n",n); return 0;
+
+#define CHECKHANDLE(rval,release) \
+ if ( ! item->HandleOke() ) { \
+ if ( release ) item->used=false; \
+ return rval; };
+
+#define GETTHREAD(n) \
+ if ( ! thread ) system_printf("thread is NULL");\
+ SetResourceLock(LOCK_THREAD_LIST,READ_LOCK,n);\
+ ThreadItem *item=user_data->threadinterface->GetThread(thread); \
+ ReleaseResourceLock(LOCK_THREAD_LIST,READ_LOCK,n); \
+ if ( ! item ) return EINVAL; \
+ CHECKHANDLE(EINVAL,0);
+
+#define GETMUTEX(n) \
+ SetResourceLock(LOCK_MUTEX_LIST,READ_LOCK,n); \
+ MutexItem* item=user_data->threadinterface->GetMutex(mutex); \
+ ReleaseResourceLock(LOCK_MUTEX_LIST,READ_LOCK,n); \
+ if ( ! item ) return EINVAL; \
+ CHECKHANDLE(EINVAL,0);
+
+#define GETSEMA(n) \
+ SetResourceLock(LOCK_SEM_LIST,READ_LOCK,n); \
+ SemaphoreItem* item=user_data->threadinterface->GetSemaphore(sem); \
+ ReleaseResourceLock(LOCK_SEM_LIST,READ_LOCK,n); \
+ if ( ! item ) return EINVAL; \
+ CHECKHANDLE(EINVAL,0);
+
+#define CHECKITEM(rn,rm,fn) \
+ if ( ! item ) { \
+ ReleaseResourceLock(rn,rm,fn); \
+ return EINVAL; }; \
+
+struct _reent *
+_reent_clib ()
+{
+ int tmp = GetLastError ();
+ struct __reent_t *_r = (struct __reent_t *) TlsGetValue (MT_INTERFACE->reent_index);
+
+#ifdef _CYG_THREAD_FAILSAFE
+ if (_r == 0)
+ {
+ system_printf ("local thread storage not inited");
+ }
+#endif
+
+ SetLastError (tmp);
+ return _r->_clib;
+};
+
+struct _winsup_t *
+_reent_winsup ()
+{
+ int tmp = GetLastError ();
+ struct __reent_t *_r;
+ _r = (struct __reent_t *) TlsGetValue (MT_INTERFACE->reent_index);
+#ifdef _CYG_THREAD_FAILSAFE
+ if (_r == 0)
+ {
+ system_printf ("local thread storage not inited");
+ }
+#endif
+ SetLastError (tmp);
+ return _r->_winsup;
+};
+
+void
+SetResourceLock (int _res_id, int _mode, const char *_function)
+{
+#if 0
+ if (!threadsafe)
+ return;
+#endif
+ thread_printf ("Set resource lock %d mode %d for %s start", _res_id, _mode, _function);
+ EnterCriticalSection (user_data->resourcelocks->Lock (_res_id));
+
+#ifdef _CYG_THREAD_FAILSAFE
+ user_data->resourcelocks->owner = GetCurrentThreadId ();
+ user_data->resourcelocks->count++;
+#endif
+}
+
+void
+ReleaseResourceLock (int _res_id, int _mode, const char *_function)
+{
+#if 0
+ if (!threadsafe)
+ return;
+#endif
+ thread_printf ("Release resource lock %d mode %d for %s done", _res_id, _mode, _function);
+
+#ifdef _CYG_THREAD_FAILSAFE
+ AssertResourceOwner (_res_id, _mode);
+ user_data->resourcelocks->count--;
+ if (user_data->resourcelocks->count == 0)
+ user_data->resourcelocks->owner = 0;
+#endif
+
+ LeaveCriticalSection (user_data->resourcelocks->Lock (_res_id));
+};
+
+#ifdef _CYG_THREAD_FAILSAFE
+void
+AssertResourceOwner (int _res_id, int _mode)
+{
+
+ thread_printf ("Assert Resource lock %d ==> for %p , real : %d , threadid %d count %d owner %d", _res_id, user_data, (myself ? myself->pid : -1), GetCurrentThreadId (), user_data->resourcelocks->count, user_data->resourcelocks->owner);
+ if (user_data && (user_data->resourcelocks->owner != GetCurrentThreadId ()))
+ {
+ system_printf ("assertion failed, not the resource owner");
+ };
+}
+
+#endif
+
+LPCRITICAL_SECTION
+ResourceLocks::Lock (int _resid)
+{
+ if (!inited)
+ {
+ system_printf ("lock called before initialization");
+ };
+
+ thread_printf ("Get Resource lock %d ==> %p for %p , real : %d , threadid %d ", _resid, &lock, user_data, (myself ? myself->pid : -1), GetCurrentThreadId ());
+ return &lock;
+};
+
+void
+ResourceLocks::Init ()
+{
+ thread_printf ("Init resource lock %p -> %p", this, &lock);
+
+ InitializeCriticalSection (&lock);
+ inited = true;
+
+#ifdef _CYG_THREAD_FAILSAFE
+ owner = 0;
+ count = 0;
+#endif
+
+ thread_printf ("Resource lock %p inited by %p , %d", &lock, user_data, (myself ? myself->pid : -1));
+};
+
+void
+ResourceLocks::Delete ()
+{
+ if (inited)
+ {
+ thread_printf ("Close Resource Locks %p ", &lock);
+ DeleteCriticalSection (&lock);
+ inited = false;
+ };
+};
+
+
+// Thread interface
+
+void
+MTinterface::ReleaseItem (MTitem * _item)
+{
+ _item->used = false;
+};
+
+MTitem *
+MTinterface::Find (void *_value, int (*comp) (void *, void *), register int &_index, MTList * _list)
+{
+ register MTitem *current = NULL;
+ for (; _index < _list->index; _index++)
+ {
+ current = _list->items[_index];
+ if (current->used && comp (current, _value))
+ break;
+ current = NULL;
+ };
+ return current;
+};
+
+int
+MTinterface::Find (MTitem & _item, MTList * _list)
+{
+ register MTitem *current;
+ register int _index = 0;
+ for (; _index < _list->index; _index++)
+ {
+ current = _list->items[_index];
+ if (current->used && current == &_item)
+ break;
+ };
+ return (_index == _list->index ? -1 : _index);
+};
+
+int
+MTinterface::FindNextUnused (MTList * _list)
+{
+ register int i = 0;
+ for (; i < _list->index && _list->items[i] != NULL && _list->items[i]->used && _list->items[i]->joinable != 'Y'; i++);
+ return i;
+};
+
+MTitem *
+MTinterface::GetItem (int _index, MTList * _list)
+{
+ return (_index < _list->index ? _list->items[_index] : NULL);
+};
+
+MTitem *
+MTinterface::SetItem (int _index, MTitem * _item, MTList * _list)
+{
+ if (_index == _list->index && _list->index < MT_MAX_ITEMS)
+ _list->index++;
+ return (_index < _list->index ? _list->items[_index] = _item : NULL);
+};
+
+int
+CmpPthreadObj (void *_i, void *_value)
+{
+ return ((MTitem *) _i)->Id () == *(int *) _value;
+};
+
+int
+CmpThreadId (void *_i, void *_id)
+{
+ return ((ThreadItem *) _i)->thread_id == *(DWORD *) _id;
+};
+
+void
+MTinterface::Init0 ()
+{
+ for (int i = 0; i < MT_MAX_ITEMS; i++)
+ {
+ threadlist.items[i] = NULL;
+ mutexlist.items[i] = NULL;
+ semalist.items[i] = NULL;
+ };
+
+ threadlist.index = 0;
+ mutexlist.index = 0;
+ semalist.index = 0;
+
+ reent_index = TlsAlloc ();
+
+ reents._clib = _impure_ptr;
+ reents._winsup = &winsup_reent;
+
+ winsup_reent._process_logmask = LOG_UPTO (LOG_DEBUG);
+ winsup_reent._grp_pos = 0;
+ winsup_reent._process_ident = 0;
+ winsup_reent._process_logopt = 0;
+ winsup_reent._process_facility = 0;
+
+ TlsSetValue (reent_index, &reents);
+ // the static reent_data will be used in the main thread
+
+};
+
+void
+MTinterface::Init1 ()
+{
+ // create entry for main thread
+
+ int i = FindNextUnused (&threadlist);
+ assert (i == 0);
+ ThreadItem *item = (ThreadItem *) GetItem (i, &threadlist);
+
+ item = (ThreadItem *) SetItem (i, &mainthread, &threadlist);
+ item->used = true;
+ item->win32_obj_id = myself->hProcess;
+ item->thread_id = GetCurrentThreadId ();
+ item->function = NULL;
+
+ item->sigs = NULL;
+ item->sigmask = NULL;
+ item->sigtodo = NULL;
+};
+
+void
+MTinterface::ClearReent ()
+{
+ struct _reent *r = _REENT;
+ memset (r, 0, sizeof (struct _reent));
+
+ r->_errno = 0;
+ r->_stdin = &r->__sf[0];
+ r->_stdout = &r->__sf[1];
+ r->_stderr = &r->__sf[2];
+
+};
+
+
+ThreadItem *
+MTinterface::CreateThread (pthread_t * t, TFD (func), void *arg, pthread_attr_t a)
+{
+ AssertResourceOwner (LOCK_THREAD_LIST, WRITE_LOCK | READ_LOCK);
+
+ int i = FindNextUnused (&threadlist);
+
+ ThreadItem *item = (ThreadItem *) GetItem (i, &threadlist);
+ if (!item)
+ item = (ThreadItem *) SetItem (i, new ThreadItem (), &threadlist);
+ if (!item)
+ system_printf ("thread creation failed");
+
+ item->used = true;
+ item->function = func;
+ item->arg = arg;
+ item->attr = a;
+
+ item->win32_obj_id = ::CreateThread (&sec_none_nih, item->attr.stacksize,
+ (LPTHREAD_START_ROUTINE) thread_init_wrapper, item, 0, &item->thread_id);
+
+ CHECKHANDLE (NULL, 1);
+
+ *t = (pthread_t) item->win32_obj_id;
+
+ return item;
+};
+
+
+MutexItem *
+MTinterface::CreateMutex (pthread_mutex_t * mutex)
+{
+ AssertResourceOwner (LOCK_MUTEX_LIST, WRITE_LOCK | READ_LOCK);
+
+ int i = FindNextUnused (&mutexlist);
+
+ MutexItem *item = (MutexItem *) GetItem (i, &mutexlist);
+ if (!item)
+ item = (MutexItem *) SetItem (i, new MutexItem (), &mutexlist);
+ if (!item)
+ system_printf ("mutex creation failed");
+ item->used = true;
+
+ item->win32_obj_id = ::CreateMutex (&sec_none_nih, false, NULL);
+
+ CHECKHANDLE (NULL, 1);
+
+ *mutex = (pthread_mutex_t) item->win32_obj_id;
+
+ return item;
+}
+
+ThreadItem *
+MTinterface::GetCallingThread ()
+{
+ AssertResourceOwner (LOCK_THREAD_LIST, READ_LOCK);
+ DWORD id = GetCurrentThreadId ();
+ int index = 0;
+ return (ThreadItem *) Find (&id, &CmpThreadId, index, &threadlist);
+};
+
+ThreadItem *
+MTinterface::GetThread (pthread_t * _t)
+{
+ AssertResourceOwner (LOCK_THREAD_LIST, READ_LOCK);
+ int index = 0;
+ return (ThreadItem *) Find (_t, &CmpPthreadObj, index, &threadlist);
+};
+
+MutexItem *
+MTinterface::GetMutex (pthread_mutex_t * mp)
+{
+ AssertResourceOwner (LOCK_MUTEX_LIST, READ_LOCK);
+ int index = 0;
+ return (MutexItem *) Find (mp, &CmpPthreadObj, index, &mutexlist);
+}
+
+SemaphoreItem *
+MTinterface::GetSemaphore (sem_t * sp)
+{
+ AssertResourceOwner (LOCK_SEM_LIST, READ_LOCK);
+ int index = 0;
+ return (SemaphoreItem *) Find (sp, &CmpPthreadObj, index, &semalist);
+}
+
+
+void
+MTitem::Destroy ()
+{
+ CloseHandle (win32_obj_id);
+};
+
+int
+MutexItem::Lock ()
+{
+ return WaitForSingleObject (win32_obj_id, INFINITE);
+};
+
+int
+MutexItem::TryLock ()
+{
+ return WaitForSingleObject (win32_obj_id, 0);
+};
+
+int
+MutexItem::UnLock ()
+{
+ return ReleaseMutex (win32_obj_id);
+}
+
+SemaphoreItem *
+MTinterface::CreateSemaphore (sem_t * _s, int pshared, int _v)
+{
+ AssertResourceOwner (LOCK_SEM_LIST, WRITE_LOCK | READ_LOCK);
+
+ int i = FindNextUnused (&semalist);
+
+ SemaphoreItem *item = (SemaphoreItem *) GetItem (i, &semalist);
+ if (!item)
+ item = (SemaphoreItem *) SetItem (i, new SemaphoreItem (), &semalist);
+ if (!item)
+ system_printf ("semaphore creation failed");
+ item->used = true;
+ item->shared = pshared;
+
+ item->win32_obj_id = ::CreateSemaphore (&sec_none_nih, _v, _v, NULL);
+
+ CHECKHANDLE (NULL, 1);
+
+ *_s = (sem_t) item->win32_obj_id;
+
+ return item;
+};
+
+int
+SemaphoreItem::Wait ()
+{
+ return WaitForSingleObject (win32_obj_id, INFINITE);
+};
+
+int
+SemaphoreItem::Post ()
+{
+ long pc;
+ return ReleaseSemaphore (win32_obj_id, 1, &pc);
+};
+
+int
+SemaphoreItem::TryWait ()
+{
+ return WaitForSingleObject (win32_obj_id, 0);
+};
+
+
+////////////////////////// Pthreads
+
+void *
+thread_init_wrapper (void *_arg)
+{
+// Setup the local/global storage of this thread
+
+ ThreadItem *thread = (ThreadItem *) _arg;
+ struct __reent_t local_reent;
+ struct _winsup_t local_winsup;
+ struct _reent local_clib;
+
+ struct sigaction _sigs[NSIG];
+ sigset_t _sig_mask; /* one set for everything to ignore. */
+ LONG _sigtodo[NSIG + __SIGOFFSET];
+
+// setup signal structures
+ thread->sigs = _sigs;
+ thread->sigmask = &_sig_mask;
+ thread->sigtodo = _sigtodo;
+
+ memset (&local_clib, 0, sizeof (struct _reent));
+ memset (&local_winsup, 0, sizeof (struct _winsup_t));
+
+ local_clib._errno = 0;
+ local_clib._stdin = &local_clib.__sf[0];
+ local_clib._stdout = &local_clib.__sf[1];
+ local_clib._stderr = &local_clib.__sf[2];
+
+ local_reent._clib = &local_clib;
+ local_reent._winsup = &local_winsup;
+
+ local_winsup._process_logmask = LOG_UPTO (LOG_DEBUG);
+
+
+ if (!TlsSetValue (MT_INTERFACE->reent_index, &local_reent))
+ system_printf ("local storage for thread couldn't be set");
+
+#ifdef _CYG_THREAD_FAILSAFE
+ if (_REENT == _impure_ptr)
+ system_printf ("local storage for thread isn't setup correctly");
+#endif
+
+
+ thread_printf ("started thread %p %p %p %p %p %p", _arg, &local_clib, _impure_ptr, thread, thread->function, thread->arg);
+
+
+// call the user's thread
+ void *ret = thread->function (thread->arg);
+
+// FIX ME : cleanup code
+
+// thread->used = false; // release thread entry
+ thread->return_ptr = ret;
+ return ret;
+}
+
+int
+__pthread_create (pthread_t * thread, const pthread_attr_t * attr, TFD (start_routine), void *arg)
+{
+ SetResourceLock (LOCK_THREAD_LIST, WRITE_LOCK | READ_LOCK, "__pthread_create");
+
+ pthread_attr_t a;
+ ThreadItem *item;
+
+ if (attr)
+ item = MT_INTERFACE->CreateThread (thread, start_routine, arg, *attr);
+ else
+ {
+ __pthread_attr_init (&a);
+ item = MT_INTERFACE->CreateThread (thread, start_routine, arg, a);
+ };
+
+
+
+ CHECKITEM (LOCK_THREAD_LIST, WRITE_LOCK | READ_LOCK, "__pthread_create")
+
+ ReleaseResourceLock (LOCK_THREAD_LIST, WRITE_LOCK | READ_LOCK, "__pthread_create");
+ return 0;
+};
+
+int
+__pthread_attr_init (pthread_attr_t * attr)
+{
+ attr->stacksize = 0;
+ return 0;
+};
+
+int
+__pthread_attr_setstacksize (pthread_attr_t * attr, size_t size)
+{
+ attr->stacksize = size;
+ return 0;
+};
+
+int
+__pthread_attr_getstacksize (pthread_attr_t * attr, size_t * size)
+{
+ *size = attr->stacksize;
+ return 0;
+};
+
+int
+__pthread_attr_destroy (pthread_attr_t * attr)
+{
+ return 0;
+};
+
+int
+__pthread_exit (void *value_ptr)
+{
+ ThreadItem *item = MT_INTERFACE->GetCallingThread();
+ item->return_ptr = value_ptr;
+ ExitThread(0);
+ return 0;
+}
+
+int
+__pthread_join(pthread_t * thread, void **return_val)
+{
+ ThreadItem *item=user_data->threadinterface->GetThread(thread);
+
+
+ if (!item)
+ return ESRCH;
+
+ if (item->joinable == 'N')
+ {
+ if (return_val)
+ *return_val = NULL;
+ return EINVAL;
+ }
+ else
+ {
+ item->joinable = 'N';
+ WaitForSingleObject((HANDLE)*thread, INFINITE);
+ if (return_val)
+ *return_val = item->return_ptr;
+ }/* End if*/
+
+ return 0;
+};
+
+int
+__pthread_detach(pthread_t * thread)
+{
+ ThreadItem *item=user_data->threadinterface->GetThread(thread);
+ if (!item)
+ return ESRCH;
+
+ if (item->joinable == 'N')
+ {
+ item->return_ptr = NULL;
+ return EINVAL;
+ }
+
+ item->joinable = 'N';
+ return 0;
+}
+
+int
+__pthread_suspend(pthread_t * thread)
+{
+ ThreadItem *item=user_data->threadinterface->GetThread(thread);
+ if (!item)
+ return ESRCH;
+
+ if (item->suspended == false)
+ {
+ item->suspended = true;
+ SuspendThread( (HANDLE)*thread);
+ }
+
+ return 0;
+}
+
+
+int
+__pthread_continue(pthread_t * thread)
+{
+ ThreadItem *item=user_data->threadinterface->GetThread(thread);
+ if (!item)
+ return ESRCH;
+
+ if (item->suspended == true)
+ ResumeThread( (HANDLE)*thread);
+ item->suspended = false;
+
+ return 0;
+}
+
+
+
+
+unsigned long
+__pthread_getsequence_np (pthread_t * thread)
+{
+ GETTHREAD ("__pthread_getsequence_np");
+ return item->GetThreadId ();
+};
+
+/* Thread SpecificData */
+int
+__pthread_key_create (pthread_key_t * key)
+{
+ NOT_IMP ("_p_key_create\n");
+};
+
+int
+__pthread_key_delete (pthread_key_t * key)
+{
+ NOT_IMP ("_p_key_delete\n");
+};
+int
+__pthread_setspecific (pthread_key_t * key, const void *value)
+{
+ NOT_IMP ("_p_key_setsp\n");
+};
+void *
+__pthread_getspecific (pthread_key_t * key)
+{
+ NOT_IMP ("_p_key_getsp\n");
+};
+
+/* Thread signal */
+int
+__pthread_kill (pthread_t * thread, int sig)
+{
+// lock myself, for the use of thread2signal
+ // two differ kills might clash: FIX ME
+ GETTHREAD ("__pthread_kill");
+
+ if (item->sigs)
+ myself->setthread2signal (item);
+
+ int rval = sig_send (myself, sig);
+
+// unlock myself
+ return rval;
+
+};
+
+int
+__pthread_sigmask (int operation, const sigset_t * set, sigset_t * old_set)
+{
+ SetResourceLock (LOCK_THREAD_LIST, READ_LOCK, "__pthread_sigmask");
+ ThreadItem *item = MT_INTERFACE->GetCallingThread ();
+ ReleaseResourceLock (LOCK_THREAD_LIST, READ_LOCK, "__pthread_sigmask");
+
+// lock this myself, for the use of thread2signal
+ // two differt kills might clash: FIX ME
+
+ if (item->sigs)
+ myself->setthread2signal (item);
+
+ int rval = sigprocmask (operation, set, old_set);
+
+// unlock this myself
+
+ return rval;
+};
+
+/* ID */
+pthread_t
+__pthread_self ()
+{
+ SetResourceLock (LOCK_THREAD_LIST, READ_LOCK, "__pthread_self");
+
+ ThreadItem *item = MT_INTERFACE->GetCallingThread ();
+
+ ReleaseResourceLock (LOCK_THREAD_LIST, READ_LOCK, "__pthread_self");
+ return (pthread_t) item->Id ();
+
+};
+
+int
+__pthread_equal (pthread_t * t1, pthread_t * t2)
+{
+ return (*t1 - *t2);
+};
+
+/* Mutexes */
+
+int
+__pthread_mutex_init (pthread_mutex_t * mutex, const pthread_mutexattr_t * _attr)
+{
+ SetResourceLock (LOCK_MUTEX_LIST, WRITE_LOCK | READ_LOCK, "__pthread_mutex_init");
+
+ MutexItem *item = MT_INTERFACE->CreateMutex (mutex);
+
+ CHECKITEM (LOCK_MUTEX_LIST, WRITE_LOCK | READ_LOCK, "__pthread_mutex_init");
+
+ ReleaseResourceLock (LOCK_MUTEX_LIST, WRITE_LOCK | READ_LOCK, "__pthread_mutex_init");
+ return 0;
+};
+
+int
+__pthread_mutex_lock (pthread_mutex_t * mutex)
+{
+ GETMUTEX ("_ptherad_mutex_lock");
+
+ item->Lock ();
+
+ return 0;
+};
+
+int
+__pthread_mutex_trylock (pthread_mutex_t * mutex)
+{
+ GETMUTEX ("_ptherad_mutex_lock");
+
+ if (item->TryLock () == WAIT_TIMEOUT)
+ return EBUSY;
+
+ return 0;
+};
+
+int
+__pthread_mutex_unlock (pthread_mutex_t * mutex)
+{
+ GETMUTEX ("_ptherad_mutex_lock");
+
+ item->UnLock ();
+
+ return 0;
+};
+
+int
+__pthread_mutex_destroy (pthread_mutex_t * mutex)
+{
+ SetResourceLock (LOCK_MUTEX_LIST, READ_LOCK | WRITE_LOCK, "__pthread_mutex_destroy");
+
+ MutexItem *item = MT_INTERFACE->GetMutex (mutex);
+
+ CHECKITEM (LOCK_MUTEX_LIST, WRITE_LOCK | READ_LOCK, "__pthread_mutex_init");
+
+ item->Destroy ();
+
+ MT_INTERFACE->ReleaseItem (item);
+
+ ReleaseResourceLock (LOCK_MUTEX_LIST, READ_LOCK | WRITE_LOCK, "__pthread_mutex_destroy");
+ return 0;
+};
+
+/* Semaphores */
+int
+__sem_init (sem_t * sem, int pshared, unsigned int value)
+{
+ SetResourceLock (LOCK_SEM_LIST, READ_LOCK | WRITE_LOCK, "__sem_init");
+
+ SemaphoreItem *item = MT_INTERFACE->CreateSemaphore (sem, pshared, value);
+
+ CHECKITEM (LOCK_SEM_LIST, READ_LOCK | WRITE_LOCK, "__sem_init");
+
+ ReleaseResourceLock (LOCK_SEM_LIST, READ_LOCK | WRITE_LOCK, "__sem_init");
+ return 0;
+};
+
+int
+__sem_destroy (sem_t * sem)
+{
+ SetResourceLock (LOCK_SEM_LIST, READ_LOCK | WRITE_LOCK, "__sem_destroy");
+
+ SemaphoreItem *item = MT_INTERFACE->GetSemaphore (sem);
+
+ CHECKITEM (LOCK_SEM_LIST, READ_LOCK | WRITE_LOCK, "__sem_init");
+
+ item->Destroy ();
+
+ MT_INTERFACE->ReleaseItem (item);
+
+ ReleaseResourceLock (LOCK_SEM_LIST, READ_LOCK | WRITE_LOCK, "__sem_destroy");
+ return 0;
+};
+
+int
+__sem_wait (sem_t * sem)
+{
+ GETSEMA ("__sem_wait");
+
+ item->Wait ();
+
+ return 0;
+};
+
+int
+__sem_trywait (sem_t * sem)
+{
+ GETSEMA ("__sem_trywait");
+
+ if (item->TryWait () == WAIT_TIMEOUT)
+ return EAGAIN;
+
+ return 0;
+};
+
+int
+__sem_post (sem_t * sem)
+{
+ GETSEMA ("__sem_post");
+
+ item->Post ();
+
+ return 0;
+};
+
+
+#else
+
+// empty functions needed when makeing the dll without mt_safe support
+extern "C"
+{
+ int __pthread_create (pthread_t *, const pthread_attr_t *, TFD (start_routine), void *arg)
+ {
+ return -1;
+ };
+ int __pthread_attr_init (pthread_attr_t * attr)
+ {
+ return -1;
+ };
+ int __pthread_attr_destroy (pthread_attr_t * attr)
+ {
+ return -1;
+ };
+ int __pthread_attr_setstacksize (pthread_attr_t * attr, size_t size)
+ {
+ return -1;
+ };
+ int __pthread_attr_getstacksize (pthread_attr_t * attr, size_t * size)
+ {
+ return -1;
+ };
+/*
+ __pthread_attr_setstackaddr(...){ return -1; };
+ __pthread_attr_getstackaddr(...){ return -1; };
+ */
+ int __pthread_exit (void *value_ptr)
+ {
+ return -1;
+ };
+
+ int __pthread_join(pthread_t thread_id, void **return_val)
+ {
+ return -1;
+ }
+
+ unsigned long __pthread_getsequence_np (pthread_t * thread)
+ {
+ return 0;
+ };
+ int __pthread_key_create (pthread_key_t * key)
+ {
+ return -1;
+ };
+ int __pthread_key_delete (pthread_key_t * key)
+ {
+ return -1;
+ };
+ int __pthread_setspecific (pthread_key_t * key, const void *value)
+ {
+ return -1;
+ };
+ void *__pthread_getspecific (pthread_key_t * key)
+ {
+ return NULL;
+ };
+ int __pthread_kill (pthread_t * thread, int sig)
+ {
+ return -1;
+ };
+ int __pthread_sigmask (int operation, const sigset_t * set, sigset_t * old_set)
+ {
+ return -1;
+ };
+ pthread_t __pthread_self ()
+ {
+ return -1;
+ };
+ int __pthread_equal (pthread_t * t1, pthread_t * t2)
+ {
+ return -1;
+ };
+ int __pthread_mutex_init (pthread_mutex_t *, const pthread_mutexattr_t *)
+ {
+ return -1;
+ };
+ int __pthread_mutex_lock (pthread_mutex_t *)
+ {
+ return -1;
+ };
+ int __pthread_mutex_trylock (pthread_mutex_t *)
+ {
+ return -1;
+ };
+ int __pthread_mutex_unlock (pthread_mutex_t *)
+ {
+ return -1;
+ };
+ int __pthread_mutex_destroy (pthread_mutex_t *)
+ {
+ return -1;
+ };
+ int __sem_init (sem_t * sem, int pshared, unsigned int value)
+ {
+ return -1;
+ };
+ int __sem_destroy (sem_t * sem)
+ {
+ return -1;
+ };
+ int __sem_wait (sem_t * sem)
+ {
+ return -1;
+ };
+ int __sem_trywait (sem_t * sem)
+ {
+ return -1;
+ };
+ int __sem_post (sem_t * sem)
+ {
+ return -1;
+ };
+ struct _reent *_reent_clib ()
+ {
+ return NULL;
+ };
+}
+
+#endif // MT_SAFE
diff --git a/winsup/cygwin/thread.h b/winsup/cygwin/thread.h
new file mode 100644
index 000000000..9aca0c61a
--- /dev/null
+++ b/winsup/cygwin/thread.h
@@ -0,0 +1,312 @@
+/* thread.h: Locking and threading module definitions
+
+ Copyright 1998, 1999 Cygnus Solutions.
+
+ Written by Marco Fuykschot <marco@ddi.nl>
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#ifndef _CYGNUS_THREADS_
+#define _CYGNUS_THREADS_
+
+#define LOCK_FD_LIST 1
+#define LOCK_MEMORY_LIST 2
+#define LOCK_MMAP_LIST 3
+#define LOCK_DLL_LIST 4
+#define LOCK_THREAD_LIST 5
+#define LOCK_MUTEX_LIST 6
+#define LOCK_SEM_LIST 7
+
+#define WRITE_LOCK 1
+#define READ_LOCK 2
+
+extern "C"
+{
+#if defined (_CYG_THREAD_FAILSAFE) && defined (_MT_SAFE)
+ void AssertResourceOwner (int, int);
+#else
+#define AssertResourceOwner(i,ii)
+#endif
+}
+
+#ifndef _MT_SAFE
+
+#define SetResourceLock(i,n,c)
+#define ReleaseResourceLock(i,n,c)
+
+#else
+
+#include <pthread.h>
+#include <pwd.h>
+#include <grp.h>
+#include <stdio.h>
+#include <mntent.h>
+#include <time.h>
+
+extern "C" {
+
+struct _winsup_t
+{
+/*
+ Needed for the group functions
+*/
+ struct group _grp;
+ char *_namearray[2];
+ char _linebuf[100];
+ int _grp_pos;
+
+/* console.cc */
+ unsigned _rarg;
+ char _my_title_buf[TITLESIZE + 1];
+
+/* dlfcn.cc */
+ int _dl_error;
+ char _dl_buffer[256];
+
+/* passwd.cc */
+ struct passwd _res;
+ char _tmpbuf[100];
+ char _pass[_PASSWORD_LEN];
+ int _pw_pos;
+
+/* path.cc */
+ struct mntent _ret;
+ char *_current_directory_name;
+ char *_current_directory_posix_name;
+ unsigned long _current_directory_hash;
+ int _iteration;
+
+/* strerror */
+ char _strerror_buf[20];
+
+/* syscalls.cc */
+ char _dacl_buf[1024];
+ char _sacl_buf[1024];
+ char _ownr_buf[1024];
+ char _grp_buf[1024];
+
+/* sysloc.cc */
+ char *_process_ident;
+ int _process_logopt;
+ int _process_facility;
+ int _process_logmask;
+
+/* times.cc */
+ char _b[20];
+ struct tm _localtime_buf;
+ char _buf1[33];
+ char _buf2[33];
+
+/* uinfo.cc */
+ char _username[MAX_USER_NAME];
+};
+
+
+struct __reent_t
+{
+ struct _reent *_clib;
+ struct _winsup_t *_winsup;
+};
+
+_reent *_reent_clib ();
+_winsup_t *_reent_winsup ();
+void SetResourceLock (int, int, const char *);
+void ReleaseResourceLock (int, int, const char *);
+
+#ifdef _CYG_THREAD_FAILSAFE
+void AssertResourceOwner (int, int);
+#else
+#define AssertResourceOwner(i,ii)
+#endif
+}
+
+class per_process;
+class pinfo;
+
+class ResourceLocks
+{
+public:
+ResourceLocks ():inited (false) {};
+LPCRITICAL_SECTION Lock (int);
+void Init ();
+void Delete ();
+#ifdef _CYG_THREAD_FAILSAFE
+DWORD owner;
+DWORD count;
+#endif
+private:
+CRITICAL_SECTION lock;
+bool inited;
+};
+
+
+#define MT_MAX_ITEMS 128
+
+// thread classes\lists
+
+class MTitem
+{
+public:
+HANDLE win32_obj_id;
+UINT return_value;
+bool used;
+char joinable; // for thread only
+bool HandleOke () {return win32_obj_id;};
+virtual void Destroy ();
+virtual int Id () {return (int) win32_obj_id;};
+};
+
+class ThreadItem:public MTitem
+{
+public:
+pthread_attr_t attr;
+TFD (function);
+void *arg;
+void *return_ptr;
+bool suspended;
+DWORD thread_id;
+DWORD GetThreadId () {return thread_id;};
+
+/* signal handling */
+struct sigaction *sigs;
+sigset_t *sigmask;
+LONG *sigtodo;
+};
+
+class MutexItem:public MTitem
+{
+public:
+int Lock ();
+int TryLock ();
+int UnLock ();
+};
+
+class SemaphoreItem:public MTitem
+{
+public:
+int shared;
+int Wait ();
+int Post ();
+int TryWait ();
+};
+
+
+typedef struct
+{
+MTitem *items[MT_MAX_ITEMS];
+int index;
+}
+MTList;
+
+class MTinterface
+{
+public:
+// General
+DWORD reent_index;
+DWORD thread_key;
+
+// Used for main thread data, and sigproc thread
+struct __reent_t reents;
+struct _winsup_t winsup_reent;
+ThreadItem mainthread;
+
+void Init0 ();
+void Init1 ();
+void ClearReent ();
+
+void ReleaseItem (MTitem *);
+
+// Thread functions
+ThreadItem *CreateThread (pthread_t *, TFD (func), void *, pthread_attr_t);
+ThreadItem *GetCallingThread ();
+ThreadItem *GetThread (pthread_t *);
+
+// Mutex functions
+MutexItem *CreateMutex (pthread_mutex_t *);
+MutexItem *GetMutex (pthread_mutex_t *);
+
+// Semaphore functions
+SemaphoreItem *CreateSemaphore (sem_t *, int, int);
+SemaphoreItem *GetSemaphore (sem_t * t);
+
+private:
+// General Administration
+MTitem * Find (void *, int (*compare) (void *, void *), int &, MTList *);
+MTitem *GetItem (int, MTList *);
+MTitem *SetItem (int, MTitem *, MTList *);
+int Find (MTitem &, MTList *);
+int FindNextUnused (MTList *);
+
+MTList threadlist;
+MTList mutexlist;
+MTList semalist;
+};
+
+
+extern "C"
+{
+
+void *thread_init_wrapper (void *);
+
+/* ThreadCreation */
+int __pthread_create (pthread_t * thread, const pthread_attr_t * attr, TFD (start_routine), void *arg);
+int __pthread_attr_init (pthread_attr_t * attr);
+int __pthread_attr_destroy (pthread_attr_t * attr);
+int __pthread_attr_setstacksize (pthread_attr_t * attr, size_t size);
+int __pthread_attr_getstacksize (pthread_attr_t * attr, size_t * size);
+/*
+__pthread_attr_setstackaddr(...);
+__pthread_attr_getstackaddr(...);
+*/
+
+/* Thread Exit */
+int __pthread_exit (void *value_ptr);
+int __pthread_join(pthread_t *thread, void **return_val);
+int __pthread_detach(pthread_t *thread);
+
+/* Thread suspend */
+
+int __pthread_suspend(pthread_t *thread);
+int __pthread_continue(pthread_t *thread);
+
+unsigned long __pthread_getsequence_np (pthread_t * thread);
+
+/* Thread SpecificData */
+int __pthread_key_create (pthread_key_t * key);
+int __pthread_key_delete (pthread_key_t * key);
+int __pthread_setspecific (pthread_key_t * key, const void *value);
+void *__pthread_getspecific (pthread_key_t * key);
+
+
+/* Thread signal */
+int __pthread_kill (pthread_t * thread, int sig);
+int __pthread_sigmask (int operation, const sigset_t * set, sigset_t * old_set);
+
+/* ID */
+pthread_t __pthread_self ();
+int __pthread_equal (pthread_t * t1, pthread_t * t2);
+
+
+/* Mutexes */
+int __pthread_mutex_init (pthread_mutex_t *, const pthread_mutexattr_t *);
+int __pthread_mutex_lock (pthread_mutex_t *);
+int __pthread_mutex_trylock (pthread_mutex_t *);
+int __pthread_mutex_unlock (pthread_mutex_t *);
+int __pthread_mutex_destroy (pthread_mutex_t *);
+
+/* Semaphores */
+int __sem_init (sem_t * sem, int pshared, unsigned int value);
+int __sem_destroy (sem_t * sem);
+int __sem_wait (sem_t * sem);
+int __sem_trywait (sem_t * sem);
+int __sem_post (sem_t * sem);
+
+};
+
+#endif // MT_SAFE
+
+#endif // _CYGNUS_THREADS_
diff --git a/winsup/cygwin/times.cc b/winsup/cygwin/times.cc
new file mode 100644
index 000000000..6ee283b5c
--- /dev/null
+++ b/winsup/cygwin/times.cc
@@ -0,0 +1,540 @@
+/* times.cc
+
+ Copyright 1996, 1997, 1998, 1999, 2000 Cygnus Solutions.
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#include <time.h>
+#include <sys/times.h>
+#include <sys/timeb.h>
+#include <utime.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <errno.h>
+#include "winsup.h"
+
+extern time_t __declspec(dllexport) _timezone;
+extern int __declspec(dllexport) _daylight;
+
+#define FACTOR (0x19db1ded53ea710LL)
+#define NSPERSEC 10000000LL
+
+static void __stdcall timeval_to_filetime (timeval *time, FILETIME *out);
+
+/* Cygwin internal */
+static unsigned long long __stdcall
+__to_clock_t (FILETIME * src, int flag)
+{
+ unsigned long long total = ((unsigned long long) src->dwHighDateTime << 32) + ((unsigned)src->dwLowDateTime);
+ syscall_printf ("dwHighDateTime %u, dwLowDateTime %u", src->dwHighDateTime, src->dwLowDateTime);
+
+ /* Convert into clock ticks - the total is in 10ths of a usec. */
+ if (flag)
+ total -= FACTOR;
+
+ total /= (unsigned long long) (NSPERSEC / CLOCKS_PER_SEC);
+ syscall_printf ("total %08x %08x\n", (unsigned)(total>>32), (unsigned)(total));
+ return total;
+}
+
+/* times: POSIX 4.5.2.1 */
+extern "C" clock_t
+times (struct tms * buf)
+{
+ FILETIME creation_time, exit_time, kernel_time, user_time;
+
+ DWORD ticks = GetTickCount ();
+ /* Ticks is in milliseconds, convert to our ticks. Use long long to prevent
+ overflow. */
+ clock_t tc = (clock_t) ((long long) ticks * CLOCKS_PER_SEC / 1000);
+ if (os_being_run == winNT)
+ {
+ GetProcessTimes (hMainProc, &creation_time, &exit_time,
+ &kernel_time, &user_time);
+
+ syscall_printf ("ticks %d, CLOCKS_PER_SEC %d", ticks, CLOCKS_PER_SEC);
+ syscall_printf ("user_time %d, kernel_time %d, creation_time %d, exit_time %d",
+ user_time, kernel_time, creation_time, exit_time);
+ buf->tms_stime = __to_clock_t (&kernel_time, 0);
+ buf->tms_utime = __to_clock_t (&user_time, 0);
+ timeval_to_filetime (&myself->rusage_children.ru_stime, &kernel_time);
+ buf->tms_cstime = __to_clock_t (&kernel_time, 1);
+ timeval_to_filetime (&myself->rusage_children.ru_utime, &user_time);
+ buf->tms_cutime = __to_clock_t (&user_time, 1);
+ }
+ else
+ /* GetProcessTimes() does not work for non-NT versions of Windows. The
+ return values are undefined, so instead just copy the ticks value
+ into utime so that clock() will work properly on these systems */
+ {
+ buf->tms_utime = tc;
+ buf->tms_stime = 0;
+ buf->tms_cstime = 0;
+ buf->tms_cutime = 0;
+ }
+
+ return tc;
+}
+
+extern "C" clock_t
+_times (struct tms * buf)
+{
+ return times (buf);
+}
+
+/* settimeofday: BSD */
+extern "C" int
+settimeofday (const struct timeval *, const struct timezone *)
+{
+ set_errno (ENOSYS);
+ return -1;
+}
+
+/* timezone: standards? */
+extern "C" char *
+timezone ()
+{
+#ifdef _MT_SAFE
+ char *b=_reent_winsup()->_b;
+#else
+ static NO_COPY char b[20] = {0};
+#endif
+
+ tzset();
+ __small_sprintf (b,"GMT%+d:%02d", (int) (-_timezone / 3600), (int) (abs(_timezone / 60) % 60));
+ return b;
+}
+
+/* Cygwin internal */
+void __stdcall
+totimeval (struct timeval *dst, FILETIME *src, int sub, int flag)
+{
+ long long x = __to_clock_t (src, flag);
+
+ x *= (int) (1e6) / CLOCKS_PER_SEC; /* Turn x into usecs */
+ x -= (long long) sub * (int) (1e6);
+
+ dst->tv_usec = x % (long long) (1e6); /* And split */
+ dst->tv_sec = x / (long long) (1e6);
+}
+
+/* gettimeofday: BSD */
+extern "C" int
+gettimeofday (struct timeval *p, struct timezone *z)
+{
+ int res = 0;
+
+ if (p != NULL)
+ {
+ SYSTEMTIME t;
+ FILETIME f;
+
+ GetSystemTime (&t);
+ if (! SystemTimeToFileTime (&t, &f))
+ res = -1;
+ totimeval (p, &f, 0, 1);
+ }
+
+ if (z != NULL)
+ {
+ tzset();
+ z->tz_minuteswest = _timezone / 60;
+ z->tz_dsttime = _daylight;
+ }
+
+ syscall_printf ("%d = gettimeofday (%x, %x)", res, p, z);
+
+ return res;
+}
+
+extern "C"
+int
+_gettimeofday (struct timeval *p, struct timezone *z)
+{
+ return gettimeofday (p, z);
+}
+
+#if 0
+/* Work out magic constant below */
+genf ()
+{
+ SYSTEMTIME s;
+ FILETIME f;
+ s.wYear = 1970;
+ s.wMonth = 1;
+ s.wDayOfWeek = 5;
+ s.wDay = 1;
+ s.wHour = 0;
+ s.wMinute = 0;
+ s.wSecond = 0;
+ s.wMilliseconds = 1;
+ SystemTimeToFileTime (&s, &f);
+
+ small_printf ("FILE TIME is %08x%08x\n",
+ f.dwHighDateTime,
+ f.dwLowDateTime);
+}
+#endif
+
+/* Cygwin internal */
+void
+time_t_to_filetime (time_t time_in, FILETIME *out)
+{
+ long long x = time_in * NSPERSEC + FACTOR;
+ out->dwHighDateTime = x >> 32;
+ out->dwLowDateTime = x;
+}
+
+/* Cygwin internal */
+static void __stdcall
+timeval_to_filetime (timeval *time_in, FILETIME *out)
+{
+ long long x = time_in->tv_sec * NSPERSEC +
+ time_in->tv_usec * (NSPERSEC/1000000) + FACTOR;
+ out->dwHighDateTime = x >> 32;
+ out->dwLowDateTime = x;
+}
+
+/* Cygwin internal */
+static timeval __stdcall
+time_t_to_timeval (time_t in)
+{
+ timeval res;
+ res.tv_sec = in;
+ res.tv_usec = 0;
+ return res;
+}
+
+/* Cygwin internal */
+/* Convert a Win32 time to "UNIX" format. */
+long __stdcall
+to_time_t (FILETIME *ptr)
+{
+ /* A file time is the number of 100ns since jan 1 1601
+ stuffed into two long words.
+ A time_t is the number of seconds since jan 1 1970. */
+
+ long rem;
+ long long x = ((long long) ptr->dwHighDateTime << 32) + ((unsigned)ptr->dwLowDateTime);
+ x -= FACTOR; /* number of 100ns between 1601 and 1970 */
+ rem = x % ((long long)NSPERSEC);
+ rem += (NSPERSEC / 2);
+ x /= (long long) NSPERSEC; /* number of 100ns in a second */
+ x += (long long) (rem / NSPERSEC);
+ return x;
+}
+
+/* time: POSIX 4.5.1.1, C 4.12.2.4 */
+/* Return number of seconds since 00:00 UTC on jan 1, 1970 */
+extern "C"
+time_t
+time (time_t * ptr)
+{
+ time_t res;
+ SYSTEMTIME systemtime;
+ FILETIME filetime;
+
+ GetSystemTime (&systemtime);
+ SystemTimeToFileTime (&systemtime, &filetime);
+ res = to_time_t (&filetime);
+ if (ptr)
+ *ptr = res;
+
+ syscall_printf ("%d = time (%x)", res, ptr);
+
+ return res;
+}
+
+/*
+ * localtime_r.c
+ * Original Author: Adapted from tzcode maintained by Arthur David Olson.
+ *
+ * Converts the calendar time pointed to by tim_p into a broken-down time
+ * expressed as local time. Returns a pointer to a structure containing the
+ * broken-down time.
+ */
+
+#define SECSPERMIN 60
+#define MINSPERHOUR 60
+#define HOURSPERDAY 24
+#define SECSPERHOUR (SECSPERMIN * MINSPERHOUR)
+#define SECSPERDAY (SECSPERHOUR * HOURSPERDAY)
+#define DAYSPERWEEK 7
+#define MONSPERYEAR 12
+
+#define YEAR_BASE 1900
+#define EPOCH_YEAR 1970
+#define EPOCH_WDAY 4
+
+#define isleap(y) ((((y) % 4) == 0 && ((y) % 100) != 0) || ((y) % 400) == 0)
+
+#if 0 /* POSIX_LOCALTIME */
+
+static _CONST int mon_lengths[2][MONSPERYEAR] = {
+ {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
+ {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
+};
+
+static _CONST int year_lengths[2] = {
+ 365,
+ 366
+};
+
+/*
+ * Convert a time_t into a struct tm *.
+ * Does NO timezone conversion.
+ */
+
+/* Cygwin internal */
+static struct tm * __stdcall
+corelocaltime (const time_t * tim_p)
+{
+ long days, rem;
+ int y;
+ int yleap;
+ _CONST int *ip;
+#ifdef _MT_SAFE
+ struct tm &localtime_buf=_reent_winsup()->_localtime_buf;
+#else
+ static NO_COPY struct tm localtime_buf = {0};
+#endif
+
+ time_t tim = *tim_p;
+ struct tm *res = &localtime_buf;
+
+ days = ((long) tim) / SECSPERDAY;
+ rem = ((long) tim) % SECSPERDAY;
+
+ while (rem < 0)
+ {
+ rem += SECSPERDAY;
+ --days;
+ }
+ while (rem >= SECSPERDAY)
+ {
+ rem -= SECSPERDAY;
+ ++days;
+ }
+
+ /* compute hour, min, and sec */
+ res->tm_hour = (int) (rem / SECSPERHOUR);
+ rem %= SECSPERHOUR;
+ res->tm_min = (int) (rem / SECSPERMIN);
+ res->tm_sec = (int) (rem % SECSPERMIN);
+
+ /* compute day of week */
+ if ((res->tm_wday = ((EPOCH_WDAY + days) % DAYSPERWEEK)) < 0)
+ res->tm_wday += DAYSPERWEEK;
+
+ /* compute year & day of year */
+ y = EPOCH_YEAR;
+ if (days >= 0)
+ {
+ for (;;)
+ {
+ yleap = isleap (y);
+ if (days < year_lengths[yleap])
+ break;
+ y++;
+ days -= year_lengths[yleap];
+ }
+ }
+ else
+ {
+ do
+ {
+ --y;
+ yleap = isleap (y);
+ days += year_lengths[yleap];
+ } while (days < 0);
+ }
+
+ res->tm_year = y - YEAR_BASE;
+ res->tm_yday = days;
+ ip = mon_lengths[yleap];
+ for (res->tm_mon = 0; days >= ip[res->tm_mon]; ++res->tm_mon)
+ days -= ip[res->tm_mon];
+ res->tm_mday = days + 1;
+
+ /* set daylight saving time flag */
+ res->tm_isdst = -1;
+
+ syscall_printf ("%d = corelocaltime (%x)", res, tim_p);
+
+ return (res);
+}
+
+/* localtime: POSIX 8.1.1, C 4.12.3.4 */
+/*
+ * localtime takes a time_t (which is in UTC)
+ * and formats it into a struct tm as a local time.
+ */
+extern "C"
+struct tm *
+localtime (const time_t *tim_p)
+{
+ time_t tim = *tim_p;
+ struct tm *rtm;
+
+ tzset();
+
+ tim -= _timezone;
+
+ rtm = corelocaltime (&tim);
+
+ rtm->tm_isdst = _daylight;
+
+ syscall_printf ("%x = localtime (%x)", rtm, tim_p);
+
+ return rtm;
+}
+
+/* gmtime: C 4.12.3.3 */
+/*
+ * gmtime takes a time_t (which is already in UTC)
+ * and just puts it into a struct tm.
+ */
+extern "C"
+struct tm *
+gmtime (const time_t *tim_p)
+{
+ time_t tim = *tim_p;
+
+ struct tm *rtm = corelocaltime (&tim);
+ /* UTC has no daylight savings time */
+ rtm->tm_isdst = 0;
+
+ syscall_printf ("%x = gmtime (%x)", rtm, tim_p);
+
+ return rtm;
+}
+
+#endif /* POSIX_LOCALTIME */
+
+/* utimes: standards? */
+extern "C"
+int
+utimes (const char *path, struct timeval *tvp)
+{
+ int res = 0;
+ struct timeval tmp[2];
+ path_conv win32 (path);
+
+ if (win32.error)
+ {
+ set_errno (win32.error);
+ syscall_printf ("-1 = utimes (%s, %x)", path, tvp);
+ return -1;
+ }
+
+ /* MSDN suggests using FILE_FLAG_BACKUP_SEMANTICS for accessing
+ the times of directories. FIXME: what about Win95??? */
+ HANDLE h = CreateFileA (win32.get_win32 (),
+ GENERIC_WRITE,
+ FILE_SHARE_READ | FILE_SHARE_WRITE,
+ &sec_none_nih,
+ OPEN_EXISTING,
+ FILE_ATTRIBUTE_NORMAL | FILE_FLAG_BACKUP_SEMANTICS,
+ 0);
+
+ if (h == INVALID_HANDLE_VALUE)
+ {
+ if ((res = GetFileAttributes (win32.get_win32 ())) != -1 &&
+ (res & FILE_ATTRIBUTE_DIRECTORY))
+ {
+ /* What we can do with directories more? */
+ res = 0;
+ }
+ else
+ {
+ res = -1;
+ __seterrno ();
+ }
+ }
+ else
+ {
+ if (tvp == 0)
+ {
+ gettimeofday (&tmp[0], 0);
+ tmp[1] = tmp[0];
+ tvp = tmp;
+ }
+
+ FILETIME lastaccess;
+ FILETIME lastwrite;
+
+ timeval_to_filetime (tvp + 0, &lastaccess);
+ timeval_to_filetime (tvp + 1, &lastwrite);
+
+ debug_printf ("incoming lastaccess %08x %08x",
+ tvp->tv_sec,
+ tvp->tv_usec);
+
+// dump_filetime (lastaccess);
+// dump_filetime (lastwrite);
+
+ /* FIXME: SetFileTime needs a handle with a write lock
+ on the file whose time is being modified. So calls to utime()
+ fail for read only files. */
+
+ if (!SetFileTime (h, 0, &lastaccess, &lastwrite))
+ {
+ __seterrno ();
+ res = -1;
+ }
+ else
+ res = 0;
+ CloseHandle (h);
+ }
+
+ syscall_printf ("%d = utimes (%s, %x); (h%d)",
+ res, path, tvp, h);
+ return res;
+}
+
+/* utime: POSIX 5.6.6.1 */
+extern "C"
+int
+utime (const char *path, struct utimbuf *buf)
+{
+ struct timeval tmp[2];
+
+ if (buf == 0)
+ return utimes (path, 0);
+
+ debug_printf ("incoming utime act %x", buf->actime);
+ tmp[0] = time_t_to_timeval (buf->actime);
+ tmp[1] = time_t_to_timeval (buf->modtime);
+
+ return utimes (path, tmp);
+}
+
+/* ftime: standards? */
+extern "C"
+int
+ftime (struct timeb *tp)
+{
+ struct timeval tv;
+ struct timezone tz;
+
+ if (gettimeofday (&tv, &tz) < 0)
+ return -1;
+
+ tp->time = tv.tv_sec;
+ tp->millitm = tv.tv_usec / 1000;
+ tp->timezone = tz.tz_minuteswest;
+ tp->dstflag = tz.tz_dsttime;
+
+ return 0;
+}
+
+/* obsolete, changed to cygwin_tzset when localtime.c was added - dj */
+extern "C"
+void
+cygwin_tzset ()
+{
+}
diff --git a/winsup/cygwin/tty.cc b/winsup/cygwin/tty.cc
new file mode 100644
index 000000000..ef9bec5a3
--- /dev/null
+++ b/winsup/cygwin/tty.cc
@@ -0,0 +1,417 @@
+/* tty.cc
+
+ Copyright 1997, 1998, 2000 Cygnus Solutions.
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#include <errno.h>
+#include <unistd.h>
+#include <utmp.h>
+#include <ctype.h>
+#include "winsup.h"
+
+extern fhandler_tty_master *tty_master;
+
+extern "C"
+int
+grantpt (void)
+{
+ return 0;
+}
+
+extern "C"
+int
+unlockpt (void)
+{
+ return 0;
+}
+
+extern "C"
+int
+ttyslot (void)
+{
+ if (NOTSTATE (myself, PID_USETTY))
+ return -1;
+ return myself->ctty;
+}
+
+void __stdcall
+tty_init (void)
+{
+ if (NOTSTATE (myself, PID_USETTY))
+ return;
+ if (myself->ctty == -1)
+ if (NOTSTATE (myself, PID_CYGPARENT))
+ myself->ctty = attach_tty (myself->ctty);
+ else
+ return;
+ if (myself->ctty == -1)
+ termios_printf ("Can't attach to tty");
+}
+
+/* Create session's master tty */
+
+void __stdcall
+create_tty_master (int ttynum)
+{
+ tty_master = (fhandler_tty_master *) dtable.build_fhandler (-1, FH_TTYM,
+ "/dev/ttym", ttynum);
+ if (tty_master->init (ttynum))
+ api_fatal ("Can't create master tty");
+ else
+ {
+ /* Log utmp entry */
+ struct utmp our_utmp;
+
+ bzero ((char *) &our_utmp, sizeof (utmp));
+ (void) time (&our_utmp.ut_time);
+ strncpy (our_utmp.ut_name, getlogin (), sizeof (our_utmp.ut_name));
+ cygwin_gethostname (our_utmp.ut_host, sizeof (our_utmp.ut_host));
+ __small_sprintf (our_utmp.ut_line, "tty%d", ttynum);
+ our_utmp.ut_type = USER_PROCESS;
+ myself->ctty = ttynum;
+ login (&our_utmp);
+ }
+}
+
+void __stdcall
+tty_terminate (void)
+{
+ if (NOTSTATE (myself, PID_USETTY))
+ return;
+ cygwin_shared->tty.terminate ();
+}
+
+int __stdcall
+attach_tty (int num)
+{
+ if (num != -1)
+ {
+ return cygwin_shared->tty.connect_tty (num);
+ }
+ if (NOTSTATE (myself, PID_USETTY))
+ return -1;
+ return cygwin_shared->tty.allocate_tty (1);
+}
+
+void
+tty_list::terminate (void)
+{
+ int ttynum = myself->ctty;
+
+ /* Keep master running till there are connected clients */
+ if (ttynum != -1 && ttys[ttynum].master_pid == GetCurrentProcessId ())
+ {
+ tty *t = ttys + ttynum;
+ CloseHandle (t->from_master);
+ CloseHandle (t->to_master);
+ /* Wait for children which rely on tty handling in this process to
+ go away */
+ for (int i = 0; ; i++)
+ {
+ if (!t->slave_alive ())
+ break;
+ if (i >= 100)
+ {
+ small_printf ("waiting for children using tty%d to terminate\n",
+ ttynum);
+ i = 0;
+ }
+
+ Sleep (200);
+ }
+
+ termios_printf ("tty %d master about to finish", ttynum);
+ CloseHandle (t->to_slave);
+ CloseHandle (t->from_slave);
+ WaitForSingleObject (tty_master->hThread, INFINITE);
+ t->init ();
+
+ char buf[20];
+ __small_sprintf (buf, "tty%d", ttynum);
+ logout (buf);
+ }
+}
+
+int
+tty_list::connect_tty (int ttynum)
+{
+ if (ttynum < 0 || ttynum >= NTTYS)
+ {
+ termios_printf ("ttynum (%d) out of range", ttynum);
+ return -1;
+ }
+ if (!ttys[ttynum].exists ())
+ {
+ termios_printf ("tty %d was not allocated", ttynum);
+ return -1;
+ }
+
+ return ttynum;
+}
+
+void
+tty_list::init (void)
+{
+ for (int i = 0; i < NTTYS; i++)
+ {
+ ttys[i].init ();
+ ttys[i].setntty (i);
+ }
+}
+
+/* Search for tty class for our console. Allocate new tty if our process is
+ the only cygwin process in the current console.
+ Return tty number or -1 if error.
+ If flag == 0, just find a free tty.
+ */
+int
+tty_list::allocate_tty (int with_console)
+{
+ HWND console;
+
+ /* FIXME: This whole function needs a protective mutex. */
+
+ if (!with_console)
+ console = NULL;
+ else
+ {
+ char *oldtitle = new char [TITLESIZE];
+
+ if (!oldtitle)
+ {
+ termios_printf ("Can't *allocate console title buffer");
+ return -1;
+ }
+ if (!GetConsoleTitle (oldtitle, TITLESIZE))
+ {
+ termios_printf ("Can't read console title");
+ return -1;
+ }
+
+ if (WaitForSingleObject (title_mutex, INFINITE) == WAIT_FAILED)
+ termios_printf ("WFSO for title_mutext %p failed, %E", title_mutex);
+
+ char buf[40];
+
+ __small_sprintf (buf, "cygwin.find.console.%d", myself->pid);
+ SetConsoleTitle (buf);
+ Sleep (40);
+ console = FindWindow (NULL, buf);
+ SetConsoleTitle (oldtitle);
+ Sleep (40);
+ ReleaseMutex (title_mutex);
+ if (console == NULL)
+ {
+ termios_printf ("Can't find console window");
+ return -1;
+ }
+ }
+ /* Is a tty allocated for console? */
+
+ int freetty = -1;
+ for (int i = 0; i < NTTYS; i++)
+ {
+ if (!ttys[i].exists ())
+ {
+ if (freetty < 0) /* Scanning? */
+ freetty = i; /* Yes. */
+ if (!with_console) /* Do we want to attach this to a console? */
+ break; /* No. We've got one. */
+ }
+
+ if (with_console && ttys[i].gethwnd () == console)
+ {
+ termios_printf ("console %x already associated with tty%d",
+ console, i);
+ /* Is the master alive? */
+ HANDLE hMaster;
+ hMaster = OpenProcess (PROCESS_DUP_HANDLE, FALSE, ttys[i].master_pid);
+ if (hMaster)
+ {
+ CloseHandle (hMaster);
+ return i;
+ }
+ /* Master is dead */
+ freetty = i;
+ break;
+ }
+ }
+
+ /* There is no tty allocated to console, allocate the first free found */
+ if (freetty == -1)
+ {
+ system_printf ("No free ttys available");
+ return -1;
+ }
+ tty *t = ttys + freetty;
+ t->init ();
+ t->setsid (-1);
+ t->setpgid (myself->pgid);
+ t->sethwnd (console);
+
+ if (with_console)
+ {
+ termios_printf ("console %x associated with tty%d", console, freetty);
+ create_tty_master (freetty);
+ }
+ else
+ termios_printf ("tty%d allocated", freetty);
+ return freetty;
+}
+
+BOOL
+tty::slave_alive ()
+{
+ return alive (TTY_SLAVE_ALIVE);
+}
+
+BOOL
+tty::master_alive ()
+{
+ return alive (TTY_MASTER_ALIVE);
+}
+
+BOOL
+tty::alive (const char *fmt)
+{
+ HANDLE ev;
+ char buf[sizeof (TTY_MASTER_ALIVE) + 16];
+
+ __small_sprintf (buf, fmt, ntty);
+ if ((ev = OpenEvent (EVENT_ALL_ACCESS, TRUE, buf)))
+ CloseHandle (ev);
+ return ev != NULL;
+}
+
+HANDLE
+tty::create_inuse (const char *fmt)
+{
+ HANDLE h;
+ char buf[sizeof (TTY_MASTER_ALIVE) + 16];
+
+ __small_sprintf (buf, fmt, ntty);
+ h = CreateEvent (&sec_all, TRUE, FALSE, buf);
+ termios_printf ("%s = %p", buf, h);
+ if (!h)
+ termios_printf ("couldn't open inuse event, %E", buf);
+ return h;
+}
+
+void
+tty::init (void)
+{
+ OutputStopped = 0;
+ setsid (0);
+ pgid = 0;
+ hwnd = NULL;
+ to_slave = NULL;
+ from_slave = NULL;
+ was_opened = 0;
+}
+
+HANDLE
+tty::get_event (const char *fmt, BOOL inherit)
+{
+ HANDLE hev;
+ char buf[40];
+
+ __small_sprintf (buf, fmt, ntty);
+ if (!(hev = CreateEvent (inherit ? &sec_all : &sec_all_nih, FALSE, FALSE, buf)))
+ {
+ termios_printf ("couldn't create %s", buf);
+ set_errno (ENOENT); /* FIXME this can't be the right errno */
+ return NULL;
+ }
+
+ termios_printf ("created event %s", buf);
+ return hev;
+}
+
+int
+tty::make_pipes (fhandler_pty_master *ptym)
+{
+ /* Create communication pipes */
+
+ /* FIXME: should this be sec_none_nih? */
+ if (CreatePipe (&from_master, &to_slave, &sec_all, 0) == FALSE)
+ {
+ termios_printf ("can't create input pipe");
+ set_errno (ENOENT);
+ return FALSE;
+ }
+
+ if (CreatePipe (&from_slave, &to_master, &sec_all, 0) == FALSE)
+ {
+ termios_printf ("can't create output pipe");
+ set_errno (ENOENT);
+ return FALSE;
+ }
+ termios_printf ("tty%d from_slave %p, to_slave %p", ntty, from_slave,
+ to_slave);
+ ptym->set_io_handle (from_slave);
+ ptym->set_output_handle (to_slave);
+ return TRUE;
+}
+
+BOOL
+tty::common_init (fhandler_pty_master *ptym)
+{
+ /* Set termios information. Force initialization. */
+ ptym->tcinit (this, TRUE);
+
+ if (!make_pipes (ptym))
+ return FALSE;
+ ptym->neednl_ = 0;
+
+ /* Save our pid */
+
+ master_pid = GetCurrentProcessId ();
+
+ /* Allow the others to open us (for handle duplication) */
+
+ if ((os_being_run == winNT) &&
+ (SetKernelObjectSecurity (hMainProc, DACL_SECURITY_INFORMATION,
+ get_null_sd ()) == FALSE))
+ small_printf ("Can't set process security, %E");
+
+ /* Create synchronisation events */
+
+ if (!(ptym->restart_output_event = get_event (RESTART_OUTPUT_EVENT, TRUE)))
+ return FALSE;
+
+ if (ptym->get_device () != FH_TTYM)
+ {
+ ptym->output_done_event = ptym->ioctl_done_event =
+ ptym->ioctl_request_event = NULL;
+ }
+ else
+ {
+ if (!(ptym->output_done_event = get_event (OUTPUT_DONE_EVENT, FALSE)))
+ return FALSE;
+ if (!(ptym->ioctl_done_event = get_event (IOCTL_DONE_EVENT, FALSE)))
+ return FALSE;
+ if (!(ptym->ioctl_request_event = get_event (IOCTL_REQUEST_EVENT, FALSE)))
+ return FALSE;
+ }
+
+ char buf[40];
+ __small_sprintf (buf, OUTPUT_MUTEX, ntty);
+ if (!(ptym->output_mutex = CreateMutex (&sec_all, FALSE, buf)))
+ {
+ termios_printf ("can't create %s", buf);
+ set_errno (ENOENT);
+ return FALSE;
+ }
+
+ ProtectHandle1 (ptym->output_mutex, output_mutex);
+ winsize.ws_col = 80;
+ winsize.ws_row = 25;
+
+ termios_printf("tty%d opened", ntty);
+ return TRUE;
+}
diff --git a/winsup/cygwin/tz_posixrules.h b/winsup/cygwin/tz_posixrules.h
new file mode 100644
index 000000000..6059d67f7
--- /dev/null
+++ b/winsup/cygwin/tz_posixrules.h
@@ -0,0 +1,48 @@
+/* generated with bin2h from zoneinfo/posixrules */
+
+static unsigned char _posixrules_data[] = {
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,
+0,1,16,0,0,0,2,0,0,0,8,0,151,254,240,1,135,225,224,2,119,224,240,3,112,254,96,4,96,253,112,5,80,
+224,96,6,64,223,112,7,48,194,96,7,141,25,112,9,16,164,96,9,173,148,240,10,240,134,96,11,224,133,112,12,217,162,
+224,13,192,103,112,14,185,132,224,15,169,131,240,16,153,102,224,17,137,101,240,18,121,72,224,19,105,71,240,20,89,42,224,
+21,73,41,240,22,57,12,224,23,41,11,240,24,34,41,96,25,8,237,240,26,2,11,96,26,242,10,112,27,225,237,96,28,
+209,236,112,29,193,207,96,30,177,206,112,31,161,177,96,32,118,0,240,33,129,147,96,34,85,226,240,35,106,175,224,36,53,
+196,240,37,74,145,224,38,21,166,240,39,42,115,224,39,254,195,112,41,10,85,224,41,222,165,112,42,234,55,224,43,190,135,
+112,44,211,84,96,45,158,105,112,46,179,54,96,47,126,75,112,48,147,24,96,49,103,103,240,50,114,250,96,51,71,73,240,
+52,82,220,96,53,39,43,240,54,50,190,96,55,7,13,240,56,27,218,224,56,230,239,240,57,251,188,224,58,198,209,240,59,
+219,158,224,60,175,238,112,61,187,128,224,62,143,208,112,63,155,98,224,64,111,178,112,65,132,127,96,66,79,148,112,67,100,
+97,96,68,47,118,112,69,68,67,96,70,15,88,112,71,36,37,96,71,248,116,240,73,4,7,96,73,216,86,240,74,227,233,
+96,75,184,56,240,76,205,5,224,77,152,26,240,78,172,231,224,79,119,252,240,80,140,201,224,81,97,25,112,82,108,171,224,
+83,64,251,112,84,76,141,224,85,32,221,112,86,44,111,224,87,0,191,112,88,21,140,96,88,224,161,112,89,245,110,96,90,
+192,131,112,91,213,80,96,92,169,159,240,93,181,50,96,94,137,129,240,95,149,20,96,96,105,99,240,97,126,48,224,98,73,
+69,240,99,94,18,224,100,41,39,240,101,61,244,224,102,18,68,112,103,29,214,224,103,242,38,112,104,253,184,224,105,210,8,
+112,106,221,154,224,107,177,234,112,108,198,183,96,109,145,204,112,110,166,153,96,111,113,174,112,112,134,123,96,113,90,202,240,
+114,102,93,96,115,58,172,240,116,70,63,96,117,26,142,240,118,47,91,224,118,250,112,240,120,15,61,224,120,218,82,240,121,
+239,31,224,122,186,52,240,123,207,1,224,124,163,81,112,125,174,227,224,126,131,51,112,127,142,197,224,128,99,21,112,129,119,
+226,96,130,66,247,112,131,87,196,96,132,34,217,112,133,55,166,96,134,11,245,240,135,23,136,96,135,235,215,240,136,247,106,
+96,137,203,185,240,138,215,76,96,139,171,155,240,140,192,104,224,141,139,125,240,142,160,74,224,143,107,95,240,144,128,44,224,
+145,84,124,112,146,96,14,224,147,52,94,112,148,63,240,224,149,20,64,112,150,41,13,96,150,244,34,112,152,8,239,96,152,
+212,4,112,153,232,209,96,154,189,32,240,155,200,179,96,156,157,2,240,157,168,149,96,158,124,228,240,159,136,119,96,160,92,
+198,240,161,113,147,224,162,60,168,240,163,81,117,224,164,28,138,240,165,49,87,224,166,5,167,112,167,17,57,224,167,229,137,
+112,168,241,27,224,169,197,107,112,170,218,56,96,171,165,77,112,172,186,26,96,173,133,47,112,174,153,252,96,175,101,17,112,
+176,121,222,96,177,78,45,240,178,89,192,96,179,46,15,240,180,57,162,96,181,13,241,240,182,34,190,224,182,237,211,240,184,
+2,160,224,184,205,181,240,185,226,130,224,186,182,210,112,187,194,100,224,188,150,180,112,189,162,70,224,190,118,150,112,191,130,
+40,224,192,86,120,112,193,107,69,96,194,54,90,112,195,75,39,96,196,22,60,112,197,43,9,96,197,255,88,240,199,10,235,
+96,199,223,58,240,200,234,205,96,201,191,28,240,202,211,233,224,203,158,254,240,204,179,203,224,205,126,224,240,206,147,173,224,
+207,103,253,112,208,115,143,224,209,71,223,112,210,83,113,224,211,39,193,112,212,51,83,224,213,7,163,112,214,28,112,96,214,
+231,133,112,215,252,82,96,216,199,103,112,217,220,52,96,218,176,131,240,219,188,22,96,220,144,101,240,221,155,248,96,222,112,
+71,240,223,133,20,224,224,80,41,240,225,100,246,224,226,48,11,240,227,68,216,224,228,15,237,240,229,36,186,224,229,249,10,
+112,231,4,156,224,231,216,236,112,232,228,126,224,233,184,206,112,234,205,155,96,235,152,176,112,236,173,125,96,237,120,146,112,
+238,141,95,96,239,97,174,240,240,109,65,96,241,65,144,240,242,77,35,96,243,33,114,240,244,45,5,96,245,1,84,240,246,
+22,33,224,246,225,54,240,247,246,3,224,248,193,24,240,249,213,229,224,250,160,250,240,251,181,199,224,252,138,23,112,253,149,
+169,224,254,105,249,112,255,117,139,224,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,
+1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,
+0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,
+1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,
+0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,
+1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,
+0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,
+1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,
+0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,255,255,199,192,1,0,255,255,185,176,0,4,69,68,84,
+0,69,83,84,0,0,0
+};
diff --git a/winsup/cygwin/uinfo.cc b/winsup/cygwin/uinfo.cc
new file mode 100644
index 000000000..fbf2eca2a
--- /dev/null
+++ b/winsup/cygwin/uinfo.cc
@@ -0,0 +1,200 @@
+/* uinfo.cc: user info (uid, gid, etc...)
+
+ Copyright 1996, 1997, 1998 Cygnus Solutions.
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#include <pwd.h>
+#include "winsup.h"
+#include <utmp.h>
+#include <limits.h>
+#include <unistd.h>
+#include "autoload.h"
+#include <stdlib.h>
+#include <wchar.h>
+#include <lm.h>
+
+/* FIXME: shouldn't violate internal object space -- these two
+ should be static inside grp.cc */
+void read_etc_group ();
+extern int group_in_memory_p;
+
+char *
+internal_getlogin (struct pinfo *pi)
+{
+ DWORD username_len = MAX_USER_NAME;
+ LPWKSTA_USER_INFO_1 ui = NULL;
+
+ if (! pi)
+ api_fatal ("pinfo pointer is NULL!\n");
+
+ if (os_being_run == winNT)
+ {
+ int ret = NetWkstaUserGetInfo (NULL, 1, (LPBYTE *)&ui);
+ if (! ret)
+ {
+ wcstombs (pi->domain,
+ ui->wkui1_logon_domain,
+ (wcslen (ui->wkui1_logon_domain) + 1) * sizeof (WCHAR));
+ debug_printf ("Domain: %s", pi->domain);
+ wcstombs (pi->logsrv,
+ ui->wkui1_logon_server,
+ (wcslen (ui->wkui1_logon_server) + 1) * sizeof (WCHAR));
+ if (! *pi->logsrv)
+ {
+ LPWSTR logon_srv = NULL;
+
+ if (!NetGetAnyDCName (NULL,
+ ui->wkui1_logon_domain,
+ (LPBYTE *)&logon_srv))
+ wcstombs (pi->logsrv,
+ logon_srv, // filter leading double backslashes
+ (wcslen (logon_srv) + 1) * sizeof (WCHAR));
+ if (logon_srv)
+ NetApiBufferFree (logon_srv);
+ debug_printf ("AnyDC Server: %s", pi->logsrv);
+ }
+ else
+ debug_printf ("Logon Server: %s", pi->logsrv);
+ wcstombs (pi->username,
+ ui->wkui1_username,
+ (wcslen (ui->wkui1_username) + 1) * sizeof (WCHAR));
+ debug_printf ("Windows Username: %s", pi->username);
+ NetApiBufferFree (ui);
+ }
+ else
+ {
+ debug_printf ("%d = NetWkstaUserGetInfo ()\n", ret);
+ if (! GetUserName (pi->username, &username_len))
+ strcpy (pi->username, "unknown");
+ }
+ if (!lookup_name (pi->username, pi->logsrv, pi->psid))
+ {
+ debug_printf ("myself->psid = NULL");
+ pi->psid = NULL;
+ }
+ else if (allow_ntsec)
+ {
+ extern BOOL get_pw_sid (PSID, struct passwd*);
+ struct passwd *pw;
+ char psidbuf[40];
+ PSID psid = (PSID) psidbuf;
+
+ while ((pw = getpwent ()) != NULL)
+ if (get_pw_sid (psid, pw) && EqualSid (pi->psid, psid))
+ {
+ strcpy (pi->username, pw->pw_name);
+ break;
+ }
+ endpwent ();
+ }
+ }
+ else
+ {
+ debug_printf ("myself->psid = NULL");
+ pi->psid = NULL;
+ if (! GetUserName (pi->username, &username_len))
+ strcpy (pi->username, "unknown");
+ }
+ debug_printf ("Cygwins Username: %s\n", pi->username);
+ return pi->username;
+}
+
+void
+uinfo_init ()
+{
+ struct passwd *p;
+
+ if (myself->username[0])
+ return;
+
+ myself->psid = (PSID) myself->sidbuf;
+ if ((p = getpwnam (internal_getlogin (myself))) != NULL)
+ {
+ /* calling getpwnam assures us that /etc/password has been
+ read in, but we can't be sure about /etc/group */
+
+ if (!group_in_memory_p)
+ read_etc_group ();
+
+ myself->uid = p->pw_uid;
+ myself->gid = p->pw_gid;
+ }
+ else
+ {
+ myself->uid = DEFAULT_UID;
+ myself->gid = DEFAULT_GID;
+ }
+}
+
+extern "C" char *
+getlogin (void)
+{
+#ifdef _MT_SAFE
+ char *this_username=_reent_winsup()->_username;
+#else
+ static NO_COPY char this_username[MAX_USER_NAME];
+#endif
+
+ uinfo_init ();
+ return strcpy (this_username, myself->username);
+}
+
+extern "C" uid_t
+getuid (void)
+{
+ return myself->uid;
+}
+
+extern "C" gid_t
+getgid (void)
+{
+ return myself->gid;
+}
+
+extern "C" uid_t
+geteuid (void)
+{
+ return getuid ();
+}
+
+extern "C" gid_t
+getegid (void)
+{
+ return getgid ();
+}
+
+/* Not quite right - cuserid can change, getlogin can't */
+extern "C" char *
+cuserid (char *src)
+{
+ if (src)
+ {
+ strcpy (src, getlogin ());
+ return src;
+ }
+ else
+ {
+ return getlogin ();
+ }
+}
+
+LoadDLLinitfunc (netapi32)
+{
+ HANDLE h;
+
+ if ((h = LoadLibrary ("netapi32.dll")) != NULL)
+ netapi32_handle = h;
+ else if (! netapi32_handle)
+ api_fatal ("could not load netapi32.dll. %d", GetLastError ());
+ return 0;
+}
+LoadDLLinit (netapi32)
+LoadDLLfunc (NetWkstaUserGetInfo, NetWkstaUserGetInfo@12, netapi32)
+LoadDLLfunc (NetGetAnyDCName, NetGetAnyDCName@12, netapi32)
+LoadDLLfunc (NetApiBufferFree, NetApiBufferFree@4, netapi32)
+
diff --git a/winsup/cygwin/uname.cc b/winsup/cygwin/uname.cc
new file mode 100644
index 000000000..101855cd7
--- /dev/null
+++ b/winsup/cygwin/uname.cc
@@ -0,0 +1,110 @@
+/* uname.cc
+
+ Copyright 1996, 1997, 1998, 1999, 2000 Cygnus Solutions.
+ Written by Steve Chamberlain of Cygnus Support, sac@cygnus.com
+ Rewritten by Geoffrey Noer of Cygnus Solutions, noer@cygnus.com
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#include <stdio.h>
+#include <sys/utsname.h>
+#include "winsup.h"
+
+/* uname: POSIX 4.4.1.1 */
+extern "C"
+int
+uname (struct utsname *name)
+{
+ DWORD len;
+ SYSTEM_INFO sysinfo;
+ OSVERSIONINFO os_version_info;
+
+ os_version_info.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);
+ GetVersionEx (&os_version_info);
+
+ GetSystemInfo (&sysinfo);
+
+ /* Computer name */
+ memset (name, 0, sizeof (*name));
+ len = sizeof (name->nodename) - 1;
+ GetComputerNameA (name->nodename, &len);
+
+ /* Operating system type */
+ switch (os_being_run)
+ {
+ case winNT:
+ strcpy (name->sysname, "CYGWIN_NT");
+ break;
+ case win98:
+ strcpy (name->sysname, "CYGWIN_98");
+ break;
+ case win95:
+ strcpy (name->sysname, "CYGWIN_95");
+ break;
+ default:
+ strcpy (name->sysname, "CYGWIN_??");
+ break;
+ }
+
+ __small_sprintf (strchr (name->sysname, '\0'), "-%d.%d",
+ os_version_info.dwMajorVersion,
+ os_version_info.dwMinorVersion);
+
+
+ /* Cygwin dll release */
+ __small_sprintf (name->release, "%d.%d.%d(%d.%d/%d/%d)",
+ cygwin_version.dll_major / 1000,
+ cygwin_version.dll_major % 1000,
+ cygwin_version.dll_minor,
+ cygwin_version.api_major,
+ cygwin_version.api_minor,
+ cygwin_version.shared_data,
+ cygwin_version.mount_registry);
+
+ /* Cygwin "version" aka build date */
+ strcpy (name->version, cygwin_version.dll_build_date);
+
+ /* CPU type */
+ switch (sysinfo.wProcessorArchitecture)
+ {
+ case PROCESSOR_ARCHITECTURE_INTEL:
+ /* But which of the x86 chips are we? */
+ /* Default to i386 if the specific chip cannot be determined */
+ switch (os_being_run)
+ {
+ case win95:
+ case win98:
+ /* dwProcessorType only valid in Windows 95 */
+ if ((sysinfo.dwProcessorType == PROCESSOR_INTEL_386) ||
+ (sysinfo.dwProcessorType == PROCESSOR_INTEL_486) ||
+ (sysinfo.dwProcessorType == PROCESSOR_INTEL_PENTIUM))
+ __small_sprintf (name->machine, "i%d", sysinfo.dwProcessorType);
+ else
+ strcpy (name->machine, "i386");
+ break;
+ case winNT:
+ /* wProcessorLevel only valid in Windows NT */
+ __small_sprintf (name->machine, "i%d86", sysinfo.wProcessorLevel);
+ break;
+ default:
+ strcpy (name->machine, "i386");
+ break;
+ }
+ break;
+ case PROCESSOR_ARCHITECTURE_ALPHA:
+ strcpy (name->machine, "alpha");
+ break;
+ case PROCESSOR_ARCHITECTURE_MIPS:
+ strcpy (name->machine, "mips");
+ break;
+ default:
+ strcpy (name->machine, "unknown");
+ break;
+ }
+
+ return 0;
+}
diff --git a/winsup/cygwin/wait.cc b/winsup/cygwin/wait.cc
new file mode 100644
index 000000000..182240022
--- /dev/null
+++ b/winsup/cygwin/wait.cc
@@ -0,0 +1,113 @@
+/* wait.cc: Posix wait routines.
+
+ Copyright 1996, 1997, 1998, 1999 Cygnus Solutions.
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#include <sys/wait.h>
+#include <stdlib.h>
+#include <errno.h>
+#include "winsup.h"
+
+/* This is called _wait and not wait because the real wait is defined
+ in libc/syscalls/syswait.c. It calls us. */
+
+extern "C"
+pid_t
+_wait (int *status)
+{
+ return wait4 (-1, status, 0, NULL);
+}
+
+pid_t
+waitpid (pid_t intpid, int *status, int options)
+{
+ return wait4 (intpid, status, options, NULL);
+}
+
+pid_t
+wait3 (int *status, int options, struct rusage *r)
+{
+ return wait4 (-1, status, options, r);
+}
+
+/* Wait for any child to complete.
+ * Note: this is not thread safe. Use of wait in multiple threads will
+ * not work correctly.
+ */
+
+pid_t
+wait4 (int intpid, int *status, int options, struct rusage *r)
+{
+ int rc;
+ waitq *w;
+ HANDLE waitfor;
+
+ if (options & ~(WNOHANG | WUNTRACED))
+ {
+ set_errno (EINVAL);
+ return -1;
+ }
+
+ if (r)
+ memset (r, 0, sizeof (*r));
+
+ if ((w = (waitq *) waitq_storage.get ()) == NULL)
+ w = (waitq *) waitq_storage.create ();
+
+ w->pid = intpid;
+ w->options = options;
+ w->rusage = r;
+ sigproc_printf("calling proc_subproc, pid %d, options %d",
+ w->pid, w->options);
+ if (!proc_subproc(PROC_WAIT, (DWORD)w))
+ {
+ set_errno(ENOSYS);
+ paranoid_printf ("proc_subproc returned 0");
+ rc = -1;
+ goto done;
+ }
+
+ if ((waitfor = w->ev) == NULL)
+ goto nochildren;
+
+ rc = WaitForSingleObject (waitfor, INFINITE);
+
+ sigproc_printf ("%d = WaitForSingleObject (...)", rc);
+
+ if (w->ev == NULL)
+ {
+ nochildren:
+ /* found no children */
+ set_errno (ECHILD);
+ rc = -1;
+ goto done;
+ }
+
+ if (w->status == -1)
+ {
+ set_sig_errno (EINTR);
+ rc = -1;
+ }
+ else if (rc != WAIT_OBJECT_0)
+ {
+ /* We shouldn't set errno to any random value if we can help it.
+ See the Posix manual for a list of valid values for `errno'. */
+ set_errno (EINVAL);
+ rc = -1;
+ }
+ else if ((rc = w->pid) != 0 && status)
+ *status = w->status;
+
+done:
+ sigproc_printf ("intpid %d, status %p, w->status %d, options %d, rc %d",
+ intpid, status, w->status, options, rc);
+ w->status = -1;
+ if (rc < 0)
+ sigproc_printf("*** errno = %d", get_errno());
+ return rc;
+}
diff --git a/winsup/cygwin/window.cc b/winsup/cygwin/window.cc
new file mode 100644
index 000000000..567d9a806
--- /dev/null
+++ b/winsup/cygwin/window.cc
@@ -0,0 +1,231 @@
+/* window.cc: hidden windows for signals/itimer support
+
+ Copyright 1997, 1998, 2000 Cygnus Solutions.
+
+ Written by Sergey Okhapkin <sos@prospect.com.ru>
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#include <sys/time.h>
+#include <stdlib.h>
+#include <errno.h>
+#include "winsup.h"
+
+static NO_COPY UINT timer_active = 0;
+static NO_COPY struct itimerval itv;
+static NO_COPY DWORD start_time;
+static NO_COPY HWND ourhwnd = NULL;
+
+static LRESULT CALLBACK
+WndProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+#ifndef NOSTRACE
+ _strace_wm (uMsg, wParam, lParam);
+#endif
+ switch (uMsg)
+ {
+ case WM_PAINT:
+ return 0;
+ case WM_DESTROY:
+ PostQuitMessage (0);
+ return 0;
+ case WM_TIMER:
+ if (wParam == timer_active)
+ {
+ UINT elapse = itv.it_interval.tv_sec * 1000 +
+ itv.it_interval.tv_usec / 1000;
+ KillTimer (hwnd, timer_active);
+ if (!elapse)
+ {
+ timer_active = 0;
+ }
+ else
+ {
+ timer_active = SetTimer (hwnd, 1, elapse, NULL);
+ start_time = GetTickCount ();
+ itv.it_value = itv.it_interval;
+ }
+ raise(SIGALRM);
+ }
+ return 0;
+ case WM_ASYNCIO:
+ raise (SIGIO);
+ return 0;
+ default:
+ return DefWindowProc (hwnd, uMsg, wParam, lParam);
+ }
+}
+
+static HANDLE window_started;
+
+static DWORD WINAPI
+Winmain (VOID *arg)
+{
+ MSG msg;
+ WNDCLASS wc;
+ static char classname[] = "CygwinWndClass";
+
+ /* Register the window class for the main window. */
+
+ wc.style = 0;
+ wc.lpfnWndProc = (WNDPROC) WndProc;
+ wc.cbClsExtra = 0;
+ wc.cbWndExtra = 0;
+ wc.hInstance = user_data->hmodule;
+ wc.hIcon = NULL;
+ wc.hCursor = NULL;
+ wc.hbrBackground = NULL;
+ wc.lpszMenuName = NULL;
+ wc.lpszClassName = classname;
+
+ if (!RegisterClass (&wc))
+ {
+ system_printf ("Cannot register window class");
+ return FALSE;
+ }
+
+ /* Create hidden window. */
+ ourhwnd = CreateWindow (classname, classname,
+ WS_POPUP, CW_USEDEFAULT, CW_USEDEFAULT,
+ CW_USEDEFAULT, CW_USEDEFAULT, (HWND) NULL,
+ (HMENU) NULL, user_data->hmodule, (LPVOID) NULL);
+
+ SetEvent (window_started);
+
+ if (!ourhwnd)
+ {
+ system_printf ("Cannot create window");
+ return FALSE;
+ }
+
+ /* Start the message loop. */
+
+ while (GetMessage (&msg, ourhwnd, 0, 0) == TRUE)
+ {
+ DispatchMessage (&msg);
+ }
+
+ return msg.wParam;
+}
+
+HWND __stdcall
+gethwnd ()
+{
+ if (ourhwnd != NULL)
+ return ourhwnd;
+
+ HANDLE hThread;
+
+ window_started = CreateEvent (&sec_none_nih, TRUE, FALSE, NULL);
+ hThread = makethread (Winmain, NULL, 0, "win");
+ if (!hThread)
+ {
+ system_printf ("Cannot start window thread");
+ }
+ else
+ {
+ SetThreadPriority (hThread, THREAD_PRIORITY_HIGHEST);
+ CloseHandle (hThread);
+ }
+ WaitForSingleObject (window_started, INFINITE);
+ CloseHandle (window_started);
+ return ourhwnd;
+}
+
+void __stdcall
+window_terminate ()
+{
+ if (ourhwnd)
+ SendMessage (ourhwnd, WM_DESTROY, 0, 0);
+}
+
+extern "C"
+int
+setitimer (int which, const struct itimerval *value, struct itimerval *oldvalue)
+{
+ UINT elapse;
+
+ if (which != ITIMER_REAL)
+ {
+ set_errno (EINVAL);
+ return -1;
+ }
+ if (timer_active)
+ {
+ KillTimer (gethwnd(), timer_active);
+ timer_active = 0;
+ }
+ if (oldvalue)
+ *oldvalue = itv;
+ if (value == NULL)
+ {
+ set_errno (EFAULT);
+ return -1;
+ }
+ itv = *value;
+ elapse = itv.it_value.tv_sec * 1000 + itv.it_value.tv_usec / 1000;
+ if (elapse == 0)
+ return 0;
+ if (!(timer_active = SetTimer (gethwnd(), 1, elapse, NULL)))
+ {
+ __seterrno ();
+ return -1;
+ }
+ start_time = GetTickCount ();
+ return 0;
+}
+
+extern "C"
+int
+getitimer (int which, struct itimerval *value)
+{
+ UINT elapse, val;
+
+ if (which != ITIMER_REAL)
+ {
+ set_errno (EINVAL);
+ return -1;
+ }
+ if (value == NULL)
+ {
+ set_errno (EFAULT);
+ return -1;
+ }
+ *value = itv;
+ if (!timer_active)
+ {
+ value->it_value.tv_sec = 0;
+ value->it_value.tv_usec = 0;
+ return 0;
+ }
+ elapse = GetTickCount () - start_time;
+ val = itv.it_value.tv_sec * 1000 + itv.it_value.tv_usec / 1000;
+ val -= elapse;
+ value->it_value.tv_sec = val/1000;
+ value->it_value.tv_usec = val%1000;
+ return 0;
+}
+
+extern "C"
+unsigned int
+alarm (unsigned int seconds)
+{
+ int ret;
+ struct itimerval newt, oldt;
+
+ getitimer (ITIMER_REAL, &oldt);
+
+ newt.it_value.tv_sec = seconds;
+ newt.it_value.tv_usec = 0;
+ newt.it_interval.tv_sec = 0;
+ newt.it_interval.tv_usec = 0;
+ setitimer (ITIMER_REAL, &newt, NULL);
+ ret = oldt.it_value.tv_sec;
+ if (ret == 0 && oldt.it_value.tv_usec)
+ ret = 1;
+ return ret;
+}
diff --git a/winsup/cygwin/winsup.h b/winsup/cygwin/winsup.h
new file mode 100644
index 000000000..7b486d077
--- /dev/null
+++ b/winsup/cygwin/winsup.h
@@ -0,0 +1,595 @@
+/* winsup.h: main Cygwin header file.
+
+ Copyright 1996, 1997, 1998, 1999, 2000 Cygnus Solutions.
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#define __INSIDE_CYGWIN__
+
+#define alloca(x) __builtin_alloca (x)
+#define strlen __builtin_strlen
+#define strcpy __builtin_strcpy
+#define memcpy __builtin_memcpy
+#define memcmp __builtin_memcmp
+#ifdef HAVE_BUILTIN_MEMSET
+# define memset __builtin_memset
+#endif
+
+#include <sys/types.h>
+#include <sys/strace.h>
+#include <sys/resource.h>
+#include <setjmp.h>
+#include <signal.h>
+#include <string.h>
+
+#undef strchr
+#define strchr cygwin_strchr
+extern inline char * strchr(const char * s, int c)
+{
+register char * __res;
+__asm__ __volatile__(
+ "movb %%al,%%ah\n"
+ "1:\tmovb (%1),%%al\n\t"
+ "cmpb %%ah,%%al\n\t"
+ "je 2f\n\t"
+ "incl %1\n\t"
+ "testb %%al,%%al\n\t"
+ "jne 1b\n\t"
+ "xorl %1,%1\n"
+ "2:\tmovl %1,%0\n\t"
+ :"=a" (__res), "=r" (s)
+ :"0" (c), "1" (s));
+return __res;
+}
+
+#include <windows.h>
+
+/* Used for runtime OS check/decisions. */
+enum os_type {winNT = 1, win95, win98, win32s, unknown};
+extern os_type os_being_run;
+
+/* Used to check if Cygwin DLL is dynamically loaded. */
+extern int dynamically_loaded;
+
+#include <cygwin/version.h>
+
+#define TITLESIZE 1024
+#define MAX_USER_NAME 20
+#define DEFAULT_UID 500
+#define DEFAULT_GID 544
+
+/* status bit manipulation */
+#define __ISSETF(what, x, prefix) \
+ ((what)->status & prefix##_##x)
+#define __SETF(what, x, prefix) \
+ ((what)->status |= prefix##_##x)
+#define __CLEARF(what, x, prefix) \
+ ((what)->status &= ~prefix##_##x)
+#define __CONDSETF(n, what, x, prefix) \
+ ((n) ? __SETF (what, x, prefix) : __CLEARF (what, x, prefix))
+
+#include "thread.h"
+#include "shared.h"
+
+extern HANDLE hMainThread;
+extern HANDLE hMainProc;
+
+#include "sync.h"
+
+/* Now that pinfo has been defined, include... */
+#include "debug.h"
+#include "sigproc.h"
+#include "fhandler.h"
+#include "path.h"
+#include <sys/cygwin.h>
+
+/********************** Application Interface **************************/
+
+/* This lives in the app and is initialized before jumping into the DLL.
+ It should only contain stuff which the user's process needs to see, or
+ which is needed before the user pointer is initialized, or is needed to
+ carry inheritance information from parent to child. Note that it cannot
+ be used to carry inheritance information across exec!
+
+ Remember, this structure is linked into the application's executable.
+ Changes to this can invalidate existing executables, so we go to extra
+ lengths to avoid having to do it.
+
+ When adding/deleting members, remember to adjust {public,internal}_reserved.
+ The size of the class shouldn't change [unless you really are prepared to
+ invalidate all existing executables]. The program does a check (using
+ SIZEOF_PER_PROCESS) to make sure you remember to make the adjustment.
+*/
+
+class per_process
+{
+ public:
+ char *initial_sp;
+
+ /* The offset of these 3 values can never change. */
+ /* magic_biscuit is the size of this class and should never change. */
+ DWORD magic_biscuit;
+ DWORD dll_major;
+ DWORD dll_minor;
+
+ struct _reent **impure_ptr_ptr;
+ char ***envptr;
+
+ /* Used to point to the memory machine we should use. Usually these
+ point back into the dll, but they can be overridden by the user. */
+ void *(*malloc)(size_t);
+ void (*free)(void *);
+ void *(*realloc)(void *, size_t);
+
+ int *fmode_ptr;
+
+ int (*main)(int, char **, char **);
+ void (**ctors)(void);
+ void (**dtors)(void);
+
+ /* For fork */
+ void *data_start;
+ void *data_end;
+ void *bss_start;
+ void *bss_end;
+
+ void *(*calloc)(size_t, size_t);
+ /* For future expansion of values set by the app. */
+ void *public_reserved[4];
+
+ /* The rest are *internal* to cygwin.dll.
+ Those that are here because we want the child to inherit the value from
+ the parent (which happens when bss is copied) are marked as such. */
+
+ /* non-zero of ctors have been run. Inherited from parent. */
+ int run_ctors_p;
+
+ /* These will be non-zero if the above (malloc,free,realloc) have been
+ overridden. */
+ /* FIXME: not currently used */
+ int __imp_malloc;
+ int __imp_free;
+ int __imp_realloc;
+
+ /* Heap management. Inherited from parent. */
+ void *heapbase; /* bottom of the heap */
+ void *heapptr; /* current index into heap */
+ void *heaptop; /* current top of heap */
+
+ HANDLE reserved1; /* unused */
+
+ /* Non-zero means the task was forked. The value is the pid.
+ Inherited from parent. */
+ int forkee;
+
+ HMODULE hmodule;
+
+ DWORD api_major; /* API version that this program was */
+ DWORD api_minor; /* linked with */
+ /* For future expansion, so apps won't have to be relinked if we
+ add an item. */
+#ifdef _MT_SAFE
+ ResourceLocks *resourcelocks;
+ MTinterface *threadinterface;
+ void *internal_reserved[6];
+#else
+ void *internal_reserved[8];
+#endif
+};
+
+extern per_process *user_data; /* Pointer into application's static data */
+
+/* We use the following to test that sizeof hasn't changed. When adding
+ or deleting members, insert fillers or use the reserved entries.
+ Do not change this value. */
+#define SIZEOF_PER_PROCESS (42 * 4)
+
+class hinfo
+{
+ fhandler_base **fds;
+ fhandler_base **fds_on_hold;
+ int first_fd_for_open;
+public:
+ size_t size;
+ hinfo () {first_fd_for_open = 3;}
+ int vfork_child_dup ();
+ void vfork_parent_restore ();
+ fhandler_base *dup_worker (fhandler_base *oldfh);
+ int extend (int howmuch);
+ void fixup_after_fork (HANDLE parent);
+ fhandler_base *build_fhandler (int fd, DWORD dev, const char *name,
+ int unit = -1);
+ fhandler_base *build_fhandler (int fd, const char *name, HANDLE h);
+ int not_open (int n);
+ int find_unused_handle (int start);
+ int find_unused_handle () { return find_unused_handle (first_fd_for_open);}
+ void release (int fd);
+ void init_std_file_from_handle (int fd, HANDLE handle, DWORD access, const char *name);
+ int dup2 (int oldfd, int newfd);
+ int linearize_fd_array (unsigned char *buf, int buflen);
+ LPBYTE de_linearize_fd_array (LPBYTE buf);
+ fhandler_base *operator [](int fd) { return fds[fd]; }
+ select_record *select_read (int fd, select_record *s);
+ select_record *select_write (int fd, select_record *s);
+ select_record *select_except (int fd, select_record *s);
+};
+
+/******************* Host-dependent constants **********************/
+/* Portions of the cygwin DLL require special constants whose values
+ are dependent on the host system. Rather than dynamically
+ determine those values whenever they are required, initialize these
+ values once at process start-up. */
+
+class host_dependent_constants
+{
+ public:
+ void init (void);
+
+ /* Used by fhandler_disk_file::lock which needs a platform-specific
+ upper word value for locking entire files. */
+ DWORD win32_upper;
+
+ /* fhandler_base::open requires host dependent file sharing
+ attributes. */
+ int shared;
+};
+
+extern host_dependent_constants host_dependent;
+
+/* Events/mutexes */
+extern HANDLE pinfo_mutex;
+extern HANDLE title_mutex;
+
+
+
+/*************************** Per Thread ******************************/
+
+#define PER_THREAD_FORK_CLEAR ((void *)0xffffffff)
+class per_thread
+{
+ DWORD tls;
+ int clear_on_fork_p;
+public:
+ per_thread (int forkval = 1) {tls = TlsAlloc (); clear_on_fork_p = forkval;}
+ DWORD get_tls () {return tls;}
+ int clear_on_fork () {return clear_on_fork_p;}
+
+ virtual void *get () {return TlsGetValue (get_tls ());}
+ virtual size_t size () {return 0;}
+ virtual void set (void *s = NULL);
+ virtual void set (int n) {TlsSetValue (get_tls (), (void *)n);}
+ virtual void *create ()
+ {
+ void *s = new char [size ()];
+ memset (s, 0, size ());
+ set (s);
+ return s;
+ }
+};
+
+class per_thread_waitq : public per_thread
+{
+public:
+ per_thread_waitq () : per_thread (0) {}
+ void *get () {return (waitq *) this->per_thread::get ();}
+ void *create () {return (waitq *) this->per_thread::create ();}
+ size_t size () {return sizeof (waitq);}
+};
+
+struct vfork_save
+{
+ int pid;
+ jmp_buf j;
+ char **vfork_ebp;
+ char *caller_ebp;
+ char *retaddr;
+ int is_active () { return pid < 0; }
+};
+
+class per_thread_vfork : public per_thread
+{
+public:
+ vfork_save *val () { return (vfork_save *) this->per_thread::get (); }
+ vfork_save *create () {return (vfork_save *) this->per_thread::create ();}
+ size_t size () {return sizeof (vfork_save);}
+};
+
+extern "C" {
+struct signal_dispatch
+{
+ int arg;
+ void (*func) (int);
+ int sig;
+ int saved_errno;
+ CONTEXT *cx;
+ DWORD oldmask;
+ DWORD retaddr;
+};
+};
+
+struct per_thread_signal_dispatch : public per_thread
+{
+ signal_dispatch *get () { return (signal_dispatch *) this->per_thread::get (); }
+ signal_dispatch *create () {return (signal_dispatch *) this->per_thread::create ();}
+ size_t size () {return sizeof (signal_dispatch);}
+};
+
+extern per_thread_waitq waitq_storage;
+extern per_thread_vfork vfork_storage;
+extern per_thread_signal_dispatch signal_dispatch_storage;
+
+extern per_thread *threadstuff[];
+
+/**************************** Convenience ******************************/
+
+#define NO_COPY __attribute__((section(".data_cygwin_nocopy")))
+
+/* Used when treating / and \ as equivalent. */
+#define SLASH_P(ch) \
+ ({ \
+ char __c = (ch); \
+ ((__c) == '/' || (__c) == '\\'); \
+ })
+
+/* Convert a signal to a signal mask */
+#define SIGTOMASK(sig) (1<<((sig) - signal_shift_subtract))
+extern unsigned int signal_shift_subtract;
+
+#ifdef NOSTRACE
+#define MARK() 0
+#else
+#define MARK() mark (__FILE__,__LINE__)
+#endif
+
+#define api_fatal(fmt, args...) \
+ __api_fatal ("%P: *** " fmt, ## args)
+
+#undef issep
+#define issep(ch) (strchr (" \t\n\r", (ch)) != NULL)
+
+#define isdirsep SLASH_P
+#define isabspath(p) \
+ (isdirsep (*(p)) || (isalpha (*(p)) && (p)[1] == ':'))
+
+/******************** Initialization/Termination **********************/
+
+/* cygwin .dll initialization */
+void dll_crt0 (per_process *);
+
+/* dynamically loaded dll initialization */
+extern "C" int dll_dllcrt0 (HMODULE,per_process*);
+
+/* dynamically loaded dll initialization for non-cygwin apps */
+extern "C" int dll_noncygwin_dllcrt0 (HMODULE, per_process *);
+
+/* exit the program */
+extern "C" void __stdcall do_exit (int) __attribute__ ((noreturn));
+
+/* Initialize the environment */
+void environ_init (void);
+
+/* Heap management. */
+void heap_init (void);
+void malloc_init (void);
+
+/* fd table */
+void dtable_init (void);
+void hinfo_init (void);
+extern hinfo dtable;
+
+/* UID/GID */
+void uinfo_init (void);
+
+/* various events */
+void events_init (void);
+void events_terminate (void);
+
+void __stdcall close_all_files (void);
+
+/* Strace facility. See strace.cc, sys/strace.h and utils/strace.cc. */
+extern DWORD strace_active;
+
+/* Invisible window initialization/termination. */
+HWND __stdcall gethwnd (void);
+void __stdcall window_terminate (void);
+
+/* Globals that handle initialization of winsock in a child process. */
+extern HANDLE wsock32_handle;
+
+/* Globals that handle initialization of netapi in a child process. */
+extern HANDLE netapi32_handle;
+
+/* debug_on_trap support. see exceptions.cc:try_to_debug() */
+extern "C" void error_start_init (const char*);
+extern "C" int try_to_debug ();
+
+/**************************** Miscellaneous ******************************/
+
+const char * __stdcall find_exec (const char *name, char *buf, const char *winenv = "PATH=",
+ int null_if_notfound = 0, const char **known_suffix = NULL);
+
+/* File manipulation */
+int __stdcall get_file_attribute (int, const char *, int *);
+int __stdcall set_file_attribute (int, const char *, int);
+int __stdcall set_file_attribute (int, const char *, uid_t, gid_t, int, const char *);
+void __stdcall set_std_handle (int);
+int __stdcall writable_directory (const char *file);
+int __stdcall stat_dev (DWORD, int, unsigned long, struct stat *);
+extern BOOL allow_ntsec;
+
+/* `lookup_name' should be called instead of LookupAccountName.
+ * logsrv may be NULL, in this case only the local system is used for lookup.
+ * The buffer for ret_sid (40 Bytes) has to be allocated by the caller! */
+BOOL __stdcall lookup_name (const char *name, const char *logsrv, PSID ret_sid);
+
+unsigned long __stdcall hash_path_name (unsigned long hash, const char *name);
+void __stdcall nofinalslash (const char *src, char *dst);
+extern "C" char *__stdcall rootdir (char *full_path);
+
+void __stdcall mark (const char *, int);
+
+extern "C" int _spawnve (HANDLE hToken, int mode, const char *path,
+ const char *const *argv, const char *const *envp);
+int __stdcall spawn_guts (HANDLE hToken, const char *prog_arg,
+ const char *const *argv, const char *const envp[],
+ pinfo *child, int mode);
+
+/* For mmaps across fork(). */
+int __stdcall recreate_mmaps_after_fork (void *);
+void __stdcall set_child_mmap_ptr (pinfo *);
+
+/* String manipulation */
+char *__stdcall strccpy (char *s1, const char **s2, char c);
+int __stdcall strcasematch (const char *s1, const char *s2);
+int __stdcall strncasematch (const char *s1, const char *s2, size_t n);
+char *__stdcall strcasestr (const char *searchee, const char *lookfor);
+
+/* Time related */
+void __stdcall totimeval (struct timeval *dst, FILETIME * src, int sub, int flag);
+long __stdcall to_time_t (FILETIME * ptr);
+
+/* pinfo table manipulation */
+#ifndef lock_pinfo_for_update
+int __stdcall lock_pinfo_for_update (DWORD timeout);
+#endif
+void unlock_pinfo (void);
+pinfo *__stdcall set_myself (pinfo *);
+
+/* Retrieve a security descriptor that allows all access */
+SECURITY_DESCRIPTOR *__stdcall get_null_sd (void);
+
+int __stdcall get_id_from_sid (PSID, BOOL);
+extern inline int get_uid_from_sid (PSID psid) { return get_id_from_sid (psid, FALSE);}
+extern inline int get_gid_from_sid (PSID psid) { return get_id_from_sid (psid, TRUE); }
+
+int __stdcall NTReadEA (const char *file, const char *attrname, char *buf, int len);
+BOOL __stdcall NTWriteEA (const char *file, const char *attrname, char *buf, int len);
+
+void __stdcall set_console_title (char *);
+void set_console_handler ();
+
+void __stdcall fill_rusage (struct rusage *, HANDLE);
+void __stdcall add_rusage (struct rusage *, struct rusage *);
+
+void set_winsock_errno ();
+
+/**************************** Exports ******************************/
+
+extern "C" {
+int cygwin_select (int , fd_set *, fd_set *, fd_set *,
+ struct timeval *to);
+int cygwin_gethostname (char *__name, size_t __len);
+
+int kill_pgrp (pid_t, int);
+int _kill (int, int);
+int _raise (int sig);
+
+int getdtablesize ();
+void setdtablesize (int);
+
+extern char _data_start__, _data_end__, _bss_start__, _bss_end__;
+extern void (*__CTOR_LIST__) (void);
+extern void (*__DTOR_LIST__) (void);
+};
+
+/*************************** Unsorted ******************************/
+
+/* The size of the console title */
+#define TITLESIZE 1024
+
+#define WM_ASYNCIO 0x8000 // WM_APP
+
+/* Note that MAX_PATH is defined in the windows headers */
+/* There is also PATH_MAX and MAXPATHLEN.
+ PATH_MAX is from Posix and does *not* include the trailing NUL.
+ MAXPATHLEN is from Unix.
+
+ Thou shalt use MAX_PATH throughout. It avoids the NUL vs no-NUL
+ issue and is neither of the Unixy ones [so we can punt on which
+ one is the right one to use]. */
+
+/* Initial and increment values for cygwin's fd table */
+#define NOFILE_INCR 32
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+#include <sys/reent.h>
+
+#define STD_RBITS S_IRUSR | S_IRGRP | S_IROTH
+#define STD_WBITS S_IWUSR
+#define STD_XBITS S_IXUSR | S_IXGRP | S_IXOTH
+
+#define O_NOSYMLINK 0x080000
+#define O_DIROPEN 0x100000
+
+#ifdef __cplusplus
+}
+#endif
+
+/*************************** Environment ******************************/
+
+/* The structure below is used to control conversion to/from posix-style
+ * file specs. Currently, only PATH and HOME are converted, but PATH
+ * needs to use a "convert path list" function while HOME needs a simple
+ * "convert to posix/win32". For the simple case, where a calculated length
+ * is required, just return MAX_PATH. *FIXME*
+ */
+struct win_env
+ {
+ const char *name;
+ size_t namelen;
+ char *posix;
+ char *native;
+ int (*toposix) (const char *, char *);
+ int (*towin32) (const char *, char *);
+ int (*posix_len) (const char *);
+ int (*win32_len) (const char *);
+ void add_cache (const char *in_posix, const char *in_native = NULL);
+ const char * get_native () {return native ? native + namelen : NULL;}
+ };
+
+win_env *getwinenv (const char *name, const char *posix = NULL);
+
+char *winenv (const char * const *);
+extern char **__cygwin_environ;
+
+/* The title on program start. */
+extern char *old_title;
+extern BOOL display_title;
+
+
+/*************************** errno manipulation ******************************/
+
+void seterrno_from_win_error (const char *file, int line, int code);
+void seterrno (const char *, int line);
+
+#define __seterrno() seterrno (__FILE__, __LINE__)
+#define __seterrno_from_win_error(val) seterrno_from_win_error (__FILE__, __LINE__, val)
+#undef errno
+#define errno dont_use_this_since_were_in_a_shared library
+#define set_errno(val) (_impure_ptr->_errno = (val))
+#define get_errno() (_impure_ptr->_errno)
+extern "C" void __stdcall set_sig_errno (int e);
+
+class save_errno
+ {
+ int saved;
+ public:
+ save_errno () {saved = get_errno ();}
+ save_errno (int what) {saved = get_errno (); set_errno (what); }
+ void set (int what) {set_errno (what); saved = what;}
+ void reset () {saved = get_errno ();}
+ ~save_errno () {set_errno (saved);}
+ };
+
+extern const char *__sp_fn;
+extern int __sp_ln;
diff --git a/winsup/cygwin/winver.rc b/winsup/cygwin/winver.rc
new file mode 100644
index 000000000..160428f19
--- /dev/null
+++ b/winsup/cygwin/winver.rc
@@ -0,0 +1,53 @@
+#include <winver.h>
+#include <cygwin/version.h>
+
+#define STRINGIFY1(x) #x
+#define STRINGIFY(x) STRINGIFY1(x)
+
+#define CYGWIN_DLL_NAME CYGWIN_VERSION_DLL_IDENTIFIER STRINGIFY(.dll)
+
+#define CYGWIN_REGISTRY_KEY CYGWIN_INFO_CYGNUS_REGISTRY_NAME "\\" \
+ CYGWIN_INFO_CYGWIN_REGISTRY_NAME
+
+#define CYGWIN_API_VERSION STRINGIFY(CYGWIN_VERSION_API_MAJOR) "." \
+ STRINGIFY(CYGWIN_VERSION_API_MINOR)
+
+#define CYGWIN_BUILD_DATE_TIME STRINGIFY(CYGWIN_BUILD_DATE) " " \
+ STRINGIFY(CYGWIN_BUILD_TIME)
+
+VS_VERSION_INFO VERSIONINFO
+ FILEVERSION CYGWIN_VERSION_DLL_MAJOR,CYGWIN_VERSION_DLL_MINOR,0,0
+ PRODUCTVERSION CYGWIN_VERSION_DLL_MAJOR,CYGWIN_VERSION_DLL_MINOR,0,0
+ FILEFLAGSMASK 0x3fL
+#ifdef DEBUGGING
+ FILEFLAGS VS_FF_DEBUG
+#else
+ FILEFLAGS 0x0L
+#endif
+ FILEOS VOS__WINDOWS32
+ FILETYPE VFT_DLL
+ FILESUBTYPE 0x0L
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904B0"
+ BEGIN
+ VALUE "CompanyName", "Cygnus Solutions"
+ VALUE "FileDescription", "Cygwin\256 POSIX Emulation DLL"
+ VALUE "FileVersion", STRINGIFY(CYGWIN_VERSION)
+ VALUE "InternalName", CYGWIN_DLL_NAME
+ VALUE "LegalCopyright", "Copyright \251 Cygnus Solutions. 1996-1999"
+ VALUE "OriginalFilename", CYGWIN_DLL_NAME
+ VALUE "ProductName", "Cygwin"
+ VALUE "ProductVersion", STRINGIFY(CYGWIN_VERSION)
+ VALUE "APIVersion", CYGWIN_API_VERSION
+ VALUE "SharedMemoryVersion", STRINGIFY(CYGWIN_VERSION_SHARED_DATA)
+ VALUE "RegistryKey", CYGWIN_REGISTRY_KEY
+ VALUE "BuildDate", CYGWIN_BUILD_DATE_TIME
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x409, 1200
+ END
+END
diff --git a/winsup/doc/Makefile.in b/winsup/doc/Makefile.in
new file mode 100644
index 000000000..74c0be821
--- /dev/null
+++ b/winsup/doc/Makefile.in
@@ -0,0 +1,91 @@
+# -*- Makefile -*- for winsup/doc
+# Copyright (c) 1998-2000 Cygnus Solutions.
+#
+# This file is part of Cygwin.
+#
+# This software is a copyrighted work licensed under the terms of the
+# Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+# details.
+
+SHELL = @SHELL@
+srcdir = @srcdir@
+VPATH = @srcdir@
+
+DOC=faq.txt faq.info readme.txt readme.info
+HTMLDOC=faq.html readme.html
+
+CC:=@CC@
+CC_FOR_TARGET:=@CC@
+exeext:=@build_exeext@
+
+MAKEINFO:=makeinfo
+TEXI2DVI:=texi2dvi
+TEXI2HTML:=texi2html
+
+include $(srcdir)/../Makefile.common
+
+TOCLEAN:=faq.txt *.html readme.txt doctool.o doctool \
+ cygwin-ug.sgml cygwin-ug-net.sgml
+
+.SUFFIXES:
+
+# You can add cygwin-api/cygwin-api.html if you want to.
+all : \
+ cygwin-ug/cygwin-ug.html \
+ cygwin-ug-net/cygwin-ug-net.html \
+ cygwin-api-int/cygwin-api-int.html \
+ $(DOC) \
+ $(HTMLDOC)
+
+clean:
+ rm -f $(TOCLEAN)
+
+install: all
+
+cygwin-ug/cygwin-ug.html : cygwin-ug.sgml doctool
+ -db2html $<
+
+cygwin-ug.sgml : cygwin-ug.in.sgml ./doctool Makefile
+ -./doctool -m -d $(srcdir) -d $(utils_source) -s $(srcdir) -o $@ $<
+
+cygwin-ug-net/cygwin-ug-net.html : cygwin-ug-net.sgml doctool
+ -db2html $<
+
+cygwin-ug-net.sgml : cygwin-ug-net.in.sgml ./doctool Makefile
+ -./doctool -m -d $(srcdir) -d $(utils_source) -s $(srcdir) -o $@ $<
+
+cygwin-api/cygwin-api.html : cygwin-api.sgml
+ -db2html $<
+
+cygwin-api.sgml : cygwin-api.in.sgml ./doctool Makefile
+ -./doctool -m -d $(srcdir) -d $(utils_source) -s $(srcdir) -o $@ $<
+
+cygwin-api-int/cygwin-api-int.html : cygwin-api-int.sgml
+ -db2html $<
+
+cygwin-api-int.sgml : cygwin-api.in.sgml ./doctool Makefile
+ -./doctool -i -m -d $(srcdir) -d $(utils_source) -s $(srcdir) -b cygwin-api-int -o $@ $<
+
+./doctool : doctool.c
+ gcc -g $< -o $@
+
+%.info: %.texinfo
+ -$(MAKEINFO) -I$(srcdir) $<
+
+%.txt: %.texinfo
+ -$(MAKEINFO) -I$(srcdir) $<
+
+%.html: %.texinfo
+ -$(TEXI2HTML) -I$(srcdir) $<
+
+readme.txt: readme.texinfo
+ -$(MAKEINFO) -I$(srcdir) --no-split --no-headers $< -o - |\
+ sed '/^Concept Index/,$$d' > $@
+
+faq.html: $(srcdir)/faq.texinfo $(srcdir)/*.texinfo
+ -for i in $(srcdir)/*.texinfo ; do \
+ sed < $$i -e 's?@file{\([fth]*p://[^}]*\)}?@strong{<A HREF="\1">\1</A>}?' \
+ -e 's?\([.+a-zA-Z0-9-]*@@[.a-zA-Z0-9-]*[a-zA-Z0-9]\)?<A HREF="mailto:\1">\1</A>?' >./`basename $$i` ; done; \
+ $(TEXI2HTML) -split_chapter -v ./faq.texinfo; \
+ rm -f *.texinfo; \
+ cp faq_toc.html faq.html
diff --git a/winsup/doc/calls.texinfo b/winsup/doc/calls.texinfo
new file mode 100644
index 000000000..970efddfd
--- /dev/null
+++ b/winsup/doc/calls.texinfo
@@ -0,0 +1,686 @@
+@chapter What Unix API calls are supported by Cygwin?
+
+This is the beginning of documentation listing the calls supported
+by the Cygwin library.
+
+All POSIX.1/1996 and ANSI C calls are listed in this file. Note that
+while almost all POSIX.1/1990 calls are included in Cygwin, most
+POSIX.1/1996 calls are not (yet at least!). Additional Unix
+compatibility calls and extended libc/libm calls are provided by
+Cygwin but may or may not be listed yet.
+
+To see if a function is implemented but not listed here, check for the
+presence of the call in the file winsup/cygwin.din in the sources. In
+addition, you may want to read the source code corresponding to the call
+to verify that it is not a stub. Finally, libc/libm functions
+(including extended calls not listed here) may be documented in the
+newlib texinfo documentation.
+
+Calls are implemented on both Windows 95 and NT unless otherwise
+noted. Included are references to relevant standards, if any.
+Calls starting with "cygwin_" are Cygwin-specific calls.
+
+@section ANSI C Library Functions
+
+@itemize @code
+
+@item libc stdio (newlib/libc/stdio)
+@itemize @code
+@item clearerr: C 4.9.10.1
+@item fclose: C 4.9.5.1, P 8.2.3.2
+@item feof: C 4.9.10.2
+@item ferror: C 4.9.10.3
+@item fflush: C 4.9.5.2, P 8.2.3.4
+@item fgetc: C 4.9.7.1, P 8.2.3.5
+@item fgetpos: C 4.9.9.1
+@item fgets: C 4.9.7.2, P 8.2.3.5
+@item fopen: C 4.9.5.3, P 8.2.3.1
+@item fprintf: C 4.9.7.3, P 8.2.3.6
+@item fputc: C 4.9.7.3, P 8.2.3.6
+@item fputs: C 4.9.7.4, P 8.2.3.6
+@item fread: C 4.9.8.1, P 8.2.3.5
+@item freopen: C 4.9.5.4, P 8.2.3.3
+@item fscanf: C 4.9.6.2, P 8.2.3.7
+@item fseek: C 4.9.9.2, P 8.2.3.7
+@item fsetpos: C 4.9.9.3
+@item ftell: C 4.9.9.4, P 8.2.3.10
+@item fwrite: C 4.9.8.2, P 8.2.3.6
+@item getc: C 4.9.7.5, P 8.2.3.5
+@item getchar: C 4.9.7.6, P 8.2.3.5
+@item gets: C 4.9.7.7, P 8.2.3.5
+@item perror: C 4.9.10.4, P 8.2.3.8
+@item printf: C 4.9.6.3, P 8.2.3.6
+@item putc: C 4.9.7.8, P 8.2.3.6
+@item putchar: C 4.9.7.9, P 8.2.3.6
+@item puts: C 4.9.7.10, P 8.2.3.6
+@item remove: C 4.9.4.1, P 8.2.4
+@item rename: C 4.9.4.2, P 5.5.3.1
+@item rewind: C 4.9.9.5, P 8.2.3.7
+@item scanf: C 4.9.6.4, P 8.2.3.5
+@item setbuf: C 4.9.5.5
+@item setvbuf: C 4.9.5.6
+@item sprintf: C 4.9.6.5
+@item sscanf: C 4.9.6.6
+@item tmpfile: C 4.9.4.3, P 8.2.3.9
+@item tmpnam: C 4.9.4.4, P 8.2.5
+@item vfprintf: C 4.9.6.7
+@item ungetc: C 4.9.7.11
+@item vprintf: C 4.9.6.8
+@item vsprintf: C 4.9.6.9
+@end itemize
+
+@item libc string (newlib/libc/string)
+@itemize @code
+@item memchr: C 4.11.5.1
+@item memcmp: C 4.11.4.1
+@item memcpy: C 4.11.2.1
+@item memmove: C 4.11.2.2
+@item memset: C 4.11.6.1
+@item strcat: C 4.11.3.1
+@item strchr: C 4.11.5.2
+@item strcmp: C 4.11.4.2
+@item strcoll: C 4.11.4.3
+@item strcpy: C 4.11.2.3
+@item strcspn: C 4.11.5.3
+@item strerror: C 4.11.6.2
+@item strlen: C 4.11.6.3
+@item strncat: C 4.11.3.2
+@item strncmp: C 4.11.3.2
+@item strncpy: C 4.11.2.4
+@item strpbrk: C 4.11.5.4
+@item strrchr: C 4.11.5.5
+@item strspn: C 4.11.5.6
+@item strstr: C 4.11.5.7
+@item strtok: C 4.11.5.8
+@item strxfrm: C 4.11.4.5
+@end itemize
+
+@item libc stdlib (newlib/libc/stdlib, environ.cc, newlib/libc/include/machine/setjmp.h newlib/libc/include/assert.h)
+@itemize @code
+@item abort: C 4.10.4.1, P 8.2.3.12
+@item abs: C 4.10.6.1
+@item assert: C 4.2.1.1
+@item atexit: C 4.10.4.2
+@item atof: C 4.10.1.1
+@item atoi: C 4.10.1.2
+@item atol: C 4.10.1.3
+@item bsearch: C 4.10.5.1
+@item calloc: C 4.10.3.1
+@item div: C 4.10.6.2
+@item exit: C 4.10.4.3, P 8.2.3.12
+@item free: C 4.10.3.2
+@item getenv: C 4.10.4.4, P 4.6.1.1
+@item labs: C 4.10.6.3
+@item ldiv: C 4.10.6.2
+@item longjmp: C 4.6.2.1
+@item malloc: C 4.10.3.3
+@item mblen: C 4.10.7.1
+@item mbstowcs: C 4.10.8.1
+@item mbtowc: C 4.10.7.2
+@item qsort: 4.10.5.2
+@item rand: C 4.10.2.1
+@item realloc: C 4.10.3.4
+@item setjmp: C 4.6.1.1
+@item srand: C 4.10.2.2
+@item strtod: C 4.10.1.4
+@item strtol: C 4.10.1.5
+@item strtoul: C 4.10.1.6
+@item system: C 4.10.4.5
+@item wcstombs: C 4.10.8.2
+@item wctomb: C 4.10.7.3
+@end itemize
+
+@item libc time (times.cc, newlib/libc/time)
+@itemize @code
+@item asctime: C 4.12.3.1
+@item gmtime: C 4.12.3.3
+@item localtime: C 4.12.3.4, P 8.1.1
+@item time: C 4.12.2.4, P 4.5.1.1
+@item clock: C 4.12.2.1
+@item ctime: C 4.12.3.2
+@item difftime: C 4.12.2.2
+@item mktime: C 4.12.2.3, P 8.1.1
+@item strftime: C 4.11.6.2
+@end itemize
+
+@item libc signals (signal.cc, newlib/libc/signal)
+@itemize @code
+@item raise: C 4.7.2.1
+@item signal: C 4.7.1.1
+@end itemize
+
+@item libc ctype (newlib/libc/ctype)
+@itemize @code
+@item isalnum: C 4.3.1.1
+@item isalpha: C 4.3.1.2
+@item iscntrl: C 4.3.1.3
+@item isdigit: C 4.3.1.4
+@item isgraph: C 4.3.1.5
+@item islower: C 4.3.1.6
+@item isprint: C 4.3.1.7
+@item ispunct: C 4.3.1.8
+@item isspace: C 4.3.1.9
+@item isupper: C 4.3.1.10
+@item isxdigit: C 4.3.1.11
+@item tolower: C 4.3.2.1
+@item toupper: C 4.3.2.2
+@end itemize
+
+@item libm math (newlib/libm/math)
+@itemize @code
+@item acos: C 4.5.2.1
+@item asin: C 4.5.2.2
+@item atan: C 4.5.2.3
+@item atan2: C 4.5.2.4
+@item ceil: C 4.5.6.1
+@item cos: C 4.5.2.5
+@item cosh: C 4.5.3.2
+@item exp: C 4.5.4.1
+@item fabs: C 4.5.6.2
+@item floor: C 4.5.6.3
+@item fmod: C 4.5.6.4
+@item frexp: C 4.5.4.2
+@item ldexp: C 4.5.4.3
+@item log: C 4.5.4.4
+@item log10: C 4.5.4.5
+@item modf: C 4.5.4.6
+@item pow: C 4.5.5.1
+@item sin: C 4.5.2.6
+@item sinh: C 4.5.3.2
+@item sqrt: C 4.5.5.2
+@item tan: C 4.5.2.7
+@item tanh: C 4.5.3.3
+@end itemize
+
+@item libc misc (newlib/libc/locale, gcc/ginclude/stdarg.h)
+@itemize @code
+@item localeconv: C 4.4.2.1
+@item setlocale: C 4.4.1.1, P 8.1.2.1
+@item va_arg: C 4.8.1.2
+@item va_end: C 4.8.1.3
+@item va_start: C 4.8.1.1
+@end itemize
+
+@section POSIX.1/96 Functions
+
+@item Process Primitives (Section 3)
+@itemize @code
+@item fork: P 3.1.1.1
+@item execl: P 3.1.2.1
+@item execle: P 3.1.2.1
+@item execlp: P 3.1.2.1
+@item execv: P 3.1.2.1
+@item execve: P 3.1.2.1
+@item execvp: P 3.1.2.1
+@item pthread_atfork: P96 3.1.3.1 -- unimplemented
+@item wait: P 3.2.1.1
+@item waitpid: P 3.2.1.1
+@item _exit: P 3.2.2.1
+@item kill: P 3.3.2.1
+@item sigemptyset: P 3.3.3.1
+@item sigfillset: P 3.3.3.1
+@item sigaddset: P 3.3.3.1
+@item sigdelset: P 3.3.3.1
+@item sigismember: P 3.3.3.1
+@item sigaction: P 3.3.4.1
+@item pthread_sigmask: P96 3.3.5.1
+@item sigprocmask: P 3.3.5.1
+@item sigpending: P 3.3.6.1
+@item sigsuspend: P 3.3.7.1
+@item sigwait: P96 3.3.8.1 -- unimplemented
+@item sigwaitinfo: P96 3.3.8.1 -- unimplemented
+@item sigtimedwait: P96 3.3.8.1 -- unimplemented
+@item sigqueue: P96 3.3.9.1 -- unimplemented
+@item pthread_kill: P96 3.3.10.1
+@item alarm: P 3.4.1.1
+@item pause: P 3.4.2.1
+@item sleep: P 3.4.3.1
+@end itemize
+
+@item Process Environment (Section 4)
+@itemize @code
+@item getpid: P 4.1.1.1
+@item getppid: P 4.1.1.1
+@item getuid: P 4.2.1.1
+@item geteuid: P 4.2.1.1
+@item getgid: P 4.2.1.1
+@item getegid: P 4.2.1.1
+@item setuid: P 4.2.2.1 (stub, sets ENOSYS, returns zero)
+@item setgid: P 4.2.2.1 (stub, sets ENOSYS, returns zero)
+@item getgroups: P 4.2.3.1
+@item getlogin: P 4.2.4.1
+@item getlogin_r: P 4.2.4.1 -- unimplemented
+@item getpgrp: P 4.3.1.1
+@item setsid: P 4.3.2.1
+@item setpgid: P 4.3.3.1
+@item uname: P 4.4.1.1
+@item time: C 4.12.2.4, P 4.5.1.1
+@item times: P 4.5.2.1
+@item getenv: C 4.10.4.4, P 4.6.1.1
+@item ctermid: P 4.7.1.1
+@item ttyname: P 4.7.2.1
+@item ttyname_r: P 4.7.2.1 -- unimplemented
+@item isatty: P 4.7.2.1
+@item sysconf: P 4.8.1.1
+@end itemize
+
+@item Files and Directories (Section 5)
+@itemize @code
+@item opendir: P 5.1.2.1
+@item readdir: P 5.1.2.1
+@item readdir_r: P96 5.1.2.1 -- unimplemented
+@item rewinddir: P 5.1.2.1
+@item closedir: P 5.1.2.1
+@item chdir: P 5.2.1.1
+@item getcwd: P 5.2.2.1
+@item open: P 5.3.1.1
+@item creat: P 5.3.2.1
+@item umask: P 5.3.3.1
+@item link: P 5.3.4.1 (copy file in Win 95, and when link fails in NT)
+@item mkdir: P 5.4.1.1
+@item mkfifo: P 5.4.2.1 -- unimplemented!!!
+@item unlink: P 5.5.1.1
+@item rmdir: P 5.5.2.1
+@item rename: C 4.9.4.2, P 5.5.3.1
+@item stat: P 5.6.2.1
+@item fstat: P 5.6.2.1
+@item access: P 5.6.3.1
+@item chmod: P 5.6.4.1
+@item fchmod: P96 5.6.4.1
+@item chown: P 5.6.5.1 (stub in Win 95; always returns zero)
+@item utime: P 5.6.6.1
+@item ftruncate: P96 5.6.7.1
+@item pathconf: P 5.7.1.1
+@item fpathconf: P 5.7.1.1
+@end itemize
+
+@item Input and Output Primitives (Section 6)
+@itemize @code
+@item pipe: P 6.1.1.1
+@item dup: P 6.2.1.1
+@item dup2: P 6.2.1.1
+@item close: P 6.3.1.1
+@item read: P 6.4.1.1
+@item write: P 6.4.2.1
+@item fcntl: P 6.5.2.1 (note: fcntl(fd, F_GETLK,...) is not implemented (returns -1 with errno set to ENOSYS)).
+@item lseek: P 6.5.3.1 (note: only works correctly on binary files)
+@item fsync: P96 6.6.1.1
+@item fdatasync: P96 6.6.2.1 -- unimplemented
+@item aio_read: P96 6.7.2.1 -- unimplemented
+@item aio_write: P96 6.7.3.1 -- unimplemented
+@item lio_listio: P96 6.7.4.1 -- unimplemented
+@item aio_error: P96 6.7.5.1 -- unimplemented
+@item aio_return: P96 6.7.6.1 -- unimplemented
+@item aio_cancel: P96 6.7.7.1 -- unimplemented
+@item aio_suspend: P96 6.7.8.1 -- unimplemented
+@item aio_fsync: P96 6.7.9.1 -- unimplemented
+@end itemize
+
+@item Device- and Class-Specific Functions (Section 7)
+@itemize @code
+@item cfgetispeed: P96 7.1.3.1
+@item cfgetospeed: P96 7.1.3.1
+@item cfsetispeed: P96 7.1.3.1
+@item cfsetospeed: P96 7.1.3.1
+@item tcdrain: P 7.2.2.1
+@item tcflow: P 7.2.2.1
+@item tcflush: P 7.2.2.1
+@item tcgetattr: P96 7.2.1.1
+@item tcgetpgrp: P 7.2.3.1
+@item tcsendbreak: P 7.2.2.1
+@item tcsetattr: P96 7.2.1.1
+@item tcsetpgrp: P 7.2.4.1
+@end itemize
+
+@item Language-Specific Services for the C Programming Language
+(Section 8)
+@itemize @code
+@item abort: C 4.10.4.1, P 8.2.3.12
+@item asctime_r: P96 8.3.4.1 -- unimplemented
+@item ctime_r: P96 8.3.5.1 -- unimplemented
+@item exit: C 4.10.4.3, P 8.2.3.12
+@item fclose: C 4.9.5.1, P 8.2.3.2
+@item fdopen: P 8.2.2.1
+@item fflush: C 4.9.5.2, P 8.2.3.4
+@item fgetc: C 4.9.7.1, P 8.2.3.5
+@item fgets: C 4.9.7.2, P 8.2.3.5
+@item fileno: P 8.2.1.1
+@item flockfile: P96 8.2.6.1 -- unimplemented
+@item fopen: C 4.9.5.3, P 8.2.3.1
+@item fprintf: C 4.9.7.3, P 8.2.3.6
+@item fputc: C 4.9.7.3, P 8.2.3.6
+@item fputs: C 4.9.7.4, P 8.2.3.6
+@item fread: C 4.9.8.1, P 8.2.3.5
+@item freopen: C 4.9.5.4, P 8.2.3.3
+@item fscanf: C 4.9.6.2, P 8.2.3.7
+@item fseek: C 4.9.9.2, P 8.2.3.7
+@item ftell: C 4.9.9.4, P 8.2.3.10
+@item ftrylockfile: P96 8.2.6.1 -- unimplemented
+@item funlockfile: P96 8.2.6.1 -- unimplemented
+@item fwrite: C 4.9.8.2, P 8.2.3.6
+@item getc: C 4.9.7.5, P 8.2.3.5
+@item getc_unlocked: P96 8.2.7.1 -- unimplemented
+@item getchar: C 4.9.7.6, P 8.2.3.5
+@item getchar_unlocked: P96 8.2.7.1 -- unimplemented
+@item gets: C 4.9.7.7, P 8.2.3.5
+@item gmtime_r: P96 8.3.6.1 -- unimplemented
+@item localtime_r: P96 8.3.7.1 -- unimplemented
+@item perror: C 4.9.10.4, P 8.2.3.8
+@item printf: C 4.9.6.3, P 8.2.3.6
+@item putc: C 4.9.7.8, P 8.2.3.6
+@item putc_unlocked: P96 8.2.7.1 -- unimplemented
+@item putchar: C 4.9.7.9, P 8.2.3.6
+@item putchar_unlocked: P96 8.2.7.1 -- unimplemented
+@item puts: C 4.9.7.10, P 8.2.3.6
+@item rand_r: P96 8.3.8.1 -- unimplemented
+@item remove: C 4.9.4.1, P 8.2.4
+@item rewind: C 4.9.9.5, P 8.2.3.7
+@item scanf: C 4.9.6.4, P 8.2.3.5
+@item setlocale: C 4.4.1.1, P 8.1.2.1
+@item siglongjmp: P 8.3.1.1
+@item sigsetjmp: P 8.3.1.1
+@item strtok_r: P96 8.3.3.1 -- unimplemented
+@item tmpfile: C 4.9.4.3, P 8.2.3.9
+@item tmpnam: C 4.9.4.4, P 8.2.5
+@item tzset: P 8.3.2.1
+@end itemize
+
+@item System Databases (Section 9)
+@itemize @code
+@item getgrgid: P 9.2.1.1
+@item getgrgid_r: P96 9.2.1.1 -- unimplemented
+@item getgrnam: P 9.2.1.1
+@item getgrnam_r: P96 9.2.1.1 -- unimplemented
+@item getpwnam: P 9.2.2.1
+@item getpwnam_r: P96 9.2.2.1 -- unimplemented
+@item getpwuid: P 9.2.2.1
+@item getpwuid_r: P96 9.2.2.1 -- unimplemented
+@end itemize
+
+@item Synchronization (Section 11)
+@itemize @code
+@item pthread_cond_broadcast: P96 11.4.3.1 -- unimplemented
+@item pthread_cond_destroy: P96 11.4.2.1 -- unimplemented
+@item pthread_cond_init: P96 11.4.2.1 -- unimplemented
+@item pthread_cond_signal: P96 11.4.3.1 -- unimplemented
+@item pthread_cond_timedwait: P96 11.4.4.1 -- unimplemented
+@item pthread_cond_wait: P96 11.4.4.1 -- unimplemented
+@item pthread_condattr_destroy: P96 11.4.1.1 -- unimplemented
+@item pthread_condattr_getpshared: P96 11.4.1.1 -- unimplemented
+@item pthread_condattr_init: P96 11.4.1.1 -- unimplemented
+@item pthread_condattr_setpshared: P96 11.4.1.1 -- unimplemented
+@item pthread_mutex_destroy: P96 11.3.2.1
+@item pthread_mutex_init: P96 11.3.2.1
+@item pthread_mutex_lock: P96 11.3.3.1
+@item pthread_mutex_trylock: P96 11.3.3.1
+@item pthread_mutex_unlock: P96 11.3.3.1
+@item sem_close: P96 11.2.4.1 -- unimplemented
+@item sem_destroy: P96 11.2.2.1
+@item sem_getvalue: P96 11.2.8.1 -- unimplemented
+@item sem_init: P96 11.2.1.1
+@item sem_open: P96 11.2.3.1 -- unimplemented
+@item sem_post: P96 11.2.7.1
+@item sem_trywait: P96 11.2.6.1
+@item sem_unlink: P96 11.2.5.1 -- unimplemented
+@item sem_wait: P96 11.2.6.1
+@end itemize
+
+@item Memory Management (Section 12)
+@itemize @code
+@item mlock: P96 12.1.2.1 -- unimplemented
+@item mlockall: P96 12.1.1.1 -- unimplemented
+@item mmap: P96 12.2.1.1
+@item mprotect: P96 12.2.3.1
+@item msync: P96 12.2.4.1
+@item munlock: P96 12.1.2.1 -- unimplemented
+@item munlockall: P96 12.1.1.1 -- unimplemented
+@item munmap: P96 12.2.2.1
+@item shm_open: P96 12.3.1.1 -- unimplemented
+@item shm_unlink: P96 12.3.2.1 -- unimplemented
+@end itemize
+
+@item Execution Scheduling (Section 13)
+@itemize @code
+@item pthread_attr_getinheritsched: P96 13.5.1.1 -- unimplemented
+@item pthread_attr_getschedparam: P96 13.5.1.1 -- unimplemented
+@item pthread_attr_getschedpolicy: P96 13.5.1.1 -- unimplemented
+@item pthread_attr_getscope: P96 13.5.1.1 -- unimplemented
+@item pthread_attr_setinheritsched: P96 13.5.1.1 -- unimplemented
+@item pthread_attr_setschedparam: P96 13.5.1.1 -- unimplemented
+@item pthread_attr_setschedpolicy: P96 13.5.1.1 -- unimplemented
+@item pthread_attr_setscope: P96 13.5.1.1 -- unimplemented
+@item pthread_getschedparam: P96 13.5.2.1 -- unimplemented
+@item pthread_mutex_getprioceiling: P96 13.6.2.1 -- unimplemented
+@item pthread_mutex_setprioceiling: P96 13.6.2.1 -- unimplemented
+@item pthread_mutexattr_getprioceiling: P96 13.6.1.1 -- unimplemented
+@item pthread_mutexattr_getprotocol: P96 13.6.1.1 -- unimplemented
+@item pthread_mutexattr_setprioceiling: P96 13.6.1.1 -- unimplemented
+@item pthread_mutexattr_setprotocol: P96 13.6.1.1 -- unimplemented
+@item pthread_setschedparam: P96 13.5.2.1 -- unimplemented
+@item sched_get_priority_max: P96 13.3.6.1 -- unimplemented
+@item sched_get_priority_min: P96 13.3.6.1 -- unimplemented
+@item sched_getparam: P96 13.3.2.1 -- unimplemented
+@item sched_getscheduler: P96 13.3.4.1 -- unimplemented
+@item sched_rr_get_interval: P96 13.3.6.1 -- unimplemented
+@item sched_setparam: P96 13.3.1.1 -- unimplemented
+@item sched_setscheduler: P96 13.3.3.1 -- unimplemented
+@item sched_yield: P96 13.3.5.1 -- unimplemented
+@end itemize
+
+@item Clocks and Timers (Section 14)
+@itemize @code
+@item clock_getres: P96 14.2.1.1 -- unimplemented
+@item clock_gettime: P96 14.2.1.1 -- unimplemented
+@item clock_settime: P96 14.2.1.1 -- unimplemented
+@item nanosleep: P96 14.2.5.1 -- unimplemented
+@item timer_create: P96 14.2.2.1 -- unimplemented
+@item timer_delete: P96 14.2.3.1 -- unimplemented
+@item timer_getoverrun: P96 14.2.4.1 -- unimplemented
+@item timer_gettime: P96 14.2.4.1 -- unimplemented
+@item timer_settime: P96 14.2.4.1 -- unimplemented
+@end itemize
+
+@item Message Passing (Section 15)
+@itemize @code
+@item mq_close: P96 15.2.2.1 -- unimplemented
+@item mq_getattr: P96 15.2.8.1 -- unimplemented
+@item mq_notify: P96 15.2.6.1 -- unimplemented
+@item mq_open: P96 15.2.1.1 -- unimplemented
+@item mq_receive: P96 15.2.5.1 -- unimplemented
+@item mq_send: P96 15.2.4.1 -- unimplemented
+@item mq_setattr: P96 15.2.7.1 -- unimplemented
+@item mq_unlink: P96 15.2.3.1 -- unimplemented
+@end itemize
+
+@item Thread Management (Section 16)
+@itemize @code
+@item pthread_attr_destroy: P96 16.2.1.1
+@item pthread_attr_getdetachstate: P96 16.2.1.1 -- unimplemented
+@item pthread_attr_getstackaddr: P96 16.2.1.1 -- unimplemented
+@item pthread_attr_getstacksize: P96 16.2.1.1
+@item pthread_attr_init: P96 16.2.1.1
+@item pthread_attr_setdetachstate: P96 16.2.1.1 -- unimplemented
+@item pthread_attr_setstackaddr: P96 16.2.1.1 -- unimplemented
+@item pthread_attr_setstacksize: P96 16.2.1.1
+@item pthread_create: P96 16.2.2.1
+@item pthread_detach: P96 16.2.4.1 -- unimplemented
+@item pthread_equal: P96 16.2.7.1
+@item pthread_exit: P96 16.2.5.1
+@item pthread_join: P96 16.2.3.1 -- unimplemented
+@item pthread_once: P96 16.2.8.1 -- unimplemented
+@item pthread_self: P96 16.2.6.1
+@end itemize
+
+@item Thread-Specific Data (Section 17)
+@itemize @code
+@item pthread_getspecific: P96 17.1.2.1
+@item pthread_key_create: P96 17.1.1.1
+@item pthread_key_delete: P96 17.1.3.1
+@item pthread_setspecific: P96 17.1.2.1
+@end itemize
+
+@item Thread Cancellation (Section 18)
+@itemize @code
+@item pthread_cancel: P96 18.2.1.1 -- unimplemented
+@item pthread_cleanup_pop: P96 18.2.3.1 -- unimplemented
+@item pthread_cleanup_push: P96 18.2.3.1 -- unimplemented
+@item pthread_setcancelstate: P96 18.2.2.1 -- unimplemented
+@item pthread_setcanceltype: P96 18.2.2.1 -- unimplemented
+@item pthread_testcancel: P96 18.2.2.1 -- unimplemented
+@end itemize
+
+@section Misc Functions
+
+@item Networking (net.cc) (Standardized by POSIX 1.g, which is probably still in draft?)
+@itemize @code
+@item accept
+@item bind
+@item connect
+@item getdomainname
+@item gethostbyaddr
+@item gethostbyname
+@item getpeername
+@item getprotobyname
+@item getprotobynumber
+@item getservbyname
+@item getservbyport
+@item getsockname
+@item getsockopt
+@item herror
+@item htonl
+@item htons
+@item inet_addr
+@item inet_makeaddr
+@item inet_netof
+@item inet_ntoa
+@item listen
+@item ntohl
+@item ntohs
+@item rcmd
+@item recv
+@item recvfrom
+@item rexec
+@item rresvport
+@item send
+@item sendto
+@item setsockopt
+@item shutdown
+@item socket
+@item socketpair
+@end itemize
+
+Of these networking calls, rexec, rcmd and rresvport are implemented
+in MS IP stack but may not be implemented in other vendors' stacks.
+
+@item Other
+@itemize @code
+@item chroot (stub, sets ENOSYS, returns -1)
+@item closelog
+@item cwait
+@item cygwin_conv_to_full_posix_path
+@item cygwin_conv_to_full_win32_path
+@item cygwin_conv_to_posix_path
+@item cygwin_conv_to_win32_path
+@item cygwin_posix_path_list_p
+@item cygwin_posix_to_win32_path_list
+@item cygwin_posix_to_win32_path_list_buf_size
+@item cygwin_split_path
+@item cygwin_win32_to_posix_path_list
+@item cygwin_win32_to_posix_path_list_buf_size
+@item cygwin_winpid_to_pid
+@item dlclose
+@item dlerror
+@item dlfork
+@item dlopen
+@item dlsym
+@item endgrent
+@item endhostent
+@item ffs
+@item fstatfs
+@item ftime
+@item get_osfhandle
+@item getdtablesize
+@item getgrent
+@item gethostname
+@item getitimer
+@item getmntent
+@item getpagesize
+@item getpgid
+@item getpwent
+@item gettimeofday: BSD
+@item grantpt
+@item initgroups (stub)
+@item ioctl
+@item killpg
+@item login
+@item logout
+@item lstat
+@item mknod (stub, sets ENOSYS, returns -1)
+@item memccpy
+@item nice
+@item openlog
+@item pclose
+@item popen
+@item ptsname
+@item putenv
+@item random
+@item readv
+@item realpath
+@item regfree
+@item rexec
+@item select
+@item setegid: SVR4 (stub, sets ENOSYS, returns zero)@item endpwent
+@item setenv
+@item seterrno
+@item seteuid (stub, sets ENOSYS, returns zero)
+@item sethostent
+@item setitimer
+@item setmntent
+@item setmode
+@item setpassent
+@item setpgrp
+@item setpwent
+@item settimeofday: BSD (stub, set ENOSYS, return -1)
+@item sexecl
+@item sexecle
+@item sexeclp
+@item sexeclpe
+@item sexeclpe
+@item sexecp
+@item sexecv
+@item sexecve
+@item sexecvpe
+@item sigpause
+@item spawnl (spawn calls are from Windows C library)
+@item spawnle
+@item spawnlp
+@item spawnlpe
+@item spawnv
+@item spawnve
+@item spawnvp
+@item spawnvpe
+@item srandom
+@item statfs
+@item strsignal
+@item strtosigno
+@item swab
+@item syslog
+@item timezone
+@item truncate (SVR4/4.3+BSD)
+@item ttyslot
+@item unlockpt
+@item unsetenv
+@item usleep
+@item utimes
+@item vfork: stub that calls fork
+@item vhangup (stub, sets ENOSYS, returns -1)
+@item wait3
+@item wait4
+@item wcscmp
+@item wcslen
+@item wprintf
+@item writev
+@end itemize
+
+@end itemize
+
diff --git a/winsup/doc/changes.texinfo b/winsup/doc/changes.texinfo
new file mode 100644
index 000000000..6e464784d
--- /dev/null
+++ b/winsup/doc/changes.texinfo
@@ -0,0 +1,202 @@
+@section Release Beta 20.1 (Dec 4 1998)
+
+This is a bug fix update to the Beta 20 release.
+
+The main change is an improved version of the Cygwin library although
+there are also a couple of other minor changes to the tools.
+
+@subsection Changes in specific tools:
+
+The "-mno-cygwin" flag to gcc now include the correct headers. In 20.0,
+it included the Cygwin headers which was incorrect.
+
+The "-pipe" flag to gcc works correctly now.
+
+The cygcheck program now reassures users that not finding cpp is the
+correct behavior.
+
+The "-b" flag to md5sum can now be used to generate correct checksums
+of binary files.
+
+The libtermcap library has been added to the compiler tools sources.
+It is the new source of the termcap library and /etc/termcap file.
+
+The less pager (using libtermcap) has been added to the binary
+distribution.
+
+@subsection Changes in the Cygwin API (cygwin.dll):
+
+This version of Cygwin is backwards-compatible with the beta 20 and 19
+releases. The library is now much more stable under Windows 9x and the
+bugs affecting configures under 9x (and NT to a lesser extent) have
+also been fixed.
+
+The bug that made it necessary to start the value of the CYGWIN
+environment variable with two leading spaces has been fixed.
+
+The serial support in the select call has been fixed.
+
+Handling of DLLs loaded by non-cygwin apps has been improved. Bugs in
+dlopen have been fixed.
+
+Passing _SC_CHILD_MAX to the sysconf function now yields CHILD_MAX (63)
+instead of _POSIX_CHILD_MAX (3).
+
+Several minor path bugs have been fixed. Including the one that
+caused "mkdir a/" to fail.
+
+The include file sys/sysmacros.h has been added. Added missing protos
+for wcslen and wcscmp to wchar.h.
+
+__P is now defined in include/sys/cdefs.h. To support that last change,
+the top-level Makefile.in now sets CC_FOR_TARGET and CXX_FOR_TARGET
+differently.
+
+Cygwin now exports the following newlib bessel functions: j1, jn, y1,
+yn.
+
+Several tty ioctl options have been added: TCGETA, TCSETA, TCSETAW, and
+TCSETAF.
+
+Several functions cope with NULL pointer references more gracefully.
+
+Problems with execution of relative paths via #! should be fixed.
+
+@section Release Beta 20 (Oct 30 1998)
+
+This is a significant update to the Beta 19 release. In addition to an
+EGCS-based compiler and updated tools, this release includes a new
+version of the Cygwin library that contains many improvements and
+bugfixes over the last one.
+
+@subsection The project has a new name!
+
+Starting with this release, we are retiring the "GNU-Win32" name for the
+releases. We have also dropped the "32" from Cygwin32. This means that
+you should now refer to the tools as "the Cygwin toolset", the library
+as "the Cygwin library" or "the Cygwin DLL", and the library's interface
+as "the Cygwin API".
+
+Because of this name change, we have changed any aspects of the library
+that involved the name "Cygwin32". For example, the CYGWIN32
+environment variable is now the CYGWIN environment variable. API
+functions starting with cygwin32_ are still available under that form
+for backwards-compatibility as well as under the new cygwin_-prefixed
+names. The same goes for the change of preprocessor define from
+__CYGWIN32__ to __CYGWIN__. We will remove the old names in a future
+release so please take the minute or two that it will take to remove
+those "32"s. Thanks and I apologize for the hassle this may cause
+people. We would have changed the name to "Bob" but that name's already
+taken by Microsoft... :-)
+
+Why change it? For one thing, not all of the software included in the
+distributions is GNU software, including the Cygwin library itself. So
+calling the project "GNU-Win32" has always been a bit of a misnomer. In
+addition, we think that calling the tools the "Cygwin tools" that use
+the "Cygwin library" will be less confusing to people.
+
+Also notice that we are now on the spiffy new sourceware.cygnus.com
+web/ftp site. The old address will work for some unknown period of
+time (hopefully at least until we get all of the mirrors adjusted).
+
+@subsection Changes in specific tools:
+
+The latest public EGCS release is now the basis for the compiler used
+in Cygwin distributions. As a result, EGCS 1.1 is the compiler in this
+release, with a few additional x86/Cygwin-related patches.
+
+Those of you who are more interested in native Windows development than
+in porting Unix programs will be glad to know that a new gcc flag
+"-mno-cygwin" will link in the latest Mingw32 libs and produce an
+executable that does not use Cygwin.
+
+All of the other development tools have been updated to their latest
+versions. The linker (ld) includes many important bug fixes. It is now
+possible to safely strip a DLL with a .reloc section. The windres
+resource compiler is significantly improved.
+
+Beta 20 also includes upgrades to a number of packages: ash-0.3.2-4,
+bash 2.02.1, grep-2.2, ncurses 4.2, and less 332. We have added bzip2
+0.9.0 to the distribution. And you'll now find that the df utility
+has joined its other friends from the fileutils package.
+
+The sh executable is still ash from the Debian Linux distribution but no
+longer has the problematic quoting bug that was present in the Beta 19
+release. Control-Cs in the bash shell no longer kill background tasks.
+
+Tcl/tk are upgraded to version 8.1a2 (with additional patches).
+Compatible versions of tix and itcl are included. These all include
+Cygwin-compatible configury files so you can do a Unix-style build of
+the Win32 ports of tcl/tk. expect has been upgraded to 5.26 with some
+additional Cygwin patches.
+
+In response to customer requests and feedback, Cygnus has developed a
+better graphical front end to GDB than GDBtk or WinGDB. This tcl-based
+GUI is shipping today to customers of the GNUPro Toolkit. The
+instrumentation changes to GDB and the tcl interpreter that was built
+into GDB are part of the GPL'd source base. But the tcl scripts are not
+being made available to the net at this time. For this reason, you will
+only find a command-line version of gdb in this Cygwin release.
+
+DJ Delorie has written a new "cygcheck" program that will print out
+useful information about how your Cygwin environment is set up, what
+DLLs a named executable is loading from where, etc. We hope this will
+make it easier to help diagnose common setup problems.
+
+The ps utility has been upgraded. It now has several options including
+shorter and longer output formats.
+
+@subsection Changes in the Cygwin API (cygwin.dll):
+
+This version of Cygwin is backwards-compatible with the beta 19 release.
+You can use the new "cygwin1.dll" with your old B19-compiled executables
+if you move the old "cygwinb19.dll" out of the way and install a copy
+of "cygwin1.dll" as "cygwinb19.dll".
+
+Quite a lot of the Cygwin internals have been rewritten or modified to
+address various issues. If you have a question about specific changes,
+the winsup/ChangeLog file in the development tools sources lists all
+changes made to the DLL over the last three years. Following are a few
+highlights:
+
+We are now using a new versioning scheme for Cygwin. There is now a
+separate version number for the DLL, the API, the shared memory region
+interfaces, and the registry interface. This will hopefully make it
+easier for multiple Cygwin toolsets to coexist in one user environment.
+
+Windows 98 is now supported (it is like Windows 95 from Cygwin's
+perspective). We still recommend upgrading to Windows NT.
+
+While there is still a lot left to do in improving Cygwin's runtime
+performance, we have put some effort into this prior to the B20 release.
+Hopefully you will find that the latest version of Cygwin is faster than
+ever. In addition, we have plugged several nasty handle leaks
+associated with opening/closing files and with using ttys.
+
+The lseek call now uses WriteFile to fill gaps with zeros whenever a
+write is done past an EOF, rather than leaving "undefined" data as Win32
+specifies.
+
+Significant work has been done to improve the Cygwin header files.
+
+The Cygwin Support for Unix-style serial I/O is much improved.
+
+Path handling has had another round of fixes/rewrites. We no longer use
+NT Extended Attributes by default for storing Unix permissions/execute
+status because the file NT creates on FAT partitions is not scalable to
+thousands of files (everything slows to a crawl).
+
+Signal handling has also gotten a fair amount of attention.
+Unfortunately, there are still some problems combining itimers and
+Windows 9x.
+
+The number of ttys has been upped from 16 to 128.
+
+New API calls included in the DLL: sethostent, endhostent.
+
+As mentioned earlier, all cygwin32_-prefixed functions are now exported
+with a cygwin_ prefix instead. Please adjust your code to call the
+newly named functions.
+
+reads of `slow' devices are now correctly interrupted by signals, i.e.
+a read will receive an EINTR.
diff --git a/winsup/doc/configure b/winsup/doc/configure
new file mode 100755
index 000000000..09d5a070c
--- /dev/null
+++ b/winsup/doc/configure
@@ -0,0 +1,1078 @@
+#! /bin/sh
+
+# Guess values for system-dependent variables and create Makefiles.
+# Generated automatically using autoconf version 2.13
+# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.
+#
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+
+# Defaults:
+ac_help=
+ac_default_prefix=/usr/local
+# Any additions from configure.in:
+
+# Initialize some variables set by options.
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+build=NONE
+cache_file=./config.cache
+exec_prefix=NONE
+host=NONE
+no_create=
+nonopt=NONE
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+sitefile=
+srcdir=
+target=NONE
+verbose=
+x_includes=NONE
+x_libraries=NONE
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datadir='${prefix}/share'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+libdir='${exec_prefix}/lib'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+infodir='${prefix}/info'
+mandir='${prefix}/man'
+
+# Initialize some other variables.
+subdirs=
+MFLAGS= MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
+# Maximum number of lines to put in a shell here document.
+ac_max_here_lines=12
+
+ac_prev=
+for ac_option
+do
+
+ # If the previous option needs an argument, assign it.
+ if test -n "$ac_prev"; then
+ eval "$ac_prev=\$ac_option"
+ ac_prev=
+ continue
+ fi
+
+ case "$ac_option" in
+ -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
+ *) ac_optarg= ;;
+ esac
+
+ # Accept the important Cygnus configure options, so we can diagnose typos.
+
+ case "$ac_option" in
+
+ -bindir | --bindir | --bindi | --bind | --bin | --bi)
+ ac_prev=bindir ;;
+ -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+ bindir="$ac_optarg" ;;
+
+ -build | --build | --buil | --bui | --bu)
+ ac_prev=build ;;
+ -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+ build="$ac_optarg" ;;
+
+ -cache-file | --cache-file | --cache-fil | --cache-fi \
+ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+ ac_prev=cache_file ;;
+ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+ cache_file="$ac_optarg" ;;
+
+ -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
+ ac_prev=datadir ;;
+ -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
+ | --da=*)
+ datadir="$ac_optarg" ;;
+
+ -disable-* | --disable-*)
+ ac_feature=`echo $ac_option|sed -e 's/-*disable-//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then
+ { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
+ fi
+ ac_feature=`echo $ac_feature| sed 's/-/_/g'`
+ eval "enable_${ac_feature}=no" ;;
+
+ -enable-* | --enable-*)
+ ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then
+ { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
+ fi
+ ac_feature=`echo $ac_feature| sed 's/-/_/g'`
+ case "$ac_option" in
+ *=*) ;;
+ *) ac_optarg=yes ;;
+ esac
+ eval "enable_${ac_feature}='$ac_optarg'" ;;
+
+ -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+ | --exec | --exe | --ex)
+ ac_prev=exec_prefix ;;
+ -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+ | --exec=* | --exe=* | --ex=*)
+ exec_prefix="$ac_optarg" ;;
+
+ -gas | --gas | --ga | --g)
+ # Obsolete; use --with-gas.
+ with_gas=yes ;;
+
+ -help | --help | --hel | --he)
+ # Omit some internal or obsolete options to make the list less imposing.
+ # This message is too long to be a string in the A/UX 3.1 sh.
+ cat << EOF
+Usage: configure [options] [host]
+Options: [defaults in brackets after descriptions]
+Configuration:
+ --cache-file=FILE cache test results in FILE
+ --help print this message
+ --no-create do not create output files
+ --quiet, --silent do not print \`checking...' messages
+ --site-file=FILE use FILE as the site file
+ --version print the version of autoconf that created configure
+Directory and file names:
+ --prefix=PREFIX install architecture-independent files in PREFIX
+ [$ac_default_prefix]
+ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
+ [same as prefix]
+ --bindir=DIR user executables in DIR [EPREFIX/bin]
+ --sbindir=DIR system admin executables in DIR [EPREFIX/sbin]
+ --libexecdir=DIR program executables in DIR [EPREFIX/libexec]
+ --datadir=DIR read-only architecture-independent data in DIR
+ [PREFIX/share]
+ --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc]
+ --sharedstatedir=DIR modifiable architecture-independent data in DIR
+ [PREFIX/com]
+ --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var]
+ --libdir=DIR object code libraries in DIR [EPREFIX/lib]
+ --includedir=DIR C header files in DIR [PREFIX/include]
+ --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include]
+ --infodir=DIR info documentation in DIR [PREFIX/info]
+ --mandir=DIR man documentation in DIR [PREFIX/man]
+ --srcdir=DIR find the sources in DIR [configure dir or ..]
+ --program-prefix=PREFIX prepend PREFIX to installed program names
+ --program-suffix=SUFFIX append SUFFIX to installed program names
+ --program-transform-name=PROGRAM
+ run sed PROGRAM on installed program names
+EOF
+ cat << EOF
+Host type:
+ --build=BUILD configure for building on BUILD [BUILD=HOST]
+ --host=HOST configure for HOST [guessed]
+ --target=TARGET configure for TARGET [TARGET=HOST]
+Features and packages:
+ --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
+ --enable-FEATURE[=ARG] include FEATURE [ARG=yes]
+ --with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
+ --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
+ --x-includes=DIR X include files are in DIR
+ --x-libraries=DIR X library files are in DIR
+EOF
+ if test -n "$ac_help"; then
+ echo "--enable and --with options recognized:$ac_help"
+ fi
+ exit 0 ;;
+
+ -host | --host | --hos | --ho)
+ ac_prev=host ;;
+ -host=* | --host=* | --hos=* | --ho=*)
+ host="$ac_optarg" ;;
+
+ -includedir | --includedir | --includedi | --included | --include \
+ | --includ | --inclu | --incl | --inc)
+ ac_prev=includedir ;;
+ -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+ | --includ=* | --inclu=* | --incl=* | --inc=*)
+ includedir="$ac_optarg" ;;
+
+ -infodir | --infodir | --infodi | --infod | --info | --inf)
+ ac_prev=infodir ;;
+ -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+ infodir="$ac_optarg" ;;
+
+ -libdir | --libdir | --libdi | --libd)
+ ac_prev=libdir ;;
+ -libdir=* | --libdir=* | --libdi=* | --libd=*)
+ libdir="$ac_optarg" ;;
+
+ -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+ | --libexe | --libex | --libe)
+ ac_prev=libexecdir ;;
+ -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+ | --libexe=* | --libex=* | --libe=*)
+ libexecdir="$ac_optarg" ;;
+
+ -localstatedir | --localstatedir | --localstatedi | --localstated \
+ | --localstate | --localstat | --localsta | --localst \
+ | --locals | --local | --loca | --loc | --lo)
+ ac_prev=localstatedir ;;
+ -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+ | --localstate=* | --localstat=* | --localsta=* | --localst=* \
+ | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
+ localstatedir="$ac_optarg" ;;
+
+ -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+ ac_prev=mandir ;;
+ -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+ mandir="$ac_optarg" ;;
+
+ -nfp | --nfp | --nf)
+ # Obsolete; use --without-fp.
+ with_fp=no ;;
+
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c)
+ no_create=yes ;;
+
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+ no_recursion=yes ;;
+
+ -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+ | --oldin | --oldi | --old | --ol | --o)
+ ac_prev=oldincludedir ;;
+ -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+ oldincludedir="$ac_optarg" ;;
+
+ -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+ ac_prev=prefix ;;
+ -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+ prefix="$ac_optarg" ;;
+
+ -program-prefix | --program-prefix | --program-prefi | --program-pref \
+ | --program-pre | --program-pr | --program-p)
+ ac_prev=program_prefix ;;
+ -program-prefix=* | --program-prefix=* | --program-prefi=* \
+ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+ program_prefix="$ac_optarg" ;;
+
+ -program-suffix | --program-suffix | --program-suffi | --program-suff \
+ | --program-suf | --program-su | --program-s)
+ ac_prev=program_suffix ;;
+ -program-suffix=* | --program-suffix=* | --program-suffi=* \
+ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+ program_suffix="$ac_optarg" ;;
+
+ -program-transform-name | --program-transform-name \
+ | --program-transform-nam | --program-transform-na \
+ | --program-transform-n | --program-transform- \
+ | --program-transform | --program-transfor \
+ | --program-transfo | --program-transf \
+ | --program-trans | --program-tran \
+ | --progr-tra | --program-tr | --program-t)
+ ac_prev=program_transform_name ;;
+ -program-transform-name=* | --program-transform-name=* \
+ | --program-transform-nam=* | --program-transform-na=* \
+ | --program-transform-n=* | --program-transform-=* \
+ | --program-transform=* | --program-transfor=* \
+ | --program-transfo=* | --program-transf=* \
+ | --program-trans=* | --program-tran=* \
+ | --progr-tra=* | --program-tr=* | --program-t=*)
+ program_transform_name="$ac_optarg" ;;
+
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ silent=yes ;;
+
+ -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+ ac_prev=sbindir ;;
+ -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+ | --sbi=* | --sb=*)
+ sbindir="$ac_optarg" ;;
+
+ -sharedstatedir | --sharedstatedir | --sharedstatedi \
+ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+ | --sharedst | --shareds | --shared | --share | --shar \
+ | --sha | --sh)
+ ac_prev=sharedstatedir ;;
+ -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+ | --sha=* | --sh=*)
+ sharedstatedir="$ac_optarg" ;;
+
+ -site | --site | --sit)
+ ac_prev=site ;;
+ -site=* | --site=* | --sit=*)
+ site="$ac_optarg" ;;
+
+ -site-file | --site-file | --site-fil | --site-fi | --site-f)
+ ac_prev=sitefile ;;
+ -site-file=* | --site-file=* | --site-fil=* | --site-fi=* | --site-f=*)
+ sitefile="$ac_optarg" ;;
+
+ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+ ac_prev=srcdir ;;
+ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+ srcdir="$ac_optarg" ;;
+
+ -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+ | --syscon | --sysco | --sysc | --sys | --sy)
+ ac_prev=sysconfdir ;;
+ -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+ sysconfdir="$ac_optarg" ;;
+
+ -target | --target | --targe | --targ | --tar | --ta | --t)
+ ac_prev=target ;;
+ -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+ target="$ac_optarg" ;;
+
+ -v | -verbose | --verbose | --verbos | --verbo | --verb)
+ verbose=yes ;;
+
+ -version | --version | --versio | --versi | --vers)
+ echo "configure generated by autoconf version 2.13"
+ exit 0 ;;
+
+ -with-* | --with-*)
+ ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then
+ { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
+ fi
+ ac_package=`echo $ac_package| sed 's/-/_/g'`
+ case "$ac_option" in
+ *=*) ;;
+ *) ac_optarg=yes ;;
+ esac
+ eval "with_${ac_package}='$ac_optarg'" ;;
+
+ -without-* | --without-*)
+ ac_package=`echo $ac_option|sed -e 's/-*without-//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then
+ { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
+ fi
+ ac_package=`echo $ac_package| sed 's/-/_/g'`
+ eval "with_${ac_package}=no" ;;
+
+ --x)
+ # Obsolete; use --with-x.
+ with_x=yes ;;
+
+ -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+ | --x-incl | --x-inc | --x-in | --x-i)
+ ac_prev=x_includes ;;
+ -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+ x_includes="$ac_optarg" ;;
+
+ -x-libraries | --x-libraries | --x-librarie | --x-librari \
+ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+ ac_prev=x_libraries ;;
+ -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+ x_libraries="$ac_optarg" ;;
+
+ -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; }
+ ;;
+
+ *)
+ if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then
+ echo "configure: warning: $ac_option: invalid host type" 1>&2
+ fi
+ if test "x$nonopt" != xNONE; then
+ { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; }
+ fi
+ nonopt="$ac_option"
+ ;;
+
+ esac
+done
+
+if test -n "$ac_prev"; then
+ { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; }
+fi
+
+trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
+
+# File descriptor usage:
+# 0 standard input
+# 1 file creation
+# 2 errors and warnings
+# 3 some systems may open it to /dev/tty
+# 4 used on the Kubota Titan
+# 6 checking for... messages and results
+# 5 compiler messages saved in config.log
+if test "$silent" = yes; then
+ exec 6>/dev/null
+else
+ exec 6>&1
+fi
+exec 5>./config.log
+
+echo "\
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+" 1>&5
+
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Also quote any args containing shell metacharacters.
+ac_configure_args=
+for ac_arg
+do
+ case "$ac_arg" in
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c) ;;
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;;
+ *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*)
+ ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+ *) ac_configure_args="$ac_configure_args $ac_arg" ;;
+ esac
+done
+
+# NLS nuisances.
+# Only set these to C if already set. These must not be set unconditionally
+# because not all systems understand e.g. LANG=C (notably SCO).
+# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'!
+# Non-C LC_CTYPE values break the ctype check.
+if test "${LANG+set}" = set; then LANG=C; export LANG; fi
+if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi
+if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi
+if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -rf conftest* confdefs.h
+# AIX cpp loses on an empty file, so make sure it contains at least a newline.
+echo > confdefs.h
+
+# A filename unique to this package, relative to the directory that
+# configure is in, which we can look for to find out if srcdir is correct.
+ac_unique_file=cygwin-api.in.sgml
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+ ac_srcdir_defaulted=yes
+ # Try the directory containing this script, then its parent.
+ ac_prog=$0
+ ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'`
+ test "x$ac_confdir" = "x$ac_prog" && ac_confdir=.
+ srcdir=$ac_confdir
+ if test ! -r $srcdir/$ac_unique_file; then
+ srcdir=..
+ fi
+else
+ ac_srcdir_defaulted=no
+fi
+if test ! -r $srcdir/$ac_unique_file; then
+ if test "$ac_srcdir_defaulted" = yes; then
+ { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; }
+ else
+ { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; }
+ fi
+fi
+srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'`
+
+# Prefer explicitly selected file to automatically selected ones.
+if test -z "$sitefile"; then
+ if test -z "$CONFIG_SITE"; then
+ if test "x$prefix" != xNONE; then
+ CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
+ else
+ CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+ fi
+ fi
+else
+ CONFIG_SITE="$sitefile"
+fi
+for ac_site_file in $CONFIG_SITE; do
+ if test -r "$ac_site_file"; then
+ echo "loading site script $ac_site_file"
+ . "$ac_site_file"
+ fi
+done
+
+if test -r "$cache_file"; then
+ echo "loading cache $cache_file"
+ . $cache_file
+else
+ echo "creating cache $cache_file"
+ > $cache_file
+fi
+
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+ac_exeext=
+ac_objext=o
+if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
+ # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu.
+ if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then
+ ac_n= ac_c='
+' ac_t=' '
+ else
+ ac_n=-n ac_c= ac_t=
+ fi
+else
+ ac_n= ac_c='\c' ac_t=
+fi
+
+
+
+
+
+ac_aux_dir=
+for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
+ if test -f $ac_dir/install-sh; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install-sh -c"
+ break
+ elif test -f $ac_dir/install.sh; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install.sh -c"
+ break
+ fi
+done
+if test -z "$ac_aux_dir"; then
+ { echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; }
+fi
+ac_config_guess=$ac_aux_dir/config.guess
+ac_config_sub=$ac_aux_dir/config.sub
+ac_configure=$ac_aux_dir/configure # This should be Cygnus configure.
+
+
+# Do some error checking and defaulting for the host and target type.
+# The inputs are:
+# configure --host=HOST --target=TARGET --build=BUILD NONOPT
+#
+# The rules are:
+# 1. You are not allowed to specify --host, --target, and nonopt at the
+# same time.
+# 2. Host defaults to nonopt.
+# 3. If nonopt is not specified, then host defaults to the current host,
+# as determined by config.guess.
+# 4. Target and build default to nonopt.
+# 5. If nonopt is not specified, then target and build default to host.
+
+# The aliases save the names the user supplied, while $host etc.
+# will get canonicalized.
+case $host---$target---$nonopt in
+NONE---*---* | *---NONE---* | *---*---NONE) ;;
+*) { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } ;;
+esac
+
+
+# Make sure we can run config.sub.
+if ${CONFIG_SHELL-/bin/sh} $ac_config_sub sun4 >/dev/null 2>&1; then :
+else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; }
+fi
+
+echo $ac_n "checking host system type""... $ac_c" 1>&6
+echo "configure:586: checking host system type" >&5
+
+host_alias=$host
+case "$host_alias" in
+NONE)
+ case $nonopt in
+ NONE)
+ if host_alias=`${CONFIG_SHELL-/bin/sh} $ac_config_guess`; then :
+ else { echo "configure: error: can not guess host type; you must specify one" 1>&2; exit 1; }
+ fi ;;
+ *) host_alias=$nonopt ;;
+ esac ;;
+esac
+
+host=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $host_alias`
+host_cpu=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+host_vendor=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+echo "$ac_t""$host" 1>&6
+
+echo $ac_n "checking target system type""... $ac_c" 1>&6
+echo "configure:607: checking target system type" >&5
+
+target_alias=$target
+case "$target_alias" in
+NONE)
+ case $nonopt in
+ NONE) target_alias=$host_alias ;;
+ *) target_alias=$nonopt ;;
+ esac ;;
+esac
+
+target=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $target_alias`
+target_cpu=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+target_vendor=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+target_os=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+echo "$ac_t""$target" 1>&6
+
+echo $ac_n "checking build system type""... $ac_c" 1>&6
+echo "configure:625: checking build system type" >&5
+
+build_alias=$build
+case "$build_alias" in
+NONE)
+ case $nonopt in
+ NONE) build_alias=$host_alias ;;
+ *) build_alias=$nonopt ;;
+ esac ;;
+esac
+
+build=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $build_alias`
+build_cpu=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+build_vendor=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+build_os=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+echo "$ac_t""$build" 1>&6
+
+test "$host_alias" != "$target_alias" &&
+ test "$program_prefix$program_suffix$program_transform_name" = \
+ NONENONEs,x,x, &&
+ program_prefix=${target_alias}-
+
+
+if test $host != $build; then
+ ac_tool_prefix=${host_alias}-
+else
+ ac_tool_prefix=
+fi
+
+# Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:657: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_CC="${ac_tool_prefix}gcc"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+ echo "$ac_t""$CC" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+
+if test -z "$ac_cv_prog_CC"; then
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:689: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_CC="gcc"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_prog_CC" && ac_cv_prog_CC="gcc"
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+ echo "$ac_t""$CC" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+else
+ CC="gcc"
+fi
+fi
+
+if test -z "$CC"; then
+ # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:725: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_prog_rejected=no
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then
+ ac_prog_rejected=yes
+ continue
+ fi
+ ac_cv_prog_CC="cc"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+if test $ac_prog_rejected = yes; then
+ # We found a bogon in the path, so make sure we never use it.
+ set dummy $ac_cv_prog_CC
+ shift
+ if test $# -gt 0; then
+ # We chose a different compiler from the bogus one.
+ # However, it has the same basename, so the bogon will be chosen
+ # first if we set CC to just the basename; use the full file name.
+ shift
+ set dummy "$ac_dir/$ac_word" "$@"
+ shift
+ ac_cv_prog_CC="$@"
+ fi
+fi
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+ echo "$ac_t""$CC" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; }
+fi
+
+if test $ac_cv_prog_gcc = yes; then
+ GCC=yes
+ ac_test_CFLAGS="${CFLAGS+set}"
+ ac_save_CFLAGS="$CFLAGS"
+ CFLAGS=
+ echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
+echo "configure:779: checking whether ${CC-cc} accepts -g" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ echo 'void f(){}' > conftest.c
+if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then
+ ac_cv_prog_cc_g=yes
+else
+ ac_cv_prog_cc_g=no
+fi
+rm -f conftest*
+
+fi
+
+echo "$ac_t""$ac_cv_prog_cc_g" 1>&6
+ if test "$ac_test_CFLAGS" = set; then
+ CFLAGS="$ac_save_CFLAGS"
+ elif test $ac_cv_prog_cc_g = yes; then
+ CFLAGS="-g -O2"
+ else
+ CFLAGS="-O2"
+ fi
+ if test "$ac_test_CXXFLAGS" != set; then
+ CXXFLAGS='$(CFLAGS)'
+ fi
+else
+ GCC=
+ test "${CFLAGS+set}" = set || CFLAGS="-g"
+fi
+
+
+
+
+trap '' 1 2 15
+cat > confcache <<\EOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs. It is not useful on other systems.
+# If it contains results you don't want to keep, you may remove or edit it.
+#
+# By default, configure uses ./config.cache as the cache file,
+# creating it if it does not exist already. You can give configure
+# the --cache-file=FILE option to use a different cache file; that is
+# what configure does when it calls configure scripts in
+# subdirectories, so they share the cache.
+# Giving --cache-file=/dev/null disables caching, for debugging configure.
+# config.status only pays attention to the cache file if you give it the
+# --recheck option to rerun configure.
+#
+EOF
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, don't put newlines in cache variables' values.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(set) 2>&1 |
+ case `(ac_space=' '; set | grep ac_space) 2>&1` in
+ *ac_space=\ *)
+ # `set' does not quote correctly, so add quotes (double-quote substitution
+ # turns \\\\ into \\, and sed turns \\ into \).
+ sed -n \
+ -e "s/'/'\\\\''/g" \
+ -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p"
+ ;;
+ *)
+ # `set' quotes correctly as required by POSIX, so do not add quotes.
+ sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p'
+ ;;
+ esac >> confcache
+if cmp -s $cache_file confcache; then
+ :
+else
+ if test -w $cache_file; then
+ echo "updating cache $cache_file"
+ cat confcache > $cache_file
+ else
+ echo "not updating unwritable cache $cache_file"
+ fi
+fi
+rm -f confcache
+
+trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# Any assignment to VPATH causes Sun make to only execute
+# the first set of double-colon rules, so remove it if not needed.
+# If there is a colon in the path, we need to keep it.
+if test "x$srcdir" = x.; then
+ ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d'
+fi
+
+trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15
+
+# Transform confdefs.h into DEFS.
+# Protect against shell expansion while executing Makefile rules.
+# Protect against Makefile macro expansion.
+cat > conftest.defs <<\EOF
+s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%-D\1=\2%g
+s%[ `~#$^&*(){}\\|;'"<>?]%\\&%g
+s%\[%\\&%g
+s%\]%\\&%g
+s%\$%$$%g
+EOF
+DEFS=`sed -f conftest.defs confdefs.h | tr '\012' ' '`
+rm -f conftest.defs
+
+
+# Without the "./", some shells look in PATH for config.status.
+: ${CONFIG_STATUS=./config.status}
+
+echo creating $CONFIG_STATUS
+rm -f $CONFIG_STATUS
+cat > $CONFIG_STATUS <<EOF
+#! /bin/sh
+# Generated automatically by configure.
+# Run this file to recreate the current configuration.
+# This directory was configured as follows,
+# on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+#
+# $0 $ac_configure_args
+#
+# Compiler output produced by configure, useful for debugging
+# configure, is in ./config.log if it exists.
+
+ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]"
+for ac_option
+do
+ case "\$ac_option" in
+ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+ echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion"
+ exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;;
+ -version | --version | --versio | --versi | --vers | --ver | --ve | --v)
+ echo "$CONFIG_STATUS generated by autoconf version 2.13"
+ exit 0 ;;
+ -help | --help | --hel | --he | --h)
+ echo "\$ac_cs_usage"; exit 0 ;;
+ *) echo "\$ac_cs_usage"; exit 1 ;;
+ esac
+done
+
+ac_given_srcdir=$srcdir
+
+trap 'rm -fr `echo "Makefile" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
+EOF
+cat >> $CONFIG_STATUS <<EOF
+
+# Protect against being on the right side of a sed subst in config.status.
+sed 's/%@/@@/; s/@%/@@/; s/%g\$/@g/; /@g\$/s/[\\\\&%]/\\\\&/g;
+ s/@@/%@/; s/@@/@%/; s/@g\$/%g/' > conftest.subs <<\\CEOF
+$ac_vpsub
+$extrasub
+s%@SHELL@%$SHELL%g
+s%@CFLAGS@%$CFLAGS%g
+s%@CPPFLAGS@%$CPPFLAGS%g
+s%@CXXFLAGS@%$CXXFLAGS%g
+s%@FFLAGS@%$FFLAGS%g
+s%@DEFS@%$DEFS%g
+s%@LDFLAGS@%$LDFLAGS%g
+s%@LIBS@%$LIBS%g
+s%@exec_prefix@%$exec_prefix%g
+s%@prefix@%$prefix%g
+s%@program_transform_name@%$program_transform_name%g
+s%@bindir@%$bindir%g
+s%@sbindir@%$sbindir%g
+s%@libexecdir@%$libexecdir%g
+s%@datadir@%$datadir%g
+s%@sysconfdir@%$sysconfdir%g
+s%@sharedstatedir@%$sharedstatedir%g
+s%@localstatedir@%$localstatedir%g
+s%@libdir@%$libdir%g
+s%@includedir@%$includedir%g
+s%@oldincludedir@%$oldincludedir%g
+s%@infodir@%$infodir%g
+s%@mandir@%$mandir%g
+s%@host@%$host%g
+s%@host_alias@%$host_alias%g
+s%@host_cpu@%$host_cpu%g
+s%@host_vendor@%$host_vendor%g
+s%@host_os@%$host_os%g
+s%@target@%$target%g
+s%@target_alias@%$target_alias%g
+s%@target_cpu@%$target_cpu%g
+s%@target_vendor@%$target_vendor%g
+s%@target_os@%$target_os%g
+s%@build@%$build%g
+s%@build_alias@%$build_alias%g
+s%@build_cpu@%$build_cpu%g
+s%@build_vendor@%$build_vendor%g
+s%@build_os@%$build_os%g
+s%@CC@%$CC%g
+s%@build_exeext@%$build_exeext%g
+
+CEOF
+EOF
+
+cat >> $CONFIG_STATUS <<\EOF
+
+# Split the substitutions into bite-sized pieces for seds with
+# small command number limits, like on Digital OSF/1 and HP-UX.
+ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script.
+ac_file=1 # Number of current file.
+ac_beg=1 # First line for current file.
+ac_end=$ac_max_sed_cmds # Line after last line for current file.
+ac_more_lines=:
+ac_sed_cmds=""
+while $ac_more_lines; do
+ if test $ac_beg -gt 1; then
+ sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file
+ else
+ sed "${ac_end}q" conftest.subs > conftest.s$ac_file
+ fi
+ if test ! -s conftest.s$ac_file; then
+ ac_more_lines=false
+ rm -f conftest.s$ac_file
+ else
+ if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds="sed -f conftest.s$ac_file"
+ else
+ ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file"
+ fi
+ ac_file=`expr $ac_file + 1`
+ ac_beg=$ac_end
+ ac_end=`expr $ac_end + $ac_max_sed_cmds`
+ fi
+done
+if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds=cat
+fi
+EOF
+
+cat >> $CONFIG_STATUS <<EOF
+
+CONFIG_FILES=\${CONFIG_FILES-"Makefile"}
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then
+ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+ case "$ac_file" in
+ *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
+ ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+ *) ac_file_in="${ac_file}.in" ;;
+ esac
+
+ # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories.
+
+ # Remove last slash and all that follows it. Not all systems have dirname.
+ ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
+ if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
+ # The file is in a subdirectory.
+ test ! -d "$ac_dir" && mkdir "$ac_dir"
+ ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`"
+ # A "../" for each directory in $ac_dir_suffix.
+ ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'`
+ else
+ ac_dir_suffix= ac_dots=
+ fi
+
+ case "$ac_given_srcdir" in
+ .) srcdir=.
+ if test -z "$ac_dots"; then top_srcdir=.
+ else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;;
+ /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;;
+ *) # Relative path.
+ srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix"
+ top_srcdir="$ac_dots$ac_given_srcdir" ;;
+ esac
+
+
+ echo creating "$ac_file"
+ rm -f "$ac_file"
+ configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure."
+ case "$ac_file" in
+ *Makefile*) ac_comsub="1i\\
+# $configure_input" ;;
+ *) ac_comsub= ;;
+ esac
+
+ ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
+ sed -e "$ac_comsub
+s%@configure_input@%$configure_input%g
+s%@srcdir@%$srcdir%g
+s%@top_srcdir@%$top_srcdir%g
+" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file
+fi; done
+rm -f conftest.s*
+
+EOF
+cat >> $CONFIG_STATUS <<EOF
+
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+
+exit 0
+EOF
+chmod +x $CONFIG_STATUS
+rm -fr confdefs* $ac_clean_files
+test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1
+
diff --git a/winsup/doc/configure.in b/winsup/doc/configure.in
new file mode 100644
index 000000000..a51a474a9
--- /dev/null
+++ b/winsup/doc/configure.in
@@ -0,0 +1,54 @@
+dnl Autoconf configure script for winsup/regexp
+dnl Copyright 1997 Cygnus Solutions.
+dnl
+dnl This file is part of Cygwin.
+dnl
+dnl This software is a copyrighted work licensed under the terms of the
+dnl Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+dnl details.
+
+dnl Process this file with autoconf to produce a configure script.
+
+AC_PREREQ(2.12)
+AC_INIT(cygwin-api.in.sgml)
+
+AC_DEFUN(LIB_AC_PROG_CC,
+[AC_BEFORE([$0], [AC_PROG_CPP])dnl
+AC_CHECK_TOOL(CC, gcc, gcc)
+if test -z "$CC"; then
+ AC_CHECK_PROG(CC, cc, cc, , , /usr/ucb/cc)
+ test -z "$CC" && AC_MSG_ERROR([no acceptable cc found in \$PATH])
+fi
+
+if test $ac_cv_prog_gcc = yes; then
+ GCC=yes
+dnl Check whether -g works, even if CFLAGS is set, in case the package
+dnl plays around with CFLAGS (such as to build both debugging and
+dnl normal versions of a library), tasteless as that idea is.
+ ac_test_CFLAGS="${CFLAGS+set}"
+ ac_save_CFLAGS="$CFLAGS"
+ CFLAGS=
+ AC_PROG_CC_G
+ if test "$ac_test_CFLAGS" = set; then
+ CFLAGS="$ac_save_CFLAGS"
+ elif test $ac_cv_prog_cc_g = yes; then
+ CFLAGS="-g -O2"
+ else
+ CFLAGS="-O2"
+ fi
+ if test "$ac_test_CXXFLAGS" != set; then
+ CXXFLAGS='$(CFLAGS)'
+ fi
+else
+ GCC=
+ test "${CFLAGS+set}" = set || CFLAGS="-g"
+fi
+])
+
+AC_CANONICAL_SYSTEM
+
+LIB_AC_PROG_CC
+
+AC_SUBST(build_exeext)
+
+AC_OUTPUT(Makefile)
diff --git a/winsup/doc/copy.texinfo b/winsup/doc/copy.texinfo
new file mode 100644
index 000000000..90dc078d1
--- /dev/null
+++ b/winsup/doc/copy.texinfo
@@ -0,0 +1,382 @@
+@chapter What are the copyrights ?
+
+@section The general idea
+
+Most of the tools are covered by the GNU General Public License (GPL),
+although some are public domain, and others have a X11-style
+copyright. To cover the GNU GPL
+requirements, the basic rule is if you give out any binaries, you must
+also make the source available. For the full details, be sure to
+read the text of the GNU GPL which follows.
+
+The Cygwin API library found in the winsup subdirectory of the
+source code is also covered by the GNU GPL. By default, all
+executables link against this library (and in the process include GPL'd
+Cygwin glue code). This means that unless you modify the tools
+so that compiled executables do not make use of the Cygwin library,
+your compiled programs will also have to be free software distributed
+under the GPL with source code available to all.
+
+Cygwin is currently available for proprietary use only through a
+proprietary-use license. Please contact sales@@cygnus.com for
+more information.
+
+In accordance with section 10 of the GPL, Cygnus permits programs whose
+sources are distributed under a license that complies with the Open
+Source definition to be linked with libcygwin.a without libcygwin.a
+itself causing the resulting program to be covered by the GNU GPL.
+
+This means that you can port an Open Source(tm) application to cygwin,
+and distribute that executable as if it didn't include a copy of
+libcygwin.a linked into it. Note that this does not apply to the cygwin
+DLL itself. If you distribute a (possibly modified) version of the DLL
+you must adhere to the terms of the GPL, i.e., you must provide sources
+for the cygwin DLL.
+
+See http://www.opensource.org/osd.html for the precise Open Source
+Definition referenced above.
+
+@section GNU GENERAL PUBLIC LICENSE
+@example
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 675 Mass Ave, Cambridge, MA 02139, USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ Appendix: How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) 19yy <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program 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 General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) 19yy name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
+
+@end example
+
diff --git a/winsup/doc/cygwin-api.in.sgml b/winsup/doc/cygwin-api.in.sgml
new file mode 100644
index 000000000..13d7f8c2f
--- /dev/null
+++ b/winsup/doc/cygwin-api.in.sgml
@@ -0,0 +1,68 @@
+<!doctype book PUBLIC "-//Davenport//DTD DocBook V3.0//EN" [
+ <!ENTITY cygnus-copyright "<YEAR>1998</YEAR><HOLDER>Cygnus
+ Solutions</HOLDER>">
+ <!ENTITY cygnus-code-copyright "
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+Copyright (C) 1998 Cygnus Solutions.
+
+This is copyrighted software that may only
+be reproduced, modified, or distributed
+under license from Cygnus Solutions.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+">
+ ]>
+
+<book id="cygwin-api">
+
+ <bookinfo>
+ <date>1998-08-31</date>
+ <title>Cygwin API Reference</title>
+ <authorgroup>
+ <author>
+ <firstname>DJ</firstname>
+ <surname>Delorie</surname>
+ </author>
+ <author>
+ <firstname>Geoffrey</firstname>
+ <surname>Noer</surname>
+ </author>
+ </authorgroup>
+
+ DOCTOOL-INSERT-legal
+
+ <revhistory>
+ <revision>
+ <revnumber>0.0</revnumber>
+ <date>1998-08-31</date>
+ <authorinitials>dj@cygnus.com</authorinitials>
+ <revremark>Initial revision</revremark>
+ </revision>
+ <revision>
+ <revnumber>0.5.0</revnumber>
+ <date>1998-12-17</date>
+ <authorinitials>noer@cygnus.com</authorinitials>
+ <revremark>Add pthread, sem calls. Change revnumber to
+ three-part number: Cygwin API major, Cygwin API minor, Doc rev
+ number. Starts out at 0.5.0.</revremark>
+ </revision>
+ </revhistory>
+ </bookinfo>
+
+ <toc></toc>
+
+<chapter id="compatibility"><title>Compatibility</title>
+DOCTOOL-INSERT-std-ansi
+DOCTOOL-INSERT-std-posix
+DOCTOOL-INSERT-std-misc
+</chapter>
+
+<chapter id="cygwin-functions"><title>Cygwin Functions</title>
+
+<para>These functions are specific to Cygwin itself, and probably
+won't be found anywhere else. </para>
+
+DOCTOOL-INSERT-func-
+
+</chapter>
+
+</book>
diff --git a/winsup/doc/cygwin-ug-net.in.sgml b/winsup/doc/cygwin-ug-net.in.sgml
new file mode 100644
index 000000000..633689631
--- /dev/null
+++ b/winsup/doc/cygwin-ug-net.in.sgml
@@ -0,0 +1,64 @@
+<!doctype book PUBLIC "-//Davenport//DTD DocBook V3.0//EN" [
+ <!ENTITY cygnus-copyright
+ "<YEAR>1999</YEAR>
+ <HOLDER>Cygnus Solutions</HOLDER>">
+ <!ENTITY cygnus-code-copyright "
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+Copyright (C) 1998, 1999 Cygnus Solutions.
+
+This is copyrighted software that may only
+be reproduced, modified, or distributed
+under license from Cygnus Solutions.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+">
+ ]>
+
+<book id="cygwin-ug-net">
+
+ <bookinfo>
+ <date>1999-02-08</date>
+ <title>Cygwin User's Guide</title>
+ <authorgroup>
+ <author>
+ <firstname>DJ</firstname>
+ <surname>Delorie</surname>
+ </author>
+ <author>
+ <firstname>Pierre</firstname>
+ <surname>Humblet</surname>
+ </author>
+ <author>
+ <firstname>Geoffrey</firstname>
+ <surname>Noer</surname>
+ </author>
+ </authorgroup>
+
+DOCTOOL-INSERT-legal
+
+ <revhistory>
+ <revision>
+ <revnumber>0.0</revnumber>
+ <date>1998-10-06</date>
+ <authorinitials>noer@cygnus.com</authorinitials>
+ <revremark>Initial revision</revremark>
+ </revision>
+ <revision>
+ <revnumber>20.1.0</revnumber>
+ <date>1999-02-08</date>
+ <authorinitials>Pierre.Humblet@eurecom.fr</authorinitials>
+ <revremark>Expand, describe Cygwin 20.1</revremark>
+ </revision>
+ </revhistory>
+ </bookinfo>
+
+ <toc></toc>
+
+DOCTOOL-INSERT-overview
+
+DOCTOOL-INSERT-setup-net
+
+DOCTOOL-INSERT-using
+
+DOCTOOL-INSERT-programming
+
+</book>
diff --git a/winsup/doc/cygwin-ug.in.sgml b/winsup/doc/cygwin-ug.in.sgml
new file mode 100644
index 000000000..3a7371a88
--- /dev/null
+++ b/winsup/doc/cygwin-ug.in.sgml
@@ -0,0 +1,63 @@
+<!doctype book PUBLIC "-//Davenport//DTD DocBook V3.0//EN" [
+ <!ENTITY cygnus-copyright "<YEAR>1999</YEAR>
+ <HOLDER>Cygnus Solutions</HOLDER>">
+ <!ENTITY cygnus-code-copyright "
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+Copyright (C) 1998, 1999 Cygnus Solutions.
+
+This is copyrighted software that may only
+be reproduced, modified, or distributed
+under license from Cygnus Solutions.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+">
+ ]>
+
+<book id="cygwin-ug">
+
+ <bookinfo>
+ <date>1998-01-28</date>
+ <title>Cygwin User's Guide</title>
+ <authorgroup>
+ <author>
+ <firstname>DJ</firstname>
+ <surname>Delorie</surname>
+ </author>
+ <author>
+ <firstname>Pierre</firstname>
+ <surname>Humblet</surname>
+ </author>
+ <author>
+ <firstname>Geoffrey</firstname>
+ <surname>Noer</surname>
+ </author>
+ </authorgroup>
+
+DOCTOOL-INSERT-legal
+
+ <revhistory>
+ <revision>
+ <revnumber>0.0</revnumber>
+ <date>1998-08-31</date>
+ <authorinitials>dj@cygnus.com</authorinitials>
+ <revremark>Initial revision</revremark>
+ </revision>
+ <revision>
+ <revnumber>20.1.0</revnumber>
+ <date>1999-02-08</date>
+ <authorinitials>Pierre.Humblet@eurecom.fr</authorinitials>
+ <revremark>Expand, describe Cygwin 20.1</revremark>
+ </revision>
+ </revhistory>
+ </bookinfo>
+
+ <toc></toc>
+
+DOCTOOL-INSERT-overview
+
+DOCTOOL-INSERT-setup
+
+DOCTOOL-INSERT-using
+
+DOCTOOL-INSERT-programming
+
+</book>
diff --git a/winsup/doc/cygwinenv.sgml b/winsup/doc/cygwinenv.sgml
new file mode 100644
index 000000000..8f5de3ec6
--- /dev/null
+++ b/winsup/doc/cygwinenv.sgml
@@ -0,0 +1,91 @@
+<sect1 id="using-cygwinenv"><title>The <EnVar>CYGWIN</EnVar> environment
+variable</title>
+
+<para>The <EnVar>CYGWIN</EnVar> environment variable is used to configure
+many global settings for the Cygwin runtime system. It contains the options
+listed below, separated by blank characters. Many options can be turned off
+by prefixing with <literal>no </literal>.</para>
+
+<itemizedlist Mark="bullet">
+<listitem>
+<para><FirstTerm>(no)binmode</FirstTerm> - if set, non-disk
+(e.g. pipe and COM ports) file opens default to binary mode
+(no CR/LF/Ctrl-Z translations) instead of text mode.
+Defaults to set (binary mode). This option must be set
+before starting a Cygwin shell to have an effect on redirection.
+</para>
+<warning><title>Warning!</title><para>If set in 12/98 b20.1, all files
+always open in binary mode.</para> </warning>
+</listitem>
+<listitem>
+<para><FirstTerm>(no)envcache</FirstTerm> - If set, environment variable
+conversions (between Win32 and POSIX) are cached. Note that this is may
+cause problems if the mount table changes, as the cache is not invalidated
+and may contain values that depend on the previous mount table
+contents. Defaults to set.</para>
+</listitem>
+<listitem>
+<para><FirstTerm>(no)export</FirstTerm> - if set, the final values of these
+settings are re-exported to the environment as $CYGWIN again.</para>
+</listitem>
+<listitem>
+<para><FirstTerm>(no)glob</FirstTerm> - if set, command line arguments
+containing UNIX-style file wildcard characters (brackets, question mark,
+asterisk, escaped with \) are expanded into lists of files that match
+those wildcards.
+This is applicable only to programs running from a DOS command line prompt.
+Default is set.</para>
+</listitem>
+<listitem>
+<para><FirstTerm>(no)ntea</FirstTerm> - if set, use the full NT Extended
+Attributes to store UNIX-like inode information.
+This option only operates under Windows NT. Defaults to not set. </para>
+<Warning><Title>Warning!</Title> <para>This may create additional
+<emphasis>large</emphasis> files on non-NTFS partitions.</para></Warning>
+</listitem>
+<listitem>
+<para><FirstTerm>(no)ntsec</FirstTerm> - if set, use the NT security
+model to set UNIX-like permissions on files and processes. The
+file permissions can only be set on NTFS partitions. FAT and SAMBA doesn't
+support the NT file security. For more information, read the documentation
+in <citation>ntsec.sgml</citation>.</para>
+</listitem>
+<listitem>
+<para><FirstTerm>(no)reset_com</FirstTerm> - if set, serial ports are reset
+to 9600-8-N-1 with no flow control when used. This is done at open
+time and when handles are inherited. Defaults to set.</para>
+</listitem>
+<listitem>
+<para><FirstTerm>strace=n[:cache][,filename]</FirstTerm> - configures system
+tracing. Off by default, setting various bits in <literal>n</literal> (a
+bit flag) enables various types of system messages. Setting
+<literal>n</literal> to 1 enables most messages. Other values can be found
+in <filename>sys/strace.h</filename>. The <literal>:cache</literal> option
+lets you specify how many lines to cache before flushing the output
+(example: <literal>strace=1:20</literal>). The <literal>filename</literal>
+option lets you send the messages to a file instead of the screen. </para>
+</listitem>
+<listitem>
+<para><FirstTerm>(no)strip_title</FirstTerm> - if set, strips the directory
+part off the window title, if any. Default is not set.</para>
+</listitem>
+<listitem>
+<para><FirstTerm>(no)title</FirstTerm> - if set, the title bar
+reflects the name of the program currently running. Default is not
+set. Note that under Win9x the title bar is always enabled and it is
+stripped by default, but this is because of the way Win9x works. In
+order not to strip, specify <literal>title</literal> or <literal>title
+nostrip_title</literal>.</para>
+</listitem>
+<listitem>
+<para><FirstTerm>(no)tty</FirstTerm> - if set, Cygwin enables extra support
+(i.e., termios) for UNIX-like ttys.
+It is not compatible with some Windows programs.
+Defaults to not set, in which case the tty is opened in text mode
+with ^Z as EOF. Note that this has been changed such that ^D works as
+expected instead of ^Z, and is settable via stty.
+This option must be specified before starting a Cygwin shell
+and it cannot be changed in the shell.</para>
+</listitem>
+</itemizedlist>
+</sect1>
diff --git a/winsup/doc/dll.sgml b/winsup/doc/dll.sgml
new file mode 100644
index 000000000..274f12926
--- /dev/null
+++ b/winsup/doc/dll.sgml
@@ -0,0 +1,120 @@
+<sect1 id="dll"><title>Building and Using DLLs</title>
+
+<para>DLLs are Dynamic Link Libraries, which means that they're linked
+into your program at run time instead of build time. There are three
+parts to a DLL:</para>
+
+<itemizedlist spacing="compact">
+<listitem><para> the exports </para></listitem>
+<listitem><para> the code and data </para></listitem>
+<listitem><para> the import library </para></listitem>
+</itemizedlist>
+
+<para>The code and data are the parts you write - functions,
+variables, etc. All these are merged together, like if you were
+building one big object files, and put into the dll. They are not
+put into your .exe at all.</para>
+
+<para>The exports contains a list of functions and variables that the
+dll makes available to other programs. Think of this as the list of
+"global" symbols, the rest being hidden. Normally, you'd create this
+list by hand with a text editor, but it's possible to do it
+automatically from the list of functions in your code. The
+<filename>dlltool</filename> program creates the exports section of
+the dll from your text file of exported symbols.</para>
+
+<para>The import library is a regular UNIX-like
+<filename>.a</filename> library, but it only contains the tiny bit of
+information needed to tell the OS how your program interacts with
+("imports") the dll. This information is linked into your
+<filename>.exe</filename>. This is also generated by
+<filename>dlltool</filename>.</para>
+
+<sect2 id="dll-build"><title>Building DLLs</title>
+
+<para>OK, let's go through a simple example of how to build a dll.
+For this example, we'll use a single file
+<filename>myprog.c</filename> for the program
+(<filename>myprog.exe</filename>) and a single file
+<filename>mydll.c</filename> for the contents of the dll
+(<filename>mydll.dll</filename>).</para>
+
+<para>Now compile everything to objects:</para>
+
+<screen>
+gcc -c myprog.c
+gcc -c mydll.c
+</screen>
+
+<para>Unfortunately, the process for building a dll is, well, convoluted.
+You have to run five commands, like this:</para>
+
+<screen>
+gcc -s -Wl,--base-file,mydll.base -o mydll.dll mydll.o -Wl,-e,_mydll_init@12
+dlltool --base-file mydll.base --def mydll.def --output-exp mydll.exp --dllname mydll.dll
+gcc -s -Wl,--base-file,mydll.base,mydll.exp -o mydll.dll mydll.o -Wl,-e,_mydll_init@12
+dlltool --base-file mydll.base --def mydll.def --output-exp mydll.exp --dllname mydll.dll
+gcc -Wl,mydll.exp -o mydll.dll mydll.o -Wl,-e,_mydll_init@12
+</screen>
+
+<para>The extra steps give <filename>dlltool</filename> the
+opportunity to generate the extra sections (exports and relocation)
+that a dll needs. After this, you build the import library:</para>
+
+<screen>
+dlltool --def mydll.def --dllname mydll.dll --output-lib mydll.a
+</screen>
+
+<para>Now, when you build your program, you link against the import
+library:</para>
+
+<screen>
+gcc -o myprog myprog.o mydll.a
+</screen>
+
+<para>Note that we linked with <command>-e _mydll_init@12</command>.
+This tells the OS what the DLL's "entry point" is, and this is a
+special function that coordinates bringing the dll to life withing the
+OS. The minimum function looks like this:</para>
+
+<screen>
+#include &lt;windows.h&gt;
+
+int WINAPI
+mydll_init(HANDLE h, DWORD reason, void *foo)
+{
+ return 1;
+}
+</screen>
+
+</sect2>
+
+<sect2 id="dll-link"><title>Linking Against DLLs</title>
+
+<para>If you have an existing DLL already, you need to build a
+Cygwin-compatible import library (The supplied ones should work, but
+you might not have them) to link against. Unfortunately, there is not
+yet any tool to do this automatically. However, you can get most of
+the way by creating a .def file with these commands (you might need to
+do this in <filename>bash</filename> for the quoting to work
+correctly):</para>
+
+<screen>
+echo EXPORTS > foo.def
+nm foo.dll | grep ' T _' | sed 's/.* T _//' >> foo.def
+</screen>
+
+<para>Note that this will only work if the DLL is not stripped.
+Otherwise you will get an error message: "No symbols in
+foo.dll".</para>
+
+<para>Once you have the <filename>.def</filename> file, you can create
+an import library from it like this:</para>
+
+<screen>
+dlltool --def foo.def --dllname foo.dll --output-lib foo.a
+</screen>
+
+</sect2>
+
+</sect1>
diff --git a/winsup/doc/doctool.c b/winsup/doc/doctool.c
new file mode 100644
index 000000000..26e76669d
--- /dev/null
+++ b/winsup/doc/doctool.c
@@ -0,0 +1,622 @@
+/* doctool.c
+
+ Copyright 1998 Cygnus Solutions.
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <dirent.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <utime.h>
+
+/* Building native in a cross-built directory is tricky. Be careful,
+and beware that you don't have the full portability stuff available to
+you (like libiberty) */
+
+/*****************************************************************************/
+
+/* The list of extensions that may contain SGML snippets. We check
+ both cases in case the file system isn't case sensitive enough. */
+
+struct {
+ char *upper;
+ char *lower;
+ int is_sgml;
+} extensions[] = {
+ { ".C", ".c", 0 },
+ { ".CC", ".cc", 0 },
+ { ".H", ".h", 0 },
+ { ".SGML", ".sgml", 1 },
+ { 0, 0, 0 }
+};
+
+/*****************************************************************************/
+
+void
+show_help()
+{
+ printf("Usage: doctool [-m] [-i] [-d dir] [-o outfile] [-s prefix] \\\n");
+ printf(" [-b book_id] infile\n");
+ printf(" -m means to adjust Makefile to include new dependencies\n");
+ printf(" -i means to include internal snippets\n");
+ printf(" -d means to recursively scan directory for snippets\n");
+ printf(" -o means to output to file (else stdout)\n");
+ printf(" -s means to suppress source dir prefix\n");
+ printf(" -b means to change the <book id=\"book_id\">\n");
+ printf("\n");
+ printf("doctool looks for DOCTOOL-START and DOCTOOL-END lines in source,\n");
+ printf("saves <foo id=\"bar\"> blocks, and looks for DOCTOOL-INSERT-bar\n");
+ printf("commands to insert selected sections. IDs starting with int-\n");
+ printf("are internal only, add- are added at the end of relevant sections\n");
+ printf("or add-int- for both. Inserted sections are chosen by prefix,\n");
+ printf("and sorted when inserted.\n");
+ exit(1);
+}
+
+/*****************************************************************************/
+
+typedef struct Section {
+ struct Section *next;
+ struct OneFile *file;
+ char *name;
+ char internal;
+ char addend;
+ char used;
+ char **lines;
+ int num_lines;
+ int max_lines;
+} Section;
+
+typedef struct OneFile {
+ struct OneFile *next;
+ char *filename;
+ int enable_scan;
+ int used;
+ Section *sections;
+} OneFile;
+
+OneFile *file_list = 0;
+
+char *output_name = 0;
+FILE *output_file = 0;
+
+char *source_dir_prefix = "";
+char *book_id = 0;
+
+int internal_flag = 0;
+
+/*****************************************************************************/
+
+char *
+has_string(char *line, char *string)
+{
+ int i;
+ while (*line)
+ {
+ for (i=0; line[i]; i++)
+ {
+ if (!string[i])
+ return line;
+ if (line[i] != string[i])
+ break;
+ }
+ line++;
+ }
+ return 0;
+}
+
+int
+starts_with(char *line, char *string)
+{
+ int i=0;
+ while (1)
+ {
+ if (!string[i])
+ return 1;
+ if (!line[i] || line[i] != string[i])
+ return 0;
+ i++;
+ }
+}
+
+/*****************************************************************************/
+
+#ifdef S_ISLNK
+#define STAT lstat
+#else
+#define STAT stat
+#endif
+
+void
+scan_directory(dirname)
+ char *dirname;
+{
+ struct stat st;
+ char *name;
+ struct dirent *de;
+ DIR *dir = opendir(dirname);
+ if (!dir)
+ return;
+ while (de = readdir(dir))
+ {
+ if (strcmp(de->d_name, ".") == 0
+ || strcmp(de->d_name, "..") == 0)
+ continue;
+
+ name = (char *)malloc(strlen(dirname)+strlen(de->d_name)+3);
+ strcpy(name, dirname);
+ strcat(name, "/");
+ strcat(name, de->d_name);
+
+ STAT(name, &st);
+
+ if (S_ISDIR(st.st_mode))
+ {
+ scan_directory(name);
+ }
+
+ else if (S_ISREG(st.st_mode))
+ {
+ char *dot = strrchr(de->d_name, '.');
+ int i;
+
+ if (dot)
+ {
+ for (i=0; extensions[i].upper; i++)
+ if (strcmp(dot, extensions[i].upper) == 0
+ || strcmp(dot, extensions[i].lower) == 0)
+ {
+ OneFile *one = (OneFile *)malloc(sizeof(OneFile));
+ one->next = file_list;
+ file_list = one;
+ one->filename = name;
+ one->enable_scan = ! extensions[i].is_sgml;
+ one->used = 0;
+ one->sections = 0;
+ }
+ }
+ }
+ }
+ closedir (dir);
+}
+
+/*****************************************************************************/
+
+void
+scan_file(OneFile *one)
+{
+ FILE *f = fopen(one->filename, "r");
+ int enabled = ! one->enable_scan;
+ char line[1000], *tag=0, *id=0, *tmp;
+ int taglen = 0;
+ Section *section = 0;
+ Section **prev_section_ptr = &(one->sections);
+
+ if (!f)
+ {
+ perror(one->filename);
+ return;
+ }
+
+ while (fgets(line, 1000, f))
+ {
+ if (one->enable_scan)
+ {
+ /* source files have comment-embedded docs, check for them */
+ if (has_string(line, "DOCTOOL-START"))
+ enabled = 1;
+ if (has_string(line, "DOCTOOL-END"))
+ enabled = 0;
+ }
+ if (!enabled)
+ continue;
+
+ /* DOCTOOL-START
+
+<sect1 id="dt-tags">
+this is the doctool tags section.
+</sect1>
+
+ DOCTOOL-END */
+
+ if (!tag && line[0] == '<')
+ {
+ tag = (char *)malloc(strlen(line)+1);
+ id = (char *)malloc(strlen(line)+1);
+ if (sscanf(line, "<%s id=\"%[^\"]\">", tag, id) == 2)
+ {
+ if (strcmp(tag, "book") == 0 || strcmp(tag, "BOOK") == 0)
+ {
+ /* Don't want to "scan" these */
+ return;
+ }
+ taglen = strlen(tag);
+ section = (Section *)malloc(sizeof(Section));
+ /* We want chunks within single files to appear in that order */
+ section->next = 0;
+ section->file = one;
+ *prev_section_ptr = section;
+ prev_section_ptr = &(section->next);
+ section->internal = 0;
+ section->addend = 0;
+ section->used = 0;
+ section->name = id;
+ if (starts_with(section->name, "add-"))
+ {
+ section->addend = 1;
+ section->name += 4;
+ }
+ if (starts_with(section->name, "int-"))
+ {
+ section->internal = 1;
+ section->name += 4;
+ }
+ section->lines = (char **)malloc(10*sizeof(char *));
+ section->num_lines = 0;
+ section->max_lines = 10;
+ }
+ else
+ {
+ free(tag);
+ free(id);
+ tag = id = 0;
+ }
+ }
+
+ if (tag && section)
+ {
+ if (section->num_lines >= section->max_lines)
+ {
+ section->max_lines += 10;
+ section->lines = (char **)realloc(section->lines,
+ section->max_lines * sizeof (char *));
+ }
+ section->lines[section->num_lines] = (char *)malloc(strlen(line)+1);
+ strcpy(section->lines[section->num_lines], line);
+ section->num_lines++;
+
+ if (line[0] == '<' && line[1] == '/'
+ && memcmp(line+2, tag, taglen) == 0
+ && (isspace(line[2+taglen]) || line[2+taglen] == '>'))
+ {
+ /* last line! */
+ tag = 0;
+ }
+ }
+ }
+ fclose(f);
+}
+
+/*****************************************************************************/
+
+Section **
+enumerate_matching_sections(char *name_prefix, int internal, int addend, int *count_ret)
+{
+ Section **rv = (Section **)malloc(12*sizeof(Section *));
+ int count = 0, max=10, prefix_len = strlen(name_prefix);
+ OneFile *one;
+ int wildcard = 0;
+
+ if (name_prefix[strlen(name_prefix)-1] == '-')
+ wildcard = 1;
+
+ for (one=file_list; one; one=one->next)
+ {
+ Section *s;
+ for (s=one->sections; s; s=s->next)
+ {
+ int matches = 0;
+ if (wildcard)
+ {
+ if (starts_with(s->name, name_prefix))
+ matches = 1;
+ }
+ else
+ {
+ if (strcmp(s->name, name_prefix) == 0)
+ matches = 1;
+ }
+ if (s->internal <= internal
+ && s->addend == addend
+ && matches
+ && ! s->used)
+ {
+ s->used = 1;
+ if (count >= max)
+ {
+ max += 10;
+ rv = (Section **)realloc(rv, max*sizeof(Section *));
+ }
+ rv[count++] = s;
+ rv[count] = 0;
+ }
+ }
+ }
+ if (count_ret)
+ *count_ret = count;
+ return rv;
+}
+
+/*****************************************************************************/
+
+#define ID_CHARS "~@$%&()_-+[]{}:."
+
+void include_section(char *name, int addend);
+
+char *
+unprefix(char *fn)
+{
+ int l = strlen(source_dir_prefix);
+ if (memcmp(fn, source_dir_prefix, l) == 0)
+ {
+ fn += l;
+ while (*fn == '/' || *fn == '\\')
+ fn++;
+ return fn;
+ }
+ return fn;
+}
+
+void
+parse_line(char *line, char *filename)
+{
+ char *cmd = has_string(line, "DOCTOOL-INSERT-");
+ char *sname, *send, *id, *save;
+ if (!cmd)
+ {
+ if (book_id
+ && (starts_with(line, "<book") || starts_with(line, "<BOOK")))
+ {
+ cmd = strchr(line, '>');
+ if (cmd)
+ {
+ cmd++;
+ fprintf(output_file, "<book id=\"%s\">", book_id);
+ fputs(cmd, output_file);
+ return;
+ }
+ }
+ fputs(line, output_file);
+ return;
+ }
+ if (cmd != line)
+ fwrite(line, cmd-line, 1, output_file);
+ save = (char *)malloc(strlen(line)+1);
+ strcpy(save, line);
+ line = save;
+
+ sname = cmd + 15; /* strlen("DOCTOOL-INSERT-") */
+ for (send = sname;
+ *send && isalnum(*send) || strchr(ID_CHARS, *send);
+ send++);
+ id = (char *)malloc(send-sname+2);
+ memcpy(id, sname, send-sname);
+ id[send-sname] = 0;
+ include_section(id, 0);
+
+ fprintf(output_file, "<!-- %s -->\n", unprefix(filename));
+
+ fputs(send, output_file);
+ free(save);
+}
+
+int
+section_sort(const void *va, const void *vb)
+{
+ Section *a = *(Section **)va;
+ Section *b = *(Section **)vb;
+ int rv = strcmp(a->name, b->name);
+ if (rv)
+ return rv;
+ return a->internal - b->internal;
+}
+
+void
+include_section(char *name, int addend)
+{
+ Section **sections, *s;
+ int count, i, l;
+
+ sections = enumerate_matching_sections(name, internal_flag, addend, &count);
+
+ qsort(sections, count, sizeof(sections[0]), section_sort);
+ for (i=0; i<count; i++)
+ {
+ s = sections[i];
+ s->file->used = 1;
+ fprintf(output_file, "<!-- %s -->\n", unprefix(s->file->filename));
+ for (l=addend; l<s->num_lines-1; l++)
+ parse_line(s->lines[l], s->file->filename);
+ if (!addend)
+ {
+ include_section(s->name, 1);
+ parse_line(s->lines[l], s->file->filename);
+ }
+ }
+
+ free(sections);
+}
+
+void
+parse_sgml(FILE *in, char *input_name)
+{
+ static char line[1000];
+ while (fgets(line, 1000, in))
+ {
+ parse_line(line, input_name);
+ }
+}
+
+/*****************************************************************************/
+
+void
+fix_makefile(char *output_name)
+{
+ FILE *in, *out;
+ char line[1000];
+ int oname_len = strlen(output_name);
+ OneFile *one;
+ int used_something = 0;
+ struct stat st;
+ struct utimbuf times;
+
+ stat("Makefile", &st);
+
+ in = fopen("Makefile", "r");
+ if (!in)
+ {
+ perror("Makefile");
+ return;
+ }
+
+ out = fopen("Makefile.new", "w");
+ if (!out)
+ {
+ perror("Makefile.new");
+ return;
+ }
+
+ while (fgets(line, 1000, in))
+ {
+ if (starts_with(line, output_name)
+ && strcmp(line+oname_len, ": \\\n") == 0)
+ {
+ /* this is the old dependency */
+ while (fgets(line, 1000, in))
+ {
+ if (strcmp(line+strlen(line)-2, "\\\n"))
+ break;
+ }
+ }
+ else
+ fputs(line, out);
+ }
+ fclose(in);
+
+ for (one=file_list; one; one=one->next)
+ if (one->used)
+ {
+ used_something = 1;
+ break;
+ }
+
+ if (used_something)
+ {
+ fprintf(out, "%s:", output_name);
+ for (one=file_list; one; one=one->next)
+ if (one->used)
+ fprintf(out, " \\\n\t%s", one->filename);
+ fprintf(out, "\n");
+ }
+
+ fclose(out);
+
+ times.actime = st.st_atime;
+ times.modtime = st.st_mtime;
+ utime("Makefile.new", &times);
+
+ if (rename("Makefile", "Makefile.old"))
+ return;
+ if (rename("Makefile.new", "Makefile"))
+ rename("Makefile.old", "Makefile");
+}
+
+/*****************************************************************************/
+
+int
+main(argc, argv)
+ int argc;
+ char **argv;
+{
+ int i;
+ OneFile *one;
+ FILE *input_file;
+ int fix_makefile_flag = 0;
+
+ while (argc > 1 && argv[1][0] == '-')
+ {
+ if (strcmp(argv[1], "-h") == 0 || strcmp(argv[1], "--help") == 0)
+ {
+ show_help();
+ }
+ else if (strcmp(argv[1], "-i") == 0)
+ {
+ internal_flag = 1;
+ }
+ else if (strcmp(argv[1], "-m") == 0)
+ {
+ fix_makefile_flag = 1;
+ }
+ else if (strcmp(argv[1], "-d") == 0 && argc > 2)
+ {
+ scan_directory(argv[2]);
+ argc--;
+ argv++;
+ }
+ else if (strcmp(argv[1], "-o") == 0 && argc > 2)
+ {
+ output_name = argv[2];
+ argc--;
+ argv++;
+ }
+ else if (strcmp(argv[1], "-s") == 0 && argc > 2)
+ {
+ source_dir_prefix = argv[2];
+ argc--;
+ argv++;
+ }
+ else if (strcmp(argv[1], "-b") == 0 && argc > 2)
+ {
+ book_id = argv[2];
+ argc--;
+ argv++;
+ }
+
+ argc--;
+ argv++;
+ }
+
+ for (one=file_list; one; one=one->next)
+ {
+ scan_file(one);
+ }
+
+ input_file = fopen(argv[1], "r");
+ if (!input_file)
+ {
+ perror(argv[1]);
+ return 1;
+ }
+
+ if (output_name)
+ {
+ output_file = fopen(output_name, "w");
+ if (!output_file)
+ {
+ perror(output_name);
+ return 1;
+ }
+ }
+ else
+ {
+ output_file = stdout;
+ output_name = "<stdout>";
+ }
+
+ parse_sgml(input_file, argv[1]);
+
+ if (output_file != stdout)
+ fclose(output_file);
+
+ if (fix_makefile_flag)
+ fix_makefile(output_name);
+
+ return 0;
+}
diff --git a/winsup/doc/doctool.txt b/winsup/doc/doctool.txt
new file mode 100644
index 000000000..c89e39243
--- /dev/null
+++ b/winsup/doc/doctool.txt
@@ -0,0 +1,146 @@
+Doctool
+
+DJ Delorie <dj@cygnus.com>
+
+These are the instructions for using doctool. Yes, I should have
+written them *in* DocBook, but hey, I was in a hurry.
+
+OK, doctool is a program that gathers snippets of a docbook document and
+puts them all together in the right order. There are three
+places that it gets snippets from:
+
+1. The document that you tell it you want "finished"
+
+2. blocks of SGML in *.sgml files
+
+3. comments in source code
+
+The first of these is the template file, which is to say, it's a
+normal SGML file (sort of). This file is the first one read, and
+includes such things as your <book> tags etc. It contains commands to
+doctool to tell it where to put the other parts.
+
+The second, the *.sgml files, contain one or more blocks of SGML.
+To work with doctool, each of these snippets must begin and end
+with matching tags, must have an id="" attribute, and the start/end
+tags must begin at the beginning of the line. For example:
+
+<foo id="frob-45">
+ stuff goes here
+</foo>
+<bar id="frob-48">
+ stuff goes here
+</bar>
+
+In this example, the file contains two snippets, one marked by "foo"
+and one barked by "bar", with id's "from-45" and "from-48". Note that
+I made up the foo and bar tags. You'd usually use a <sect1> tag or
+something useful like that. Stuff outside the blocks is ignored.
+
+The third is simply an encapsulation of the second in comments, like this:
+
+/* DOCTOOL-START
+<foo id="frob-45">
+ stuff goes here
+</foo>
+DOCTOOL-END */
+
+The DOCTOOL-START and DOCTOOL-END things are special. Doctool uses
+those to know which parts of which comments are useful, and which
+parts are the useless source code stuff ;-)
+
+
+OK, so now we've got all these snippets of SGML floating around. What
+do we do with them? Well, inside the template document (#1 in our
+list up there) you'd put text snippets that said "ok, put them
+here". Each text snippet looks like this:
+
+DOCTOOL-INSERT-frob-
+
+Note that the "frob-" part tells doctool to pull in all the snippets
+with IDs that start with "frob-", in alphabetical (well, asciibetical
+at the moment) order. So, by saying "DOCTOOL-INSERT-frob-" you'd get
+all the "frob-*" snippets, like "frob-45" and "frob-48".
+
+If you just said DOCTOOL-INSERT-frob, it inserts the snippet named
+"frob" and no others.
+
+Note that no snippet will ever be inserted more than once, no matter
+how many DOCTOOL-INSERTs you have.
+
+There's two other tricks doctool has. If it finds a snippet with an ID
+like "int-*" (i.e. int-frob-45) that means that snippet of documentation
+is for the "internal" version only. The "int-" is discarded, and if
+the -i option is given to doctool, this snippet is treated as if the
+int- wasn't there. Without the -i, the int-* snippets are ignored
+completely.
+
+If a snippet has "add-" on it, like "add-frob-45", that's an addendum.
+Each time a snippet named without the add- is found, doctool looks for
+an addendum with exactly that same name (i.e. frob-45 looks for
+add-frob-45). If it finds any, it puts them just before the last line
+of the non-add snippet (so that it's *inside* the main snippet's
+block, not after it). Example:
+
+<sect1 id="frob-45">
+ some text
+</sect1>
+<sect1 id="add-frob-45">
+ more text
+</sect1>
+
+This would yield:
+
+<sect1 id="frob-45">
+ some text
+ more text
+</sect1>
+
+You should use the same outermost tags as the main snippet, but only
+because it sets the proper nesting rules for what's enclosed.
+
+You can use add- and int- at the same time, but always do add-int- and
+not int-add- (i.e. "add-int-frob-45").
+
+
+OK, now for doctool command line options.
+
+-m tells doctool to "fix" the Makefile (not makefile) to include the
+extra dependencies needed by the file you're generating. You need to
+manually include dependencies on the Makefile itself and the template
+file; doctool only includes the snippet files (sources etc) that it
+actually pulled content from. Note: this isn't perfect! Someone can
+come along and add a new snippet to a source file, and doctool would
+never know. Sometimes, it's best to just rebuild the docs all the
+time.
+
+-i means to include snippets with the "int-" prefix on their IDs. Use
+with -b to make internal and public versions from the same sources.
+
+"-d dir" tells doctool to scan all the files in that directory (and
+subdirectories, recursively) for files that might contain snippets of
+SGML. These include *.c, *.cc, *.h, and *.sgml. The idea is that
+most of the documentation would be in a *.sgml file named after the
+source (i.e. foo.c -> foo.sgml) but some commentary within the source
+might be useful in the docs as well. SGML files (*.sgml) do not need
+the DOCTOOL-START/END tags but the others do.
+
+-o sets the output file. Without -o, the file goes to stdout (ick).
+
+-s tells doctool to supress a "source directory prefix". What this
+means is that, in the generated output doctool puts comments that say
+where each snippet comes from (for debugging), which includes the full
+path sometimes, but if you use -s, you can tell doctool to cut off
+that prefix. For example,
+/usr/people/dj/src/cygnus/latest/devo/winsup/foo.c might get shortened
+to winsup/foo.c if you gave "-s
+/usr/people/dj/src/cygnus/latest/devo/". Cygnus makefiles could
+just use -s $(srcdir) most of the time.
+
+-b changes the ID for the <book> tag. db2html uses the <book> tag's
+ID as the default subdirectory name and/or html file name to create
+the book with. You'd need this to generate two books (internal vs
+public) from the same source.
+
+The only other thing you'd add to the command line is the ONE template
+file you want to pull in.
diff --git a/winsup/doc/faq.texinfo b/winsup/doc/faq.texinfo
new file mode 100644
index 000000000..7690088e4
--- /dev/null
+++ b/winsup/doc/faq.texinfo
@@ -0,0 +1,13 @@
+\input texinfo
+@title The Cygwin Project FAQ 20.2 for Release B20.1.
+@setfilename faq.txt
+
+@include what.texinfo
+@include sites.texinfo
+@include install.texinfo
+@include calls.texinfo
+@include how.texinfo
+@include relnotes.texinfo
+@include history.texinfo
+@include who.texinfo
+@include copy.texinfo
diff --git a/winsup/doc/fhandler-tut.txt b/winsup/doc/fhandler-tut.txt
new file mode 100644
index 000000000..52e08c768
--- /dev/null
+++ b/winsup/doc/fhandler-tut.txt
@@ -0,0 +1,83 @@
+fhandler tutorial
+
+This document will show how to add a new "fhandler" to cygwin, by
+showing an example of /dev/zero.
+
+Files to note:
+
+fhandler.h - must define a new derived class here and FH_*
+path.cc - to notice "/dev/zero" and mark it
+fhandler_zero.cc - new
+hinfo.cc - to create the fhandler instance
+
+OK, first we have to define what this new fhandler will do. In our
+example case, we're going to implement the unix "/dev/zero" device,
+which has the following characteristics:
+
+* writes to /dev/zero are silently discarded
+* reads from /dev/zero return all zero bytes
+* mmap()ing /dev/zero maps a chunk of zero'd out memory.
+
+Since windows doesn't have a device that acts like this, we'll be
+simulating everything. Thus:
+
+* writes simply return a success status
+* reads memset() the buffer and return success
+* we take advantage of the fact that CreateFileMapping can take a
+ handle of -1, which (1) maps swap memory, and (2) zeros it out for
+ us (at least, on NT).
+
+OK, let's start with fhandler.h.
+
+First, update the comment about which files are where. We're adding
+fhandler_dev_zero as FH_DEV_ZERO. We're adding this as a "fast"
+device (it will never block) so we have to adjust FH_NDEV also.
+
+Later in that file, we'll copy fhandler_dev_null and edit it to be
+fhandler_dev_zero. I chose that one because it's small, but we'll add
+more members as we go (since we're simulating the whole thing). In
+fact, let's copy the I/O methods from fhandler_windows since we'll
+need all those anyway, even though we'll go through the full list
+later.
+
+OK, next we need to edit path.cc to recognize when the user is trying
+to open "/dev/zero". Look in get_device_number; there's a long list
+of cases, just add one (I added one after "null"). Also remember to
+add an entry to the windows_device_names list in the right spot.
+
+To go along with that change, we'll need to change hinfo.cc. Look for
+FH_NULL and add a case for FH_ZERO as well.
+
+Now we get to fhandler_zero.cc itself. Create the empty file and copy
+the "usual" header/copyright/includes from some other fhandler_*.cc
+source file. Also, edit Makefile.in to build this new file. Add one
+new entry to DLL_OFILES, and a new line for the winsup.h dependencies.
+
+Since we changed fhandler.h, when you type "make" it will rebuild
+everything. Go ahead and do that when you get a chance to let it run,
+since we're not changing the headers any more. Note that you won't be
+able to link the new dll, as we haven't added all the methods for the
+new fhandler class yet, but at least you'll get a lot of compilation
+out of the way.
+
+Next we start adding in the fhandler methods themselves.
+
+Constructor: This takes a name, and all we do is pass that name back
+to the base class, along with the FH_ZERO value. We call set_cb
+because all fhandlers call this (it's for exec to copy the fd).
+
+open: we override the one that takes a name because there are no real
+windows devices like /dev/zero, but we ignore the name. We call
+set_flags to save the flags.
+
+write: writes are discarded; we return success.
+
+read: reads read NUL bytes, so fill the buffer with NULs and return
+success.
+
+lseek/close: just return success.
+
+dump: this is just for debugging, so we just print something.
+
+select_*: we don't support this yet, see the myriad examples in
+select.cc for examples. The base fhandler's methods will do for now.
diff --git a/winsup/doc/filemodes.sgml b/winsup/doc/filemodes.sgml
new file mode 100644
index 000000000..b0bac2eef
--- /dev/null
+++ b/winsup/doc/filemodes.sgml
@@ -0,0 +1,34 @@
+<sect1 id="using-filemodes"><title>File permissions</title>
+
+<para>On Windows 9x systems, files are always readable, and Cygwin uses the
+native read-only mode to determine if they are writable. Files are
+considered to be executable if the filename ends with .bat, .com or .exe, or
+if its content starts with #!. Consequently <command>chmod</command> can
+only affect the "w" mode, it silently ignores actions involving the other
+modes. This means that <command>ls -l</command>
+needs to open and read files. It can thus be relatively slow.</para>
+
+<para>Under NT, file permissions default to the same behavior as Windows
+9x but there is optional functionality in Cygwin that can make file
+systems behave more like on UNIX systems. This is turned on by adding
+the "ntea" option to the <EnVar>CYGWIN</EnVar> environment variable.</para>
+
+<para>When the "ntea" feature is activated, Cygwin will start with basic
+permissions as determined above, but can store POSIX file permissions in NT
+Extended Attributes. This feature works quite well on NTFS partitions
+because the attributes can be stored sensibly inside the normal NTFS
+filesystem structure. However, on a FAT partition, NT stores extended
+attributes in a flat file at the root of the partition called <filename>EA
+DATA. SF</filename>. This file can grow to extremely large sizes if you
+have a large number of files on the partition in question, slowing the
+system to a crawl. In addition, the <filename>EA DATA. SF</filename> file
+can only be deleted outside of Windows because of its "in use" status. For
+these reasons, the use of NT Extended Attributes is off by default in
+Cygwin. Finally, note that specifying "ntea" in <EnVar>CYGWIN</EnVar> has no
+effect under Windows 9x. </para>
+
+<para>Under NT, the test "[ -w filename]" is only true if filename is
+writable across the board, e.g. <command>chmod +w filename</command>. </para>
+
+</sect1>
+
diff --git a/winsup/doc/gcc.sgml b/winsup/doc/gcc.sgml
new file mode 100644
index 000000000..d13bba116
--- /dev/null
+++ b/winsup/doc/gcc.sgml
@@ -0,0 +1,78 @@
+<sect1 id="gcc"><title>Using GCC with Cygwin</title>
+
+<sect2 id="gcc-cons"><title>Console Mode Applications</title>
+
+<para>Use gcc to compile, just like under UNIX.
+Refer to the GCC User's Guide for information on standard usage and
+options. Here's a simple example:</para>
+
+<example>
+<title>Building Hello World with GCC</title>
+<screen>
+<prompt>C:\cygnus\&gt;</prompt> <userinput>gcc hello.c -o hello.exe</userinput>
+<prompt>C:\cygnus\&gt;</prompt> <userinput>hello.exe</userinput>
+Hello, World
+
+<prompt>C:\cygnus\&gt;</prompt>
+</screen>
+</example>
+
+</sect2>
+
+<sect2 id="gcc-gui"><title>GUI Mode Applications</title>
+
+<para>Cygwin allows you to build programs with full access to the
+standard Windows 32-bit API, including the GUI functions as defined in
+any Microsoft or off-the-shelf publication. However, the process of
+building those applications is slightly different, as you'll be using
+the GNU tools instead of the Microsoft tools.</para>
+
+<para>For the most part, your sources won't need to change at all.
+However, you should remove all __export attributes from functions
+and replace them like this:</para>
+
+<screen>
+int foo (int) __attribute__ ((__dllexport__));
+
+int
+foo (int i)
+</screen>
+
+<para>For most cases, you can just remove the __export and leave it at
+that. For convenience sake, you might want to include the following
+code snippet when compiling GUI programs. If you don't, you will want
+to add "-e _mainCRTStartup" to your link line in your Makefile.</para>
+
+<screen>
+#ifdef __CYGWIN__
+WinMainCRTStartup() { mainCRTStartup(); }
+#endif
+</screen>
+
+<para>The Makefile is similar to any other UNIX-like Makefile,
+and like any other Cygwin makefile. The only difference is that you use
+<command>gcc -mwindows</command> to link your program into a GUI
+application instead of a command-line application. Here's an example:</para>
+
+<screen>
+myapp.exe : myapp.o myapp.res
+ gcc -mwindows myapp.o myapp.res -o $@
+
+myapp.res : myapp.rc resource.h
+ windres $< -O coff -o $@
+</screen>
+
+<para>Note the use of <filename>windres</filename> to compile the
+Windows resources into a COFF-format <filename>.res</filename> file.
+That will include all the bitmaps, icons, and other resources you
+need, into one handy object file. Normally, if you omitted the "-O
+coff" it would create a Windows <filename>.res</filename> format file,
+but we can only link COFF objects. So, we tell
+<filename>windres</filename> to produce a COFF object, but for
+compatibility with the many examples that assume your linker can
+handle Windows resource files directly, we maintain the
+<filename>.res</filename> naming convention. For more information on
+<filename>windres</filename>, consult the Binutils manual. </para>
+
+</sect2>
+</sect1>
diff --git a/winsup/doc/gdb.sgml b/winsup/doc/gdb.sgml
new file mode 100644
index 000000000..732004f49
--- /dev/null
+++ b/winsup/doc/gdb.sgml
@@ -0,0 +1,88 @@
+
+<sect1 id="gdb"><title>Debugging Cygwin Programs</title>
+
+<para>When your program doesn't work right, it usually has a "bug" in
+it, meaning there's something wrong with the program itself that is
+causing unexpected results or crashes. Diagnosing these bugs and
+fixing them is made easy by special tools called
+<emphasis>debuggers</emphasis>. In the case of Cygwin, the debugger
+is GDB, which stands for "GNU DeBugger". This tool lets you run your
+program in a controlled environment where you can investigate the
+state of your program while it is running or after it crashes.
+Crashing programs sometimes create "core" files. In Cygwin these are
+regular text files that cannot be used directly by GDB.
+</para>
+
+<para>Before you can debug your program, you need to prepare your
+program for debugging. What you need to do is add
+<literal>-g</literal> to all the other flags you use when compiling
+your sources to objects.</para>
+
+<example><title>Compiling with -g</title>
+<screen>
+<prompt>$</prompt> gcc -g -O2 -c myapp.c
+<prompt>$</prompt> gcc -g myapp.c -o myapp
+</screen>
+</example>
+
+<para>What this does is add extra information to the objects (they get
+much bigger too) that tell the debugger about line numbers, variable
+names, and other useful things. These extra symbols and debugging
+information give your program enough information about the original
+sources so that the debugger can make debugging much easier for
+you.</para>
+
+<para>In Windows versions of GNUPro, GDB comes with a full-featured
+graphical interface. In Cygwin Net distributions, GDB is only
+available as a command-line tool. To invoke GDB, simply type
+<command>gdb myapp.exe</command> at the command prompt. It will
+display some text telling you about itself, then
+<literal>(gdb)</literal> will appear to prompt you to enter commands.
+Whenever you see this prompt, it means that gdb is waiting for you to
+type in a command, like <command>run</command> or
+<command>help</command>. Oh <literal>:-)</literal> type
+<command>help</command> to get help on the commands you can type in,
+or read the <citation>GDB User's Manual</citation> for a complete
+description of GDB and how to use it.</para>
+
+<para>If your program crashes and you're trying to figure out why it
+crashed, the best thing to do is type <command>run</command> and let
+your program run. After it crashes, you can type
+<command>where</command> to find out where it crashed, or
+<command>info locals</command> to see the values of all the local
+variables. There's also a <command>print</command> that lets you look
+at individual variables or what pointers point to.</para>
+
+<para>If your program is doing something unexpected, you can use the
+<command>break</command> command to tell gdb to stop your program when it
+gets to a specific function or line number:</para>
+
+<example><title>"break" in gdb</title>
+<screen>
+<prompt>(gdb)</prompt> break my_function
+<prompt>(gdb)</prompt> break 47
+</screen>
+</example>
+
+<para>Now, when you type <command>run</command> your program will stop
+at that "breakpoint" and you can use the other gdb commands to look at
+the state of your program at that point, modify variables, and
+<command>step</command> through your program's statements one at a
+time.</para>
+
+<para>Note that you may specify additional arguments to the
+<command>run</command> command to provide command-line arguments to
+your program. These two cases are the same as far as your program is
+concerned:</para>
+
+<example><title>Debugging with command line arguments</title>
+<screen>
+<prompt>$</prompt> myprog -t foo --queue 47
+
+<prompt>$</prompt> gdb myprog
+<prompt>(gdb)</prompt> run -t foo --queue 47
+</screen>
+</example>
+
+
+</sect1>
diff --git a/winsup/doc/history.texinfo b/winsup/doc/history.texinfo
new file mode 100644
index 000000000..2d5c4c0e8
--- /dev/null
+++ b/winsup/doc/history.texinfo
@@ -0,0 +1,667 @@
+@chapter History
+
+@include changes.texinfo
+
+@section Release Beta 19 (Feb 26 1998)
+
+This is a major release. It includes a much-updated version of the
+Cygwin32 library. Because the Cygwin API has changed in incompatible
+ways, the dll has been renamed cygwinb19.dll to avoid invalidating
+previously built executables.
+
+Note that a B19-compiled application exec()ing a B18-compiled
+application will treat the B18-compiled executable as an ordinary
+Win32 executable. This means that open file descriptors and some other
+internals will not be inheritted on exec() calls. The reason for this
+is that different shared memory areas are used by the different versions
+of the cygwin library. This may or may not be of importance to you
+depending on what you're doing.
+
+The Beta 19 release of the Cygwin32 library continues to be licensed
+under the GNU General Public License (GPL).
+
+The PE format definition used by the compiler tools now matches
+Microsoft's more closely. This should allow better interoperability
+with other vendors' development tools although more work probably
+remains to be done in this area. This change invalidates all previously
+built object (.o) and static library (.a) files so be sure to
+delete/rebuild old .o and .a files you are using!
+
+Finally, old symlinks are invalidated by this release. The "system"
+attribute is now used to mark symlinks which significantly speeds
+up fstat and other file related calls. Either recreate old ones or
+set their "system" attribute flag so they will be recognized properly.
+
+The new installer takes care of all environment variable settings
+automatically by installing a shortcut in program files that pulls
+up a bash prompt with all the correct environment variables set.
+As a result, the setup process should be much cleaner than in the last
+release.
+
+For those of you who end up moving the tools around, the batch file
+that sets up the default environment is called cygnus.bat and is
+installed in the root of the install directory. Because the tools have
+been compiled to install in /cygnus/b19, when installed in this
+location, the tools should "just work" if the bin directory is in your
+path (no special environment variables are needed). The only exception
+is MAKE_MODE which needs to be set if you want to get ordinary Unix-like
+make behavior -- see the make notes below for more information.
+
+@subsection Changes in specific tools:
+
+Ian Lance Taylor has written a resource compiler called "windres".
+It can be used to compile windows resources from a textual rc file
+into a COFF file. The sources are in the binutils subdirectory of
+the sources.
+
+We have upgraded many of the utilities. Beta 19 includes bash 2.01.1,
+fileutils 3.16, gawk 3.0.3, patch 2.5, shellutils 1.16, tar 1.12,
+textutils 1.22, and texinfo 3.11. Bash under Cygwin32 now includes
+working job control among other improvements.
+
+The sh executable is now ash 0.2 from the Debian Linux distribution.
+Using this more minimal shell as /bin/sh.exe speeds up configures
+significantly.
+
+Bison 1.25 has been added.
+
+Tcl/tk are upgraded to version 8.0. Compatible versions of tix and
+itcl have been added. These all include Cygwin32-compatible configury
+files so you can do a Unix-style build of the Win32 ports of tcl/tk.
+
+Expect 5.21.3 is included and basically works.
+
+The binaries have been compiled with i686 optimizations turned on
+which may result in a speed increase on Pentium-based systems
+although the tools should work on i386 and later chips.
+
+The linker (ld) has been enhanced -- it will now add the idata3
+terminator automatically when linking dlls.
+
+kill now supports signal names in arguments. ps now shows process
+start time information.
+
+Although the default install of the tools should hide this detail, the
+make utility now defaults to a Win32 mode which uses cmd.exe/command.com
+as the subshell. This mode allows the use of backslashes in filenames.
+To build Unix programs, you need to set the MAKE_MODE environment
+variable to "UNIX". This way you will get the old behavior of using
+sh.exe as the subshell.
+
+@subsection Changes in the Cygwin32 API (cygwin.dll):
+
+The interface is now better defined. It contains libc, libm, and
+Unix compatability calls. It no longer contains exports for libgcc.a.
+This should result in a more stable interface. See the calls.texinfo
+document for interface documentation.
+
+There is now only one environment variable called CYGWIN32 that controls
+the overall behavior of the dll:
+
+ set CYGWIN32=[no]title [no]strip_title [no]binmode [no]glob
+ strace=mask:cache,file [no]tty
+
+So if you "set CYGWIN32=title tty", then you would get tty support
+(see below) and have the current running process listed in the title
+bar.
+
+B19 adds support for:
+
+* tty and pseudo-tty devices. For now, ttys default to off because
+taking over the console causes problems with using non-Cygwin console
+programs in a Cygwin console. To turn it on, set the environment
+variable CYGWIN32 to include "tty".
+* Hard links (requires NT on an NTFS filesystem). When not possible (on
+non-NTFS filesystems), link() will make a copy of the file in question
+as it has done in previous releases.
+* The SIGWINCH signal. If tty handling is enabled then the process will
+receive a SIGWINCH signal when the screen size changes.
+* Additional terminal escape sequences recognized: scroll region setting via
+<ESC>[n1;n2r and setting the console title using xterm escape sequence:
+<ESC>]2;new title^G .
+
+The following calls have been added:
+
+* ptsname, grantpt, unlockpt
+* login, logout, ttyslot, ctermid
+* cfgetispeed, cfgetospeed, cfsetispeed, cfsetospeed
+* setitimer, getitimer, ftime, tzset
+* wait3, wait4, pause, sigpause
+* getpgid, killpg, setegid (stub)
+* strlwr, strupr
+* sexecve, sexecl, sexecle, sexeclp, sexeclpe, sexecv, sexecp, sexecvpe
+* rcmd, rresvport, rexec
+* strsignal, strtosigno
+* dlopen, dlsym, dlclose, dlerror
+* inet_netof, inet_makeaddr
+* socketpair
+* fpathconf, realpath, chroot (stub)
+* initgroups (stub), getgroups
+* random, srandom
+
+The following calls have been removed:
+
+* ScreenCols, ScreenGetCursor, ScreenRows, ScreenSetCursor
+* getkey, kbhit
+* crypt (stub)
+* all libgcc.a exports
+
+The Winsock dll (wsock32.dll) is no longer implicitly linked into
+the Cygwin32 dll. Instead, it is explicitly loaded with LoadLibrary
+the first time a process calls a Cygwin32 networking function. This
+speeds up most processes significantly (configures by about 20%).
+
+The signal-related code has been rewritten from scratch. Ditto for
+most of the path handling code.
+
+The globbing and getopt code has been replaced with BSD-derived
+code. The regexp code has been replaced with Henry Spencer's PD
+implementation.
+
+Doug Lea's malloc is now being used as the default malloc exported by
+cygwin. This malloc balances speed and compactness very nicely but is
+more unforgiving when attempts are made to free already freed memory,
+i.e., a segmentation violation will occur.
+
+The bsearch call has been rewritten.
+
+Alt Gr-key behavior has been changed in this release. The left alt-key
+still produces ESC-key sequence. The right alt (Alt Gr)-key now
+produces characters according to national keyboard layouts.
+
+Processes no longer write their name in the title bar unless you include
+"title" in the CYGWIN32 environment variable (see above).
+
+Multiple cygwin.dlls no longer use the same memory space unless they are
+identical (built at the same time). This allows multiple dlls with
+incompatible shared memory usage to be run simultaneously. It also
+facilitates debugging a buggy cygwin.dll. By keeping only a single copy
+of the latest cygwin.dll on your system, you can be assured of having
+all cygwin processes exist in the same shared memory space.
+
+The slash mount no longer defaults to C:. It now defaults to the
+system drive letter (where the OS is installed).
+
+The standard dl* dynamic library loader functions are now available.
+Cygwin32 B19 now correctly copies data after a fork and automatically
+reloads any DLLs loaded in the parent process. In addition, dlls will
+now be correctly initialized when loaded and global constructors will
+be called. Global destructors will be called when the DLL is detached.
+Handles gotten from dlopen or dlsym in the parent will be accessible in a
+forked child. The LD_LIBRARY_PATH environment variable is used in the dlopen
+search.
+
+Include the file <cygwin32/cygwin_dll.h> in a cygwin32 created .dll and
+use the line DECLARE_CYGWIN_DLL(dll-entry-point) to produce .dlls that
+can be used with these functions.
+
+@section Release Beta 18 (May 6 1997)
+
+This is a major release. The new cygwin.dll is still
+backwards-compatible with previously linked applications but
+contains significant changes.
+
+We have completely changed the installation process to make
+use of an InstallShield5-based installer. This should reduce the
+number of installation problems people have experienced in the
+past. However, it is still necessary to set environment variables
+by hand, as explained in the README.txt accompanying the distribution.
+(Future gnu-win32 installers may include the capability to do this
+automatically).
+
+@subsection Changes in specific tools:
+
+GCC compilation times have been improved by 20-30% by using spawn()
+instead of fork().
+
+GCC accepts both Win32 and POSIX paths/path lists in its
+environment variables (COMPILER_PATH, LIBRARY_PATH, C_INCLUDE_PATH,
+CPLUS_INCLUDE_PATH, OBJC_INCLUDE_PATH)
+
+GDB comes with a tcl/tk-based GUI (gdbtk). You can still invoke the
+command line gdb by invoking it with "gdb -nw".
+
+Bash verifies that /tmp exists and is a directory upon startup.
+It complains if this isn't the case.
+
+Running gcc or ld with "-s" used to create invalid executables.
+The bug in bfd that was responsible for this has been fixed.
+
+The conflict between String.h and string.h (and other such pairs
+of header files) where you include one and get the other has been
+fixed.
+
+The top level install-sh script tries to install foo.exe if asked
+to install foo when foo's not present. This fixes many installs
+of Unix software.
+
+Dlltool has preliminary support for the IMPORT declaration in .def files
+when invoked with -I. Feel free to experiment with it but once this
+functionality is tested more extensively this flag may go away.
+
+Time is upgraded to version 1.7.
+
+Make is upgraded to version 3.75.
+
+Make accepts both Win32 and POSIX path lists in the VPATH variable.
+
+@subsection Changes in the Cygwin32 API (cygwin.dll):
+
+The following is now supported:
+
+* UNC paths
+* Reverse index escapes in console code
+* Blocking select()s on a combination of sockets/handles
+* Directory symlinks.
+* Reparenting of child processes.
+
+The following calls have been added:
+
+* mmap(), mprotect(), msync(), munmap(). fork() changed to support these.
+* fsync(), statfs(), fstatfs().
+* getprotobynumber() and getservbyport().
+* get_osfhandle(), cwait().
+* spawnl(), spawnle(), spawnlp(), spawnlpe(), spawnv(), spawnve(),
+spawnvp(), spawnvpe().
+* nice().
+* sigpending(), sigsuspend()
+* Under NT only, chown(), getgrgid(), getgrnam(), endgrent(), getgrent(),
+setpwend(), getpwent(), endpwent(). Win95 still has these as stubs.
+
+Significantly better signals / exception handling support added.
+The kill signal works much better now (control-C works in bash).
+
+Shell scripts now run the shell specified after the #! instead of
+always defaulting to /bin/sh.
+
+Floating point registers are now properly initialized in the crt0.o.
+
+Opening non-disk files such as com ports no longer check to see
+if they are symlinks or executables.
+
+The console title now is set to the name of the running process.
+
+Winsock is now initialized upon app startup.
+
+Moved reent_data from private address space to cygwin.dll.
+
+The system() call now invokes spawnvp() instead of fork()/exec().
+
+Support for NT extended attributes has been added but is disabled
+for now because it slowed things down too much. We want to use them to
+remember info about symlink and executable status of files.
+
+Under NT only, utilities mkpasswd and mkgroup can generate a valid
+/etc/passwd and /etc/group.
+
+Earlier releases stored mount points in the registry under
+"Cygnus Support". This changed to "Cygnus Solutions" starting
+with beta 18. Either use a registry editor (regedit under NT)
+to rename the old entry or just redo your mount points and the
+cygwin.dll will automatically create the new one for you.
+
+Mount points can now be up to MAX_PATH in length instead of 30
+characters.
+
+@section Release Beta 17.1 (Dec 10 1996)
+
+A patch has been applied to make Win 95 configure work again.
+
+ld has been changed to make "a.exe" be the default executable name.
+
+@section Release Beta 17 (Dec 7 1996)
+
+It is now possible to rebuild the tools natively under x86 NT when
+the full Cygnus Developers' Kit (CDK) and the User Tools are both
+installed correctly.
+
+While the cygwin.dll underwent substantial changes, none of them
+prevent you from using previously built applications The new dll
+is compatible with beta 16 to the best of our knowledge. Beta 14-built
+programs will continue to fail with the beta 17 dll -- you will have to
+relink them before they will work.
+
+The winsup files that make up the Cygwin32 API are now under the
+GNU General Public License. See the accompanying press release
+for more information.
+
+@subsection Changes in specific tools:
+
+Gcc now links by default against -lkernel32 and also against
+-luser32 -lgdi32 -lcomdlg32 when mwindows is set. Another major
+change is that when creating an executable, gcc will now create
+foo.exe when given a -o argument of foo.
+
+Dlltool has patches to make it better handle the --subsystem argument
+that allows choosing console vs. GUI among other options.
+ld has been changed to have a much larger stack reserve size. This
+is necessary when rebuilding the toolchain natively under NT.
+
+The C++ headers can now be found given a correctly set GCC_EXEC_PREFIX
+environment variable.
+
+New versions of fileutils and make are included. Findutils has been
+added.
+
+@subsection Changes in the Cygwin32 API (cygwin.dll):
+
+Scott Christley's headers and def files for the standard Win32 dlls
+have been integrated. Anything present only in the previous Cygnus headers
+has been added in the appropriate places. There are placeholder files
+with the standard Win32 header names that pull in our headers so
+programs that try to include specific headers should continue to work.
+Having more complete headers should make Win32 native programming
+easier.
+
+Select has been rewritten from scratch. The new one can deal with
+all sockets, handles and sockets always ready, all handles. Handles
+and sockets with timeout not implemented yet. Select now does
+blocking and doesn't spin cpu.
+
+File handling has been largely rewritten:
+The fhandler array has been moved into local memory instead of shared
+memory. This makes a number of things behave better. Lots of changes
+to support this. There is now fairly complete ansi/vt100 console support.
+Some new file locking support has been added. Arrow keys are now
+supported.
+
+Process handling much improved.
+
+Significant serious bugs in fork() fixed.
+
+The system() call now works.
+
+unlink() now chmods read-only files to writable before attempting to
+delete a file. This fixes the outstanding problem where rm can't
+delete read-only files saying "out of queue slots" repeatedly.
+
+Text mode read has been rewritten.
+
+New syslog code allows logging to event log under NT, file under Win 95.
+
+Symlinks are enabled.
+
+readv() and writev() have been written and exported.
+
+For MS compatibility, we now export functions in the dll as _funcname
+in addition to funcname. I would suggest not making use of this fact
+unless you are building code that already accesses C library calls
+in this way.
+
+Almost all of the source code is now in C++ files.
+
+@section Release Beta 16 (Aug 30 1996)
+
+Path handling has been completely rewritten. To refer to drive Q: in
+bash, you can now refer to //q/. Alternatively, type "mount Q: /q" to
+have drive Q: show up as /q.
+
+We now pass the Plum Hall positive C conformance tests on the
+i386 under Windows 95 and NT 4.0b2.
+
+Fork was previously not accessible inside the dll. This is no
+longer the case which should allow us to add working system and popen
+calls.
+
+getdomainname works (it used to just return "cygnus.com") by getting
+information from registry.
+
+Fixed readdir bug that set errno improperly. This fixed the problem
+with diff not working across directories.
+
+Better error checking in signal functions. Initialize winsock in
+cygwin32_socket with checkinit call (fixes bug that required calling any
+function that did this first).
+
+New functions: sigaddset, sigismember, sigfillset, sigemptyset.
+
+Removed extra underscores present in sysdef files.
+
+There is a now a major and a minor version number associated with
+the cygwin.dll. The major number changes only when incompatible changes
+are made, the minor number changes when significant changes are made
+to the dll that don't require relinking of old apps.
+
+Changed value of HZ in include/sys/param.h to correct value of 1000.
+(Fixes bug people reported about "time sleep 5" returning 50).
+
+Assorted exception handling fixes for both i386 and ppc processors.
+
+Assorted time-related fixes required for Cygnus Kerberos work.
+New time functions: gmtime, corelocaltime
+
+Assorted spawn and fork fixes.
+
+Pseudo-Unix process handling added -- new ps and kill commands added
+
+Control-Z's are now handled as a valid EOF token in files opened as
+text.
+lseek now always operates in binary mode.
+
+Select revamped.
+
+Various other changes. For more detailed information, consult the file
+in the source code winsup/ChangeLog.
+
+Preprocessor define scheme changed. Apps should now use _WIN32
+instead of __WIN32__ to check for access to Win32 API and __CYGWIN32__
+to check for presence of the Cygwin32 environment.
+
+We are no longer including GNU findutils, GNU dbm, GNU bison,
+GNU less, ncurses, ftp, finger, rcl, cvtres, or V. This may or may not
+change in the future.
+
+You must relink old apps you built with prior releases with the new
+cygwin.dll.
+
+@section Release Beta 14 (April 10 1996)
+
+Some bugs have been fixed. GDBM and m4 are in the release. GCC now
+uses the standard install directories for cc1 etc.
+
+A port of V to gnu-win32 is included. You can now write graphics
+applications which will run on Unix or Windows unchanged. Some parts of
+V work on the PPC too.
+
+If you call any programs from the standard DOS shell, then the DLL will
+expand all the wildcards (glob) found in the arguments on the command
+line. So ls *.exe will do what you think it should, even if you're not
+in bash.
+
+ncurses and less are included. The DLL's emulation of a vt100 isn't complete,
+so ncurses doesn't do all that it should. Hence less is more or less
+useless. This can be fixed with a new DLL. (If you want to use
+something which uses curses, be sure to set your TERM and HOME
+envirionment variables)
+
+If you leave out main, then the libraries will try and call WinMain in the
+usual way.
+
+^C works much better on Windows 95. It's still not quite right, but at
+least most times it quits what you're doing, and most times doesn't
+crash your machine.
+
+You can start more than one concurrent bash session.
+
+Some networking support has been added. Even though telnet.exe is provided,
+I know that it doesn't work, so please don't send me bug reports.
+
+You will have to relink your applications to go with the new DLL.
+
+The DLL is released in its own .zip file too, so you don't have to
+download a load of other stuff if you dont want to.
+
+@section Release Beta 13 (Feb 9 1996)
+
+Files are opened in binary mode, unless the registry is fiddled with.
+
+The `cat >foo <<EOF bug is fixed.
+
+The symlink cookie has changed, so old links wont work any more.
+
+Two resource tools are provided (untested).
+
+More windows header files are provided. WxWindows almost compiles.
+
+You can get to a raw floppy with `/dev/fd0 or `/dev/fd1.
+
+You can have two filenames with the same name and different case in
+the same directory.
+
+Stat now fills in the st_nlink field for directories, so find works
+better.
+
+This version is much more stable than any previous version, and will
+stay running long enough to configure and build itself on my NT box.
+
+This version is also available in PowerPC versions. The PowerPC
+compiler doesn't do stack probing, so some applications won't work, or
+they'll only work on some input data - e.g. the demo "hello world" will
+compile, but gcc will crash compiling the dhrystone benchmark.
+
+There's a new registry variable "fmode=binary" which controls
+whether the tools always open files in binary mode (unless overridden
+with O_TEXT), or always open files in text mode (unless overridden with
+O_BINARY).
+
+Filesystems can be mounted with the mixed_case flag. This allows
+you to use filenames with the same spelling, but different case in the
+same directory.
+
+I haven't tested or even used some of the packages that I've
+provided. I compiled them, and then fixed the obvious "the file should
+have been opened in binary mode" problems.
+
+I've already had reports of some of it not working correctly on
+Windows 95. I don't have a simple to use Windows 95 configuration, but
+when I did try "it worked for me". This may be another manifestation
+of the bug which makes bash hang sometimes under NT.
+
+@section Release Beta 12 (Jan 3 1996)
+
+You can call non- gnu-win32 applications from bash.
+
+You can mount other directories using the @code{mount} command.
+
+Minimal ANSI terminal emulation included.
+
+Packages split into smaller and more logical lumps.
+
+/d<name> mechanism gone.
+
+Initial support for the PowerPC added.
+
+@section Release Beta 11 (Jan 3 1996)
+
+Something broke on the way to the ftp site.
+
+@section Release Beta 10 (Dec 5 1995)
+
+You can pass environment variables around in bash.
+
+Lots more stuff provided precompiled.
+
+Diffs to standard FSF release provided.
+
+It self-hosts.
+
+It supports symbolic links.
+
+The directory layout has changed to be more unix like.
+
+The way that you get to non-c drives is new - i:\foo.cc
+is now /di/foo.cc
+
+Nasty bug found and fixed in fork.
+
+CPP will now search the directories you supply in env names.
+
+@section Release Beta 9
+
+I've put all of libc and libm into a shared library,
+This drastically reduces the size of some binaries.
+e.g., ls goes from 82,949 bytes to 26,624.
+"Hello World" is 2564 bytes long.
+This is the first stage in greatly speeding up
+some of the stuff that's going on behind the curtain.
+
+Different processes communicate using shared memory.
+
+Some trivial use of the registry is made.
+
+DLLTOOL is now *much* faster.
+
+Some small problems have been fixed in the way that DLLs were
+layed out.
+
+@section Release Beta 8
+
+GDB works.
+
+GCC now emits debug info which can make **huge** executables
+Fortunately, strip works too.
+
+More work has been done to make quoting work.
+
+Simple termios support added to newlib.
+
+Much nicer way of describing paths, eg //c/foo is c:\foo.
+
+@section Release Beta 7
+
+Works again on Win 95 (which is why -6 wasn't advertised).
+
+Permissions are faked better.
+
+Source of demos available without having to ftp the entire win32
+binary tree.
+
+@section Release Beta 6
+
+Can now generate DLLs, tiny demo included.
+tcl, byacc, fileutils, diff, make included.
+
+@section Release Beta 5
+
+Bug preventing anything from running on recent versions
+of Win95 fixed.
+
+vfork and exec oddities fixed.
+
+Import libraries are now really libraries and not
+just .o files.
+
+Debugging info stripped from images and libraries;
+it's just bloat until gdb works.
+
+I've filled in the four major import libraries.
+
+The win*.h files are now installed into <foo>/include
+rather that <foo>/include/sys, so more things will
+compile out of the box.
+
+@section Release Beta 4
+
+PE support is fixed. Programs run on
+NT 3.1, NT 3.5, NT 3.51 and Windows 95.
+
+You can build GUI programs.
+
+.DEF files for three other DLL's started.
+
+New GUI demo program.
+
+C library distinguishes between text and binary files
+consequently the text files generated by the
+tools have the familiar ^M at the end of the line
+which DOS likes so much.
+
+Doug Evans of Cygnus has added a load
+of fancy support for execve, opendir and
+various other cool things.
+
+Exception handling is better.
+
+@section Release Beta 3
+
+Was so long ago we don't remember.
diff --git a/winsup/doc/how.texinfo b/winsup/doc/how.texinfo
new file mode 100644
index 000000000..9d8c405f1
--- /dev/null
+++ b/winsup/doc/how.texinfo
@@ -0,0 +1,1140 @@
+@chapter Question and Answers
+
+@section Where can I get more information?
+
+@subsection Where's the documentation?
+
+There are links to quite a lot of it on the main Cygwin project WWW page:
+@file{http://sourceware.cygnus.com/cygwin/}
+Be sure to at least read the Release Notes on the main WWW page, if
+there are any.
+
+Tool-specific documentation is available at:
+@file{http://www.cygnus.com/pubs/gnupro/}
+
+@subsection What Cygwin mailing lists can I join?
+
+To subscribe to the main list, send a message to
+cygwin-subscribe@@sourceware.cygnus.com. To unsubscribe from the
+main list, send a message to cygwin-unsubscribe@@sourceware.cygnus.com.
+In both cases, the subject and body of the message is ignored.
+
+Similarly, to subscribe to the Cygwin annoucements list, send a message
+to cygwin-announce-subscribe@@sourceware.cygnus.com. To unsubscribe,
+send a message to cygwin-announce-unsubscribe@@sourceware.cygnus.com.
+
+If you are going to help develop the Cygwin library by volunteering for
+the project, you will want to subscribe to the Cygwin developers list,
+called cygwin-developers. The same mechanism as described for the first
+two lists works for this one as well.
+
+There's an archive of the main mailing list at
+
+@file{http://sourceware.cygnus.com/ml/cygwin/}
+
+@subsection Why won't you/the mailing list answer my questions?
+
+Perhaps your question has an answer that's already in the FAQ.
+Perhaps nobody has time to answer your question. Perhaps nobody
+knows the answer...
+
+@section Installation and Setup
+
+@subsection Why is the install of the tools failing?
+
+If you are getting an error message saying "The decompression of
+%s failed. There may not be enough free disk space in the TEMP
+directory.", read on.
+
+InstallShield has a bug where it fails with this message if there
+are more than a certain number of files in your TEMP directory.
+You can also get this message if you have files in your TEMP dir
+named the same thing InstallShield wishes to name its files (probably
+from past runs of other InstallShield install scripts) which it cannot,
+for some reason, write over. Perhaps this will be fixed in a future
+release of InstallShield.
+
+Until then, clearing out your TEMP directory entirely should do it.
+That will get rid of any files with conflicting names and solve the
+"too many files" problem as well.
+
+@subsection Help! I haven't created /tmp and tools are behaving strangely!
+
+Many Unix tools (bash, byacc, etc.) expect that /tmp always exists.
+This is not guaranteed in Win32 land. You should create /tmp or "mount"
+the directory of your choice to /tmp to avoid this problem.
+
+@subsection Why does bash spew out "49054596: No such file or directory"?
+
+Are you sure you created a /tmp? The bash shell will print a
+warning if it doesn't find a /tmp directory.
+
+@subsection How do I set /etc up?
+
+If you want a valid /etc set up (so "ls -l" will display correct
+user information for example) and if you are running NT (preferably
+with an NTFS file system), you should just need to create the /etc
+directory on the filesystem mounted as / and then use mkpasswd and
+mkgroup to create /etc/passwd and /etc/group respectively. Since
+Windows 95/98's Win32 API is less complete, you're out of luck if
+you're running Windows 95/98.
+
+@subsection Bash says that it can't vfork (or just hangs). Why?
+
+Most often this is because it can't find itself in the path. Make sure
+that your path includes the directory where bash lives, before you start
+it.
+
+Also make sure you have a valid @code{/bin/sh.exe}. If you get errors
+like 'no such file or directory' when you're trying to run a shell
+script, which you know is there, then your problem is probably that bash
+can't find @code{/bin/sh}.
+
+@subsection How can I get bash to read my .bashrc file on startup?
+
+Your .bashrc is read from your home directory specified by the HOME
+environment variable. It uses /.bashrc if HOME is not set. So you need
+to set HOME correctly, or move your .bashrc to the top of the drive
+mounted as / in Cygwin.
+
+@subsection How can I get bash filename completion to be case insensitive?
+
+"shopt -s nocaseglob" should do the trick.
+
+@subsection Can I use paths/filenames containing spaces in them?
+
+Cygwin does support spaces in filenames and paths. That said, some
+utilities that use the library may not, since files don't typically
+contain spaces in Unix. If you stumble into problems with this, you
+will need to either fix the utilities or stop using spaces in filenames
+used by Cygwin tools.
+
+@subsection Why can't I cd into a shortcut to a directory?
+
+Cygwin does not follow MS Windows Explorer Shortcuts (*.lnk
+files) yet. It sees a shortcut as a regular file and this you
+cannot "cd" into it.
+
+Some people have suggested replacing the current symbolic link scheme
+with shortcuts. The major problem with this is that .LNK files would
+then be used to symlink Cygwin paths that may or may not be valid
+under native Win32 non-Cygwin applications such as Explorer.
+
+@subsection I'm having basic problems with find. Why?
+
+Make sure you are using the find that came with the Cygwin tools
+and that you aren't picking up the Win32 find command instead. You
+can verify that you are getting the right one by doing a "type find"
+in bash.
+
+@subsection Why don't cursor keys work under Win95/Win98?
+
+Careful examination shows that they not just non-functional, but
+rather behave strangely, for example, with NumLock off, keys on numeric
+keyboard work, until you press usual cursor keys, when even numeric
+stop working, but they start working again after hitting alphanumeric
+key, etc. This reported to happen on localized versions of Win98 and
+Win95, and not specific to Cygwin (there're known cases of Alt+Enter
+(fullscreen/windowed toggle) not working and shifts sticking with
+other programs). The cause of this problem is Microsoft keyboard
+localizer which by default installed in 'autoexec.bat'. Corresponding
+line looks like:
+
+@example
+keyb ru,,C:\WINDOWS\COMMAND\keybrd3.sys
+@end example
+
+(That's for russian locale.) You should comment that line if you want
+your keys working properly. Of course, this will deprive you of your
+local alphabet keyboard support, so you should think about
+another localizer. exUSSR users are of course knowledgable of Keyrus
+localizer, and it might work for other locales too, since it has keyboard
+layout editor. But it has russian messages and documentation ;-(
+Reference URL is http://www.hnet.ru/software/contrib/Utils/KeyRus/
+(note the you may need to turn off Windows logo for Keyrus to operate
+properly).
+
+@subsection Is it OK to have multiple copies of the DLL?
+
+It's a bad idea to have multiple versions of the cygwin DLL in
+your path. They often conflict in funny ways. If you have
+multiple versions, it's usually OK to get rid of (or rename)
+all the older versions, keeping only the newest one.
+
+It should be OK to have multiple copies of the *same* DLL
+in your path, though.
+
+@section Using Cygwin Releases
+
+@subsection Why aren't man, groff, etc. included in the betas?
+
+For obvious reasons, it isn't feasible for us to maintain and provide
+binary distributions of every tool ported to work with the Cygwin
+tools. However, it's likely that a man command will show up in a
+distribution soon.
+
+Many other tools have been ported and are referenced on the Cygwin web
+site. man, groff, info, and many many other packages are all
+available for download there.
+
+@subsection Where can I find "less"?
+
+The less pager binary is available for the first time in the 20.1
+release. You will get it if you upgrade. It is also available from
+various ftp locations on the Net. Search the mailing list archives for
+the details.
+
+@subsection Where can I find "more"?
+
+If you are looking for the "more" pager, you should use the "less" pager
+instead. See the last question and answer for more information.
+
+@subsection Where can I find "which"?
+
+While we don't include a which command, you can use the bash built
+in "type" command which does something fairly similar.
+
+@subsection How can I access other drives?
+
+The best way is to use the "mount" command to mount the drive letter so
+that you can refer to it with only single slashes:
+
+@example
+bash$ mkdir /c
+bash$ mount c:/ /c
+bash$ ls /c
+....
+@end example
+
+This is done with textual substitution whenever a file is opened.
+So if you're going to do @code{ls /c/bar} on a mount like the above
+the guts will turn that into @code{ls c:/bar}.
+
+Note that you only need to mount drives once. The mapping is kept
+in the registry so mounts stay valid pretty much indefinitely.
+You can only get rid of them with umount (or the registry editor).
+
+The '-b' option to mount mounts the mountpoint in binary mode where text
+and binary files are treated equivalently. This should only be
+necessary for badly ported Unix programs where binary flags are missing
+from open calls.
+
+Since the beta 16 release, we also support a special means of accessing
+other drive letters without using the @code{mount} command. This
+support may disappear in a future Cygwin release because of the
+collision between this scheme and UNC pathname support (one character
+machine names don't work currently).
+
+To do an "ls" on drive letter f:, do the following:
+
+@example
+bash$ ls //f/
+@end example
+
+Note that you can also access UNC paths in the standard way. Because of
+the drive letter shortcut mentioned above, machine names in UNC paths
+must be more than one character long.
+
+@subsection How can I copy and paste into Cygwin console windows?
+
+Under Windows NT, open the properties dialog of the console window.
+The options contain a toggle button, named "Quick edit mode". It must
+be ON. Save the properties.
+
+Under Windows 9x, open the properties dialog of the console window.
+Select the Misc tab. Uncheck Fast Pasting. Check QuickEdit.
+
+@subsection What does "mount failed: Device or resource busy" mean?
+
+This usually means that you are trying to mount to a location
+already in use by mount. For example, if c: is mounted as '/'
+and you try to mount d: there as well, you will get this error
+message. First "umount" the old location, then "mount" the new one and
+you should have better luck.
+
+If you are trying to umount '/' and are getting this message, you may
+need to run @code{regedit.exe} and change the "native" key for the '/'
+mount in one of the mount points kept under
+HKEY_CURRENT_USER/Software/Cygnus Solutions/CYGWIN.DLL setup/<version>
+where <version> is the latest registry version associated with the
+Cygwin library.
+
+@subsection How can I share files between Unix and Windows?
+
+During development, we have both Unix boxes running Samba and
+NT/Windows 95/98 machines. We often build with cross-compilers
+under Unix and copy binaries and source to the Windows system
+or just toy with them directly off the Samba-mounted partition.
+On dual-boot NT/Windows 9x machines, we usually use the FAT
+filesystem so we can also access the files under Windows 9x.
+
+@subsection Are mixed-case filenames possible with Cygwin?
+
+Several Unix programs expect to be able to use to filenames
+spelled the same way, but with different case. A prime example
+of this is perl's configuration script, which wants @code{Makefile} and
+@code{makefile}. WIN32 can't tell the difference between files with
+just different case, so the configuration fails.
+
+In releases prior to beta 16, mount had a special mixed case option
+which renamed files in such a way as to allow mixed case filenames.
+We chose to remove the support when we rewrote the path handling
+code for beta 16.
+
+@subsection What about DOS special filenames?
+
+Files cannot be named com1, lpt1, or aux (to name a few); either as
+the root filename or as the extension part. If you do, you'll have
+trouble. Unix programs don't avoid these names which can make things
+interesting. E.g., the perl distribution has a file called
+@code{aux.sh}. The perl configuration tries to make sure that
+@code{aux.sh} is there, but an operation on a file with the magic
+letters 'aux' in it will hang.
+
+@subsection When it hangs, how do I get it back?
+
+If something goes wrong and the tools hang on you for some reason (easy
+to do if you try and read a file called aux.sh), first try hitting ^C to
+return to bash or the cmd prompt.
+
+If you start up another shell, and applications don't run, it's a good
+bet that the hung process is still running somewhere. Use the Task
+Manager, pview, or a similar utility to kill the process.
+
+And, if all else fails, there's always the reset button/power switch.
+This should never be necessary under Windows NT.
+
+@subsection Why the weird directory structure?
+
+Why are cpp.exe, cc1.exe, etc., not in the bin directory?
+
+Why more than one lib and include directory?
+
+@smallexample
+H-i586-cygwin32\lib\gcc-lib\...\egcs-2.91.57\include
+x86-cygwin32\include
+x86-cygwin32\H-i586-cygwin32\i586-cygwin32\include
+@end smallexample
+
+This way multiple releases for different hosts and targets can all
+coexist in the same tree. H-i586-cygwin32 means hosted on
+i586-cygwin32, common files shared by all hosts are in the top level
+directories, target-specific files are in the
+H-i586-cygwin32/i586-cygwin32
+directory, etc...
+
+If you had a server sharing files to a ppc NT machine and an x86 NT
+machine, you could have both an H-i586-cygwin32 and an
+H-powerpcle-cygwin32 directory without having to duplicate the top level
+files that are the same for both hosts. If you built and installed an
+i586-cygwin32 x mips-elf cross-compiler, you would have an
+H-i586-cygwin32/mips-elf with its target-specific files and some
+mips-elf- prefixed binaries in H-i586-cygwin32/bin.
+
+Normally we also have another higher level directory that identifies the
+release. Then multiple Cygwin releases can coexist with different
+dll versions, giving:
+
+@smallexample
+cygnus/b19/H-i586-cygwin32
+cygnus/cygwin-b20/H-i586-cygwin32
+...
+@end smallexample
+
+In any case, this does add complexity to the directory structure but
+it's worth it for people with more complex installations.
+
+@subsection How do anti-virus programs like Cygwin?
+
+One person reported that McAfee VirusScan for NT (and others?) is
+incompatible with Cygwin. This is because it tries to scan the
+newly loaded shared memory in the cygwin.dll, which can cause fork()s
+to fail, wreaking havoc on many of the tools.
+
+@subsection Why can't I run bash as a shell under NT Emacs?
+
+Place the following code in your startup file and try again:
+
+@smallexample
+(load "comint")
+(fset 'original-comint-exec-1 (symbol-function 'comint-exec-1))
+(defun comint-exec-1 (name buffer command switches)
+ (let ((binary-process-input t)
+ (binary-process-output nil))
+ (original-comint-exec-1 name buffer command switches)))
+@end smallexample
+
+@subsection Where did the man/info pages go?
+
+In order to save space and download times, we have stopped providing
+the man/info files for the tools with the binary install since we are
+not yet providing a man page or info reader. Both types of
+documentation are available in a tar file available from the project ftp
+site. Or consult the online documentation over the WWW.
+
+@subsection Why can't B20's "cygcheck -s" find cpp?
+
+This is a confusingly worded warning that will be reworded in future
+versions. In fact, cygcheck should normally *not* find cpp; if it does,
+it may be a problem (e.g. it might pick up Borland's cpp, which would
+cause problems).
+
+@subsection Why do I get a message saying Out of Queue slots?
+
+"Out of queue slots!" generally occurs when you're trying to remove
+many files that you do not have permission to remove (either because
+you don't have permission, they are opened exclusively, etc). What
+happens is Cygwin queues up these files with the supposition that it
+will be possible to delete these files in the future. Assuming that
+the permission of an affected file does change later on, the file will
+be deleted as requested. However, if too many requests come in to
+delete inaccessible files, the queue overflows and you get the message
+you're asking about. Usually you can remedy this with a quick chmod,
+close of a file, or other such thing. (Thanks to Larry Hall for
+this explanation).
+
+@subsection Why don't symlinks work on samba-mounted filesystems?
+
+Symlinks are marked with "system" file attribute. Samba does not
+enable this attribute by default. To enable it, consult your Samba
+documentation and then add these lines to your samba configuration
+file:
+
+@smallexample
+ mask system = yes
+ create mask = 0775
+@end smallexample
+
+Note that the 0775 can be anything as long as the 0010 bit is set.
+
+@subsection Why does df report sizes incorrectly.
+
+There is a bug in the Win32 API function GetFreeDiskSpace that
+makes it return incorrect values for disks larger than 2 GB in size.
+Perhaps that may be your problem?
+
+@subsection Has the screen program been ported yet?
+
+Screen requires either unix domain sockets or fifoes. Neither of
+them have been implemented in Cygwin yet.
+
+@section Cygwin API Questions
+
+@subsection How does everything work?
+
+There's a C library which provides a Unix-style API. The
+applications are linked with it and voila - they run on Windows.
+
+The aim is to add all the goop necessary to make your apps run on
+Windows into the C library. Then your apps should run on Unix and
+Windows with no changes at the source level.
+
+The C library is in a DLL, which makes basic applications quite small.
+And it allows relatively easy upgrades to the Win32/Unix translation
+layer, providing that dll changes stay backward-compatible.
+
+For a good overview of Cygwin, you may want to read the paper on Cygwin
+published by the Usenix Association in conjunction with the 2d Usenix NT
+Symposium in August 1998. It is available in html format on the project
+WWW site.
+
+@subsection Are development snapshots for the Cygwin library available?
+
+Yes. They're made whenever anything interesting happens inside the
+Cygwin library (usually roughly on a nightly basis, depending on how much
+is going on). They are only intended for those people who wish to
+contribute code to the project. If you aren't going to be happy
+debugging problems in a buggy snapshot, avoid these and wait for a real
+release. The snapshots are available from
+http://sourceware.cygnus.com/cygwin/snapshots/
+
+
+@subsection How is the DOS/Unix CR/LF thing handled?
+
+Let's start with some background.
+
+In UNIX, a file is a file and what the file contains is whatever the
+program/programmer/user told it to put into it. In Windows, a file is
+also a file and what the file contains depends not only on the
+program/programmer/user but also the file processing mode.
+
+When processing in text mode, certain values of data are treated
+specially. A \n (new line) written to the file will prepend a \r
+(carriage return) so that if you `printf("Hello\n") you in fact get
+"Hello\r\n". Upon reading this combination, the \r is removed and the
+number of bytes returned by the read is 1 less than was actually read.
+This tends to confuse programs dependant on ftell() and fseek(). A
+Ctrl-Z encountered while reading a file sets the End Of File flags even
+though it truly isn't the end of file.
+
+One of Cygwin's goals is to make it possible to easily mix Cygwin-ported
+Unix programs with generic Windows programs. As a result, Cygwin opens
+files in text mode as is normal under Windows. In the accompanying
+tools, tools that deal with binaries (e.g. objdump) operate in unix
+binary mode and tools that deal with text files (e.g. bash) operate in
+text mode.
+
+Some people push the notion of globally setting the default processing
+mode to binary via mount point options or by setting the CYGWIN32
+environment variable. But that creates a different problem. In
+binary mode, the program receives all of the data in the file, including
+a \r. Since the programs will no longer deal with these properly for
+you, you would have to remove the \r from the relevant text files,
+especially scripts and startup resource files. This is a porter "cop
+out", forcing the user to deal with the \r for the porter.
+
+It is rather easy for the porter to fix the source code by supplying the
+appropriate file processing mode switches to the open/fopen functions.
+Treat all text files as text and treat all binary files as binary.
+To be specific, you can select binary mode by adding @code{O_BINARY} to
+the second argument of an @code{open} call, or @code{"b"} to second
+argument of an @code{fopen} call. You can also call @code{setmode (fd,
+O_BINARY)}.
+
+Note that because the open/fopen switches are defined by ANSI, they
+exist under most flavors of Unix; open/fopen will just ignore the switch
+since they have no meaning to UNIX.
+
+Also note that @code{lseek} only works in binary mode.
+
+Explanation adapted from mailing list email by Earnie Boyd
+<earnie_boyd@@yahoo.com>.
+
+@subsection Is the Cygwin library multi-thread-safe?
+
+No.
+
+There is an experimental configure option (--enable-threadsafe), which
+allows you to build a DLL with some additional "thread safety" but there
+are no guarantees that this is 100% operational. This option also
+enables limited "POSIX thread" support. See the file cygwin.din for the
+list of POSIX thread functions provided.
+
+Cygnus does not distribute a DLL with this option enabled, and,
+currently, has no plans to do so.
+
+Cygwin is not multi-thread-safe because:
+
+1) Newlib (out libc/libm) isn't reentrant (although it almost is).
+This would have to be fixed or we would have to switch to a libc/libm
+that is reentrant.
+
+2) Cygwin locks shared memory areas (shared by multiple processes),
+but the per-process data is not locked. Thus, different threads in a
+multi-threaded application would have access to it and give rise to
+nasty race-conditions.
+
+The Mingw package (what you get when you invoke gcc with -mno-cygwin) is
+multi-thread-safe because that configuration doesn't use Cygwin or
+newlib. Instead, it uses Microsoft libraries which are
+multi-thread-safe for the most part. So as long as the programmer
+avoids Microsoft APIs that aren't multi-thread-safe (most are ok), they
+should be fine.
+
+@subsection Why is some functionality only supported in Windows NT?
+
+Windows 9x: n.
+32 bit extensions and a graphical shell for a 16 bit patch to an
+8 bit operating system originally coded for a 4 bit microprocessor,
+written by a 2 bit company that can't stand 1 bit of competition.
+
+But seriously, Windows 9x lacks most of the security-related calls and
+has several other deficiencies with respect to its version of the Win32
+API. See the calls.texinfo document for more information as to what
+is not supported in Win 9x.
+
+@subsection How is fork() implemented?
+
+Cygwin fork() essentially works like a non-copy on write version
+of fork() (like old Unix versions used to do). Because of this it
+can be a little slow. In most cases, you are better off using the
+spawn family of calls if possible.
+
+Here's how fork works as of beta 18:
+
+Parent initializes a space in the Cygwin process
+table for child. Parent creates child suspended using Win32 CreateProcess
+call, giving the same path it was invoked with itself. Parent
+calls setjmp to save its own context and then sets a pointer to this
+in the Cygwin shared memory area (shared among all Cygwin tasks).
+Parent fills in the childs .data and .bss subsections by copying from
+its own address space into the suspended child's address space.
+Parent then starts the child. Parent waits on mutex for child to get
+to safe point. Child starts and discovers if has been forked and
+then longjumps using the saved jump buffer. Child sets mutex parent
+is waiting on and then blocks on another mutex waiting for parent to
+fill in its stack and heap. Parent notices child is in safe area,
+copies stack and heap from itself into child, releases the mutex
+the child is waiting on and returns from the fork call. Child wakes
+from blocking on mutex, recreates any mmapped areas passed to it via
+shared area and then returns from fork itself.
+
+@subsection How does wildcarding (globbing) work?
+
+If an application using CYGWIN.DLL starts up, and can't find the
+@code{PID} environment variable, it assumes that it has been started
+from the a DOS style command prompt. This is pretty safe, since the
+rest of the tools (including bash) set PID so that a new process knows
+what PID it has when it starts up.
+
+If the DLL thinks it has come from a DOS style prompt, it runs a
+`globber' over the arguments provided on the command line. This means
+that if you type @code{LS *.EXE} from DOS, it will do what you might
+expect.
+
+Beware: globbing uses @code{malloc}. If your application defines
+@code{malloc}, that will get used. This may do horrible things to you.
+
+@subsection How do symbolic links work?
+
+CYGWIN.DLL generates link files with a magic header. When
+you open a file or directory that is a link to somewhere else, it
+opens the file or directory listed in the magic header. Because we
+don't want to have to open every referenced file to check symlink
+status, Cygwin marks symlinks with the system attribute. Files
+without the system attribute are not checked. Because remote samba
+filesystems do not enable the system attribute by default, symlinks do
+not work on network drives unless you explicitly enable this
+attribute.
+
+@subsection Why do some files, which are not executables have the 'x' type.
+
+When working out the unix-style attribute bits on a file, the library
+has to fill out some information not provided by the WIN32 API.
+
+It guesses that files ending in .exe and .bat are executable, as are
+ones which have a "#!" as their first characters.
+
+@subsection How secure is Cygwin in a multi-user environment?
+
+Cygwin is not secure in a multi-user environment. For
+example if you have a long running daemon such as "inetd"
+running as admin while ordinary users are logged in, or if
+you have a user logged in remotely while another user is logged
+into the console, one cygwin client can trick another into
+running code for it. In this way one user may gain the
+priveledge of another cygwin program running on the machine.
+This is because cygwin has shared state that is accessible by
+all processes.
+
+(Thanks to Tim Newsham (newsham@@lava.net) for this explanation).
+
+@subsection How do the net-related functions work?
+
+The network support in Cygwin is supposed to provide the Unix API, not
+the Winsock API.
+
+There are differences between the semantics of functions with the same
+name under the API.
+
+E.g., the select system call on Unix can wait on a standard file handles
+and handles to sockets. The select call in winsock can only wait on
+sockets. Because of this, cygwin.dll does a lot of nasty stuff behind
+the scenes, trying to persuade various winsock/win32 functions to do what
+a Unix select would do.
+
+If you are porting an application which already uses Winsock, then
+using the net support in Cygwin is wrong.
+
+But you can still use native Winsock, and use Cygwin. The functions
+which cygwin.dll exports are called 'cygwin_<name>'. There
+are a load of defines which map the standard Unix names to the names
+exported by the dll -- check out include/netdb.h:
+
+@example
+..etc..
+void cygwin_setprotoent (int);
+void cygwin_setservent (int);
+void cygwin_setrpcent (int);
+..etc..
+#ifndef __INSIDE_CYGWIN_NET__
+#define endprotoent cygwin_endprotoent
+#define endservent cygwin_endservent
+#define endrpcent cygwin_endrpcent
+..etc..
+@end example
+
+The idea is that you'll get the Unix->Cygwin mapping if you include
+the standard Unix header files. If you use this, you won't need to
+link with libwinsock.a - all the net stuff is inside the dll.
+
+The mywinsock.h file is a standard winsock.h which has been hacked to
+remove the bits which conflict with the standard Unix API, or are
+defined in other headers. E.g., in mywinsock.h, the definition of
+struct hostent is removed. This is because on a Unix box, it lives in
+netdb. It isn't a good idea to use it in your applications.
+
+As of the b19 release, this information may be slightly out of date.
+
+@subsection I don't want Unix sockets, how do I use normal Win32 winsock?
+
+To use the vanilla Win32 winsock, you just need to #define Win32_Winsock
+and #include "windows.h" at the top of your source file(s). You'll also
+want to add -lwsock32 to the compiler's command line so you link against
+libwsock32.a.
+
+@subsection What version numbers are associated with Cygwin?
+
+There is a cygwin.dll major version number that gets incremented
+every time we make a new Cygwin release available. This
+corresponds to the name of the release (e.g. beta 19's major
+number is "19"). There is also a cygwin.dll minor version number. If
+we release an update of the library for an existing release, the minor
+number would be incremented.
+
+There are also Cygwin API major and minor numbers. The major number
+tracks important non-backward-compatible interface changes to the API.
+An executable linked with an earlier major number will not be compatible
+with the latest DLL. The minor number tracks significant API additions
+or changes that will not break older executables but may be required by
+newly compiled ones.
+
+Then there is a shared memory region compatibity version number. It is
+incremented when incompatible changes are made to the shared memory
+region or to any named shared mutexes, semaphores, etc.
+
+Finally there is a mount point registry version number which keeps track
+of non-backwards-compatible changes to the registry mount table layout.
+This has been "B15.0" since the beta 15 release.
+
+@subsection Why isn't _timezone set correctly?
+
+Did you explicitly call tzset() before checking the value of _timezone?
+If not, you must do so.
+
+@section Programming Questions
+
+@subsection Why is gcc failing?
+
+If the error is "gcc: installation problem, cannot exec `cpp':
+No such file or directory", the GCC_EXEC_PREFIX environment variable
+hasn't been set correctly. The current release does not need
+GCC_EXEC_PREFIX set -- it should be able to find cpp regardless of the
+install location. But if you have it set incorrectly, you may still
+see this message.
+
+@subsection Why can't bison find bison.simple or bison.hairy?
+
+If you are getting a warning to this effect, you need to set
+the BISONLIB environment variable. The value should be the directory
+in which bison.simple and bison.hairy are installed. This will be
+the path leading up to and including the @code{share} directory of
+the top-level of the binary distributions. For example, on some
+systems, you would want to set it to @code{C:/cygnus/cygwin-b20/share}.
+
+@subsection Why is make behaving badly?
+
+Starting with the beta 19 release, make defaults to a win32 mode in
+which backslashes in filenames are permitted and cmd.exe/command.com
+is used as the sub-shell. In this mode, escape characters aren't
+allowed among other restrictions. For this reason, you must set
+the environment variable MAKE_MODE to UNIX to run make on ordinary Unix
+Makefiles. Here is the full scoop:
+
+MAKE_MODE selects between native Win32 make mode (the default) and
+a Unix mode where it behaves like a Unix make. The Unix mode does
+allow specifying Win32-style paths but only containing forward slashes
+as the path separator. The path list separator character is a colon
+in Unix mode.
+
+Win32 mode expects path separators to be either / or \. Thus no
+Unix-style \s as escape are allowed. Win32 mode also uses
+cmd.exe/command.com as the subshell which means "copy" and "del"
+(and other shell builtins) will work. The path list separator
+character is semi-colon in Win32 mode. People who want an nmake-like
+make might want to use this mode but no one should expect Unix
+Makefiles to compile in this mode. That is why the default b19
+install sets MAKE_MODE to UNIX.
+
+@subsection Why the undefined reference to "WinMain@@16"?
+
+Try adding an empty main() function to one of your sources.
+
+@subsection How do I use Win32 API calls?
+
+It's pretty simple actually. Cygwin tools require that you explicitly
+link the import libraries for whatever Win32 API functions that you
+are going to use, with the exception of kernel32, which is linked
+automatically (because the startup and/or built-in code uses it).
+
+For example, to use graphics functions (GDI) you must link
+with gdi32 like this:
+
+gcc -o foo.exe foo.o bar.o -lgdi32
+
+or (compiling and linking in one step):
+
+gcc -o foo.exe foo.c bar.c -lgdi32
+
+The following libraries are available for use in this way:
+
+advapi32 largeint ole32 scrnsave vfw32
+cap lz32 oleaut32 shell32 win32spl
+comctl32 mapi32 oledlg snmp winmm
+comdlg32 mfcuia32 olepro32 svrapi winserve
+ctl3d32 mgmtapi opengl32 tapi32 winspool
+dlcapi mpr penwin32 th32 winstrm
+gdi32 msacm32 pkpd32 thunk32 wow32
+glaux nddeapi rasapi32 url wsock32
+glu32 netapi32 rpcdce4 user32 wst
+icmp odbc32 rpcndr uuid
+imm32 odbccp32 rpcns4 vdmdbg
+kernel32 oldnames rpcrt4 version
+
+The regular setup allows you to use the option -mwindows on the
+command line to include a set of the basic libraries (and also
+make your program a GUI program instead of a console program),
+including user32, gdi32 and, IIRC, comdlg32.
+
+Note that you should never include -lkernel32 on your link line
+unless you are invoking ld directly. Do not include the same import
+library twice on your link line. Finally, it is a good idea to
+put import libraries last on your link line, or at least after
+all the object files and static libraries that reference them.
+
+The first two are related to problems the linker has (as of b18 at least)
+when import libraries are referenced twice. Tables get messed up and
+programs crash randomly. The last point has to do with the fact that
+gcc processes the files listed on the command line in sequence and
+will only resolve references to libraries if they are given after
+the file that makes the reference.
+
+@subsection How do I compile a Win32 executable that doesn't use Cygwin?
+
+The -mno-cygwin flag to gcc makes gcc link against standard Microsoft
+DLLs instead of Cygwin. This is desirable for native Windows programs
+that don't need a UNIX emulation layer.
+
+@subsection How do I make the console window go away?
+
+The default during compilation is to produce a console application.
+It you are writing a GUI program, you should either compile with
+-mwindows as explained above, or add the string
+"-Wl,--subsystem,windows" to the GCC commandline.
+
+@subsection Why does make complain about a "missing separator"?
+
+This problem usually occurs as a result of someone editing a Makefile
+with a text editor that replaces tab characters with spaces. Command
+lines must start with tabs.
+
+@subsection Why can't we redistribute Microsoft's Win32 headers?
+
+Subsection 2.d.f of the `Microsoft Open Tools License agreement' looks like
+it says that can not "permit further redistribution of the
+Redistributables to their end users". We take this to mean that we can
+give them to you, but you can't give them to anyone else, which is
+something that Cygnus can't agree to. Fortunately, we have our own
+Win32 headers which are pretty complete.
+
+@subsection How do I link against .lib files?
+
+1. Build a C file with a function table. Put all functions you intend
+to use in that table. This forces the linker to include all the object
+files from the .lib. Maybe there is an option to force LINK.EXE to
+include an object file.
+2. Build a dummy 'LibMain'.
+3. Build a .def with all the exports you need.
+4. Link with your .lib using link.exe.
+
+or
+
+1. Extract all the object files from the .lib using LIB.EXE.
+2. Build a dummy C file referencing all the functions you need, either
+with a direct call or through an initialized function pointer.
+3. Build a dummy LibMain.
+4. Link all the objects with this file+LibMain.
+5. Write a .def.
+6. Link.
+
+You can use these methods to use MSVC (and many other runtime libs)
+with Cygwin development tools.
+
+Note that this is a lot of work (half a day or so), but much less than
+rewriting the runtime library in question from specs...
+
+(thanks to Jacob Navia (root@@jacob.remcomp.fr) for this explanation)
+
+@subsection How do I rebuild the tools on my NT box?
+
+Assuming that you have the src installed as /src, will build in
+the directory /obj, and want to install the tools in /install:
+
+@example
+bash
+cd /obj
+/src/configure --prefix=/install -v > configure.log 2>&1
+make > make.log 2>&1
+make install > install.log 2>&1
+@end example
+
+@subsection How can I compile a powerpc NT toolchain?
+
+Unfortunately, this will be difficult. It hasn't been built for
+some time (late 1996) since Microsoft has dropped development of
+powerpc NT. Exception handling/signals support semantics/args have been
+changed for x86 and not updated for ppc so the ppc specific support would
+have to be rewritten. We don't know of any other incompatibilities.
+Please send us patches if you do this work!
+
+@subsection How can I compile an Alpha NT toolchain?
+
+We have not ported the tools to Alpha NT and do not have plans to
+do so at the present time. We would be happy to add support
+for Alpha NT if someone contributes the changes to us.
+
+@subsection How can I adjust the heap/stack size of an application?
+
+Pass heap/stack linker arguments to gcc. To create foo.exe with
+a heap size of 1024 and a stack size of 4096, you would invoke
+gcc as:
+
+@code{gcc -Wl,--heap,1024,--stack,4096 -o foo foo.c}
+
+@subsection How can I find out which dlls are needed by an executable?
+
+objdump -p provides this information.
+
+@subsection How do I build a DLL?
+
+There's documentation that explains the process on the main Cygwin
+project web page (http://sourceware.cygnus.com/cygwin/).
+
+@subsection How can I set a breakpoint at MainCRTStartup?
+
+Set a breakpoint at *0x401000 in gdb and then run the program in
+question.
+
+@subsection How can I build a relocatable dll?
+
+You must execute the following sequence of five commands, in this
+order:
+
+@example
+$(LD) -s --base-file BASEFILE --dll -o DLLNAME OBJS LIBS -e ENTRY
+
+$(DLLTOOL) --as=$(AS) --dllname DLLNAME --def DEFFILE \
+ --base-file BASEFILE --output-exp EXPFILE
+
+$(LD) -s --base-file BASEFILE EXPFILE -dll -o DLLNAME OBJS LIBS -e ENTRY
+
+$(DLLTOOL) --as=$(AS) --dllname DLLNAME --def DEFFILE \
+ --base-file BASEFILE --output-exp EXPFILE
+
+$(LD) EXPFILE --dll -o DLLNAME OBJS LIBS -e ENTRY
+@end example
+
+In this example, $(LD) is the linker, ld.
+
+$(DLLTOOL) is dlltool.
+
+$(AS) is the assembler, as.
+
+DLLNAME is the name of the DLL you want to create, e.g., tcl80.dll.
+
+OBJS is the list of object files you want to put into the DLL.
+
+LIBS is the list of libraries you want to link the DLL against. For
+example, you may or may not want -lcygwin. You may want -lkernel32.
+Tcl links against -lcygwin -ladvapi32 -luser32 -lgdi32 -lcomdlg32
+-lkernel32.
+
+DEFFILE is the name of your definitions file. A simple DEFFILE would
+consist of ``EXPORTS'' followed by a list of all symbols which should
+be exported from the DLL. Each symbol should be on a line by itself.
+Other programs will only be able to access the listed symbols.
+
+BASEFILE is a temporary file that is used during this five stage
+process, e.g., tcl.base.
+
+EXPFILE is another temporary file, e.g., tcl.exp.
+
+ENTRY is the name of the function which you want to use as the entry
+point. This function should be defined using the WINAPI attribute,
+and should take three arguments:
+ int WINAPI startup (HINSTANCE, DWORD, LPVOID)
+
+This means that the actual symbol name will have an appended @@12, so if
+your entry point really is named @samp{startup}, the string you should
+use for ENTRY in the above examples would be @samp{startup@@12}.
+
+If your DLL calls any Cygwin API functions, the entry function will need
+to initialize the Cygwin impure pointer. You can do that by declaring
+a global variable @samp{_impure_ptr}, and then initializing it in the
+entry function. Be careful not to export the global variable
+@samp{_impure_ptr} from your DLL; that is, do not put it in DEFFILE.
+
+@example
+/* This is a global variable. */
+struct _reent *_impure_ptr;
+extern struct _reent *__imp_reent_data;
+
+int entry (HINSTANT hinst, DWORD reason, LPVOID reserved)
+@{
+ _impure_ptr = __imp_reent_data;
+ /* Whatever else you want to do. */
+@}
+@end example
+
+You may put an optional `--subsystem windows' on the $(LD) lines. The
+Tcl build does this, but I admit that I no longer remember whether
+this is important. Note that if you specify a --subsytem <x> flag to ld,
+the -e entry must come after the subsystem flag, since the subsystem flag
+sets a different default entry point.
+
+You may put an optional `--image-base BASEADDR' on the $(LD) lines.
+This will set the default image base. Programs using this DLL will
+start up a bit faster if each DLL occupies a different portion of the
+address space. Each DLL starts at the image base, and continues for
+whatever size it occupies.
+
+Now that you've built your DLL, you may want to build a library so
+that other programs can link against it. This is not required: you
+could always use the DLL via LoadLibrary. However, if you want to be
+able to link directly against the DLL, you need to create a library.
+Do that like this:
+
+$(DLLTOOL) --as=$(AS) --dllname DLLNAME --def DEFFILE --output-lib LIBFILE
+
+$(DLLTOOL), $(AS), DLLNAME, and DEFFILE are the same as above. Make
+sure you use the same DLLNAME and DEFFILE, or things won't work right.
+
+LIBFILE is the name of the library you want to create, e.g.,
+libtcl80.a. You can then link against that library using something
+like -ltcl80 in your linker command.
+
+@subsection How can I debug what's going on?
+
+You can debug your application using @code{gdb}. Make sure you
+compile it with the -g flag! If your application calls functions in
+MS dlls, gdb will complain about not being able to load debug information
+for them when you run your program. This is normal since these dlls
+don't contain debugging information (and even if they did, that debug
+info would not be compatible with gdb).
+
+@subsection Can I use a system trace mechanism instead?
+
+Yes. If you have a newer cygwin with the @code{strace.exe} program,
+@code{strace} can run other cygwin programs with various debug and
+trace messages enabled. For information on using the @code{strace}
+program, see the Cygwin User's Guide or the file
+@code{winsup/utils/utils/sgml}.
+
+If you have an older cygwin, you can set the <CODE>STRACE</CODE>
+environment variable to <CODE>1</CODE>, and get a whole load of debug
+information on your screen whenever a Cygwin app runs. This is an
+especially useful tool to use when tracking bugs down inside the
+Cygwin library. <CODE>STRACE</CODE> can be set to different values to
+achieve different amounts of granularity. You can set it to
+<CODE>0x10</CODE> for information about syscalls or <CODE>0x800</CODE>
+for signal/process handling-related info, to name two. The strace
+mechanism is well documented in the Cygwin library sources in the file
+<CODE>winsup/include/sys/strace.h</CODE>.
+
+@subsection The linker complains that it can't find something.
+
+A common error is to put the library on the command line before
+the thing that needs things from it.
+
+This is wrong @code{gcc -lstdc++ hello.cc}.
+This is right @code{gcc hello.cc -lstdc++}.
+
+@subsection I use a function I know is in the API, but I still get a link
+error.
+
+The function probably isn't declared in the header files, or
+the UNICODE stuff for it isn't filled in.
+
+@subsection Can you make DLLs that are linked against libc ?
+
+Yes.
+
+@subsection Where is malloc.h?
+
+Include stdlib.h instead of malloc.h.
+
+@subsection Can I use my own malloc?
+
+If you define a function called @code{malloc} in your own code, and link
+with the DLL, the DLL @emph{will} call your @code{malloc}. Needless to
+say, you will run into serious problems if your malloc is buggy.
+
+If you run any programs from the DOS command prompt, rather than from in
+bash, the DLL will try and expand the wildcards on the command line.
+This process uses @code{malloc} @emph{before} your main line is started.
+If you have written your own @code{malloc} to need some initialization
+to occur after @code{main} is called, then this will surely break.
+
+@subsection Can I mix objects compiled with msvc++ and gcc?
+
+Yes, but only if you are combining C object files. MSVC C++ uses a
+different mangling scheme than GNU C++, so you will have difficulties
+combining C++ objects.
+
+@subsection Can I use the gdb debugger to debug programs built by VC++?
+
+No, not for full (high level source language) debugging.
+The Microsoft compilers generate a different type of debugging
+symbol information, which gdb does not understand.
+
+However, the low-level (assembly-type) symbols generated by
+Microsoft compilers are coff, which gdb DOES understand.
+Therefore you should at least be able to see all of your
+global symbols; you just won't have any information about
+data types, line numbers, local variables etc.
+
+@subsection Where can I find info on x86 assembly?
+
+CPU reference manuals for Intel's current chips are available in
+downloadable PDF form on Intel's web site:
+
+@file{http://developer.intel.com/design/pro/manuals/}
+
+@subsection Shell scripts aren't running properly from my makefiles?
+
+You need to have . (dot) in your $PATH. You should NOT need to add
+/bin/sh in front of each and every shell script invoked in your
+Makefiles.
+
+@subsection What preprocessor do I need to know about?
+
+We use _WIN32 to signify access to the Win32 API and __CYGWIN__ for
+access to the Cygwin environment provided by the dll.
+
+We chose _WIN32 because this is what Microsoft defines in VC++ and
+we thought it would be a good idea for compatibility with VC++ code
+to follow their example. We use _MFC_VER to indicate code that should
+be compiled with VC++.
+
+@subsection Where can I get f77 and objc components for B20 EGCS 1.1?
+
+B20-compatible versions of the f77 and objc components are available
+from @file{http://www.xraylith.wisc.edu/~khan/software/gnu-win32/}.
+
+@subsection How should I port my Unix GUI to Windows?
+
+There are two basic strategies for porting Unix GUIs to Windows.
+
+The first is to use a portable graphics library such as tcl/tk, X11, or
+V (and others?). Typically, you will end up with a GUI on Windows that
+requires some runtime support. With tcl/tk, you'll want to include the
+necessary library files and the tcl/tk DLLs. In the case of X11, you'll
+need everyone using your program to have an X11 server installed.
+
+The second method is to rewrite your GUI using Win32 API calls (or MFC
+with VC++). If your program is written in a fairly modular fashion, you
+may still want to use Cygwin if your program contains a lot of shared
+(non-GUI-related) code. That way you still gain some of the portability
+advantages inherent in using Cygwin.
+
+@subsection Why not use DJGPP ?
+
+DJGPP is a similar idea, but for DOS instead of Win32. DJGPP uses a
+"DOS extender" to provide a more reasonable operating interface for its
+applications. The Cygwin toolset doesn't have to do this since all of
+the applications are native WIN32. Applications compiled with the
+Cygwin tools can access the Win32 API functions, so you can write
+programs which use the Windows GUI.
+
+You can get more info on DJGPP by following
+@file{http://www.delorie.com/}.
diff --git a/winsup/doc/install.texinfo b/winsup/doc/install.texinfo
new file mode 100644
index 000000000..29a80465e
--- /dev/null
+++ b/winsup/doc/install.texinfo
@@ -0,0 +1,166 @@
+@chapter Installation Instructions
+@section Contents
+
+The following packages are included in the full release:
+
+Development tools:
+binutils, bison, byacc, dejagnu, diff, expect, flex, gas, gcc, gdb,
+itcl, ld, libstdc++, make, patch, tcl, tix, tk
+
+User tools:
+ash, bash, bzip2, diff, fileutils, findutils, gawk, grep, gzip, m4,
+sed, shellutils, tar, textutils, time
+
+The user tools release only contains the user tools.
+
+Full source code is available for these tools. It is split into
+these two units.
+
+@section Installing the binary release:
+
+Important! Be sure to remove any older versions of the Cygwin tools
+from your PATH environment variable so you do not execute them by
+mistake.
+
+To download the cygwin files, you may use whatever ftp, browser, or
+other transfer program you are familiar with. To download multiple
+files without interaction, you may wish to try the @code{wget}
+program. Visit the cygwin home page's software listings to find a
+pre-built copy of it.
+
+Connect to one of the ftp servers listed above and cd to the directory
+containing the latest release. A list of mirror sites is at:
+
+@file{http://sourceware.cygnus.com/cygwin/mirrors.html}.
+
+If you want the development tools and the programs necessary to run
+the GNU configure mechanism, you should download the full binary release
+called @file{full.exe}. If you only care about the user tools
+listed above, download @file{usertools.exe} instead.
+
+If you have an unreliable connection, download the appropriate binary in
+smaller chunks instead. For the split cdk installer, get the files in
+the @file{full-split} subdirectory. Once downloaded, combine the
+split files at the command prompt by doing a:
+
+@smallexample
+copy /b xaa + xab + xac + ... + xak + xal full.exe
+del xa*.*
+@end smallexample
+
+A similar process can be used for the user tools.
+
+Once you have an install executable on your system, run it. If
+a previous version of the software is detected, it will offer to
+uninstall it for you.
+
+Next it will ask you to choose an install location. The default is
+@file{<system-drive>:\cygnus\cygwin-b20}. Feel free to choose another
+location if you would prefer.
+
+Finally, it will ask you for the name of the Program Files folder
+shortcut to add. By default, the installer will create
+a @file{Cygwin B20} entry in a
+folder called @file{Cygnus Solutions}. When this step is completed, it
+will install the tools and exit.
+
+At this point, you should be able to look under the start menu and
+select "Cygwin B20". This will pop up a bash shell with all special
+environment variables set up for you. If you are running Windows 95 or
+98 and are faced with the error message "Out of environment space", you
+need to increase the amount of environment space in your config.sys and
+try again. Adding the line @code{shell=C:\command.com /e:4096 /p}
+should do the trick if @code{C:} is your system drive letter.
+
+There are two remaining thing you should do from this prompt.
+First, you need to type @code{mkdir -p /tmp} to ensure that a directory
+for temporary files exists for programs that expect to find one there.
+
+Second, if you are installing the full distribution
+(@file{full.exe}), various programs will need to be able to find
+@file{/bin/sh}. You should @file{mkdir -p /bin} and put a copy of
+@file{sh.exe} there, removing the older version, if present. You can
+use the @file{mount} utility to select which drive letter is mounted as
+@file{/}. See the Frequently Asked Questions (FAQ) file for more
+information on @file{mount}.
+
+If you should ever want to uninstall the tools, you may do so
+via the "Add/Remove Programs" control panel.
+
+@section Installing the source code
+
+Before downloading the source code corresponding to the release,
+you should install the latest release of the tools (either the full
+release or just the user tools).
+
+Create the directory that will house the source code. @file{cd}
+there.
+
+Connect to one of the ftp servers listed above and cd to the directory
+containing the latest release. A list of mirror sites is at:
+
+@file{http://sourceware.cygnus.com/cygwin/mirrors.html}.
+
+If you want the user tools source code, @file{cd} into the
+@file{user-src-split} subdirectory. Download the files there. If you
+want the development tools sources, @file{cd} into the
+@file{dev-src-split} subdirectory. Download the files there.
+
+Back in the Windows command shell, for the user tools source:
+
+@smallexample
+copy /b xba + xbb + xbc + xbd + xbe + xbf + xbg user-src.tar.bz2
+del xb*.*
+bunzip2 user-src.tar.bz2
+tar xvf user-src.tar
+@end smallexample
+
+For the development tools source:
+
+@smallexample
+copy /b xca + xcb + xcc + xcd + ... + xck + xcl dev-src.tar.bz2
+del xc*.*
+bunzip2 dev-src.tar.bz2
+tar xvf dev-src.tar
+@end smallexample
+
+Both expand into a directory called @file{src}.
+
+Note: if you want the sources corresponding to everything in the
+full.exe binary installer, you will need to download and expand both
+the user-src.tar.bz2 and dev-src.tar.bz2 source archives!
+
+And you should be done...
+
+@section Upgrading to B20.1
+
+If you downloaded the original B20.0 release, you should definitely at
+least upgrade the Cygwin library to the version present in B20.1. To do
+this, download the file
+@file{cygwin-b20/cygwin1-20.1.dll.bz2} from one of our mirror sites,
+decompress it with bunzip2, and then install the dll, replacing
+the file cygwin-b20/H-i586-cygwin32/bin/cygwin1.dll in your original
+installation of 20.0.
+
+There are some additional patches in a few of the other tools
+(including a gcc change that makes -mno-cygwin find the correct header
+files). In addition, the tools have been built with a compiled-in path
+of /cygnus/cygwin-b20/ which will make some tools such as bison find
+their library files without help from environment variables.
+To install the full 20.1 release, you will need to download the
+correct installer from scratch. It will offer to uninstall the existing
+release and replace it with 20.1 (You should choose to uninstall b20 and
+proceed).
+
+We have diff files on the ftp site that can be used to upgrade the
+original B20.0 sources. 20.0-20.1-dev-src.diff.bz2 upgrades the
+development tools sources. 20.0-20.1-user-src.diff.bz2 upgrades the
+user tools sources. They come compressed so you'll need to bunzip2 them
+before proceeding. As an example, if the development tools are in the
+directory called "src" and the patch is in the directory above it, apply
+the patch as follows:
+
+@smallexample
+cd src
+patch -p1 -E < ../20.0-20.1-dev-src.diff
+@end smallexample
diff --git a/winsup/doc/legal.sgml b/winsup/doc/legal.sgml
new file mode 100644
index 000000000..721899c46
--- /dev/null
+++ b/winsup/doc/legal.sgml
@@ -0,0 +1,32 @@
+<LegalNotice id="legal">
+
+<Para>Copyright &copy; 1998,1999 Cygnus Solutions.</Para>
+
+<!--
+
+<Para>GNUPro&trade;, the GNUPro&trade; logo, and the Cygnus Solutions
+logo are trademarks of Cygnus Solutions. All other brand and product
+names are trademarks of their respective owners.</Para>
+
+<Para>Permission is granted to make and distribute verbatim copies of
+this documentation provided the copyright notice and this permission
+notice are preserved on all copies.</Para>
+
+<Para>Permission is granted to copy and distribute modified versions
+of this documentation under the conditions for verbatim copying,
+provided that the entire resulting derived work is distributed under
+the terms of a permission notice identical to this one.</Para>
+
+<Para>Permission is granted to copy and distribute translations of
+this documentation into another language, under the above conditions
+for modified versions, except that this permission notice may be
+stated in a translation approved by the Free Software
+Foundation.</Para>
+
+<Para>This documentation has been prepared by Cygnus Solutions
+Technical Publications; to contact the Cygnus Solutions Technical
+Publications staff, email: <Email>doc@cygnus.com</Email>.</Para>
+
+-->
+
+</LegalNotice>
diff --git a/winsup/doc/ntsec.sgml b/winsup/doc/ntsec.sgml
new file mode 100644
index 000000000..5f95dd288
--- /dev/null
+++ b/winsup/doc/ntsec.sgml
@@ -0,0 +1,316 @@
+
+<sect1 id="ntsec"><title>NTSEC Documentation</title>
+
+<para>The design goal of the ntsec patch was to get a more UNIX like
+permission structure based upon the security features of Windows NT.
+To describe the changes, I will give a short overview of NT security
+in chapter one.</para>
+<para>Chapter two discusses the changes in ntsec related to privileges on
+processes.</para>
+<para>Chapter three shows the UNIX like setting of file permissions.</para>
+
+<para>The setting of UNIX like object permissions is controlled by the new
+<EnVar>CYGWIN</EnVar> variable setting <literal>(no)ntsec</literal>.</para>
+
+<para>On NT ntsec is now turned on by default.</para>
+
+<sect2 id="ntsec-common"><title>NT security</title>
+
+<para>The NT security allows a process to allow or deny access of
+different kind to `objects'. `Objects' are files, processes,
+threads, semaphores, etc.</para>
+
+<para>The main data structure of NT security is the `security descriptor'
+(SD) structure. It explains the permissions, that are granted (or denied)
+to an object and contains information, that is related to so called
+`security identifiers' (SID).</para>
+
+<para>An SID is a unique identifier for users, groups and domains.
+SIDs are comparable to UNIX UIDs and GIDs, but are more complicated
+because they are unique across networks. Example:</para>
+
+<example>
+<screen>
+SID of a system `foo':
+
+ S-1-5-21-165875785-1005667432-441284377
+
+SID of a user `johndoe' of the system `foo':
+
+ S-1-5-21-165875785-1005667432-441284377-1023
+</screen>
+</example>
+
+<para>The above example shows the convention for printing SIDs. The leading
+`S' should show that it is a SID. The next number is a version number which
+is always 1. The next number is the so called `top-level authority' that
+identifies the source that issued the SID.</para>
+
+<para>While each system in a NT network has it's own SID, the situation
+is modified in NT domains: The SID of the domain controller is the
+base SID for each domain user. If an NT user has one account as domain
+user and another account on his local machine, this accounts are under
+any circumstances DIFFERENT, regardless of the usage of the same user
+name and password!</para>
+
+<example>
+<screen>
+SID of a domain `bar':
+
+ S-1-5-21-186985262-1144665072-740312968
+
+SID of a user `johndoe' in the domain `bar':
+
+ S-1-5-21-186985262-1144665072-740312968-1207
+</screen>
+</example>
+
+<para>The last part of the SID, the so called `relative identifier' (RID),
+is used as UID and/or GID under cygwin. As the name and the above example
+implies, this id is unique only relative to one system or domain.</para>
+
+<para>Note, that it's possible, that an user has the same RID on two
+different systems. The resulting SIDs are nevertheless different, so
+the SIDs are representing different users in an NT network.</para>
+
+<para>There is a big difference between UNIX IDs and NT SIDs, the existence of
+the so called `well known groups'. For example UNIX has no GID for the
+group of `all users'. NT has an SID for them, called `Everyone' in the
+English versions. The SIDs of well-known groups are not unique across
+an NT network but their meanings are unmistakable.
+Examples of well-known groups:</para>
+
+<screen>
+<example>
+everyone S-1-1-0
+creator/owner S-1-3-0
+batch process (via `at') S-1-5-3
+authenticated users S-1-5-11
+system S-1-5-18
+</screen>
+</example>
+
+<para>The last important group of SIDs are the `predefined groups'. This
+groups are used mainly on systems outside of domains to simplify the
+administration of user permissions. The corresponding SIDs are not unique
+across the network so they are interpreted only locally:</para>
+
+<screen>
+<example>
+administrators S-1-5-32-544
+users S-1-5-32-545
+guests S-1-5-32-546
+...
+</screen>
+</example>
+
+<para>Now, how are permissions given to objects? A process may assign an SD
+to the object. The SD of an object consists of three parts:</para>
+
+<itemizedlist spacing="compact">
+<listitem><para>- the SID of the owner </para></listitem>
+<listitem><para>- the SID of the group </para></listitem>
+<listitem><para>- a list of SIDs with their permissions, called
+`access control list' (ACL) </para></listitem>
+</itemizedlist>
+
+<para>UNIX is able to create three different permissions, the permissions
+for the owner, for the group and for the world. In contrast the ACL
+has a potentially infinite number of members. Every member is a so called
+`access control element' (ACE). An ACE contains three parts:</para>
+
+<itemizedlist spacing="compact">
+<listitem><para>- the type of the ACE </para></listitem>
+<listitem><para>- permissions, described with a DWORD </para></listitem>
+<listitem><para>- the SID, for which the above mentioned permissions are
+set </para></listitem>
+</itemizedlist>
+
+<para>The two important types of ACEs are the `access allowed ACE' and the
+`access denied ACE'. The ntsec patch only uses `access allowed ACEs'.</para>
+
+<para>The possible permissions on objects are more complicated than in
+UNIX. For example, the permission to delete an object is different
+from the write permission.</para>
+
+<para>With the aforementioned method NT is able to grant or revoke permissions
+to objects in a far more specific way. But what about cygwin? In a POSIX
+environment it would be fine to have the security behavior of a POSIX
+system. The NT security model is able to reproduce the POSIX model.
+The ntsec patch tries to do this in cygwin.</para>
+
+<para>The creation of explicit object security is a bit complicated, so
+typically only two simple variations are used:</para>
+
+<itemizedlist spacing="compact">
+<listitem><para>- default permissions, computed by the operating system </para></listitem>
+<listitem><para>- each permission to everyone </para></listitem>
+</itemizedlist>
+
+<para>For parameters to functions that create or open securable objects another
+data structure is used, the `security attributes' (SA). This structure
+contains an SD and a flag, that specifies whether the returned handle
+to the created or opened object is inherited to child processes or not.
+This property is not important for the ntsec patch description, so in
+this document SDs and SAs are more or less identical.</para>
+
+</sect2>
+
+<sect2 id="ntsec-processes"><title>Process privileges</title>
+
+<para>Any process started under control of cygwin has a semaphore attached
+to it, that is used for signaling purposes. The creation of this semaphore
+can be found in sigproc.cc, function `getsem'. The first parameter to the
+function call `CreateSemaphore' is an SA. Without ntsec patch this SA
+assigns default security to the semaphore. There is a simple disadvantage:
+Only the owner of the process may send signals to it. Or, in other words,
+if the owner of the process is not a member of the administrators' group,
+no administrator may kill the process! This is especially annoying, if
+processes are started via service manager.</para>
+
+<para>The ntsec patch now assigns an SA to the process control semaphore, that
+has each permission set for the user of the process, for the
+administrators' group and for `system', which is a synonym for the
+operating system itself. The creation of this SA is done by the function
+`sec_user', that can be found in `shared.cc'. Each member of the
+administrators' group is now allowed to send signals to any process
+created in cygwin, regardless of the process owner.</para>
+
+<para>Moreover, each process now has the appropriate security settings, when
+it is started via `CreateProcess'. You will find this in function
+`spawn_guts' in module `spawn.cc'. The security settings for starting a
+process in another user context have to add the sid of the new user, too.
+In the case of the `CreateProcessAsUser' call, sec_user creates an SA with
+an additional entry for the sid of the new user.</para>
+
+</sect2>
+
+<sect2 id="ntsec-files"><title>File permissions</title>
+
+<para>If ntsec is turned on, file permissions are set as in UNIX. An SD is
+assigned to the file containing the owner and group and ACEs for the
+owner, the group and `Everyone'. If the group of the file is not the
+administrators' group, the administrators' group gets the permissions
+to read the permissions (yes, this is an own permission flag
+<literal>:-)</literal>) and to take the ownership on this file.
+If the file's group is the administrators group itself, this behaviour
+is modified to support the typical behaviour of NT better:
+As you know, if one is member of admin group, all her files are owned
+by the group instead of by her. This is not the case with ntsec but the
+other admins should have easier access to the administrative files.
+So in this case the admin group gets additionally the permissions to
+write permissions and to write extended attributes, also in the case
+where group permissions are set to 0.</para>
+
+<para>The complete settings of UNIX like permissions can be found in the file
+`security.cc'. The two functions `get_nt_attribute' and `set_nt_attribute'
+are the main code. The reading and writing of the SDs is done by the
+functions `ReadSD' and `WriteSD'. They are using the Backup API functions
+`BackupRead' and `BackupWrite', that have the advantage not to crash,
+if they are used on non NTFS file systems! These crashes are the default
+behavior of the security API, if it's used on, e.g., FAT or SAMBA
+file systems <literal>:-(</literal></para>
+
+<para>Unfortunately, the settings of NT file security are only available
+on NTFS. SAMBA doesn't support them.</para>
+
+<para>If you are creating a file `foo' outside of cygwin, you will see something
+like the following on <command>ls -ln</command>:</para>
+
+<para>If your login is member of the administrators' group:</para>
+<screen>
+ rwxrwxrwx 1 544 513 ... foo
+</screen>
+<para>if not:</para>
+<screen>
+ rwxrwxrwx 1 1000 513 ... foo
+</screen>
+
+<para>Note the user and group IDs. 544 is the UID of the administrators' group.
+This is a `feature' <literal>:-P</literal> of WinNT. If one is a member of
+the administrators' group, every file, that he has created is owned by the
+administrators' group, instead by him.</para>
+
+<para>The second example shows the UID of the first user, that has been
+created with NT's the user administration tool. The users and groups are
+sequentially numbered, starting with 1000. Users and groups are using the
+same numbering scheme, so a user and a group don't share the same ID.</para>
+
+<para>In both examples the GID 513 is of special interest. This GID is a
+well known group with different naming in local systems and domains.
+Outside of domains the group is named 'None' (`Kein' in German, `Aucun'
+in French, etc.), in domains it is named 'Domain Users'. Unfortunately,
+the group `None' is never shown in the user admin tool outside of domains!
+This is very confusing but it seems that this has no negativ influences.</para>
+
+<para>To work correctly the ntsec patch depends on reasoned files
+<filename>/etc/passwd/</filename> and <filename>/etc/group</filename>.
+The names and the IDs must correspond to the appropriate
+NT IDs! The IDs used in cygwin are the RID of the NT SID, as aforementioned.
+An SID of e.g. the user `corinna' on my NT workstation:</para>
+
+<example>
+<screen>
+ S-1-5-21-165875785-1005667432-441284377-1000
+</screen>
+</example>
+
+<para>Note the last number: It's the RID 1000, the cygwin's UID.</para>
+
+<para>Unfortunately, workstations and servers outside of domains are not
+able to set primary groups! In these cases, where there is no correlation
+of users to primary groups, NT returns 513 (None) as primary group,
+regardless of the membership to regular groups of these users.</para>
+
+<para>when using <command>mkpasswd -l -g</command> on such systems, you
+have to change the primary group by hand if `None' as primary group is
+not what you want (and I'm sure, it's not what you want!)</para>
+
+<para>To get help in creating correct passwd and group files, look at
+the following examples, that are part of my files. With the exception
+of my personal user entry, all entries are well known entries. For a
+better understanding, the names are translated to the equivalents of the
+English NT version:</para>
+
+<example>
+<title>/etc/passwd:</title>
+<screen>
+everyone:*:0:0:::
+system:*:18:18:::
+administrator::500:544::/home/root:/bin/bash
+guest:*:501:546:::
+administrators:*:544:544::/home/root:
+corinna::1000:547:Corinna Vinschen:/home/corinna:/bin/tcsh
+</screen>
+</example>
+
+<example>
+<title>/etc/group:</title>
+<screen>
+everyone::0:
+system::18:
+none::513:
+administrators::544:
+users::545:
+guests::546:
+powerusers::547:
+</screen>
+</example>
+
+<para>Groups may be mentioned in the passwd file, too. This has two
+advantages:</para>
+<itemizedlist spacing="compact">
+<listitem><para>- Because NT assigns them to files as owners, a
+<command>ls -l</command> is often better readable. </para></listitem>
+<listitem><para>- Moreover it's possible to assigned them to files as
+owners with cygwin's <command>chown</command>. </para></listitem>
+</itemizedlist>
+
+<para>The group `system' is the aforementioned synonym for the operating system
+itself and is normally the owner of processes, that are started through
+service manager. The same is true for files, that are created by
+processes, which are started through service manager.</para>
+
+</sect2>
+
+</sect1>
diff --git a/winsup/doc/overview.sgml b/winsup/doc/overview.sgml
new file mode 100644
index 000000000..ea476dd49
--- /dev/null
+++ b/winsup/doc/overview.sgml
@@ -0,0 +1,87 @@
+<chapter id="overview"><title>Cygwin Overview</title>
+
+<sect1><title>What is it?</title>
+
+<para>The Cygwin tools are ports of the popular GNU development
+tools and utilities for Windows NT and 9x. They function through the
+use of the Cygwin library which provides the UNIX system calls and
+environment that these programs require.</para>
+
+<para>With the tools installed, programmers may write Win32
+console or GUI applications that make use of the standard Microsoft
+Win32 API and/or the Cygwin API. As a result, it is possible to
+easily port many significant UNIX programs without the need for
+extensive changes to the source code. This includes configuring and
+building most of the available GNU software (including the development
+tools included with the Cygwin distributions). Even if the
+compiler tools are of little to no use to you, you may have
+interest in the many standard UNIX utilities. They can be used both
+from the bash shell (provided) or from the command.com.</para>
+
+</sect1>
+
+<sect1><title>Are the Cygwin tools free software?</title>
+
+<para>Yes. Parts are GNU software (gcc, gas, ld, etc...), parts are
+covered by the standard X11 license, some of it is public domain,
+some of it was written by Cygnus and placed under the GPL. None of it
+is shareware. You don't have to pay anyone to use it but you should be
+sure to read the copyright section of the FAQ more more information on
+how the GNU General Public License may affect your use of these
+tools. If you intend to port a proprietary application using the Cygwin
+library, you may want the Cygwin proprietary-use license.
+For more information about the
+proprietary-use license, please contact sales@cygnus.com. Customers of
+the native Win32 GNUPro should feel free to submit bug reports and ask
+questions through the normal channels. All other questions should be
+sent to the project mailing list cygwin@sourceware.cygnus.com.</para>
+
+</sect1>
+
+<sect1><title>A brief history of the Cygwin project</title>
+
+<para>The first thing done was to enhance the development tools (gcc,
+gdb, gas, et al) so that they could generate/interpret Win32 native
+object files.</para>
+
+<para>The next task was to port the tools to Win NT/9x. We could have
+done this by rewriting large portions of the source to work within the
+context of the Win32 API. But this would have meant spending a huge
+amount of time on each and every tool. Instead, we took a
+substantially different approach by writing a shared library
+(the Cygwin DLL) that adds the necessary UNIX-like functionality
+missing from the Win32 API (fork, spawn, signals, select, sockets,
+etc.). We call this new interface the Cygwin API. Once written, it
+was possible to build working Win32 tools using UNIX-hosted
+cross-compilers, linking against this library.</para>
+
+<para>From this point, we pursued the goal of producing native tools
+capable of rebuilding themselves under Windows 9x and NT (this is
+often called self-hosting). Since neither OS ships with standard UNIX
+user tools (fileutils, textutils, bash, etc...), we had to get the GNU
+equivalents working with the Cygwin API. Most of these tools were
+previously only built natively so we had to modify their configure
+scripts to be compatible with cross-compilation. Other than the
+configuration changes, very few source-level changes had to be
+made. Running bash with the development tools and user tools in place,
+Windows 9x and NT look like a flavor of UNIX from the perspective of
+the GNU configure mechanism. Self hosting was achieved as of the beta
+17.1 release.</para>
+
+</sect1>
+
+DOCTOOL-INSERT-ov-ex-unix
+DOCTOOL-INSERT-ov-ex-win
+<sect1><title>Highlights of Cygwin Functionality</title>
+DOCTOOL-INSERT-ov-hi-intro
+DOCTOOL-INSERT-ov-hi-win9xnt
+DOCTOOL-INSERT-ov-hi-perm
+DOCTOOL-INSERT-ov-hi-files
+DOCTOOL-INSERT-ov-hi-textvsbinary
+DOCTOOL-INSERT-ov-hi-ansiclib
+DOCTOOL-INSERT-ov-hi-process
+DOCTOOL-INSERT-ov-hi-signals
+DOCTOOL-INSERT-ov-hi-sockets
+DOCTOOL-INSERT-ov-hi-select
+</sect1>
+</chapter>
diff --git a/winsup/doc/overview2.sgml b/winsup/doc/overview2.sgml
new file mode 100644
index 000000000..9fad7cebe
--- /dev/null
+++ b/winsup/doc/overview2.sgml
@@ -0,0 +1,307 @@
+<sect1 id="ov-ex-unix"><title>Expectations for UNIX Programmers</title>
+
+<para>Developers coming from a UNIX background will find a set of utilities
+they are already comfortable using, including a working UNIX shell. The
+compiler tools are the standard GNU compilers most people will have previously
+used under UNIX, only ported to the Windows host. Programmers wishing to port
+UNIX software to Windows NT or 9x will find that the Cygwin library provides
+an easy way to port many UNIX packages, with only minimal source code
+changes.</para>
+</sect1>
+
+<sect1 id="ov-ex-win"><title>Expectations for Windows Programmers</title>
+<para>Developers coming from a Windows background will find a set of tools capable
+of writing console or GUI executables that rely on the Microsoft Win32 API.
+The linker and dlltool utility may be used to write Windows Dynamically Linked
+Libraries (DLLs). The resource compiler "windres" is also provided with the
+native Windows GNUPro tools. All tools may be used from the Microsoft command
+line prompt, with full support for normal Windows pathnames.</para>
+</sect1>
+
+<sect2 id="ov-hi-intro"><title>Introduction</title> <para>When a binary linked
+against the library is executed, the Cygwin DLL is loaded into the
+application's text segment. Because we are trying to emulate a UNIX kernel
+which needs access to all processes running under it, the first Cygwin DLL to
+run creates shared memory areas that other processes using separate instances
+of the DLL can access. This is used to keep track of open file descriptors and
+assist fork and exec, among other purposes. In addition to the shared memory
+regions, every process also has a per_process structure that contains
+information such as process id, user id, signal masks, and other similar
+process-specific information.</para>
+
+<para>The DLL is implemented using the Win32 API, which allows it to run on all
+Win32 hosts. Because processes run under the standard Win32 subsystem, they
+can access both the UNIX compatibility calls provided by Cygwin as well as
+any of the Win32 API calls. This gives the programmer complete flexibility in
+designing the structure of their program in terms of the APIs used. For
+example, they could write a Win32-specific GUI using Win32 API calls on top of
+a UNIX back-end that uses Cygwin.</para>
+
+<para>Early on in the development process, we made the important design
+decision that it would not be necessary to strictly adhere to existing UNIX
+standards like POSIX.1 if it was not possible or if it would significantly
+diminish the usability of the tools on the Win32 platform. In many cases, an
+environment variable can be set to override the default behavior and force
+standards compliance.</para>
+</sect2>
+
+<sect2 id="ov-hi-win9xnt"><title>Supporting both Windows NT and 9x</title>
+<para>While Windows 95 and Windows 98 are similar enough to each other that we
+can safely ignore the distinction when implementing Cygwin, Windows NT is an
+extremely different operating system. For this reason, whenever the DLL is
+loaded, the library checks which operating system is active so that it can act
+accordingly.</para>
+
+<para>In some cases, the Win32 API is only different for
+historical reasons. In this situation, the same basic functionality is
+available under Windows 9x and NT but the method used to gain this
+functionality differs. A trivial example: in our implementation of
+uname, the library examines the sysinfo.dwProcessorType structure
+member to figure out the processor type under Windows 9x. This field
+is not supported in NT, which has its own operating system-specific
+structure member called sysinfo.wProcessorLevel.</para>
+
+<para>Other differences between NT and 9x are much more fundamental in
+nature. The best example is that only NT provides a security model.</para>
+</sect2>
+
+<sect2 id="ov-hi-perm"><title>Permissions and Security</title>
+<para>Windows NT includes a sophisticated security model based on Access
+Control Lists (ACLs). Although some modern UNIX operating systems include
+support for ACLs, Cygwin maps Win32 file ownership and permissions to the
+more standard, older UNIX model. The chmod call maps UNIX-style permissions
+back to the Win32 equivalents. Because many programs expect to be able to find
+the /etc/passwd and /etc/group files, we provide utilities that can be used to
+construct them from the user and group information provided by the operating
+system.</para>
+
+<para>Under Windows NT, the administrator is permitted to chown files. There
+is currently no mechanism to support the setuid concept or API call. Although
+we hope to support this functionality at some point in the future, in practice,
+the programs we have ported have not needed it.</para>
+
+<para>Under Windows 9x, the situation is considerably different. Since a
+security model is not provided, Cygwin fakes file ownership by making all
+files look like they are owned by a default user and group id. As under NT,
+file permissions can still be determined by examining their read/write/execute
+status. Rather than return an unimplemented error, under Windows 9x, the
+chown call succeeds immediately without actually performing any action
+whatsoever. This is appropriate since essentially all users jointly own the
+files when no concept of file ownership exists.</para>
+
+<para>It is important that we discuss the implications of our "kernel" using
+shared memory areas to store information about Cygwin processes. Because
+these areas are not yet protected in any way, in principle a malicious user
+could modify them to cause unexpected behavior in Cygwin processes. While
+this is not a new problem under Windows 9x (because of the lack of operating
+system security), it does constitute a security hole under Windows NT.
+This is because one user could affect the Cygwin programs run by
+another user by changing the shared memory information in ways that
+they could not in a more typical WinNT program. For this reason, it
+is not appropriate to use Cygwin in high-security applications. In
+practice, this will not be a major problem for most uses of the
+library.</para>
+</sect2>
+
+<sect2 id="ov-hi-files"><title>File Access</title> <para>Cygwin supports
+both Win32- and POSIX-style paths, using either forward or back slashes as the
+directory delimiter. Paths coming into the DLL are translated from Win32 to
+POSIX as needed. As a result, the library believes that the file system is a
+POSIX-compliant one, translating paths back to Win32 paths whenever it calls a
+Win32 API function. UNC pathnames (starting with two slashes) are
+supported.</para>
+
+<para>The layout of this POSIX view of the Windows file system space is stored
+in the Windows registry. While the slash ('/') directory points to the system
+partition by default, this is easy to change with the Cygwin mount utility.
+In addition to selecting the slash partition, it allows mounting arbitrary
+Win32 paths into the POSIX file system space. Many people use the utility to
+mount each drive letter under the slash partition (e.g. C:\ to /c, D:\ to /d,
+etc...).</para>
+
+<para>The library exports several Cygwin-specific functions that can be used
+by external programs to convert a path or path list from Win32 to POSIX or vice
+versa. Shell scripts and Makefiles cannot call these functions directly.
+Instead, they can do the same path translations by executing the cygpath
+utility program that we provide with Cygwin.</para>
+
+<para>Win32 file systems are case preserving but case insensitive. Cygwin
+does not currently support case distinction because, in practice, few UNIX
+programs actually rely on it. While we could mangle file names to support case
+distinction, this would add unnecessary overhead to the library and make it
+more difficult for non-Cygwin applications to access those files.</para>
+
+<para>Symbolic links are emulated by files containing a magic cookie followed
+by the path to which the link points. They are marked with the System
+attribute so that only files with that attribute have to be read to determine
+whether or not the file is a symbolic link. Hard links are fully supported
+under Windows NT on NTFS file systems. On a FAT file system, the call falls
+back to simply copying the file, a strategy that works in many cases.</para>
+
+<para>The inode number for a file is calculated by hashing its full Win32 path.
+The inode number generated by the stat call always matches the one returned in
+d_ino of the dirent structure. It is worth noting that the number produced by
+this method is not guaranteed to be unique. However, we have not found this to
+be a significant problem because of the low probability of generating a
+duplicate inode number.</para>
+</sect2>
+
+<sect2 id="ov-hi-textvsbinary"><title>Text Mode vs. Binary Mode</title>
+<para>Interoperability with other Win32 programs such as text editors was
+critical to the success of the port of the development tools. Most Cygnus
+customers upgrading from the older DOS-hosted toolchains expected the new
+Win32-hosted ones to continue to work with their old development
+sources.</para>
+
+<para>Unfortunately, UNIX and Win32 use different end-of-line terminators in
+text files. Consequently, carriage-return newlines have to be translated on
+the fly by Cygwin into a single newline when reading in text mode. The
+control-z character is interpreted as a valid end-of-file character for a
+similar reason.</para>
+
+<para>This solution addresses the compatibility requirement at the expense of
+violating the POSIX standard that states that text and binary mode will be
+identical. Consequently, processes that attempt to lseek through text files can
+no longer rely on the number of bytes read as an accurate indicator of position
+in the file. For this reason, the CYGWIN environment variable can be
+set to override this behavior.</para>
+</sect2>
+
+<sect2 id="ov-hi-ansiclib"><title>ANSI C Library</title>
+<para>We chose to include
+Cygnus' own existing ANSI C library
+"newlib" as part of the library, rather than write all of the lib C
+and math calls from scratch. Newlib is a BSD-derived ANSI C library,
+previously only used by cross-compilers for embedded systems
+development.</para>
+
+<para>The reuse of existing free implementations of such things
+as the glob, regexp, and getopt libraries saved us considerable
+effort. In addition, Cygwin uses Doug Lea's free malloc
+implementation that successfully balances speed and compactness. The
+library accesses the malloc calls via an exported function pointer.
+This makes it possible for a Cygwin process to provide its own
+malloc if it so desires.</para>
+</sect2>
+
+<sect2 id="ov-hi-process"><title>Process Creation</title>
+<para>The fork call in Cygwin is particularly interesting because it
+does not map well on top of the Win32 API. This makes it very
+difficult to implement correctly. Currently, the Cygwin fork is a
+non-copy-on-write implementation similar to what was present in early
+flavors of UNIX.</para>
+
+<para>The first thing that happens when a parent process
+forks a child process is that the parent initializes a space in the
+Cygwin process table for the child. It then creates a suspended
+child process using the Win32 CreateProcess call. Next, the parent
+process calls setjmp to save its own context and sets a pointer to
+this in a Cygwin shared memory area (shared among all Cygwin
+tasks). It then fills in the child's .data and .bss sections by
+copying from its own address space into the suspended child's address
+space. After the child's address space is initialized, the child is
+run while the parent waits on a mutex. The child discovers it has
+been forked and longjumps using the saved jump buffer. The child then
+sets the mutex the parent is waiting on and blocks on another mutex.
+This is the signal for the parent to copy its stack and heap into the
+child, after which it releases the mutex the child is waiting on and
+returns from the fork call. Finally, the child wakes from blocking on
+the last mutex, recreates any memory-mapped areas passed to it via the
+shared area, and returns from fork itself.</para>
+
+<para>While we have some
+ideas as to how to speed up our fork implementation by reducing the
+number of context switches between the parent and child process, fork
+will almost certainly always be inefficient under Win32. Fortunately,
+in most circumstances the spawn family of calls provided by Cygwin
+can be substituted for a fork/exec pair with only a little effort.
+These calls map cleanly on top of the Win32 API. As a result, they
+are much more efficient. Changing the compiler's driver program to
+call spawn instead of fork was a trivial change and increased
+compilation speeds by twenty to thirty percent in our
+tests.</para>
+
+<para>However, spawn and exec present their own set of
+difficulties. Because there is no way to do an actual exec under
+Win32, Cygwin has to invent its own Process IDs (PIDs). As a
+result, when a process performs multiple exec calls, there will be
+multiple Windows PIDs associated with a single Cygwin PID. In some
+cases, stubs of each of these Win32 processes may linger, waiting for
+their exec'd Cygwin process to exit.</para>
+</sect2>
+
+<sect2 id="ov-hi-signals"><title>Signals</title>
+<para>When
+a Cygwin process starts, the library starts a secondary thread for
+use in signal handling. This thread waits for Windows events used to
+pass signals to the process. When a process notices it has a signal,
+it scans its signal bitmask and handles the signal in the appropriate
+fashion.</para>
+
+<para>Several complications in the implementation arise from the
+fact that the signal handler operates in the same address space as the
+executing program. The immediate consequence is that Cygwin system
+functions are interruptible unless special care is taken to avoid
+this. We go to some lengths to prevent the sig_send function that
+sends signals from being interrupted. In the case of a process
+sending a signal to another process, we place a mutex around sig_send
+such that sig_send will not be interrupted until it has completely
+finished sending the signal.</para>
+
+<para>In the case of a process sending
+itself a signal, we use a separate semaphore/event pair instead of the
+mutex. sig_send starts by resetting the event and incrementing the
+semaphore that flags the signal handler to process the signal. After
+the signal is processed, the signal handler signals the event that it
+is done. This process keeps intraprocess signals synchronous, as
+required by POSIX.</para>
+
+<para>Most standard UNIX signals are provided. Job
+control works as expected in shells that support
+it.</para>
+</sect2>
+
+<sect2 id="ov-hi-sockets"><title>Sockets</title>
+<para>Socket-related calls in Cygwin simply
+call the functions by the same name in Winsock, Microsoft's
+implementation of Berkeley sockets. Only a few changes were needed to
+match the expected UNIX semantics - one of the most troublesome
+differences was that Winsock must be initialized before the first
+socket function is called. As a result, Cygwin has to perform this
+initialization when appropriate. In order to support sockets across
+fork calls, child processes initialize Winsock if any inherited file
+descriptor is a socket.</para>
+
+<para>Unfortunately, implicitly loading DLLs
+at process startup is usually a slow affair. Because many processes
+do not use sockets, Cygwin explicitly loads the Winsock DLL the
+first time it calls the Winsock initialization routine. This single
+change sped up GNU configure times by thirty
+percent.</para>
+</sect2>
+
+<sect2 id="ov-hi-select"><title>Select</title>
+<para>The UNIX select function is another
+call that does not map cleanly on top of the Win32 API. Much to our
+dismay, we discovered that the Win32 select in Winsock only worked on
+socket handles. Our implementation allows select to function normally
+when given different types of file descriptors (sockets, pipes,
+handles, and a custom /dev/windows Windows messages
+pseudo-device).</para>
+
+<para>Upon entry into the select function, the first
+operation is to sort the file descriptors into the different types.
+There are then two cases to consider. The simple case is when at
+least one file descriptor is a type that is always known to be ready
+(such as a disk file). In that case, select returns immediately as
+soon as it has polled each of the other types to see if they are
+ready. The more complex case involves waiting for socket or pipe file
+descriptors to be ready. This is accomplished by the main thread
+suspending itself, after starting one thread for each type of file
+descriptor present. Each thread polls the file descriptors of its
+respective type with the appropriate Win32 API call. As soon as a
+thread identifies a ready descriptor, that thread signals the main
+thread to wake up. This case is now the same as the first one since
+we know at least one descriptor is ready. So select returns, after
+polling all of the file descriptors one last time.</para>
+</sect2>
diff --git a/winsup/doc/pathnames.sgml b/winsup/doc/pathnames.sgml
new file mode 100644
index 000000000..2338b18ff
--- /dev/null
+++ b/winsup/doc/pathnames.sgml
@@ -0,0 +1,272 @@
+<sect1 id="using-pathnames"><title>Mapping path names</title>
+
+<sect2><title>Introduction</title>
+
+<para>Cygwin supports both Win32- and POSIX-style paths, where
+directory delimiters may be either forward or back slashes. UNC
+pathnames (starting with two slashes and a network name) are also
+supported.</para>
+
+<para>POSIX operating systems (such as Linux) do not have the concept
+of drive letters. Instead, all absolute paths begin with a
+slash (instead of a drive letter such as "c:") and all file systems
+appear as subdirectories (for example, you might buy a new disk and
+make it be the <filename>/disk2</filename> directory).</para>
+
+<para>Because many programs written to run on UNIX systems assume
+the existance of a single unified POSIX file system structure, Cygwin
+maintains a special internal POSIX view of the Win32 file system
+that allows these programs to successfully run under Windows. Cygwin
+uses this mapping to translate between Win32 and POSIX paths as
+necessary.</para>
+
+</sect2>
+
+<sect2 id="mount-table"><title>The Cygwin Mount Table</title>
+
+<para>The <command>mount</command> utility program is used to
+to map Win32 drives and network shares into Cygwin's internal POSIX
+directory tree. This is a similar concept to the typical UNIX mount
+program. For those people coming from a Windows background, the
+<command>mount</command> utility is very similar to the old DOS
+<command>join</command>, in that it makes your drive letters appear as
+subdirectories somewhere else.</para>
+
+<para>The mapping is stored in the current user's Cygwin
+<FirstTerm>mount table</FirstTerm> in the Windows registry so that the
+information will be retrieved next time the user logs in. Because it
+is sometimes desirable to have system-wide as well as user-specific
+mounts, there is also a system-wide mount table that all Cygwin users
+inherit. The system-wide table may only be modified by a user with
+the appropriate priviledges (Administrator priviledges in Windows
+NT).</para>
+
+<para>The current user's table is located under
+"HKEY_CURRENT_USER/Software/Cygnus Solutions/Cygwin/mounts
+v&lt;version&gt;"
+where &lt;version&gt; is the latest registry version associated with
+the Cygwin library (this version is not the same as the release
+number). The system-wide table is located under the same subkeys
+under HKEY_LOCAL_SYSTEM.</para>
+
+<para>By default, the POSIX root <filename>/</filename> points to the
+system partition but it can be relocated to any directory in the
+Windows file system using the <command>mount</command> command.
+Whenever Cygwin generates a POSIX path from a Win32 one, it uses the
+longest matching prefix in the mount table. Thus, if
+<filename>C:</filename> is mounted as <filename>/c</filename> and also
+as <filename>/</filename>, then Cygwin would translate
+<filename>C:/foo/bar</filename> to <filename>/c/foo/bar</filename>.</para>
+
+<para>Invoking <command>mount</command> without any arguments displays
+Cygwin's current set of mount points.
+In the following example, the C
+drive is the POSIX root and D drive is mapped to
+<filename>/d</filename>. Note that in this case, the root mount is a
+system-wide mount point that is visible to all users running Cygwin
+programs, whereas the <filename>/d</filename> mount is only visible
+to the current user.</para>
+
+<example>
+<title>Displaying the current set of mount points</title>
+<screen>
+<prompt>c:\cygnus\&gt;</prompt> <userinput>mount</userinput>
+Device Directory Type Flags
+D: /d user textmode
+C: / system textmode
+</screen>
+</example>
+
+<para>You can also use the <command>mount</command> command to add
+new mount points, and the <command>umount</command> to delete
+them. See <Xref Linkend="mount"> and <Xref Linkend="umount"> for more
+information on how to use these utilities to set up your Cygwin POSIX
+file system.</para>
+
+<para>Whenever Cygwin cannot use any of the existing mounts to convert
+from a particular Win32 path to a POSIX one, Cygwin will
+automatically default to an imaginary mount point under the default POSIX
+path <filename>/cygdrive</filename>. For example, if Cygwin accesses
+<filename>Z:\foo</filename> and the Z drive is not currently in the
+mount table, then <filename>Z:\</filename> would be automatically
+converted to <filename>/cygdrive/Z</filename>. The default
+prefix of <filename>/cygdrive</filename> may be changed (see the
+<Xref Linkend="mount"> for more information).</para>
+
+<para>It is possible to assign some special attributes to each mount
+point. Automatically mounted partitions are displayed as "auto"
+mounts. Mounts can also be marked as either "textmode" or "binmode"
+-- whether text files are read in the same manner as binary files by
+default or not (see <Xref Linkend="using-textbinary"> for more
+information on text and binary modes.</para>
+
+</sect2>
+
+<sect2><title>Cygwin Mount Table Strategies</title>
+
+<para>Which set of mounts is right for a given Cygwin user depends
+largely on how closely you want to simulate a POSIX environment,
+whether you mix Windows and Cygwin programs, and how many drive
+letters you are using. If you want to be very POSIX-like (assuming
+"CygwinRoot" is the top directory of your Cygwin distribution), you may
+want to do something like this:
+
+<example><title>POSIX-like mount setup</title>
+<screen>
+<prompt>C:\&gt;</prompt> <userinput>mount c:\Cygnus\CygwinRoot /</userinput>
+<prompt>C:\&gt;</prompt> <userinput>mount c:\ /c</userinput>
+<prompt>C:\&gt;</prompt> <userinput>mount d:\ /d</userinput>
+<prompt>C:\&gt;</prompt> <userinput>mount e:\ /cdrom</userinput>
+</screen>
+</example>
+
+<para>However, if you mix Windows and Cygwin programs a lot, you might
+want to create an "identity" mapping, so that conversions between the
+two (see <Xref Linkend="cygpath">) can be eliminated:</para>
+
+<example><title>Identity mount setup</title>
+<screen>
+<prompt>C:\&gt;</prompt> <userinput>mount c:\ \</userinput>
+<prompt>C:\&gt;</prompt> <userinput>mount d:\foo /foo</userinput>
+<prompt>C:\&gt;</prompt> <userinput>mount d:\bar /bar</userinput>
+<prompt>C:\&gt;</prompt> <userinput>mount e:\grill /grill</userinput>
+</screen>
+</example>
+
+<para>You'd have to repeat this for all top-level subdirectories on
+all drives, but then you'd always have the top-level directories
+available as the same names in both systems.</para>
+
+</sect2>
+
+<sect2><title>Additional Path-related Information</title>
+
+<para>The <command>cygpath</command> program provides the ability to
+translate between Win32 and POSIX pathnames in shell scripts. See
+<Xref Linkend="cygpath"> for the details.</para>
+
+<para>The <EnVar>HOME</EnVar>, <EnVar>PATH</EnVar>, and
+<EnVar>LD_LIBRARY_PATH</EnVar> environment variables are automatically
+converted from Win32 format to POSIX format (e.g. from
+<filename>C:\cygnus\cygwin-b20\H-i586-cygwin32\bin</filename> to
+<filename>/bin</filename>, if there was a mount from that Win32 path to
+that POSIX path) when a Cygwin process first starts.</para>
+
+<para>Symbolic links can also be used to map Win32 pathnames to POSIX.
+For example, the command
+<command>ln -s //pollux/home/joe/data /data</command> would have about
+the same effect as creating a mount point from
+<filename>//pollux/home/joe/data</filename> to <filename>/data</filename>
+using <command>mount</command>, except that symbolic links cannot set
+the default file access mode. Other differences are that the mapping is
+distributed throughout the file system and proceeds by iteratively
+walking the directory tree instead of matching the longest prefix in a
+kernel table. Note that symbolic links will only work on network
+drives that are properly configured to support the "system" file
+attribute. Many do not do so by default (the Unix Samba server does
+not by default, for example).</para>
+
+</sect2>
+
+</sect1>
+
+<sect1 id="using-specialnames"><title>Special filenames</title>
+
+<sect2> <title>DOS devices</title>
+
+<para>Windows filenames invalid under Windows are also invalid under
+Cygwin. This means that base filenames such as
+<filename>AUX</filename>, <filename>COM1</filename>,
+<filename>LPT1</filename> or <filename>PRN</filename> (to name a few)
+cannot be used in a regular Cygwin Windows or POSIX path, even with an
+extension (<filename>prn.txt</filename>). However the special names can be
+used as filename extensions (<filename>file.aux</filename>). You can use
+the special names as you would under DOS, for example you can print on your
+default printer with the command <command>cat filename > PRN</command>
+(make sure to end with a Form Feed).
+</para>
+
+<sect2> <Title>POSIX devices</title>
+<para>There is no need to create a POSIX <filename>/dev</filename>
+directory as it is simulated within Cygwin automatically.
+It supports the following devices: <filename>/dev/null</filename>,
+<filename>/dev/tty</filename> and
+<filename>/dev/comX</filename> (the serial ports).
+These devices cannot be seen with the command <command>ls /dev</command>
+although commands such as <command>ls /dev/tty</command> work fine.
+<comment>
+FIXME: Are there other devices under /dev. What about the funny ones
+mounted by default, such as /dev/fd1. What do they really do?
+</comment>
+</para>
+
+<sect2><title>The .exe extension</title>
+
+<para> Executable program filenames end with .exe but the .exe need
+not be included in the command, so that traditional UNIX names can be
+used. However, for programs that end in ".bat" and ".com", you cannot
+omit the extension.
+</para>
+
+<para>As a side effect, the <command> ls filename</command> gives
+information about <filename>filename.exe</filename> if
+<filename>filename.exe</filename> exists and <filename>filename</filename>
+does not. In the same situation the function call
+<function>stat("filename",..)</function> gives information about
+<filename>filename.exe</filename>. The two files can be distinguished
+by examining their inodes, as demonstrated below.
+<screen>
+<prompt>C:\Cygnus\&gt;</prompt> <userinput>ls * </userinput>
+a a.exe b.exe
+<prompt>C:\Cygnus\&gt;</prompt> <userinput>ls -i a a.exe</userinput>
+445885548 a 435996602 a.exe
+<prompt>C:\Cygnus\&gt;</prompt> <userinput>ls -i b b.exe</userinput>
+432961010 b 432961010 b.exe
+</screen>
+If a shell script <filename>myprog</filename> and a program
+<filename>myprog.exe</filename> coexist in a directory, the program
+has precedence and is selected for execution of
+<command>myprog</command>.</para>
+
+<para>The <command>gcc</command> compiler produces an executable named
+<filename>filename.exe</filename> when asked to produce
+<filename>filename</filename>. This allows many makefiles written
+for UNIX systems to work well under Cygwin.</para>
+
+<para>Unfortunately, the <command>install</command> and
+<command>strip</command> commands do distinguish between
+<filename>filename</filename> and <filename>filename.exe</filename>. They
+fail when working on a non-existing <filename>filename</filename> even if
+<filename>filename.exe</filename> exists, thus breaking some makefiles.
+This problem can be solved by writing <command>install</command> and
+<command>strip</command> shell scripts to provide the extension ".exe"
+when needed.
+</para>
+</sect2>
+
+<sect2><title>The @pathnames</title>
+<para>To circumvent the limitations on shell line length in the native
+Windows command shells, Cygwin programs expand their arguments
+starting with "@" in a special way. If a file
+<filename>pathname</filename> exists, the argument
+<filename>@pathname</filename> expands recursively to the content of
+<filename>pathname</filename>. Double quotes can be used inside the
+file to delimit strings containing blank space.
+Embedded double quotes must be repeated.
+In the following example compare the behaviors of the bash built-in
+<command>echo</command> and of the program <command>/bin/echo</command>.
+
+<example><title> Using @pathname</title>
+<screen>
+<prompt>/Cygnus$</prompt> <userinput>echo 'This is "a long" line' > mylist</userinput>
+<prompt>/Cygnus$</prompt> <userinput>echo @mylist</userinput>
+@mylist
+<prompt>/Cygnus$</prompt> <userinput>/bin/echo @mylist</userinput>
+This is a long line
+<prompt>/Cygnus$</prompt> <userinput>rm mylist</userinput>
+<prompt>/Cygnus$</prompt> <userinput>/bin/echo @mylist</userinput>
+@mylist
+</screen>
+</example>
+</sect2>
+</sect1>
diff --git a/winsup/doc/programming.sgml b/winsup/doc/programming.sgml
new file mode 100644
index 000000000..45f26f4fa
--- /dev/null
+++ b/winsup/doc/programming.sgml
@@ -0,0 +1,11 @@
+<chapter id="programming"><title>Programming with Cygwin</title>
+
+DOCTOOL-INSERT-gcc
+
+DOCTOOL-INSERT-gdb
+
+DOCTOOL-INSERT-dll
+
+DOCTOOL-INSERT-windres
+
+</chapter>
diff --git a/winsup/doc/readme.texinfo b/winsup/doc/readme.texinfo
new file mode 100644
index 000000000..ee537f63b
--- /dev/null
+++ b/winsup/doc/readme.texinfo
@@ -0,0 +1,12 @@
+\input texinfo
+@title README 20.2 for Cygwin B20.1 Release.
+
+@setfilename readme.txt
+
+@include sites.texinfo
+@include install.texinfo
+
+@chapter Release Information
+@include changes.texinfo
+
+@include relnotes.texinfo
diff --git a/winsup/doc/relnotes.texinfo b/winsup/doc/relnotes.texinfo
new file mode 100644
index 000000000..5c3020304
--- /dev/null
+++ b/winsup/doc/relnotes.texinfo
@@ -0,0 +1,15 @@
+@chapter Known/potential Problems in the B20.1 Release
+
+@section Windows 95 freezing up
+While this problem may have been worse under B19, Control-c's in bash
+under Win 95 may still be able to lock up the Win 95 kernel, freezing
+your machine. This problem can be fixed if you are running the OSR2
+version of Win 95 by installing the USB patch available on OSR2 CDs or
+on MSDN subscription CDs. More information about OSR2 and the USB patch
+is available from @file{http://www.compuclinic.com/osr2faq/index.html}.
+
+@section Some programs can't deal with // pathname scheme in arguments
+gcc and other tools aren't fully compatible with the current pathname
+scheme: it can't grok an argument of -I//d/foo which means it is vital
+that when attempting to configure/build UNIX packages, that only normal
+paths with single slashes are used.
diff --git a/winsup/doc/setup-net.sgml b/winsup/doc/setup-net.sgml
new file mode 100644
index 000000000..184233026
--- /dev/null
+++ b/winsup/doc/setup-net.sgml
@@ -0,0 +1,131 @@
+<chapter id="setup-net"><title>Setting Up Cygwin</title>
+
+<sect1><title>Cygwin Contents</title>
+
+<para>The following packages are included in the full release:</para>
+
+<para>Development tools: binutils, bison, byacc, dejagnu, diff,
+expect, flex, gas, gcc, gdb, itcl, ld, libstdc++, make, patch, tcl,
+tix, tk</para>
+
+<para>User tools: ash, bash, bzip2, diff, fileutils, findutils, gawk,
+grep, gzip, less, m4, sed, shellutils, tar, textutils, time</para>
+
+<para>The user tools release only contains the user tools.</para>
+
+<para>Full source code is available for these tools.</para>
+
+</sect1>
+<sect1><title>Installing the binary release</title>
+
+<para>Important! Be sure to remove any older versions of the Cygwin
+tools from your <EnVar>PATH</EnVar> environment variable so you do
+not execute them by mistake.</para>
+
+<para>Connect to one of the ftp servers listed in
+<ulink URL="http://sourceware.cygnus.com/cygwin/mirrors.html">
+http://sourceware.cygnus.com/cygwin/mirrors.html</ulink> and
+<command>cd</command> to the directory containing the latest release.
+</para>
+
+<para>If you want the development tools and the programs necessary to
+run the GNU configure mechanism, you should download the full binary
+release called <filename>full.exe</filename>. If you only care
+about the user tools listed above, download
+<filename>usertools.exe</filename> instead.</para>
+
+<para>If you have an unreliable connection, download the appropriate
+binary in smaller chunks instead. For the split full installer, get
+the files in the `full-split' subdirectory. Once downloaded,
+combine the split files at the command prompt by doing a:</para>
+
+<screen>
+<prompt>C:\Cygnus\&gt;</prompt><userinput>copy /b xaa + xab + xac + ... + xak + xal full.exe</userinput>
+<prompt>C:\Cygnus\&gt;</prompt><userinput>del xa*.*</userinput>
+</screen>
+
+<para>A similar process can be used for the user tools.</para>
+
+<para>Once you have installed the executable on your system, run
+it. First off, the installer will prompt you for a location to extract
+the temporary files it needs to install the release on your
+system. The default should be fine for most people.</para>
+
+<para>Next it will ask you to choose an install location. The default is
+<filename><replaceable>system-drive</replaceable>:\cygnus\cygwin-b20</filename>.
+Feel free to choose another location if you would prefer.</para>
+
+<para>Finally, it will ask you for the name of the Program Files
+folder shortcut to add. By default, the installer will create a
+`Cygwin B20' entry in a folder called `Cygnus Solutions'. When this
+step is completed, it will install the tools and exit.</para>
+
+<para>If you should ever want to uninstall the tools, you may do so
+via the "Add/Remove Programs" control panel.</para>
+
+<para> At this point you should be able to look under the start menu and
+select "Cygwin Beta 20" (or whatever you named it). This will pop up a bash
+shell with special environment variables set up for you. If you are running
+Windows 95 or 98 and are faced with the error message "Out of environment
+space", you need to increase the amount of environment space. Adding the
+line <command>shell=C:\command.com /e:4096 /p</command> to the file
+<filename>C:\CONFIG.SYS</filename> and then rebooting should do the trick if
+<filename>C:</filename> is your system drive letter.</para>
+
+<para>If you want to install the sources follow the
+instructions in the next section, else go directly to
+<Xref LinkEnd="setup-dir"> to complete your system setup.</para>
+
+</sect1>
+<sect1><title>Installing the source code</title>
+
+<para>Before downloading the source code corresponding to the release,
+you should install the latest release of the tools (either the full
+release or just the user tools).</para>
+
+<para>Create the directory that will house the source code.
+<command>cd</command> there.</para>
+
+<para>Connect to one of the ftp servers listed above and
+<command>cd</command> to the directory containing the latest release.
+</para>
+
+<para>The source code is split into two units: user tools and development
+tools. If you want the user tools source code, <command>cd</command> into
+the <filename>user-src-split</filename> subdirectory. Download the files
+there. If you want the development tools sources, <command>cd</command>
+into the <filename>dev-src-split</filename> subdirectory. Download the
+files there.</para>
+
+<para>Back in the Windows command shell, for the user tools
+source:</para>
+
+<screen>
+<prompt>C:\Cygnus\&gt;</prompt> <userinput>copy /b xba + xbb + xbc + xbd + xbe + xbf + xbg user-src.tar.bz2</userinput>
+<prompt>C:\Cygnus\&gt;</prompt> <userinput>del xb*.*</userinput>
+<prompt>C:\Cygnus\&gt;</prompt> <userinput>bunzip2 user-src.tar.bz2</userinput>
+<prompt>C:\Cygnus\&gt;</prompt> <userinput>tar xvf user-src.tar</userinput>
+</screen>
+
+<para>For the development tools source:</para>
+
+<screen>
+<prompt>C:\Cygnus\&gt;</prompt> <userinput>copy /b xca + xcb + xcc + xcd + ... + xck + xcl dev-src.tar.bz2</userinput>
+<prompt>C:\Cygnus\&gt;</prompt> <userinput>del xc*.*</userinput>
+<prompt>C:\Cygnus\&gt;</prompt> <userinput>bunzip2 dev-src.tar.bz2</userinput>
+<prompt>C:\Cygnus\&gt;</prompt> <userinput>tar xvf dev-src.tar</userinput>
+</screen>
+
+<para>Both will expand into a directory called
+<filename>src</filename>.</para>
+
+<para>Note: if you want the sources corresponding to everything in the
+full.exe binary installer, you will need to download and expand both
+the <filename>user-src.tar.bz2</filename> and
+<filename>dev-src.tar.bz2</filename> source archives!</para>
+</sect1>
+
+DOCTOOL-INSERT-setup-dir
+DOCTOOL-INSERT-setup-env
+DOCTOOL-INSERT-setup-files
+</chapter>
diff --git a/winsup/doc/setup.sgml b/winsup/doc/setup.sgml
new file mode 100644
index 000000000..2e6ce2857
--- /dev/null
+++ b/winsup/doc/setup.sgml
@@ -0,0 +1,42 @@
+<chapter id="setup"><title>Setting Up Cygwin</title>
+
+<sect1><title>Cygwin Contents</title>
+
+<para>The following packages are included in the native Win32
+release of GNUPro:</para>
+
+<para>GNUPro development tools: binutils, bison, byacc, dejagnu,
+diff, expect, flex, gas, gcc, gdb, itcl, ld, libstdc++, make, patch,
+tcl, tix, tk</para>
+
+<para>GNUPro unsupported tools: ash, bash, bzip2, diff, fileutils,
+findutils, gawk, grep, gzip, m4, sed, shellutils, tar, textutils,
+time</para>
+
+<sect1><title>Installing the binary release</title>
+
+<para>Load the GNUPro CD-ROM and run the installer. It will
+take you through the installation process, starting with asking for
+your install location. Once the installation is complete, there will
+be a new Program Files folder that you can use to obtain a shell
+from which you can run the tools.</para>
+
+<para>There are two remaining thing you should do from this
+prompt. First, you need to type <command>mkdir -p /tmp</command> to
+ensure that a temp directory exists for programs that expect to find
+one there.</para>
+
+<para>Second, depending on how you intend to use the tools, various
+programs may need to be able to find `/bin/sh'. You should `mkdir -p
+/bin' and put a copy of `sh.exe' there, removing the older version, if
+present. Note that you can use the `mount' utility to select which
+drive letter is mounted as `/'.</para>
+
+<para>If you should ever want to uninstall the tools, you may do so
+via the "Add/Remove Programs" control panel.</para>
+
+DOCTOOL-INSERT-setup-dir
+DOCTOOL-INSERT-setup-env
+DOCTOOL-INSERT-setup-reg
+DOCTOOL-INSERT-setup-mount
+</chapter>
diff --git a/winsup/doc/setup2.sgml b/winsup/doc/setup2.sgml
new file mode 100644
index 000000000..7a24e5fa1
--- /dev/null
+++ b/winsup/doc/setup2.sgml
@@ -0,0 +1,279 @@
+<sect1 id="setup-dir"><title>Directory Structure</title>
+
+<para>
+Cygwin knows how to emulate a standard UNIX directory structure, to
+some extent. This is done through the use of mount tables that map
+Win32 paths to POSIX ones. The mount table may be set up and modified
+with the <command>mount</command> command. This section explains how
+to properly organize the structure. </para>
+
+<para> When you set up the system you should decide where you want the
+root to be mapped. Possible choices are the root of your Windows
+system, such as
+<filename>c:</filename> or a directory such as
+<filename>c:\progra~1\root</filename>.
+</para>
+
+<para>
+Execute the following commands inside bash as it is difficult to
+change the position of the root from the Windows command prompt.
+Changing the mount points may invalidate <EnVar>PATH</EnVar>, if this
+happens simply exit and relaunch bash. Create the directory if
+needed, then <command>umount /</command> the current root and
+<command>mount</command> it in its new place. You also have to decide if
+you want to use text or binary mode.
+</para>
+
+<para>
+Next, create the traditional main UNIX directories, with
+the following command (in some shells it is necessary to issue
+separate <command>mkdir</command> commands, each with a single
+argument).
+</para>
+
+<screen>
+<prompt>/$</prompt> <userinput>mkdir /tmp /bin /etc /var /usr</userinput>
+</screen>
+
+<para>
+Next we will initialize the content of these directories.
+</para>
+
+<para>
+You should make sure that you always have a valid
+<filename>/tmp</filename> directory. If you want to avoid creating a
+real <filename>/tmp</filename>, you can use the
+<command>mount</command> utility to point <filename>/tmp</filename> to
+another directory, such as <filename>c:\tmp</filename>, or create a
+symbolic link <filename>/tmp</filename> to point to such a directory.
+</para>
+
+<para>
+The <filename>/bin</filename> directory should contain the shell
+<filename>sh.exe</filename>. You have three choices. The first is to
+copy this program from the Cygnus <filename>bin</filename> directory.
+The second is to use <command>mount</command> to mount the Cygnus
+<filename>bin</filename> directory to <filename>/bin</filename> (the
+advantage of this approach is that your <envar>PATH</envar> will be
+shorter inside bash). The third is to make <filename>/bin</filename> a
+symbolic link to the Cygnus <filename>bin</filename> directory.
+</para>
+
+<para>
+Note that Cygwin comes with two shells: <command>bash.exe</command> and
+<command>sh.exe</command>, which is based on <command>ash</command>. The
+system is faster when <command>ash</command> is used as the
+non-interactive shell.
+The only functionality supported in <command>ash</command> is that
+of the traditional <command>sh</command>.
+In case of trouble with <command>ash</command> make
+<command>sh.exe</command> point to <command>bash.exe</command>.
+</para>
+
+<para>
+We now turn to <filename>/etc</filename>. You may want to copy in it
+the <filename>termcap</filename> file from the Cygnus
+<filename>etc</filename> directory, although the defaults built into
+the programs suffice for the normal console. You may also use
+<command>mount</command> or create as symbolic link to the Cygnus
+<filename>etc</filename>, just as for <filename>/bin</filename>
+above.
+</para>
+
+<para> Under Windows NT, if you want to create
+<filename>/etc/passwd</filename> and <filename>/etc/group</filename>
+(i.e. so that <command>whoami</command> works and
+<command>ls -l</command> replaces the UID with a name) just
+do this:
+</para>
+
+<screen>
+<prompt>/$</prompt> <userinput>cd /etc</userinput>
+<prompt>/etc$</prompt> <userinput>mkpasswd -l > /etc/passwd</userinput>
+<prompt>/etc$</prompt> <userinput>mkgroup -l > /etc/group</userinput>
+</screen>
+
+<para> Future changes to your NT registry will NOT be reflected in
+<filename>/etc/passwd</filename> or <filename>/etc/group </filename> after
+this so you may want to regenerate these files periodically. Under Windows
+9x, you can create and edit these files with a text editor. </para>
+
+<para>
+The <command>who</command> command requires the
+<filename>/var/run/utmp</filename> to exist.
+Create it if you wish.
+The system also logs information in <filename>/var/log/wtmp</filename>,
+if it exists.
+</para>
+
+<para>
+The <filename>/usr</filename> directory is not used by the Cygwin
+system but it is a standard place to install optional packages.
+</para>
+
+<para>
+You may also want to mount directories such as <filename>/a</filename>
+and <filename>/d</filename> to refer to your local and network drives.
+</para>
+
+<para>
+You do not need to create <filename>/dev</filename> in order to set up
+mounts for devices such as <filename>/dev/null</filename> as these
+are already automatically simulated inside the Cygwin library.
+</para>
+
+</sect1>
+
+<sect1 id="setup-env"><title>Environment Variables</title>
+
+<para>
+Before starting bash, you must set some environment variables, some of
+which can also be set or modified inside bash. Cygnus provides you
+with a .bat file where the most important ones are set before bash in
+launched. This is the safest way to launch bash initially. The .bat
+file is installed by default in
+<filename>\cygnus\cygwin-b20/cygnus.bat</filename> and pointed to in
+the Start Menu. You can edit it to your liking.
+</para>
+
+<para>
+The <envar>CYGWIN</envar> variable is used to configure many global
+settings for the Cygwin
+runtime system. Initially you can leave <envar>CYGWIN</envar> unset
+or set it to <literal>tty</literal> (e.g. to support job control with ^Z
+etc...) using a syntax like this in the DOS shell, before launching bash.
+</para>
+
+<screen>
+<prompt>C:\Cygnus\&gt;</prompt> <userinput>set CYGWIN=tty notitle strace=0x1</userinput>
+</screen>
+
+<para>
+The <envar>PATH</envar> environment variable is used by Cygwin
+applications as a list of directories to search for executable files
+to run. This environment variable is converted from Windows format
+(e.g. <filename>C:\WinNT\system32;C:\WinNT</filename>) to UNIX format
+(e.g., <filename>/WinNT/system32:/WinNT</filename>) when a Cygwin
+process first starts.
+Set it so that it contains at least the Cygnus
+<filename>bin</filename> directory
+<filename>C:\cygnus\cygwin-b20\H-i586-cygwin32\bin</filename> before
+launching bash.
+</para>
+
+<para>
+The <envar>HOME</envar> environment variable is used by many programs to
+determine the location of your home directory and we recommend that it be
+defined. This environment variable is also converted from Windows format
+when a Cygwin process first starts. Set it to point to your home directory
+before launching bash.
+</para>
+
+<para>
+<command>make</command> uses an environment variable
+<envar>MAKE_MODE</envar> to decide if it uses
+<filename>command.com</filename> or <filename>/bin/sh</filename> to
+run command lines. If you are getting strange errors from
+<command>make</command> about "/c not found", set
+<envar>MAKE_MODE</envar> to <literal>UNIX</literal> at the command
+prompt or in bash.
+</para>
+
+<screen>
+<prompt>C:\Cygnus\&gt;</prompt> <userinput>set MAKE_MODE=UNIX</userinput>
+
+<prompt>/Cygnus$</prompt> <userinput>export MAKE_MODE=UNIX</userinput>
+</screen>
+
+<para>
+The <envar>TERM</envar> environment variable specifies your terminal
+type. You can set it to <literal>cygwin</literal>.
+</para>
+
+<para>The <envar>LD_LIBRARY_PATH</envar> environment variable is
+used by the Cygwin function <function>dlopen ()</function> as a list
+of directories to search for .dll files to load. This environment
+variable is converted from Windows format to UNIX format
+when a Cygwin process first starts.
+Most Cygwin applications do not make use of the
+<function>dlopen ()</function> call and do not need this variable.
+</para>
+
+</sect1>
+
+<sect1 id="setup-files"><title>Customizing bash</title>
+
+<para>
+To set bash up so that cut and paste work properly, click on the
+"Properties" button of the window, then on the "Misc" tab. Make sure
+that "Quick Edit" is checked and "Fast Pasting" isn't. These settings
+will be remembered next time you run bash from that
+shortcut. Similarly you can set the working directory inside the
+"Program" tab. The entry "%HOME%" is valid.
+</para>
+
+<para>
+Your home directory should contain three initialization files
+that control the behavior of bash. They are
+<filename>.profile</filename>, <filename>.bashrc</filename> and
+<filename>.inputrc</filename>. These initialization files will only
+be read if <envar>HOME</envar> is defined before starting bash.
+</para>
+
+<para>
+<filename>.profile</filename> (other names are also valid, see the bash man
+page) contains bash commands. It is executed when bash is started as login
+shell, e.g. from the command <command>bash --login</command> (the provided
+.bat file does not set the switch). This is a useful place to define and
+export environment variables and bash functions that will be used by bash
+and the programs invoked by bash. It is a good place to redefine
+<envar>PATH</envar> if needed. We recommend adding a ":." to the end of
+<envar>PATH</envar> to also search the current working directory (contrary
+to DOS, the local directory is not searched by default). Also to avoid
+delays you should either <command>unset</command> <envar>MAILCHECK</envar>
+or define <envar>MAILPATH</envar> to point to your existing mail inbox.
+</para>
+
+<para>
+<filename>.bashrc</filename> is similar to
+<filename>.profile</filename> but is executed each time an interactive
+bash shell is launched. It serves to define elements that are not
+inherited through the environment, such as aliases. If you do not use
+login shells, you may want to put the contents of
+<filename>.profile</filename> as discussed above in this file
+instead.
+</para>
+
+<para>
+<screen>
+shopt -s nocaseglob
+</screen>
+will allow bash to glob filenames in a case-insensitive manner.
+Note that <filename>.bashrc</filename> is not called automatically for login
+shells. You can source it from <filename>.profile</filename>.
+</para>
+
+<para>
+<filename>.inputrc</filename> controls how programs using the readline
+library (including bash) behave. It is loaded automatically. The
+full details are in the <filename>readline.info</filename>.
+Due to a bug in the current readline version,
+<filename>.inputrc</filename> cannot contain \r,
+even on text mounted systems.
+Consider the following settings:
+<screen>
+# Make Bash 8bit clean
+set meta-flag on
+set convert-meta off
+set output-meta on
+# Ignore case while completing
+set completion-ignore-case on
+</screen>
+<para>The first three commands allow bash to display 8-bit characters,
+useful for languages with accented characters. The last line makes
+filename completion case insensitive, which can be convenient in a
+Windows environment.
+</para>
+
+</sect1>
+
diff --git a/winsup/doc/textbinary.sgml b/winsup/doc/textbinary.sgml
new file mode 100644
index 000000000..cf6fc1b36
--- /dev/null
+++ b/winsup/doc/textbinary.sgml
@@ -0,0 +1,181 @@
+<sect1 id="using-textbinary"><title>Text and Binary modes</title>
+
+<sect2> <title>The Issue</title>
+
+<para>On a UNIX system, when an application reads from a file it gets
+exactly what's in the file on disk and the converse is true for writing.
+The situation is different in the DOS/Windows world where a file can
+be opened in one of two modes, binary or text. In the binary mode the
+system behaves exactly as in UNIX. However in text mode there are
+major differences:</para>
+<OrderedList Numeration="Loweralpha" Spacing="Compact">
+<listitem>
+<para>
+On writing in text mode, a NL (\n, ^J) is transformed into the
+sequence CR (\r, ^M) NL.</para>
+</listitem>
+<listitem>
+<para>
+On reading in text mode, a CR followed by an NL is deleted and a ^Z
+character signals the end of file.</para>
+</listitem>
+</OrderedList>
+
+<para>This can wreak havoc with the seek/fseek calls since the number
+of bytes actually in the file may differ from that seen by the
+application.</para>
+
+<para>The mode can be specified explicitly as explained in the Programming
+section below. In an ideal DOS/Windows world, all programs using lines as
+records (such as <command>bash</command>, <command>make</command>,
+<command>sed</command> ...) would open files (and change the mode of their
+standard input and output) as text. All other programs (such as
+<command>cat</command>, <command>cmp</command>, <command>tr</command> ...)
+would use binary mode. In practice with Cygwin, programs that deal
+explicitly with object files specify binary mode (this is the case of
+<command>od</command>, which is helpful to diagnose CR problems). Most
+other programs (such as <command>cat</command>, <command>cmp</command>,
+<command>tr</command>) use the default mode.</para>
+
+</sect2>
+
+<sect2><title>The default Cygwin behavior</title>
+
+<para>The Cygwin system gives us some flexibility in deciding how files
+are to be opened when the mode is not specified explicitly.
+The rules are evolving, this section gives the design goals.</para>
+<OrderedList Numeration="Loweralpha">
+<listitem>
+<para>If the file appears to reside on a file system that is mounted
+(i.e. if its pathname starts with a directory displayed by
+<command>mount</command>), then the default is specified by the mount
+flag. If the file is a symbolic link, the mode of the target file system
+applies.</para>
+</listitem>
+<listitem>
+<para>If the file appears to reside on a file system that is not mounted
+(as can happen when the path contains a drive letter), the default is text.
+</para>
+</listitem>
+<listitem>
+<para>Pipes and non-file devices are opened in binary mode,
+except if the <EnVar>CYGWIN</EnVar> environment variable contains
+<literal>nobinmode</literal>.</para>
+<warning><Title>Warning!</Title><para>In b20.1 of 12/98, a file will be opened
+in binary mode if any of the following conditions hold:</para>
+<OrderedList Numeration="arabic" Spacing="Compact">
+<listitem><para>binary mode is specified in the open call</para>
+</listitem>
+<listitem><para><envar>CYGWIN</envar> contains <literal>binmode</literal></para>
+</listitem>
+<listitem><para>the file resides in a binary mounted partition</para>
+</listitem>
+<listitem><para>the file is not a disk file</para>
+</listitem>
+</OrderedList>
+</warning>
+</listitem>
+
+<listitem>
+<para>When a Cygwin program is launched by a shell, its standard input,
+output and error are in binary mode if the <envar>CYGWIN</envar> variable
+contains <literal>tty</literal>, else in text mode, except if they are piped
+or redirected.</para>
+<para> When redirecting, the Cygwin shells uses rules (a-c). For
+these shells the relevant value of <envar>CYGWIN</envar> is that at the time
+the shell was launched and not that at the time the program is executed.
+Non-Cygwin shells always pipe and redirect with binary mode. With
+non-Cygwin shells the commands <command> cat filename | program </command>
+and <command> program &lt filename </command> are not equivalent when
+<filename>filename</filename> is on a text-mounted partition. </para>
+</listitem>
+</OrderedList>
+</sect2>
+
+<sect2><title>Example</title>
+<para>To illustrate the various rules, we provide scripts to delete CRs
+from files by using the <command>tr</command> program, which can only write
+to standard output.
+The script</para>
+<screen>
+#!/bin/sh
+# Remove \r from the file given as argument
+tr -d '\r' < "$1" > "$1".nocr
+</screen>
+<para> will not work on a text mounted systems because the \r will be
+reintroduced on writing. However scripts such as </para>
+<screen>
+#!/bin/sh
+# Remove \r from the file given as argument
+tr -d '\r' | gzip | gunzip > "$1".nocr
+</screen>
+<para>and the .bat file</para>
+<screen>
+REM Remove \r from the file given as argument
+@echo off
+tr -d \r < %1 > %1.nocr
+</screen>
+<para> work fine. In the first case (assuming the pipes are binary)
+we rely on <command>gunzip</command> to set its output to binary mode,
+possibly overriding the mode used by the shell.
+In the second case we rely on the DOS shell to redirect in binary mode.
+</para>
+</sect2>
+
+<sect2><title>Binary or text?</title>
+
+<para>UNIX programs that have been written for maximum portability
+will know the difference between text and binary files and act
+appropriately under Cygwin. For those programs, the text mode default
+is a good choice. Programs included in official Cygnus distributions
+should work well in the default mode. </para>
+
+<para>Text mode makes it much easier to mix files between Cygwin and
+Windows programs, since Windows programs will usually use the CRLF
+format. Unfortunately you may still have some problems with text
+mode. First, some of the utilities included with Cygwin do not yet
+specify binary mode when they should, e.g. <command>cat</command> will
+not work with binary files (input will stop at ^Z, CRs will be
+introduced in the output). Second, you will introduce CRs in text
+files you write, which can cause problems when moving them back to a
+UNIX system. </para>
+
+<para>If you are mounting a remote file system from a UNIX machine,
+or moving files back and forth to a UNIX machine, you may want to
+access the files in binary mode. The text files found there will normally
+be in UNIX NL format, and you would want any files put there by Cygwin
+programs to be stored in a format understood by UNIX.
+Be sure to remove CRs from all Makefiles and
+shell scripts and make sure that you only edit the files with
+DOS/Windows editors that can cope with and preserve NL terminated lines.
+</para>
+
+<para>Note that you can decide this on a disk by disk basis (for
+example, mounting local disks in text mode and network disks in binary
+mode). You can also partition a disk, for example by mounting
+<filename>c:</filename> in text mode, and <filename>c:\home</filename>
+in binary mode.</para>
+
+</sect2>
+
+<sect2><title>Programming</title>
+
+<para>In the <function>open()</function> function call, binary mode can be
+specified with the flag <literal>O_BINARY</literal> and text mode with
+<literal>O_TEXT</literal>. These symbols are defined in
+<filename>fcntl.h</filename>.</para>
+
+<para>In the <function>fopen()</function> function call, binary mode can be
+specified by adding a <literal>b</literal> to the mode string. There is no
+direct way to specify text mode.</para>
+
+<para>The mode of a file can be changed by the call
+<function>setmode(fd,mode)</function> where <literal>fd</literal> is a file
+descriptor (an integer) and <literal>mode</literal> is
+<literal>O_BINARY</literal> or <literal>O_TEXT</literal>. The function
+returns <literal>O_BINARY</literal> or <literal>O_TEXT</literal> depending
+on the mode before the call, and <literal>EOF</literal> on error.</para>
+
+</sect2>
+
+</sect1>
diff --git a/winsup/doc/using.sgml b/winsup/doc/using.sgml
new file mode 100644
index 000000000..9d60e77bf
--- /dev/null
+++ b/winsup/doc/using.sgml
@@ -0,0 +1,19 @@
+<chapter id="using"><title>Using Cygwin</title>
+
+<para>This chapter explains some key differences between the Cygwin
+environment and traditional UNIX systems. It assumes a working
+knowledge of standard UNIX commands.</para>
+
+DOCTOOL-INSERT-using-pathnames
+
+DOCTOOL-INSERT-using-textbinary
+
+DOCTOOL-INSERT-using-filemodes
+
+DOCTOOL-INSERT-using-specialnames
+
+DOCTOOL-INSERT-using-cygwinenv
+
+DOCTOOL-INSERT-using-utils
+
+</chapter>
diff --git a/winsup/doc/what.texinfo b/winsup/doc/what.texinfo
new file mode 100644
index 000000000..dd55f0fde
--- /dev/null
+++ b/winsup/doc/what.texinfo
@@ -0,0 +1,85 @@
+@chapter What is it?
+
+The Cygwin tools are ports of the popular GNU development tools
+for Windows NT, 95, and 98. They run thanks to the Cygwin library which
+provides the UNIX system calls and environment these programs expect.
+
+With these tools installed, it is possible to write Win32 console or
+GUI applications that make use of the standard Microsoft Win32 API
+and/or the Cygwin API. As a result, it is possible to easily
+port many significant Unix programs without the need
+for extensive changes to the source code. This includes configuring
+and building most of the available GNU software (including the packages
+included with the Cygwin development tools themselves). Even if
+the development tools are of little to no use to you, you may have
+interest in the many standard Unix utilities provided with the package.
+They can be used both from the bash shell (provided) or from the
+standard Windows command shell.
+
+@section Is it free software?
+
+Yes. Parts are GNU software (gcc, gas, ld, etc...), parts are covered
+by the standard X11 license, some of it is public domain, some of
+it was written by Cygnus and placed under the GPL. None of it is
+shareware. You don't have to pay anyone to use it but you should be
+sure to read the copyright section of the FAQ more more information on
+how the GNU General Public License may affect your use of these tools.
+
+In particular, if you intend to port a proprietary (non-GPL'd)
+application using Cygwin, you will need the proprietary-use license
+for the Cygwin library. This is available for purchase; please
+contact sales@@cygnus.com for more information.
+All other questions should be sent to the project
+mailing list cygwin@@sourceware.cygnus.com.
+
+Note that when we say "free" we mean freedom, not price. The goal of
+such freedom is that the people who use a given piece of software
+should be able to change it to fit their needs, learn from it, share
+it with their friends, etc. The Cygwin license allows you those
+freedoms, so it is free software.
+
+The Cygwin 1.0 product is a "commercial" distribution of cygwin. As
+such, it includes such non-software things as printed manuals,
+support, and aggregation of useful utilities. There is nothing
+(software-wise) in there that you can't already get off the net
+already, if you take the time to find and download everything (and
+usually, build it yourself). We test it all to make sure it works
+together, and package it in a convenient form. We consider such
+testing and packaging to be a valuable service and thus charge a fee
+for it. Plus, it provides income for the cygwin project so we can
+continue working on it :-)
+
+@section A brief history of the project
+
+The first thing done was to enhance the development tools (gcc, gdb,
+gas, et al) so that they could generate/interpret Win32 native object
+files.
+
+The next task was to port the tools to Win NT/95. We could have done
+this by rewriting large portions of the source to work within the
+context of the Win32 API. But this would have meant spending a huge
+amount of time on each and every tool. Instead, we took a substantially
+different approach by writing a shared library (cygwin.dll) that adds
+the necessary unix-like functionality missing from the Win32 API (fork,
+spawn, signals, select, sockets, etc.). We call this new interface the
+Cygwin API. Once written, it was possible to build working Win32
+tools using unix-hosted cross-compilers, linking against this library.
+
+From this point, we pursued the goal of producing native tools capable of
+rebuilding themselves under Windows 95 and NT (this is often
+called self-hosting). Since neither OS ships with standard UNIX
+user tools (fileutils, textutils, bash, etc...), we had to get the
+GNU equivalents working with the Cygwin API. Most of these tools were
+previously only built natively so we had to modify their configure
+scripts to be compatible with cross-compilation. Other than the
+configuration changes, very few source-level changes had to be made.
+Running bash with the development tools and user tools in place,
+Windows 95 and NT look like a flavor of UNIX from the perspective of the
+GNU configure mechanism. Self hosting was achieved as of the beta 17.1
+release.
+
+After adding Windows 98 support to Cygwin in mid-1998, we added support
+for the native Microsoft libraries in the compiler which allows
+compilation of executables that do not use Cygwin. This is important to
+those people who want to use the tools to develop Win32 applications
+that do not need the UNIX emulation layer.
diff --git a/winsup/doc/who.texinfo b/winsup/doc/who.texinfo
new file mode 100644
index 000000000..a15d090ac
--- /dev/null
+++ b/winsup/doc/who.texinfo
@@ -0,0 +1,71 @@
+@chapter Who's behind the project?
+
+Chris Faylor (cgf@@cygnus.com) is behind many of the recent
+changes in Cygwin. Prior to joining Cygnus, he contributed significant
+fixes to the process control and environ code, reworked the strace
+mechanism, and rewrote the signal-related code from scratch as a Net
+contributor. In addition to continuing to make technical contributions,
+Chris is also currently the group's manager.
+
+Geoffrey Noer (noer@@cygnus.com) took over the Cygwin project from its'
+initial author Steve Chamberlain in mid-1996. As maintainer, he
+produced Net releases beta 16 through 20; made the development
+snapshots; worked with Net contributors to fix bugs; made many various
+code improvements himself; wrote a paper on Cygwin for the
+1998 Usenix NT Symposium; authored the project WWW pages, FAQ, README;
+etc.
+
+DJ Delorie (dj@@cygnus.com) has done important work in profiling Cygwin,
+worked on the Dejagnu automated testing framework, merged the dlltool
+functionality into ld, wrote a good deal of the Cygwin Users' Guide,
+authored the cygcheck utility, and made automated snapshots available
+from our project WWW page.
+
+Steve Chamberlain (sac@@transmeta.com) designed and implemented
+Cygwin in 1995-1996 while working for Cygnus. He worked with the Net
+to improve the technology, ported/integrated many of the user tools
+for the first time to Cygwin, and produced all of the releases up to
+beta 14.
+
+Marco Fuykschot (marco@@ddi.nl) and Peter Boncz (boncz@@ddi.nl) of
+Data Distilleries contributed nearly all of the changes required to
+make Cygwin thread-safe. They also provided the pthreads interface.
+
+Sergey Okhapkin (sos@@prospect.com.ru) has been an invaluable Net
+contributor. He implemented the tty/pty support, has played a
+significant role in revamping signal and exception handling, and has
+made countless contributions throughout the library. He also provided
+binaries of the development snapshots to the Net after the beta 19
+release.
+
+Mumit Khan (khan@@xraylith.wisc.edu) has been most helpful on the EGCS
+end of things, providing quite a large number of stabilizing patches to
+the compiler tools for the B20 release.
+
+Corinna Vinschen <corinna@@vinschen.de> has contributed several
+useful fixes to the path handling code, console support, improved security
+handling, and raw device support.
+
+Philippe Giacinti (giac@@dalim.de) contributed the implementation of
+dlopen, dlclose, dlsym, dlfork, and dlerror in Cygwin.
+
+Many other people at Cygnus have made important contributions to Cygwin.
+Tobin Brockett wrote the InstallShield-based installer for the beta 19
+and 20 releases. Ian Lance Taylor did a much-needed rework of the path
+handling code for beta 18, and has made many assorted fixes throughout
+the code. Jeremy Allison made significant contributions in the area of
+file handling and process control, and rewrote select from scratch.
+Doug Evans rewrote the path-handling code in beta 16, among other
+things. Kim Knuttila and Michael Meissner put in many long hours
+working on the now-defunct PowerPC port. Jason Molenda and Mark Eichin
+have also made important contributions.
+
+Please note that those of us here at Cygnus that work on Cygwin try to
+be as responsive as possible and deal with patches and questions as we
+get them, but realistically we don't have time to answer all of the
+email that is sent to the main mailing list. Making Net releases of the
+Win32 tools and helping people on the Net out is not our primary job
+function, so some email will have to go unanswered.
+
+Many thanks to everyone using the tools for their many contributions in
+the form of advice, bug reports, and code fixes. Keep them coming!
diff --git a/winsup/doc/windres.sgml b/winsup/doc/windres.sgml
new file mode 100644
index 000000000..2d5410639
--- /dev/null
+++ b/winsup/doc/windres.sgml
@@ -0,0 +1,167 @@
+
+<sect1 id="windres"><title>Defining Windows Resources</title>
+
+<para><filename>windres</filename> reads a Windows resource file
+(<filename>*.rc</filename>) and converts it to a res or coff file.
+The syntax and semantics of the input file are the same as for any
+other resource compiler, so please refer to any publication describing
+the Windows resource format for details. Also, the
+<filename>windres</filename> program itself is fully documented in the
+Binutils manual. Here's an example of using it in a project:</para>
+
+<screen>
+myapp.exe : myapp.o myapp.res
+ gcc -mwindows myapp.o myapp.res -o $@
+
+myapp.res : myapp.rc resource.h
+ windres $< -O coff -o $@
+</screen>
+
+
+<para>What follows is a quick-reference to the syntax
+<filename>windres</filename> supports.</para>
+
+<screen>
+
+id ACCELERATORS suboptions
+BEG
+"^C" 12
+"Q" 12
+65 12
+65 12 , VIRTKEY ASCII NOINVERT SHIFT CONTROL ALT
+65 12 , VIRTKEY, ASCII, NOINVERT, SHIFT, CONTROL, ALT
+(12 is an acc_id)
+END
+
+SHIFT, CONTROL, ALT require VIRTKEY
+
+
+id BITMAP memflags "filename"
+memflags defaults to MOVEABLE
+
+
+id CURSOR memflags "filename"
+memflags defaults to MOVEABLE,DISCARDABLE
+
+
+id DIALOG memflags exstyle x,y,width,height styles BEG controls END
+id DIALOGEX memflags exstyle x,y,width,height styles BEG controls END
+id DIALOGEX memflags exstyle x,y,width,height,helpid styles BEG controls END
+
+memflags defaults to MOVEABLE
+exstyle may be EXSTYLE=number
+styles: CAPTION "string"
+ CLASS id
+ STYLE FOO | NOT FOO | (12)
+ EXSTYLE number
+ FONT number, "name"
+ FONT number, "name",weight,italic
+ MENU id
+ CHARACTERISTICS number
+ LANGUAGE number,number
+ VERSIONK number
+controls:
+ AUTO3STATE params
+ AUTOCHECKBOX params
+ AUTORADIOBUTTON params
+ BEDIT params
+ CHECKBOX params
+ COMBOBOX params
+ CONTROL ["name",] id, class, style, x,y,w,h [,exstyle] [data]
+ CONTROL ["name",] id, class, style, x,y,w,h, exstyle, helpid [data]
+ CTEXT params
+ DEFPUSHBUTTON params
+ EDITTEXT params
+ GROUPBOX params
+ HEDIT params
+ ICON ["name",] id, x,y [data]
+ ICON ["name",] id, x,y,w,h, style, exstyle [data]
+ ICON ["name",] id, x,y,w,h, style, exstyle, helpid [data]
+ IEDIT params
+ LISTBOX params
+ LTEXT params
+ PUSHBOX params
+ PUSHBUTTON params
+ RADIOBUTTON params
+ RTEXT params
+ SCROLLBAR params
+ STATE3 params
+ USERBUTTON "string", id, x,y,w,h, style, exstyle
+params:
+ ["name",] id, x, y, w, h, [data]
+ ["name",] id, x, y, w, h, style [,exstyle] [data]
+ ["name",] id, x, y, w, h, style, exstyle, helpid [data]
+
+[data] is optional BEG (string|number) [,(string|number)] (etc) END
+
+
+id FONT memflags "filename"
+memflags defaults to MOVEABLE|DISCARDABLE
+
+id ICON memflags "filename"
+memflags defaults to MOVEABLE|DISCARDABLE
+
+LANGUAGE num,num
+
+id MENU options BEG items END
+items:
+ "string", id, flags
+ SEPARATOR
+ POPUP "string" flags BEG menuitems END
+flags:
+ CHECKED
+ GRAYED
+ HELP
+ INACTIVE
+ MENUBARBREAK
+ MENUBREAK
+
+id MENUEX suboptions BEG items END
+items:
+ MENUITEM "string"
+ MENUITEM "string", id
+ MENUITEM "string", id, type [,state]
+ POPUP "string" BEG items END
+ POPUP "string", id BEG items END
+ POPUP "string", id, type BEG items END
+ POPUP "string", id, type, state [,helpid] BEG items END
+
+id MESSAGETABLE memflags "filename"
+memflags defaults to MOVEABLE
+
+id RCDATA suboptions BEG (string|number) [,(string|number)] (etc) END
+
+STRINGTABLE suboptions BEG strings END
+strings:
+ id "string"
+ id, "string"
+
+(User data)
+id id suboptions BEG (string|number) [,(string|number)] (etc) END
+
+id VERSIONINFO stuffs BEG verblocks END
+stuffs: FILEVERSION num,num,num,num
+ PRODUCTVERSION num,num,num,num
+ FILEFLAGSMASK num
+ FILEOS num
+ FILETYPE num
+ FILESUBTYPE num
+verblocks:
+ BLOCK "StringFileInfo" BEG BLOCK BEG vervals END END
+ BLOCK "VarFileInfo" BEG BLOCK BEG vertrans END END
+vervals: VALUE "foo","bar"
+vertrans: VALUE num,num
+
+
+
+suboptions:
+ memflags
+ CHARACTERISTICS num
+ LANGUAGE num,num
+ VERSIONK num
+
+memflags are MOVEABLE/FIXED PURE/IMPURE PRELOAD/LOADONCALL DISCARDABLE
+
+</screen>
+
+</sect1>
diff --git a/winsup/mingw/CRT_noglob.c b/winsup/mingw/CRT_noglob.c
new file mode 100644
index 000000000..442820cd8
--- /dev/null
+++ b/winsup/mingw/CRT_noglob.c
@@ -0,0 +1,17 @@
+/*
+ * noglob.c
+ *
+ * This file defines _CRT_glob to have a value of 0, which will
+ * turn off command line globbing. It is compiled into a separate object
+ * file which you can add to your link line to turn off globbing like
+ * this:
+ *
+ * gcc -o foo.exe foo.o noglob.o
+ *
+ * $Revision$
+ * $Author$
+ * $Date$
+ *
+ */
+
+int _CRT_glob = 0;
diff --git a/winsup/mingw/CRTfmode.c b/winsup/mingw/CRTfmode.c
new file mode 100644
index 000000000..d0db222f0
--- /dev/null
+++ b/winsup/mingw/CRTfmode.c
@@ -0,0 +1,20 @@
+/*
+ * CRTfmode.c
+ *
+ * Sets _CRT_fmode to be zero, which will cause _mingw32_init_fmode to leave
+ * all file modes in their default state (basically text mode).
+ *
+ * This file is part of the Mingw32 package.
+ *
+ * THIS FILE IS IN THE PUBLIC DOMAIN.
+ *
+ * Contributers:
+ * Created by Colin Peters <colin@fu.is.saga-u.ac.jp>
+ *
+ * $Revision$
+ * $Author$
+ * $Date$
+ *
+ */
+
+unsigned int _CRT_fmode = 0;
diff --git a/winsup/mingw/CRTglob.c b/winsup/mingw/CRTglob.c
new file mode 100644
index 000000000..09f858146
--- /dev/null
+++ b/winsup/mingw/CRTglob.c
@@ -0,0 +1,18 @@
+/*
+ * CRTglob.c
+ *
+ * This object file defines _CRT_glob to have a value of -1, which will
+ * turn on command line globbing by default. If you want to turn off
+ * command line globbing include a line
+ *
+ * int _CRT_glob = 0;
+ *
+ * in one of your source modules.
+ *
+ * $Revision$
+ * $Author$
+ * $Date$
+ *
+ */
+
+int _CRT_glob = -1;
diff --git a/winsup/mingw/CRTinit.c b/winsup/mingw/CRTinit.c
new file mode 100644
index 000000000..fa0e7ba1f
--- /dev/null
+++ b/winsup/mingw/CRTinit.c
@@ -0,0 +1,32 @@
+/*
+ * CRTinit.c
+ *
+ * A dummy version of _CRT_INIT for MS compatibility. Programs, or more often
+ * dlls, which use the static version of the MSVC run time are supposed to
+ * call _CRT_INIT to initialize the run time library in DllMain. This does
+ * not appear to be necessary when using crtdll or the dll versions of the
+ * MSVC runtime, so the dummy call simply does nothing.
+ *
+ * Contributors:
+ * Created by Colin Peters <colin@bird.fu.is.saga-u.ac.jp>
+ *
+ * THIS SOFTWARE IS NOT COPYRIGHTED
+ *
+ * This source code is offered for use in the public domain. You may
+ * use, modify or distribute it freely.
+ *
+ * This code is distributed in the hope that it will be useful but
+ * WITHOUT ANY WARRANTY. ALL WARRENTIES, EXPRESS OR IMPLIED ARE HEREBY
+ * DISCLAMED. This includes but is not limited to warrenties of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * $Revision$
+ * $Author$
+ * $Date$
+ *
+ */
+
+void
+_CRT_INIT ()
+{
+}
diff --git a/winsup/mingw/ChangeLog b/winsup/mingw/ChangeLog
new file mode 100644
index 000000000..347918343
--- /dev/null
+++ b/winsup/mingw/ChangeLog
@@ -0,0 +1,430 @@
+2000-02-03 Mumit Khan <khan@xraylith.wisc.edu>
+
+ * Snapshot 2000-02-03.
+
+ * include/{assert.h, conio.h, ctype.h, direct.h, dirent.h, fcntl.h,
+ float.h, io.h, locale.h, malloc.h, math.h, process.h, signal.h,
+ stdio.h, stdlib.h, string.h, time.h, wctype.h, sys/stat.h,
+ sys/timeb.h, sys/utime.h}: Remove parameter names to avoid namespace
+ pollution.
+
+ * Makefile.in (all): Build CRT0S first.
+ (libmingwthrd.a): Remove thread support DLL from dependency.
+
+2000-01-21 Mumit Khan <khan@xraylith.wisc.edu>
+
+ * Snapshot 2000-01-21.
+
+2000-01-20 Mumit Khan <khan@xraylith.wisc.edu>
+
+ Merge in changes from Cygwin:
+ * configure.in (HEADER_SUBDIRS): New variable. Substitute.
+ (SUBDIRS): Likewise.
+ * Makefile.in (HEADER_SUBDIRS): New variable.
+ (install): Use to install Mingw headers to a subdirectory if building
+ under Cygwin.
+ (DLL_CC_STUFF): Add DLL entry point.
+ * configure: Regenerate.
+
+2000-01-19 Mumit Khan <khan@xraylith.wisc.edu>
+
+ * include/stdio.h (fsetpos): Fix prototype.
+ (fpos_t): Fix for MSVCRT.
+ * include/float.h (fpreset): Add prototype.
+ * include/limits.h: Define UINT_MAX, USHRT_MAX and ULONG_MAX with
+ constant values.
+ * include/time.h: Don't define tzname as a macro for CRTDLL, and
+ export using libmoldname.a.
+ * crtdll.def: Add DATA tags.
+ * msvcrt.def: Likewise.
+ * moldname.def.in: Likewise. Add fpreset. Export tzname for
+ both MSVCRT and CRTDLL.
+ * moldname-crtdll.def: Regenerate.
+ * moldname-msvcrt.def: Regenerate.
+
+Tue Dec 21 02:22:14 1999 Mumit Khan <khan@xraylith.wisc.edu>
+
+ * Snapshot 1999-12-21.
+
+ * include/wctype.h: New file.
+ * include/ctype.h (MB_CUR_MAX): Define.
+ (wctype_t): Guard.
+ * include/stdlib.h (MB_CUR_MAX): Define.
+ * include/wchar.h: Define stat, _stat structures here as well.
+ * include/float.h: Add invalid subconditions (_SW) and floating
+ point error (_FPE) macros.
+ * include/time.h (_CLOCK_T): Rename macro to _CLOCK_T_DEFINED.
+ (_TIME_T): Rename macro to _TIME_T_DEFINED.
+ * include/sys/types.h: Likewise.
+
+Thu Nov 18 00:22:26 1999 Mumit Khan <khan@xraylith.wisc.edu>
+
+ * Snapshot 1999-11-18.
+
+Sun Nov 7 02:50:09 1999 Mumit Khan <khan@xraylith.wisc.edu>
+
+ Released 1999-11-07.
+
+ * Makefile.in (CRT0S): Add crtst.o.
+ (install): Install in subdirs as well.
+ * dirent.h (struct _stat): Rename from struct stat.
+ * include/tchar.h: Add some new macros. Thanks to
+ Eric Kohl <ekohl@abo.rhein-zeitung.de>.
+
+Thu Nov 4 14:32:58 1999 Mumit Khan <khan@xraylith.wisc.edu>
+
+ * Makefile.in: Add support for profile directory.
+ * configure.in: Likewise.
+ * configure: Regenerate.
+
+Wed Nov 3 16:26:44 1999 Mumit Khan <khan@xraylith.wisc.edu>
+
+ * include/stdlib.h: Add wide character version of argv/environ.
+ Formatting changes.
+ * include/wchar.h: More wide character prototypes.
+ * include/sys/stat.h: Likewise. Add struct stat as well as _stat.
+
+ * dllcrt1.c (init.c): Don't include.
+ (DllMainCRTStartup): Don't call _mingw32_init_mainargs().
+ * Makefile.in: Remove init.c from dllcrt{1,2}.c dependency lists.
+
+Sat Oct 30 03:06:26 1999 Mumit Khan <khan@xraylith.wisc.edu>
+
+ * moldname.def: Remove file.
+ * moldname.def.in: And add this.
+ * moldname-msvcrt.def: Generate from moldname.def.in.
+ * moldname-crtdll.def: Likewise.
+
+ * mthr.c: New file for -mthread (thread-safe C++ EH) support.
+ * mthr_init.c: New file for -mthread (thread-safe C++ EH) support.
+ * mthr_stub.c: New file for -mthread (thread-safe C++ EH) support.
+
+ * Makefile.in: Update.
+ * configure.in: Likewise. Also add *cygwin* target for building
+ under Cygwin winsup.
+ * configure: Regenerate.
+
+Fri Oct 1 11:10:30 1999 Mumit Khan <khan@xraylith.wisc.edu>
+
+ * include/_mingw.h: Add version macros.
+ * include/direct.h (_diskfree_t, getdiskfree, getdrives): Add.
+ Also add wide character versions shared with wchar.h.
+ * include/dos.h (_diskfree_t, getdiskfree, getdrives): Add.
+ * include/io.h (sopen, _sopen): Fix prototype.
+ Add wide character prototypes.
+ * include/wchar.h: Likewise.
+ * include/stdlib.h (beep, seterrormode, sleep): Remove non-
+ underscored versions. Potential incompatibility.
+ * include/time.h (daylight, timezone, tzname): Fix MSVCRT cases.
+ Add wide character prototypes.
+ * include/sys/timeb.h (struct _timeb): Don't use macro, but real
+ definition.
+
+Wed Aug 18 18:38:39 1999 Mumit Khan <khan@xraylith.wisc.edu>
+
+ * configure.in (RUNTIME, CRT_ID): Add to differentiate between
+ crtdll and msvcrt runtimes. Remove DLL_ENTRY and DEF_DLL_ENTRY
+ macros.
+ * configure: Rengerate.
+ * Makefile.in (RUNTIME, CRT_ID): Use to generate the correct
+ dll name and crt's. CRTDLL and MSVCRT are meant to created
+ separately, so remove all the *-msvcrt* targets.
+ (libmingwthr.a): New target. Dummy thread support archive.
+ (LIBS): Add libmingwthr.a.
+ (CRT0S): Use CRT_ID. Add crtmt.o.
+ (MINGW_OBJS): Add crtst.o.
+ * main.c (WinMain): Fix prototype.
+ * crtmt.c: New file.
+ * crtst.c: New file.
+
+ * include/process.h (_beginthreadex): Fix prototype.
+ * include/_mingw.h (__int64): Define for __GNUC__.
+ * include/tchar.h (_ttol): Add macro.
+ * include/stdlib.h (_wtoi, _wtol, _i64toa, _ui64toa, _atoi64,
+ _i64tow, _ui64tow, _wtoi64): Add prototypes.
+
+ Reported by Emanuele Aliberti <ea@iol.it>:
+ * include/tchar.h (_ttoi): Add macro.
+
+ Reported by Ulf Moeller <3umoelle@informatik.uni-hamburg.de>:
+ * include/stdio.h (_snprintf): Add prototype.
+ (_vsnprintf): Likewise.
+
+Sat Aug 7 18:00:00 1999 Mumit Khan <khan@xraylith.wisc.edu>
+
+ Reported by Tor Lillqvist <tml@iki.fi>:
+ * include/stdlib.h (__p___argv): Fix return type.
+
+Fri Jul 30 22:07:06 1999 Mumit Khan <khan@xraylith.wisc.edu>
+
+ Add UWIN support.
+ * include/errno.h (errno): It's linked in from startup, not imported.
+ * include/stdlib.h (errno): Likewise.
+ * include/io.h: Guard against conflicting macros and prototypes in
+ system headers.
+ * include/stdlib.h: Likewise.
+ * include/string.h: Likewise.
+ * include/time.h: Likewise.
+
+Fri Jul 30 13:47:34 1999 Mumit Khan <khan@xraylith.wisc.edu>
+
+ * include/io.h (X_OK): Fix definition. Thanks to Jan Nijtmans.
+ * include/dos.h: Fix typo __MINGW_EXPORT->__MINGW_IMPORT.
+ * Makefile.in (INCLUDES): Remove old windows32 include directory.
+
+ * crt1.c (_gnu_exception_handler): Fix prototype.
+ (__mingw_CRTStartup): New function based on mainCRTStartup.
+ (mainCRTStartup): Set the app type for MSVCRT and call
+ __mingw_CRTStartup.
+ (WinMainCRTStartup): Likewise.
+ * init.c (_startupinfo): Define.
+ (_getmainargs): Add 5th parameter.
+ (_mingw32_init_mainargs): Use.
+
+ * ALL *.c files: Reformat according to GNU coding style.
+
+Fri Jul 16 00:46:04 1999 Mumit Khan <khan@xraylith.wisc.edu>
+
+ * Makefile.in (INCLUDES): Add w32api include directory.
+
+ * include/_mingw.h: New file.
+ * include/{assert.h,conio.h,ctype.h,direct.h,dirent.h,dos.h,
+ errno.h,excpt.h,fcntl.h,float.h,io.h,limits.h,locale.h,malloc.h,
+ math.h,process.h,setjmp.h,share.h,signal.h,stdarg.h,stdio.h,
+ stdlib.h,string.h,tchar.h,time.h,varargs.h,sys/locking.h,
+ sys/stat.h,sys/timeb.h,sys/types.h,sys/utime.h}: Include and
+ use the macros __DECLSPEC_SUPPORTED and __MINGW_IMPORT.
+
+ * include/stdlib.h (atexit): Fix prototype.
+
+Mon Jun 14 18:38:49 1999 Mumit Khan <khan@xraylith.wisc.edu>
+
+ * include/stdio.h (_tempnam): Fix prototype.
+ (tempnam): Likewise.
+ * include/stdlib.h: Replace with GCC's version, and guard
+ with RC_INVOKED.
+
+ From Anders Norlander <anorland@hem2.passagen.se>:
+ * include/stdlib.h (__argc): Declare.
+ (__argv): Likewise.
+
+Mon Apr 5 13:49:17 1999 Mumit Khan <khan@xraylith.wisc.edu>
+
+ * crt1.c (_gnu_exception_handler): Acknowledge Jacob Navia's
+ contribution.
+ * Makefile.in (_libm_dummy.o): New target.
+ (libm.a): Use.
+
+Tue Mar 16 18:15:26 1999 Mumit Khan <khan@xraylith.wisc.edu>
+
+ * Released 1999-03-16 along with egcs-1.1.2.
+
+Wed Feb 17 17:15:56 1999 Mumit Khan <khan@xraylith.wisc.edu>
+
+ * Makefile.in (LIBS): Add libm.a.
+ (libm.a): Dummy libm.a.
+
+ * Makefile.in: Update from winsup 1999-02-08 snapshot.
+ Preserve local changes.
+ (mkinstalldirs): In ../, not ../../.
+ (INCLUDES): Point to local windows32api headers and use -nostdinc.
+ (LIBGCC): Delete.
+ (LIBS): Add libmoldname-msvc.a.
+ (libmoldname-msvc.a): Add target.
+ (distclean): Add target.
+
+Tue Feb 9 00:26:05 1999 Mumit Khan <khan@xraylith.wisc.edu>
+
+ * include/dir.h: Reintroduce as an obsolescent header.
+ * crt1.c (signal.h): Include.
+ (_gnu_exception_handler): New function to properly handle win32
+ asynchronous signals.
+ (mainCRTStartup): Use.
+
+Sun Jan 3 23:52:25 1999 Mumit Khan <khan@xraylith.wisc.edu>
+
+ * include/direct.h: Include io.h instead of dir.h
+ * include/dirent.h: Likewise.
+ * include/dos.h: Likewise.
+ * include/stdio.h: Replace reference to dir.h with io.h.
+
+Thu Dec 31 16:04:55 1998 Mumit Khan <khan@xraylith.wisc.edu>
+
+ * 1999-01-01 release bundled with egcs-1.1.1.
+
+ * include/io.h: Incorporate dir.h.
+ * include/dir.h: Remove.
+ * include/signal.h: Move RC_INVOKED up a bit.
+
+Tue Dec 29 15:04:38 1998 Mumit Khan <khan@xraylith.wisc.edu>
+
+ * include/signal.h (sig_atomic_t): Define.
+ (NSIG): Define.
+ * include/malloc.h: Import defs from deprecated alloc.h.
+ * include/alloc.h: Remove.
+
+ From "Daniel J. Rodriksson" <djr@dit.upm.es>:
+ * include/sys/types.h (_dev_t): Should be unsigned int for MSVCRT.
+ * include/sys/stat.h (struct stat): st_uid is of type short. Use
+ _off_t instead of long for st_size.
+
+Thu Sep 10 22:28:49 1998 Mumit Khan <khan@xraylith.wisc.edu>
+
+ * include/errno.h (sys_errlist, sys_nerr): Move from here ...
+ * include/stdlib.h: Here.
+
+ * include/netdb.h: Remove.
+ * include/arpa/inet.h: Remove.
+ * include/netinet/in.h: Remove.
+ * include/sys/socket.h: Remove.
+
+Fri Sep 4 15:09:11 1998 Mumit Khan <khan@xraylith.wisc.edu>
+
+ * Release egcs-1.1.
+
+ * include/{ctype.h,dos.h,io.h,string.h,time.h,sys/types.h,
+ sys/utime.h}: Protect stddef.h in RC_INVOKED macro.
+
+Thu Sep 3 10:43:29 1998 Mumit Khan <khan@xraylith.wisc.edu>
+
+ * setjmp.h (_JBTYPE, _JBLEN): Define correctly.
+ (jmpbuf): typedef using above.
+ (setjmp, longjmp): Prototype using jmpbuf.
+
+ Merge with Colin Peters' 980701 snapshot. I've ignored changes to
+ obsolescent imported names, ie., from __imp__ to _imp___.
+
+ Also ignored empty include/sys/param.h and incorrect
+ include/sys/times.h.
+
+ * CRTinit.c: New file.
+ * include/{errno.h,fcntl.h,math.h,process.h} (__MSVCRT__): Use #ifdef
+ instead of #if.
+ * include/io.h (umask): Fix prototype.
+ * include/stdlib.h (OS constants): Replace with Colin's.
+ * include/time.h (tzset, daylight, timezone): Replace with Colin's.
+ * include/sys/state.h: Merge.
+
+Thu Sep 3 09:49:07 1998 Mumit Khan <khan@xraylith.wisc.edu>
+
+ * include/assert.h (assert): Lose the trailing semicolon.
+
+Thu Jul 30 21:18:49 1998 Mumit Khan <khan@xraylith.wisc.edu>
+
+ * include/math.h (matherr): Declare.
+ * include/stdio.h (fileno, _fileno): Declare.
+ * include/stdlib.h (environ, _environ): Fix to use runtime DLL.
+
+ From Earnie Boyd:
+ * include/stdio.h (fdopen, _fdopen): Add const.
+ (getw, putw): Declare.
+ * include/stdlib.h (MAX_{DRIVE,DIR,FNAME,EXT}): Fix.
+
+Sat Jun 13 18:19:41 1998 Mumit Khan <khan@xraylith.wisc.edu>
+
+ * include/time.h (_timezone): Undefine.
+ * include/sys/timeb.h (struct timeb): Rename _timezone to timezone.
+
+ * include/time.h (_daylight, _timezone, _tzname, _tzset): Remove
+ __cdecl for MSVCRT.
+ * include/stdlib.h (environ): Use DLL version.
+ * init.c (environ): Undefine it before use.
+
+Sun Mar 22 19:59:30 1998 Mumit Khan <khan@xraylith.wisc.edu>
+
+ * Update to 980309 snapshot from Colin Peters.
+
+ * include/utime.h: remove
+ * include/stdlib.h (__imp__osver_dll, __imp__winver_dll,
+ __imp__winmajor_dll, __imp__winminor_dll): Apply Jan-Jaap's
+ patches to define these.
+ * include/time.h (CLK_TCK): Renamed from CLK_TICK.
+ (_daylight, _timezone, _tzname, _tzset): Define.
+
+ * include/netdb.h: Add from Colin's windows32api changes.
+ * include/sys/socket.h: Likewise.
+ * include/arpa/inet.h: Likewise.
+ * include/netinet/in.h: Likewise.
+
+Wed Feb 4 14:16:44 1998 Mumit Khan <khan@xraylith.wisc.edu>
+
+ * Update to 980128 snapshot from Colin Peters.
+
+Sat Dec 6 21:30:35 1997 Mumit Khan <khan@xraylith.wisc.edu>
+
+ * configure.in (AC_INIT): Use dllmain.c instead of defunct
+ oldnames.c
+ * configure: Regenerate.
+
+Fri Dec 5 15:57:36 1997 Mumit Khan <khan@xraylith.wisc.edu>
+
+ * Update to 971205 snapshot from Colin Peters. Lots of changes.
+ Files renamed and include hierarchy loses directories named
+ nonansi.
+
+ * include/dos.h: from Jan-Jaap.
+
+Thu Dec 4 21:48:13 1997 Mumit Khan <khan@xraylith.wisc.edu>
+
+ Changes to conform to FSF tree.
+
+ * crt1.c: Renamed from mcrt0.c.
+ * dllcrt1.c: Renamed from dllcrt0.c.
+ * Makefile.in: Update above. Also renamed libmoldnames.a to
+ libmoldname.a.
+
+Mon Dec 1 16:51:30 1997 Mumit Khan <khan@xraylith.wisc.edu>
+
+ * crtdll.def: Export all functions but the ones with funny names.
+ * moldnames.def: Add fdopen since fileno is already there.
+ * include/nonansi/dos.h: New file from Jan-Jaap.
+ * include/errno.h: Add extern decl + various additions from JJ.
+ * include/stdio.h: Likewise.
+ * include/stdlib.h: Likewise.
+ * include/nonansi/io.h: Likewise.
+ * include/nonansi/process.h: Likewise.
+ * include/sys/types.h: Likewise.
+
+Tue Nov 4 14:51:01 1997 Mumit Khan <khan@xraylith.wisc.edu>
+
+ * include/time.h (CLK_TCK): Renamed from CLK_TICK.
+ (CLK_TICK): Delete.
+ * include/stdlib.h (free): Fix prototype to return void, not void*.
+ * include/nonansi/process.h: Add P_* and WAIT_* defs.
+
+ * dllcrt0.c: Delete now-unneeded '.section .idata$3' asm hack.
+ * mcrt0.c: Likewise.
+
+ * Makefile.in (LIBS): Delete moldnames.dll from target libs.
+ (libmoldnames.a): Add explicit rule to create it.
+
+Fri Aug 15 18:23:43 1997 Rob Savoye <rob@cygnus.com>
+
+ New directory for the minimalist cygwin environment.
+
+ * crtglob.c: New file. Turn on file globbing support.
+ * crt_noglob.c: New file. Turn off file globbing support.
+ * ctype_old.c: New file. Wrappers for functions that don't
+ have an underscore.
+ * dirent.c: New file. Directory routines readdir, opendir, closedir.
+ * dllcrt0.c: New file. Initialization code to use crtdll.dll.
+ * dllmain.c: New file. A stub DllMain function.
+ * hugeval.c: New file. A gross hack to define HUGE_VAL.
+ * init.c: New file. Common code to initialize standard file
+ handles and command line arguments.
+ * main.c: New file. A main for programs that only call WinMain.
+ * mcrt0.c: New file. Default crt0 for mingw32.
+ * oldnames.c: New File. Wrappers for functions that don't
+ have an underscore.
+ * string_old.c: New File.
+ * include/{assert.h,ctype.h,errno.h,float.h,limits.h,locale.h
+ math.h,nonansi,setjmp.h,signal.h,stdarg.h,stddef.h,stdio.h,stdlib.h
+ string.h,tchar.h,time.h,wchar.h}: New header files for mingw.
+ * include/sys/types.h: New header file for mingw.
+ * include/nonansi/{alloc.h,conio.h,dir.h,direct.h,dirent.h
+ fcntl.h,io.h,malloc.h,mem.h,memory.h,process.h,share.h,unistd.h
+ utime.h,values.h,varargs.h}: New header files for mingw.
+ * include/nonansi/sys/{fcntl.h,locking.h,stat.h,time.h
+ timeb.h,unistd.h}: New header files for mingw.
+ * Makefile.in,configure.in: Build and configure support.
+ * configure: Generated from autoconf 2.12 with Cygnus patches.
diff --git a/winsup/mingw/Makefile.in b/winsup/mingw/Makefile.in
new file mode 100644
index 000000000..442e32efc
--- /dev/null
+++ b/winsup/mingw/Makefile.in
@@ -0,0 +1,265 @@
+# Makefile.in for the winsup/mingw directory.
+# Copyright (c) 1995, 1996, 1997, 1998 Cygnus Solutions
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program 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 General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+# This makefile requires GNU make.
+
+VPATH = @srcdir@
+srcdir = @srcdir@
+objdir = .
+
+target_alias = @target_alias@
+prefix = @prefix@
+
+program_transform_name = @program_transform_name@
+exec_prefix = @exec_prefix@
+bindir = @bindir@
+libdir = @libdir@
+tooldir = $(exec_prefix)/$(target_alias)
+datadir = @datadir@
+infodir = @infodir@
+includedir = @includedir@
+
+# The Mingw headers are installed under a subdirectory of
+# $(tooldir)/include when configuring in Cygwin.
+HEADER_SUBDIR = @HEADER_SUBDIR@
+
+SHELL = /bin/sh
+
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+mkinstalldirs = $(SHELL) @MKINSTALLDIRS@
+
+CC = @CC@
+# FIXME: Which is it, CC or CC_FOR_TARGET?
+CC_FOR_TARGET = $(CC)
+AS_FOR_TARGET = $(AS)
+CFLAGS = @CFLAGS@
+CXXFLAGS = @CXXFLAGS@
+
+# compiling with Cygwin?
+MNO_CYGWIN = @MNO_CYGWIN@
+
+# Either crtdll (CRT_ID 1) or msvcrt (CRT_ID 2).
+RUNTIME = @RUNTIME@
+CRT_ID = @CRT_ID@
+
+# Needed for threading dll.
+THREAD_DLL = @THREAD_DLL@
+THREAD_DLL_VERSION = 10
+THREAD_DLL_NAME = $(THREAD_DLL)$(THREAD_DLL_VERSION).dll
+
+# Various libraries.
+LIBM_A=@LIBM_A@
+
+INCLUDES = -I$(srcdir)/include -I$(srcdir)/../w32api/include \
+ -I$(srcdir)/../include \
+ -nostdinc -nostdinc++
+ALL_CFLAGS = $(CFLAGS) $(INCLUDES) $(MNO_CYGWIN)
+ALL_CXXFLAGS = $(CXXFLAGS) $(INCLUDES) $(MNO_CYGWIN)
+
+AS = @AS@
+AR = @AR@
+LD = @LD@
+AR_FLAGS = rcv
+RANLIB = @RANLIB@
+DLLTOOL = @DLLTOOL@
+DLLTOOLFLAGS =
+DLLTOOL_FOR_TARGET = $(DLLTOOL)
+DLLTOOL_FLAGS = --as $(AS_FOR_TARGET)
+DLLWRAP = @DLLWRAP@
+DLLWRAP_FOR_TARGET = $(DLLWRAP)
+DLLWRAP_FLAGS = --dlltool $(DLLTOOL) --as $(AS) --driver-name $(CC)
+
+SUBDIRS := @SUBDIRS@
+
+FLAGS_TO_PASS:=\
+ AS="$(AS)" \
+ CC="$(CC)" \
+ CFLAGS="$(CFLAGS) $(CFLAGS_COMMON) $(CFLAGS_CONFIG)" \
+ CXXFLAGS="$(CXXFLAGS) $(CFLAGS_COMMON) $(CFLAGS_CONFIG)" \
+ EXE_LDFLAGS="$(EXE_LDFLAGS)" \
+ AR="$(AR)" \
+ RANLIB="$(RANLIB)" \
+ LD="$(LD)" \
+ DLLTOOL="$(DLLTOOL)"
+
+CRT0S = crt$(CRT_ID).o dllcrt$(CRT_ID).o CRT_noglob.o crtmt.o crtst.o
+MINGW_OBJS = CRTglob.o CRTfmode.o CRTinit.o dirent.o dllmain.o gccmain.o \
+ main.o crtst.o mthr_stub.o
+MOLD_OBJS = ctype_old.o string_old.o
+
+LIBS = libcrtdll.a libmsvcrt.a libmsvcrt20.a libmsvcrt40.a libmingw32.a \
+ libmoldname.a $(LIBM_A) libmingwthrd.a
+
+DLLS = $(THREAD_DLL_NAME)
+
+all : $(CRT0S) $(LIBS) $(DLLS)
+ @$(MAKE) subdirs DO=$@ $(FLAGS_TO_PASS)
+
+_libm_dummy.o:
+ rm -f _libm_dummy.c
+ echo "static int __mingw_libm_dummy;" > _libm_dummy.c
+ $(CC) -c $(ALL_CFLAGS) _libm_dummy.c
+ rm -f _libm_dummy.c
+
+libm.a: _libm_dummy.o
+ $(AR) rc $@ _libm_dummy.o
+ $(RANLIB) $@
+
+libmingwthrd.a: crtmt.o mingwthrd.def
+ $(DLLTOOL) $(DLLTOOL_FLAGS) --dllname $(THREAD_DLL_NAME) \
+ --def mingwthrd.def --output-lib $@
+ $(AR) $(ARFLAGS) $@ crtmt.o
+ $(RANLIB) $@
+
+# Using dllwrap would be so much easier, but Cygnus top-level configure
+# Makefile.in etc don't pass the right variables yet.
+xx_$(THREAD_DLL_NAME) xx_mingwthrd.def: mthr.o mthr_init.o
+ $(DLLWRAP) $(DLLWRAP_FLAGS) -o $(THREAD_DLL_NAME) \
+ --output-def mingwthrd.def \
+ mthr.o mthr_init.o
+
+DLL_OFILES = mthr.o mthr_init.o
+DLL_CC_STUFF = -B./ -mdll $(MNO_CYGWIN) -Wl,--image-base,0x6FBC0000 \
+ -Wl,--entry,_DllMainCRTStartup@12 \
+ $(DLL_OFILES)
+DLL_DLLTOOL_STUFF = --as=$(AS) --dllname $(THREAD_DLL_NAME) \
+ --def mingwthrd.def \
+ --base-file mingwthrd.base --output-exp mingwthrd.exp
+
+$(THREAD_DLL_NAME) mingwthrd.def: $(DLL_OFILES) Makefile
+ $(DLLTOOL) --as $(AS) --output-def mingwthrd.def $(DLL_OFILES)
+ $(CC) -Wl,--base-file=mingwthrd.base $(DLL_CC_STUFF)
+ $(DLLTOOL) $(DLL_DLLTOOL_STUFF)
+ $(CC) -Wl,--base-file=mingwthrd.base mingwthrd.exp $(DLL_CC_STUFF)
+ $(DLLTOOL) $(DLL_DLLTOOL_STUFF)
+ $(CC) mingwthrd.exp -o $(THREAD_DLL_NAME) $(DLL_CC_STUFF)
+
+libmingw32.a: $(MINGW_OBJS)
+ $(AR) rc $@ $(MINGW_OBJS)
+ $(RANLIB) $@
+
+$(srcdir)/moldname-$(RUNTIME).def: moldname.def.in
+ $(CC) -DRUNTIME=$(RUNTIME) \
+ -D__FILENAME__=moldname-${RUNTIME}.def \
+ -D__`echo $(RUNTIME) | tr '[a-z]' '[A-Z]'`__ -c -E -P \
+ -xc-header $? > $@
+
+libmoldname.a: $(srcdir)/moldname-$(RUNTIME).def $(MOLD_OBJS)
+ $(DLLTOOL) --as $(AS) -k -U \
+ --dllname $(RUNTIME).dll \
+ --def $(srcdir)/moldname-$(RUNTIME).def \
+ --output-lib $@
+ $(AR) rc $@ $(MOLD_OBJS)
+ $(RANLIB) $@
+
+# The special rule is necessary.
+crt2.o dllcrt2.o:
+ $(CC) -c -D__MSVCRT__ $(ALL_CFLAGS) $< -o $@
+
+clean:
+ -rm -f *.o *.a *~ core a.out mingwthrd.def mingwthrd.base mingwthrd.exp
+ -rm -f $(THREAD_DLL_NAME)
+ @$(MAKE) subdirs DO=$@ $(FLAGS_TO_PASS)
+
+distclean:
+ @$(MAKE) subdirs DO=$@ $(FLAGS_TO_PASS)
+ -rm -f *.o *.a *~ core a.out mingwthrd.def mingwthrd.base mingwthrd.exp
+ -rm -f $(THREAD_DLL_NAME)
+ -rm -f config.cache config.status config.log
+ -rm -f Makefile
+
+info:
+
+info-html:
+
+install-info: info
+
+install: all
+ $(mkinstalldirs) $(bindir)
+ for i in $(DLLS); do \
+ $(INSTALL_PROGRAM) $$i $(bindir)/$$i ; \
+ done
+ $(mkinstalldirs) $(tooldir)/lib
+ for i in $(LIBS); do \
+ $(INSTALL_DATA) $$i $(tooldir)/lib/$$i ; \
+ done
+ for i in $(CRT0S); do \
+ $(INSTALL_DATA) $$i $(tooldir)/lib/$$i ; \
+ done
+ for sub in . sys ; do \
+ dstdir=$(tooldir)/include/$(HEADER_SUBDIR)/$$sub ; \
+ $(mkinstalldirs) $$dstdir ; \
+ for i in $(srcdir)/include/$$sub/*.h ; do \
+ $(INSTALL_DATA) $$i $$dstdir/`basename $$i` ; \
+ done ; \
+ done
+ @$(MAKE) subdirs DO=$@ $(FLAGS_TO_PASS)
+
+subdirs: force
+ @for i in $(SUBDIRS); do \
+ echo "Making $(DO) in $${i}..." ; \
+ if [ -d ./$$i ] ; then \
+ if (rootme=`pwd`/ ; export rootme ; \
+ rootsrc=`cd $(srcdir); pwd`/ ; export rootsrc ; \
+ cd ./$$i; \
+ $(MAKE) $(FLAGS_TO_PASS) $(DO)) ; then true ; \
+ else exit 1 ; fi ; \
+ else true ; fi ; \
+ done
+
+force:
+
+#
+# Dependancies
+#
+libcrtdll.a: $(srcdir)/crtdll.def
+libmsvcrt.a: $(srcdir)/msvcrt.def
+libmsvcrt20.a: $(srcdir)/msvcrt20.def
+libmsvcrt40.a: $(srcdir)/msvcrt40.def
+CRT_noglob.o: $(srcdir)/CRT_noglob.c
+CRTfmode.o: $(srcdir)/CRTfmode.c
+CRTglob.o: $(srcdir)/CRTglob.c
+CRTinit.o: $(srcdir)/CRTinit.c
+crt1.o: $(srcdir)/crt1.c $(srcdir)/init.c
+crt2.o: $(srcdir)/crt1.c $(srcdir)/init.c
+crtmt.o: $(srcdir)/crtmt.c
+crtst.o: $(srcdir)/crtst.c
+ctype_old.o: $(srcdir)/ctype_old.c
+dllcrt1.o: $(srcdir)/dllcrt1.c
+dllcrt2.o: $(srcdir)/dllcrt1.c
+dirent.o: $(srcdir)/dirent.c
+dllmain.o: $(srcdir)/dllmain.c
+main.o: $(srcdir)/main.c
+oldnames.o: $(srcdir)/oldnames.c
+string_old.o: $(srcdir)/string_old.c
+
+Makefile: Makefile.in config.status configure
+ $(SHELL) config.status
+
+config.status: configure
+ $(SHELL) config.status --recheck
+
+.SUFFIXES: .y $(SUFFIXES) .cc .def .a
+
+lib%.a:%.def
+ $(DLLTOOL) --as=$(AS) -k --dllname $*.dll --output-lib lib$*.a --def $<
+
+.c.o:
+ $(CC) -c $(ALL_CFLAGS) $< -o $@
+
diff --git a/winsup/mingw/configure b/winsup/mingw/configure
new file mode 100755
index 000000000..d35434fba
--- /dev/null
+++ b/winsup/mingw/configure
@@ -0,0 +1,2169 @@
+#! /bin/sh
+
+# Guess values for system-dependent variables and create Makefiles.
+# Generated automatically using autoconf version 2.13
+# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.
+#
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+
+# Defaults:
+ac_help=
+ac_default_prefix=/usr/local
+# Any additions from configure.in:
+
+# Initialize some variables set by options.
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+build=NONE
+cache_file=./config.cache
+exec_prefix=NONE
+host=NONE
+no_create=
+nonopt=NONE
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+target=NONE
+verbose=
+x_includes=NONE
+x_libraries=NONE
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datadir='${prefix}/share'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+libdir='${exec_prefix}/lib'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+infodir='${prefix}/info'
+mandir='${prefix}/man'
+
+# Initialize some other variables.
+subdirs=
+MFLAGS= MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
+# Maximum number of lines to put in a shell here document.
+ac_max_here_lines=12
+
+ac_prev=
+for ac_option
+do
+
+ # If the previous option needs an argument, assign it.
+ if test -n "$ac_prev"; then
+ eval "$ac_prev=\$ac_option"
+ ac_prev=
+ continue
+ fi
+
+ case "$ac_option" in
+ -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
+ *) ac_optarg= ;;
+ esac
+
+ # Accept the important Cygnus configure options, so we can diagnose typos.
+
+ case "$ac_option" in
+
+ -bindir | --bindir | --bindi | --bind | --bin | --bi)
+ ac_prev=bindir ;;
+ -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+ bindir="$ac_optarg" ;;
+
+ -build | --build | --buil | --bui | --bu)
+ ac_prev=build ;;
+ -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+ build="$ac_optarg" ;;
+
+ -cache-file | --cache-file | --cache-fil | --cache-fi \
+ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+ ac_prev=cache_file ;;
+ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+ cache_file="$ac_optarg" ;;
+
+ -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
+ ac_prev=datadir ;;
+ -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
+ | --da=*)
+ datadir="$ac_optarg" ;;
+
+ -disable-* | --disable-*)
+ ac_feature=`echo $ac_option|sed -e 's/-*disable-//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then
+ { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
+ fi
+ ac_feature=`echo $ac_feature| sed 's/-/_/g'`
+ eval "enable_${ac_feature}=no" ;;
+
+ -enable-* | --enable-*)
+ ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then
+ { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
+ fi
+ ac_feature=`echo $ac_feature| sed 's/-/_/g'`
+ case "$ac_option" in
+ *=*) ;;
+ *) ac_optarg=yes ;;
+ esac
+ eval "enable_${ac_feature}='$ac_optarg'" ;;
+
+ -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+ | --exec | --exe | --ex)
+ ac_prev=exec_prefix ;;
+ -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+ | --exec=* | --exe=* | --ex=*)
+ exec_prefix="$ac_optarg" ;;
+
+ -gas | --gas | --ga | --g)
+ # Obsolete; use --with-gas.
+ with_gas=yes ;;
+
+ -help | --help | --hel | --he)
+ # Omit some internal or obsolete options to make the list less imposing.
+ # This message is too long to be a string in the A/UX 3.1 sh.
+ cat << EOF
+Usage: configure [options] [host]
+Options: [defaults in brackets after descriptions]
+Configuration:
+ --cache-file=FILE cache test results in FILE
+ --help print this message
+ --no-create do not create output files
+ --quiet, --silent do not print \`checking...' messages
+ --version print the version of autoconf that created configure
+Directory and file names:
+ --prefix=PREFIX install architecture-independent files in PREFIX
+ [$ac_default_prefix]
+ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
+ [same as prefix]
+ --bindir=DIR user executables in DIR [EPREFIX/bin]
+ --sbindir=DIR system admin executables in DIR [EPREFIX/sbin]
+ --libexecdir=DIR program executables in DIR [EPREFIX/libexec]
+ --datadir=DIR read-only architecture-independent data in DIR
+ [PREFIX/share]
+ --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc]
+ --sharedstatedir=DIR modifiable architecture-independent data in DIR
+ [PREFIX/com]
+ --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var]
+ --libdir=DIR object code libraries in DIR [EPREFIX/lib]
+ --includedir=DIR C header files in DIR [PREFIX/include]
+ --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include]
+ --infodir=DIR info documentation in DIR [PREFIX/info]
+ --mandir=DIR man documentation in DIR [PREFIX/man]
+ --srcdir=DIR find the sources in DIR [configure dir or ..]
+ --program-prefix=PREFIX prepend PREFIX to installed program names
+ --program-suffix=SUFFIX append SUFFIX to installed program names
+ --program-transform-name=PROGRAM
+ run sed PROGRAM on installed program names
+EOF
+ cat << EOF
+Host type:
+ --build=BUILD configure for building on BUILD [BUILD=HOST]
+ --host=HOST configure for HOST [guessed]
+ --target=TARGET configure for TARGET [TARGET=HOST]
+Features and packages:
+ --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
+ --enable-FEATURE[=ARG] include FEATURE [ARG=yes]
+ --with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
+ --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
+ --x-includes=DIR X include files are in DIR
+ --x-libraries=DIR X library files are in DIR
+EOF
+ if test -n "$ac_help"; then
+ echo "--enable and --with options recognized:$ac_help"
+ fi
+ exit 0 ;;
+
+ -host | --host | --hos | --ho)
+ ac_prev=host ;;
+ -host=* | --host=* | --hos=* | --ho=*)
+ host="$ac_optarg" ;;
+
+ -includedir | --includedir | --includedi | --included | --include \
+ | --includ | --inclu | --incl | --inc)
+ ac_prev=includedir ;;
+ -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+ | --includ=* | --inclu=* | --incl=* | --inc=*)
+ includedir="$ac_optarg" ;;
+
+ -infodir | --infodir | --infodi | --infod | --info | --inf)
+ ac_prev=infodir ;;
+ -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+ infodir="$ac_optarg" ;;
+
+ -libdir | --libdir | --libdi | --libd)
+ ac_prev=libdir ;;
+ -libdir=* | --libdir=* | --libdi=* | --libd=*)
+ libdir="$ac_optarg" ;;
+
+ -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+ | --libexe | --libex | --libe)
+ ac_prev=libexecdir ;;
+ -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+ | --libexe=* | --libex=* | --libe=*)
+ libexecdir="$ac_optarg" ;;
+
+ -localstatedir | --localstatedir | --localstatedi | --localstated \
+ | --localstate | --localstat | --localsta | --localst \
+ | --locals | --local | --loca | --loc | --lo)
+ ac_prev=localstatedir ;;
+ -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+ | --localstate=* | --localstat=* | --localsta=* | --localst=* \
+ | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
+ localstatedir="$ac_optarg" ;;
+
+ -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+ ac_prev=mandir ;;
+ -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+ mandir="$ac_optarg" ;;
+
+ -nfp | --nfp | --nf)
+ # Obsolete; use --without-fp.
+ with_fp=no ;;
+
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c)
+ no_create=yes ;;
+
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+ no_recursion=yes ;;
+
+ -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+ | --oldin | --oldi | --old | --ol | --o)
+ ac_prev=oldincludedir ;;
+ -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+ oldincludedir="$ac_optarg" ;;
+
+ -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+ ac_prev=prefix ;;
+ -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+ prefix="$ac_optarg" ;;
+
+ -program-prefix | --program-prefix | --program-prefi | --program-pref \
+ | --program-pre | --program-pr | --program-p)
+ ac_prev=program_prefix ;;
+ -program-prefix=* | --program-prefix=* | --program-prefi=* \
+ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+ program_prefix="$ac_optarg" ;;
+
+ -program-suffix | --program-suffix | --program-suffi | --program-suff \
+ | --program-suf | --program-su | --program-s)
+ ac_prev=program_suffix ;;
+ -program-suffix=* | --program-suffix=* | --program-suffi=* \
+ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+ program_suffix="$ac_optarg" ;;
+
+ -program-transform-name | --program-transform-name \
+ | --program-transform-nam | --program-transform-na \
+ | --program-transform-n | --program-transform- \
+ | --program-transform | --program-transfor \
+ | --program-transfo | --program-transf \
+ | --program-trans | --program-tran \
+ | --progr-tra | --program-tr | --program-t)
+ ac_prev=program_transform_name ;;
+ -program-transform-name=* | --program-transform-name=* \
+ | --program-transform-nam=* | --program-transform-na=* \
+ | --program-transform-n=* | --program-transform-=* \
+ | --program-transform=* | --program-transfor=* \
+ | --program-transfo=* | --program-transf=* \
+ | --program-trans=* | --program-tran=* \
+ | --progr-tra=* | --program-tr=* | --program-t=*)
+ program_transform_name="$ac_optarg" ;;
+
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ silent=yes ;;
+
+ -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+ ac_prev=sbindir ;;
+ -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+ | --sbi=* | --sb=*)
+ sbindir="$ac_optarg" ;;
+
+ -sharedstatedir | --sharedstatedir | --sharedstatedi \
+ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+ | --sharedst | --shareds | --shared | --share | --shar \
+ | --sha | --sh)
+ ac_prev=sharedstatedir ;;
+ -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+ | --sha=* | --sh=*)
+ sharedstatedir="$ac_optarg" ;;
+
+ -site | --site | --sit)
+ ac_prev=site ;;
+ -site=* | --site=* | --sit=*)
+ site="$ac_optarg" ;;
+
+ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+ ac_prev=srcdir ;;
+ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+ srcdir="$ac_optarg" ;;
+
+ -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+ | --syscon | --sysco | --sysc | --sys | --sy)
+ ac_prev=sysconfdir ;;
+ -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+ sysconfdir="$ac_optarg" ;;
+
+ -target | --target | --targe | --targ | --tar | --ta | --t)
+ ac_prev=target ;;
+ -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+ target="$ac_optarg" ;;
+
+ -v | -verbose | --verbose | --verbos | --verbo | --verb)
+ verbose=yes ;;
+
+ -version | --version | --versio | --versi | --vers)
+ echo "configure generated by autoconf version 2.13"
+ exit 0 ;;
+
+ -with-* | --with-*)
+ ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then
+ { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
+ fi
+ ac_package=`echo $ac_package| sed 's/-/_/g'`
+ case "$ac_option" in
+ *=*) ;;
+ *) ac_optarg=yes ;;
+ esac
+ eval "with_${ac_package}='$ac_optarg'" ;;
+
+ -without-* | --without-*)
+ ac_package=`echo $ac_option|sed -e 's/-*without-//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then
+ { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
+ fi
+ ac_package=`echo $ac_package| sed 's/-/_/g'`
+ eval "with_${ac_package}=no" ;;
+
+ --x)
+ # Obsolete; use --with-x.
+ with_x=yes ;;
+
+ -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+ | --x-incl | --x-inc | --x-in | --x-i)
+ ac_prev=x_includes ;;
+ -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+ x_includes="$ac_optarg" ;;
+
+ -x-libraries | --x-libraries | --x-librarie | --x-librari \
+ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+ ac_prev=x_libraries ;;
+ -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+ x_libraries="$ac_optarg" ;;
+
+ -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; }
+ ;;
+
+ *)
+ if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then
+ echo "configure: warning: $ac_option: invalid host type" 1>&2
+ fi
+ if test "x$nonopt" != xNONE; then
+ { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; }
+ fi
+ nonopt="$ac_option"
+ ;;
+
+ esac
+done
+
+if test -n "$ac_prev"; then
+ { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; }
+fi
+
+trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
+
+# File descriptor usage:
+# 0 standard input
+# 1 file creation
+# 2 errors and warnings
+# 3 some systems may open it to /dev/tty
+# 4 used on the Kubota Titan
+# 6 checking for... messages and results
+# 5 compiler messages saved in config.log
+if test "$silent" = yes; then
+ exec 6>/dev/null
+else
+ exec 6>&1
+fi
+exec 5>./config.log
+
+echo "\
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+" 1>&5
+
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Also quote any args containing shell metacharacters.
+ac_configure_args=
+for ac_arg
+do
+ case "$ac_arg" in
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c) ;;
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;;
+ *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*)
+ ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+ *) ac_configure_args="$ac_configure_args $ac_arg" ;;
+ esac
+done
+
+# NLS nuisances.
+# Only set these to C if already set. These must not be set unconditionally
+# because not all systems understand e.g. LANG=C (notably SCO).
+# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'!
+# Non-C LC_CTYPE values break the ctype check.
+if test "${LANG+set}" = set; then LANG=C; export LANG; fi
+if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi
+if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi
+if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -rf conftest* confdefs.h
+# AIX cpp loses on an empty file, so make sure it contains at least a newline.
+echo > confdefs.h
+
+# A filename unique to this package, relative to the directory that
+# configure is in, which we can look for to find out if srcdir is correct.
+ac_unique_file=dllmain.c
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+ ac_srcdir_defaulted=yes
+ # Try the directory containing this script, then its parent.
+ ac_prog=$0
+ ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'`
+ test "x$ac_confdir" = "x$ac_prog" && ac_confdir=.
+ srcdir=$ac_confdir
+ if test ! -r $srcdir/$ac_unique_file; then
+ srcdir=..
+ fi
+else
+ ac_srcdir_defaulted=no
+fi
+if test ! -r $srcdir/$ac_unique_file; then
+ if test "$ac_srcdir_defaulted" = yes; then
+ { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; }
+ else
+ { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; }
+ fi
+fi
+srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'`
+
+# Prefer explicitly selected file to automatically selected ones.
+if test -z "$CONFIG_SITE"; then
+ if test "x$prefix" != xNONE; then
+ CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
+ else
+ CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+ fi
+fi
+for ac_site_file in $CONFIG_SITE; do
+ if test -r "$ac_site_file"; then
+ echo "loading site script $ac_site_file"
+ . "$ac_site_file"
+ fi
+done
+
+if test -r "$cache_file"; then
+ echo "loading cache $cache_file"
+ . $cache_file
+else
+ echo "creating cache $cache_file"
+ > $cache_file
+fi
+
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+ac_exeext=
+ac_objext=o
+if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
+ # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu.
+ if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then
+ ac_n= ac_c='
+' ac_t=' '
+ else
+ ac_n=-n ac_c= ac_t=
+ fi
+else
+ ac_n= ac_c='\c' ac_t=
+fi
+
+
+
+
+
+
+ac_aux_dir=
+for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
+ if test -f $ac_dir/install-sh; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install-sh -c"
+ break
+ elif test -f $ac_dir/install.sh; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install.sh -c"
+ break
+ fi
+done
+if test -z "$ac_aux_dir"; then
+ { echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; }
+fi
+ac_config_guess=$ac_aux_dir/config.guess
+ac_config_sub=$ac_aux_dir/config.sub
+ac_configure=$ac_aux_dir/configure # This should be Cygnus configure.
+
+
+# Make sure we can run config.sub.
+if ${CONFIG_SHELL-/bin/sh} $ac_config_sub sun4 >/dev/null 2>&1; then :
+else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; }
+fi
+
+echo $ac_n "checking host system type""... $ac_c" 1>&6
+echo "configure:555: checking host system type" >&5
+
+host_alias=$host
+case "$host_alias" in
+NONE)
+ case $nonopt in
+ NONE)
+ if host_alias=`${CONFIG_SHELL-/bin/sh} $ac_config_guess`; then :
+ else { echo "configure: error: can not guess host type; you must specify one" 1>&2; exit 1; }
+ fi ;;
+ *) host_alias=$nonopt ;;
+ esac ;;
+esac
+
+host=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $host_alias`
+host_cpu=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+host_vendor=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+echo "$ac_t""$host" 1>&6
+
+echo $ac_n "checking build system type""... $ac_c" 1>&6
+echo "configure:576: checking build system type" >&5
+
+build_alias=$build
+case "$build_alias" in
+NONE)
+ case $nonopt in
+ NONE) build_alias=$host_alias ;;
+ *) build_alias=$nonopt ;;
+ esac ;;
+esac
+
+build=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $build_alias`
+build_cpu=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+build_vendor=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+build_os=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+echo "$ac_t""$build" 1>&6
+
+if test $host != $build; then
+ ac_tool_prefix=${host_alias}-
+else
+ ac_tool_prefix=
+fi
+
+# Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:602: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_CC="${ac_tool_prefix}gcc"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+ echo "$ac_t""$CC" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+
+if test -z "$ac_cv_prog_CC"; then
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:634: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_CC="gcc"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_prog_CC" && ac_cv_prog_CC="gcc"
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+ echo "$ac_t""$CC" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+else
+ CC="gcc"
+fi
+fi
+
+if test -z "$CC"; then
+ # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:670: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_prog_rejected=no
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then
+ ac_prog_rejected=yes
+ continue
+ fi
+ ac_cv_prog_CC="cc"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+if test $ac_prog_rejected = yes; then
+ # We found a bogon in the path, so make sure we never use it.
+ set dummy $ac_cv_prog_CC
+ shift
+ if test $# -gt 0; then
+ # We chose a different compiler from the bogus one.
+ # However, it has the same basename, so the bogon will be chosen
+ # first if we set CC to just the basename; use the full file name.
+ shift
+ set dummy "$ac_dir/$ac_word" "$@"
+ shift
+ ac_cv_prog_CC="$@"
+ fi
+fi
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+ echo "$ac_t""$CC" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; }
+fi
+
+echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
+echo "configure:719: checking whether we are using GNU C" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.c <<EOF
+#ifdef __GNUC__
+ yes;
+#endif
+EOF
+if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:728: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+ ac_cv_prog_gcc=yes
+else
+ ac_cv_prog_gcc=no
+fi
+fi
+
+echo "$ac_t""$ac_cv_prog_gcc" 1>&6
+
+if test $ac_cv_prog_gcc = yes; then
+ GCC=yes
+ ac_test_CFLAGS="${CFLAGS+set}"
+ ac_save_CFLAGS="$CFLAGS"
+ CFLAGS=
+ echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
+echo "configure:743: checking whether ${CC-cc} accepts -g" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ echo 'void f(){}' > conftest.c
+if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then
+ ac_cv_prog_cc_g=yes
+else
+ ac_cv_prog_cc_g=no
+fi
+rm -f conftest*
+
+fi
+
+echo "$ac_t""$ac_cv_prog_cc_g" 1>&6
+ if test "$ac_test_CFLAGS" = set; then
+ CFLAGS="$ac_save_CFLAGS"
+ elif test $ac_cv_prog_cc_g = yes; then
+ CFLAGS="-g -O2"
+ else
+ CFLAGS="-O2"
+ fi
+ if test "$ac_test_CXXFLAGS" != set; then
+ CXXFLAGS='$(CFLAGS)'
+ fi
+else
+ GCC=
+ test "${CFLAGS+set}" = set || CFLAGS="-g"
+fi
+
+
+# Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ar; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:777: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_AR'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$AR"; then
+ ac_cv_prog_AR="$AR" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_AR="${ac_tool_prefix}ar"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+fi
+fi
+AR="$ac_cv_prog_AR"
+if test -n "$AR"; then
+ echo "$ac_t""$AR" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+
+if test -z "$ac_cv_prog_AR"; then
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "ar", so it can be a program name with args.
+set dummy ar; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:809: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_AR'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$AR"; then
+ ac_cv_prog_AR="$AR" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_AR="ar"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_prog_AR" && ac_cv_prog_AR="ar"
+fi
+fi
+AR="$ac_cv_prog_AR"
+if test -n "$AR"; then
+ echo "$ac_t""$AR" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+else
+ AR="ar"
+fi
+fi
+
+
+
+# Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args.
+set dummy ${ac_tool_prefix}as; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:846: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_AS'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$AS"; then
+ ac_cv_prog_AS="$AS" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_AS="${ac_tool_prefix}as"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+fi
+fi
+AS="$ac_cv_prog_AS"
+if test -n "$AS"; then
+ echo "$ac_t""$AS" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+
+if test -z "$ac_cv_prog_AS"; then
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "as", so it can be a program name with args.
+set dummy as; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:878: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_AS'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$AS"; then
+ ac_cv_prog_AS="$AS" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_AS="as"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_prog_AS" && ac_cv_prog_AS="as"
+fi
+fi
+AS="$ac_cv_prog_AS"
+if test -n "$AS"; then
+ echo "$ac_t""$AS" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+else
+ AS="as"
+fi
+fi
+
+
+# Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ranlib; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:914: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$RANLIB"; then
+ ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+fi
+fi
+RANLIB="$ac_cv_prog_RANLIB"
+if test -n "$RANLIB"; then
+ echo "$ac_t""$RANLIB" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+
+if test -z "$ac_cv_prog_RANLIB"; then
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:946: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$RANLIB"; then
+ ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_RANLIB="ranlib"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_prog_RANLIB" && ac_cv_prog_RANLIB="ranlib"
+fi
+fi
+RANLIB="$ac_cv_prog_RANLIB"
+if test -n "$RANLIB"; then
+ echo "$ac_t""$RANLIB" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+else
+ RANLIB="ranlib"
+fi
+fi
+
+
+# Extract the first word of "${ac_tool_prefix}ld", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ld; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:982: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_LD'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$LD"; then
+ ac_cv_prog_LD="$LD" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_LD="${ac_tool_prefix}ld"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+fi
+fi
+LD="$ac_cv_prog_LD"
+if test -n "$LD"; then
+ echo "$ac_t""$LD" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+
+if test -z "$ac_cv_prog_LD"; then
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "ld", so it can be a program name with args.
+set dummy ld; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1014: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_LD'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$LD"; then
+ ac_cv_prog_LD="$LD" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_LD="ld"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_prog_LD" && ac_cv_prog_LD="ld"
+fi
+fi
+LD="$ac_cv_prog_LD"
+if test -n "$LD"; then
+ echo "$ac_t""$LD" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+else
+ LD="ld"
+fi
+fi
+
+
+# Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args.
+set dummy ${ac_tool_prefix}dlltool; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1050: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_DLLTOOL'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$DLLTOOL"; then
+ ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+fi
+fi
+DLLTOOL="$ac_cv_prog_DLLTOOL"
+if test -n "$DLLTOOL"; then
+ echo "$ac_t""$DLLTOOL" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+
+if test -z "$ac_cv_prog_DLLTOOL"; then
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "dlltool", so it can be a program name with args.
+set dummy dlltool; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1082: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_DLLTOOL'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$DLLTOOL"; then
+ ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_DLLTOOL="dlltool"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_prog_DLLTOOL" && ac_cv_prog_DLLTOOL="dlltool"
+fi
+fi
+DLLTOOL="$ac_cv_prog_DLLTOOL"
+if test -n "$DLLTOOL"; then
+ echo "$ac_t""$DLLTOOL" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+else
+ DLLTOOL="dlltool"
+fi
+fi
+
+
+# Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args.
+set dummy ${ac_tool_prefix}dlltool; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1118: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_DLLWRAP'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$DLLWRAP"; then
+ ac_cv_prog_DLLWRAP="$DLLWRAP" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_DLLWRAP="${ac_tool_prefix}dlltool"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+fi
+fi
+DLLWRAP="$ac_cv_prog_DLLWRAP"
+if test -n "$DLLWRAP"; then
+ echo "$ac_t""$DLLWRAP" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+
+if test -z "$ac_cv_prog_DLLWRAP"; then
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "dlltool", so it can be a program name with args.
+set dummy dlltool; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1150: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_DLLWRAP'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$DLLWRAP"; then
+ ac_cv_prog_DLLWRAP="$DLLWRAP" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_DLLWRAP="dlltool"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_prog_DLLWRAP" && ac_cv_prog_DLLWRAP="dlltool"
+fi
+fi
+DLLWRAP="$ac_cv_prog_DLLWRAP"
+if test -n "$DLLWRAP"; then
+ echo "$ac_t""$DLLWRAP" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+else
+ DLLWRAP="dlltool"
+fi
+fi
+
+
+# Extract the first word of "${ac_tool_prefix}windres", so it can be a program name with args.
+set dummy ${ac_tool_prefix}windres; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1186: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_WINDRES'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$WINDRES"; then
+ ac_cv_prog_WINDRES="$WINDRES" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_WINDRES="${ac_tool_prefix}windres"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+fi
+fi
+WINDRES="$ac_cv_prog_WINDRES"
+if test -n "$WINDRES"; then
+ echo "$ac_t""$WINDRES" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+
+if test -z "$ac_cv_prog_WINDRES"; then
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "windres", so it can be a program name with args.
+set dummy windres; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1218: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_WINDRES'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$WINDRES"; then
+ ac_cv_prog_WINDRES="$WINDRES" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_WINDRES="windres"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_prog_WINDRES" && ac_cv_prog_WINDRES="windres"
+fi
+fi
+WINDRES="$ac_cv_prog_WINDRES"
+if test -n "$WINDRES"; then
+ echo "$ac_t""$WINDRES" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+else
+ WINDRES="windres"
+fi
+fi
+
+
+
+echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
+echo "configure:1253: checking how to run the C preprocessor" >&5
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+ CPP=
+fi
+if test -z "$CPP"; then
+if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ # This must be in double quotes, not single quotes, because CPP may get
+ # substituted into the Makefile and "${CC-cc}" will confuse make.
+ CPP="${CC-cc} -E"
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp.
+ cat > conftest.$ac_ext <<EOF
+#line 1268 "configure"
+#include "confdefs.h"
+#include <assert.h>
+Syntax Error
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1274: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+ :
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ CPP="${CC-cc} -E -traditional-cpp"
+ cat > conftest.$ac_ext <<EOF
+#line 1285 "configure"
+#include "confdefs.h"
+#include <assert.h>
+Syntax Error
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1291: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+ :
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ CPP="${CC-cc} -nologo -E"
+ cat > conftest.$ac_ext <<EOF
+#line 1302 "configure"
+#include "confdefs.h"
+#include <assert.h>
+Syntax Error
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1308: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+ :
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ CPP=/lib/cpp
+fi
+rm -f conftest*
+fi
+rm -f conftest*
+fi
+rm -f conftest*
+ ac_cv_prog_CPP="$CPP"
+fi
+ CPP="$ac_cv_prog_CPP"
+else
+ ac_cv_prog_CPP="$CPP"
+fi
+echo "$ac_t""$CPP" 1>&6
+
+# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works
+# for constant arguments. Useless!
+echo $ac_n "checking for working alloca.h""... $ac_c" 1>&6
+echo "configure:1335: checking for working alloca.h" >&5
+if eval "test \"`echo '$''{'ac_cv_header_alloca_h'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1340 "configure"
+#include "confdefs.h"
+#include <alloca.h>
+int main() {
+char *p = alloca(2 * sizeof(int));
+; return 0; }
+EOF
+if { (eval echo configure:1347: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ ac_cv_header_alloca_h=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ ac_cv_header_alloca_h=no
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$ac_cv_header_alloca_h" 1>&6
+if test $ac_cv_header_alloca_h = yes; then
+ cat >> confdefs.h <<\EOF
+#define HAVE_ALLOCA_H 1
+EOF
+
+fi
+
+echo $ac_n "checking for alloca""... $ac_c" 1>&6
+echo "configure:1368: checking for alloca" >&5
+if eval "test \"`echo '$''{'ac_cv_func_alloca_works'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1373 "configure"
+#include "confdefs.h"
+
+#ifdef __GNUC__
+# define alloca __builtin_alloca
+#else
+# ifdef _MSC_VER
+# include <malloc.h>
+# define alloca _alloca
+# else
+# if HAVE_ALLOCA_H
+# include <alloca.h>
+# else
+# ifdef _AIX
+ #pragma alloca
+# else
+# ifndef alloca /* predefined by HP cc +Olibcalls */
+char *alloca ();
+# endif
+# endif
+# endif
+# endif
+#endif
+
+int main() {
+char *p = (char *) alloca(1);
+; return 0; }
+EOF
+if { (eval echo configure:1401: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ ac_cv_func_alloca_works=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ ac_cv_func_alloca_works=no
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$ac_cv_func_alloca_works" 1>&6
+if test $ac_cv_func_alloca_works = yes; then
+ cat >> confdefs.h <<\EOF
+#define HAVE_ALLOCA 1
+EOF
+
+fi
+
+if test $ac_cv_func_alloca_works = no; then
+ # The SVR3 libPW and SVR4 libucb both contain incompatible functions
+ # that cause trouble. Some versions do not even contain alloca or
+ # contain a buggy version. If you still want to use their alloca,
+ # use ar to extract alloca.o from them instead of compiling alloca.c.
+ ALLOCA=alloca.${ac_objext}
+ cat >> confdefs.h <<\EOF
+#define C_ALLOCA 1
+EOF
+
+
+echo $ac_n "checking whether alloca needs Cray hooks""... $ac_c" 1>&6
+echo "configure:1433: checking whether alloca needs Cray hooks" >&5
+if eval "test \"`echo '$''{'ac_cv_os_cray'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1438 "configure"
+#include "confdefs.h"
+#if defined(CRAY) && ! defined(CRAY2)
+webecray
+#else
+wenotbecray
+#endif
+
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ egrep "webecray" >/dev/null 2>&1; then
+ rm -rf conftest*
+ ac_cv_os_cray=yes
+else
+ rm -rf conftest*
+ ac_cv_os_cray=no
+fi
+rm -f conftest*
+
+fi
+
+echo "$ac_t""$ac_cv_os_cray" 1>&6
+if test $ac_cv_os_cray = yes; then
+for ac_func in _getb67 GETB67 getb67; do
+ echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+echo "configure:1463: checking for $ac_func" >&5
+if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1468 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func(); below. */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+$ac_func();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:1491: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ cat >> confdefs.h <<EOF
+#define CRAY_STACKSEG_END $ac_func
+EOF
+
+ break
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+done
+fi
+
+echo $ac_n "checking stack direction for C alloca""... $ac_c" 1>&6
+echo "configure:1518: checking stack direction for C alloca" >&5
+if eval "test \"`echo '$''{'ac_cv_c_stack_direction'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test "$cross_compiling" = yes; then
+ ac_cv_c_stack_direction=0
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1526 "configure"
+#include "confdefs.h"
+find_stack_direction ()
+{
+ static char *addr = 0;
+ auto char dummy;
+ if (addr == 0)
+ {
+ addr = &dummy;
+ return find_stack_direction ();
+ }
+ else
+ return (&dummy > addr) ? 1 : -1;
+}
+main ()
+{
+ exit (find_stack_direction() < 0);
+}
+EOF
+if { (eval echo configure:1545: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+then
+ ac_cv_c_stack_direction=1
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -fr conftest*
+ ac_cv_c_stack_direction=-1
+fi
+rm -fr conftest*
+fi
+
+fi
+
+echo "$ac_t""$ac_cv_c_stack_direction" 1>&6
+cat >> confdefs.h <<EOF
+#define STACK_DIRECTION $ac_cv_c_stack_direction
+EOF
+
+fi
+
+
+
+# Do some error checking and defaulting for the host and target type.
+# The inputs are:
+# configure --host=HOST --target=TARGET --build=BUILD NONOPT
+#
+# The rules are:
+# 1. You are not allowed to specify --host, --target, and nonopt at the
+# same time.
+# 2. Host defaults to nonopt.
+# 3. If nonopt is not specified, then host defaults to the current host,
+# as determined by config.guess.
+# 4. Target and build default to nonopt.
+# 5. If nonopt is not specified, then target and build default to host.
+
+# The aliases save the names the user supplied, while $host etc.
+# will get canonicalized.
+case $host---$target---$nonopt in
+NONE---*---* | *---NONE---* | *---*---NONE) ;;
+*) { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } ;;
+esac
+
+
+# Make sure we can run config.sub.
+if ${CONFIG_SHELL-/bin/sh} $ac_config_sub sun4 >/dev/null 2>&1; then :
+else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; }
+fi
+
+echo $ac_n "checking host system type""... $ac_c" 1>&6
+echo "configure:1595: checking host system type" >&5
+
+host_alias=$host
+case "$host_alias" in
+NONE)
+ case $nonopt in
+ NONE)
+ if host_alias=`${CONFIG_SHELL-/bin/sh} $ac_config_guess`; then :
+ else { echo "configure: error: can not guess host type; you must specify one" 1>&2; exit 1; }
+ fi ;;
+ *) host_alias=$nonopt ;;
+ esac ;;
+esac
+
+host=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $host_alias`
+host_cpu=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+host_vendor=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+echo "$ac_t""$host" 1>&6
+
+echo $ac_n "checking target system type""... $ac_c" 1>&6
+echo "configure:1616: checking target system type" >&5
+
+target_alias=$target
+case "$target_alias" in
+NONE)
+ case $nonopt in
+ NONE) target_alias=$host_alias ;;
+ *) target_alias=$nonopt ;;
+ esac ;;
+esac
+
+target=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $target_alias`
+target_cpu=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+target_vendor=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+target_os=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+echo "$ac_t""$target" 1>&6
+
+echo $ac_n "checking build system type""... $ac_c" 1>&6
+echo "configure:1634: checking build system type" >&5
+
+build_alias=$build
+case "$build_alias" in
+NONE)
+ case $nonopt in
+ NONE) build_alias=$host_alias ;;
+ *) build_alias=$nonopt ;;
+ esac ;;
+esac
+
+build=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $build_alias`
+build_cpu=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+build_vendor=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+build_os=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+echo "$ac_t""$build" 1>&6
+
+test "$host_alias" != "$target_alias" &&
+ test "$program_prefix$program_suffix$program_transform_name" = \
+ NONENONEs,x,x, &&
+ program_prefix=${target_alias}-
+
+
+configdirs=""
+SUBDIRS=""
+HEADER_SUBDIR=""
+
+case "$target_os" in
+*mingw32msvc*)
+ CRT_ID=2
+ MNO_CYGWIN=
+ RUNTIME=msvcrt
+ THREAD_DLL=mingwm
+ LIBM_A=libm.a
+ LIBGMON_A=libgmon.a
+ SUBDIRS="profile"
+ configdirs="$configdirs profile"
+ ;;
+*cygwin*)
+ CRT_ID=1
+ MNO_CYGWIN=-mno-cygwin
+ RUNTIME=crtdll
+ THREAD_DLL=mingwc
+ configdirs="$configdirs"
+ # Do not build libm.a when building under Cygwin winsup. Otherwise, it'll
+ # overwrite Cygwin's one. Likewise for libgmon.a.
+ LIBM_A=
+ LIBGMON_A=
+ # Install mingw headers in mingw subdirectory.
+ HEADER_SUBDIR="mingw"
+ ;;
+*)
+ # Build it for CRTDLL by default.
+ CRT_ID=1
+ MNO_CYGWIN=
+ RUNTIME=crtdll
+ THREAD_DLL=mingwc
+ LIBM_A=libm.a
+ LIBGMON_A=libgmon.a
+ SUBDIRS="profile"
+ configdirs="$configdirs profile"
+ ;;
+esac
+
+if test -n "$configdirs"; then
+ subdirs="$configdirs"
+
+fi
+
+MKINSTALLDIRS=$ac_aux_dir/mkinstalldirs
+
+
+
+
+
+
+
+
+
+
+# Find a good install program. We prefer a C program (faster),
+# so one script is as good as another. But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# ./install, which can be erroneously created by make from ./install.sh.
+echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
+echo "configure:1726: checking for a BSD compatible install" >&5
+if test -z "$INSTALL"; then
+if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ IFS="${IFS= }"; ac_save_IFS="$IFS"; IFS=":"
+ for ac_dir in $PATH; do
+ # Account for people who put trailing slashes in PATH elements.
+ case "$ac_dir/" in
+ /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;;
+ *)
+ # OSF1 and SCO ODT 3.0 have their own names for install.
+ # Don't use installbsd from OSF since it installs stuff as root
+ # by default.
+ for ac_prog in ginstall scoinst install; do
+ if test -f $ac_dir/$ac_prog; then
+ if test $ac_prog = install &&
+ grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then
+ # AIX install. It has an incompatible calling convention.
+ :
+ else
+ ac_cv_path_install="$ac_dir/$ac_prog -c"
+ break 2
+ fi
+ fi
+ done
+ ;;
+ esac
+ done
+ IFS="$ac_save_IFS"
+
+fi
+ if test "${ac_cv_path_install+set}" = set; then
+ INSTALL="$ac_cv_path_install"
+ else
+ # As a last resort, use the slow shell script. We don't cache a
+ # path for INSTALL within a source directory, because that will
+ # break other packages using the cache if that directory is
+ # removed, or if the path is relative.
+ INSTALL="$ac_install_sh"
+ fi
+fi
+echo "$ac_t""$INSTALL" 1>&6
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+trap '' 1 2 15
+cat > confcache <<\EOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs. It is not useful on other systems.
+# If it contains results you don't want to keep, you may remove or edit it.
+#
+# By default, configure uses ./config.cache as the cache file,
+# creating it if it does not exist already. You can give configure
+# the --cache-file=FILE option to use a different cache file; that is
+# what configure does when it calls configure scripts in
+# subdirectories, so they share the cache.
+# Giving --cache-file=/dev/null disables caching, for debugging configure.
+# config.status only pays attention to the cache file if you give it the
+# --recheck option to rerun configure.
+#
+EOF
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, don't put newlines in cache variables' values.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(set) 2>&1 |
+ case `(ac_space=' '; set | grep ac_space) 2>&1` in
+ *ac_space=\ *)
+ # `set' does not quote correctly, so add quotes (double-quote substitution
+ # turns \\\\ into \\, and sed turns \\ into \).
+ sed -n \
+ -e "s/'/'\\\\''/g" \
+ -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p"
+ ;;
+ *)
+ # `set' quotes correctly as required by POSIX, so do not add quotes.
+ sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p'
+ ;;
+ esac >> confcache
+if cmp -s $cache_file confcache; then
+ :
+else
+ if test -w $cache_file; then
+ echo "updating cache $cache_file"
+ cat confcache > $cache_file
+ else
+ echo "not updating unwritable cache $cache_file"
+ fi
+fi
+rm -f confcache
+
+trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# Any assignment to VPATH causes Sun make to only execute
+# the first set of double-colon rules, so remove it if not needed.
+# If there is a colon in the path, we need to keep it.
+if test "x$srcdir" = x.; then
+ ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d'
+fi
+
+trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15
+
+# Transform confdefs.h into DEFS.
+# Protect against shell expansion while executing Makefile rules.
+# Protect against Makefile macro expansion.
+cat > conftest.defs <<\EOF
+s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%-D\1=\2%g
+s%[ `~#$^&*(){}\\|;'"<>?]%\\&%g
+s%\[%\\&%g
+s%\]%\\&%g
+s%\$%$$%g
+EOF
+DEFS=`sed -f conftest.defs confdefs.h | tr '\012' ' '`
+rm -f conftest.defs
+
+
+# Without the "./", some shells look in PATH for config.status.
+: ${CONFIG_STATUS=./config.status}
+
+echo creating $CONFIG_STATUS
+rm -f $CONFIG_STATUS
+cat > $CONFIG_STATUS <<EOF
+#! /bin/sh
+# Generated automatically by configure.
+# Run this file to recreate the current configuration.
+# This directory was configured as follows,
+# on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+#
+# $0 $ac_configure_args
+#
+# Compiler output produced by configure, useful for debugging
+# configure, is in ./config.log if it exists.
+
+ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]"
+for ac_option
+do
+ case "\$ac_option" in
+ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+ echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion"
+ exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;;
+ -version | --version | --versio | --versi | --vers | --ver | --ve | --v)
+ echo "$CONFIG_STATUS generated by autoconf version 2.13"
+ exit 0 ;;
+ -help | --help | --hel | --he | --h)
+ echo "\$ac_cs_usage"; exit 0 ;;
+ *) echo "\$ac_cs_usage"; exit 1 ;;
+ esac
+done
+
+ac_given_srcdir=$srcdir
+ac_given_INSTALL="$INSTALL"
+
+trap 'rm -fr `echo "Makefile" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
+EOF
+cat >> $CONFIG_STATUS <<EOF
+
+# Protect against being on the right side of a sed subst in config.status.
+sed 's/%@/@@/; s/@%/@@/; s/%g\$/@g/; /@g\$/s/[\\\\&%]/\\\\&/g;
+ s/@@/%@/; s/@@/@%/; s/@g\$/%g/' > conftest.subs <<\\CEOF
+$ac_vpsub
+$extrasub
+s%@SHELL@%$SHELL%g
+s%@CFLAGS@%$CFLAGS%g
+s%@CPPFLAGS@%$CPPFLAGS%g
+s%@CXXFLAGS@%$CXXFLAGS%g
+s%@FFLAGS@%$FFLAGS%g
+s%@DEFS@%$DEFS%g
+s%@LDFLAGS@%$LDFLAGS%g
+s%@LIBS@%$LIBS%g
+s%@exec_prefix@%$exec_prefix%g
+s%@prefix@%$prefix%g
+s%@program_transform_name@%$program_transform_name%g
+s%@bindir@%$bindir%g
+s%@sbindir@%$sbindir%g
+s%@libexecdir@%$libexecdir%g
+s%@datadir@%$datadir%g
+s%@sysconfdir@%$sysconfdir%g
+s%@sharedstatedir@%$sharedstatedir%g
+s%@localstatedir@%$localstatedir%g
+s%@libdir@%$libdir%g
+s%@includedir@%$includedir%g
+s%@oldincludedir@%$oldincludedir%g
+s%@infodir@%$infodir%g
+s%@mandir@%$mandir%g
+s%@host@%$host%g
+s%@host_alias@%$host_alias%g
+s%@host_cpu@%$host_cpu%g
+s%@host_vendor@%$host_vendor%g
+s%@host_os@%$host_os%g
+s%@build@%$build%g
+s%@build_alias@%$build_alias%g
+s%@build_cpu@%$build_cpu%g
+s%@build_vendor@%$build_vendor%g
+s%@build_os@%$build_os%g
+s%@CC@%$CC%g
+s%@AR@%$AR%g
+s%@AS@%$AS%g
+s%@RANLIB@%$RANLIB%g
+s%@LD@%$LD%g
+s%@DLLTOOL@%$DLLTOOL%g
+s%@DLLWRAP@%$DLLWRAP%g
+s%@WINDRES@%$WINDRES%g
+s%@CPP@%$CPP%g
+s%@ALLOCA@%$ALLOCA%g
+s%@target@%$target%g
+s%@target_alias@%$target_alias%g
+s%@target_cpu@%$target_cpu%g
+s%@target_vendor@%$target_vendor%g
+s%@target_os@%$target_os%g
+s%@subdirs@%$subdirs%g
+s%@MKINSTALLDIRS@%$MKINSTALLDIRS%g
+s%@CRT_ID@%$CRT_ID%g
+s%@RUNTIME@%$RUNTIME%g
+s%@MNO_CYGWIN@%$MNO_CYGWIN%g
+s%@THREAD_DLL@%$THREAD_DLL%g
+s%@LIBM_A@%$LIBM_A%g
+s%@LIBGMON_A@%$LIBGMON_A%g
+s%@SUBDIRS@%$SUBDIRS%g
+s%@HEADER_SUBDIR@%$HEADER_SUBDIR%g
+s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g
+s%@INSTALL_SCRIPT@%$INSTALL_SCRIPT%g
+s%@INSTALL_DATA@%$INSTALL_DATA%g
+
+CEOF
+EOF
+
+cat >> $CONFIG_STATUS <<\EOF
+
+# Split the substitutions into bite-sized pieces for seds with
+# small command number limits, like on Digital OSF/1 and HP-UX.
+ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script.
+ac_file=1 # Number of current file.
+ac_beg=1 # First line for current file.
+ac_end=$ac_max_sed_cmds # Line after last line for current file.
+ac_more_lines=:
+ac_sed_cmds=""
+while $ac_more_lines; do
+ if test $ac_beg -gt 1; then
+ sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file
+ else
+ sed "${ac_end}q" conftest.subs > conftest.s$ac_file
+ fi
+ if test ! -s conftest.s$ac_file; then
+ ac_more_lines=false
+ rm -f conftest.s$ac_file
+ else
+ if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds="sed -f conftest.s$ac_file"
+ else
+ ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file"
+ fi
+ ac_file=`expr $ac_file + 1`
+ ac_beg=$ac_end
+ ac_end=`expr $ac_end + $ac_max_sed_cmds`
+ fi
+done
+if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds=cat
+fi
+EOF
+
+cat >> $CONFIG_STATUS <<EOF
+
+CONFIG_FILES=\${CONFIG_FILES-"Makefile"}
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then
+ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+ case "$ac_file" in
+ *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
+ ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+ *) ac_file_in="${ac_file}.in" ;;
+ esac
+
+ # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories.
+
+ # Remove last slash and all that follows it. Not all systems have dirname.
+ ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
+ if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
+ # The file is in a subdirectory.
+ test ! -d "$ac_dir" && mkdir "$ac_dir"
+ ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`"
+ # A "../" for each directory in $ac_dir_suffix.
+ ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'`
+ else
+ ac_dir_suffix= ac_dots=
+ fi
+
+ case "$ac_given_srcdir" in
+ .) srcdir=.
+ if test -z "$ac_dots"; then top_srcdir=.
+ else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;;
+ /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;;
+ *) # Relative path.
+ srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix"
+ top_srcdir="$ac_dots$ac_given_srcdir" ;;
+ esac
+
+ case "$ac_given_INSTALL" in
+ [/$]*) INSTALL="$ac_given_INSTALL" ;;
+ *) INSTALL="$ac_dots$ac_given_INSTALL" ;;
+ esac
+
+ echo creating "$ac_file"
+ rm -f "$ac_file"
+ configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure."
+ case "$ac_file" in
+ *Makefile*) ac_comsub="1i\\
+# $configure_input" ;;
+ *) ac_comsub= ;;
+ esac
+
+ ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
+ sed -e "$ac_comsub
+s%@configure_input@%$configure_input%g
+s%@srcdir@%$srcdir%g
+s%@top_srcdir@%$top_srcdir%g
+s%@INSTALL@%$INSTALL%g
+" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file
+fi; done
+rm -f conftest.s*
+
+EOF
+cat >> $CONFIG_STATUS <<EOF
+
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+
+exit 0
+EOF
+chmod +x $CONFIG_STATUS
+rm -fr confdefs* $ac_clean_files
+test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1
+
+if test "$no_recursion" != yes; then
+
+ # Remove --cache-file and --srcdir arguments so they do not pile up.
+ ac_sub_configure_args=
+ ac_prev=
+ for ac_arg in $ac_configure_args; do
+ if test -n "$ac_prev"; then
+ ac_prev=
+ continue
+ fi
+ case "$ac_arg" in
+ -cache-file | --cache-file | --cache-fil | --cache-fi \
+ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+ ac_prev=cache_file ;;
+ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+ ;;
+ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+ ac_prev=srcdir ;;
+ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+ ;;
+ *) ac_sub_configure_args="$ac_sub_configure_args $ac_arg" ;;
+ esac
+ done
+
+ for ac_config_dir in $configdirs; do
+
+ # Do not complain, so a configure script can configure whichever
+ # parts of a large source tree are present.
+ if test ! -d $srcdir/$ac_config_dir; then
+ continue
+ fi
+
+ echo configuring in $ac_config_dir
+
+ case "$srcdir" in
+ .) ;;
+ *)
+ if test -d ./$ac_config_dir || mkdir ./$ac_config_dir; then :;
+ else
+ { echo "configure: error: can not create `pwd`/$ac_config_dir" 1>&2; exit 1; }
+ fi
+ ;;
+ esac
+
+ ac_popdir=`pwd`
+ cd $ac_config_dir
+
+ # A "../" for each directory in /$ac_config_dir.
+ ac_dots=`echo $ac_config_dir|sed -e 's%^\./%%' -e 's%[^/]$%&/%' -e 's%[^/]*/%../%g'`
+
+ case "$srcdir" in
+ .) # No --srcdir option. We are building in place.
+ ac_sub_srcdir=$srcdir ;;
+ /*) # Absolute path.
+ ac_sub_srcdir=$srcdir/$ac_config_dir ;;
+ *) # Relative path.
+ ac_sub_srcdir=$ac_dots$srcdir/$ac_config_dir ;;
+ esac
+
+ # Check for guested configure; otherwise get Cygnus style configure.
+ if test -f $ac_sub_srcdir/configure; then
+ ac_sub_configure=$ac_sub_srcdir/configure
+ elif test -f $ac_sub_srcdir/configure.in; then
+ ac_sub_configure=$ac_configure
+ else
+ echo "configure: warning: no configuration information is in $ac_config_dir" 1>&2
+ ac_sub_configure=
+ fi
+
+ # The recursion is here.
+ if test -n "$ac_sub_configure"; then
+
+ # Make the cache file name correct relative to the subdirectory.
+ case "$cache_file" in
+ /*) ac_sub_cache_file=$cache_file ;;
+ *) # Relative path.
+ ac_sub_cache_file="$ac_dots$cache_file" ;;
+ esac
+ case "$ac_given_INSTALL" in
+ [/$]*) INSTALL="$ac_given_INSTALL" ;;
+ *) INSTALL="$ac_dots$ac_given_INSTALL" ;;
+ esac
+
+ echo "running ${CONFIG_SHELL-/bin/sh} $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_sub_srcdir"
+ # The eval makes quoting arguments work.
+ if eval ${CONFIG_SHELL-/bin/sh} $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_sub_srcdir
+ then :
+ else
+ { echo "configure: error: $ac_sub_configure failed for $ac_config_dir" 1>&2; exit 1; }
+ fi
+ fi
+
+ cd $ac_popdir
+ done
+fi
+
+
diff --git a/winsup/mingw/configure.in b/winsup/mingw/configure.in
new file mode 100644
index 000000000..1a6960b9a
--- /dev/null
+++ b/winsup/mingw/configure.in
@@ -0,0 +1,143 @@
+dnl Process this file with autoconf to produce a configure script.
+
+dnl This file is part of winsup/mingw
+dnl
+dnl This program is free software; you can redistribute it and/or modify
+dnl it under the terms of the GNU General Public License as published by
+dnl the Free Software Foundation; either version 2 of the License, or
+dnl (at your option) any later version.
+dnl
+dnl This program is distributed in the hope that it will be useful,
+dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
+dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+dnl GNU General Public License for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software
+dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+AC_PREREQ(2.12)
+AC_INIT(dllmain.c)
+
+dnl FIXME: We temporarily define our own version of AC_PROG_CC. This is
+dnl copied from autoconf 2.12, but does not call AC_PROG_CC_WORKS. We
+dnl are probably using a cross compiler, which will not be able to fully
+dnl link an executable. This should really be fixed in autoconf
+dnl itself.
+
+AC_DEFUN(LIB_AC_PROG_CC,
+[AC_BEFORE([$0], [AC_PROG_CPP])dnl
+AC_CHECK_TOOL(CC, gcc, gcc)
+if test -z "$CC"; then
+ AC_CHECK_PROG(CC, cc, cc, , , /usr/ucb/cc)
+ test -z "$CC" && AC_MSG_ERROR([no acceptable cc found in \$PATH])
+fi
+
+AC_PROG_CC_GNU
+
+if test $ac_cv_prog_gcc = yes; then
+ GCC=yes
+dnl Check whether -g works, even if CFLAGS is set, in case the package
+dnl plays around with CFLAGS (such as to build both debugging and
+dnl normal versions of a library), tasteless as that idea is.
+ ac_test_CFLAGS="${CFLAGS+set}"
+ ac_save_CFLAGS="$CFLAGS"
+ CFLAGS=
+ AC_PROG_CC_G
+ if test "$ac_test_CFLAGS" = set; then
+ CFLAGS="$ac_save_CFLAGS"
+ elif test $ac_cv_prog_cc_g = yes; then
+ CFLAGS="-g -O2"
+ else
+ CFLAGS="-O2"
+ fi
+ if test "$ac_test_CXXFLAGS" != set; then
+ CXXFLAGS='$(CFLAGS)'
+ fi
+else
+ GCC=
+ test "${CFLAGS+set}" = set || CFLAGS="-g"
+fi
+])
+
+LIB_AC_PROG_CC
+
+AC_CHECK_TOOL(AR, ar, ar)
+
+AC_SUBST(AR)
+AC_CHECK_TOOL(AS, as, as)
+AC_SUBST(AS)
+AC_CHECK_TOOL(RANLIB, ranlib, ranlib)
+AC_SUBST(RANLIB)
+AC_CHECK_TOOL(LD, ld, ld)
+AC_SUBST(LD)
+AC_CHECK_TOOL(DLLTOOL, dlltool, dlltool)
+AC_SUBST(DLLTOOL)
+AC_CHECK_TOOL(DLLWRAP, dlltool, dlltool)
+AC_SUBST(DLLWRAP)
+AC_CHECK_TOOL(WINDRES, windres, windres)
+AC_SUBST(WINDRES)
+
+AC_ALLOCA
+
+AC_CANONICAL_SYSTEM
+
+configdirs=""
+SUBDIRS=""
+HEADER_SUBDIR=""
+
+case "$target_os" in
+*mingw32msvc*)
+ CRT_ID=2
+ MNO_CYGWIN=
+ RUNTIME=msvcrt
+ THREAD_DLL=mingwm
+ LIBM_A=libm.a
+ LIBGMON_A=libgmon.a
+ SUBDIRS="profile"
+ configdirs="$configdirs profile"
+ ;;
+*cygwin*)
+ CRT_ID=1
+ MNO_CYGWIN=-mno-cygwin
+ RUNTIME=crtdll
+ THREAD_DLL=mingwc
+ configdirs="$configdirs"
+ # Do not build libm.a when building under Cygwin winsup. Otherwise, it'll
+ # overwrite Cygwin's one. Likewise for libgmon.a.
+ LIBM_A=
+ LIBGMON_A=
+ # Install mingw headers in mingw subdirectory.
+ HEADER_SUBDIR="mingw"
+ ;;
+*)
+ # Build it for CRTDLL by default.
+ CRT_ID=1
+ MNO_CYGWIN=
+ RUNTIME=crtdll
+ THREAD_DLL=mingwc
+ LIBM_A=libm.a
+ LIBGMON_A=libgmon.a
+ SUBDIRS="profile"
+ configdirs="$configdirs profile"
+ ;;
+esac
+
+if test -n "$configdirs"; then
+ AC_CONFIG_SUBDIRS($configdirs)
+fi
+
+MKINSTALLDIRS=$ac_aux_dir/mkinstalldirs
+AC_SUBST(MKINSTALLDIRS)
+AC_SUBST(CRT_ID)
+AC_SUBST(RUNTIME)
+AC_SUBST(MNO_CYGWIN)
+AC_SUBST(THREAD_DLL)
+AC_SUBST(LIBM_A)
+AC_SUBST(LIBGMON_A)
+AC_SUBST(SUBDIRS)
+AC_SUBST(HEADER_SUBDIR)
+
+AC_PROG_INSTALL
+AC_OUTPUT(Makefile)
+
diff --git a/winsup/mingw/crt1.c b/winsup/mingw/crt1.c
new file mode 100644
index 000000000..f91f1da28
--- /dev/null
+++ b/winsup/mingw/crt1.c
@@ -0,0 +1,234 @@
+/*
+ * crt1.c
+ *
+ * Source code for the startup proceedures used by all programs. This code
+ * is compiled to make crt1.o, which should be located in the library path.
+ *
+ * This code is part of the Mingw32 package.
+ *
+ * Contributors:
+ * Created by Colin Peters <colin@bird.fu.is.saga-u.ac.jp>
+ * Maintained by Mumit Khan <khan@xraylith.wisc.EDU>
+ *
+ * THIS SOFTWARE IS NOT COPYRIGHTED
+ *
+ * This source code is offered for use in the public domain. You may
+ * use, modify or distribute it freely.
+ *
+ * This code is distributed in the hope that it will be useful but
+ * WITHOUT ANY WARRANTY. ALL WARRENTIES, EXPRESS OR IMPLIED ARE HEREBY
+ * DISCLAMED. This includes but is not limited to warrenties of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * $Revision$
+ * $Author$
+ * $Date$
+ *
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <io.h>
+#include <fcntl.h>
+#include <process.h>
+#include <float.h>
+#include <windows.h>
+#include <signal.h>
+
+/* NOTE: The code for initializing the _argv, _argc, and environ variables
+ * has been moved to a separate .c file which is included in both
+ * crt1.c and dllcrt1.c. This means changes in the code don't have to
+ * be manually synchronized, but it does lead to this not-generally-
+ * a-good-idea use of include. */
+#include "init.c"
+
+extern int main (int, char **, char **);
+
+/*
+ * Must have the correct app type for MSVCRT.
+ */
+
+#ifdef __MSVCRT__
+#define __UNKNOWN_APP 0
+#define __CONSOLE_APP 1
+#define __GUI_APP 2
+__MINGW_IMPORT void __set_app_type(int);
+#endif /* __MSVCRT__ */
+
+/*
+ * Setup the default file handles to have the _CRT_fmode mode, as well as
+ * any new files created by the user.
+ */
+extern unsigned int _CRT_fmode;
+
+static void
+_mingw32_init_fmode ()
+{
+ /* Don't set the file mode if the user hasn't set any value for it. */
+ if (_CRT_fmode)
+ {
+ _fmode = _CRT_fmode;
+
+ /*
+ * This overrides the default file mode settings for stdin,
+ * stdout and stderr. At first I thought you would have to
+ * test with isatty, but it seems that the DOS console at
+ * least is smart enough to handle _O_BINARY stdout and
+ * still display correctly.
+ */
+ if (stdin)
+ {
+ _setmode (_fileno (stdin), _CRT_fmode);
+ }
+ if (stdout)
+ {
+ _setmode (_fileno (stdout), _CRT_fmode);
+ }
+ if (stderr)
+ {
+ _setmode (_fileno (stderr), _CRT_fmode);
+ }
+ }
+}
+
+/* This function will be called when a trap occurs. Thanks to Jacob
+ Navia for his contribution. */
+static CALLBACK long
+_gnu_exception_handler (EXCEPTION_POINTERS * exception_data)
+{
+ void (*old_handler) (int);
+ long action = EXCEPTION_CONTINUE_SEARCH;
+ int reset_fpu = 0;
+
+ switch (exception_data->ExceptionRecord->ExceptionCode)
+ {
+ case EXCEPTION_ACCESS_VIOLATION:
+ /* test if the user has set SIGSEGV */
+ old_handler = signal (SIGSEGV, SIG_DFL);
+ if (old_handler == SIG_IGN)
+ {
+ /* this is undefined if the signal was raised by anything other
+ than raise (). */
+ signal (SIGSEGV, SIG_IGN);
+ action = EXCEPTION_CONTINUE_EXECUTION;
+ }
+ else if (old_handler != SIG_DFL)
+ {
+ /* This means 'old' is a user defined function. Call it */
+ (*old_handler) (SIGSEGV);
+ action = EXCEPTION_CONTINUE_EXECUTION;
+ }
+ break;
+
+ case EXCEPTION_FLT_INVALID_OPERATION:
+ case EXCEPTION_FLT_DIVIDE_BY_ZERO:
+ case EXCEPTION_FLT_DENORMAL_OPERAND:
+ case EXCEPTION_FLT_OVERFLOW:
+ case EXCEPTION_FLT_UNDERFLOW:
+ case EXCEPTION_FLT_INEXACT_RESULT:
+ reset_fpu = 1;
+ /* fall through. */
+
+ case EXCEPTION_INT_DIVIDE_BY_ZERO:
+ /* test if the user has set SIGFPE */
+ old_handler = signal (SIGFPE, SIG_DFL);
+ if (old_handler == SIG_IGN)
+ {
+ signal (SIGFPE, SIG_IGN);
+ if (reset_fpu)
+ _fpreset ();
+ action = EXCEPTION_CONTINUE_EXECUTION;
+ }
+ else if (old_handler != SIG_DFL)
+ {
+ /* This means 'old' is a user defined function. Call it */
+ (*old_handler) (SIGFPE);
+ action = EXCEPTION_CONTINUE_EXECUTION;
+ }
+ break;
+
+ default:
+ break;
+ }
+ return action;
+}
+
+/*
+ * The function mainCRTStartup is the entry point for all console programs.
+ */
+static int
+__mingw_CRTStartup ()
+{
+ int nRet;
+
+ /*
+ * Set up the top-level exception handler so that signal handling
+ * works as expected. The mapping between ANSI/POSIX signals and
+ * Win32 SE is not 1-to-1, so caveat emptore.
+ *
+ */
+ SetUnhandledExceptionFilter (_gnu_exception_handler);
+
+ /*
+ * Initialize floating point unit.
+ */
+ _fpreset (); /* Supplied by the runtime library. */
+
+ /*
+ * Set up __argc, __argv and _environ.
+ */
+ _mingw32_init_mainargs ();
+
+ /*
+ * Sets the default file mode for stdin, stdout and stderr, as well
+ * as files later opened by the user, to _CRT_fmode.
+ * NOTE: DLLs don't do this because that would be rude!
+ */
+ _mingw32_init_fmode ();
+
+ /*
+ * Call the main function. If the user does not supply one
+ * the one in the 'libmingw32.a' library will be linked in, and
+ * that one calls WinMain. See main.c in the 'lib' dir
+ * for more details.
+ */
+ nRet = main (_argc, _argv, environ);
+
+ /*
+ * Perform exit processing for the C library. This means
+ * flushing output and calling 'atexit' registered functions.
+ */
+ _cexit ();
+
+ ExitProcess (nRet);
+
+ return 0;
+}
+
+/*
+ * The function mainCRTStartup is the entry point for all console programs.
+ */
+int
+mainCRTStartup ()
+{
+#ifdef __MSVCRT__
+ __set_app_type (__CONSOLE_APP);
+#endif
+ __mingw_CRTStartup ();
+ return 0;
+}
+
+/*
+ * For now the GUI startup function is the same as the console one.
+ * This simply gets rid of the annoying warning about not being able
+ * to find WinMainCRTStartup when linking GUI applications.
+ */
+int
+WinMainCRTStartup ()
+{
+#ifdef __MSVCRT__
+ __set_app_type (__GUI_APP);
+#endif
+ __mingw_CRTStartup ();
+}
+
diff --git a/winsup/mingw/crtdll.def b/winsup/mingw/crtdll.def
new file mode 100644
index 000000000..00ff624c8
--- /dev/null
+++ b/winsup/mingw/crtdll.def
@@ -0,0 +1,704 @@
+;
+; crtdll.def
+;
+; Exports from crtdll.dll from Windows 95 SYSTEM directory. Hopefully this
+; should also work with the crtdll provided with Windows NT.
+;
+; Contributors:
+; Created by Colin Peters <colin@bird.fu.is.saga-u.ac.jp>
+;
+; THIS SOFTWARE IS NOT COPYRIGHTED
+;
+; This source code is offered for use in the public domain. You may
+; use, modify or distribute it freely.
+;
+; This code is distributed in the hope that it will be useful but
+; WITHOUT ANY WARRANTY. ALL WARRENTIES, EXPRESS OR IMPLIED ARE HEREBY
+; DISCLAMED. This includes but is not limited to warrenties of
+; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+;
+; $Revision$
+; $Author$
+; $Date$
+;
+; These three functions appear to be name mangled in some way, so GCC is
+; probably not going to be able to use them in any case.
+;
+; ??2@YAPAXI@Z
+; ??3@YAXPAX@Z
+; ?_set_new_handler@@YAP6AHI@ZP6AHI@Z@Z
+;
+; These are functions for which I have not yet written prototypes or
+; otherwise set up (they are still included below though unlike those
+; first three).
+;
+; _CIacos
+; _CIasin
+; _CIatan
+; _CIatan2
+; _CIcos
+; _CIcosh
+; _CIexp
+; _CIfmod
+; _CIlog
+; _CIlog10
+; _CIpow
+; _CIsin
+; _CIsinh
+; _CIsqrt
+; _CItan
+; _CItanh
+; __dllonexit
+; __mb_cur_max_dll
+; __threadhandle
+; __threadid
+; _abnormal_termination
+; _acmdln_dll
+; _aexit_rtn_dll
+; _amsg_exit
+; _commit
+; _commode_dll
+; _cpumode_dll
+; _ctype
+; _expand
+; _fcloseall
+; _filbuf
+; _fileinfo_dll
+; _flsbuf
+; _flushall
+; _fmode_dll
+; _fpieee_flt
+; _fsopen
+; _ftol
+; _getdiskfree
+; _getdllprocaddr
+; _getdrive
+; _getdrives
+; _getsystime
+; _initterm
+; _ismbbalnum
+; _ismbbalpha
+; _ismbbgraph
+; _ismbbkalnum
+; _ismbbkana
+; _ismbbkpunct
+; _ismbblead
+; _ismbbprint
+; _ismbbpunct
+; _ismbbtrail
+; _ismbcalpha
+; _ismbcdigit
+; _ismbchira
+; _ismbckata
+; _ismbcl0
+; _ismbcl1
+; _ismbcl2
+; _ismbclegal
+; _ismbclower
+; _ismbcprint
+; _ismbcspace
+; _ismbcsymbol
+; _ismbcupper
+; _ismbslead
+; _ismbstrail
+; _lfind
+; _loaddll
+; _lrotl
+; _lrotr
+; _lsearch
+; _makepath
+; _matherr
+; _mbbtombc
+; _mbbtype
+; _mbccpy
+; _mbcjistojms
+; _mbcjmstojis
+; _mbclen
+; _mbctohira
+; _mbctokata
+; _mbctolower
+; _mbctombb
+; _mbctoupper
+; _mbctype
+; _mbsbtype
+; _mbscat
+; _mbscmp
+; _mbscpy
+; _mbscspn
+; _mbsdec
+; _mbsdup
+; _mbsicmp
+; _mbsinc
+; _mbslen
+; _mbslwr
+; _mbsnbcat
+; _mbsnbcmp
+; _mbsnbcnt
+; _mbsnbcpy
+; _mbsnbicmp
+; _mbsnbset
+; _mbsnccnt
+; _mbsncmp
+; _mbsncpy
+; _mbsnextc
+; _mbsnicmp
+; _mbsninc
+; _mbsnset
+; _mbspbrk
+; _mbsrchr
+; _mbsrev
+; _mbsset
+; _mbsspn
+; _mbsspnp
+; _mbsstr
+; _mbstrlen
+; _mbsupr
+; _onexit
+; _osversion_dll
+; _pctype_dll
+; _purecall
+; _pwctype_dll
+; _rmtmp
+; _rotl
+; _rotr
+; _setsystime
+; _snprintf
+; _snwprintf
+; _splitpath
+; _strdate
+; _strdec
+; _strinc
+; _strncnt
+; _strnextc
+; _strninc
+; _strspnp
+; _strtime
+; _tempnam
+; _ultoa
+; _unloaddll
+; _vsnprintf
+; _vsnwprintf
+; _wtoi
+; _wtol
+;
+EXPORTS
+_CIacos
+_CIasin
+_CIatan
+_CIatan2
+_CIcos
+_CIcosh
+_CIexp
+_CIfmod
+_CIlog
+_CIlog10
+_CIpow
+_CIsin
+_CIsinh
+_CIsqrt
+_CItan
+_CItanh
+_HUGE_dll DATA
+_XcptFilter
+__GetMainArgs
+__argc_dll DATA
+__argv_dll DATA
+__dllonexit
+__doserrno
+__fpecode
+__isascii
+__iscsym
+__iscsymf
+__mb_cur_max_dll DATA
+__pxcptinfoptrs
+__threadhandle
+__threadid
+__toascii
+_abnormal_termination
+_access
+_acmdln_dll DATA
+_aexit_rtn_dll DATA
+_amsg_exit
+_assert
+_basemajor_dll DATA
+_baseminor_dll DATA
+_baseversion_dll DATA
+_beep
+_beginthread
+_c_exit
+_cabs
+_cexit
+_cgets
+_chdir
+_chdrive
+_chgsign
+_chmod
+_chsize
+_clearfp
+_close
+_commit
+_commode_dll DATA
+_control87
+_controlfp
+_copysign
+_cprintf
+_cpumode_dll DATA
+_cputs
+_creat
+_cscanf
+_ctype
+_cwait
+_daylight_dll DATA
+_dup
+_dup2
+_ecvt
+_endthread
+_environ_dll DATA
+_eof
+_errno
+_except_handler2
+_execl
+_execle
+_execlp
+_execlpe
+_execv
+_execve
+_execvp
+_execvpe
+_exit
+_expand
+_fcloseall
+_fcvt
+_fdopen
+_fgetchar
+_fgetwchar
+_filbuf
+_fileinfo_dll DATA
+_filelength
+_fileno
+_findclose
+_findfirst
+_findnext
+_finite
+_flsbuf
+_flushall
+_fmode_dll DATA
+_fpclass
+_fpieee_flt
+_fpreset
+_fputchar
+_fputwchar
+_fsopen
+_fstat
+_ftime
+_ftol
+_fullpath
+_futime
+_gcvt
+_get_osfhandle
+_getch
+_getche
+_getcwd
+_getdcwd
+_getdiskfree
+_getdllprocaddr
+_getdrive
+_getdrives
+_getpid
+_getsystime
+_getw
+_global_unwind2
+_heapchk
+_heapmin
+_heapset
+_heapwalk
+_hypot
+_initterm
+_iob DATA
+_isatty
+_isctype
+_ismbbalnum
+_ismbbalpha
+_ismbbgraph
+_ismbbkalnum
+_ismbbkana
+_ismbbkpunct
+_ismbblead
+_ismbbprint
+_ismbbpunct
+_ismbbtrail
+_ismbcalpha
+_ismbcdigit
+_ismbchira
+_ismbckata
+_ismbcl0
+_ismbcl1
+_ismbcl2
+_ismbclegal
+_ismbclower
+_ismbcprint
+_ismbcspace
+_ismbcsymbol
+_ismbcupper
+_ismbslead
+_ismbstrail
+_isnan
+_itoa
+_j0
+_j1
+_jn
+_kbhit
+_lfind
+_loaddll
+_local_unwind2
+_locking
+_logb
+_lrotl
+_lrotr
+_lsearch
+_lseek
+_ltoa
+_makepath
+_matherr
+_mbbtombc
+_mbbtype
+_mbccpy
+_mbcjistojms
+_mbcjmstojis
+_mbclen
+_mbctohira
+_mbctokata
+_mbctolower
+_mbctombb
+_mbctoupper
+_mbctype
+_mbsbtype
+_mbscat
+_mbschr
+_mbscmp
+_mbscpy
+_mbscspn
+_mbsdec
+_mbsdup
+_mbsicmp
+_mbsinc
+_mbslen
+_mbslwr
+_mbsnbcat
+_mbsnbcmp
+_mbsnbcnt
+_mbsnbcpy
+_mbsnbicmp
+_mbsnbset
+_mbsncat
+_mbsnccnt
+_mbsncmp
+_mbsncpy
+_mbsnextc
+_mbsnicmp
+_mbsninc
+_mbsnset
+_mbspbrk
+_mbsrchr
+_mbsrev
+_mbsset
+_mbsspn
+_mbsspnp
+_mbsstr
+_mbstok
+_mbstrlen
+_mbsupr
+_memccpy
+_memicmp
+_mkdir
+_mktemp
+_msize
+_nextafter
+_onexit
+_open
+_open_osfhandle
+_osmajor_dll DATA
+_osminor_dll DATA
+_osmode_dll DATA
+_osver_dll DATA
+_osversion_dll DATA
+_pclose
+_pctype_dll DATA
+_pgmptr_dll DATA
+_pipe
+_popen
+_purecall
+_putch
+_putenv
+_putw
+_pwctype_dll DATA
+_read
+_rmdir
+_rmtmp
+_rotl
+_rotr
+_scalb
+_searchenv
+_seterrormode
+_setjmp
+_setmode
+_setsystime
+_sleep
+_snprintf
+_snwprintf
+_sopen
+_spawnl
+_spawnle
+_spawnlp
+_spawnlpe
+_spawnv
+_spawnve
+_spawnvp
+_spawnvpe
+_splitpath
+_stat
+_statusfp
+_strcmpi
+_strdate
+_strdec
+_strdup
+_strerror
+_stricmp
+_stricoll
+_strinc
+_strlwr
+_strncnt
+_strnextc
+_strnicmp
+_strninc
+_strnset
+_strrev
+_strset
+_strspnp
+_strtime
+_strupr
+_swab
+_sys_errlist DATA
+_sys_nerr_dll DATA
+_tell
+_tempnam
+_timezone_dll DATA
+_tolower
+_toupper
+_tzname DATA
+_tzset
+_ultoa
+_umask
+_ungetch
+_unlink
+_unloaddll
+_utime
+_vsnprintf
+_vsnwprintf
+_wcsdup
+_wcsicmp
+_wcsicoll
+_wcslwr
+_wcsnicmp
+_wcsnset
+_wcsrev
+_wcsset
+_wcsupr
+_winmajor_dll DATA
+_winminor_dll DATA
+_winver_dll DATA
+_write
+_wtoi
+_wtol
+_y0
+_y1
+_yn
+abort
+abs
+acos
+asctime
+asin
+atan
+atan2
+atexit
+atof
+atoi
+atol
+bsearch
+calloc
+ceil
+clearerr
+clock
+cos
+cosh
+ctime
+difftime
+div
+exit
+exp
+fabs
+fclose
+feof
+ferror
+fflush
+fgetc
+fgetpos
+fgets
+fgetwc
+floor
+fmod
+fopen
+fprintf
+fputc
+fputs
+fputwc
+fread
+free
+freopen
+frexp
+fscanf
+fseek
+fsetpos
+ftell
+fwprintf
+fwrite
+fwscanf
+getc
+getchar
+getenv
+gets
+gmtime
+is_wctype
+isalnum
+isalpha
+iscntrl
+isdigit
+isgraph
+isleadbyte
+islower
+isprint
+ispunct
+isspace
+isupper
+iswalnum
+iswalpha
+iswascii
+iswcntrl
+iswctype
+iswdigit
+iswgraph
+iswlower
+iswprint
+iswpunct
+iswspace
+iswupper
+iswxdigit
+isxdigit
+labs
+ldexp
+ldiv
+localeconv
+localtime
+log
+log10
+longjmp
+malloc
+mblen
+mbstowcs
+mbtowc
+memchr
+memcmp
+memcpy
+memmove
+memset
+mktime
+modf
+perror
+pow
+printf
+putc
+putchar
+puts
+qsort
+raise
+rand
+realloc
+remove
+rename
+rewind
+scanf
+setbuf
+setlocale
+setvbuf
+signal
+sin
+sinh
+sprintf
+sqrt
+srand
+sscanf
+strcat
+strchr
+strcmp
+strcoll
+strcpy
+strcspn
+strerror
+strftime
+strlen
+strncat
+strncmp
+strncpy
+strpbrk
+strrchr
+strspn
+strstr
+strtod
+strtok
+strtol
+strtoul
+strxfrm
+swprintf
+swscanf
+system
+tan
+tanh
+time
+tmpfile
+tmpnam
+tolower
+toupper
+towlower
+towupper
+ungetc
+ungetwc
+vfprintf
+vfwprintf
+vprintf
+vsprintf
+vswprintf
+vwprintf
+wcscat
+wcschr
+wcscmp
+wcscoll
+wcscpy
+wcscspn
+wcsftime
+wcslen
+wcsncat
+wcsncmp
+wcsncpy
+wcspbrk
+wcsrchr
+wcsspn
+wcsstr
+wcstod
+wcstok
+wcstol
+wcstombs
+wcstoul
+wcsxfrm
+wctomb
+wprintf
+wscanf
diff --git a/winsup/mingw/crtmt.c b/winsup/mingw/crtmt.c
new file mode 100644
index 000000000..116d850f0
--- /dev/null
+++ b/winsup/mingw/crtmt.c
@@ -0,0 +1,14 @@
+/*
+ * crtmt.c
+ *
+ * This object file defines _CRT_MT to have a value of 1, which will
+ * turn on MT support in GCC runtime. This is only linked in when
+ * you specify -mthreads when linking with gcc. The Mingw support
+ * library, libmingw32.a, contains the complement, crtst.o, which
+ * sets this variable to 0.
+ *
+ * Mumit Khan <khan@nanotech.wisc.edu>
+ *
+ */
+
+int _CRT_MT = 1;
diff --git a/winsup/mingw/crtst.c b/winsup/mingw/crtst.c
new file mode 100644
index 000000000..4835b0963
--- /dev/null
+++ b/winsup/mingw/crtst.c
@@ -0,0 +1,12 @@
+/*
+ * crtst.c
+ *
+ * This object file defines _CRT_MT to have a value of 0, which will
+ * turn off MT support in GCC runtime. This is linked by default unless
+ * you specify -mthreads when linking with gcc.
+ *
+ * Mumit Khan <khan@nanotech.wisc.edu>
+ *
+ */
+
+int _CRT_MT = 0;
diff --git a/winsup/mingw/ctype_old.c b/winsup/mingw/ctype_old.c
new file mode 100644
index 000000000..07eaec1d8
--- /dev/null
+++ b/winsup/mingw/ctype_old.c
@@ -0,0 +1,52 @@
+/*
+ * ctype_old.c
+ *
+ * Oldnames from ANSI header ctype.h
+ *
+ * Some wrapper functions for those old name functions whose appropriate
+ * equivalents are not simply underscore prefixed.
+ *
+ * Contributors:
+ * Created by Colin Peters <colin@bird.fu.is.saga-u.ac.jp>
+ *
+ * THIS SOFTWARE IS NOT COPYRIGHTED
+ *
+ * This source code is offered for use in the public domain. You may
+ * use, modify or distribute it freely.
+ *
+ * This code is distributed in the hope that it will be useful but
+ * WITHOUT ANY WARRANTY. ALL WARRENTIES, EXPRESS OR IMPLIED ARE HEREBY
+ * DISCLAMED. This includes but is not limited to warrenties of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * $Revision$
+ * $Author$
+ * $Date$
+ *
+ */
+
+#include <ctype.h>
+
+int
+isascii (int c)
+{
+ return __isascii(c);
+}
+
+int
+toascii (int c)
+{
+ return __toascii(c);
+}
+
+int
+iscsymf (int c)
+{
+ return __iscsymf(c);
+}
+
+int
+iscsym (int c)
+{
+ return __iscsym(c);
+}
diff --git a/winsup/mingw/dllcrt1.c b/winsup/mingw/dllcrt1.c
new file mode 100644
index 000000000..a0055d8b0
--- /dev/null
+++ b/winsup/mingw/dllcrt1.c
@@ -0,0 +1,89 @@
+/*
+ * dllcrt1.c
+ *
+ * Initialization code for DLLs.
+ *
+ * This file is part of the Mingw32 package.
+ *
+ * Contributors:
+ * Created by Colin Peters <colin@bird.fu.is.saga-u.ac.jp>
+ * DLL support adapted from Gunther Ebert <gunther.ebert@ixos-leipzig.de>
+ * Maintained by Mumit Khan <khan@xraylith.wisc.EDU>
+ *
+ * THIS SOFTWARE IS NOT COPYRIGHTED
+ *
+ * This source code is offered for use in the public domain. You may
+ * use, modify or distribute it freely.
+ *
+ * This code is distributed in the hope that it will be useful but
+ * WITHOUT ANY WARRANTY. ALL WARRENTIES, EXPRESS OR IMPLIED ARE HEREBY
+ * DISCLAMED. This includes but is not limited to warrenties of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * $Revision$
+ * $Author$
+ * $Date$
+ *
+ */
+
+#include <stdio.h>
+#include <io.h>
+#include <process.h>
+#include <windows.h>
+
+/* Unlike normal crt1, I don't initialize the FPU, because the process
+ * should have done that already. I also don't set the file handle modes,
+ * because that would be rude. */
+
+#ifdef __GNUC__
+extern void __main ();
+extern void __do_global_dtors ();
+#endif
+
+extern BOOL WINAPI DllMain (HANDLE, DWORD, LPVOID);
+
+BOOL WINAPI
+DllMainCRTStartup (HANDLE hDll, DWORD dwReason, LPVOID lpReserved)
+{
+ BOOL bRet;
+
+ if (dwReason == DLL_PROCESS_ATTACH)
+ {
+#ifdef __GNUC__
+ /* From libgcc.a, calls global class constructors. */
+ __main ();
+#endif
+ }
+
+ /*
+ * Call the user-supplied DllMain subroutine
+ * NOTE: DllMain is optional, so libmingw32.a includes a stub
+ * which will be used if the user does not supply one.
+ */
+ bRet = DllMain (hDll, dwReason, lpReserved);
+
+#ifdef __GNUC__
+ if (dwReason == DLL_PROCESS_DETACH)
+ {
+ /* From libgcc.a, calls global class destructors. */
+ __do_global_dtors ();
+ }
+#endif
+
+ return bRet;
+}
+
+/*
+ * For the moment a dummy atexit. Atexit causes problems in DLLs, especially
+ * if they are dynamically loaded. For now atexit inside a DLL does nothing.
+ * NOTE: We need this even if the DLL author never calls atexit because
+ * the global constructor function __do_global_ctors called from __main
+ * will attempt to register __do_global_dtors using atexit.
+ * Thanks to Andrey A. Smirnov for pointing this one out.
+ */
+int
+atexit (void (*pfn) ())
+{
+ return 0;
+}
+
diff --git a/winsup/mingw/dllmain.c b/winsup/mingw/dllmain.c
new file mode 100644
index 000000000..40c4f4f37
--- /dev/null
+++ b/winsup/mingw/dllmain.c
@@ -0,0 +1,33 @@
+/*
+ * dllmain.c
+ *
+ * A stub DllMain function which will be called by DLLs which do not
+ * have a user supplied DllMain.
+ *
+ * Contributors:
+ * Created by Colin Peters <colin@bird.fu.is.saga-u.ac.jp>
+ *
+ * THIS SOFTWARE IS NOT COPYRIGHTED
+ *
+ * This source code is offered for use in the public domain. You may
+ * use, modify or distribute it freely.
+ *
+ * This code is distributed in the hope that it will be useful but
+ * WITHOUT ANY WARRANTY. ALL WARRENTIES, EXPRESS OR IMPLIED ARE HEREBY
+ * DISCLAMED. This includes but is not limited to warrenties of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * $Revision$
+ * $Author$
+ * $Date$
+ *
+ */
+
+#include <windows.h>
+
+BOOL WINAPI
+DllMain (HANDLE hDll, DWORD dwReason, LPVOID lpReserved)
+{
+ return TRUE;
+}
+
diff --git a/winsup/mingw/gccmain.c b/winsup/mingw/gccmain.c
new file mode 100644
index 000000000..5c438e98a
--- /dev/null
+++ b/winsup/mingw/gccmain.c
@@ -0,0 +1,85 @@
+/*
+ * gccmain.c
+ *
+ * A separate version of __main, __do_global_ctors and __do_global_dtors for
+ * Mingw32 for use with Cygwin32 b19. Hopefully this object file will only
+ * be linked if the libgcc.a doesn't include __main, __do_global_dtors and
+ * __do_global_ctors.
+ *
+ * This file is part of the Mingw32 package.
+ *
+ * Contributors:
+ * Code supplied by Stan Cox <scox@cygnus.com>
+ *
+ * $Revision$
+ * $Author$
+ * $Date$
+ *
+ */
+
+/* Needed for the atexit prototype. */
+#include <stdlib.h>
+
+typedef void (*func_ptr) (void);
+extern func_ptr __CTOR_LIST__[];
+extern func_ptr __DTOR_LIST__[];
+
+void
+__do_global_dtors (void)
+{
+ static func_ptr *p = __DTOR_LIST__ + 1;
+
+ /*
+ * Call each destructor in the destructor list until a null pointer
+ * is encountered.
+ */
+ while (*p)
+ {
+ (*(p)) ();
+ p++;
+ }
+}
+
+void
+__do_global_ctors (void)
+{
+ unsigned long nptrs = (unsigned long) __CTOR_LIST__[0];
+ unsigned i;
+
+ /*
+ * If the first entry in the constructor list is -1 then the list
+ * is terminated with a null entry. Otherwise the first entry was
+ * the number of pointers in the list.
+ */
+ if (nptrs == -1)
+ {
+ for (nptrs = 0; __CTOR_LIST__[nptrs + 1] != 0; nptrs++)
+ ;
+ }
+
+ /*
+ * Go through the list backwards calling constructors.
+ */
+ for (i = nptrs; i >= 1; i--)
+ {
+ __CTOR_LIST__[i] ();
+ }
+
+ /*
+ * Register the destructors for processing on exit.
+ */
+ atexit (__do_global_dtors);
+}
+
+static int initialized = 0;
+
+void
+__main (void)
+{
+ if (!initialized)
+ {
+ initialized = 1;
+ __do_global_ctors ();
+ }
+}
+
diff --git a/winsup/mingw/include/_mingw.h b/winsup/mingw/include/_mingw.h
new file mode 100644
index 000000000..780cdda3a
--- /dev/null
+++ b/winsup/mingw/include/_mingw.h
@@ -0,0 +1,68 @@
+/*
+ * _mingw.h
+ *
+ * Mingw specific macros included by ALL include files.
+ *
+ * This file is part of the Mingw32 package.
+ *
+ * Contributors:
+ * Created by Mumit Khan <khan@xraylith.wisc.edu>
+ *
+ * THIS SOFTWARE IS NOT COPYRIGHTED
+ *
+ * This source code is offered for use in the public domain. You may
+ * use, modify or distribute it freely.
+ *
+ * This code is distributed in the hope that it will be useful but
+ * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
+ * DISCLAMED. This includes but is not limited to warranties of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ */
+
+#ifndef __MINGW_H
+#define __MINGW_H
+
+/* These are defined by the user (or the compiler)
+ to specify how identifiers are imported from a DLL.
+
+ __DECLSPEC_SUPPORTED Defined if dllimport attribute is supported.
+ __MINGW_IMPORT The attribute definition to specify imported
+ variables/functions.
+ __MINGW32_VERSION Runtime version.
+ __MINGW32_MAJOR_VERSION Runtime major version.
+ __MINGW32_MINOR_VERSION Runtime minor version.
+ __MINGW32_BUILD_DATE Runtime build date.
+
+ Other macros:
+
+ __int64 define to be long long. Using a typedef can
+ tweak bugs in the C++ parser.
+
+ All headers should include this first, and then use __DECLSPEC_SUPPORTED
+ to choose between the old ``__imp__name'' style or __MINGW_IMPORT
+ style declarations. */
+
+#ifndef __GNUC__
+# define __MINGW_IMPORT __declspec(dllimport)
+# define __DECLSPEC_SUPPORTED
+#else /* __GNUC__ */
+# ifdef __declspec
+ /* note the extern at the end. This is needed to work around GCC's
+ limitations in handling dllimport attribute. */
+# define __MINGW_IMPORT __attribute__((dllimport)) extern
+# define __DECLSPEC_SUPPORTED
+# else
+# undef __DECLSPEC_SUPPORTED
+# undef __MINGW_IMPORT
+# endif
+# undef __int64
+# define __int64 long long
+#endif /* __GNUC__ */
+
+#define __MINGW32_VERSION 0.3
+#define __MINGW32_MAJOR_VERSION 0
+#define __MINGW32_MINOR_VERSION 3
+
+#endif /* __MINGW_H */
+
diff --git a/winsup/mingw/include/assert.h b/winsup/mingw/include/assert.h
new file mode 100644
index 000000000..18deea166
--- /dev/null
+++ b/winsup/mingw/include/assert.h
@@ -0,0 +1,71 @@
+/*
+ * assert.h
+ *
+ * Define the assert macro for debug output.
+ *
+ * This file is part of the Mingw32 package.
+ *
+ * Contributors:
+ * Created by Colin Peters <colin@bird.fu.is.saga-u.ac.jp>
+ *
+ * THIS SOFTWARE IS NOT COPYRIGHTED
+ *
+ * This source code is offered for use in the public domain. You may
+ * use, modify or distribute it freely.
+ *
+ * This code is distributed in the hope that it will be useful but
+ * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
+ * DISCLAMED. This includes but is not limited to warranties of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * $Revision$
+ * $Author$
+ * $Date$
+ *
+ */
+
+#ifndef _ASSERT_H_
+#define _ASSERT_H_
+
+/* All the headers include this file. */
+#include <_mingw.h>
+
+#ifndef RC_INVOKED
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef NDEBUG
+
+/*
+ * If not debugging, assert does nothing.
+ */
+#define assert(x) ((void)0);
+
+#else /* debugging enabled */
+
+/*
+ * CRTDLL nicely supplies a function which does the actual output and
+ * call to abort.
+ */
+void _assert (const char*, const char*, int)
+#ifdef __GNUC__
+ __attribute__ ((noreturn))
+#endif
+ ;
+
+/*
+ * Definition of the assert macro.
+ */
+#define assert(e) ((e) ? (void)0 : _assert(#e, __FILE__, __LINE__))
+#endif /* NDEBUG */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* Not RC_INVOKED */
+
+#endif /* Not _ASSERT_H_ */
+
diff --git a/winsup/mingw/include/conio.h b/winsup/mingw/include/conio.h
new file mode 100644
index 000000000..f4fa731d8
--- /dev/null
+++ b/winsup/mingw/include/conio.h
@@ -0,0 +1,74 @@
+/*
+ * conio.h
+ *
+ * Low level console I/O functions. Pretty please try to use the ANSI
+ * standard ones if you are writing new code.
+ *
+ * This file is part of the Mingw32 package.
+ *
+ * Contributors:
+ * Created by Colin Peters <colin@bird.fu.is.saga-u.ac.jp>
+ *
+ * THIS SOFTWARE IS NOT COPYRIGHTED
+ *
+ * This source code is offered for use in the public domain. You may
+ * use, modify or distribute it freely.
+ *
+ * This code is distributed in the hope that it will be useful but
+ * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
+ * DISCLAMED. This includes but is not limited to warranties of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * $Revision$
+ * $Author$
+ * $Date$
+ *
+ */
+
+#ifndef __STRICT_ANSI__
+
+#ifndef _CONIO_H_
+#define _CONIO_H_
+
+/* All the headers include this file. */
+#include <_mingw.h>
+
+#ifndef RC_INVOKED
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+char* _cgets (char*);
+int _cprintf (const char*, ...);
+int _cputs (const char*);
+int _cscanf (char*, ...);
+
+int _getch (void);
+int _getche (void);
+int _kbhit (void);
+int _putch (int);
+int _ungetch (int);
+
+
+#ifndef _NO_OLDNAMES
+
+int getch (void);
+int getche (void);
+int kbhit (void);
+int putch (int);
+int ungetch (int);
+
+#endif /* Not _NO_OLDNAMES */
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* Not RC_INVOKED */
+
+#endif /* Not _CONIO_H_ */
+
+#endif /* Not __STRICT_ANSI__ */
diff --git a/winsup/mingw/include/ctype.h b/winsup/mingw/include/ctype.h
new file mode 100644
index 000000000..e58b15321
--- /dev/null
+++ b/winsup/mingw/include/ctype.h
@@ -0,0 +1,153 @@
+/*
+ * ctype.h
+ *
+ * Functions for testing character types and converting characters.
+ *
+ * This file is part of the Mingw32 package.
+ *
+ * Contributors:
+ * Created by Colin Peters <colin@bird.fu.is.saga-u.ac.jp>
+ *
+ * THIS SOFTWARE IS NOT COPYRIGHTED
+ *
+ * This source code is offered for use in the public domain. You may
+ * use, modify or distribute it freely.
+ *
+ * This code is distributed in the hope that it will be useful but
+ * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
+ * DISCLAMED. This includes but is not limited to warranties of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * $Revision$
+ * $Author$
+ * $Date$
+ *
+ */
+
+#ifndef _CTYPE_H_
+#define _CTYPE_H_
+
+/* All the headers include this file. */
+#include <_mingw.h>
+
+#define __need_wchar_t
+#define __need_wint_t
+#ifndef RC_INVOKED
+#include <stddef.h>
+#endif /* Not RC_INVOKED */
+
+
+/*
+ * The following flags are used to tell iswctype and _isctype what character
+ * types you are looking for.
+ */
+#define _UPPER 0x0001
+#define _LOWER 0x0002
+#define _DIGIT 0x0004
+#define _SPACE 0x0008
+#define _PUNCT 0x0010
+#define _CONTROL 0x0020
+#define _BLANK 0x0040
+#define _HEX 0x0080
+#define _LEADBYTE 0x8000
+
+#define _ALPHA 0x0103
+
+#ifndef RC_INVOKED
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+int isalnum(int);
+int isalpha(int);
+int iscntrl(int);
+int isdigit(int);
+int isgraph(int);
+int islower(int);
+int isprint(int);
+int ispunct(int);
+int isspace(int);
+int isupper(int);
+int isxdigit(int);
+
+#ifndef __STRICT_ANSI__
+int _isctype (int, int);
+#endif
+
+int tolower(int);
+int toupper(int);
+
+/*
+ * NOTE: The above are not old name type wrappers, but functions exported
+ * explicitly by CRTDLL. However, underscored versions are also exported.
+ */
+#ifndef __STRICT_ANSI__
+int _tolower(int);
+int _toupper(int);
+#endif
+
+#ifndef WEOF
+#define WEOF (wchar_t)(0xFFFF)
+#endif
+
+/* Also defined in stdlib.h */
+#ifndef MB_CUR_MAX
+# ifdef __MSVCRT__
+# define MB_CUR_MAX __mb_cur_max
+ __MINGW_IMPORT int __mb_cur_max;
+# else /* not __MSVCRT */
+# define MB_CUR_MAX __mb_cur_max_dll
+ __MINGW_IMPORT int __mb_cur_max_dll;
+# endif /* not __MSVCRT */
+#endif /* MB_CUR_MAX */
+
+#ifndef _WCTYPE_T_DEFINED
+typedef wchar_t wctype_t;
+#define _WCTYPE_T_DEFINED
+#endif
+
+/* Wide character equivalents */
+int iswalnum(wint_t);
+int iswalpha(wint_t);
+int iswascii(wint_t);
+int iswcntrl(wint_t);
+int iswctype(wint_t, wctype_t);
+int is_wctype(wint_t, wctype_t); /* Obsolete! */
+int iswdigit(wint_t);
+int iswgraph(wint_t);
+int iswlower(wint_t);
+int iswprint(wint_t);
+int iswpunct(wint_t);
+int iswspace(wint_t);
+int iswupper(wint_t);
+int iswxdigit(wint_t);
+
+wchar_t towlower(wchar_t);
+wchar_t towupper(wchar_t);
+
+int isleadbyte (int);
+
+#ifndef __STRICT_ANSI__
+int __isascii (int);
+int __toascii (int);
+int __iscsymf (int); /* Valid first character in C symbol */
+int __iscsym (int); /* Valid character in C symbol (after first) */
+
+#ifndef _NO_OLDNAMES
+int isascii (int);
+int toascii (int);
+int iscsymf (int);
+int iscsym (int);
+#endif /* Not _NO_OLDNAMES */
+
+#endif /* Not __STRICT_ANSI__ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* Not RC_INVOKED */
+
+#endif /* Not _CTYPE_H_ */
+
diff --git a/winsup/mingw/include/dir.h b/winsup/mingw/include/dir.h
new file mode 100644
index 000000000..8f089f82c
--- /dev/null
+++ b/winsup/mingw/include/dir.h
@@ -0,0 +1,26 @@
+/*
+ * dir.h
+ *
+ * This file OBSOLESCENT and only provided for backward compatibility.
+ * Please use io.h instead.
+ *
+ * This file is part of the Mingw32 package.
+ *
+ * Contributors:
+ * Created by Colin Peters <colin@bird.fu.is.saga-u.ac.jp>
+ * Mumit Khan <khan@xraylith.wisc.edu>
+ *
+ * THIS SOFTWARE IS NOT COPYRIGHTED
+ *
+ * This source code is offered for use in the public domain. You may
+ * use, modify or distribute it freely.
+ *
+ * This code is distributed in the hope that it will be useful but
+ * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
+ * DISCLAMED. This includes but is not limited to warranties of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ */
+
+#include <io.h>
+
diff --git a/winsup/mingw/include/direct.h b/winsup/mingw/include/direct.h
new file mode 100644
index 000000000..cac11a8df
--- /dev/null
+++ b/winsup/mingw/include/direct.h
@@ -0,0 +1,96 @@
+/*
+ * direct.h
+ *
+ * Functions for manipulating paths and directories (included from io.h)
+ * plus functions for setting the current drive.
+ *
+ * This file is part of the Mingw32 package.
+ *
+ * Contributors:
+ * Created by Colin Peters <colin@bird.fu.is.saga-u.ac.jp>
+ *
+ * THIS SOFTWARE IS NOT COPYRIGHTED
+ *
+ * This source code is offered for use in the public domain. You may
+ * use, modify or distribute it freely.
+ *
+ * This code is distributed in the hope that it will be useful but
+ * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
+ * DISCLAMED. This includes but is not limited to warranties of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * $Revision$
+ * $Author$
+ * $Date$
+ *
+ */
+
+#ifndef __STRICT_ANSI__
+
+#ifndef _DIRECT_H_
+#define _DIRECT_H_
+
+/* All the headers include this file. */
+#include <_mingw.h>
+
+#define __need_wchar_t
+#ifndef RC_INVOKED
+#include <stddef.h>
+#endif /* Not RC_INVOKED */
+
+#include <io.h>
+
+#ifndef RC_INVOKED
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef _DISKFREE_T_DEFINED
+/* needed by _getdiskfree (also in dos.h) */
+struct _diskfree_t {
+ unsigned total_clusters;
+ unsigned avail_clusters;
+ unsigned sectors_per_cluster;
+ unsigned bytes_per_sector;
+};
+#define _DISKFREE_T_DEFINED
+#endif
+
+/*
+ * You really shouldn't be using these. Use the Win32 API functions instead.
+ * However, it does make it easier to port older code.
+ */
+int _getdrive (void);
+unsigned long _getdrives(void);
+int _chdrive (int);
+char* _getdcwd (int, char*, int);
+unsigned _getdiskfree (unsigned, struct _diskfree_t *);
+
+#ifndef _NO_OLDNAMES
+# define diskfree_t _diskfree_t
+#endif
+
+#ifndef _WDIRECT_DEFINED
+
+/* wide character versions. Also in wchar.h */
+
+int _wchdir(const wchar_t*);
+wchar_t* _wgetcwd(wchar_t*, int);
+wchar_t* _wgetdcwd(int, wchar_t*, int);
+int _wmkdir(const wchar_t*);
+int _wrmdir(const wchar_t*);
+
+#define _WDIRECT_DEFINED
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* Not RC_INVOKED */
+
+#endif /* Not _DIRECT_H_ */
+
+#endif /* Not __STRICT_ANSI__ */
+
diff --git a/winsup/mingw/include/dirent.h b/winsup/mingw/include/dirent.h
new file mode 100644
index 000000000..3d484ee9b
--- /dev/null
+++ b/winsup/mingw/include/dirent.h
@@ -0,0 +1,96 @@
+/*
+ * DIRENT.H (formerly DIRLIB.H)
+ *
+ * by M. J. Weinstein Released to public domain 1-Jan-89
+ *
+ * Because I have heard that this feature (opendir, readdir, closedir)
+ * it so useful for programmers coming from UNIX or attempting to port
+ * UNIX code, and because it is reasonably light weight, I have included
+ * it in the Mingw32 package. I have also added an implementation of
+ * rewinddir, seekdir and telldir.
+ * - Colin Peters <colin@bird.fu.is.saga-u.ac.jp>
+ *
+ * This code is distributed in the hope that is will be useful but
+ * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
+ * DISCLAMED. This includeds but is not limited to warranties of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * $Revision$
+ * $Author$
+ * $Date$
+ *
+ */
+
+#ifndef __STRICT_ANSI__
+
+#ifndef _DIRENT_H_
+#define _DIRENT_H_
+
+/* All the headers include this file. */
+#include <_mingw.h>
+
+#include <io.h>
+
+#ifndef RC_INVOKED
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct dirent
+{
+ long d_ino; /* Always zero. */
+ unsigned short d_reclen; /* Always zero. */
+ unsigned short d_namlen; /* Length of name in d_name. */
+ char* d_name; /* File name. */
+ /* NOTE: The name in the dirent structure points to the name in the
+ * finddata_t structure in the DIR. */
+};
+
+/*
+ * This is an internal data structure. Good programmers will not use it
+ * except as an argument to one of the functions below.
+ */
+typedef struct
+{
+ /* disk transfer area for this dir */
+ struct _finddata_t dd_dta;
+
+ /* dirent struct to return from dir (NOTE: this makes this thread
+ * safe as long as only one thread uses a particular DIR struct at
+ * a time) */
+ struct dirent dd_dir;
+
+ /* _findnext handle */
+ long dd_handle;
+
+ /*
+ * Status of search:
+ * 0 = not started yet (next entry to read is first entry)
+ * -1 = off the end
+ * positive = 0 based index of next entry
+ */
+ short dd_stat;
+
+ /* given path for dir with search pattern (struct is extended) */
+ char dd_name[1];
+} DIR;
+
+
+DIR* opendir (const char*);
+struct dirent* readdir (DIR*);
+int closedir (DIR*);
+void rewinddir (DIR*);
+long telldir (DIR*);
+void seekdir (DIR*, long);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* Not RC_INVOKED */
+
+#endif /* Not _DIRENT_H_ */
+
+#endif /* Not __STRICT_ANSI__ */
+
diff --git a/winsup/mingw/include/dos.h b/winsup/mingw/include/dos.h
new file mode 100644
index 000000000..a67c19962
--- /dev/null
+++ b/winsup/mingw/include/dos.h
@@ -0,0 +1,123 @@
+/*
+ * dos.h
+ *
+ * DOS-specific functions and structures.
+ *
+ * This file is part of the Mingw32 package.
+ *
+ * Contributors:
+ * Created by J.J. van der Heijden <J.J.vanderHeijden@student.utwente.nl>
+ *
+ * THIS SOFTWARE IS NOT COPYRIGHTED
+ *
+ * This source code is offered for use in the public domain. You may
+ * use, modify or distribute it freely.
+ *
+ * This code is distributed in the hope that it will be useful but
+ * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
+ * DISCLAMED. This includes but is not limited to warranties of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * $Revision$
+ * $Author$
+ * $Date$
+ *
+ */
+
+#ifndef __STRICT_ANSI__
+
+#ifndef _DOS_H_
+#define _DOS_H_
+
+/* All the headers include this file. */
+#include <_mingw.h>
+
+#define __need_wchar_t
+#ifndef RC_INVOKED
+#include <stddef.h>
+#endif /* Not RC_INVOKED */
+
+/* For DOS file attributes */
+#include <io.h>
+
+#ifndef RC_INVOKED
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef __DECLSPEC_SUPPORTED
+
+extern char** __imp__pgmptr_dll;
+#define _pgmptr (*__imp__pgmptr_dll)
+
+/* Wide character equivalent */
+extern wchar_t** __imp_wpgmptr_dll;
+#define _wpgmptr (*__imp__wpgmptr_dll)
+
+extern unsigned int *__imp__basemajor_dll;
+extern unsigned int *__imp__baseminor_dll;
+extern unsigned int *__imp__baseversion_dll;
+extern unsigned int *__imp__osmajor_dll;
+extern unsigned int *__imp__osminor_dll;
+extern unsigned int *__imp__osmode_dll;
+
+#define _basemajor (*__imp__basemajor_dll)
+#define _baseminor (*__imp__baseminor_dll)
+#define _baseversion (*__imp__baseversion_dll)
+#define _osmajor (*__imp__osmajor_dll)
+#define _osminor (*__imp__osminor_dll)
+#define _osmode (*__imp__osmode_dll)
+
+#else /* __DECLSPEC_SUPPORTED */
+
+__MINGW_IMPORT char* _pgmptr_dll;
+#define _pgmptr _pgmptr_dll
+
+/* Wide character equivalent */
+__MINGW_IMPORT wchar_t* _wpgmptr_dll;
+#define _wpgmptr _wpgmptr_dll
+
+__MINGW_IMPORT unsigned int _basemajor_dll;
+__MINGW_IMPORT unsigned int _baseminor_dll;
+__MINGW_IMPORT unsigned int _baseversion_dll;
+__MINGW_IMPORT unsigned int _osmajor_dll;
+__MINGW_IMPORT unsigned int _osminor_dll;
+__MINGW_IMPORT unsigned int _osmode_dll;
+
+#define _basemajor _basemajor_dll
+#define _baseminor _baseminor_dll
+#define _baseversion _baseversion_dll
+#define _osmajor _osmajor_dll
+#define _osminor _osminor_dll
+#define _osmode _osmode_dll
+
+#endif /* __DECLSPEC_SUPPORTED */
+
+#ifndef _DISKFREE_T_DEFINED
+/* needed by _getdiskfree (also in direct.h) */
+struct _diskfree_t {
+ unsigned total_clusters;
+ unsigned avail_clusters;
+ unsigned sectors_per_cluster;
+ unsigned bytes_per_sector;
+};
+#define _DISKFREE_T_DEFINED
+#endif
+
+unsigned _getdiskfree (unsigned, struct _diskfree_t *);
+
+#ifndef _NO_OLDNAMES
+# define diskfree_t _diskfree_t
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* Not RC_INVOKED */
+
+#endif /* Not _DOS_H_ */
+
+#endif /* Not __STRICT_ANSI__ */
+
diff --git a/winsup/mingw/include/errno.h b/winsup/mingw/include/errno.h
new file mode 100644
index 000000000..d731078f5
--- /dev/null
+++ b/winsup/mingw/include/errno.h
@@ -0,0 +1,117 @@
+/*
+ * errno.h
+ *
+ * Error numbers and access to error reporting.
+ *
+ * This file is part of the Mingw32 package.
+ *
+ * Contributors:
+ * Created by Colin Peters <colin@bird.fu.is.saga-u.ac.jp>
+ *
+ * THIS SOFTWARE IS NOT COPYRIGHTED
+ *
+ * This source code is offered for use in the public domain. You may
+ * use, modify or distribute it freely.
+ *
+ * This code is distributed in the hope that it will be useful but
+ * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
+ * DISCLAMED. This includes but is not limited to warranties of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * $Revision$
+ * $Author$
+ * $Date$
+ *
+ */
+
+#ifndef _ERRNO_H_
+#define _ERRNO_H_
+
+/* All the headers include this file. */
+#include <_mingw.h>
+
+/*
+ * Error numbers.
+ * TODO: Can't be sure of some of these assignments, I guessed from the
+ * names given by strerror and the defines in the Cygnus errno.h. A lot
+ * of the names from the Cygnus errno.h are not represented, and a few
+ * of the descriptions returned by strerror do not obviously match
+ * their error naming.
+ */
+#define EPERM 1 /* Operation not permitted */
+#define ENOFILE 2 /* No such file or directory */
+#define ENOENT 2
+#define ESRCH 3 /* No such process */
+#define EINTR 4 /* Interrupted function call */
+#define EIO 5 /* Input/output error */
+#define ENXIO 6 /* No such device or address */
+#define E2BIG 7 /* Arg list too long */
+#define ENOEXEC 8 /* Exec format error */
+#define EBADF 9 /* Bad file descriptor */
+#define ECHILD 10 /* No child processes */
+#define EAGAIN 11 /* Resource temporarily unavailable */
+#define ENOMEM 12 /* Not enough space */
+#define EACCES 13 /* Permission denied */
+#define EFAULT 14 /* Bad address */
+/* 15 - Unknown Error */
+#define EBUSY 16 /* strerror reports "Resource device" */
+#define EEXIST 17 /* File exists */
+#define EXDEV 18 /* Improper link (cross-device link?) */
+#define ENODEV 19 /* No such device */
+#define ENOTDIR 20 /* Not a directory */
+#define EISDIR 21 /* Is a directory */
+#define EINVAL 22 /* Invalid argument */
+#define ENFILE 23 /* Too many open files in system */
+#define EMFILE 24 /* Too many open files */
+#define ENOTTY 25 /* Inappropriate I/O control operation */
+/* 26 - Unknown Error */
+#define EFBIG 27 /* File too large */
+#define ENOSPC 28 /* No space left on device */
+#define ESPIPE 29 /* Invalid seek (seek on a pipe?) */
+#define EROFS 30 /* Read-only file system */
+#define EMLINK 31 /* Too many links */
+#define EPIPE 32 /* Broken pipe */
+#define EDOM 33 /* Domain error (math functions) */
+#define ERANGE 34 /* Result too large (possibly too small) */
+/* 35 - Unknown Error */
+#define EDEADLOCK 36 /* Resource deadlock avoided (non-Cyg) */
+#define EDEADLK 36
+/* 37 - Unknown Error */
+#define ENAMETOOLONG 38 /* Filename too long (91 in Cyg?) */
+#define ENOLCK 39 /* No locks available (46 in Cyg?) */
+#define ENOSYS 40 /* Function not implemented (88 in Cyg?) */
+#define ENOTEMPTY 41 /* Directory not empty (90 in Cyg?) */
+#define EILSEQ 42 /* Illegal byte sequence */
+
+/*
+ * NOTE: ENAMETOOLONG and ENOTEMPTY conflict with definitions in the
+ * sockets.h header provided with windows32api-0.1.2.
+ * You should go and put an #if 0 ... #endif around the whole block
+ * of errors (look at the comment above them).
+ */
+
+#ifndef RC_INVOKED
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Definitions of errno. For _doserrno, sys_nerr and * sys_errlist, see
+ * stdlib.h.
+ */
+#ifdef _UWIN
+#undef errno
+extern int errno;
+#else
+int* _errno();
+#define errno (*_errno())
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* Not RC_INVOKED */
+
+#endif /* Not _ERRNO_H_ */
diff --git a/winsup/mingw/include/excpt.h b/winsup/mingw/include/excpt.h
new file mode 100644
index 000000000..7bc032938
--- /dev/null
+++ b/winsup/mingw/include/excpt.h
@@ -0,0 +1,123 @@
+/*
+ * excpt.h
+ *
+ * Support for operating system level structured exception handling.
+ *
+ * NOTE: This is very preliminary stuff. I am also pretty sure it is
+ * completely Intel specific.
+ *
+ * This file is part of the Mingw32 package.
+ *
+ * Contributors:
+ * Created by Colin Peters <colin@bird.fu.is.saga-u.ac.jp>
+ * Based on code by Mikey <jeffdb@netzone.com>
+ *
+ * THIS SOFTWARE IS NOT COPYRIGHTED
+ *
+ * This source code is offered for use in the public domain. You may
+ * use, modify or distribute it freely.
+ *
+ * This code is distributed in the hope that it will be useful but
+ * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
+ * DISCLAMED. This includes but is not limited to warranties of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * $Revision$
+ * $Author$
+ * $Date$
+ *
+ */
+
+#ifndef _EXCPT_H_
+#define _EXCPT_H_
+
+/* All the headers include this file. */
+#include <_mingw.h>
+
+#ifndef __STRICT_ANSI__
+
+#include <windows.h>
+
+/*
+ * NOTE: The constants structs and typedefs below should be defined in the
+ * Win32 API headers.
+ */
+#define EH_NONCONTINUABLE 0x01
+#define EH_UNWINDING 0x02
+#define EH_EXIT_UNWIND 0x04
+#define EH_STACK_INVALID 0x08
+#define EH_NESTED_CALL 0x10
+
+#ifndef RC_INVOKED
+
+typedef enum {
+ ExceptionContinueExecution,
+ ExceptionContinueSearch,
+ ExceptionNestedException,
+ ExceptionCollidedUnwind
+} EXCEPTION_DISPOSITION;
+
+
+/*
+ * End of stuff that should be in the Win32 API files.
+ */
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * The type of function that is expected as an exception handler to be
+ * installed with _try1.
+ */
+typedef EXCEPTION_DISPOSITION (*PEXCEPTION_HANDLER)
+ (struct _EXCEPTION_RECORD*, void*, struct _CONTEXT*, void*);
+
+/*
+ * This is not entirely necessary, but it is the structure installed by
+ * the _try1 primitive below.
+ */
+typedef struct _EXCEPTION_REGISTRATION
+{
+ struct _EXCEPTION_REGISTRATION* prev;
+ PEXCEPTION_HANDLER handler;
+} EXCEPTION_REGISTRATION, *PEXCEPTION_REGISTRATION;
+
+typedef EXCEPTION_REGISTRATION EXCEPTION_REGISTRATION_RECORD;
+typedef PEXCEPTION_REGISTRATION PEXCEPTION_REGISTRATION_RECORD;
+
+/*
+ * A macro which installs the supplied exception handler.
+ * Push the pointer to the new handler onto the stack,
+ * then push the pointer to the old registration structure (at fs:0)
+ * onto the stack, then put a pointer to the new registration
+ * structure (i.e. the current stack pointer) at fs:0.
+ */
+#define __try1(pHandler) \
+ __asm__ ("pushl %0;pushl %%fs:0;movl %%esp,%%fs:0;" : : "g" (pHandler));
+
+/*
+ * A macro which (dispite its name) *removes* an installed
+ * exception handler. Should be used only in conjunction with the above
+ * install routine __try1.
+ * Move the pointer to the old reg. struct (at the current stack
+ * position) to fs:0, replacing the pointer we installed above,
+ * then add 8 to the stack pointer to get rid of the space we
+ * used when we pushed on our new reg. struct above. Notice that
+ * the stack must be in the exact state at this point that it was
+ * after we did _try1 or this will smash things.
+ */
+#define __except1 \
+ __asm__ ("movl (%%esp),%%eax;movl %%eax,%%fs:0;addl $8,%%esp;" \
+ : : : "%eax");
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* Not RC_INVOKED */
+
+#endif /* Not strict ANSI */
+
+#endif /* _EXCPT_H_ not defined */
diff --git a/winsup/mingw/include/fcntl.h b/winsup/mingw/include/fcntl.h
new file mode 100644
index 000000000..44b00097a
--- /dev/null
+++ b/winsup/mingw/include/fcntl.h
@@ -0,0 +1,135 @@
+/*
+ * fcntl.h
+ *
+ * Access constants for _open. Note that the permissions constants are
+ * in sys/stat.h (ick).
+ *
+ * This code is part of the Mingw32 package.
+ *
+ * Contributors:
+ * Created by Colin Peters <colin@bird.fu.is.saga-u.ac.jp>
+ *
+ * THIS SOFTWARE IS NOT COPYRIGHTED
+ *
+ * This source code is offered for use in the public domain. You may
+ * use, modify or distribute it freely.
+ *
+ * This code is distributed in the hope that it will be useful but
+ * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
+ * DISCLAMED. This includes but is not limited to warranties of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * $Revision$
+ * $Author$
+ * $Date$
+ *
+ */
+
+#ifndef __STRICT_ANSI__
+
+#ifndef _FCNTL_H_
+#define _FCNTL_H_
+
+/* All the headers include this file. */
+#include <_mingw.h>
+
+/*
+ * It appears that fcntl.h should include io.h for compatibility...
+ */
+#include <io.h>
+
+/* Specifiy one of these flags to define the access mode. */
+#define _O_RDONLY 0
+#define _O_WRONLY 1
+#define _O_RDWR 2
+
+/* Mask for access mode bits in the _open flags. */
+#define _O_ACCMODE (_O_RDONLY|_O_WRONLY|_O_RDWR)
+
+#define _O_APPEND 0x0008 /* Writes will add to the end of the file. */
+
+#define _O_RANDOM 0x0010
+#define _O_SEQUENTIAL 0x0020
+#define _O_TEMPORARY 0x0040 /* Make the file dissappear after closing.
+ * WARNING: Even if not created by _open! */
+#define _O_NOINHERIT 0x0080
+
+#define _O_CREAT 0x0100 /* Create the file if it does not exist. */
+#define _O_TRUNC 0x0200 /* Truncate the file if it does exist. */
+#define _O_EXCL 0x0400 /* Open only if the file does not exist. */
+
+/* NOTE: Text is the default even if the given _O_TEXT bit is not on. */
+#define _O_TEXT 0x4000 /* CR-LF in file becomes LF in memory. */
+#define _O_BINARY 0x8000 /* Input and output is not translated. */
+#define _O_RAW _O_BINARY
+
+#ifndef _NO_OLDNAMES
+
+/* POSIX/Non-ANSI names for increased portability */
+#define O_RDONLY _O_RDONLY
+#define O_WRONLY _O_WRONLY
+#define O_RDWR _O_RDWR
+#define O_ACCMODE _O_ACCMODE
+#define O_APPEND _O_APPEND
+#define O_CREAT _O_CREAT
+#define O_TRUNC _O_TRUNC
+#define O_EXCL _O_EXCL
+#define O_TEXT _O_TEXT
+#define O_BINARY _O_BINARY
+#define O_TEMPORARY _O_TEMPORARY
+#define O_NOINHERIT _O_NOINHERIT
+#define O_SEQENTIAL _O_SEQUENTIAL
+#define O_RANDOM _O_RANDOM
+
+#endif /* Not _NO_OLDNAMES */
+
+
+#ifndef RC_INVOKED
+
+/*
+ * This variable determines the default file mode.
+ * TODO: Which flags work?
+ */
+#ifndef __DECLSPEC_SUPPORTED
+
+#ifdef __MSVCRT__
+extern unsigned int* __imp__fmode;
+#define _fmode (*__imp__fmode)
+#else
+/* CRTDLL */
+extern unsigned int* __imp__fmode_dll;
+#define _fmode (*__imp__fmode_dll)
+#endif
+
+#else /* __DECLSPEC_SUPPORTED */
+
+#ifdef __MSVCRT__
+__MINGW_IMPORT unsigned int _fmode;
+#else /* ! __MSVCRT__ */
+__MINGW_IMPORT unsigned int _fmode_dll;
+#define _fmode _fmode_dll
+#endif /* ! __MSVCRT__ */
+
+#endif /* __DECLSPEC_SUPPORTED */
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+int _setmode (int, int);
+
+#ifndef _NO_OLDNAMES
+int setmode (int, int);
+#endif /* Not _NO_OLDNAMES */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* Not RC_INVOKED */
+
+#endif /* Not _FCNTL_H_ */
+
+#endif /* Not __STRICT_ANSI__ */
+
diff --git a/winsup/mingw/include/float.h b/winsup/mingw/include/float.h
new file mode 100644
index 000000000..af7c08614
--- /dev/null
+++ b/winsup/mingw/include/float.h
@@ -0,0 +1,219 @@
+/*
+ * float.h
+ *
+ * Constants related to floating point arithmetic.
+ *
+ * Also included here are some non-ANSI bits for accessing the floating
+ * point controller.
+ *
+ * NOTE: GCC provides float.h, and it is probably more accurate than this,
+ * but it doesn't include the non-standard stuff for accessing the
+ * fp controller. (TODO: Move those bits elsewhere?) Thus it is
+ * probably not a good idea to use the GCC supplied version instead
+ * of this header.
+ *
+ * This file is part of the Mingw32 package.
+ *
+ * Contributors:
+ * Created by Colin Peters <colin@bird.fu.is.saga-u.ac.jp>
+ *
+ * THIS SOFTWARE IS NOT COPYRIGHTED
+ *
+ * This source code is offered for use in the public domain. You may
+ * use, modify or distribute it freely.
+ *
+ * This code is distributed in the hope that it will be useful but
+ * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
+ * DISCLAMED. This includes but is not limited to warranties of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * $Revision$
+ * $Author$
+ * $Date$
+ *
+ */
+
+#ifndef _FLOAT_H_
+#define _FLOAT_H_
+
+/* All the headers include this file. */
+#include <_mingw.h>
+
+#define FLT_ROUNDS 1
+#define FLT_GUARD 1
+#define FLT_NORMALIZE 1
+
+/*
+ * The characteristics of float.
+ */
+
+/* The radix for floating point representation. */
+#define FLT_RADIX 2
+
+/* Decimal digits of precision. */
+#define FLT_DIG 6
+
+/* Smallest number such that 1+x != 1 */
+#define FLT_EPSILON 1.19209290e-07F
+
+/* The number of base FLT_RADIX digits in the mantissa. */
+#define FLT_MANT_DIG 24
+
+/* The maximum floating point number. */
+#define FLT_MAX 3.40282347e+38F
+
+/* Maximum n such that FLT_RADIX^n - 1 is representable. */
+#define FLT_MAX_EXP 128
+
+/* Maximum n such that 10^n is representable. */
+#define FLT_MAX_10_EXP 38
+
+/* Minimum normalized floating-point number. */
+#define FLT_MIN 1.17549435e-38F
+
+/* Minimum n such that FLT_RADIX^n is a normalized number. */
+#define FLT_MIN_EXP (-125)
+
+/* Minimum n such that 10^n is a normalized number. */
+#define FLT_MIN_10_EXP (-37)
+
+
+/*
+ * The characteristics of double.
+ */
+#define DBL_DIG 15
+#define DBL_EPSILON 1.1102230246251568e-16
+#define DBL_MANT_DIG 53
+#define DBL_MAX 1.7976931348623157e+308
+#define DBL_MAX_EXP 1024
+#define DBL_MAX_10_EXP 308
+#define DBL_MIN 2.2250738585072014e-308
+#define DBL_MIN_EXP (-1021)
+#define DBL_MIN_10_EXP (-307)
+
+
+/*
+ * The characteristics of long double.
+ * NOTE: long double is the same as double.
+ */
+#define LDBL_DIG 15
+#define LDBL_EPSILON 1.1102230246251568e-16L
+#define LDBL_MANT_DIG 53
+#define LDBL_MAX 1.7976931348623157e+308L
+#define LDBL_MAX_EXP 1024
+#define LDBL_MAX_10_EXP 308
+#define LDBL_MIN 2.2250738585072014e-308L
+#define LDBL_MIN_EXP (-1021)
+#define LDBL_MIN_10_EXP (-307)
+
+
+/*
+ * Functions and definitions for controlling the FPU.
+ */
+#ifndef __STRICT_ANSI__
+
+/* TODO: These constants are only valid for x86 machines */
+
+/* Control word masks for unMask */
+#define _MCW_EM 0x0008001F /* Error masks */
+#define _MCW_IC 0x00040000 /* Infinity */
+#define _MCW_RC 0x00000300 /* Rounding */
+#define _MCW_PC 0x00030000 /* Precision */
+
+/* Control word values for unNew (use with related unMask above) */
+#define _EM_INVALID 0x00000010
+#define _EM_DENORMAL 0x00080000
+#define _EM_ZERODIVIDE 0x00000008
+#define _EM_OVERFLOW 0x00000004
+#define _EM_UNDERFLOW 0x00000002
+#define _EM_INEXACT 0x00000001
+#define _IC_AFFINE 0x00040000
+#define _IC_PROJECTIVE 0x00000000
+#define _RC_CHOP 0x00000300
+#define _RC_UP 0x00000200
+#define _RC_DOWN 0x00000100
+#define _RC_NEAR 0x00000000
+#define _PC_24 0x00020000
+#define _PC_53 0x00010000
+#define _PC_64 0x00000000
+
+/* Return values for fpclass. */
+#define _FPCLASS_SNAN 0x0001 /* Signaling "Not a Number" */
+#define _FPCLASS_QNAN 0x0002 /* Quiet "Not a Number" */
+#define _FPCLASS_NINF 0x0004 /* Negative Infinity */
+#define _FPCLASS_NN 0x0008 /* Negative Normal */
+#define _FPCLASS_ND 0x0010 /* Negative Denormal */
+#define _FPCLASS_NZ 0x0020 /* Negative Zero */
+#define _FPCLASS_PZ 0x0040 /* Positive Zero */
+#define _FPCLASS_PD 0x0080 /* Positive Denormal */
+#define _FPCLASS_PN 0x0100 /* Positive Normal */
+#define _FPCLASS_PINF 0x0200 /* Positive Infinity */
+
+/* invalid subconditions (_SW_INVALID also set) */
+#define _SW_UNEMULATED 0x0040 /* unemulated instruction */
+#define _SW_SQRTNEG 0x0080 /* square root of a neg number */
+#define _SW_STACKOVERFLOW 0x0200 /* FP stack overflow */
+#define _SW_STACKUNDERFLOW 0x0400 /* FP stack underflow */
+
+/* Floating point error signals and return codes */
+#define _FPE_INVALID 0x81
+#define _FPE_DENORMAL 0x82
+#define _FPE_ZERODIVIDE 0x83
+#define _FPE_OVERFLOW 0x84
+#define _FPE_UNDERFLOW 0x85
+#define _FPE_INEXACT 0x86
+#define _FPE_UNEMULATED 0x87
+#define _FPE_SQRTNEG 0x88
+#define _FPE_STACKOVERFLOW 0x8a
+#define _FPE_STACKUNDERFLOW 0x8b
+#define _FPE_EXPLICITGEN 0x8c /* raise( SIGFPE ); */
+
+#ifndef RC_INVOKED
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Set the FPU control word as cw = (cw & ~unMask) | (unNew & unMask),
+ * i.e. change the bits in unMask to have the values they have in unNew,
+ * leaving other bits unchanged. */
+unsigned int _controlfp (unsigned int unNew, unsigned int unMask);
+unsigned int _control87 (unsigned int unNew, unsigned int unMask);
+
+
+unsigned int _clearfp (); /* Clear the FPU status word */
+unsigned int _statusfp (); /* Report the FPU status word */
+#define _clear87 _clearfp
+#define _status87 _statusfp
+
+void _fpreset (); /* Reset the FPU */
+void fpreset ();
+
+/* Global 'variable' for the current floating point error code. */
+int * __fpecode();
+#define _fpecode (*(__fpecode()))
+
+/*
+ * IEEE recommended functions
+ */
+
+double _chgsign (double);
+double _copysign (double, double);
+double _logb (double);
+double _nextafter (double, double);
+double _scalb (double, long);
+
+int _finite (double);
+int _fpclass (double);
+int _isnan (double);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* Not RC_INVOKED */
+
+#endif /* Not __STRICT_ANSI__ */
+
+#endif /* _FLOAT_H_ */
+
diff --git a/winsup/mingw/include/io.h b/winsup/mingw/include/io.h
new file mode 100644
index 000000000..e30f8687e
--- /dev/null
+++ b/winsup/mingw/include/io.h
@@ -0,0 +1,258 @@
+/*
+ * io.h
+ *
+ * System level I/O functions and types.
+ *
+ * This file is part of the Mingw32 package.
+ *
+ * Contributors:
+ * Created by Colin Peters <colin@bird.fu.is.saga-u.ac.jp>
+ *
+ * THIS SOFTWARE IS NOT COPYRIGHTED
+ *
+ * This source code is offered for use in the public domain. You may
+ * use, modify or distribute it freely.
+ *
+ * This code is distributed in the hope that it will be useful but
+ * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
+ * DISCLAMED. This includes but is not limited to warranties of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * $Revision$
+ * $Author$
+ * $Date$
+ *
+ */
+
+#ifndef __STRICT_ANSI__
+
+#ifndef _IO_H_
+#define _IO_H_
+
+/* All the headers include this file. */
+#include <_mingw.h>
+
+/* We need the definition of FILE anyway... */
+#include <stdio.h>
+
+/* MSVC's io.h contains the stuff from dir.h, so I will too.
+ * NOTE: This also defines off_t, the file offset type, through
+ * an inclusion of sys/types.h */
+#ifndef __STRICT_ANSI__
+
+#include <sys/types.h> /* To get time_t. */
+
+/*
+ * Attributes of files as returned by _findfirst et al.
+ */
+#define _A_NORMAL 0x00000000
+#define _A_RDONLY 0x00000001
+#define _A_HIDDEN 0x00000002
+#define _A_SYSTEM 0x00000004
+#define _A_VOLID 0x00000008
+#define _A_SUBDIR 0x00000010
+#define _A_ARCH 0x00000020
+
+
+#ifndef RC_INVOKED
+
+#ifndef _FSIZE_T_DEFINED
+typedef unsigned long _fsize_t;
+#define _FSIZE_T_DEFINED
+#endif
+
+/*
+ * The following structure is filled in by _findfirst or _findnext when
+ * they succeed in finding a match.
+ */
+struct _finddata_t
+{
+ unsigned attrib; /* Attributes, see constants above. */
+ time_t time_create;
+ time_t time_access; /* always midnight local time */
+ time_t time_write;
+ _fsize_t size;
+ char name[FILENAME_MAX]; /* may include spaces. */
+};
+
+#ifndef _WFINDDATA_T_DEFINED
+struct _wfinddata_t {
+ unsigned attrib;
+ time_t time_create; /* -1 for FAT file systems */
+ time_t time_access; /* -1 for FAT file systems */
+ time_t time_write;
+ _fsize_t size;
+ wchar_t name[FILENAME_MAX]; /* may include spaces. */
+};
+#define _WFINDDATA_T_DEFINED
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Functions for searching for files. _findfirst returns -1 if no match
+ * is found. Otherwise it returns a handle to be used in _findnext and
+ * _findclose calls. _findnext also returns -1 if no match could be found,
+ * and 0 if a match was found. Call _findclose when you are finished.
+ */
+int _findfirst (const char*, struct _finddata_t*);
+int _findnext (int, struct _finddata_t*);
+int _findclose (int);
+
+int _chdir (const char*);
+char* _getcwd (char*, int);
+int _mkdir (const char*);
+char* _mktemp (char*);
+int _rmdir (const char*);
+
+
+#ifndef _NO_OLDNAMES
+
+#ifndef _UWIN
+int chdir (const char*);
+char* getcwd (char*, int);
+int mkdir (const char*);
+char* mktemp (char*);
+int rmdir (const char*);
+#endif /* _UWIN */
+
+#endif /* Not _NO_OLDNAMES */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* Not RC_INVOKED */
+
+#endif /* Not __STRICT_ANSI__ */
+
+/* TODO: Maximum number of open handles has not been tested, I just set
+ * it the same as FOPEN_MAX. */
+#define HANDLE_MAX FOPEN_MAX
+
+
+/* Some defines for _access nAccessMode (MS doesn't define them, but
+ * it doesn't seem to hurt to add them). */
+#define F_OK 0 /* Check for file existence */
+#define X_OK 1 /* Check for execute permission. */
+#define W_OK 2 /* Check for write permission */
+#define R_OK 4 /* Check for read permission */
+
+#ifndef RC_INVOKED
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+int _access (const char*, int);
+int _chsize (int, long);
+int _close (int);
+
+/* NOTE: The only significant bit in unPermissions appears to be bit 7 (0x80),
+ * the "owner write permission" bit (on FAT). */
+int _creat (const char*, unsigned);
+
+int _dup (int);
+int _dup2 (int, int);
+long _filelength (int);
+int _fileno (FILE*);
+long _get_osfhandle (int);
+int _isatty (int);
+
+/* In a very odd turn of events this function is excluded from those
+ * files which define _STREAM_COMPAT. This is required in order to
+ * build GNU libio because of a conflict with _eof in streambuf.h
+ * line 107. Actually I might just be able to change the name of
+ * the enum member in streambuf.h... we'll see. TODO */
+#ifndef _STREAM_COMPAT
+int _eof (int);
+#endif
+
+/* LK_... locking commands defined in sys/locking.h. */
+int _locking (int, int, long);
+
+long _lseek (int, long, int);
+
+/* Optional third argument is unsigned unPermissions. */
+int _open (const char*, int, ...);
+
+int _open_osfhandle (long, int);
+int _pipe (int *, unsigned int, int);
+int _read (int, void*, unsigned int);
+
+/* SH_... flags for nShFlags defined in share.h
+ * Optional fourth argument is unsigned unPermissions */
+int _sopen (const char*, int, int, ...);
+
+long _tell (int);
+/* Should umask be in sys/stat.h and/or sys/types.h instead? */
+int _umask (int);
+int _unlink (const char*);
+int _write (int, const void*, unsigned int);
+
+/* Wide character versions. Also declared in wchar.h. */
+int _waccess(const wchar_t *, int);
+int _wchmod(const wchar_t *, int);
+int _wcreat(const wchar_t *, int);
+long _wfindfirst(wchar_t *, struct _wfinddata_t *);
+int _wfindnext(long, struct _wfinddata_t *);
+int _wunlink(const wchar_t *);
+int _wrename(const wchar_t *, const wchar_t *);
+int _wopen(const wchar_t *, int, ...);
+int _wsopen(const wchar_t *, int, int, ...);
+wchar_t * _wmktemp(wchar_t *);
+
+
+#ifndef _NO_OLDNAMES
+/*
+ * Non-underscored versions of non-ANSI functions to improve portability.
+ * These functions live in libmoldname.a.
+ */
+
+#ifndef _UWIN
+int access (const char*, int);
+int chsize (int, long );
+int close (int);
+int creat (const char*, int);
+int dup (int);
+int dup2 (int, int);
+int eof (int);
+long filelength (int);
+int fileno (FILE*);
+int isatty (int);
+long lseek (int, long, int);
+int open (const char*, int, ...);
+int read (int, void*, unsigned int);
+int sopen (const char*, int, int, ...);
+long tell (int);
+int umask (int);
+int unlink (const char*);
+int write (int, const void*, unsigned int);
+#endif /* _UWIN */
+
+/* Wide character versions. Also declared in wchar.h. */
+int waccess(const wchar_t *, int);
+int wchmod(const wchar_t *, int);
+int wcreat(const wchar_t *, int);
+long wfindfirst(wchar_t *, struct _wfinddata_t *);
+int wfindnext(long, struct _wfinddata_t *);
+int wunlink(const wchar_t *);
+int wrename(const wchar_t *, const wchar_t *);
+int wopen(const wchar_t *, int, ...);
+int wsopen(const wchar_t *, int, int, ...);
+wchar_t * wmktemp(wchar_t *);
+
+#endif /* Not _NO_OLDNAMES */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* Not RC_INVOKED */
+
+#endif /* _IO_H_ not defined */
+
+#endif /* Not strict ANSI */
+
diff --git a/winsup/mingw/include/limits.h b/winsup/mingw/include/limits.h
new file mode 100644
index 000000000..9bd3aab91
--- /dev/null
+++ b/winsup/mingw/include/limits.h
@@ -0,0 +1,110 @@
+/*
+ * limits.h
+ *
+ * Defines constants for the sizes of integral types.
+ *
+ * NOTE: GCC should supply a version of this header and it should be safe to
+ * use that version instead of this one (maybe safer).
+ *
+ * This file is part of the Mingw32 package.
+ *
+ * Contributors:
+ * Created by Colin Peters <colin@bird.fu.is.saga-u.ac.jp>
+ *
+ * THIS SOFTWARE IS NOT COPYRIGHTED
+ *
+ * This source code is offered for use in the public domain. You may
+ * use, modify or distribute it freely.
+ *
+ * This code is distributed in the hope that it will be useful but
+ * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
+ * DISCLAMED. This includes but is not limited to warranties of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * $Revision$
+ * $Author$
+ * $Date$
+ *
+ */
+
+#ifndef _LIMITS_H_
+#define _LIMITS_H_
+
+/* All the headers include this file. */
+#include <_mingw.h>
+
+/*
+ * File system limits
+ *
+ * TODO: NAME_MAX and OPEN_MAX are file system limits or not? Are they the
+ * same as FILENAME_MAX and FOPEN_MAX from stdio.h?
+ * NOTE: Apparently the actual size of PATH_MAX is 260, but a space is
+ * required for the NUL. TODO: Test?
+ */
+#define PATH_MAX (259)
+
+/*
+ * Characteristics of the char data type.
+ *
+ * TODO: Is MB_LEN_MAX correct?
+ */
+#define CHAR_BIT 8
+#define MB_LEN_MAX 2
+
+#define SCHAR_MIN (-128)
+#define SCHAR_MAX 127
+
+#define UCHAR_MAX 255
+
+/* TODO: Is this safe? I think it might just be testing the preprocessor,
+ * not the compiler itself... */
+#if ('\x80' < 0)
+#define CHAR_MIN SCHAR_MIN
+#define CHAR_MAX SCHAR_MAX
+#else
+#define CHAR_MIN 0
+#define CHAR_MAX UCHAR_MAX
+#endif
+
+/*
+ * Maximum and minimum values for ints.
+ */
+#define INT_MAX 2147483647
+#define INT_MIN (-INT_MAX-1)
+
+#define UINT_MAX 0xffffffff
+
+/*
+ * Maximum and minimum values for shorts.
+ */
+#define SHRT_MAX 32767
+#define SHRT_MIN (-SHRT_MAX-1)
+
+#define USHRT_MAX 0xffff
+
+/*
+ * Maximum and minimum values for longs and unsigned longs.
+ *
+ * TODO: This is not correct for Alphas, which have 64 bit longs.
+ */
+#define LONG_MAX 2147483647L
+
+#define LONG_MIN (-LONG_MAX-1)
+
+#define ULONG_MAX 0xffffffffUL
+
+
+/*
+ * The GNU C compiler also allows 'long long int'
+ */
+#if !defined(__STRICT_ANSI__) && defined(__GNUC__)
+
+#define LONG_LONG_MAX 9223372036854775807LL
+#define LONG_LONG_MIN (-LONG_LONG_MAX-1)
+
+#define ULONG_LONG_MAX (2ULL * LONG_LONG_MAX + 1)
+
+#endif /* Not Strict ANSI and GNU C compiler */
+
+
+#endif /* not _LIMITS_H_ */
diff --git a/winsup/mingw/include/locale.h b/winsup/mingw/include/locale.h
new file mode 100644
index 000000000..4f751246c
--- /dev/null
+++ b/winsup/mingw/include/locale.h
@@ -0,0 +1,91 @@
+/*
+ * locale.h
+ *
+ * Functions and types for localization (ie. changing the appearance of
+ * output based on the standards of a certain country).
+ *
+ * This file is part of the Mingw32 package.
+ *
+ * Contributors:
+ * Created by Colin Peters <colin@bird.fu.is.saga-u.ac.jp>
+ *
+ * THIS SOFTWARE IS NOT COPYRIGHTED
+ *
+ * This source code is offered for use in the public domain. You may
+ * use, modify or distribute it freely.
+ *
+ * This code is distributed in the hope that it will be useful but
+ * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
+ * DISCLAMED. This includes but is not limited to warranties of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * $Revision$
+ * $Author$
+ * $Date$
+ *
+ */
+
+#ifndef _LOCALE_H_
+#define _LOCALE_H_
+
+/* All the headers include this file. */
+#include <_mingw.h>
+
+/*
+ * NOTE: I have tried to test this, but I am limited by my knowledge of
+ * locale issues. The structure does not bomb if you look at the
+ * values, and 'decimal_point' even seems to be correct. But the
+ * rest of the values are, by default, not particularly useful
+ * (read meaningless and not related to the international settings
+ * of the system).
+ */
+
+#define LC_ALL 0
+#define LC_COLLATE 1
+#define LC_CTYPE 2
+#define LC_MONETARY 3
+#define LC_NUMERIC 4
+#define LC_TIME 5
+
+#ifndef RC_INVOKED
+
+/*
+ * The structure returned by 'localeconv'.
+ */
+struct lconv
+{
+ char* decimal_point;
+ char* thousands_sep;
+ char* grouping;
+ char* int_curr_symbol;
+ char* currency_symbol;
+ char* mon_decimal_point;
+ char* mon_thousands_sep;
+ char* mon_grouping;
+ char* positive_sign;
+ char* negative_sign;
+ char int_frac_digits;
+ char frac_digits;
+ char p_cs_precedes;
+ char p_sep_by_space;
+ char n_cs_precedes;
+ char n_sep_by_space;
+ char p_sign_posn;
+ char n_sign_posn;
+};
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+char* setlocale (int, const char*);
+struct lconv* localeconv (void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* Not RC_INVOKED */
+
+#endif /* Not _LOCALE_H_ */
+
diff --git a/winsup/mingw/include/malloc.h b/winsup/mingw/include/malloc.h
new file mode 100644
index 000000000..90a96b618
--- /dev/null
+++ b/winsup/mingw/include/malloc.h
@@ -0,0 +1,78 @@
+/*
+ * malloc.h
+ *
+ * Support for programs which want to use malloc.h to get memory management
+ * functions. Unless you absolutely need some of these functions and they are
+ * not in the ANSI headers you should use the ANSI standard header files
+ * instead.
+ *
+ * This file is part of the Mingw32 package.
+ *
+ * Contributors:
+ * Created by Colin Peters <colin@bird.fu.is.saga-u.ac.jp>
+ *
+ * THIS SOFTWARE IS NOT COPYRIGHTED
+ *
+ * This source code is offered for use in the public domain. You may
+ * use, modify or distribute it freely.
+ *
+ * This code is distributed in the hope that it will be useful but
+ * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
+ * DISCLAMED. This includes but is not limited to warranties of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * $Revision$
+ * $Author$
+ * $Date$
+ *
+ */
+
+#ifndef __STRICT_ANSI__
+
+#ifndef _MALLOC_H_
+#define _MALLOC_H_
+
+/* All the headers include this file. */
+#include <_mingw.h>
+
+#include <stdlib.h>
+
+#ifndef RC_INVOKED
+
+/*
+ * The structure used to walk through the heap with _heapwalk.
+ * TODO: This is a guess at the internals of this structure.
+ */
+typedef struct _heapinfo
+{
+ void* ptr;
+ unsigned int size;
+ int in_use;
+} _HEAPINFO;
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+int _heapwalk (_HEAPINFO*);
+
+#ifndef _NO_OLDNAMES
+int heapwalk (_HEAPINFO*);
+#endif /* Not _NO_OLDNAMES */
+
+int _heapchk (void); /* Verify heap integrety. */
+int _heapmin (void); /* Return unused heap to the OS. */
+int _heapset (unsigned int);
+size_t _msize (void*);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif RC_INVOKED
+
+#endif /* Not _MALLOC_H_ */
+
+#endif /* Not __STRICT_ANSI__ */
+
diff --git a/winsup/mingw/include/math.h b/winsup/mingw/include/math.h
new file mode 100644
index 000000000..8f2ba105d
--- /dev/null
+++ b/winsup/mingw/include/math.h
@@ -0,0 +1,182 @@
+/*
+ * math.h
+ *
+ * Mathematical functions.
+ *
+ * This file is part of the Mingw32 package.
+ *
+ * Contributors:
+ * Created by Colin Peters <colin@bird.fu.is.saga-u.ac.jp>
+ *
+ * THIS SOFTWARE IS NOT COPYRIGHTED
+ *
+ * This source code is offered for use in the public domain. You may
+ * use, modify or distribute it freely.
+ *
+ * This code is distributed in the hope that it will be useful but
+ * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
+ * DISCLAMED. This includes but is not limited to warranties of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * $Revision$
+ * $Author$
+ * $Date$
+ *
+ */
+
+#ifndef _MATH_H_
+#define _MATH_H_
+
+/* All the headers include this file. */
+#include <_mingw.h>
+
+/*
+ * Types for the _exception structure.
+ */
+
+#define _DOMAIN 1 /* domain error in argument */
+#define _SING 2 /* singularity */
+#define _OVERFLOW 3 /* range overflow */
+#define _UNDERFLOW 4 /* range underflow */
+#define _TLOSS 5 /* total loss of precision */
+#define _PLOSS 6 /* partial loss of precision */
+
+/*
+ * Exception types with non-ANSI names for compatibility.
+ */
+
+#ifndef __STRICT_ANSI__
+#ifndef _NO_OLDNAMES
+
+#define DOMAIN _DOMAIN
+#define SING _SING
+#define OVERFLOW _OVERFLOW
+#define UNDERFLOW _UNDERFLOW
+#define TLOSS _TLOSS
+#define PLOSS _PLOSS
+
+#endif /* Not _NO_OLDNAMES */
+#endif /* Not __STRICT_ANSI__ */
+
+
+#ifndef RC_INVOKED
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * HUGE_VAL is returned by strtod when the value would overflow the
+ * representation of 'double'. There are other uses as well.
+ *
+ * __imp__HUGE is a pointer to the actual variable _HUGE in
+ * MSVCRT.DLL. If we used _HUGE directly we would get a pointer
+ * to a thunk function.
+ *
+ * NOTE: The CRTDLL version uses _HUGE_dll instead.
+ */
+
+#ifndef __DECLSPEC_SUPPORTED
+
+#ifdef __MSVCRT__
+extern double* __imp__HUGE;
+#define HUGE_VAL (*__imp__HUGE)
+#else
+/* CRTDLL */
+extern double* __imp__HUGE_dll;
+#define HUGE_VAL (*__imp__HUGE_dll)
+#endif
+
+#else /* __DECLSPEC_SUPPORTED */
+
+#ifdef __MSVCRT__
+__MINGW_IMPORT double _HUGE;
+#define HUGE_VAL _HUGE
+#else
+/* CRTDLL */
+__MINGW_IMPORT double _HUGE_dll;
+#define HUGE_VAL _HUGE_dll
+#endif
+
+#endif /* __DECLSPEC_SUPPORTED */
+
+struct _exception
+{
+ int type;
+ char *name;
+ double arg1;
+ double arg2;
+ double retval;
+};
+
+
+double sin (double);
+double cos (double);
+double tan (double);
+double sinh (double);
+double cosh (double);
+double tanh (double);
+double asin (double);
+double acos (double);
+double atan (double);
+double atan2 (double, double);
+double exp (double);
+double log (double);
+double log10 (double);
+double pow (double, double);
+double sqrt (double);
+double ceil (double);
+double floor (double);
+double fabs (double);
+double ldexp (double, int);
+double frexp (double, int*);
+double modf (double, double*);
+double fmod (double, double);
+
+
+#ifndef __STRICT_ANSI__
+
+/* Complex number (for cabs) */
+struct _complex
+{
+ double x; /* Real part */
+ double y; /* Imaginary part */
+};
+
+double _cabs (struct _complex);
+double _hypot (double, double);
+double _j0 (double);
+double _j1 (double);
+double _jn (int, double);
+double _y0 (double);
+double _y1 (double);
+double _yn (int, double);
+int _matherr (struct _exception *);
+
+#ifndef _NO_OLDNAMES
+
+/*
+ * Non-underscored versions of non-ANSI functions. These reside in
+ * liboldnames.a. Provided for extra portability.
+ */
+double cabs (struct _complex);
+double hypot (double, double);
+double j0 (double);
+double j1 (double);
+double jn (int, double);
+double y0 (double);
+double y1 (double);
+double yn (int, double);
+
+#endif /* Not _NO_OLDNAMES */
+
+#endif /* Not __STRICT_ANSI__ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* Not RC_INVOKED */
+
+#endif /* Not _MATH_H_ */
+
diff --git a/winsup/mingw/include/mem.h b/winsup/mingw/include/mem.h
new file mode 100644
index 000000000..20c8fa4a5
--- /dev/null
+++ b/winsup/mingw/include/mem.h
@@ -0,0 +1,8 @@
+/*
+ * This file is part of the Mingw32 package.
+ *
+ * mem.h maps to string.h
+ */
+#ifndef __STRICT_ANSI__
+#include <string.h>
+#endif
diff --git a/winsup/mingw/include/memory.h b/winsup/mingw/include/memory.h
new file mode 100644
index 000000000..e0c91d635
--- /dev/null
+++ b/winsup/mingw/include/memory.h
@@ -0,0 +1,9 @@
+/*
+ * This file is part of the Mingw32 package.
+ *
+ * memory.h maps to the standard string.h header.
+ */
+#ifndef __STRICT_ANSI__
+#include <string.h>
+#endif
+
diff --git a/winsup/mingw/include/process.h b/winsup/mingw/include/process.h
new file mode 100644
index 000000000..dc138c390
--- /dev/null
+++ b/winsup/mingw/include/process.h
@@ -0,0 +1,158 @@
+/*
+ * process.h
+ *
+ * Function calls for spawning child processes.
+ *
+ * This file is part of the Mingw32 package.
+ *
+ * Contributors:
+ * Created by Colin Peters <colin@bird.fu.is.saga-u.ac.jp>
+ *
+ * THIS SOFTWARE IS NOT COPYRIGHTED
+ *
+ * This source code is offered for use in the public domain. You may
+ * use, modify or distribute it freely.
+ *
+ * This code is distributed in the hope that it will be useful but
+ * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
+ * DISCLAMED. This includes but is not limited to warranties of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * $Revision$
+ * $Author$
+ * $Date$
+ *
+ */
+
+#ifndef __STRICT_ANSI__
+
+#ifndef _PROCESS_H_
+#define _PROCESS_H_
+
+/* All the headers include this file. */
+#include <_mingw.h>
+
+/* Includes a definition of _pid_t and pid_t */
+#include <sys/types.h>
+
+/*
+ * Constants for cwait actions.
+ * Obsolete for Win32.
+ */
+#define _WAIT_CHILD 0
+#define _WAIT_GRANDCHILD 1
+
+#ifndef _NO_OLDNAMES
+#define WAIT_CHILD _WAIT_CHILD
+#define WAIT_GRANDCHILD _WAIT_GRANDCHILD
+#endif /* Not _NO_OLDNAMES */
+
+/*
+ * Mode constants for spawn functions.
+ */
+#define _P_WAIT 0
+#define _P_NOWAIT 1
+#define _P_OVERLAY 2
+#define _OLD_P_OVERLAY _P_OVERLAY
+#define _P_NOWAITO 3
+#define _P_DETACH 4
+
+#ifndef _NO_OLDNAMES
+#define P_WAIT _P_WAIT
+#define P_NOWAIT _P_NOWAIT
+#define P_OVERLAY _P_OVERLAY
+#define OLD_P_OVERLAY _OLD_P_OVERLAY
+#define P_NOWAITO _P_NOWAITO
+#define P_DETACH _P_DETACH
+#endif /* Not _NO_OLDNAMES */
+
+
+#ifndef RC_INVOKED
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void _cexit(void);
+void _c_exit(void);
+
+int _cwait (int*, _pid_t, int);
+
+_pid_t _getpid(void);
+
+int _execl (const char*, const char*, ...);
+int _execle (const char*, const char*, ...);
+int _execlp (const char*, const char*, ...);
+int _execlpe (const char*, const char*, ...);
+int _execv (const char*, char* const*);
+int _execve (const char*, char* const*, char* const*);
+int _execvp (const char*, char* const*);
+int _execvpe (const char*, char* const*, char* const*);
+
+int _spawnl (int, const char*, const char*, ...);
+int _spawnle (int, const char*, const char*, ...);
+int _spawnlp (int, const char*, const char*, ...);
+int _spawnlpe (int, const char*, const char*, ...);
+int _spawnv (int, const char*, char* const*);
+int _spawnve (int, const char*, char* const*, char* const*);
+int _spawnvp (int, const char*, char* const*);
+int _spawnvpe (int, const char*, char* const*, char* const*);
+
+/*
+ * The functions _beginthreadex and _endthreadex are not provided by CRTDLL.
+ * They are provided by MSVCRT.
+ *
+ * NOTE: Apparently _endthread calls CloseHandle on the handle of the thread,
+ * making for race conditions if you are not careful. Basically you have to
+ * make sure that no-one is going to do *anything* with the thread handle
+ * after the thread calls _endthread or returns from the thread function.
+ *
+ * NOTE: No old names for these functions. Use the underscore.
+ */
+unsigned long
+ _beginthread (void (*)(void *), unsigned, void*);
+void _endthread (void);
+
+#ifdef __MSVCRT__
+unsigned long
+ _beginthreadex (void *, unsigned, unsigned (__stdcall *) (void *),
+ void*, unsigned, unsigned*);
+void _endthreadex (unsigned);
+#endif
+
+
+#ifndef _NO_OLDNAMES
+/*
+ * Functions without the leading underscore, for portability. These functions
+ * live in liboldnames.a.
+ */
+int cwait (int*, pid_t, int);
+pid_t getpid (void);
+int execl (const char*, const char*, ...);
+int execle (const char*, const char*, ...);
+int execlp (const char*, const char*, ...);
+int execlpe (const char*, const char*, ...);
+int execv (const char*, char* const*);
+int execve (const char*, char* const*, char* const*);
+int execvp (const char*, char* const*);
+int execvpe (const char*, char* const*, char* const*);
+int spawnl (int, const char*, const char*, ...);
+int spawnle (int, const char*, const char*, ...);
+int spawnlp (int, const char*, const char*, ...);
+int spawnlpe (int, const char*, const char*, ...);
+int spawnv (int, const char*, char* const*);
+int spawnve (int, const char*, char* const*, char* const*);
+int spawnvp (int, const char*, char* const*);
+int spawnvpe (int, const char*, char* const*, char* const*);
+#endif /* Not _NO_OLDNAMES */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* Not RC_INVOKED */
+
+#endif /* _PROCESS_H_ not defined */
+
+#endif /* Not __STRICT_ANSI__ */
+
diff --git a/winsup/mingw/include/setjmp.h b/winsup/mingw/include/setjmp.h
new file mode 100644
index 000000000..9164178d4
--- /dev/null
+++ b/winsup/mingw/include/setjmp.h
@@ -0,0 +1,72 @@
+/*
+ * setjmp.h
+ *
+ * Declarations supporting setjmp and longjump, a method for avoiding
+ * the normal function call return sequence. (Bleah!)
+ *
+ * This file is part of the Mingw32 package.
+ *
+ * Contributors:
+ * Created by Colin Peters <colin@bird.fu.is.saga-u.ac.jp>
+ *
+ * THIS SOFTWARE IS NOT COPYRIGHTED
+ *
+ * This source code is offered for use in the public domain. You may
+ * use, modify or distribute it freely.
+ *
+ * This code is distributed in the hope that it will be useful but
+ * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
+ * DISCLAMED. This includes but is not limited to warranties of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * $Revision$
+ * $Author$
+ * $Date$
+ *
+ */
+
+#ifndef _SETJMP_H_
+#define _SETJMP_H_
+
+/* All the headers include this file. */
+#include <_mingw.h>
+
+#ifndef RC_INVOKED
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * The buffer used by setjmp to store the information used by longjmp
+ * to perform it's evil goto-like work. The size of this buffer was
+ * determined through experimentation; it's contents are a mystery.
+ * NOTE: This was determined on an i386 (actually a Pentium). The
+ * contents could be different on an Alpha or something else.
+ */
+#define _JBLEN 16
+#define _JBTYPE int
+typedef _JBTYPE jmp_buf[_JBLEN];
+
+/*
+ * The function provided by CRTDLL which appears to do the actual work
+ * of setjmp.
+ */
+int _setjmp (jmp_buf);
+
+#define setjmp(x) _setjmp(x)
+
+/*
+ * Return to the last setjmp call and act as if setjmp had returned
+ * nVal (which had better be non-zero!).
+ */
+void longjmp (jmp_buf, int);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* Not RC_INVOKED */
+
+#endif /* Not _SETJMP_H_ */
+
diff --git a/winsup/mingw/include/share.h b/winsup/mingw/include/share.h
new file mode 100644
index 000000000..8abf78736
--- /dev/null
+++ b/winsup/mingw/include/share.h
@@ -0,0 +1,44 @@
+/*
+ * share.h
+ *
+ * Constants for file sharing functions.
+ *
+ * This file is part of the Mingw32 package.
+ *
+ * Contributors:
+ * Created by Colin Peters <colin@bird.fu.is.saga-u.ac.jp>
+ *
+ * THIS SOFTWARE IS NOT COPYRIGHTED
+ *
+ * This source code is offered for use in the public domain. You may
+ * use, modify or distribute it freely.
+ *
+ * This code is distributed in the hope that it will be useful but
+ * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
+ * DISCLAMED. This includes but is not limited to warranties of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * $Revision$
+ * $Author$
+ * $Date$
+ *
+ */
+
+#ifndef __STRICT_ANSI__
+
+#ifndef _SHARE_H_
+#define _SHARE_H_
+
+/* All the headers include this file. */
+#include <_mingw.h>
+
+#define SH_COMPAT 0x00 /* Compatibility */
+#define SH_DENYRW 0x10 /* Deny read/write */
+#define SH_DENYWR 0x20 /* Deny write */
+#define SH_DENYRD 0x30 /* Deny read */
+#define SH_DENYNO 0x40 /* Deny nothing */
+
+#endif /* Not _SHARE_H_ */
+
+#endif /* Not __STRICT_ANSI__ */
+
diff --git a/winsup/mingw/include/signal.h b/winsup/mingw/include/signal.h
new file mode 100644
index 000000000..f4eb33a85
--- /dev/null
+++ b/winsup/mingw/include/signal.h
@@ -0,0 +1,111 @@
+/*
+ * signal.h
+ *
+ * A way to set handlers for exceptional conditions (also known as signals).
+ *
+ * This file is part of the Mingw32 package.
+ *
+ * Contributors:
+ * Created by Colin Peters <colin@bird.fu.is.saga-u.ac.jp>
+ *
+ * THIS SOFTWARE IS NOT COPYRIGHTED
+ *
+ * This source code is offered for use in the public domain. You may
+ * use, modify or distribute it freely.
+ *
+ * This code is distributed in the hope that it will be useful but
+ * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
+ * DISCLAMED. This includes but is not limited to warranties of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * $Revision$
+ * $Author$
+ * $Date$
+ *
+ */
+
+#ifndef _SIGNAL_H_
+#define _SIGNAL_H_
+
+/* All the headers include this file. */
+#include <_mingw.h>
+
+/*
+ * The actual signal values. Using other values with signal
+ * produces a SIG_ERR return value.
+ *
+ * NOTE: SIGINT is produced when the user presses Ctrl-C.
+ * SIGILL has not been tested.
+ * SIGFPE doesn't seem to work?
+ * SIGSEGV does not catch writing to a NULL pointer (that shuts down
+ * your app; can you say "segmentation violation core dump"?).
+ * SIGTERM comes from what kind of termination request exactly?
+ * SIGBREAK is indeed produced by pressing Ctrl-Break.
+ * SIGABRT is produced by calling abort.
+ * TODO: The above results may be related to not installing an appropriate
+ * structured exception handling frame. Results may be better if I ever
+ * manage to get the SEH stuff down.
+ */
+#define SIGINT 2 /* Interactive attention */
+#define SIGILL 4 /* Illegal instruction */
+#define SIGFPE 8 /* Floating point error */
+#define SIGSEGV 11 /* Segmentation violation */
+#define SIGTERM 15 /* Termination request */
+#define SIGBREAK 21 /* Control-break */
+#define SIGABRT 22 /* Abnormal termination (abort) */
+
+#define NSIG 23 /* maximum signal number + 1 */
+
+#ifndef RC_INVOKED
+
+#ifndef _SIG_ATOMIC_T_DEFINED
+typedef int sig_atomic_t;
+#define _SIG_ATOMIC_T_DEFINED
+#endif
+
+/*
+ * The prototypes (below) are the easy part. The hard part is figuring
+ * out what signals are available and what numbers they are assigned
+ * along with appropriate values of SIG_DFL and SIG_IGN.
+ */
+
+/*
+ * A pointer to a signal handler function. A signal handler takes a
+ * single int, which is the signal it handles.
+ */
+typedef void (*__p_sig_fn_t)(int);
+
+/*
+ * These are special values of signal handler pointers which are
+ * used to send a signal to the default handler (SIG_DFL), ignore
+ * the signal (SIG_IGN), or indicate an error return (SIG_ERR).
+ */
+#define SIG_DFL ((__p_sig_fn_t) 0)
+#define SIG_IGN ((__p_sig_fn_t) 1)
+#define SIG_ERR ((__p_sig_fn_t) -1)
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Call signal to set the signal handler for signal sig to the
+ * function pointed to by handler. Returns a pointer to the
+ * previous handler, or SIG_ERR if an error occurs. Initially
+ * unhandled signals defined above will return SIG_DFL.
+ */
+__p_sig_fn_t signal(int, __p_sig_fn_t);
+
+/*
+ * Raise the signal indicated by sig. Returns non-zero on success.
+ */
+int raise (int);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* Not RC_INVOKED */
+
+#endif /* Not _SIGNAL_H_ */
+
diff --git a/winsup/mingw/include/stdarg.h b/winsup/mingw/include/stdarg.h
new file mode 100644
index 000000000..6db01aa35
--- /dev/null
+++ b/winsup/mingw/include/stdarg.h
@@ -0,0 +1,109 @@
+/*
+ * stdarg.h
+ *
+ * Provides facilities for stepping through a list of function arguments of
+ * an unknown number and type.
+ *
+ * NOTE: Gcc should provide stdarg.h, and I believe their version will work
+ * with crtdll. If necessary I think you can replace this with the GCC
+ * stdarg.h.
+ *
+ * Note that the type used in va_arg is supposed to match the actual type
+ * *after default promotions*. Thus, va_arg (..., short) is not valid.
+ *
+ * This file is part of the Mingw32 package.
+ *
+ * Contributors:
+ * Created by Colin Peters <colin@bird.fu.is.saga-u.ac.jp>
+ *
+ * THIS SOFTWARE IS NOT COPYRIGHTED
+ *
+ * This source code is offered for use in the public domain. You may
+ * use, modify or distribute it freely.
+ *
+ * This code is distributed in the hope that it will be useful but
+ * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
+ * DISCLAMED. This includes but is not limited to warranties of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * $Revision$
+ * $Author$
+ * $Date$
+ *
+ */
+
+#ifndef _STDARG_H_
+#define _STDARG_H_
+
+/* All the headers include this file. */
+#include <_mingw.h>
+
+/*
+ * Don't do any of this stuff for the resource compiler.
+ */
+#ifndef RC_INVOKED
+
+/*
+ * I was told that Win NT likes this.
+ */
+#ifndef _VA_LIST_DEFINED
+#define _VA_LIST_DEFINED
+#endif
+
+#ifndef _VA_LIST
+#define _VA_LIST
+typedef char* va_list;
+#endif
+
+
+/*
+ * Amount of space required in an argument list (ie. the stack) for an
+ * argument of type t.
+ */
+#define __va_argsiz(t) \
+ (((sizeof(t) + sizeof(int) - 1) / sizeof(int)) * sizeof(int))
+
+
+/*
+ * Start variable argument list processing by setting AP to point to the
+ * argument after pN.
+ */
+#ifdef __GNUC__
+/*
+ * In GNU the stack is not necessarily arranged very neatly in order to
+ * pack shorts and such into a smaller argument list. Fortunately a
+ * neatly arranged version is available through the use of __builtin_next_arg.
+ */
+#define va_start(ap, pN) \
+ ((ap) = ((va_list) __builtin_next_arg(pN)))
+#else
+/*
+ * For a simple minded compiler this should work (it works in GNU too for
+ * vararg lists that don't follow shorts and such).
+ */
+#define va_start(ap, pN) \
+ ((ap) = ((va_list) (&pN) + __va_argsiz(pN)))
+#endif
+
+
+/*
+ * End processing of variable argument list. In this case we do nothing.
+ */
+#define va_end(ap) ((void)0)
+
+
+/*
+ * Increment ap to the next argument in the list while returing a
+ * pointer to what ap pointed to first, which is of type t.
+ *
+ * We cast to void* and then to t* because this avoids a warning about
+ * increasing the alignment requirement.
+ */
+
+#define va_arg(ap, t) \
+ (((ap) = (ap) + __va_argsiz(t)), \
+ *((t*) (void*) ((ap) - __va_argsiz(t))))
+
+#endif /* Not RC_INVOKED */
+
+#endif /* not _STDARG_H_ */
diff --git a/winsup/mingw/include/stddef.h b/winsup/mingw/include/stddef.h
new file mode 100644
index 000000000..e953fca76
--- /dev/null
+++ b/winsup/mingw/include/stddef.h
@@ -0,0 +1,373 @@
+/*
+ * stddef.h
+ *
+ * Standard type definitions provided by the C library.
+ *
+ * NOTE: This is typically supplied by GCC, but there's a small gotcha -
+ * GCC's version doesn't guard typedefs via RC_INVOKED. This is
+ * GCC's version, with the guard macro. Since we install this in
+ * the tool include directory, it gets picked up before GCC's
+ * internal include directory, and we're safe.
+ *
+ * This file is part of the Mingw32 package.
+ *
+ * Contributors:
+ * Created by Colin Peters <colin@bird.fu.is.saga-u.ac.jp>
+ *
+ * THIS SOFTWARE IS NOT COPYRIGHTED
+ *
+ * This source code is offered for use in the public domain. You may
+ * use, modify or distribute it freely.
+ *
+ * This code is distributed in the hope that it will be useful but
+ * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
+ * DISCLAMED. This includes but is not limited to warranties of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ */
+
+#if (!defined(_STDDEF_H) && !defined(_STDDEF_H_) && !defined(_ANSI_STDDEF_H) \
+ && !defined(__STDDEF_H__)) \
+ || defined(__need_wchar_t) || defined(__need_size_t) \
+ || defined(__need_ptrdiff_t) || defined(__need_NULL) \
+ || defined(__need_wint_t)
+
+/* Any one of these symbols __need_* means that GNU libc
+ wants us just to define one data type. So don't define
+ the symbols that indicate this file's entire job has been done. */
+#if (!defined(__need_wchar_t) && !defined(__need_size_t) \
+ && !defined(__need_ptrdiff_t) && !defined(__need_NULL) \
+ && !defined(__need_wint_t))
+#define _STDDEF_H
+#define _STDDEF_H_
+/* snaroff@next.com says the NeXT needs this. */
+#define _ANSI_STDDEF_H
+/* Irix 5.1 needs this. */
+#define __STDDEF_H__
+#endif
+
+#ifndef RC_INVOKED
+
+#ifndef __sys_stdtypes_h
+/* This avoids lossage on SunOS but only if stdtypes.h comes first.
+ There's no way to win with the other order! Sun lossage. */
+
+/* On 4.3bsd-net2, make sure ansi.h is included, so we have
+ one less case to deal with in the following. */
+#if defined (__BSD_NET2__) || defined (____386BSD____) || defined (__FreeBSD__) || defined(__NetBSD__)
+#include <machine/ansi.h>
+#endif
+
+/* In 4.3bsd-net2, machine/ansi.h defines these symbols, which are
+ defined if the corresponding type is *not* defined.
+ FreeBSD-2.1 defines _MACHINE_ANSI_H_ instead of _ANSI_H_ */
+#if defined(_ANSI_H_) || defined(_MACHINE_ANSI_H_)
+#if !defined(_SIZE_T_) && !defined(_BSD_SIZE_T_)
+#define _SIZE_T
+#endif
+#if !defined(_PTRDIFF_T_) && !defined(_BSD_PTRDIFF_T_)
+#define _PTRDIFF_T
+#endif
+/* On BSD/386 1.1, at least, machine/ansi.h defines _BSD_WCHAR_T_
+ instead of _WCHAR_T_. */
+#if !defined(_WCHAR_T_) && !defined(_BSD_WCHAR_T_)
+#ifndef _BSD_WCHAR_T_
+#define _WCHAR_T
+#endif
+#endif
+/* Undef _FOO_T_ if we are supposed to define foo_t. */
+#if defined (__need_ptrdiff_t) || defined (_STDDEF_H_)
+#undef _PTRDIFF_T_
+#undef _BSD_PTRDIFF_T_
+#endif
+#if defined (__need_size_t) || defined (_STDDEF_H_)
+#undef _SIZE_T_
+#undef _BSD_SIZE_T_
+#endif
+#if defined (__need_wchar_t) || defined (_STDDEF_H_)
+#undef _WCHAR_T_
+#undef _BSD_WCHAR_T_
+#endif
+#endif /* defined(_ANSI_H_) || defined(_MACHINE_ANSI_H_) */
+
+/* Sequent's header files use _PTRDIFF_T_ in some conflicting way.
+ Just ignore it. */
+#if defined (__sequent__) && defined (_PTRDIFF_T_)
+#undef _PTRDIFF_T_
+#endif
+
+/* On VxWorks, <type/vxTypesBase.h> may have defined macros like
+ _TYPE_size_t which will typedef size_t. fixincludes patched the
+ vxTypesBase.h so that this macro is only defined if _GCC_SIZE_T is
+ not defined, and so that defining this macro defines _GCC_SIZE_T.
+ If we find that the macros are still defined at this point, we must
+ invoke them so that the type is defined as expected. */
+#if defined (_TYPE_ptrdiff_t) && (defined (__need_ptrdiff_t) || defined (_STDDEF_H_))
+_TYPE_ptrdiff_t;
+#undef _TYPE_ptrdiff_t
+#endif
+#if defined (_TYPE_size_t) && (defined (__need_size_t) || defined (_STDDEF_H_))
+_TYPE_size_t;
+#undef _TYPE_size_t
+#endif
+#if defined (_TYPE_wchar_t) && (defined (__need_wchar_t) || defined (_STDDEF_H_))
+_TYPE_wchar_t;
+#undef _TYPE_wchar_t
+#endif
+
+/* In case nobody has defined these types, but we aren't running under
+ GCC 2.00, make sure that __PTRDIFF_TYPE__, __SIZE__TYPE__, and
+ __WCHAR_TYPE__ have reasonable values. This can happen if the
+ parts of GCC is compiled by an older compiler, that actually
+ include gstddef.h, such as collect2. */
+
+/* Signed type of difference of two pointers. */
+
+/* Define this type if we are doing the whole job,
+ or if we want this type in particular. */
+#if defined (_STDDEF_H) || defined (__need_ptrdiff_t)
+#ifndef _PTRDIFF_T /* in case <sys/types.h> has defined it. */
+#ifndef _T_PTRDIFF_
+#ifndef _T_PTRDIFF
+#ifndef __PTRDIFF_T
+#ifndef _PTRDIFF_T_
+#ifndef _BSD_PTRDIFF_T_
+#ifndef ___int_ptrdiff_t_h
+#ifndef _GCC_PTRDIFF_T
+#define _PTRDIFF_T
+#define _T_PTRDIFF_
+#define _T_PTRDIFF
+#define __PTRDIFF_T
+#define _PTRDIFF_T_
+#define _BSD_PTRDIFF_T_
+#define ___int_ptrdiff_t_h
+#define _GCC_PTRDIFF_T
+#ifndef __PTRDIFF_TYPE__
+#define __PTRDIFF_TYPE__ long int
+#endif
+typedef __PTRDIFF_TYPE__ ptrdiff_t;
+#endif /* _GCC_PTRDIFF_T */
+#endif /* ___int_ptrdiff_t_h */
+#endif /* _BSD_PTRDIFF_T_ */
+#endif /* _PTRDIFF_T_ */
+#endif /* __PTRDIFF_T */
+#endif /* _T_PTRDIFF */
+#endif /* _T_PTRDIFF_ */
+#endif /* _PTRDIFF_T */
+
+/* If this symbol has done its job, get rid of it. */
+#undef __need_ptrdiff_t
+
+#endif /* _STDDEF_H or __need_ptrdiff_t. */
+
+/* Unsigned type of `sizeof' something. */
+
+/* Define this type if we are doing the whole job,
+ or if we want this type in particular. */
+#if defined (_STDDEF_H) || defined (__need_size_t)
+#ifndef __size_t__ /* BeOS */
+#ifndef _SIZE_T /* in case <sys/types.h> has defined it. */
+#ifndef _SYS_SIZE_T_H
+#ifndef _T_SIZE_
+#ifndef _T_SIZE
+#ifndef __SIZE_T
+#ifndef _SIZE_T_
+#ifndef _BSD_SIZE_T_
+#ifndef _SIZE_T_DEFINED_
+#ifndef _SIZE_T_DEFINED
+#ifndef ___int_size_t_h
+#ifndef _GCC_SIZE_T
+#ifndef _SIZET_
+#ifndef __size_t
+#define __size_t__ /* BeOS */
+#define _SIZE_T
+#define _SYS_SIZE_T_H
+#define _T_SIZE_
+#define _T_SIZE
+#define __SIZE_T
+#define _SIZE_T_
+#define _BSD_SIZE_T_
+#define _SIZE_T_DEFINED_
+#define _SIZE_T_DEFINED
+#define ___int_size_t_h
+#define _GCC_SIZE_T
+#define _SIZET_
+#define __size_t
+#ifndef __SIZE_TYPE__
+#define __SIZE_TYPE__ long unsigned int
+#endif
+#if !(defined (__GNUG__) && defined (size_t))
+typedef __SIZE_TYPE__ size_t;
+#ifdef __BEOS__
+typedef long ssize_t;
+#endif /* __BEOS__ */
+#endif /* !(defined (__GNUG__) && defined (size_t)) */
+#endif /* __size_t */
+#endif /* _SIZET_ */
+#endif /* _GCC_SIZE_T */
+#endif /* ___int_size_t_h */
+#endif /* _SIZE_T_DEFINED */
+#endif /* _SIZE_T_DEFINED_ */
+#endif /* _BSD_SIZE_T_ */
+#endif /* _SIZE_T_ */
+#endif /* __SIZE_T */
+#endif /* _T_SIZE */
+#endif /* _T_SIZE_ */
+#endif /* _SYS_SIZE_T_H */
+#endif /* _SIZE_T */
+#endif /* __size_t__ */
+#undef __need_size_t
+#endif /* _STDDEF_H or __need_size_t. */
+
+/* Wide character type.
+ Locale-writers should change this as necessary to
+ be big enough to hold unique values not between 0 and 127,
+ and not (wchar_t) -1, for each defined multibyte character. */
+
+/* Define this type if we are doing the whole job,
+ or if we want this type in particular. */
+#if defined (_STDDEF_H) || defined (__need_wchar_t)
+#ifndef __wchar_t__ /* BeOS */
+#ifndef _WCHAR_T
+#ifndef _T_WCHAR_
+#ifndef _T_WCHAR
+#ifndef __WCHAR_T
+#ifndef _WCHAR_T_
+#ifndef _BSD_WCHAR_T_
+#ifndef _WCHAR_T_DEFINED_
+#ifndef _WCHAR_T_DEFINED
+#ifndef _WCHAR_T_H
+#ifndef ___int_wchar_t_h
+#ifndef __INT_WCHAR_T_H
+#ifndef _GCC_WCHAR_T
+#define __wchar_t__ /* BeOS */
+#define _WCHAR_T
+#define _T_WCHAR_
+#define _T_WCHAR
+#define __WCHAR_T
+#define _WCHAR_T_
+#define _BSD_WCHAR_T_
+#define _WCHAR_T_DEFINED_
+#define _WCHAR_T_DEFINED
+#define _WCHAR_T_H
+#define ___int_wchar_t_h
+#define __INT_WCHAR_T_H
+#define _GCC_WCHAR_T
+
+/* On BSD/386 1.1, at least, machine/ansi.h defines _BSD_WCHAR_T_
+ instead of _WCHAR_T_, and _BSD_RUNE_T_ (which, unlike the other
+ symbols in the _FOO_T_ family, stays defined even after its
+ corresponding type is defined). If we define wchar_t, then we
+ must undef _WCHAR_T_; for BSD/386 1.1 (and perhaps others), if
+ we undef _WCHAR_T_, then we must also define rune_t, since
+ headers like runetype.h assume that if machine/ansi.h is included,
+ and _BSD_WCHAR_T_ is not defined, then rune_t is available.
+ machine/ansi.h says, "Note that _WCHAR_T_ and _RUNE_T_ must be of
+ the same type." */
+#ifdef _BSD_WCHAR_T_
+#undef _BSD_WCHAR_T_
+#ifdef _BSD_RUNE_T_
+#if !defined (_ANSI_SOURCE) && !defined (_POSIX_SOURCE)
+typedef _BSD_RUNE_T_ rune_t;
+#endif
+#endif
+#endif
+
+#ifndef __WCHAR_TYPE__
+#ifdef __BEOS__
+#define __WCHAR_TYPE__ unsigned char
+#else
+#define __WCHAR_TYPE__ int
+#endif
+#endif
+#ifndef __cplusplus
+typedef __WCHAR_TYPE__ wchar_t;
+#endif
+#endif
+#endif
+#endif
+#endif
+#endif
+#endif
+#endif
+#endif
+#endif
+#endif
+#endif
+#endif
+#endif /* __wchar_t__ */
+#undef __need_wchar_t
+#endif /* _STDDEF_H or __need_wchar_t. */
+
+#if defined (_STDDEF_H) || defined (__need_wint_t)
+#ifndef _WINT_T
+#define _WINT_T
+
+#ifndef __WINT_TYPE__
+#define __WINT_TYPE__ unsigned int
+#endif
+typedef __WINT_TYPE__ wint_t;
+#endif
+#undef __need_wint_t
+#endif
+
+/* In 4.3bsd-net2, leave these undefined to indicate that size_t, etc.
+ are already defined. */
+/* BSD/OS 3.1 requires the MACHINE_ANSI_H check here. FreeBSD 2.x apparently
+ does not, even though there is a check for MACHINE_ANSI_H above. */
+#if defined(_ANSI_H_) || (defined(__bsdi__) && defined(_MACHINE_ANSI_H_))
+/* The references to _GCC_PTRDIFF_T_, _GCC_SIZE_T_, and _GCC_WCHAR_T_
+ are probably typos and should be removed before 2.8 is released. */
+#ifdef _GCC_PTRDIFF_T_
+#undef _PTRDIFF_T_
+#undef _BSD_PTRDIFF_T_
+#endif
+#ifdef _GCC_SIZE_T_
+#undef _SIZE_T_
+#undef _BSD_SIZE_T_
+#endif
+#ifdef _GCC_WCHAR_T_
+#undef _WCHAR_T_
+#undef _BSD_WCHAR_T_
+#endif
+/* The following ones are the real ones. */
+#ifdef _GCC_PTRDIFF_T
+#undef _PTRDIFF_T_
+#undef _BSD_PTRDIFF_T_
+#endif
+#ifdef _GCC_SIZE_T
+#undef _SIZE_T_
+#undef _BSD_SIZE_T_
+#endif
+#ifdef _GCC_WCHAR_T
+#undef _WCHAR_T_
+#undef _BSD_WCHAR_T_
+#endif
+#endif /* _ANSI_H_ || ( __bsdi__ && _MACHINE_ANSI_H_ ) */
+
+#endif /* __sys_stdtypes_h */
+
+#endif /* RC_INVOKED */
+
+/* A null pointer constant. */
+
+#if defined (_STDDEF_H) || defined (__need_NULL)
+#undef NULL /* in case <stdio.h> has defined it. */
+#ifdef __GNUG__
+#define NULL __null
+#else /* G++ */
+#define NULL ((void *)0)
+#endif /* G++ */
+#endif /* NULL not defined and <stddef.h> or need NULL. */
+#undef __need_NULL
+
+#ifdef _STDDEF_H
+
+/* Offset of member MEMBER in a struct of type TYPE. */
+
+#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
+
+#endif /* _STDDEF_H was defined this time */
+
+#endif /* !_STDDEF_H && !_STDDEF_H_ && !_ANSI_STDDEF_H && !__STDDEF_H__
+ || __need_XXX was not defined before */
diff --git a/winsup/mingw/include/stdio.h b/winsup/mingw/include/stdio.h
new file mode 100644
index 000000000..7922a24dd
--- /dev/null
+++ b/winsup/mingw/include/stdio.h
@@ -0,0 +1,373 @@
+/*
+ * stdio.h
+ *
+ * Definitions of types and prototypes of functions for standard input and
+ * output.
+ *
+ * NOTE: The file manipulation functions provided by Microsoft seem to
+ * work with either slash (/) or backslash (\) as the path separator.
+ *
+ * This file is part of the Mingw32 package.
+ *
+ * Contributors:
+ * Created by Colin Peters <colin@bird.fu.is.saga-u.ac.jp>
+ *
+ * THIS SOFTWARE IS NOT COPYRIGHTED
+ *
+ * This source code is offered for use in the public domain. You may
+ * use, modify or distribute it freely.
+ *
+ * This code is distributed in the hope that it will be useful but
+ * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
+ * DISCLAMED. This includes but is not limited to warranties of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * $Revision$
+ * $Author$
+ * $Date$
+ *
+ */
+
+#ifndef _STDIO_H_
+#define _STDIO_H_
+
+/* All the headers include this file. */
+#include <_mingw.h>
+
+#define __need_size_t
+#define __need_NULL
+#define __need_wchar_t
+#define __need_wint_t
+#ifndef RC_INVOKED
+#include <stddef.h>
+#endif /* Not RC_INVOKED */
+
+
+/* Some flags for the iobuf structure provided by <paag@tid.es> */
+#define _IOREAD 1
+#define _IOWRT 2
+#define _IORW 4
+
+/*
+ * The three standard file pointers provided by the run time library.
+ * NOTE: These will go to the bit-bucket silently in GUI applications!
+ */
+#define STDIN_FILENO 0
+#define STDOUT_FILENO 1
+#define STDERR_FILENO 2
+
+/* Returned by various functions on end of file condition or error. */
+#define EOF (-1)
+
+/*
+ * The maximum length of a file name. You should use GetVolumeInformation
+ * instead of this constant. But hey, this works.
+ *
+ * NOTE: This is used in the structure _finddata_t (see io.h) so changing it
+ * is probably not a good idea.
+ */
+#define FILENAME_MAX (260)
+
+/*
+ * The maximum number of files that may be open at once. I have set this to
+ * a conservative number. The actual value may be higher.
+ */
+#define FOPEN_MAX (20)
+
+/*
+ * The maximum size of name (including NUL) that will be put in the user
+ * supplied buffer caName for tmpnam.
+ * NOTE: This has not been determined by experiment, but based on the
+ * maximum file name length above it is probably reasonable. I could be
+ * wrong...
+ */
+#define L_tmpnam (260)
+
+/*
+ * The three possible buffering mode (nMode) values for setvbuf.
+ * NOTE: _IOFBF works, but _IOLBF seems to work like unbuffered...
+ * maybe I'm testing it wrong?
+ */
+#define _IOFBF 0 /* fully buffered */
+#define _IOLBF 1 /* line buffered */
+#define _IONBF 2 /* unbuffered */
+
+/*
+ * The buffer size as used by setbuf such that it is equivalent to
+ * (void) setvbuf(fileSetBuffer, caBuffer, _IOFBF, BUFSIZ).
+ */
+#define BUFSIZ 512
+
+/* Constants for nOrigin indicating the position relative to which fseek
+ * sets the file position. Enclosed in ifdefs because io.h could also
+ * define them. (Though not anymore since io.h includes this file now.) */
+#ifndef SEEK_SET
+#define SEEK_SET (0)
+#endif
+
+#ifndef SEEK_CUR
+#define SEEK_CUR (1)
+#endif
+
+#ifndef SEEK_END
+#define SEEK_END (2)
+#endif
+
+
+#ifndef RC_INVOKED
+
+/*
+ * I used to include stdarg.h at this point, in order to allow for the
+ * functions later on in the file which use va_list. That conflicts with
+ * using stdio.h and varargs.h in the same file, so I do the typedef myself.
+ */
+#ifndef _VA_LIST
+#define _VA_LIST
+typedef char* va_list;
+#endif
+
+/*
+ * The structure underlying the FILE type.
+ *
+ * I still believe that nobody in their right mind should make use of the
+ * internals of this structure. Provided by Pedro A. Aranda Gutiirrez
+ * <paag@tid.es>.
+ */
+#ifndef _FILE_DEFINED
+#define _FILE_DEFINED
+typedef struct _iobuf
+{
+ char* _ptr;
+ int _cnt;
+ char* _base;
+ int _flag;
+ int _file;
+ int _charbuf;
+ int _bufsiz;
+ char* _tmpfname;
+} FILE;
+#endif /* Not _FILE_DEFINED */
+
+
+/*
+ * The standard file handles
+ */
+#ifndef __DECLSPEC_SUPPORTED
+
+extern FILE (*__imp__iob)[]; /* A pointer to an array of FILE */
+
+#define _iob (*__imp__iob) /* An array of FILE */
+
+#else /* __DECLSPEC_SUPPORTED */
+
+__MINGW_IMPORT FILE _iob[]; /* An array of FILE imported from DLL. */
+
+#endif /* __DECLSPEC_SUPPORTED */
+
+#define stdin (&_iob[STDIN_FILENO])
+#define stdout (&_iob[STDOUT_FILENO])
+#define stderr (&_iob[STDERR_FILENO])
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * File Operations
+ */
+
+FILE* fopen (const char*, const char*);
+FILE* freopen (const char*, const char*, FILE*);
+int fflush (FILE*);
+int fclose (FILE*);
+int remove (const char*);
+int rename (const char*, const char*);
+FILE* tmpfile (void);
+char* tmpnam (char*);
+char* _tempnam (const char*, const char*);
+
+#ifndef NO_OLDNAMES
+char* tempnam (const char*, const char*);
+#endif
+
+int setvbuf (FILE*, char*, int, size_t);
+
+void setbuf (FILE*, char*);
+
+/*
+ * Formatted Output
+ */
+
+int fprintf (FILE*, const char*, ...);
+int printf (const char*, ...);
+int sprintf (char*, const char*, ...);
+int _snprintf (char*, size_t, const char*, ...);
+int vfprintf (FILE*, const char*, va_list);
+int vprintf (const char*, va_list);
+int vsprintf (char*, const char*, va_list);
+int _vsnprintf (char*, size_t, const char*, va_list);
+
+/* Wide character versions */
+int fwprintf (FILE*, const wchar_t*, ...);
+int wprintf (const wchar_t*, ...);
+int swprintf (wchar_t*, const wchar_t*, ...);
+int vfwprintf (FILE*, const wchar_t*, va_list);
+int vwprintf (const wchar_t*, va_list);
+int vswprintf (wchar_t*, const wchar_t*, va_list);
+
+/*
+ * Formatted Input
+ */
+
+int fscanf (FILE*, const char*, ...);
+int scanf (const char*, ...);
+int sscanf (const char*, const char*, ...);
+
+/* Wide character versions */
+int fwscanf (FILE*, const wchar_t*, ...);
+int wscanf (const wchar_t*, ...);
+int swscanf (wchar_t*, const wchar_t*, ...);
+
+/*
+ * Character Input and Output Functions
+ */
+
+int fgetc (FILE*);
+char* fgets (char*, int, FILE*);
+int fputc (int, FILE*);
+int fputs (const char*, FILE*);
+int getc (FILE*);
+int getchar (void);
+char* gets (char*);
+int putc (int, FILE*);
+int putchar (int);
+int puts (const char*);
+int ungetc (int, FILE*);
+
+/* Wide character versions */
+wint_t fgetwc (FILE*);
+wint_t fputwc (wchar_t, FILE*);
+wint_t ungetwc (wchar_t, FILE*);
+
+
+#ifdef __MSVCRT__
+wchar_t* fgetws (wchar_t*, int, FILE*);
+int fputws (const wchar_t*, FILE*);
+wint_t getwc (FILE*);
+wint_t getwchar (void);
+wchar_t* _getws (wchar_t*);
+wint_t putwc (wint_t, FILE*);
+int _putws (const wchar_t*);
+wint_t putwchar (wint_t);
+#endif /* __MSVCRT__ */
+
+/*
+ * Direct Input and Output Functions
+ */
+
+size_t fread (void*, size_t, size_t, FILE*);
+size_t fwrite (const void*, size_t, size_t, FILE*);
+
+
+/*
+ * File Positioning Functions
+ */
+
+int fseek (FILE*, long, int);
+long ftell (FILE*);
+void rewind (FILE*);
+
+/*
+ * An opaque data type used for storing file positions... The contents of
+ * this type are unknown, but we (the compiler) need to know the size
+ * because the programmer using fgetpos and fsetpos will be setting aside
+ * storage for fpos_t structres. Actually I tested using a byte array and
+ * it is fairly evident that the fpos_t type is a long (in CRTDLL.DLL).
+ * Perhaps an unsigned long? TODO? It's definitely a 64-bit number in
+ * MSVCRT however, and for now `long long' will do.
+ */
+#ifdef __MSVCRT__
+typedef long long fpos_t;
+#else
+typedef long fpos_t;
+#endif
+
+int fgetpos (FILE*, fpos_t*);
+int fsetpos (FILE*, const fpos_t*);
+
+/*
+ * Error Functions
+ */
+
+void clearerr (FILE*);
+int feof (FILE*);
+int ferror (FILE*);
+void perror (const char*);
+
+
+#ifndef __STRICT_ANSI__
+
+/*
+ * Pipes
+ */
+FILE* _popen (const char*, const char*);
+int _pclose (FILE*);
+
+#ifndef NO_OLDNAMES
+FILE* popen (const char*, const char*);
+int pclose (FILE*);
+#endif
+
+/* The wide character version, only available in MSVCRT DLL versions, not
+ * CRTDLL. */
+#ifdef __MSVCRT__
+FILE* _wpopen (const wchar_t*, const wchar_t*);
+
+#ifndef NO_OLDNAMES
+#if 0
+FILE* wpopen (const wchar_t*, const wchar_t*);
+#else /* Always true */
+/*
+ * The above prototypeing is not possible unless the wpopen export is added
+ * to moldnames, which can't be done unless we make separate moldnames.def
+ * files for every supported runtime. For the time being we use a define
+ * instead. Pedro's modified dlltool should take care of this I think.
+ */
+#define wpopen _wpopen
+#endif /* Always true */
+
+#endif /* not NO_OLDNAMES */
+#endif /* MSVCRT runtime */
+
+/*
+ * Other Non ANSI functions
+ */
+int _fgetchar (void);
+int _fputchar (int);
+FILE* _fdopen (int, const char*);
+wint_t _fgetwchar(void);
+wint_t _fputwchar(wint_t);
+int _fileno (FILE*);
+int _getw (FILE*);
+int _putw (int, FILE*);
+
+#ifndef _NO_OLDNAMES
+int fgetchar (void);
+int fputchar (int);
+FILE* fdopen (int, const char*);
+wint_t fgetwchar(void);
+wint_t fputwchar(wint_t);
+int fileno (FILE*);
+int getw (FILE*);
+int putw (int, FILE*);
+#endif /* Not _NO_OLDNAMES */
+
+#endif /* Not __STRICT_ANSI__ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* Not RC_INVOKED */
+
+#endif /* _STDIO_H_ */
diff --git a/winsup/mingw/include/stdlib.h b/winsup/mingw/include/stdlib.h
new file mode 100644
index 000000000..fade92772
--- /dev/null
+++ b/winsup/mingw/include/stdlib.h
@@ -0,0 +1,386 @@
+/*
+ * stdlib.h
+ *
+ * Definitions for common types, variables, and functions.
+ *
+ * This file is part of the Mingw32 package.
+ *
+ * Contributors:
+ * Created by Colin Peters <colin@bird.fu.is.saga-u.ac.jp>
+ *
+ * THIS SOFTWARE IS NOT COPYRIGHTED
+ *
+ * This source code is offered for use in the public domain. You may
+ * use, modify or distribute it freely.
+ *
+ * This code is distributed in the hope that it will be useful but
+ * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
+ * DISCLAMED. This includes but is not limited to warranties of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * $Revision$
+ * $Author$
+ * $Date$
+ *
+ */
+
+#ifndef _STDLIB_H_
+#define _STDLIB_H_
+
+/* All the headers include this file. */
+#include <_mingw.h>
+
+
+#define __need_size_t
+#define __need_wchar_t
+#define __need_NULL
+#ifndef RC_INVOKED
+#include <stddef.h>
+#endif /* RC_INVOKED */
+
+/*
+ * RAND_MAX is the maximum value that may be returned by rand.
+ * The minimum is zero.
+ */
+#define RAND_MAX 0x7FFF
+
+/*
+ * These values may be used as exit status codes.
+ */
+#define EXIT_SUCCESS 0
+#define EXIT_FAILURE -1
+
+/*
+ * Definitions for path name functions.
+ * NOTE: All of these values have simply been chosen to be conservatively high.
+ * Remember that with long file names we can no longer depend on
+ * extensions being short.
+ */
+#ifndef __STRICT_ANSI__
+
+#ifndef MAX_PATH
+#define MAX_PATH (260)
+#endif
+
+#define _MAX_PATH MAX_PATH
+#define _MAX_DRIVE (3)
+#define _MAX_DIR 256
+#define _MAX_FNAME 256
+#define _MAX_EXT 256
+
+#endif /* Not __STRICT_ANSI__ */
+
+
+#ifndef RC_INVOKED
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * This seems like a convenient place to declare these variables, which
+ * give programs using WinMain (or main for that matter) access to main-ish
+ * argc and argv. environ is a pointer to a table of environment variables.
+ * NOTE: Strings in _argv and environ are ANSI strings.
+ */
+extern int _argc;
+extern char** _argv;
+
+/* imports from runtime dll of the above variables */
+#ifdef __MSVCRT__
+
+extern int* __p___argc(void);
+extern char*** __p___argv(void);
+extern wchar_t*** __p___wargv(void);
+
+#define __argc (*__p___argc())
+#define __argv (*__p___argv())
+#define __wargv (*__p___wargv())
+
+#else /* !MSVCRT */
+
+#ifndef __DECLSPEC_SUPPORTED
+
+extern int* __imp___argc_dll;
+extern char*** __imp___argv_dll;
+#define __argc (*__imp___argc_dll)
+#define __argv (*__imp___argv_dll)
+
+#else /* __DECLSPEC_SUPPORTED */
+
+__MINGW_IMPORT int __argc_dll;
+__MINGW_IMPORT char** __argv_dll;
+#define __argc __argc_dll
+#define __argv __argv_dll
+
+#endif /* __DECLSPEC_SUPPORTED */
+
+#endif /* __MSVCRT */
+
+/*
+ * Also defined in ctype.h.
+ */
+
+#ifndef MB_CUR_MAX
+# ifdef __MSVCRT__
+# define MB_CUR_MAX __mb_cur_max
+ __MINGW_IMPORT int __mb_cur_max;
+# else /* not __MSVCRT */
+# define MB_CUR_MAX __mb_cur_max_dll
+ __MINGW_IMPORT int __mb_cur_max_dll;
+# endif /* not __MSVCRT */
+#endif /* MB_CUR_MAX */
+
+/*
+ * MS likes to declare errno in stdlib.h as well.
+ */
+
+#ifdef _UWIN
+#undef errno
+extern int errno;
+#else
+int* _errno(void);
+#define errno (*_errno())
+#endif
+int* __doserrno(void);
+#define _doserrno (*__doserrno())
+
+/*
+ * Use environ from the DLL, not as a global.
+ */
+
+#ifdef __MSVCRT__
+ extern char *** __p__environ();
+ extern wchar_t *** __p__wenviron();
+# define _environ (*__p__environ())
+# define _wenviron (*__p__wenviron())
+#else /* ! __MSVCRT__ */
+# ifndef __DECLSPEC_SUPPORTED
+ extern char *** __imp__environ_dll;
+# define _environ (*__imp__environ_dll)
+# else /* __DECLSPEC_SUPPORTED */
+ __MINGW_IMPORT char ** _environ_dll;
+# define _environ _environ_dll
+# endif /* __DECLSPEC_SUPPORTED */
+#endif /* ! __MSVCRT__ */
+
+#define environ _environ
+
+#ifdef __MSVCRT__
+/* One of the MSVCRTxx libraries */
+
+#ifndef __DECLSPEC_SUPPORTED
+ extern int* __imp__sys_nerr;
+# define sys_nerr (*__imp__sys_nerr)
+#else /* __DECLSPEC_SUPPORTED */
+ __MINGW_IMPORT int _sys_nerr;
+# ifndef _UWIN
+# define sys_nerr _sys_nerr
+# endif /* _UWIN */
+#endif /* __DECLSPEC_SUPPORTED */
+
+#else /* ! __MSVCRT__ */
+
+/* CRTDLL run time library */
+
+#ifndef __DECLSPEC_SUPPORTED
+ extern int* __imp__sys_nerr_dll;
+# define sys_nerr (*__imp__sys_nerr_dll)
+#else /* __DECLSPEC_SUPPORTED */
+ __MINGW_IMPORT int _sys_nerr_dll;
+# define sys_nerr _sys_nerr_dll
+#endif /* __DECLSPEC_SUPPORTED */
+
+#endif /* ! __MSVCRT__ */
+
+#ifndef __DECLSPEC_SUPPORTED
+extern char*** __imp__sys_errlist;
+#define sys_errlist (*__imp__sys_errlist)
+#else /* __DECLSPEC_SUPPORTED */
+__MINGW_IMPORT char* _sys_errlist[];
+#ifndef _UWIN
+#define sys_errlist _sys_errlist
+#endif /* _UWIN */
+#endif /* __DECLSPEC_SUPPORTED */
+
+/*
+ * OS version and such constants.
+ */
+#ifndef __STRICT_ANSI__
+
+#ifdef __MSVCRT__
+/* msvcrtxx.dll */
+
+extern unsigned int* __p__osver(void);
+extern unsigned int* __p__winver(void);
+extern unsigned int* __p__winmajor(void);
+extern unsigned int* __p__winminor(void);
+
+#define _osver (*__p__osver())
+#define _winver (*__p__winver())
+#define _winmajor (*__p__winmajor())
+#define _winminor (*__p__winminor())
+
+#else
+/* Not msvcrtxx.dll, thus crtdll.dll */
+
+#ifndef __DECLSPEC_SUPPORTED
+
+extern unsigned int* _imp___osver_dll;
+extern unsigned int* _imp___winver_dll;
+extern unsigned int* _imp___winmajor_dll;
+extern unsigned int* _imp___winminor_dll;
+
+#define _osver (*_imp___osver_dll)
+#define _winver (*_imp___winver_dll)
+#define _winmajor (*_imp___winmajor_dll)
+#define _winminor (*_imp___winminor_dll)
+
+#else /* __DECLSPEC_SUPPORTED */
+
+__MINGW_IMPORT unsigned int _osver_dll;
+__MINGW_IMPORT unsigned int _winver_dll;
+__MINGW_IMPORT unsigned int _winmajor_dll;
+__MINGW_IMPORT unsigned int _winminor_dll;
+
+#define _osver _osver_dll
+#define _winver _winver_dll
+#define _winmajor _winmajor_dll
+#define _winminor _winminor_dll
+
+#endif /* __DECLSPEC_SUPPORTED */
+
+#endif
+
+#endif /* Not __STRICT_ANSI__ */
+
+#ifdef __GNUC__
+#define _ATTRIB_NORETURN __attribute__ ((noreturn))
+#else /* Not __GNUC__ */
+#define _ATTRIB_NORETURN
+#endif /* __GNUC__ */
+
+double atof (const char*);
+int atoi (const char*);
+long atol (const char*);
+
+double strtod (const char*, char**);
+double wcstod (const wchar_t*, wchar_t**);
+long strtol (const char*, char**, int);
+long wcstol (const wchar_t*, wchar_t**, int);
+
+unsigned long strtoul (const char*, char**, int);
+unsigned long wcstoul (const wchar_t*, wchar_t**, int);
+
+size_t wcstombs (char*, const wchar_t*, size_t);
+int wctomb (char*, wchar_t);
+
+int mblen (const char*, size_t);
+size_t mbstowcs (wchar_t*, const char*, size_t);
+int mbtowc (wchar_t*, const char*, size_t);
+
+int rand (void);
+void srand (unsigned int);
+
+void* calloc (size_t, size_t);
+void* malloc (size_t);
+void* realloc (void*, size_t);
+void free (void*);
+
+void abort (void) _ATTRIB_NORETURN;
+void exit (int) _ATTRIB_NORETURN;
+int atexit (void (*)(void));
+
+int system (const char*);
+char* getenv (const char*);
+
+void* bsearch (const void*, const void*, size_t, size_t,
+ int (*)(const void*, const void*));
+void qsort (const void*, size_t, size_t,
+ int (*)(const void*, const void*));
+
+int abs (int);
+long labs (long);
+
+/*
+ * div_t and ldiv_t are structures used to return the results of div and
+ * ldiv.
+ *
+ * NOTE: div and ldiv appear not to work correctly unless
+ * -fno-pcc-struct-return is specified. This is included in the
+ * mingw32 specs file.
+ */
+typedef struct { int quot, rem; } div_t;
+typedef struct { long quot, rem; } ldiv_t;
+
+div_t div (int, int);
+ldiv_t ldiv (long, long);
+
+
+#ifndef __STRICT_ANSI__
+
+/*
+ * NOTE: Officially the three following functions are obsolete. The Win32 API
+ * functions SetErrorMode, Beep and Sleep are their replacements.
+ */
+void _beep (unsigned int, unsigned int);
+void _seterrormode (int);
+void _sleep (unsigned long);
+
+void _exit (int) _ATTRIB_NORETURN;
+
+int _putenv (const char*);
+void _searchenv (const char*, const char*, char*);
+
+char* _itoa (int, char*, int);
+char* _ltoa (long, char*, int);
+
+char* _ecvt (double, int, int*, int*);
+char* _fcvt (double, int, int*, int*);
+char* _gcvt (double, int, char*);
+
+void _makepath (char*, const char*, const char*, const char*, const char*);
+void _splitpath (const char*, char*, char*, char*, char*);
+char* _fullpath (char*, const char*, size_t);
+int _wtoi (const wchar_t *);
+long _wtol (const wchar_t *);
+
+char* _i64toa(__int64, char *, int);
+char* _ui64toa(unsigned __int64, char *, int);
+__int64 _atoi64(const char *);
+
+wchar_t* _i64tow(__int64, wchar_t *, int);
+wchar_t* _ui64tow(unsigned __int64, wchar_t *, int);
+__int64 _wtoi64(const wchar_t *);
+
+
+#ifndef _NO_OLDNAMES
+
+int putenv (const char*);
+void searchenv (const char*, const char*, char*);
+
+char* itoa (int, char*, int);
+char* ltoa (long, char*, int);
+
+#ifndef _UWIN
+char* ecvt (double, int, int*, int*);
+char* fcvt (double, int, int*, int*);
+char* gcvt (double, int, char*);
+#endif /* _UWIN */
+#endif /* Not _NO_OLDNAMES */
+
+#endif /* Not __STRICT_ANSI__ */
+
+/*
+ * Undefine the no return attribute used in some function definitions
+ */
+#undef _ATTRIB_NORETURN
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* Not RC_INVOKED */
+
+#endif /* Not _STDLIB_H_ */
+
diff --git a/winsup/mingw/include/string.h b/winsup/mingw/include/string.h
new file mode 100644
index 000000000..f6ea7aa11
--- /dev/null
+++ b/winsup/mingw/include/string.h
@@ -0,0 +1,197 @@
+/*
+ * string.h
+ *
+ * Definitions for memory and string functions.
+ *
+ * This file is part of the Mingw32 package.
+ *
+ * Contributors:
+ * Created by Colin Peters <colin@bird.fu.is.saga-u.ac.jp>
+ *
+ * THIS SOFTWARE IS NOT COPYRIGHTED
+ *
+ * This source code is offered for use in the public domain. You may
+ * use, modify or distribute it freely.
+ *
+ * This code is distributed in the hope that it will be useful but
+ * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
+ * DISCLAMED. This includes but is not limited to warranties of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * $Revision$
+ * $Author$
+ * $Date$
+ *
+ */
+
+#ifndef _STRING_H_
+#define _STRING_H_
+
+/* All the headers include this file. */
+#include <_mingw.h>
+
+/*
+ * Define size_t, wchar_t and NULL
+ */
+#define __need_size_t
+#define __need_wchar_t
+#define __need_NULL
+#ifndef RC_INVOKED
+#include <stddef.h>
+#endif /* Not RC_INVOKED */
+
+#ifndef RC_INVOKED
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Prototypes of the ANSI Standard C library string functions.
+ */
+void* memchr (const void*, int, size_t);
+int memcmp (const void*, const void*, size_t);
+void* memcpy (void*, const void*, size_t);
+void* memmove (void*, const void*, size_t);
+void* memset (void*, int, size_t);
+char* strcat (char*, const char*);
+char* strchr (const char*, int);
+int strcmp (const char*, const char*);
+int strcoll (const char*, const char*); /* Compare using locale */
+char* strcpy (char*, const char*);
+size_t strcspn (const char*, const char*);
+char* strerror (int); /* NOTE: NOT an old name wrapper. */
+char* _strerror (int);
+size_t strlen (const char*);
+char* strncat (char*, const char*, size_t);
+int strncmp (const char*, const char*, size_t);
+char* strncpy (char*, const char*, size_t);
+char* strpbrk (const char*, const char*);
+char* strrchr (const char*, int);
+size_t strspn (const char*, const char*);
+char* strstr (const char*, const char*);
+char* strtok (char*, const char*);
+size_t strxfrm (char*, const char*, size_t);
+
+#ifndef __STRICT_ANSI__
+/*
+ * Extra non-ANSI functions provided by the CRTDLL library
+ */
+void* _memccpy (void*, const void*, int, size_t);
+int _memicmp (const void*, const void*, size_t);
+char* _strdup (const char*);
+int _strcmpi (const char*, const char*);
+int _stricmp (const char*, const char*);
+int _stricoll (const char*, const char*);
+char* _strlwr (char*);
+int _strnicmp (const char*, const char*, size_t);
+char* _strnset (char*, int, size_t);
+char* _strrev (char*);
+char* _strset (char*, int);
+char* _strupr (char*);
+void _swab (const char*, char*, size_t);
+
+/*
+ * Multi-byte character functions
+ */
+unsigned char* _mbschr (unsigned char*, unsigned char*);
+unsigned char* _mbsncat (unsigned char*, const unsigned char*, size_t);
+unsigned char* _mbstok (unsigned char*, unsigned char*);
+
+#endif /* Not __STRICT_ANSI__ */
+
+
+/*
+ * Unicode versions of the standard calls.
+ */
+wchar_t* wcscat (wchar_t*, const wchar_t*);
+wchar_t* wcschr (const wchar_t*, wchar_t);
+int wcscmp (const wchar_t*, const wchar_t*);
+int wcscoll (const wchar_t*, const wchar_t*);
+wchar_t* wcscpy (wchar_t*, const wchar_t*);
+size_t wcscspn (const wchar_t*, const wchar_t*);
+/* Note: No wcserror in CRTDLL. */
+size_t wcslen (const wchar_t*);
+wchar_t* wcsncat (wchar_t*, const wchar_t*, size_t);
+int wcsncmp(const wchar_t*, const wchar_t*, size_t);
+wchar_t* wcsncpy(wchar_t*, const wchar_t*, size_t);
+wchar_t* wcspbrk(const wchar_t*, const wchar_t*);
+wchar_t* wcsrchr(const wchar_t*, wchar_t);
+size_t wcsspn(const wchar_t*, const wchar_t*);
+wchar_t* wcsstr(const wchar_t*, const wchar_t*);
+wchar_t* wcstok(wchar_t*, const wchar_t*);
+size_t wcsxfrm(wchar_t*, const wchar_t*, size_t);
+
+
+#ifndef __STRICT_ANSI__
+/*
+ * Unicode versions of non-ANSI functions provided by CRTDLL.
+ */
+
+/* NOTE: _wcscmpi not provided by CRTDLL, this define is for portability */
+#define _wcscmpi _wcsicmp
+
+wchar_t* _wcsdup (wchar_t*);
+int _wcsicmp (const wchar_t*, const wchar_t*);
+int _wcsicoll (const wchar_t*, const wchar_t*);
+wchar_t* _wcslwr (wchar_t*);
+int _wcsnicmp (const wchar_t*, const wchar_t*, size_t);
+wchar_t* _wcsnset (wchar_t*, wchar_t, size_t);
+wchar_t* _wcsrev (wchar_t*);
+wchar_t* _wcsset (wchar_t*, wchar_t);
+wchar_t* _wcsupr (wchar_t*);
+
+#endif /* Not __STRICT_ANSI__ */
+
+
+#ifndef __STRICT_ANSI__
+#ifndef _NO_OLDNAMES
+
+/*
+ * Non-underscored versions of non-ANSI functions. They live in liboldnames.a
+ * and provide a little extra portability. Also a few extra UNIX-isms like
+ * strcasecmp.
+ */
+
+void* memccpy (void*, const void*, int, size_t);
+int memicmp (const void*, const void*, size_t);
+char* strdup (const char*);
+int strcmpi (const char*, const char*);
+int stricmp (const char*, const char*);
+int strcasecmp (const char*, const char*);
+int stricoll (const char*, const char*);
+char* strlwr (char*);
+int strnicmp (const char*, const char*, size_t);
+int strncasecmp (const char*, const char*, size_t);
+char* strnset (char*, int, size_t);
+char* strrev (char*);
+char* strset (char*, int);
+char* strupr (char*);
+#ifndef _UWIN
+void swab (const char*, char*, size_t);
+#endif /* _UWIN */
+
+/* NOTE: There is no _wcscmpi, but this is for compatibility. */
+int wcscmpi (const wchar_t*, const wchar_t*);
+wchar_t* wcsdup (wchar_t*);
+int wcsicmp (const wchar_t*, const wchar_t*);
+int wcsicoll (const wchar_t*, const wchar_t*);
+wchar_t* wcslwr (wchar_t*);
+int wcsnicmp (const wchar_t*, const wchar_t*, size_t);
+wchar_t* wcsnset (wchar_t*, wchar_t, size_t);
+wchar_t* wcsrev (wchar_t*);
+wchar_t* wcsset (wchar_t*, wchar_t);
+wchar_t* wcsupr (wchar_t*);
+
+#endif /* Not _NO_OLDNAMES */
+#endif /* Not strict ANSI */
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* Not RC_INVOKED */
+
+#endif /* Not _STRING_H_ */
+
diff --git a/winsup/mingw/include/sys/fcntl.h b/winsup/mingw/include/sys/fcntl.h
new file mode 100644
index 000000000..b343f272f
--- /dev/null
+++ b/winsup/mingw/include/sys/fcntl.h
@@ -0,0 +1,8 @@
+/*
+ * This file is part of the Mingw32 package.
+ *
+ * This fcntl.h maps to the root fcntl.h
+ */
+#ifndef __STRICT_ANSI__
+#include <fcntl.h>
+#endif
diff --git a/winsup/mingw/include/sys/file.h b/winsup/mingw/include/sys/file.h
new file mode 100644
index 000000000..96c49e117
--- /dev/null
+++ b/winsup/mingw/include/sys/file.h
@@ -0,0 +1,9 @@
+/*
+ * This file is part of the Mingw32 package.
+ *
+ * This file.h maps to the root fcntl.h
+ * TODO?
+ */
+#ifndef __STRICT_ANSI__
+#include <fcntl.h>
+#endif
diff --git a/winsup/mingw/include/sys/locking.h b/winsup/mingw/include/sys/locking.h
new file mode 100644
index 000000000..cf33b5f03
--- /dev/null
+++ b/winsup/mingw/include/sys/locking.h
@@ -0,0 +1,52 @@
+/*
+ * locking.h
+ *
+ * Constants for the mode parameter of the locking function.
+ *
+ * This file is part of the Mingw32 package.
+ *
+ * Contributors:
+ * Created by Colin Peters <colin@bird.fu.is.saga-u.ac.jp>
+ *
+ * THIS SOFTWARE IS NOT COPYRIGHTED
+ *
+ * This source code is offered for use in the public domain. You may
+ * use, modify or distribute it freely.
+ *
+ * This code is distributed in the hope that it will be useful but
+ * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
+ * DISCLAMED. This includes but is not limited to warranties of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * $Revision$
+ * $Author$
+ * $Date$
+ *
+ */
+
+#ifndef __STRICT_ANSI__
+
+#ifndef _LOCKING_H_
+#define _LOCKING_H_
+
+/* All the headers include this file. */
+#include <_mingw.h>
+
+#define _LK_UNLOCK 0 /* Unlock */
+#define _LK_LOCK 1 /* Lock */
+#define _LK_NBLCK 2 /* Non-blocking lock */
+#define _LK_RLCK 3 /* Lock for read only */
+#define _LK_NBRLCK 4 /* Non-blocking lock for read only */
+
+#ifndef NO_OLDNAMES
+#define LK_UNLOCK _LK_UNLOCK
+#define LK_LOCK _LK_LOCK
+#define LK_NBLCK _LK_NBLCK
+#define LK_RLCK _LK_RLCK
+#define LK_NBRLCK _LK_NBRLCK
+#endif /* Not NO_OLDNAMES */
+
+#endif /* Not _LOCKING_H_ */
+
+#endif /* Not __STRICT_ANSI__ */
+
diff --git a/winsup/mingw/include/sys/stat.h b/winsup/mingw/include/sys/stat.h
new file mode 100644
index 000000000..f1b327e46
--- /dev/null
+++ b/winsup/mingw/include/sys/stat.h
@@ -0,0 +1,175 @@
+/*
+ * stat.h
+ *
+ * Symbolic constants for opening and creating files, also stat, fstat and
+ * chmod functions.
+ *
+ * This file is part of the Mingw32 package.
+ *
+ * Contributors:
+ * Created by Colin Peters <colin@bird.fu.is.saga-u.ac.jp>
+ *
+ * THIS SOFTWARE IS NOT COPYRIGHTED
+ *
+ * This source code is offered for use in the public domain. You may
+ * use, modify or distribute it freely.
+ *
+ * This code is distributed in the hope that it will be useful but
+ * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
+ * DISCLAMED. This includes but is not limited to warranties of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * $Revision$
+ * $Author$
+ * $Date$
+ *
+ */
+
+#ifndef __STRICT_ANSI__
+
+#ifndef _STAT_H_
+#define _STAT_H_
+
+/* All the headers include this file. */
+#include <_mingw.h>
+
+#define __need_size_t
+#define __need_wchar_t
+#ifndef RC_INVOKED
+#include <stddef.h>
+#endif /* Not RC_INVOKED */
+
+#include <sys/types.h>
+
+/*
+ * Constants for the stat st_mode member.
+ */
+#define _S_IFIFO 0x1000 /* FIFO */
+#define _S_IFCHR 0x2000 /* Character */
+#define _S_IFBLK 0x3000 /* Block */
+#define _S_IFDIR 0x4000 /* Directory */
+#define _S_IFREG 0x8000 /* Regular */
+
+#define _S_IFMT 0xF000 /* File type mask */
+
+#define _S_IEXEC 0x0040
+#define _S_IWRITE 0x0080
+#define _S_IREAD 0x0100
+
+#define _S_IRWXU (_S_IREAD | _S_IWRITE | _S_IEXEC)
+#define _S_IXUSR _S_IEXEC
+#define _S_IWUSR _S_IWRITE
+#define _S_IRUSR _S_IREAD
+
+#define _S_ISDIR(m) ((m) & _S_IFDIR)
+#define _S_ISFIFO(m) ((m) & _S_IFIFO)
+#define _S_ISCHR(m) ((m) & _S_IFCHR)
+#define _S_ISBLK(m) ((m) & _S_IFBLK)
+#define _S_ISREG(m) ((m) & _S_IFREG)
+
+#ifndef _NO_OLDNAMES
+
+#define S_IFIFO _S_IFIFO
+#define S_IFCHR _S_IFCHR
+#define S_IFBLK _S_IFBLK
+#define S_IFDIR _S_IFDIR
+#define S_IFREG _S_IFREG
+#define S_IFMT _S_IFMT
+#define S_IEXEC _S_IEXEC
+#define S_IWRITE _S_IWRITE
+#define S_IREAD _S_IREAD
+#define S_IRWXU _S_IRWXU
+#define S_IXUSR _S_IXUSR
+#define S_IWUSR _S_IWUSR
+#define S_IRUSR _S_IRUSR
+
+#define S_ISDIR(m) ((m) & S_IFDIR)
+#define S_ISFIFO(m) ((m) & S_IFIFO)
+#define S_ISCHR(m) ((m) & S_IFCHR)
+#define S_ISBLK(m) ((m) & S_IFBLK)
+#define S_ISREG(m) ((m) & S_IFREG)
+
+#endif /* Not _NO_OLDNAMES */
+
+#ifndef RC_INVOKED
+
+#ifndef _STAT_DEFINED
+/*
+ * The structure manipulated and returned by stat and fstat.
+ *
+ * NOTE: If called on a directory the values in the time fields are not only
+ * invalid, they will cause localtime et. al. to return NULL. And calling
+ * asctime with a NULL pointer causes an Invalid Page Fault. So watch it!
+ */
+struct _stat
+{
+ _dev_t st_dev; /* Equivalent to drive number 0=A 1=B ... */
+ _ino_t st_ino; /* Always zero ? */
+ _mode_t st_mode; /* See above constants */
+ short st_nlink; /* Number of links. */
+ short st_uid; /* User: Maybe significant on NT ? */
+ short st_gid; /* Group: Ditto */
+ _dev_t st_rdev; /* Seems useless (not even filled in) */
+ _off_t st_size; /* File size in bytes */
+ time_t st_atime; /* Accessed date (always 00:00 hrs local
+ * on FAT) */
+ time_t st_mtime; /* Modified time */
+ time_t st_ctime; /* Creation time */
+};
+
+struct stat
+{
+ _dev_t st_dev; /* Equivalent to drive number 0=A 1=B ... */
+ _ino_t st_ino; /* Always zero ? */
+ _mode_t st_mode; /* See above constants */
+ short st_nlink; /* Number of links. */
+ short st_uid; /* User: Maybe significant on NT ? */
+ short st_gid; /* Group: Ditto */
+ _dev_t st_rdev; /* Seems useless (not even filled in) */
+ _off_t st_size; /* File size in bytes */
+ time_t st_atime; /* Accessed date (always 00:00 hrs local
+ * on FAT) */
+ time_t st_mtime; /* Modified time */
+ time_t st_ctime; /* Creation time */
+};
+
+#define _STAT_DEFINED
+#endif /* _STAT_DEFINED */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+int _fstat (int, struct _stat*);
+int _chmod (const char*, int);
+int _stat (const char*, struct _stat*);
+
+#ifndef _WSTAT_DEFINED
+
+/* also declared in wchar.h */
+
+int _wstat(const wchar_t*, struct _stat*);
+
+#define _WSTAT_DEFINED
+#endif /* _WSTAT_DEFIND */
+
+#ifndef _NO_OLDNAMES
+
+/* These functions live in liboldnames.a. */
+int fstat (int, struct stat*);
+int chmod (const char*, int);
+int stat (const char*, struct stat*);
+
+#endif /* Not _NO_OLDNAMES */
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* Not RC_INVOKED */
+
+#endif /* Not _STAT_H_ */
+
+#endif /* Not __STRICT_ANSI__ */
+
diff --git a/winsup/mingw/include/sys/time.h b/winsup/mingw/include/sys/time.h
new file mode 100644
index 000000000..39d85f67b
--- /dev/null
+++ b/winsup/mingw/include/sys/time.h
@@ -0,0 +1,3 @@
+
+#include <time.h>
+
diff --git a/winsup/mingw/include/sys/timeb.h b/winsup/mingw/include/sys/timeb.h
new file mode 100644
index 000000000..696a33404
--- /dev/null
+++ b/winsup/mingw/include/sys/timeb.h
@@ -0,0 +1,82 @@
+/*
+ * timeb.h
+ *
+ * Support for the UNIX System V ftime system call.
+ *
+ * This file is part of the Mingw32 package.
+ *
+ * Contributors:
+ * Created by Colin Peters <colin@bird.fu.is.saga-u.ac.jp>
+ *
+ * THIS SOFTWARE IS NOT COPYRIGHTED
+ *
+ * This source code is offered for use in the public domain. You may
+ * use, modify or distribute it freely.
+ *
+ * This code is distributed in the hope that it will be useful but
+ * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
+ * DISCLAMED. This includes but is not limited to warranties of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * $Revision$
+ * $Author$
+ * $Date$
+ *
+ */
+
+#ifndef __STRICT_ANSI__
+
+#ifndef _TIMEB_H_
+#define _TIMEB_H_
+
+/* All the headers include this file. */
+#include <_mingw.h>
+
+#ifndef RC_INVOKED
+
+/*
+ * TODO: Structure not tested.
+ */
+struct _timeb
+{
+ long time;
+ short millitm;
+ short timezone;
+ short dstflag;
+};
+
+#ifndef _NO_OLDNAMES
+/*
+ * TODO: Structure not tested.
+ */
+struct timeb
+{
+ long time;
+ short millitm;
+ short timezone;
+ short dstflag;
+};
+#endif
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* TODO: Not tested. */
+void _ftime (struct _timeb*);
+
+#ifndef _NO_OLDNAMES
+void ftime (struct timeb*);
+#endif /* Not _NO_OLDNAMES */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* Not RC_INVOKED */
+
+#endif /* Not _TIMEB_H_ */
+
+#endif /* Not __STRICT_ANSI__ */
+
diff --git a/winsup/mingw/include/sys/types.h b/winsup/mingw/include/sys/types.h
new file mode 100644
index 000000000..dce11f51d
--- /dev/null
+++ b/winsup/mingw/include/sys/types.h
@@ -0,0 +1,118 @@
+/*
+ * types.h
+ *
+ * The definition of constants, data types and global variables.
+ *
+ * This file is part of the Mingw32 package.
+ *
+ * Contributors:
+ * Created by Colin Peters <colin@bird.fu.is.saga-u.ac.jp>
+ * Lots of types supplied by Pedro A. Aranda <paag@tid.es>
+ *
+ * THIS SOFTWARE IS NOT COPYRIGHTED
+ *
+ * This source code is offered for use in the public domain. You may
+ * use, modify or distribute it freely.
+ *
+ * This code is distributed in the hope that it will be useful but
+ * WITHOUT ANY WARRANTY. ALL WARRENTIES, EXPRESS OR IMPLIED ARE HEREBY
+ * DISCLAMED. This includes but is not limited to warrenties of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * $Revision$
+ * $Author$
+ * $Date$
+ *
+ */
+
+#ifndef _TYPES_H_
+#define _TYPES_H_
+
+/* All the headers include this file. */
+#include <_mingw.h>
+
+#define __need_wchar_t
+#define __need_size_t
+#define __need_ptrdiff_t
+#ifndef RC_INVOKED
+#include <stddef.h>
+#endif /* Not RC_INVOKED */
+
+#ifndef RC_INVOKED
+
+#ifndef _TIME_T_DEFINED
+typedef long time_t;
+#define _TIME_T_DEFINED
+#endif
+
+
+#ifndef __STRICT_ANSI__
+
+#ifndef _OFF_T_
+#define _OFF_T_
+typedef long _off_t;
+
+#ifndef _NO_OLDNAMES
+typedef _off_t off_t;
+#endif
+#endif /* Not _OFF_T_ */
+
+
+#ifndef _DEV_T_
+#define _DEV_T_
+#ifdef __MSVCRT__
+typedef unsigned int _dev_t;
+#else
+typedef short _dev_t;
+#endif
+
+#ifndef _NO_OLDNAMES
+typedef _dev_t dev_t;
+#endif
+#endif /* Not _DEV_T_ */
+
+
+#ifndef _INO_T_
+#define _INO_T_
+typedef short _ino_t;
+
+#ifndef _NO_OLDNAMES
+typedef _ino_t ino_t;
+#endif
+#endif /* Not _INO_T_ */
+
+
+#ifndef _PID_T_
+#define _PID_T_
+typedef int _pid_t;
+
+#ifndef _NO_OLDNAMES
+typedef _pid_t pid_t;
+#endif
+#endif /* Not _PID_T_ */
+
+
+#ifndef _MODE_T_
+#define _MODE_T_
+typedef unsigned short _mode_t;
+
+#ifndef _NO_OLDNAMES
+typedef _mode_t mode_t;
+#endif
+#endif /* Not _MODE_T_ */
+
+
+#ifndef _SIGSET_T_
+#define _SIGSET_T_
+typedef int _sigset_t;
+
+#ifndef _NO_OLDNAMES
+typedef _sigset_t sigset_t;
+#endif
+#endif /* Not _SIGSET_T_ */
+
+#endif /* Not __STRICT_ANSI__ */
+
+#endif /* Not RC_INVOKED */
+
+#endif /* Not _TYPES_H_ */
diff --git a/winsup/mingw/include/sys/unistd.h b/winsup/mingw/include/sys/unistd.h
new file mode 100644
index 000000000..ed122d9dd
--- /dev/null
+++ b/winsup/mingw/include/sys/unistd.h
@@ -0,0 +1,9 @@
+/*
+ * This file is part of the Mingw32 package.
+ *
+ * unistd.h maps (roughly) to io.h
+ */
+#ifndef __STRICT_ANSI__
+#include <io.h>
+#endif
+
diff --git a/winsup/mingw/include/sys/utime.h b/winsup/mingw/include/sys/utime.h
new file mode 100644
index 000000000..59d00fe2c
--- /dev/null
+++ b/winsup/mingw/include/sys/utime.h
@@ -0,0 +1,89 @@
+/*
+ * utime.h
+ *
+ * Support for the utime function.
+ *
+ * This file is part of the Mingw32 package.
+ *
+ * Contributors:
+ * Created by Colin Peters <colin@bird.fu.is.saga-u.ac.jp>
+ *
+ * THIS SOFTWARE IS NOT COPYRIGHTED
+ *
+ * This source code is offered for use in the public domain. You may
+ * use, modify or distribute it freely.
+ *
+ * This code is distributed in the hope that it will be useful but
+ * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
+ * DISCLAMED. This includes but is not limited to warranties of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * $Revision$
+ * $Author$
+ * $Date$
+ *
+ */
+
+#ifndef __STRICT_ANSI__
+
+#ifndef _UTIME_H_
+#define _UTIME_H_
+
+/* All the headers include this file. */
+#include <_mingw.h>
+
+#define __need_wchar_t
+#define __need_size_t
+#ifndef RC_INVOKED
+#include <stddef.h>
+#endif /* Not RC_INVOKED */
+#include <sys/types.h>
+
+#ifndef RC_INVOKED
+
+/*
+ * Structure used by _utime function.
+ */
+struct _utimbuf
+{
+ time_t actime; /* Access time */
+ time_t modtime; /* Modification time */
+};
+
+
+#ifndef _NO_OLDNAMES
+/* NOTE: Must be the same as _utimbuf above. */
+struct utimbuf
+{
+ time_t actime;
+ time_t modtime;
+};
+#endif /* Not _NO_OLDNAMES */
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+int _utime (const char*, struct _utimbuf*);
+int _futime (int, struct _utimbuf*);
+
+/* The wide character version, only available for MSVCRT versions of the
+ * C runtime library. */
+#ifdef __MSVCRT__
+int _wutime (const wchar_t*, struct _utimbuf*);
+#endif /* MSVCRT runtime */
+#ifndef _NO_OLDNAMES
+int utime (const char*, struct utimbuf*);
+#endif /* Not _NO_OLDNAMES */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* Not RC_INVOKED */
+
+#endif /* Not _UTIME_H_ */
+
+#endif /* Not __STRICT_ANSI__ */
+
diff --git a/winsup/mingw/include/tchar.h b/winsup/mingw/include/tchar.h
new file mode 100644
index 000000000..34fc3c9e7
--- /dev/null
+++ b/winsup/mingw/include/tchar.h
@@ -0,0 +1,261 @@
+/*
+ * tchar.h
+ *
+ * Unicode mapping layer for the standard C library. By including this
+ * file and using the 't' names for string functions
+ * (eg. _tprintf) you can make code which can be easily adapted to both
+ * Unicode and non-unicode environments. In a unicode enabled compile define
+ * _UNICODE before including tchar.h, otherwise the standard non-unicode
+ * library functions will be used.
+ *
+ * Note that you still need to include string.h or stdlib.h etc. to define
+ * the appropriate functions. Also note that there are several defines
+ * included for non-ANSI functions which are commonly available (but using
+ * the convention of prepending an underscore to non-ANSI library function
+ * names).
+ *
+ * This file is part of the Mingw32 package.
+ *
+ * Contributors:
+ * Created by Colin Peters <colin@bird.fu.is.saga-u.ac.jp>
+ *
+ * THIS SOFTWARE IS NOT COPYRIGHTED
+ *
+ * This source code is offered for use in the public domain. You may
+ * use, modify or distribute it freely.
+ *
+ * This code is distributed in the hope that it will be useful but
+ * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
+ * DISCLAMED. This includes but is not limited to warranties of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * $Revision$
+ * $Author$
+ * $Date$
+ *
+ */
+
+#ifndef _TCHAR_H_
+#define _TCHAR_H_
+
+/* All the headers include this file. */
+#include <_mingw.h>
+
+/*
+ * NOTE: This tests _UNICODE, which is different from the UNICODE define
+ * used to differentiate Win32 API calls.
+ */
+#ifdef _UNICODE
+
+
+/*
+ * Use TCHAR instead of char or wchar_t. It will be appropriately translated
+ * if _UNICODE is correctly defined (or not).
+ */
+#ifndef _TCHAR_DEFINED
+#ifndef RC_INVOKED
+typedef wchar_t TCHAR;
+#endif /* Not RC_INVOKED */
+#define _TCHAR_DEFINED
+#endif
+
+
+/*
+ * Enclose constant strings and literal characters in the _TEXT macro to make
+ * them unicode constant strings when _UNICODE is defined.
+ */
+#define _TEXT(x) L ## x
+
+#ifndef _T
+#define _T(x) L ## x
+#endif
+
+/*
+ * Unicode functions
+ */
+
+#define _tprintf wprintf
+#define _ftprintf fwprintf
+#define _stprintf swprintf
+#define _sntprintf _snwprintf
+#define _vtprintf vwprintf
+#define _vftprintf vfwprintf
+#define _vstprintf vswprintf
+#define _vsntprintf _vsnwprintf
+#define _tscanf wscanf
+#define _ftscanf fwscanf
+#define _stscanf swscanf
+#define _fgettc fgetwc
+#define _fgettchar _fgetwchar
+#define _fgetts fgetws
+#define _fputtc fputwc
+#define _fputtchar _fputwchar
+#define _fputts fputws
+#define _gettc getwc
+#define _getts getws
+#define _puttc putwc
+#define _putts putws
+#define _ungettc ungetwc
+#define _tcstod wcstod
+#define _tcstol wcstol
+#define _tcstoul wcstoul
+#define _itot _itow
+#define _ltot _ltow
+#define _ultot _ultow
+#define _ttoi _wtoi
+#define _ttol _wtol
+#define _tcscat wcscat
+#define _tcschr wcschr
+#define _tcscmp wcscmp
+#define _tcscpy wcscpy
+#define _tcscspn wcscspn
+#define _tcslen wcslen
+#define _tcsncat wcsncat
+#define _tcsncmp wcsncmp
+#define _tcsncpy wcsncpy
+#define _tcspbrk wcspbrk
+#define _tcsrchr wcsrchr
+#define _tcsspn wcsspn
+#define _tcsstr wcsstr
+#define _tcstok wcstok
+#define _tcsdup _wcsdup
+#define _tcsicmp _wcsicmp
+#define _tcsnicmp _wcsnicmp
+#define _tcsnset _wcsnset
+#define _tcsrev _wcsrev
+#define _tcsset _wcsset
+#define _tcslwr _wcslwr
+#define _tcsupr _wcsupr
+#define _tcsxfrm wcsxfrm
+#define _tcscoll wcscoll
+#define _tcsicoll _wcsicoll
+#define _istalpha iswalpha
+#define _istupper iswupper
+#define _istlower iswlower
+#define _istdigit iswdigit
+#define _istxdigit iswxdigit
+#define _istspace iswspace
+#define _istpunct iswpunct
+#define _istalnum iswalnum
+#define _istprint iswprint
+#define _istgraph iswgraph
+#define _istcntrl iswcntrl
+#define _istascii iswascii
+#define _totupper towupper
+#define _totlower towlower
+#define _tasctime _wasctime
+#define _tctime _wctime
+#define _tstrdate _wstrdate
+#define _tstrtime _wstrtime
+#define _tutime _wutime
+#define _tcsftime wcsftime
+#define _ttoi _wtoi
+#define _ttol _wtol
+
+#else /* Not _UNICODE */
+
+/*
+ * TCHAR, the type you should use instead of char.
+ */
+#ifndef _TCHAR_DEFINED
+#ifndef RC_INVOKED
+typedef char TCHAR;
+#endif
+#define _TCHAR_DEFINED
+#endif
+
+/*
+ * Enclose constant strings and characters in the _TEXT macro.
+ */
+#define _TEXT(x) x
+
+#ifndef _T
+#define _T(x) x
+#endif
+
+/*
+ * Non-unicode (standard) functions
+ */
+
+#define _tprintf printf
+#define _ftprintf fprintf
+#define _stprintf sprintf
+#define _sntprintf _snprintf
+#define _vtprintf vprintf
+#define _vftprintf vfprintf
+#define _vstprintf vsprintf
+#define _vsntprintf _vsnprintf
+#define _tscanf scanf
+#define _ftscanf fscanf
+#define _stscanf sscanf
+#define _fgettc fgetc
+#define _fgettchar _fgetchar
+#define _fgetts fgets
+#define _fputtc fputc
+#define _fputtchar _fputchar
+#define _fputts fputs
+#define _gettc getc
+#define _getts gets
+#define _puttc putc
+#define _putts puts
+#define _ungettc ungetc
+#define _tcstod strtod
+#define _tcstol strtol
+#define _tcstoul strtoul
+#define _itot _itoa
+#define _ltot _ltoa
+#define _ultot _ultoa
+#define _ttoi atoi
+#define _ttol atol
+#define _tcscat strcat
+#define _tcschr strchr
+#define _tcscmp strcmp
+#define _tcscpy strcpy
+#define _tcscspn strcspn
+#define _tcslen strlen
+#define _tcsncat strncat
+#define _tcsncmp strncmp
+#define _tcsncpy strncpy
+#define _tcspbrk strpbrk
+#define _tcsrchr strrchr
+#define _tcsspn strspn
+#define _tcsstr strstr
+#define _tcstok strtok
+#define _tcsdup _strdup
+#define _tcsicmp _stricmp
+#define _tcsnicmp _strnicmp
+#define _tcsnset _strnset
+#define _tcsrev _strrev
+#define _tcsset _strset
+#define _tcslwr _strlwr
+#define _tcsupr _strupr
+#define _tcsxfrm strxfrm
+#define _tcscoll strcoll
+#define _tcsicoll _stricoll
+#define _istalpha isalpha
+#define _istupper isupper
+#define _istlower islower
+#define _istdigit isdigit
+#define _istxdigit isxdigit
+#define _istspace isspace
+#define _istpunct ispunct
+#define _istalnum isalnum
+#define _istprint isprint
+#define _istgraph isgraph
+#define _istcntrl iscntrl
+#define _istascii isascii
+#define _totupper toupper
+#define _totlower tolower
+#define _tasctime asctime
+#define _tctime ctime
+#define _tstrdate _strdate
+#define _tstrtime _strtime
+#define _tutime _utime
+#define _tcsftime strftime
+#define _ttoi atoi
+#define _ttol atol
+
+#endif /* Not _UNICODE */
+
+#endif /* Not _TCHAR_H_ */
+
diff --git a/winsup/mingw/include/time.h b/winsup/mingw/include/time.h
new file mode 100644
index 000000000..53dd86a5f
--- /dev/null
+++ b/winsup/mingw/include/time.h
@@ -0,0 +1,219 @@
+/*
+ * time.h
+ *
+ * Date and time functions and types.
+ *
+ * This file is part of the Mingw32 package.
+ *
+ * Contributors:
+ * Created by Colin Peters <colin@bird.fu.is.saga-u.ac.jp>
+ *
+ * THIS SOFTWARE IS NOT COPYRIGHTED
+ *
+ * This source code is offered for use in the public domain. You may
+ * use, modify or distribute it freely.
+ *
+ * This code is distributed in the hope that it will be useful but
+ * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
+ * DISCLAMED. This includes but is not limited to warranties of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * $Revision$
+ * $Author$
+ * $Date$
+ *
+ */
+
+#ifndef _TIME_H_
+#define _TIME_H_
+
+/* All the headers include this file. */
+#include <_mingw.h>
+
+#define __need_wchar_t
+#define __need_size_t
+#ifndef RC_INVOKED
+#include <stddef.h>
+#endif /* Not RC_INVOKED */
+
+/*
+ * Need a definition of time_t.
+ */
+#include <sys/types.h>
+
+/*
+ * Number of clock ticks per second. A clock tick is the unit by which
+ * processor time is measured and is returned by 'clock'.
+ */
+#define CLOCKS_PER_SEC 1000.0
+#define CLK_TCK CLOCKS_PER_SEC
+
+
+#ifndef RC_INVOKED
+
+/*
+ * A type for storing the current time and date. This is the number of
+ * seconds since midnight Jan 1, 1970.
+ * NOTE: Normally this is defined by the above include of sys/types.h
+ */
+#ifndef _TIME_T_DEFINED
+typedef long time_t;
+#define _TIME_T_DEFINED
+#endif
+
+/*
+ * A type for measuring processor time (in clock ticks).
+ */
+#ifndef _CLOCK_T_DEFINED
+typedef long clock_t;
+#define _CLOCK_T_DEFINED
+#endif
+
+
+/*
+ * A structure for storing all kinds of useful information about the
+ * current (or another) time.
+ */
+struct tm
+{
+ int tm_sec; /* Seconds: 0-59 (K&R says 0-61?) */
+ int tm_min; /* Minutes: 0-59 */
+ int tm_hour; /* Hours since midnight: 0-23 */
+ int tm_mday; /* Day of the month: 1-31 */
+ int tm_mon; /* Months *since* january: 0-11 */
+ int tm_year; /* Years since 1900 */
+ int tm_wday; /* Days since Sunday (0-6) */
+ int tm_yday; /* Days since Jan. 1: 0-365 */
+ int tm_isdst; /* +1 Daylight Savings Time, 0 No DST,
+ * -1 don't know */
+};
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+clock_t clock (void);
+time_t time (time_t*);
+double difftime (time_t, time_t);
+time_t mktime (struct tm*);
+
+/*
+ * These functions write to and return pointers to static buffers that may
+ * be overwritten by other function calls. Yikes!
+ *
+ * NOTE: localtime, and perhaps the others of the four functions grouped
+ * below may return NULL if their argument is not 'acceptable'. Also note
+ * that calling asctime with a NULL pointer will produce an Invalid Page
+ * Fault and crap out your program. Guess how I know. Hint: stat called on
+ * a directory gives 'invalid' times in st_atime etc...
+ */
+char* asctime (const struct tm*);
+char* ctime (const time_t*);
+struct tm* gmtime (const time_t*);
+struct tm* localtime (const time_t*);
+
+
+size_t strftime (char*, size_t, const char*, const struct tm*);
+
+size_t wcsftime (wchar_t*, size_t, const wchar_t*, const struct tm*);
+
+#ifndef __STRICT_ANSI__
+extern void _tzset (void);
+
+#ifndef _NO_OLDNAMES
+extern void tzset (void);
+#endif
+
+size_t strftime(char*, size_t, const char*, const struct tm*);
+char* _strdate(char*);
+char* _strtime(char*);
+
+#endif /* Not __STRICT_ANSI__ */
+
+/*
+ * _daylight: non zero if daylight savings time is used.
+ * _timezone: difference in seconds between GMT and local time.
+ * _tzname: standard/daylight savings time zone names (an array with two
+ * elements).
+ */
+#ifdef __MSVCRT__
+
+/* These are for compatibility with pre-VC 5.0 suppied MSVCRT. */
+extern int* __p__daylight (void);
+extern long* __p__timezone (void);
+extern char** __p__tzname (void);
+
+__MINGW_IMPORT int _daylight;
+__MINGW_IMPORT long _timezone;
+__MINGW_IMPORT char *_tzname[2];
+
+#else /* not __MSVCRT (ie. crtdll) */
+
+#ifndef __DECLSPEC_SUPPORTED
+
+extern int* __imp__daylight_dll;
+extern long* __imp__timezone_dll;
+extern char** __imp__tzname;
+
+#define _daylight (*__imp__daylight_dll)
+#define _timezone (*__imp__timezone_dll)
+#define _tzname (__imp__tzname)
+
+#else /* __DECLSPEC_SUPPORTED */
+
+__MINGW_IMPORT int _daylight_dll;
+__MINGW_IMPORT long _timezone_dll;
+__MINGW_IMPORT char* _tzname[2];
+
+#define _daylight _daylight_dll
+#define _timezone _timezone_dll
+
+#endif /* __DECLSPEC_SUPPORTED */
+
+#endif /* not __MSVCRT__ */
+
+#ifndef _NO_OLDNAMES
+
+#ifdef __MSVCRT__
+
+/* These go in the oldnames import library for MSVCRT. */
+__MINGW_IMPORT int daylight;
+__MINGW_IMPORT long timezone;
+__MINGW_IMPORT char *tzname[2];
+
+#ifndef _WTIME_DEFINED
+
+/* wide function prototypes, also declared in wchar.h */
+
+wchar_t * _wasctime(const struct tm*);
+wchar_t * _wctime(const time_t*);
+wchar_t* _wstrdate(wchar_t*);
+wchar_t* _wstrtime(wchar_t*);
+
+#define _WTIME_DEFINED
+#endif /* _WTIME_DEFINED */
+
+
+#else /* not __MSVCRT__ */
+
+/* CRTDLL is royally messed up when it comes to these macros.
+ TODO: import and alias these via oldnames import library instead
+ of macros. */
+
+#define daylight _daylight
+/* NOTE: timezone not defined because it would conflict with sys/timeb.h.
+ Also, tzname used to a be macro, but now it's in moldname. */
+__MINGW_IMPORT char *tzname[2];
+
+#endif /* not __MSVCRT__ */
+
+#endif /* Not _NO_OLDNAMES */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* Not RC_INVOKED */
+
+#endif /* Not _TIME_H_ */
+
diff --git a/winsup/mingw/include/unistd.h b/winsup/mingw/include/unistd.h
new file mode 100644
index 000000000..8f51f7661
--- /dev/null
+++ b/winsup/mingw/include/unistd.h
@@ -0,0 +1,10 @@
+/*
+ * This file is part of the Mingw32 package.
+ *
+ * unistd.h maps (roughly) to io.h
+ */
+
+#ifndef __STRICT_ANSI__
+#include <io.h>
+#endif
+
diff --git a/winsup/mingw/include/values.h b/winsup/mingw/include/values.h
new file mode 100644
index 000000000..10e16a281
--- /dev/null
+++ b/winsup/mingw/include/values.h
@@ -0,0 +1,4 @@
+/*
+ * TODO: Nothing here yet. Should provide UNIX compatibility constants
+ * comparible to those in limits.h and float.h.
+ */
diff --git a/winsup/mingw/include/varargs.h b/winsup/mingw/include/varargs.h
new file mode 100644
index 000000000..48e203b24
--- /dev/null
+++ b/winsup/mingw/include/varargs.h
@@ -0,0 +1,98 @@
+/*
+ * varargs.h
+ *
+ * Old, non-ANSI facilities for stepping through a list of function
+ * arguments of an unknown number and type.
+ * TODO: Has not been tested. Essentially it copies the GCC version.
+ *
+ * NOTE: I believe GCC supplies a version of this header as well (in
+ * addition to stdarg.h and others). The GCC version is more
+ * complex, to deal with many alternate systems, but it is
+ * probably more trustworthy overall. It would probably be
+ * better to use the GCC version.
+ *
+ * NOTE: These are incompatible with the versions in stdarg.h and should
+ * NOT be mixed! All new code should use the ANSI compatible versions.
+ *
+ * This file is part of the Mingw32 package.
+ *
+ * Contributors:
+ * Created by Colin Peters <colin@bird.fu.is.saga-u.ac.jp>
+ *
+ * THIS SOFTWARE IS NOT COPYRIGHTED
+ *
+ * This source code is offered for use in the public domain. You may
+ * use, modify or distribute it freely.
+ *
+ * This code is distributed in the hope that it will be useful but
+ * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
+ * DISCLAMED. This includes but is not limited to warranties of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * $Revision$
+ * $Author$
+ * $Date$
+ *
+ */
+
+#ifndef __STRICT_ANSI__
+
+#ifndef _VARARGS_H_
+#define _VARARGS_H_
+
+/* All the headers include this file. */
+#include <_mingw.h>
+
+/*
+ * I was told that Win NT likes this.
+ */
+#ifndef _VA_LIST_DEFINED
+#define _VA_LIST_DEFINED
+#endif
+
+#ifndef RC_INVOKED
+
+#ifndef _VA_LIST
+#define _VA_LIST
+typedef char* va_list;
+#endif
+
+/*
+ * Amount of space required in an argument list (ie. the stack) for an
+ * argument of type t.
+ */
+#define __va_argsiz(t) \
+ (((sizeof(t) + sizeof(int) - 1) / sizeof(int)) * sizeof(int))
+
+#define va_alist __builtin_va_alist
+
+/*
+ * Used in old style argument lists IIRC. The ellipsis forces the compiler
+ * to realize this is a vararg function.
+ */
+#define va_dcl int __builtin_va_alist; ...
+
+#define va_start(ap) \
+ ((ap) = ((va_list) &__builtin_va_alist))
+#define va_end(ap) ((void)0)
+
+
+/*
+ * Increment ap to the next argument in the list while returing a
+ * pointer to what ap pointed to first, which is of type t.
+ *
+ * We cast to void* and then to t* because this avoids a warning about
+ * increasing the alignment requirement.
+ */
+
+#define va_arg(ap, t) \
+ (((ap) = (ap) + __va_argsiz(t)), \
+ *((t*) (void*) ((ap) - __va_argsiz(t))))
+
+
+#endif /* Not RC_INVOKED */
+
+#endif /* Not _VARARGS_H_ */
+
+#endif /* Not __STRICT_ANSI__ */
+
diff --git a/winsup/mingw/include/wchar.h b/winsup/mingw/include/wchar.h
new file mode 100644
index 000000000..d2bc09415
--- /dev/null
+++ b/winsup/mingw/include/wchar.h
@@ -0,0 +1,212 @@
+/*
+ * wchar.h
+ *
+ * Defines of all functions for supporting wide characters. Actually it
+ * just includes all those headers, which is not a good thing to do from a
+ * processing time point of view, but it does mean that everything will be
+ * in sync.
+ *
+ * This file is part of the Mingw32 package.
+ *
+ * THIS SOFTWARE IS NOT COPYRIGHTED
+ *
+ * This source code is offered for use in the public domain. You may
+ * use, modify or distribute it freely.
+ *
+ * This code is distributed in the hope that it will be useful but
+ * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
+ * DISCLAMED. This includes but is not limited to warranties of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * $Revision$
+ * $Author$
+ * $Date$
+ *
+ */
+
+#ifndef _WCHAR_H_
+#define _WCHAR_H_
+
+/* All the headers include this file. */
+#include <_mingw.h>
+
+#include <ctype.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include <sys/types.h>
+
+#define __need_size_t
+#define __need_wint_t
+#define __need_wchar_t
+#ifndef RC_INVOKED
+#include <stddef.h>
+#endif /* Not RC_INVOKED */
+
+#define WCHAR_MIN 0
+#define WCHAR_MAX ((wchar_t)-1)
+
+#ifndef RC_INVOKED
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef __STRICT_ANSI__
+
+#ifndef _FSIZE_T_DEFINED
+typedef unsigned long _fsize_t;
+#define _FSIZE_T_DEFINED
+#endif
+
+#ifndef _WFINDDATA_T_DEFINED
+struct _wfinddata_t {
+ unsigned attrib;
+ time_t time_create; /* -1 for FAT file systems */
+ time_t time_access; /* -1 for FAT file systems */
+ time_t time_write;
+ _fsize_t size;
+ wchar_t name[FILENAME_MAX]; /* may include spaces. */
+};
+#define _WFINDDATA_T_DEFINED
+#endif
+
+/* Wide character versions. Also defined in io.h. */
+/* CHECK: I believe these only exist in MSVCRT, and not in CRTDLL. Also
+ applies to other wide character versions? */
+int _waccess(const wchar_t *, int);
+int _wchmod(const wchar_t *, int);
+int _wcreat(const wchar_t *, int);
+long _wfindfirst(wchar_t *, struct _wfinddata_t *);
+int _wfindnext(long, struct _wfinddata_t *);
+int _wunlink(const wchar_t *);
+int _wrename(const wchar_t *, const wchar_t *);
+int _wremove (const wchar_t *);
+int _wopen(const wchar_t *, int, ...);
+int _wsopen(const wchar_t *, int, int, ...);
+wchar_t * _wmktemp(wchar_t *);
+
+#ifndef _WDIRECT_DEFINED
+
+/* Also in direct.h */
+
+int _wchdir(const wchar_t*);
+wchar_t* _wgetcwd(wchar_t*, int);
+wchar_t* _wgetdcwd(int, wchar_t*, int);
+int _wmkdir(const wchar_t*);
+int _wrmdir(const wchar_t*);
+
+#define _WDIRECT_DEFINED
+#endif
+
+#ifndef _STAT_DEFINED
+/*
+ * The structure manipulated and returned by stat and fstat.
+ *
+ * NOTE: If called on a directory the values in the time fields are not only
+ * invalid, they will cause localtime et. al. to return NULL. And calling
+ * asctime with a NULL pointer causes an Invalid Page Fault. So watch it!
+ */
+struct _stat
+{
+ _dev_t st_dev; /* Equivalent to drive number 0=A 1=B ... */
+ _ino_t st_ino; /* Always zero ? */
+ _mode_t st_mode; /* See above constants */
+ short st_nlink; /* Number of links. */
+ short st_uid; /* User: Maybe significant on NT ? */
+ short st_gid; /* Group: Ditto */
+ _dev_t st_rdev; /* Seems useless (not even filled in) */
+ _off_t st_size; /* File size in bytes */
+ time_t st_atime; /* Accessed date (always 00:00 hrs local
+ * on FAT) */
+ time_t st_mtime; /* Modified time */
+ time_t st_ctime; /* Creation time */
+};
+
+struct stat
+{
+ _dev_t st_dev; /* Equivalent to drive number 0=A 1=B ... */
+ _ino_t st_ino; /* Always zero ? */
+ _mode_t st_mode; /* See above constants */
+ short st_nlink; /* Number of links. */
+ short st_uid; /* User: Maybe significant on NT ? */
+ short st_gid; /* Group: Ditto */
+ _dev_t st_rdev; /* Seems useless (not even filled in) */
+ _off_t st_size; /* File size in bytes */
+ time_t st_atime; /* Accessed date (always 00:00 hrs local
+ * on FAT) */
+ time_t st_mtime; /* Modified time */
+ time_t st_ctime; /* Creation time */
+};
+
+#define _STAT_DEFINED
+#endif /* _STAT_DEFINED */
+
+#ifndef _WSTAT_DEFINED
+
+/* also declared in sys/stat.h */
+
+int _wstat(const wchar_t *, struct _stat *);
+
+#define _WSTAT_DEFINED
+#endif /* _WSTAT_DEFINED */
+
+#ifndef _WTIME_DEFINED
+#ifdef __MSVCRT__
+
+/* wide function prototypes, also declared in time.h */
+
+wchar_t * _wasctime(const struct tm*);
+wchar_t * _wctime(const time_t*);
+wchar_t* _wstrdate(wchar_t*);
+wchar_t* _wstrtime(wchar_t*);
+
+#endif /* __MSVCRT__ */
+
+size_t wcsftime(wchar_t*, size_t, const wchar_t*, const struct tm*);
+
+#define _WTIME_DEFINED
+#endif /* _WTIME_DEFINED */
+
+
+#ifndef _NO_OLDNAMES
+
+/* Wide character versions. Also declared in wchar.h. */
+/* CHECK: Are these in the olnames??? */
+int waccess(const wchar_t *, int);
+int wchmod(const wchar_t *, int);
+int wcreat(const wchar_t *, int);
+long wfindfirst(wchar_t *, struct _wfinddata_t *);
+int wfindnext(long, struct _wfinddata_t *);
+int wunlink(const wchar_t *);
+int wrename(const wchar_t *, const wchar_t *);
+int wremove (const wchar_t *);
+int wopen(const wchar_t *, int, ...);
+int wsopen(const wchar_t *, int, int, ...);
+wchar_t * wmktemp(wchar_t *);
+
+#endif /* _NO_OLDNAMES */
+
+#endif /* not __STRICT_ANSI__ */
+
+typedef int mbstate_t;
+typedef wchar_t _Wint_t;
+
+wint_t btowc(int);
+size_t mbrlen(const char *, size_t, mbstate_t *);
+size_t mbrtowc(wchar_t *, const char *, size_t, mbstate_t *);
+size_t mbsrtowcs(wchar_t *, const char **, size_t, mbstate_t *);
+
+size_t wcrtomb(char *, wchar_t, mbstate_t *);
+size_t wcsrtombs(char *, const wchar_t **, size_t, mbstate_t *);
+int wctob(wint_t);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* Not RC_INVOKED */
+
+#endif /* not _WCHAR_H_ */
+
diff --git a/winsup/mingw/include/wctype.h b/winsup/mingw/include/wctype.h
new file mode 100644
index 000000000..3dc5ae2df
--- /dev/null
+++ b/winsup/mingw/include/wctype.h
@@ -0,0 +1,99 @@
+/*
+ * wctype.h
+ *
+ * Functions for testing wide character types and converting characters.
+ *
+ * This file is part of the Mingw32 package.
+ *
+ * Contributors:
+ * Created by Mumit Khan <khan@xraylith.wisc.edu>
+ *
+ * THIS SOFTWARE IS NOT COPYRIGHTED
+ *
+ * This source code is offered for use in the public domain. You may
+ * use, modify or distribute it freely.
+ *
+ * This code is distributed in the hope that it will be useful but
+ * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
+ * DISCLAMED. This includes but is not limited to warranties of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ */
+
+#ifndef _WCTYPE_H_
+#define _WCTYPE_H_
+
+/* All the headers include this file. */
+#include <_mingw.h>
+
+#define __need_wchar_t
+#define __need_wint_t
+#ifndef RC_INVOKED
+#include <stddef.h>
+#endif /* Not RC_INVOKED */
+
+/*
+ * The following flags are used to tell iswctype and _isctype what character
+ * types you are looking for.
+ */
+#define _UPPER 0x0001
+#define _LOWER 0x0002
+#define _DIGIT 0x0004
+#define _SPACE 0x0008
+#define _PUNCT 0x0010
+#define _CONTROL 0x0020
+#define _BLANK 0x0040
+#define _HEX 0x0080
+#define _LEADBYTE 0x8000
+
+#define _ALPHA 0x0103
+
+#ifndef RC_INVOKED
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef WEOF
+#define WEOF (wchar_t)(0xFFFF)
+#endif
+
+#ifndef _WCTYPE_T_DEFINED
+typedef wchar_t wctype_t;
+#define _WCTYPE_T_DEFINED
+#endif
+
+/* Wide character equivalents */
+int iswalnum(wint_t);
+int iswalpha(wint_t);
+int iswascii(wint_t);
+int iswcntrl(wint_t);
+int iswctype(wint_t, wctype_t);
+int is_wctype(wint_t, wctype_t); /* Obsolete! */
+int iswdigit(wint_t);
+int iswgraph(wint_t);
+int iswlower(wint_t);
+int iswprint(wint_t);
+int iswpunct(wint_t);
+int iswspace(wint_t);
+int iswupper(wint_t);
+int iswxdigit(wint_t);
+
+wchar_t towlower(wchar_t);
+wchar_t towupper(wchar_t);
+
+int isleadbyte (int);
+
+typedef wchar_t wctrans_t;
+wint_t towctrans(wint_t, wctrans_t);
+wctrans_t wctrans(const char*);
+wctype_t wctype(const char*);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* Not RC_INVOKED */
+
+#endif /* Not _WCTYPE_H_ */
+
diff --git a/winsup/mingw/init.c b/winsup/mingw/init.c
new file mode 100644
index 000000000..8fa4652fa
--- /dev/null
+++ b/winsup/mingw/init.c
@@ -0,0 +1,84 @@
+/*
+ * init.c
+ *
+ * Code to initialize standard file handles and command line arguments.
+ * This file is #included in both crt1.c and dllcrt1.c.
+ *
+ * This file is part of the Mingw32 package.
+ *
+ * Contributors:
+ * Created by Colin Peters <colin@bird.fu.is.saga-u.ac.jp>
+ * Maintained by Mumit Khan <khan@xraylith.wisc.EDU>
+ *
+ * THIS SOFTWARE IS NOT COPYRIGHTED
+ *
+ * This source code is offered for use in the public domain. You may
+ * use, modify or distribute it freely.
+ *
+ * This code is distributed in the hope that it will be useful but
+ * WITHOUT ANY WARRANTY. ALL WARRENTIES, EXPRESS OR IMPLIED ARE HEREBY
+ * DISCLAMED. This includes but is not limited to warrenties of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * $Revision$
+ * $Author$
+ * $Date$
+ *
+ */
+
+/*
+ * Access to a standard 'main'-like argument count and list. Also included
+ * is a table of environment variables.
+ */
+int _argc = 0;
+char **_argv = 0;
+
+/* NOTE: Thanks to Pedro A. Aranda Gutiirrez <paag@tid.es> for pointing
+ * this out to me. GetMainArgs (used below) takes a fourth argument
+ * which is an int that controls the globbing of the command line. If
+ * _CRT_glob is non-zero the command line will be globbed (e.g. *.*
+ * expanded to be all files in the startup directory). In the mingw32
+ * library a _CRT_glob variable is defined as being -1, enabling
+ * this command line globbing by default. To turn it off and do all
+ * command line processing yourself (and possibly escape bogons in
+ * MS's globbing code) include a line in one of your source modules
+ * defining _CRT_glob and setting it to zero, like this:
+ * int _CRT_glob = 0;
+ */
+extern int _CRT_glob;
+
+#ifdef __MSVCRT__
+typedef struct {
+ int newmode;
+} _startupinfo;
+extern void __getmainargs (int *, char ***, char ***, int, _startupinfo *);
+#else
+extern void __GetMainArgs (int *, char ***, char ***, int);
+#endif
+
+/*
+ * Initialize the _argc, _argv and environ variables.
+ */
+static void
+_mingw32_init_mainargs ()
+{
+ /* The environ variable is provided directly in stdlib.h through
+ * a dll function call. */
+ char **dummy_environ;
+#ifdef __MSVCRT__
+ _startupinfo start_info;
+ start_info.newmode = 0;
+#endif
+
+ /*
+ * Microsoft's runtime provides a function for doing just that.
+ */
+#ifdef __MSVCRT__
+ (void) __getmainargs (&_argc, &_argv, &dummy_environ, _CRT_glob,
+ &start_info);
+#else
+ /* CRTDLL version */
+ (void) __GetMainArgs (&_argc, &_argv, &dummy_environ, _CRT_glob);
+#endif
+}
+
diff --git a/winsup/mingw/jamfile b/winsup/mingw/jamfile
new file mode 100644
index 000000000..1769d952d
--- /dev/null
+++ b/winsup/mingw/jamfile
@@ -0,0 +1,72 @@
+#
+# Jamfile for building various libraries and object files for the
+# Minimalist GNU-Win32 package.
+#
+# $Revision$
+# $Author$
+# $Date$
+#
+
+# Change this line if you have installed Mingw32 in another directory.
+#
+LOCATE_TARGET = /mingw32/lib ;
+
+RUNTIME default = crtdll ;
+
+# Build the mingw32 library which contains startup code and extra support
+# routines.
+#
+Library libmingw32.a :
+ CRTglob.c
+ CRTfmode.c
+ CRTinit.c
+ dirent.c
+ dllmain.c
+ gccmain.c
+ main.c
+ ;
+
+
+# Build the startup object files for normal applications and for DLLs.
+# The crt2 and dllcrt2 versions are for MSVCRTxx.DLL runtimes. crt1 and
+# dllcrt1 are for the CRTDLL.DLL runtime.
+#
+Object crt1.o : crt1.c ;
+Object crt2.o : crt1.c ;
+
+CCFLAGS on crt2.o += -D__MSVCRT__ ;
+
+Object dllcrt1.o : dllcrt1.c ;
+Object dllcrt2.o : dllcrt1.c ;
+
+CCFLAGS on dllcrt2.o += -D__MSVCRT__ ;
+
+DEPENDS all : crt1.o dllcrt1.o crt2.o dllcrt2.o ;
+
+
+# Build an object file which contains a single global variable initialized
+# so that globbing will not be performed on the command line.
+#
+Object CRT_noglob.o : CRT_noglob.c ;
+LOCATE on CRT_noglob.o = $(LOCATE_TARGET) ;
+
+DEPENDS all : CRT_noglob.o ;
+
+
+# Build a special import library which contains mostly the imports defined
+# in moldname.def, but with their leading underscores stripped off, plus the
+# extra code in the C modules included.
+#
+ImportLib libmoldname.a : moldname.def ctype_old.c string_old.c ;
+
+DLLNAME on libmoldname.a = $(RUNTIME).dll ;
+DLLTOOLFLAGS on libmoldname.a += -U ;
+
+
+# Build import libraries for the various runtimes.
+#
+ImportLib libcrtdll.a : crtdll.def ;
+ImportLib libmsvcrt.a : msvcrt.def ;
+ImportLib libmsvcrt20.a : msvcrt20.def ;
+ImportLib libmsvcrt40.a : msvcrt40.def ;
+
diff --git a/winsup/mingw/main.c b/winsup/mingw/main.c
new file mode 100644
index 000000000..ea1dcd85e
--- /dev/null
+++ b/winsup/mingw/main.c
@@ -0,0 +1,96 @@
+/*
+ * main.c
+ *
+ * Extra startup code for applications which do not have a main function
+ * of their own (but do have a WinMain). Generally these are GUI
+ * applications, but they don't *have* to be.
+ *
+ * This file is part of the Mingw32 package.
+ *
+ * Contributors:
+ * Created by Colin Peters <colin@bird.fu.is.saga-u.ac.jp>
+ * Maintained by Mumit Khan <khan@xraylith.wisc.EDU>
+ *
+ * THIS SOFTWARE IS NOT COPYRIGHTED
+ *
+ * This source code is offered for use in the public domain. You may
+ * use, modify or distribute it freely.
+ *
+ * This code is distributed in the hope that it will be useful but
+ * WITHOUT ANY WARRANTY. ALL WARRENTIES, EXPRESS OR IMPLIED ARE HEREBY
+ * DISCLAMED. This includes but is not limited to warrenties of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * $Revision$
+ * $Author$
+ * $Date$
+ *
+ */
+
+#include <stdlib.h>
+#include <process.h>
+#include <windows.h>
+
+#define ISSPACE(a) (a == ' ' || a == '\t')
+
+extern int PASCAL WinMain (HINSTANCE hInst, HINSTANCE hPrevInst,
+ LPSTR szCmdLine, int nShow);
+
+int
+main (int argc, char *argv[], char *environ[])
+{
+ char *szCmd;
+ STARTUPINFO startinfo;
+ int nRet;
+
+ /* Get the command line passed to the process. */
+ szCmd = GetCommandLineA ();
+ GetStartupInfoA (&startinfo);
+
+ /* Strip off the name of the application and any leading
+ * whitespace. */
+ if (szCmd)
+ {
+ while (ISSPACE (*szCmd))
+ {
+ szCmd++;
+ }
+
+ /* On my system I always get the app name enclosed
+ * in quotes... */
+ if (*szCmd == '\"')
+ {
+ do
+ {
+ szCmd++;
+ }
+ while (*szCmd != '\"' && *szCmd != '\0');
+
+ if (*szCmd == '\"')
+ {
+ szCmd++;
+ }
+ }
+ else
+ {
+ /* If no quotes then assume first token is program
+ * name. */
+ while (!ISSPACE (*szCmd) && *szCmd != '\0')
+ {
+ szCmd++;
+ }
+ }
+
+ while (ISSPACE (*szCmd))
+ {
+ szCmd++;
+ }
+ }
+
+ nRet = WinMain (GetModuleHandle (NULL), NULL, szCmd,
+ (startinfo.dwFlags & STARTF_USESHOWWINDOW) ?
+ startinfo.wShowWindow : SW_SHOWDEFAULT);
+
+ return nRet;
+}
+
diff --git a/winsup/mingw/moldname-crtdll.def b/winsup/mingw/moldname-crtdll.def
new file mode 100644
index 000000000..3ead24436
--- /dev/null
+++ b/winsup/mingw/moldname-crtdll.def
@@ -0,0 +1,135 @@
+;
+; moldname-crtdll.def
+;
+; Exports from the runtime except that these exports are actually preceeded
+; by a underscore in the actual DLL. These correspond to functions which
+; are non-ANSI and were prefixed with an underscore to avoid name space
+; clutter. However many, in fact most programs still use a few of these
+; functions without the underscore. This .def file is specially processed
+; to make those non-underscored name function calls call the equivalent
+; underscored functions.
+;
+; Contributors:
+; Created by Colin Peters <colin@bird.fu.is.saga-u.ac.jp>
+; Maintained by Mumit Khan <khan@xraylith.wisc.edu>
+;
+; THIS SOFTWARE IS NOT COPYRIGHTED
+;
+; This source code is offered for use in the public domain. You may
+; use, modify or distribute it freely.
+;
+; This code is distributed in the hope that it will be useful but
+; WITHOUT ANY WARRANTY. ALL WARRENTIES, EXPRESS OR IMPLIED ARE HEREBY
+; DISCLAMED. This includes but is not limited to warrenties of
+; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+;
+EXPORTS
+access
+beep
+cabs
+chdir
+chmod
+chsize
+close
+creat
+cwait
+
+dup
+dup2
+ecvt
+eof
+execl
+execle
+execlp
+execlpe
+execv
+execve
+execvp
+execvpe
+fcvt
+fdopen
+fgetchar
+fgetwchar
+filelength
+fileno
+fpreset
+fputchar
+fputwchar
+fstat
+ftime
+gcvt
+getch
+getche
+getcwd
+getpid
+getw
+heapwalk
+hypot
+isatty
+itoa
+j0
+j1
+jn
+kbhit
+lseek
+ltoa
+memccpy
+memicmp
+mkdir
+mktemp
+open
+pclose
+popen
+putch
+putenv
+putw
+read
+rmdir
+searchenv
+seterrormode
+setmode
+sleep
+sopen
+spawnl
+spawnle
+spawnlp
+spawnlpe
+spawnv
+spawnve
+spawnvp
+spawnvpe
+stat
+strcmpi
+strdup
+stricmp
+stricoll
+strlwr
+strnicmp
+strnset
+strrev
+strset
+strupr
+swab
+tell
+tempnam
+
+; export tzname for both. See <time.h>
+tzname DATA
+tzset
+umask
+ungetch
+unlink
+utime
+wcsdup
+wcsicmp
+wcsicoll
+wcslwr
+wcsnicmp
+wcsnset
+wcsrev
+wcsset
+wcsupr
+write
+y0
+y1
+yn
diff --git a/winsup/mingw/moldname-msvcrt.def b/winsup/mingw/moldname-msvcrt.def
new file mode 100644
index 000000000..0e0d39c31
--- /dev/null
+++ b/winsup/mingw/moldname-msvcrt.def
@@ -0,0 +1,139 @@
+;
+; moldname-msvcrt.def
+;
+; Exports from the runtime except that these exports are actually preceeded
+; by a underscore in the actual DLL. These correspond to functions which
+; are non-ANSI and were prefixed with an underscore to avoid name space
+; clutter. However many, in fact most programs still use a few of these
+; functions without the underscore. This .def file is specially processed
+; to make those non-underscored name function calls call the equivalent
+; underscored functions.
+;
+; Contributors:
+; Created by Colin Peters <colin@bird.fu.is.saga-u.ac.jp>
+; Maintained by Mumit Khan <khan@xraylith.wisc.edu>
+;
+; THIS SOFTWARE IS NOT COPYRIGHTED
+;
+; This source code is offered for use in the public domain. You may
+; use, modify or distribute it freely.
+;
+; This code is distributed in the hope that it will be useful but
+; WITHOUT ANY WARRANTY. ALL WARRENTIES, EXPRESS OR IMPLIED ARE HEREBY
+; DISCLAMED. This includes but is not limited to warrenties of
+; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+;
+EXPORTS
+access
+beep
+cabs
+chdir
+chmod
+chsize
+close
+creat
+cwait
+
+daylight DATA
+
+dup
+dup2
+ecvt
+eof
+execl
+execle
+execlp
+execlpe
+execv
+execve
+execvp
+execvpe
+fcvt
+fdopen
+fgetchar
+fgetwchar
+filelength
+fileno
+fpreset
+fputchar
+fputwchar
+fstat
+ftime
+gcvt
+getch
+getche
+getcwd
+getpid
+getw
+heapwalk
+hypot
+isatty
+itoa
+j0
+j1
+jn
+kbhit
+lseek
+ltoa
+memccpy
+memicmp
+mkdir
+mktemp
+open
+pclose
+popen
+putch
+putenv
+putw
+read
+rmdir
+searchenv
+seterrormode
+setmode
+sleep
+sopen
+spawnl
+spawnle
+spawnlp
+spawnlpe
+spawnv
+spawnve
+spawnvp
+spawnvpe
+stat
+strcmpi
+strdup
+stricmp
+stricoll
+strlwr
+strnicmp
+strnset
+strrev
+strset
+strupr
+swab
+tell
+tempnam
+
+timezone DATA
+
+; export tzname for both. See <time.h>
+tzname DATA
+tzset
+umask
+ungetch
+unlink
+utime
+wcsdup
+wcsicmp
+wcsicoll
+wcslwr
+wcsnicmp
+wcsnset
+wcsrev
+wcsset
+wcsupr
+write
+y0
+y1
+yn
diff --git a/winsup/mingw/moldname.def b/winsup/mingw/moldname.def
new file mode 100644
index 000000000..369439b5c
--- /dev/null
+++ b/winsup/mingw/moldname.def
@@ -0,0 +1,137 @@
+;
+; moldname.def
+;
+; Exports from the runtime except that these exports are actually preceeded
+; by a underscore in the actual DLL. These correspond to functions which
+; are non-ANSI and were prefixed with an underscore to avoid name space
+; clutter. However many, in fact most programs still use a few of these
+; functions without the underscore. This .def file is specially processed
+; to make those non-underscored name function calls call the equivalent
+; underscored functions.
+;
+; NOTE: All the names currently included are available from both msvcrt and
+; crtdll. This may change in the future and require a new .def to be
+; created.
+;
+; Contributors:
+; Created by Colin Peters <colin@bird.fu.is.saga-u.ac.jp>
+;
+; THIS SOFTWARE IS NOT COPYRIGHTED
+;
+; This source code is offered for use in the public domain. You may
+; use, modify or distribute it freely.
+;
+; This code is distributed in the hope that it will be useful but
+; WITHOUT ANY WARRANTY. ALL WARRENTIES, EXPRESS OR IMPLIED ARE HEREBY
+; DISCLAMED. This includes but is not limited to warrenties of
+; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+;
+; $Revision$
+; $Author$
+; $Date$
+;
+EXPORTS
+access
+beep
+cabs
+chdir
+chmod
+chsize
+close
+creat
+cwait
+dup
+dup2
+ecvt
+eof
+execl
+execle
+execlp
+execlpe
+execv
+execve
+execvp
+execvpe
+fcvt
+fdopen
+fgetchar
+fgetwchar
+filelength
+fileno
+fputchar
+fputwchar
+fstat
+ftime
+gcvt
+getch
+getche
+getcwd
+getpid
+getw
+heapwalk
+hypot
+isatty
+itoa
+j0
+j1
+jn
+kbhit
+lseek
+ltoa
+memccpy
+memicmp
+mkdir
+mktemp
+open
+pclose
+popen
+putch
+putenv
+putw
+read
+rmdir
+searchenv
+seterrormode
+setmode
+sleep
+sopen
+spawnl
+spawnle
+spawnlp
+spawnlpe
+spawnv
+spawnve
+spawnvp
+spawnvpe
+stat
+strcmpi
+strdup
+stricmp
+stricoll
+strlwr
+strnicmp
+strnset
+strrev
+strset
+strupr
+swab
+tell
+tempnam
+tzset
+umask
+ungetch
+unlink
+utime
+wcsdup
+wcsicmp
+wcsicoll
+wcslwr
+wcsnicmp
+wcsnset
+wcsrev
+wcsset
+wcsupr
+write
+y0
+y1
+yn
diff --git a/winsup/mingw/moldname.def.in b/winsup/mingw/moldname.def.in
new file mode 100644
index 000000000..7e90cb374
--- /dev/null
+++ b/winsup/mingw/moldname.def.in
@@ -0,0 +1,139 @@
+;
+; __FILENAME__
+;
+; Exports from the runtime except that these exports are actually preceeded
+; by a underscore in the actual DLL. These correspond to functions which
+; are non-ANSI and were prefixed with an underscore to avoid name space
+; clutter. However many, in fact most programs still use a few of these
+; functions without the underscore. This .def file is specially processed
+; to make those non-underscored name function calls call the equivalent
+; underscored functions.
+;
+; Contributors:
+; Created by Colin Peters <colin@bird.fu.is.saga-u.ac.jp>
+; Maintained by Mumit Khan <khan@xraylith.wisc.edu>
+;
+; THIS SOFTWARE IS NOT COPYRIGHTED
+;
+; This source code is offered for use in the public domain. You may
+; use, modify or distribute it freely.
+;
+; This code is distributed in the hope that it will be useful but
+; WITHOUT ANY WARRANTY. ALL WARRENTIES, EXPRESS OR IMPLIED ARE HEREBY
+; DISCLAMED. This includes but is not limited to warrenties of
+; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+;
+EXPORTS
+access
+beep
+cabs
+chdir
+chmod
+chsize
+close
+creat
+cwait
+#if (__MSVCRT__)
+daylight DATA
+#endif
+dup
+dup2
+ecvt
+eof
+execl
+execle
+execlp
+execlpe
+execv
+execve
+execvp
+execvpe
+fcvt
+fdopen
+fgetchar
+fgetwchar
+filelength
+fileno
+fpreset
+fputchar
+fputwchar
+fstat
+ftime
+gcvt
+getch
+getche
+getcwd
+getpid
+getw
+heapwalk
+hypot
+isatty
+itoa
+j0
+j1
+jn
+kbhit
+lseek
+ltoa
+memccpy
+memicmp
+mkdir
+mktemp
+open
+pclose
+popen
+putch
+putenv
+putw
+read
+rmdir
+searchenv
+seterrormode
+setmode
+sleep
+sopen
+spawnl
+spawnle
+spawnlp
+spawnlpe
+spawnv
+spawnve
+spawnvp
+spawnvpe
+stat
+strcmpi
+strdup
+stricmp
+stricoll
+strlwr
+strnicmp
+strnset
+strrev
+strset
+strupr
+swab
+tell
+tempnam
+#if (__MSVCRT__)
+timezone DATA
+#endif
+; export tzname for both. See <time.h>
+tzname DATA
+tzset
+umask
+ungetch
+unlink
+utime
+wcsdup
+wcsicmp
+wcsicoll
+wcslwr
+wcsnicmp
+wcsnset
+wcsrev
+wcsset
+wcsupr
+write
+y0
+y1
+yn
diff --git a/winsup/mingw/msvcrt.def b/winsup/mingw/msvcrt.def
new file mode 100644
index 000000000..8a1b87210
--- /dev/null
+++ b/winsup/mingw/msvcrt.def
@@ -0,0 +1,737 @@
+;
+; msvcrt.def
+;
+; Exports from msvcrt.dll. Msvcrt.dll appears to be distributed with
+; Internet Explorer 4.0, and may be more common in the future, but
+; right now it seems like a risky choice. There are differences, although
+; they seem to be minor overall, between the exports from msvcrt and msvcrt20.
+; However, for most purposes the two sets are interchangable.
+;
+; NOTE: All exports, except for what appeared to be C++ mangled names,
+; are included. Not all functions have prototypes in the headers
+; (and some aren't functions at all).
+;
+; Contributors:
+; Created by Colin Peters <colin@bird.fu.is.saga-u.ac.jp>
+;
+; THIS SOFTWARE IS NOT COPYRIGHTED
+;
+; This source code is offered for use in the public domain. You may
+; use, modify or distribute it freely.
+;
+; This code is distributed in the hope that it will be useful but
+; WITHOUT ANY WARRANTY. ALL WARRENTIES, EXPRESS OR IMPLIED ARE HEREBY
+; DISCLAMED. This includes but is not limited to warrenties of
+; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+;
+; $Revision$
+; $Author$
+; $Date$
+;
+EXPORTS
+_CIacos
+_CIasin
+_CIatan
+_CIatan2
+_CIcos
+_CIcosh
+_CIexp
+_CIfmod
+_CIlog
+_CIlog10
+_CIpow
+_CIsin
+_CIsinh
+_CIsqrt
+_CItan
+_CItanh
+_CxxThrowException
+_EH_prolog
+_Getdays
+_Getmonths
+_Gettnames
+_HUGE DATA
+_Strftime
+_XcptFilter
+__CxxFrameHandler
+__CxxLongjmpUnwind
+__RTCastToVoid
+__RTDynamicCast
+__RTtypeid
+__STRINGTOLD
+__argc DATA
+__argv DATA
+__badioinfo
+__crtCompareStringA
+__crtGetLocaleInfoW
+__crtLCMapStringA
+__dllonexit
+__doserrno
+__fpecode
+__getmainargs
+__initenv DATA
+__isascii
+__iscsym
+__iscsymf
+__lc_codepage
+__lc_handle
+__lconv_init
+__mb_cur_max DATA
+__p___argc
+__p___argv
+__p___initenv
+__p___mb_cur_max
+__p___wargv
+__p___winitenv
+__p__acmdln
+__p__amblksiz
+__p__commode
+__p__daylight
+__p__dstbias
+__p__environ
+__p__fileinfo
+__p__fmode
+__p__iob
+__p__mbctype
+__p__osver
+__p__pctype
+__p__pgmptr
+__p__pwctype
+__p__timezone
+__p__tzname
+__p__wcmdln
+__p__wenviron
+__p__winmajor
+__p__winminor
+__p__winver
+__p__wpgmptr
+__pioinfo
+__pxcptinfoptrs
+__set_app_type
+__setlc_active
+__setusermatherr
+__threadhandle
+__threadid
+__toascii
+__unDName
+__unguarded_readlc_active
+__wargv DATA
+__wgetmainargs
+__winitenv DATA
+_abnormal_termination
+_access
+_acmdln DATA
+_adj_fdiv_m16i
+_adj_fdiv_m32
+_adj_fdiv_m32i
+_adj_fdiv_m64
+_adj_fdiv_r
+_adj_fdivr_m16i
+_adj_fdivr_m32
+_adj_fdivr_m32i
+_adj_fdivr_m64
+_adj_fpatan
+_adj_fprem
+_adj_fprem1
+_adj_fptan
+_adjust_fdiv DATA
+_aexit_rtn DATA
+_amsg_exit
+_assert
+_atodbl
+_atoi64
+_atoldbl
+_beep
+_beginthread
+_beginthreadex
+_c_exit
+_cabs
+_callnewh
+_cexit
+_cgets
+_chdir
+_chdrive
+_chgsign
+_chmod
+_chsize
+_clearfp
+_close
+_commit
+_commode DATA
+_control87
+_controlfp
+_copysign
+_cprintf
+_cputs
+_creat
+_cscanf
+_ctype DATA
+_cwait
+_daylight DATA
+_dstbias
+_dup
+_dup2
+_ecvt
+_endthread
+_endthreadex
+_environ DATA
+_eof
+_errno
+_except_handler2
+_except_handler3
+_execl
+_execle
+_execlp
+_execlpe
+_execv
+_execve
+_execvp
+_execvpe
+_exit
+_expand
+_fcloseall
+_fcvt
+_fdopen
+_fgetchar
+_fgetwchar
+_filbuf
+_fileinfo DATA
+_filelength
+_filelengthi64
+_fileno
+_findclose
+_findfirst
+_findfirsti64
+_findnext
+_findnexti64
+_finite
+_flsbuf
+_flushall
+_fmode DATA
+_fpclass
+_fpieee_flt
+_fpreset
+_fputchar
+_fputwchar
+_fsopen
+_fstat
+_fstati64
+_ftime
+_ftol
+_fullpath
+_futime
+_gcvt
+_get_osfhandle
+_get_sbh_threshold
+_getch
+_getche
+_getcwd
+_getdcwd
+_getdiskfree
+_getdllprocaddr
+_getdrive
+_getdrives
+_getmaxstdio
+_getmbcp
+_getpid
+_getsystime
+_getw
+_getws
+_global_unwind2
+_heapadd
+_heapchk
+_heapmin
+_heapset
+_heapused
+_heapwalk
+_hypot
+_i64toa
+_i64tow
+_initterm
+_inp
+_inpd
+_inpw
+_iob DATA
+_isatty
+_isctype
+_ismbbalnum
+_ismbbalpha
+_ismbbgraph
+_ismbbkalnum
+_ismbbkana
+_ismbbkprint
+_ismbbkpunct
+_ismbblead
+_ismbbprint
+_ismbbpunct
+_ismbbtrail
+_ismbcalnum
+_ismbcalpha
+_ismbcdigit
+_ismbcgraph
+_ismbchira
+_ismbckata
+_ismbcl0
+_ismbcl1
+_ismbcl2
+_ismbclegal
+_ismbclower
+_ismbcprint
+_ismbcpunct
+_ismbcspace
+_ismbcsymbol
+_ismbcupper
+_ismbslead
+_ismbstrail
+_isnan
+_itoa
+_itow
+_j0
+_j1
+_jn
+_kbhit
+_lfind
+_loaddll
+_local_unwind2
+_lock
+_locking
+_logb
+_longjmpex
+_lrotl
+_lrotr
+_lsearch
+_lseek
+_lseeki64
+_ltoa
+_ltow
+_makepath
+_mbbtombc
+_mbbtype
+_mbccpy
+_mbcjistojms
+_mbcjmstojis
+_mbclen
+_mbctohira
+_mbctokata
+_mbctolower
+_mbctombb
+_mbctoupper
+_mbctype DATA
+_mbsbtype
+_mbscat
+_mbschr
+_mbscmp
+_mbscoll
+_mbscpy
+_mbscspn
+_mbsdec
+_mbsdup
+_mbsicmp
+_mbsicoll
+_mbsinc
+_mbslen
+_mbslwr
+_mbsnbcat
+_mbsnbcmp
+_mbsnbcnt
+_mbsnbcoll
+_mbsnbcpy
+_mbsnbicmp
+_mbsnbicoll
+_mbsnbset
+_mbsncat
+_mbsnccnt
+_mbsncmp
+_mbsncoll
+_mbsncpy
+_mbsnextc
+_mbsnicmp
+_mbsnicoll
+_mbsninc
+_mbsnset
+_mbspbrk
+_mbsrchr
+_mbsrev
+_mbsset
+_mbsspn
+_mbsspnp
+_mbsstr
+_mbstok
+_mbstrlen
+_mbsupr
+_memccpy
+_memicmp
+_mkdir
+_mktemp
+_msize
+_nextafter
+_onexit
+_open
+_open_osfhandle
+_osver DATA
+_outp
+_outpd
+_outpw
+_pclose
+_pctype DATA
+_pgmptr DATA
+_pipe
+_popen
+_purecall
+_putch
+_putenv
+_putw
+_putws
+_pwctype DATA
+_read
+_rmdir
+_rmtmp
+_rotl
+_rotr
+_safe_fdiv
+_safe_fdivr
+_safe_fprem
+_safe_fprem1
+_scalb
+_searchenv
+_seh_longjmp_unwind
+_set_error_mode
+_set_sbh_threshold
+_seterrormode
+_setjmp
+_setjmp3
+_setmaxstdio
+_setmbcp
+_setmode
+_setsystime
+_sleep
+_snprintf
+_snwprintf
+_sopen
+_spawnl
+_spawnle
+_spawnlp
+_spawnlpe
+_spawnv
+_spawnve
+_spawnvp
+_spawnvpe
+_splitpath
+_stat
+_stati64
+_statusfp
+_strcmpi
+_strdate
+_strdup
+_strerror
+_stricmp
+_stricoll
+_strlwr
+_strncoll
+_strnicmp
+_strnicoll
+_strnset
+_strrev
+_strset
+_strtime
+_strupr
+_swab
+_sys_errlist DATA
+_sys_nerr DATA
+_tell
+_telli64
+_tempnam
+_timezone DATA
+_tolower
+_toupper
+_tzname DATA
+_tzset
+_ui64toa
+_ui64tow
+_ultoa
+_ultow
+_umask
+_ungetch
+_unlink
+_unloaddll
+_unlock
+_utime
+_vsnprintf
+_vsnwprintf
+_waccess
+_wasctime
+_wchdir
+_wchmod
+_wcmdln DATA
+_wcreat
+_wcsdup
+_wcsicmp
+_wcsicoll
+_wcslwr
+_wcsncoll
+_wcsnicmp
+_wcsnicoll
+_wcsnset
+_wcsrev
+_wcsset
+_wcsupr
+_wctime
+_wenviron DATA
+_wexecl
+_wexecle
+_wexeclp
+_wexeclpe
+_wexecv
+_wexecve
+_wexecvp
+_wexecvpe
+_wfdopen
+_wfindfirst
+_wfindfirsti64
+_wfindnext
+_wfindnexti64
+_wfopen
+_wfreopen
+_wfsopen
+_wfullpath
+_wgetcwd
+_wgetdcwd
+_wgetenv
+_winmajor DATA
+_winminor DATA
+_winver DATA
+_wmakepath
+_wmkdir
+_wmktemp
+_wopen
+_wperror
+_wpgmptr DATA
+_wpopen
+_wputenv
+_wremove
+_wrename
+_write
+_wrmdir
+_wsearchenv
+_wsetlocale
+_wsopen
+_wspawnl
+_wspawnle
+_wspawnlp
+_wspawnlpe
+_wspawnv
+_wspawnve
+_wspawnvp
+_wspawnvpe
+_wsplitpath
+_wstat
+_wstati64
+_wstrdate
+_wstrtime
+_wsystem
+_wtempnam
+_wtmpnam
+_wtoi
+_wtoi64
+_wtol
+_wunlink
+_wutime
+_y0
+_y1
+_yn
+abort
+abs
+acos
+asctime
+asin
+atan
+atan2
+atexit
+atof
+atoi
+atol
+bsearch
+calloc
+ceil
+clearerr
+clock
+cos
+cosh
+ctime
+difftime
+div
+exit
+exp
+fabs
+fclose
+feof
+ferror
+fflush
+fgetc
+fgetpos
+fgets
+fgetwc
+fgetws
+floor
+fmod
+fopen
+fprintf
+fputc
+fputs
+fputwc
+fputws
+fread
+free
+freopen
+frexp
+fscanf
+fseek
+fsetpos
+ftell
+fwprintf
+fwrite
+fwscanf
+getc
+getchar
+getenv
+gets
+getwc
+getwchar
+gmtime
+is_wctype
+isalnum
+isalpha
+iscntrl
+isdigit
+isgraph
+isleadbyte
+islower
+isprint
+ispunct
+isspace
+isupper
+iswalnum
+iswalpha
+iswascii
+iswcntrl
+iswctype
+iswdigit
+iswgraph
+iswlower
+iswprint
+iswpunct
+iswspace
+iswupper
+iswxdigit
+isxdigit
+labs
+ldexp
+ldiv
+localeconv
+localtime
+log
+log10
+longjmp
+malloc
+mblen
+mbstowcs
+mbtowc
+memchr
+memcmp
+memcpy
+memmove
+memset
+mktime
+modf
+perror
+pow
+printf
+putc
+putchar
+puts
+putwc
+putwchar
+qsort
+raise
+rand
+realloc
+remove
+rename
+rewind
+scanf
+setbuf
+setlocale
+setvbuf
+signal
+sin
+sinh
+sprintf
+sqrt
+srand
+sscanf
+strcat
+strchr
+strcmp
+strcoll
+strcpy
+strcspn
+strerror
+strftime
+strlen
+strncat
+strncmp
+strncpy
+strpbrk
+strrchr
+strspn
+strstr
+strtod
+strtok
+strtol
+strtoul
+strxfrm
+swprintf
+swscanf
+system
+tan
+tanh
+time
+tmpfile
+tmpnam
+tolower
+toupper
+towlower
+towupper
+ungetc
+ungetwc
+vfprintf
+vfwprintf
+vprintf
+vsprintf
+vswprintf
+vwprintf
+wcscat
+wcschr
+wcscmp
+wcscoll
+wcscpy
+wcscspn
+wcsftime
+wcslen
+wcsncat
+wcsncmp
+wcsncpy
+wcspbrk
+wcsrchr
+wcsspn
+wcsstr
+wcstod
+wcstok
+wcstol
+wcstombs
+wcstoul
+wcsxfrm
+wctomb
+wprintf
+wscanf
+
diff --git a/winsup/mingw/msvcrt20.def b/winsup/mingw/msvcrt20.def
new file mode 100644
index 000000000..2f27ea04b
--- /dev/null
+++ b/winsup/mingw/msvcrt20.def
@@ -0,0 +1,719 @@
+;
+; msvcrt20.def
+;
+; Exports from msvcrt20.dll. I am hoping that msvcrt20.dll will be reasonably
+; common on user systems (if not ubiquitous) so that, effectively, it can
+; be considered part of the OS. Apparently it was included with the Windows 95
+; distribution, so it should be present there at least.
+;
+; NOTE: All exports, except for what appeared to be C++ mangled names,
+; are included. Not all functions have prototypes in the headers
+; (and some aren't functions at all).
+;
+; Contributors:
+; Created by Colin Peters <colin@bird.fu.is.saga-u.ac.jp>
+;
+; THIS SOFTWARE IS NOT COPYRIGHTED
+;
+; This source code is offered for use in the public domain. You may
+; use, modify or distribute it freely.
+;
+; This code is distributed in the hope that it will be useful but
+; WITHOUT ANY WARRANTY. ALL WARRENTIES, EXPRESS OR IMPLIED ARE HEREBY
+; DISCLAMED. This includes but is not limited to warrenties of
+; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+;
+; $Revision$
+; $Author$
+; $Date$
+;
+EXPORTS
+_CIacos
+_CIasin
+_CIatan
+_CIatan2
+_CIcos
+_CIcosh
+_CIexp
+_CIfmod
+_CIlog
+_CIlog10
+_CIpow
+_CIsin
+_CIsinh
+_CIsqrt
+_CItan
+_CItanh
+_CxxThrowException
+_HUGE
+_XcptFilter
+__CxxFrameHandler
+__CxxLongjmpUnwind
+__STRINGTOLD
+__argc
+__argv
+__dllonexit
+__doserrno
+__fpecode
+__getmainargs
+__initenv
+__isascii
+__iscsym
+__iscsymf
+__lconv_init
+__mb_cur_max
+__p___argc
+__p___argv
+__p___initenv
+__p___mb_cur_max
+__p___wargv
+__p___winitenv
+__p__acmdln
+__p__amblksiz
+__p__commode
+__p__daylight
+__p__environ
+__p__fmode
+__p__iob
+__p__mbctype
+__p__osver
+__p__pctype
+__p__pgmptr
+__p__pwctype
+__p__timezone
+__p__tzname
+__p__wcmdln
+__p__wenviron
+__p__winmajor
+__p__winminor
+__p__winver
+__p__wpgmptr
+__pxcptinfoptrs
+__threadhandle
+__threadid
+__toascii
+__wargv
+__wgetmainargs
+__winitenv
+_abnormal_termination
+_access
+_acmdln
+_adj_fdiv_m16i
+_adj_fdiv_m32
+_adj_fdiv_m32i
+_adj_fdiv_m64
+_adj_fdiv_r
+_adj_fdivr_m16i
+_adj_fdivr_m32
+_adj_fdivr_m32i
+_adj_fdivr_m64
+_adj_fpatan
+_adj_fprem
+_adj_fprem1
+_adj_fptan
+_adjust_fdiv
+_aexit_rtn
+_amsg_exit
+_assert
+_atodbl
+_atoldbl
+_beep
+_beginthread
+_beginthreadex
+_c_exit
+_cabs
+_cexit
+_cgets
+_chdir
+_chdrive
+_chgsign
+_chmod
+_chsize
+_clearfp
+_close
+_commit
+_commode
+_control87
+_controlfp
+_copysign
+_cprintf
+_cputs
+_creat
+_cscanf
+_ctype
+_cwait
+_daylight
+_dup
+_dup2
+_ecvt
+_endthread
+_endthreadex
+_environ
+_eof
+_errno
+_except_handler2
+_except_handler3
+_execl
+_execle
+_execlp
+_execlpe
+_execv
+_execve
+_execvp
+_execvpe
+_exit
+_expand
+_fcloseall
+_fcvt
+_fdopen
+_fgetchar
+_fgetwchar
+_filbuf
+_fileinfo
+_filelength
+_fileno
+_findclose
+_findfirst
+_findnext
+_finite
+_flsbuf
+_flushall
+_fmode
+_fpclass
+_fpieee_flt
+_fpreset
+_fputchar
+_fputwchar
+_fsopen
+_fstat
+_ftime
+_ftol
+_fullpath
+_futime
+_gcvt
+_get_osfhandle
+_getch
+_getche
+_getcwd
+_getdcwd
+_getdiskfree
+_getdllprocaddr
+_getdrive
+_getdrives
+_getmbcp
+_getpid
+_getsystime
+_getw
+_getws
+_global_unwind2
+_heapadd
+_heapchk
+_heapmin
+_heapset
+_heapused
+_heapwalk
+_hypot
+_initterm
+_iob
+_isatty
+_isctype
+_ismbbalnum
+_ismbbalpha
+_ismbbgraph
+_ismbbkalnum
+_ismbbkana
+_ismbbkprint
+_ismbbkpunct
+_ismbblead
+_ismbbprint
+_ismbbpunct
+_ismbbtrail
+_ismbcalnum
+_ismbcalpha
+_ismbcdigit
+_ismbcgraph
+_ismbchira
+_ismbckata
+_ismbcl0
+_ismbcl1
+_ismbcl2
+_ismbclegal
+_ismbclower
+_ismbcprint
+_ismbcpunct
+_ismbcspace
+_ismbcsymbol
+_ismbcupper
+_ismbslead
+_ismbstrail
+_isnan
+_itoa
+_itow
+_j0
+_j1
+_jn
+_kbhit
+_lfind
+_loaddll
+_local_unwind2
+_locking
+_logb
+_longjmpex
+_lrotl
+_lrotr
+_lsearch
+_lseek
+_ltoa
+_ltow
+_makepath
+_matherr
+_mbbtombc
+_mbbtype
+_mbccpy
+_mbcjistojms
+_mbcjmstojis
+_mbclen
+_mbctohira
+_mbctokata
+_mbctolower
+_mbctombb
+_mbctoupper
+_mbctype
+_mbsbtype
+_mbscat
+_mbschr
+_mbscmp
+_mbscoll
+_mbscpy
+_mbscspn
+_mbsdec
+_mbsdup
+_mbsicmp
+_mbsicoll
+_mbsinc
+_mbslen
+_mbslwr
+_mbsnbcat
+_mbsnbcmp
+_mbsnbcnt
+_mbsnbcoll
+_mbsnbcpy
+_mbsnbicmp
+_mbsnbicoll
+_mbsnbset
+_mbsncat
+_mbsnccnt
+_mbsncmp
+_mbsncoll
+_mbsncpy
+_mbsnextc
+_mbsnicmp
+_mbsnicoll
+_mbsninc
+_mbsnset
+_mbspbrk
+_mbsrchr
+_mbsrev
+_mbsset
+_mbsspn
+_mbsspnp
+_mbsstr
+_mbstok
+_mbstrlen
+_mbsupr
+_memccpy
+_memicmp
+_mkdir
+_mktemp
+_msize
+_mtlock
+_mtunlock
+_nextafter
+_onexit
+_open
+_open_osfhandle
+_osver
+_pclose
+_pctype
+_pgmptr
+_pipe
+_popen
+_purecall
+_putch
+_putenv
+_putw
+_putws
+_pwctype
+_read
+_rmdir
+_rmtmp
+_rotl
+_rotr
+_safe_fdiv
+_safe_fdivr
+_safe_fprem
+_safe_fprem1
+_scalb
+_searchenv
+__seh_longjmp_unwind@4
+_seterrormode
+_setjmp
+_setjmp3
+_setmbcp
+_setmode
+_setsystime
+_sleep
+_snprintf
+_snwprintf
+_sopen
+_spawnl
+_spawnle
+_spawnlp
+_spawnlpe
+_spawnv
+_spawnve
+_spawnvp
+_spawnvpe
+_splitpath
+_stat
+_statusfp
+_strcmpi
+_strdate
+_strdup
+_strerror
+_stricmp
+_stricoll
+_strlwr
+_strncoll
+_strnicmp
+_strnicoll
+_strnset
+_strrev
+_strset
+_strtime
+_strupr
+_swab
+_sys_errlist
+_sys_nerr
+_tccpy
+_tclen
+_tcschr
+_tcsclen
+_tcscmp
+_tcscspn
+_tcsdec
+_tcsicmp
+_tcsinc
+_tcslwr
+_tcsnbcnt
+_tcsncat
+_tcsnccat
+_tcsnccmp
+_tcsnccnt
+_tcsnccpy
+_tcsncicmp
+_tcsncmp
+_tcsncpy
+_tcsncset
+_tcsnextc
+_tcsnicmp
+_tcsninc
+_tcsnset
+_tcspbrk
+_tcsrchr
+_tcsrev
+_tcsset
+_tcsspn
+_tcsspnp
+_tcsstr
+_tcstok
+_tcsupr
+_tell
+_tempnam
+_timezone
+_tolower
+_toupper
+_tzname
+_tzset
+_ultoa
+_ultow
+_umask
+_ungetch
+_unlink
+_unloaddll
+_utime
+_vsnprintf
+_vsnwprintf
+_waccess
+_wasctime
+_wchdir
+_wchmod
+_wcmdln
+_wcreat
+_wcsdup
+_wcsicmp
+_wcsicoll
+_wcslwr
+_wcsncoll
+_wcsnicmp
+_wcsnicoll
+_wcsnset
+_wcsrev
+_wcsset
+_wcsupr
+_wctime
+_wenviron
+_wexecl
+_wexecle
+_wexeclp
+_wexeclpe
+_wexecv
+_wexecve
+_wexecvp
+_wexecvpe
+_wfdopen
+_wfindfirst
+_wfindnext
+_wfopen
+_wfreopen
+_wfsopen
+_wfullpath
+_wgetcwd
+_wgetdcwd
+_wgetenv
+_winmajor
+_winminor
+_winver
+_wmakepath
+_wmkdir
+_wmktemp
+_wopen
+_wperror
+_wpgmptr
+_wpopen
+_wputenv
+_wremove
+_wrename
+_write
+_wrmdir
+_wsearchenv
+_wsetlocale
+_wsopen
+_wspawnl
+_wspawnle
+_wspawnlp
+_wspawnlpe
+_wspawnv
+_wspawnve
+_wspawnvp
+_wspawnvpe
+_wsplitpath
+_wstat
+_wstrdate
+_wstrtime
+_wsystem
+_wtempnam
+_wtmpnam
+_wtoi
+_wtol
+_wunlink
+_wutime
+_y0
+_y1
+_yn
+abort
+abs
+acos
+asctime
+asin
+atan
+atan2
+atexit
+atof
+atoi
+atol
+bsearch
+calloc
+ceil
+clearerr
+clock
+cos
+cosh
+ctime
+difftime
+div
+exit
+exp
+fabs
+fclose
+feof
+ferror
+fflush
+fgetc
+fgetpos
+fgets
+fgetwc
+fgetws
+floor
+fmod
+fopen
+fprintf
+fputc
+fputs
+fputwc
+fputws
+fread
+free
+freopen
+frexp
+fscanf
+fseek
+fsetpos
+ftell
+fwprintf
+fwrite
+fwscanf
+getc
+getchar
+getenv
+gets
+getwc
+getwchar
+gmtime
+is_wctype
+isalnum
+isalpha
+iscntrl
+isdigit
+isgraph
+isleadbyte
+islower
+isprint
+ispunct
+isspace
+isupper
+iswalnum
+iswalpha
+iswascii
+iswcntrl
+iswctype
+iswdigit
+iswgraph
+iswlower
+iswprint
+iswpunct
+iswspace
+iswupper
+iswxdigit
+isxdigit
+labs
+ldexp
+ldiv
+localeconv
+localtime
+log
+log10
+longjmp
+malloc
+mblen
+mbstowcs
+mbtowc
+memchr
+memcmp
+memcpy
+memmove
+memset
+mktime
+modf
+perror
+pow
+printf
+putc
+putchar
+puts
+putwc
+putwchar
+qsort
+raise
+rand
+realloc
+remove
+rename
+rewind
+scanf
+setbuf
+setlocale
+setvbuf
+signal
+sin
+sinh
+sprintf
+sqrt
+srand
+sscanf
+strcat
+strchr
+strcmp
+strcoll
+strcpy
+strcspn
+strerror
+strftime
+strlen
+strncat
+strncmp
+strncpy
+strpbrk
+strrchr
+strspn
+strstr
+strtod
+strtok
+strtol
+strtoul
+strxfrm
+swprintf
+swscanf
+system
+tan
+tanh
+time
+tmpfile
+tmpnam
+tolower
+toupper
+towlower
+towupper
+ungetc
+ungetwc
+vfprintf
+vfwprintf
+vprintf
+vsprintf
+vswprintf
+vwprintf
+wcscat
+wcschr
+wcscmp
+wcscoll
+wcscpy
+wcscspn
+wcsftime
+wcslen
+wcsncat
+wcsncmp
+wcsncpy
+wcspbrk
+wcsrchr
+wcsspn
+wcsstr
+wcstod
+wcstok
+wcstol
+wcstombs
+wcstoul
+wcsxfrm
+wctomb
+wprintf
+wscanf
+
diff --git a/winsup/mingw/msvcrt40.def b/winsup/mingw/msvcrt40.def
new file mode 100644
index 000000000..7b1d2e84e
--- /dev/null
+++ b/winsup/mingw/msvcrt40.def
@@ -0,0 +1,676 @@
+EXPORTS
+$I10_OUTPUT
+_CIacos
+_CIasin
+_CIatan
+_CIatan2
+_CIcos
+_CIcosh
+_CIexp
+_CIfmod
+_CIlog
+_CIlog10
+_CIpow
+_CIsin
+_CIsinh
+_CIsqrt
+_CItan
+_CItanh
+_CxxThrowException
+_EH_prolog
+_HUGE
+_XcptFilter
+__CxxFrameHandler
+__CxxLongjmpUnwind
+__RTCastToVoid
+__RTDynamicCast
+__RTtypeid
+__STRINGTOLD
+__argc
+__argv
+__dllonexit
+__doserrno
+__fpecode
+__getmainargs
+__initenv
+__isascii
+__iscsym
+__iscsymf
+__lconv_init
+__mb_cur_max
+__p___argc
+__p___argv
+__p___initenv
+__p___mb_cur_max
+__p___wargv
+__p___winitenv
+__p__acmdln
+__p__amblksiz
+__p__commode
+__p__daylight
+__p__environ
+__p__fmode
+__p__iob
+__p__mbctype
+__p__osver
+__p__pctype
+__p__pgmptr
+__p__pwctype
+__p__timezone
+__p__tzname
+__p__wcmdln
+__p__wenviron
+__p__winmajor
+__p__winminor
+__p__winver
+__p__wpgmptr
+__pxcptinfoptrs
+__set_app_type
+__setusermatherr
+__threadhandle
+__threadid
+__toascii
+__unDName
+__wargv
+__wgetmainargs
+__winitenv
+_abnormal_termination
+_access
+_acmdln
+_adj_fdiv_m16i
+_adj_fdiv_m32
+_adj_fdiv_m32i
+_adj_fdiv_m64
+_adj_fdiv_r
+_adj_fdivr_m16i
+_adj_fdivr_m32
+_adj_fdivr_m32i
+_adj_fdivr_m64
+_adj_fpatan
+_adj_fprem
+_adj_fprem1
+_adj_fptan
+_adjust_fdiv
+_aexit_rtn
+_amsg_exit
+_assert
+_atodbl
+_atoldbl
+_beep
+_beginthread
+_beginthreadex
+_c_exit
+_cabs
+_cexit
+_cgets
+_chdir
+_chdrive
+_chgsign
+_chmod
+_chsize
+_clearfp
+_close
+_commit
+_commode
+_control87
+_controlfp
+_copysign
+_cprintf
+_cputs
+_creat
+_cscanf
+_ctype
+_cwait
+_daylight
+_dup
+_dup2
+_ecvt
+_endthread
+_endthreadex
+_environ
+_eof
+_errno
+_except_handler2
+_except_handler3
+_execl
+_execle
+_execlp
+_execlpe
+_execv
+_execve
+_execvp
+_execvpe
+_exit
+_expand
+_fcloseall
+_fcvt
+_fdopen
+_fgetchar
+_fgetwchar
+_filbuf
+_fileinfo
+_filelength
+_filelengthi64
+_fileno
+_findclose
+_findfirst
+_findfirsti64
+_findnext
+_findnexti64
+_finite
+_flsbuf
+_flushall
+_fmode
+_fpclass
+_fpieee_flt
+_fpreset
+_fputchar
+_fputwchar
+_fsopen
+_fstat
+_fstati64
+_ftime
+_ftol
+_fullpath
+_futime
+_gcvt
+_get_osfhandle
+_getch
+_getche
+_getcwd
+_getdcwd
+_getdiskfree
+_getdllprocaddr
+_getdrive
+_getdrives
+_getmbcp
+_getpid
+_getsystime
+_getw
+_getws
+_global_unwind2
+_heapadd
+_heapchk
+_heapmin
+_heapset
+_heapused
+_heapwalk
+_hypot
+_initterm
+_iob
+_isatty
+_isctype
+_ismbbalnum
+_ismbbalpha
+_ismbbgraph
+_ismbbkalnum
+_ismbbkana
+_ismbbkprint
+_ismbbkpunct
+_ismbblead
+_ismbbprint
+_ismbbpunct
+_ismbbtrail
+_ismbcalnum
+_ismbcalpha
+_ismbcdigit
+_ismbcgraph
+_ismbchira
+_ismbckata
+_ismbcl0
+_ismbcl1
+_ismbcl2
+_ismbclegal
+_ismbclower
+_ismbcprint
+_ismbcpunct
+_ismbcspace
+_ismbcsymbol
+_ismbcupper
+_ismbslead
+_ismbstrail
+_isnan
+_itoa
+_itow
+_j0
+_j1
+_jn
+_kbhit
+_lfind
+_loaddll
+_local_unwind2
+_locking
+_logb
+_longjmpex
+_lrotl
+_lrotr
+_lsearch
+_lseek
+_lseeki64
+_ltoa
+_ltow
+_makepath
+_mbbtombc
+_mbbtype
+_mbccpy
+_mbcjistojms
+_mbcjmstojis
+_mbclen
+_mbctohira
+_mbctokata
+_mbctolower
+_mbctombb
+_mbctoupper
+_mbctype
+_mbsbtype
+_mbscat
+_mbschr
+_mbscmp
+_mbscoll
+_mbscpy
+_mbscspn
+_mbsdec
+_mbsdup
+_mbsicmp
+_mbsicoll
+_mbsinc
+_mbslen
+_mbslwr
+_mbsnbcat
+_mbsnbcmp
+_mbsnbcnt
+_mbsnbcoll
+_mbsnbcpy
+_mbsnbicmp
+_mbsnbicoll
+_mbsnbset
+_mbsncat
+_mbsnccnt
+_mbsncmp
+_mbsncoll
+_mbsncpy
+_mbsnextc
+_mbsnicmp
+_mbsnicoll
+_mbsninc
+_mbsnset
+_mbspbrk
+_mbsrchr
+_mbsrev
+_mbsset
+_mbsspn
+_mbsspnp
+_mbsstr
+_mbstok
+_mbstrlen
+_mbsupr
+_memccpy
+_memicmp
+_mkdir
+_mktemp
+_msize
+_mtlock
+_mtunlock
+_nextafter
+_onexit
+_open
+_open_osfhandle
+_osver
+_pclose
+_pctype
+_pgmptr
+_pipe
+_popen
+_purecall
+_putch
+_putenv
+_putw
+_putws
+_pwctype
+_read
+_rmdir
+_rmtmp
+_rotl
+_rotr
+_safe_fdiv
+_safe_fdivr
+_safe_fprem
+_safe_fprem1
+_scalb
+_searchenv
+_seh_longjmp_unwind
+_set_error_mode
+_seterrormode
+_setjmp
+_setjmp3
+_setmaxstdio
+_setmbcp
+_setmode
+_setsystime
+_sleep
+_snprintf
+_snwprintf
+_sopen
+_spawnl
+_spawnle
+_spawnlp
+_spawnlpe
+_spawnv
+_spawnve
+_spawnvp
+_spawnvpe
+_splitpath
+_stat
+_stati64
+_statusfp
+_strcmpi
+_strdate
+_strdup
+_strerror
+_stricmp
+_stricoll
+_strlwr
+_strncoll
+_strnicmp
+_strnicoll
+_strnset
+_strrev
+_strset
+_strtime
+_strupr
+_swab
+_sys_errlist
+_sys_nerr
+_tell
+_telli64
+_tempnam
+_timezone
+_tolower
+_toupper
+_tzname
+_tzset
+_ultoa
+_ultow
+_umask
+_ungetch
+_unlink
+_unloaddll
+_utime
+_vsnprintf
+_vsnwprintf
+_waccess
+_wasctime
+_wchdir
+_wchmod
+_wcmdln
+_wcreat
+_wcsdup
+_wcsicmp
+_wcsicoll
+_wcslwr
+_wcsncoll
+_wcsnicmp
+_wcsnicoll
+_wcsnset
+_wcsrev
+_wcsset
+_wcsupr
+_wctime
+_wenviron
+_wexecl
+_wexecle
+_wexeclp
+_wexeclpe
+_wexecv
+_wexecve
+_wexecvp
+_wexecvpe
+_wfdopen
+_wfindfirst
+_wfindfirsti64
+_wfindnext
+_wfindnexti64
+_wfopen
+_wfreopen
+_wfsopen
+_wfullpath
+_wgetcwd
+_wgetdcwd
+_wgetenv
+_winmajor
+_winminor
+_winver
+_wmakepath
+_wmkdir
+_wmktemp
+_wopen
+_wperror
+_wpgmptr
+_wpopen
+_wputenv
+_wremove
+_wrename
+_write
+_wrmdir
+_wsearchenv
+_wsetlocale
+_wsopen
+_wspawnl
+_wspawnle
+_wspawnlp
+_wspawnlpe
+_wspawnv
+_wspawnve
+_wspawnvp
+_wspawnvpe
+_wsplitpath
+_wstat
+_wstati64
+_wstrdate
+_wstrtime
+_wsystem
+_wtempnam
+_wtmpnam
+_wtoi
+_wtol
+_wunlink
+_wutime
+_y0
+_y1
+_yn
+abort
+abs
+acos
+asctime
+asin
+atan
+atan2
+atexit
+atof
+atoi
+atol
+bsearch
+calloc
+ceil
+clearerr
+clock
+cos
+cosh
+ctime
+difftime
+div
+exit
+exp
+fabs
+fclose
+feof
+ferror
+fflush
+fgetc
+fgetpos
+fgets
+fgetwc
+fgetws
+floor
+fmod
+fopen
+fprintf
+fputc
+fputs
+fputwc
+fputws
+fread
+free
+freopen
+frexp
+fscanf
+fseek
+fsetpos
+ftell
+fwprintf
+fwrite
+fwscanf
+getc
+getchar
+getenv
+gets
+getwc
+getwchar
+gmtime
+is_wctype
+isalnum
+isalpha
+iscntrl
+isdigit
+isgraph
+isleadbyte
+islower
+isprint
+ispunct
+isspace
+isupper
+iswalnum
+iswalpha
+iswascii
+iswcntrl
+iswctype
+iswdigit
+iswgraph
+iswlower
+iswprint
+iswpunct
+iswspace
+iswupper
+iswxdigit
+isxdigit
+labs
+ldexp
+ldiv
+localeconv
+localtime
+log
+log10
+longjmp
+malloc
+mblen
+mbstowcs
+mbtowc
+memchr
+memcmp
+memcpy
+memmove
+memset
+mktime
+modf
+perror
+pow
+printf
+putc
+putchar
+puts
+putwc
+putwchar
+qsort
+raise
+rand
+realloc
+remove
+rename
+rewind
+scanf
+setbuf
+setlocale
+setvbuf
+signal
+sin
+sinh
+sprintf
+sqrt
+srand
+sscanf
+strcat
+strchr
+strcmp
+strcoll
+strcpy
+strcspn
+strerror
+strftime
+strlen
+strncat
+strncmp
+strncpy
+strpbrk
+strrchr
+strspn
+strstr
+strtod
+strtok
+strtol
+strtoul
+strxfrm
+swprintf
+swscanf
+system
+tan
+tanh
+time
+tmpfile
+tmpnam
+tolower
+toupper
+towlower
+towupper
+ungetc
+ungetwc
+vfprintf
+vfwprintf
+vprintf
+vsprintf
+vswprintf
+vwprintf
+wcscat
+wcschr
+wcscmp
+wcscoll
+wcscpy
+wcscspn
+wcsftime
+wcslen
+wcsncat
+wcsncmp
+wcsncpy
+wcspbrk
+wcsrchr
+wcsspn
+wcsstr
+wcstod
+wcstok
+wcstol
+wcstombs
+wcstoul
+wcsxfrm
+wctomb
+wprintf
+wscanf
+
diff --git a/winsup/mingw/mthr.c b/winsup/mingw/mthr.c
new file mode 100644
index 000000000..24855479a
--- /dev/null
+++ b/winsup/mingw/mthr.c
@@ -0,0 +1,206 @@
+/*
+ * mthr.c
+ *
+ * Implement Mingw thread-support DLL .
+ *
+ * This file is used iff the following conditions are met:
+ * - gcc uses -mthreads option
+ * - user code uses C++ exceptions
+ *
+ * The sole job of the Mingw thread support DLL (MingwThr) is to catch
+ * all the dying threads and clean up the data allocated in the TLSs
+ * for exception contexts during C++ EH. Posix threads have key dtors,
+ * but win32 TLS keys do not, hence the magic. Without this, there's at
+ * least `6 * sizeof (void*)' bytes leaks for each catch/throw in each
+ * thread. The only public interface is __mingwthr_key_dtor().
+ *
+ * Created by Mumit Khan <khan@nanotech.wisc.edu>
+ *
+ */
+
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+#undef WIN32_LEAN_AND_MEAN
+#include <stdlib.h>
+
+/* To protect the thread/key association data structure modifications. */
+CRITICAL_SECTION __mingwthr_cs;
+
+typedef struct __mingwthr_thread __mingwthr_thread_t;
+typedef struct __mingwthr_key __mingwthr_key_t;
+
+/* The list of threads active with key/dtor pairs. */
+struct __mingwthr_key {
+ DWORD key;
+ void (*dtor) (void *);
+ __mingwthr_key_t *next;
+};
+
+/* The list of key/dtor pairs for a particular thread. */
+struct __mingwthr_thread {
+ DWORD thread_id;
+ __mingwthr_key_t *keys;
+ __mingwthr_thread_t *next;
+};
+
+static __mingwthr_thread_t *__mingwthr_thread_list;
+
+/*
+ * __mingwthr_key_add:
+ *
+ * Add key/dtor association for this thread. If the thread entry does not
+ * exist, create a new one and add to the head of the threads list; add
+ * the new assoc at the head of the keys list.
+ *
+ */
+
+static int
+__mingwthr_add_key_dtor (DWORD thread_id, DWORD key, void (*dtor) (void *))
+{
+ __mingwthr_thread_t *threadp;
+ __mingwthr_key_t *new_key;
+
+ new_key = (__mingwthr_key_t *) calloc (1, sizeof (__mingwthr_key_t));
+ if (new_key == NULL)
+ return -1;
+
+ new_key->key = key;
+ new_key->dtor = dtor;
+
+ /* This may be called by multiple threads, and so we need to protect
+ the whole process of adding the key/dtor pair. */
+ EnterCriticalSection (&__mingwthr_cs);
+
+ for (threadp = __mingwthr_thread_list;
+ threadp && (threadp->thread_id != thread_id);
+ threadp = threadp->next)
+ ;
+
+ if (threadp == NULL)
+ {
+ threadp = (__mingwthr_thread_t *)
+ calloc (1, sizeof (__mingwthr_thread_t));
+ if (threadp == NULL)
+ {
+ free (new_key);
+ LeaveCriticalSection (&__mingwthr_cs);
+ return -1;
+ }
+ threadp->thread_id = thread_id;
+ threadp->next = __mingwthr_thread_list;
+ __mingwthr_thread_list = threadp;
+ }
+
+ new_key->next = threadp->keys;
+ threadp->keys = new_key;
+
+ LeaveCriticalSection (&__mingwthr_cs);
+
+#ifdef DEBUG
+ printf ("%s: allocating: (%ld, %ld, %x)\n",
+ __FUNCTION__, thread_id, key, dtor);
+#endif
+
+ return 0;
+}
+
+/*
+ * __mingwthr_run_key_dtors (DWORD thread_id):
+ *
+ * Callback from DllMain when thread detaches to clean up the key
+ * storage.
+ *
+ * Note that this does not delete the key itself, but just runs
+ * the dtor if the current value are both non-NULL. Note that the
+ * keys with NULL dtors are not added by __mingwthr_key_dtor, the
+ * only public interface, so we don't need to check.
+ *
+ */
+
+void
+__mingwthr_run_key_dtors (DWORD thread_id)
+{
+ __mingwthr_thread_t *prev_threadp, *threadp;
+ __mingwthr_key_t *keyp;
+
+#ifdef DEBUG
+ printf ("%s: Entering Thread id %ld\n", __FUNCTION__, thread_id);
+#endif
+
+ /* Since this is called just once per thread, we only need to protect
+ the part where we take out this thread's entry and reconfigure the
+ list instead of wrapping the whole process in a critical section. */
+ EnterCriticalSection (&__mingwthr_cs);
+
+ prev_threadp = NULL;
+ for (threadp = __mingwthr_thread_list;
+ threadp && (threadp->thread_id != thread_id);
+ prev_threadp = threadp, threadp = threadp->next)
+ ;
+
+ if (threadp == NULL)
+ {
+ LeaveCriticalSection (&__mingwthr_cs);
+ return;
+ }
+
+ /* take the damned thread out of the chain. */
+ if (prev_threadp == NULL) /* first entry hit. */
+ __mingwthr_thread_list = threadp->next;
+ else
+ prev_threadp->next = threadp->next;
+
+ LeaveCriticalSection (&__mingwthr_cs);
+
+ for (keyp = threadp->keys; keyp; )
+ {
+ __mingwthr_key_t *prev_keyp;
+ LPVOID value = TlsGetValue (keyp->key);
+ if (GetLastError () == ERROR_SUCCESS)
+ {
+#ifdef DEBUG
+ printf (" (%ld, %x)\n", keyp->key, keyp->dtor);
+#endif
+ if (value)
+ (*keyp->dtor) (value);
+ }
+#ifdef DEBUG
+ else
+ {
+ printf (" TlsGetValue FAILED (%ld, %x)\n",
+ keyp->key, keyp->dtor);
+ }
+#endif
+ prev_keyp = keyp;
+ keyp = keyp->next;
+ free (prev_keyp);
+ }
+
+ free (threadp);
+
+#ifdef DEBUG
+ printf ("%s: Exiting Thread id %ld\n", __FUNCTION__, thread_id);
+#endif
+}
+
+/*
+ * __mingwthr_register_key_dtor (DWORD key, void (*dtor) (void *))
+ *
+ * Public interface called by C++ exception handling mechanism in
+ * libgcc (cf: __gthread_key_create).
+ *
+ */
+
+__declspec(dllexport)
+int
+__mingwthr_key_dtor (DWORD key, void (*dtor) (void *))
+{
+ if (dtor)
+ {
+ DWORD thread_id = GetCurrentThreadId ();
+ return __mingwthr_add_key_dtor (thread_id, key, dtor);
+ }
+
+ return 0;
+}
+
diff --git a/winsup/mingw/mthr_init.c b/winsup/mingw/mthr_init.c
new file mode 100644
index 000000000..23f7966a0
--- /dev/null
+++ b/winsup/mingw/mthr_init.c
@@ -0,0 +1,76 @@
+/*
+ * mthr_init.c
+ *
+ * Do the thread-support DLL initialization.
+ *
+ * This file is used iff the following conditions are met:
+ * - gcc uses -mthreads option
+ * - user code uses C++ exceptions
+ *
+ * The sole job of the Mingw thread support DLL (MingwThr) is to catch
+ * all the dying threads and clean up the data allocated in the TLSs
+ * for exception contexts during C++ EH. Posix threads have key dtors,
+ * but win32 TLS keys do not, hence the magic. Without this, there's at
+ * least `24 * sizeof (void*)' bytes leaks for each catch/throw in each
+ * thread.
+ *
+ * See mthr.c for all the magic.
+ *
+ * Created by Mumit Khan <khan@nanotech.wisc.edu>
+ *
+ */
+
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+#undef WIN32_LEAN_AND_MEAN
+#include <stdio.h>
+
+BOOL APIENTRY DllMain (HANDLE hDllHandle, DWORD reason,
+ LPVOID reserved /* Not used. */ );
+
+/*
+ *----------------------------------------------------------------------
+ *
+ * DllMain --
+ *
+ * This routine is called by the Mingw32, Cygwin32 or VC++ C run
+ * time library init code, or the Borland DllEntryPoint routine. It
+ * is responsible for initializing various dynamically loaded
+ * libraries.
+ *
+ * Results:
+ * TRUE on sucess, FALSE on failure.
+ *
+ * Side effects:
+ *
+ *----------------------------------------------------------------------
+ */
+BOOL APIENTRY
+DllMain (HANDLE hDllHandle /* Library instance handle. */,
+ DWORD reason /* Reason this function is being called. */,
+ LPVOID reserved /* Not used. */)
+{
+
+ extern CRITICAL_SECTION __mingwthr_cs;
+ extern void __mingwthr_run_key_dtors (DWORD);
+
+ switch (reason)
+ {
+ case DLL_PROCESS_ATTACH:
+ InitializeCriticalSection (&__mingwthr_cs);
+ break;
+
+ case DLL_PROCESS_DETACH:
+ DeleteCriticalSection (&__mingwthr_cs);
+ break;
+
+ case DLL_THREAD_ATTACH:
+ break;
+
+ case DLL_THREAD_DETACH:
+ __mingwthr_run_key_dtors (GetCurrentThreadId ());
+ break;
+ }
+ return TRUE;
+}
+
diff --git a/winsup/mingw/mthr_stub.c b/winsup/mingw/mthr_stub.c
new file mode 100644
index 000000000..b2d219c9e
--- /dev/null
+++ b/winsup/mingw/mthr_stub.c
@@ -0,0 +1,37 @@
+/*
+ * mthr_stub.c
+ *
+ * Implement Mingw thread-support stubs for single-threaded C++ apps.
+ *
+ * This file is used by if gcc is built with --enable-threads=win32 and
+ * iff gcc does *NOT* use -mthreads option.
+ *
+ * The -mthreads implementation is in mthr.c.
+ *
+ * Created by Mumit Khan <khan@nanotech.wisc.edu>
+ *
+ */
+
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+#undef WIN32_LEAN_AND_MEAN
+#include <assert.h>
+
+/*
+ * __mingwthr_register_key_dtor (DWORD key, void (*dtor) (void *))
+ *
+ * Public interface called by C++ exception handling mechanism in
+ * libgcc (cf: __gthread_key_create).
+ *
+ * THIS SHOULD NEVER BE CALLED!
+ *
+ */
+
+int
+__mingwthr_key_dtor (DWORD key, void (*dtor) (void *))
+{
+ assert (0);
+ /* NOTREACHED */
+ return 0;
+}
+
diff --git a/winsup/mingw/profile/Makefile.in b/winsup/mingw/profile/Makefile.in
new file mode 100644
index 000000000..4359aa82d
--- /dev/null
+++ b/winsup/mingw/profile/Makefile.in
@@ -0,0 +1,119 @@
+#
+# mingw/profile/Makefile.in: This file is part of Mingw runtime.
+#
+# This makefile requires GNU make.
+
+VPATH = @srcdir@
+srcdir = @srcdir@
+objdir = .
+
+target_alias = @target_alias@
+prefix = @prefix@
+
+program_transform_name = @program_transform_name@
+exec_prefix = @exec_prefix@
+bindir = @bindir@
+libdir = @libdir@
+tooldir = $(exec_prefix)/$(target_alias)
+datadir = @datadir@
+infodir = @infodir@
+includedir = @includedir@
+
+SHELL = /bin/sh
+
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+mkinstalldirs = $(SHELL) $(srcdir)/../../mkinstalldirs
+
+CC = @CC@
+# FIXME: Which is it, CC or CC_FOR_TARGET?
+CC_FOR_TARGET = $(CC)
+AS_FOR_TARGET = $(AS)
+CFLAGS = @CFLAGS@
+CXXFLAGS = @CXXFLAGS@
+
+# compiling with Cygwin?
+MNO_CYGWIN = @MNO_CYGWIN@
+
+# Either crtdll (CRT_ID 1) or msvcrt (CRT_ID 2).
+RUNTIME = @RUNTIME@
+CRT_ID = @CRT_ID@
+
+# Needed for threading dll.
+THREAD_DLL = @THREAD_DLL@
+THREAD_DLL_VERSION = 10
+THREAD_DLL_NAME = $(THREAD_DLL)$(THREAD_DLL_VERSION).dll
+
+INCLUDES = -I$(srcdir) -I$(srcdir)/../include \
+ -I$(srcdir)/../../w32api/include \
+ -nostdinc -nostdinc++
+ALL_CFLAGS = $(CFLAGS) $(INCLUDES) $(MNO_CYGWIN)
+ALL_CXXFLAGS = $(CXXFLAGS) $(INCLUDES) $(MNO_CYGWIN)
+
+AS = @AS@
+AR = @AR@
+LD = @LD@
+AR_FLAGS = rcv
+RANLIB = @RANLIB@
+DLLTOOL = @DLLTOOL@
+DLLTOOLFLAGS =
+DLLTOOL_FOR_TARGET = $(DLLTOOL)
+DLLTOOL_FLAGS = --as $(AS_FOR_TARGET)
+
+LIBGMON_A = @LIBGMON_A@
+LIBGMON_OBJS = gmon.o mcount.o profil.o
+CRT0S = gcrt$(CRT_ID).o
+
+LIBS = $(LIBGMON_A)
+DLLS =
+
+all: $(LIBGMON_A)
+
+$(LIBGMON_A): $(LIBGMON_OBJS) $(CRT0S)
+ $(AR) $(ARFLAGS) $@ $(LIBGMON_OBJS)
+ $(RANLIB) $@
+
+gcrt1.o: gcrt0.c
+ $(CC) -U__MSVCRT__ -c -o $@ $(CPPFLAGS) $(CFLAGS) $?
+
+gcrt2.o: gcrt0.c
+ $(CC) -D__MSVCRT__ -c -o $@ $(CPPFLAGS) $(CFLAGS) $?
+
+Makefile: Makefile.in config.status configure
+ $(SHELL) config.status
+
+config.status: configure
+ $(SHELL) config.status --recheck
+
+info:
+
+info-html:
+
+install-info: info
+
+install: all
+ $(mkinstalldirs) $(tooldir)/lib
+ for i in $(LIBS); do \
+ $(INSTALL_DATA) $$i $(tooldir)/lib/$$i ; \
+ done
+ for i in $(CRT0S); do \
+ $(INSTALL_DATA) $$i $(tooldir)/lib/$$i ; \
+ done
+ for sub in . ; do \
+ $(mkinstalldirs) $(tooldir)/include/$$sub ; \
+ for i in $(srcdir)/$$sub/*.h ; do \
+ $(INSTALL_DATA) $$i $(tooldir)/include/$$sub/`basename $$i` ; \
+ done ; \
+ done
+
+clean:
+ -rm -f $(LIBGMON_OBJS) $(CRT0S) $(LIBGMON_A)
+
+distclean:
+ -rm -f *.o *.a *~ core a.out
+ -rm -f config.cache config.status config.log
+ -rm -f Makefile
+.c.o:
+ $(CC) -c $(ALL_CPPFLAGS) $(ALL_CFLAGS) $< -o $@
+
diff --git a/winsup/mingw/profile/configure b/winsup/mingw/profile/configure
new file mode 100755
index 000000000..7d5b92b22
--- /dev/null
+++ b/winsup/mingw/profile/configure
@@ -0,0 +1,1037 @@
+#! /bin/sh
+
+# Guess values for system-dependent variables and create Makefiles.
+# Generated automatically using autoconf version 2.13
+# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.
+#
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+
+# Defaults:
+ac_help=
+ac_default_prefix=/usr/local
+# Any additions from configure.in:
+
+# Initialize some variables set by options.
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+build=NONE
+cache_file=./config.cache
+exec_prefix=NONE
+host=NONE
+no_create=
+nonopt=NONE
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+target=NONE
+verbose=
+x_includes=NONE
+x_libraries=NONE
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datadir='${prefix}/share'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+libdir='${exec_prefix}/lib'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+infodir='${prefix}/info'
+mandir='${prefix}/man'
+
+# Initialize some other variables.
+subdirs=
+MFLAGS= MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
+# Maximum number of lines to put in a shell here document.
+ac_max_here_lines=12
+
+ac_prev=
+for ac_option
+do
+
+ # If the previous option needs an argument, assign it.
+ if test -n "$ac_prev"; then
+ eval "$ac_prev=\$ac_option"
+ ac_prev=
+ continue
+ fi
+
+ case "$ac_option" in
+ -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
+ *) ac_optarg= ;;
+ esac
+
+ # Accept the important Cygnus configure options, so we can diagnose typos.
+
+ case "$ac_option" in
+
+ -bindir | --bindir | --bindi | --bind | --bin | --bi)
+ ac_prev=bindir ;;
+ -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+ bindir="$ac_optarg" ;;
+
+ -build | --build | --buil | --bui | --bu)
+ ac_prev=build ;;
+ -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+ build="$ac_optarg" ;;
+
+ -cache-file | --cache-file | --cache-fil | --cache-fi \
+ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+ ac_prev=cache_file ;;
+ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+ cache_file="$ac_optarg" ;;
+
+ -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
+ ac_prev=datadir ;;
+ -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
+ | --da=*)
+ datadir="$ac_optarg" ;;
+
+ -disable-* | --disable-*)
+ ac_feature=`echo $ac_option|sed -e 's/-*disable-//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then
+ { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
+ fi
+ ac_feature=`echo $ac_feature| sed 's/-/_/g'`
+ eval "enable_${ac_feature}=no" ;;
+
+ -enable-* | --enable-*)
+ ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then
+ { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
+ fi
+ ac_feature=`echo $ac_feature| sed 's/-/_/g'`
+ case "$ac_option" in
+ *=*) ;;
+ *) ac_optarg=yes ;;
+ esac
+ eval "enable_${ac_feature}='$ac_optarg'" ;;
+
+ -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+ | --exec | --exe | --ex)
+ ac_prev=exec_prefix ;;
+ -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+ | --exec=* | --exe=* | --ex=*)
+ exec_prefix="$ac_optarg" ;;
+
+ -gas | --gas | --ga | --g)
+ # Obsolete; use --with-gas.
+ with_gas=yes ;;
+
+ -help | --help | --hel | --he)
+ # Omit some internal or obsolete options to make the list less imposing.
+ # This message is too long to be a string in the A/UX 3.1 sh.
+ cat << EOF
+Usage: configure [options] [host]
+Options: [defaults in brackets after descriptions]
+Configuration:
+ --cache-file=FILE cache test results in FILE
+ --help print this message
+ --no-create do not create output files
+ --quiet, --silent do not print \`checking...' messages
+ --version print the version of autoconf that created configure
+Directory and file names:
+ --prefix=PREFIX install architecture-independent files in PREFIX
+ [$ac_default_prefix]
+ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
+ [same as prefix]
+ --bindir=DIR user executables in DIR [EPREFIX/bin]
+ --sbindir=DIR system admin executables in DIR [EPREFIX/sbin]
+ --libexecdir=DIR program executables in DIR [EPREFIX/libexec]
+ --datadir=DIR read-only architecture-independent data in DIR
+ [PREFIX/share]
+ --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc]
+ --sharedstatedir=DIR modifiable architecture-independent data in DIR
+ [PREFIX/com]
+ --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var]
+ --libdir=DIR object code libraries in DIR [EPREFIX/lib]
+ --includedir=DIR C header files in DIR [PREFIX/include]
+ --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include]
+ --infodir=DIR info documentation in DIR [PREFIX/info]
+ --mandir=DIR man documentation in DIR [PREFIX/man]
+ --srcdir=DIR find the sources in DIR [configure dir or ..]
+ --program-prefix=PREFIX prepend PREFIX to installed program names
+ --program-suffix=SUFFIX append SUFFIX to installed program names
+ --program-transform-name=PROGRAM
+ run sed PROGRAM on installed program names
+EOF
+ cat << EOF
+Host type:
+ --build=BUILD configure for building on BUILD [BUILD=HOST]
+ --host=HOST configure for HOST [guessed]
+ --target=TARGET configure for TARGET [TARGET=HOST]
+Features and packages:
+ --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
+ --enable-FEATURE[=ARG] include FEATURE [ARG=yes]
+ --with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
+ --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
+ --x-includes=DIR X include files are in DIR
+ --x-libraries=DIR X library files are in DIR
+EOF
+ if test -n "$ac_help"; then
+ echo "--enable and --with options recognized:$ac_help"
+ fi
+ exit 0 ;;
+
+ -host | --host | --hos | --ho)
+ ac_prev=host ;;
+ -host=* | --host=* | --hos=* | --ho=*)
+ host="$ac_optarg" ;;
+
+ -includedir | --includedir | --includedi | --included | --include \
+ | --includ | --inclu | --incl | --inc)
+ ac_prev=includedir ;;
+ -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+ | --includ=* | --inclu=* | --incl=* | --inc=*)
+ includedir="$ac_optarg" ;;
+
+ -infodir | --infodir | --infodi | --infod | --info | --inf)
+ ac_prev=infodir ;;
+ -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+ infodir="$ac_optarg" ;;
+
+ -libdir | --libdir | --libdi | --libd)
+ ac_prev=libdir ;;
+ -libdir=* | --libdir=* | --libdi=* | --libd=*)
+ libdir="$ac_optarg" ;;
+
+ -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+ | --libexe | --libex | --libe)
+ ac_prev=libexecdir ;;
+ -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+ | --libexe=* | --libex=* | --libe=*)
+ libexecdir="$ac_optarg" ;;
+
+ -localstatedir | --localstatedir | --localstatedi | --localstated \
+ | --localstate | --localstat | --localsta | --localst \
+ | --locals | --local | --loca | --loc | --lo)
+ ac_prev=localstatedir ;;
+ -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+ | --localstate=* | --localstat=* | --localsta=* | --localst=* \
+ | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
+ localstatedir="$ac_optarg" ;;
+
+ -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+ ac_prev=mandir ;;
+ -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+ mandir="$ac_optarg" ;;
+
+ -nfp | --nfp | --nf)
+ # Obsolete; use --without-fp.
+ with_fp=no ;;
+
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c)
+ no_create=yes ;;
+
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+ no_recursion=yes ;;
+
+ -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+ | --oldin | --oldi | --old | --ol | --o)
+ ac_prev=oldincludedir ;;
+ -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+ oldincludedir="$ac_optarg" ;;
+
+ -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+ ac_prev=prefix ;;
+ -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+ prefix="$ac_optarg" ;;
+
+ -program-prefix | --program-prefix | --program-prefi | --program-pref \
+ | --program-pre | --program-pr | --program-p)
+ ac_prev=program_prefix ;;
+ -program-prefix=* | --program-prefix=* | --program-prefi=* \
+ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+ program_prefix="$ac_optarg" ;;
+
+ -program-suffix | --program-suffix | --program-suffi | --program-suff \
+ | --program-suf | --program-su | --program-s)
+ ac_prev=program_suffix ;;
+ -program-suffix=* | --program-suffix=* | --program-suffi=* \
+ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+ program_suffix="$ac_optarg" ;;
+
+ -program-transform-name | --program-transform-name \
+ | --program-transform-nam | --program-transform-na \
+ | --program-transform-n | --program-transform- \
+ | --program-transform | --program-transfor \
+ | --program-transfo | --program-transf \
+ | --program-trans | --program-tran \
+ | --progr-tra | --program-tr | --program-t)
+ ac_prev=program_transform_name ;;
+ -program-transform-name=* | --program-transform-name=* \
+ | --program-transform-nam=* | --program-transform-na=* \
+ | --program-transform-n=* | --program-transform-=* \
+ | --program-transform=* | --program-transfor=* \
+ | --program-transfo=* | --program-transf=* \
+ | --program-trans=* | --program-tran=* \
+ | --progr-tra=* | --program-tr=* | --program-t=*)
+ program_transform_name="$ac_optarg" ;;
+
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ silent=yes ;;
+
+ -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+ ac_prev=sbindir ;;
+ -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+ | --sbi=* | --sb=*)
+ sbindir="$ac_optarg" ;;
+
+ -sharedstatedir | --sharedstatedir | --sharedstatedi \
+ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+ | --sharedst | --shareds | --shared | --share | --shar \
+ | --sha | --sh)
+ ac_prev=sharedstatedir ;;
+ -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+ | --sha=* | --sh=*)
+ sharedstatedir="$ac_optarg" ;;
+
+ -site | --site | --sit)
+ ac_prev=site ;;
+ -site=* | --site=* | --sit=*)
+ site="$ac_optarg" ;;
+
+ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+ ac_prev=srcdir ;;
+ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+ srcdir="$ac_optarg" ;;
+
+ -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+ | --syscon | --sysco | --sysc | --sys | --sy)
+ ac_prev=sysconfdir ;;
+ -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+ sysconfdir="$ac_optarg" ;;
+
+ -target | --target | --targe | --targ | --tar | --ta | --t)
+ ac_prev=target ;;
+ -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+ target="$ac_optarg" ;;
+
+ -v | -verbose | --verbose | --verbos | --verbo | --verb)
+ verbose=yes ;;
+
+ -version | --version | --versio | --versi | --vers)
+ echo "configure generated by autoconf version 2.13"
+ exit 0 ;;
+
+ -with-* | --with-*)
+ ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then
+ { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
+ fi
+ ac_package=`echo $ac_package| sed 's/-/_/g'`
+ case "$ac_option" in
+ *=*) ;;
+ *) ac_optarg=yes ;;
+ esac
+ eval "with_${ac_package}='$ac_optarg'" ;;
+
+ -without-* | --without-*)
+ ac_package=`echo $ac_option|sed -e 's/-*without-//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then
+ { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
+ fi
+ ac_package=`echo $ac_package| sed 's/-/_/g'`
+ eval "with_${ac_package}=no" ;;
+
+ --x)
+ # Obsolete; use --with-x.
+ with_x=yes ;;
+
+ -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+ | --x-incl | --x-inc | --x-in | --x-i)
+ ac_prev=x_includes ;;
+ -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+ x_includes="$ac_optarg" ;;
+
+ -x-libraries | --x-libraries | --x-librarie | --x-librari \
+ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+ ac_prev=x_libraries ;;
+ -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+ x_libraries="$ac_optarg" ;;
+
+ -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; }
+ ;;
+
+ *)
+ if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then
+ echo "configure: warning: $ac_option: invalid host type" 1>&2
+ fi
+ if test "x$nonopt" != xNONE; then
+ { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; }
+ fi
+ nonopt="$ac_option"
+ ;;
+
+ esac
+done
+
+if test -n "$ac_prev"; then
+ { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; }
+fi
+
+trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
+
+# File descriptor usage:
+# 0 standard input
+# 1 file creation
+# 2 errors and warnings
+# 3 some systems may open it to /dev/tty
+# 4 used on the Kubota Titan
+# 6 checking for... messages and results
+# 5 compiler messages saved in config.log
+if test "$silent" = yes; then
+ exec 6>/dev/null
+else
+ exec 6>&1
+fi
+exec 5>./config.log
+
+echo "\
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+" 1>&5
+
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Also quote any args containing shell metacharacters.
+ac_configure_args=
+for ac_arg
+do
+ case "$ac_arg" in
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c) ;;
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;;
+ *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*)
+ ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+ *) ac_configure_args="$ac_configure_args $ac_arg" ;;
+ esac
+done
+
+# NLS nuisances.
+# Only set these to C if already set. These must not be set unconditionally
+# because not all systems understand e.g. LANG=C (notably SCO).
+# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'!
+# Non-C LC_CTYPE values break the ctype check.
+if test "${LANG+set}" = set; then LANG=C; export LANG; fi
+if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi
+if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi
+if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -rf conftest* confdefs.h
+# AIX cpp loses on an empty file, so make sure it contains at least a newline.
+echo > confdefs.h
+
+# A filename unique to this package, relative to the directory that
+# configure is in, which we can look for to find out if srcdir is correct.
+ac_unique_file=gcrt0.c
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+ ac_srcdir_defaulted=yes
+ # Try the directory containing this script, then its parent.
+ ac_prog=$0
+ ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'`
+ test "x$ac_confdir" = "x$ac_prog" && ac_confdir=.
+ srcdir=$ac_confdir
+ if test ! -r $srcdir/$ac_unique_file; then
+ srcdir=..
+ fi
+else
+ ac_srcdir_defaulted=no
+fi
+if test ! -r $srcdir/$ac_unique_file; then
+ if test "$ac_srcdir_defaulted" = yes; then
+ { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; }
+ else
+ { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; }
+ fi
+fi
+srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'`
+
+# Prefer explicitly selected file to automatically selected ones.
+if test -z "$CONFIG_SITE"; then
+ if test "x$prefix" != xNONE; then
+ CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
+ else
+ CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+ fi
+fi
+for ac_site_file in $CONFIG_SITE; do
+ if test -r "$ac_site_file"; then
+ echo "loading site script $ac_site_file"
+ . "$ac_site_file"
+ fi
+done
+
+if test -r "$cache_file"; then
+ echo "loading cache $cache_file"
+ . $cache_file
+else
+ echo "creating cache $cache_file"
+ > $cache_file
+fi
+
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+ac_exeext=
+ac_objext=o
+if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
+ # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu.
+ if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then
+ ac_n= ac_c='
+' ac_t=' '
+ else
+ ac_n=-n ac_c= ac_t=
+ fi
+else
+ ac_n= ac_c='\c' ac_t=
+fi
+
+
+
+CC=${CC-cc}
+
+AS=${AS-as}
+
+AR=${AR-ar}
+
+LD=${LD-ld}
+
+RANLIB=${RANLIB-ranlib}
+
+DLLTOOL=${DLLTOOL-dlltool}
+
+DLLWRAP=${DLLWRAP-dllwrap}
+
+ac_aux_dir=
+for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
+ if test -f $ac_dir/install-sh; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install-sh -c"
+ break
+ elif test -f $ac_dir/install.sh; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install.sh -c"
+ break
+ fi
+done
+if test -z "$ac_aux_dir"; then
+ { echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; }
+fi
+ac_config_guess=$ac_aux_dir/config.guess
+ac_config_sub=$ac_aux_dir/config.sub
+ac_configure=$ac_aux_dir/configure # This should be Cygnus configure.
+
+
+# Do some error checking and defaulting for the host and target type.
+# The inputs are:
+# configure --host=HOST --target=TARGET --build=BUILD NONOPT
+#
+# The rules are:
+# 1. You are not allowed to specify --host, --target, and nonopt at the
+# same time.
+# 2. Host defaults to nonopt.
+# 3. If nonopt is not specified, then host defaults to the current host,
+# as determined by config.guess.
+# 4. Target and build default to nonopt.
+# 5. If nonopt is not specified, then target and build default to host.
+
+# The aliases save the names the user supplied, while $host etc.
+# will get canonicalized.
+case $host---$target---$nonopt in
+NONE---*---* | *---NONE---* | *---*---NONE) ;;
+*) { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } ;;
+esac
+
+
+# Make sure we can run config.sub.
+if ${CONFIG_SHELL-/bin/sh} $ac_config_sub sun4 >/dev/null 2>&1; then :
+else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; }
+fi
+
+echo $ac_n "checking host system type""... $ac_c" 1>&6
+echo "configure:587: checking host system type" >&5
+
+host_alias=$host
+case "$host_alias" in
+NONE)
+ case $nonopt in
+ NONE)
+ if host_alias=`${CONFIG_SHELL-/bin/sh} $ac_config_guess`; then :
+ else { echo "configure: error: can not guess host type; you must specify one" 1>&2; exit 1; }
+ fi ;;
+ *) host_alias=$nonopt ;;
+ esac ;;
+esac
+
+host=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $host_alias`
+host_cpu=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+host_vendor=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+echo "$ac_t""$host" 1>&6
+
+echo $ac_n "checking target system type""... $ac_c" 1>&6
+echo "configure:608: checking target system type" >&5
+
+target_alias=$target
+case "$target_alias" in
+NONE)
+ case $nonopt in
+ NONE) target_alias=$host_alias ;;
+ *) target_alias=$nonopt ;;
+ esac ;;
+esac
+
+target=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $target_alias`
+target_cpu=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+target_vendor=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+target_os=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+echo "$ac_t""$target" 1>&6
+
+echo $ac_n "checking build system type""... $ac_c" 1>&6
+echo "configure:626: checking build system type" >&5
+
+build_alias=$build
+case "$build_alias" in
+NONE)
+ case $nonopt in
+ NONE) build_alias=$host_alias ;;
+ *) build_alias=$nonopt ;;
+ esac ;;
+esac
+
+build=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $build_alias`
+build_cpu=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+build_vendor=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+build_os=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+echo "$ac_t""$build" 1>&6
+
+test "$host_alias" != "$target_alias" &&
+ test "$program_prefix$program_suffix$program_transform_name" = \
+ NONENONEs,x,x, &&
+ program_prefix=${target_alias}-
+
+
+case "$target_os" in
+*mingw32msvc*)
+ CRT_ID=2
+ MNO_CYGWIN=
+ RUNTIME=msvcrt
+ THREAD_DLL=mingwm
+ LIBM_A=libm.a
+ LIBGMON_A=libgmon.a
+ ;;
+*cygwin*)
+ CRT_ID=1
+ MNO_CYGWIN=-mno-cygwin
+ RUNTIME=crtdll
+ THREAD_DLL=mingwc
+ # Do not build libm.a when building under Cygwin winsup. Otherwise, it'll
+ # overwrite Cygwin's one. Likewise for libgmon.a.
+ LIBM_A=
+ LIBGMON_A=
+ ;;
+*)
+ # Build it for CRTDLL by default.
+ CRT_ID=1
+ MNO_CYGWIN=
+ RUNTIME=crtdll
+ THREAD_DLL=mingwc
+ LIBM_A=libm.a
+ LIBGMON_A=libgmon.a
+ ;;
+esac
+
+
+
+
+
+
+
+
+# Find a good install program. We prefer a C program (faster),
+# so one script is as good as another. But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# ./install, which can be erroneously created by make from ./install.sh.
+echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
+echo "configure:698: checking for a BSD compatible install" >&5
+if test -z "$INSTALL"; then
+if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ IFS="${IFS= }"; ac_save_IFS="$IFS"; IFS=":"
+ for ac_dir in $PATH; do
+ # Account for people who put trailing slashes in PATH elements.
+ case "$ac_dir/" in
+ /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;;
+ *)
+ # OSF1 and SCO ODT 3.0 have their own names for install.
+ # Don't use installbsd from OSF since it installs stuff as root
+ # by default.
+ for ac_prog in ginstall scoinst install; do
+ if test -f $ac_dir/$ac_prog; then
+ if test $ac_prog = install &&
+ grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then
+ # AIX install. It has an incompatible calling convention.
+ :
+ else
+ ac_cv_path_install="$ac_dir/$ac_prog -c"
+ break 2
+ fi
+ fi
+ done
+ ;;
+ esac
+ done
+ IFS="$ac_save_IFS"
+
+fi
+ if test "${ac_cv_path_install+set}" = set; then
+ INSTALL="$ac_cv_path_install"
+ else
+ # As a last resort, use the slow shell script. We don't cache a
+ # path for INSTALL within a source directory, because that will
+ # break other packages using the cache if that directory is
+ # removed, or if the path is relative.
+ INSTALL="$ac_install_sh"
+ fi
+fi
+echo "$ac_t""$INSTALL" 1>&6
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+trap '' 1 2 15
+cat > confcache <<\EOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs. It is not useful on other systems.
+# If it contains results you don't want to keep, you may remove or edit it.
+#
+# By default, configure uses ./config.cache as the cache file,
+# creating it if it does not exist already. You can give configure
+# the --cache-file=FILE option to use a different cache file; that is
+# what configure does when it calls configure scripts in
+# subdirectories, so they share the cache.
+# Giving --cache-file=/dev/null disables caching, for debugging configure.
+# config.status only pays attention to the cache file if you give it the
+# --recheck option to rerun configure.
+#
+EOF
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, don't put newlines in cache variables' values.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(set) 2>&1 |
+ case `(ac_space=' '; set | grep ac_space) 2>&1` in
+ *ac_space=\ *)
+ # `set' does not quote correctly, so add quotes (double-quote substitution
+ # turns \\\\ into \\, and sed turns \\ into \).
+ sed -n \
+ -e "s/'/'\\\\''/g" \
+ -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p"
+ ;;
+ *)
+ # `set' quotes correctly as required by POSIX, so do not add quotes.
+ sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p'
+ ;;
+ esac >> confcache
+if cmp -s $cache_file confcache; then
+ :
+else
+ if test -w $cache_file; then
+ echo "updating cache $cache_file"
+ cat confcache > $cache_file
+ else
+ echo "not updating unwritable cache $cache_file"
+ fi
+fi
+rm -f confcache
+
+trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# Any assignment to VPATH causes Sun make to only execute
+# the first set of double-colon rules, so remove it if not needed.
+# If there is a colon in the path, we need to keep it.
+if test "x$srcdir" = x.; then
+ ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d'
+fi
+
+trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15
+
+# Transform confdefs.h into DEFS.
+# Protect against shell expansion while executing Makefile rules.
+# Protect against Makefile macro expansion.
+cat > conftest.defs <<\EOF
+s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%-D\1=\2%g
+s%[ `~#$^&*(){}\\|;'"<>?]%\\&%g
+s%\[%\\&%g
+s%\]%\\&%g
+s%\$%$$%g
+EOF
+DEFS=`sed -f conftest.defs confdefs.h | tr '\012' ' '`
+rm -f conftest.defs
+
+
+# Without the "./", some shells look in PATH for config.status.
+: ${CONFIG_STATUS=./config.status}
+
+echo creating $CONFIG_STATUS
+rm -f $CONFIG_STATUS
+cat > $CONFIG_STATUS <<EOF
+#! /bin/sh
+# Generated automatically by configure.
+# Run this file to recreate the current configuration.
+# This directory was configured as follows,
+# on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+#
+# $0 $ac_configure_args
+#
+# Compiler output produced by configure, useful for debugging
+# configure, is in ./config.log if it exists.
+
+ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]"
+for ac_option
+do
+ case "\$ac_option" in
+ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+ echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion"
+ exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;;
+ -version | --version | --versio | --versi | --vers | --ver | --ve | --v)
+ echo "$CONFIG_STATUS generated by autoconf version 2.13"
+ exit 0 ;;
+ -help | --help | --hel | --he | --h)
+ echo "\$ac_cs_usage"; exit 0 ;;
+ *) echo "\$ac_cs_usage"; exit 1 ;;
+ esac
+done
+
+ac_given_srcdir=$srcdir
+ac_given_INSTALL="$INSTALL"
+
+trap 'rm -fr `echo "Makefile" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
+EOF
+cat >> $CONFIG_STATUS <<EOF
+
+# Protect against being on the right side of a sed subst in config.status.
+sed 's/%@/@@/; s/@%/@@/; s/%g\$/@g/; /@g\$/s/[\\\\&%]/\\\\&/g;
+ s/@@/%@/; s/@@/@%/; s/@g\$/%g/' > conftest.subs <<\\CEOF
+$ac_vpsub
+$extrasub
+s%@SHELL@%$SHELL%g
+s%@CFLAGS@%$CFLAGS%g
+s%@CPPFLAGS@%$CPPFLAGS%g
+s%@CXXFLAGS@%$CXXFLAGS%g
+s%@FFLAGS@%$FFLAGS%g
+s%@DEFS@%$DEFS%g
+s%@LDFLAGS@%$LDFLAGS%g
+s%@LIBS@%$LIBS%g
+s%@exec_prefix@%$exec_prefix%g
+s%@prefix@%$prefix%g
+s%@program_transform_name@%$program_transform_name%g
+s%@bindir@%$bindir%g
+s%@sbindir@%$sbindir%g
+s%@libexecdir@%$libexecdir%g
+s%@datadir@%$datadir%g
+s%@sysconfdir@%$sysconfdir%g
+s%@sharedstatedir@%$sharedstatedir%g
+s%@localstatedir@%$localstatedir%g
+s%@libdir@%$libdir%g
+s%@includedir@%$includedir%g
+s%@oldincludedir@%$oldincludedir%g
+s%@infodir@%$infodir%g
+s%@mandir@%$mandir%g
+s%@CC@%$CC%g
+s%@AS@%$AS%g
+s%@AR@%$AR%g
+s%@LD@%$LD%g
+s%@RANLIB@%$RANLIB%g
+s%@DLLTOOL@%$DLLTOOL%g
+s%@DLLWRAP@%$DLLWRAP%g
+s%@host@%$host%g
+s%@host_alias@%$host_alias%g
+s%@host_cpu@%$host_cpu%g
+s%@host_vendor@%$host_vendor%g
+s%@host_os@%$host_os%g
+s%@target@%$target%g
+s%@target_alias@%$target_alias%g
+s%@target_cpu@%$target_cpu%g
+s%@target_vendor@%$target_vendor%g
+s%@target_os@%$target_os%g
+s%@build@%$build%g
+s%@build_alias@%$build_alias%g
+s%@build_cpu@%$build_cpu%g
+s%@build_vendor@%$build_vendor%g
+s%@build_os@%$build_os%g
+s%@CRT_ID@%$CRT_ID%g
+s%@RUNTIME@%$RUNTIME%g
+s%@MNO_CYGWIN@%$MNO_CYGWIN%g
+s%@THREAD_DLL@%$THREAD_DLL%g
+s%@LIBM_A@%$LIBM_A%g
+s%@LIBGMON_A@%$LIBGMON_A%g
+s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g
+s%@INSTALL_SCRIPT@%$INSTALL_SCRIPT%g
+s%@INSTALL_DATA@%$INSTALL_DATA%g
+
+CEOF
+EOF
+
+cat >> $CONFIG_STATUS <<\EOF
+
+# Split the substitutions into bite-sized pieces for seds with
+# small command number limits, like on Digital OSF/1 and HP-UX.
+ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script.
+ac_file=1 # Number of current file.
+ac_beg=1 # First line for current file.
+ac_end=$ac_max_sed_cmds # Line after last line for current file.
+ac_more_lines=:
+ac_sed_cmds=""
+while $ac_more_lines; do
+ if test $ac_beg -gt 1; then
+ sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file
+ else
+ sed "${ac_end}q" conftest.subs > conftest.s$ac_file
+ fi
+ if test ! -s conftest.s$ac_file; then
+ ac_more_lines=false
+ rm -f conftest.s$ac_file
+ else
+ if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds="sed -f conftest.s$ac_file"
+ else
+ ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file"
+ fi
+ ac_file=`expr $ac_file + 1`
+ ac_beg=$ac_end
+ ac_end=`expr $ac_end + $ac_max_sed_cmds`
+ fi
+done
+if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds=cat
+fi
+EOF
+
+cat >> $CONFIG_STATUS <<EOF
+
+CONFIG_FILES=\${CONFIG_FILES-"Makefile"}
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then
+ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+ case "$ac_file" in
+ *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
+ ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+ *) ac_file_in="${ac_file}.in" ;;
+ esac
+
+ # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories.
+
+ # Remove last slash and all that follows it. Not all systems have dirname.
+ ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
+ if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
+ # The file is in a subdirectory.
+ test ! -d "$ac_dir" && mkdir "$ac_dir"
+ ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`"
+ # A "../" for each directory in $ac_dir_suffix.
+ ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'`
+ else
+ ac_dir_suffix= ac_dots=
+ fi
+
+ case "$ac_given_srcdir" in
+ .) srcdir=.
+ if test -z "$ac_dots"; then top_srcdir=.
+ else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;;
+ /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;;
+ *) # Relative path.
+ srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix"
+ top_srcdir="$ac_dots$ac_given_srcdir" ;;
+ esac
+
+ case "$ac_given_INSTALL" in
+ [/$]*) INSTALL="$ac_given_INSTALL" ;;
+ *) INSTALL="$ac_dots$ac_given_INSTALL" ;;
+ esac
+
+ echo creating "$ac_file"
+ rm -f "$ac_file"
+ configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure."
+ case "$ac_file" in
+ *Makefile*) ac_comsub="1i\\
+# $configure_input" ;;
+ *) ac_comsub= ;;
+ esac
+
+ ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
+ sed -e "$ac_comsub
+s%@configure_input@%$configure_input%g
+s%@srcdir@%$srcdir%g
+s%@top_srcdir@%$top_srcdir%g
+s%@INSTALL@%$INSTALL%g
+" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file
+fi; done
+rm -f conftest.s*
+
+EOF
+cat >> $CONFIG_STATUS <<EOF
+
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+
+exit 0
+EOF
+chmod +x $CONFIG_STATUS
+rm -fr confdefs* $ac_clean_files
+test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1
+
+
diff --git a/winsup/mingw/profile/configure.in b/winsup/mingw/profile/configure.in
new file mode 100644
index 000000000..8f2846e70
--- /dev/null
+++ b/winsup/mingw/profile/configure.in
@@ -0,0 +1,77 @@
+dnl Process this file with autoconf to produce a configure script.
+
+dnl This file is part of Mingw runtime.
+dnl
+dnl This program is free software; you can redistribute it and/or modify
+dnl it under the terms of the GNU General Public License as published by
+dnl the Free Software Foundation; either version 2 of the License, or
+dnl (at your option) any later version.
+dnl
+dnl This program is distributed in the hope that it will be useful,
+dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
+dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+dnl GNU General Public License for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software
+dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+AC_PREREQ(2.12)
+AC_INIT(gcrt0.c)
+
+CC=${CC-cc}
+AC_SUBST(CC)
+AS=${AS-as}
+AC_SUBST(AS)
+AR=${AR-ar}
+AC_SUBST(AR)
+LD=${LD-ld}
+AC_SUBST(LD)
+RANLIB=${RANLIB-ranlib}
+AC_SUBST(RANLIB)
+DLLTOOL=${DLLTOOL-dlltool}
+AC_SUBST(DLLTOOL)
+DLLWRAP=${DLLWRAP-dllwrap}
+AC_SUBST(DLLWRAP)
+AC_CANONICAL_SYSTEM
+
+case "$target_os" in
+*mingw32msvc*)
+ CRT_ID=2
+ MNO_CYGWIN=
+ RUNTIME=msvcrt
+ THREAD_DLL=mingwm
+ LIBM_A=libm.a
+ LIBGMON_A=libgmon.a
+ ;;
+*cygwin*)
+ CRT_ID=1
+ MNO_CYGWIN=-mno-cygwin
+ RUNTIME=crtdll
+ THREAD_DLL=mingwc
+ # Do not build libm.a when building under Cygwin winsup. Otherwise, it'll
+ # overwrite Cygwin's one. Likewise for libgmon.a.
+ LIBM_A=
+ LIBGMON_A=
+ ;;
+*)
+ # Build it for CRTDLL by default.
+ CRT_ID=1
+ MNO_CYGWIN=
+ RUNTIME=crtdll
+ THREAD_DLL=mingwc
+ LIBM_A=libm.a
+ LIBGMON_A=libgmon.a
+ ;;
+esac
+
+AC_SUBST(CRT_ID)
+AC_SUBST(RUNTIME)
+AC_SUBST(MNO_CYGWIN)
+AC_SUBST(THREAD_DLL)
+AC_SUBST(LIBM_A)
+AC_SUBST(LIBGMON_A)
+
+AC_PROG_INSTALL
+AC_OUTPUT(Makefile)
+
diff --git a/winsup/mingw/profile/gcrt0.c b/winsup/mingw/profile/gcrt0.c
new file mode 100644
index 000000000..601b2758c
--- /dev/null
+++ b/winsup/mingw/profile/gcrt0.c
@@ -0,0 +1,52 @@
+/* gcrt0.c
+
+ Copyright 1998 Cygnus Solutions.
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+/*
+ * This file is taken from Cygwin distribution. Please keep it in sync.
+ * The differences should be within __MINGW32__ guard.
+ */
+
+#include <sys/types.h>
+#include <stdlib.h>
+
+#ifdef __MINGW32__
+typedef unsigned char u_char;
+typedef unsigned short u_short;
+typedef unsigned int u_int;
+typedef unsigned long u_long;
+#endif
+
+extern u_char etext asm ("etext");
+extern u_char eprol asm ("__eprol");
+extern void _mcleanup (void);
+extern void monstartup (u_long, u_long);
+void _monstartup (void) __attribute__((__constructor__));
+
+/* startup initialization for -pg support */
+
+void
+_monstartup (void)
+{
+ static int called;
+
+ /* Guard against multiple calls that may happen if DLLs are linked
+ with profile option set as well. Addede side benefit is that it
+ makes profiling backward compatible (GCC used to emit a call to
+ _monstartup when compiling main with profiling enabled). */
+ if (called++)
+ return;
+
+ monstartup ((u_long) &eprol, (u_long) &etext);
+ atexit (&_mcleanup);
+}
+
+asm (".text");
+asm ("__eprol:");
+
diff --git a/winsup/mingw/profile/gmon.c b/winsup/mingw/profile/gmon.c
new file mode 100644
index 000000000..17398b8e2
--- /dev/null
+++ b/winsup/mingw/profile/gmon.c
@@ -0,0 +1,284 @@
+/*-
+ * Copyright (c) 1983, 1992, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#if !defined(lint) && defined(LIBC_SCCS)
+static char rcsid[] = "$OpenBSD: gmon.c,v 1.8 1997/07/23 21:11:27 kstailey Exp $";
+#endif
+
+/*
+ * This file is taken from Cygwin distribution. Please keep it in sync.
+ * The differences should be within __MINGW32__ guard.
+ */
+
+#include <fcntl.h>
+#include <stdlib.h>
+#include <stdio.h>
+#ifndef __MINGW32__
+#include <unistd.h>
+#include <sys/param.h>
+#endif
+#include <sys/types.h>
+#include <gmon.h>
+
+#include <profil.h>
+
+/* XXX needed? */
+//extern char *minbrk __asm ("minbrk");
+
+struct gmonparam _gmonparam = { GMON_PROF_OFF };
+
+static int s_scale;
+/* see profil(2) where this is describe (incorrectly) */
+#define SCALE_1_TO_1 0x10000L
+
+#define ERR(s) write(2, s, sizeof(s))
+
+void moncontrol __P((int));
+
+static void *
+fake_sbrk(int size)
+{
+ return malloc(size);
+}
+
+void
+monstartup(lowpc, highpc)
+ u_long lowpc;
+ u_long highpc;
+{
+ register int o;
+ char *cp;
+ struct gmonparam *p = &_gmonparam;
+
+ /*
+ * round lowpc and highpc to multiples of the density we're using
+ * so the rest of the scaling (here and in gprof) stays in ints.
+ */
+ p->lowpc = ROUNDDOWN(lowpc, HISTFRACTION * sizeof(HISTCOUNTER));
+ p->highpc = ROUNDUP(highpc, HISTFRACTION * sizeof(HISTCOUNTER));
+ p->textsize = p->highpc - p->lowpc;
+ p->kcountsize = p->textsize / HISTFRACTION;
+ p->hashfraction = HASHFRACTION;
+ p->fromssize = p->textsize / p->hashfraction;
+ p->tolimit = p->textsize * ARCDENSITY / 100;
+ if (p->tolimit < MINARCS)
+ p->tolimit = MINARCS;
+ else if (p->tolimit > MAXARCS)
+ p->tolimit = MAXARCS;
+ p->tossize = p->tolimit * sizeof(struct tostruct);
+
+ cp = fake_sbrk(p->kcountsize + p->fromssize + p->tossize);
+ if (cp == (char *)-1) {
+ ERR("monstartup: out of memory\n");
+ return;
+ }
+#ifdef notdef
+ bzero(cp, p->kcountsize + p->fromssize + p->tossize);
+#endif
+ p->tos = (struct tostruct *)cp;
+ cp += p->tossize;
+ p->kcount = (u_short *)cp;
+ cp += p->kcountsize;
+ p->froms = (u_short *)cp;
+
+ /* XXX minbrk needed? */
+ //minbrk = fake_sbrk(0);
+ p->tos[0].link = 0;
+
+ o = p->highpc - p->lowpc;
+ if (p->kcountsize < o) {
+#ifndef notdef
+ s_scale = ((float)p->kcountsize / o ) * SCALE_1_TO_1;
+#else /* avoid floating point */
+ int quot = o / p->kcountsize;
+
+ if (quot >= 0x10000)
+ s_scale = 1;
+ else if (quot >= 0x100)
+ s_scale = 0x10000 / quot;
+ else if (o >= 0x800000)
+ s_scale = 0x1000000 / (o / (p->kcountsize >> 8));
+ else
+ s_scale = 0x1000000 / ((o << 8) / p->kcountsize);
+#endif
+ } else
+ s_scale = SCALE_1_TO_1;
+
+ moncontrol(1);
+}
+
+void
+_mcleanup()
+{
+ int fd;
+ int hz;
+ int fromindex;
+ int endfrom;
+ u_long frompc;
+ int toindex;
+ struct rawarc rawarc;
+ struct gmonparam *p = &_gmonparam;
+ struct gmonhdr gmonhdr, *hdr;
+ char *proffile;
+#ifdef DEBUG
+ int log, len;
+ char dbuf[200];
+#endif
+
+ if (p->state == GMON_PROF_ERROR)
+ ERR("_mcleanup: tos overflow\n");
+
+ hz = PROF_HZ;
+ moncontrol(0);
+
+#ifdef nope
+ if ((profdir = getenv("PROFDIR")) != NULL) {
+ extern char *__progname;
+ char *s, *t, *limit;
+ pid_t pid;
+ long divisor;
+
+ /* If PROFDIR contains a null value, no profiling
+ output is produced */
+ if (*profdir == '\0') {
+ return;
+ }
+
+ limit = buf + sizeof buf - 1 - 10 - 1 -
+ strlen(__progname) - 1;
+ t = buf;
+ s = profdir;
+ while((*t = *s) != '\0' && t < limit) {
+ t++;
+ s++;
+ }
+ *t++ = '/';
+
+ /*
+ * Copy and convert pid from a pid_t to a string. For
+ * best performance, divisor should be initialized to
+ * the largest power of 10 less than PID_MAX.
+ */
+ pid = getpid();
+ divisor=10000;
+ while (divisor > pid) divisor /= 10; /* skip leading zeros */
+ do {
+ *t++ = (pid/divisor) + '0';
+ pid %= divisor;
+ } while (divisor /= 10);
+ *t++ = '.';
+
+ s = __progname;
+ while ((*t++ = *s++) != '\0')
+ ;
+
+ proffile = buf;
+ } else {
+ proffile = "gmon.out";
+ }
+#else
+ proffile = "gmon.out";
+#endif
+
+ fd = open(proffile , O_CREAT|O_TRUNC|O_WRONLY|O_BINARY, 0666);
+ if (fd < 0) {
+ perror( proffile );
+ return;
+ }
+#ifdef DEBUG
+ log = open("gmon.log", O_CREAT|O_TRUNC|O_WRONLY, 0664);
+ if (log < 0) {
+ perror("mcount: gmon.log");
+ return;
+ }
+ len = sprintf(dbuf, "[mcleanup1] kcount 0x%x ssiz %d\n",
+ p->kcount, p->kcountsize);
+ write(log, dbuf, len);
+#endif
+ hdr = (struct gmonhdr *)&gmonhdr;
+ hdr->lpc = p->lowpc;
+ hdr->hpc = p->highpc;
+ hdr->ncnt = p->kcountsize + sizeof(gmonhdr);
+ hdr->version = GMONVERSION;
+ hdr->profrate = hz;
+ write(fd, (char *)hdr, sizeof *hdr);
+ write(fd, p->kcount, p->kcountsize);
+ endfrom = p->fromssize / sizeof(*p->froms);
+ for (fromindex = 0; fromindex < endfrom; fromindex++) {
+ if (p->froms[fromindex] == 0)
+ continue;
+
+ frompc = p->lowpc;
+ frompc += fromindex * p->hashfraction * sizeof(*p->froms);
+ for (toindex = p->froms[fromindex]; toindex != 0;
+ toindex = p->tos[toindex].link) {
+#ifdef DEBUG
+ len = sprintf(dbuf,
+ "[mcleanup2] frompc 0x%x selfpc 0x%x count %d\n" ,
+ frompc, p->tos[toindex].selfpc,
+ p->tos[toindex].count);
+ write(log, dbuf, len);
+#endif
+ rawarc.raw_frompc = frompc;
+ rawarc.raw_selfpc = p->tos[toindex].selfpc;
+ rawarc.raw_count = p->tos[toindex].count;
+ write(fd, &rawarc, sizeof rawarc);
+ }
+ }
+ close(fd);
+}
+
+/*
+ * Control profiling
+ * profiling is what mcount checks to see if
+ * all the data structures are ready.
+ */
+void
+moncontrol(mode)
+ int mode;
+{
+ struct gmonparam *p = &_gmonparam;
+
+ if (mode) {
+ /* start */
+ profil((char *)p->kcount, p->kcountsize, p->lowpc,
+ s_scale);
+ p->state = GMON_PROF_ON;
+ } else {
+ /* stop */
+ profil((char *)0, 0, 0, 0);
+ p->state = GMON_PROF_OFF;
+ }
+}
+
+
diff --git a/winsup/mingw/profile/gmon.h b/winsup/mingw/profile/gmon.h
new file mode 100644
index 000000000..c9f1cac8f
--- /dev/null
+++ b/winsup/mingw/profile/gmon.h
@@ -0,0 +1,178 @@
+/* $OpenBSD: gmon.h,v 1.3 1996/04/21 22:31:46 deraadt Exp $ */
+/* $NetBSD: gmon.h,v 1.5 1996/04/09 20:55:30 cgd Exp $ */
+
+/*-
+ * Copyright (c) 1982, 1986, 1992, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * @(#)gmon.h 8.2 (Berkeley) 1/4/94
+ */
+
+/*
+ * This file is taken from Cygwin distribution. Please keep it in sync.
+ * The differences should be within __MINGW32__ guard.
+ */
+
+#ifndef _SYS_GMON_H_
+#define _SYS_GMON_H_
+
+#ifndef __P
+#define __P(x) x
+#endif
+
+#include <profile.h>
+
+#ifdef __MINGW32__
+typedef unsigned char u_char;
+typedef unsigned short u_short;
+typedef unsigned int u_int;
+typedef unsigned long u_long;
+#endif
+
+/*
+ * Structure prepended to gmon.out profiling data file.
+ */
+struct gmonhdr {
+ u_long lpc; /* base pc address of sample buffer */
+ u_long hpc; /* max pc address of sampled buffer */
+ int ncnt; /* size of sample buffer (plus this header) */
+ int version; /* version number */
+ int profrate; /* profiling clock rate */
+ int spare[3]; /* reserved */
+};
+#define GMONVERSION 0x00051879
+
+/*
+ * histogram counters are unsigned shorts (according to the kernel).
+ */
+#define HISTCOUNTER unsigned short
+
+/*
+ * fraction of text space to allocate for histogram counters here, 1/2
+ */
+#define HISTFRACTION 2
+
+/*
+ * Fraction of text space to allocate for from hash buckets.
+ * The value of HASHFRACTION is based on the minimum number of bytes
+ * of separation between two subroutine call points in the object code.
+ * Given MIN_SUBR_SEPARATION bytes of separation the value of
+ * HASHFRACTION is calculated as:
+ *
+ * HASHFRACTION = MIN_SUBR_SEPARATION / (2 * sizeof(short) - 1);
+ *
+ * For example, on the VAX, the shortest two call sequence is:
+ *
+ * calls $0,(r0)
+ * calls $0,(r0)
+ *
+ * which is separated by only three bytes, thus HASHFRACTION is
+ * calculated as:
+ *
+ * HASHFRACTION = 3 / (2 * 2 - 1) = 1
+ *
+ * Note that the division above rounds down, thus if MIN_SUBR_FRACTION
+ * is less than three, this algorithm will not work!
+ *
+ * In practice, however, call instructions are rarely at a minimal
+ * distance. Hence, we will define HASHFRACTION to be 2 across all
+ * architectures. This saves a reasonable amount of space for
+ * profiling data structures without (in practice) sacrificing
+ * any granularity.
+ */
+#define HASHFRACTION 2
+
+/*
+ * percent of text space to allocate for tostructs with a minimum.
+ */
+#define ARCDENSITY 2
+#define MINARCS 50
+#define MAXARCS ((1 << (8 * sizeof(HISTCOUNTER))) - 2)
+
+struct tostruct {
+ u_long selfpc;
+ long count;
+ u_short link;
+ u_short pad;
+};
+
+/*
+ * a raw arc, with pointers to the calling site and
+ * the called site and a count.
+ */
+struct rawarc {
+ u_long raw_frompc;
+ u_long raw_selfpc;
+ long raw_count;
+};
+
+/*
+ * general rounding functions.
+ */
+#define ROUNDDOWN(x,y) (((x)/(y))*(y))
+#define ROUNDUP(x,y) ((((x)+(y)-1)/(y))*(y))
+
+/*
+ * The profiling data structures are housed in this structure.
+ */
+struct gmonparam {
+ int state;
+ u_short *kcount;
+ u_long kcountsize;
+ u_short *froms;
+ u_long fromssize;
+ struct tostruct *tos;
+ u_long tossize;
+ long tolimit;
+ u_long lowpc;
+ u_long highpc;
+ u_long textsize;
+ u_long hashfraction;
+};
+extern struct gmonparam _gmonparam;
+
+/*
+ * Possible states of profiling.
+ */
+#define GMON_PROF_ON 0
+#define GMON_PROF_BUSY 1
+#define GMON_PROF_ERROR 2
+#define GMON_PROF_OFF 3
+
+/*
+ * Sysctl definitions for extracting profiling information from the kernel.
+ */
+#define GPROF_STATE 0 /* int: profiling enabling variable */
+#define GPROF_COUNT 1 /* struct: profile tick count buffer */
+#define GPROF_FROMS 2 /* struct: from location hash bucket */
+#define GPROF_TOS 3 /* struct: destination/count structure */
+#define GPROF_GMONPARAM 4 /* struct: profiling parameters (see above) */
+#endif /* !_SYS_GMONH_ */
diff --git a/winsup/mingw/profile/mcount.c b/winsup/mingw/profile/mcount.c
new file mode 100644
index 000000000..296f8c891
--- /dev/null
+++ b/winsup/mingw/profile/mcount.c
@@ -0,0 +1,180 @@
+/*-
+ * Copyright (c) 1983, 1992, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#if !defined(lint) && !defined(_KERNEL) && defined(LIBC_SCCS)
+static char rcsid[] = "$OpenBSD: mcount.c,v 1.6 1997/07/23 21:11:27 kstailey Exp $";
+#endif
+
+/*
+ * This file is taken from Cygwin distribution. Please keep it in sync.
+ * The differences should be within __MINGW32__ guard.
+ */
+
+#ifndef __MINGW32__
+#include <sys/param.h>
+#endif
+#include <sys/types.h>
+#include <gmon.h>
+
+/*
+ * mcount is called on entry to each function compiled with the profiling
+ * switch set. _mcount(), which is declared in a machine-dependent way
+ * with _MCOUNT_DECL, does the actual work and is either inlined into a
+ * C routine or called by an assembly stub. In any case, this magic is
+ * taken care of by the MCOUNT definition in <machine/profile.h>.
+ *
+ * _mcount updates data structures that represent traversals of the
+ * program's call graph edges. frompc and selfpc are the return
+ * address and function address that represents the given call graph edge.
+ *
+ * Note: the original BSD code used the same variable (frompcindex) for
+ * both frompcindex and frompc. Any reasonable, modern compiler will
+ * perform this optimization.
+ */
+//_MCOUNT_DECL __P((u_long frompc, u_long selfpc));
+_MCOUNT_DECL(frompc, selfpc) /* _mcount; may be static, inline, etc */
+ register u_long frompc, selfpc;
+{
+ register u_short *frompcindex;
+ register struct tostruct *top, *prevtop;
+ register struct gmonparam *p;
+ register long toindex;
+
+ p = &_gmonparam;
+ /*
+ * check that we are profiling
+ * and that we aren't recursively invoked.
+ */
+ if (p->state != GMON_PROF_ON)
+ return;
+ p->state = GMON_PROF_BUSY;
+ /*
+ * check that frompcindex is a reasonable pc value.
+ * for example: signal catchers get called from the stack,
+ * not from text space. too bad.
+ */
+ frompc -= p->lowpc;
+ if (frompc > p->textsize)
+ goto done;
+
+#if (HASHFRACTION & (HASHFRACTION - 1)) == 0
+ if (p->hashfraction == HASHFRACTION)
+ frompcindex =
+ &p->froms[frompc / (HASHFRACTION * sizeof(*p->froms))];
+ else
+#endif
+ frompcindex =
+ &p->froms[frompc / (p->hashfraction * sizeof(*p->froms))];
+ toindex = *frompcindex;
+ if (toindex == 0) {
+ /*
+ * first time traversing this arc
+ */
+ toindex = ++p->tos[0].link;
+ if (toindex >= p->tolimit)
+ /* halt further profiling */
+ goto overflow;
+
+ *frompcindex = toindex;
+ top = &p->tos[toindex];
+ top->selfpc = selfpc;
+ top->count = 1;
+ top->link = 0;
+ goto done;
+ }
+ top = &p->tos[toindex];
+ if (top->selfpc == selfpc) {
+ /*
+ * arc at front of chain; usual case.
+ */
+ top->count++;
+ goto done;
+ }
+ /*
+ * have to go looking down chain for it.
+ * top points to what we are looking at,
+ * prevtop points to previous top.
+ * we know it is not at the head of the chain.
+ */
+ for (; /* goto done */; ) {
+ if (top->link == 0) {
+ /*
+ * top is end of the chain and none of the chain
+ * had top->selfpc == selfpc.
+ * so we allocate a new tostruct
+ * and link it to the head of the chain.
+ */
+ toindex = ++p->tos[0].link;
+ if (toindex >= p->tolimit)
+ goto overflow;
+
+ top = &p->tos[toindex];
+ top->selfpc = selfpc;
+ top->count = 1;
+ top->link = *frompcindex;
+ *frompcindex = toindex;
+ goto done;
+ }
+ /*
+ * otherwise, check the next arc on the chain.
+ */
+ prevtop = top;
+ top = &p->tos[top->link];
+ if (top->selfpc == selfpc) {
+ /*
+ * there it is.
+ * increment its count
+ * move it to the head of the chain.
+ */
+ top->count++;
+ toindex = prevtop->link;
+ prevtop->link = top->link;
+ top->link = *frompcindex;
+ *frompcindex = toindex;
+ goto done;
+ }
+ }
+done:
+ p->state = GMON_PROF_ON;
+ return;
+overflow:
+ p->state = GMON_PROF_ERROR;
+ return;
+}
+
+/*
+ * Actual definition of mcount function. Defined in <machine/profile.h>,
+ * which is included by <sys/gmon.h>
+ */
+MCOUNT
+
diff --git a/winsup/mingw/profile/profil.c b/winsup/mingw/profile/profil.c
new file mode 100644
index 000000000..d2946210e
--- /dev/null
+++ b/winsup/mingw/profile/profil.c
@@ -0,0 +1,185 @@
+/* profil.c -- win32 profil.c equivalent
+
+ Copyright 1998 Cygnus Solutions.
+
+ This file is part of Cygwin.
+
+ This software is a copyrighted work licensed under the terms of the
+ Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+ details. */
+
+/*
+ * This file is taken from Cygwin distribution. Please keep it in sync.
+ * The differences should be within __MINGW32__ guard.
+ */
+
+#include <windows.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <errno.h>
+#include <math.h>
+
+#include <profil.h>
+
+#define SLEEPTIME (1000 / PROF_HZ)
+
+/* global profinfo for profil() call */
+static struct profinfo prof;
+
+/* Get the pc for thread THR */
+
+static u_long
+get_thrpc (HANDLE thr)
+{
+ CONTEXT ctx;
+ u_long pc;
+ int res;
+
+ res = SuspendThread (thr);
+ if (res == -1)
+ return (u_long) - 1;
+ ctx.ContextFlags = CONTEXT_CONTROL | CONTEXT_INTEGER;
+ pc = (u_long) - 1;
+ if (GetThreadContext (thr, &ctx))
+ pc = ctx.Eip;
+ ResumeThread (thr);
+ return pc;
+}
+
+/* Display cell of profile buffer */
+#if 0
+static void
+print_prof (struct profinfo *p)
+{
+ printf ("profthr %x\ttarget thr %x\n", p->profthr, p->targthr);
+ printf ("pc: %x - %x\n", p->lowpc, p->highpc);
+ printf ("scale: %x\n", p->scale);
+ return;
+}
+#endif
+
+/* Everytime we wake up use the main thread pc to hash into the cell in the
+ profile buffer ARG. */
+
+static DWORD CALLBACK
+profthr_func (LPVOID arg)
+{
+ struct profinfo *p = (struct profinfo *) arg;
+ u_long pc, idx;
+
+ for (;;)
+ {
+ pc = (u_long) get_thrpc (p->targthr);
+ if (pc >= p->lowpc && pc < p->highpc)
+ {
+ idx = PROFIDX (pc, p->lowpc, p->scale);
+ p->counter[idx]++;
+ }
+#if 0
+ print_prof (p);
+#endif
+ Sleep (SLEEPTIME);
+ }
+ return 0;
+}
+
+/* Stop profiling to the profiling buffer pointed to by P. */
+
+static int
+profile_off (struct profinfo *p)
+{
+ if (p->profthr)
+ {
+ TerminateThread (p->profthr, 0);
+ CloseHandle (p->profthr);
+ }
+ if (p->targthr)
+ CloseHandle (p->targthr);
+ return 0;
+}
+
+/* Create a timer thread and pass it a pointer P to the profiling buffer. */
+
+static int
+profile_on (struct profinfo *p)
+{
+ DWORD thrid;
+
+ /* get handle for this thread */
+ if (!DuplicateHandle (GetCurrentProcess (), GetCurrentThread (),
+ GetCurrentProcess (), &p->targthr, 0, FALSE,
+ DUPLICATE_SAME_ACCESS))
+ {
+ errno = ESRCH;
+ return -1;
+ }
+
+ p->profthr = CreateThread (0, 0, profthr_func, (void *) p, 0, &thrid);
+
+ /* Set profiler thread priority to highest to be sure that it gets the
+ processor as soon it request it (i.e. when the Sleep terminate) to get
+ the next data out of the profile. */
+
+ SetThreadPriority (p->profthr, THREAD_PRIORITY_TIME_CRITICAL);
+
+ if (!p->profthr)
+ {
+ CloseHandle (p->targthr);
+ p->targthr = 0;
+ errno = EAGAIN;
+ return -1;
+ }
+ return 0;
+}
+
+/*
+ * start or stop profiling
+ *
+ * profiling goes into the SAMPLES buffer of size SIZE (which is treated
+ * as an array of u_shorts of size size/2)
+ *
+ * each bin represents a range of pc addresses from OFFSET. The number
+ * of pc addresses in a bin depends on SCALE. (A scale of 65536 maps
+ * each bin to two addresses, A scale of 32768 maps each bin to 4 addresses,
+ * a scale of 1 maps each bin to 128k addreses). Scale may be 1 - 65536,
+ * or zero to turn off profiling
+ */
+int
+profile_ctl (struct profinfo * p, char *samples, size_t size,
+ u_long offset, u_int scale)
+{
+ u_long maxbin;
+
+ if (scale > 65536)
+ {
+ errno = EINVAL;
+ return -1;
+ }
+
+ profile_off (p);
+ if (scale)
+ {
+ memset (samples, 0, size);
+ memset (p, 0, sizeof *p);
+ maxbin = size >> 1;
+ prof.counter = (u_short *) samples;
+ prof.lowpc = offset;
+ prof.highpc = PROFADDR (maxbin, offset, scale);
+ prof.scale = scale;
+
+ return profile_on (p);
+ }
+ return 0;
+}
+
+/* Equivalent to unix profil()
+ Every SLEEPTIME interval, the user's program counter (PC) is examined:
+ offset is subtracted and the result is multiplied by scale.
+ The word pointed to by this address is incremented. Buf is unused. */
+
+int
+profil (char *samples, size_t size, u_long offset, u_int scale)
+{
+ return profile_ctl (&prof, samples, size, offset, scale);
+}
+
diff --git a/winsup/mingw/profile/profil.h b/winsup/mingw/profile/profil.h
new file mode 100644
index 000000000..1e3ef479f
--- /dev/null
+++ b/winsup/mingw/profile/profil.h
@@ -0,0 +1,49 @@
+/* profil.h: gprof profiling header file
+
+ Copyright 1998 Cygnus Solutions.
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+/*
+ * This file is taken from Cygwin distribution. Please keep it in sync.
+ * The differences should be within __MINGW32__ guard.
+ */
+
+/* profiling frequency. (No larger than 1000) */
+#define PROF_HZ 100
+
+/* convert an addr to an index */
+#define PROFIDX(pc, base, scale) \
+ ({ \
+ size_t i = (pc - base) / 2; \
+ if (sizeof (unsigned long long int) > sizeof (size_t)) \
+ i = (unsigned long long int) i * scale / 65536; \
+ else \
+ i = i / 65536 * scale + i % 65536 * scale / 65536; \
+ i; \
+ })
+
+/* convert an index into an address */
+#define PROFADDR(idx, base, scale) \
+ ((base) + ((((idx) << 16) / (scale)) << 1))
+
+/* convert a bin size into a scale */
+#define PROFSCALE(range, bins) (((bins) << 16) / ((range) >> 1))
+
+typedef void *_WINHANDLE;
+
+struct profinfo {
+ _WINHANDLE targthr; /* thread to profile */
+ _WINHANDLE profthr; /* profiling thread */
+ u_short *counter; /* profiling counters */
+ u_long lowpc, highpc; /* range to be profiled */
+ u_int scale; /* scale value of bins */
+};
+
+int profile_ctl(struct profinfo *, char *, size_t, u_long, u_int);
+int profil(char *, size_t, u_long, u_int);
+
diff --git a/winsup/mingw/profile/profile.h b/winsup/mingw/profile/profile.h
new file mode 100644
index 000000000..d578657f8
--- /dev/null
+++ b/winsup/mingw/profile/profile.h
@@ -0,0 +1,63 @@
+/* $NetBSD: profile.h,v 1.6 1995/03/28 18:17:08 jtc Exp $ */
+
+/*
+ * Copyright (c) 1992, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * @(#)profile.h 8.1 (Berkeley) 6/11/93
+ */
+
+/*
+ * This file is taken from Cygwin distribution. Please keep it in sync.
+ * The differences should be within __MINGW32__ guard.
+ */
+
+#define _MCOUNT_DECL static inline void _mcount
+
+#define MCOUNT \
+void \
+mcount() \
+{ \
+ int selfpc, frompcindex; \
+ /* \
+ * find the return address for mcount, \
+ * and the return address for mcount's caller. \
+ * \
+ * selfpc = pc pushed by mcount call \
+ */ \
+ __asm("movl 4(%%ebp),%0" : "=r" (selfpc)); \
+ /* \
+ * frompcindex = pc pushed by call into self. \
+ */ \
+ __asm("movl (%%ebp),%0;movl 4(%0),%0" : "=r" (frompcindex)); \
+ _mcount(frompcindex, selfpc); \
+}
+
diff --git a/winsup/mingw/readme.txt b/winsup/mingw/readme.txt
new file mode 100644
index 000000000..4b680df48
--- /dev/null
+++ b/winsup/mingw/readme.txt
@@ -0,0 +1,685 @@
+ Minimalist GNU-Win32 Readme
+ version 0.1.3
+ March 20, 1997
+ Colin Peters <colin@bird.fu.is.saga-u.ac.jp>
+
+
+0. Introduction
+
+Mingw32 is short for the Minimalist GNU-Win32 package, and it is a
+package which allows you to use GCC (as supplied by Cygnus in their GNU-
+Win32 or Cygwin32 package) the GNU compiler, on Win32 platforms like
+Windows 95 or NT, to compile "native" programs.
+
+In this case "native" means programs which don't require extra DLLs like
+the cygwin DLL. Mingw32 programs use CRTDLL.DLL to provide their C run
+time library functions, and CRTDLL.DLL is supplied with all current
+Win32 platforms. Thus the programs are light weight and easy to
+distribute, they also do not automatically fall under the GNU Public
+License as programs written with the GPL version of Cygwin32 do.
+
+
+0.1 Archive Contents
+
+Mingw32 version 0.1.3 is distributed in two files, mingw32_013.tar.gz
+and mingsrc013.tar.gz. The first file contains the following components:
+
+ - Import libraries for building programs which use the
+ CRTDLL.DLL C run time library supplied with Win32 platforms.
+
+ - crt0.o and dllcrt0.o, two "startup code" object files that
+ perform program or DLL initialization without using
+ CRTDLL.DLL (instead of CYGWIN.DLL).
+
+ - specs, a configuration file for GCC which defines appropriate
+ options for creating executables which use the CRTDLL.DLL C
+ run time library.
+
+ - Include files with appropriate type and macro definitions,
+ and function prototypes for use with CRTDLL.DLL.
+
+The source distribution (mingsrc013.tar.gz) contains the .def files and
+source files used to create the various import libraries and object
+files in the above list.
+
+
+0.2 Usage Notes
+
+Unlike some previous releases of Mingw32 the current version defaults to
+building console applications, the same way that GCC normally does when
+installed from the Cygnus distribution. The Mingw32 specs file also
+introduces two command line arguments to GCC which can be used to
+conveniently specify a console or GUI type build. When building console
+programs "-console" can be used on the GCC command line, while GUI
+programs can be built by specifying "-windows" (I tried defining -gui,
+and it works, but produces an annoying warning about -gui not being
+supported (?)). For example:
+
+ gcc -o hellogui.exe hellogui.c -luser32 -windows
+
+Although using different "crt0" files for GUI and console applications
+has been suggested I have left the system more-or-less as it was in
+0.1.1: crt0 sets up for and calls main, and if you don't supply a main
+there is one in libmingw32.a, which in turn calls WinMain (actually
+WinMain@16). This allows either main or WinMain entry points in console
+or GUI applications, but if you don't supply main or WinMain, or don't
+prototype WinMain as __stdcall__ you will get a linker error about an
+"unresolved reference to WinMain@16." This is unfortunately cryptic, but
+otherwise the system works quite well.
+
+An important note if you want to rebuild from the sources of Mingw32 or
+otherwise use the special version of Jam made for Mingw32: you need to
+have a version of "rm", the UNIX equivalent of del, somewhere in your
+path to use the current Jambase (which is built into the Jam
+executable). The version that comes with the Cygnus files is perfectly
+adequate.
+
+
+0.3 Fixes and Improvements
+
+Numerous small bug fixes have been made in the header files.
+
+Floating point initialization, originally added in version 0.1.2, has
+been modified to use the _fpreset function from CRTDLL.DLL instead of
+cryptic and possibly less portable assembly code.
+
+A new DLL-building option has been added to the specs file so that the
+following link line will appropriately link in dllcrt0.o instead of the
+normal crt0.o, and set the entry point correctly:
+
+ gcc -dll -o dll.dll dll.o -Wl,dll.exp
+
+A bug that would cause the wrong include files to be included in dual
+installations of Cygwin32 and Mingw32 has been fixed (I hope) in the
+Mingw32 specs file.
+
+Alongside this release is a new release of Jam specially built for use
+with Mingw32. It should be available from the same place you got this
+file. This release of Jam includes rules for building DLLs, including
+resources in your executables and creating import libraries. I also
+intend to distribute a small set of example files showing how to do all
+of these things with Mingw32 and Jam.
+
+In the "coming soon" category I have a version of the GNU Standard C++
+library ported to Mingw32. This means you can use iostreams, complex
+numbers and all those neat STL (Standard Template Library) things
+without needing the Cygwin DLL. I hope to put this port up for
+downloading soon (along with the source of course).
+
+
+
+1. Installing
+
+1.1 Download and Unpack GNU-Win32 Beta 17.1
+
+Because of the enormous size of the beta 17.1 release from Cygnus this
+process will require about 85 MB or more of free disk space. The first
+step, after downloading the Mingw32 package, is to download the GCC
+binary distribution, all.tar.gz, from Cygnus (or a mirror), which is
+about 10 MB. (Of course, if you just want the Cygwin32 install and are
+not actually interested in adding on Mingw32 you don't need the Mingw32
+package at all.)
+
+Just to be safe, and if you have the 10 MB to spare, you should probably
+copy the all.tar.gz file to a reasonably safe place at this point. This
+will save you from the pain of downloading it again if something goes
+wrong later.
+
+To complete this step you need a gzip program (or just gunzip) and a tar
+program. You can use the ones supplied by Cygnus (although some people
+seem to have trouble with them, especially if you try to use pipes) or
+one of the other ports available from your favorite freeware/shareware
+software site.
+
+First un-gzip the file with a command line like:
+ gunzip all.tar.gz
+or
+ gzip -d all.tar.gz
+
+This will produce a all.tar file and erase the all.tar.gz file (there
+are options for gzip if you want to keep the original around). The tar
+file is about 40 MB.
+
+Make a directory for the cygnus stuff, such as C:\cygnus for example.
+Move the tar file there (e.g. move \tmp\all.tar \cygnus). Don’t copy it
+unless you like waiting and wasting 40 MB of disk space.
+
+Unpack the tar file into your new directory with a command line like:
+ tar xvf all.tar
+
+Run from the new directory (now containing the tar file). This is the
+step where disk space usage reaches its peak, since the tar extraction
+does not delete the all.tar file, and the amount of space taken by the
+extracted files plus the tar file itself is well in excess of 80 MB
+(mainly because, on my system at least, the files which are symbolic
+links in the tar archive are copied as they are expanded onto the FAT
+filesystem, so for example, a symbolic link to cygwin.dll, a 3 MB file,
+takes an extra 3 MB, since the file is simply duplicated in the new
+location). I could not actually do this on my laptop and had to extract
+the tar file from a mounted network drive!
+
+NOTE: From here on I will refer to files as if you had installed in
+C:\cygnus. If you installed somewhere else then just replace C:\cygnus
+with the appropriate path wherever it occurs.
+
+
+1.2 Setup Cygwin32
+
+This step is not 100% necessary, but it helps at this point to determine
+if you’ve gotten this far without any major problems. Also, if you
+intend to use both Cygwin32 and Mingw32 you will have to do some of
+these steps eventually.
+
+GCC and the other programs in the compiler suite all require cygwin.dll
+to run. There are two copies of this file: one in C:\cygnus\H-i386-
+cygwin32\bin (this might be a symbolic link), and one in C:\cygnus\H-
+i386-cygwin32\i386-cygwin32\lib (the original). Since this DLL is
+required by all Cygwin32 programs it makes sense to put one copy of it
+in your C:\Windows\System directory (or equivalent) and remove the extra
+copies. This will also save you headaches when the next release comes
+along and you have to make sure that everything is using the latest
+release of the DLL.
+
+After doing that run the cygwin32.bat batch file included with this
+distribution, or otherwise perform the following settings:
+
+ PATH=%PATH%;C:\cygnus\H-i386-cygwin32\bin
+ SET GCC_EXEC_PREFIX=C:\cygnus\H-i386-cygwin32\lib\gcc-lib\i386-
+ cygwin32\cygnus-2.7.2-961023
+ SET LIBRARY_PATH=/cygnus/H-i386-cygwin32/lib/gcc-lib/i386-
+ cygwin32/cygnus-2.7.2-961023:/cygnus/H-i386-cygwin32/i386-
+ cygwin32/lib:/cygnus/H-i386-cygwin32/lib
+ SET C_INCLUDE_PATH=/cygnus/H-i386-cygwin32/lib/gcc-lib/i386-
+ cygwin32/cygnus-2.7.2-961023/include:/cygnus/H-i386-
+ cygwin32/i386-cygwin32/include:/cygnus/include
+ SET CPLUS_INCLUDE_PATH=%C_INCLUDE_PATH%
+
+NOTE: You may need to increase the amount of environment space available
+at the command prompt to get these extremely long environment variables
+set. You can do this under Windows 95 by modifying the properties of the
+command prompt shortcut you use under the "Program" tab, adding a
+/e:#### argument to the command line COMMAND.COM, where #### is the
+number of bytes to set aside for the environment.
+
+NOTE: Under Windows 95 changes made in your autoexec.bat file will not
+show up in new DOS boxes unless you reboot your machine.
+
+Now write and compile a small test hello world program like this:
+
+#include <stdio.h>
+
+int
+main ()
+{
+ printf ("Hello, world!\n");
+ return 0;
+}
+
+Then compile it like this (assuming your file is called hello.c):
+
+ gcc -o hello.exe hello.c
+
+The compile should proceed without problems and you should be able to
+run the hello program at the end. It should print "Hello, world!"
+(without the quotes) to the console and then return to the command
+prompt.
+
+If you wanted a full Cygwin32 install you now have it. With this setup
+(say, by adding those lines above to your autoexec.bat or global
+settings) you can port a great deal of UNIX code to run under Win32
+systems. No more steps are necessary.
+
+If you are a minimalist or otherwise want to save disk space you should
+continue from here. Also if you intend to use the Minimalist GNU-Win32
+files to compile programs which don't use the Cygwin32 API you will need
+to do some of the things mentioned below.
+
+If the compile didn't work for some reason check very carefully that you
+followed the instructions above correctly and then check whether one or
+more of the files in the download got corrupted. If neither of these
+seems to be the case then your system is not behaving like my system.
+Try looking at the troubleshooting section later in this file, and if
+none of that helps then you can email me (colin@bird.fu.is.saga-
+u.ac.jp), though I can't promise I'll be a lot of help.
+
+
+1.3 Separating the Win32 API Files
+
+Mingw32 and Cygwin32 share the same set of Win32 API include files and
+import libraries as included in the GCC distribution from Cygnus. In
+order to use the Win32 API with a dual setup or with Mingw32 alone you
+will have to separate those files from the bulk of the Cygwin32 API
+files.
+
+Make a new directory to serve as the root for the Win32 API files. I put
+mine under C:\cygnus and called it win32, but you can put it where you
+like and just replace later references to C:\cygnus\win32 with your own
+root directory.
+
+Move the following from C:\cygnus\H-i386-cygwin32\i386-cygwin32\include
+to a new C:\cygnus\win32\include directory:
+
+windows.h, winadvapi.h, winbase.h, wincon.h, windef.h, windowsx.h,
+winerror.h, wingdi.h, winkernel.h, winnt.h, wintypes.h, winuser.h,
+winversion.h, commdlg.h, ddeml.h and the Windows32 sub-directory and all
+its contents.
+
+Move the following files from C:\cygnus\H-i386-cygwin32\i386-
+cygwin32\lib to a new C:\cygnus\win32\lib directory:
+
+libadvapi32.a, libcomctl32.a, libcomdlg32.a, libctl3d32.a, libgdi32.a,
+libglaux.a, libglu32.a, libimm32.a, libkernel32.a, liblz32.a,
+libmapi32.a, libmfcuia32.a, libmgmtapi.a, libmpr.a, libmsacm32.a,
+libnddeapi.a, libnetapi32.a, libodbc32.a, libodbccp32.a, libole32.a,
+liboleaut32.a, liboledlg.a, libolepro32.a, libopengl32.a, libpenwin32.a,
+libpkpd32.a, librasapi32.a, librpcdce4.a, librpcndr.a, librpcns4.a,
+librpcrt4.a, libscrnsave.a, libshell32.a, libsnmp.a, libsvrapi.a,
+libtapi32.a, libth32.a, libthunk32.a, liburl.a libuser32.a, libvdmdbg.a,
+libversion.a, libvfw32.a, libwin32spl.a, libwinmm.a, libwinserve.a,
+libwinspool.a, libwinstrm.a, libwow32.a, libwsock32.a, libwst.a.
+
+That list is quite excessive for most basic Windows programming, which
+will only require kernel32, user32, gdi32, shell32 and possibly a couple
+of others like the common control and dialog libraries or advapi32. You
+may not need the ODBC support, or OLE, or Pen Windows, TAPI and on and
+on. Still, if you have the space and intend to use the Win32 API you
+might as well keep the ones you’re not sure you’ll ever use around.
+
+The lists above can also act as lists of files you can safely delete if
+you are never going to use the Win32 API in your programs except that
+libkernel32.a is still required even if you don’t use the Win32 API
+yourself. Note that this means that libkernel32.a must be on the library
+path as well, even if you don’t use the Win32 API. (Actually this
+appears to be an artifact of the specs file supplied with Cygwin32. If
+you like, and feel up to it, you can play around with the specs file and
+remove the reference to kernel32.)
+
+Here are the variable settings you need to make to allow GCC to find the
+Win32 API files in their new positions:
+
+ SET LIBRARY_PATH=%LIBRARY_PATH%:/cygnus/win32/lib
+ SET C_INCLUDE_PATH=%C_INCLUDE_PATH%:/cygnus/win32/include
+ SET CPLUS_INCLUDE_PATH=%CPLUS_INCLUDE_PATH%:/cygnus/win32/include
+
+The file win32-api.bat performs these settings. Run it after you run
+cygwin32.bat (or mingw32.bat below).
+
+At this point you should be able to compile programs that use the Win32
+API, just as you could before. You might want to do a simple test
+compile to find out, for example this code:
+
+#include <windows.h>
+
+int STDCALL
+WinMain (HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpCmd, int nShow)
+{
+ MessageBox (NULL, "Test message", "Test", MB_OK);
+ return 0;
+}
+
+Should compile with the following command line:
+ gcc -o test.exe test.c -lkernel32 -luser32 -Wl,--subsystem,windows
+
+It will produce a warning at link time about not finding
+_WinMainCRTStartup, but this is harmless.
+
+If you have trouble check the troubleshooting section later in this
+file.
+
+
+1.4 Specs
+
+The file C:\cygnus\H-i386-cygwin32\lib\gcc-lib\i386-cygwin32\cygnus-
+2.7.2-961023\specs includes a set of options and defaults for GCC,
+including such things as which libraries are automatically linked into
+executables and such. A different specs file is required depending on
+whether you use Cygwin32 or Mingw32.
+
+To avoid GCC accidentally using the wrong specs file move specs to
+C:\cygnus\H-i386-cygwin32\i386-cygwin32\lib.
+
+You can verify what specs file is being used by attempting a compile
+with the -v option to gcc. Note that if no specs file is mentioned the
+compiler will default to Cygwin32 behavior.
+
+
+1.5 The Mingw32 Files
+
+Now we can install the Mingw32 files and start making programs which
+don’t use cygwin.dll or the Cygwin32 API. I install my copy under a
+separate directory called C:\mingw32, but you could put them wherever
+you like (e.g. C:\cygnus\mingw32). Again simply replace references to
+C:\mingw32 with the directory where you perform your installation.
+
+After making the install directory copy mingw32_012.tgz to that
+directory and run a command like this:
+ gunzip -d mingw32_012.tgz
+
+in that directory, followed by:
+ tar xvf mingw32_012.tar
+
+This will unpack the required files. Then you can use the following
+environment variable settings (as included in mingw32.bat) to setup for
+compiles using Mingw32:
+
+ PATH=%PATH%;C:\cygnus\H-i386-cygwin32\bin
+ SET GCC_EXEC_PREFIX=C:\cygnus\H-i386-cygwin32\lib\gcc-lib\i386-
+ cygwin32\cygnus-2.7.2-961023\
+ SET LIBRARY_PATH=/mingw32/lib
+ SET C_INCLUDE_PATH=/mingw32/include:/mingw32/include/nonansi
+ SET CPLUS_INCLUDE_PATH=%C_INCLUDE_PATH%
+
+The mingw32.bat file can be used the same way as the cygwin32.bat file.
+Depending on which one you run you will be able to do Mingw32 compiles
+or Cygwin32 compiles. Note that whichever one you use you must follow it
+with an invocation of win32-api.bat so that libkernel32.a will be in the
+library path.
+
+Setup is now complete, you have complete working Mingw32 and Cygwin32
+compiles available along with the bash shell, tons of UNIX-like
+utilities.
+
+If you had trouble with any of the steps above then the next section is
+for you.
+
+
+
+2. Troubleshooting Setup Problems
+
+If you ran into trouble at any stage in the section 1 here are a few
+general guidelines as well as some solutions to common problems.
+
+2.1 Winzip, gunzip or tar Complains of Errors
+
+Winzip may complain that it could not create a file with garbage
+characters in it's name. Gunzip, gzip or tar may complain about
+formatting errors. Usually this means that the downloaded file is
+corrupted. As of this writing this problem was most commonly caused when
+downloading the files from Geocities using Netscape Navigator for
+Windows 95 or NT. A combination of a badly set MIME type at Geocities
+and a bug in Netscape will corrupt files saved with "Save Link As" (and
+clicking on the links would display the files as garbage text). At this
+time the only solutions are to use another browser (IE, or Netscape for
+UNIX or Apple systems) or to download from the Japanese mirror
+(http://www.fu.is.saga-u.ac.jp/~colin/gcc.html). Hopefully Geocities
+will eventually fix their problem.
+
+
+2.2 Compile and Link Time Problems: General Steps
+
+First, evaluate that your environment variables are what you expect them
+to be by running the SET command with no arguments (if you are using the
+bash shell then the output of env might also be illuminating). Do this
+immediately before you attempt a compile in the same window as the
+compile.
+
+Secondly include the '-v' option on the gcc command line. This will give
+you far more information on what happens during the compile, especially
+important are which specs file is being used and what include file
+directories are being read, as well as the arguments to cpp and ld.
+
+If you send me email about a problem the output of these two general
+steps will be very helpful in making a diagnosis.
+
+
+2.3 Cannot exec 'cpp'
+
+On compiling you get an error message like this:
+
+ GCC.EXE: installation problem, cannot exec `cpp': No such file
+ or directory
+ GCC.EXE: Internal compiler error: program cpp got fatal signal 127
+
+This means more or less what it says. The program cpp is the C
+preprocessor (it strips comments and interprets all those lines
+beginning in '#') and running it is the first step in compiling a C or
+C++ program. The problem here is that GCC.EXE cannot find CPP.EXE.
+Normally CPP.EXE is in the directory C:\cygnus\H-i386-cygwin32\lib\gcc-
+lib\i386-cygwin32\cygnus-2.7.2-961023\. If the file is there then
+probably the GCC_EXEC_PREFIX environment variable is not correctly set.
+
+
+2.4 Can't Find Include Files
+
+You get an error like this:
+
+ hello.c:2: No include path in which to find stdio.h
+
+This, again, means what it says (more or less). The compiler cannot find
+the file stdio.h which is #included in the source file hello.c at line
+2. Of course the particular file names may differ in your case. If this
+is not simply a case of including a really non-existent file or
+misspelling the file name then probably your C_INCLUDE_PATH or
+CPLUS_INCLUDE_PATH environment variable is wrong. (If not, see "But the
+environment variables are right" below.)
+
+
+2.5 Can't Find Libraries
+
+At link time you get an error like this:
+
+ ld: cannot open -lkernel32: No such file or directory
+
+This one is a bit cryptic, mainly because the name of the file that
+can't be opened is not "-lkernel32" but "libkernel32.a". "-lname" is the
+ld command line syntax for linking the library named "libname.a". So
+basically this error is saying it can't find libkernel32.a (or whatever
+library matches the error you got). If you weren't trying to manually
+link in a library that doesn't exist or was misspelled (by accidentally
+including the 'lib' or '.a' on the command line for example) then
+probably your LIBRARY_PATH environment variable is wrong. (If not, see
+"But the environment variables are right" below.)
+
+
+2.6 But the Environment Variables are Right!
+
+You had one of the problems with not finding include files or libraries
+but the environment variables all seem to be pointing at the right
+places and the files are all there.
+
+If you installed on a drive other than C: drive this may be your
+problem. The Cygwin DLL, and thus all the basic compiler tools,
+automatically map C: drive to (UNIX-style) '/'. Thus /cygnus is actually
+C:\cygnus. There are a few ways to fix this (without reinstalling on C:
+drive):
+
+ - Map your actual install directory to /cygnus using mount
+ (mount.exe is included with the Cygnus distribution). Simply
+ type "mount D:\mydir /cygnus" (assuming you installed in the
+ directory \mydir on D: drive). Similar tricks can be used for
+ other directories which you may have installed on other drives.
+
+ - Change the mount of C: to / to the actual install drive. This is
+ possible by using the registry editor (regedit) included with
+ Windows. Start the editor and go to the key (or folder) "My
+ Computer\HKEY_CURRENT_USER\Software\Cygnus Support\CYGWIN.DLL
+ setup\b15.0\mounts". Under this key there are several numbered
+ keys. One of them will have the variables "native" set to "c:" and
+ "unix" set to "/". Change the value of "native" to whatever drive
+ you did your install on and everything should be fixed. NOTE: You
+ should probably do this after a fresh boot with no Cygnus based
+ programs running.
+
+
+2.7 Unresolved References to _impure_ptr and/or _ctype_ etc.
+
+At link time your code produces unresolved references to _impure_ptr,
+_ctype_ and/or _errno, among others.
+
+This is the result of using the Cygwin header files but linking against
+the Mingw32 libraries. I have hopefully managed to fix the bug that used
+to cause this problem on any dual installation, but perhaps I haven't.
+To check you can run gcc with the -v option and see if the list of
+directories searched for include files contains any include directories
+with Cygwin headers in them. If everything is working correctly you
+should only see the directories on your C_INCLUDE_PATH in this list.
+
+If you have this problem then you may have to modify the Mingw32 specs
+file, specifically the part that says:
+
+*cpp:
+%{posix:-D_POSIX_SOURCE} -iprefix /mingw32/include/
+
+These are options that get passed to the C preprocessor by gcc. Consult
+the documentation for cpp and try options other than -iprefix. You may
+have to use -nostdinc and/or -nostdinc++ plus -I options to get the
+correct behavior.
+
+
+2.8 My Program Doesn't Print Any Output OR My Windows Program Creates
+ A Console Window
+
+Your console application runs, but doesn't print any output, or your GUI
+application runs fine, but always creates an extra console window when
+run from Explorer or by double clicking on an icon.
+
+These are basically two sides of the same coin. You have created a GUI
+(or console) application when you meant to create a console (or GUI)
+application. By default gcc creates console applications. If you make a
+windows GUI application with a WinMain and all that you will still get a
+console application if you don't tell gcc what to do at link time. The
+relevant options are "-windows" "-Wl,--subsystem,windows" or "-Wl,--
+subsystem,console". The first two, if used on a gcc link line, will
+create a proper GUI application. The last will make sure you are making
+a console application.
+
+
+
+3. Optimizing and Reducing Disk Space Usage
+
+There are still vast amounts of disk space used by the Cygwin32
+installation on your hard-drive, and much of it can be removed while
+still maintaining a fully functional compiler system. The following
+sections point out which files you actually need for certain tasks, so
+that you won’t delete them.
+
+
+3.1 Bare Minimum
+
+For C only, Mingw32 compiles which don’t use the Win32 API, and if you
+don’t want to produce DLLs or do debugging with any of the GNU tools the
+list of files required is as follows:
+
+In C:\cygnus\H-i386-cygwin32\bin:
+ ar.exe, as.exe, gcc.exe, ld.exe
+
+In C:\cygnus\H-i386-cygwin32\lib\gcc-lib\i386-cygwin32\cygnus-2.7.2-
+961023:
+ cc1.exe, cpp.exe, libgcc.a
+
+In C:\cygnus\win32\lib:
+ libkernel32.a
+
+Plus all the files in C:\mingw32\lib and C:\mingw32\include and their
+subdirectories.
+
+
+3.2 C++ Support
+
+To add C++ Support to the above the following extra files are required:
+
+In C:\cygnus\H-i386-cygwin32\lib\gcc-lib\i386-cygwin32\cygnus-2.7.2-
+961023:
+ cc1plus.exe
+
+Note that this does not include support for the standard C++ libraries
+(only the C run time libraries) or for iostreams. That support is still
+only available with the Cygwin32 API.
+
+
+3.3 Extra Utilities of Extreme Usefulness
+
+Even if you do not use the bash shell or UNIX utilities in general some
+of the utilities in C:\cygnus\H-i386-cygwin32\bin are extremely useful
+for debugging and probably shouldn’t be deleted if you intend to do any
+actual programming using the system.
+
+These include:
+ dlltool.exe, gdb.exe, nm.exe, and strip.exe.
+
+
+3.4 Jam
+
+Jam is a make replacement program that I use pretty much exclusively,
+which is why you don't find any Makefile, makefile, makefile.mk or all
+that in the stuff that I do. You do find jamfiles and the occaisional
+mk.bat file. The executable of Jam is only 80 KB and the program is
+incredibly useful, so I would encourage you do download the special
+Mingw32 version and check it out. The Mingw32 version has built in rules
+for adding resources, building DLLs and import libraries as well as
+normal C and C++ files. The source code is, of course, freely available.
+
+The actual point of this section though, is to point out that to use Jam
+you need not only the Jam executable but also rm.exe from the Cygwin
+distribution. You also might want to download rcl.exe and res2coff.exe
+as these are the helper programs Jam expects to use for resource script
+handling.
+
+
+4. Legalities
+
+All of the code in the Mingw32 package is available as public domain
+source. You may use and modify the code as you like. Of course I
+encourage you to write software which is free, either public domain or
+under the GNU Public License for example, but that is up to you. Linking
+with the libraries included with Mingw32 similarly does not impose any
+licensing restrictions on your code or binaries.
+
+The library libgcc.a, which is linked into all code produced with GCC,
+is under a special version of the LGPL (as far as I know, you should
+check for yourself) which allows the distribution of programs which are
+simply linked with unmodified versions of libgcc.a with no licensing
+restrictions.
+
+Thus, using Mingw32, you should be able to produce code with no
+licensing restrictions imposed by use of the compiler or libraries. The
+Cygwin32 API, and the GNU libraries are another matter and you should
+consult their license agreements.
+
+Again I must stress that I am not a lawyer and the above statements only
+reflect my personal understanding of the situation. You would be well
+advised to consult the actual text of the appropriate copyright notices
+and license agreements if you have any concerns.
+
+
+5. Support
+
+First of all, the Mingw32 code is supplied AS IS with NO WARRANTY either
+EXPRESS or IMPLIED.
+
+There is also no support staff standing by to take your calls. There
+are, however, a few people, including myself, using Mingw32 who might be
+able to help you. If you have problems you can email me at
+colin@bird.fu.is.saga-u.ac.jp and I will try to get back to you. No
+guarantees, but I will do my best.
+
+
+6. Suggestions and Contributions
+
+If you find a bug in the Mingw32 files themselves then feel free to
+report it, or even better to supply a fix, by emailing me at
+colin@bird.fu.is.saga-u.ac.jp. Any fixes I receive will probably go into
+the next release, and if they seem high-priority I may put the patched
+files on my web page until I can make a complete release. Please note
+that if you supply code it must be in the public domain or I cannot
+include it in Mingw32. Please attach an appropriate legal message to the
+code or otherwise make sure that there are no copyright issues. Of
+course if you just suggest a possible method for solving a problem or
+point out a bug then there should be no need for all that.
+
+Note that the Win32 API header files are not actually part of the
+Mingw32 package. I know there are many bugs and omissions, and I try to
+keep informed about them, so I do appreciate mail pointing them out.
+However I can’t fix these problems at the source. You should send email
+to Scott Christley (the author of the GPL windows32-api) or possibly to
+Cygnus. Sending email to me might get me to mention it on my homepage or
+fix it in my personal copy of the header files, but that’s about it
+(sorry).
+
+Aside from bug reports, suggestions for improvements, testing of the
+header files and otherwise praise or criticism is all welcome in my
+inbox.
+
+Good luck,
+Colin Peters (colin@bird.fu.is.saga-u.ac.jp)
+
diff --git a/winsup/mingw/samples/dirent/jamfile b/winsup/mingw/samples/dirent/jamfile
new file mode 100644
index 000000000..4bfdc2461
--- /dev/null
+++ b/winsup/mingw/samples/dirent/jamfile
@@ -0,0 +1,3 @@
+
+Main test.exe : test.c ;
+
diff --git a/winsup/mingw/samples/dirent/test.c b/winsup/mingw/samples/dirent/test.c
new file mode 100644
index 000000000..bb4629fea
--- /dev/null
+++ b/winsup/mingw/samples/dirent/test.c
@@ -0,0 +1,91 @@
+/*
+ * A test which demonstrates the use of opendir and related functions
+ * declared in dirent.h.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <errno.h>
+
+#include <dirent.h>
+
+int
+main (int argc, char* argv[])
+{
+ int i;
+ struct dirent* de;
+ DIR* dir;
+ long lPos;
+
+ if (argc == 2)
+ {
+ printf ("Opening directory \"%s\"\n", argv[1]);
+ dir = opendir(argv[1]);
+ }
+ else
+ {
+ printf ("Opening \".\"\n");
+ dir = opendir(".");
+ }
+
+ if (!dir)
+ {
+ printf ("Directory open failed!\n");
+ if (errno)
+ {
+ printf ("Error : %s\n", strerror(errno));
+ }
+ return 1;
+ }
+
+ i = 0;
+ lPos = -1;
+
+ while (de = readdir (dir))
+ {
+ i++;
+ printf ("%d : \"%s\" (tell %ld)\n", i, de->d_name,
+ telldir(dir));
+
+ if (i == 3)
+ {
+ printf ("We will seek here later.\n");
+ lPos = telldir (dir);
+ }
+ }
+
+ printf ("Rewind directory.\n");
+ rewinddir (dir);
+
+ if (de = readdir (dir))
+ {
+ printf ("First entry : \"%s\"\n", de->d_name);
+ }
+ else
+ {
+ printf ("Empty directory.\n");
+ }
+
+ if (lPos != -1)
+ {
+ printf ("Seeking to fourth entry.\n");
+ seekdir (dir, lPos);
+
+ if (de = readdir (dir))
+ {
+ printf ("Fourth entry : \"%s\"\n", de->d_name);
+ }
+ else
+ {
+ printf ("No fourth entry.\n");
+ }
+ }
+ else
+ {
+ printf ("Seek position is past end of directory.\n");
+ }
+
+ printf ("Closing directory.\n");
+ closedir (dir);
+}
+
diff --git a/winsup/mingw/samples/dlltest/dll.c b/winsup/mingw/samples/dlltest/dll.c
new file mode 100644
index 000000000..ba00fab3e
--- /dev/null
+++ b/winsup/mingw/samples/dlltest/dll.c
@@ -0,0 +1,22 @@
+/*
+ * Source code of the functions inside our test DLL. Note that DllMain is
+ * not required (it will be provided by the stub in libmingw32.a).
+ */
+
+#if 0
+#include <windows.h>
+#endif
+
+int Add (int x, int y)
+{
+ printf ("In add!\nx = %d\ny = %d\n", x, y);
+ return (x + y);
+}
+
+
+double __attribute__((stdcall)) Sub (double x, double y)
+{
+ printf ("In sub!\nx = %f\ny = %f\n", x, y);
+ return (x - y);
+}
+
diff --git a/winsup/mingw/samples/dlltest/dll.def b/winsup/mingw/samples/dlltest/dll.def
new file mode 100644
index 000000000..4572319b3
--- /dev/null
+++ b/winsup/mingw/samples/dlltest/dll.def
@@ -0,0 +1,3 @@
+EXPORTS
+Add
+Sub@16
diff --git a/winsup/mingw/samples/dlltest/dll.h b/winsup/mingw/samples/dlltest/dll.h
new file mode 100644
index 000000000..35faa4c32
--- /dev/null
+++ b/winsup/mingw/samples/dlltest/dll.h
@@ -0,0 +1,4 @@
+
+int Add (int x, int y);
+double __attribute__((stdcall)) Sub (double x, double y);
+
diff --git a/winsup/mingw/samples/dlltest/exe.c b/winsup/mingw/samples/dlltest/exe.c
new file mode 100644
index 000000000..06a580a67
--- /dev/null
+++ b/winsup/mingw/samples/dlltest/exe.c
@@ -0,0 +1,23 @@
+#include <stdio.h>
+
+#include "dll.h"
+
+int main()
+{
+ int i, j, k;
+ double dk;
+
+ i = 10;
+ j = 13;
+
+ k = Add(i, j);
+
+ printf ("%d + %d = %d\n", i, j, k);
+
+ dk = Sub(i, j);
+
+ printf ("%d - %d = %f\n", i, j, dk);
+
+ return 0;
+}
+
diff --git a/winsup/mingw/samples/dlltest/exe.exp b/winsup/mingw/samples/dlltest/exe.exp
new file mode 100644
index 000000000..584b5306b
--- /dev/null
+++ b/winsup/mingw/samples/dlltest/exe.exp
@@ -0,0 +1,8 @@
+In add!
+x = 10
+y = 13
+10 + 13 = 23
+In sub!
+x = 10
+y = 13
+10 - 13 = -3
diff --git a/winsup/mingw/samples/dlltest/expexe.c b/winsup/mingw/samples/dlltest/expexe.c
new file mode 100644
index 000000000..10a8f08b1
--- /dev/null
+++ b/winsup/mingw/samples/dlltest/expexe.c
@@ -0,0 +1,17 @@
+
+#include <stdio.h>
+
+int
+ExportedFromExe ()
+{
+ printf ("This output produced by ExportedFromExe.\n");
+ return 0;
+}
+
+int main()
+{
+ printf ("Hello, world\n");
+
+ return 0;
+}
+
diff --git a/winsup/mingw/samples/dlltest/expexe.def b/winsup/mingw/samples/dlltest/expexe.def
new file mode 100644
index 000000000..fa0aa2856
--- /dev/null
+++ b/winsup/mingw/samples/dlltest/expexe.def
@@ -0,0 +1,2 @@
+EXPORTS
+ExportedFromExe
diff --git a/winsup/mingw/samples/dlltest/jamfile b/winsup/mingw/samples/dlltest/jamfile
new file mode 100644
index 000000000..5278d0379
--- /dev/null
+++ b/winsup/mingw/samples/dlltest/jamfile
@@ -0,0 +1,46 @@
+
+# This option is required to successfully return doubles via STDCALL as in
+# Sub function in dll.c.
+CCFLAGS = -mno-fp-ret-in-387 ;
+
+Main exe.exe : exe.c ;
+
+LinkLibraries exe.exe : libdll.a ;
+
+DEPENDS exe.exe : dll.dll ;
+
+LINKFLAGS on exe.exe = $(LINKFLAGS) -L. ;
+
+
+Main loaddll.exe : loaddll.c ;
+
+DEPENDS loaddll.exe : dll.dll ;
+
+
+Dll dll.dll : dll.c ;
+
+ImportLib libdll.a : dll.def ;
+
+
+Main expexe.exe : expexe.c ;
+
+# Force the executable to include the expexe.def file.
+Exports expexe.exe : expexe.def ;
+
+Main loadexe.exe : loadexe.c ;
+
+DEPENDS loadexe.exe : expexe.exe ;
+
+
+Main silly.exe : silly.cpp ;
+
+LinkLibraries silly.exe : libsilly.a ;
+
+DEPENDS silly.exe : silly.dll ;
+
+LINKFLAGS on silly.exe += -L. ;
+
+Dll silly.dll : sillydll.cpp ;
+
+ImportLib libsilly.a : silly.def ;
+
diff --git a/winsup/mingw/samples/dlltest/loaddll.c b/winsup/mingw/samples/dlltest/loaddll.c
new file mode 100644
index 000000000..bbb34a3c9
--- /dev/null
+++ b/winsup/mingw/samples/dlltest/loaddll.c
@@ -0,0 +1,40 @@
+/*
+ * This version attempts to load dll.dll dynamically, get the address of the
+ * Add function, and then call it.
+ */
+
+#include <stdio.h>
+#include <windows.h>
+
+int (*Add)(int x, int y);
+
+int main()
+{
+ HINSTANCE hDll;
+ int i, j, k;
+
+ hDll = LoadLibrary ("dll.dll");
+ if (!hDll)
+ {
+ printf ("Error %d loading dll.\n", GetLastError());
+ exit (-1);
+ }
+
+ if (!(Add = GetProcAddress (hDll, "Add")))
+ {
+ printf ("Error %d getting Add function.\n", GetLastError());
+ exit (-1);
+ }
+
+ i = 10;
+ j = 13;
+
+ k = Add(i, j);
+
+ printf ("i %d, j %d, k %d\n", i, j, k);
+
+ FreeLibrary (hDll);
+
+ return 0;
+}
+
diff --git a/winsup/mingw/samples/dlltest/loadexe.c b/winsup/mingw/samples/dlltest/loadexe.c
new file mode 100644
index 000000000..c5a84dc01
--- /dev/null
+++ b/winsup/mingw/samples/dlltest/loadexe.c
@@ -0,0 +1,47 @@
+/*
+ * This program attempts to load expexe.exe dynamically, get the address of the
+ * ExportedFromExe function, and then call it.
+ *
+ * This example DOES NOT WORK! I don't know exactly what can be done, but
+ * it simply seems that LoadLibrary refuses to load executables.
+ */
+
+#include <stdio.h>
+#include <windows.h>
+
+int (*ExportedFromExe)();
+
+int main()
+{
+ HINSTANCE hDll;
+ int i, j, k;
+
+ hDll = LoadLibrary ("expexe.exe");
+ if (!hDll)
+ {
+ printf ("Error %d loading exe.\n", GetLastError());
+ exit (-1);
+ }
+
+ if (!(ExportedFromExe = GetProcAddress (hDll, "ExportedFromExe")))
+ {
+ printf ("Error %d getting ExportedFromExe function.\n",
+ GetLastError());
+ exit (-1);
+ }
+ else
+ {
+ ExportedFromExe ();
+ }
+
+ /* NOTE: Unlike a DLL the exe doesn't have an entry point which
+ * initializes global objects and adds __do_global_dtors to
+ * the atexit list. Thus it should be safe(?) to free the
+ * library. Of course, this also makes it unsafe to use
+ * executables at all in this manner.
+ */
+ FreeLibrary (hDll);
+
+ return 0;
+}
+
diff --git a/winsup/mingw/samples/dlltest/readme.txt b/winsup/mingw/samples/dlltest/readme.txt
new file mode 100644
index 000000000..a46dd23a5
--- /dev/null
+++ b/winsup/mingw/samples/dlltest/readme.txt
@@ -0,0 +1,39 @@
+This directory contains two examples of building DLLs. The exe.c and dll.c
+files are used to build a very simple example DLL with a function that
+adds two numbers together (and prints some text at the same time). The
+exe.c program links to the DLL and prints the results of the function
+call.
+
+The C++ example "silly" is more interesting because it involves a DLL which
+contains the code for a C++ class. The CSilly class has all of its code in
+the sillydll.cpp source file, which is used to build the silly.dll. The
+silly.cpp source code builds the main silly.exe executable which makes a
+dynamic instance of the object and calls its member functions.
+
+The C++ silly.def file was generated by doing a nm of sillydll.o after it
+was generated and then getting the symbol names from that. Removing the
+leading underscore produces the appropriate name to include in the EXPORTS
+section. Notice there are a few weird functions.
+
+Since there are now several different versions of the GNU compiler capable
+of doing this, and they each seem to have different requirements for exports
+for classes, it has gotten kind of messy. The silly.def file here is for
+use with the native Mingw32 build of the EGCS version of GCC. The silly.def.old
+file was the def file I used when I was using Jan-Jaap's Mingw32 native port
+of GCC. The Cygnus version is different again, if I recall correctly, but I
+don't have it hanging around anymore.
+
+The jamfile builds all the components from the raw sources.
+
+The expected output of exe.exe and silly.exe are in the files exe.exp
+and silly.exp.
+
+
+The source code in this directory is in the PUBLIC DOMAIN and can be
+used or abused as you see fit. There is NO WARRANTY for this code,
+including (but not limited to) implied warranties of MERCHANTABILITY
+or FITNESS FOR A PARTICULAR PURPOSE.
+
+
+Colin Peters <colin@bird.fu.is.saga-u.ac.jp>
+
diff --git a/winsup/mingw/samples/dlltest/silly.cpp b/winsup/mingw/samples/dlltest/silly.cpp
new file mode 100644
index 000000000..70f5af5c7
--- /dev/null
+++ b/winsup/mingw/samples/dlltest/silly.cpp
@@ -0,0 +1,55 @@
+//
+// C++ test of a dll which contains a C++ class.
+//
+
+#include <stdlib.h>
+#include <stdio.h>
+
+// Interface of class.
+#include "silly.h"
+
+#ifdef DERIVED_TEST
+// Here is a derived class too.
+class CMoreSilly : public CSilly
+{
+ public:
+ CMoreSilly (char* szNewName) : CSilly (szNewName) {};
+ ~CMoreSilly ();
+
+ WhatsYourName();
+};
+
+CMoreSilly::
+~CMoreSilly ()
+{
+ printf ("In CMoreSilly \"%s\" destructor!\n", szName);
+}
+
+CMoreSilly::
+WhatsYourName ()
+{
+ printf ("I'm more silly and my name is \"%s\"\n", szName);
+}
+#endif
+
+int
+main ()
+{
+ CSilly* psilly = new CSilly("silly");
+
+ psilly->WhatsYourName();
+ psilly->Poke(); // Poke him, he should say "Ouch!"
+ psilly->Stab(4); // Stab him four times he should say "Ugh!!!!"
+
+ delete psilly;
+
+#ifdef DERIVED_TEST
+ psilly = new CMoreSilly("more silly");
+ psilly->WhatsYourName();
+ psilly->Stab(5);
+ delete psilly;
+#endif
+
+ return 0;
+}
+
diff --git a/winsup/mingw/samples/dlltest/silly.def b/winsup/mingw/samples/dlltest/silly.def
new file mode 100644
index 000000000..6733e5df7
--- /dev/null
+++ b/winsup/mingw/samples/dlltest/silly.def
@@ -0,0 +1,11 @@
+EXPORTS
+DllMain@12
+Poke__6CSilly
+Stab__6CSillyi
+WhatsYourName__6CSilly
+_$_6CSilly
+__6CSilly
+__6CSillyPc
+__tf6CSilly
+__ti6CSilly
+_vt$6CSilly
diff --git a/winsup/mingw/samples/dlltest/silly.exp b/winsup/mingw/samples/dlltest/silly.exp
new file mode 100644
index 000000000..386e81c1c
--- /dev/null
+++ b/winsup/mingw/samples/dlltest/silly.exp
@@ -0,0 +1,8 @@
+I'm silly.
+Ouch!
+Ugh!!!!
+In CSilly destructor.
+I'm more silly and my name is "more silly"
+Ugh!!!!!
+In CMoreSilly "more silly" destructor!
+In CSilly destructor.
diff --git a/winsup/mingw/samples/dlltest/silly.h b/winsup/mingw/samples/dlltest/silly.h
new file mode 100644
index 000000000..007b0f5d7
--- /dev/null
+++ b/winsup/mingw/samples/dlltest/silly.h
@@ -0,0 +1,27 @@
+
+#define DERIVED_TEST 1
+
+class CSilly
+{
+ protected:
+ char* szName;
+
+ public:
+ CSilly();
+ CSilly(char* szName);
+#ifdef DERIVED_TEST
+ virtual ~CSilly();
+#else
+ ~CSilly();
+#endif
+
+ Poke ();
+ Stab (int nTimes);
+#ifdef DERIVED_TEST
+ virtual WhatsYourName ();
+#else
+ WhatsYourName ();
+#endif
+
+};
+
diff --git a/winsup/mingw/samples/dlltest/sillydll.cpp b/winsup/mingw/samples/dlltest/sillydll.cpp
new file mode 100644
index 000000000..bd5ccea30
--- /dev/null
+++ b/winsup/mingw/samples/dlltest/sillydll.cpp
@@ -0,0 +1,107 @@
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <windows.h>
+
+
+#if 0
+#define STREAMS_VERSION
+#endif
+
+#if defined(STREAMS_VERSION)
+#include <iostream.h>
+#endif
+
+#include "silly.h"
+
+extern "C"
+BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved)
+{
+ return TRUE;
+}
+
+CSilly::
+CSilly()
+{
+ szName = NULL;
+}
+
+CSilly::
+CSilly(char* new_szName)
+{
+ szName = new char[strlen(new_szName)+1];
+
+ if (szName)
+ {
+ strcpy (szName, new_szName);
+ }
+}
+
+CSilly::
+~CSilly()
+{
+ printf ("In CSilly destructor.\n");
+ if (szName)
+ {
+ delete szName;
+ }
+}
+
+CSilly::
+Poke ()
+{
+#ifndef STREAMS_VERSION
+ printf ("Ouch!\n");
+#else
+ cout << "Ouch!" << endl;
+#endif
+}
+
+CSilly::
+Stab (int nTimes)
+{
+#ifndef STREAMS_VERSION
+ printf ("Ugh");
+#else
+ cout << "Ugh";
+#endif
+
+ int i;
+ for (i = 0; i < nTimes; i++)
+ {
+#ifndef STREAMS_VERSION
+ putchar('!');
+#else
+ cout << '!' ;
+#endif
+ }
+
+#ifndef STREAMS_VERSION
+ putchar('\n');
+#else
+ cout << endl;
+#endif
+}
+
+CSilly::
+WhatsYourName ()
+{
+ if (szName)
+ {
+#ifndef STREAMS_VERSION
+ printf ("I'm %s.\n", szName);
+#else
+ cout << "I'm " << szName << "." << endl;
+#endif
+ }
+ else
+ {
+#ifndef STREAMS_VERSION
+ printf ("I have no name.\n");
+#else
+ cout << "I have no name." << endl;
+#endif
+ }
+}
+
diff --git a/winsup/mingw/samples/filehand/filehand.c b/winsup/mingw/samples/filehand/filehand.c
new file mode 100644
index 000000000..24e048c52
--- /dev/null
+++ b/winsup/mingw/samples/filehand/filehand.c
@@ -0,0 +1,57 @@
+/*
+ * An example showing how you can obtain the UNIX-ish file number from a
+ * FILE* and in turn how you can get the Win32 HANDLE of the file from
+ * the file number.
+ *
+ * This code is in the PUBLIC DOMAIN and has NO WARRANTY.
+ *
+ * Colin Peters <colin@fu.is.saga-u.ac.jp>
+ */
+
+#include <stdio.h>
+#include <io.h>
+#include <windows.h>
+
+int
+main (int argc, char* argv[])
+{
+ char* szFileName;
+ FILE* fileIn;
+ int fnIn;
+ HANDLE hFileIn;
+ char caBuf[81];
+ int nRead;
+
+ if (argc >= 2)
+ {
+ szFileName = argv[1];
+ }
+ else
+ {
+ szFileName = "junk.txt";
+ }
+
+ fileIn = fopen (szFileName, "r");
+
+ if (!fileIn)
+ {
+ printf ("Could not open %s for reading\n", szFileName);
+ exit(1);
+ }
+
+ fnIn = fileno (fileIn);
+ hFileIn = (HANDLE) _get_osfhandle (fnIn);
+
+ printf ("OS file handle %d\n", (int) hFileIn);
+
+ ReadFile (hFileIn, caBuf, 80, &nRead, NULL);
+
+ printf ("Read %d bytes using ReadFile.\n", nRead);
+
+ caBuf[nRead] = '\0';
+
+ printf ("\"%s\"\n", caBuf);
+
+ fclose (fileIn);
+}
+
diff --git a/winsup/mingw/samples/filehand/jamfile b/winsup/mingw/samples/filehand/jamfile
new file mode 100644
index 000000000..6f29c3758
--- /dev/null
+++ b/winsup/mingw/samples/filehand/jamfile
@@ -0,0 +1,3 @@
+
+Main filehand.exe : filehand.c ;
+
diff --git a/winsup/mingw/samples/filehand/junk.txt b/winsup/mingw/samples/filehand/junk.txt
new file mode 100644
index 000000000..f933c546e
--- /dev/null
+++ b/winsup/mingw/samples/filehand/junk.txt
@@ -0,0 +1 @@
+This is a test file.
diff --git a/winsup/mingw/samples/fixargv/fixargv.c b/winsup/mingw/samples/fixargv/fixargv.c
new file mode 100644
index 000000000..50c24cd06
--- /dev/null
+++ b/winsup/mingw/samples/fixargv/fixargv.c
@@ -0,0 +1,290 @@
+/*
+ * fixargv.c
+ *
+ * A special function which "fixes" an argv array by replacing arguments
+ * that need quoting with quoted versions.
+ *
+ * NOTE: In order to be reasonably consistent there is some misuse of the
+ * const keyword here-- which leads to compilation warnings. These
+ * should be ok to ignore.
+ *
+ * This is a sample distributed as part of the Mingw32 package.
+ *
+ * Contributors:
+ * Created by Colin Peters <colin@bird.fu.is.saga-u.ac.jp>
+ *
+ * THIS SOFTWARE IS NOT COPYRIGHTED
+ *
+ * This source code is offered for use in the public domain. You may
+ * use, modify or distribute it freely.
+ *
+ * This code is distributed in the hope that it will be useful but
+ * WITHOUT ANY WARRANTY. ALL WARRENTIES, EXPRESS OR IMPLIED ARE HEREBY
+ * DISCLAMED. This includes but is not limited to warrenties of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * $Revision$
+ * $Author$
+ * $Date$
+ *
+ */
+
+#include <string.h>
+#include "fixargv.h"
+
+/*
+ * This takes a single string and fixes it, enclosing it in quotes if it
+ * contains any spaces and/or escaping the quotes it contains.
+ */
+char*
+fix_arg (const char* szArg)
+{
+ int nQuoteAll; /* Does the whole arg need quoting? */
+ int nBkSlRun; /* How may backslashes in a row? */
+ char* sz;
+ char* szNew;
+ size_t sizeLen;
+
+ nQuoteAll = 0;
+ nBkSlRun = 0;
+ sz = szArg;
+ sizeLen = 1;
+
+ /* First we figure out how much bigger the new string has to be
+ * than the old one. */
+ while (*sz != '\0')
+ {
+ /*
+ * Arguments containing whitespace of wildcards will be
+ * quoted to preserve tokenization and/or those special
+ * characters (i.e. wildcarding will NOT be done at the
+ * other end-- they will get the * and ? characters as is).
+ * TODO: Is this the best way? Do we want to enable wildcards?
+ * If so, when?
+ */
+ if (!nQuoteAll &&
+ (*sz == ' ' || *sz == '\t' || *sz == '*' || *sz == '?'))
+ {
+ nQuoteAll = 1;
+ }
+ else if (*sz == '\\')
+ {
+ nBkSlRun++;
+ }
+ else
+ {
+ if (*sz == '\"')
+ {
+ sizeLen += nBkSlRun + 1;
+ }
+ nBkSlRun = 0;
+ }
+
+ sizeLen++;
+ sz++;
+ }
+
+ if (nQuoteAll)
+ {
+ sizeLen += 2;
+ }
+
+ /*
+ * Make a new string big enough.
+ */
+ szNew = (char*) malloc (sizeLen);
+ if (!szNew)
+ {
+ return NULL;
+ }
+ sz = szNew;
+
+ /* First enclosing quote for fully quoted args. */
+ if (nQuoteAll)
+ {
+ *sz = '\"';
+ sz++;
+ }
+
+ /*
+ * Go through the string putting backslashes in front of quotes,
+ * and doubling all backslashes immediately in front of quotes.
+ */
+ nBkSlRun = 0;
+ while (*szArg != '\0')
+ {
+ if (*szArg == '\\')
+ {
+ nBkSlRun++;
+ }
+ else
+ {
+ if (*szArg == '\"')
+ {
+ while (nBkSlRun > 0)
+ {
+ *sz = '\\';
+ sz++;
+ nBkSlRun--;
+ }
+ *sz = '\\';
+ sz++;
+ }
+ nBkSlRun = 0;
+ }
+
+ *sz = *szArg;
+ sz++;
+ szArg++;
+ }
+
+ /* Closing quote for fully quoted args. */
+ if (nQuoteAll)
+ {
+ *sz = '\"';
+ sz++;
+ }
+
+ *sz = '\0';
+ return szNew;
+}
+
+/*
+ * Takes argc and argv and returns a new argv with escaped members. Pass
+ * this fixed argv (along with the old one) to free_fixed_argv after
+ * you finish with it. Pass in an argc of -1 and make sure the argv vector
+ * ends with a null pointer to have fix_argv count the arguments for you.
+ */
+char* const*
+fix_argv (int argc, char* const* szaArgv)
+{
+ char** szaNew;
+ char* sz;
+ int i;
+
+ if (!szaArgv)
+ {
+ return NULL;
+ }
+
+ /*
+ * Count the arguments if asked.
+ */
+ if (argc == -1)
+ {
+ for (i = 0; szaArgv[i]; i++)
+ ;
+
+ argc = i;
+ }
+
+ /*
+ * If there are no args or only one arg then do no escaping.
+ */
+ if (argc < 2)
+ {
+ return szaArgv;
+ }
+
+ for (i = 1, szaNew = NULL; i < argc; i++)
+ {
+ sz = szaArgv[i];
+
+ /*
+ * If an argument needs fixing, then fix it.
+ */
+ if (strpbrk (sz, "\" \t*?"))
+ {
+ /*
+ * If we haven't created a new argv list already
+ * then make one.
+ */
+ if (!szaNew)
+ {
+ szaNew = (char**) malloc ((argc + 1) *
+ sizeof (char*));
+ if (!szaNew)
+ {
+ return NULL;
+ }
+
+ /*
+ * Copy previous args from old to new.
+ */
+ memcpy (szaNew, szaArgv, sizeof(char*) * i);
+ }
+
+ /*
+ * Now do the fixing.
+ */
+ szaNew[i] = fix_arg (sz);
+ if (!szaNew[i])
+ {
+ /* Fixing failed, free up and return error. */
+ free_fixed_argv (szaNew, szaArgv);
+ return NULL;
+ }
+ }
+ else if (szaNew)
+ {
+ szaNew[i] = sz;
+ }
+ }
+
+ if (szaNew)
+ {
+ /* If we have created a new argv list then we might as well
+ * terminate it nicely. (And we depend on it in
+ * free_fixed_argv.) */
+ szaNew[argc] = NULL;
+ }
+ else
+ {
+ /* If we didn't create a new argv list then return the
+ * original. */
+ return szaArgv;
+ }
+
+ return szaNew;
+}
+
+void
+free_fixed_argv (char* const* szaFixed, char* const* szaOld)
+{
+ char* const* sza;
+
+ /*
+ * Check for error conditions. Also note that if no corrections
+ * were required the fixed argv will actually be the same as
+ * the old one, and we don't need to do anything.
+ */
+ if (!szaFixed || !szaOld || szaFixed == szaOld)
+ {
+ return;
+ }
+
+ /*
+ * Go through all members of the argv list. If any of the
+ * members in the fixed list are different from the old
+ * list we free those members.
+ * NOTE: The first member is never modified, so we don't need to
+ * check.
+ */
+ sza = szaFixed + 1;
+ szaOld++;
+ while (*sza)
+ {
+ if (*sza != *szaOld)
+ {
+ free (*sza);
+ }
+ sza++;
+ szaOld++;
+ }
+
+ /*
+ * Now we can free the array of char pointers itself.
+ */
+ free (szaFixed);
+}
+
diff --git a/winsup/mingw/samples/fixargv/fixargv.h b/winsup/mingw/samples/fixargv/fixargv.h
new file mode 100644
index 000000000..0e6222660
--- /dev/null
+++ b/winsup/mingw/samples/fixargv/fixargv.h
@@ -0,0 +1,24 @@
+/*
+ * fixargv.h
+ *
+ * Prototypes of utility functions for 'properly' escaping argv vectors.
+ *
+ * THIS SOFTWARE IS NOT COPYRIGHTED
+ *
+ * This source code is offered for use in the public domain. You may
+ * use, modify or distribute it freely.
+ *
+ * $Revision$
+ * $Author$
+ * $Date$
+ *
+ */
+
+#ifndef _FIXARGV_H_
+#define _FIXARGV_H_
+
+char* fix_arg (const char* szArg);
+char* const* fix_argv (int argc, char* const* szaArgv);
+void free_fixed_argv (char* const* szaFixed, char* const* szaOld);
+
+#endif
diff --git a/winsup/mingw/samples/fixargv/readme.txt b/winsup/mingw/samples/fixargv/readme.txt
new file mode 100644
index 000000000..14048f534
--- /dev/null
+++ b/winsup/mingw/samples/fixargv/readme.txt
@@ -0,0 +1,85 @@
+
+This code is a utility function I was considering adding to Mingw32. The
+Microsoft versions of argc, argv construction use quotes and backslashes
+to allow the user to pass arguments containing spaces (or quotes) to
+programs they invoke. The rules are
+
+ - Arguments containing spaces must be enclosed in quotes.
+ - A quote can be passed by preceeding it with a backslash.
+ - Backslashes immediately preceeding a quote must be doubled to avoid
+ escaping the quote.
+
+Thus an argument like:
+
+ -D="Foo Bar\\"
+
+needs to be mangled as:
+
+ "-D\"Foo Bar\\\\\""
+
+in order to get to the program as what was intended above.
+
+The fix_argv set of functions is meant to be used with spawnv and the
+like to allow a program to set up an argv array for the spawned program
+and have that array duplicated *exactly* in the spawned program, no
+matter what it contains (it also quotes 'globbing' characters like *
+and ?, so it does not matter if the destination has globbing turned on
+or not; it might be a reasonable extension to allow a flag to allow
+globbing characters to pass through unmolested, but they would still
+be quoted if the string contained whitespace).
+
+The reason for writing this came up because of problems with arguments
+like -DBLAH="Foo Bar" to GCC (define BLAH as a preprocessor constant
+being the string "Foo Bar", including the quotes). Because GCC simply
+passes the argument directly to CPP (the preprocessor) it had to be
+escaped *twice*:
+
+ "-DBLAH=\"\\\"Foo Bar\\\"\""
+
+This would reach GCC as
+
+ -DBLAH="\"Foo Bar\""
+
+And that would reach CPP as the desired
+
+ -DBLAH="Foo Bar"
+
+One level of quoting and escaping is to be expected (although MS's
+standard is, arguably, not very good), but forcing the user to know
+how many different programs the argument is going to pass through,
+and perform double quoting and escaping, seems unreasonable. If
+GCC and friends all used fix_argv (they use their own version of
+it now) then the original argument could be
+
+ "-DBLAH=\"Foo Bar\""
+
+And that would work fine, no matter how many different tools it
+passed through.
+
+The only basic limitation with this code is that it assumes that all
+the spawned programs use Microsoft-type escaping when interpreting
+their command line. Most programs on Win32 machines do (anything
+compiled with Mingw32 will).
+
+For now, this code has been relegated to 'sample' status. If you want
+to use it, feel free (it is public domain after all).
+
+Colin.
+
+P.S. Just out of interest you might try writing your own little program
+ to look at the interaction of wildcards and quotes. Use the glob.exe
+ program in ../globbing and see what it does with
+
+ glob "foo*.txt"
+
+ even if there are files foo.txt and foobar.txt in the same directory.
+
+ Note that
+
+ del "My *.txt"
+
+ works (i.e. it deletes all files starting with My<space>). This could
+ not be done unless del does globbing *after* processing escapes and
+ quotes, which is not the way it seems to work normally (again see
+ the glob example).
+
diff --git a/winsup/mingw/samples/fmode/all.c b/winsup/mingw/samples/fmode/all.c
new file mode 100644
index 000000000..52f93d1c1
--- /dev/null
+++ b/winsup/mingw/samples/fmode/all.c
@@ -0,0 +1,46 @@
+/*
+ * A sample program demonstrating how to use _CRT_fmode to change the default
+ * file opening mode to binary AND change stdin, stdout and stderr. Redirect
+ * stdout to a file from the command line to see the difference.
+ *
+ * Also try directing a file into stdin. If you type into stdin you will get
+ * \r\n at the end of every line... unlike UNIX. But at least if you
+ * redirect a file in you will get exactly the characters in the file as input.
+ *
+ * THIS CODE IS IN THE PUBLIC DOMAIN.
+ *
+ * Colin Peters <colin@fu.is.saga-u.ac.jp>
+ */
+
+#include <stdio.h>
+#include <fcntl.h>
+
+unsigned int _CRT_fmode = _O_BINARY;
+
+main ()
+{
+ char* sz = "This is line one.\nThis is line two.\n";
+ FILE* fp;
+ int c;
+
+ printf (sz);
+
+ /* Note how this fopen does NOT indicate "wb" to open the file in
+ * binary mode. */
+ fp = fopen ("all.out", "w");
+
+ fprintf (fp, sz);
+
+ fclose (fp);
+
+ if (_isatty (_fileno(stdin)))
+ {
+ fprintf (stderr, "Waiting for input, press Ctrl-Z to finish.\n");
+ }
+
+ while ((c = fgetc(stdin)) != EOF)
+ {
+ printf ("\'%c\' %02X\n", (char) c, c);
+ }
+}
+
diff --git a/winsup/mingw/samples/fmode/jamfile b/winsup/mingw/samples/fmode/jamfile
new file mode 100644
index 000000000..2c7f7d32f
--- /dev/null
+++ b/winsup/mingw/samples/fmode/jamfile
@@ -0,0 +1,5 @@
+
+Main test.exe : test.c ;
+
+Main all.exe : all.c ;
+
diff --git a/winsup/mingw/samples/fmode/readme.txt b/winsup/mingw/samples/fmode/readme.txt
new file mode 100644
index 000000000..873b853d3
--- /dev/null
+++ b/winsup/mingw/samples/fmode/readme.txt
@@ -0,0 +1,5 @@
+
+These two demos show how _fmode and _CRT_fmode can be used to modify the
+default file opening mode (text vs. binary) and/or the mode of the standard
+file handles.
+
diff --git a/winsup/mingw/samples/fmode/test.c b/winsup/mingw/samples/fmode/test.c
new file mode 100644
index 000000000..f19e7e0ec
--- /dev/null
+++ b/winsup/mingw/samples/fmode/test.c
@@ -0,0 +1,31 @@
+/*
+ * A sample program demonstrating how to use fmode to change the default
+ * file opening mode to binary. NOTE: Does not change stdin, stdout or
+ * stderr.
+ *
+ * THIS CODE IS IN THE PUBLIC DOMAIN.
+ *
+ * Colin Peters <colin@fu.is.saga-u.ac.jp>
+ */
+
+#include <stdio.h>
+#include <fcntl.h> /* Required to get _fmode and _O_BINARY */
+
+main ()
+{
+ char* sz = "This is line one.\nThis is line two.\n";
+ FILE* fp;
+
+ _fmode = _O_BINARY;
+
+ printf (sz);
+
+ /* Note how this fopen does NOT indicate "wb" to open the file in
+ * binary mode. */
+ fp = fopen ("test.out", "w");
+
+ fprintf (fp, sz);
+
+ fclose (fp);
+}
+
diff --git a/winsup/mingw/samples/globbing/glob.c b/winsup/mingw/samples/globbing/glob.c
new file mode 100644
index 000000000..6bf8acaee
--- /dev/null
+++ b/winsup/mingw/samples/globbing/glob.c
@@ -0,0 +1,20 @@
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <windows.h>
+
+int
+main (int argc, char* argv[])
+{
+ int i;
+
+ printf ("Command line (via GetCommandLine) \"%s\"\n",
+ GetCommandLine());
+
+ for (i = 0; i < argc; i++)
+ {
+ printf ("Argv[%d] \"%s\"\n", i, argv[i]);
+ }
+
+ return 0;
+}
diff --git a/winsup/mingw/samples/globbing/jamfile b/winsup/mingw/samples/globbing/jamfile
new file mode 100644
index 000000000..ff3a585d6
--- /dev/null
+++ b/winsup/mingw/samples/globbing/jamfile
@@ -0,0 +1,11 @@
+
+Object glob.o : glob.c ;
+
+MainFromObjects glob.exe : glob.o ;
+
+Main noglob.exe : noglob.c ;
+
+LIBDIR = \\mingw32\\lib\\ ;
+
+MainFromObjects CRTnoglob.exe : glob.o $(LIBDIR)CRT_noglob.o ;
+
diff --git a/winsup/mingw/samples/globbing/noglob.c b/winsup/mingw/samples/globbing/noglob.c
new file mode 100644
index 000000000..8bc4c82a3
--- /dev/null
+++ b/winsup/mingw/samples/globbing/noglob.c
@@ -0,0 +1,22 @@
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <windows.h>
+
+/* This line turns off automatic command line globbing. */
+int _CRT_glob = 0;
+
+int
+main (int argc, char* argv[])
+{
+ int i;
+
+ printf ("Command line (via GetCommandLine) \"%s\"\n",
+ GetCommandLine());
+ for (i = 0; i < argc; i++)
+ {
+ printf ("Argv[%d] \"%s\"\n", i, argv[i]);
+ }
+
+ return 0;
+}
diff --git a/winsup/mingw/samples/globbing/readme.txt b/winsup/mingw/samples/globbing/readme.txt
new file mode 100644
index 000000000..5e20de826
--- /dev/null
+++ b/winsup/mingw/samples/globbing/readme.txt
@@ -0,0 +1,14 @@
+
+This directory contains samples which demonstrate default (globbing on)
+behavior, how to turn the globbing off with the _CRT_glob variable, and
+how to turn it off with the CRT_noglob object file.
+
+Run jam and then run glob, noglob and CRTnoglob with an argument like
+*.* to see the difference.
+
+The code in this directory is in the PUBLIC DOMAIN. It has NO WARRANTY,
+including, but not restricted to, warranties of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.
+
+Colin Peters <colin@bird.fu.is.saga-u.ac.jp>.
+
diff --git a/winsup/mingw/samples/print/jamfile b/winsup/mingw/samples/print/jamfile
new file mode 100644
index 000000000..f5395339d
--- /dev/null
+++ b/winsup/mingw/samples/print/jamfile
@@ -0,0 +1,9 @@
+#
+# A simple example which prints a message on a selected printer. This won't
+# work right unless you make PRINTDLG a packed structure!
+#
+
+Main prntest.exe : prntest.c ;
+
+Gui prntest.exe ;
+
diff --git a/winsup/mingw/samples/print/prntest.c b/winsup/mingw/samples/print/prntest.c
new file mode 100644
index 000000000..801d1d885
--- /dev/null
+++ b/winsup/mingw/samples/print/prntest.c
@@ -0,0 +1,65 @@
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <windows.h>
+
+main ()
+{
+ PRINTDLG pd;
+ DOCINFO di;
+ char* szMessage;
+
+ memset (&pd, 0, sizeof(PRINTDLG));
+ memset (&di, 0, sizeof(DOCINFO));
+
+ di.cbSize = sizeof(DOCINFO);
+ di.lpszDocName = "Test";
+
+ pd.lStructSize = sizeof(PRINTDLG);
+ pd.Flags = PD_PAGENUMS | PD_RETURNDC;
+ pd.nFromPage = 1;
+ pd.nToPage = 1;
+ pd.nMinPage = 1;
+ pd.nMaxPage = 1;
+
+ szMessage = 0;
+
+ if (PrintDlg (&pd))
+ {
+ if (pd.hDC)
+ {
+ if (StartDoc (pd.hDC, &di) != SP_ERROR)
+ {
+ StartPage (pd.hDC);
+
+ TextOut (pd.hDC, 0, 0, "Hello, printer!", 15);
+
+ EndPage (pd.hDC);
+
+ EndDoc (pd.hDC);
+
+ szMessage = "Printed.";
+ }
+ else
+ {
+ szMessage = "Could not start document.";
+ }
+ }
+ else
+ {
+ szMessage = "Could not create device context.";
+ }
+ }
+ else
+ {
+ szMessage = "Canceled or printer could not be setup.";
+ }
+
+ if (szMessage)
+ {
+ MessageBox (NULL, szMessage, "Print Test", MB_OK);
+ }
+
+ return 0;
+}
diff --git a/winsup/mingw/samples/seh/eh3.c b/winsup/mingw/samples/seh/eh3.c
new file mode 100644
index 000000000..e00201904
--- /dev/null
+++ b/winsup/mingw/samples/seh/eh3.c
@@ -0,0 +1,112 @@
+int
+__except_handler3(
+ struct _EXCEPTION_RECORD* pExceptionRecord,
+ struct EXCEPTION_REGISTRATION* pRegistrationFrame,
+ struct _CONTEXT* pContextRecord,
+ void* pDispatcherContext
+ )
+{
+ LONG filterFuncRet;
+ LONG trylevel;
+ EXCEPTION_POINTERS exceptPtrs;
+ PSCOPETABLE pScopeTable;
+
+
+ CLD // Clear the direction flag (make no assumptions!)
+
+ // if neither the EXCEPTION_UNWINDING nor EXCEPTION_EXIT_UNWIND bit
+ // is set... This is true the first time through the handler (the
+ // non-unwinding case)
+
+ if ( ! (pExceptionRecord->ExceptionFlags
+ & (EXCEPTION_UNWINDING | EXCEPTION_EXIT_UNWIND)
+ ) )
+ {
+ // Build the EXCEPTION_POINTERS structure on the stack
+ exceptPtrs.ExceptionRecord = pExceptionRecord;
+ exceptPtrs.ContextRecord = pContextRecord;
+
+ // Put the pointer to the EXCEPTION_POINTERS 4 bytes below the
+ // establisher frame. See ASM code for GetExceptionInformation
+ *(PDWORD)((PBYTE)pRegistrationFrame - 4) = &exceptPtrs;
+
+ // Get initial "trylevel" value
+ trylevel = pRegistrationFrame->trylevel
+
+ // Get a pointer to the scopetable array
+ scopeTable = pRegistrationFrame->scopetable;
+
+search_for_handler:
+ if ( pRegistrationFrame->trylevel != TRYLEVEL_NONE )
+ {
+ if ( pRegistrationFrame->scopetable[trylevel].lpfnFilter )
+ {
+
+ PUSH EBP // Save this frame EBP
+
+ // !!!Very Important!!! Switch to original EBP. This is
+ // what allows all locals in the frame to have the same
+ // value as before the exception occurred.
+
+ EBP = &pRegistrationFrame->_ebp
+
+ // Call the filter function
+ filterFuncRet = scopetable[trylevel].lpfnFilter();
+
+ POP EBP // Restore handler frame EBP
+
+ if ( filterFuncRet != EXCEPTION_CONTINUE_SEARCH )
+ {
+ if ( filterFuncRet < 0 ) // EXCEPTION_CONTINUE_EXECUTION
+ return ExceptionContinueExecution;
+
+ // If we get here, EXCEPTION_EXECUTE_HANDLER was specified
+ scopetable == pRegistrationFrame->scopetable
+
+ // Does the actual OS cleanup of registration frames
+ // Causes this function to recurse
+ __global_unwind2( pRegistrationFrame );
+
+
+ // Once we get here, everything is all cleaned up, except
+ // for the last frame, where we'll continue execution
+ EBP = &pRegistrationFrame->_ebp
+
+ __local_unwind2( pRegistrationFrame, trylevel );
+
+ // NLG == "non-local-goto" (setjmp/longjmp stuff)
+ __NLG_Notify( 1 ); // EAX == scopetable->lpfnHandler
+
+ // Set the current trylevel to whatever SCOPETABLE entry
+ // was being used when a handler was found
+ pRegistrationFrame->trylevel = scopetable->previousTryLevel;
+
+ // Call the _except {} block. Never returns.
+ pRegistrationFrame->scopetable[trylevel].lpfnHandler();
+ }
+ }
+
+ scopeTable = pRegistrationFrame->scopetable;
+ trylevel = scopeTable->previousTryLevel
+
+ goto search_for_handler;
+ }
+ else // trylevel == TRYLEVEL_NONE
+ {
+ retvalue == DISPOSITION_CONTINUE_SEARCH;
+ }
+ }
+ else // EXCEPTION_UNWINDING or EXCEPTION_EXIT_UNWIND flags are set
+ {
+ PUSH EBP // Save EBP
+
+ EBP = pRegistrationFrame->_ebp // Set EBP for __local_unwind2
+
+ __local_unwind2( pRegistrationFrame, TRYLEVEL_NONE )
+
+ POP EBP // Restore EBP
+
+ retvalue == DISPOSITION_CONTINUE_SEARCH;
+ }
+}
+
diff --git a/winsup/mingw/samples/seh/exutil.c b/winsup/mingw/samples/seh/exutil.c
new file mode 100644
index 000000000..9d98d8350
--- /dev/null
+++ b/winsup/mingw/samples/seh/exutil.c
@@ -0,0 +1,68 @@
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <excpt.h>
+#include <windows.h>
+
+#include "exutil.h"
+
+void
+WalkExceptionHandlers ()
+{
+ PEXCEPTION_REGISTRATION_RECORD p;
+ int i;
+
+ __asm__("movl %%fs:0,%%eax;movl %%eax,%0" : "=g" (p) : : "%eax");
+
+ i = 0;
+ while (p != (PEXCEPTION_REGISTRATION_RECORD) -1 && p)
+ {
+ printf ("Registration %d at %08x : ", i, p);
+ printf ("Handler = %08x ", p->handler);
+ printf ("Next Registration = %08x\n", p->prev);
+ p = p->prev;
+ i++;
+ }
+ printf ("End of exception handler list.\n");
+ fflush (stdout);
+}
+
+void
+DumpExceptionRecord (struct _EXCEPTION_RECORD* pExRec)
+{
+ printf ("Exception: Code = %08x Flags %08x", pExRec->ExceptionCode,
+ pExRec->ExceptionFlags);
+
+ if (pExRec->ExceptionFlags)
+ {
+ printf (" ( ");
+ if (pExRec->ExceptionFlags & EH_NONCONTINUABLE)
+ {
+ printf ("EH_NONCONTINUABLE ");
+ }
+ if (pExRec->ExceptionFlags & EH_UNWINDING)
+ {
+ printf ("EH_UNWINDING ");
+ }
+ if (pExRec->ExceptionFlags & EH_EXIT_UNWIND)
+ {
+ printf ("EH_EXIT_UNWIND ");
+ }
+ if (pExRec->ExceptionFlags & EH_STACK_INVALID)
+ {
+ printf ("EH_STACK_INVALID ");
+ }
+ if (pExRec->ExceptionFlags & EH_NESTED_CALL)
+ {
+ printf ("EH_NESTED_CALL ");
+ }
+ printf (")\n");
+ }
+ else
+ {
+ printf ("\n");
+ }
+
+ fflush(stdout);
+}
+
diff --git a/winsup/mingw/samples/seh/exutil.def b/winsup/mingw/samples/seh/exutil.def
new file mode 100644
index 000000000..bf20cc14f
--- /dev/null
+++ b/winsup/mingw/samples/seh/exutil.def
@@ -0,0 +1,3 @@
+EXPORTS
+ WalkExceptionHandlers
+ DumpExceptionRecord
diff --git a/winsup/mingw/samples/seh/exutil.h b/winsup/mingw/samples/seh/exutil.h
new file mode 100644
index 000000000..79937f745
--- /dev/null
+++ b/winsup/mingw/samples/seh/exutil.h
@@ -0,0 +1,23 @@
+/*
+ * Definitions of some internal stuff for exception handling, including
+ * a version of the all-important EXCEPTION_REGISTRATION_RECORD.
+ */
+
+#ifndef _EXUTIL_H_
+#define _EXUTIL_H_
+
+#include <windows.h>
+#include <excpt.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void WalkExceptionHandlers ();
+void DumpExceptionRecord (struct _EXCEPTION_RECORD* pExRec);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/winsup/mingw/samples/seh/jamfile b/winsup/mingw/samples/seh/jamfile
new file mode 100644
index 000000000..72b51b790
--- /dev/null
+++ b/winsup/mingw/samples/seh/jamfile
@@ -0,0 +1,13 @@
+
+Dll exutil.dll : exutil.c ;
+
+ImportLib libexutil.a : exutil.def ;
+
+Main sehtest.exe : sehtest.c ;
+
+Main sehfix.exe : sehfix.c ;
+
+Main sehsub.exe : sehsub.c ;
+
+LinkLibraries sehtest.exe sehfix.exe sehsub.exe : libexutil.a ;
+
diff --git a/winsup/mingw/samples/seh/sehfix.c b/winsup/mingw/samples/seh/sehfix.c
new file mode 100644
index 000000000..1a414e649
--- /dev/null
+++ b/winsup/mingw/samples/seh/sehfix.c
@@ -0,0 +1,60 @@
+/*
+ * sehfix.c
+ *
+ * A test program involving an exception handler that fixes the exception
+ * causing condition.
+ *
+ * In this code we install an exception handler my_handler and then a piece
+ * of inline assembly attempts to write at the address marked in eax, after
+ * setting eax to 10. This should produce an exception. The handler then
+ * changes the eax register of the exception context to be the address of
+ * a static variable and restarts the code. This should allow everything
+ * to continue.
+ */
+
+#include <windows.h>
+#include <excpt.h>
+
+#include "exutil.h"
+
+int x;
+
+EXCEPTION_DISPOSITION
+my_handler (
+ struct _EXCEPTION_RECORD* pExceptionRec,
+ void* pEstablisherFrame,
+ struct _CONTEXT* pContextRecord,
+ void* pDispatcherContext
+ )
+{
+ printf ("In my exception handler!\n");
+ DumpExceptionRecord (pExceptionRec);
+ pContextRecord->Eax = (DWORD) &x;
+ return ExceptionContinueExecution;
+}
+
+main ()
+{
+ x = 2;
+
+ printf ("x = %d\n", x);
+
+ WalkExceptionHandlers();
+
+ __try1(my_handler)
+
+ WalkExceptionHandlers();
+
+ /* This assembly code should produce an exception. */
+ __asm__("movl $10,%%eax;movl $1,(%%eax);" : : : "%eax");
+
+ __except1
+
+ WalkExceptionHandlers();
+
+ printf ("x = %d\n", x);
+
+ printf ("Finished!\n");
+}
+
+
diff --git a/winsup/mingw/samples/seh/sehsub.c b/winsup/mingw/samples/seh/sehsub.c
new file mode 100644
index 000000000..d2442850a
--- /dev/null
+++ b/winsup/mingw/samples/seh/sehsub.c
@@ -0,0 +1,43 @@
+/*
+ * sehsub.c
+ *
+ * In an attempt to see what might be going on inside CRTDLL, this program
+ * walks the exception list after creating a new thread with _beginthread.
+ *
+ * It turns out that _beginthread DOES install an exception handler, as
+ * expected, but this handler is NOT exported by CRTDLL (it is certainly
+ * not _except_handler2 or _XcptFilter)... an odd and unpleasant turn of
+ * events.
+ */
+
+#include <windows.h>
+#include <excpt.h>
+#include <process.h>
+
+#include "exutil.h"
+
+extern void* __imp__except_handler3;
+
+unsigned
+my_thread (void * p)
+{
+ printf ("In my thread.\n");
+ WalkExceptionHandlers();
+ return 0;
+}
+
+main ()
+{
+ unsigned long h;
+ unsigned id;
+ printf ("In main.\n");
+ WalkExceptionHandlers();
+
+ printf ("Except_handler3 %08x\n", __imp__except_handler3);
+ h = _beginthreadex (NULL, 0, my_thread, NULL, 0, &id);
+
+ WaitForSingleObject ((HANDLE) h, INFINITE);
+ CloseHandle ((HANDLE) h);
+ return;
+}
+
diff --git a/winsup/mingw/samples/seh/sehtest.c b/winsup/mingw/samples/seh/sehtest.c
new file mode 100644
index 000000000..b7ac3357e
--- /dev/null
+++ b/winsup/mingw/samples/seh/sehtest.c
@@ -0,0 +1,72 @@
+/*
+ * This file tests some of the basics of structured exception handling as
+ * implemented in excpt.h and the Windows API header files.
+ *
+ * The program installs two exception handlers, then attempts to write to
+ * a pointer to an invalid address. This causes an exception which passes
+ * through the exception handlers and on to the default system exception
+ * handler. That handler brings up the dialog box all Windows users know
+ * and love, and then the program is terminated.
+ *
+ * You might note that after the initial run up through our exception frames
+ * we get a second run up through them with the exception code
+ * STATUS_INVALID_DISPOSITION and the code EH_UNWINDING. This seems normal
+ * except that the code got changed from the previous STATUS_ACCESS_VIOLATION.
+ * I don't understand that bit particularly.
+ */
+
+#include <stdio.h>
+#include <excpt.h>
+
+#include "exutil.h"
+
+EXCEPTION_DISPOSITION
+my_handler (
+ struct _EXCEPTION_RECORD* pExceptionRec,
+ void* pEstablisherFrame,
+ struct _CONTEXT* pContextRecord,
+ void* pDispatcherContext
+ )
+{
+ printf ("In my exception handler!\n");
+ DumpExceptionRecord (pExceptionRec);
+ return ExceptionContinueSearch;
+}
+
+EXCEPTION_DISPOSITION
+my_handler2 (
+ struct _EXCEPTION_RECORD* pExceptionRec,
+ void* pEstablisherFrame,
+ struct _CONTEXT* pContextRecord,
+ void* pDispatcherContext
+ )
+{
+ printf ("In top exception handler!\n");
+ DumpExceptionRecord (pExceptionRec);
+ return ExceptionContinueSearch;
+}
+
+main ()
+{
+ char* x;
+
+ printf ("my_handler2 = %08x\n", my_handler2);
+ printf ("my_handler = %08x\n", my_handler);
+
+ WalkExceptionHandlers();
+
+ __try1(my_handler2)
+ x = (char*) 10;
+
+ WalkExceptionHandlers();
+
+ __try1(my_handler)
+
+ WalkExceptionHandlers();
+
+ *x = 1;
+ __except1
+ __except1
+ printf ("Finished!\n");
+}
+
diff --git a/winsup/mingw/samples/simpledll/dll.c b/winsup/mingw/samples/simpledll/dll.c
new file mode 100644
index 000000000..7f743bfcd
--- /dev/null
+++ b/winsup/mingw/samples/simpledll/dll.c
@@ -0,0 +1,33 @@
+
+#include <windows.h>
+
+BOOL WINAPI
+DllMain (HANDLE hDll, DWORD dwReason, LPVOID lpReserved)
+{
+ switch (dwReason)
+ {
+ case DLL_PROCESS_ATTACH:
+ printf ("DLL Attached.\n");
+ break;
+
+ case DLL_PROCESS_DETACH:
+ printf ("DLL Detached.\n");
+ break;
+
+ case DLL_THREAD_ATTACH:
+ printf ("DLL Thread Attached.\n");
+ break;
+
+ case DLL_THREAD_DETACH:
+ printf ("DLL Thread Detached.\n");
+ break;
+ }
+ return TRUE;
+}
+
+void
+Test ()
+{
+ printf ("Test Function called!\n");
+}
+
diff --git a/winsup/mingw/samples/simpledll/dll.cpp b/winsup/mingw/samples/simpledll/dll.cpp
new file mode 100644
index 000000000..0c0240685
--- /dev/null
+++ b/winsup/mingw/samples/simpledll/dll.cpp
@@ -0,0 +1,44 @@
+//
+// This is a C++ version of the code in dll.c. NOTE that you need to put
+// extern "C" { ... } around DllMain or it will not be called when your
+// Dll starts up! (It will get name mangled as a C++ function and the C
+// default version in libmingw32.a will get called instead.)
+//
+
+#include <windows.h>
+
+#include <iostream>
+
+extern "C" {
+
+BOOL WINAPI
+DllMain (HANDLE hDll, DWORD dwReason, LPVOID lpReserved)
+{
+ switch (dwReason)
+ {
+ case DLL_PROCESS_ATTACH:
+ cout << "Dll Attached" << endl ;
+ break;
+
+ case DLL_PROCESS_DETACH:
+ cout << "Dll Detached" << endl ;
+ break;
+
+ case DLL_THREAD_ATTACH:
+ printf ("DLL Thread Attached.\n");
+ break;
+
+ case DLL_THREAD_DETACH:
+ printf ("DLL Thread Detached.\n");
+ break;
+ }
+ return TRUE;
+}
+
+void
+Test ()
+{
+ printf ("Test Function called!\n");
+}
+
+};
diff --git a/winsup/mingw/samples/simpledll/dll.def b/winsup/mingw/samples/simpledll/dll.def
new file mode 100644
index 000000000..0a623d6b5
--- /dev/null
+++ b/winsup/mingw/samples/simpledll/dll.def
@@ -0,0 +1,2 @@
+EXPORTS
+Test
diff --git a/winsup/mingw/samples/simpledll/exe.c b/winsup/mingw/samples/simpledll/exe.c
new file mode 100644
index 000000000..cc44202ee
--- /dev/null
+++ b/winsup/mingw/samples/simpledll/exe.c
@@ -0,0 +1,13 @@
+#include <stdio.h>
+
+extern void Test();
+
+int main()
+{
+ printf ("Program started.\n");
+ Test ();
+ printf ("Program ends.\n");
+
+ return 0;
+}
+
diff --git a/winsup/mingw/samples/simpledll/jamfile b/winsup/mingw/samples/simpledll/jamfile
new file mode 100644
index 000000000..30704e68d
--- /dev/null
+++ b/winsup/mingw/samples/simpledll/jamfile
@@ -0,0 +1,14 @@
+
+Dll dll.dll : dll.c ;
+
+ImportLib libdll.a : dll.def ;
+
+
+Main exe.exe : exe.c ;
+
+LinkLibraries exe.exe : libdll.a ;
+
+DEPENDS exe.exe : dll.dll ;
+
+LINKFLAGS on exe.exe = $(LINKFLAGS) -L. ;
+
diff --git a/winsup/mingw/samples/simpledll/makedll.bat b/winsup/mingw/samples/simpledll/makedll.bat
new file mode 100644
index 000000000..c7f9b2ae8
--- /dev/null
+++ b/winsup/mingw/samples/simpledll/makedll.bat
@@ -0,0 +1,23 @@
+rem *** Create the import library for the dll ***
+dlltool --dllname dll.dll --def dll.def --output-lib libdll.a
+
+rem *** Compile the dll ***
+gcc -c -o dll.o dll.c
+
+rem *** Link the dll ***
+gcc -s -mdll -o dll.dll -Wl,--base-file,dll.b dll.o
+dlltool --dllname dll.dll --base-file dll.b --output-exp dll.e --def dll.def
+gcc -s -mdll -o dll.dll -Wl,--base-file,dll.b dll.o -Wl,dll.e
+dlltool --dllname dll.dll --base-file dll.b --output-exp dll.e --def dll.def
+gcc -s -mdll -o dll.dll dll.o -Wl,dll.e
+
+rem *** Delete temporary files from dll linking ***
+del dll.b
+del dll.e
+
+rem *** Compile exe, which uses dll. ***
+gcc -c -o exe.o exe.c
+
+rem *** Link exe.exe, which uses dll.dll ***
+gcc -s -L. -o exe.exe exe.o libdll.a
+
diff --git a/winsup/mingw/samples/test/jamfile b/winsup/mingw/samples/test/jamfile
new file mode 100644
index 000000000..332ac04b8
--- /dev/null
+++ b/winsup/mingw/samples/test/jamfile
@@ -0,0 +1,9 @@
+#
+# A very simple example with which you can test your compiler/jam setup.
+# Also an interesting example of a hybrid console/GUI application.
+#
+
+Main test.exe : test.c ;
+
+GuiLibs test.exe ;
+
diff --git a/winsup/mingw/samples/test/test.c b/winsup/mingw/samples/test/test.c
new file mode 100644
index 000000000..af8884c9c
--- /dev/null
+++ b/winsup/mingw/samples/test/test.c
@@ -0,0 +1,20 @@
+/*
+ * This source code is in the PUBLIC DOMAIN and has NO WARRANTY.
+ *
+ * Colin Peters <colin@bird.fu.is.saga-u.ac.jp>, April 15, 1997.
+ */
+
+#include <windows.h>
+#include <stdio.h>
+
+int STDCALL
+WinMain (HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpCmd, int nShow)
+{
+ char text[80];
+
+ printf ("Enter message box text:");
+ fgets(text, 80, stdin);
+ MessageBox (NULL, text, "Test", MB_OK);
+ printf ("\nHello after message box.\n");
+ return 0;
+}
diff --git a/winsup/mingw/samples/wintest/jamfile b/winsup/mingw/samples/wintest/jamfile
new file mode 100644
index 000000000..8102fa067
--- /dev/null
+++ b/winsup/mingw/samples/wintest/jamfile
@@ -0,0 +1,8 @@
+#
+# A example of Win32 GUI programming in C.
+#
+
+Main test.exe : test.c ;
+
+Gui test.exe ;
+
diff --git a/winsup/mingw/samples/wintest/test.c b/winsup/mingw/samples/wintest/test.c
new file mode 100644
index 000000000..961496fc1
--- /dev/null
+++ b/winsup/mingw/samples/wintest/test.c
@@ -0,0 +1,212 @@
+/*
+ * A basic example of Win32 programming in C.
+ *
+ * This source code is in the PUBLIC DOMAIN and has NO WARRANTY.
+ *
+ * Colin Peters <colin@bird.fu.is.saga-u.ac.jp>
+ */
+
+#include <windows.h>
+#include <string.h>
+
+/*
+ * This is the window function for the main window. Whenever a message is
+ * dispatched using DispatchMessage (or sent with SendMessage) this function
+ * gets called with the contents of the message.
+ */
+LRESULT CALLBACK
+MainWndProc (HWND hwnd, UINT nMsg, WPARAM wParam, LPARAM lParam)
+{
+ /* The window handle for the "Click Me" button. */
+ static HWND hwndButton = 0;
+ static int cx, cy; /* Height and width of our button. */
+
+ HDC hdc; /* A device context used for drawing */
+ PAINTSTRUCT ps; /* Also used during window drawing */
+ RECT rc; /* A rectangle used during drawing */
+
+ /*
+ * Perform processing based on what kind of message we got.
+ */
+ switch (nMsg)
+ {
+ case WM_CREATE:
+ {
+ /* The window is being created. Create our button
+ * window now. */
+ TEXTMETRIC tm;
+
+ /* First we use the system fixed font size to choose
+ * a nice button size. */
+ hdc = GetDC (hwnd);
+ SelectObject (hdc, GetStockObject (SYSTEM_FIXED_FONT));
+ GetTextMetrics (hdc, &tm);
+ cx = tm.tmAveCharWidth * 30;
+ cy = (tm.tmHeight + tm.tmExternalLeading) * 2;
+ ReleaseDC (hwnd, hdc);
+
+ /* Now create the button */
+ hwndButton = CreateWindow (
+ "button", /* Builtin button class */
+ "Click Here",
+ WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
+ 0, 0, cx, cy,
+ hwnd, /* Parent is this window. */
+ (HMENU) 1, /* Control ID: 1 */
+ ((LPCREATESTRUCT) lParam)->hInstance,
+ NULL
+ );
+
+ return 0;
+ break;
+ }
+
+ case WM_DESTROY:
+ /* The window is being destroyed, close the application
+ * (the child button gets destroyed automatically). */
+ PostQuitMessage (0);
+ return 0;
+ break;
+
+ case WM_PAINT:
+ /* The window needs to be painted (redrawn). */
+ hdc = BeginPaint (hwnd, &ps);
+ GetClientRect (hwnd, &rc);
+
+ /* Draw "Hello, World" in the middle of the upper
+ * half of the window. */
+ rc.bottom = rc.bottom / 2;
+ DrawText (hdc, "Hello, World", -1, &rc,
+ DT_SINGLELINE | DT_CENTER | DT_VCENTER);
+
+ EndPaint (hwnd, &ps);
+ return 0;
+ break;
+
+ case WM_SIZE:
+ /* The window size is changing. If the button exists
+ * then place it in the center of the bottom half of
+ * the window. */
+ if (hwndButton &&
+ (wParam == SIZEFULLSCREEN ||
+ wParam == SIZENORMAL)
+ )
+ {
+ rc.left = (LOWORD(lParam) - cx) / 2;
+ rc.top = HIWORD(lParam) * 3 / 4 - cy / 2;
+ MoveWindow (
+ hwndButton,
+ rc.left, rc.top, cx, cy, TRUE);
+ }
+ break;
+
+ case WM_COMMAND:
+ /* Check the control ID, notification code and
+ * control handle to see if this is a button click
+ * message from our child button. */
+ if (LOWORD(wParam) == 1 &&
+ HIWORD(wParam) == BN_CLICKED &&
+ (HWND) lParam == hwndButton)
+ {
+ /* Our button was clicked. Close the window. */
+ DestroyWindow (hwnd);
+ }
+ return 0;
+ break;
+ }
+
+ /* If we don't handle a message completely we hand it to the system
+ * provided default window function. */
+ return DefWindowProc (hwnd, nMsg, wParam, lParam);
+}
+
+
+int STDCALL
+WinMain (HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpCmd, int nShow)
+{
+ HWND hwndMain; /* Handle for the main window. */
+ MSG msg; /* A Win32 message structure. */
+ WNDCLASSEX wndclass; /* A window class structure. */
+ char* szMainWndClass = "WinTestWin";
+ /* The name of the main window class */
+
+ /*
+ * First we create a window class for our main window.
+ */
+
+ /* Initialize the entire structure to zero. */
+ memset (&wndclass, 0, sizeof(WNDCLASSEX));
+
+ /* This class is called WinTestWin */
+ wndclass.lpszClassName = szMainWndClass;
+
+ /* cbSize gives the size of the structure for extensibility. */
+ wndclass.cbSize = sizeof(WNDCLASSEX);
+
+ /* All windows of this class redraw when resized. */
+ wndclass.style = CS_HREDRAW | CS_VREDRAW;
+
+ /* All windows of this class use the MainWndProc window function. */
+ wndclass.lpfnWndProc = MainWndProc;
+
+ /* This class is used with the current program instance. */
+ wndclass.hInstance = hInst;
+
+ /* Use standard application icon and arrow cursor provided by the OS */
+ wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION);
+ wndclass.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
+ wndclass.hCursor = LoadCursor (NULL, IDC_ARROW);
+
+ /* Color the background white */
+ wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);
+
+ /*
+ * Now register the window class for use.
+ */
+ RegisterClassEx (&wndclass);
+
+ /*
+ * Create our main window using that window class.
+ */
+ hwndMain = CreateWindow (
+ szMainWndClass, /* Class name */
+ "Hello", /* Caption */
+ WS_OVERLAPPEDWINDOW, /* Style */
+ CW_USEDEFAULT, /* Initial x (use default) */
+ CW_USEDEFAULT, /* Initial y (use default) */
+ CW_USEDEFAULT, /* Initial x size (use default) */
+ CW_USEDEFAULT, /* Initial y size (use default) */
+ NULL, /* No parent window */
+ NULL, /* No menu */
+ hInst, /* This program instance */
+ NULL /* Creation parameters */
+ );
+
+ /*
+ * Display the window which we just created (using the nShow
+ * passed by the OS, which allows for start minimized and that
+ * sort of thing).
+ */
+ ShowWindow (hwndMain, nShow);
+ UpdateWindow (hwndMain);
+
+ /*
+ * The main message loop. All messages being sent to the windows
+ * of the application (or at least the primary thread) are retrieved
+ * by the GetMessage call, then translated (mainly for keyboard
+ * messages) and dispatched to the appropriate window procedure.
+ * This is the simplest kind of message loop. More complex loops
+ * are required for idle processing or handling modeless dialog
+ * boxes. When one of the windows calls PostQuitMessage GetMessage
+ * will return zero and the wParam of the message will be filled
+ * with the argument to PostQuitMessage. The loop will end and
+ * the application will close.
+ */
+ while (GetMessage (&msg, NULL, 0, 0))
+ {
+ TranslateMessage (&msg);
+ DispatchMessage (&msg);
+ }
+ return msg.wParam;
+}
+
diff --git a/winsup/mingw/string_old.c b/winsup/mingw/string_old.c
new file mode 100644
index 000000000..c1baeb47e
--- /dev/null
+++ b/winsup/mingw/string_old.c
@@ -0,0 +1,47 @@
+/*
+ * string_old.c
+ *
+ * Oldnames from ANSI header string.h
+ *
+ * Some wrapper functions for those old name functions whose appropriate
+ * equivalents are not simply underscore prefixed.
+ *
+ * Contributors:
+ * Created by Colin Peters <colin@bird.fu.is.saga-u.ac.jp>
+ *
+ * THIS SOFTWARE IS NOT COPYRIGHTED
+ *
+ * This source code is offered for use in the public domain. You may
+ * use, modify or distribute it freely.
+ *
+ * This code is distributed in the hope that it will be useful but
+ * WITHOUT ANY WARRANTY. ALL WARRENTIES, EXPRESS OR IMPLIED ARE HEREBY
+ * DISCLAMED. This includes but is not limited to warrenties of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * $Revision$
+ * $Author$
+ * $Date$
+ *
+ */
+
+#include <string.h>
+
+int
+strcasecmp (const char *sz1, const char *sz2)
+{
+ return _stricmp (sz1, sz2);
+}
+
+int
+strncasecmp (const char *sz1, const char *sz2, size_t sizeMaxCompare)
+{
+ return _strnicmp (sz1, sz2, sizeMaxCompare);
+}
+
+int
+wcscmpi (const wchar_t * ws1, const wchar_t * ws2)
+{
+ return _wcsicmp (ws1, ws2);
+}
+
diff --git a/winsup/testsuite/README b/winsup/testsuite/README
new file mode 100644
index 000000000..92ede0dc7
--- /dev/null
+++ b/winsup/testsuite/README
@@ -0,0 +1,42 @@
+1999-12-23 DJ Delorie <dj@cygnus.com>
+
+Here are some notes about adding and using this testsuite.
+
+First, all the programs are linked with new-libcygwin.a, which is just
+like libcygwin.a, except that it wants new-cygwin1.dll, not
+cygwin1.dll. The testsuite adds the winsup build directory to the
+PATH so that new-cygwin1.dll can be found by windows during testing.
+
+Because we'll probably run into complaints about using two DLLs, we
+run cygrun.exe for each test. All this does is run the test with
+CreateProcess() so that we don't attempt to do the special code for
+when a cygwin program calls another cygwin program, as this might be a
+"multiple cygwins" problem.
+
+Any test that needs to test command line args or redirection needs to
+run such a child program itself, as the testsuite will not do any
+arguments or redirection for it. Same for fork, signals, etc.
+
+The testsuite/winsup.api subdirectory is for testing the API to
+cygwin1.dll ONLY. Create other subdirs under testsuite/ for other
+classes of testing.
+
+Tests in winsup.api/*.c or winsup.api/*/*.c (only one subdirectory
+level is allowed) either compile, run, and exit(0) or they fail.
+Either abort or exit with a non-zero code to indicate failure. Don't
+print anything to the screen if you can avoid it (except for failure
+reasons, of course). One .c file per test, no compile options are
+allowed (we're testing the api, not the compiler).
+
+Tests whose filename begin with "xf-" will be *expected* to fail, and
+will "fail" if they compile, run, and return zero. Note that the
+*only* purpose for adding this feature is to test the testing
+framework itself. All real tests should NOT be named xf-*, and should
+pass for real (compile, run, return 0) if the dll is working
+correctly. Do not use xf-* to "silence" a failure that you know isn't
+going to get fixed for a while; let it just keep failing. There are
+five "sample" tests that demonstrate how the framework works and what
+happens to each condition.
+
+"make check" will only work if you run it *on* an NT machine.
+Cross-checking is not supported.
diff --git a/winsup/testsuite/config/default.exp b/winsup/testsuite/config/default.exp
new file mode 100644
index 000000000..ec8ce1448
--- /dev/null
+++ b/winsup/testsuite/config/default.exp
@@ -0,0 +1,6 @@
+proc winsup_version {} {
+ clone_output "\n[exec grep ^%%% ../new-cygwin1.dll]\n"
+}
+
+proc winsup_exit {} {
+}
diff --git a/winsup/testsuite/winsup.api/devzero.c b/winsup/testsuite/winsup.api/devzero.c
new file mode 100644
index 000000000..85a2615b1
--- /dev/null
+++ b/winsup/testsuite/winsup.api/devzero.c
@@ -0,0 +1,113 @@
+#include <stdio.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <fcntl.h>
+#include <sys/mman.h>
+
+main()
+{
+ int fd, r, w, l;
+ char buf[1024];
+ char *v;
+
+ fd = open("/dev/zero", O_RDONLY);
+ if (fd < 0)
+ {
+ fprintf(stderr, "Unable to open /dev/zero for reading\n");
+ perror("The error was");
+ exit(1);
+ }
+
+ l = read(fd, buf, 1024);
+ if (l != 1024)
+ {
+ fprintf(stderr, "Asked to read 1024 bytes, got %d\n", l);
+ exit(1);
+ }
+
+ for (r=0; r<1024; r++)
+ if (buf[r] != 0)
+ {
+ fprintf(stderr, "/dev/zero returned a byte of %02x at offset %d\n",
+ buf[r], r);
+ exit(1);
+ }
+
+ l = lseek(fd, 4096, 0);
+ if (l != 0)
+ {
+ fprintf(stderr, "l == %d\n", l);
+ exit(1);
+ }
+
+ l = close(fd);
+ if (l != 0)
+ {
+ fprintf(stderr, "close: returned %d\n", l);
+ perror("The error was");
+ exit(1);
+ }
+
+ fd = open("/dev/zero", O_WRONLY);
+ if (fd < 0)
+ {
+ fprintf(stderr, "Unable to open /dev/zero for writing\n");
+ perror("The error was");
+ exit(1);
+ }
+
+ l = write(fd, buf, 1024);
+ if (l != 1024)
+ {
+ fprintf(stderr, "Asked to write 1024 bytes, got %d\n", l);
+ exit(1);
+ }
+
+ l = close(fd);
+ if (l != 0)
+ {
+ fprintf(stderr, "close: returned %d\n", l);
+ perror("The error was");
+ exit(1);
+ }
+
+ fd = open("/dev/zero", O_RDWR);
+ v = (char *)mmap(0, 65536, PROT_READ|PROT_WRITE, MAP_PRIVATE, fd, 0);
+ if (v == (char *)-1)
+ {
+ fprintf(stderr, "mmap r/w /dev/zero failed\n");
+ perror("The error was");
+ exit(1);
+ }
+
+ for (r=0; r<65536; r++)
+ if (v[r] != 0)
+ {
+ fprintf(stderr, "mmap'd r/w /dev/zero has byte %d at offset %d\n",
+ v[r], r);
+ exit(1);
+ }
+ munmap(v, 65536);
+ close(fd);
+
+ fd = open("/dev/zero", O_RDONLY);
+ v = (char *)mmap(0, 65536, PROT_READ, MAP_SHARED, fd, 0);
+ if (v == (char *)-1)
+ {
+ fprintf(stderr, "mmap /dev/zero r/o failed\n");
+ perror("The error was");
+ exit(1);
+ }
+
+ for (r=0; r<65536; r++)
+ if (v[r] != 0)
+ {
+ fprintf(stderr, "mmap'd r/o /dev/zero has byte %d at offset %d\n",
+ v[r], r);
+ exit(1);
+ }
+ munmap(v, 65536);
+ close(fd);
+
+ exit(0);
+}
diff --git a/winsup/testsuite/winsup.api/samples/sample-fail.c b/winsup/testsuite/winsup.api/samples/sample-fail.c
new file mode 100644
index 000000000..d8beb90be
--- /dev/null
+++ b/winsup/testsuite/winsup.api/samples/sample-fail.c
@@ -0,0 +1,4 @@
+main()
+{
+ return 1;
+}
diff --git a/winsup/testsuite/winsup.api/samples/sample-miscompile.c b/winsup/testsuite/winsup.api/samples/sample-miscompile.c
new file mode 100644
index 000000000..bc0d21d2e
--- /dev/null
+++ b/winsup/testsuite/winsup.api/samples/sample-miscompile.c
@@ -0,0 +1 @@
+foo bar grill
diff --git a/winsup/testsuite/winsup.api/samples/sample-pass.c b/winsup/testsuite/winsup.api/samples/sample-pass.c
new file mode 100644
index 000000000..893a0b605
--- /dev/null
+++ b/winsup/testsuite/winsup.api/samples/sample-pass.c
@@ -0,0 +1,4 @@
+main()
+{
+ return 0;
+}
diff --git a/winsup/testsuite/winsup.api/winsup.exp b/winsup/testsuite/winsup.api/winsup.exp
new file mode 100644
index 000000000..5c85cc00b
--- /dev/null
+++ b/winsup/testsuite/winsup.api/winsup.exp
@@ -0,0 +1,43 @@
+source "site.exp"
+
+if { ! [isnative] } {
+ verbose "skipping winsup.api because it's not native"
+ return
+}
+
+set rv ""
+
+proc ws_spawn {cmd args} {
+ global rv
+ verbose "running $cmd\n"
+ catch [eval "exec $cmd"] rv
+ verbose send "catchCode = $rv\n"
+}
+
+foreach src [glob -nocomplain $srcdir/$subdir/*.c $srcdir/$subdir/*/*.c] {
+ regsub "^$srcdir/$subdir/" $src "" testcase
+ regsub ".c$" $testcase "" base
+ regsub ".*/" $base "" basename
+ regsub "/" $base "-" base
+
+ if { [regexp "^xf-" $basename] } {
+ setup_xfail "*-*-*"
+ } else {
+ clear_xfail
+ }
+
+ ws_spawn "$CC $src $rootme/new-libcygwin.a -o $base.exe"
+ if { $rv != "" } {
+ verbose -log "$rv"
+ fail "$testcase (compile)"
+ } else {
+ ws_spawn "../cygrun ./$base.exe"
+ if { $rv != "" } {
+ verbose -log "$testcase: $rv"
+ fail "$testcase (execute)"
+ } else {
+ pass "$testcase"
+ file delete "$base.exe"
+ }
+ }
+}
diff --git a/winsup/utils/ChangeLog b/winsup/utils/ChangeLog
new file mode 100644
index 000000000..62a442509
--- /dev/null
+++ b/winsup/utils/ChangeLog
@@ -0,0 +1,21 @@
+Fri Jan 21 02:10:26 Corinna Vinschen <corinna@vinschen.de>
+
+ * utils/regtool.cc (translate): Added unix like backslash
+ processing.
+
+2000-01-20 Corinna Vinschen <corinna@vinschen.de>
+
+ * regtool.cc: allow forward slashes as key separators
+
+2000-01-19 DJ Delorie <dj@redhat.com>
+
+ * regtool.cc: New file.
+ * Makefile.in: add regtool
+ * utils.sgml: add regtool
+
+Sat Jan 8 17:13:51 2000 Christopher Faylor <cgf@cygnus.com>
+
+ * getfacl.c: New file.
+ * setfacl.c: New file.
+ * Makefile.in: Add getfacl.exe and setfacl.exe to list of PROGS.
+ Fix link flags in MINGW case.
diff --git a/winsup/utils/Makefile.in b/winsup/utils/Makefile.in
new file mode 100644
index 000000000..11871d17f
--- /dev/null
+++ b/winsup/utils/Makefile.in
@@ -0,0 +1,109 @@
+# Makefile for Cygwin utilities
+# Copyright 1996, 1997, 1998 Cygnus Solutions.
+
+# This file is part of Cygwin.
+
+# This software is a copyrighted work licensed under the terms of the
+# Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+# details.
+
+SHELL:=@SHELL@
+
+srcdir:=@srcdir@
+VPATH:=@srcdir@
+prefix:=@prefix@
+exec_prefix:=@exec_prefix@
+
+bindir:=@bindir@
+etcdir:=$(exec_prefix)/etc
+program_transform_name:=@program_transform_name@
+
+INSTALL:=@INSTALL@
+INSTALL_PROGRAM:=@INSTALL_PROGRAM@
+INSTALL_DATA:=@INSTALL_DATA@
+
+EXEEXT:=@EXEEXT@
+EXEEXT_FOR_BUILD:=@EXEEXT_FOR_BUILD@
+
+CC:=@CC@
+CC_FOR_TARGET:=$(CC)
+
+CFLAGS:=@CFLAGS@
+CXXFLAGS:=@CXXFLAGS@
+
+include $(srcdir)/../Makefile.common
+
+MINGW_INCLUDES:=-I$(updir)/mingw/include
+
+MINGW_CXXFLAGS:=-mno-cygwin $(CXXFLAGS) $(MINGW_INCLUDES)
+MINGW_CFLAGS:=-mno-cygwin $(CFLAGS) $(MINGW_INCLUDES)
+
+libcygwin:=$(cygwin_build)/libcygwin.a
+libuser32:=$(w32api_lib)/libuser32.a
+libkernel32:=$(w32api_lib)/libkernel32.a
+ALL_DEP_LDLIBS:=$(libcygwin) $(w32api_lib)/libnetapi32.a \
+ $(w32api_lib)/libadvapi32.a $(w32api_lib)/libkernel32.a \
+ $(w32api_lib)/libuser32.a
+
+ALL_LDLIBS:=${patsubst $(w32api_lib)/lib%.a,-l%,\
+ ${filter-out $(libuser32),\
+ ${filter-out $(libkernel32),\
+ ${filter-out $(libcygwin), $(ALL_DEP_LDLIBS)}}}}
+
+MINGW_LIB:=$(mingw_build)/libmingw32.a
+MINGW_LDLIBS:=$(ALL_LDLIBS) $(MINGW_LIB)
+ALL_LDFLAGS:=-B$(newlib_build)/libc/ -B$(newlib_build)/libm/ -B$(w32api_lib)/ \
+ $(LDFLAGS) $(ALL_LDLIBS)
+MINGW_LDFLAGS:=$(ALL_LDFLAGS) $(MINGW_LIB)
+
+PROGS:=mount$(EXEEXT) umount$(EXEEXT) ps$(EXEEXT) kill$(EXEEXT) \
+ mkpasswd$(EXEEXT) mkgroup$(EXEEXT) cygpath$(EXEEXT) cygcheck$(EXEEXT) \
+ passwd$(EXEEXT) getfacl$(EXEEXT) setfacl$(EXEEXT) strace$(EXEEXT) \
+ regtool$(EXEEXT)
+
+WINSUP_DEPS:=$(cygwin_source)/winsup.h
+
+.SUFFIXES:
+.NOEXPORT:
+
+.PHONY: all install clean realclean
+
+all: Makefile $(PROGS)
+
+strace.exe: strace.cc mingw_getopt.o $(MINGW_LDLIBS)
+ifdef VERBOSE
+ $(CC) $(MINGW_CFLAGS) -o $@ ${wordlist 1,2,$^} -B$(mingw_build)/ $(MINGW_LDFLAGS)
+else
+ @echo $(CC) -mno-cygwin -o $@ ${wordlist 1,2,$^} ${filter-out -B%, $(MINGW_LDFLAGS)};\
+ $(CC) $(MINGW_CFLAGS) -o $@ ${wordlist 1,2,$^} -B$(mingw_build)/ $(MINGW_LDFLAGS)
+endif
+
+mingw_getopt.o: $(cygwin_source)/getopt.c
+ $(CC) -c -o $@ $(MINGW_CFLAGS) $^
+
+clean:
+ rm -f *.o $(PROGS)
+
+realclean: clean
+ rm -f Makefile config.cache
+
+install: all
+ $(SHELL) $(updir1)/mkinstalldirs $(bindir) $(etcdir)
+ for i in $(PROGS) ; do \
+ n=`echo $$i | sed '$(program_transform_name)'`; \
+ $(INSTALL_PROGRAM) $$i $(bindir)/$$n; \
+ done
+
+$(cygwin_build)/libcygwin.a: $(cygwin_build)/Makefile
+ @$(MAKE) -C $(@D) $(@F)
+
+$(mingw_build)/libmingw32.a: $(mingw_build)/Makefile
+ @$(MAKE) -C $(@D) $(@F)
+
+%.exe: %.o $(ALL_DEP_LDLIBS)
+ifdef VERBOSE
+ $(CC) -o $@ ${firstword $^} -B$(cygwin_build)/ $(ALL_LDFLAGS)
+else
+ @echo $(CC) -o $@ ${firstword $^} ${filter-out -B%, $(ALL_LDFLAGS)};\
+ $(CC) -o $@ ${firstword $^} -B$(cygwin_build)/ $(ALL_LDFLAGS)
+endif
diff --git a/winsup/utils/aclocal.m4 b/winsup/utils/aclocal.m4
new file mode 100644
index 000000000..754f640bb
--- /dev/null
+++ b/winsup/utils/aclocal.m4
@@ -0,0 +1,78 @@
+dnl aclocal.m4 generated automatically by aclocal 1.3b
+
+dnl Copyright (C) 1994, 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl This program is distributed in the hope that it will be useful,
+dnl but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+dnl even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+dnl PARTICULAR PURPOSE.
+
+# Check to see if we're running under Win32, without using
+# AC_CANONICAL_*. If so, set output variable EXEEXT to ".exe".
+# Otherwise set it to "".
+
+dnl AM_EXEEXT()
+dnl This knows we add .exe if we're building in the Cygwin
+dnl environment. But if we're not, then it compiles a test program
+dnl to see if there is a suffix for executables.
+AC_DEFUN(AM_EXEEXT,
+[AC_REQUIRE([AM_CYGWIN])
+AC_REQUIRE([AM_MINGW32])
+AC_MSG_CHECKING([for executable suffix])
+AC_CACHE_VAL(am_cv_exeext,
+[if test "$CYGWIN" = yes || test "$MINGW32" = yes; then
+am_cv_exeext=.exe
+else
+cat > am_c_test.c << 'EOF'
+int main() {
+/* Nothing needed here */
+}
+EOF
+${CC-cc} -o am_c_test $CFLAGS $CPPFLAGS $LDFLAGS am_c_test.c $LIBS 1>&5
+am_cv_exeext=
+for file in am_c_test.*; do
+ case $file in
+ *.c) ;;
+ *.o) ;;
+ *) am_cv_exeext=`echo $file | sed -e s/am_c_test//` ;;
+ esac
+done
+rm -f am_c_test*])
+test x"${am_cv_exeext}" = x && am_cv_exeext=no
+fi
+EXEEXT=""
+test x"${am_cv_exeext}" != xno && EXEEXT=${am_cv_exeext}
+AC_MSG_RESULT(${am_cv_exeext})
+AC_SUBST(EXEEXT)])
+
+# Check to see if we're running under Cygwin, without using
+# AC_CANONICAL_*. If so, set output variable CYGWIN to "yes".
+# Otherwise set it to "no".
+
+dnl AM_CYGWIN()
+AC_DEFUN(AM_CYGWIN,
+[AC_CACHE_CHECK(for Cygwin environment, am_cv_cygwin,
+[AC_TRY_COMPILE(,[return __CYGWIN32__;],
+am_cv_cygwin=yes, am_cv_cygwin=no)
+rm -f conftest*])
+CYGWIN=
+test "$am_cv_cygwin" = yes && CYGWIN=yes])
+
+
+
+# Check to see if we're running under Mingw, without using
+# AC_CANONICAL_*. If so, set output variable MINGW32 to "yes".
+# Otherwise set it to "no".
+
+dnl AM_MINGW32()
+AC_DEFUN(AM_MINGW32,
+[AC_CACHE_CHECK(for Mingw32 environment, am_cv_mingw32,
+[AC_TRY_COMPILE(,[return __MINGW32__;],
+am_cv_mingw32=yes, am_cv_mingw32=no)
+rm -f conftest*])
+MINGW32=
+test "$am_cv_mingw32" = yes && MINGW32=yes])
+
diff --git a/winsup/utils/configure b/winsup/utils/configure
new file mode 100755
index 000000000..2f3a2d15a
--- /dev/null
+++ b/winsup/utils/configure
@@ -0,0 +1,1246 @@
+#! /bin/sh
+
+# Guess values for system-dependent variables and create Makefiles.
+# Generated automatically using autoconf version 2.13
+# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.
+#
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+
+# Defaults:
+ac_help=
+ac_default_prefix=/usr/local
+# Any additions from configure.in:
+
+# Initialize some variables set by options.
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+build=NONE
+cache_file=./config.cache
+exec_prefix=NONE
+host=NONE
+no_create=
+nonopt=NONE
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+sitefile=
+srcdir=
+target=NONE
+verbose=
+x_includes=NONE
+x_libraries=NONE
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datadir='${prefix}/share'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+libdir='${exec_prefix}/lib'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+infodir='${prefix}/info'
+mandir='${prefix}/man'
+
+# Initialize some other variables.
+subdirs=
+MFLAGS= MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
+# Maximum number of lines to put in a shell here document.
+ac_max_here_lines=12
+
+ac_prev=
+for ac_option
+do
+
+ # If the previous option needs an argument, assign it.
+ if test -n "$ac_prev"; then
+ eval "$ac_prev=\$ac_option"
+ ac_prev=
+ continue
+ fi
+
+ case "$ac_option" in
+ -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
+ *) ac_optarg= ;;
+ esac
+
+ # Accept the important Cygnus configure options, so we can diagnose typos.
+
+ case "$ac_option" in
+
+ -bindir | --bindir | --bindi | --bind | --bin | --bi)
+ ac_prev=bindir ;;
+ -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+ bindir="$ac_optarg" ;;
+
+ -build | --build | --buil | --bui | --bu)
+ ac_prev=build ;;
+ -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+ build="$ac_optarg" ;;
+
+ -cache-file | --cache-file | --cache-fil | --cache-fi \
+ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+ ac_prev=cache_file ;;
+ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+ cache_file="$ac_optarg" ;;
+
+ -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
+ ac_prev=datadir ;;
+ -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
+ | --da=*)
+ datadir="$ac_optarg" ;;
+
+ -disable-* | --disable-*)
+ ac_feature=`echo $ac_option|sed -e 's/-*disable-//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then
+ { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
+ fi
+ ac_feature=`echo $ac_feature| sed 's/-/_/g'`
+ eval "enable_${ac_feature}=no" ;;
+
+ -enable-* | --enable-*)
+ ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then
+ { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
+ fi
+ ac_feature=`echo $ac_feature| sed 's/-/_/g'`
+ case "$ac_option" in
+ *=*) ;;
+ *) ac_optarg=yes ;;
+ esac
+ eval "enable_${ac_feature}='$ac_optarg'" ;;
+
+ -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+ | --exec | --exe | --ex)
+ ac_prev=exec_prefix ;;
+ -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+ | --exec=* | --exe=* | --ex=*)
+ exec_prefix="$ac_optarg" ;;
+
+ -gas | --gas | --ga | --g)
+ # Obsolete; use --with-gas.
+ with_gas=yes ;;
+
+ -help | --help | --hel | --he)
+ # Omit some internal or obsolete options to make the list less imposing.
+ # This message is too long to be a string in the A/UX 3.1 sh.
+ cat << EOF
+Usage: configure [options] [host]
+Options: [defaults in brackets after descriptions]
+Configuration:
+ --cache-file=FILE cache test results in FILE
+ --help print this message
+ --no-create do not create output files
+ --quiet, --silent do not print \`checking...' messages
+ --site-file=FILE use FILE as the site file
+ --version print the version of autoconf that created configure
+Directory and file names:
+ --prefix=PREFIX install architecture-independent files in PREFIX
+ [$ac_default_prefix]
+ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
+ [same as prefix]
+ --bindir=DIR user executables in DIR [EPREFIX/bin]
+ --sbindir=DIR system admin executables in DIR [EPREFIX/sbin]
+ --libexecdir=DIR program executables in DIR [EPREFIX/libexec]
+ --datadir=DIR read-only architecture-independent data in DIR
+ [PREFIX/share]
+ --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc]
+ --sharedstatedir=DIR modifiable architecture-independent data in DIR
+ [PREFIX/com]
+ --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var]
+ --libdir=DIR object code libraries in DIR [EPREFIX/lib]
+ --includedir=DIR C header files in DIR [PREFIX/include]
+ --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include]
+ --infodir=DIR info documentation in DIR [PREFIX/info]
+ --mandir=DIR man documentation in DIR [PREFIX/man]
+ --srcdir=DIR find the sources in DIR [configure dir or ..]
+ --program-prefix=PREFIX prepend PREFIX to installed program names
+ --program-suffix=SUFFIX append SUFFIX to installed program names
+ --program-transform-name=PROGRAM
+ run sed PROGRAM on installed program names
+EOF
+ cat << EOF
+Host type:
+ --build=BUILD configure for building on BUILD [BUILD=HOST]
+ --host=HOST configure for HOST [guessed]
+ --target=TARGET configure for TARGET [TARGET=HOST]
+Features and packages:
+ --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
+ --enable-FEATURE[=ARG] include FEATURE [ARG=yes]
+ --with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
+ --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
+ --x-includes=DIR X include files are in DIR
+ --x-libraries=DIR X library files are in DIR
+EOF
+ if test -n "$ac_help"; then
+ echo "--enable and --with options recognized:$ac_help"
+ fi
+ exit 0 ;;
+
+ -host | --host | --hos | --ho)
+ ac_prev=host ;;
+ -host=* | --host=* | --hos=* | --ho=*)
+ host="$ac_optarg" ;;
+
+ -includedir | --includedir | --includedi | --included | --include \
+ | --includ | --inclu | --incl | --inc)
+ ac_prev=includedir ;;
+ -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+ | --includ=* | --inclu=* | --incl=* | --inc=*)
+ includedir="$ac_optarg" ;;
+
+ -infodir | --infodir | --infodi | --infod | --info | --inf)
+ ac_prev=infodir ;;
+ -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+ infodir="$ac_optarg" ;;
+
+ -libdir | --libdir | --libdi | --libd)
+ ac_prev=libdir ;;
+ -libdir=* | --libdir=* | --libdi=* | --libd=*)
+ libdir="$ac_optarg" ;;
+
+ -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+ | --libexe | --libex | --libe)
+ ac_prev=libexecdir ;;
+ -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+ | --libexe=* | --libex=* | --libe=*)
+ libexecdir="$ac_optarg" ;;
+
+ -localstatedir | --localstatedir | --localstatedi | --localstated \
+ | --localstate | --localstat | --localsta | --localst \
+ | --locals | --local | --loca | --loc | --lo)
+ ac_prev=localstatedir ;;
+ -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+ | --localstate=* | --localstat=* | --localsta=* | --localst=* \
+ | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
+ localstatedir="$ac_optarg" ;;
+
+ -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+ ac_prev=mandir ;;
+ -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+ mandir="$ac_optarg" ;;
+
+ -nfp | --nfp | --nf)
+ # Obsolete; use --without-fp.
+ with_fp=no ;;
+
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c)
+ no_create=yes ;;
+
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+ no_recursion=yes ;;
+
+ -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+ | --oldin | --oldi | --old | --ol | --o)
+ ac_prev=oldincludedir ;;
+ -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+ oldincludedir="$ac_optarg" ;;
+
+ -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+ ac_prev=prefix ;;
+ -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+ prefix="$ac_optarg" ;;
+
+ -program-prefix | --program-prefix | --program-prefi | --program-pref \
+ | --program-pre | --program-pr | --program-p)
+ ac_prev=program_prefix ;;
+ -program-prefix=* | --program-prefix=* | --program-prefi=* \
+ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+ program_prefix="$ac_optarg" ;;
+
+ -program-suffix | --program-suffix | --program-suffi | --program-suff \
+ | --program-suf | --program-su | --program-s)
+ ac_prev=program_suffix ;;
+ -program-suffix=* | --program-suffix=* | --program-suffi=* \
+ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+ program_suffix="$ac_optarg" ;;
+
+ -program-transform-name | --program-transform-name \
+ | --program-transform-nam | --program-transform-na \
+ | --program-transform-n | --program-transform- \
+ | --program-transform | --program-transfor \
+ | --program-transfo | --program-transf \
+ | --program-trans | --program-tran \
+ | --progr-tra | --program-tr | --program-t)
+ ac_prev=program_transform_name ;;
+ -program-transform-name=* | --program-transform-name=* \
+ | --program-transform-nam=* | --program-transform-na=* \
+ | --program-transform-n=* | --program-transform-=* \
+ | --program-transform=* | --program-transfor=* \
+ | --program-transfo=* | --program-transf=* \
+ | --program-trans=* | --program-tran=* \
+ | --progr-tra=* | --program-tr=* | --program-t=*)
+ program_transform_name="$ac_optarg" ;;
+
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ silent=yes ;;
+
+ -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+ ac_prev=sbindir ;;
+ -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+ | --sbi=* | --sb=*)
+ sbindir="$ac_optarg" ;;
+
+ -sharedstatedir | --sharedstatedir | --sharedstatedi \
+ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+ | --sharedst | --shareds | --shared | --share | --shar \
+ | --sha | --sh)
+ ac_prev=sharedstatedir ;;
+ -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+ | --sha=* | --sh=*)
+ sharedstatedir="$ac_optarg" ;;
+
+ -site | --site | --sit)
+ ac_prev=site ;;
+ -site=* | --site=* | --sit=*)
+ site="$ac_optarg" ;;
+
+ -site-file | --site-file | --site-fil | --site-fi | --site-f)
+ ac_prev=sitefile ;;
+ -site-file=* | --site-file=* | --site-fil=* | --site-fi=* | --site-f=*)
+ sitefile="$ac_optarg" ;;
+
+ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+ ac_prev=srcdir ;;
+ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+ srcdir="$ac_optarg" ;;
+
+ -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+ | --syscon | --sysco | --sysc | --sys | --sy)
+ ac_prev=sysconfdir ;;
+ -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+ sysconfdir="$ac_optarg" ;;
+
+ -target | --target | --targe | --targ | --tar | --ta | --t)
+ ac_prev=target ;;
+ -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+ target="$ac_optarg" ;;
+
+ -v | -verbose | --verbose | --verbos | --verbo | --verb)
+ verbose=yes ;;
+
+ -version | --version | --versio | --versi | --vers)
+ echo "configure generated by autoconf version 2.13"
+ exit 0 ;;
+
+ -with-* | --with-*)
+ ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then
+ { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
+ fi
+ ac_package=`echo $ac_package| sed 's/-/_/g'`
+ case "$ac_option" in
+ *=*) ;;
+ *) ac_optarg=yes ;;
+ esac
+ eval "with_${ac_package}='$ac_optarg'" ;;
+
+ -without-* | --without-*)
+ ac_package=`echo $ac_option|sed -e 's/-*without-//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then
+ { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
+ fi
+ ac_package=`echo $ac_package| sed 's/-/_/g'`
+ eval "with_${ac_package}=no" ;;
+
+ --x)
+ # Obsolete; use --with-x.
+ with_x=yes ;;
+
+ -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+ | --x-incl | --x-inc | --x-in | --x-i)
+ ac_prev=x_includes ;;
+ -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+ x_includes="$ac_optarg" ;;
+
+ -x-libraries | --x-libraries | --x-librarie | --x-librari \
+ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+ ac_prev=x_libraries ;;
+ -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+ x_libraries="$ac_optarg" ;;
+
+ -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; }
+ ;;
+
+ *)
+ if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then
+ echo "configure: warning: $ac_option: invalid host type" 1>&2
+ fi
+ if test "x$nonopt" != xNONE; then
+ { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; }
+ fi
+ nonopt="$ac_option"
+ ;;
+
+ esac
+done
+
+if test -n "$ac_prev"; then
+ { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; }
+fi
+
+trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
+
+# File descriptor usage:
+# 0 standard input
+# 1 file creation
+# 2 errors and warnings
+# 3 some systems may open it to /dev/tty
+# 4 used on the Kubota Titan
+# 6 checking for... messages and results
+# 5 compiler messages saved in config.log
+if test "$silent" = yes; then
+ exec 6>/dev/null
+else
+ exec 6>&1
+fi
+exec 5>./config.log
+
+echo "\
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+" 1>&5
+
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Also quote any args containing shell metacharacters.
+ac_configure_args=
+for ac_arg
+do
+ case "$ac_arg" in
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c) ;;
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;;
+ *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*)
+ ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+ *) ac_configure_args="$ac_configure_args $ac_arg" ;;
+ esac
+done
+
+# NLS nuisances.
+# Only set these to C if already set. These must not be set unconditionally
+# because not all systems understand e.g. LANG=C (notably SCO).
+# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'!
+# Non-C LC_CTYPE values break the ctype check.
+if test "${LANG+set}" = set; then LANG=C; export LANG; fi
+if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi
+if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi
+if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -rf conftest* confdefs.h
+# AIX cpp loses on an empty file, so make sure it contains at least a newline.
+echo > confdefs.h
+
+# A filename unique to this package, relative to the directory that
+# configure is in, which we can look for to find out if srcdir is correct.
+ac_unique_file=mount.cc
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+ ac_srcdir_defaulted=yes
+ # Try the directory containing this script, then its parent.
+ ac_prog=$0
+ ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'`
+ test "x$ac_confdir" = "x$ac_prog" && ac_confdir=.
+ srcdir=$ac_confdir
+ if test ! -r $srcdir/$ac_unique_file; then
+ srcdir=..
+ fi
+else
+ ac_srcdir_defaulted=no
+fi
+if test ! -r $srcdir/$ac_unique_file; then
+ if test "$ac_srcdir_defaulted" = yes; then
+ { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; }
+ else
+ { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; }
+ fi
+fi
+srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'`
+
+# Prefer explicitly selected file to automatically selected ones.
+if test -z "$sitefile"; then
+ if test -z "$CONFIG_SITE"; then
+ if test "x$prefix" != xNONE; then
+ CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
+ else
+ CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+ fi
+ fi
+else
+ CONFIG_SITE="$sitefile"
+fi
+for ac_site_file in $CONFIG_SITE; do
+ if test -r "$ac_site_file"; then
+ echo "loading site script $ac_site_file"
+ . "$ac_site_file"
+ fi
+done
+
+if test -r "$cache_file"; then
+ echo "loading cache $cache_file"
+ . $cache_file
+else
+ echo "creating cache $cache_file"
+ > $cache_file
+fi
+
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+ac_exeext=
+ac_objext=o
+if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
+ # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu.
+ if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then
+ ac_n= ac_c='
+' ac_t=' '
+ else
+ ac_n=-n ac_c= ac_t=
+ fi
+else
+ ac_n= ac_c='\c' ac_t=
+fi
+
+
+
+
+
+
+# Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:543: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_CC="gcc"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+ echo "$ac_t""$CC" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+if test -z "$CC"; then
+ # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:573: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_prog_rejected=no
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then
+ ac_prog_rejected=yes
+ continue
+ fi
+ ac_cv_prog_CC="cc"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+if test $ac_prog_rejected = yes; then
+ # We found a bogon in the path, so make sure we never use it.
+ set dummy $ac_cv_prog_CC
+ shift
+ if test $# -gt 0; then
+ # We chose a different compiler from the bogus one.
+ # However, it has the same basename, so the bogon will be chosen
+ # first if we set CC to just the basename; use the full file name.
+ shift
+ set dummy "$ac_dir/$ac_word" "$@"
+ shift
+ ac_cv_prog_CC="$@"
+ fi
+fi
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+ echo "$ac_t""$CC" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; }
+fi
+
+echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
+echo "configure:622: checking whether we are using GNU C" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.c <<EOF
+#ifdef __GNUC__
+ yes;
+#endif
+EOF
+if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:631: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+ ac_cv_prog_gcc=yes
+else
+ ac_cv_prog_gcc=no
+fi
+fi
+
+echo "$ac_t""$ac_cv_prog_gcc" 1>&6
+
+if test $ac_cv_prog_gcc = yes; then
+ GCC=yes
+ ac_test_CFLAGS="${CFLAGS+set}"
+ ac_save_CFLAGS="$CFLAGS"
+ CFLAGS=
+ echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
+echo "configure:646: checking whether ${CC-cc} accepts -g" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ echo 'void f(){}' > conftest.c
+if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then
+ ac_cv_prog_cc_g=yes
+else
+ ac_cv_prog_cc_g=no
+fi
+rm -f conftest*
+
+fi
+
+echo "$ac_t""$ac_cv_prog_cc_g" 1>&6
+ if test "$ac_test_CFLAGS" = set; then
+ CFLAGS="$ac_save_CFLAGS"
+ elif test $ac_cv_prog_cc_g = yes; then
+ CFLAGS="-g -O2"
+ else
+ CFLAGS="-O2"
+ fi
+else
+ GCC=
+ test "${CFLAGS+set}" = set || CFLAGS="-g"
+fi
+
+
+ac_aux_dir=
+for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
+ if test -f $ac_dir/install-sh; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install-sh -c"
+ break
+ elif test -f $ac_dir/install.sh; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install.sh -c"
+ break
+ fi
+done
+if test -z "$ac_aux_dir"; then
+ { echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; }
+fi
+ac_config_guess=$ac_aux_dir/config.guess
+ac_config_sub=$ac_aux_dir/config.sub
+ac_configure=$ac_aux_dir/configure # This should be Cygnus configure.
+
+
+# Do some error checking and defaulting for the host and target type.
+# The inputs are:
+# configure --host=HOST --target=TARGET --build=BUILD NONOPT
+#
+# The rules are:
+# 1. You are not allowed to specify --host, --target, and nonopt at the
+# same time.
+# 2. Host defaults to nonopt.
+# 3. If nonopt is not specified, then host defaults to the current host,
+# as determined by config.guess.
+# 4. Target and build default to nonopt.
+# 5. If nonopt is not specified, then target and build default to host.
+
+# The aliases save the names the user supplied, while $host etc.
+# will get canonicalized.
+case $host---$target---$nonopt in
+NONE---*---* | *---NONE---* | *---*---NONE) ;;
+*) { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } ;;
+esac
+
+
+# Make sure we can run config.sub.
+if ${CONFIG_SHELL-/bin/sh} $ac_config_sub sun4 >/dev/null 2>&1; then :
+else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; }
+fi
+
+echo $ac_n "checking host system type""... $ac_c" 1>&6
+echo "configure:721: checking host system type" >&5
+
+host_alias=$host
+case "$host_alias" in
+NONE)
+ case $nonopt in
+ NONE)
+ if host_alias=`${CONFIG_SHELL-/bin/sh} $ac_config_guess`; then :
+ else { echo "configure: error: can not guess host type; you must specify one" 1>&2; exit 1; }
+ fi ;;
+ *) host_alias=$nonopt ;;
+ esac ;;
+esac
+
+host=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $host_alias`
+host_cpu=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+host_vendor=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+echo "$ac_t""$host" 1>&6
+
+echo $ac_n "checking target system type""... $ac_c" 1>&6
+echo "configure:742: checking target system type" >&5
+
+target_alias=$target
+case "$target_alias" in
+NONE)
+ case $nonopt in
+ NONE) target_alias=$host_alias ;;
+ *) target_alias=$nonopt ;;
+ esac ;;
+esac
+
+target=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $target_alias`
+target_cpu=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+target_vendor=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+target_os=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+echo "$ac_t""$target" 1>&6
+
+echo $ac_n "checking build system type""... $ac_c" 1>&6
+echo "configure:760: checking build system type" >&5
+
+build_alias=$build
+case "$build_alias" in
+NONE)
+ case $nonopt in
+ NONE) build_alias=$host_alias ;;
+ *) build_alias=$nonopt ;;
+ esac ;;
+esac
+
+build=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $build_alias`
+build_cpu=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+build_vendor=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+build_os=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+echo "$ac_t""$build" 1>&6
+
+test "$host_alias" != "$target_alias" &&
+ test "$program_prefix$program_suffix$program_transform_name" = \
+ NONENONEs,x,x, &&
+ program_prefix=${target_alias}-
+
+if test "$program_transform_name" = s,x,x,; then
+ program_transform_name=
+else
+ # Double any \ or $. echo might interpret backslashes.
+ cat <<\EOF_SED > conftestsed
+s,\\,\\\\,g; s,\$,$$,g
+EOF_SED
+ program_transform_name="`echo $program_transform_name|sed -f conftestsed`"
+ rm -f conftestsed
+fi
+test "$program_prefix" != NONE &&
+ program_transform_name="s,^,${program_prefix},; $program_transform_name"
+# Use a double $ so make ignores it.
+test "$program_suffix" != NONE &&
+ program_transform_name="s,\$\$,${program_suffix},; $program_transform_name"
+
+# sed with no file args requires a program.
+test "$program_transform_name" = "" && program_transform_name="s,x,x,"
+
+
+if test "x$cross_compiling" = "xyes"; then
+ if test "x$program_transform_name" = "xs,x,x,"; then
+ program_transform_name=""
+ fi
+ if test "x$program_transform_name" = "x"; then
+ program_transform_name="s,^,$host-,"
+ else
+ program_transform_name="$program_transform_name -e s,^,$host-,"
+ fi
+fi
+
+# Find a good install program. We prefer a C program (faster),
+# so one script is as good as another. But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# ./install, which can be erroneously created by make from ./install.sh.
+echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
+echo "configure:825: checking for a BSD compatible install" >&5
+if test -z "$INSTALL"; then
+if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ IFS="${IFS= }"; ac_save_IFS="$IFS"; IFS=":"
+ for ac_dir in $PATH; do
+ # Account for people who put trailing slashes in PATH elements.
+ case "$ac_dir/" in
+ /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;;
+ *)
+ # OSF1 and SCO ODT 3.0 have their own names for install.
+ # Don't use installbsd from OSF since it installs stuff as root
+ # by default.
+ for ac_prog in ginstall scoinst install; do
+ if test -f $ac_dir/$ac_prog; then
+ if test $ac_prog = install &&
+ grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then
+ # AIX install. It has an incompatible calling convention.
+ :
+ else
+ ac_cv_path_install="$ac_dir/$ac_prog -c"
+ break 2
+ fi
+ fi
+ done
+ ;;
+ esac
+ done
+ IFS="$ac_save_IFS"
+
+fi
+ if test "${ac_cv_path_install+set}" = set; then
+ INSTALL="$ac_cv_path_install"
+ else
+ # As a last resort, use the slow shell script. We don't cache a
+ # path for INSTALL within a source directory, because that will
+ # break other packages using the cache if that directory is
+ # removed, or if the path is relative.
+ INSTALL="$ac_install_sh"
+ fi
+fi
+echo "$ac_t""$INSTALL" 1>&6
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+
+echo $ac_n "checking for Cygwin environment""... $ac_c" 1>&6
+echo "configure:879: checking for Cygwin environment" >&5
+if eval "test \"`echo '$''{'am_cv_cygwin'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 884 "configure"
+#include "confdefs.h"
+
+int main() {
+return __CYGWIN32__;
+; return 0; }
+EOF
+if { (eval echo configure:891: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ am_cv_cygwin=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ am_cv_cygwin=no
+fi
+rm -f conftest*
+rm -f conftest*
+fi
+
+echo "$ac_t""$am_cv_cygwin" 1>&6
+CYGWIN=
+test "$am_cv_cygwin" = yes && CYGWIN=yes
+echo $ac_n "checking for Mingw32 environment""... $ac_c" 1>&6
+echo "configure:908: checking for Mingw32 environment" >&5
+if eval "test \"`echo '$''{'am_cv_mingw32'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 913 "configure"
+#include "confdefs.h"
+
+int main() {
+return __MINGW32__;
+; return 0; }
+EOF
+if { (eval echo configure:920: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ am_cv_mingw32=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ am_cv_mingw32=no
+fi
+rm -f conftest*
+rm -f conftest*
+fi
+
+echo "$ac_t""$am_cv_mingw32" 1>&6
+MINGW32=
+test "$am_cv_mingw32" = yes && MINGW32=yes
+
+
+echo $ac_n "checking for executable suffix""... $ac_c" 1>&6
+echo "configure:939: checking for executable suffix" >&5
+if eval "test \"`echo '$''{'am_cv_exeext'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test "$CYGWIN" = yes || test "$MINGW32" = yes; then
+am_cv_exeext=.exe
+else
+cat > am_c_test.c << 'EOF'
+int main() {
+/* Nothing needed here */
+}
+EOF
+${CC-cc} -o am_c_test $CFLAGS $CPPFLAGS $LDFLAGS am_c_test.c $LIBS 1>&5
+am_cv_exeext=
+for file in am_c_test.*; do
+ case $file in
+ *.c) ;;
+ *.o) ;;
+ *) am_cv_exeext=`echo $file | sed -e s/am_c_test//` ;;
+ esac
+done
+rm -f am_c_test*
+fi
+
+test x"${am_cv_exeext}" = x && am_cv_exeext=no
+fi
+EXEEXT=""
+test x"${am_cv_exeext}" != xno && EXEEXT=${am_cv_exeext}
+echo "$ac_t""${am_cv_exeext}" 1>&6
+
+
+trap '' 1 2 15
+cat > confcache <<\EOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs. It is not useful on other systems.
+# If it contains results you don't want to keep, you may remove or edit it.
+#
+# By default, configure uses ./config.cache as the cache file,
+# creating it if it does not exist already. You can give configure
+# the --cache-file=FILE option to use a different cache file; that is
+# what configure does when it calls configure scripts in
+# subdirectories, so they share the cache.
+# Giving --cache-file=/dev/null disables caching, for debugging configure.
+# config.status only pays attention to the cache file if you give it the
+# --recheck option to rerun configure.
+#
+EOF
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, don't put newlines in cache variables' values.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(set) 2>&1 |
+ case `(ac_space=' '; set | grep ac_space) 2>&1` in
+ *ac_space=\ *)
+ # `set' does not quote correctly, so add quotes (double-quote substitution
+ # turns \\\\ into \\, and sed turns \\ into \).
+ sed -n \
+ -e "s/'/'\\\\''/g" \
+ -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p"
+ ;;
+ *)
+ # `set' quotes correctly as required by POSIX, so do not add quotes.
+ sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p'
+ ;;
+ esac >> confcache
+if cmp -s $cache_file confcache; then
+ :
+else
+ if test -w $cache_file; then
+ echo "updating cache $cache_file"
+ cat confcache > $cache_file
+ else
+ echo "not updating unwritable cache $cache_file"
+ fi
+fi
+rm -f confcache
+
+trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# Any assignment to VPATH causes Sun make to only execute
+# the first set of double-colon rules, so remove it if not needed.
+# If there is a colon in the path, we need to keep it.
+if test "x$srcdir" = x.; then
+ ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d'
+fi
+
+trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15
+
+# Transform confdefs.h into DEFS.
+# Protect against shell expansion while executing Makefile rules.
+# Protect against Makefile macro expansion.
+cat > conftest.defs <<\EOF
+s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%-D\1=\2%g
+s%[ `~#$^&*(){}\\|;'"<>?]%\\&%g
+s%\[%\\&%g
+s%\]%\\&%g
+s%\$%$$%g
+EOF
+DEFS=`sed -f conftest.defs confdefs.h | tr '\012' ' '`
+rm -f conftest.defs
+
+
+# Without the "./", some shells look in PATH for config.status.
+: ${CONFIG_STATUS=./config.status}
+
+echo creating $CONFIG_STATUS
+rm -f $CONFIG_STATUS
+cat > $CONFIG_STATUS <<EOF
+#! /bin/sh
+# Generated automatically by configure.
+# Run this file to recreate the current configuration.
+# This directory was configured as follows,
+# on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+#
+# $0 $ac_configure_args
+#
+# Compiler output produced by configure, useful for debugging
+# configure, is in ./config.log if it exists.
+
+ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]"
+for ac_option
+do
+ case "\$ac_option" in
+ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+ echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion"
+ exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;;
+ -version | --version | --versio | --versi | --vers | --ver | --ve | --v)
+ echo "$CONFIG_STATUS generated by autoconf version 2.13"
+ exit 0 ;;
+ -help | --help | --hel | --he | --h)
+ echo "\$ac_cs_usage"; exit 0 ;;
+ *) echo "\$ac_cs_usage"; exit 1 ;;
+ esac
+done
+
+ac_given_srcdir=$srcdir
+ac_given_INSTALL="$INSTALL"
+
+trap 'rm -fr `echo "Makefile" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
+EOF
+cat >> $CONFIG_STATUS <<EOF
+
+# Protect against being on the right side of a sed subst in config.status.
+sed 's/%@/@@/; s/@%/@@/; s/%g\$/@g/; /@g\$/s/[\\\\&%]/\\\\&/g;
+ s/@@/%@/; s/@@/@%/; s/@g\$/%g/' > conftest.subs <<\\CEOF
+$ac_vpsub
+$extrasub
+s%@SHELL@%$SHELL%g
+s%@CFLAGS@%$CFLAGS%g
+s%@CPPFLAGS@%$CPPFLAGS%g
+s%@CXXFLAGS@%$CXXFLAGS%g
+s%@FFLAGS@%$FFLAGS%g
+s%@DEFS@%$DEFS%g
+s%@LDFLAGS@%$LDFLAGS%g
+s%@LIBS@%$LIBS%g
+s%@exec_prefix@%$exec_prefix%g
+s%@prefix@%$prefix%g
+s%@program_transform_name@%$program_transform_name%g
+s%@bindir@%$bindir%g
+s%@sbindir@%$sbindir%g
+s%@libexecdir@%$libexecdir%g
+s%@datadir@%$datadir%g
+s%@sysconfdir@%$sysconfdir%g
+s%@sharedstatedir@%$sharedstatedir%g
+s%@localstatedir@%$localstatedir%g
+s%@libdir@%$libdir%g
+s%@includedir@%$includedir%g
+s%@oldincludedir@%$oldincludedir%g
+s%@infodir@%$infodir%g
+s%@mandir@%$mandir%g
+s%@CC@%$CC%g
+s%@host@%$host%g
+s%@host_alias@%$host_alias%g
+s%@host_cpu@%$host_cpu%g
+s%@host_vendor@%$host_vendor%g
+s%@host_os@%$host_os%g
+s%@target@%$target%g
+s%@target_alias@%$target_alias%g
+s%@target_cpu@%$target_cpu%g
+s%@target_vendor@%$target_vendor%g
+s%@target_os@%$target_os%g
+s%@build@%$build%g
+s%@build_alias@%$build_alias%g
+s%@build_cpu@%$build_cpu%g
+s%@build_vendor@%$build_vendor%g
+s%@build_os@%$build_os%g
+s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g
+s%@INSTALL_SCRIPT@%$INSTALL_SCRIPT%g
+s%@INSTALL_DATA@%$INSTALL_DATA%g
+s%@EXEEXT@%$EXEEXT%g
+
+CEOF
+EOF
+
+cat >> $CONFIG_STATUS <<\EOF
+
+# Split the substitutions into bite-sized pieces for seds with
+# small command number limits, like on Digital OSF/1 and HP-UX.
+ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script.
+ac_file=1 # Number of current file.
+ac_beg=1 # First line for current file.
+ac_end=$ac_max_sed_cmds # Line after last line for current file.
+ac_more_lines=:
+ac_sed_cmds=""
+while $ac_more_lines; do
+ if test $ac_beg -gt 1; then
+ sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file
+ else
+ sed "${ac_end}q" conftest.subs > conftest.s$ac_file
+ fi
+ if test ! -s conftest.s$ac_file; then
+ ac_more_lines=false
+ rm -f conftest.s$ac_file
+ else
+ if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds="sed -f conftest.s$ac_file"
+ else
+ ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file"
+ fi
+ ac_file=`expr $ac_file + 1`
+ ac_beg=$ac_end
+ ac_end=`expr $ac_end + $ac_max_sed_cmds`
+ fi
+done
+if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds=cat
+fi
+EOF
+
+cat >> $CONFIG_STATUS <<EOF
+
+CONFIG_FILES=\${CONFIG_FILES-"Makefile"}
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then
+ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+ case "$ac_file" in
+ *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
+ ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+ *) ac_file_in="${ac_file}.in" ;;
+ esac
+
+ # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories.
+
+ # Remove last slash and all that follows it. Not all systems have dirname.
+ ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
+ if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
+ # The file is in a subdirectory.
+ test ! -d "$ac_dir" && mkdir "$ac_dir"
+ ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`"
+ # A "../" for each directory in $ac_dir_suffix.
+ ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'`
+ else
+ ac_dir_suffix= ac_dots=
+ fi
+
+ case "$ac_given_srcdir" in
+ .) srcdir=.
+ if test -z "$ac_dots"; then top_srcdir=.
+ else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;;
+ /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;;
+ *) # Relative path.
+ srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix"
+ top_srcdir="$ac_dots$ac_given_srcdir" ;;
+ esac
+
+ case "$ac_given_INSTALL" in
+ [/$]*) INSTALL="$ac_given_INSTALL" ;;
+ *) INSTALL="$ac_dots$ac_given_INSTALL" ;;
+ esac
+
+ echo creating "$ac_file"
+ rm -f "$ac_file"
+ configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure."
+ case "$ac_file" in
+ *Makefile*) ac_comsub="1i\\
+# $configure_input" ;;
+ *) ac_comsub= ;;
+ esac
+
+ ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
+ sed -e "$ac_comsub
+s%@configure_input@%$configure_input%g
+s%@srcdir@%$srcdir%g
+s%@top_srcdir@%$top_srcdir%g
+s%@INSTALL@%$INSTALL%g
+" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file
+fi; done
+rm -f conftest.s*
+
+EOF
+cat >> $CONFIG_STATUS <<EOF
+
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+
+exit 0
+EOF
+chmod +x $CONFIG_STATUS
+rm -fr confdefs* $ac_clean_files
+test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1
+
+
diff --git a/winsup/utils/configure.in b/winsup/utils/configure.in
new file mode 100644
index 000000000..a38e00807
--- /dev/null
+++ b/winsup/utils/configure.in
@@ -0,0 +1,75 @@
+dnl Autoconf configure script for Cygwin utilities.
+dnl Copyright 1996, 1997 Cygnus Solutions.
+dnl
+dnl This file is part of Cygwin.
+dnl
+dnl This software is a copyrighted work licensed under the terms of the
+dnl Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+dnl details.
+
+dnl Process this file with autoconf to produce a configure script.
+
+AC_PREREQ(2.12)
+
+AC_INIT(mount.cc)
+
+dnl FIXME: We temporarily define our own version of AC_PROG_CC. This is
+dnl copied from autoconf 2.12, but does not call AC_PROG_CC_WORKS. We
+dnl are probably using a cross compiler, which will not be able to fully
+dnl link an executable. This should really be fixed in autoconf
+dnl itself.
+
+AC_DEFUN(LIB_AC_PROG_CC,
+[AC_BEFORE([$0], [AC_PROG_CPP])dnl
+AC_CHECK_PROG(CC, gcc, gcc)
+if test -z "$CC"; then
+ AC_CHECK_PROG(CC, cc, cc, , , /usr/ucb/cc)
+ test -z "$CC" && AC_MSG_ERROR([no acceptable cc found in \$PATH])
+fi
+
+AC_PROG_CC_GNU
+
+if test $ac_cv_prog_gcc = yes; then
+ GCC=yes
+dnl Check whether -g works, even if CFLAGS is set, in case the package
+dnl plays around with CFLAGS (such as to build both debugging and
+dnl normal versions of a library), tasteless as that idea is.
+ ac_test_CFLAGS="${CFLAGS+set}"
+ ac_save_CFLAGS="$CFLAGS"
+ CFLAGS=
+ AC_PROG_CC_G
+ if test "$ac_test_CFLAGS" = set; then
+ CFLAGS="$ac_save_CFLAGS"
+ elif test $ac_cv_prog_cc_g = yes; then
+ CFLAGS="-g -O2"
+ else
+ CFLAGS="-O2"
+ fi
+else
+ GCC=
+ test "${CFLAGS+set}" = set || CFLAGS="-g"
+fi
+])
+
+LIB_AC_PROG_CC
+
+AC_CANONICAL_SYSTEM
+AC_ARG_PROGRAM
+
+if test "x$cross_compiling" = "xyes"; then
+ if test "x$program_transform_name" = "xs,x,x,"; then
+ program_transform_name=""
+ fi
+ if test "x$program_transform_name" = "x"; then
+ program_transform_name="s,^,$host-,"
+ else
+ program_transform_name="$program_transform_name -e s,^,$host-,"
+ fi
+fi
+
+AC_PROG_INSTALL
+
+AM_EXEEXT
+
+AC_OUTPUT(Makefile)
+
diff --git a/winsup/utils/cygcheck.cc b/winsup/utils/cygcheck.cc
new file mode 100644
index 000000000..59bf00a97
--- /dev/null
+++ b/winsup/utils/cygcheck.cc
@@ -0,0 +1,922 @@
+/* cygcheck.cc
+
+ Copyright 1998 Cygnus Solutions.
+
+ This file is part of Cygwin.
+
+ This software is a copyrighted work licensed under the terms of the
+ Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+ details. */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <windows.h>
+#include <sys/cygwin.h>
+#include <mntent.h>
+#include <time.h>
+
+int verbose = 0;
+int registry = 0;
+int sysinfo = 0;
+int givehelp = 0;
+
+#ifdef __GNUC__
+typedef long long longlong;
+#else
+typedef __int64 longlong;
+#endif
+
+const char *known_env_vars[] =
+{
+ "c_include_path",
+ "compiler_path",
+ "cxx_include_path",
+ "cygwin",
+ "cygwin32",
+ "dejagnu",
+ "expect",
+ "gcc_default_options",
+ "gcc_exec_prefix",
+ "home",
+ "ld_library_path",
+ "library_path",
+ "login",
+ "lpath",
+ "make_mode",
+ "makeflags",
+ "path",
+ "pwd",
+ "strace",
+ "tcl_library",
+ "user",
+ 0
+};
+
+struct {
+ const char *name;
+ int missing_is_good;
+} common_apps[] = {
+ { "bash", 0 },
+ { "cat", 0 },
+ { "cpp", 1 },
+ { "find", 0 },
+ { "gcc", 0 },
+ { "gdb", 0 },
+ { "ld", 0 },
+ { "ls", 0 },
+ { "make", 0 },
+ { "sh", 0 },
+ { 0, 0 }
+};
+
+int num_paths = 0, max_paths = 0;
+char **paths = 0;
+
+void
+add_path (char *s, int maxlen)
+{
+ if (num_paths >= max_paths)
+ {
+ max_paths += 10;
+ if (paths)
+ paths = (char **) realloc (paths, max_paths * sizeof (char *));
+ else
+ paths = (char **) malloc (max_paths * sizeof (char *));
+ }
+ paths[num_paths] = (char *) malloc (maxlen + 1);
+ memcpy (paths[num_paths], s, maxlen);
+ paths[num_paths][maxlen] = 0;
+ char *e = paths[num_paths] + strlen (paths[num_paths]);
+ if (e[-1] == '\\' && e[-2] != ':')
+ *--e = 0;
+ for (int i = 1; i < num_paths; i++)
+ if (strcasecmp (paths[num_paths], paths[i]) == 0)
+ return;
+ num_paths++;
+}
+
+void
+init_paths ()
+{
+ char tmp[4000], *sl;
+ add_path ((char *) ".", 1); /* to be replaced later */
+ add_path ((char *) ".", 1); /* the current directory */
+ GetSystemDirectory (tmp, 4000);
+ add_path (tmp, strlen (tmp));
+ sl = strrchr (tmp, '\\');
+ if (sl)
+ {
+ strcpy (sl, "\\SYSTEM");
+ add_path (tmp, strlen (tmp));
+ }
+ GetWindowsDirectory (tmp, 4000);
+ add_path (tmp, strlen (tmp));
+
+ char *path = getenv ("PATH");
+ if (path)
+ {
+ char wpath[4000];
+ cygwin_posix_to_win32_path_list (path, wpath);
+ char *b, *e, sep = ':';
+ if (strchr (wpath, ';'))
+ sep = ';';
+ b = wpath;
+ while (1)
+ {
+ for (e = b; *e && *e != sep; e++);
+ add_path (b, e - b);
+ if (!*e)
+ break;
+ b = e + 1;
+ }
+ }
+ else
+ printf ("WARNING: PATH is not set at all!\n");
+}
+
+char *
+find_on_path (char *file, char *default_extension,
+ int showall = 0, int search_sysdirs = 0)
+{
+ static char rv[4000];
+ char tmp[4000], *ptr = rv;
+
+ if (strchr (file, ':') || strchr (file, '\\') || strchr (file, '/'))
+ return file;
+
+ if (strchr (file, '.'))
+ default_extension = (char *)"";
+
+ for (int i = 0; i < num_paths; i++)
+ {
+ if (!search_sysdirs && (i == 0 || i == 2 || i == 3))
+ continue;
+ if (i == 0 || !search_sysdirs || strcasecmp (paths[i], paths[0]))
+ {
+ sprintf (ptr, "%s\\%s%s", paths[i], file, default_extension);
+ if (GetFileAttributes (ptr) != (DWORD) -1)
+ {
+ if (showall)
+ printf ("Found: %s\n", ptr);
+ if (ptr == tmp && verbose)
+ printf ("Warning: %s hides %s\n", rv, ptr);
+ ptr = tmp;
+ }
+ }
+ }
+
+ if (ptr == tmp)
+ return rv;
+
+ return 0;
+}
+
+#define DID_NEW 1
+#define DID_ACTIVE 2
+#define DID_INACTIVE 3
+
+struct Did
+{
+ Did *next;
+ char *file;
+ int state;
+};
+Did *did = 0;
+
+Did *
+already_did (char *file)
+{
+ Did *d;
+ for (d = did; d; d = d->next)
+ if (strcasecmp (d->file, file) == 0)
+ return d;
+ d = new Did;
+ d->file = strdup (file);
+ d->next = did;
+ d->state = DID_NEW;
+ did = d;
+ return d;
+}
+
+int
+get_word (HANDLE fh, int offset)
+{
+ short rv;
+ unsigned r;
+ SetFilePointer (fh, offset, 0, FILE_BEGIN);
+ ReadFile (fh, &rv, 2, (DWORD *) &r, 0);
+ return rv;
+}
+
+int
+get_dword (HANDLE fh, int offset)
+{
+ int rv;
+ unsigned r;
+ SetFilePointer (fh, offset, 0, FILE_BEGIN);
+ ReadFile (fh, &rv, 4, (DWORD *) &r, 0);
+ return rv;
+}
+
+struct Section
+{
+ char name[8];
+ int virtual_size;
+ int virtual_address;
+ int size_of_raw_data;
+ int pointer_to_raw_data;
+};
+
+int
+rva_to_offset (int rva, char *sections, int nsections, int *sz)
+{
+ int i;
+ for (i = 0; i < nsections; i++)
+ {
+ Section *s = (Section *) (sections + i * 40);
+#if 0
+ printf ("%08x < %08x < %08x ? %08x\n",
+ s->virtual_address, rva,
+ s->virtual_address + s->virtual_size, s->pointer_to_raw_data);
+#endif
+ if (rva >= s->virtual_address
+ && rva < s->virtual_address + s->virtual_size)
+ {
+ if (sz)
+ *sz = s->virtual_address + s->virtual_size - rva;
+ return rva - s->virtual_address + s->pointer_to_raw_data;
+ }
+ }
+ return 0; /* punt */
+}
+
+struct ExpDirectory
+{
+ int flags;
+ int timestamp;
+ short major_ver;
+ short minor_ver;
+ int name_rva;
+};
+
+struct ImpDirectory
+ {
+ unsigned characteristics;
+ unsigned timestamp;
+ unsigned forwarder_chain;
+ unsigned name_rva;
+ unsigned iat_rva;
+ };
+
+
+void track_down (char *file, char *suffix, int lvl);
+
+void
+dll_info (HANDLE fh, int lvl, int recurse)
+{
+ DWORD junk;
+ int i;
+ int pe_header_offset = get_dword (fh, 0x3c);
+ int opthdr_ofs = pe_header_offset + 4 + 20;
+ unsigned short v[6];
+ SetFilePointer (fh, opthdr_ofs + 40, 0, FILE_BEGIN);
+ ReadFile (fh, &v, sizeof (v), &junk, 0);
+ if (verbose)
+ printf (" - os=%d.%d img=%d.%d sys=%d.%d\n",
+ v[0], v[1], v[2], v[3], v[4], v[5]);
+ else
+ printf ("\n");
+ int num_entries = get_dword (fh, opthdr_ofs + 92);
+ int export_rva = get_dword (fh, opthdr_ofs + 96);
+ int export_size = get_dword (fh, opthdr_ofs + 100);
+ int import_rva = get_dword (fh, opthdr_ofs + 104);
+ int import_size = get_dword (fh, opthdr_ofs + 108);
+
+ int nsections = get_word (fh, pe_header_offset + 4 + 2);
+ char *sections = (char *) malloc (nsections * 40);
+ SetFilePointer (fh, pe_header_offset + 4 + 20 + get_word (fh, pe_header_offset + 4 + 16),
+ 0, FILE_BEGIN);
+ ReadFile (fh, sections, nsections * 40, &junk, 0);
+
+ if (verbose && num_entries >= 1 && export_size > 0)
+ {
+ int expsz;
+ int expbase = rva_to_offset (export_rva, sections, nsections, &expsz);
+ if (expbase)
+ {
+ SetFilePointer (fh, expbase, 0, FILE_BEGIN);
+ unsigned char *exp = (unsigned char *) malloc (expsz);
+ ReadFile (fh, exp, expsz, &junk, 0);
+ ExpDirectory *ed = (ExpDirectory *) exp;
+ int ofs = ed->name_rva - export_rva;
+ struct tm *tm = localtime ((const time_t *) &(ed->timestamp));
+ if (tm->tm_year < 60)
+ tm->tm_year += 2000;
+ if (tm->tm_year < 200)
+ tm->tm_year += 1900;
+ printf ("%*c", lvl + 2, ' ');
+ printf ("\"%s\" v%d.%d ts=", exp + ofs,
+ ed->major_ver, ed->minor_ver);
+ printf ("%d/%d/%d %d:%02d\n",
+ tm->tm_year, tm->tm_mon + 1, tm->tm_mday,
+ tm->tm_hour, tm->tm_min);
+ }
+ }
+
+ if (num_entries >= 2 && import_size > 0 && recurse)
+ {
+ int impsz;
+ int impbase = rva_to_offset (import_rva, sections, nsections, &impsz);
+ if (impbase)
+ {
+ SetFilePointer (fh, impbase, 0, FILE_BEGIN);
+ unsigned char *imp = (unsigned char *) malloc (impsz);
+ ReadFile (fh, imp, impsz, &junk, 0);
+ ImpDirectory *id = (ImpDirectory *) imp;
+ for (i = 0; id[i].name_rva; i++)
+ {
+ /* int ofs = id[i].name_rva - import_rva; */
+ track_down ((char *) imp + id[i].name_rva - import_rva,
+ (char *) ".dll", lvl + 2);
+ }
+ }
+ }
+}
+
+void
+track_down (char *file, char *suffix, int lvl)
+{
+ char *path = find_on_path (file, suffix, 0, 1);
+ if (!path)
+ {
+ printf ("Error: could not find %s\n", file);
+ return;
+ }
+
+ Did *d = already_did (file);
+ switch (d->state)
+ {
+ case DID_NEW:
+ break;
+ case DID_ACTIVE:
+ if (verbose)
+ {
+ if (lvl)
+ printf ("%*c", lvl, ' ');
+ printf ("%s", path);
+ printf (" (recursive)\n");
+ }
+ return;
+ case DID_INACTIVE:
+ if (verbose)
+ {
+ if (lvl)
+ printf ("%*c", lvl, ' ');
+ printf ("%s", path);
+ printf (" (already done)\n");
+ }
+ return;
+ }
+
+ if (lvl)
+ printf ("%*c", lvl, ' ');
+
+ if (!path)
+ {
+ printf ("%s not found\n", file);
+ return;
+ }
+
+ printf ("%s", path);
+
+ HANDLE fh = CreateFile (path, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE,
+ NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
+ if (fh == INVALID_HANDLE_VALUE)
+ {
+ printf (" - Cannot open\n");
+ return;
+ }
+
+ d->state = DID_ACTIVE;
+
+ dll_info (fh, lvl, 1);
+ d->state = DID_INACTIVE;
+ CloseHandle (fh);
+}
+
+void
+ls (char *f)
+{
+ HANDLE h = CreateFile (f, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE,
+ 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
+ BY_HANDLE_FILE_INFORMATION info;
+ GetFileInformationByHandle (h, &info);
+ SYSTEMTIME systime;
+ FileTimeToSystemTime (&info.ftLastWriteTime, &systime);
+ printf ("%5dk %04d/%02d/%02d %s",
+ (((int) info.nFileSizeLow) + 512) / 1024,
+ systime.wYear, systime.wMonth, systime.wDay,
+ f);
+ dll_info (h, 16, 0);
+ CloseHandle (h);
+
+}
+
+void
+cygcheck (char *app)
+{
+ char *papp = find_on_path (app, (char *) ".exe", 1, 0);
+ if (!papp)
+ {
+ printf ("Error: could not find %s\n", app);
+ return;
+ }
+ char *s = strdup (papp);
+ char *sl = 0, *t;
+ for (t = s; *t; t++)
+ if (*t == '/' || *t == '\\' || *t == ':')
+ sl = t;
+ if (sl == 0)
+ paths[0] = (char *) ".";
+ else
+ {
+ *sl = 0;
+ paths[0] = s;
+ }
+ did = 0;
+ track_down (papp, (char *) ".exe", 0);
+}
+
+
+extern char **environ;
+
+struct RegInfo
+ {
+ RegInfo *prev;
+ char *name;
+ HKEY key;
+ };
+
+void
+show_reg (RegInfo * ri, int nest)
+{
+ if (!ri)
+ return;
+ show_reg (ri->prev, 1);
+ if (nest)
+ printf ("%s\\", ri->name);
+ else
+ printf ("%s\n", ri->name);
+}
+
+void
+scan_registry (RegInfo * prev, HKEY hKey, char *name, int cygnus)
+{
+ RegInfo ri;
+ ri.prev = prev;
+ ri.name = name;
+ ri.key = hKey;
+
+ char *cp;
+ for (cp = name; *cp; cp++)
+ if (strncasecmp (cp, "cygnus", 6) == 0)
+ cygnus = 1;
+
+ DWORD num_subkeys, max_subkey_len, num_values;
+ DWORD max_value_len, max_valdata_len, i;
+ if (RegQueryInfoKey (hKey, 0, 0, 0, &num_subkeys, &max_subkey_len, 0,
+ &num_values, &max_value_len, &max_valdata_len, 0, 0)
+ != ERROR_SUCCESS)
+ {
+#if 0
+ char tmp[400];
+ FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM, 0, GetLastError (),
+ MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT), tmp,
+ 400, 0);
+ printf ("RegQueryInfoKey: %s\n", tmp);
+#endif
+ return;
+ }
+
+ if (cygnus)
+ {
+ show_reg (&ri, 0);
+ char *value_name = (char *) malloc (max_value_len + 1);
+ char *value_data = (char *) malloc (max_valdata_len + 1);
+
+ for (i = 0; i < num_values; i++)
+ {
+ DWORD dlen = max_valdata_len + 1;
+ DWORD nlen = max_value_len + 1;
+ DWORD type;
+ RegEnumValue (hKey, i, value_name, &nlen, 0,
+ &type, (BYTE *) value_data, &dlen);
+ {
+ printf (" %s = ", i ? value_name : "(default)");
+ switch (type)
+ {
+ case REG_DWORD:
+ printf ("0x%08x\n", *(unsigned *) value_data);
+ break;
+ case REG_EXPAND_SZ:
+ case REG_SZ:
+ printf ("`%s'\n", value_data);
+ break;
+ default:
+ printf ("(unsupported type)\n");
+ break;
+ }
+ }
+#if 0
+ else
+ {
+ char tmp[400];
+ FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM, 0, GetLastError (),
+ MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT), tmp,
+ 400, 0);
+ printf ("RegEnumValue: %s\n", tmp);
+ }
+#endif
+ }
+ free (value_name);
+ free (value_data);
+ }
+
+ char *subkey_name = (char *) malloc (max_subkey_len + 1);
+ for (i = 0; i < num_subkeys; i++)
+ {
+ if (RegEnumKey (hKey, i, subkey_name, max_subkey_len + 1) == ERROR_SUCCESS)
+ {
+ HKEY sKey;
+ if (RegOpenKeyEx (hKey, subkey_name, 0, KEY_ALL_ACCESS, &sKey)
+ == ERROR_SUCCESS)
+ {
+ scan_registry (&ri, sKey, subkey_name, cygnus);
+ RegCloseKey (sKey);
+ }
+ }
+ }
+ free (subkey_name);
+}
+
+void
+dump_sysinfo ()
+{
+ int i, j;
+ char tmp[4000];
+ time_t now;
+
+ printf ("\nCygnus Win95/NT Configuration Diagnostics\n");
+ time (&now);
+ printf ("Current System Time: %s\n", ctime (&now));
+
+ OSVERSIONINFO osversion;
+ osversion.dwOSVersionInfoSize = sizeof (osversion);
+ GetVersionEx (&osversion);
+ char *osname = (char *) "unknown OS";
+ switch (osversion.dwPlatformId)
+ {
+ case VER_PLATFORM_WIN32s:
+ osname = (char *) "win32s";
+ break;
+ case VER_PLATFORM_WIN32_WINDOWS:
+ switch (osversion.dwMinorVersion)
+ {
+ case 0:
+ osname = (char *) "Win95";
+ break;
+ case 1:
+ osname = (char *) "Win98";
+ break;
+ default:
+ osname = (char *) "Win9X";
+ break;
+ }
+ break;
+ case VER_PLATFORM_WIN32_NT:
+ osname = (char *) "WinNT";
+ break;
+ default:
+ osname = (char *) "uknown-os";
+ break;
+ }
+ printf ("%s Ver %d.%d build %d %s\n\n", osname,
+ (int) osversion.dwMajorVersion, (int) osversion.dwMinorVersion,
+ (int) osversion.dwBuildNumber, osversion.szCSDVersion);
+
+ printf ("Path:");
+ char *s = getenv ("PATH"), *e;
+ char sep = strchr (s, ';') ? ';' : ':';
+ int count_path_items = 0;
+ while (1)
+ {
+ for (e = s; *e && *e != sep; e++);
+ printf ("\t%.*s\n", e - s, s);
+ count_path_items++;
+ if (!*e)
+ break;
+ s = e + 1;
+ }
+
+ GetSystemDirectory (tmp, 4000);
+ printf ("\nSysDir: %s\n", tmp);
+ GetWindowsDirectory (tmp, 4000);
+ printf ("WinDir: %s\n\n", tmp);
+
+
+ if (givehelp)
+ printf ("Here's some environment variables that may affect cygwin:\n");
+ for (i = 0; environ[i]; i++)
+ {
+ char *eq = strchr (environ[i], '=');
+ if (!eq)
+ continue;
+ /* int len = eq - environ[i]; */
+ for (j = 0; known_env_vars[j]; j++)
+ {
+ *eq = 0;
+ if (strcmp (environ[i], "PATH") == 0)
+ continue; /* we handle this one specially */
+ if (strcasecmp (environ[i], known_env_vars[j]) == 0)
+ printf ("%s = `%s'\n", environ[i], eq + 1);
+ *eq = '=';
+ }
+ }
+ printf ("\n");
+
+ if (verbose)
+ {
+ if (givehelp)
+ printf ("Here's the rest of your environment variables:\n");
+ for (i = 0; environ[i]; i++)
+ {
+ int found = 0;
+ char *eq = strchr (environ[i], '=');
+ if (!eq)
+ continue;
+ /* int len = eq - environ[i]; */
+ for (j = 0; known_env_vars[j]; j++)
+ {
+ *eq = 0;
+ if (strcasecmp (environ[i], known_env_vars[j]) == 0)
+ found = 1;
+ *eq = '=';
+ }
+ if (!found)
+ {
+ *eq = 0;
+ printf ("%s = `%s'\n", environ[i], eq + 1);
+ *eq = '=';
+ }
+ }
+ printf ("\n");
+ }
+
+ if (registry)
+ {
+ if (givehelp)
+ printf ("Scanning registry for keys with `Cygnus' in them...\n");
+#if 0
+ /* big and not generally useful */
+ scan_registry (0, HKEY_CLASSES_ROOT, (char *) "HKEY_CLASSES_ROOT", 0);
+#endif
+ scan_registry (0, HKEY_CURRENT_CONFIG,
+ (char *) "HKEY_CURRENT_CONFIG", 0);
+ scan_registry (0, HKEY_CURRENT_USER, (char *) "HKEY_CURRENT_USER", 0);
+ scan_registry (0, HKEY_LOCAL_MACHINE, (char *) "HKEY_LOCAL_MACHINE", 0);
+#if 0
+ /* the parts we need are duplicated in HKEY_CURRENT_USER anyway */
+ scan_registry (0, HKEY_USERS, (char *) "HKEY_USERS", 0);
+#endif
+ printf ("\n");
+ }
+ else
+ printf ("Use `-r' to scan registry\n\n");
+
+ if (givehelp)
+ {
+ printf ("Listing available drives...\n");
+ printf ("Drv Type Size Free Flags Name\n");
+ }
+ int prev_mode = SetErrorMode (SEM_FAILCRITICALERRORS | SEM_NOOPENFILEERRORBOX);
+ int drivemask = GetLogicalDrives ();
+
+ HINSTANCE k32 = LoadLibrary ("kernel32.dll");
+ BOOL (WINAPI *gdfse) (LPCSTR, long long *, long long *, long long *) =
+ (BOOL (WINAPI *) (LPCSTR, long long *, long long *, long long *))
+ GetProcAddress (k32, "GetDiskFreeSpaceExA");
+
+ for (i = 0; i < 26; i++)
+ {
+ if (!(drivemask & (1 << i)))
+ continue;
+ char drive[4], name[200], fsname[200];
+ DWORD serno = 0, maxnamelen = 0, flags = 0;
+ name[0] = name[0] = fsname[0] = 0;
+ sprintf (drive, "%c:\\", i + 'a');
+ GetVolumeInformation (drive, name, sizeof (name), &serno, &maxnamelen,
+ &flags, fsname, sizeof (fsname));
+
+ int dtype = GetDriveType (drive);
+ char drive_type[4] = "unk";
+ switch (dtype)
+ {
+ case DRIVE_REMOVABLE:
+ strcpy (drive_type, "fd ");
+ break;
+ case DRIVE_FIXED:
+ strcpy (drive_type, "hd ");
+ break;
+ case DRIVE_REMOTE:
+ strcpy (drive_type, "net");
+ break;
+ case DRIVE_CDROM:
+ strcpy (drive_type, "cd ");
+ break;
+ case DRIVE_RAMDISK:
+ strcpy (drive_type, "ram");
+ break;
+ }
+
+ long capacity_mb = -1;
+ int percent_full = -1;
+
+ long long free_me = 0ULL, free_bytes = 0ULL, total_bytes = 1ULL;
+ if (gdfse != NULL
+ && gdfse (drive, & free_me, & total_bytes, & free_bytes))
+ {
+ capacity_mb = total_bytes / (1024L * 1024L);
+ percent_full = 100 - (int) ((100.0 * free_me) / total_bytes);
+ }
+ else
+ {
+ DWORD spc = 0, bps = 0, fc = 0, tc = 1;
+ if (GetDiskFreeSpace (drive, &spc, &bps, &fc, &tc))
+ {
+ capacity_mb = (spc * bps * tc) / (1024 * 1024);
+ percent_full = 100 - (int) ((100.0 * fc) / tc);
+ }
+ }
+
+ printf ("%.2s %s %-6s ", drive, drive_type, fsname);
+ if (capacity_mb >= 0)
+ printf ("%5dMb %3d%% ", (int) capacity_mb, (int) percent_full);
+ else
+ printf (" N/A N/A ");
+ printf ("%s %s %s %s %s %s %s\n",
+ flags & FS_CASE_IS_PRESERVED ? "CP" : " ",
+ flags & FS_CASE_SENSITIVE ? "CS" : " ",
+ flags & FS_UNICODE_STORED_ON_DISK ? "UN" : " ",
+ flags & FS_PERSISTENT_ACLS ? "PA" : " ",
+ flags & FS_FILE_COMPRESSION ? "FC" : " ",
+ flags & FS_VOL_IS_COMPRESSED ? "VC" : " ",
+#if 0
+ flags & FILE_SUPPORTS_ENCRYPTION ? "EN" : " ",
+ flags & FILE_SUPPORTS_OBJECT_IDS ? "OI" : " ",
+ flags & FILE_SUPPORTS_REPARSE_POINTS ? "RP" : " ",
+ flags & FILE_SUPPORTS_SPARSE_FILES ? "SP" : " ",
+ flags & FILE_VOLUME_QUOTAS ? "QU" : " ",
+#endif
+ name);
+ }
+
+ FreeLibrary (k32);
+ SetErrorMode (prev_mode);
+ if (givehelp)
+ {
+ printf ("fd=floppy, hd=hard drive, cd=CD-ROM, net=Network Share\n");
+ printf ("CP=Case Preserving, CS=Case Sensitive, UN=Unicode\n");
+ printf ("PA=Persistent ACLS, FC=File Compression, VC=Volume Compression\n");
+ }
+ printf ("\n");
+
+ unsigned int ml_fsname = 4, ml_dir = 7, ml_type = 6;
+
+ if (givehelp)
+ {
+ printf ("Mount entries: these map POSIX directories to your NT drives.\n");
+ printf ("%-*s %-*s %-*s %s\n",
+ ml_fsname, "-NT-",
+ ml_dir, "-POSIX-",
+ ml_type, "-Type-", "-Flags-");
+ }
+
+ struct mntent *mnt;
+ setmntent (0, 0);
+
+ while ((mnt = getmntent (0)))
+ {
+ printf ("%-*s %-*s %-*s %s\n",
+ ml_fsname, mnt->mnt_fsname,
+ ml_dir, mnt->mnt_dir,
+ ml_type, mnt->mnt_type,
+ mnt->mnt_opts);
+ }
+ printf ("\n");
+
+ add_path ((char *) "\\bin", 4); /* just in case */
+
+ if (givehelp)
+ printf ("Looking to see where common programs can be found, if at all...\n");
+ for (i = 0; common_apps[i].name; i++)
+ if (!find_on_path ((char *) common_apps[i].name, (char *) ".exe", 1, 0))
+ {
+ if (common_apps[i].missing_is_good)
+ printf ("Not Found: %s (good!)\n", common_apps[i].name);
+ else
+ printf ("Not Found: %s\n", common_apps[i].name);
+ }
+ printf ("\n");
+
+ if (givehelp)
+ printf ("Looking for various Cygnus DLLs... (-v gives version info)\n");
+ for (i = 0; i < num_paths; i++)
+ {
+ WIN32_FIND_DATA ffinfo;
+ sprintf (tmp, "%s/*.*", paths[i]);
+ HANDLE ff = FindFirstFile (tmp, &ffinfo);
+ int found = (ff != INVALID_HANDLE_VALUE);
+ while (found)
+ {
+ char *f = ffinfo.cFileName;
+ if (strcasecmp (f + strlen (f) - 4, ".dll") == 0)
+ {
+ if (strncasecmp (f, "cyg", 3) == 0)
+ {
+ sprintf (tmp, "%s\\%s", paths[i], f);
+ ls (tmp);
+ }
+ }
+ found = FindNextFile (ff, &ffinfo);
+ }
+ FindClose (ff);
+ }
+}
+
+void
+usage ()
+{
+ fprintf (stderr, "Usage: cygcheck [-s] [-v] [-r] [-h] [program ...]\n");
+ fprintf (stderr, " -s = system information\n");
+ fprintf (stderr, " -v = verbose output (indented) (for -s or programs)\n");
+ fprintf (stderr, " -r = registry search (requires -s)\n");
+ fprintf (stderr, " -h = give help about the info\n");
+ fprintf (stderr, "You must at least give either -s or a program name\n");
+ exit (1);
+}
+
+int
+main (int argc, char **argv)
+{
+ int i;
+ while (argc > 1 && argv[1][0] == '-')
+ {
+ if (strcmp (argv[1], "-v") == 0)
+ verbose = 1;
+ if (strcmp (argv[1], "-r") == 0)
+ registry = 1;
+ if (strcmp (argv[1], "-s") == 0)
+ sysinfo = 1;
+ if (strcmp (argv[1], "-h") == 0)
+ givehelp = 1;
+ argc--;
+ argv++;
+ }
+
+ if (argc == 1 && !sysinfo)
+ usage ();
+
+ init_paths ();
+
+ if (argc > 1 && givehelp)
+ {
+ if (argc == 2)
+ {
+ printf ("Here is where the OS will find your program, and which dlls\n");
+ printf ("will be used for it. Use -v to see DLL version info\n");
+ }
+ else
+ {
+ printf ("Here is where the OS will find your programs, and which dlls\n");
+ printf ("will be used for them. Use -v to see DLL version info\n");
+ }
+
+ if (!sysinfo)
+ printf ("\n");
+ }
+
+ for (i = 1; i < argc; i++)
+ {
+ cygcheck (argv[i]);
+ printf ("\n");
+ }
+
+ if (sysinfo)
+ dump_sysinfo ();
+
+ if (!givehelp)
+ printf ("Use -h to see help about each section\n");
+
+ return 0;
+}
diff --git a/winsup/utils/cygpath.cc b/winsup/utils/cygpath.cc
new file mode 100644
index 000000000..653d41cec
--- /dev/null
+++ b/winsup/utils/cygpath.cc
@@ -0,0 +1,154 @@
+/* pathconv.cc -- convert pathnames between Windows and Unix format
+ Copyright 1998 Cygnus Solutions.
+ Written by Ian Lance Taylor <ian@cygnus.com>.
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <limits.h>
+#include <getopt.h>
+#include <sys/cygwin.h>
+
+static char *prog_name;
+
+static struct option long_options[] =
+{
+ { (char *) "help", no_argument, NULL, 'h' },
+ { (char *) "path", no_argument, NULL, 'p' },
+ { (char *) "unix", no_argument, NULL, 'u' },
+ { (char *) "version", no_argument, NULL, 'v' },
+ { (char *) "windows", no_argument, NULL, 'w' },
+ { 0, no_argument, 0, 0 }
+};
+
+static void
+usage (FILE *stream, int status)
+{
+ fprintf (stream, "\
+Usage: %s [-p|--path] (-u|--unix)|(-w|--windows) filename\n\
+ -u|--unix print Unix form of filename\n\
+ -w|--windows print Windows form of filename\n\
+ -p|--path filename argument is a path\n",
+ prog_name);
+ exit (status);
+}
+
+int
+main (int argc, char **argv)
+{
+ int path_flag, unix_flag, windows_flag;
+ int c;
+ char *filename;
+ size_t len;
+ char *buf;
+
+ prog_name = strrchr (argv[0], '/');
+ if (prog_name == NULL)
+ prog_name = strrchr (argv[0], '\\');
+ if (prog_name == NULL)
+ prog_name = argv[0];
+
+ path_flag = 0;
+ unix_flag = 0;
+ windows_flag = 0;
+ while ((c = getopt_long (argc, argv, (char *) "hpuvw", long_options, (int *) NULL))
+ != EOF)
+ {
+ switch (c)
+ {
+ case 'p':
+ path_flag = 1;
+ break;
+
+ case 'u':
+ if (unix_flag || windows_flag)
+ usage (stderr, 1);
+ unix_flag = 1;
+ break;
+
+ case 'w':
+ if (unix_flag || windows_flag)
+ usage (stderr, 1);
+ windows_flag = 1;
+ break;
+
+ case 'h':
+ usage (stdout, 0);
+ break;
+
+ case 'v':
+ printf ("Cygwin pathconv version 1.0\n");
+ printf ("Copyright 1998 Cygnus Solutions\n");
+ exit (0);
+
+ default:
+ usage (stderr, 1);
+ break;
+ }
+ }
+
+ if (optind != argc - 1)
+ usage (stderr, 1);
+
+ if (! unix_flag && ! windows_flag)
+ usage (stderr, 1);
+
+ filename = argv[optind];
+
+ if (path_flag)
+ {
+ if (cygwin_posix_path_list_p (filename)
+ ? unix_flag
+ : windows_flag)
+ {
+ /* The path is already in the right format. */
+ puts (filename);
+ exit (0);
+ }
+ }
+
+ if (! path_flag)
+ len = strlen (filename) + 100;
+ else
+ {
+ if (unix_flag)
+ len = cygwin_win32_to_posix_path_list_buf_size (filename);
+ else
+ len = cygwin_posix_to_win32_path_list_buf_size (filename);
+ }
+
+ if (len < PATH_MAX)
+ len = PATH_MAX;
+
+ buf = (char *) malloc (len);
+ if (buf == NULL)
+ {
+ fprintf (stderr, "%s: out of memory\n", prog_name);
+ exit (1);
+ }
+
+ if (path_flag)
+ {
+ if (unix_flag)
+ cygwin_win32_to_posix_path_list (filename, buf);
+ else
+ cygwin_posix_to_win32_path_list (filename, buf);
+ }
+ else
+ {
+ if (unix_flag)
+ cygwin_conv_to_posix_path (filename, buf);
+ else
+ cygwin_conv_to_win32_path (filename, buf);
+ }
+
+ puts (buf);
+
+ exit (0);
+}
diff --git a/winsup/utils/getfacl.c b/winsup/utils/getfacl.c
new file mode 100644
index 000000000..9bf7122db
--- /dev/null
+++ b/winsup/utils/getfacl.c
@@ -0,0 +1,124 @@
+
+#include <pwd.h>
+#include <grp.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <getopt.h>
+#include <sys/types.h>
+#include <sys/acl.h>
+#include <sys/stat.h>
+
+char *permstr (mode_t perm)
+{
+ static char pbuf[4];
+
+ pbuf[0] = (perm & S_IREAD) ? 'r' : '-';
+ pbuf[1] = (perm & S_IWRITE) ? 'w' : '-';
+ pbuf[2] = (perm & S_IEXEC) ? 'x' : '-';
+ pbuf[3] = '\0';
+ return pbuf;
+}
+
+#if 0
+char *username (uid_t uid)
+{
+ static char ubuf[256];
+ struct passwd *pw;
+
+ if (pw = getpwuid (uid))
+ strcpy (ubuf, pw->pw_name);
+ else
+ strcpy (ubuf, "<unknown>");
+}
+
+char *groupname (gid_t gid)
+{
+ static char gbuf[256];
+ struct group *gr;
+
+ if (gr = getgruid (gid))
+ strcpy (gbuf, gr->gr_name);
+ else
+ strcpy (gbuf, "<unknown>");
+}
+#endif
+
+int
+main (int argc, char **argv)
+{
+ extern int optind;
+ int c, i;
+ int aopt = 0;
+ int dopt = 0;
+ int first = 1;
+ struct stat st;
+ aclent_t acls[MAX_ACL_ENTRIES];
+
+ while ((c = getopt (argc, argv, "ad")) != EOF)
+ switch (c)
+ {
+ case 'a':
+ aopt = 1;
+ break;
+ case 'd':
+ dopt = 1;
+ break;
+ default:
+ fprintf (stderr, "usage: %s [-ad] file...\n", argv[0]);
+ return 1;
+ }
+ while ((c = optind++) < argc)
+ {
+ if (stat (argv[c], &st))
+ {
+ perror (argv[0]);
+ continue;
+ }
+ if (! first)
+ putchar ('\n');
+ first = 0;
+ printf ("# file: %s\n", argv[c]);
+ printf ("# owner: %d\n", st.st_uid);
+ printf ("# group: %d\n", st.st_gid);
+ if ((c = acl (argv[c], GETACL, MAX_ACL_ENTRIES, acls)) < 0)
+ {
+ perror (argv[0]);
+ continue;
+ }
+ for (i = 0; i < c; ++i)
+ {
+ if (acls[i].a_type & ACL_DEFAULT)
+ {
+ if (aopt)
+ continue;
+ printf ("default:");
+ }
+ else if (dopt)
+ continue;
+ switch (acls[i].a_type & ~ACL_DEFAULT)
+ {
+ case USER_OBJ:
+ printf ("user::");
+ break;
+ case USER:
+ printf ("user:%d:", acls[i].a_id);
+ break;
+ case GROUP_OBJ:
+ printf ("group::");
+ break;
+ case GROUP:
+ printf ("group:%d:", acls[i].a_id);
+ break;
+ case CLASS_OBJ:
+ printf ("mask::");
+ break;
+ case OTHER_OBJ:
+ printf ("other::");
+ break;
+ }
+ printf ("%s\n", permstr (acls[i].a_perm));
+ }
+ }
+ return 0;
+}
+
diff --git a/winsup/utils/kill.cc b/winsup/utils/kill.cc
new file mode 100644
index 000000000..611887896
--- /dev/null
+++ b/winsup/utils/kill.cc
@@ -0,0 +1,85 @@
+/* kill.cc
+
+ Copyright 1996, 1997, 1998 Cygnus Solutions.
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <signal.h>
+#include <string.h>
+#include <time.h>
+
+static void usage (void);
+static int getsig (char *);
+int a = _timezone;
+
+int
+main (int ac, char **av)
+{
+ int sig = SIGTERM;
+
+ if (ac == 1)
+ usage ();
+
+ if (*(++av)[0] == '-')
+ if (strcmp(*av + 1, "0") != 0)
+ sig = getsig (*av++ + 1);
+ else
+ {
+ av++;
+ sig = 0;
+ goto sig0;
+ }
+
+ if (sig <= 0 || sig > NSIG)
+ {
+ fprintf (stderr, "kill: unknown signal: %s\n", av[-1]);
+ exit (1);
+ }
+
+sig0:
+ while (*av != NULL)
+ {
+ char *p;
+ int pid = strtol (*av, &p, 10);
+ if (*p != '\0')
+ fprintf (stderr, "kill: illegal pid: %s\n", *av);
+ else
+ {
+ printf ("Sending %s(%d) signal to pid %d\n",
+ strsignal (sig), sig, pid);
+ if (kill (pid, sig))
+ perror ("kill");
+ }
+ av++;
+ }
+ return 0;
+}
+
+static void
+usage (void)
+{
+ fprintf (stderr, "Usage: kill [-sigN] pid1 [pid2 ...]\n");
+ exit (1);
+}
+
+static int
+getsig (char *in_sig)
+{
+ char *sig;
+ char buf[80];
+
+ if (strncmp (in_sig, "SIG", 3) == 0)
+ sig = in_sig;
+ else
+ {
+ sprintf (buf, "SIG%s", in_sig);
+ sig = buf;
+ }
+ return (strtosigno (sig) ?: atoi (in_sig));
+}
diff --git a/winsup/utils/mkgroup.c b/winsup/utils/mkgroup.c
new file mode 100644
index 000000000..0c322bbc6
--- /dev/null
+++ b/winsup/utils/mkgroup.c
@@ -0,0 +1,410 @@
+/* mkgroup.c:
+
+ Copyright 1997, 1998 Cygnus Solutions.
+
+ This file is part of Cygwin.
+
+ This software is a copyrighted work licensed under the terms of the
+ Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+ details. */
+
+#include <ctype.h>
+#include <stdlib.h>
+#include <wchar.h>
+#include <stdio.h>
+#include <sys/cygwin.h>
+#include <windows.h>
+#include <lmaccess.h>
+#include <lmapibuf.h>
+
+SID_IDENTIFIER_AUTHORITY sid_world_auth = {SECURITY_WORLD_SID_AUTHORITY};
+SID_IDENTIFIER_AUTHORITY sid_nt_auth = {SECURITY_NT_AUTHORITY};
+
+#ifndef min
+#define min(a,b) (((a)<(b))?(a):(b))
+#endif
+
+char *
+put_sid (PSID sid)
+{
+ static char s[512];
+ char t[32];
+ DWORD i;
+
+ strcpy (s, "S-1-");
+ sprintf(t, "%u", GetSidIdentifierAuthority (sid)->Value[5]);
+ strcat (s, t);
+ for (i = 0; i < *GetSidSubAuthorityCount (sid); ++i)
+ {
+ sprintf(t, "-%lu", *GetSidSubAuthority (sid, i));
+ strcat (s, t);
+ }
+ return s;
+}
+
+void
+psx_dir (char *in, char *out)
+{
+ if (isalpha (in[0]) && in[1] == ':')
+ {
+ sprintf (out, "/cygdrive/%c", in[0]);
+ in += 2;
+ out += strlen (out);
+ }
+
+ while (*in)
+ {
+ if (*in == '\\')
+ *out = '/';
+ else
+ *out = *in;
+ in++;
+ out++;
+ }
+
+ *out = '\0';
+}
+
+void
+uni2ansi (LPWSTR wcs, char *mbs)
+{
+ if (wcs)
+ wcstombs (mbs, wcs, (wcslen (wcs) + 1) * sizeof (WCHAR));
+
+ else
+ *mbs = '\0';
+}
+
+int
+enum_local_groups (int print_sids)
+{
+ LOCALGROUP_INFO_0 *buffer;
+ DWORD entriesread = 0;
+ DWORD totalentries = 0;
+ DWORD resume_handle = 0;
+
+ do
+ {
+ DWORD i;
+ DWORD rc = NetLocalGroupEnum (NULL, 0, (LPBYTE *) & buffer, 1024,
+ &entriesread, &totalentries, &resume_handle);
+
+ switch (rc)
+ {
+ case ERROR_ACCESS_DENIED:
+ fprintf (stderr, "Access denied\n");
+ exit (1);
+
+ case ERROR_MORE_DATA:
+ case ERROR_SUCCESS:
+ break;
+
+ default:
+ fprintf (stderr, "NetUserEnum() failed with %ld\n", rc);
+ exit (1);
+ }
+
+ for (i = 0; i < entriesread; i++)
+ {
+ char localgroup_name[100];
+ char domain_name[100];
+ DWORD domname_len = 100;
+ char psid_buffer[1024];
+ PSID psid = (PSID) psid_buffer;
+ DWORD sid_length = 1024;
+ DWORD gid;
+ SID_NAME_USE acc_type;
+ uni2ansi (buffer[i].lgrpi0_name, localgroup_name);
+
+ if (!LookupAccountName (NULL, localgroup_name, psid,
+ &sid_length, domain_name, &domname_len,
+ &acc_type))
+ {
+ fprintf (stderr, "LookupAccountName(%s) failed with %ld\n",
+ localgroup_name, GetLastError ());
+ continue;
+ }
+ else if (acc_type == SidTypeDomain)
+ {
+ char domname[356];
+
+ strcpy (domname, domain_name);
+ strcat (domname, "\\");
+ strcat (domname, localgroup_name);
+ sid_length = 1024;
+ domname_len = 100;
+ if (!LookupAccountName (NULL, domname,
+ psid, &sid_length,
+ domain_name, &domname_len,
+ &acc_type))
+ {
+ fprintf (stderr,
+ "LookupAccountName(%s) failed with error %ld\n",
+ localgroup_name, GetLastError ());
+ continue;
+ }
+ }
+
+ gid = *GetSidSubAuthority (psid, *GetSidSubAuthorityCount(psid) - 1);
+
+ printf ("%s:%s:%ld:\n", localgroup_name,
+ print_sids ? put_sid (psid) : "",
+ gid);
+ }
+
+ NetApiBufferFree (buffer);
+
+ }
+ while (entriesread < totalentries);
+
+ return 0;
+}
+
+void
+enum_groups (LPWSTR servername, int print_sids)
+{
+ GROUP_INFO_2 *buffer;
+ DWORD entriesread = 0;
+ DWORD totalentries = 0;
+ DWORD resume_handle = 0;
+ char ansi_srvname[256];
+
+ if (servername)
+ uni2ansi (servername, ansi_srvname);
+
+ do
+ {
+ DWORD i;
+ DWORD rc = NetGroupEnum (servername, 2, (LPBYTE *) & buffer, 1024,
+ &entriesread, &totalentries, &resume_handle);
+
+ switch (rc)
+ {
+ case ERROR_ACCESS_DENIED:
+ fprintf (stderr, "Access denied\n");
+ exit (1);
+
+ case ERROR_MORE_DATA:
+ case ERROR_SUCCESS:
+ break;
+
+ default:
+ fprintf (stderr, "NetUserEnum() failed with %ld\n", rc);
+ exit (1);
+ }
+
+ for (i = 0; i < entriesread; i++)
+ {
+ char groupname[100];
+ char domain_name[100];
+ DWORD domname_len = 100;
+ char psid_buffer[1024];
+ PSID psid = (PSID) psid_buffer;
+ DWORD sid_length = 1024;
+ SID_NAME_USE acc_type;
+
+ int gid = buffer[i].grpi2_group_id;
+ uni2ansi (buffer[i].grpi2_name, groupname);
+ if (print_sids)
+ {
+ if (!LookupAccountName (servername ? ansi_srvname : NULL,
+ groupname,
+ psid, &sid_length,
+ domain_name, &domname_len,
+ &acc_type))
+ {
+ fprintf (stderr,
+ "LookupAccountName (%s, %s) failed with error %ld\n",
+ servername ? ansi_srvname : "NULL",
+ groupname,
+ GetLastError ());
+ continue;
+ }
+ else if (acc_type == SidTypeDomain)
+ {
+ char domname[356];
+
+ strcpy (domname, domain_name);
+ strcat (domname, "\\");
+ strcat (domname, groupname);
+ sid_length = 1024;
+ domname_len = 100;
+ if (!LookupAccountName (servername ? ansi_srvname : NULL,
+ domname,
+ psid, &sid_length,
+ domain_name, &domname_len,
+ &acc_type))
+ {
+ fprintf (stderr,
+ "LookupAccountName(%s,%s) failed with error %ld\n",
+ servername ? ansi_srvname : "NULL",
+ domname,
+ GetLastError ());
+ continue;
+ }
+ }
+ }
+ printf ("%s:%s:%d:\n", groupname,
+ print_sids ? put_sid (psid) : "",
+ gid);
+ }
+
+ NetApiBufferFree (buffer);
+
+ }
+ while (entriesread < totalentries);
+
+ if (servername)
+ NetApiBufferFree (servername);
+}
+
+void
+usage ()
+{
+ fprintf (stderr, "\n");
+ fprintf (stderr, "usage: mkgroup <options> [domain]\n\n");
+ fprintf (stderr, "This program prints group information to stdout\n\n");
+ fprintf (stderr, "Options:\n");
+ fprintf (stderr, " -l,--local print pseudo group information if there is\n");
+ fprintf (stderr, " no domain\n");
+ fprintf (stderr, " -d,--domain print global group information from the domain\n");
+ fprintf (stderr, " specified (or from the current domain if there is\n");
+ fprintf (stderr, " no domain specified)\n");
+ fprintf (stderr, " -s,--no-sids don't print SIDs in pwd field\n");
+ fprintf (stderr, " (this affects NT security)\n");
+ fprintf (stderr, " -?,--help print this message\n\n");
+ exit (1);
+}
+
+int
+main (int argc, char **argv)
+{
+ LPWSTR servername;
+ DWORD rc = ERROR_SUCCESS;
+ WCHAR domain_name[100];
+ int print_local = 0;
+ int print_domain = 0;
+ int print_sids = 1;
+ int domain_specified = 0;
+ int i;
+
+ char name[256], dom[256];
+ DWORD len, len2;
+ PSID sid, csid;
+ SID_NAME_USE use;
+
+ if (argc == 1)
+ usage ();
+
+ else
+ {
+ for (i = 1; i < argc; i++)
+ {
+ if (!strcmp (argv[i], "-l") || !strcmp (argv[i], "--local"))
+ print_local = 1;
+
+ else if (!strcmp (argv[i], "-d") || !strcmp (argv[i], "--domain"))
+ print_domain = 1;
+
+ else if (!strcmp (argv[i], "-s") || !strcmp (argv[i], "--no-sids"))
+ print_sids = 0;
+
+ else if (!strcmp (argv[i], "-?") || !strcmp (argv[i], "--help"))
+ usage ();
+
+ else
+ {
+ mbstowcs (domain_name, argv[i], strlen (argv[i]) + 1);
+ domain_specified = 1;
+ }
+ }
+ }
+
+ /*
+ * Get `Everyone' group
+ */
+ if (AllocateAndInitializeSid (&sid_world_auth, 1, SECURITY_WORLD_RID,
+ 0, 0, 0, 0, 0, 0, 0, &sid))
+ {
+ if (LookupAccountSid (NULL, sid,
+ name, (len = 256, &len),
+ dom, (len2 = 256, &len),
+ &use))
+ printf ("%s:%s:%ld:\n", name,
+ print_sids ? put_sid (sid) : "",
+ SECURITY_WORLD_RID);
+ FreeSid (sid);
+ }
+
+ /*
+ * Get `system' group
+ */
+ if (AllocateAndInitializeSid (&sid_nt_auth, 1, SECURITY_LOCAL_SYSTEM_RID,
+ 0, 0, 0, 0, 0, 0, 0, &sid))
+ {
+ if (LookupAccountSid (NULL, sid,
+ name, (len = 256, &len),
+ dom, (len2 = 256, &len),
+ &use))
+ printf ("%s:%s:%ld:\n", name,
+ print_sids ? put_sid (sid) : "",
+ SECURITY_LOCAL_SYSTEM_RID);
+ FreeSid (sid);
+ }
+
+ if (print_local)
+ {
+ /*
+ * Get `None' group
+ */
+ GetComputerName (name, (len = 256, &len));
+ csid = (PSID) malloc (1024);
+ LookupAccountName (NULL, name,
+ csid, (len = 1024, &len),
+ dom, (len2 = 256, &len),
+ &use);
+ if (AllocateAndInitializeSid (GetSidIdentifierAuthority (csid),
+ 5,
+ *GetSidSubAuthority (csid, 0),
+ *GetSidSubAuthority (csid, 1),
+ *GetSidSubAuthority (csid, 2),
+ *GetSidSubAuthority (csid, 3),
+ 513,
+ 0,
+ 0,
+ 0,
+ &sid))
+ {
+ if (LookupAccountSid (NULL, sid,
+ name, (len = 256, &len),
+ dom, (len2 = 256, &len),
+ &use))
+ printf ("%s:%s:513:\n", name,
+ print_sids ? put_sid (sid) : "");
+ FreeSid (sid);
+ }
+ free (csid);
+ }
+
+ if (print_domain)
+ {
+ if (domain_specified)
+ rc = NetGetDCName (NULL, domain_name, (LPBYTE *) & servername);
+
+ else
+ rc = NetGetDCName (NULL, NULL, (LPBYTE *) & servername);
+
+ if (rc != ERROR_SUCCESS)
+ {
+ fprintf (stderr, "Cannot get PDC, code = %ld\n", rc);
+ exit (1);
+ }
+
+ enum_groups (servername, print_sids);
+ }
+
+ if (print_local)
+ enum_local_groups (print_sids);
+
+ return 0;
+}
diff --git a/winsup/utils/mkpasswd.c b/winsup/utils/mkpasswd.c
new file mode 100644
index 000000000..649320c50
--- /dev/null
+++ b/winsup/utils/mkpasswd.c
@@ -0,0 +1,438 @@
+/* mkpasswd.c:
+
+ Copyright 1997, 1998, 1999, 2000 Cygnus Solutions.
+
+ This file is part of Cygwin.
+
+ This software is a copyrighted work licensed under the terms of the
+ Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+ details. */
+
+#include <ctype.h>
+#include <stdlib.h>
+#include <wchar.h>
+#include <stdio.h>
+#include <sys/cygwin.h>
+#include <windows.h>
+#include <lmaccess.h>
+#include <lmapibuf.h>
+
+SID_IDENTIFIER_AUTHORITY sid_world_auth = {SECURITY_WORLD_SID_AUTHORITY};
+SID_IDENTIFIER_AUTHORITY sid_nt_auth = {SECURITY_NT_AUTHORITY};
+
+#ifndef min
+#define min(a,b) (((a)<(b))?(a):(b))
+#endif
+
+char *
+put_sid (PSID sid)
+{
+ static char s[512];
+ char t[32];
+ DWORD i;
+
+ strcpy (s, "S-1-");
+ sprintf(t, "%u", GetSidIdentifierAuthority (sid)->Value[5]);
+ strcat (s, t);
+ for (i = 0; i < *GetSidSubAuthorityCount (sid); ++i)
+ {
+ sprintf(t, "-%lu", *GetSidSubAuthority (sid, i));
+ strcat (s, t);
+ }
+ return s;
+}
+
+void
+psx_dir (char *in, char *out)
+{
+ if (isalpha (in[0]) && in[1] == ':')
+ {
+ sprintf (out, "/cygdrive/%c", in[0]);
+ in += 2;
+ out += strlen (out);
+ }
+
+ while (*in)
+ {
+ if (*in == '\\')
+ *out = '/';
+ else
+ *out = *in;
+ in++;
+ out++;
+ }
+
+ *out = '\0';
+}
+
+void
+uni2ansi (LPWSTR wcs, char *mbs)
+{
+ if (wcs)
+ wcstombs (mbs, wcs, (wcslen (wcs) + 1) * sizeof (WCHAR));
+
+ else
+ *mbs = '\0';
+}
+
+int
+enum_users (LPWSTR servername, int print_sids, int print_cygpath)
+{
+ USER_INFO_3 *buffer;
+ DWORD entriesread = 0;
+ DWORD totalentries = 0;
+ DWORD resume_handle = 0;
+ char ansi_srvname[256];
+
+ if (servername)
+ uni2ansi (servername, ansi_srvname);
+
+ do
+ {
+ DWORD i;
+ DWORD rc = NetUserEnum (servername, 3, FILTER_NORMAL_ACCOUNT,
+ (LPBYTE *) & buffer, 1024,
+ &entriesread, &totalentries, &resume_handle);
+
+ switch (rc)
+ {
+ case ERROR_ACCESS_DENIED:
+ fprintf (stderr, "Access denied\n");
+ exit (1);
+
+ case ERROR_MORE_DATA:
+ case ERROR_SUCCESS:
+ break;
+
+ default:
+ fprintf (stderr, "NetUserEnum() failed with %ld\n", rc);
+ exit (1);
+ }
+
+ for (i = 0; i < entriesread; i++)
+ {
+ char username[100];
+ char fullname[100];
+ char homedir_psx[MAX_PATH];
+ char homedir_w32[MAX_PATH];
+ char domain_name[100];
+ DWORD domname_len = 100;
+ char psid_buffer[1024];
+ PSID psid = (PSID) psid_buffer;
+ DWORD sid_length = 1024;
+ SID_NAME_USE acc_type;
+
+ int uid = buffer[i].usri3_user_id;
+ int gid = buffer[i].usri3_primary_group_id;
+ uni2ansi (buffer[i].usri3_name, username);
+ uni2ansi (buffer[i].usri3_full_name, fullname);
+ homedir_w32[0] = homedir_psx[0] = '\0';
+ uni2ansi (buffer[i].usri3_home_dir, homedir_w32);
+ if (print_cygpath)
+ cygwin_conv_to_posix_path (homedir_w32, homedir_psx);
+ else
+ psx_dir (homedir_w32, homedir_psx);
+
+ if (print_sids)
+ {
+ if (!LookupAccountName (servername ? ansi_srvname : NULL,
+ username,
+ psid, &sid_length,
+ domain_name, &domname_len,
+ &acc_type))
+ {
+ fprintf (stderr,
+ "LookupAccountName(%s,%s) failed with error %ld\n",
+ servername ? ansi_srvname : "NULL",
+ username,
+ GetLastError ());
+ continue;
+ }
+ else if (acc_type == SidTypeDomain)
+ {
+ char domname[356];
+
+ strcpy (domname, domain_name);
+ strcat (domname, "\\");
+ strcat (domname, username);
+ sid_length = 1024;
+ domname_len = 100;
+ if (!LookupAccountName (servername ? ansi_srvname : NULL,
+ domname,
+ psid, &sid_length,
+ domain_name, &domname_len,
+ &acc_type))
+ {
+ fprintf (stderr,
+ "LookupAccountName(%s,%s) failed with error %ld\n",
+ servername ? ansi_srvname : "NULL",
+ domname,
+ GetLastError ());
+ continue;
+ }
+ }
+ }
+ printf ("%s::%d:%d:%s%s%s:%s:/bin/sh\n", username, uid, gid,
+ fullname,
+ print_sids ? "," : "",
+ print_sids ? put_sid (psid) : "",
+ homedir_psx);
+ }
+
+ NetApiBufferFree (buffer);
+
+ }
+ while (entriesread < totalentries);
+
+ if (servername)
+ NetApiBufferFree (servername);
+
+ return 0;
+}
+
+int
+enum_local_groups (int print_sids)
+{
+ LOCALGROUP_INFO_0 *buffer;
+ DWORD entriesread = 0;
+ DWORD totalentries = 0;
+ DWORD resume_handle = 0;
+
+ do
+ {
+ DWORD i;
+ DWORD rc = NetLocalGroupEnum (NULL, 0, (LPBYTE *) & buffer, 1024,
+ &entriesread, &totalentries, &resume_handle);
+
+ switch (rc)
+ {
+ case ERROR_ACCESS_DENIED:
+ fprintf (stderr, "Access denied\n");
+ exit (1);
+
+ case ERROR_MORE_DATA:
+ case ERROR_SUCCESS:
+ break;
+
+ default:
+ fprintf (stderr, "NetUserEnum() failed with %ld\n", rc);
+ exit (1);
+ }
+
+ for (i = 0; i < entriesread; i++)
+ {
+ char localgroup_name[100];
+ char domain_name[100];
+ DWORD domname_len = 100;
+ char psid_buffer[1024];
+ PSID psid = (PSID) psid_buffer;
+ DWORD sid_length = 1024;
+ DWORD gid;
+ SID_NAME_USE acc_type;
+ uni2ansi (buffer[i].lgrpi0_name, localgroup_name);
+
+ if (!LookupAccountName (NULL, localgroup_name, psid,
+ &sid_length, domain_name, &domname_len,
+ &acc_type))
+ {
+ fprintf (stderr, "LookupAccountName(%s) failed with %ld\n",
+ localgroup_name, GetLastError ());
+ continue;
+ }
+ else if (acc_type == SidTypeDomain)
+ {
+ char domname[356];
+
+ strcpy (domname, domain_name);
+ strcat (domname, "\\");
+ strcat (domname, localgroup_name);
+ sid_length = 1024;
+ domname_len = 100;
+ if (!LookupAccountName (NULL, domname,
+ psid, &sid_length,
+ domain_name, &domname_len,
+ &acc_type))
+ {
+ fprintf (stderr,
+ "LookupAccountName(%s) failed with error %ld\n",
+ localgroup_name, GetLastError ());
+ continue;
+ }
+ }
+
+ gid = *GetSidSubAuthority (psid, *GetSidSubAuthorityCount(psid) - 1);
+
+ printf ("%s:*:%ld:%ld:%s%s::\n", localgroup_name, gid, gid,
+ print_sids ? "," : "",
+ print_sids ? put_sid (psid) : "");
+ }
+
+ NetApiBufferFree (buffer);
+
+ }
+ while (entriesread < totalentries);
+
+ return 0;
+}
+
+void
+usage ()
+{
+ fprintf (stderr, "\n");
+ fprintf (stderr, "usage: mkpasswd [options] [domain]\n\n");
+ fprintf (stderr, "This program prints a /etc/passwd file to stdout\n\n");
+ fprintf (stderr, "Options are\n");
+ fprintf (stderr, " -l,--local print local accounts\n");
+ fprintf (stderr, " -d,--domain print domain accounts (from current domain\n");
+ fprintf (stderr, " if no domain specified\n");
+ fprintf (stderr, " -g,--local-groups print local group information too\n");
+ fprintf (stderr, " -m,--no-mount don't use mount points for home dir\n");
+ fprintf (stderr, " -s,--no-sids don't print SIDs in GCOS field\n");
+ fprintf (stderr, " (this affects NT security)\n");
+ fprintf (stderr, " -?,--help displays this message\n\n");
+ fprintf (stderr, "This program does only work on Windows NT\n\n");
+ exit (1);
+}
+
+int
+main (int argc, char **argv)
+{
+ LPWSTR servername = NULL;
+ DWORD rc = ERROR_SUCCESS;
+ WCHAR domain_name[200];
+ int print_local = 0;
+ int print_domain = 0;
+ int print_local_groups = 0;
+ int domain_name_specified = 0;
+ int print_sids = 1;
+ int print_cygpath = 1;
+ int i;
+
+ char name[256], dom[256];
+ DWORD len, len2;
+ PSID sid;
+ SID_NAME_USE use;
+
+ if (argc == 1)
+ usage ();
+
+ else
+ {
+ for (i = 1; i < argc; i++)
+ {
+ if (!strcmp (argv[i], "-l") || !strcmp (argv[i], "--local"))
+ print_local = 1;
+
+ else if (!strcmp (argv[i], "-d") || !strcmp (argv[i], "--domain"))
+ print_domain = 1;
+
+ else if (!strcmp (argv[i], "-g") || !strcmp (argv[i], "--local-groups"))
+ print_local_groups = 1;
+
+ else if (!strcmp (argv[i], "-s") || !strcmp (argv[i], "--no-sids"))
+ print_sids = 0;
+
+ else if (!strcmp (argv[i], "-m") || !strcmp (argv[i], "--no-mount"))
+ print_cygpath = 0;
+
+ else if (!strcmp (argv[i], "-?") || !strcmp (argv[i], "--help"))
+ usage ();
+
+ else
+ {
+ mbstowcs (domain_name, argv[i], (strlen (argv[i]) + 1));
+ domain_name_specified = 1;
+ }
+ }
+ }
+
+ /* FIXME: this needs to take Windows 98 into account. */
+ if (GetVersion () >= 0x80000000)
+ {
+ fprintf (stderr, "The required functionality is not supported by Windows 95. Sorry.\n");
+ exit (1);
+ }
+
+ /*
+ * Get `Everyone' group
+ */
+ if (AllocateAndInitializeSid (&sid_world_auth, 1, SECURITY_WORLD_RID,
+ 0, 0, 0, 0, 0, 0, 0, &sid))
+ {
+ if (LookupAccountSid (NULL, sid,
+ name, (len = 256, &len),
+ dom, (len2 = 256, &len),
+ &use))
+ printf ("%s:*:%ld:%ld:%s%s::\n", name,
+ SECURITY_WORLD_RID,
+ SECURITY_WORLD_RID,
+ print_sids ? "," : "",
+ print_sids ? put_sid (sid) : "");
+ FreeSid (sid);
+ }
+
+ /*
+ * Get `system' group
+ */
+ if (AllocateAndInitializeSid (&sid_nt_auth, 1, SECURITY_LOCAL_SYSTEM_RID,
+ 0, 0, 0, 0, 0, 0, 0, &sid))
+ {
+ if (LookupAccountSid (NULL, sid,
+ name, (len = 256, &len),
+ dom, (len2 = 256, &len),
+ &use))
+ printf ("%s:*:%ld:%ld:%s%s::\n", name,
+ SECURITY_LOCAL_SYSTEM_RID,
+ SECURITY_LOCAL_SYSTEM_RID,
+ print_sids ? "," : "",
+ print_sids ? put_sid (sid) : "");
+ FreeSid (sid);
+ }
+
+ /*
+ * Get `administrators' group
+ */
+ if (AllocateAndInitializeSid (&sid_nt_auth, 2, SECURITY_BUILTIN_DOMAIN_RID,
+ DOMAIN_ALIAS_RID_ADMINS,
+ 0, 0, 0, 0, 0, 0, &sid))
+ {
+ if (LookupAccountSid (NULL, sid,
+ name, (len = 256, &len),
+ dom, (len2 = 256, &len),
+ &use))
+ printf ("%s:*:%ld:%ld:%s%s::\n", name,
+ DOMAIN_ALIAS_RID_ADMINS,
+ DOMAIN_ALIAS_RID_ADMINS,
+ print_sids ? "," : "",
+ print_sids ? put_sid (sid) : "");
+ FreeSid (sid);
+ }
+
+ if (print_local_groups)
+ enum_local_groups (print_sids);
+
+ if (print_domain)
+ {
+ if (domain_name_specified)
+ rc = NetGetAnyDCName (NULL, domain_name, (LPBYTE *) & servername);
+
+ else
+ rc = NetGetAnyDCName (NULL, NULL, (LPBYTE *) & servername);
+
+ if (rc != ERROR_SUCCESS)
+ {
+ fprintf (stderr, "Cannot get DC, code = %ld\n", rc);
+ exit (1);
+ }
+
+ enum_users (servername, print_sids, print_cygpath);
+ }
+
+ if (print_local)
+ enum_users (NULL, print_sids, print_cygpath);
+
+ if (servername)
+ NetApiBufferFree (servername);
+
+ return 0;
+}
diff --git a/winsup/utils/mount.cc b/winsup/utils/mount.cc
new file mode 100644
index 000000000..2c348703a
--- /dev/null
+++ b/winsup/utils/mount.cc
@@ -0,0 +1,240 @@
+/* mount.cc
+
+ Copyright 1996, 1997, 1998, 1999 Cygnus Solutions.
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#include <stdio.h>
+#include <sys/mount.h>
+#include <sys/stat.h>
+#include <mntent.h>
+#include <windows.h>
+#include <sys/cygwin.h>
+#include "winsup.h"
+#include "external.h"
+
+#ifdef errno
+#undef errno
+#endif
+#include <errno.h>
+
+static void show_mounts (void);
+static void change_cygdrive_prefix (const char *new_prefix, int flags);
+static int mount_already_exists (const char *posix_path, int flags);
+
+// static short create_missing_dirs = FALSE;
+static short force = FALSE;
+
+static const char *progname;
+
+/* FIXME: do_mount should also print a warning message if the dev arg
+ is a non-existent Win32 path. */
+
+static void
+do_mount (const char *dev, const char *where, int flags)
+{
+ struct stat statbuf;
+ char win32_path[MAX_PATH];
+ int statres;
+
+ cygwin_conv_to_win32_path (where, win32_path);
+
+ statres = stat (win32_path, &statbuf);
+
+#if 0
+ if (statres == -1)
+ {
+ /* FIXME: this'll fail if mount dir is missing any parent dirs */
+ if (create_missing_dirs == TRUE)
+ {
+ if (mkdir (where, 0755) == -1)
+ fprintf (stderr, "Warning: unable to create %s!\n", where);
+ else
+ statres = 0; /* Pretend stat succeeded if we could mkdir. */
+ }
+ }
+#endif
+
+ if (mount (dev, where, flags))
+ {
+ perror ("mount failed");
+ exit (1);
+ }
+
+ if (statres == -1)
+ {
+ if (force == FALSE)
+ fprintf (stderr, "%s: warning - %s does not exist.\n", progname, where);
+ }
+ else if (!(statbuf.st_mode & S_IFDIR))
+ {
+ if (force == FALSE)
+ fprintf (stderr, "%s: warning: %s is not a directory!\n", progname, where);
+ }
+
+ exit (0);
+}
+
+static void
+usage (void)
+{
+ fprintf (stderr, "usage %s [-bfstux] <win32path> <posixpath>
+-b text files are equivalent to binary files (newline = \\n)
+-f force mount, don't warn about missing mount point directories
+-s add mount point to system-wide registry location
+-t text files get \\r\\n line endings (default)
+-u add mount point to user registry location (default)
+-x treat all files under mount point as executables
+
+[-bs] --change-cygdrive-prefix <posixpath>
+ change the cygdrive path prefix to <posixpath>
+--import-old-mounts
+ copy old registry mount table mounts into the current mount areas
+", progname);
+ exit (1);
+}
+
+int
+main (int argc, const char **argv)
+{
+ int i;
+ int flags = 0;
+
+ progname = argv[0];
+
+ if (argc == 1)
+ {
+ show_mounts ();
+ exit (0);
+ }
+
+ for (i = 1; i < argc; ++i)
+ {
+ if (argv[i][0] != '-')
+ break;
+
+ if (strcmp (argv[i], "--change-cygdrive-prefix") == 0)
+ {
+ if ((i + 2) != argc)
+ usage ();
+
+ change_cygdrive_prefix (argv[i+1], flags);
+ }
+ else if (strcmp (argv[i], "--import-old-mounts") == 0)
+ {
+ if ((i + 1) != argc)
+ usage ();
+
+ cygwin_internal (CW_READ_V1_MOUNT_TABLES);
+ exit (0);
+ }
+ else if (strcmp (argv[i], "-b") == 0)
+ flags |= MOUNT_BINARY;
+ else if (strcmp (argv[i], "-t") == 0)
+ flags &= ~MOUNT_BINARY;
+#if 0
+ else if (strcmp (argv[i], "-c") == 0)
+ create_missing_dirs = TRUE;
+#endif
+ else if (strcmp (argv[i], "-s") == 0)
+ flags |= MOUNT_SYSTEM;
+ else if (strcmp (argv[i], "-u") == 0)
+ flags &= ~MOUNT_SYSTEM;
+ else if (strcmp (argv[i], "-x") == 0)
+ flags |= MOUNT_EXEC;
+ else if (strcmp (argv[i], "-f") == 0)
+ force = TRUE;
+ else
+ usage ();
+ }
+
+ if ((i + 2) != argc)
+ usage ();
+
+ if ((force == FALSE) && (mount_already_exists (argv[i + 1], flags)))
+ {
+ errno = EBUSY;
+ perror ("mount failed");
+ exit (1);
+ }
+ else
+ do_mount (argv[i], argv[i + 1], flags);
+
+ /* NOTREACHED */
+ return 0;
+}
+
+static void
+show_mounts (void)
+{
+ FILE *m = setmntent ("/-not-used-", "r");
+ struct mntent *p;
+ const char *format = "%-18s %-18s %-11s %s\n";
+
+ printf (format, "Device", "Directory", "Type", "Flags");
+ while ((p = getmntent (m)) != NULL)
+ {
+ printf (format,
+ p->mnt_fsname,
+ p->mnt_dir,
+ p->mnt_type,
+ p->mnt_opts);
+ }
+ endmntent (m);
+}
+
+/* Return 1 if mountpoint from the same registry area is already in
+ mount table. Otherwise return 0. */
+static int
+mount_already_exists (const char *posix_path, int flags)
+{
+ int found_matching = 0;
+
+ FILE *m = setmntent ("/-not-used-", "r");
+ struct mntent *p;
+
+ while ((p = getmntent (m)) != NULL)
+ {
+ /* if the paths match, and they're both the same type of mount. */
+ if (strcmp (p->mnt_dir, posix_path) == 0)
+ {
+ if (p->mnt_type[0] == 'u' && !(flags & MOUNT_SYSTEM)) /* both current_user */
+ {
+ found_matching = 1;
+ break;
+ }
+ else if (p->mnt_type[0] == 's' && (flags & MOUNT_SYSTEM)) /* both system */
+ {
+ found_matching = 1;
+ break;
+ }
+ else
+ {
+ fprintf (stderr, "%s: warning -- couldn't determine mount type.\n", progname);
+ break;
+ }
+ }
+ }
+ endmntent (m);
+
+ return found_matching;
+}
+
+/* change_cygdrive_prefix: Change the cygdrive prefix */
+static void
+change_cygdrive_prefix (const char *new_prefix, int flags)
+{
+ flags |= MOUNT_AUTO;
+
+ if (mount (NULL, new_prefix, flags))
+ {
+ perror ("mount failed");
+ exit (1);
+ }
+
+ exit (0);
+}
diff --git a/winsup/utils/passwd.c b/winsup/utils/passwd.c
new file mode 100644
index 000000000..700ea4d43
--- /dev/null
+++ b/winsup/utils/passwd.c
@@ -0,0 +1,352 @@
+/* passwd.c: Changing passwords and managing account information
+
+ Copyright 1999 Cygnus Solutions.
+
+ Written by Corinna Vinschen <corinna.vinschen@cityweb.de>
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <getopt.h>
+#include <pwd.h>
+#include <sys/types.h>
+#include <time.h>
+
+#include <windows.h>
+#include <lmaccess.h>
+#include <lmerr.h>
+#include <lmcons.h>
+#include <lmapibuf.h>
+
+#define USER_PRIV_ADMIN 2
+
+#define UF_LOCKOUT 0x00010
+
+char *myname;
+
+int
+eprint (int with_name, const char *fmt, ...)
+{
+ va_list ap;
+
+ if (with_name)
+ fprintf(stderr, "%s: ", myname);
+ va_start (ap, fmt);
+ vfprintf (stderr, fmt, ap);
+ va_end (ap);
+ fprintf(stderr, "\n");
+ return 1;
+}
+
+int
+EvalRet (int ret, const char *user)
+{
+ switch (ret)
+ {
+ case NERR_Success:
+ return 0;
+
+ case ERROR_ACCESS_DENIED:
+ if (! user)
+ eprint (0, "You may not change password expiry information.");
+ else
+ eprint (0, "You may not change the password for %s.", user);
+ break;
+
+ eprint (0, "Bad password: Invalid.");
+ break;
+
+ case NERR_PasswordTooShort:
+ eprint (0, "Bad password: Too short.");
+ break;
+
+ case NERR_UserNotFound:
+ eprint (1, "unknown user %s", user);
+ break;
+
+ case ERROR_INVALID_PASSWORD:
+ case NERR_BadPassword:
+ eprint (0, "Incorrect password for %s.", user);
+ eprint (0, "The password for %s is unchanged.", user);
+ break;
+
+ default:
+ eprint (1, "unrecoverable error %d", ret);
+ break;
+ }
+ return 1;
+}
+
+PUSER_INFO_3
+GetPW (const char *user)
+{
+ WCHAR name[512];
+ DWORD ret;
+ PUSER_INFO_3 ui;
+
+ MultiByteToWideChar (CP_ACP, 0, user, -1, name, 512);
+ ret = NetUserGetInfo (NULL, name, 3, (LPBYTE *) &ui);
+ return EvalRet (ret, user) ? NULL : ui;
+}
+
+int
+ChangePW (const char *user, const char *oldpwd, const char *pwd)
+{
+ WCHAR name[512], oldpass[512], pass[512];
+ DWORD ret;
+
+ MultiByteToWideChar (CP_ACP, 0, user, -1, name, 512);
+ MultiByteToWideChar (CP_ACP, 0, pwd, -1, pass, 512);
+ if (! oldpwd)
+ {
+ USER_INFO_1003 ui;
+
+ ui.usri1003_password = pass;
+ ret = NetUserSetInfo (NULL, name, 1003, (LPBYTE) &ui, NULL);
+ }
+ else
+ {
+ MultiByteToWideChar (CP_ACP, 0, oldpwd, -1, oldpass, 512);
+ ret = NetUserChangePassword (NULL, name, oldpass, pass);
+ }
+ if (! EvalRet (ret, user))
+ {
+ eprint (0, "Password changed.");
+ }
+ return ret;
+}
+
+void
+PrintPW (PUSER_INFO_3 ui)
+{
+ time_t t = time (NULL) - ui->usri3_password_age;
+ int ret;
+ PUSER_MODALS_INFO_0 mi;
+
+ printf ("Account disabled : %s", (ui->usri3_flags & UF_ACCOUNTDISABLE)
+ ? "yes\n" : "no\n");
+ printf ("Password required: %s", (ui->usri3_flags & UF_PASSWD_NOTREQD)
+ ? "no\n" : "yes\n");
+ printf ("Password expired : %s", (ui->usri3_password_expired)
+ ? "yes\n" : "no\n");
+ printf ("Password changed : %s", ctime(&t));
+ ret = NetUserModalsGet (NULL, 0, (LPBYTE *) &mi);
+ if (! ret)
+ {
+ if (mi->usrmod0_max_passwd_age == TIMEQ_FOREVER
+ || ui->usri3_priv == USER_PRIV_ADMIN)
+ mi->usrmod0_max_passwd_age = 0;
+ if (mi->usrmod0_min_passwd_age == TIMEQ_FOREVER
+ || ui->usri3_priv == USER_PRIV_ADMIN)
+ mi->usrmod0_min_passwd_age = 0;
+ if (mi->usrmod0_force_logoff == TIMEQ_FOREVER
+ || ui->usri3_priv == USER_PRIV_ADMIN)
+ mi->usrmod0_force_logoff = 0;
+ if (ui->usri3_priv == USER_PRIV_ADMIN)
+ mi->usrmod0_min_passwd_len = 0;
+ printf ("Max. password age %ld days\n",
+ mi->usrmod0_max_passwd_age / ONE_DAY);
+ printf ("Min. password age %ld days\n",
+ mi->usrmod0_min_passwd_age / ONE_DAY);
+ printf ("Force logout after %ld days\n",
+ mi->usrmod0_force_logoff / ONE_DAY);
+ printf ("Min. password length: %ld\n",
+ mi->usrmod0_min_passwd_len);
+ }
+}
+
+int
+SetModals (int xarg, int narg, int iarg, int Larg)
+{
+ int ret;
+ PUSER_MODALS_INFO_0 mi;
+
+ ret = NetUserModalsGet (NULL, 0, (LPBYTE *) &mi);
+ if (! ret)
+ {
+ if (xarg == 0)
+ mi->usrmod0_max_passwd_age = TIMEQ_FOREVER;
+ else if (xarg > 0)
+ mi->usrmod0_max_passwd_age = xarg * ONE_DAY;
+
+ if (narg == 0)
+ {
+ mi->usrmod0_min_passwd_age = TIMEQ_FOREVER;
+ mi->usrmod0_password_hist_len = 0;
+ }
+ else if (narg > 0)
+ mi->usrmod0_min_passwd_age = narg * ONE_DAY;
+
+ if (iarg == 0)
+ mi->usrmod0_force_logoff = TIMEQ_FOREVER;
+ else if (iarg > 0)
+ mi->usrmod0_force_logoff = iarg * ONE_DAY;
+
+ if (Larg >= 0)
+ mi->usrmod0_min_passwd_len = Larg;
+
+ ret = NetUserModalsSet (NULL, 0, (LPBYTE) mi, NULL);
+ NetApiBufferFree (mi);
+ }
+ return EvalRet (ret, NULL);
+}
+
+int
+usage ()
+{
+ fprintf (stderr, "usage: %s [name]\n", myname);
+ fprintf (stderr, " %s [-L maxlen] [-x max] [-n min] [-i inact]\n",
+ myname);
+ fprintf (stderr, " %s {-l|-u|-S} name\n", myname);
+ return 2;
+}
+
+int
+main (int argc, char **argv)
+{
+ char *c;
+ char user[64], oldpwd[64], newpwd[64];
+ int ret = 0;
+ int cnt = 0;
+ int opt;
+ int Larg = -1;
+ int xarg = -1;
+ int narg = -1;
+ int iarg = -1;
+ int lopt = 0;
+ int uopt = 0;
+ int Sopt = 0;
+ PUSER_INFO_3 ui, li;
+
+ if ((myname = strrchr (argv[0], '/'))
+ || (myname = strrchr (argv[0], '\\')))
+ ++myname;
+ else
+ myname = argv[0];
+ c = strrchr (myname, '.');
+ if (c)
+ *c = '\0';
+
+ while ((opt = getopt (argc, argv, "L:x:n:i:luS")) != EOF)
+ switch (opt)
+ {
+ case 'x':
+ if ((xarg = atoi (optarg)) < 0 || xarg > 999)
+ return eprint (1, "Maximum password age must be between 0 and 999.");
+ if (narg >= 0 && xarg < narg)
+ return eprint (1, "Maximum password age must be greater than "
+ "minimum password age.");
+ break;
+
+ case 'n':
+ if ((narg = atoi (optarg)) < 0 || narg > 999)
+ return eprint (1, "Minimum password age must be between 0 and 999.");
+ if (xarg >= 0 && narg > xarg)
+ return eprint (1, "Minimum password age must be less than "
+ "maximum password age.");
+ break;
+
+ case 'i':
+ if ((iarg = atoi (optarg)) < 0 || iarg > 999)
+ return eprint (1, "Force logout time must be between 0 and 999.");
+ break;
+
+ case 'L':
+ if ((Larg = atoi (optarg)) < 0 || Larg > LM20_PWLEN)
+ return eprint (1, "Minimum password length must be between "
+ "0 and %d.", LM20_PWLEN);
+ break;
+
+ case 'l':
+ if (xarg >= 0 || narg >= 0 || iarg >= 0 || Larg >= 0 || uopt || Sopt)
+ return usage ();
+ lopt = 1;
+ break;
+
+ case 'u':
+ if (xarg >= 0 || narg >= 0 || iarg >= 0 || Larg >= 0 || lopt || Sopt)
+ return usage ();
+ uopt = 1;
+ break;
+
+ case 'S':
+ if (xarg >= 0 || narg >= 0 || iarg >= 0 || Larg >= 0 || lopt || uopt)
+ return usage ();
+ Sopt = 1;
+ break;
+
+ default:
+ return usage ();
+ }
+ if (Larg >= 0 || xarg >= 0 || narg >= 0 || iarg >= 0)
+ {
+ if (optind < argc)
+ return usage ();
+ return SetModals (xarg, narg, iarg, Larg);
+ }
+
+ strcpy (user, optind >= argc ? getlogin () : argv[optind]);
+
+ li = GetPW (getlogin ());
+ if (! li)
+ return 1;
+
+ ui = GetPW (user);
+ if (! ui)
+ return 1;
+
+ if (lopt || uopt || Sopt)
+ {
+ if (li->usri3_priv != USER_PRIV_ADMIN)
+ return eprint (0, "You have no maintenance privileges.");
+ if (lopt)
+ {
+ if (ui->usri3_priv == USER_PRIV_ADMIN)
+ return eprint (0, "You may not lock an administrators account.");
+ ui->usri3_flags |= UF_ACCOUNTDISABLE;
+ }
+ if (uopt)
+ ui->usri3_flags &= ~UF_ACCOUNTDISABLE;
+ if (lopt || uopt)
+ {
+ ret = NetUserSetInfo (NULL, ui->usri3_name, 3, (LPBYTE) ui, NULL);
+ return EvalRet (ret, NULL);
+ }
+ // Sopt
+ PrintPW (ui);
+ return 0;
+ }
+
+ if (li->usri3_priv != USER_PRIV_ADMIN && strcmp (getlogin (), user))
+ return eprint (0, "You may not change the password for %s.", user);
+
+ eprint (0, "Enter the new password (minimum of 5, maximum of 8 characters).");
+ eprint (0, "Please use a combination of upper and lower case letters and numbers.");
+
+ if (li->usri3_priv != USER_PRIV_ADMIN)
+ {
+ strcpy (oldpwd, getpass ("Old password: "));
+ if (ChangePW (user, oldpwd, oldpwd))
+ return 1;
+ }
+
+ do
+ {
+ strcpy (newpwd, getpass ("New password: "));
+ if (strcmp (newpwd, getpass ("Re-enter new password: ")))
+ eprint (0, "Password is not identical.");
+ else if (! ChangePW (user, *oldpwd ? oldpwd : NULL, newpwd))
+ ret = 1;
+ if (! ret && cnt < 2)
+ eprint (0, "Try again.");
+ }
+ while (! ret && ++cnt < 3);
+ return ! ret;
+}
diff --git a/winsup/utils/ps.cc b/winsup/utils/ps.cc
new file mode 100644
index 000000000..4767a6ae0
--- /dev/null
+++ b/winsup/utils/ps.cc
@@ -0,0 +1,150 @@
+/* ps.cc
+
+ Copyright 1996, 1997, 1998 Cygnus Solutions.
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#include <stdio.h>
+#include <time.h>
+#include <getopt.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <pwd.h>
+#include <sys/cygwin.h>
+#include "winsup.h"
+#include "external.h"
+
+static char *
+start_time (external_pinfo *child)
+{
+ time_t st = child->start_time;
+ time_t t = time (NULL);
+ static char stime[40] = {'\0'};
+ char now[40];
+
+ strncpy (stime, ctime (&st) + 4, 15);
+ strcpy (now, ctime (&t) + 4);
+
+ if ((t - st) < (24 * 3600))
+ return (stime + 7);
+
+ stime[6] = '\0';
+
+ return stime;
+}
+
+int
+main (int argc, char *argv[])
+{
+ external_pinfo *p;
+ int aflag, lflag, fflag, uid;
+ const char *dtitle = " PID TTY STIME COMMAND\n";
+ const char *dfmt = "%5d%4d%10s %s\n";
+ const char *ftitle = " UID PID PPID TTY STIME COMMAND\n";
+ const char *ffmt = "%8.8s%6d%6d%4d%10s %s\n";
+ const char *ltitle = " PID PPID PGID WINPID UID TTY STIME COMMAND\n";
+ const char *lfmt = "%c %5d %5d %5d %8u %4d %3d %8s %s\n";
+ char ch;
+
+ aflag = lflag = fflag = 0;
+ uid = getuid ();
+
+ while ((ch = getopt (argc, argv, "aelfu:")) != -1)
+ switch (ch)
+ {
+ case 'a':
+ case 'e':
+ aflag = 1;
+ break;
+ case 'f':
+ fflag = 1;
+ break;
+ case 'l':
+ lflag = 1;
+ break;
+ case 'u':
+ uid = atoi (optarg);
+ if (uid == 0)
+ {
+ struct passwd *pw;
+
+ if ((pw = getpwnam (optarg)))
+ uid = pw->pw_uid;
+ else
+ {
+ fprintf (stderr, "user %s unknown\n", optarg);
+ exit (1);
+ }
+ }
+ break;
+ default:
+ fprintf (stderr, "Usage %s [-aefl] [-u uid]\n", argv[0]);
+ fprintf (stderr, "-f = show process uids, ppids\n");
+ fprintf (stderr, "-l = show process uids, ppids, pgids, winpids\n");
+ fprintf (stderr, "-u uid = list processes owned by uid\n");
+ fprintf (stderr, "-a, -e = show processes of all users\n");
+ exit (1);
+ }
+
+ if (lflag)
+ printf (ltitle);
+ else if (fflag)
+ printf (ftitle);
+ else
+ printf (dtitle);
+
+ (void) cygwin_internal (CW_LOCK_PINFO, 1000);
+
+ for (int pid = 0;
+ (p = (external_pinfo *) cygwin_internal (CW_GETPINFO,
+ pid | CW_NEXTPID));
+ pid = p->pid)
+ {
+ if (p->process_state == PID_NOT_IN_USE)
+ continue;
+ if (!aflag && p->uid != uid)
+ continue;
+ char status = ' ';
+ if (p->process_state & PID_STOPPED)
+ status = 'S';
+ else if (p->process_state & PID_TTYIN)
+ status = 'I';
+ else if (p->process_state & PID_TTYOU)
+ status = 'O';
+
+ char pname[MAX_PATH];
+ if (p->process_state & PID_ZOMBIE)
+ strcpy (pname, "<defunct>");
+ else
+ cygwin_conv_to_posix_path (p->progname, pname);
+
+ char uname[128];
+
+ if (fflag)
+ {
+ struct passwd *pw;
+
+ if ((pw = getpwuid (p->uid)))
+ strcpy (uname, pw->pw_name);
+ else
+ sprintf (uname, "%d", p->uid);
+ }
+
+ if (lflag)
+ printf (lfmt, status, p->pid, p->ppid, p->pgid,
+ p->dwProcessId, p->uid, p->ctty, start_time (p), pname);
+ else if (fflag)
+ printf (ffmt, uname, p->pid, p->ppid, p->ctty, start_time (p), pname);
+ else
+ printf (dfmt, p->pid, p->ctty, start_time (p), pname);
+
+ }
+ (void) cygwin_internal (CW_UNLOCK_PINFO);
+
+ return 0;
+}
+
diff --git a/winsup/utils/regtool.cc b/winsup/utils/regtool.cc
new file mode 100644
index 000000000..1e79e3a69
--- /dev/null
+++ b/winsup/utils/regtool.cc
@@ -0,0 +1,524 @@
+/* regtool.cc
+
+ Copyright 2000 Red Hat Inc.
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <getopt.h>
+#include <windows.h>
+
+enum {
+ KT_AUTO, KT_INT, KT_STRING, KT_EXPAND, KT_MULTI
+} key_type = KT_AUTO;
+
+int verbose = 0;
+int quiet = 0;
+char **argv;
+
+HKEY key;
+char *value;
+
+const char *usage_msg[] =
+{
+ "Regtool Copyright (c) 2000 Red Hat Inc",
+ " regtool -h - print this message",
+ " regtool [-v] list [key] - list subkeys and values",
+ " regtool [-v] add [key\\subkey] - add new subkey",
+ " regtool [-v] remove [key] - remove key",
+ " regtool [-v|-q] check [key] - exit 0 if key exists, 1 if not",
+ " regtool [-i|-s|-e|-m] set [key\\value] [data ...] - set value",
+ " -i=integer -s=string -e=expand-string -m=multi-string",
+ " regtool [-v] unset [key\\value] - removes value from key",
+ " regtool [-q] get [key\\value] - prints value to stdout",
+ " -q=quiet, no error msg, just return nonzero exit if key/value missing",
+ " keys are like \\prefix\\key\\key\\key\\value, where prefix is any of:",
+ " root HKCR HKEY_CLASSES_ROOT",
+ " config HKCC HKEY_CURRENT_CONFIG",
+ " user HKCU HKEY_CURRENT_USER",
+ " machine HKLM HKEY_LOCAL_MACHINE",
+ " users HKU HKEY_USERS",
+ " example: \\user\\software\\Microsoft\\Clock\\iFormat",
+ 0
+};
+
+void
+usage(void)
+{
+ int i;
+ for (i=0; usage_msg[i]; i++)
+ fprintf(stderr, "%s\n", usage_msg[i]);
+ exit(1);
+}
+
+void
+Fail(DWORD rv)
+{
+ char *buf;
+ if (!quiet)
+ {
+ FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER
+ | FORMAT_MESSAGE_FROM_SYSTEM,
+ 0, rv, 0, (CHAR *)&buf, 0, 0);
+ fprintf(stderr, "Error: %s\n", buf);
+ }
+ exit(1);
+}
+
+struct {
+ const char *string;
+ HKEY key;
+} wkprefixes[] = {
+ { "root", HKEY_CLASSES_ROOT },
+ { "HKCR", HKEY_CLASSES_ROOT },
+ { "HKEY_CLASSES_ROOT", HKEY_CLASSES_ROOT },
+ { "config", HKEY_CURRENT_CONFIG },
+ { "HKCC", HKEY_CURRENT_CONFIG },
+ { "HKEY_CURRENT_CONFIG", HKEY_CURRENT_CONFIG },
+ { "user", HKEY_CURRENT_USER },
+ { "HKCU", HKEY_CURRENT_USER },
+ { "HKEY_CURRENT_USER", HKEY_CURRENT_USER },
+ { "machine", HKEY_LOCAL_MACHINE },
+ { "HKLM", HKEY_LOCAL_MACHINE },
+ { "HKEY_LOCAL_MACHINE", HKEY_LOCAL_MACHINE },
+ { "users", HKEY_USERS },
+ { "HKU", HKEY_USERS },
+ { "HKEY_USERS", HKEY_USERS },
+ { 0, 0 }
+};
+
+void translate(char *key)
+{
+#define isodigit(c) (strchr("01234567", c))
+#define tooct(c) ((c)-'0')
+#define tohex(c) (strchr(_hs,tolower(c))-_hs)
+ static char _hs[] = "0123456789abcdef";
+
+ char *d = key;
+ char *s = key;
+ char c;
+
+ while (*s)
+ {
+ if (*s == '\\')
+ switch (*++s)
+ {
+ case 'a':
+ *d++ = '\007';
+ break;
+ case 'b':
+ *d++ = '\b';
+ break;
+ case 'e':
+ *d++ = '\033';
+ break;
+ case 'f':
+ *d++ = '\f';
+ break;
+ case 'n':
+ *d++ = '\n';
+ break;
+ case 'r':
+ *d++ = '\r';
+ break;
+ case 't':
+ *d++ = '\t';
+ break;
+ case 'v':
+ *d++ = '\v';
+ break;
+ case '0': case '1': case '2': case '3':
+ case '4': case '5': case '6': case '7':
+ c = tooct(*s);
+ if (isodigit(s[1]))
+ {
+ c = (c << 3) | tooct(*++s);
+ if (isodigit(s[1]))
+ c = (c << 3) | tooct(*++s);
+ }
+ *d++ = c;
+ break;
+ case 'x':
+ if (isxdigit(s[1]))
+ {
+ c = tohex(*++s);
+ if (isxdigit(s[1]))
+ c = (c << 4) | tohex(*++s);
+ }
+ *d++ = c;
+ break;
+ default: /* before non-special char: just add the char */
+ *d++ = *s;
+ break;
+ }
+ else if (*s == '/')
+ *d++ = '\\';
+ else
+ *d++ = *s;
+ ++s;
+ }
+ *d = '\0';
+}
+
+void
+find_key(int howmanyparts)
+{
+ char *n = argv[0], *e, c;
+ int i;
+ if (*n == '/')
+ translate(n);
+ while (*n == '\\')
+ n++;
+ for (e=n; *e && *e != '\\'; e++);
+ c = *e;
+ *e = 0;
+ for (i=0; wkprefixes[i].string; i++)
+ if (strcmp(wkprefixes[i].string, n) == 0)
+ break;
+ if (!wkprefixes[i].string)
+ {
+ fprintf(stderr, "Unknown key prefix. Valid prefixes are:\n");
+ for (i=0; wkprefixes[i].string; i++)
+ fprintf(stderr, "\t%s\n", wkprefixes[i].string);
+ exit(1);
+ }
+
+ n = e;
+ *e = c;
+ while (*n && *n == '\\')
+ n++;
+ e = n+strlen(n);
+ if (howmanyparts > 1)
+ {
+ while (n < e && *e != '\\')
+ e--;
+ if (*e != '\\')
+ {
+ fprintf(stderr, "Invalid key\n");
+ exit(1);
+ }
+ *e = 0;
+ value = e+1;
+ }
+ if (n[0] == 0)
+ {
+ key = wkprefixes[i].key;
+ return;
+ }
+ int rv = RegOpenKeyEx(wkprefixes[i].key, n, 0, KEY_ALL_ACCESS, &key);
+ if (rv != ERROR_SUCCESS)
+ Fail(rv);
+ //printf("key `%s' value `%s'\n", n, value);
+}
+
+
+int
+cmd_list()
+{
+ DWORD num_subkeys, maxsubkeylen, num_values, maxvalnamelen, maxvaluelen;
+ DWORD maxclasslen;
+ char *subkey_name, *value_name, *class_name;
+ unsigned char *value_data, *vd;
+ DWORD i, j, m, n, t;
+ int v;
+
+ find_key(1);
+ RegQueryInfoKey(key, 0, 0, 0, &num_subkeys, &maxsubkeylen, &maxclasslen,
+ &num_values, &maxvalnamelen, &maxvaluelen, 0, 0);
+
+ subkey_name = (char *)malloc(maxsubkeylen+1);
+ class_name = (char *)malloc(maxclasslen+1);
+ value_name = (char *)malloc(maxvalnamelen+1);
+ value_data = (unsigned char *)malloc(maxvaluelen+1);
+
+ for (i=0; i<num_subkeys; i++)
+ {
+ m = maxsubkeylen+1;
+ n = maxclasslen+1;
+ RegEnumKeyEx(key, i, subkey_name, &m, 0, class_name, &n, 0);
+ if (verbose)
+ printf("%s\\ (%s)\n", subkey_name, class_name);
+ else
+ printf("%s\n", subkey_name);
+ }
+
+ for (i=0; i<num_values; i++)
+ {
+ m = maxvalnamelen+1;
+ n = maxvaluelen+1;
+ RegEnumValue(key, i, value_name, &m, 0, &t, (BYTE *)value_data, &n);
+ if (!verbose)
+ printf("%s\n", value_name);
+ else
+ {
+ printf("%s = ", value_name);
+ switch (t)
+ {
+ case REG_BINARY:
+ for (j=0; j<8 && j<n; j++)
+ printf("%02x ", value_data[j]);
+ printf("\n");
+ break;
+ case REG_DWORD:
+ printf("0x%08lx (%lu)\n", *(DWORD *)value_data,
+ *(DWORD *)value_data);
+ break;
+ case REG_DWORD_BIG_ENDIAN:
+ v = ((value_data[0] << 24)
+ | (value_data[1] << 16)
+ | (value_data[2] << 8)
+ | (value_data[3]));
+ printf("0x%08x (%d)\n", v, v);
+ break;
+ case REG_EXPAND_SZ:
+ case REG_SZ:
+ printf("\"%s\"\n", value_data);
+ break;
+ case REG_MULTI_SZ:
+ vd = value_data;
+ while (vd && *vd)
+ {
+ printf("\"%s\"", vd);
+ vd = vd+strlen((const char *)vd) + 1;
+ if (*vd)
+ printf(", ");
+ }
+ printf("\n");
+ break;
+ default:
+ printf("? (type %d)\n", (int)t);
+ }
+ }
+ }
+ return 0;
+}
+
+int
+cmd_add()
+{
+ find_key(2);
+ HKEY newkey;
+ DWORD newtype;
+ int rv = RegCreateKeyEx(key, value, 0, (char *)"", REG_OPTION_NON_VOLATILE,
+ KEY_ALL_ACCESS, 0, &newkey, &newtype);
+ if (rv != ERROR_SUCCESS)
+ Fail(rv);
+
+ if (verbose)
+ {
+ if (newtype == REG_OPENED_EXISTING_KEY)
+ printf("Key %s already exists\n", value);
+ else
+ printf("Key %s created\n", value);
+ }
+ return 0;
+}
+
+int
+cmd_remove()
+{
+ find_key(2);
+ DWORD rv = RegDeleteKey(key, value);
+ if (rv != ERROR_SUCCESS)
+ Fail(rv);
+ if (verbose)
+ printf("subkey %s deleted\n", value);
+ return 0;
+}
+
+int
+cmd_check()
+{
+ find_key(1);
+ if (verbose)
+ printf("key %s exists\n", argv[0]);
+ return 0;
+}
+
+int
+cmd_set()
+{
+ int i, n;
+ DWORD v, rv;
+ char *a = argv[1], *data;
+ find_key(2);
+
+ if (key_type == KT_AUTO)
+ {
+ char *e;
+ strtoul(a, &e, 0);
+ if (a[0] == '%')
+ key_type = KT_EXPAND;
+ else if (a[0] && !*e)
+ key_type = KT_INT;
+ else if (argv[2])
+ key_type = KT_MULTI;
+ else
+ key_type = KT_STRING;
+ }
+
+ switch (key_type)
+ {
+ case KT_INT:
+ v = strtoul(a, 0, 0);
+ rv = RegSetValueEx(key, value, 0, REG_DWORD, (const BYTE *)&v, sizeof(v));
+ break;
+ case KT_STRING:
+ rv = RegSetValueEx(key, value, 0, REG_SZ, (const BYTE *)a, strlen(a));
+ break;
+ case KT_EXPAND:
+ rv = RegSetValueEx(key, value, 0, REG_EXPAND_SZ, (const BYTE *)a, strlen(a));
+ break;
+ case KT_MULTI:
+ for (i=1, n=1; argv[i]; i++)
+ n += strlen(argv[i])+1;
+ data = (char *)malloc(n);
+ for (i=1, n=0; argv[i]; i++)
+ {
+ strcpy(data+n, argv[i]);
+ n += strlen(argv[i])+1;
+ }
+ data[n] = 0;
+ rv = RegSetValueEx(key, value, 0, REG_MULTI_SZ, (const BYTE *)data, n+1);
+ break;
+ case KT_AUTO:
+ break;
+ }
+
+ if (rv != ERROR_SUCCESS)
+ Fail(rv);
+
+ return 0;
+}
+
+int
+cmd_unset()
+{
+ find_key(2);
+ DWORD rv = RegDeleteValue(key, value);
+ if (rv != ERROR_SUCCESS)
+ Fail(rv);
+ if (verbose)
+ printf("value %s deleted\n", value);
+ return 0;
+}
+
+int
+cmd_get()
+{
+ find_key(2);
+ DWORD vtype, dsize, rv;
+ char *data, *vd;
+ rv = RegQueryValueEx(key, value, 0, &vtype, 0, &dsize);
+ if (rv != ERROR_SUCCESS)
+ Fail(rv);
+ dsize++;
+ data = (char *)malloc(dsize);
+ rv = RegQueryValueEx(key, value, 0, &vtype, (BYTE *)data, &dsize);
+ if (rv != ERROR_SUCCESS)
+ Fail(rv);
+ switch (vtype)
+ {
+ case REG_BINARY:
+ fwrite(data, dsize, 0, stdout);
+ break;
+ case REG_DWORD:
+ printf("%lu\n", *(DWORD *)data);
+ break;
+ case REG_SZ:
+ printf("%s\n", data);
+ break;
+ case REG_EXPAND_SZ:
+ if (key_type == KT_EXPAND) // hack
+ {
+ char *buf;
+ DWORD bufsize;
+ bufsize = ExpandEnvironmentStrings(data, 0, 0);
+ buf = (char *)malloc(bufsize+1);
+ ExpandEnvironmentStrings(data, buf, bufsize+1);
+ data = buf;
+ }
+ printf("%s\n", data);
+ break;
+ case REG_MULTI_SZ:
+ vd = data;
+ while (vd && *vd)
+ {
+ printf("%s\n", vd);
+ vd = vd+strlen((const char *)vd) + 1;
+ }
+ break;
+ }
+ return 0;
+}
+
+struct {
+ const char *name;
+ int (*func)();
+} commands[] = {
+ { "list", cmd_list },
+ { "add", cmd_add },
+ { "remove", cmd_remove },
+ { "check", cmd_check },
+ { "set", cmd_set },
+ { "unset", cmd_unset },
+ { "get", cmd_get },
+ { 0, 0 }
+};
+
+int
+main(int argc, char **_argv)
+{
+ while (1)
+ {
+ int g = getopt (argc, _argv, "hvqisem");
+ if (g == -1)
+ break;
+ switch (g)
+ {
+ case 'v':
+ verbose ++;
+ break;
+ case 'q':
+ quiet ++;
+ break;
+
+ case 'i':
+ key_type = KT_INT;
+ break;
+ case 's':
+ key_type = KT_STRING;
+ break;
+ case 'e':
+ key_type = KT_EXPAND;
+ break;
+ case 'm':
+ key_type = KT_MULTI;
+ break;
+
+ case '?':
+ case 'h':
+ usage();
+ }
+ }
+ if (_argv[optind] == NULL)
+ usage();
+
+ argv = _argv+optind;
+ int i;
+ for (i=0; commands[i].name; i++)
+ if (strcmp(commands[i].name, argv[0]) == 0)
+ {
+ argv++;
+ return commands[i].func();
+ }
+ usage();
+
+ return 0;
+}
diff --git a/winsup/utils/setfacl.c b/winsup/utils/setfacl.c
new file mode 100644
index 000000000..87c96aeac
--- /dev/null
+++ b/winsup/utils/setfacl.c
@@ -0,0 +1,377 @@
+
+#include <stdio.h>
+#include <ctype.h>
+#include <string.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <getopt.h>
+#include <pwd.h>
+#include <grp.h>
+#include <sys/types.h>
+#include <sys/acl.h>
+
+#ifndef BOOL
+#define BOOL int
+#endif
+
+#ifndef TRUE
+#define TRUE (1)
+#endif
+
+#ifndef FALSE
+#define FALSE (0)
+#endif
+
+#ifndef ILLEGAL_MODE
+#define ILLEGAL_MODE ((mode_t)0xffffffff)
+#endif
+
+typedef enum {
+ NoAction,
+ Set,
+ Modify,
+ Delete,
+ ModNDel,
+ SetFromFile
+} action_t;
+
+char *myname;
+
+int usage ()
+{
+ fprintf(stderr, "usage: %s [-r] -s acl_entries file...\n", myname);
+ fprintf(stderr, " %s [-r] -md acl_entries file...\n", myname);
+ fprintf(stderr, " %s [-r] -f acl_file file...\n", myname);
+ return 1;
+}
+
+mode_t getperm (char *in)
+{
+ if (isdigit (*in) && !in[1])
+ {
+ int i = atoi (in);
+ if (i < 0 || i > 7)
+ return ILLEGAL_MODE;
+ return i << 6 | i << 3 | i;
+ }
+ if (strlen (in) != 3)
+ return ILLEGAL_MODE;
+ if (!strchr ("r-", in[0])
+ || !strchr ("w-", in[1])
+ || !strchr ("x-", in[2]))
+ return ILLEGAL_MODE;
+ return (in[0] == 'r' ? S_IRUSR | S_IRGRP | S_IROTH : 0)
+ | (in[1] == 'w' ? S_IWUSR | S_IWGRP | S_IWOTH : 0)
+ | (in[2] == 'x' ? S_IXUSR | S_IXGRP | S_IXOTH : 0);
+}
+
+BOOL
+getaclentry (action_t action, char *c, aclent_t *ace)
+{
+ char *c2;
+
+ ace->a_type = 0;
+ ace->a_id = 0;
+ ace->a_perm = 0;
+
+ if (!strncmp (c, "default:", 8)
+ || !strncmp (c, "d:", 2))
+ {
+ ace->a_type = ACL_DEFAULT;
+ c = strchr (c, ':') + 1;
+ }
+ if (!strncmp (c, "user:", 5)
+ || !strncmp (c, "u:", 2))
+ {
+ ace->a_type |= USER_OBJ;
+ c = strchr (c, ':') + 1;
+ }
+ else if (!strncmp (c, "group:", 6)
+ || !strncmp (c, "g:", 2))
+ {
+ ace->a_type |= GROUP_OBJ;
+ c = strchr (c, ':') + 1;
+ }
+ else if (!strncmp (c, "mask:", 5)
+ || !strncmp (c, "m:", 2))
+ {
+ if (!(ace->a_type & ACL_DEFAULT))
+ return FALSE;
+ ace->a_type |= CLASS_OBJ;
+ c = strchr (c, ':') + 1;
+ }
+ else if (!strncmp (c, "other:", 6)
+ || !strncmp (c, "o:", 2))
+ {
+ if (!(ace->a_type & ACL_DEFAULT))
+ return FALSE;
+ ace->a_type |= OTHER_OBJ;
+ c = strchr (c, ':') + 1;
+ }
+ else
+ return FALSE;
+ if (ace->a_type & (USER_OBJ | GROUP_OBJ))
+ {
+ if (c2 = strchr (c, ':'))
+ {
+ if (action == Delete)
+ return FALSE;
+ *c2 = '\0';
+ }
+ else if (action != Delete)
+ return FALSE;
+ if (c2 == c)
+ {
+ if (action == Delete)
+ return FALSE;
+ }
+ else if (isdigit (*c))
+ {
+ char *c3;
+
+ ace->a_id = strtol (c, &c3, 10);
+ if (*c3)
+ return FALSE;
+ }
+ else if (ace->a_type & USER_OBJ)
+ {
+ struct passwd *pw = getpwnam (c);
+ if (!pw)
+ return FALSE;
+ ace->a_id = pw->pw_uid;
+ }
+ else
+ {
+ struct group *gr = getgrnam (c);
+ if (!gr)
+ return FALSE;
+ ace->a_id = gr->gr_gid;
+ }
+ if (ace->a_type & USER_OBJ)
+ {
+ ace->a_type &= ~USER_OBJ;
+ ace->a_type |= USER;
+ }
+ else
+ {
+ ace->a_type &= ~GROUP_OBJ;
+ ace->a_type |= GROUP;
+ }
+ if (c2)
+ c = c2 + 1;
+ }
+ if (action == Delete)
+ {
+ if ((ace->a_type & (CLASS_OBJ | OTHER_OBJ))
+ && *c)
+ return FALSE;
+ ace->a_perm = ILLEGAL_MODE;
+ return TRUE;
+ }
+ if ((ace->a_perm = getperm (c)) == ILLEGAL_MODE)
+ return FALSE;
+ return TRUE;
+}
+
+BOOL
+getaclentries (action_t action, char *buf, aclent_t *acls, int *idx)
+{
+ char *c;
+
+ if (action == SetFromFile)
+ {
+ FILE *fp;
+ char fbuf[256];
+
+ if (! (fp = fopen (buf, "r")))
+ return FALSE;
+ while (fgets (fbuf, 256, fp))
+ {
+ if (!getaclentry (action, fbuf, acls + (*idx)++))
+ {
+ fclose (fp);
+ return FALSE;
+ }
+ }
+ fclose (fp);
+ }
+ else
+ for (c = strtok (buf, ","); c; c = strtok (NULL, ","))
+ if (!getaclentry (action, c, acls + (*idx)++))
+ return FALSE;
+ return TRUE;
+}
+
+int
+searchace (aclent_t *aclp, int nentries, int type, int id)
+{
+ int i;
+
+ for (i = 0; i < nentries; ++i)
+ if ((aclp[i].a_type == type && (id < 0 || aclp[i].a_id == id))
+ || !aclp[i].a_type)
+ return i;
+ return -1;
+}
+
+int
+modacl (aclent_t *tgt, int tcnt, aclent_t *src, int scnt)
+{
+ int t, s, i;
+
+ for (s = 0; s < scnt; ++s)
+ {
+ t = searchace (tgt, MAX_ACL_ENTRIES, src[s].a_type,
+ (src[s].a_type & (USER | GROUP)) ? src[s].a_id : -1);
+ if (t < 0)
+ return -1;
+ if (src[s].a_perm == ILLEGAL_MODE)
+ {
+ if (t < tcnt)
+ {
+ for (i = t + 1; i < tcnt; ++i)
+ tgt[i - 1] = tgt[i];
+ --tcnt;
+ }
+ }
+ else
+ {
+ tgt[t] = src[s];
+ if (t >= tcnt)
+ ++tcnt;
+ }
+ }
+ return tcnt;
+}
+
+void
+setfacl (action_t action, char *path, aclent_t *acls, int cnt)
+{
+ aclent_t lacl[MAX_ACL_ENTRIES];
+ int lcnt;
+
+ memset (lacl, 0, sizeof lacl);
+ if (action == Set)
+ {
+ if (acl (path, SETACL, cnt, acls))
+ perror (myname);
+ return;
+ }
+ if ((lcnt = acl (path, GETACL, MAX_ACL_ENTRIES, lacl)) < 0
+ || (lcnt = modacl (lacl, lcnt, acls, cnt)) < 0
+ || (lcnt = acl (path, SETACL, lcnt, lacl)) < 0)
+ perror (myname);
+}
+
+int
+main (int argc, char **argv)
+{
+ extern char *optarg;
+ extern int optind;
+ int c;
+ action_t action = NoAction;
+ int ropt = 0;
+ aclent_t acls[MAX_ACL_ENTRIES];
+ int aclidx = 0;
+
+ myname = argv[0];
+ memset (acls, 0, sizeof acls);
+ while ((c = getopt (argc, argv, "d:f:m:rs:")) != EOF)
+ switch (c)
+ {
+ case 'd':
+ if (action == NoAction)
+ action = Delete;
+ else if (action == Modify)
+ action = ModNDel;
+ else
+ return usage ();
+ if (! getaclentries (Delete, optarg, acls, &aclidx))
+ {
+ fprintf (stderr, "%s: illegal acl entries\n", myname);
+ return 2;
+ }
+ break;
+ case 'f':
+ if (action == NoAction)
+ action = Set;
+ else
+ return usage ();
+ if (! getaclentries (SetFromFile, optarg, acls, &aclidx))
+ {
+ fprintf (stderr, "%s: illegal acl entries\n", myname);
+ return 2;
+ }
+ break;
+ case 'm':
+ if (action == NoAction)
+ action = Modify;
+ else if (action == Delete)
+ action = ModNDel;
+ else
+ return usage ();
+ if (! getaclentries (Modify, optarg, acls, &aclidx))
+ {
+ fprintf (stderr, "%s: illegal acl entries\n", myname);
+ return 2;
+ }
+ break;
+ case 'r':
+ if (!ropt)
+ ropt = 1;
+ else
+ return usage ();
+ break;
+ case 's':
+ if (action == NoAction)
+ action = Set;
+ else
+ return usage ();
+ break;
+ if (! getaclentries (Set, optarg, acls, &aclidx))
+ {
+ fprintf (stderr, "%s: illegal acl entries\n", myname);
+ return 2;
+ }
+ default:
+ return usage ();
+ }
+ if (action == NoAction)
+ return usage ();
+ if (optind > argc - 1)
+ return usage ();
+ if (action == Set)
+ switch (aclcheck (acls, aclidx, NULL))
+ {
+ case GRP_ERROR:
+ fprintf (stderr, "%s: more than one group entry.\n", myname);
+ return 2;
+ case USER_ERROR:
+ fprintf (stderr, "%s: more than one user entry.\n", myname);
+ return 2;
+ case CLASS_ERROR:
+ fprintf (stderr, "%s: more than one mask entry.\n", myname);
+ return 2;
+ case OTHER_ERROR:
+ fprintf (stderr, "%s: more than one other entry.\n", myname);
+ return 2;
+ case DUPLICATE_ERROR:
+ fprintf (stderr, "%s: duplicate additional user or group.\n", myname);
+ return 2;
+ case ENTRY_ERROR:
+ fprintf (stderr, "%s: invalid entry type.\n", myname);
+ return 2;
+ case MISS_ERROR:
+ fprintf (stderr, "%s: missing entries.\n", myname);
+ return 2;
+ case MEM_ERROR:
+ fprintf (stderr, "%s: out of memory.\n", myname);
+ return 2;
+ default:
+ break;
+ }
+ for (c = optind; c < argc; ++c)
+ setfacl (action, argv[c], acls, aclidx);
+ return 0;
+}
+
diff --git a/winsup/utils/strace.cc b/winsup/utils/strace.cc
new file mode 100644
index 000000000..e8d22f673
--- /dev/null
+++ b/winsup/utils/strace.cc
@@ -0,0 +1,481 @@
+#include <stdio.h>
+#include <fcntl.h>
+#include <getopt.h>
+#include <stdarg.h>
+#include <string.h>
+#include <stdlib.h>
+#include <windows.h>
+#include <signal.h>
+#include "sys/strace.h"
+
+static const char *pgm;
+static int forkdebug = 0;
+static int texterror = 0;
+
+static BOOL close_handle (HANDLE h, DWORD ok);
+
+#define CloseHandle(h) close_handle(h, 0)
+
+struct child_list
+ {
+ DWORD id;
+ HANDLE hproc;
+ struct child_list *next;
+ };
+
+child_list children = {0};
+
+static void
+warn (int geterrno, const char *fmt, ...)
+{
+ va_list args;
+ char buf[4096];
+
+ va_start (args, fmt);
+ sprintf (buf, "%s: ", pgm);
+ vsprintf (strchr (buf, '\0'), fmt, args);
+ if (geterrno)
+ perror (buf);
+ else
+ {
+ fputs (buf, stderr);
+ fputs ("\n", stderr);
+ }
+}
+
+static void __attribute__ ((noreturn))
+error (int geterrno, const char *fmt, ...)
+{
+ va_list args;
+ char buf[4096];
+
+ va_start (args, fmt);
+ sprintf (buf, "%s: ", pgm);
+ vsprintf (strchr (buf, '\0'), fmt, args);
+ if (geterrno)
+ perror (buf);
+ else
+ {
+ fputs (buf, stderr);
+ fputs ("\n", stderr);
+ }
+ ExitProcess (1);
+}
+
+DWORD lastid = 0;
+HANDLE lasth;
+
+#define PROCFLAGS \
+ PROCESS_ALL_ACCESS /*(PROCESS_DUP_HANDLE | PROCESS_TERMINATE | PROCESS_VM_READ | PROCESS_VM_WRITE)*/
+static void
+add_child (DWORD id, HANDLE hproc)
+{
+ child_list *c = children.next;
+ children.next = new (child_list);
+ children.next->next = c;
+ lastid = children.next->id = id;
+ HANDLE me = GetCurrentProcess ();
+ if (!DuplicateHandle (me, hproc, me, &children.next->hproc, PROCFLAGS,
+ FALSE, DUPLICATE_CLOSE_SOURCE))
+ error (0, "couldn't duplicate %p,%p", me, hproc);
+ lasth = children.next->hproc;
+}
+
+static HANDLE
+get_child_handle (DWORD id)
+{
+ child_list *c;
+ for (c = &children; (c = c->next) != NULL; )
+ if (c->id == id)
+ return c->hproc;
+
+ error (0, "no process id %d found", id);
+}
+
+static void
+remove_child (DWORD id)
+{
+ child_list *c;
+ if (id == lastid)
+ lastid = 0;
+ for (c = &children; c->next != NULL; c = c->next)
+ if (c->next->id == id)
+ {
+ child_list *c1 = c->next;
+ close_handle (c1->hproc, id);
+ c->next = c1->next;
+ delete c1;
+ return;
+ }
+
+ error (0, "no process id %d found", id);
+}
+
+#define LINE_BUF_CHUNK 128
+
+class linebuf
+{
+ size_t alloc;
+public:
+ size_t ix;
+ char *buf;
+ linebuf ()
+ {
+ ix = 0;
+ alloc = 0;
+ buf = NULL;
+ }
+ ~linebuf () {if (buf) free (buf);}
+ void add (const char *what, int len);
+ void add (const char *what) {add (what, strlen (what));}
+ void prepend (const char *what, int len);
+};
+
+void
+linebuf::add (const char *what, int len)
+{
+ size_t newix;
+ if ((newix = ix + len) >= alloc)
+ {
+ alloc += LINE_BUF_CHUNK + len;
+ buf = (char *) realloc (buf, alloc + 1);
+ }
+ memcpy (buf + ix, what, len);
+ ix = newix;
+ buf[ix] = '\0';
+}
+
+void
+linebuf::prepend (const char *what, int len)
+{
+ int buflen;
+ size_t newix;
+ if ((newix = ix + len) >= alloc)
+ {
+ alloc += LINE_BUF_CHUNK + len;
+ buf = (char *) realloc (buf, alloc + 1);
+ buf[ix] = '\0';
+ }
+ if ((buflen = strlen (buf)))
+ memmove (buf + len, buf, buflen + 1);
+ else
+ buf[newix] = '\0';
+ memcpy (buf, what, len);
+ ix = newix;
+}
+
+static void
+make_command_line (linebuf& one_line, char **argv)
+{
+ for (; *argv; argv++)
+ {
+ char *p = NULL;
+ const char *a = *argv;
+
+ int len = strlen (a);
+ if (len != 0 && !(p = strpbrk (a, " \t\n\r\"")))
+ one_line.add (a, len);
+ else
+ {
+ one_line.add ("\"", 1);
+ for (; p; a = p, p = strchr (p, '"'))
+ {
+ one_line.add (a, ++p - a);
+ if (p[-1] == '"')
+ one_line.add ("\"", 1);
+ }
+ if (*a)
+ one_line.add (a);
+ one_line.add ("\"", 1);
+ }
+ one_line.add (" ", 1);
+ }
+
+ if (one_line.ix)
+ one_line.buf[one_line.ix - 1] = '\0';
+ else
+ one_line.add ("", 1);
+}
+
+static DWORD child_pid;
+
+static BOOL WINAPI
+ctrl_c (DWORD type)
+{
+ static int tic = 1;
+ if ((tic ^= 1) && !GenerateConsoleCtrlEvent (CTRL_C_EVENT, 0))
+ error (0, "couldn't send CTRL-C to child, win32 error %d\n",
+ GetLastError ());
+ return TRUE;
+}
+
+static void
+create_child (char **argv)
+{
+ linebuf one_line;
+
+ STARTUPINFO si;
+ PROCESS_INFORMATION pi;
+ BOOL ret;
+ DWORD flags;
+
+ if (!*argv)
+ error (0, "no program argument specified");
+
+ memset (&si, 0, sizeof (si));
+ si.cb = sizeof (si);
+
+ /* cygwin32_conv_to_win32_path (exec_file, real_path);*/
+
+ flags = forkdebug ? 0 : DEBUG_ONLY_THIS_PROCESS;
+ flags |= /*CREATE_NEW_PROCESS_GROUP | */CREATE_DEFAULT_ERROR_MODE | DEBUG_PROCESS;
+
+ make_command_line (one_line, argv);
+
+ SetConsoleCtrlHandler (NULL, 0);
+ ret = CreateProcess (0,
+ one_line.buf,/* command line */
+ NULL, /* Security */
+ NULL, /* thread */
+ TRUE, /* inherit handles */
+ flags, /* start flags */
+ NULL,
+ NULL, /* current directory */
+ &si,
+ &pi);
+ if (!ret)
+ error (0, "error creating process %s, (error %d)", *argv, GetLastError());
+
+ CloseHandle (pi.hThread);
+ CloseHandle (pi.hProcess);
+ child_pid = pi.dwProcessId;
+ SetConsoleCtrlHandler (ctrl_c, 1);
+}
+
+static int
+output_winerror (FILE *ofile, char *s)
+{
+ char *winerr = strstr (s, "Win32 error ");
+ if (!winerr)
+ return 0;
+
+ DWORD errnum = atoi (winerr + sizeof ("Win32 error ") - 1);
+ if (!errnum)
+ return 0;
+
+ /*
+ * NOTE: Currently there is no policy for how long the
+ * the buffers are, and looks like 256 is a smallest one
+ * (dlfcn.cc). Other than error 1395 (length 213) and
+ * error 1015 (length 249), the rest are all under 188
+ * characters, and so I'll use 189 as the buffer length.
+ * For those longer error messages, FormatMessage will
+ * return FALSE, and we'll get the old behaviour such as
+ * ``Win32 error 1395'' etc.
+ */
+ char buf[4096];
+ if (!FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM
+ | FORMAT_MESSAGE_IGNORE_INSERTS,
+ NULL,
+ errnum,
+ MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT),
+ (LPTSTR) buf,
+ sizeof (buf),
+ NULL))
+ return 0;
+
+ /* Get rid the trailing CR/NL pair. */
+ char *p = strchr (buf, '\0');
+ p[-2] = '\n';
+ p[-1] = '\0';
+
+ *winerr = '\0';
+ fputs (s, ofile);
+ fputs (buf, ofile);
+ return 1;
+}
+
+static void __stdcall
+handle_output_debug_string (DWORD id, LPVOID p, unsigned mask, FILE *ofile)
+{
+ int len;
+ int special;
+ char alen[3 + 8 + 1];
+ DWORD nbytes;
+ HANDLE hchild = get_child_handle (id);
+ #define INTROLEN (sizeof (alen) - 1)
+
+ if (id == lastid && hchild != lasth)
+ warn (0, "%p != %p", hchild, lasth);
+
+ alen[INTROLEN] = '\0';
+ if (!ReadProcessMemory (hchild, p, alen, INTROLEN, &nbytes))
+#ifndef DEBUGGING
+ return;
+#else
+ error (0, "couldn't get message length from subprocess %d<%p>, windows error %d",
+ id, hchild, GetLastError ());
+#endif
+
+ if (strncmp (alen, "cYg", 3))
+ return;
+ len = (int) strtoul (alen + 3, NULL, 16);
+ if (!len)
+ return;
+
+ if (len > 0)
+ special = 0;
+ else
+ {
+ special = len;
+ if (special == _STRACE_INTERFACE_ACTIVATE_ADDR)
+ len = 17;
+ }
+
+ char *buf = (char *) alloca (len + 1);
+
+ if (!ReadProcessMemory (hchild, ((char *) p) + INTROLEN, buf, len, &nbytes))
+ error (0, "couldn't get message from subprocess, windows error %d",
+ GetLastError ());
+
+ buf[len] = '\0';
+ char *s = strtok (buf, " ");
+
+ unsigned n = strtoul (s, NULL, 16);
+
+ s = strchr (s, '\0') + 1;
+
+ if (special == _STRACE_INTERFACE_ACTIVATE_ADDR)
+ {
+ DWORD new_flag = 1;
+ if (!WriteProcessMemory (hchild, (LPVOID) n, &new_flag,
+ sizeof (new_flag), &nbytes))
+ error (0, "couldn't write strace flag to subprocess, windows error %d",
+ GetLastError ());
+ return;
+ }
+
+ if (mask & n)
+ /* got it */;
+ else if (!(mask & _STRACE_ALL) || (n & _STRACE_NOTALL))
+ return; /* This should not be included in "all" output */
+
+ if (!texterror || !output_winerror (ofile, s))
+ fputs (s, ofile);
+ fflush (ofile);
+}
+
+static void
+proc_child (unsigned mask, FILE *ofile)
+{
+ DEBUG_EVENT ev;
+ int processes = 0;
+ SetThreadPriority (GetCurrentThread (), THREAD_PRIORITY_HIGHEST);
+ while (1)
+ {
+ BOOL debug_event = WaitForDebugEvent (&ev, 1000);
+ if (!debug_event)
+ continue;
+
+ switch (ev.dwDebugEventCode)
+ {
+ case CREATE_PROCESS_DEBUG_EVENT:
+ if (ev.u.CreateProcessInfo.hFile)
+ CloseHandle (ev.u.CreateProcessInfo.hFile);
+ if (ev.u.CreateProcessInfo.hThread)
+ CloseHandle (ev.u.CreateProcessInfo.hThread);
+ add_child (ev.dwProcessId, ev.u.CreateProcessInfo.hProcess);
+ processes++;
+ break;
+
+ case CREATE_THREAD_DEBUG_EVENT:
+ if (ev.u.CreateThread.hThread)
+ CloseHandle (ev.u.CreateThread.hThread);
+ break;
+
+ case LOAD_DLL_DEBUG_EVENT:
+ if (ev.u.LoadDll.hFile)
+ CloseHandle (ev.u.LoadDll.hFile);
+ break;
+
+ case OUTPUT_DEBUG_STRING_EVENT:
+ handle_output_debug_string (ev.dwProcessId,
+ ev.u.DebugString.lpDebugStringData,
+ mask, ofile);
+ break;
+
+ case EXIT_PROCESS_DEBUG_EVENT:
+ remove_child (ev.dwProcessId);
+ break;
+ }
+ if (!ContinueDebugEvent (ev.dwProcessId, ev.dwThreadId,
+ DBG_CONTINUE))
+ error (0, "couldn't continue debug event, windows error %d",
+ GetLastError ());
+ if (ev.dwDebugEventCode == EXIT_PROCESS_DEBUG_EVENT && --processes == 0)
+ break;
+ }
+}
+
+static void
+dostrace (unsigned mask, FILE *ofile, char **argv)
+{
+ create_child (argv);
+ proc_child (mask, ofile);
+
+ return;
+}
+
+int
+main(int argc, char **argv)
+{
+ unsigned mask = 0;
+ FILE *ofile = NULL;
+ int opt;
+
+ if (!(pgm = strrchr (*argv, '\\')) && !(pgm = strrchr (*argv, '/')))
+ pgm = *argv;
+ else
+ pgm++;
+
+ while ((opt = getopt (argc, argv, "m:o:ft")) != EOF)
+ switch (opt)
+ {
+ case 'f':
+ forkdebug ^= 1;
+ break;
+ case 'm':
+ mask = strtoul (optarg, NULL, 16);
+ break;
+ case 'o':
+ if ((ofile = fopen (optarg, "w")) == NULL)
+ error (1, "can't open %s", optarg);
+#ifdef F_SETFD
+ (void) fcntl (fileno (ofile), F_SETFD, 0);
+#endif
+ break;
+ case 't':
+ texterror ^= 1;
+ break;
+ }
+
+ if (!mask)
+ mask = 1;
+
+ if (!ofile)
+ ofile = stdout;
+
+ dostrace (mask, ofile, argv + optind);
+}
+
+#undef CloseHandle
+
+static BOOL
+close_handle (HANDLE h, DWORD ok)
+{
+ child_list *c;
+ for (c = &children; (c = c->next) != NULL; )
+ if (c->hproc == h && c->id != ok)
+ error (0, "Closing child handle %p", h);
+ return CloseHandle (h);
+}
diff --git a/winsup/utils/umount.cc b/winsup/utils/umount.cc
new file mode 100644
index 000000000..c37e57ad0
--- /dev/null
+++ b/winsup/utils/umount.cc
@@ -0,0 +1,173 @@
+/* umount.cc
+
+ Copyright 1996, 1998, 1999 Cygnus Solutions.
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#include <stdio.h>
+#include <string.h>
+#include <sys/mount.h>
+#include <mntent.h>
+
+static void remove_all_mounts ();
+static void remove_all_automounts ();
+static void remove_all_user_mounts ();
+static void remove_all_system_mounts ();
+
+static const char *progname;
+
+static void
+usage (void)
+{
+ fprintf (stderr, "Usage %s [-s] <posixpath>\n", progname);
+ fprintf (stderr, "-s = remove mount point from system-wide registry location\n");
+ fprintf (stderr, "\n");
+ fprintf (stderr, "--remove-all-mounts = remove all mounts\n");
+ fprintf (stderr, "--remove-auto-mounts = remove all automatically mounted mounts\n");
+ fprintf (stderr, "--remove-user-mounts = remove all mounts in the current user mount registry area, including auto mounts\n");
+ fprintf (stderr, "--remove-system-mounts = Remove all mounts in the system-wide mount registry area\n");
+ exit (1);
+}
+
+int
+main (int argc, char **argv)
+{
+ int i;
+ int flags = 0;
+ progname = argv[0];
+
+ if (argc == 1)
+ usage ();
+
+ for (i = 1; i < argc; ++i)
+ {
+ if (argv[i][0] != '-')
+ break;
+
+ if (strcmp (argv[i], "-s") == 0)
+ {
+ flags |= MOUNT_SYSTEM;
+ }
+ else if (strcmp (argv[i], "--remove-all-mounts") == 0)
+ {
+ remove_all_mounts ();
+ exit (0);
+ }
+ else if (strcmp (argv[i], "--remove-user-mounts") == 0)
+ {
+ remove_all_user_mounts ();
+ exit (0);
+ }
+ else if (strcmp (argv[i], "--remove-system-mounts") == 0)
+ {
+ remove_all_system_mounts ();
+ exit (0);
+ }
+ else if (strcmp (argv[i], "--remove-auto-mounts") == 0)
+ {
+ remove_all_automounts ();
+ exit (0);
+ }
+ else
+ usage ();
+ }
+
+ if ((i + 1) != argc)
+ usage ();
+
+ if (cygwin_umount (argv[i], flags) != 0)
+ {
+ perror ("umount");
+ exit (1);
+ }
+
+ return 0;
+}
+
+/* remove_all_mounts: Unmount all mounts. */
+static void
+remove_all_mounts ()
+{
+ remove_all_user_mounts ();
+ remove_all_system_mounts ();
+}
+
+/* remove_all_automounts: Unmount all automounts. */
+static void
+remove_all_automounts ()
+{
+ FILE *m = setmntent ("/-not-used-", "r");
+ struct mntent *p;
+
+ while ((p = getmntent (m)) != NULL)
+ {
+ /* Remove the mount if it's an automount. */
+ if (strcmp (p->mnt_type, "user,auto") == 0)
+ {
+ cygwin_umount (p->mnt_dir, 0);
+ /* We've modified the table so we need to start over. */
+ endmntent (m);
+ m = setmntent ("/-not-used-", "r");
+ }
+ else if (strcmp (p->mnt_type, "system,auto") == 0)
+ {
+ cygwin_umount (p->mnt_dir, MOUNT_SYSTEM);
+ /* We've modified the table so we need to start over. */
+ endmntent (m);
+ m = setmntent ("/-not-used-", "r");
+ }
+ }
+
+ endmntent (m);
+}
+
+/* remove_all_user_mounts: Unmount all user mounts. */
+static void
+remove_all_user_mounts ()
+{
+ FILE *m = setmntent ("/-not-used-", "r");
+ struct mntent *p;
+ int err;
+
+ while ((p = getmntent (m)) != NULL)
+ {
+ /* Remove the mount if it's a user mount. */
+ if (strncmp (p->mnt_type, "user", 4) == 0)
+ {
+ err = cygwin_umount (p->mnt_dir, 0);
+
+ /* We've modified the table so we need to start over. */
+ endmntent (m);
+ m = setmntent ("/-not-used-", "r");
+ }
+ }
+
+ endmntent (m);
+}
+
+/* remove_all_system_mounts: Unmount all system mounts. */
+static void
+remove_all_system_mounts ()
+{
+ FILE *m = setmntent ("/-not-used-", "r");
+ struct mntent *p;
+
+ while ((p = getmntent (m)) != NULL)
+ {
+ /* Remove the mount if it's a system mount. */
+ if (strncmp (p->mnt_type, "system", 6) == 0)
+ {
+ cygwin_umount (p->mnt_dir, MOUNT_SYSTEM);
+
+ /* We've modified the table so we need to start over. */
+ endmntent (m);
+ m = setmntent ("/-not-used-", "r");
+ }
+ }
+
+ endmntent (m);
+}
diff --git a/winsup/utils/utils.sgml b/winsup/utils/utils.sgml
new file mode 100644
index 000000000..e045e6abb
--- /dev/null
+++ b/winsup/utils/utils.sgml
@@ -0,0 +1,657 @@
+<sect1 id="using-utils"><title>Cygwin Utilities</title>
+
+<para>Cygwin comes with a number of command-line utilities that are
+used to manage the UNIX emulation portion of the Cygwin environment.
+While many of these reflect their UNIX counterparts, each was written
+specifically for Cygwin.</para>
+
+<sect2 id="cygcheck"><title>cygcheck</title>
+
+<screen>
+Usage: cygcheck [-s] [-v] [-r] [-h] [program ...]
+ -s = system information
+ -v = verbose output (indented) (for -s or programs)
+ -r = registry search (requires -s)
+ -h = give help about the info
+You must at least give either -s or a program name
+</screen>
+
+<para>The <command>cygcheck</command> program is a diagnostic utility
+that examines your system and reports the information that is
+significant to the proper operation of Cygwin programs. It can give
+information about a specific program (or program) you are trying to
+run, general system information, or both. If you list one or more
+programs on the command line, it will diagnose the runtime environment
+of that program or programs. If you specify the <literal>-s</literal>
+option, it will give general system information. If you specify
+<literal>-s</literal> and list one or more programs on the command line,
+it reports on both.</para>
+
+<para>The <command>cygcheck</command> program should be used to send
+information about your system to Cygnus for troubleshooting (if your
+support representative requests it). When asked to run this command,
+include all the options plus any commands you are having trouble with,
+and save the output so that you can mail it to Cygnus, like
+this:</para>
+
+<screen>
+<prompt>C:\Cygnus&gt;</prompt> <userinput>cygcheck -s -v -r -h &gt; tocygnus.txt</userinput>
+</screen>
+
+<para>The <literal>-v</literal> option causes the output to be more
+verbose. What this means is that additional information will be
+reported which is usually not interesting, such as the internal
+version numbers of DLLs, additional information about recursive DLL
+usage, and if a file in one directory in the PATH also occurs in other
+directories on the PATH. </para>
+
+<para>The <literal>-r</literal> option causes
+<command>cygcheck</command> to search your registry for information
+that is relevent to Cygnus programs. These registry entries are the
+ones that have "Cygnus" in the name. If you are paranoid about
+privacy, you may remove information from this report, but please keep
+in mind that doing so makes it harder for Cygnus to diagnose your
+problems.</para>
+
+<para>The <literal>-h</literal> option prints additional helpful
+messages in the report, at the beginning of each section. It also
+adds table column headings. While this is useful information, it also
+adds some to the size of the report, so if you want a compact report
+or if you know what everything is already, just leave this out.</para>
+
+</sect2>
+
+<sect2 id="cygpath"><title>cygpath</title>
+
+<screen>
+Usage: cygpath [-p|--path] (-u|--unix)|(-w|--windows) filename
+ cygpath [-v|--version]
+ -u|--unix print UNIX form of filename
+ -w|--windows print Windows form of filename
+ -p|--path filename argument is a path
+ -v|--version print program version
+</screen>
+
+<para>The <command>cygpath</command> program is a utility that
+converts Windows native filenames to Cygwin POSIX-style pathnames and
+back. It can be used when a Cygwin program needs to pass a file name
+to a native Windows program, or expects to get a file name from a
+native Windows program. You may use the long or short option names
+interchangeably, even though only the short ones are described
+here.</para>
+
+<para>The <literal>-u</literal> and <literal>-w</literal> options
+indicate whether you want a conversion from Windows to UNIX (POSIX)
+format (<literal>-u</literal>) or a conversion from UNIX (POSIX) to
+Windows format (<literal>-w</literal>). You must give exactly
+one of these. To give neither or both is an error.</para>
+
+<para>The <literal>-p</literal> option means that you want to convert
+a path-style string rather than a single filename. For example, the
+PATH environment variable is semicolon-delimited in Windows, but
+colon-delimited in UNIX. By giving <literal>-p</literal> you are
+instructing <command>cygpath</command> to convert between these
+formats.</para>
+
+<example><title>Example cygpath usage</title>
+<screen>
+#!/bin/sh
+for i in `echo *.exe | sed 's/\.exe/cc/'`
+do
+ notepad `cygpath -w $i`
+done
+</screen>
+</example>
+
+</sect2>
+
+<sect2 id="kill"><title>kill</title>
+
+<screen>
+Usage: kill [-sigN] pid1 [pid2 ...]
+</screen>
+
+<para>The <command>kill</command> program allows you to send arbitrary
+signals to other Cygwin programs. The usual purpose is to end a
+running program from some other window when ^C won't work, but you can
+also send program-specified signals such as SIGUSR1 to trigger actions
+within the program, like enabling debugging or re-opening log files.
+Each program defines the signals they understand.</para>
+
+<para>Note that the "pid" values are the Cygwin pids, not the Windows
+pids. To get a list of running programs and their Cygwin pids, use
+the Cygwin <command>ps</command> program.</para>
+
+<para>To send a specific signal, use the
+<literal>-signN</literal> option, either
+with a signal number or a signal name (minus the "SIG" part), like
+these examples:</para>
+
+<example><title>Specifying signals with the kill command</title>
+<screen>
+<prompt>$</prompt> <userinput>kill 123</userinput>
+<prompt>$</prompt> <userinput>kill -1 123</userinput>
+<prompt>$</prompt> <userinput>kill -HUP 123</userinput>
+</screen>
+</example>
+
+<para>Here is a list of available signals, their numbers, and some
+commentary on them, from the file
+<literal>&lt;sys/signal.h&gt;</literal>, which should be considered
+the official source of this information.</para>
+
+<screen>
+SIGHUP 1 hangup
+SIGINT 2 interrupt
+SIGQUIT 3 quit
+SIGILL 4 illegal instruction (not reset when caught)
+SIGTRAP 5 trace trap (not reset when caught)
+SIGABRT 6 used by abort
+SIGEMT 7 EMT instruction
+SIGFPE 8 floating point exception
+SIGKILL 9 kill (cannot be caught or ignored)
+SIGBUS 10 bus error
+SIGSEGV 11 segmentation violation
+SIGSYS 12 bad argument to system call
+SIGPIPE 13 write on a pipe with no one to read it
+SIGALRM 14 alarm clock
+SIGTERM 15 software termination signal from kill
+SIGURG 16 urgent condition on IO channel
+SIGSTOP 17 sendable stop signal not from tty
+SIGTSTP 18 stop signal from tty
+SIGCONT 19 continue a stopped process
+SIGCHLD 20 to parent on child stop or exit
+SIGCLD 20 System V name for SIGCHLD
+SIGTTIN 21 to readers pgrp upon background tty read
+SIGTTOU 22 like TTIN for output if (tp-&gt;t_local&amp;LTOSTOP)
+SIGIO 23 input/output possible signal
+SIGPOLL 23 System V name for SIGIO
+SIGXCPU 24 exceeded CPU time limit
+SIGXFSZ 25 exceeded file size limit
+SIGVTALRM 26 virtual time alarm
+SIGPROF 27 profiling time alarm
+SIGWINCH 28 window changed
+SIGLOST 29 resource lost (eg, record-lock lost)
+SIGUSR1 30 user defined signal 1
+SIGUSR2 31 user defined signal 2
+</screen>
+
+</sect2>
+
+<sect2 id="mkgroup"><title>mkgroup</title>
+
+<screen>
+usage: mkgroup &lt;options&gt; [domain]
+This program prints group information to stdout
+Options:\n");
+ -l,--local print pseudo group information if there is
+ no domain
+ -d,--domain print global group information from the domain
+ specified (or from the current domain if there is
+ no domain specified)
+ -?,--help print this message
+</screen>
+
+<para>The <command>mkgroup</command> program can be used to help
+configure your Windows system to be more UNIX-like by creating an
+initial <filename>/etc/group</filename> substitute (some commands need this
+file) from your system information. It only works on NT.
+To initially set up your machine,
+you'd do something like this:</para>
+
+<example><title>Setting up the groups file</title>
+<screen>
+<prompt>$</prompt> <userinput>mkdir /etc</userinput>
+<prompt>$</prompt> <userinput>mkgroup -l &gt; /etc/group</userinput>
+</screen>
+</example>
+
+<para>Note that this information is static. If you change the group
+information in your system, you'll need to regenerate the group file
+for it to have the new information.</para>
+
+<para>The <literal>-d</literal> and <literal>-l</literal> options
+allow you to specify where the information comes from, either the
+local machine or the default (or given) domain.</para>
+
+</sect2>
+
+<sect2 id="mkpasswd"><title>mkpasswd</title>
+
+<screen>
+Usage: mkpasswd [options] [domain]
+This program prints a /etc/passwd file to stdout
+Options are
+ -l,--local print local accounts
+ -d,--domain print domain accounts (from current domain
+ if no domain specified
+ -g,--local-groups print local group information too
+ -?,--help displays this message
+This program does only work on Windows NT
+</screen>
+
+<para>The <command>mkpasswd</command> program can be used to help
+configure your Windows system to be more UNIX-like by creating an
+initial <filename>/etc/passwd</filename> substitute (some commands
+need this file) from your system information. It only works on NT.
+To initially set up your machine, you'd do something like this:</para>
+
+<example><title>Setting up the passwd file</title>
+<screen>
+<prompt>$</prompt> <userinput>mkdir /etc</userinput>
+<prompt>$</prompt> <userinput>mkpasswd -l &gt; /etc/passwd</userinput>
+</screen>
+</example>
+
+<para>Note that this information is static. If you change the user
+information in your system, you'll need to regenerate the passwd file
+for it to have the new information.</para>
+
+<para>The <literal>-d</literal> and <literal>-l</literal> options
+allow you to specify where the information comes from, either the
+local machine or the default (or given) domain.</para>
+
+</sect2>
+
+<sect2 id="passwd"><title>passwd</title>
+
+<screen>
+Usage passwd [name]
+ passwd [-x max] [-n min] [-i inact] [-L len]
+ passwd {-l|-u|-S} name
+ -x max set max age of passwords
+ -n min set min age of passwords
+ -i inact disables account after inact days of expiry
+ -L len set min password length
+ -l lock an account
+ -u unlock an account
+ -S show account information
+</screen>
+
+<para> <command>passwd</command> changes passwords for user accounts.
+A normal user may only change the password for their own account,
+the administrators may change the password for any account.
+<command>passwd</command> also changes account information, such as
+password expiry dates and intervals.</para>
+
+<para>Password changes: The user is first prompted for their old
+password, if one is present. This password is then encrypted and
+compared against the stored password. The user has only one chance to
+enter the correct password. The administrators are permitted to
+bypass this step so that forgotten passwords may be changed.</para>
+
+<para>The user is then prompted for a replacement password.
+<command>passwd</command> will prompt again and compare the second entry
+against the first. Both entries are require to match in order for the
+password to be changed.</para>
+
+<para>After the password has been entered, password aging information
+is checked to see if the user is permitted to change their password
+at this time. If not, <command>passwd</command> refuses to change the
+password and exits.</para>
+
+<para>Password expiry and length: The password aging information may be
+changed by the administrators with the <literal>-x</literal>,
+<literal>-n</literal> and <literal>-i</literal> options. The
+<literal>-x</literal> option is used to set the maximum number of days
+a password remains valid. After <emphasis>max</emphasis> days, the
+password is required to be changed. The <literal>-n</literal> option is
+used to set the minimum number of days before a password may be changed.
+The user will not be permitted to change the password until
+<emphasis>min</emphasis> days have elapsed. The <literal>-i</literal>
+option is used to disable an account after the password has been expired
+for a number of days. After a user account has had an expired password
+for <emphasis>inact</emphasis> days, the user may no longer sign on to
+the account. Allowed values for the above options are 0 to 999. The
+<literal>-L</literal> option sets the minimum length of allowed passwords
+for users, which doesn't belong to the administrators group, to
+<emphasis>len</emphasis> characters. Allowed values for the minimum
+password length are 0 to 14. In any of the above cases, a value of 0
+means `no restrictions'.</para>
+
+<para>Account maintenance: User accounts may be locked and unlocked with the
+<literal>-l</literal> and <literal>-u</literal> flags. The
+<literal>-l</literal> option disables an account. The <literal>-u</literal>
+option re-enables an account.</para>
+
+<para>The account status may be given with the <literal>-S</literal>
+option. The status information is self explanatory.</para>
+
+<para>Limitations: Users may not be able to change their password on
+some systems.</para>
+
+</sect2>
+
+<sect2 id="mount"><title>mount</title>
+
+<screen>
+Usage mount
+ mount [-bfs] &lt;win32path&gt; &lt;posixpath&gt;
+ mount [-bs] --change-cygdrive-prefix&lt;posixpath&gt;
+ mount --import-old-mounts
+
+ -b = text files are equivalent to binary files (newline = \n)
+ -x = files in the mounted directory are automatically given execute permission.
+ -f = force mount, don't warn about missing mount point directories
+ -s = add mount point to system-wide registry location
+ --change-automount-prefix = change path prefix used for automatic mount points
+ --import-old-mounts = copy old registry mount table mounts into the current mount areas
+
+ When invoked without any arguments, mount displays the current mount table.
+</screen>
+
+<para>The <command>mount</command> program is used to map your drives
+and shares onto Cygwin's simulated POSIX directory tree, much like as is
+done by mount commands on typical UNIX systems. Please see
+<Xref Linkend="mount-table"> for more information on the concepts
+behind the Cygwin POSIX file system and strategies for using
+mounts.</para>
+
+<sect3><title>Using mount</title>
+
+<para>If you just type <command>mount</command> with no parameters, it
+will display the current mount table for you.</para>
+
+<example>
+<title>Displaying the current set of mount points</title>
+<screen>
+<prompt>c:\cygnus\&gt;</prompt> <userinput>mount</userinput>
+Device Directory Type Flags
+D: /d user textmode
+C: / system textmode
+</screen>
+</example>
+
+<para>In this example, the C
+drive is the POSIX root and D drive is mapped to
+<filename>/d</filename>. Note that in this case, the root mount is a
+system-wide mount point that is visible to all users running Cygwin
+programs, whereas the <filename>/d</filename> mount is only visible
+to the current user.</para>
+
+<para>The <command>mount</command> utility is also the mechanism for
+adding new mounts to the mount table. The following example
+demonstrates how to mount the directory
+<filename>C:\cygnus\cygwin-b20\H-i586-cygwin32\bin</filename>
+to <filename>/bin</filename> and the network directory
+<filename>\\pollux\home\joe\data</filename> to <filename>/data</filename>.
+<filename>/bin</filename> is assumed to already exist.</para>
+
+<example>
+<title>Adding mount points</title>
+<screen>
+<prompt>c:\cygnus\&gt;</prompt> <userinput>ls /bin /data</userinput>
+ls: /data: No such file or directory
+<prompt>c:\cygnus\&gt;</prompt> <userinput>mount C:\cygnus\cygwin-b20\H-i586-cygwin32\bin /bin</userinput>
+<prompt>c:\cygnus\&gt;</prompt> <userinput>mount \\pollux\home\joe\data /data</userinput>
+Warning: /data does not exist!
+<prompt>c:\cygnus\&gt;</prompt> <userinput>mount</userinput>
+Device Directory Type Flags
+\\pollux\home\joe\data /data user textmode
+C:\cygnus\cygwin-b20\H-i586-cygwin32\bin /bin user textmode
+D: /d user textmode
+\\.\tape1: /dev/st1 user textmode
+\\.\tape0: /dev/st0 user textmode
+\\.\b: /dev/fd1 user textmode
+\\.\a: /dev/fd0 user textmode
+C: / system textmode
+<prompt>c:\cygnus\&gt;</prompt> <userinput>ls /bin/sh</userinput>
+/bin/sh
+</screen>
+</example>
+
+<para>Note that <command>mount</command> was invoked from the Windows
+command shell in the previous example. In many Unix shells, including
+bash, it is legal and convenient to use the forward "/" in Win32
+pathnames since the "\" is the shell's escape character. </para>
+
+<para>The "-s" flag to <command>mount</command> is used to add a mount
+in the system-wide mount table used by all Cygwin users on the system,
+instead of the user-specific one. System-wide mounts are displayed
+by <command>mount</command> as being of the "system" type, as is the
+case for the <filename>/</filename> partition in the last example.
+Under Windows NT, only those users with Administrator priviledges are
+permitted to modify the system-wide mount table.</para>
+
+<para>Note that a given POSIX path may only exist once in the user
+table and once in the global, system-wide table. Attempts to replace
+the mount will fail with a busy error. The "-f" (force) flag causes
+the old mount to be silently replaced with the new one. It will also
+silence warnings about the non-existence of directories at the Win32
+path location.</para>
+
+<para>The "-b" flag is used to instruct Cygwin to treat binary and
+text files in the same manner by default. Binary mode mounts are
+marked as "binmode" in the Flags column of <command>mount</command>
+output. By default, mounts are in text mode ("textmode" in the Flags
+column).
+
+<para>The "-x" flag is used to instruct Cygwin that the mounted file
+is "executable". If the "-x" flag is used with a directory then
+all files in the directory are executable. Files ending in certain
+extensions (.exe, .com, .bat, .cmd) are assumed to be executable
+by default. Files whose first two characters begin with '#!' are
+also considered to be executable. This option allows other files
+to be marked as executable and avoids the overhead of opening each
+file to check for a '#!'.
+
+</sect3>
+
+<sect3><title>Cygdrive mount points</title>
+
+<para>Whenever Cygwin cannot use any of the existing mounts to convert
+from a particular Win32 path to a POSIX one, Cygwin will, instead,
+convert to a POSIX path using a default mount point:
+<filename>/cygdrive</filename>. For example, if Cygwin accesses
+<filename>Z:\foo</filename> and the Z drive is not currently in the
+mount table, then <filename>Z:\</filename> will be accessible as
+<filename>/cygdrive/Z</filename>. The default prefix of
+<filename>/cygdrive</filename> may be changed via the
+<Xref Linkend="mount"> command.</para>
+
+<para>The <command>mount</command> utility can be used to change this
+default automount prefix through the use of the
+"--change-cygdrive-prefix" flag. In the following example, we will
+set the automount prefix to <filename>/</filename>:</para>
+
+<example>
+<title>Changing the default prefix</title>
+<screen>
+<prompt>c:\cygnus\&gt;</prompt> <userinput>mount --change-cygdrive-prefix /</userinput>
+</screen>
+</example>
+
+<para>Note that you if you set a new prefix in this manner, you can
+specify the "-s" flag to make this the system-wide default prefix. By
+default, the cygdrive-prefix applies only to the current user. In the
+same way, you can specify the "-b" flag such that all new automounted
+filesystems default to binary mode file accesses.</para>
+
+<sect3><title>Limitations</title>
+
+<para>Limitations: there is a hard-coded limit of 30 mount
+points. Also, although you can mount to pathnames that do not start
+with "/", there is no way to make use of such mount points.</para>
+
+<para>Normally the POSIX mount point in Cygwin is an existing empty
+directory, as in standard UNIX. If this is the case, or if there is a
+place-holder for the mount point (such as a file, a symbolic link
+pointing anywhere, or a non-empty directory), you will get the expected
+behavior. Files present in a mount point directory before the mount
+become invisible to Cygwin programs.
+</para>
+
+<para>It is sometimes desirable to mount to a non-existent directory,
+for example to avoid cluttering the root directory with names
+such as
+<filename>a</filename>, <filename>b</filename>, <filename>c</filename>
+pointing to disks.
+Although <command>mount</command> will give you a warning, most
+everything will work properly when you refer to the mount point
+explicitly. Some strange effects can occur however.
+For example if your current working directory is
+<filename>/dir</filename>,
+say, and <filename>/dir/mtpt</filename> is a mount point, then
+<filename>mtpt</filename> will not show up in an <command>ls</command>
+or
+<command>echo *</command> command and <command>find .</command> will
+not
+find <filename>mtpt</filename>.
+</para>
+
+</sect3>
+
+</sect2>
+
+<sect2 id="ps"><title>ps</title>
+
+<screen>
+Usage ps [-aefl] [-u uid]
+ -f show process uids, ppids
+ -l show process uids, ppids, pgids, winpids
+ -u uid list processes owned by uid
+ -a, -e show processes of all users
+</screen>
+
+<para>The <command>ps</command> program gives the status of all the
+Cygwin processes running on the system (ps = "process status"). Due
+to the limitations of simulating a POSIX environment under Windows,
+there is little information to give. The PID column is the process ID
+you need to give to the <command>kill</command> command. The WINPID
+column is the process ID that's displayed by NT's Task Manager
+program.</para>
+
+</sect2>
+
+<sect2 id="umount"><title>umount</title>
+
+<screen>
+Usage umount [-s] &lt;posixpath&gt;
+-s = remove mount point from system-wide registry location
+
+--remove-all-mounts = remove all mounts
+--remove-auto-mounts = remove all automatically mounted mounts
+--remove-user-mounts = remove all mounts in the current user mount registry area, including auto mounts
+--remove-system-mounts = Remove all mounts in the system-wide mount registry area
+</screen>
+
+<para>The <command>umount</command> program removes mounts from the
+mount table. If you specify a POSIX path that corresponds to a
+current mount point, <command>umount</command> will remove it from the
+user-specific registry area. The -s flag may be used to specify
+removing the mount from the system-wide registry area instead
+(Administrator priviledges are required).</para>
+
+<para>The <command>umount</command> utility may also be used to remove
+all mounts of a particular type. With the extended options it is
+possible to remove all mounts, all automatically-mounted mounts, all
+mounts in the current user's registry area, or all mounts in the
+system-wide registry area (with Administrator priviledges).</para>
+
+<para>See <Xref Linkend="mount">) for more information on the mount
+table.</para>
+</sect2>
+
+<sect2 id="strace"><title>strace</title>
+
+<screen>
+Usage strace [-m mask] [-o output-file] [ft] program [args...]
+
+-m mask mask for reporting cygwin events (default 1)
+-o output-file output file to hold strace events (default stderr)
+-f follow forked subprocesses
+-t convert Win32 error messages to text
+-s remove mount point from system-wide registry location
+</screen>
+
+<para>The <command>strace</command> program executes a program, and
+optionally the children of the program, reporting any Cygwin DLL output
+from the program(s) to file. This program is mainly useful for debugging
+the Cygwin DLL itself.
+
+The mask argument is a hexadecimal string signifying which events should be
+reported. The valid bits to set are as follows:
+</para>
+
+<screen>
+ Bit Explanation
+0x00000001 All strace output is collected
+0x00000002 Unusual or weird phenomenon
+0x00000010 System calls
+0x00000020 argv/envp printout at startup
+0x00000040 Information useful for DLL debugging
+0x00000080 Paranoid information
+0x00000100 Termios debbugging
+0x00000200 Select() function debugging
+0x00000400 Window message debugging
+0x00000800 Signal and process handling
+0x00001000 Very minimal strace output
+0x00020000 Malloc calls
+0x00040000 Thread locking calls
+</screen>
+</sect2>
+
+<sect2 id="regtool"><title>regtool</title>
+
+<screen>
+regtool -h - print this message
+regtool [-v] list [key] - list subkeys and values
+regtool [-v] add [key\subkey] - add new subkey
+regtool [-v] remove [key] - remove key
+regtool [-v|-q] check [key] - exit 0 if key exists, 1 if not
+regtool [-i|-s|-e|-m] set [key\value] [data ...] - set value
+ -i=integer -s=string -e=expand-string -m=multi-string
+regtool [-v] unset [key\value] - removes value from key
+regtool [-q] get [key\value] - prints value to stdout
+ -q=quiet, no error msg, just return nonzero exit if key/value missing
+keys are like \prefix\key\key\key\value, where prefix is any of:
+ root HKCR HKEY_CLASSES_ROOT
+ config HKCC HKEY_CURRENT_CONFIG
+ user HKCU HKEY_CURRENT_USER
+ machine HKLM HKEY_LOCAL_MACHINE
+ users HKU HKEY_USERS
+example: \user\software\Microsoft\Clock\iFormat
+</screen>
+
+<para>The <command>regtool</command> program allows shell scripts
+to access and modify the Windows registry. Note that modifying the
+Windows registry is dangerous, and carelessness here can result
+in an unusable system. Be careful.</para>
+
+<para>The <literal>-v</literal> option means "verbose". For most
+commands, this causes additional or lengthier messages to be printed.
+Conversely, the <literal>-q</literal> option supresses error messages,
+so you can use the exit status of the program to detect if a key
+exists or not (for example).</para>
+
+<para>The <literal>list</literal> command lists the subkeys and values
+belonging to the given key. The <literal>add</literal> command adds a
+new key. The <literal>remove</literal> command removes a key. Note
+that you may need to remove everything in the key before you may
+remove it, but don't rely on this stopping you from accidentally
+removing too much. The <literal>check</literal> command checks to see
+if a key exists (the exit code of the program is zero if it does,
+nonzero if it does not).</para>
+
+<para>The <literal>set</literal> command sets a value within a key.
+<literal>-i</literal> means the value is an integer (DWORD).
+<literal>-s</literal> means the value is a string.
+<literal>-e</literal> means it's an expanding string (it contains
+embedded environment variables). <literal>-m</literal> means it's a
+multi-string (list). If you don't specify one of these, it tries to
+guess the type based on the value you give. If it looks like a
+number, it's a number. If it starts with a percent, it's an expanding
+string. If you give multiple values, it's a multi-string. Else, it's
+a regular string.</para>
+
+<para>The <literal>unset</literal> command removes a value from a key.
+The <literal>get</literal> command gets the value of a value of a key,
+and prints it (and nothing else) to stdout. Note: if the value
+doesn't exist, an error message is printed and the program returns a
+non-zero exit code. If you give <literal>-q</literal>, it doesn't
+print the message but does return the non-zero exit code.</para>
+
+</sect2>
+
+</sect1>
+
diff --git a/winsup/w32api/ChangeLog b/winsup/w32api/ChangeLog
new file mode 100644
index 000000000..7831a8936
--- /dev/null
+++ b/winsup/w32api/ChangeLog
@@ -0,0 +1,1006 @@
+2000-02-11 Axel Riese <ariese@andromeda.risc.uni-linz.ac.at>
+
+ * oaidl.h (LPTYPECOMP): Remove multiple definition.
+
+2000-02-03 Mumit Khan <khan@xraylith.wisc.edu>
+
+ * Snapshot 2000-02-03.
+
+2000-01-21 Chris Faylor <cgf@cygnus.com>
+
+ * include/winnt.h: Add ARM support.
+
+2000-01-19 Mumit Khan <khan@xraylith.wisc.edu>
+
+ From Greg Primes <gregory.l.priem@intel.com>:
+ * include/oaidl.h (DESCKIND): Define macro.
+ (ITypeComp): Define interface.
+ (ITypeComp): Likewise.
+ * rpcndr.h (DECLSPEC_UUID): Define macro.
+ (MIDL_INTERFACE): Likewise.
+
+ * include/psapi.h: New file.
+ * include/imagehlp.h: New file.
+ * lib/imagehlp.def: New file.
+
+ * include/oaidl.h (tagVARIANT): Update fields.
+
+ From Craig Lanning <CraigL@DyCon.com>:
+ * include/commctrl.h: Add some TCS_* macros.
+ * include/winnls.h (IsValidLocale): Add prototype.
+
+2000-01-18 Mumit Khan <khan@xraylith.wisc.edu>
+
+ * include/oaidl.h: OLE Patches from "Fifer, Eric"
+ <EFifer@sanwaint.com> needed to build Win32::OLE perl module.
+ * include/objbase.h: Likewise.
+ * include/objidl.h: Likewise.
+ * include/ocidl.h: New file.
+ * include/oleauto.h: Likewise.
+ * include/wtypes.h: Likewise.
+ * lib/oleaut32.def: Likewise.
+
+ * include/lmserver.h (NetServerTransportAddEx): Fix prototype.
+ Thanks to "Jon Leichter" <jon@symas.com>.
+ * include/commctrl.h (LVM_FINDITEM): Fix typo in macro.
+ * include/winbase.h: Add GetLongPathName{A,W} prototypes.
+ * include/shellapi.h (SHGetFileInfo): Add macro. Thanks to
+ "Axel Riese" <ariese@andromeda.risc.uni-linz.ac.at>.
+ (CommandLineToArgvW): Fix prototype. Thanks to "Frans E. van
+ Dorsselaer" <frans@bia-bv.demon.nl>.
+ * include/httpext.h: New file. Thanks to Jan Nijtmans
+ <j.nijtmans@chello.nl>.
+ * include/mmsystem.h (WAVEFORMATEX): Guard definition to avoid
+ redefinition of LPCWAVEFORMATEX in DirectX headers.
+ (CALLBACK_NULL): Define to be 0. Thanks to Krzysztof Nikiel
+ <krzych00@priv7.onet.pl>.
+ * include/sqlext.h (SQLDriverConnnect): Fix prototype.
+ * include/windef.h (HRESULT): Guard definition to avoid
+ redefinition in DirectX headers.
+ * include/winnt.h: Add target macros from windows.h.
+ * include/windows.h: Update synch comment for target macros.
+ (_ANONYMOUS_STRUCT): Define for GCC 2.95 and newer.
+ (_ANONYMOUS_UNION): Likewise.
+ * include/wingdi.h (AbortPrinter): Move from here ...
+ * include/winspool.h (AbortPrinter): to here and fix linkage.
+ (MONITOR_INFO_2{A,W}): Define.
+ * include/winsock.h (htons): Fix argument.
+ (htonl): Likewise.
+ * include/winsock2.h (SO_*, MAX_*, WSA_*): Add macros.
+ (GROUP): Define.
+ (GUID): Define conditionally.
+ (WSAPROTOCOLCHAIN, WSAPROTOCOL_INFO): Define.
+ (WSASocket*): Declare.
+ * include/basetyps.h (GUID): Guard REGUID and LPGUID as well.
+
+ * lib/dsetup.def: Remove leading underscore.
+ * lib/dsound.def: Likewise.
+ * lib/ws2_32.def: Likewise.
+
+Wed Dec 22 02:53:22 1999 Mumit Khan <khan@xraylith.wisc.edu>
+
+ * include/windef.h (HMONITOR, HTERMINAL, HWINEVENTHOOK): Define
+ handles.
+
+ * lib/Makefile.in (EXTRA_OBJS): Add dinput.o.
+ * lib/dinput.c: Include windows.h for GCC.
+ * lib/dxguid.c: Likewise.
+ (INITGUID): Define macro.
+
+ * include/objidl.h (ISequentialStream): Define interface.
+ (IStream): Derive from ISequentialStream.
+
+ * include/objidl.h (IStream::{LockRegion, UnlockRegion, Stat,
+ Clone}): Mark as PURE.
+ (IDataObject::EnumDAdvise): Likewise.
+ * include/oleidl.h (IDropSource::GiveFeedback): Likewise.
+ (IViewObject::Unfreeze): Likewise.
+ (IViewObject2::Unfreeze): Likewise.
+
+ * include/objidl.h: Add various IID_ declarations.
+ * include/olectl.h: Likewise.
+ * include/oleidl.h: Likewise.
+
+Tue Dec 21 02:22:14 1999 Mumit Khan <khan@xraylith.wisc.edu>
+
+ * Snapshot 1999-12-21.
+
+ * include/winbase.h (CancelIO): Rename to CancelIo.
+ * include/winsvc.h (LPHANDLER_FUNCTION): Fix prototype.
+ * include/winuser.h (PEVENTMSG, LPEVENTMSG): Declare.
+
+ * Merge with winsup-19991218.
+ * include/winnt.h: Add defines for W2K ACL control flags.
+
+ * Merge with Anders Norlander's 19991130 snapshot.
+
+ * include/windows.h: #include mmsystem.h ifndef WIN32_LEAN_AND_MEAN.
+ * include/winbase.h (EXCEPTION_INVALID_HANDLE): Define.
+
+ Patch from Harold Weissfield
+ * include/shellapi.h: Added some ABN_* defines.
+
+ * include/commctrl.h (_TrackMouseEvent): Add prototype.
+ * lib/comctl32.def (_TrackMouseEvent): Import.
+ * include/winuser.h: Misc. fixes from Sang Cho
+ <sangcho@alpha94.chongju.ac.kr>.
+ * include/winuser.h (SM_CMETRICS): Define to 76 or 83 depending on
+ value of _WIN32_WINNT.
+ * include/winuser.h: Reorganize SM_* defines in numerical order.
+
+Tue Dec 14 21:58:03 1999 Mumit Khan <khan@xraylith.wisc.edu>
+
+ * include/windef.h: Make RECTL a distinct type from RECT.
+ * include/windows.h: Define upto 8 DUMMYUNIONNAMEs for DirectX.
+ * include/winuser.h (CDS_): Update (Franco Bez <franco.bez@gmx.de>).
+ (COMPAREITEMSTRUCT): Fix fields.
+ (SERIALKEYSA): Likewise.
+ (SERIALKEYSW): Likewise..
+ * include/winbase.h (CRITICAL_SECTION_DEBUG): Likewise.
+ (WIN32_FIND_DATAA): Likewise.
+ (WIN32_FIND_DATAW): Likewise.
+ * include/commdlg.h (SNDMSG): Define.
+ * include/winsock.h (SO_UPDATE_ACCEPT_CONTEXT): Define.
+ (SO_CONNECT_TIME): Likewise.
+ (AcceptEx): Declare.
+ (GetAcceptExSockaddrs): Likewise.
+ * include/winsock2.h: Fix typo in #ifdef __cplusplus.
+ * include/winspool.h: Add RC_INVOKED guard.
+ * lib/wsock32.def (AcceptEx@32): Export.
+ (GetAcceptExSockaddrs@32): Likewise.
+
+Thu Nov 18 00:12:43 1999 Mumit Khan <khan@xraylith.wisc.edu>
+
+ * Snapshot 1999-11-18.
+
+ * include/oaidl.h (tagVARIANT): Rename pbool to pboolVal needed by
+ Octopod C++ IDE (and MSVC compatibility).
+ * include/oleauto.h (V_BOOLREF(X)): Likewise.
+ * include/shellapi.h (ShellAbout*): Fix typo.
+ * wingdi.h (FW_ULTRABOLD): Likewise.
+ * include/winnt.h (_TAPE_ERASE, _TAPE_PREPARE, _TAPE_SET_POSITION,
+ _TAPE_WRITE_MARKS): Add missing fields and fix existing ones.
+ Add packing directives for various structures. All structure
+ sizes now conform to MSVC.
+
+Sun Nov 7 02:50:09 1999 Mumit Khan <khan@xraylith.wisc.edu>
+
+ Released 1999-11-07.
+
+Sat Nov 6 21:25:48 1999 Mumit Khan <khan@xraylith.wisc.edu>
+
+ * include/winsock2.h: New file. Mostly a stub for now.
+ * include/winbase.h (DllMain): Delete prototype.
+ * include/commctrl.h (Header_SetItem): Fix macro.
+ * include/{isguids.h, lmerrlog.h, mcx.h, objfwd.h, olectl.h,
+ regstr.h, richole.h, rpcdce.h, rpcdcep.h, rpcnsi.h, rpcproxy.h,
+ shlguid.h, sqltypes.h, winperf.h}: Enclose in extern "C" if c++.
+
+ Merge in changes from wxWindows.
+ * include/basetyps.h (GUID_DEFINED, UUID_DEFINED): Add guards.
+ * include/oaidl.h (DISPID_*): Add macros.
+ (IID_ITypeLib, IID_ICreateTypeInfo, IID_ICreateTypeInfo2,
+ IID_ICreateTypeLib, IID_ICreateTypeLib2, IID_ITypeInfo,
+ IID_IErrorInfo, IID_IDispatch, IID_ICreateErrorInfo): Declare.
+ * include/objidl.h (IDataObject): Fix EnumFormatEtc parameter.
+
+ Merge in changes from Octopod C++ IDE group.
+ * include/commctrl.h (NMHEADERA, NMHEADERW): Define.
+ (Header_InsertItem): Fix macro.
+ * include/oaidl.h (IID_IDispatch): Declare.
+ (IID_ISupportErrorInfo): Likewise.
+ (IDispatch): Rename Invoked to Invoke.
+ * include/objidl.h (IPersist): Fix GetClassID.
+ * include/oleauto.h (VectorFromBstr): Declare.
+ (BstrFromVector): Likewise.
+ * include/olectl.h (OLEMISC_*): Update.
+ * include/olectlid.h (IID_IDispatch): Declare.
+ * include/oleidl.h (IOleObject): Fix GetExtent and SetExtent.
+ (IOleInPlaceFrame): Fix.
+ (ISupportErrorInfo): Define.
+ (IErrorInfo): Define.
+ * include/winuser.h (SIF_TRACKPOS): Define.
+
+Wed Nov 3 19:34:12 1999 Mumit Khan <khan@xraylith.wisc.edu>
+
+ Fix Merge errors:
+ * include/winnt.h (PSID): Uncomment definition.
+ (PISID): Rename from PSID.
+ (struct _TAPE_GET_MEDIA_PARAMETER): Remove reserved field.
+ (struct _SECURITY_ATTRIBUTES): Remove multiple definition.
+
+ * include/lmalert.h, include/lmbrowsr.h, include/lmchdev.h,
+ include/lmconfig.h, include/lmerrlog.h, include/lmmsg.h,
+ include/lmremutl.h, include/lmrepl.h, include/lmserver.h,
+ include/lmsvc.h, include/lmwksta.h, include/oaidl.h,
+ include/shellapi.h, include/winbase.h, include/wingdi.h,
+ include/winnt.h, include/winsock.h: Merged with winsup-19991026.
+
+Sun Oct 31 00:23:50 1999 Mumit Khan <khan@xraylith.wisc.edu>
+
+ * include/wingdi.h (PHYSICAL*, SCALINGFACTOR*): New. From
+ Marius Kjeldahl <kjeldahl@hotmail.com>.
+
+Sun Aug 29 18:07:42 1999 Mumit Khan <khan@xraylith.wisc.edu>
+
+ * include/winnt.h (APPLICATION_ERROR_MASK): Add macros.
+ (ERROR_SEVERITY_*): Likewise.
+
+Tue Aug 17 21:05:21 1999 Mumit Khan <khan@xraylith.wisc.edu>
+
+ * include/winbase.h (TLS_OUT_OF_INDEXES): Add macro.
+ (DllMain): Fix prototype.
+
+Mon Aug 2 23:31:30 1999 Mumit Khan <khan@xraylith.wisc.edu>
+
+ * include/commdlg.h: Enclose within pack(push,1) and pack(pop).
+ (cderr.h): Don't include.
+ * include/winuser.h: Fix macro definitions.
+
+Mon Aug 02 14:31:37 1999 Anders Norlander <anorland@hem2.passagen.se>
+
+ Merge with winsup 1999-07-29:
+ * include/wincon.h (MOUSE_WHEELED): Define.
+ * include/winnt.h (PSECURITY_ATTRIBUTES): Add type.
+ (SECURITY_DESCRIPTOR): Add struct type.
+ (PSECURITY_DESCRIPTOR): Pointer to above type. BEWARE: this type
+ is equal to PVOID in the Platform SDK! So don't depend on accessing
+ members through ->.
+
+Mon Aug 02 13:58:52 1999 Anders Norlander <anorland@hem2.passagen.se>
+
+ * lib/Makefile.in (install-headers): Don't @ commands.
+ (install-libraries): Ditto.
+
+Mon Aug 02 13:49:01 1999 Anders Norlander <anorland@hem2.passagen.se>
+
+ * include/sqlext.h: Use #include <sql.h> instead of "sql.h".
+
+Mon Aug 02 13:47:15 1999 Anders Norlander <anorland@hem2.passagen.se>
+
+ Patch from Mumit Khan:
+ * include/windows.h: Fix typo in winsock.h include guard and add
+ _UWIN to the list.
+ * include/winnt.h (__int64): Undefine first.
+ (struct _SID): Declare.
+
+Mon Aug 02 13:40:28 1999 Anders Norlander <anorland@hem2.passagen.se>
+
+ * include/winnt.h: Add some REG_* defines reported by Boris Lantrewitz.
+
+Mon Aug 02 13:33:11 1999 Anders Norlander <anorland@hem2.passagen.se>
+
+ Patch from Mumit Khan:
+ * Makefile.in: Do the right thing when cross-compiling.
+ * include/windef.h: Don't define _export and __export if already
+ defined.
+
+Mon Aug 02 13:24:43 1999 Anders Norlander <anorland@hem2.passagen.se>
+
+ * include/basetyps.h (DECLARE_INTERFACE): Use com_interface attribute.
+ (DECLARE_INTERFACE_): Ditto.
+
+Mon Aug 02 13:17:26 1999 Anders Norlander <anorland@hem2.passagen.se>
+
+ * include/mmsystem.h (HWAVEOUT): Fix missing ')'
+
+ Reported by Brad Porter
+ * include/wingdi.h (FW_ULTRALIGHT): Add.
+ (FW_DEMIBOLD): Add.
+ (FW_ULTRABOLD): Add.
+ (FW_BLACK): Add.
+ (JOHAB_CHARSET): Add.
+ (VIETNAMESE_CHARSET): Add.
+
+
+1999-05-15 Anders Norlander <anorland@hem2.passagen.se>
+
+ * lib/scrnsave.c (WinMain): Remove dependencies on C library.
+ * lib/Makefile.in (Makefile): Regenerate.
+ * include/pshpack[1248].h: New files, if a program would use any of
+ them.
+ * include/poppack.h: Ditto.
+ * include/windef.h (_WIN32_WINNT): Define
+ * include/windows.h: Remove DUMMYUNIONNAME[45].
+ * include/windows.h: Correctly define _M_IX86 to reflect the target
+ processor.
+ * include/windows.h: Add preliminary support for other architectures.
+ * include/winnt.h: Add CONTEXT structure for PPC and ALPHA.
+ * include/winnt.h: Remove PACKED from U/LARGE_INTEGER
+ * include/winnt.h (LUID_AND_ATTRIBUTES): Use pack(4) to solve alignment
+ issue with LARGE_INTEGER.
+ (ANSI_NULL): Define.
+ (PSZ): Define.
+ (ACL_REVISION[1234]): Define.
+ (MIN/MAX_ACL_REVISION): Define.
+ (PTCHAR): Define.
+ (LANG_USER_DEFAULT): Define.
+ (LANG_SYSTEM_DEFAULT): Define.
+ (LOCALE_NEUTRAL): Define.
+ (SORTVERSIONFROMLCID): Define.
+ * include/windef.h (UNREFERENCED_PARAMETER): Define.
+ (UNREFERENCED_LOCAL_VARIABLE): Define.
+ (DBG_UNREFERENCED_PARAMETER): Define.
+ (DBG_UNREFERENCED_LOCAL_VARIABLE): Define.
+ * lib/mswsock.def: New file. Imports for mswsock.dll.
+ * include/custcntl.h: New file. Necessary to compile some SDK
+ samples.
+ * include/winuser.h (SM_MOUSEWHEELPRESENT): Define.
+ (WM_MOUSEWHEEL): Define.
+ (WHEEL_DELTA): Define.
+ (WM_MOUSELAST): Redefine to reflect WM_MOUSEWHEEL.
+ (WM_NEXTMENU): Define.
+ (CharNextA): Fix prototype.
+ (CharNextW): Ditto.
+
+1999-05-14 Anders Norlander <anorland@hem2.passagen.se>
+
+ * include/winsock.h: Enclose in extern "C" if C++, huh?
+ * include/winuser.h(WM_SYNCPAINT): Define. From fltk.
+
+1999-05-13 Anders Norlander <anorland@hem2.passagen.se>
+
+ * include/windef.h (NULL): Define only ifndef
+ (TRUE): Ditto, was previously only defined ifndef FALSE
+ (PASCAL): Define as _pascal
+ (__pascal): Define
+ (WINAPIV): Define
+ (min,max): Define only ifndef NOMINMAX
+
+1999-05-10 Anders Norlander <anorland@hem2.passagen.se>
+
+ * include/commctrl.h: Support for Date/Calendar controls + IE controls.
+ You must define _WIN32_IE if you want support for it.
+ Modified patch from Nirmal Prasad <nprasad@truept.com>.
+
+1999-05-10 Ron Aaron <v-ronaar@Exchange.Microsoft.com>
+
+ * include/wincon.h: Add some ButtonState flags and EventFlags.
+
+1999-05-10 Anders Norlander <anorland@hem2.passagen.se>
+
+ * include/basetyps.h: Don't support COM when __OBJC__ defined because
+ interface define causes mayhem.
+ (DEFINE_INTERFACE): Use comobject attribute only if HAVE_COMOBJECT is
+ defined.
+ * include/windows.h: Undefine BOOL if __OBJC__ defined
+
+1999-05-09 Chris Faylor <cgf@cygnus.com>
+
+ * include/winnls.h: Define additional code pages.
+
+1999-05-09 Anders Norlander <anorland@hem2.passagen.se>
+
+ * include/winbase.h(RtlFillMemory): Parameters got passed in wrong
+ order, corrected.
+ (RtlZeroMemory): Use RtlFillMemory
+
+1999-05-04 Anders Norlander <anorland@hem2.passagen.se>
+
+ * include/winnt.h: Add PACKED to LARGE_INTEGER and ULARGE_INTEGER
+ to get the correct size when used in some structs.
+ (ULARGE_INTEGER): Ditto.
+ * include/winnt.h (TAPE_CREATE_PARTITION): Add struct.
+ * include/winnt.h: Add TAPE_* pointer types PTAPE_*
+
+1999-05-02 Nirmal Prasad <nprasad@truept.com>
+
+ * include/wininet.h: Enclose in extern "C" if c++
+ (INTERNET_BUFFERSA/W): Define struct
+ * include/wininet.h: Add some HSR_* defines
+
+1999-05-02 Anders Norlander <anorland@hem2.passagen.se>
+
+ * include/winnt.h (IMAGE_FIRST_SECTION): Prepend missing paren
+ * include/winnt.h (UNALIGNED): Define
+ * include/windef.h (DECLSPEC_NORETURN): Define
+
+ * include/wininet.h (INTERNET_MAX_NAME): Remove
+ (INTERNET_MAX_SCHEME_LENGTH): Define
+ (INTERNET_MAX_URL_LENGTH): Use INTERNET_MAX_SCHEME_LENGTH
+ * include/wininet.def: Completely redone, it was losing badly.
+
+1999-05-01 Anders Norlander <anorland@hem2.passagen.se>
+
+ * lib/dplayx.def: Remove '_' prefixes
+ * lib/shell32.def: Remove imports for IID_ContextMenu
+
+1999-04-29 Anders Norlander <anorland@hem2.passagen.se>
+
+ * Makefile.in (dist): Support dist target
+ * lib/Makefile.in (dist): Likewise
+ * lib/Makefile.in (uninstall-headers): Fix command
+ * Makefile.in (bindist): Target to build a prebuilt dist
+
+ * lib/ws2_32.def: Winsock2 implib
+
+ * include/largeint.h: New header
+ * include/largeint.c: Large integer support library
+ * lib/Makefile.in(EXTRA_LIBS): Add liblargeint.a
+ (EXTRA_OBJS): Add largeint.o
+
+ * include/Makefile: Remove
+ * lib/Makefile: Remove
+ * Makefile: Remove
+ * configure.in: New autoconf script
+ * configure: generated configure script
+ * Makefile.in: autoconf makefile template
+ * lib/Makefile.in: Ditto
+ * include/test.c: mv to lib/test.c
+ * include/res.rc: mv to lib/res.rc
+ * include/TODO: mv to .
+ * include/Notes: mv to ./NOTES
+
+1999-04-28 Anders Norlander <anorland@hem2.passagen.se>
+
+ * include/zmouse.h (WHEEL_DELTA): Define
+
+Mon Apr 26 16:36:49 1999 Mumit Khan <khan@xraylith.wisc.edu>
+
+ * include/ddeml.h (HSZPAIR): Declare.
+ * include/zmouse.h: New file.
+
+1999-04-27 Daniel Guerrero Miralles <daniel.guerrero@upcnet.upc.es>
+
+ * lib/d3dim.def: New implib
+ * lib/d3drm.def: Ditto
+ * lib/d3dxof.def: Ditto
+ * lib/ddraw.def: Ditto
+ * lib/dinput.def: Ditto
+ * lib/dplayx.def: Ditto
+ * lib/dsetup.def: Ditto
+ * lib/dsound.def: Ditto
+ * lib/dinput.c: Guid library for DirectInput
+ * lib/dxguid.c: Guid library for DirectX
+
+1999-04-21 Anders Norlander <anorland@hem2.passagen.se>
+
+ * include/windowsx.h (GET_X_LPARAM): Missing macro added (reported
+ by Ron Aaron).
+ * include/windowsx.h (GET_Y_LPARAM): Also missing
+ * include/winnls.h (IsValidCodePage): Missing prototype added (reported
+ by Mumit Khan).
+
+1999-04-18 Anders Norlander <anorland@hem2.passagen.se>
+
+ * include/scrnsave.h: New header file for screen saver library
+ * lib/scrnsave.c: New file: screen saver library
+
+1999-04-17 Anders Norlander <anorland@hem2.passagen.se>
+
+ * include/regstr.h: Enclosed all strings in TEXT() macros so it
+ works well in when UNICODE is defined
+
+1999-04-17 Nirmal Prasad <nprasad@truept.com>
+
+ * include/winuser.h(STYLESTRUCT): New struct
+ * include/wingdi.h:(GOBJENUMPROC): This function type should
+ return void.
+
+1999-04-17 Anders Norlander <anorland@hem2.passagen.se>
+
+ * include/basetyps.h (LPGUID): New typedef
+ * lib/glut.def: Import library defintions for glut.dll
+ * lib/glu32.def: Ditto for glut32.dll
+ * include/winnt.h: Fixed handling of wchar_t typedef
+ * include/sql.h(SQL_NO_DATA_FOUND): Replace with SQL_NO_DATA
+ * include/sqlext.h(SQL_NO_DATA_FOUND): Define as SQL_NO_DATA
+
+1999-03-20 Anders Norlander <anorland@hem2.passagen.se>
+
+ * include/winbase.h(AbnormalTermination): Define as FALSE
+ * include/commctrl.h: Support for new progress bar messages/styles
+
+1999-03-20 Geoffrey Noer <noer@cygnus.com>
+
+ * include/commdlg.h(PageSetupDlg): New define
+ * include/richedit.h: Missing SCF_* defines
+ * include/winnt.h: Lots o' defines
+ * include/winbase.h(AllocateAndInitializeSid): Corrected prototype
+
+1999-03-09 Anders Norlander <anorland@hem2.passagen.se>
+
+ * include/commdlg.h: Removed pack pragma
+ * lib/comctl32.def(InitCommonControlsEx@4): Added import
+
+1999-03-08 Anders Norlander <anorland@hem2.passagen.se>
+
+ * Makefile: Set version to 0.1.5
+ * lib/Makefile (clean): Fix typo
+
+ * include/commctrl.h: Removed pack pragma
+ * include/cpl.h: Likewise
+ * include/dbt.h: Likewise
+ * include/dde.h: Likewise
+ * include/nddeapi.h: Likewise
+ * include/shellapi.h: Likewise
+ * include/wincrypt.h: Likewise
+ * include/lmaccess.h: Fixed USER_PRIV_ADMIN typo
+
+ * include/winsock.h (netent): Define only ifndef __INSIDE_CYGWIN__
+ (servent): Likewise
+ (protoent): Likewise
+
+ * include/windows.h: Prevent inclusion of winsock.h if we are
+ using or compiling cygwin. Define Win32_Winsock to force inclusion.
+
+1999-01-08 Anders Norlander <anorland@hem2.passagen.se>
+
+ * include/winbase.h (CREATE_FORCEDOS): New define
+
+1999-01-07 Anders Norlander <anorland@hem2.passagen.se>
+
+ * include/wincon.h(KEY_EVENT_RECORD): Fixed packing problem on
+ (COORD): Likewise
+ * include/wingdi.h (BITMAPFILEHEADER): Fixed packing
+ * include/windows.h: Added DUMMYUNIONNAME4 and 5
+ * include/winnt.h (LUID_AND_ATTRIBUTES_ARRAY): New type
+ (PLUID_AND_ATTRIBUTES_ARRAY): New type
+
+ * include/ddeml.h: Removed unnecessary `#pragma pack'
+ * include/imm.h: Likewise
+ * include/nddeapi.h: Likewise
+ * include/nspapi.h: Likewise
+ * include/regstr.h: Likewise
+ * include/wincon.h: Likewise
+ * include/windef.h: Likewise
+ * include/winioctl.h: Likewise
+ * include/winnls.h: Likewise
+ * include/winsvc.h: Likewise
+ * include/winuser.h: Likewise
+ * include/winver.h: Likewise
+ * include/wtypes.h: Likewise
+
+1999-01-05 Anders Norlander <anorland@hem2.passagen.se>
+
+ * Makefile (VERSION): Set to 0.1.4
+ * include/basetyps.h: Check for NOCOMOBJECT
+ * include/Makefile: Pass -DNOCOMOBJECT to g++ to avoid warnings
+ on comobject attribute.
+ * lib/kernel32.def: Added a few functions
+ * include/windef.h (DWORD): Changed back to unsigned long
+
+ * include/windows.h: Include only winresrc.h if RC_INVOKED is defined,
+ winresrc.h in turn includes the necessary headers. This makes things
+ much simpler, no need to protect blocks of code in headers that
+ should not be seen by the resource compiler.
+
+1999-01-05 Geoffrey Noer <noer@cygnus.com>
+
+ * include/winbase.h (STATUS_INVALID_HANDLE): Added define
+ * include/wincon.h: Added console event type flags
+ * include/winnt.h (FILE_SHARE_DELETE): Added
+ (SECURITY_DESCRIPTOR): typedef as DWORD
+
+ * include/winuser.h (WM_PENWINFIRST): Fixed typo
+ * include/winsock.h: Protect some blocks with __INSIDE_CYGWIN_ and
+ define u_* types only if _SYS_TYPES_H is not defined.
+
+1999-01-02 Anders Norlander <anorland@hem2.passagen.se>
+
+ * COPYING.LIB: Deleted
+ * README: Updated to reflect license changes
+ * include/shlobj.h: Remove extra comma on some enums
+ * include/windef.h: Changed DWORD typedef from unsigned long to
+ unsigned int in order to avoid warnings on bit fields that
+ use DWORD.
+ * include/Makefile (test): Compile with all warnings
+ * include/unknwn.h: Include objfwd.h
+ * include/winsock.h: Added missing copyright notices.
+
+1999-01-01 Anders Norlander <anorland@hem2.passagen.se>
+
+ * lib/winmm.def: Corrected LIBRARY statement
+ * include/mmsystem.h: Define mmioSeek codes if not already defined
+ * include/commctrl.h (CreateStatusWindowA): Corrected prototype
+ (CreateStatusWindowW): Likewise
+
+ * include/winresrc.h: Include only files necessary instead of windows.h
+ * include/dde.h: Allow inclusion in resource scripts.
+ * include/winnt.h: Likewise
+ * include/commctrl.h: Likewise
+ * include/prsht.h: Likewise
+ * README: Updated
+
+1998-12-10 Anders Norlander <anorland@hem2.passagen.se>
+
+ * include/sqltypes.h (SQLHANDLE): Added this type
+ (SQLHDESC): Likewise
+ * include/sql.h (SQLFreeHandle): Added this prototype
+ (SQLAllocHandle): Likewise
+
+1998-12-08 Anders Norlander <anorland@hem2.passagen.se>
+
+ * include/winsock.h: Define _GNU_H_WINDOWS32_SOCKETS to avoid
+ conflicts with cygwin headers.
+
+1998-12-06 Anders Norlander <anorland@hem2.passagen.se>
+
+ * Makefile: Changed VERSION to 0.1.3
+ * Makefile (dist-lib): New target to make import library only
+ distribution
+ * Makefile (dist-hdr): New target to make headers only distribution
+ * Makefile (dist): Now depends on dist-lib and dist-hdr instead of
+ building one single distribution file.
+ * dist.mak: Deleted
+
+ * include/lm.h: New file
+ * include/lmcons.h: New file
+ * include/lmalert.h: New file
+ * include/lmaudit.h: New file
+ * include/lmconfig.h: New file
+ * include/lmapibuf.h: New file
+ * include/lmaccess.h: New file
+ * include/lmchdev.h: New file
+ * include/lmremutl.h: New file
+ * include/lmrepl.h: New file
+ * include/lmerrlog.h: New file
+ * include/lmat.h: New file
+ * include/lmuse.h: New file
+ * include/lmuseflg.h: New file
+ * include/lmserver.h: New file
+ * include/lmerr.h: New file
+ * include/lmsname.h: New file
+ * include/lmstats.h: New file
+ * include/lmsvc.h: New file
+ * include/lmwksta.h: New file
+ * include/lmbrowsr.h: New file
+
+1998-12-05 Anders Norlander <anorland@hem2.passagen.se>
+
+ * include/unknwn.h: Fixed IClassFactory declaration; INTERFACE was missing
+ * include/unknwn.h: Added extern declaration for IID_IClassFactory
+
+ * include/initguid.h: New file
+
+ * include/rpcndr.h: Defined hyper and MIDL_hyper as double if 64 bit
+ int not supported
+
+ * include/winnt.h: Added USN
+ * include/winnt.h: Changed handling of 64 bit int support
+
+ * include/windows.h: Added support for BC,LCC and MSVC
+
+ * include/windows.h: Changed handling machine architecture defines
+
+ * include/olectl.h: New file
+
+1998-12-04 Anders Norlander <anorland@hem2.passagen.se>
+
+ * include/oleidl.h: Added IViewObject and IViewObject2
+
+ * include/objidl: Corrected prototype for IStorage::DestroyElement and
+ IStorage::MoveElement
+
+ * include/oledlg.h: New file
+
+ * include/winresrc.h: New file
+
+ * include/wingdi.h: Added LPDOCINFO
+
+ * include/commctrl.h: Added SBARS_SIZEGRIP and TVM_SETINDENT
+ * include/commctrl.h: Added TCM_SETITEM to UNICODE/ANSI block
+ * include/commctrl.h: Added ListView_GetSelectedCount, ListView_GetItemSpacing,
+ TabCtrl_SetImageList and TabCtrl_GetItemCount
+ * include/commctrl.h: Added TVM_FIRST, HDM_FIRST and TV_FIRST
+
+ * include/windowsx.h: Added missing ListBox_xx ComboBox_xx etc. macros
+
+ * include/wingdi.h: Added (L)PBITMAP,(L)PBITMAPCOREHEADER,
+ PBITMAPINFOHEADER, (L)PBITMAPCOREINFO and (L)PBITMAPFILEHEADER.
+
+ * include/commdlg.h: Added LPDEVNAMES
+
+ * include/windows.h: Include excpt.h
+
+ * include/excpt.h: New file. This file just contains some
+ stubs for SEH that do nothing.
+
+ * include/commctrl.h: Added general WM_NOTIFY codes
+
+ * include/winuser.h: Added ICON_SMALL and ICON_BIG
+ * include/winuser.h: Removed VK_0-VK_9 VK_A-VK_Z; they should obviously
+ not be in the headers.
+ * include/winuser.h: Added LPCBTACTIVATESTRUCT and LPCLIENTCREATESTRUCT
+ * include/winuser.h: Added old WM_SIZE parameter names so
+ wxWindows compiles.
+ * include/winuser.h: Added IDC_SIZE and IDC_ICON
+ * include/winuser.h: Added LPDLGITEMTEMPLATE
+ * include/winuser.h: HTCAPTION was missing value
+ * include/winuser.h: Added WM_ACTIVE flags
+
+ * include/windowsx.h: Added _fmemcpy so V compiles; also added
+ _fxx defines for memmove, memset and memcmp
+
+ * include/windef.h: Changed _export and __export to empty defines
+
+ * include/shellapi.h: Corrected prototypes for ExtractIcon functions.
+ String parameters were not const and ExtractAssociatedIcon takes
+ a WORD pointer not DWORD pointer as last parameter.
+
+ * Makefile: Changed VERSION to 0.1.2
+
+ * include/ole2ver.h: New file
+
+ * Makefile: Removed all dependencies on GLUT
+
+ * include/GL/glut.h: Removed file because of decision to remove
+ files that are not part of the library.
+ * lib/glut.def: Likewise
+ * lib/glut32.def: Likewise
+
+ * include/windows.h: Include winperf.h
+
+ * include/winperf.h: New file
+
+ * lib/gdi32.def: Added GetEnhMetaFilePixelFormat
+
+ * include/winnls.h: Added calendar types
+ * include/winnls.h: Added country codes
+
+1998-12-03 Anders Norlander <anorland@hem2.passagen.se>
+
+ * include/windef.h: Added PROC and NEARPROC
+
+ * include/wingdi.h: Added ChoosePixelFormat, DescribePixelFormat
+ * include/wingdi.h: Added OpenGL types and prototypes
+ * include/wingdi.h: Added ENHMETA_STOCK_OBJECT
+ * include/wingdi.h: Added DCTT_DOWNLOAD_OUTLINE
+ * include/wingdi.h: Added POINTFX, TTPOLYCURVE and TTPOLYGONHEADER
+ * include/wingdi.h: Added truetype character outline types
+ * include/wingdi.h: Added DEVMODE initialization flags
+ * include/wingdi.h: Added panose codes
+ * include/wingdi.h: Added missing character sets
+ * include/wingdi.h: Added ANTIALIASED_QUALITY and
+ NONANTIALIASED_QUALITY
+ * include/wingdi.h: Added ENUMLOGFONTA/W and ENUMLOGFONTEXA/W
+ * include/wingdi.h: Added pointer types for EXTLOGPEN
+ * include/wingdi.h: Added PATTERN type
+ * include/wingdi.h: Added NEWTEXTMETRICA/W and NEWTEXTMETRICEXA/W
+ * include/wingdi.h: Added new text metric flags
+ * include/wingdi.h: Added pitch and family flags
+ * include/wingdi.h: Moved BCHAR defintion from winnt.h here
+ * include/wingdi.h: Added METAHEADER
+ * include/wingdi.h: Fixed packing of RGBTRIPLE and BITMAPFILEHEADER
+ * include/wingdi.h: Added TA_MASK
+ * include/wingdi.h: Added MAXSTRETCHBLTMODE
+ * include/wingdi.h: Added error codes
+
+ * include/winuser.h: Added missing winhelp structures
+ * include/winuser.h: Added dialog flags/styles/messages
+ * include/winuser.h: Added EM_SETMARGIN codes
+ * include/winuser.h: Made it possiblie to use IDI_XX values
+ in resource files.
+ * include/winuser.h: Added missing LoadImage load flags
+ * include/winuser.h: Added missing message box flags
+ * include/winuser.h: Added ScrollWindow codes
+ * include/winuser.h: Added DT_WORD_ELLIPSIS
+ * include/winuser.h: Added drag and drop support
+ * include/winuser.h: Added WM_MENUCHAR return codes
+ * include/winuser.h: Added DLGWINDOWEXTRA
+ * include/winuser.h: Added missing SetWindowPos flags.
+ * include/winuser.h: Added BSF_NOTIMEOUTIFNOTHUNG
+ * include/winuser.h: Added IDHOT_xx defines
+ * include/winuser.h: Added MOD_WIN
+ * include/winuser.h: Added missing defines and structs for owner draw
+ controls.
+ * include/winuser.h: Added WPF_RESTORETOMAXIMIZED and
+ WPF_SETMINPOSITION
+ * include/winuser.h: Added DrawAnimatedRects flags
+ * include/winuser.h: Added WM_PRINT codes
+ * include/winuser.h: Added CS_IME class style
+ * include/winuser.h: Added WM_SIZE codes
+ * include/winuser.h: Added WM_MOUSEACTIVATE return codes
+ * include/winuser.h: Added WM_NCHITTEST return codes
+ * include/winuser.h: Added WM_SIZING parameters
+ * include/winuser.h: Added WM_NEXTMENU and MDINEXTMENU
+ * include/winuser.h: Added menu loop codes.
+ * include/winuser.h: Added NFR_ANSI, NFR_UNICODE, NF_QUERY and
+ NF_REQUERY
+ * include/winuser.h: Added WM_POWER flags
+ * include/winuser.h: Added KL_NAMELENGTH, WSF_VISIBLE
+ * include/winuser.h: Added missing message filter codes
+ * include/winuser.h: Added WM_KEYXX message flags
+ * include/winuser.h: Added WM_SHOWMESSAGE flags
+ * include/winuser.h: Added old ShowWindow commands
+ * include/winuser.h: Fixed packing of DLGITEMTEMPLATE and DLGTEMPLATE
+ structures.
+
+ * include/mciavi.h: New file for the MCI AVI driver that for some
+ reason is not in mmsystem.h.
+
+ * include/winbase.h: Added PIPE_UNLIMITED_INSTANCES and INVALID_FILE_SIZE
+ * include/winbase.h: Added SECURITY_xx for CreateFile
+ * include/winbase.h: Added RTS and DTS control values
+ * include/winbase.h: Fixed SYSTEM_INFO structure
+ * include/winbase.h: Added CREATE_NO_WINDOW, CREATE_SHARED_WOW_VDM
+ * include/winbase.h: Added FILE_TYPE_REMOTE
+ * include/winbase.h: Added modem status flags
+ * include/winbase.h: Added HINSTANCE_ERROR
+ * include/winbase.h: Added DefineDosDevice defines
+ * include/winbase.h: Added power management flags AC_xx BATTERY_xx
+ * include/winbase.h: Added STARTF_XX flags
+ * include/winbase.h: Fixed typo on _lcreat prototype.
+ * include/winbase.h: Moved DBG_XX to winnt.h
+ * include/winbase.h: Moved TOKEN_XX, DLL_PROCESS_XX and DLL_THREAD_XX to
+ winnt.h
+
+ * include/unknwn.h: Added extern declaration of IID_IUnknown
+
+ * include/windowsx.h: Added hmemcpy.
+
+ * include/winnt.h: Added dummy member to DECLARE_HANDLE struct
+ * include/winnt.h: Added PACCESS_TOKEN
+ * include/winnt.h: Added TAPE_XX defines and moved some from winbase.h
+ * include/winnt.h: Added SE_IMPERSONATION_STATE and TOKEN_SOURCE_LENGTH
+ * include/winnt.h: Added SE_PRIVILEGE_ENABLED_BY_DEFAULT, SE_PRIVILEGE_ENABLED,
+ SE_PRIVILEGE_USED_FOR_ACCESS, PRIVILEGE_SET_ALL_NECESSARY,
+ SECURITY_MAX_IMPERSONATION_LEVEL, DEFAULT_IMPERSONATION_LEVEL,
+ SECURITY_DYNAMIC_TRACKING and SECURITY_STATIC_TRACKING.
+
+ * include/winnt.h: Added SE_OWNER_DEFAULTED, SE_GROUP_DEFAULTED, SE_DACL_XX,
+ SE_SACL_XX, SE_SELF_RELATIVE, SECURITY_DESCRIPTOR_MIN_LENGTH,
+ SECURITY_DESCRIPTOR_REVISION and SECURITY_DESCRIPTOR_REVISION1.
+
+ * include/winsvc.h: Removed conflicting defines which were supposed
+ to be in winnt.h
+
+ * include/winnt.h: Added SERVICE_NODE_TYPE, SERVICE_LOAD_TYPE
+ and SERVICE_ERROR_TYPE.
+
+ * include/winnt.h: Added SERVICE_XX defines.
+ * include/winsvc.h: Added SERVICES_ACTIVE_DATABASEA/W,
+ SERVICES_FAILED_DATABASEA/W and SC_GROUP_IDENTIFIERA/W.
+
+ * include/winsvc.h: Added SERVICE_STATE_ALL, SERVICE_QUERY_CONFIG,
+ SERVICE_CHANGE_CONFIG, SERVICE_QUERY_STATUS, SERVICE_ENUMERATE_DEPENDENTS,
+ SERVICE_START, SERVICE_STOP, SERVICE_PAUSE_CONTINUE,
+ SERVICE_USER_DEFINED_CONTROL and SERVICE_ALL_ACCESS
+
+1998-12-02 Anders Norlander <anorland@hem2.passagen.se>
+
+ * include/winbase.h: Corrected prototype for CreateProcessA
+
+ * include/mmsystem.h: Added CAPS1 and C1_TRANSPARENT for display
+ driver extensions.
+
+ * include/shlobj.h: Corrected prototype for SHGetDesktopFolder, should
+ be LPSHELLFOLDER* not LPSHELLFOLDER.
+
+ * include/windows.h: Include commdlg.h
+
+ * include/winuser.h: Added MDICREATESTRUCT
+
+ * include/winuser.h: Added LB_ERR, LB_ERRSPACE, LB_OKAY, CB_ERR,
+ CB_ERRSPACE, and CB_OKAY
+
+ * include/wingdi.h: Added LPBITMAPINFOHEADER
+
+ * include/rpcproxy.h: Removed IN, OUT and OPTIONAL since they
+ are meaningless.
+ * include/rpcdce2.h: Likewise.
+
+ * lib/shell32.c: Moved GUID defintions from shlguid.h to this file.
+
+ * include/richole.h: Replaced DEFINE_GUID with extern const GUID
+ * include/olectlid.h: Likewise
+ * include/shlguid.h: Likewise
+
+ * include/coguid.h: Delete file since it was for 16 bit windows only.
+
+ * lib/*.def: Appended .dll to library name where needed.
+
+ * include/windef.h: Define _stdcall and __stdcall only if not
+ previously defined instead of undefining first.
+
+ * include/dlgs.h: Put RC_INVOKED around structure defs
+
+ * include/intshcut.h: New file
+ * include/isguids.h: New file
+
+ * lib/uuid.c: Added all COM/OLE GUIDS I know and do not know about.
+
+1998-12-01 Anders Norlander <anorland@hem2.passagen.se>
+
+ * include/winnt.h: Added check if _T is defined before defining it
+
+ * include/windows.h: Include dlgs.h if WIN32_LEAN_AND_MEAN not defined
+
+ * include/dlgs.h: New file
+
+ * include/winbase.h: Removed DllEntryPoint define
+
+ * include/winbase.h: Added SetupComm prototype
+
+ * include/rpc.h: SEH RPC functions no longer defined since they weren't
+ supported anyway.
+
+ * include/basetyps.h: Removed use of COMOBJECT define, instead
+ DECLARE_INTERFACE directly uses comobject attribute when GCC
+ is used.
+
+ * include/wtypes.h: STGC enum was missing typedef
+
+ * include/objidl.h: ADVC enum was missing typedef
+
+ * include/winnt.h: Moved CHAR, SHORT and LONG definitions so
+ they are nested within the VOID definition.
+
+ * include/winbase.h: Added stream ids and attributes
+
+ * include/winbase.h: Changed WIN32_STREAM_ID member cStreamName
+ to an ANYSIZE_ARRAY array.
+
+1998-11-26 Anders Norlander <anorland@hem2.passagen.se>
+
+ * include/windef.h: defined _declspec as __declspec since
+ some programs (like VWCL) use _declspec instead of __declspec
+
+ * include/winnt.h: added COMPRESS_FORMAT defines
+
+ * include/winbase.h: moved IS_TEXT_XXX defines to winnt.h
+
+ * include/winnt.h: added HEAP_XXXX defines
+
+ * include/winbase.h: moved HEAP_XXXX defines to winnt.h
+
+ * include/winnt.h: added defintions for PE/COFF from the PE and COFF
+ specification.
+
+ * include/winnt.h: added NTAPI define
+
+1998-11-25 Anders Norlander <anorland@hem2.passagen.se>
+
+ * include/winnt.h: defined TBYTE,LPTSTR etc in terms of TCHAR
+ instead of CHAR or WCHAR.
+
+ * include/winnt.h: added _T define
+
+ * include/winnt.h: added test for _TCHAR_DEFINED
+
+ * include/winnt.h: included string.h for memory macros
+
+ * include/prsht.h: added PSM_SETFINISHTEXT to UNICODE/ANSI test
+
+ * include/prsht.h: moved PSM_SETTITLEA/W to UNICODE test at end of file
+
+ * include/prsht.h: added PropSheet_XXX macros
+
+
+1998-11-24 Anders Norlander <anorland@hem2.passagen.se>
+
+ * include/winspool.h: Changed DeletePrinterProcessor and
+ DeletePrinterProvidor to DeletePrintXX.
+
+ * include/wingdi.h: Changed EMRCREATECOLORSPACE lcs member type to
+ LOGCOLORSPACEW.
+
+ * include/wingdi.h: Changed prototype for CreateColorSpace to A and W
+ variants
+
+ * include/wingdi.h: Likewise for GetLogColorSpace
+
+ * include/wingdi.h: Changed LOGCOLORSPACE to LOGCOLORSPACEA/W.
+
+ * include/richedit.h: Added missing defines and structures
+
+ * include/winuser.h: Moved EDITWORDBREAKPROCEX to include/richedit.h
+
+ * include/winuser.h: Added HWND_DESKTOP
+
+1998-11-23 Anders Norlander <anorland@hem2.passagen.se>
+
+ * Makefile: Include ChangeLog when building source
+ distribution (srcdist)
+
+ * include/oleauto.h: Changed WINOLEAUTAPI and WINOLEAUTAPI_ so they
+ are always defined as STDAPI and STDAPI_
+
+ * include/objbase.h: Changed WINOLEAPI and WINOLEAPI_ so they
+ are always defined as STDAPI and STDAPI_
+
+ * include/objidl.h: Removed extra ';' on IStorage SetClass method
+
+ * include/rpcndr.h: Removed all IN and OUT from function prototypes
+
+ * ChangeLog started
diff --git a/winsup/w32api/Makefile.in b/winsup/w32api/Makefile.in
new file mode 100644
index 000000000..a10675661
--- /dev/null
+++ b/winsup/w32api/Makefile.in
@@ -0,0 +1,124 @@
+#
+# Makefile.in
+#
+# This file is part of a free library for the Win32 API.
+#
+# 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.
+
+# start config section
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+VPATH = @srcdir@
+
+target_alias = @target_alias@
+prefix = @prefix@
+
+program_transform_name = @program_transform_name@
+exec_prefix = @exec_prefix@
+bindir = @bindir@
+libdir = @libdir@
+tooldir = $(exec_prefix)/$(target_alias)
+datadir = @datadir@
+infodir = @infodir@
+includedir = @includedir@
+
+CC = @CC@
+CC_FOR_TARGET = $(CC)
+CFLAGS = @CFLAGS@
+
+DLLTOOL = @DLLTOOL@
+AS = @AS@
+AS_FOR_TARGET = $(AS_FOR_TARGET)
+WINDRES = @WINDRES@
+
+RANLIB = @RANLIB@
+AR = @AR@
+LD = @LD@
+
+TAR = tar
+
+FLAGS_TO_PASS = \
+ AS="$(AS)" \
+ CC="$(CC)" \
+ CPPFLAGS="$(CPPFLAGS)" \
+ CFLAGS="$(CFLAGS)" \
+ CXXFLAGS="$(CXXFLAGS)" \
+ AR="$(AR)" \
+ RANLIB="$(RANLIB)" \
+ LD="$(LD)" \
+ DLLTOOL="$(DLLTOOL)" \
+ WINDRES="$(WINDRES)"
+
+# end config section
+
+SUBDIRS = lib
+
+PACKAGE = w32api
+VERSION = 0.2
+
+DIST_FILES = Makefile.in configure.in configure config.guess config.sub \
+install-sh README ChangeLog TODO
+
+all: lib
+
+%-subdirs:
+ for i in $(SUBDIRS); do \
+ $(MAKE) $(FLAGS_TO_PASS) -C $$i $*; \
+ done
+
+lib:
+ $(MAKE) $(FLAGS_TO_PASS) -C $@
+
+test:
+ $(MAKE) -C lib test $(FLAGS_TO_PASS)
+
+install uninstall:
+ for i in $(SUBDIRS); do \
+ (cd $$i; $(MAKE) $@); \
+ done
+
+distdir = $(PACKAGE)-$(VERSION)
+
+dist:
+ rm -rf $(distdir)
+ mkdir $(distdir)
+ chmod 755 $(distdir)
+ for i in $(DIST_FILES); do \
+ cp -p $(srcdir)/$$i $(distdir)/$$i ; \
+ done
+ for i in $(SUBDIRS); do \
+ (cd $$i; $(MAKE) distdir=../$(distdir) dist); \
+ done
+ rm -f $(distdir).tar.gz
+ $(TAR) czf $(distdir).tar.gz $(distdir)
+
+bindist:
+ rm -rf $(distdir)
+ mkdir $(distdir)
+ chmod 755 $(distdir)
+ $(MAKE) install prefix=../$(distdir)
+ cd $(distdir); $(TAR) czf ../$(distdir)b.tar.gz .
+
+Makefile: Makefile.in config.status configure
+ $(SHELL) config.status
+
+mostlyclean-top:
+ rm -f *~
+clean-top:
+ rm -rf $(distdir)
+maintainer-clean-top:
+
+mostlyclean: mostlyclean-top mostlyclean-subdirs
+clean: mostlyclean-top clean-subdirs
+distclean: clean-top
+ rm -f Makefile config.status config.log config.cache TAGS *~
+ rm -f include/*~
+ rm -f $(distdir)*.tar.gz
+ $(MAKE) -C lib distclean
+maintainer-clean: maintainer-clean-subdirs
+
+.PHONY: lib test
diff --git a/winsup/w32api/TODO b/winsup/w32api/TODO
new file mode 100644
index 000000000..713aff430
--- /dev/null
+++ b/winsup/w32api/TODO
@@ -0,0 +1,61 @@
+winsock2.h - Possible to merge with winsock.h?
+listview control
+_WIN32_IE issue
+
+Missing functions/defines/structs
+=================================
+CS_ENABLE
+CS_DISABLE
+CS_DELETE_TRANSFORM
+ATF_AVAILABLE
+SERKF_ACTIVE
+TIMER_ALL_ACCESS,TIMER_MODIFY_STATE (new style Win32 Access Control: accctrl)
+AbnormalTermination and other low-level exception handling macros/functions.
+GetExceptionCode
+GetExceptionInformation
+GetAuditedPermissionsFromAcl
+GetEffectiveRightsFromAcl
+GetExplicitEntriesFromAcl
+AcsLan
+BuildExplicitAccessWithName
+BuildImpersonateExplicitAccessWithName
+BuildImpersonateTrustee
+BuildSecurityDescriptor
+BuildTrusteeWithName
+BuildTrusteeWithSid
+GetMultipleTrustee
+GetMultipleTrusteeOperation
+GetNamedSecurityInfo
+GetSecurityInfo
+GetTrusteeForm
+GetTrusteeName
+GetTrusteeType
+PF_XXXX defines for IsProcessorFeaturePresent
+LookupSecurityDescriptorParts
+LSXXXX lsapi functions/types
+RASADFunc through RasValidateEntryName (RASAPI ras.h)
+SetEntriesInAcl
+SetNamedSecurityInfo
+SetSecurityInfo
+SetServiceBits
+SnmpExtensionInit through SnmpUtilVarBindListFree (mgmtapi.h/snmp.h
+ Simple Network Management Protocol(SNMP))
+SOBailOut through SUUserSaveData, VwStreamCloseFunc through VwStreamTellFunc
+ (File viewer/parser (quick view))
+WinSubmitCertificate (wintrust.h)
+WinTrustProviderClientInitialize through WinVerifyTrust
+EXPLICIT_ACCESS
+INotifyReplica (reconcil)
+
+OLE/COM:
+========
+oleidl.h
+oaidl.h
+ocidl.h
+Some GUIDs should be in libole32.a instead of libuuid.a
+
+Low priority
+============
+RASAPI
+MAPI
+directx (what about existing ports?)
diff --git a/winsup/w32api/config.guess b/winsup/w32api/config.guess
new file mode 100755
index 000000000..12ac9a444
--- /dev/null
+++ b/winsup/w32api/config.guess
@@ -0,0 +1,995 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+# Copyright (C) 1992, 93, 94, 95, 96, 97, 1998 Free Software Foundation, Inc.
+#
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program 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
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Written by Per Bothner <bothner@cygnus.com>.
+# The master version of this file is at the FSF in /home/gd/gnu/lib.
+#
+# This script attempts to guess a canonical system name similar to
+# config.sub. If it succeeds, it prints the system name on stdout, and
+# exits with 0. Otherwise, it exits with 1.
+#
+# The plan is that this can be called by configure scripts if you
+# don't specify an explicit system type (host/target name).
+#
+# Only a few systems have been added to this list; please add others
+# (but try to keep the structure clean).
+#
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi@noc.rutgers.edu 8/24/94.)
+if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
+ PATH=$PATH:/.attbin ; export PATH
+fi
+
+UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
+UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
+UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown
+UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+
+trap 'rm -f dummy.c dummy.o dummy; exit 1' 1 2 15
+
+# Note: order is significant - the case branches are not exclusive.
+
+case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+ alpha:OSF1:*:*)
+ if test $UNAME_RELEASE = "V4.0"; then
+ UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
+ fi
+ # A Vn.n version is a released version.
+ # A Tn.n version is a released field test version.
+ # A Xn.n version is an unreleased experimental baselevel.
+ # 1.2 uses "1.2" for uname -r.
+ cat <<EOF >dummy.s
+ .globl main
+ .ent main
+main:
+ .frame \$30,0,\$26,0
+ .prologue 0
+ .long 0x47e03d80 # implver $0
+ lda \$2,259
+ .long 0x47e20c21 # amask $2,$1
+ srl \$1,8,\$2
+ sll \$2,2,\$2
+ sll \$0,3,\$0
+ addl \$1,\$0,\$0
+ addl \$2,\$0,\$0
+ ret \$31,(\$26),1
+ .end main
+EOF
+ ${CC-cc} dummy.s -o dummy 2>/dev/null
+ if test "$?" = 0 ; then
+ ./dummy
+ case "$?" in
+ 7)
+ UNAME_MACHINE="alpha"
+ ;;
+ 15)
+ UNAME_MACHINE="alphaev5"
+ ;;
+ 14)
+ UNAME_MACHINE="alphaev56"
+ ;;
+ 10)
+ UNAME_MACHINE="alphapca56"
+ ;;
+ 16)
+ UNAME_MACHINE="alphaev6"
+ ;;
+ esac
+ fi
+ rm -f dummy.s dummy
+ echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+ exit 0 ;;
+ 21064:Windows_NT:50:3)
+ echo alpha-dec-winnt3.5
+ exit 0 ;;
+ Amiga*:UNIX_System_V:4.0:*)
+ echo m68k-cbm-sysv4
+ exit 0;;
+ amiga:NetBSD:*:*)
+ echo m68k-cbm-netbsd${UNAME_RELEASE}
+ exit 0 ;;
+ amiga:OpenBSD:*:*)
+ echo m68k-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ *:[Aa]miga[Oo][Ss]:*:*)
+ echo ${UNAME_MACHINE}-unknown-amigaos
+ exit 0 ;;
+ arc64:OpenBSD:*:*)
+ echo mips64el-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ arc:OpenBSD:*:*)
+ echo mipsel-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ hkmips:OpenBSD:*:*)
+ echo mips-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ pmax:OpenBSD:*:*)
+ echo mipsel-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ sgi:OpenBSD:*:*)
+ echo mips-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ wgrisc:OpenBSD:*:*)
+ echo mipsel-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+ echo arm-acorn-riscix${UNAME_RELEASE}
+ exit 0;;
+ arm32:NetBSD:*:*)
+ echo arm-unknown-netbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+ exit 0 ;;
+ SR2?01:HI-UX/MPP:*:*)
+ echo hppa1.1-hitachi-hiuxmpp
+ exit 0;;
+ Pyramid*:OSx*:*:*|MIS*:OSx*:*:*)
+ # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
+ if test "`(/bin/universe) 2>/dev/null`" = att ; then
+ echo pyramid-pyramid-sysv3
+ else
+ echo pyramid-pyramid-bsd
+ fi
+ exit 0 ;;
+ NILE:*:*:dcosx)
+ echo pyramid-pyramid-svr4
+ exit 0 ;;
+ sun4H:SunOS:5.*:*)
+ echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit 0 ;;
+ sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+ echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit 0 ;;
+ i86pc:SunOS:5.*:*)
+ echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit 0 ;;
+ sun4*:SunOS:6*:*)
+ # According to config.sub, this is the proper way to canonicalize
+ # SunOS6. Hard to guess exactly what SunOS6 will be like, but
+ # it's likely to be more like Solaris than SunOS4.
+ echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit 0 ;;
+ sun4*:SunOS:*:*)
+ case "`/usr/bin/arch -k`" in
+ Series*|S4*)
+ UNAME_RELEASE=`uname -v`
+ ;;
+ esac
+ # Japanese Language versions have a version number like `4.1.3-JL'.
+ echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
+ exit 0 ;;
+ sun3*:SunOS:*:*)
+ echo m68k-sun-sunos${UNAME_RELEASE}
+ exit 0 ;;
+ sun*:*:4.2BSD:*)
+ UNAME_RELEASE=`(head -1 /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
+ test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
+ case "`/bin/arch`" in
+ sun3)
+ echo m68k-sun-sunos${UNAME_RELEASE}
+ ;;
+ sun4)
+ echo sparc-sun-sunos${UNAME_RELEASE}
+ ;;
+ esac
+ exit 0 ;;
+ aushp:SunOS:*:*)
+ echo sparc-auspex-sunos${UNAME_RELEASE}
+ exit 0 ;;
+ atari*:NetBSD:*:*)
+ echo m68k-atari-netbsd${UNAME_RELEASE}
+ exit 0 ;;
+ atari*:OpenBSD:*:*)
+ echo m68k-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ sun3*:NetBSD:*:*)
+ echo m68k-sun-netbsd${UNAME_RELEASE}
+ exit 0 ;;
+ sun3*:OpenBSD:*:*)
+ echo m68k-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ mac68k:NetBSD:*:*)
+ echo m68k-apple-netbsd${UNAME_RELEASE}
+ exit 0 ;;
+ mac68k:OpenBSD:*:*)
+ echo m68k-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ mvme68k:OpenBSD:*:*)
+ echo m68k-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ mvme88k:OpenBSD:*:*)
+ echo m88k-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ powerpc:machten:*:*)
+ echo powerpc-apple-machten${UNAME_RELEASE}
+ exit 0 ;;
+ RISC*:Mach:*:*)
+ echo mips-dec-mach_bsd4.3
+ exit 0 ;;
+ RISC*:ULTRIX:*:*)
+ echo mips-dec-ultrix${UNAME_RELEASE}
+ exit 0 ;;
+ VAX*:ULTRIX*:*:*)
+ echo vax-dec-ultrix${UNAME_RELEASE}
+ exit 0 ;;
+ 2020:CLIX:*:*)
+ echo clipper-intergraph-clix${UNAME_RELEASE}
+ exit 0 ;;
+ mips:*:*:UMIPS | mips:*:*:RISCos)
+ sed 's/^ //' << EOF >dummy.c
+ int main (argc, argv) int argc; char **argv; {
+ #if defined (host_mips) && defined (MIPSEB)
+ #if defined (SYSTYPE_SYSV)
+ printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
+ #endif
+ #if defined (SYSTYPE_SVR4)
+ printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
+ #endif
+ #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
+ printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
+ #endif
+ #endif
+ exit (-1);
+ }
+EOF
+ ${CC-cc} dummy.c -o dummy \
+ && ./dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \
+ && rm dummy.c dummy && exit 0
+ rm -f dummy.c dummy
+ echo mips-mips-riscos${UNAME_RELEASE}
+ exit 0 ;;
+ Night_Hawk:Power_UNIX:*:*)
+ echo powerpc-harris-powerunix
+ exit 0 ;;
+ m88k:CX/UX:7*:*)
+ echo m88k-harris-cxux7
+ exit 0 ;;
+ m88k:*:4*:R4*)
+ echo m88k-motorola-sysv4
+ exit 0 ;;
+ m88k:*:3*:R3*)
+ echo m88k-motorola-sysv3
+ exit 0 ;;
+ AViiON:dgux:*:*)
+ # DG/UX returns AViiON for all architectures
+ UNAME_PROCESSOR=`/usr/bin/uname -p`
+ if [ $UNAME_PROCESSOR = mc88100 -o $UNAME_PROCESSOR = mc88110 ] ; then
+ if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx \
+ -o ${TARGET_BINARY_INTERFACE}x = x ] ; then
+ echo m88k-dg-dgux${UNAME_RELEASE}
+ else
+ echo m88k-dg-dguxbcs${UNAME_RELEASE}
+ fi
+ else echo i586-dg-dgux${UNAME_RELEASE}
+ fi
+ exit 0 ;;
+ M88*:DolphinOS:*:*) # DolphinOS (SVR3)
+ echo m88k-dolphin-sysv3
+ exit 0 ;;
+ M88*:*:R3*:*)
+ # Delta 88k system running SVR3
+ echo m88k-motorola-sysv3
+ exit 0 ;;
+ XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+ echo m88k-tektronix-sysv3
+ exit 0 ;;
+ Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+ echo m68k-tektronix-bsd
+ exit 0 ;;
+ *:IRIX*:*:*)
+ echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
+ exit 0 ;;
+ ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+ echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id
+ exit 0 ;; # Note that: echo "'`uname -s`'" gives 'AIX '
+ i?86:AIX:*:*)
+ echo i386-ibm-aix
+ exit 0 ;;
+ *:AIX:2:3)
+ if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+ sed 's/^ //' << EOF >dummy.c
+ #include <sys/systemcfg.h>
+
+ main()
+ {
+ if (!__power_pc())
+ exit(1);
+ puts("powerpc-ibm-aix3.2.5");
+ exit(0);
+ }
+EOF
+ ${CC-cc} dummy.c -o dummy && ./dummy && rm dummy.c dummy && exit 0
+ rm -f dummy.c dummy
+ echo rs6000-ibm-aix3.2.5
+ elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
+ echo rs6000-ibm-aix3.2.4
+ else
+ echo rs6000-ibm-aix3.2
+ fi
+ exit 0 ;;
+ *:AIX:*:4)
+ if /usr/sbin/lsattr -EHl proc0 | grep POWER >/dev/null 2>&1; then
+ IBM_ARCH=rs6000
+ else
+ IBM_ARCH=powerpc
+ fi
+ if [ -x /usr/bin/oslevel ] ; then
+ IBM_REV=`/usr/bin/oslevel`
+ else
+ IBM_REV=4.${UNAME_RELEASE}
+ fi
+ echo ${IBM_ARCH}-ibm-aix${IBM_REV}
+ exit 0 ;;
+ *:AIX:*:*)
+ echo rs6000-ibm-aix
+ exit 0 ;;
+ ibmrt:4.4BSD:*|romp-ibm:BSD:*)
+ echo romp-ibm-bsd4.4
+ exit 0 ;;
+ ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC NetBSD and
+ echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to
+ exit 0 ;; # report: romp-ibm BSD 4.3
+ *:BOSX:*:*)
+ echo rs6000-bull-bosx
+ exit 0 ;;
+ DPX/2?00:B.O.S.:*:*)
+ echo m68k-bull-sysv3
+ exit 0 ;;
+ 9000/[34]??:4.3bsd:1.*:*)
+ echo m68k-hp-bsd
+ exit 0 ;;
+ hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+ echo m68k-hp-bsd4.4
+ exit 0 ;;
+ *9??*:MPE/iX:*:*)
+ echo hppa1.0-hp-mpeix
+ exit 0 ;;
+ 9000/[34678]??:HP-UX:*:*)
+ case "${UNAME_MACHINE}" in
+ 9000/31? ) HP_ARCH=m68000 ;;
+ 9000/[34]?? ) HP_ARCH=m68k ;;
+ 9000/[678][0-9][0-9] )
+
+ sed 's/^ //' << EOF >dummy.c
+ #include <stdlib.h>
+ #include <unistd.h>
+
+ int main ()
+ {
+ #if defined(_SC_KERNEL_BITS)
+ long bits = sysconf(_SC_KERNEL_BITS);
+ #endif
+ long cpu = sysconf (_SC_CPU_VERSION);
+
+ switch (cpu)
+ {
+ case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
+ case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
+ case CPU_PA_RISC2_0:
+ #if defined(_SC_KERNEL_BITS)
+ switch (bits)
+ {
+ case 64: puts ("hppa2.0w"); break;
+ case 32: puts ("hppa2.0n"); break;
+ default: puts ("hppa2.0"); break;
+ } break;
+ #else /* !defined(_SC_KERNEL_BITS) */
+ puts ("hppa2.0"); break;
+ #endif
+ default: puts ("hppa1.0"); break;
+ }
+ exit (0);
+ }
+EOF
+ (${CC-cc} dummy.c -o dummy 2>/dev/null ) && HP_ARCH=`./dummy`
+ rm -f dummy.c dummy
+ esac
+ HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+ echo ${HP_ARCH}-hp-hpux${HPUX_REV}
+ exit 0 ;;
+ 3050*:HI-UX:*:*)
+ sed 's/^ //' << EOF >dummy.c
+ #include <unistd.h>
+ int
+ main ()
+ {
+ long cpu = sysconf (_SC_CPU_VERSION);
+ /* The order matters, because CPU_IS_HP_MC68K erroneously returns
+ true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct
+ results, however. */
+ if (CPU_IS_PA_RISC (cpu))
+ {
+ switch (cpu)
+ {
+ case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
+ case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
+ case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
+ default: puts ("hppa-hitachi-hiuxwe2"); break;
+ }
+ }
+ else if (CPU_IS_HP_MC68K (cpu))
+ puts ("m68k-hitachi-hiuxwe2");
+ else puts ("unknown-hitachi-hiuxwe2");
+ exit (0);
+ }
+EOF
+ ${CC-cc} dummy.c -o dummy && ./dummy && rm dummy.c dummy && exit 0
+ rm -f dummy.c dummy
+ echo unknown-hitachi-hiuxwe2
+ exit 0 ;;
+ 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
+ echo hppa1.1-hp-bsd
+ exit 0 ;;
+ 9000/8??:4.3bsd:*:*)
+ echo hppa1.0-hp-bsd
+ exit 0 ;;
+ hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
+ echo hppa1.1-hp-osf
+ exit 0 ;;
+ hp8??:OSF1:*:*)
+ echo hppa1.0-hp-osf
+ exit 0 ;;
+ i?86:OSF1:*:*)
+ if [ -x /usr/sbin/sysversion ] ; then
+ echo ${UNAME_MACHINE}-unknown-osf1mk
+ else
+ echo ${UNAME_MACHINE}-unknown-osf1
+ fi
+ exit 0 ;;
+ parisc*:Lites*:*:*)
+ echo hppa1.1-hp-lites
+ exit 0 ;;
+ C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+ echo c1-convex-bsd
+ exit 0 ;;
+ C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+ if getsysinfo -f scalar_acc
+ then echo c32-convex-bsd
+ else echo c2-convex-bsd
+ fi
+ exit 0 ;;
+ C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+ echo c34-convex-bsd
+ exit 0 ;;
+ C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+ echo c38-convex-bsd
+ exit 0 ;;
+ C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+ echo c4-convex-bsd
+ exit 0 ;;
+ CRAY*X-MP:*:*:*)
+ echo xmp-cray-unicos
+ exit 0 ;;
+ CRAY*Y-MP:*:*:*)
+ echo ymp-cray-unicos${UNAME_RELEASE}
+ exit 0 ;;
+ CRAY*[A-Z]90:*:*:*)
+ echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
+ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
+ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/
+ exit 0 ;;
+ CRAY*TS:*:*:*)
+ echo t90-cray-unicos${UNAME_RELEASE}
+ exit 0 ;;
+ CRAY-2:*:*:*)
+ echo cray2-cray-unicos
+ exit 0 ;;
+ F300:UNIX_System_V:*:*)
+ FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+ FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
+ echo "f300-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+ exit 0 ;;
+ F301:UNIX_System_V:*:*)
+ echo f301-fujitsu-uxpv`echo $UNAME_RELEASE | sed 's/ .*//'`
+ exit 0 ;;
+ hp3[0-9][05]:NetBSD:*:*)
+ echo m68k-hp-netbsd${UNAME_RELEASE}
+ exit 0 ;;
+ hp300:OpenBSD:*:*)
+ echo m68k-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ i?86:BSD/386:*:* | *:BSD/OS:*:*)
+ echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
+ exit 0 ;;
+ *:FreeBSD:*:*)
+ if test -x /usr/bin/objformat; then
+ if test "elf" = "`/usr/bin/objformat`"; then
+ echo ${UNAME_MACHINE}-unknown-freebsdelf`echo${UNAME_RELEASE}|sed -e 's/[-_].*//'`
+ exit 0
+ fi
+ fi
+ echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+ exit 0 ;;
+ *:NetBSD:*:*)
+ echo ${UNAME_MACHINE}-unknown-netbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+ exit 0 ;;
+ *:OpenBSD:*:*)
+ echo ${UNAME_MACHINE}-unknown-openbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+ exit 0 ;;
+ i*:[Cc][Yy][Gg][Ww][Ii][Nn]*:*)
+ echo ${UNAME_MACHINE}-pc-cygwin32
+ exit 0 ;;
+ i*:MINGW*:*)
+ echo ${UNAME_MACHINE}-pc-mingw32
+ exit 0 ;;
+ p*:CYGWIN*:*)
+ echo powerpcle-unknown-cygwin32
+ exit 0 ;;
+ prep*:SunOS:5.*:*)
+ echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit 0 ;;
+ *:GNU:*:*)
+ echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+ exit 0 ;;
+ *:Linux:*:*)
+ # uname on the ARM produces all sorts of strangeness, and we need to
+ # filter it out.
+ case "$UNAME_MACHINE" in
+ armv*) UNAME_MACHINE=$UNAME_MACHINE ;;
+ arm* | sa110*) UNAME_MACHINE="arm" ;;
+ esac
+
+ # The BFD linker knows what the default object file format is, so
+ # first see if it will tell us.
+ ld_help_string=`ld --help 2>&1`
+ ld_supported_emulations=`echo $ld_help_string \
+ | sed -ne '/supported emulations:/!d
+ s/[ ][ ]*/ /g
+ s/.*supported emulations: *//
+ s/ .*//
+ p'`
+ case "$ld_supported_emulations" in
+ i?86linux) echo "${UNAME_MACHINE}-pc-linux-gnuaout" ; exit 0 ;;
+ i?86coff) echo "${UNAME_MACHINE}-pc-linux-gnucoff" ; exit 0 ;;
+ sparclinux) echo "${UNAME_MACHINE}-unknown-linux-gnuaout" ; exit 0 ;;
+ armlinux) echo "${UNAME_MACHINE}-unknown-linux-gnuaout" ; exit 0 ;;
+ m68klinux) echo "${UNAME_MACHINE}-unknown-linux-gnuaout" ; exit 0 ;;
+ elf32ppc)
+ # Determine Lib Version
+ cat >dummy.c <<EOF
+#include <features.h>
+#if defined(__GLIBC__)
+extern char __libc_version[];
+extern char __libc_release[];
+#endif
+main(argc, argv)
+ int argc;
+ char *argv[];
+{
+#if defined(__GLIBC__)
+ printf("%s %s\n", __libc_version, __libc_release);
+#else
+ printf("unkown\n");
+#endif
+ return 0;
+}
+EOF
+ LIBC=""
+ ${CC-cc} dummy.c -o dummy 2>/dev/null
+ if test "$?" = 0 ; then
+ ./dummy | grep 1\.99 > /dev/null
+ if test "$?" = 0 ; then
+ LIBC="libc1"
+ fi
+ fi
+ rm -f dummy.c dummy
+ echo powerpc-unknown-linux-gnu${LIBC} ; exit 0 ;;
+ esac
+
+ if test "${UNAME_MACHINE}" = "alpha" ; then
+ sed 's/^ //' <<EOF >dummy.s
+ .globl main
+ .ent main
+ main:
+ .frame \$30,0,\$26,0
+ .prologue 0
+ .long 0x47e03d80 # implver $0
+ lda \$2,259
+ .long 0x47e20c21 # amask $2,$1
+ srl \$1,8,\$2
+ sll \$2,2,\$2
+ sll \$0,3,\$0
+ addl \$1,\$0,\$0
+ addl \$2,\$0,\$0
+ ret \$31,(\$26),1
+ .end main
+EOF
+ LIBC=""
+ ${CC-cc} dummy.s -o dummy 2>/dev/null
+ if test "$?" = 0 ; then
+ ./dummy
+ case "$?" in
+ 7)
+ UNAME_MACHINE="alpha"
+ ;;
+ 15)
+ UNAME_MACHINE="alphaev5"
+ ;;
+ 14)
+ UNAME_MACHINE="alphaev56"
+ ;;
+ 10)
+ UNAME_MACHINE="alphapca56"
+ ;;
+ 16)
+ UNAME_MACHINE="alphaev6"
+ ;;
+ esac
+
+ objdump --private-headers dummy | \
+ grep ld.so.1 > /dev/null
+ if test "$?" = 0 ; then
+ LIBC="libc1"
+ fi
+ fi
+ rm -f dummy.s dummy
+ echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} ; exit 0
+ elif test "${UNAME_MACHINE}" = "mips" ; then
+ cat >dummy.c <<EOF
+main(argc, argv)
+ int argc;
+ char *argv[];
+{
+#ifdef __MIPSEB__
+ printf ("%s-unknown-linux-gnu\n", argv[1]);
+#endif
+#ifdef __MIPSEL__
+ printf ("%sel-unknown-linux-gnu\n", argv[1]);
+#endif
+ return 0;
+}
+EOF
+ ${CC-cc} dummy.c -o dummy 2>/dev/null && ./dummy "${UNAME_MACHINE}" && rm dummy.c dummy && exit 0
+ rm -f dummy.c dummy
+ else
+ # Either a pre-BFD a.out linker (linux-gnuoldld)
+ # or one that does not give us useful --help.
+ # GCC wants to distinguish between linux-gnuoldld and linux-gnuaout.
+ # If ld does not provide *any* "supported emulations:"
+ # that means it is gnuoldld.
+ echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations:"
+ test $? != 0 && echo "${UNAME_MACHINE}-pc-linux-gnuoldld" && exit 0
+
+ case "${UNAME_MACHINE}" in
+ i?86)
+ VENDOR=pc;
+ ;;
+ *)
+ VENDOR=unknown;
+ ;;
+ esac
+ # Determine whether the default compiler is a.out or elf
+ cat >dummy.c <<EOF
+#include <features.h>
+main(argc, argv)
+ int argc;
+ char *argv[];
+{
+#ifdef __ELF__
+# ifdef __GLIBC__
+# if __GLIBC__ >= 2
+ printf ("%s-${VENDOR}-linux-gnu\n", argv[1]);
+# else
+ printf ("%s-${VENDOR}-linux-gnulibc1\n", argv[1]);
+# endif
+# else
+ printf ("%s-${VENDOR}-linux-gnulibc1\n", argv[1]);
+# endif
+#else
+ printf ("%s-${VENDOR}-linux-gnuaout\n", argv[1]);
+#endif
+ return 0;
+}
+EOF
+ ${CC-cc} dummy.c -o dummy 2>/dev/null && ./dummy "${UNAME_MACHINE}" && rm dummy.c dummy && exit 0
+ rm -f dummy.c dummy
+ fi ;;
+# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. earlier versions
+# are messed up and put the nodename in both sysname and nodename.
+ i?86:DYNIX/ptx:4*:*)
+ echo i386-sequent-sysv4
+ exit 0 ;;
+ i?86:UNIX_SV:4.2MP:2.*)
+ # Unixware is an offshoot of SVR4, but it has its own version
+ # number series starting with 2...
+ # I am not positive that other SVR4 systems won't match this,
+ # I just have to hope. -- rms.
+ # Use sysv4.2uw... so that sysv4* matches it.
+ echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
+ exit 0 ;;
+ i?86:*:4.*:* | i?86:SYSTEM_V:4.*:*)
+ if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+ echo ${UNAME_MACHINE}-univel-sysv${UNAME_RELEASE}
+ else
+ echo ${UNAME_MACHINE}-pc-sysv${UNAME_RELEASE}
+ fi
+ exit 0 ;;
+ i?86:*:5:7)
+ UNAME_REL=`(/bin/uname -X|egrep Release|sed -e 's/.*= //')`
+ (/bin/uname -X|egrep i80486 >/dev/null) && UNAME_MACHINE=i486
+ (/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) \
+ && UNAME_MACHINE=i586
+# 5.0.4c returns "Pent II". 5.0.5 returns PentII
+ (/bin/uname -X|egrep '^Machine.*Pent *II' >/dev/null) \
+ && UNAME_MACHINE=i686
+ (/bin/uname -X|egrep '^Machine.*Pentium Pro' >/dev/null) \
+ && UNAME_MACHINE=i686
+ echo ${UNAME_MACHINE}-${UNAME_SYSTEM}${UNAME_VERSION}-sysv${UNAME_RELEASE}
+ exit 0 ;;
+ i?86:*:3.2:*)
+ if test -f /usr/options/cb.name; then
+ UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
+ echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
+ elif /bin/uname -X 2>/dev/null >/dev/null ; then
+ UNAME_REL=`(/bin/uname -X|egrep Release|sed -e 's/.*= //')`
+ (/bin/uname -X|egrep i80486 >/dev/null) && UNAME_MACHINE=i486
+ (/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) \
+ && UNAME_MACHINE=i586
+ (/bin/uname -X|egrep '^Machine.*PentII' >/dev/null) \
+ && UNAME_MACHINE=i686
+ (/bin/uname -X|egrep '^Machine.*Pent II' >/dev/null) \
+ && UNAME_MACHINE=i686
+ (/bin/uname -X|egrep '^Machine.*Pentium Pro' >/dev/null) \
+ && UNAME_MACHINE=i686
+ echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
+ else
+ echo ${UNAME_MACHINE}-pc-sysv32
+ fi
+ exit 0 ;;
+ pc:*:*:*)
+ # uname -m prints for DJGPP always 'pc', but it prints nothing about
+ # the processor, so we play safe by assuming i386.
+ echo i386-pc-msdosdjgpp
+ exit 0 ;;
+ Intel:Mach:3*:*)
+ echo i386-pc-mach3
+ exit 0 ;;
+ paragon:*:*:*)
+ echo i860-intel-osf1
+ exit 0 ;;
+ i860:*:4.*:*) # i860-SVR4
+ if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
+ echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
+ else # Add other i860-SVR4 vendors below as they are discovered.
+ echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4
+ fi
+ exit 0 ;;
+ mini*:CTIX:SYS*5:*)
+ # "miniframe"
+ echo m68010-convergent-sysv
+ exit 0 ;;
+ M68*:*:R3V[567]*:*)
+ test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;;
+ 3[34]??:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 4850:*:4.0:3.0)
+ OS_REL=''
+ test -r /etc/.relid \
+ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+ && echo i486-ncr-sysv4.3${OS_REL} && exit 0
+ /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+ && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;;
+ 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+ && echo i486-ncr-sysv4 && exit 0 ;;
+ m68*:LynxOS:2.*:*)
+ echo m68k-unknown-lynxos${UNAME_RELEASE}
+ exit 0 ;;
+ mc68030:UNIX_System_V:4.*:*)
+ echo m68k-atari-sysv4
+ exit 0 ;;
+ i?86:LynxOS:2.*:*)
+ echo i386-unknown-lynxos${UNAME_RELEASE}
+ exit 0 ;;
+ TSUNAMI:LynxOS:2.*:*)
+ echo sparc-unknown-lynxos${UNAME_RELEASE}
+ exit 0 ;;
+ rs6000:LynxOS:2.*:* | PowerPC:LynxOS:2.*:*)
+ echo rs6000-unknown-lynxos${UNAME_RELEASE}
+ exit 0 ;;
+ SM[BE]S:UNIX_SV:*:*)
+ echo mips-dde-sysv${UNAME_RELEASE}
+ exit 0 ;;
+ RM*:SINIX-*:*:*)
+ echo mips-sni-sysv4
+ exit 0 ;;
+ *:SINIX-*:*:*)
+ if uname -p 2>/dev/null >/dev/null ; then
+ UNAME_MACHINE=`(uname -p) 2>/dev/null`
+ echo ${UNAME_MACHINE}-sni-sysv4
+ else
+ echo ns32k-sni-sysv
+ fi
+ exit 0 ;;
+ PENTIUM:CPunix:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+ # says <Richard.M.Bartel@ccMail.Census.GOV>
+ echo i586-unisys-sysv4
+ exit 0 ;;
+ *:UNIX_System_V:4*:FTX*)
+ # From Gerald Hewes <hewes@openmarket.com>.
+ # How about differentiating between stratus architectures? -djm
+ echo hppa1.1-stratus-sysv4
+ exit 0 ;;
+ *:*:*:FTX*)
+ # From seanf@swdc.stratus.com.
+ echo i860-stratus-sysv4
+ exit 0 ;;
+ mc68*:A/UX:*:*)
+ echo m68k-apple-aux${UNAME_RELEASE}
+ exit 0 ;;
+ news*:NEWS-OS:*:6*)
+ echo mips-sony-newsos6
+ exit 0 ;;
+ R3000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R4000:UNIX_SV:*:*)
+ if [ -d /usr/nec ]; then
+ echo mips-nec-sysv${UNAME_RELEASE}
+ else
+ echo mips-unknown-sysv${UNAME_RELEASE}
+ fi
+ exit 0 ;;
+ BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only.
+ echo powerpc-be-beos
+ exit 0 ;;
+ BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only.
+ echo powerpc-apple-beos
+ exit 0 ;;
+ BePC:BeOS:*:*) # BeOS running on Intel PC compatible.
+ echo i586-pc-beos
+ exit 0 ;;
+esac
+
+#echo '(No uname command or uname output not recognized.)' 1>&2
+#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
+
+cat >dummy.c <<EOF
+#ifdef _SEQUENT_
+# include <sys/types.h>
+# include <sys/utsname.h>
+#endif
+main ()
+{
+#if defined (sony)
+#if defined (MIPSEB)
+ /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed,
+ I don't know.... */
+ printf ("mips-sony-bsd\n"); exit (0);
+#else
+#include <sys/param.h>
+ printf ("m68k-sony-newsos%s\n",
+#ifdef NEWSOS4
+ "4"
+#else
+ ""
+#endif
+ ); exit (0);
+#endif
+#endif
+
+#if defined (__arm) && defined (__acorn) && defined (__unix)
+ printf ("arm-acorn-riscix"); exit (0);
+#endif
+
+#if defined (hp300) && !defined (hpux)
+ printf ("m68k-hp-bsd\n"); exit (0);
+#endif
+
+#if defined (NeXT)
+#if !defined (__ARCHITECTURE__)
+#define __ARCHITECTURE__ "m68k"
+#endif
+ int version;
+ version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
+ printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
+ exit (0);
+#endif
+
+#if defined (MULTIMAX) || defined (n16)
+#if defined (UMAXV)
+ printf ("ns32k-encore-sysv\n"); exit (0);
+#else
+#if defined (CMU)
+ printf ("ns32k-encore-mach\n"); exit (0);
+#else
+ printf ("ns32k-encore-bsd\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (__386BSD__)
+ printf ("i386-pc-bsd\n"); exit (0);
+#endif
+
+#if defined (sequent)
+#if defined (i386)
+ printf ("i386-sequent-dynix\n"); exit (0);
+#endif
+#if defined (ns32000)
+ printf ("ns32k-sequent-dynix\n"); exit (0);
+#endif
+#endif
+
+#if defined (_SEQUENT_)
+ struct utsname un;
+
+ uname(&un);
+
+ if (strncmp(un.version, "V2", 2) == 0) {
+ printf ("i386-sequent-ptx2\n"); exit (0);
+ }
+ if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
+ printf ("i386-sequent-ptx1\n"); exit (0);
+ }
+ printf ("i386-sequent-ptx\n"); exit (0);
+
+#endif
+
+#if defined (vax)
+#if !defined (ultrix)
+ printf ("vax-dec-bsd\n"); exit (0);
+#else
+ printf ("vax-dec-ultrix\n"); exit (0);
+#endif
+#endif
+
+#if defined (alliant) && defined (i860)
+ printf ("i860-alliant-bsd\n"); exit (0);
+#endif
+
+ exit (1);
+}
+EOF
+
+${CC-cc} dummy.c -o dummy 2>/dev/null && ./dummy && rm dummy.c dummy && exit 0
+rm -f dummy.c dummy
+
+# Apollos put the system type in the environment.
+
+test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; }
+
+# Convex versions that predate uname can use getsysinfo(1)
+
+if [ -x /usr/convex/getsysinfo ]
+then
+ case `getsysinfo -f cpu_type` in
+ c1*)
+ echo c1-convex-bsd
+ exit 0 ;;
+ c2*)
+ if getsysinfo -f scalar_acc
+ then echo c32-convex-bsd
+ else echo c2-convex-bsd
+ fi
+ exit 0 ;;
+ c34*)
+ echo c34-convex-bsd
+ exit 0 ;;
+ c38*)
+ echo c38-convex-bsd
+ exit 0 ;;
+ c4*)
+ echo c4-convex-bsd
+ exit 0 ;;
+ esac
+fi
+
+#echo '(Unable to guess system type)' 1>&2
+
+exit 1
diff --git a/winsup/w32api/config.sub b/winsup/w32api/config.sub
new file mode 100755
index 000000000..ddca57d3c
--- /dev/null
+++ b/winsup/w32api/config.sub
@@ -0,0 +1,1278 @@
+#! /bin/sh
+# Configuration validation subroutine script, version 1.1.
+# Copyright (C) 1991, 92-97, 1998, 1999 Free Software Foundation, Inc.
+# This file is (in principle) common to ALL GNU software.
+# The presence of a machine in this file suggests that SOME GNU software
+# can handle that machine. It does not imply ALL GNU software can.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program 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 General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Configuration subroutine to validate and canonicalize a configuration type.
+# Supply the specified configuration type as an argument.
+# If it is invalid, we print an error message on stderr and exit with code 1.
+# Otherwise, we print the canonical config type on stdout and succeed.
+
+# This file is supposed to be the same for all GNU packages
+# and recognize all the CPU types, system types and aliases
+# that are meaningful with *any* GNU software.
+# Each package is responsible for reporting which valid configurations
+# it does not support. The user should be able to distinguish
+# a failure to support a valid configuration from a meaningless
+# configuration.
+
+# The goal of this file is to map all the various variations of a given
+# machine specification into a single specification in the form:
+# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or in some cases, the newer four-part form:
+# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# It is wrong to echo any other type of specification.
+
+if [ x$1 = x ]
+then
+ echo Configuration name missing. 1>&2
+ echo "Usage: $0 CPU-MFR-OPSYS" 1>&2
+ echo "or $0 ALIAS" 1>&2
+ echo where ALIAS is a recognized configuration type. 1>&2
+ exit 1
+fi
+
+# First pass through any local machine types.
+case $1 in
+ *local*)
+ echo $1
+ exit 0
+ ;;
+ *)
+ ;;
+esac
+
+# CYGNUS LOCAL marketing-names
+# Here we handle any "marketing" names - translating them to
+# standard triplets
+case $1 in
+ mips-tx39-elf)
+ set mipstx39-unknown-elf
+ ;;
+ *)
+ ;;
+esac
+# END CYGNUS LOCAL marketing-names
+
+# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
+# Here we must recognize all the valid KERNEL-OS combinations.
+maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
+case $maybe_os in
+ linux-gnu*)
+ os=-$maybe_os
+ basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
+ ;;
+ *)
+ basic_machine=`echo $1 | sed 's/-[^-]*$//'`
+ if [ $basic_machine != $1 ]
+ then os=`echo $1 | sed 's/.*-/-/'`
+ else os=; fi
+ ;;
+esac
+
+### Let's recognize common machines as not being operating systems so
+### that things like config.sub decstation-3100 work. We also
+### recognize some manufacturers as not being operating systems, so we
+### can provide default operating systems below.
+case $os in
+ -sun*os*)
+ # Prevent following clause from handling this invalid input.
+ ;;
+ -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
+ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
+ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
+ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
+ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
+ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
+ -apple)
+ os=
+ basic_machine=$1
+ ;;
+ -sim | -cisco | -oki | -wec | -winbond ) # EGCS LOCAL
+ os=
+ basic_machine=$1
+ ;;
+ -scout) # EGCS LOCAL
+ ;;
+ -wrs) # EGCS LOCAL
+ os=vxworks
+ basic_machine=$1
+ ;;
+ -hiux*)
+ os=-hiuxwe2
+ ;;
+ -sco5)
+ os=-sco3.2v5
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco4)
+ os=-sco3.2v4
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco3.2.[4-9]*)
+ os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco3.2v[4-9]*)
+ # Don't forget version if it is 3.2v4 or newer.
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco*)
+ os=-sco3.2v2
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -udk*)
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -isc)
+ os=-isc2.2
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -clix*)
+ basic_machine=clipper-intergraph
+ ;;
+ -isc*)
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -lynx*)
+ os=-lynxos
+ ;;
+ -ptx*)
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
+ ;;
+ -windowsnt*)
+ os=`echo $os | sed -e 's/windowsnt/winnt/'`
+ ;;
+ -psos*)
+ os=-psos
+ ;;
+esac
+
+# Decode aliases for certain CPU-COMPANY combinations.
+case $basic_machine in
+ # Recognize the basic CPU types without company name.
+ # Some are omitted here because they have special meanings below.
+ tahoe | i860 | m32r | m68k | m68000 | m88k | ns32k | arc | arm \
+ | arme[lb] | pyramid | mn10200 | mn10300 \
+ | tron | a29k | 580 | i960 | h8300 \
+ | hppa | hppa1.0 | hppa1.1 | hppa2.0 | hppa2.0w | hppa2.0n \
+ | alpha | alphaev[45678] | alphaev56 | alphapca5[67] \
+ | we32k | ns16k | clipper | i370 | sh | powerpc | powerpcle \
+ | 1750a | dsp16xx | pdp11 \
+ | mips64 | mipsel | mips64el | mips64orion | mips64orionel \
+ | mipstx39 | mipstx39el \
+ | sparc | sparclet | sparclite | sparc64 | sparc86x | v850 \
+ | c4x)
+ basic_machine=$basic_machine-unknown
+ ;;
+ m88110 | m680[012346]0 | m683?2 | m68360 | m5200 | z8k | v70 \
+ | h8500 | w65 | fr30) # CYGNUS / EGCS LOCAL
+ basic_machine=$basic_machine-unknown
+ ;;
+ strongarm) # CYGNUS LOCAL nickc/strongarm
+ basic_machine=$basic_machine-unknown
+ ;;
+ thumb)
+ basic_machine=$basic_machine-unknown
+ ;;
+ mips64vr4300 | mips64vr4300el) # EGCS LOCAL jsmith/vr4300
+ basic_machine=$basic_machine-unknown
+ ;;
+ mips64vr4100 | mips64vr4100el) # EGCS LOCAL jsmith/vr4100
+ basic_machine=$basic_machine-unknown
+ ;;
+ mips64vr5000 | mips64vr5000el) # EGCS LOCAL ian/vr5000
+ basic_machine=$basic_machine-unknown
+ ;;
+ mips16)
+ basic_machine=$basic_machine-unknown
+ ;;
+ tic30) # CYGNUS LOCAL ian/tic30
+ basic_machine=$basic_machine-unknown
+ ;;
+ c30) # CYGNUS LOCAL ian/tic30
+ basic_machine=tic30-unknown
+ ;;
+
+ v850e) # CYGNUS LOCAL jtc/v850
+ basic_machine=$basic_machine-unknown
+ ;;
+ v850ea) # CYGNUS LOCAL jtc/v850
+ basic_machine=$basic_machine-unknown
+ ;;
+ d10v)
+ basic_machine=$basic_machine-unknown
+ ;;
+ d30v) # CYGNUS LOCAL hunt/d30v
+ basic_machine=$basic_machine-unknown
+ ;;
+ # We use `pc' rather than `unknown'
+ # because (1) that's what they normally are, and
+ # (2) the word "unknown" tends to confuse beginning users.
+ i[34567]86)
+ basic_machine=$basic_machine-pc
+ ;;
+ # Object if more than one company name word.
+ *-*-*)
+ echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+ exit 1
+ ;;
+ # Recognize the basic CPU types with company name.
+ vax-* | tahoe-* | i[34567]86-* | i860-* | m32r-* | m68k-* | m68000-* \
+ | m88k-* | sparc-* | ns32k-* | fx80-* | arc-* | arm-* | c[123]* \
+ | mips-* | pyramid-* | tron-* | a29k-* | romp-* | rs6000-* \
+ | power-* | none-* | 580-* | cray2-* | h8300-* | i960-* \
+ | xmp-* | ymp-* \
+ | hppa-* | hppa1.0-* | hppa1.1-* \
+ | hppa2.0-* | hppa2.0w-* | hppa2.0n-* \
+ | alpha-* | alphaev[45678]-* | alphaev56-* | alphapca5[67]-* \
+ | we32k-* | cydra-* | ns16k-* | pn-* | np1-* \
+ | xps100-* | clipper-* | orion-* \
+ | sparclite-* | pdp11-* | sh-* | powerpc-* | powerpcle-* \
+ | sparc64-* | sparcv9-* | sparc86x-* | mips64-* | mipsel-* \
+ | mips64el-* | mips64orion-* | mips64orionel-* \
+ | mipstx39-* | mipstx39el-* \
+ | f301-* | arm*-* \
+ | fr30-*) # CYGNUS LOCAL
+ ;;
+ m88110-* | m680[01234]0-* | m683?2-* | m68360-* | z8k-* | h8500-* | d10v-*) # EGCS LOCAL
+ ;;
+ strongarm-*) # CYGNUS LOCAL nickc/strongarm
+ ;;
+ thumb-*) # EGCS LOCAL angela/thumb
+ ;;
+ v850-*) # EGCS LOCAL
+ ;;
+ v850e-*) # CYGNUS LOCAL
+ ;;
+ v850ea-*) # CYGNUS LOCAL
+ ;;
+ d30v-*) # EGCS LOCAL
+ ;;
+ mips64vr4300-* | mips64vr4300el-*) # EGCS LOCAL jsmith/vr4300
+ ;;
+ mips64vr4100-* | mips64vr4100el-*) # EGCS LOCAL jsmith/vr4100
+ ;;
+ mips16-*) # EGCS LOCAL krk/mips16
+ ;;
+ tic30-*) # EGCS LOCAL ian/tic30
+ ;;
+ c30-*) # EGCS LOCAL ian/tic30
+ basic_machine=tic30-unknown
+ ;;
+ # Recognize the various machine names and aliases which stand
+ # for a CPU type and a company and sometimes even an OS.
+ 386bsd) # EGCS LOCAL
+ basic_machine=i386-unknown
+ os=-bsd
+ ;;
+ 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
+ basic_machine=m68000-att
+ ;;
+ 3b*)
+ basic_machine=we32k-att
+ ;;
+ a29khif) # EGCS LOCAL
+ basic_machine=a29k-amd
+ os=-udi
+ ;;
+ adobe68k) # EGCS LOCAL
+ basic_machine=m68010-adobe
+ os=-scout
+ ;;
+ alliant | fx80)
+ basic_machine=fx80-alliant
+ ;;
+ altos | altos3068)
+ basic_machine=m68k-altos
+ ;;
+ am29k)
+ basic_machine=a29k-none
+ os=-bsd
+ ;;
+ amdahl)
+ basic_machine=580-amdahl
+ os=-sysv
+ ;;
+ amiga | amiga-*)
+ basic_machine=m68k-cbm
+ ;;
+ amigaos | amigados)
+ basic_machine=m68k-cbm
+ os=-amigaos
+ ;;
+ amigaunix | amix)
+ basic_machine=m68k-cbm
+ os=-sysv4
+ ;;
+ apollo68)
+ basic_machine=m68k-apollo
+ os=-sysv
+ ;;
+ apollo68bsd) # EGCS LOCAL
+ basic_machine=m68k-apollo
+ os=-bsd
+ ;;
+ aux)
+ basic_machine=m68k-apple
+ os=-aux
+ ;;
+ balance)
+ basic_machine=ns32k-sequent
+ os=-dynix
+ ;;
+ convex-c1)
+ basic_machine=c1-convex
+ os=-bsd
+ ;;
+ convex-c2)
+ basic_machine=c2-convex
+ os=-bsd
+ ;;
+ convex-c32)
+ basic_machine=c32-convex
+ os=-bsd
+ ;;
+ convex-c34)
+ basic_machine=c34-convex
+ os=-bsd
+ ;;
+ convex-c38)
+ basic_machine=c38-convex
+ os=-bsd
+ ;;
+ cray | ymp)
+ basic_machine=ymp-cray
+ os=-unicos
+ ;;
+ cray2)
+ basic_machine=cray2-cray
+ os=-unicos
+ ;;
+ [ctj]90-cray)
+ basic_machine=c90-cray
+ os=-unicos
+ ;;
+ crds | unos)
+ basic_machine=m68k-crds
+ ;;
+ da30 | da30-*)
+ basic_machine=m68k-da30
+ ;;
+ decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
+ basic_machine=mips-dec
+ ;;
+ delta | 3300 | motorola-3300 | motorola-delta \
+ | 3300-motorola | delta-motorola)
+ basic_machine=m68k-motorola
+ ;;
+ delta88)
+ basic_machine=m88k-motorola
+ os=-sysv3
+ ;;
+ dpx20 | dpx20-*)
+ basic_machine=rs6000-bull
+ os=-bosx
+ ;;
+ dpx2* | dpx2*-bull)
+ basic_machine=m68k-bull
+ os=-sysv3
+ ;;
+ ebmon29k)
+ basic_machine=a29k-amd
+ os=-ebmon
+ ;;
+ elxsi)
+ basic_machine=elxsi-elxsi
+ os=-bsd
+ ;;
+ encore | umax | mmax)
+ basic_machine=ns32k-encore
+ ;;
+ es1800 | OSE68k | ose68k | ose | OSE) # EGCS LOCAL
+ basic_machine=m68k-ericsson
+ os=-ose
+ ;;
+ fx2800)
+ basic_machine=i860-alliant
+ ;;
+ genix)
+ basic_machine=ns32k-ns
+ ;;
+ gmicro)
+ basic_machine=tron-gmicro
+ os=-sysv
+ ;;
+ h3050r* | hiux*)
+ basic_machine=hppa1.1-hitachi
+ os=-hiuxwe2
+ ;;
+ h8300hms)
+ basic_machine=h8300-hitachi
+ os=-hms
+ ;;
+ h8300xray) # EGCS LOCAL
+ basic_machine=h8300-hitachi
+ os=-xray
+ ;;
+ h8500hms) # EGCS LOCAL
+ basic_machine=h8500-hitachi
+ os=-hms
+ ;;
+ harris)
+ basic_machine=m88k-harris
+ os=-sysv3
+ ;;
+ hp300-*)
+ basic_machine=m68k-hp
+ ;;
+ hp300bsd)
+ basic_machine=m68k-hp
+ os=-bsd
+ ;;
+ hp300hpux)
+ basic_machine=m68k-hp
+ os=-hpux
+ ;;
+ w89k-*) # EGCS LOCAL
+ basic_machine=hppa1.1-winbond
+ os=-proelf
+ ;;
+ op50n-*) # EGCS LOCAL
+ basic_machine=hppa1.1-oki
+ os=-proelf
+ ;;
+ op60c-*) # EGCS LOCAL
+ basic_machine=hppa1.1-oki
+ os=-proelf
+ ;;
+ hppro) # EGCS LOCAL
+ basic_machine=hppa1.1-hp
+ os=-proelf
+ ;;
+ hp3k9[0-9][0-9] | hp9[0-9][0-9])
+ basic_machine=hppa1.0-hp
+ ;;
+ hp9k2[0-9][0-9] | hp9k31[0-9])
+ basic_machine=m68000-hp
+ ;;
+ hp9k3[2-9][0-9])
+ basic_machine=m68k-hp
+ ;;
+ hp9k6[0-9][0-9] | hp6[0-9][0-9] )
+ basic_machine=hppa1.0-hp
+ ;;
+ hp9k7[0-79][0-9] | hp7[0-79][0-9] )
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k78[0-9] | hp78[0-9] )
+ # FIXME: really hppa2.0-hp
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | \
+ hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893 )
+ # FIXME: really hppa2.0-hp
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k8[0-9][13679] | hp8[0-9][13679] )
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k8[0-9][0-9] | hp8[0-9][0-9])
+ basic_machine=hppa1.0-hp
+ ;;
+ hppa-next)
+ os=-nextstep3
+ ;;
+ hppaosf) # EGCS LOCAL
+ basic_machine=hppa1.1-hp
+ os=-osf
+ ;;
+ i370-ibm* | ibm*)
+ basic_machine=i370-ibm
+ os=-mvs
+ ;;
+# I'm not sure what "Sysv32" means. Should this be sysv3.2?
+ i[34567]86v32)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-sysv32
+ ;;
+ i[34567]86v4*)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-sysv4
+ ;;
+ i[34567]86v)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-sysv
+ ;;
+ i[34567]86sol2)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-solaris2
+ ;;
+ i386mach) # EGCS LOCAL
+ basic_machine=i386-mach
+ os=-mach
+ ;;
+ i386-vsta | vsta) # EGCS LOCAL
+ basic_machine=i386-unknown
+ os=-vsta
+ ;;
+ i386-go32 | go32) # EGCS LOCAL
+ basic_machine=i386-unknown
+ os=-go32
+ ;;
+ i386-mingw32 | mingw32)
+ basic_machine=i386-unknown
+ os=-mingw32
+ ;;
+ iris | iris4d)
+ basic_machine=mips-sgi
+ case $os in
+ -irix*)
+ ;;
+ *)
+ os=-irix4
+ ;;
+ esac
+ ;;
+ isi68 | isi)
+ basic_machine=m68k-isi
+ os=-sysv
+ ;;
+ m88k-omron*)
+ basic_machine=m88k-omron
+ ;;
+ magnum | m3230)
+ basic_machine=mips-mips
+ os=-sysv
+ ;;
+ merlin)
+ basic_machine=ns32k-utek
+ os=-sysv
+ ;;
+ miniframe)
+ basic_machine=m68000-convergent
+ ;;
+ mipsel*-linux*)
+ basic_machine=mipsel-unknown
+ os=-linux-gnu
+ ;;
+ mips*-linux*)
+ basic_machine=mips-unknown
+ os=-linux-gnu
+ ;;
+ mips3*-*)
+ basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
+ ;;
+ mips3*)
+ basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
+ ;;
+ monitor) # EGCS LOCAL
+ basic_machine=m68k-rom68k
+ os=-coff
+ ;;
+ msdos) # EGCS LOCAL
+ basic_machine=i386-unknown
+ os=-msdos
+ ;;
+ ncr3000)
+ basic_machine=i486-ncr
+ os=-sysv4
+ ;;
+ netbsd386)
+ basic_machine=i386-unknown # EGCS LOCAL
+ os=-netbsd
+ ;;
+ netwinder)
+ basic_machine=armv4l-corel
+ os=-linux
+ ;;
+ news | news700 | news800 | news900)
+ basic_machine=m68k-sony
+ os=-newsos
+ ;;
+ news1000)
+ basic_machine=m68030-sony
+ os=-newsos
+ ;;
+ news-3600 | risc-news)
+ basic_machine=mips-sony
+ os=-newsos
+ ;;
+ necv70) # EGCS LOCAL
+ basic_machine=v70-nec
+ os=-sysv
+ ;;
+ next | m*-next )
+ basic_machine=m68k-next
+ case $os in
+ -nextstep* )
+ ;;
+ -ns2*)
+ os=-nextstep2
+ ;;
+ *)
+ os=-nextstep3
+ ;;
+ esac
+ ;;
+ nh3000)
+ basic_machine=m68k-harris
+ os=-cxux
+ ;;
+ nh[45]000)
+ basic_machine=m88k-harris
+ os=-cxux
+ ;;
+ nindy960)
+ basic_machine=i960-intel
+ os=-nindy
+ ;;
+ mon960) # EGCS LOCAL
+ basic_machine=i960-intel
+ os=-mon960
+ ;;
+ np1)
+ basic_machine=np1-gould
+ ;;
+ OSE68000 | ose68000) # EGCS LOCAL
+ basic_machine=m68000-ericsson
+ os=-ose
+ ;;
+ os68k) # EGCS LOCAL
+ basic_machine=m68k-none
+ os=-os68k
+ ;;
+ pa-hitachi)
+ basic_machine=hppa1.1-hitachi
+ os=-hiuxwe2
+ ;;
+ paragon)
+ basic_machine=i860-intel
+ os=-osf
+ ;;
+ pbd)
+ basic_machine=sparc-tti
+ ;;
+ pbb)
+ basic_machine=m68k-tti
+ ;;
+ pc532 | pc532-*)
+ basic_machine=ns32k-pc532
+ ;;
+ pentium | p5 | k5 | nexen)
+ basic_machine=i586-pc
+ ;;
+ pentiumpro | p6 | k6 | 6x86)
+ basic_machine=i686-pc
+ ;;
+ pentiumii | pentium2)
+ basic_machine=i786-pc
+ ;;
+ pentium-* | p5-* | k5-* | nexen-*)
+ basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pentiumpro-* | p6-* | k6-* | 6x86-*)
+ basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pentiumii-* | pentium2-*)
+ basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pn)
+ basic_machine=pn-gould
+ ;;
+ power) basic_machine=rs6000-ibm
+ ;;
+ ppc) basic_machine=powerpc-unknown
+ ;;
+ ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ppcle | powerpclittle | ppc-le | powerpc-little)
+ basic_machine=powerpcle-unknown
+ ;;
+ ppcle-* | powerpclittle-*)
+ basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ps2)
+ basic_machine=i386-ibm
+ ;;
+ rom68k) # EGCS LOCAL
+ basic_machine=m68k-rom68k
+ os=-coff
+ ;;
+ rm[46]00)
+ basic_machine=mips-siemens
+ ;;
+ rtpc | rtpc-*)
+ basic_machine=romp-ibm
+ ;;
+ sa29200) # EGCS LOCAL
+ basic_machine=a29k-amd
+ os=-udi
+ ;;
+ sequent)
+ basic_machine=i386-sequent
+ ;;
+ sh)
+ basic_machine=sh-hitachi
+ os=-hms
+ ;;
+ sparclite-wrs) # EGCS LOCAL
+ basic_machine=sparclite-wrs
+ os=-vxworks
+ ;;
+ sps7)
+ basic_machine=m68k-bull
+ os=-sysv2
+ ;;
+ spur)
+ basic_machine=spur-unknown
+ ;;
+ st2000) # EGCS LOCAL
+ basic_machine=m68k-tandem
+ ;;
+ stratus) # EGCS LOCAL
+ basic_machine=i860-stratus
+ os=-sysv4
+ ;;
+ sun2)
+ basic_machine=m68000-sun
+ ;;
+ sun2os3)
+ basic_machine=m68000-sun
+ os=-sunos3
+ ;;
+ sun2os4)
+ basic_machine=m68000-sun
+ os=-sunos4
+ ;;
+ sun3os3)
+ basic_machine=m68k-sun
+ os=-sunos3
+ ;;
+ sun3os4)
+ basic_machine=m68k-sun
+ os=-sunos4
+ ;;
+ sun4os3)
+ basic_machine=sparc-sun
+ os=-sunos3
+ ;;
+ sun4os4)
+ basic_machine=sparc-sun
+ os=-sunos4
+ ;;
+ sun4sol2)
+ basic_machine=sparc-sun
+ os=-solaris2
+ ;;
+ sun3 | sun3-*)
+ basic_machine=m68k-sun
+ ;;
+ sun4)
+ basic_machine=sparc-sun
+ ;;
+ sun386 | sun386i | roadrunner)
+ basic_machine=i386-sun
+ ;;
+ symmetry)
+ basic_machine=i386-sequent
+ os=-dynix
+ ;;
+ tx39)
+ basic_machine=mipstx39-unknown
+ ;;
+ tx39el)
+ basic_machine=mipstx39el-unknown
+ ;;
+ tower | tower-32)
+ basic_machine=m68k-ncr
+ ;;
+ udi29k)
+ basic_machine=a29k-amd
+ os=-udi
+ ;;
+ ultra3)
+ basic_machine=a29k-nyu
+ os=-sym1
+ ;;
+ v810 | necv810) # EGCS LOCAL
+ basic_machine=v810-nec
+ os=-none
+ ;;
+ vaxv)
+ basic_machine=vax-dec
+ os=-sysv
+ ;;
+ vms)
+ basic_machine=vax-dec
+ os=-vms
+ ;;
+ vpp*|vx|vx-*)
+ basic_machine=f301-fujitsu
+ ;;
+ vxworks960)
+ basic_machine=i960-wrs
+ os=-vxworks
+ ;;
+ vxworks68)
+ basic_machine=m68k-wrs
+ os=-vxworks
+ ;;
+ vxworks29k)
+ basic_machine=a29k-wrs
+ os=-vxworks
+ ;;
+ w65*) # EGCS LOCAL
+ basic_machine=w65-wdc
+ os=-none
+ ;;
+ xmp)
+ basic_machine=xmp-cray
+ os=-unicos
+ ;;
+ xps | xps100)
+ basic_machine=xps100-honeywell
+ ;;
+ z8k-*-coff) # EGCS LOCAL
+ basic_machine=z8k-unknown
+ os=-sim
+ ;;
+ none)
+ basic_machine=none-none
+ os=-none
+ ;;
+
+# Here we handle the default manufacturer of certain CPU types. It is in
+# some cases the only manufacturer, in others, it is the most popular.
+ w89k) # EGCS LOCAL
+ basic_machine=hppa1.1-winbond
+ ;;
+ op50n) # EGCS LOCAL
+ basic_machine=hppa1.1-oki
+ ;;
+ op60c) # EGCS LOCAL
+ basic_machine=hppa1.1-oki
+ ;;
+ mips)
+ if [ x$os = x-linux-gnu ]; then
+ basic_machine=mips-unknown
+ else
+ basic_machine=mips-mips
+ fi
+ ;;
+ romp)
+ basic_machine=romp-ibm
+ ;;
+ rs6000)
+ basic_machine=rs6000-ibm
+ ;;
+ vax)
+ basic_machine=vax-dec
+ ;;
+ pdp11)
+ basic_machine=pdp11-dec
+ ;;
+ we32k)
+ basic_machine=we32k-att
+ ;;
+ sparc | sparcv9)
+ basic_machine=sparc-sun
+ ;;
+ cydra)
+ basic_machine=cydra-cydrome
+ ;;
+ orion)
+ basic_machine=orion-highlevel
+ ;;
+ orion105)
+ basic_machine=clipper-highlevel
+ ;;
+ mac | mpw | mac-mpw) # EGCS LOCAL
+ basic_machine=m68k-apple
+ ;;
+ pmac | pmac-mpw) # EGCS LOCAL
+ basic_machine=powerpc-apple
+ ;;
+ c4x*)
+ basic_machine=c4x-none
+ os=-coff
+ ;;
+ *)
+ echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+ exit 1
+ ;;
+esac
+
+# Here we canonicalize certain aliases for manufacturers.
+case $basic_machine in
+ *-digital*)
+ basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
+ ;;
+ *-commodore*)
+ basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
+ ;;
+ *)
+ ;;
+esac
+
+# Decode manufacturer-specific aliases for certain operating systems.
+
+if [ x"$os" != x"" ]
+then
+case $os in
+ # First match some system type aliases
+ # that might get confused with valid system types.
+ # -solaris* is a basic system type, with this one exception.
+ -solaris1 | -solaris1.*)
+ os=`echo $os | sed -e 's|solaris1|sunos4|'`
+ ;;
+ -solaris)
+ os=-solaris2
+ ;;
+ -svr4*)
+ os=-sysv4
+ ;;
+ -unixware*)
+ os=-sysv4.2uw
+ ;;
+ -gnu/linux*)
+ os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
+ ;;
+ # First accept the basic system types.
+ # The portable systems comes first.
+ # Each alternative MUST END IN A *, to match a version number.
+ # -sysv* is not here because it comes later, after sysvr4.
+ -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
+ | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\
+ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
+ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
+ | -aos* \
+ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
+ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
+ | -hiux* | -386bsd* | -netbsd* | -openbsd* | -freebsd* | -riscix* \
+ | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
+ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
+ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
+ | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+ | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \
+ | -interix* )
+ # Remember, each alternative MUST END IN *, to match a version number.
+ ;;
+ # EGCS LOCAL
+ -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
+ | -windows* | -osx | -abug | -netware* | -os9* | -beos* \
+ | -macos* | -mpw* | -magic* | -mon960* | -lnews* )
+ ;;
+ -mac*)
+ os=`echo $os | sed -e 's|mac|macos|'`
+ ;;
+ # END EGCS LOCAL
+ -linux*)
+ os=`echo $os | sed -e 's|linux|linux-gnu|'`
+ ;;
+ -sunos5*)
+ os=`echo $os | sed -e 's|sunos5|solaris2|'`
+ ;;
+ -sunos6*)
+ os=`echo $os | sed -e 's|sunos6|solaris3|'`
+ ;;
+ -osfrose*)
+ os=-osfrose
+ ;;
+ -osf*)
+ os=-osf
+ ;;
+ -utek*)
+ os=-bsd
+ ;;
+ -dynix*)
+ os=-bsd
+ ;;
+ -acis*)
+ os=-aos
+ ;;
+ -386bsd) # EGCS LOCAL
+ os=-bsd
+ ;;
+ -ctix* | -uts*)
+ os=-sysv
+ ;;
+ -ns2 )
+ os=-nextstep2
+ ;;
+ # Preserve the version number of sinix5.
+ -sinix5.*)
+ os=`echo $os | sed -e 's|sinix|sysv|'`
+ ;;
+ -sinix*)
+ os=-sysv4
+ ;;
+ -triton*)
+ os=-sysv3
+ ;;
+ -oss*)
+ os=-sysv3
+ ;;
+ -svr4)
+ os=-sysv4
+ ;;
+ -svr3)
+ os=-sysv3
+ ;;
+ -sysvr4)
+ os=-sysv4
+ ;;
+ # This must come after -sysvr4.
+ -sysv*)
+ ;;
+ -ose*) # EGCS LOCAL
+ os=-ose
+ ;;
+ -es1800*) # EGCS LOCAL
+ os=-ose
+ ;;
+ -xenix)
+ os=-xenix
+ ;;
+ -none)
+ ;;
+ *)
+ # Get rid of the `-' at the beginning of $os.
+ os=`echo $os | sed 's/[^-]*-//'`
+ echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
+ exit 1
+ ;;
+esac
+else
+
+# Here we handle the default operating systems that come with various machines.
+# The value should be what the vendor currently ships out the door with their
+# machine or put another way, the most popular os provided with the machine.
+
+# Note that if you're going to try to match "-MANUFACTURER" here (say,
+# "-sun"), then you have to tell the case statement up towards the top
+# that MANUFACTURER isn't an operating system. Otherwise, code above
+# will signal an error saying that MANUFACTURER isn't an operating
+# system, and we'll never get to this point.
+
+case $basic_machine in
+ *-acorn)
+ os=-riscix1.2
+ ;;
+ arm*-corel)
+ os=-linux
+ ;;
+ arm*-semi)
+ os=-aout
+ ;;
+ pdp11-*)
+ os=-none
+ ;;
+ *-dec | vax-*)
+ os=-ultrix4.2
+ ;;
+ m68*-apollo)
+ os=-domain
+ ;;
+ i386-sun)
+ os=-sunos4.0.2
+ ;;
+ m68000-sun)
+ os=-sunos3
+ # This also exists in the configure program, but was not the
+ # default.
+ # os=-sunos4
+ ;;
+ m68*-cisco) # EGCS LOCAL
+ os=-aout
+ ;;
+ mips*-cisco) # EGCS LOCAL
+ os=-elf
+ ;;
+ mips*-*) # EGCS LOCAL
+ os=-elf
+ ;;
+ *-tti) # must be before sparc entry or we get the wrong os.
+ os=-sysv3
+ ;;
+ sparc-* | *-sun)
+ os=-sunos4.1.1
+ ;;
+ *-be)
+ os=-beos
+ ;;
+ *-ibm)
+ os=-aix
+ ;;
+ *-wec) # EGCS LOCAL
+ os=-proelf
+ ;;
+ *-winbond) # EGCS LOCAL
+ os=-proelf
+ ;;
+ *-oki) # EGCS LOCAL
+ os=-proelf
+ ;;
+ *-hp)
+ os=-hpux
+ ;;
+ *-hitachi)
+ os=-hiux
+ ;;
+ i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
+ os=-sysv
+ ;;
+ *-cbm)
+ os=-amigaos
+ ;;
+ *-dg)
+ os=-dgux
+ ;;
+ *-dolphin)
+ os=-sysv3
+ ;;
+ m68k-ccur)
+ os=-rtu
+ ;;
+ m88k-omron*)
+ os=-luna
+ ;;
+ *-next )
+ os=-nextstep
+ ;;
+ *-sequent)
+ os=-ptx
+ ;;
+ *-crds)
+ os=-unos
+ ;;
+ *-ns)
+ os=-genix
+ ;;
+ i370-*)
+ os=-mvs
+ ;;
+ *-next)
+ os=-nextstep3
+ ;;
+ *-gould)
+ os=-sysv
+ ;;
+ *-highlevel)
+ os=-bsd
+ ;;
+ *-encore)
+ os=-bsd
+ ;;
+ *-sgi)
+ os=-irix
+ ;;
+ *-siemens)
+ os=-sysv4
+ ;;
+ *-masscomp)
+ os=-rtu
+ ;;
+ f301-fujitsu)
+ os=-uxpv
+ ;;
+ *-rom68k) # EGCS LOCAL
+ os=-coff
+ ;;
+ *-*bug) # EGCS LOCAL
+ os=-coff
+ ;;
+ *-apple) # EGCS LOCAL
+ os=-macos
+ ;;
+ *)
+ os=-none
+ ;;
+esac
+fi
+
+# Here we handle the case where we know the os, and the CPU type, but not the
+# manufacturer. We pick the logical manufacturer.
+vendor=unknown
+case $basic_machine in
+ *-unknown)
+ case $os in
+ -riscix*)
+ vendor=acorn
+ ;;
+ -sunos*)
+ vendor=sun
+ ;;
+ -aix*)
+ vendor=ibm
+ ;;
+ -beos*)
+ vendor=be
+ ;;
+ -hpux*)
+ vendor=hp
+ ;;
+ -mpeix*)
+ vendor=hp
+ ;;
+ -hiux*)
+ vendor=hitachi
+ ;;
+ -unos*)
+ vendor=crds
+ ;;
+ -dgux*)
+ vendor=dg
+ ;;
+ -luna*)
+ vendor=omron
+ ;;
+ -genix*)
+ vendor=ns
+ ;;
+ -mvs*)
+ vendor=ibm
+ ;;
+ -ptx*)
+ vendor=sequent
+ ;;
+ -vxsim* | -vxworks*)
+ vendor=wrs
+ ;;
+ -aux*)
+ vendor=apple
+ ;;
+ -hms*) # EGCS LOCAL
+ vendor=hitachi
+ ;;
+ -mpw* | -macos*) # EGCS LOCAL
+ vendor=apple
+ ;;
+ esac
+ basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
+ ;;
+esac
+
+echo $basic_machine$os
diff --git a/winsup/w32api/configure b/winsup/w32api/configure
new file mode 100755
index 000000000..d180aca5a
--- /dev/null
+++ b/winsup/w32api/configure
@@ -0,0 +1,1481 @@
+#! /bin/sh
+
+# Guess values for system-dependent variables and create Makefiles.
+# Generated automatically using autoconf version 2.13
+# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.
+#
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+
+# Defaults:
+ac_help=
+ac_default_prefix=/usr/local
+# Any additions from configure.in:
+
+# Initialize some variables set by options.
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+build=NONE
+cache_file=./config.cache
+exec_prefix=NONE
+host=NONE
+no_create=
+nonopt=NONE
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+target=NONE
+verbose=
+x_includes=NONE
+x_libraries=NONE
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datadir='${prefix}/share'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+libdir='${exec_prefix}/lib'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+infodir='${prefix}/info'
+mandir='${prefix}/man'
+
+# Initialize some other variables.
+subdirs=
+MFLAGS= MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
+# Maximum number of lines to put in a shell here document.
+ac_max_here_lines=12
+
+ac_prev=
+for ac_option
+do
+
+ # If the previous option needs an argument, assign it.
+ if test -n "$ac_prev"; then
+ eval "$ac_prev=\$ac_option"
+ ac_prev=
+ continue
+ fi
+
+ case "$ac_option" in
+ -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
+ *) ac_optarg= ;;
+ esac
+
+ # Accept the important Cygnus configure options, so we can diagnose typos.
+
+ case "$ac_option" in
+
+ -bindir | --bindir | --bindi | --bind | --bin | --bi)
+ ac_prev=bindir ;;
+ -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+ bindir="$ac_optarg" ;;
+
+ -build | --build | --buil | --bui | --bu)
+ ac_prev=build ;;
+ -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+ build="$ac_optarg" ;;
+
+ -cache-file | --cache-file | --cache-fil | --cache-fi \
+ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+ ac_prev=cache_file ;;
+ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+ cache_file="$ac_optarg" ;;
+
+ -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
+ ac_prev=datadir ;;
+ -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
+ | --da=*)
+ datadir="$ac_optarg" ;;
+
+ -disable-* | --disable-*)
+ ac_feature=`echo $ac_option|sed -e 's/-*disable-//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then
+ { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
+ fi
+ ac_feature=`echo $ac_feature| sed 's/-/_/g'`
+ eval "enable_${ac_feature}=no" ;;
+
+ -enable-* | --enable-*)
+ ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then
+ { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
+ fi
+ ac_feature=`echo $ac_feature| sed 's/-/_/g'`
+ case "$ac_option" in
+ *=*) ;;
+ *) ac_optarg=yes ;;
+ esac
+ eval "enable_${ac_feature}='$ac_optarg'" ;;
+
+ -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+ | --exec | --exe | --ex)
+ ac_prev=exec_prefix ;;
+ -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+ | --exec=* | --exe=* | --ex=*)
+ exec_prefix="$ac_optarg" ;;
+
+ -gas | --gas | --ga | --g)
+ # Obsolete; use --with-gas.
+ with_gas=yes ;;
+
+ -help | --help | --hel | --he)
+ # Omit some internal or obsolete options to make the list less imposing.
+ # This message is too long to be a string in the A/UX 3.1 sh.
+ cat << EOF
+Usage: configure [options] [host]
+Options: [defaults in brackets after descriptions]
+Configuration:
+ --cache-file=FILE cache test results in FILE
+ --help print this message
+ --no-create do not create output files
+ --quiet, --silent do not print \`checking...' messages
+ --version print the version of autoconf that created configure
+Directory and file names:
+ --prefix=PREFIX install architecture-independent files in PREFIX
+ [$ac_default_prefix]
+ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
+ [same as prefix]
+ --bindir=DIR user executables in DIR [EPREFIX/bin]
+ --sbindir=DIR system admin executables in DIR [EPREFIX/sbin]
+ --libexecdir=DIR program executables in DIR [EPREFIX/libexec]
+ --datadir=DIR read-only architecture-independent data in DIR
+ [PREFIX/share]
+ --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc]
+ --sharedstatedir=DIR modifiable architecture-independent data in DIR
+ [PREFIX/com]
+ --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var]
+ --libdir=DIR object code libraries in DIR [EPREFIX/lib]
+ --includedir=DIR C header files in DIR [PREFIX/include]
+ --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include]
+ --infodir=DIR info documentation in DIR [PREFIX/info]
+ --mandir=DIR man documentation in DIR [PREFIX/man]
+ --srcdir=DIR find the sources in DIR [configure dir or ..]
+ --program-prefix=PREFIX prepend PREFIX to installed program names
+ --program-suffix=SUFFIX append SUFFIX to installed program names
+ --program-transform-name=PROGRAM
+ run sed PROGRAM on installed program names
+EOF
+ cat << EOF
+Host type:
+ --build=BUILD configure for building on BUILD [BUILD=HOST]
+ --host=HOST configure for HOST [guessed]
+ --target=TARGET configure for TARGET [TARGET=HOST]
+Features and packages:
+ --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
+ --enable-FEATURE[=ARG] include FEATURE [ARG=yes]
+ --with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
+ --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
+ --x-includes=DIR X include files are in DIR
+ --x-libraries=DIR X library files are in DIR
+EOF
+ if test -n "$ac_help"; then
+ echo "--enable and --with options recognized:$ac_help"
+ fi
+ exit 0 ;;
+
+ -host | --host | --hos | --ho)
+ ac_prev=host ;;
+ -host=* | --host=* | --hos=* | --ho=*)
+ host="$ac_optarg" ;;
+
+ -includedir | --includedir | --includedi | --included | --include \
+ | --includ | --inclu | --incl | --inc)
+ ac_prev=includedir ;;
+ -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+ | --includ=* | --inclu=* | --incl=* | --inc=*)
+ includedir="$ac_optarg" ;;
+
+ -infodir | --infodir | --infodi | --infod | --info | --inf)
+ ac_prev=infodir ;;
+ -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+ infodir="$ac_optarg" ;;
+
+ -libdir | --libdir | --libdi | --libd)
+ ac_prev=libdir ;;
+ -libdir=* | --libdir=* | --libdi=* | --libd=*)
+ libdir="$ac_optarg" ;;
+
+ -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+ | --libexe | --libex | --libe)
+ ac_prev=libexecdir ;;
+ -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+ | --libexe=* | --libex=* | --libe=*)
+ libexecdir="$ac_optarg" ;;
+
+ -localstatedir | --localstatedir | --localstatedi | --localstated \
+ | --localstate | --localstat | --localsta | --localst \
+ | --locals | --local | --loca | --loc | --lo)
+ ac_prev=localstatedir ;;
+ -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+ | --localstate=* | --localstat=* | --localsta=* | --localst=* \
+ | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
+ localstatedir="$ac_optarg" ;;
+
+ -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+ ac_prev=mandir ;;
+ -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+ mandir="$ac_optarg" ;;
+
+ -nfp | --nfp | --nf)
+ # Obsolete; use --without-fp.
+ with_fp=no ;;
+
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c)
+ no_create=yes ;;
+
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+ no_recursion=yes ;;
+
+ -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+ | --oldin | --oldi | --old | --ol | --o)
+ ac_prev=oldincludedir ;;
+ -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+ oldincludedir="$ac_optarg" ;;
+
+ -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+ ac_prev=prefix ;;
+ -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+ prefix="$ac_optarg" ;;
+
+ -program-prefix | --program-prefix | --program-prefi | --program-pref \
+ | --program-pre | --program-pr | --program-p)
+ ac_prev=program_prefix ;;
+ -program-prefix=* | --program-prefix=* | --program-prefi=* \
+ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+ program_prefix="$ac_optarg" ;;
+
+ -program-suffix | --program-suffix | --program-suffi | --program-suff \
+ | --program-suf | --program-su | --program-s)
+ ac_prev=program_suffix ;;
+ -program-suffix=* | --program-suffix=* | --program-suffi=* \
+ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+ program_suffix="$ac_optarg" ;;
+
+ -program-transform-name | --program-transform-name \
+ | --program-transform-nam | --program-transform-na \
+ | --program-transform-n | --program-transform- \
+ | --program-transform | --program-transfor \
+ | --program-transfo | --program-transf \
+ | --program-trans | --program-tran \
+ | --progr-tra | --program-tr | --program-t)
+ ac_prev=program_transform_name ;;
+ -program-transform-name=* | --program-transform-name=* \
+ | --program-transform-nam=* | --program-transform-na=* \
+ | --program-transform-n=* | --program-transform-=* \
+ | --program-transform=* | --program-transfor=* \
+ | --program-transfo=* | --program-transf=* \
+ | --program-trans=* | --program-tran=* \
+ | --progr-tra=* | --program-tr=* | --program-t=*)
+ program_transform_name="$ac_optarg" ;;
+
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ silent=yes ;;
+
+ -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+ ac_prev=sbindir ;;
+ -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+ | --sbi=* | --sb=*)
+ sbindir="$ac_optarg" ;;
+
+ -sharedstatedir | --sharedstatedir | --sharedstatedi \
+ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+ | --sharedst | --shareds | --shared | --share | --shar \
+ | --sha | --sh)
+ ac_prev=sharedstatedir ;;
+ -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+ | --sha=* | --sh=*)
+ sharedstatedir="$ac_optarg" ;;
+
+ -site | --site | --sit)
+ ac_prev=site ;;
+ -site=* | --site=* | --sit=*)
+ site="$ac_optarg" ;;
+
+ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+ ac_prev=srcdir ;;
+ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+ srcdir="$ac_optarg" ;;
+
+ -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+ | --syscon | --sysco | --sysc | --sys | --sy)
+ ac_prev=sysconfdir ;;
+ -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+ sysconfdir="$ac_optarg" ;;
+
+ -target | --target | --targe | --targ | --tar | --ta | --t)
+ ac_prev=target ;;
+ -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+ target="$ac_optarg" ;;
+
+ -v | -verbose | --verbose | --verbos | --verbo | --verb)
+ verbose=yes ;;
+
+ -version | --version | --versio | --versi | --vers)
+ echo "configure generated by autoconf version 2.13"
+ exit 0 ;;
+
+ -with-* | --with-*)
+ ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then
+ { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
+ fi
+ ac_package=`echo $ac_package| sed 's/-/_/g'`
+ case "$ac_option" in
+ *=*) ;;
+ *) ac_optarg=yes ;;
+ esac
+ eval "with_${ac_package}='$ac_optarg'" ;;
+
+ -without-* | --without-*)
+ ac_package=`echo $ac_option|sed -e 's/-*without-//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then
+ { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
+ fi
+ ac_package=`echo $ac_package| sed 's/-/_/g'`
+ eval "with_${ac_package}=no" ;;
+
+ --x)
+ # Obsolete; use --with-x.
+ with_x=yes ;;
+
+ -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+ | --x-incl | --x-inc | --x-in | --x-i)
+ ac_prev=x_includes ;;
+ -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+ x_includes="$ac_optarg" ;;
+
+ -x-libraries | --x-libraries | --x-librarie | --x-librari \
+ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+ ac_prev=x_libraries ;;
+ -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+ x_libraries="$ac_optarg" ;;
+
+ -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; }
+ ;;
+
+ *)
+ if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then
+ echo "configure: warning: $ac_option: invalid host type" 1>&2
+ fi
+ if test "x$nonopt" != xNONE; then
+ { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; }
+ fi
+ nonopt="$ac_option"
+ ;;
+
+ esac
+done
+
+if test -n "$ac_prev"; then
+ { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; }
+fi
+
+trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
+
+# File descriptor usage:
+# 0 standard input
+# 1 file creation
+# 2 errors and warnings
+# 3 some systems may open it to /dev/tty
+# 4 used on the Kubota Titan
+# 6 checking for... messages and results
+# 5 compiler messages saved in config.log
+if test "$silent" = yes; then
+ exec 6>/dev/null
+else
+ exec 6>&1
+fi
+exec 5>./config.log
+
+echo "\
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+" 1>&5
+
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Also quote any args containing shell metacharacters.
+ac_configure_args=
+for ac_arg
+do
+ case "$ac_arg" in
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c) ;;
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;;
+ *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*)
+ ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+ *) ac_configure_args="$ac_configure_args $ac_arg" ;;
+ esac
+done
+
+# NLS nuisances.
+# Only set these to C if already set. These must not be set unconditionally
+# because not all systems understand e.g. LANG=C (notably SCO).
+# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'!
+# Non-C LC_CTYPE values break the ctype check.
+if test "${LANG+set}" = set; then LANG=C; export LANG; fi
+if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi
+if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi
+if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -rf conftest* confdefs.h
+# AIX cpp loses on an empty file, so make sure it contains at least a newline.
+echo > confdefs.h
+
+# A filename unique to this package, relative to the directory that
+# configure is in, which we can look for to find out if srcdir is correct.
+ac_unique_file=lib/scrnsave.c
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+ ac_srcdir_defaulted=yes
+ # Try the directory containing this script, then its parent.
+ ac_prog=$0
+ ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'`
+ test "x$ac_confdir" = "x$ac_prog" && ac_confdir=.
+ srcdir=$ac_confdir
+ if test ! -r $srcdir/$ac_unique_file; then
+ srcdir=..
+ fi
+else
+ ac_srcdir_defaulted=no
+fi
+if test ! -r $srcdir/$ac_unique_file; then
+ if test "$ac_srcdir_defaulted" = yes; then
+ { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; }
+ else
+ { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; }
+ fi
+fi
+srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'`
+
+# Prefer explicitly selected file to automatically selected ones.
+if test -z "$CONFIG_SITE"; then
+ if test "x$prefix" != xNONE; then
+ CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
+ else
+ CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+ fi
+fi
+for ac_site_file in $CONFIG_SITE; do
+ if test -r "$ac_site_file"; then
+ echo "loading site script $ac_site_file"
+ . "$ac_site_file"
+ fi
+done
+
+if test -r "$cache_file"; then
+ echo "loading cache $cache_file"
+ . $cache_file
+else
+ echo "creating cache $cache_file"
+ > $cache_file
+fi
+
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+ac_exeext=
+ac_objext=o
+if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
+ # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu.
+ if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then
+ ac_n= ac_c='
+' ac_t=' '
+ else
+ ac_n=-n ac_c= ac_t=
+ fi
+else
+ ac_n= ac_c='\c' ac_t=
+fi
+
+
+
+ac_aux_dir=
+for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
+ if test -f $ac_dir/install-sh; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install-sh -c"
+ break
+ elif test -f $ac_dir/install.sh; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install.sh -c"
+ break
+ fi
+done
+if test -z "$ac_aux_dir"; then
+ { echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; }
+fi
+ac_config_guess=$ac_aux_dir/config.guess
+ac_config_sub=$ac_aux_dir/config.sub
+ac_configure=$ac_aux_dir/configure # This should be Cygnus configure.
+
+
+# Do some error checking and defaulting for the host and target type.
+# The inputs are:
+# configure --host=HOST --target=TARGET --build=BUILD NONOPT
+#
+# The rules are:
+# 1. You are not allowed to specify --host, --target, and nonopt at the
+# same time.
+# 2. Host defaults to nonopt.
+# 3. If nonopt is not specified, then host defaults to the current host,
+# as determined by config.guess.
+# 4. Target and build default to nonopt.
+# 5. If nonopt is not specified, then target and build default to host.
+
+# The aliases save the names the user supplied, while $host etc.
+# will get canonicalized.
+case $host---$target---$nonopt in
+NONE---*---* | *---NONE---* | *---*---NONE) ;;
+*) { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } ;;
+esac
+
+
+# Make sure we can run config.sub.
+if ${CONFIG_SHELL-/bin/sh} $ac_config_sub sun4 >/dev/null 2>&1; then :
+else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; }
+fi
+
+echo $ac_n "checking host system type""... $ac_c" 1>&6
+echo "configure:573: checking host system type" >&5
+
+host_alias=$host
+case "$host_alias" in
+NONE)
+ case $nonopt in
+ NONE)
+ if host_alias=`${CONFIG_SHELL-/bin/sh} $ac_config_guess`; then :
+ else { echo "configure: error: can not guess host type; you must specify one" 1>&2; exit 1; }
+ fi ;;
+ *) host_alias=$nonopt ;;
+ esac ;;
+esac
+
+host=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $host_alias`
+host_cpu=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+host_vendor=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+echo "$ac_t""$host" 1>&6
+
+echo $ac_n "checking target system type""... $ac_c" 1>&6
+echo "configure:594: checking target system type" >&5
+
+target_alias=$target
+case "$target_alias" in
+NONE)
+ case $nonopt in
+ NONE) target_alias=$host_alias ;;
+ *) target_alias=$nonopt ;;
+ esac ;;
+esac
+
+target=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $target_alias`
+target_cpu=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+target_vendor=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+target_os=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+echo "$ac_t""$target" 1>&6
+
+echo $ac_n "checking build system type""... $ac_c" 1>&6
+echo "configure:612: checking build system type" >&5
+
+build_alias=$build
+case "$build_alias" in
+NONE)
+ case $nonopt in
+ NONE) build_alias=$host_alias ;;
+ *) build_alias=$nonopt ;;
+ esac ;;
+esac
+
+build=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $build_alias`
+build_cpu=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+build_vendor=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+build_os=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+echo "$ac_t""$build" 1>&6
+
+test "$host_alias" != "$target_alias" &&
+ test "$program_prefix$program_suffix$program_transform_name" = \
+ NONENONEs,x,x, &&
+ program_prefix=${target_alias}-
+
+
+# Find a good install program. We prefer a C program (faster),
+# so one script is as good as another. But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# ./install, which can be erroneously created by make from ./install.sh.
+echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
+echo "configure:647: checking for a BSD compatible install" >&5
+if test -z "$INSTALL"; then
+if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ IFS="${IFS= }"; ac_save_IFS="$IFS"; IFS=":"
+ for ac_dir in $PATH; do
+ # Account for people who put trailing slashes in PATH elements.
+ case "$ac_dir/" in
+ /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;;
+ *)
+ # OSF1 and SCO ODT 3.0 have their own names for install.
+ # Don't use installbsd from OSF since it installs stuff as root
+ # by default.
+ for ac_prog in ginstall scoinst install; do
+ if test -f $ac_dir/$ac_prog; then
+ if test $ac_prog = install &&
+ grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then
+ # AIX install. It has an incompatible calling convention.
+ :
+ else
+ ac_cv_path_install="$ac_dir/$ac_prog -c"
+ break 2
+ fi
+ fi
+ done
+ ;;
+ esac
+ done
+ IFS="$ac_save_IFS"
+
+fi
+ if test "${ac_cv_path_install+set}" = set; then
+ INSTALL="$ac_cv_path_install"
+ else
+ # As a last resort, use the slow shell script. We don't cache a
+ # path for INSTALL within a source directory, because that will
+ # break other packages using the cache if that directory is
+ # removed, or if the path is relative.
+ INSTALL="$ac_install_sh"
+ fi
+fi
+echo "$ac_t""$INSTALL" 1>&6
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+
+CFLAGS=${CFLAGS-"-O2 -g"}
+if test $host != $build; then
+ ac_tool_prefix=${host_alias}-
+else
+ ac_tool_prefix=
+fi
+
+# Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:710: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_CC="${ac_tool_prefix}gcc"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+ echo "$ac_t""$CC" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+
+if test -z "$ac_cv_prog_CC"; then
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:742: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_CC="gcc"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_prog_CC" && ac_cv_prog_CC="gcc"
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+ echo "$ac_t""$CC" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+else
+ CC="gcc"
+fi
+fi
+
+
+
+# Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ar; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:779: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_AR'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$AR"; then
+ ac_cv_prog_AR="$AR" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_AR="${ac_tool_prefix}ar"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+fi
+fi
+AR="$ac_cv_prog_AR"
+if test -n "$AR"; then
+ echo "$ac_t""$AR" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+
+if test -z "$ac_cv_prog_AR"; then
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "ar", so it can be a program name with args.
+set dummy ar; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:811: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_AR'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$AR"; then
+ ac_cv_prog_AR="$AR" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_AR="ar"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_prog_AR" && ac_cv_prog_AR="ar"
+fi
+fi
+AR="$ac_cv_prog_AR"
+if test -n "$AR"; then
+ echo "$ac_t""$AR" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+else
+ AR="ar"
+fi
+fi
+
+
+# Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args.
+set dummy ${ac_tool_prefix}as; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:847: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_AS'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$AS"; then
+ ac_cv_prog_AS="$AS" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_AS="${ac_tool_prefix}as"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+fi
+fi
+AS="$ac_cv_prog_AS"
+if test -n "$AS"; then
+ echo "$ac_t""$AS" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+
+if test -z "$ac_cv_prog_AS"; then
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "as", so it can be a program name with args.
+set dummy as; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:879: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_AS'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$AS"; then
+ ac_cv_prog_AS="$AS" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_AS="as"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_prog_AS" && ac_cv_prog_AS="as"
+fi
+fi
+AS="$ac_cv_prog_AS"
+if test -n "$AS"; then
+ echo "$ac_t""$AS" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+else
+ AS="as"
+fi
+fi
+
+
+# Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ranlib; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:915: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$RANLIB"; then
+ ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+fi
+fi
+RANLIB="$ac_cv_prog_RANLIB"
+if test -n "$RANLIB"; then
+ echo "$ac_t""$RANLIB" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+
+if test -z "$ac_cv_prog_RANLIB"; then
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:947: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$RANLIB"; then
+ ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_RANLIB="ranlib"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_prog_RANLIB" && ac_cv_prog_RANLIB="ranlib"
+fi
+fi
+RANLIB="$ac_cv_prog_RANLIB"
+if test -n "$RANLIB"; then
+ echo "$ac_t""$RANLIB" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+else
+ RANLIB="ranlib"
+fi
+fi
+
+
+# Extract the first word of "${ac_tool_prefix}ld", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ld; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:983: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_LD'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$LD"; then
+ ac_cv_prog_LD="$LD" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_LD="${ac_tool_prefix}ld"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+fi
+fi
+LD="$ac_cv_prog_LD"
+if test -n "$LD"; then
+ echo "$ac_t""$LD" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+
+if test -z "$ac_cv_prog_LD"; then
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "ld", so it can be a program name with args.
+set dummy ld; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1015: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_LD'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$LD"; then
+ ac_cv_prog_LD="$LD" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_LD="ld"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_prog_LD" && ac_cv_prog_LD="ld"
+fi
+fi
+LD="$ac_cv_prog_LD"
+if test -n "$LD"; then
+ echo "$ac_t""$LD" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+else
+ LD="ld"
+fi
+fi
+
+
+# Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args.
+set dummy ${ac_tool_prefix}dlltool; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1051: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_DLLTOOL'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$DLLTOOL"; then
+ ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+fi
+fi
+DLLTOOL="$ac_cv_prog_DLLTOOL"
+if test -n "$DLLTOOL"; then
+ echo "$ac_t""$DLLTOOL" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+
+if test -z "$ac_cv_prog_DLLTOOL"; then
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "dlltool", so it can be a program name with args.
+set dummy dlltool; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1083: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_DLLTOOL'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$DLLTOOL"; then
+ ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_DLLTOOL="dlltool"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_prog_DLLTOOL" && ac_cv_prog_DLLTOOL="dlltool"
+fi
+fi
+DLLTOOL="$ac_cv_prog_DLLTOOL"
+if test -n "$DLLTOOL"; then
+ echo "$ac_t""$DLLTOOL" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+else
+ DLLTOOL="dlltool"
+fi
+fi
+
+
+# Extract the first word of "${ac_tool_prefix}windres", so it can be a program name with args.
+set dummy ${ac_tool_prefix}windres; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1119: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_WINDRES'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$WINDRES"; then
+ ac_cv_prog_WINDRES="$WINDRES" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_WINDRES="${ac_tool_prefix}windres"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+fi
+fi
+WINDRES="$ac_cv_prog_WINDRES"
+if test -n "$WINDRES"; then
+ echo "$ac_t""$WINDRES" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+
+if test -z "$ac_cv_prog_WINDRES"; then
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "windres", so it can be a program name with args.
+set dummy windres; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1151: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_WINDRES'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$WINDRES"; then
+ ac_cv_prog_WINDRES="$WINDRES" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_WINDRES="windres"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_prog_WINDRES" && ac_cv_prog_WINDRES="windres"
+fi
+fi
+WINDRES="$ac_cv_prog_WINDRES"
+if test -n "$WINDRES"; then
+ echo "$ac_t""$WINDRES" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+else
+ WINDRES="windres"
+fi
+fi
+
+
+
+echo $ac_n "checking for build environment""... $ac_c" 1>&6
+echo "configure:1186: checking for build environment" >&5
+BUILDENV=
+if test -d ../../winsup; then
+ BUILDENV=cygwin
+elif test -d ../mingw; then
+ BUILDENV=mingw
+fi
+if test -z "$BUILDENV"; then
+ echo "$ac_t""standard" 1>&6
+else
+ echo "$ac_t""$BUILDENV" 1>&6
+fi
+
+
+trap '' 1 2 15
+cat > confcache <<\EOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs. It is not useful on other systems.
+# If it contains results you don't want to keep, you may remove or edit it.
+#
+# By default, configure uses ./config.cache as the cache file,
+# creating it if it does not exist already. You can give configure
+# the --cache-file=FILE option to use a different cache file; that is
+# what configure does when it calls configure scripts in
+# subdirectories, so they share the cache.
+# Giving --cache-file=/dev/null disables caching, for debugging configure.
+# config.status only pays attention to the cache file if you give it the
+# --recheck option to rerun configure.
+#
+EOF
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, don't put newlines in cache variables' values.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(set) 2>&1 |
+ case `(ac_space=' '; set | grep ac_space) 2>&1` in
+ *ac_space=\ *)
+ # `set' does not quote correctly, so add quotes (double-quote substitution
+ # turns \\\\ into \\, and sed turns \\ into \).
+ sed -n \
+ -e "s/'/'\\\\''/g" \
+ -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p"
+ ;;
+ *)
+ # `set' quotes correctly as required by POSIX, so do not add quotes.
+ sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p'
+ ;;
+ esac >> confcache
+if cmp -s $cache_file confcache; then
+ :
+else
+ if test -w $cache_file; then
+ echo "updating cache $cache_file"
+ cat confcache > $cache_file
+ else
+ echo "not updating unwritable cache $cache_file"
+ fi
+fi
+rm -f confcache
+
+trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# Any assignment to VPATH causes Sun make to only execute
+# the first set of double-colon rules, so remove it if not needed.
+# If there is a colon in the path, we need to keep it.
+if test "x$srcdir" = x.; then
+ ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d'
+fi
+
+trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15
+
+# Transform confdefs.h into DEFS.
+# Protect against shell expansion while executing Makefile rules.
+# Protect against Makefile macro expansion.
+cat > conftest.defs <<\EOF
+s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%-D\1=\2%g
+s%[ `~#$^&*(){}\\|;'"<>?]%\\&%g
+s%\[%\\&%g
+s%\]%\\&%g
+s%\$%$$%g
+EOF
+DEFS=`sed -f conftest.defs confdefs.h | tr '\012' ' '`
+rm -f conftest.defs
+
+
+# Without the "./", some shells look in PATH for config.status.
+: ${CONFIG_STATUS=./config.status}
+
+echo creating $CONFIG_STATUS
+rm -f $CONFIG_STATUS
+cat > $CONFIG_STATUS <<EOF
+#! /bin/sh
+# Generated automatically by configure.
+# Run this file to recreate the current configuration.
+# This directory was configured as follows,
+# on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+#
+# $0 $ac_configure_args
+#
+# Compiler output produced by configure, useful for debugging
+# configure, is in ./config.log if it exists.
+
+ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]"
+for ac_option
+do
+ case "\$ac_option" in
+ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+ echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion"
+ exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;;
+ -version | --version | --versio | --versi | --vers | --ver | --ve | --v)
+ echo "$CONFIG_STATUS generated by autoconf version 2.13"
+ exit 0 ;;
+ -help | --help | --hel | --he | --h)
+ echo "\$ac_cs_usage"; exit 0 ;;
+ *) echo "\$ac_cs_usage"; exit 1 ;;
+ esac
+done
+
+ac_given_srcdir=$srcdir
+ac_given_INSTALL="$INSTALL"
+
+trap 'rm -fr `echo "Makefile lib/Makefile" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
+EOF
+cat >> $CONFIG_STATUS <<EOF
+
+# Protect against being on the right side of a sed subst in config.status.
+sed 's/%@/@@/; s/@%/@@/; s/%g\$/@g/; /@g\$/s/[\\\\&%]/\\\\&/g;
+ s/@@/%@/; s/@@/@%/; s/@g\$/%g/' > conftest.subs <<\\CEOF
+$ac_vpsub
+$extrasub
+s%@SHELL@%$SHELL%g
+s%@CFLAGS@%$CFLAGS%g
+s%@CPPFLAGS@%$CPPFLAGS%g
+s%@CXXFLAGS@%$CXXFLAGS%g
+s%@FFLAGS@%$FFLAGS%g
+s%@DEFS@%$DEFS%g
+s%@LDFLAGS@%$LDFLAGS%g
+s%@LIBS@%$LIBS%g
+s%@exec_prefix@%$exec_prefix%g
+s%@prefix@%$prefix%g
+s%@program_transform_name@%$program_transform_name%g
+s%@bindir@%$bindir%g
+s%@sbindir@%$sbindir%g
+s%@libexecdir@%$libexecdir%g
+s%@datadir@%$datadir%g
+s%@sysconfdir@%$sysconfdir%g
+s%@sharedstatedir@%$sharedstatedir%g
+s%@localstatedir@%$localstatedir%g
+s%@libdir@%$libdir%g
+s%@includedir@%$includedir%g
+s%@oldincludedir@%$oldincludedir%g
+s%@infodir@%$infodir%g
+s%@mandir@%$mandir%g
+s%@host@%$host%g
+s%@host_alias@%$host_alias%g
+s%@host_cpu@%$host_cpu%g
+s%@host_vendor@%$host_vendor%g
+s%@host_os@%$host_os%g
+s%@target@%$target%g
+s%@target_alias@%$target_alias%g
+s%@target_cpu@%$target_cpu%g
+s%@target_vendor@%$target_vendor%g
+s%@target_os@%$target_os%g
+s%@build@%$build%g
+s%@build_alias@%$build_alias%g
+s%@build_cpu@%$build_cpu%g
+s%@build_vendor@%$build_vendor%g
+s%@build_os@%$build_os%g
+s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g
+s%@INSTALL_SCRIPT@%$INSTALL_SCRIPT%g
+s%@INSTALL_DATA@%$INSTALL_DATA%g
+s%@CC@%$CC%g
+s%@AR@%$AR%g
+s%@AS@%$AS%g
+s%@RANLIB@%$RANLIB%g
+s%@LD@%$LD%g
+s%@DLLTOOL@%$DLLTOOL%g
+s%@WINDRES@%$WINDRES%g
+s%@BUILDENV@%$BUILDENV%g
+
+CEOF
+EOF
+
+cat >> $CONFIG_STATUS <<\EOF
+
+# Split the substitutions into bite-sized pieces for seds with
+# small command number limits, like on Digital OSF/1 and HP-UX.
+ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script.
+ac_file=1 # Number of current file.
+ac_beg=1 # First line for current file.
+ac_end=$ac_max_sed_cmds # Line after last line for current file.
+ac_more_lines=:
+ac_sed_cmds=""
+while $ac_more_lines; do
+ if test $ac_beg -gt 1; then
+ sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file
+ else
+ sed "${ac_end}q" conftest.subs > conftest.s$ac_file
+ fi
+ if test ! -s conftest.s$ac_file; then
+ ac_more_lines=false
+ rm -f conftest.s$ac_file
+ else
+ if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds="sed -f conftest.s$ac_file"
+ else
+ ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file"
+ fi
+ ac_file=`expr $ac_file + 1`
+ ac_beg=$ac_end
+ ac_end=`expr $ac_end + $ac_max_sed_cmds`
+ fi
+done
+if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds=cat
+fi
+EOF
+
+cat >> $CONFIG_STATUS <<EOF
+
+CONFIG_FILES=\${CONFIG_FILES-"Makefile lib/Makefile"}
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then
+ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+ case "$ac_file" in
+ *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
+ ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+ *) ac_file_in="${ac_file}.in" ;;
+ esac
+
+ # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories.
+
+ # Remove last slash and all that follows it. Not all systems have dirname.
+ ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
+ if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
+ # The file is in a subdirectory.
+ test ! -d "$ac_dir" && mkdir "$ac_dir"
+ ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`"
+ # A "../" for each directory in $ac_dir_suffix.
+ ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'`
+ else
+ ac_dir_suffix= ac_dots=
+ fi
+
+ case "$ac_given_srcdir" in
+ .) srcdir=.
+ if test -z "$ac_dots"; then top_srcdir=.
+ else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;;
+ /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;;
+ *) # Relative path.
+ srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix"
+ top_srcdir="$ac_dots$ac_given_srcdir" ;;
+ esac
+
+ case "$ac_given_INSTALL" in
+ [/$]*) INSTALL="$ac_given_INSTALL" ;;
+ *) INSTALL="$ac_dots$ac_given_INSTALL" ;;
+ esac
+
+ echo creating "$ac_file"
+ rm -f "$ac_file"
+ configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure."
+ case "$ac_file" in
+ *Makefile*) ac_comsub="1i\\
+# $configure_input" ;;
+ *) ac_comsub= ;;
+ esac
+
+ ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
+ sed -e "$ac_comsub
+s%@configure_input@%$configure_input%g
+s%@srcdir@%$srcdir%g
+s%@top_srcdir@%$top_srcdir%g
+s%@INSTALL@%$INSTALL%g
+" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file
+fi; done
+rm -f conftest.s*
+
+EOF
+cat >> $CONFIG_STATUS <<EOF
+
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+
+exit 0
+EOF
+chmod +x $CONFIG_STATUS
+rm -fr confdefs* $ac_clean_files
+test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1
+
diff --git a/winsup/w32api/configure.in b/winsup/w32api/configure.in
new file mode 100644
index 000000000..ffc31dac8
--- /dev/null
+++ b/winsup/w32api/configure.in
@@ -0,0 +1,51 @@
+dnl Process this file with autoconf to produce a configure script.
+
+dnl This file is part of a free win32 library
+dnl
+dnl This program is distributed in the hope that it will be useful,
+dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
+dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+dnl GNU General Public License for more details.
+
+AC_PREREQ(2.12)
+AC_INIT(lib/scrnsave.c)
+
+AC_CANONICAL_SYSTEM
+
+dnl Find install command
+AC_PROG_INSTALL
+
+dnl check for cc and CFLAGS
+CFLAGS=${CFLAGS-"-O2 -g"}
+AC_CHECK_TOOL(CC, gcc, gcc)
+AC_SUBST(CC)
+
+dnl check for various tools
+AC_CHECK_TOOL(AR, ar, ar)
+AC_SUBST(AR)
+AC_CHECK_TOOL(AS, as, as)
+AC_SUBST(AS)
+AC_CHECK_TOOL(RANLIB, ranlib, ranlib)
+AC_SUBST(RANLIB)
+AC_CHECK_TOOL(LD, ld, ld)
+AC_SUBST(LD)
+AC_CHECK_TOOL(DLLTOOL, dlltool, dlltool)
+AC_SUBST(DLLTOOL)
+AC_CHECK_TOOL(WINDRES, windres, windres)
+AC_SUBST(WINDRES)
+
+AC_MSG_CHECKING([for build environment])
+BUILDENV=
+if test -d ../../winsup; then
+ BUILDENV=cygwin
+elif test -d ../mingw; then
+ BUILDENV=mingw
+fi
+if test -z "$BUILDENV"; then
+ AC_MSG_RESULT(standard)
+else
+ AC_MSG_RESULT($BUILDENV)
+fi
+AC_SUBST(BUILDENV)
+
+AC_OUTPUT(Makefile lib/Makefile)
diff --git a/winsup/w32api/include/basetyps.h b/winsup/w32api/include/basetyps.h
new file mode 100644
index 000000000..0f2744c83
--- /dev/null
+++ b/winsup/w32api/include/basetyps.h
@@ -0,0 +1,137 @@
+#ifndef _BASETYPS_H
+#define _BASETYPS_H
+
+#ifndef __OBJC__
+#ifdef __cplusplus
+#define EXTERN_C extern "C"
+#else
+#define EXTERN_C extern
+#endif
+#define STDMETHODCALLTYPE __stdcall
+#define STDMETHODVCALLTYPE __cdecl
+#define STDAPICALLTYPE __stdcall
+#define STDAPIVCALLTYPE __cdecl
+#define STDAPI EXTERN_C HRESULT STDAPICALLTYPE
+#define STDAPI_(t) EXTERN_C t STDAPICALLTYPE
+#define STDMETHODIMP HRESULT STDMETHODCALLTYPE
+#define STDMETHODIMP_(t) t STDMETHODCALLTYPE
+#define STDAPIV EXTERN_C HRESULT STDAPIVCALLTYPE
+#define STDAPIV_(t) EXTERN_C t STDAPIVCALLTYPE
+#define STDMETHODIMPV HRESULT STDMETHODVCALLTYPE
+#define STDMETHODIMPV_(t) t STDMETHODVCALLTYPE
+#define interface struct
+#if defined(__cplusplus) && !defined(CINTERFACE)
+#define STDMETHOD(m) virtual HRESULT STDMETHODCALLTYPE m
+#define STDMETHOD_(t,m) virtual t STDMETHODCALLTYPE m
+#define PURE =0
+#define THIS_
+#define THIS void
+#if defined(__GNUC__) && !defined(NOCOMATTRIBUTE)
+#define DECLARE_INTERFACE(i) interface __attribute__((com_interface)) i
+#define DECLARE_INTERFACE_(i,b) interface __attribute__((com_interface)) i : public b
+#else
+#define DECLARE_INTERFACE(i) interface i
+#define DECLARE_INTERFACE_(i,b) interface i : public b
+#endif
+#else
+#define STDMETHOD(m) HRESULT(STDMETHODCALLTYPE *m)
+#define STDMETHOD_(t,m) t(STDMETHODCALLTYPE *m)
+#define PURE
+#define THIS_ INTERFACE *,
+#define THIS INTERFACE *
+#ifndef CONST_VTABLE
+#define CONST_VTABLE
+#endif
+#define DECLARE_INTERFACE(i) \
+typedef interface i { CONST_VTABLE struct i##Vtbl *lpVtbl; } i; \
+typedef CONST_VTABLE struct i##Vtbl i##Vtbl; \
+CONST_VTABLE struct i##Vtbl
+#define DECLARE_INTERFACE_(i,b) DECLARE_INTERFACE(i)
+#endif
+#define BEGIN_INTERFACE
+#define END_INTERFACE
+
+#define FWD_DECL(i) typedef interface i i
+#if defined(__cplusplus) && !defined(CINTERFACE)
+#define IENUM_THIS(T)
+#define IENUM_THIS_(T)
+#else
+#define IENUM_THIS(T) T*
+#define IENUM_THIS_(T) T*,
+#endif
+#define DECLARE_ENUMERATOR_(I,T) \
+DECLARE_INTERFACE_(I,IUnknown) \
+{ \
+ STDMETHOD(QueryInterface)(IENUM_THIS_(I) REFIID,PVOID*) PURE; \
+ STDMETHOD_(ULONG,AddRef)(IENUM_THIS(I)) PURE; \
+ STDMETHOD_(ULONG,Release)(IENUM_THIS(I)) PURE; \
+ STDMETHOD(Next)(IENUM_THIS_(I) ULONG,T*,ULONG*) PURE; \
+ STDMETHOD(Skip)(IENUM_THIS_(I) ULONG) PURE; \
+ STDMETHOD(Reset)(IENUM_THIS(I)) PURE; \
+ STDMETHOD(Clone)(IENUM_THIS_(I) I**) PURE; \
+}
+#define DECLARE_ENUMERATOR(T) DECLARE_ENUMERATOR_(IEnum##T,T)
+
+#endif /* __OBJC__ */
+
+#ifndef GUID_DEFINED
+#define GUID_DEFINED
+typedef struct _GUID
+{
+ unsigned long Data1;
+ unsigned short Data2;
+ unsigned short Data3;
+ unsigned char Data4[8];
+} GUID,*REFGUID,*LPGUID;
+#endif /* GUID_DEFINED */
+#ifndef UUID_DEFINED
+#define UUID_DEFINED
+typedef GUID UUID;
+#endif /* UUID_DEFINED */
+typedef GUID IID;
+typedef GUID CLSID;
+typedef CLSID *LPCLSID;
+typedef IID *LPIID;
+typedef IID *REFIID;
+typedef CLSID *REFCLSID;
+typedef GUID FMTID;
+typedef FMTID *REFFMTID;
+typedef unsigned long error_status_t;
+#define uuid_t UUID
+typedef unsigned long PROPID;
+
+#ifndef _REFGUID_DEFINED
+#ifdef __cplusplus
+#define REFGUID const GUID&
+#define REFIID const IID&
+#define REFCLSID const CLSID&
+#else
+#define REFGUID const GUID* const
+#define REFIID const IID* const
+#define REFCLSID const CLSID* const
+#endif
+#define _REFGUID_DEFINED
+#define _REFGIID_DEFINED
+#define _REFCLSID_DEFINED
+#endif
+#ifndef GUID_SECTION
+#define GUID_SECTION ".text"
+#endif
+#ifdef __GNUC__
+#define GUID_SECT __attribute__ ((section (GUID_SECTION)))
+#else
+#define GUID_SECT
+#endif
+#if !defined(INITGUID) || (defined(INITGUID) && defined(__cplusplus))
+#define GUID_EXT EXTERN_C
+#else
+#define GUID_EXT
+#endif
+#ifdef INITGUID
+#define DEFINE_GUID(n,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) GUID_EXT const GUID n GUID_SECT = {l,w1,w2,{b1,b2,b3,b4,b5,b6,b7,b8}}
+#define DEFINE_OLEGUID(n,l,w1,w2) DEFINE_GUID(n,l,w1,w2,0xC0,0,0,0,0,0,0,0x46)
+#else
+#define DEFINE_GUID(n,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) GUID_EXT const GUID n
+#define DEFINE_OLEGUID(n,l,w1,w2) DEFINE_GUID(n,l,w1,w2,0xC0,0,0,0,0,0,0,0x46)
+#endif
+#endif
diff --git a/winsup/w32api/include/cderr.h b/winsup/w32api/include/cderr.h
new file mode 100644
index 000000000..f148fc4d3
--- /dev/null
+++ b/winsup/w32api/include/cderr.h
@@ -0,0 +1,40 @@
+#ifndef _CDERR_H
+#define _CDERR_H
+#define CDERR_DIALOGFAILURE 0xFFFF
+#define CDERR_GENERALCODES 0x0000
+#define CDERR_STRUCTSIZE 0x0001
+#define CDERR_INITIALIZATION 0x0002
+#define CDERR_NOTEMPLATE 0x0003
+#define CDERR_NOHINSTANCE 0x0004
+#define CDERR_LOADSTRFAILURE 0x0005
+#define CDERR_FINDRESFAILURE 0x0006
+#define CDERR_LOADRESFAILURE 0x0007
+#define CDERR_LOCKRESFAILURE 0x0008
+#define CDERR_MEMALLOCFAILURE 0x0009
+#define CDERR_MEMLOCKFAILURE 0x000A
+#define CDERR_NOHOOK 0x000B
+#define CDERR_REGISTERMSGFAIL 0x000C
+#define PDERR_PRINTERCODES 0x1000
+#define PDERR_SETUPFAILURE 0x1001
+#define PDERR_PARSEFAILURE 0x1002
+#define PDERR_RETDEFFAILURE 0x1003
+#define PDERR_LOADDRVFAILURE 0x1004
+#define PDERR_GETDEVMODEFAIL 0x1005
+#define PDERR_INITFAILURE 0x1006
+#define PDERR_NODEVICES 0x1007
+#define PDERR_NODEFAULTPRN 0x1008
+#define PDERR_DNDMMISMATCH 0x1009
+#define PDERR_CREATEICFAILURE 0x100A
+#define PDERR_PRINTERNOTFOUND 0x100B
+#define PDERR_DEFAULTDIFFERENT 0x100C
+#define CFERR_CHOOSEFONTCODES 0x2000
+#define CFERR_NOFONTS 0x2001
+#define CFERR_MAXLESSTHANMIN 0x2002
+#define FNERR_FILENAMECODES 0x3000
+#define FNERR_SUBCLASSFAILURE 0x3001
+#define FNERR_INVALIDFILENAME 0x3002
+#define FNERR_BUFFERTOOSMALL 0x3003
+#define FRERR_FINDREPLACECODES 0x4000
+#define FRERR_BUFFERLENGTHZERO 0x4001
+#define CCERR_CHOOSECOLORCODES 0x5000
+#endif
diff --git a/winsup/w32api/include/cguid.h b/winsup/w32api/include/cguid.h
new file mode 100644
index 000000000..9f08f5a62
--- /dev/null
+++ b/winsup/w32api/include/cguid.h
@@ -0,0 +1,78 @@
+#ifndef _CGUID_H
+#define _CGUID_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+extern const IID GUID_NULL;
+extern const IID IID_IRpcChannel;
+extern const IID IID_IRpcStub;
+extern const IID IID_IStubManager;
+extern const IID IID_IRpcProxy;
+extern const IID IID_IProxyManager;
+extern const IID IID_IPSFactory;
+extern const IID IID_IInternalMoniker;
+extern const IID IID_IDfReserved1;
+extern const IID IID_IDfReserved2;
+extern const IID IID_IDfReserved3;
+extern const CLSID CLSID_StdMarshal;
+extern const IID IID_IStub;
+extern const IID IID_IProxy;
+extern const IID IID_IEnumGeneric;
+extern const IID IID_IEnumHolder;
+extern const IID IID_IEnumCallback;
+extern const IID IID_IOleManager;
+extern const IID IID_IOlePresObj;
+extern const IID IID_IDebug;
+extern const IID IID_IDebugStream;
+extern const CLSID CLSID_PSGenObject;
+extern const CLSID CLSID_PSClientSite;
+extern const CLSID CLSID_PSClassObject;
+extern const CLSID CLSID_PSInPlaceActive;
+extern const CLSID CLSID_PSInPlaceFrame;
+extern const CLSID CLSID_PSDragDrop;
+extern const CLSID CLSID_PSBindCtx;
+extern const CLSID CLSID_PSEnumerators;
+extern const CLSID CLSID_StaticMetafile;
+extern const CLSID CLSID_StaticDib;
+extern const CLSID CID_CDfsVolume;
+extern const CLSID CLSID_CCDFormKrnl;
+extern const CLSID CLSID_CCDPropertyPage;
+extern const CLSID CLSID_CCDFormDialog;
+extern const CLSID CLSID_CCDCommandButton;
+extern const CLSID CLSID_CCDComboBox;
+extern const CLSID CLSID_CCDTextBox;
+extern const CLSID CLSID_CCDCheckBox;
+extern const CLSID CLSID_CCDLabel;
+extern const CLSID CLSID_CCDOptionButton;
+extern const CLSID CLSID_CCDListBox;
+extern const CLSID CLSID_CCDScrollBar;
+extern const CLSID CLSID_CCDGroupBox;
+extern const CLSID CLSID_CCDGeneralPropertyPage;
+extern const CLSID CLSID_CCDGenericPropertyPage;
+extern const CLSID CLSID_CCDFontPropertyPage;
+extern const CLSID CLSID_CCDColorPropertyPage;
+extern const CLSID CLSID_CCDLabelPropertyPage;
+extern const CLSID CLSID_CCDCheckBoxPropertyPage;
+extern const CLSID CLSID_CCDTextBoxPropertyPage;
+extern const CLSID CLSID_CCDOptionButtonPropertyPage;
+extern const CLSID CLSID_CCDListBoxPropertyPage;
+extern const CLSID CLSID_CCDCommandButtonPropertyPage;
+extern const CLSID CLSID_CCDComboBoxPropertyPage;
+extern const CLSID CLSID_CCDScrollBarPropertyPage;
+extern const CLSID CLSID_CCDGroupBoxPropertyPage;
+extern const CLSID CLSID_CCDXObjectPropertyPage;
+extern const CLSID CLSID_CStdPropertyFrame;
+extern const CLSID CLSID_CFormPropertyPage;
+extern const CLSID CLSID_CGridPropertyPage;
+extern const CLSID CLSID_CWSJArticlePage;
+extern const CLSID CLSID_CSystemPage;
+extern const CLSID CLSID_IdentityUnmarshal;
+extern const CLSID CLSID_InProcFreeMarshaler;
+extern const CLSID CLSID_Picture_Metafile;
+extern const CLSID CLSID_Picture_EnhMetafile;
+extern const CLSID CLSID_Picture_Dib;
+extern const GUID GUID_TRISTATE;
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/winsup/w32api/include/commctrl.h b/winsup/w32api/include/commctrl.h
new file mode 100644
index 000000000..359761f83
--- /dev/null
+++ b/winsup/w32api/include/commctrl.h
@@ -0,0 +1,2059 @@
+#ifndef _COMMCTRL_H
+#define _COMMCTRL_H
+#include <prsht.h>
+#ifdef __cplusplus
+extern "C" {
+#endif
+#ifndef _WIN32_IE
+/* define _WIN32_IE if you really want it */
+#if 0
+#define _WIN32_IE 0x0300
+#endif
+#endif
+
+#define DRAGLISTMSGSTRING TEXT("commctrl_DragListMsg")
+#define ANIMATE_CLASSW L"SysAnimate32"
+#define ANIMATE_CLASSA "SysAnimate32"
+#define HOTKEY_CLASSA "msctls_hotkey32"
+#define HOTKEY_CLASSW L"msctls_hotkey32"
+#define PROGRESS_CLASSA "msctls_progress32"
+#define PROGRESS_CLASSW L"msctls_progress32"
+#define STATUSCLASSNAMEA "msctls_statusbar32"
+#define STATUSCLASSNAMEW L"msctls_statusbar32"
+#define TOOLBARCLASSNAMEW L"ToolbarWindow32"
+#define TOOLBARCLASSNAMEA "ToolbarWindow32"
+#define TOOLTIPS_CLASSW L"tooltips_class32"
+#define TOOLTIPS_CLASSA "tooltips_class32"
+#define TRACKBAR_CLASSA "msctls_trackbar32"
+#define TRACKBAR_CLASSW L"msctls_trackbar32"
+#define UPDOWN_CLASSA "msctls_updown32"
+#define UPDOWN_CLASSW L"msctls_updown32"
+#define WC_LISTVIEWA "SysListView32"
+#define WC_LISTVIEWW L"SysListView32"
+#define WC_TABCONTROLA "SysTabControl32"
+#define WC_TABCONTROLW L"SysTabControl32"
+#define WC_TREEVIEWA "SysTreeView32"
+#define WC_TREEVIEWW L"SysTreeView32"
+#define WC_HEADERA "SysHeader32"
+#define WC_HEADERW L"SysHeader32"
+#define DATETIMEPICK_CLASSW L"SysDateTimePick32"
+#define DATETIMEPICK_CLASSA "SysDateTimePick32"
+#define MONTHCAL_CLASSW L"SysMonthCal32"
+#define MONTHCAL_CLASSA "SysMonthCal32"
+#define REBARCLASSNAMEW L"ReBarWindow32"
+#define REBARCLASSNAMEA "ReBarWindow32"
+#define LVM_FIRST 0x1000
+#define TV_FIRST 0x1100
+#define HDM_FIRST 0x1200
+#define ACM_OPENA (WM_USER+100)
+#define ACM_PLAY (WM_USER+101)
+#define ACM_STOP (WM_USER+102)
+#define ACM_OPENW (WM_USER+103)
+#define ACN_START 1
+#define ACN_STOP 2
+#define DL_BEGINDRAG 1157
+#define DL_CANCELDRAG 1160
+#define DL_DRAGGING 1158
+#define DL_DROPPED 1159
+#define DL_CURSORSET 0
+#define DL_STOPCURSOR 1
+#define DL_COPYCURSOR 2
+#define DL_MOVECURSOR 3
+#define CCS_TOP 1
+#define CCS_NOMOVEY 2
+#define CCS_BOTTOM 3
+#define CCS_NORESIZE 4
+#define CCS_NOPARENTALIGN 8
+#define CCS_ADJUSTABLE 32
+#define CCS_NODIVIDER 64
+#if (_WIN32_IE >= 0x0300)
+#define CCS_VERT 128
+#define CCS_LEFT 129
+#define CCS_NOMOVEX 130
+#define CCS_RIGHT 131
+#endif
+#define CMB_MASKED 2
+#define MINSYSCOMMAND SC_SIZE
+#define SBT_OWNERDRAW 0x1000
+#define SBT_NOBORDERS 256
+#define SBT_POPOUT 512
+#define SBT_RTLREADING 1024
+#define SB_SETTEXTA (WM_USER+1)
+#define SB_SETTEXTW (WM_USER+11)
+#define SB_GETTEXTA (WM_USER+2)
+#define SB_GETTEXTW (WM_USER+13)
+#define SB_GETTEXTLENGTHA (WM_USER+3)
+#define SB_GETTEXTLENGTHW (WM_USER+12)
+#define SB_SETPARTS (WM_USER+4)
+#define SB_GETPARTS (WM_USER+6)
+#define SB_GETBORDERS (WM_USER+7)
+#define SB_SETMINHEIGHT (WM_USER+8)
+#define SB_SIMPLE (WM_USER+9)
+#define SB_GETRECT (WM_USER+10)
+#define MSGF_COMMCTRL_BEGINDRAG 0x4200
+#define MSGF_COMMCTRL_SIZEHEADER 0x4201
+#define MSGF_COMMCTRL_DRAGSELECT 0x4202
+#define MSGF_COMMCTRL_TOOLBARCUST 0x4203
+#define ILC_COLOR 0
+#define ILC_COLOR4 4
+#define ILC_COLOR8 8
+#define ILC_COLOR16 16
+#define ILC_COLOR24 24
+#define ILC_COLOR32 32
+#define ILC_COLORDDB 254
+#define ILC_MASK 1
+#define ILC_PALETTE 2048
+#define ILD_BLEND25 2
+#define ILD_BLEND50 4
+#define ILD_SELECTED 4
+#define ILD_BLEND 4
+#define ILD_FOCUS 2
+#define ILD_MASK 16
+#define ILD_NORMAL 0
+#define ILD_TRANSPARENT 1
+#define HDS_HORZ 0
+#define HDS_BUTTONS 2
+#define HDS_HIDDEN 8
+#define NM_FIRST 0
+#define NM_LAST (-99)
+#define LVN_FIRST (-100)
+#define LVN_LAST (-199)
+#define HDN_FIRST (-300)
+#define HDN_LAST (-399)
+#define TVN_FIRST (-400)
+#define TVN_LAST (-499)
+#define TTN_FIRST (-520)
+#define TTN_LAST (-549)
+#define TCN_FIRST (-550)
+#define TCN_LAST (-580)
+#define CDN_FIRST (-601)
+#define CDN_LAST (-699)
+#define TBN_FIRST (-700)
+#define TBN_LAST (-720)
+#define UDN_FIRST (-721)
+#define UDN_LAST (-740)
+#if (_WIN32_IE >= 0x0300)
+#define RBN_FIRST (-831)
+#define RBN_LAST (-859)
+#define MCN_FIRST (-750)
+#define MCN_LAST (-759)
+#define DTN_FIRST (-760)
+#define DTN_LAST (-799)
+#define CBEN_FIRST (-800)
+#define CBEN_LAST (-830)
+#endif /* _WIN32_IE */
+#define HDI_WIDTH 1
+#define HDI_HEIGHT 1
+#define HDI_TEXT 2
+#define HDI_FORMAT 4
+#define HDI_LPARAM 8
+#define HDI_BITMAP 16
+#define HDF_LEFT 0
+#define HDF_RIGHT 1
+#define HDF_CENTER 2
+#define HDF_JUSTIFYMASK3
+#define HDF_RTLREADING 4
+#define HDF_OWNERDRAW 0x8000
+#define HDF_STRING 0x4000
+#define HDF_BITMAP 0x2000
+#define HDM_GETITEMCOUNT HDM_FIRST
+#define HDM_INSERTITEMA (HDM_FIRST+1)
+#define HDM_INSERTITEMW (HDM_FIRST+10)
+#define HDM_DELETEITEM (HDM_FIRST+2)
+#define HDM_GETITEMA (HDM_FIRST+3)
+#define HDM_GETITEMW (HDM_FIRST+11)
+#define HDM_SETITEMA (HDM_FIRST+4)
+#define HDM_SETITEMW (HDM_FIRST+12)
+#define HDM_LAYOUT (HDM_FIRST+5)
+#define HHT_NOWHERE 1
+#define HHT_ONHEADER 2
+#define HHT_ONDIVIDER 4
+#define HHT_ONDIVOPEN 8
+#define HHT_ABOVE 256
+#define HHT_BELOW 512
+#define HHT_TORIGHT 1024
+#define HHT_TOLEFT 2048
+#define HDM_HITTEST (HDM_FIRST+6)
+#define HDN_ITEMCHANGINGA (HDN_FIRST-0)
+#define HDN_ITEMCHANGINGW (HDN_FIRST-20)
+#define HDN_ITEMCHANGEDA (HDN_FIRST-1)
+#define HDN_ITEMCHANGEDW (HDN_FIRST-21)
+#define HDN_ITEMCLICKA (HDN_FIRST-2)
+#define HDN_ITEMCLICKW (HDN_FIRST-22)
+#define HDN_ITEMDBLCLICKA (HDN_FIRST-3)
+#define HDN_ITEMDBLCLICKW (HDN_FIRST-23)
+#define HDN_DIVIDERDBLCLICKA (HDN_FIRST-5)
+#define HDN_DIVIDERDBLCLICKW (HDN_FIRST-25)
+#define HDN_BEGINTRACKA (HDN_FIRST-6)
+#define HDN_BEGINTRACKW (HDN_FIRST-26)
+#define HDN_ENDTRACKA (HDN_FIRST-7)
+#define HDN_ENDTRACKW (HDN_FIRST-27)
+#define HDN_TRACKA (HDN_FIRST-8)
+#define HDN_TRACKW (HDN_FIRST-28)
+#define CMB_MASKED 2
+#define TBSTATE_CHECKED 1
+#define TBSTATE_PRESSED 2
+#define TBSTATE_ENABLED 4
+#define TBSTATE_HIDDEN 8
+#define TBSTATE_INDETERMINATE 16
+#define TBSTATE_WRAP 32
+#define TBSTYLE_BUTTON 0
+#define TBSTYLE_SEP 1
+#define TBSTYLE_CHECK 2
+#define TBSTYLE_GROUP 4
+#define TBSTYLE_CHECKGROUP (TBSTYLE_GROUP|TBSTYLE_CHECK)
+#define TBSTYLE_TOOLTIPS 256
+#define TBSTYLE_WRAPABLE 512
+#define TBSTYLE_ALTDRAG 1024
+#define TB_ENABLEBUTTON (WM_USER+1)
+#define TB_CHECKBUTTON (WM_USER+2)
+#define TB_PRESSBUTTON (WM_USER+3)
+#define TB_HIDEBUTTON (WM_USER+4)
+#define TB_INDETERMINATE (WM_USER+5)
+#define TB_ISBUTTONENABLED (WM_USER+9)
+#define TB_ISBUTTONCHECKED (WM_USER+10)
+#define TB_ISBUTTONPRESSED (WM_USER+11)
+#define TB_ISBUTTONHIDDEN (WM_USER+12)
+#define TB_ISBUTTONINDETERMINATE (WM_USER+13)
+#define TB_SETSTATE (WM_USER+17)
+#define TB_GETSTATE (WM_USER+18)
+#define TB_ADDBITMAP (WM_USER+19)
+#define HINST_COMMCTRL ((HINSTANCE)-1)
+#define IDB_STD_SMALL_COLOR 0
+#define IDB_STD_LARGE_COLOR 1
+#define IDB_VIEW_SMALL_COLOR 4
+#define IDB_VIEW_LARGE_COLOR 5
+#define STD_CUT 0
+#define STD_COPY 1
+#define STD_PASTE 2
+#define STD_UNDO 3
+#define STD_REDOW 4
+#define STD_DELETE 5
+#define STD_FILENEW 6
+#define STD_FILEOPEN 7
+#define STD_FILESAVE 8
+#define STD_PRINTPRE 9
+#define STD_PROPERTIES 10
+#define STD_HELP 11
+#define STD_FIND 12
+#define STD_REPLACE 13
+#define STD_PRINT 14
+#define VIEW_LARGEICONS 0
+#define VIEW_SMALLICONS 1
+#define VIEW_LIST 2
+#define VIEW_DETAILS 3
+#define VIEW_SORTNAME 4
+#define VIEW_SORTSIZE 5
+#define VIEW_SORTDATE 6
+#define VIEW_SORTTYPE 7
+#define VIEW_PARENTFOLDER 8
+#define VIEW_NETCONNECT 9
+#define VIEW_NETDISCONNECT 10
+#define VIEW_NEWFOLDER 11
+#define TB_ADDBUTTONS (WM_USER+20)
+#define TB_INSERTBUTTON (WM_USER+21)
+#define TB_DELETEBUTTON (WM_USER+22)
+#define TB_GETBUTTON (WM_USER+23)
+#define TB_BUTTONCOUNT (WM_USER+24)
+#define TB_COMMANDTOINDEX (WM_USER+25)
+#define TB_SAVERESTOREA (WM_USER+26)
+#define TB_SAVERESTOREW (WM_USER+76)
+#define TB_CUSTOMIZE (WM_USER+27)
+#define TB_ADDSTRINGA (WM_USER+28)
+#define TB_ADDSTRINGW (WM_USER+77)
+#define TB_GETITEMRECT (WM_USER+29)
+#define TB_BUTTONSTRUCTSIZE (WM_USER+30)
+#define TB_SETBUTTONSIZE (WM_USER+31)
+#define TB_SETBITMAPSIZE (WM_USER+32)
+#define TB_AUTOSIZE (WM_USER+33)
+#define TB_GETTOOLTIPS (WM_USER+35)
+#define TB_SETTOOLTIPS (WM_USER+36)
+#define TB_SETPARENT (WM_USER+37)
+#define TB_SETROWS (WM_USER+39)
+#define TB_GETROWS (WM_USER+40)
+#define TB_SETCMDID (WM_USER+42)
+#define TB_CHANGEBITMAP (WM_USER+43)
+#define TB_GETBITMAP (WM_USER+44)
+#define TB_GETBUTTONTEXTA (WM_USER+45)
+#define TB_GETBUTTONTEXTW (WM_USER+75)
+#define TB_REPLACEBITMAP (WM_USER+46)
+#define TBBF_LARGE 1
+#define TB_GETBITMAPFLAGS (WM_USER+41)
+#define TBN_GETBUTTONINFOA (TBN_FIRST-0)
+#define TBN_GETBUTTONINFOW (TBN_FIRST-20)
+#define TBN_BEGINDRAG (TBN_FIRST-1)
+#define TBN_ENDDRAG (TBN_FIRST-2)
+#define TBN_BEGINADJUST (TBN_FIRST-3)
+#define TBN_ENDADJUST (TBN_FIRST-4)
+#define TBN_RESET (TBN_FIRST-5)
+#define TBN_QUERYINSERT (TBN_FIRST-6)
+#define TBN_QUERYDELETE (TBN_FIRST-7)
+#define TBN_TOOLBARCHANGE (TBN_FIRST-8)
+#define TBN_CUSTHELP (TBN_FIRST-9)
+#define TTS_ALWAYSTIP 1
+#define TTS_NOPREFIX 2
+#define TTF_IDISHWND 1
+#define TTF_CENTERTIP 2
+#define TTF_RTLREADING 4
+#define TTF_SUBCLASS 16
+#define TTDT_AUTOMATIC 0
+#define TTDT_RESHOW 1
+#define TTDT_AUTOPOP 2
+#define TTDT_INITIAL 3
+#define TTM_ACTIVATE (WM_USER+1)
+#define TTM_SETDELAYTIME (WM_USER+3)
+#define TTM_ADDTOOLA (WM_USER+4)
+#define TTM_ADDTOOLW (WM_USER+50)
+#define TTM_DELTOOLA (WM_USER+5)
+#define TTM_DELTOOLW (WM_USER+51)
+#define TTM_NEWTOOLRECTA (WM_USER+6)
+#define TTM_NEWTOOLRECTW (WM_USER+52)
+#define TTM_RELAYEVENT (WM_USER+7)
+#define TTM_GETTOOLINFOA (WM_USER+8)
+#define TTM_GETTOOLINFOW (WM_USER+53)
+#define TTM_SETTOOLINFOA (WM_USER+9)
+#define TTM_SETTOOLINFOW (WM_USER+54)
+#define TTM_HITTESTA (WM_USER+10)
+#define TTM_HITTESTW (WM_USER+55)
+#define TTM_GETTEXTA (WM_USER+11)
+#define TTM_GETTEXTW (WM_USER+56)
+#define TTM_UPDATETIPTEXTA (WM_USER+12)
+#define TTM_UPDATETIPTEXTW (WM_USER+57)
+#define TTM_GETTOOLCOUNT (WM_USER +13)
+#define TTM_ENUMTOOLSA (WM_USER+14)
+#define TTM_ENUMTOOLSW (WM_USER+58)
+#define TTM_GETCURRENTTOOLA (WM_USER+15)
+#define TTM_GETCURRENTTOOLW (WM_USER+59)
+#define TTM_WINDOWFROMPOINT (WM_USER+16)
+#if (_WIN32_IE >= 0x0300)
+#define TTM_TRACKACTIVATE (WM_USER+17)
+#define TTM_TRACKPOSITION (WM_USER+18)
+#define TTM_SETTIPBKCOLOR (WM_USER+19)
+#define TTM_SETTIPTEXTCOLOR (WM_USER+20)
+#define TTM_GETDELAYTIME (WM_USER+21)
+#define TTM_GETTIPBKCOLOR (WM_USER+22)
+#define TTM_GETTIPTEXTCOLOR (WM_USER+23)
+#define TTM_SETMAXTIPWIDTH (WM_USER+24)
+#define TTM_GETMAXTIPWIDTH (WM_USER+25)
+#define TTM_SETMARGIN (WM_USER+26)
+#define TTM_GETMARGIN (WM_USER+27)
+#define TTM_POP (WM_USER+28)
+#endif /* _WIN32_IE */
+#if (_WIN32_IE >= 0x0400) /* IE4.0 ??? */
+#define TTM_UPDATE (WM_USER+29)
+#endif
+#define TTN_NEEDTEXTA (TTN_FIRST-0)
+#define TTN_NEEDTEXTW (TTN_FIRST-10)
+#define TTN_SHOW (TTN_FIRST-1)
+#define TTN_POP (TTN_FIRST-2)
+#define UD_MAXVAL 0x7fff
+#define UD_MINVAL (-UD_MAXVAL)
+#define UDN_DELTAPOS (UDN_FIRST-1)
+#define UDS_WRAP 1
+#define UDS_SETBUDDYINT 2
+#define UDS_ALIGNRIGHT 4
+#define UDS_ALIGNLEFT 8
+#define UDS_AUTOBUDDY 16
+#define UDS_ARROWKEYS 32
+#define UDS_HORZ 64
+#define UDS_NOTHOUSANDS 128
+#define UDM_SETRANGE (WM_USER+101)
+#define UDM_GETRANGE (WM_USER+102)
+#define UDM_SETPOS (WM_USER+103)
+#define UDM_GETPOS (WM_USER+104)
+#define UDM_SETBUDDY (WM_USER+105)
+#define UDM_GETBUDDY (WM_USER+106)
+#define UDM_SETACCEL (WM_USER+107)
+#define UDM_GETACCEL (WM_USER+108)
+#define UDM_SETBASE (WM_USER+109)
+#define UDM_GETBASE (WM_USER+110)
+#define SB_SETTEXTA (WM_USER+1)
+#define SB_SETTEXTW (WM_USER+11)
+#define SB_GETTEXTA (WM_USER+2)
+#define SB_GETTEXTW (WM_USER+13)
+#define SB_GETTEXTLENGTHA (WM_USER+3)
+#define SB_GETTEXTLENGTHW (WM_USER+12)
+#define SB_SETPARTS (WM_USER+4)
+#define SB_GETPARTS (WM_USER+6)
+#define SB_GETBORDERS (WM_USER+7)
+#define SB_SETMINHEIGHT (WM_USER+8)
+#define SB_SIMPLE (WM_USER+9)
+#define SB_GETRECT (WM_USER+10)
+#define SBT_OWNERDRAW 0x1000
+#define SBT_NOBORDERS 256
+#define SBT_POPOUT 512
+#define SBT_RTLREADING 1024
+#define TBS_AUTOTICKS 1
+#define TBS_VERT 2
+#define TBS_HORZ 0
+#define TBS_TOP 4
+#define TBS_BOTTOM 0
+#define TBS_LEFT 4
+#define TBS_RIGHT 0
+#define TBS_BOTH 8
+#define TBS_NOTICKS 16
+#define TBS_ENABLESELRANGE 32
+#define TBS_FIXEDLENGTH 64
+#define TBS_NOTHUMB 128
+#define TBM_GETPOS (WM_USER)
+#define TBM_GETRANGEMIN (WM_USER+1)
+#define TBM_GETRANGEMAX (WM_USER+2)
+#define TBM_GETTIC (WM_USER+3)
+#define TBM_SETTIC (WM_USER+4)
+#define TBM_SETPOS (WM_USER+5)
+#define TBM_SETRANGE (WM_USER+6)
+#define TBM_SETRANGEMIN (WM_USER+7)
+#define TBM_SETRANGEMAX (WM_USER+8)
+#define TBM_CLEARTICS (WM_USER+9)
+#define TBM_SETSEL (WM_USER+10)
+#define TBM_SETSELSTART (WM_USER+11)
+#define TBM_SETSELEND (WM_USER+12)
+#define TBM_GETPTICS (WM_USER+14)
+#define TBM_GETTICPOS (WM_USER+15)
+#define TBM_GETNUMTICS (WM_USER+16)
+#define TBM_GETSELSTART (WM_USER+17)
+#define TBM_GETSELEND (WM_USER+18)
+#define TBM_CLEARSEL (WM_USER+19)
+#define TBM_SETTICFREQ (WM_USER+20)
+#define TBM_SETPAGESIZE (WM_USER+21)
+#define TBM_GETPAGESIZE (WM_USER+22)
+#define TBM_SETLINESIZE (WM_USER+23)
+#define TBM_GETLINESIZE (WM_USER+24)
+#define TBM_GETTHUMBRECT (WM_USER+25)
+#define TBM_GETCHANNELRECT (WM_USER+26)
+#define TBM_SETTHUMBLENGTH (WM_USER+27)
+#define TBM_GETTHUMBLENGTH (WM_USER+28)
+#define TB_LINEUP 0
+#define TB_LINEDOWN 1
+#define TB_PAGEUP 2
+#define TB_PAGEDOWN 3
+#define TB_THUMBPOSITION 4
+#define TB_THUMBTRACK 5
+#define TB_TOP 6
+#define TB_BOTTOM 7
+#define TB_ENDTRACK 8
+#define HOTKEYF_SHIFT 1
+#define HOTKEYF_CONTROL 2
+#define HOTKEYF_ALT 4
+#define HOTKEYF_EXT 8
+#define HKCOMB_NONE 1
+#define HKCOMB_S 2
+#define HKCOMB_C 4
+#define HKCOMB_A 8
+#define HKCOMB_SC 16
+#define HKCOMB_SA 32
+#define HKCOMB_CA 64
+#define HKCOMB_SCA 128
+#define HKM_SETHOTKEY (WM_USER+1)
+#define HKM_GETHOTKEY (WM_USER+2)
+#define HKM_SETRULES (WM_USER+3)
+#define PBM_SETRANGE (WM_USER+1)
+#define PBM_SETPOS (WM_USER+2)
+#define PBM_DELTAPOS (WM_USER+3)
+#define PBM_SETSTEP (WM_USER+4)
+#define PBM_STEPIT (WM_USER+5)
+#define PBM_SETRANGE32 1030
+#define PBM_GETRANGE 1031
+#define PBM_GETPOS 1032
+#define PBM_SETBARCOLOR 1033
+#define PBM_SETBKCOLOR CCM_SETBKCOLOR
+#define PBS_SMOOTH 1
+#define PBS_VERTICAL 4
+#define LVS_ICON 0
+#define LVS_REPORT 1
+#define LVS_SMALLICON 2
+#define LVS_LIST 3
+#define LVS_TYPEMASK 3
+#define LVS_SINGLESEL 4
+#define LVS_SHOWSELALWAYS 8
+#define LVS_SORTASCENDING 16
+#define LVS_SORTDESCENDING 32
+#define LVS_SHAREIMAGELISTS 64
+#define LVS_NOLABELWRAP 128
+#define LVS_AUTOARRANGE 256
+#define LVS_EDITLABELS 512
+#define LVS_NOSCROLL 0x2000
+#define LVS_TYPESTYLEMASK 0xfc00
+#define LVS_ALIGNTOP 0
+#define LVS_ALIGNLEFT 0x800
+#define LVS_ALIGNMASK 0xc00
+#define LVS_OWNERDRAWFIXED 0x400
+#define LVS_NOCOLUMNHEADER 0x4000
+#define LVS_NOSORTHEADER 0x8000
+#define LVSIL_NORMAL 0
+#define LVSIL_SMALL 1
+#define LVSIL_STATE 2
+#define LVS_OWNERDATA 4096
+#define LVM_GETBKCOLOR LVM_FIRST
+#define LVM_SETBKCOLOR (LVM_FIRST+1)
+#define LVM_GETIMAGELIST (LVM_FIRST+2)
+#define LVM_SETIMAGELIST (LVM_FIRST+3)
+#define LVM_GETITEMCOUNT (LVM_FIRST+4)
+#define LVIF_TEXT 1
+#define LVIF_IMAGE 2
+#define LVIF_PARAM 4
+#define LVIF_STATE 8
+#define LVIS_FOCUSED 1
+#define LVIS_SELECTED 2
+#define LVIS_CUT 4
+#define LVIS_DROPHILITED 8
+#define LVIS_OVERLAYMASK 0xF00
+#define LVIS_STATEIMAGEMASK 0xF000
+#define LPSTR_TEXTCALLBACKW ((LPWSTR)-1)
+#define LPSTR_TEXTCALLBACKA ((LPSTR)-1)
+#define I_IMAGECALLBACK (-1)
+#define LVM_GETITEMA (LVM_FIRST+5)
+#define LVM_GETITEMW (LVM_FIRST+75)
+#define LVM_SETITEMA (LVM_FIRST+6)
+#define LVM_SETITEMW (LVM_FIRST+76)
+#define LVM_INSERTITEMA (LVM_FIRST+7)
+#define LVM_INSERTITEMW (LVM_FIRST+77)
+#define LVM_DELETEITEM (LVM_FIRST+8)
+#define LVM_DELETEALLITEMS (LVM_FIRST+9)
+#define LVM_GETCALLBACKMASK (LVM_FIRST+10)
+#define LVM_SETCALLBACKMASK (LVM_FIRST+11)
+#define LVNI_ALL 0
+#define LVNI_FOCUSED 1
+#define LVNI_SELECTED 2
+#define LVNI_CUT 4
+#define LVNI_DROPHILITED 8
+#define LVNI_ABOVE 256
+#define LVNI_BELOW 512
+#define LVNI_TOLEFT 1024
+#define LVNI_TORIGHT 2048
+#define LVM_GETNEXTITEM (LVM_FIRST+12)
+#define LVFI_PARAM 1
+#define LVFI_STRING 2
+#define LVFI_PARTIAL 8
+#define LVFI_WRAP 32
+#define LVFI_NEARESTXY 64
+#define LVIF_DI_SETITEM 0x1000
+#define LVM_FINDITEMA (LVM_FIRST+13)
+#define LVM_FINDITEMW (LVM_FIRST+83)
+#define LVIR_BOUNDS 0
+#define LVIR_ICON 1
+#define LVIR_LABEL 2
+#define LVIR_SELECTBOUNDS 3
+#define LVM_GETITEMRECT (LVM_FIRST+14)
+#define LVM_SETITEMPOSITION (LVM_FIRST+15)
+#define LVM_GETITEMPOSITION (LVM_FIRST+16)
+#define LVM_GETSTRINGWIDTHA (LVM_FIRST+17)
+#define LVM_GETSTRINGWIDTHW (LVM_FIRST+87)
+#define LVHT_NOWHERE 1
+#define LVHT_ONITEMICON 2
+#define LVHT_ONITEMLABEL 4
+#define LVHT_ONITEMSTATEICON 8
+#define LVHT_ONITEM (LVHT_ONITEMICON|LVHT_ONITEMLABEL|LVHT_ONITEMSTATEICON)
+#define LVHT_ABOVE 8
+#define LVHT_BELOW 16
+#define LVHT_TORIGHT 32
+#define LVHT_TOLEFT 64
+#define LVM_HITTEST (LVM_FIRST+18)
+#define LVM_ENSUREVISIBLE (LVM_FIRST+19)
+#define LVM_SCROLL (LVM_FIRST+20)
+#define LVM_REDRAWITEMS (LVM_FIRST+21)
+#define LVA_DEFAULT 0
+#define LVA_ALIGNLEFT 1
+#define LVA_ALIGNTOP 2
+#define LVA_SNAPTOGRID 5
+#define LVM_ARRANGE (LVM_FIRST+22)
+#define LVM_EDITLABELA (LVM_FIRST+23)
+#define LVM_EDITLABELW (LVM_FIRST+118)
+#define LVM_GETEDITCONTROL (LVM_FIRST+24)
+#define LVCF_FMT 1
+#define LVCF_WIDTH 2
+#define LVCF_TEXT 4
+#define LVCF_SUBITEM 8
+#define LVCFMT_LEFT 0
+#define LVCFMT_RIGHT 1
+#define LVCFMT_CENTER 2
+#define LVCFMT_JUSTIFYMASK 3
+#define LVM_GETCOLUMNA (LVM_FIRST+25)
+#define LVM_GETCOLUMNW (LVM_FIRST+95)
+#define LVM_SETCOLUMNA (LVM_FIRST+26)
+#define LVM_SETCOLUMNW (LVM_FIRST+96)
+#define LVM_INSERTCOLUMNA (LVM_FIRST+27)
+#define LVM_INSERTCOLUMNW (LVM_FIRST+97)
+#define LVM_DELETECOLUMN (LVM_FIRST+28)
+#define LVM_GETCOLUMNWIDTH (LVM_FIRST+29)
+#define LVSCW_AUTOSIZE (-1)
+#define LVSCW_AUTOSIZE_USEHEADER (-2)
+#define LVM_SETCOLUMNWIDTH (LVM_FIRST+30)
+#define LVM_CREATEDRAGIMAGE (LVM_FIRST+33)
+#define LVM_GETVIEWRECT (LVM_FIRST+34)
+#define LVM_GETTEXTCOLOR (LVM_FIRST+35)
+#define LVM_SETTEXTCOLOR (LVM_FIRST+36)
+#define LVM_GETTEXTBKCOLOR (LVM_FIRST+37)
+#define LVM_SETTEXTBKCOLOR (LVM_FIRST+38)
+#define LVM_GETTOPINDEX (LVM_FIRST+39)
+#define LVM_GETCOUNTPERPAGE (LVM_FIRST+40)
+#define LVM_GETORIGIN (LVM_FIRST+41)
+#define LVM_GETORIGIN (LVM_FIRST+41)
+#define LVM_UPDATE (LVM_FIRST+42)
+#define LVM_SETITEMSTATE (LVM_FIRST+43)
+#define LVM_GETITEMSTATE (LVM_FIRST+44)
+#define LVM_GETITEMTEXTA (LVM_FIRST+45)
+#define LVM_GETITEMTEXTW (LVM_FIRST+115)
+#define LVM_SETITEMTEXTA (LVM_FIRST+46)
+#define LVM_SETITEMTEXTW (LVM_FIRST+116)
+#define LVM_SETITEMCOUNT (LVM_FIRST+47)
+#define LVM_SORTITEMS (LVM_FIRST+48)
+#define LVM_SETITEMPOSITION32 (LVM_FIRST+49)
+#define LVM_GETSELECTEDCOUNT (LVM_FIRST+50)
+#define LVM_GETITEMSPACING (LVM_FIRST+51)
+#define LVM_GETISEARCHSTRINGA (LVM_FIRST+52)
+#define LVM_GETISEARCHSTRINGW (LVM_FIRST+117)
+#define LVN_ITEMCHANGING LVN_FIRST
+#define LVN_ITEMCHANGED (LVN_FIRST-1)
+#define LVN_INSERTITEM (LVN_FIRST-2)
+#define LVN_DELETEITEM (LVN_FIRST-3)
+#define LVN_DELETEALLITEMS (LVN_FIRST-4)
+#define LVN_BEGINLABELEDITA (LVN_FIRST-5)
+#define LVN_BEGINLABELEDITW (LVN_FIRST-75)
+#define LVN_ENDLABELEDITA (LVN_FIRST-6)
+#define LVN_ENDLABELEDITW (LVN_FIRST-76)
+#define LVN_COLUMNCLICK (LVN_FIRST-8)
+#define LVN_BEGINDRAG (LVN_FIRST-9)
+#define LVN_BEGINRDRAG (LVN_FIRST-11)
+#define LVN_GETDISPINFOA (LVN_FIRST-50)
+#define LVN_GETDISPINFOW (LVN_FIRST-77)
+#define LVN_SETDISPINFOA (LVN_FIRST-51)
+#define LVN_SETDISPINFOW (LVN_FIRST-78)
+#define LVN_KEYDOWN (LVN_FIRST-55)
+#define TVS_HASBUTTONS 1
+#define TVS_HASLINES 2
+#define TVS_LINESATROOT 4
+#define TVS_EDITLABELS 8
+#define TVS_DISABLEDRAGDROP 16
+#define TVS_SHOWSELALWAYS 32
+#define TVIF_TEXT 1
+#define TVIF_IMAGE 2
+#define TVIF_PARAM 4
+#define TVIF_STATE 8
+#define TVIF_HANDLE 16
+#define TVIF_SELECTEDIMAGE 32
+#define TVIF_CHILDREN 64
+#define TVIS_FOCUSED 1
+#define TVIS_SELECTED 2
+#define TVIS_CUT 4
+#define TVIS_DROPHILITED 8
+#define TVIS_BOLD 16
+#define TVIS_EXPANDED 32
+#define TVIS_EXPANDEDONCE 64
+#define TVIS_OVERLAYMASK 0xF00
+#define TVIS_STATEIMAGEMASK 0xF000
+#define TVIS_USERMASK 0xF000
+#define I_CHILDRENCALLBACK (-1)
+#define TVI_ROOT ((HTREEITEM)0xFFFF0000)
+#define TVI_FIRST ((HTREEITEM)0xFFFF0001)
+#define TVI_LAST ((HTREEITEM)0xFFFF0002)
+#define TVI_SORT ((HTREEITEM)0xFFFF0003)
+#define TVSIL_NORMAL 0
+#define TVSIL_STATE 2
+#define TVM_INSERTITEMA TV_FIRST
+#define TVM_INSERTITEMW (TV_FIRST+50)
+#define TVM_DELETEITEM (TV_FIRST+1)
+#define TVM_EXPAND (TV_FIRST+2)
+#define TVM_GETITEMRECT (TV_FIRST+4)
+#define TVM_GETCOUNT (TV_FIRST+5)
+#define TVM_GETINDENT (TV_FIRST+6)
+#define TVM_SETINDENT (TV_FIRST+7)
+#define TVM_GETIMAGELIST (TV_FIRST+8)
+#define TVM_SETIMAGELIST (TV_FIRST+9)
+#define TVM_GETNEXTITEM (TV_FIRST+10)
+#define TVM_SELECTITEM (TV_FIRST+11)
+#define TVM_GETITEMA (TV_FIRST+12)
+#define TVM_GETITEMW (TV_FIRST+62)
+#define TVM_SETITEMA (TV_FIRST+13)
+#define TVM_SETITEMW (TV_FIRST+63)
+#define TVM_EDITLABELA (TV_FIRST+14)
+#define TVM_EDITLABELW (TV_FIRST+65)
+#define TVM_GETEDITCONTROL (TV_FIRST+15)
+#define TVM_GETVISIBLECOUNT (TV_FIRST+16)
+#define TVM_HITTEST (TV_FIRST+17)
+#define TVM_CREATEDRAGIMAGE (TV_FIRST+18)
+#define TVM_SORTCHILDREN (TV_FIRST+19)
+#define TVM_ENSUREVISIBLE (TV_FIRST+20)
+#define TVM_SORTCHILDRENCB (TV_FIRST+21)
+#define TVM_ENDEDITLABELNOW (TV_FIRST+22)
+#define TVM_GETISEARCHSTRINGA (TV_FIRST+23)
+#define TVM_GETISEARCHSTRINGW (TV_FIRST+64)
+#define TVE_COLLAPSE 1
+#define TVE_EXPAND 2
+#define TVE_TOGGLE 3
+#define TVE_COLLAPSERESET 0x8000
+#define TVC_UNKNOWN 0
+#define TVC_BYMOUSE 1
+#define TVC_BYKEYBOARD 2
+#define TVGN_ROOT 0
+#define TVGN_NEXT 1
+#define TVGN_PREVIOUS 2
+#define TVGN_PARENT 3
+#define TVGN_CHILD 4
+#define TVGN_FIRSTVISIBLE 5
+#define TVGN_NEXTVISIBLE 6
+#define TVGN_PREVIOUSVISIBLE 7
+#define TVGN_DROPHILITE 8
+#define TVGN_CARET 9
+#define TVN_SELCHANGINGA (TVN_FIRST-1)
+#define TVN_SELCHANGINGW (TVN_FIRST-50)
+#define TVN_SELCHANGEDA (TVN_FIRST-2)
+#define TVN_SELCHANGEDW (TVN_FIRST-51)
+#define TVN_GETDISPINFOA (TVN_FIRST-3)
+#define TVN_GETDISPINFOW (TVN_FIRST-52)
+#define TVN_SETDISPINFOA (TVN_FIRST-4)
+#define TVN_SETDISPINFOW (TVN_FIRST-53)
+#define TVN_ITEMEXPANDINGA (TVN_FIRST-5)
+#define TVN_ITEMEXPANDINGW (TVN_FIRST-54)
+#define TVN_ITEMEXPANDEDA (TVN_FIRST-6)
+#define TVN_ITEMEXPANDEDW (TVN_FIRST-55)
+#define TVN_BEGINDRAGA (TVN_FIRST-7)
+#define TVN_BEGINDRAGW (TVN_FIRST-56)
+#define TVN_BEGINRDRAGA (TVN_FIRST-8)
+#define TVN_BEGINRDRAGW (TVN_FIRST-57)
+#define TVN_DELETEITEMA (TVN_FIRST-9)
+#define TVN_DELETEITEMW (TVN_FIRST-58)
+#define TVN_BEGINLABELEDITA (TVN_FIRST-10)
+#define TVN_BEGINLABELEDITW (TVN_FIRST-59)
+#define TVN_ENDLABELEDITA (TVN_FIRST-11)
+#define TVN_ENDLABELEDITW (TVN_FIRST-60)
+#define TVN_KEYDOWN (TVN_FIRST-12)
+#define TVIF_DI_SETITEM 0x1000
+#define TVHT_NOWHERE 1
+#define TVHT_ONITEMICON 2
+#define TVHT_ONITEMLABEL 4
+#define TVHT_ONITEM (TVHT_ONITEMICON|TVHT_ONITEMLABEL|TVHT_ONITEMSTATEICON)
+#define TVHT_ONITEMINDENT 8
+#define TVHT_ONITEMBUTTON 16
+#define TVHT_ONITEMRIGHT 32
+#define TVHT_ONITEMSTATEICON 64
+#define TVHT_ABOVE 256
+#define TVHT_BELOW 512
+#define TVHT_TORIGHT 1024
+#define TVHT_TOLEFT 2048
+#define TCHT_NOWHERE 1
+#define TCHT_ONITEMICON 2
+#define TCHT_ONITEMLABEL 4
+#define TCHT_ONITEM (TCHT_ONITEMICON|TCHT_ONITEMLABEL)
+#define TCS_FORCEICONLEFT 16
+#define TCS_FORCELABELLEFT 32
+#define TCS_TABS 0
+#define TCS_BUTTONS 256
+#define TCS_SINGLELINE 0
+#define TCS_MULTILINE 512
+#define TCS_RIGHTJUSTIFY 0
+#define TCS_FIXEDWIDTH 1024
+#define TCS_RAGGEDRIGHT 2048
+#define TCS_FOCUSONBUTTONDOWN 0x1000
+#define TCS_OWNERDRAWFIXED 0x2000
+#define TCS_TOOLTIPS 0x4000
+#define TCS_FOCUSNEVER 0x8000
+#if (_WIN32_IE >= 0x0300)
+#define TCS_BOTTOM 2
+#define TCS_RIGHT 2
+#define TCS_VERTICAL 128
+#endif
+#define TCIF_TEXT 1
+#define TCIF_IMAGE 2
+#define TCIF_RTLREADING 4
+#define TCIF_PARAM 8
+#define TCM_FIRST 0x1300
+#define TCM_GETIMAGELIST (TCM_FIRST+2)
+#define TCM_SETIMAGELIST (TCM_FIRST+3)
+#define TCM_GETITEMCOUNT (TCM_FIRST+4)
+#define TCM_GETITEMA (TCM_FIRST+5)
+#define TCM_GETITEMW (TCM_FIRST+60)
+#define TCM_SETITEMA (TCM_FIRST+6)
+#define TCM_SETITEMW (TCM_FIRST+61)
+#define TCM_INSERTITEMA (TCM_FIRST+7)
+#define TCM_INSERTITEMW (TCM_FIRST+62)
+#define TCM_DELETEITEM (TCM_FIRST+8)
+#define TCM_DELETEALLITEMS (TCM_FIRST+9)
+#define TCM_GETITEMRECT (TCM_FIRST+10)
+#define TCM_GETCURSEL (TCM_FIRST+11)
+#define TCM_SETCURSEL (TCM_FIRST+12)
+#define TCM_HITTEST (TCM_FIRST+13)
+#define TCM_SETITEMEXTRA (TCM_FIRST+14)
+#define TCM_ADJUSTRECT (TCM_FIRST+40)
+#define TCM_SETITEMSIZE (TCM_FIRST+41)
+#define TCM_REMOVEIMAGE (TCM_FIRST+42)
+#define TCM_SETPADDING (TCM_FIRST+43)
+#define TCM_GETROWCOUNT (TCM_FIRST+44)
+#define TCM_GETTOOLTIPS (TCM_FIRST+45)
+#define TCM_SETTOOLTIPS (TCM_FIRST+46)
+#define TCM_GETCURFOCUS (TCM_FIRST+47)
+#define TCM_SETCURFOCUS (TCM_FIRST+48)
+#define TCN_KEYDOWN TCN_FIRST
+#define TCN_SELCHANGE (TCN_FIRST-1)
+#define TCN_SELCHANGING (TCN_FIRST-2)
+#define NM_OUTOFMEMORY (NM_FIRST-1)
+#define NM_CLICK (NM_FIRST-2)
+#define NM_DBLCLK (NM_FIRST-3)
+#define NM_RETURN (NM_FIRST-4)
+#define NM_RCLICK (NM_FIRST-5)
+#define NM_RDBLCLK (NM_FIRST-6)
+#define NM_SETFOCUS (NM_FIRST-7)
+#define NM_KILLFOCUS (NM_FIRST-8)
+#define NM_CUSTOMDRAW (NM_FIRST-12)
+#define NM_HOVER (NM_FIRST-13)
+#define NM_NCHITTEST (NM_FIRST-14)
+#define NM_KEYDOWN (NM_FIRST-15)
+#define NM_RELEASEDCAPTURE (NM_FIRST-16)
+#define NM_SETCURSOR (NM_FIRST-17)
+#define NM_CHAR (NM_FIRST-18)
+#define SBARS_SIZEGRIP 256
+#define CCM_SETBKCOLOR 8193
+#define CCM_SETCOLORSCHEME 8194
+#define CCM_GETCOLORSCHEME 8195
+#define CCM_GETDROPTARGET 8196
+#define CCM_SETUNICODEFORMAT 8197
+#define CCM_GETUNICODEFORMAT 8198
+#define ICC_LISTVIEW_CLASSES 1
+#define ICC_TREEVIEW_CLASSES 2
+#define ICC_TAB_CLASSES 8
+#define ICC_UPDOWN_CLASS 16
+#define ICC_PROGRESS_CLASS 32
+#define ICC_HOTKEY_CLASS 64
+#define ICC_ANIMATE_CLASS 128
+#define ICC_WIN95_CLASSES 255
+#define ICC_DATE_CLASSES 256
+#define ICC_USEREX_CLASSES 512
+#define ICC_COOL_CLASSES 1024
+#if (_WIN32_IE >= 0x0400)
+#define ICC_INTERNET_CLASSES 2048
+#define ICC_PAGESCROLLER_CLASS 4096
+#define ICC_NATIVEFNTCTL_CLASS 8192
+#define INFOTIPSIZE
+#endif /* _WIN32_IE */
+#define GDTR_MIN 1
+#define GDTR_MAX 2
+#define GMR_VISIBLE 0
+#define GMR_DAYSTATE 1
+#define GDT_ERROR -1
+#define GDT_VALID 0
+#define GDT_NONE 1
+#define DTS_UPDOWN 1
+#define DTS_SHOWNONE 2
+#define DTS_SHORTDATEFORMAT 0
+#define DTS_LONGDATEFORMAT 4
+#define DTS_TIMEFORMAT 9
+#define DTS_APPCANPARSE 16
+#define DTS_RIGHTALIGN 32
+#define MCS_DAYSTATE 1
+#define MCS_MULTISELECT 2
+#define MCS_WEEKNUMBERS 4
+#define MCS_NOTODAY 8
+#define DTM_GETSYSTEMTIME 0x1001
+#define DTM_SETSYSTEMTIME 0x1002
+#define DTM_GETRANGE 0x1003
+#define DTM_SETRANGE 0x1004
+#define DTM_SETFORMATA 0x1005
+#define DTM_SETFORMATW 0x1050
+#define DTM_SETMCCOLOR 0x1006
+#define DTM_GETMCCOLOR 0x1007
+#define DTM_GETMONTHCAL 0x1008
+#define DTM_SETMCFONT 0x1009
+#define DTM_GETMCFONT 0x100a
+#define DTN_USERSTRINGA (-758)
+#define DTN_USERSTRINGW (-745)
+#define DTN_WMKEYDOWNA (-757)
+#define DTN_WMKEYDOWNW (-744)
+#define DTN_FORMATA (-756)
+#define DTN_FORMATW (-743)
+#define DTN_FORMATQUERYA (-755)
+#define DTN_FORMATQUERYW (-742)
+#define DTN_DROPDOWN (-754)
+#define DTN_CLOSEUP (-753)
+#define DTN_DATETIMECHANGE (-759)
+#define MCM_GETCURSEL 0x1001
+#define MCM_SETCURSEL 0x1002
+#define MCM_GETMAXSELCOUNT 0x1003
+#define MCM_SETMAXSELCOUNT 0x1004
+#define MCM_GETSELRANGE 0x1005
+#define MCM_SETSELRANGE 0x1006
+#define MCM_GETMONTHRANGE 0x1007
+#define MCM_SETDAYSTATE 0x1008
+#define MCM_GETMINREQRECT 0x1009
+#define MCM_SETCOLOR 0x100a
+#define MCM_GETCOLOR 0x100b
+#define MCM_SETTODAY 0x100c
+#define MCM_GETTODAY 0x100d
+#define MCM_HITTEST 0x100e
+#define MCM_SETFIRSTDAYOFWEEK 0x100f
+#define MCM_GETFIRSTDAYOFWEEK 0x1010
+#define MCM_GETRANGE 0x1011
+#define MCM_SETRANGE 0x1012
+#define MCM_GETMONTHDELTA 0x1013
+#define MCM_SETMONTHDELTA 0x1014
+#define MCN_SELCHANGE (-749)
+#define MCN_GETDAYSTATE (-747)
+#define MCN_SELECT (-746)
+#define ODT_HEADER 100
+#define ODT_TAB 101
+#define ODT_LISTVIEW
+#define SB_SETBKCOLOR 0x2001
+#if (_WIN32_IE >= 0x0300)
+#define SB_ISSIMPLE 1038
+#endif
+#define RBS_TOOLTIPS 256
+#define RBS_VARHEIGHT 512
+#define RBS_BANDBORDERS 1024
+#define RBS_FIXEDORDER 2048
+#define RBIM_IMAGELIST 1
+#define RB_SETCOLORSCHEME CCM_SETCOLORSCHEME
+#define RB_GETCOLORSCHEME CCM_GETCOLORSCHEME
+#define RBBS_BREAK 1
+#define RBBS_FIXEDSIZE 2
+#define RBBS_CHILDEDGE 4
+#define RBBS_HIDDEN 8
+#define RBBS_NOVERT 16
+#define RBBS_FIXEDBMP 32
+#define RBBIM_STYLE 1
+#define RBBIM_COLORS 2
+#define RBBIM_TEXT 4
+#define RBBIM_IMAGE 8
+#define RBBIM_CHILD 16
+#define RBBIM_CHILDSIZE 32
+#define RBBIM_SIZE 64
+#define RBBIM_BACKGROUND 128
+#define RBBIM_ID 256
+#define RB_INSERTBANDA (WM_USER+1)
+#define RB_INSERTBANDW (WM_USER+10)
+#define RB_DELETEBAND (WM_USER+2)
+#define RB_GETBARINFO (WM_USER+3)
+#define RB_SETBARINFO (WM_USER+4)
+#define RB_GETBANDCOUNT (WM_USER+12)
+#define RB_GETROWCOUNT (WM_USER+13)
+#define RB_GETROWHEIGHT (WM_USER+14)
+#define RB_SETBANDINFOA (WM_USER+6)
+#define RB_SETBANDINFOW (WM_USER+11)
+#define RB_SETPARENT (WM_USER+7)
+#define RBN_HEIGHTCHANGE RBN_FIRST
+#if (_WIN32_IE >= 0x0300)
+#define LVN_ODCACHEHINT (LVN_FIRST-13)
+#define LVN_ODFINDITEMA (LVN_FIRST-52)
+#define LVN_ODFINDITEMW (LVN_FIRST-79)
+#define LVN_ITEMACTIVATE (LVN_FIRST-14)
+#define LVN_ODSTATECHANGED (LVN_FIRST-15)
+#ifdef UNICODE
+#define LVN_ODFINDITEM LVN_ODFINDITEMW
+#else
+#define LVN_ODFINDITEM LVN_ODFINDITEMA
+#endif
+#endif /* _WIN32_IE */
+#if (_WIN32_IE >= 0x0400)
+#define UDM_SETRANGE32 1135
+#define UDM_GETRANGE32 1136
+#define SB_SETICON 1039
+#define SB_SETTIPTEXTA 1040
+#define SB_SETTIPTEXTW 1041
+#define SB_GETTIPTEXTA 1042
+#define SB_GETTIPTEXTW 1043
+#define SB_GETICON 1044
+#define SB_SETUNICODEFORMAT 0x2005
+#define SB_GETUNICODEFORMAT 0x2006
+#define RBS_REGISTERDROP 4096
+#define RBS_AUTOSIZE 8192
+#define RBS_VERTICALGRIPPER 16384
+#define RBS_DBLCLKTOGGLE 32768
+#define RBBS_VARIABLEHEIGHT 64
+#define RBBS_GRIPPERALWAYS 128
+#define RBBS_NOGRIPPER 256
+#define RBBIM_IDEALSIZE 512
+#define RBBIM_LPARAM 1024
+#define RBBIM_HEADERSIZE 2048
+#define RB_HITTEST (WM_USER+8)
+#define RB_GETRECT (WM_USER+9)
+#define RB_IDTOINDEX (WM_USER+16)
+#define RB_GETTOOLTIPS (WM_USER+17)
+#define RB_SETTOOLTIPS (WM_USER+18)
+#define RB_SETBKCOLOR (WM_USER+19)
+#define RB_GETBKCOLOR (WM_USER+20)
+#define RB_SETTEXTCOLOR (WM_USER+21)
+#define RB_GETTEXTCOLOR (WM_USER+22)
+#define RB_SIZETORECT (WM_USER+23)
+#define RB_BEGINDRAG (WM_USER+24)
+#define RB_ENDDRAG (WM_USER+25)
+#define RB_DRAGMOVE (WM_USER+26)
+#define RB_GETBARHEIGHT (WM_USER+27)
+#define RB_GETBANDINFOW (WM_USER+28)
+#define RB_GETBANDINFOA (WM_USER+29)
+#define RB_MINIMIZEBAND (WM_USER+30)
+#define RB_MAXIMIZEBAND (WM_USER+31)
+#define RB_GETDROPTARGET CCM_GETDROPTARGET
+#define RB_GETBANDBORDERS (WM_USER+34)
+#define RB_SHOWBAND (WM_USER+35)
+#define RB_SETPALETTE (WM_USER+37)
+#define RB_GETPALETTE (WM_USER+38)
+#define RB_MOVEBAND (WM_USER+39)
+#define RB_SETUNICODEFORMAT CCM_SETUNICODEFORMAT
+#define RB_GETUNICODEFORMAT CCM_GETUNICODEFORMAT
+#define RBN_GETOBJECT (RBN_FIRST-1)
+#define RBN_LAYOUTCHANGED (RBN_FIRST-2)
+#define RBN_AUTOSIZE (RBN_FIRST-3)
+#define RBN_BEGINDRAG (RBN_FIRST-4)
+#define RBN_ENDDRAG (RBN_FIRST-5)
+#define RBN_DELETINGBAND (RBN_FIRST-6)
+#define RBN_DELETEDBAND (RBN_FIRST-7)
+#define RBN_CHILDSIZE (RBN_FIRST-8)
+#define RBNM_ID 1
+#define RBNM_STYLE 2
+#define RBNM_LPARAM 4
+#define RBHT_NOWHERE 1
+#define RBHT_CAPTION 2
+#define RBHT_CLIENT 3
+#define RBHT_GRABBER 4
+#ifdef UNICODE
+#define SB_SETTIPTEXT SB_SETTIPTEXTW
+#define SB_GETTIPTEXT SB_GETTIPTEXTW
+#define RB_GETBANDINFO RB_GETBANDINFOW
+#else
+#define SB_SETTIPTEXT SB_SETTIPTEXTA
+#define SB_GETTIPTEXT SB_GETTIPTEXTA
+#define RB_GETBANDINFO RB_GETBANDINFOA
+#endif
+#else
+#define RB_GETBANDINFO (WM_USER+5)
+#endif /* _WIN32_IE >= 0x0400 */
+
+#ifndef RC_INVOKED
+typedef struct _COLORMAP {
+ COLORREF from;
+ COLORREF to;
+} COLORMAP,*LPCOLORMAP;
+typedef struct {
+ UINT uNotification;
+ HWND hWnd;
+ POINT ptCursor;
+} DRAGLISTINFO,*LPDRAGLISTINFO;
+typedef struct _TBBUTTON {
+ int iBitmap;
+ int idCommand;
+ BYTE fsState;
+ BYTE fsStyle;
+ BYTE bReserved[2];
+ DWORD dwData;
+ int iString;
+} TBBUTTON,*PTBBUTTON,*LPTBBUTTON;
+typedef const TBBUTTON *LPCTBBUTTON;
+typedef struct {
+ NMHDR hdr;
+ int iItem;
+ TBBUTTON tbButton;
+ int cchText;
+ LPTSTR pszText;
+} TBNOTIFY,*LPTBNOTIFY;
+typedef struct {
+ HKEY hkr;
+ LPCTSTR pszSubKey;
+ LPCTSTR pszValueName;
+} TBSAVEPARAMS;
+typedef struct _IMAGEINFO {
+ HBITMAP hbmImage;
+ HBITMAP hbmMask;
+ int Unused1;
+ int Unused2;
+ RECT rcImage;
+} IMAGEINFO;
+DECLARE_HANDLE(HIMAGELIST);
+typedef struct _HD_ITEMA {
+ UINT mask;
+ int cxy;
+ LPSTR pszText;
+ HBITMAP hbm;
+ int cchTextMax;
+ int fmt;
+ LPARAM lParam;
+} HD_ITEMA;
+typedef struct _HD_ITEMW {
+ UINT mask;
+ int cxy;
+ LPWSTR pszText;
+ HBITMAP hbm;
+ int cchTextMax;
+ int fmt;
+ LPARAM lParam;
+} HD_ITEMW;
+typedef struct _HD_LAYOUT {
+ RECT *prc;
+ WINDOWPOS *pwpos;
+} HD_LAYOUT;
+typedef struct _HD_HITTESTINFO {
+ POINT pt;
+ UINT flags;
+ int iItem;
+} HD_HITTESTINFO;
+typedef struct _HD_NOTIFYA {
+ NMHDR hdr;
+ int iItem;
+ int iButton;
+ HD_ITEMA *pitem;
+} HD_NOTIFYA;
+typedef struct _HD_NOTIFYW {
+ NMHDR hdr;
+ int iItem;
+ int iButton;
+ HD_ITEMW *pitem;
+} HD_NOTIFYW;
+/* FIXME: NMHEADER structure (base for all events of the comctl controls)
+ is the same as HD_NOTIFY depending on the value of _WIN32_IE macro.
+ I'm defining both for now. */
+typedef struct _NMHEADERA {
+ NMHDR hdr;
+ int iItem;
+ int iButton;
+ HD_ITEMA* pitem;
+} NMHEADERA, *LPNMHEADERA;
+
+typedef struct _NMHEADERW {
+ NMHDR hdr;
+ int iItem;
+ int iButton;
+ HD_ITEMW* pitem;
+} NMHEADERW, *LPNMHEADERW;
+#ifdef UNICODE
+#define NMHEADER NMHEADERW
+#define LPNMHEADER LPNMHEADERW
+#else
+#define NMHEADER NMHEADERA
+#define LPNMHEADER LPNMHEADERA
+#endif
+/* End FIXME. */
+typedef struct tagTBADDBITMAP {
+ HINSTANCE hInst;
+ UINT nID;
+} TBADDBITMAP,*LPTBADDBITMAP;
+typedef struct tagTBSAVEPARAMSA {
+ HKEY hkr;
+ LPCSTR pszSubKey;
+ LPCSTR pszValueName;
+} TBSAVEPARAMSA;
+typedef struct tagTBSAVEPARAMSW {
+ HKEY hkr;
+ LPCWSTR pszSubKey;
+ LPCWSTR pszValueName;
+} TBSAVEPARAMSW;
+typedef struct {
+ HINSTANCE hInstOld;
+ UINT nIDOld;
+ HINSTANCE hInstNew;
+ UINT nIDNew;
+ int nButtons;
+} TBREPLACEBITMAP,*LPTBREPLACEBITMAP;
+typedef struct tagTBNOTIFYA {
+ NMHDR hdr;
+ int iItem;
+ TBBUTTON tbButton;
+ int cchText;
+ LPSTR pszText;
+} TBNOTIFYA,*LPTBNOTIFYA;
+typedef struct tagTBNOTIFYW {
+ NMHDR hdr;
+ int iItem;
+ TBBUTTON tbButton;
+ int cchText;
+ LPWSTR pszText;
+} TBNOTIFYW,*LPTBNOTIFYW;
+typedef struct tagTOOLINFOA {
+ UINT cbSize;
+ UINT uFlags;
+ HWND hwnd;
+ UINT uId;
+ RECT rect;
+ HINSTANCE hinst;
+ LPSTR lpszText;
+} TOOLINFOA,*PTOOLINFOA,*LPTOOLINFOA;
+typedef struct tagTOOLINFOW {
+ UINT cbSize;
+ UINT uFlags;
+ HWND hwnd;
+ UINT uId;
+ RECT rect;
+ HINSTANCE hinst;
+ LPWSTR lpszText;
+} TOOLINFOW,*PTOOLINFOW,*LPTOOLINFOW;
+typedef struct _TT_HITTESTINFOA {
+ HWND hwnd;
+ POINT pt;
+ TOOLINFOA ti;
+} TTHITTESTINFOA,*LPHITTESTINFOA;
+typedef struct _TT_HITTESTINFOW {
+ HWND hwnd;
+ POINT pt;
+ TOOLINFOW ti;
+} TTHITTESTINFOW,*LPHITTESTINFOW;
+typedef struct tagTOOLTIPTEXTA {
+ NMHDR hdr;
+ LPSTR lpszText;
+ char szText[80];
+ HINSTANCE hinst;
+ UINT uFlags;
+} TOOLTIPTEXTA,*LPTOOLTIPTEXTA;
+typedef struct tagTOOLTIPTEXTW {
+ NMHDR hdr;
+ LPWSTR lpszText;
+ WCHAR szText[80];
+ HINSTANCE hinst;
+ UINT uFlags;
+} TOOLTIPTEXTW,*LPTOOLTIPTEXTW;
+typedef struct _UDACCEL {
+ UINT nSec;
+ UINT nInc;
+} UDACCEL,*LPUDACCEL;
+typedef struct _NM_UPDOWN {
+ NMHDR hdr;
+ int iPos;
+ int iDelta;
+} NM_UPDOWN,*LPNM_UPDOWN;
+typedef struct _LV_ITEMA {
+ UINT mask;
+ int iItem;
+ int iSubItem;
+ UINT state;
+ UINT stateMask;
+ LPSTR pszText;
+ int cchTextMax;
+ int iImage;
+ LPARAM lParam;
+} LV_ITEMA;
+typedef struct _LV_ITEMW {
+ UINT mask;
+ int iItem;
+ int iSubItem;
+ UINT state;
+ UINT stateMask;
+ LPWSTR pszText;
+ int cchTextMax;
+ int iImage;
+ LPARAM lParam;
+} LV_ITEMW;
+typedef struct _LV_FINDINFOA {
+ UINT flags;
+ LPCSTR psz;
+ LPARAM lParam;
+ POINT pt;
+ UINT vkDirection;
+} LV_FINDINFOA;
+typedef struct _LV_FINDINFOW {
+ UINT flags;
+ LPCWSTR psz;
+ LPARAM lParam;
+ POINT pt;
+ UINT vkDirection;
+} LV_FINDINFOW;
+typedef struct _LV_HITTESTINFO {
+ POINT pt;
+ UINT flags;
+ int iItem;
+} LV_HITTESTINFO;
+typedef struct _LV_COLUMNA {
+ UINT mask;
+ int fmt;
+ int cx;
+ LPSTR pszText;
+ int cchTextMax;
+ int iSubItem;
+} LV_COLUMNA;
+typedef struct _LV_COLUMNW {
+ UINT mask;
+ int fmt;
+ int cx;
+ LPWSTR pszText;
+ int cchTextMax;
+ int iSubItem;
+} LV_COLUMNW;
+typedef int(CALLBACK *PFNLVCOMPARE)(LPARAM,LPARAM,LPARAM);
+typedef struct _NM_LISTVIEW {
+ NMHDR hdr;
+ int iItem;
+ int iSubItem;
+ UINT uNewState;
+ UINT uOldState;
+ UINT uChanged;
+ POINT ptAction;
+ LPARAM lParam;
+} NM_LISTVIEW,*LPNM_LISTVIEW;
+typedef struct _LV_DISPINFOA {
+ NMHDR hdr;
+ LV_ITEMA item;
+} LV_DISPINFOA;
+typedef struct _LV_DISPINFOW {
+ NMHDR hdr;
+ LV_ITEMW item;
+} LV_DISPINFOW;
+typedef struct _LV_KEYDOWN {
+ NMHDR hdr;
+ WORD wVKey;
+ UINT flags;
+} LV_KEYDOWN;
+DECLARE_HANDLE(HTREEITEM);
+typedef struct _TV_ITEMA {
+ UINT mask;
+ HTREEITEM hItem;
+ UINT state;
+ UINT stateMask;
+ LPSTR pszText;
+ int cchTextMax;
+ int iImage;
+ int iSelectedImage;
+ int cChildren;
+ LPARAM lParam;
+} TV_ITEMA,*LPTV_ITEMA;
+typedef struct _TV_ITEMW {
+ UINT mask;
+ HTREEITEM hItem;
+ UINT state;
+ UINT stateMask;
+ LPWSTR pszText;
+ int cchTextMax;
+ int iImage;
+ int iSelectedImage;
+ int cChildren;
+ LPARAM lParam;
+} TV_ITEMW,*LPTV_ITEMW;
+typedef struct _TV_INSERTSTRUCTA {
+ HTREEITEM hParent;
+ HTREEITEM hInsertAfter;
+ TV_ITEMA item;
+} TV_INSERTSTRUCTA,*LPTV_INSERTSTRUCTA;
+typedef struct _TV_INSERTSTRUCTW {
+ HTREEITEM hParent;
+ HTREEITEM hInsertAfter;
+ TV_ITEMW item;
+} TV_INSERTSTRUCTW,*LPTV_INSERTSTRUCTW;
+typedef struct _TV_HITTESTINFO {
+ POINT pt;
+ UINT flags;
+ HTREEITEM hItem;
+} TV_HITTESTINFO,*LPTV_HITTESTINFO;
+typedef int(CALLBACK *PFNTVCOMPARE)(LPARAM,LPARAM,LPARAM);
+typedef struct _TV_SORTCB {
+ HTREEITEM hParent;
+ PFNTVCOMPARE lpfnCompare;
+ LPARAM lParam;
+} TV_SORTCB,*LPTV_SORTCB;
+typedef struct _NM_TREEVIEWA {
+ NMHDR hdr;
+ UINT action;
+ TV_ITEMA itemOld;
+ TV_ITEMA itemNew;
+ POINT ptDrag;
+} NM_TREEVIEWA,*LPNM_TREEVIEWA;
+typedef struct _NM_TREEVIEWW {
+ NMHDR hdr;
+ UINT action;
+ TV_ITEMW itemOld;
+ TV_ITEMW itemNew;
+ POINT ptDrag;
+} NM_TREEVIEWW,*LPNM_TREEVIEWW;
+typedef struct _TV_DISPINFOA {
+ NMHDR hdr;
+ TV_ITEMA item;
+} TV_DISPINFOA;
+typedef struct _TV_DISPINFOW {
+ NMHDR hdr;
+ TV_ITEMW item;
+} TV_DISPINFOW;
+typedef struct _TV_KEYDOWN {
+ NMHDR hdr;
+ WORD wVKey;
+ UINT flags;
+} TV_KEYDOWN;
+typedef struct _TC_ITEMHEADERA {
+ UINT mask;
+ UINT lpReserved1;
+ UINT lpReserved2;
+ LPSTR pszText;
+ int cchTextMax;
+ int iImage;
+} TC_ITEMHEADERA;
+typedef struct _TC_ITEMHEADERW {
+ UINT mask;
+ UINT lpReserved1;
+ UINT lpReserved2;
+ LPWSTR pszText;
+ int cchTextMax;
+ int iImage;
+} TC_ITEMHEADERW;
+typedef struct _TC_ITEMA {
+ UINT mask;
+ UINT lpReserved1;
+ UINT lpReserved2;
+ LPSTR pszText;
+ int cchTextMax;
+ int iImage;
+ LPARAM lParam;
+} TC_ITEMA;
+typedef struct _TC_ITEMW {
+ UINT mask;
+ UINT lpReserved1;
+ UINT lpReserved2;
+ LPWSTR pszText;
+ int cchTextMax;
+ int iImage;
+ LPARAM lParam;
+} TC_ITEMW;
+typedef struct _TC_HITTESTINFO {
+ POINT pt;
+ UINT flags;
+} TC_HITTESTINFO,*LPTC_HITTESTINFO;
+typedef struct _TC_KEYDOWN {
+ NMHDR hdr;
+ WORD wVKey;
+ UINT flags;
+} TC_KEYDOWN;
+typedef struct tagINITCOMMONCONTROLSEX {
+ DWORD dwSize;
+ DWORD dwICC;
+} INITCOMMONCONTROLSEX,*LPINITCOMMONCONTROLSEX;
+typedef struct tagPBRANGE {
+ int iLow;
+ int iHigh;
+} PBRANGE,*PPBRANGE;
+typedef struct tagCOLORSCHEME {
+ DWORD dwSize;
+ COLORREF clrBtnHighlight;
+ COLORREF clrBtnShadow;
+} COLORSCHEME,*LPCOLORSCHEME;
+typedef struct tagTCITEM {
+ UINT mask;
+#if (_WIN32_IE >= 0x0300)
+ DWORD dwState;
+ DWORD dwStateMask;
+#else
+ UINT lpReserved1;
+ UINT lpReserved2;
+#endif
+#ifdef UNICODE
+ LPWSTR pszText;
+#else
+ LPSTR pszText;
+#endif
+ int cchTextMax;
+ int iImage;
+ LPARAM lParam;
+} TCITEM,*LPTCITEM;
+typedef struct tagMCHITTESTINFO {
+ UINT cbSize;
+ POINT pt;
+ UINT uHit;
+ SYSTEMTIME st;
+}MCHITTESTINFO, *PMCHITTESTINFO;
+typedef DWORD MONTHDAYSTATE;
+typedef MONTHDAYSTATE *LPMONTHDAYSTATE;
+typedef struct tagNMDAYSTATE {
+ NMHDR nmhdr;
+ SYSTEMTIME stStart;
+ int cDayState;
+ LPMONTHDAYSTATE prgDayState;
+}NMDAYSTATE,*LPNMDAYSTATE;
+typedef struct tagREBARINFO {
+ UINT cbSize;
+ UINT fMask;
+ HIMAGELIST himl;
+} REBARINFO,*LPREBARINFO;
+typedef struct tagREBARBANDINFOA {
+ UINT cbSize;
+ UINT fMask;
+ UINT fStyle;
+ COLORREF clrFore;
+ COLORREF clrBack;
+ LPSTR lpText;
+ UINT cch;
+ int iImage;
+ HWND hwndChild;
+ UINT cxMinChild;
+ UINT cyMinChild;
+ UINT cx;
+ HBITMAP hbmBack;
+ UINT wID;
+#if (_WIN32_IE >= 0x0400)
+ UINT cyChild;
+ UINT cyMaxChild;
+ UINT cyIntegral;
+ UINT cxIdeal;
+ LPARAM lParam;
+ UINT cxHeader;
+#endif
+} REBARBANDINFOA,*LPREBARBANDINFOA;
+typedef struct tagREBARBANDINFOW {
+ UINT cbSize;
+ UINT fMask;
+ UINT fStyle;
+ COLORREF clrFore;
+ COLORREF clrBack;
+ LPWSTR lpText;
+ UINT cch;
+ int iImage;
+ HWND hwndChild;
+ UINT cxMinChild;
+ UINT cyMinChild;
+ UINT cx;
+ HBITMAP hbmBack;
+ UINT wID;
+#if (_WIN32_IE >= 0x0400)
+ UINT cyChild;
+ UINT cyMaxChild;
+ UINT cyIntegral;
+ UINT cxIdeal;
+ LPARAM lParam;
+ UINT cxHeader;
+#endif
+} REBARBANDINFOW,*LPREBARBANDINFOW;
+typedef REBARBANDINFOA const *LPCREBARBANDINFOA;
+typedef REBARBANDINFOW const *LPCREBARBANDINFOW;
+#define REBARBANDINFOA_V3_SIZE CCSIZEOF_STRUCT(REBARBANDINFOA,wID)
+#define REBARBANDINFOW_V3_SIZE CCSIZEOF_STRUCT(REBARBANDINFOW, wID)
+
+#if (_WIN32_IE >= 0x0300)
+typedef struct tagTCHITTESTINFO {
+ POINT pt;
+ UINT flags;
+} TCHITTESTINFO,*LPTCHITTESTINFO;
+typedef struct tagIMAGELISTDRAWPARAMS {
+ DWORD cbSize;
+ HIMAGELIST himl;
+ int i;
+ HDC hdcDst;
+ int x;
+ int y;
+ int cx;
+ int cy;
+ int xBitmap;
+ int yBitmap;
+ COLORREF rgbBk;
+ COLORREF rgbFg;
+ UINT fStyle;
+ DWORD dwRop;
+} IMAGELISTDRAWPARAMS,*LPIMAGELISTDRAWPARAMS;
+#elif (_WIN32_IE >= 0x0400)
+typedef struct tagNMREBARCHILDSIZE {
+ NMHDR hdr;
+ UINT uBand;
+ UINT wID;
+ RECT rcChild;
+ RECT rcBand;
+} NMREBARCHILDSIZE,*LPNMREBARCHILDSIZE;
+typedef struct tagNMREBAR {
+ NMHDR hdr;
+ DWORD dwMask;
+ UINT uBand;
+ UINT fStyle;
+ UINT wID;
+ LPARAM lParam;
+} NMREBAR,*LPNMREBAR;
+typedef struct tagNMRBAUTOSIZE {
+ NMHDR hdr;
+ BOOL fChanged;
+ RECT rcTarget;
+ RECT rcActual;
+} NMRBAUTOSIZE,*LPNMRBAUTOSIZE;
+typedef struct _RB_HITTESTINFO {
+ POINT pt;
+ UINT flags;
+ int iBand;
+} RBHITTESTINFO,*LPRBHITTESTINFO;
+#endif
+
+#define INDEXTOOVERLAYMASK(i) ((i)<<8)
+#define INDEXTOSTATEIMAGEMASK(i) ((i)<<12)
+#define HANDLE_WM_NOTIFY(h,w,l,f) (f)((h),(int)(w),(NMHDR*)(l))
+#define FORWARD_WM_NOTIFY(h,i,p,f) (LRESULT)(f)((h),WM_NOTIFY,(WPARAM)(int)(i),(LPARAM)(NMHDR*)(p))
+#define CCSIZEOF_STRUCT(n,m) (((int)((PBYTE)(&((s*)0)->m)-((PBYTE)((s*)0))))+sizeof(((s*)0)->m))
+#define Animate_Create(w,i,s,hI) CreateWindow(ANIMATE_CLASS,NULL,s,0,0,0,0,w,(HMENU)(i),hI,NULL)
+#define Animate_Open(w,f) (BOOL)SendMessage(w,ACM_OPEN,0,(LPARAM)f)
+#define Animate_Play(w,f,t,r) (BOOL)SendMessage(w,ACM_PLAY,(r),(LPARAM)MAKELONG(f,t))
+#define Animate_Stop(w) (BOOL)SendMessage(w,ACM_STOP,0,0)
+#define Animate_Close(w) Animate_Open(w,NULL)
+#define Animate_Seek(w,f) Animate_Play(w,f,f,1)
+HBITMAP WINAPI CreateMappedBitmap(HINSTANCE,int,UINT,LPCOLORMAP,int);
+HWND WINAPI CreateStatusWindowA(LONG,LPCSTR,HWND,UINT);
+HWND WINAPI CreateStatusWindowW(LONG,LPCWSTR,HWND,UINT);
+HWND WINAPI CreateToolbarEx(HWND,DWORD,UINT,int,HINSTANCE,UINT,LPCTBBUTTON,int,int,int,int,int,UINT);
+HWND WINAPI CreateUpDownControl(DWORD,int,int,int,int,HWND,int,HINSTANCE,HWND,int,int,int);
+#define DateTime_GetMonthCal(hwnd) SendMessage(hwnd, DTM_GETMONTHCAL, 0, 0)
+#define DateTime_GetMonthCalColor(hwnd, icolor) SendMessage(hwnd, DTM_GETMONTHCAL, (WPARAM)icolor,0)
+#define DateTime_GetMonthCalFont(hwnd) SendMessage(hwnd,DTM_GETMCFONT,0,0)
+#define DateTime_GetRange(hwnd,lpsystimearray) SendMessage(hwnd,DTM_GETRANGE,0,(LPARAM)lpsystimearray)
+#define DateTime_GetSystemTime(hwnd,lpsystime) SendMessage(hwnd,DTM_GETSYSTEMTIME,0,(LPARAM)lpsystime)
+#define DateTime_SetFormat(hwnd,lpszformat) SendMessage(hwnd,DTM_SETFORMAT,0,(LPARAM)lpszformat)
+#define DateTime_SetMonthCalColor(hwnd,icolor,clr) SendMessage(hwnd,DTM_SETMCCOLOR,(WPARAM)icolor,(LPARAM)clr)
+#define DateTime_SetMonthCalFont(hwnd,hfont,lparam) SendMessage(hwnd,DTM_SETMCFONT,(WPARAM)hfont,(LPARAM)lparam)
+#define DateTime_SetRange(hwnd,flags,lpsystimearray) SendMessage(hwnd,DTM_SETRANGE,(WPARAM)flags,(LPARAM)lpsystimearray)
+#define DateTime_SetSystemTime(hwnd,flag,lpsystime) SendMessage(hwnd,DTM_SETSYSTEMTIME,(WPARAM)flag,(LPARAM)lpsystime)
+void WINAPI DrawInsert(HWND,HWND,int);
+void WINAPI DrawStatusTextA(HDC,LPRECT,LPCSTR,UINT);
+void WINAPI DrawStatusTextW(HDC,LPRECT,LPCWSTR,UINT);
+void WINAPI GetEffectiveClientRect(HWND,LPRECT,LPINT);
+#define Header_GetItemCount(w) (int)SendMessage((w),HDM_GETITEMCOUNT,0,0)
+#define Header_InsertItem(w,i,phdi) (int)SendMessage((w),HDM_INSERTITEM,(WPARAM)(int)(i),(LPARAM)(const HD_ITEM*)(phdi))
+#define Header_DeleteItem(w,i) (BOOL)SendMessage((w),HDM_DELETEITEM,(WPARAM)(int)(i),0)
+#define Header_GetItem(w,i,phdi) (BOOL)SendMessage((w),HDM_GETITEM,(WPARAM)(int)(i),(LPARAM)(HD_ITEM*)(phdi))
+#define Header_SetItem(w,i,phdi) (BOOL)SendMessage((w),HDM_SETITEM,(WPARAM)(int)(i),(LPARAM)(const HD_ITEM*)(phdi))
+#define Header_Layout(w,l) (BOOL)SendMessage((w),HDM_LAYOUT,0,(LPARAM)(HD_LAYOUT*)(l))
+int WINAPI ImageList_Add(HIMAGELIST,HBITMAP,HBITMAP);
+#define ImageList_AddIcon(l,i) ImageList_ReplaceIcon(l,-1,i)
+int WINAPI ImageList_AddMasked(HIMAGELIST,HBITMAP,COLORREF);
+BOOL WINAPI ImageList_BeginDrag(HIMAGELIST,int,int,int);
+HIMAGELIST WINAPI ImageList_Create(int,int,UINT,int,int);
+BOOL WINAPI ImageList_Destroy(HIMAGELIST);
+BOOL WINAPI ImageList_DragEnter(HWND,int,int);
+BOOL WINAPI ImageList_DragLeave(HWND);
+BOOL WINAPI ImageList_DragMove(int,int);
+BOOL WINAPI ImageList_DragShowNolock(BOOL);
+BOOL WINAPI ImageList_Draw(HIMAGELIST,int,HDC,int,int,UINT);
+BOOL WINAPI ImageList_DrawEx(HIMAGELIST,int,HDC,int,int,int,int,COLORREF,COLORREF,UINT);
+void WINAPI ImageList_EndDrag(VOID);
+#define ImageList_ExtractIcon(h,l,i) ImageList_GetIcon(l,i,0)
+COLORREF WINAPI ImageList_GetBkColor(HIMAGELIST);
+HIMAGELIST WINAPI ImageList_GetDragImage(LPPOINT,LPPOINT);
+HICON WINAPI ImageList_GetIcon(HIMAGELIST,int,UINT);
+BOOL WINAPI ImageList_GetIconSize(HIMAGELIST,int*,int*);
+int WINAPI ImageList_GetImageCount(HIMAGELIST);
+BOOL WINAPI ImageList_GetImageInfo(HIMAGELIST,int,IMAGEINFO*);
+#define ImageList_LoadBitmap(h,l,x,G,M) ImageList_LoadImage(h,l,x,G,M,IMAGE_BITMAP,0)
+HIMAGELIST WINAPI ImageList_LoadImageA(HINSTANCE,LPCSTR,int,int,COLORREF,UINT,UINT);
+HIMAGELIST WINAPI ImageList_LoadImageW(HINSTANCE,LPCWSTR,int,int,COLORREF,UINT,UINT);
+HIMAGELIST WINAPI ImageList_Merge(HIMAGELIST,int,HIMAGELIST,int,int,int);
+BOOL WINAPI ImageList_Remove(HIMAGELIST,int);
+#define ImageList_RemoveAll(l) ImageList_Remove(l,-1)
+BOOL WINAPI ImageList_Replace(HIMAGELIST,int,HBITMAP,HBITMAP);
+int WINAPI ImageList_ReplaceIcon(HIMAGELIST,int,HICON);
+COLORREF WINAPI ImageList_SetBkColor(HIMAGELIST,COLORREF);
+BOOL WINAPI ImageList_SetDragCursorImage(HIMAGELIST,int,int,int);
+BOOL WINAPI ImageList_SetIconSize(HIMAGELIST,int,int);
+BOOL WINAPI ImageList_SetOverlayImage(HIMAGELIST,int,int);
+#ifdef _OBJIDL_H
+HIMAGELIST WINAPI ImageList_Read(LPSTREAM);
+BOOL WINAPI ImageList_Write(HIMAGELIST,LPSTREAM);
+#endif
+void WINAPI InitCommonControls(void);
+BOOL WINAPI InitCommonControlsEx(LPINITCOMMONCONTROLSEX);
+WINBOOL WINAPI ImageList_DragShowNolock(BOOL);
+int WINAPI LBItemFromPt(HWND,POINT,BOOL);
+#define ListView_GetBkColor(w) (COLORREF)SendMessage((w),LVM_GETBKCOLOR,0,0)
+#define ListView_GetImageList(w,i) (HIMAGELIST)SendMessage((w),LVM_GETIMAGELIST,(i),0)
+#define ListView_GetItemCount(w) (int)SendMessage((w),LVM_GETITEMCOUNT,0,0)
+#define ListView_GetItem(w,i) (BOOL)SendMessage((w),LVM_GETITEM,0,(LPARAM)(i))
+#define ListView_SetBkColor(w,c) (BOOL)SendMessage((w),LVM_SETBKCOLOR,0,(LPARAM)c)
+#define ListView_SetImageList(w,h,i) (HIMAGELIST)(UINT)SendMessage((w),LVM_SETIMAGELIST,(i),(LPARAM)(h))
+#define ListView_SetItem(w,i) (BOOL)SendMessage((w),LVM_SETITEM,0,(LPARAM)(const LV_ITEM*)(i))
+#define ListView_InsertItem(w,i) (int)SendMessage((w),LVM_INSERTITEM,0,(LPARAM)(const LV_ITEM*)(i))
+#define ListView_DeleteItem(w,i) (BOOL)SendMessage((w),LVM_DELETEITEM,i,0)
+#define ListView_DeleteAllItems(w) (BOOL)SendMessage((w),LVM_DELETEALLITEMS,0,0)
+#define ListView_GetCallbackMask(w) (BOOL)SendMessage((w),LVM_GETCALLBACKMASK,0,0)
+#define ListView_SetCallbackMask(w,m) (BOOL)SendMessage((w),LVM_SETCALLBACKMASK,m,0)
+#define ListView_GetNextItem(w,i,f) (int)SendMessage((w),LVM_GETNEXTITEM,i,MAKELPARAM((f),0))
+#define ListView_FindItem(w,i,p) (int)SendMessage((w), LVM_FINDITEM,i,(LPARAM)(const LV_FINDINFO*)(p))
+#define ListView_GetItemRect(w,i,p,c) (BOOL)SendMessage((w),LVM_GETITEMRECT,i,((p)?(((LPRECT)(p))->left=(c),(LPARAM)(LPRECT)(p)):0))
+#define ListView_SetItemPosition(w,i,x,y) (BOOL)SendMessage((w),LVM_SETITEMPOSITION,i,MAKELPARAM(x,y))
+#define ListView_GetItemPosition(w,i,p) (BOOL)SendMessage((w),LVM_GETITEMPOSITION,i,(LPARAM)p)
+#define ListView_GetItemSpacing(w,f) (DWORD)SendMessage((w),LVM_GETITEMSPACING,f,0)
+#define ListView_GetStringWidth(w,s) (int)SendMessage((w),LVM_GETSTRINGWIDTH,0,(LPARAM)s)
+#define ListView_HitTest(w,p) (int)SendMessage((w),LVM_HITTEST,0,(LPARAM)(LV_HITTESTINFO*)(p))
+#define ListView_EnsureVisible(w,i,f) (BOOL)SendMessage((w),LVM_ENSUREVISIBLE,i,MAKELPARAM((f),0))
+#define ListView_Scroll(w,dx,dy) (BOOL)SendMessage((w),LVM_SCROLL,dx,dy)
+#define ListView_RedrawItems(w,f,l) (BOOL)SendMessage((w),LVM_REDRAWITEMS,f,l)
+#define ListView_Arrange(w,c) (BOOL)SendMessage((w),LVM_ARRANGE,c,0)
+#define ListView_EditLabel(w,i) (HWND)SendMessage((w),LVM_EDITLABEL,i,0)
+#define ListView_GetEditControl(w) (HWND)SendMessage((w),LVM_GETEDITCONTROL,0,0)
+#define ListView_GetColumn(w,i,p) (BOOL)SendMessage((w),LVM_GETCOLUMN,i,(LPARAM)(LV_COLUMN*)(p))
+#define ListView_SetColumn(w,i,p) (BOOL)SendMessage((w),LVM_SETCOLUMN,i,(LPARAM)(const LV_COLUMN*)(p))
+#define ListView_InsertColumn(w,i,p) (int)SendMessage((w),LVM_INSERTCOLUMN,i,(LPARAM)(const LV_COLUMN*)(p))
+#define ListView_DeleteColumn(w,i) (BOOL)SendMessage((w),LVM_DELETECOLUMN,i,0)
+#define ListView_GetColumnWidth(w,i) (int)SendMessage((w),LVM_GETCOLUMNWIDTH,i,0)
+#define ListView_SetColumnWidth(w,i,x) (BOOL)SendMessage((w),LVM_SETCOLUMNWIDTH,i,MAKELPARAM((x),0))
+#define ListView_CreateDragImage(w,i,p) (HIMAGELIST)SendMessage((w),LVM_CREATEDRAGIMAGE,i,(LPARAM)(LPPOINT)(p))
+#define ListView_GetViewRect(w,p) (BOOL)SendMessage((w),LVM_GETVIEWRECT,0,(LPARAM)(LPRECT)(p))
+#define ListView_GetTextColor(w) (COLORREF)SendMessage((w),LVM_GETTEXTCOLOR,0,0)
+#define ListView_SetTextColor(w,c) (BOOL)SendMessage((w),LVM_SETTEXTCOLOR,0,(LPARAM)(COLORREF)(c))
+#define ListView_GetTextBkColor(w) (COLORREF)SendMessage((w),LVM_GETTEXTBKCOLOR,0,0)
+#define ListView_SetTextBkColor(w,c) (BOOL)SendMessage((w),LVM_SETTEXTBKCOLOR,0,(LPARAM)(COLORREF)(c))
+#define ListView_GetTopIndex(w) (int)SendMessage((w),LVM_GETTOPINDEX,0,0)
+#define ListView_GetCountPerPage(w) (int)SendMessage((w),LVM_GETCOUNTPERPAGE,0,0)
+#define ListView_GetOrigin(w,p) (BOOL)SendMessage((w),LVM_GETORIGIN,0,(LPARAM)(POINT*)(p))
+#define ListView_GetOrigin(w,p) (BOOL)SendMessage((w),LVM_GETORIGIN,0,(LPARAM)(POINT*)(p))
+#define ListView_Update(w,i) (BOOL)SendMessage((w),LVM_UPDATE,i,0)
+#define ListView_SetItemState(w,i,d,m) \
+{ \
+ LV_ITEM _lvi;\
+ _lvi.stateMask=m;\
+ _lvi.state=d;\
+ SendMessage((w),LVM_SETITEMSTATE,i,(LPARAM)(LV_ITEM*)&_lvi);\
+}
+#define ListView_GetItemState(w,i,m) (UINT)SendMessage((w),LVM_GETITEMSTATE,i,m)
+#define ListView_GetItemText(w,i,iS,s,n) \
+{ \
+ LV_ITEM _lvi;\
+ _lvi.iSubItem=iS;\
+ _lvi.cchTextMax=n;\
+ _lvi.pszText=s;\
+ SendMessage((w),LVM_GETITEMTEXT,i,(LPARAM)(LV_ITEM*)&_lvi);\
+}
+#define ListView_SetItemText(w,i,iS,s) \
+{ \
+ LV_ITEM _lvi;\
+ _lvi.iSubItem=iS;\
+ _lvi.pszText=s;\
+ SendMessage((w),LVM_SETITEMTEXT,i,(LPARAM)(LV_ITEM*)&_lvi);\
+}
+#define ListView_SetItemCount(w,n) SendMessage((w),LVM_SETITEMCOUNT,n,0)
+#define ListView_SortItems(w,f,l) (BOOL)SendMessage((w),LVM_SORTITEMS,l,(LPARAM)f)
+#define ListView_SetItemPosition32(w,i,x,y) \
+{ \
+ POINT p={x,y}; \
+ SendMessage((w),LVM_SETITEMPOSITION32,i,(LPARAM)&p);\
+}
+#define ListView_GetSelectedCount(w) (UINT)SendMessage((w),LVM_GETSELECTEDCOUNT,0,0)
+
+BOOL WINAPI MakeDragList(HWND);
+void WINAPI MenuHelp(UINT,WPARAM,LPARAM,HMENU,HINSTANCE,HWND,PUINT);
+#define MonthCal_GetColor(hwnd,icolor) SendMessage(hwnd,MCM_GETCOLOR,(WPARAM)icolor,(LPARAM)0)
+#define MonthCal_GetCurSel(hwnd,lpsystime) SendMessage(hwnd,MCM_GETCURSEL,0,(LPARAM)lpsystime)
+#define MonthCal_GetFirstDayOfWeek(hwnd) SendMessage(hwnd,MCM_GETFIRSTDAYOFWEEK,0,0)
+#define MonthCal_GetMaxSelCount(hwnd) SendMessage(hwnd,MCM_GETMAXSELCOUNT,0,0)
+#define MonthCal_GetMaxTodayWidth(hwnd) SendMessage(hwnd,MCM_GETMAXTODAYWIDTH,0,0)
+#define MonthCal_GetMinReqRect(hwnd,lpRectInfo) SendMessage(hwnd,MCM_GETMINREQRECT,0,(LPARAM)lpRectInfo)
+#define MonthCal_GetMonthDelta(hwnd) SendMessage(hwnd,MCM_GETMONTHDELTA,0,0)
+#define MonthCal_GetMonthRange(hwnd,flag,systimearray) SendMessage(hwnd,MCM_GETMONTHRANGE,(WPARAM)flag,(LPARAM)systimearray)
+#define MonthCal_GetRange(hwnd,systimearray) SendMessage(hwnd,MCM_GETRANGE,0,(LPARAM)systimearray)
+#define MonthCal_GetSelRange(hwnd,systimearray) SendMessage(hwnd,MCM_GETSELRANGE,0,(LPARAM)systimearray)
+#define MonthCal_GetToday(hwnd,systime) SendMessage(hwnd,MCM_GETTODAY,0,(LPARAM)systime)
+#define MonthCal_GetUnicodeFormat(hwnd) SendMessage(hwnd,MCM_GETUNICODEFORMAT,0,0)
+#define MonthCal_HitTest(hwnd,pmchittest) SendMessage(hwnd,MCM_HITTEST,0,(LPARAM)pmchittest)
+#define MonthCal_SetColor(hwnd,icolor,clr) SendMessage(hwnd,MCM_SETCOLOR,(WPARAM)icolor,(LPARAM)clr)
+#define MonthCal_SetCurSel(hwnd,lpsystime) SendMessage(hwnd,MCM_SETCURSEL,0,(LPARAM)lpsystime)
+#define MonthCal_SetDayState(hwnd,imonths,lpdatestatearray) SendMessage(hwnd,MCM_SETDAYSTATE,(WPARAM)imonths,(LPARAM)lpdatestatearray)
+#define MonthCal_SetFirstDayOfWeek(hwnd,iday) SendMessage(hwnd,MCM_SETFIRSTDAYOFWEEK,0,(LPARAM)iday)
+#define MonthCal_SetMaxSelCount(hwnd,imax) SendMessage(hwnd,MCM_SETMAXSELCOUNT,(WPARAM)imax,0)
+#define MonthCal_SetMonthDelta(hwnd,idelta) SendMessage(hwnd,MCM_SETMONTHDELTA,(WPARAM)idelta,0)
+#define MonthCal_SetRange(hwnd,whichlimit,systimearray) SendMessage(hwnd,MCM_SETRANGE,whichlimit,systimearray)
+#define MonthCal_SetSelRange(hwnd,systimearray) SendMessage(hwnd,MCM_SETSELRANGE,0,(LPARAM)systimearray)
+#define MonthCal_SetToday(hwnd,systime) SendMessage(hwnd,MCM_SETTODAY,0,(LPARAM)systime)
+#define MonthCal_SetUnicodeFormat(hwnd,unicode) SendMessage(hwnd,MCM_SETUNICODEFORMAT,(WPARAM)unicode,0)
+BOOL WINAPI ShowHideMenuCtl(HWND,UINT,PINT);
+#define TabCtrl_GetItem(w,i,p) (BOOL)SendMessage((w),TCM_GETITEM,i,(LPARAM)(TC_ITEM*)(p))
+#define TabCtrl_SetItem(w,i,p) (BOOL)SendMessage((w),TCM_SETITEM,i,(LPARAM)(TC_ITEM*)(p))
+#define TabCtrl_InsertItem(w,i,p) (int)SendMessage((w),TCM_INSERTITEM,i,(LPARAM)(const TC_ITEM*)(p))
+#define TabCtrl_DeleteItem(w,i) (BOOL)SendMessage((w),TCM_DELETEITEM,i,0)
+#define TabCtrl_DeleteAllItems(w) (BOOL)SendMessage((w),TCM_DELETEALLITEMS,0,0)
+#define TabCtrl_GetItemRect(w,i,p) (BOOL)SendMessage((w),TCM_GETITEMRECT,i,(LPARAM)(LPRECT)(p))
+#define TabCtrl_GetCurSel(w) (int)SendMessage((w),TCM_GETCURSEL,0,0)
+#define TabCtrl_SetCurSel(w,i) (int)SendMessage((w),TCM_SETCURSEL,i,0)
+#define TabCtrl_HitTest(w,p) (int)SendMessage((w),TCM_HITTEST,0,(LPARAM)(TC_HITTESTINFO*)(p))
+#define TabCtrl_SetItemExtra(w,c) (BOOL)SendMessage((w),TCM_SETITEMEXTRA,c,0)
+#define TabCtrl_AdjustRect(w,b,p) (int)SendMessage((w),TCM_ADJUSTRECT,b,(LPARAM)(LPRECT)p)
+#define TabCtrl_SetItemSize(w,x,y) (DWORD)SendMessage((w),TCM_SETITEMSIZE,0,MAKELPARAM(x,y))
+#define TabCtrl_RemoveImage(w,i) (void)SendMessage((w),TCM_REMOVEIMAGE,i,0)
+#define TabCtrl_SetPadding(w,x,y) (void)SendMessage((w),TCM_SETPADDING,0,MAKELPARAM(x,y))
+#define TabCtrl_GetRowCount(w) (int)SendMessage((w),TCM_GETROWCOUNT,0,0)
+#define TabCtrl_GetToolTips(w) (HWND)SendMessage((w),TCM_GETTOOLTIPS,0,0)
+#define TabCtrl_SetToolTips(w,t) (void)SendMessage((w),TCM_SETTOOLTIPS,(WPARAM)t,0)
+#define TabCtrl_GetCurFocus(w) (int)SendMessage((w),TCM_GETCURFOCUS,0,0)
+#define TabCtrl_SetCurFocus(w,i) (void)SendMessage((w),TCM_SETCURFOCUS,i,0)
+#define TabCtrl_SetImageList(w,h) (HIMAGELIST)SendMessage((w),TCM_SETIMAGELIST,0,(LPARAM)(UINT)(h))
+#define TabCtrl_GetItemCount(w) (int)SendMessage((w),TCM_GETITEMCOUNT,0,0)
+BOOL WINAPI _TrackMouseEvent(LPTRACKMOUSEEVENT);
+#define TreeView_InsertItem(w,i) (HTREEITEM)SendMessage((w),TVM_INSERTITEM,0,(LPARAM)(LPTV_INSERTSTRUCT)(i))
+#define TreeView_DeleteItem(w,i) (BOOL)SendMessage((w),TVM_DELETEITEM,0,(LPARAM)(HTREEITEM)(i))
+#define TreeView_DeleteAllItems(w) (BOOL)SendMessage((w),TVM_DELETEITEM,0,(LPARAM)TVI_ROOT)
+#define TreeView_Expand(w,i,c) (BOOL)SendMessage((w),TVM_EXPAND,c,(LPARAM)(HTREEITEM)(i))
+#define TreeView_GetItemRect(w,i,p,c) (*(HTREEITEM*)p=(i),(BOOL)SendMessage((w),TVM_GETITEMRECT,c,(LPARAM)(LPRECT)(p)))
+#define TreeView_GetCount(w) (UINT)SendMessage((w),TVM_GETCOUNT,0,0)
+#define TreeView_GetIndent(w) (UINT)SendMessage((w),TVM_GETINDENT,0,0)
+#define TreeView_SetIndent(w,i) (BOOL)SendMessage((w),TVM_SETINDENT,indent,0)
+#define TreeView_GetImageList(w,i) (HIMAGELIST)SendMessage((w),TVM_GETIMAGELIST,i,0)
+#define TreeView_SetImageList(w,h,i) (HIMAGELIST)SendMessage((w),TVM_SETIMAGELIST,i,(LPARAM)(HIMAGELIST)(h))
+#define TreeView_GetNextItem(w,i,c) (HTREEITEM)SendMessage((w),TVM_GETNEXTITEM,c,(LPARAM)(HTREEITEM)(i))
+#define TreeView_GetChild(w,i) TreeView_GetNextItem(w,i,TVGN_CHILD)
+#define TreeView_GetNextSibling(w,i) TreeView_GetNextItem(w,i,TVGN_NEXT)
+#define TreeView_GetPrevSibling(w,i) TreeView_GetNextItem(w,i,TVGN_PREVIOUS)
+#define TreeView_GetParent(w,i) TreeView_GetNextItem(w,i,TVGN_PARENT)
+#define TreeView_GetFirstVisible(w) TreeView_GetNextItem(w,NULL,TVGN_FIRSTVISIBLE)
+#define TreeView_GetNextVisible(w,i) TreeView_GetNextItem(w,i,TVGN_NEXTVISIBLE)
+#define TreeView_GetPrevVisible(w,i) TreeView_GetNextItem(w,i,TVGN_PREVIOUSVISIBLE)
+#define TreeView_GetSelection(w) TreeView_GetNextItem(w,NULL,TVGN_CARET)
+#define TreeView_GetDropHilight(w) TreeView_GetNextItem(w,NULL,TVGN_DROPHILITE)
+#define TreeView_GetRoot(w) TreeView_GetNextItem(w,NULL,TVGN_ROOT)
+#define TreeView_Select(w,i,c) (HTREEITEM)SendMessage((w),TVM_SELECTITEM,c,(LPARAM)(HTREEITEM)(i))
+#define TreeView_SelectItem(w,i) TreeView_Select(w,i,TVGN_CARET)
+#define TreeView_SelectDropTarget(w,i) TreeView_Select(w,i,TVGN_DROPHILITE)
+#define TreeView_SelectSetFirstVisible(w,i) TreeView_Select(w,i,TVGN_FIRSTVISIBLE)
+#define TreeView_GetItem(w,i) (BOOL)SendMessage((w),TVM_GETITEM,0,(LPARAM)(TV_ITEM*)(i))
+#define TreeView_SetItem(w,i) (BOOL)SendMessage((w),TVM_SETITEM,0,(LPARAM)(const TV_ITEM*)(i))
+#define TreeView_EditLabel(w,i) (HWND)SendMessage((w),TVM_EDITLABEL,0,(LPARAM)(HTREEITEM)(i))
+#define TreeView_GetEditControl(w) (HWND)SendMessage((w),TVM_GETEDITCONTROL,0,0)
+#define TreeView_GetVisibleCount(w) (UINT)SendMessage((w),TVM_GETVISIBLECOUNT,0,0)
+#define TreeView_HitTest(w,p) (HTREEITEM)SendMessage((w),TVM_HITTEST,0,(LPARAM)(LPTV_HITTESTINFO)(p))
+#define TreeView_CreateDragImage(w,i) (HIMAGELIST)SendMessage((w),TVM_CREATEDRAGIMAGE,0,(LPARAM)(HTREEITEM)(i))
+#define TreeView_SortChildren(w,i,r) (BOOL)SendMessage((w),TVM_SORTCHILDREN,r,(LPARAM)(HTREEITEM)(i))
+#define TreeView_EnsureVisible(w,i) (BOOL)SendMessage((w),TVM_ENSUREVISIBLE,0,(LPARAM)(HTREEITEM)(i))
+#define TreeView_SortChildrenCB(w,s,r) (BOOL)SendMessage((w),TVM_SORTCHILDRENCB,r,(LPARAM)(LPTV_SORTCB)(s))
+#define TreeView_EndEditLabelNow(w,f) (BOOL)SendMessage((w),TVM_ENDEDITLABELNOW,f,0)
+#define TreeView_GetISearchString(w,s) (BOOL)SendMessage((w),TVM_GETISEARCHSTRING,0,(LPARAM)s)
+
+#if (_WIN32_IE >= 0x0300)
+WINBOOL WINAPI ImageList_SetImageCount(HIMAGELIST,UINT);
+WINBOOL WINAPI ImageList_Copy(HIMAGELIST,int,HIMAGELIST,int,UINT);
+WINBOOL WINAPI ImageList_DrawIndirect(IMAGELISTDRAWPARAMS*);
+#define TabCtrl_SetMinTabWidth(hwnd, x) SendMessage((hwnd), TCM_SETMINTABWIDTH, 0, x)
+#define TabCtrl_DeselectAll(hwnd, fExcludeFocus) SendMessage((hwnd), TCM_DESELECTALL, fExcludeFocus, 0)
+#endif
+#if (_WIN32_IE >= 0x0400)
+#define TabCtrl_HighlightItem(hwnd, i, fHighlight) SendMessage((hwnd), TCM_HIGHLIGHTITEM, (WPARAM)i, (LPARAM)MAKELONG (fHighlight, 0))
+#define TabCtrl_SetExtendedStyle(hwnd, dw) SendMessage((hwnd), TCM_SETEXTENDEDSTYLE, 0, dw)
+#define TabCtrl_GetExtendedStyle(hwnd) SendMessage((hwnd), TCM_GETEXTENDEDSTYLE, 0, 0)
+#define TabCtrl_SetUnicodeFormat(hwnd, fUnicode) SendMessage((hwnd), TCM_SETUNICODEFORMAT, (WPARAM)(fUnicode), 0)
+#define TabCtrl_GetUnicodeFormat(hwnd) SendMessage((hwnd), TCM_GETUNICODEFORMAT, 0, 0)
+#endif
+
+#ifdef UNICODE
+#define ANIMATE_CLASS ANIMATE_CLASSW
+#define HOTKEY_CLASS HOTKEY_CLASSW
+#define PROGRESS_CLASS PROGRESS_CLASSW
+#define STATUSCLASSNAME STATUSCLASSNAMEW
+#define TOOLBARCLASSNAME TOOLBARCLASSNAMEW
+#define TOOLTIPS_CLASS TOOLTIPS_CLASSW
+#define TRACKBAR_CLASS TRACKBAR_CLASSW
+#define UPDOWN_CLASS UPDOWN_CLASSW
+#define WC_HEADER WC_HEADERW
+#define WC_LISTVIEW WC_LISTVIEWW
+#define WC_TABCONTROL WC_TABCONTROLW
+#define WC_TREEVIEW WC_TREEVIEWW
+typedef HD_ITEMW HD_ITEM;
+typedef TOOLINFOW TOOLINFO,*PTOOLINFO,*LPTOOLINFO;
+typedef TTHITTESTINFOW TTHITTESTINFO,*LPHITTESTINFO;
+typedef TOOLTIPTEXTW TOOLTIPTEXT,*LPTOOLTIPTEXT;
+typedef TV_ITEMW TV_ITEM,*LPTV_ITEM;
+typedef TV_INSERTSTRUCTW TV_INSERTSTRUCT,*LPTV_INSERTSTRUCT;
+typedef NM_TREEVIEWW NM_TREEVIEW,*LPNM_TREEVIEW;
+#define ACM_OPEN ACM_OPENW
+#define SB_GETTEXT SB_GETTEXTW
+#define SB_SETTEXT SB_SETTEXTW
+#define SB_GETTEXTLENGTH SB_GETTEXTLENGTHW
+#define STATUSCLASSNAME STATUSCLASSNAMEW
+#define WC_HEADER WC_HEADERW
+#define HDM_INSERTITEM HDM_INSERTITEMW
+#define HDM_GETITEM HDM_GETITEMW
+#define HDM_SETITEM HDM_SETITEMW
+#define HDN_ITEMCHANGING HDN_ITEMCHANGINGW
+#define HDN_ITEMCHANGED HDN_ITEMCHANGEDW
+#define HDN_ITEMCLICK HDN_ITEMCLICKW
+#define HDN_ITEMDBLCLICK HDN_ITEMDBLCLICKW
+#define HDN_DIVIDERDBLCLICK HDN_DIVIDERDBLCLICKW
+#define HDN_BEGINTRACK HDN_BEGINTRACKW
+#define HDN_ENDTRACK HDN_ENDTRACKW
+#define HDN_TRACK HDN_TRACKW
+#define HD_NOTIFY HD_NOTIFYW
+#define TOOLBARCLASSNAME TOOLBARCLASSNAMEW
+#define TBSAVEPARAMS TBSAVEPARAMSW
+#define TB_GETBUTTONTEXT TB_GETBUTTONTEXTW
+#define TB_SAVERESTORE TB_SAVERESTOREW
+#define TB_ADDSTRING TB_ADDSTRINGW
+#define TBN_GETBUTTONINFO TBN_GETBUTTONINFOW
+#define TBNOTIFY TBNOTIFYW
+#define LPTBNOTIFY LPTBNOTIFYW
+#define TOOLTIPS_CLASS TOOLTIPS_CLASSW
+#define TTM_ADDTOOL TTM_ADDTOOLW
+#define TTM_DELTOOL TTM_DELTOOLW
+#define TTM_NEWTOOLRECT TTM_NEWTOOLRECTW
+#define TTM_GETTOOLINFO TTM_GETTOOLINFOW
+#define TTM_SETTOOLINFO TTM_SETTOOLINFOW
+#define TTM_HITTEST TTM_HITTESTW
+#define TTM_GETTEXT TTM_GETTEXTW
+#define TTM_UPDATETIPTEXT TTM_UPDATETIPTEXTW
+#define TTM_ENUMTOOLS TTM_ENUMTOOLSW
+#define TTM_GETCURRENTTOOL TTM_GETCURRENTTOOLW
+#define TTN_NEEDTEXT TTN_NEEDTEXTW
+#define SB_GETTEXT SB_GETTEXTW
+#define SB_SETTEXT SB_SETTEXTW
+#define SB_GETTEXTLENGTH SB_GETTEXTLENGTHW
+#define TRACKBAR_CLASS TRACKBAR_CLASSW
+#define UPDOWN_CLASS UPDOWN_CLASSW
+#define PROGRESS_CLASS PROGRESS_CLASSW
+#define HOTKEY_CLASS HOTKEY_CLASSW
+#define WC_LISTVIEW WC_LISTVIEWW
+#define LV_ITEM LV_ITEMW
+#define LPSTR_TEXTCALLBACK LPSTR_TEXTCALLBACKW
+#define LVM_GETITEM LVM_GETITEMW
+#define LVM_SETITEM LVM_SETITEMW
+#define LVM_INSERTITEM LVM_INSERTITEMW
+#define LV_FINDINFO LV_FINDINFOW
+#define LVM_FINDITEM LVM_FINDITEMW
+#define LVM_GETSTRINGWIDTH LVM_GETSTRINGWIDTHW
+#define LVM_EDITLABEL LVM_EDITLABELW
+#define LV_COLUMN LV_COLUMNW
+#define LVM_GETCOLUMN LVM_GETCOLUMNW
+#define LVM_SETCOLUMN LVM_SETCOLUMNW
+#define LVM_INSERTCOLUMN LVM_INSERTCOLUMNW
+#define LVM_GETITEMTEXT LVM_GETITEMTEXTW
+#define LVM_SETITEMTEXT LVM_SETITEMTEXTW
+#define LVM_GETISEARCHSTRING LVM_GETISEARCHSTRINGW
+#define LVN_BEGINLABELEDIT LVN_BEGINLABELEDITW
+#define LVN_ENDLABELEDIT LVN_ENDLABELEDITW
+#define LVN_GETDISPINFO LVN_GETDISPINFOW
+#define LVN_SETDISPINFO LVN_SETDISPINFOW
+#define LV_DISPINFO LV_DISPINFOW
+#define WC_TREEVIEW WC_TREEVIEWW
+#define TVM_INSERTITEM TVM_INSERTITEMW
+#define TVM_GETITEM TVM_GETITEMW
+#define TVM_SETITEM TVM_SETITEMW
+#define TVM_EDITLABEL TVM_EDITLABELW
+#define TVM_GETISEARCHSTRING TVM_GETISEARCHSTRINGW
+#define TV_DISPINFO TV_DISPINFOW
+#define TVN_SELCHANGING TVN_SELCHANGINGW
+#define TVN_SELCHANGED TVN_SELCHANGEDW
+#define TVN_GETDISPINFO TVN_GETDISPINFOW
+#define TVN_SETDISPINFO TVN_SETDISPINFOW
+#define TVN_ITEMEXPANDING TVN_ITEMEXPANDINGW
+#define TVN_ITEMEXPANDED TVN_ITEMEXPANDEDW
+#define TVN_BEGINDRAG TVN_BEGINDRAGW
+#define TVN_BEGINRDRAG TVN_BEGINRDRAGW
+#define TVN_DELETEITEM TVN_DELETEITEMW
+#define TVN_BEGINLABELEDIT TVN_BEGINLABELEDITW
+#define TVN_ENDLABELEDIT TVN_ENDLABELEDITW
+#define WC_TABCONTROL WC_TABCONTROLW
+#define TC_ITEMHEADER TC_ITEMHEADERW
+#define TC_ITEM TC_ITEMW
+#define TCM_GETITEM TCM_GETITEMW
+#define TCM_SETITEM TCM_SETITEMW
+#define TCM_INSERTITEM TCM_INSERTITEMW
+#define CreateStatusWindow CreateStatusWindowW
+#define DrawStatusText DrawStatusTextW
+#define ImageList_LoadImage ImageList_LoadImageW
+#define DTM_SETFORMAT DTM_SETFORMATW
+#define DTN_USERSTRING DTN_USERSTRINGW
+#define DTN_WMKEYDOWN DTN_WMKEYDOWNW
+#define DTN_FORMAT DTN_FORMATW
+#define DTN_FORMATQUERY DTN_FORMATQUERYW
+#define DATETIMEPICK_CLASS DATETIMEPICK_CLASSW
+#define MONTHCAL_CLASS MONTHCAL_CLASSW
+#define REBARCLASSNAME REBARCLASSNAMEW
+typedef REBARBANDINFOW REBARBANDINFO,*LPREBARBANDINFO;
+#define LPCREBARBANDINFO LPCREBARBANDINFOW
+#define REBARBANDINFO_V3_SIZE REBARBANDINFOW_V3_SIZE
+#define RB_INSERTBAND RB_INSERTBANDW
+#define RB_SETBANDINFO RB_SETBANDINFOW
+#else
+#define ANIMATE_CLASS ANIMATE_CLASSA
+#define HOTKEY_CLASS HOTKEY_CLASSA
+#define PROGRESS_CLASS PROGRESS_CLASSA
+#define STATUSCLASSNAME STATUSCLASSNAMEA
+#define TOOLBARCLASSNAME TOOLBARCLASSNAMEA
+#define TOOLTIPS_CLASS TOOLTIPS_CLASSA
+#define TRACKBAR_CLASS TRACKBAR_CLASSA
+#define UPDOWN_CLASS UPDOWN_CLASSA
+#define WC_HEADER WC_HEADERA
+#define WC_LISTVIEW WC_LISTVIEWA
+#define WC_TABCONTROL WC_TABCONTROLA
+#define WC_TREEVIEW WC_TREEVIEWA
+typedef HD_ITEMA HD_ITEM;
+typedef TOOLINFOA TOOLINFO,*PTOOLINFO,*LPTOOLINFO;
+typedef TTHITTESTINFOA TTHITTESTINFO,*LPHITTESTINFO;
+typedef TOOLTIPTEXTA TOOLTIPTEXT,*LPTOOLTIPTEXT;
+typedef TV_ITEMA TV_ITEM,*LPTV_ITEM;
+typedef TV_INSERTSTRUCTA TV_INSERTSTRUCT,*LPTV_INSERTSTRUCT;
+typedef NM_TREEVIEWA NM_TREEVIEW,*LPNM_TREEVIEW;
+#define ACM_OPEN ACM_OPENA
+#define SB_GETTEXT SB_GETTEXTA
+#define SB_SETTEXT SB_SETTEXTA
+#define SB_GETTEXTLENGTH SB_GETTEXTLENGTHA
+#define HDM_INSERTITEM HDM_INSERTITEMA
+#define HDM_GETITEM HDM_GETITEMA
+#define HDM_SETITEM HDM_SETITEMA
+#define HDN_ITEMCHANGING HDN_ITEMCHANGINGA
+#define HDN_ITEMCHANGED HDN_ITEMCHANGEDA
+#define HDN_ITEMCLICK HDN_ITEMCLICKA
+#define HDN_ITEMDBLCLICK HDN_ITEMDBLCLICKA
+#define HDN_DIVIDERDBLCLICK HDN_DIVIDERDBLCLICKA
+#define HDN_BEGINTRACK HDN_BEGINTRACKA
+#define HDN_ENDTRACK HDN_ENDTRACKA
+#define HDN_TRACK HDN_TRACKA
+#define HD_NOTIFY HD_NOTIFYA
+#define TBSAVEPARAMS TBSAVEPARAMSA
+#define TB_GETBUTTONTEXT TB_GETBUTTONTEXTA
+#define TB_SAVERESTORE TB_SAVERESTOREA
+#define TB_ADDSTRING TB_ADDSTRINGA
+#define TBN_GETBUTTONINFO TBN_GETBUTTONINFOA
+#define TBNOTIFY TBNOTIFYA
+#define LPTBNOTIFY LPTBNOTIFYA
+#define TTM_ADDTOOL TTM_ADDTOOLA
+#define TTM_DELTOOL TTM_DELTOOLA
+#define TTM_NEWTOOLRECT TTM_NEWTOOLRECTA
+#define TTM_GETTOOLINFO TTM_GETTOOLINFOA
+#define TTM_SETTOOLINFO TTM_SETTOOLINFOA
+#define TTM_HITTEST TTM_HITTESTA
+#define TTM_GETTEXT TTM_GETTEXTA
+#define TTM_UPDATETIPTEXT TTM_UPDATETIPTEXTA
+#define TTM_ENUMTOOLS TTM_ENUMTOOLSA
+#define TTM_GETCURRENTTOOL TTM_GETCURRENTTOOLA
+#define TTN_NEEDTEXT TTN_NEEDTEXTA
+#define SB_GETTEXT SB_GETTEXTA
+#define SB_SETTEXT SB_SETTEXTA
+#define SB_GETTEXTLENGTH SB_GETTEXTLENGTHA
+#define LV_ITEM LV_ITEMA
+#define LPSTR_TEXTCALLBACK LPSTR_TEXTCALLBACKA
+#define LVM_GETITEM LVM_GETITEMA
+#define LVM_SETITEM LVM_SETITEMA
+#define LVM_INSERTITEM LVM_INSERTITEMA
+#define LV_FINDINFO LV_FINDINFOA
+#define LVM_FINDITEM LVM_FINDITEMA
+#define LVM_GETSTRINGWIDTH LVM_GETSTRINGWIDTHA
+#define LVM_EDITLABEL LVM_EDITLABELA
+#define LV_COLUMN LV_COLUMNA
+#define LVM_GETCOLUMN LVM_GETCOLUMNA
+#define LVM_SETCOLUMN LVM_SETCOLUMNA
+#define LVM_INSERTCOLUMN LVM_INSERTCOLUMNA
+#define LVM_GETITEMTEXT LVM_GETITEMTEXTA
+#define LVM_SETITEMTEXT LVM_SETITEMTEXTA
+#define LVM_GETISEARCHSTRING LVM_GETISEARCHSTRINGA
+#define LVN_BEGINLABELEDIT LVN_BEGINLABELEDITA
+#define LVN_ENDLABELEDIT LVN_ENDLABELEDITA
+#define LVN_GETDISPINFO LVN_GETDISPINFOA
+#define LVN_SETDISPINFO LVN_SETDISPINFOA
+#define LV_DISPINFO LV_DISPINFOA
+#define TVM_INSERTITEM TVM_INSERTITEMA
+#define TVM_GETITEM TVM_GETITEMA
+#define TVM_SETITEM TVM_SETITEMA
+#define TVM_EDITLABEL TVM_EDITLABELA
+#define TVM_GETISEARCHSTRING TVM_GETISEARCHSTRINGA
+#define TV_DISPINFO TV_DISPINFOA
+#define TVN_SELCHANGING TVN_SELCHANGINGA
+#define TVN_SELCHANGED TVN_SELCHANGEDA
+#define TVN_GETDISPINFO TVN_GETDISPINFOA
+#define TVN_SETDISPINFO TVN_SETDISPINFOA
+#define TVN_ITEMEXPANDING TVN_ITEMEXPANDINGA
+#define TVN_ITEMEXPANDED TVN_ITEMEXPANDEDA
+#define TVN_BEGINDRAG TVN_BEGINDRAGA
+#define TVN_BEGINRDRAG TVN_BEGINRDRAGA
+#define TVN_DELETEITEM TVN_DELETEITEMA
+#define TVN_BEGINLABELEDIT TVN_BEGINLABELEDITA
+#define TVN_ENDLABELEDIT TVN_ENDLABELEDITA
+#define TC_ITEMHEADER TC_ITEMHEADERA
+#define TC_ITEM TC_ITEMA
+#define TCM_GETITEM TCM_GETITEMA
+#define TCM_SETITEM TCM_SETITEMA
+#define TCM_INSERTITEM TCM_INSERTITEMA
+#define CreateStatusWindow CreateStatusWindowA
+#define DrawStatusText DrawStatusTextA
+#define ImageList_LoadImage ImageList_LoadImageA
+#define DTM_SETFORMAT DTM_SETFORMATA
+#define DTN_USERSTRING DTN_USERSTRINGA
+#define DTN_WMKEYDOWN DTN_WMKEYDOWNA
+#define DTN_FORMAT DTN_FORMATA
+#define DTN_FORMATQUERY DTN_FORMATQUERYA
+#define DATETIMEPICK_CLASS DATETIMEPICK_CLASSA
+#define MONTHCAL_CLASS MONTHCAL_CLASSA
+#define REBARCLASSNAME REBARCLASSNAMEA
+typedef REBARBANDINFOA REBARBANDINFO,*LPREBARBANDINFO;
+#define LPCREBARBANDINFO LPCREBARBANDINFOA
+#define REBARBANDINFO_V3_SIZE REBARBANDINFOA_V3_SIZE
+#define RB_INSERTBAND RB_INSERTBANDA
+#define RB_SETBANDINFO RB_SETBANDINFOA
+#endif
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/winsup/w32api/include/commdlg.h b/winsup/w32api/include/commdlg.h
new file mode 100644
index 000000000..4d56ec225
--- /dev/null
+++ b/winsup/w32api/include/commdlg.h
@@ -0,0 +1,503 @@
+#ifndef _COMMDLG_H
+#define _COMMDLG_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+#pragma pack(push,1)
+
+#define LBSELCHSTRINGA "commdlg_LBSelChangedNotify"
+#define SHAREVISTRINGA "commdlg_ShareViolation"
+#define FILEOKSTRINGA "commdlg_FileNameOK"
+#define COLOROKSTRINGA "commdlg_ColorOK"
+#define SETRGBSTRINGA "commdlg_SetRGBColor"
+#define HELPMSGSTRINGA "commdlg_help"
+#define FINDMSGSTRINGA "commdlg_FindReplace"
+#define LBSELCHSTRINGW L"commdlg_LBSelChangedNotify"
+#define SHAREVISTRINGW L"commdlg_ShareViolation"
+#define FILEOKSTRINGW L"commdlg_FileNameOK"
+#define COLOROKSTRINGW L"commdlg_ColorOK"
+#define SETRGBSTRINGW L"commdlg_SetRGBColor"
+#define HELPMSGSTRINGW L"commdlg_help"
+#define FINDMSGSTRINGW L"commdlg_FindReplace"
+#define CDN_FIRST (-601)
+#define CDN_LAST (-699)
+#define CDN_INITDONE CDN_FIRST
+#define CDN_SELCHANGE (CDN_FIRST-1)
+#define CDN_FOLDERCHANGE (CDN_FIRST-2)
+#define CDN_SHAREVIOLATION (CDN_FIRST-3)
+#define CDN_HELP (CDN_FIRST-4)
+#define CDN_FILEOK (CDN_FIRST-5)
+#define CDN_TYPECHANGE (CDN_FIRST-6)
+#define CDM_FIRST (WM_USER+100)
+#define CDM_LAST (WM_USER+200)
+#define CDM_GETSPEC CDM_FIRST
+#define CDM_GETFILEPATH (CDM_FIRST+1)
+#define CDM_GETFOLDERPATH (CDM_FIRST+2)
+#define CDM_GETFOLDERIDLIST (CDM_FIRST+3)
+#define CDM_SETCONTROLTEXT (CDM_FIRST+4)
+#define CDM_HIDECONTROL (CDM_FIRST+5)
+#define CDM_SETDEFEXT (CDM_FIRST+6)
+#define CC_RGBINIT 1
+#define CC_FULLOPEN 2
+#define CC_PREVENTFULLOPEN 4
+#define CC_SHOWHELP 8
+#define CC_ENABLEHOOK 16
+#define CC_ENABLETEMPLATE 32
+#define CC_ENABLETEMPLATEHANDLE 64
+#define CC_SOLIDCOLOR 128
+#define CC_ANYCOLOR 256
+#define CF_SCREENFONTS 1
+#define CF_PRINTERFONTS 2
+#define CF_BOTH 3
+#define CF_SHOWHELP 4
+#define CF_ENABLEHOOK 8
+#define CF_ENABLETEMPLATE 16
+#define CF_ENABLETEMPLATEHANDLE 32
+#define CF_INITTOLOGFONTSTRUCT 64
+#define CF_USESTYLE 128
+#define CF_EFFECTS 256
+#define CF_APPLY 512
+#define CF_ANSIONLY 1024
+#define CF_SCRIPTSONLY CF_ANSIONLY
+#define CF_NOVECTORFONTS 2048
+#define CF_NOOEMFONTS 2048
+#define CF_NOSIMULATIONS 4096
+#define CF_LIMITSIZE 8192
+#define CF_FIXEDPITCHONLY 16384
+#define CF_WYSIWYG 32768
+#define CF_FORCEFONTEXIST 65536
+#define CF_SCALABLEONLY 131072
+#define CF_TTONLY 262144
+#define CF_NOFACESEL 524288
+#define CF_NOSTYLESEL 1048576
+#define CF_NOSIZESEL 2097152
+#define CF_SELECTSCRIPT 4194304
+#define CF_NOSCRIPTSEL 8388608
+#define CF_NOVERTFONTS 0x1000000
+#define SIMULATED_FONTTYPE 0x8000
+#define PRINTER_FONTTYPE 0x4000
+#define SCREEN_FONTTYPE 0x2000
+#define BOLD_FONTTYPE 0x100
+#define ITALIC_FONTTYPE 0x0200
+#define REGULAR_FONTTYPE 0x0400
+#define WM_CHOOSEFONT_GETLOGFONT (WM_USER+1)
+#define WM_CHOOSEFONT_SETLOGFONT (WM_USER+101)
+#define WM_CHOOSEFONT_SETFLAGS (WM_USER+102)
+#define OFN_ALLOWMULTISELECT 512
+#define OFN_CREATEPROMPT 0x2000
+#define OFN_ENABLEHOOK 32
+#define OFN_ENABLETEMPLATE 64
+#define OFN_ENABLETEMPLATEHANDLE 128
+#define OFN_EXPLORER 0x80000
+#define OFN_EXTENSIONDIFFERENT 0x400
+#define OFN_FILEMUSTEXIST 0x1000
+#define OFN_HIDEREADONLY 4
+#define OFN_LONGNAMES 0x200000
+#define OFN_NOCHANGEDIR 8
+#define OFN_NODEREFERENCELINKS 0x100000
+#define OFN_NOLONGNAMES 0x40000
+#define OFN_NONETWORKBUTTON 0x20000
+#define OFN_NOREADONLYRETURN 0x8000
+#define OFN_NOTESTFILECREATE 0x10000
+#define OFN_NOVALIDATE 256
+#define OFN_OVERWRITEPROMPT 2
+#define OFN_PATHMUSTEXIST 0x800
+#define OFN_READONLY 1
+#define OFN_SHAREAWARE 0x4000
+#define OFN_SHOWHELP 16
+#define OFN_SHAREFALLTHROUGH 2
+#define OFN_SHARENOWARN 1
+#define OFN_SHAREWARN 0
+#define OFN_NODEREFERENCELINKS 0x100000
+#define FR_DIALOGTERM 64
+#define FR_DOWN 1
+#define FR_ENABLEHOOK 256
+#define FR_ENABLETEMPLATE 512
+#define FR_ENABLETEMPLATEHANDLE 0x2000
+#define FR_FINDNEXT 8
+#define FR_HIDEUPDOWN 0x4000
+#define FR_HIDEMATCHCASE 0x8000
+#define FR_HIDEWHOLEWORD 0x10000
+#define FR_MATCHCASE 4
+#define FR_NOMATCHCASE 0x800
+#define FR_NOUPDOWN 0x400
+#define FR_NOWHOLEWORD 4096
+#define FR_REPLACE 16
+#define FR_REPLACEALL 32
+#define FR_SHOWHELP 128
+#define FR_WHOLEWORD 2
+#define PD_ALLPAGES 0
+#define PD_SELECTION 1
+#define PD_PAGENUMS 2
+#define PD_NOSELECTION 4
+#define PD_NOPAGENUMS 8
+#define PD_COLLATE 16
+#define PD_PRINTTOFILE 32
+#define PD_PRINTSETUP 64
+#define PD_NOWARNING 128
+#define PD_RETURNDC 256
+#define PD_RETURNIC 512
+#define PD_RETURNDEFAULT 1024
+#define PD_SHOWHELP 2048
+#define PD_ENABLEPRINTHOOK 4096
+#define PD_ENABLESETUPHOOK 8192
+#define PD_ENABLEPRINTTEMPLATE 16384
+#define PD_ENABLESETUPTEMPLATE 32768
+#define PD_ENABLEPRINTTEMPLATEHANDLE 65536
+#define PD_ENABLESETUPTEMPLATEHANDLE 0x20000
+#define PD_USEDEVMODECOPIES 0x40000
+#define PD_USEDEVMODECOPIESANDCOLLATE 0x40000
+#define PD_DISABLEPRINTTOFILE 0x80000
+#define PD_HIDEPRINTTOFILE 0x100000
+#define PD_NONETWORKBUTTON 0x200000
+#define PSD_DEFAULTMINMARGINS 0
+#define PSD_INWININIINTLMEASURE 0
+#define PSD_MINMARGINS 1
+#define PSD_MARGINS 2
+#define PSD_INTHOUSANDTHSOFINCHES 4
+#define PSD_INHUNDREDTHSOFMILLIMETERS 8
+#define PSD_DISABLEMARGINS 16
+#define PSD_DISABLEPRINTER 32
+#define PSD_NOWARNING 128
+#define PSD_DISABLEORIENTATION 256
+#define PSD_DISABLEPAPER 512
+#define PSD_RETURNDEFAULT 1024
+#define PSD_SHOWHELP 2048
+#define PSD_ENABLEPAGESETUPHOOK 8192
+#define PSD_ENABLEPAGESETUPTEMPLATE 0x8000
+#define PSD_ENABLEPAGESETUPTEMPLATEHANDLE 0x20000
+#define PSD_ENABLEPAGEPAINTHOOK 0x40000
+#define PSD_DISABLEPAGEPAINTING 0x80000
+#define WM_PSD_PAGESETUPDLG WM_USER
+#define WM_PSD_FULLPAGERECT (WM_USER+1)
+#define WM_PSD_MINMARGINRECT (WM_USER+2)
+#define WM_PSD_MARGINRECT (WM_USER+3)
+#define WM_PSD_GREEKTEXTRECT (WM_USER+4)
+#define WM_PSD_ENVSTAMPRECT (WM_USER+5)
+#define WM_PSD_YAFULLPAGERECT (WM_USER+6)
+#define CD_LBSELNOITEMS (-1)
+#define CD_LBSELCHANGE 0
+#define CD_LBSELSUB 1
+#define CD_LBSELADD 2
+#define DN_DEFAULTPRN 1
+
+#ifndef SNDMSG
+#define SNDMSG SendMessage
+#endif
+
+#define CommDlg_OpenSave_GetSpec(d,s,m) (int)SNDMSG(d,CDM_GETSPEC,m,(LPARAM)s)
+#define CommDlg_OpenSave_GetSpecA CommDlg_OpenSave_GetSpec
+#define CommDlg_OpenSave_GetSpecW CommDlg_OpenSave_GetSpec
+#define CommDlg_OpenSave_GetFilePath(d,s,m) (int)SNDMSG(d,CDM_GETFILEPATH,m,(LPARAM)s)
+#define CommDlg_OpenSave_GetFilePathA CommDlg_OpenSave_GetFilePath
+#define CommDlg_OpenSave_GetFilePathW CommDlg_OpenSave_GetFilePath
+#define CommDlg_OpenSave_GetFolderPath(d,s,m) (int)SendMessage(d,CDM_GETFOLDERPATH,m,(LPARAM)(LPSTR)s)
+#define CommDlg_OpenSave_GetFolderPathA CommDlg_OpenSave_GetFolderPath
+#define CommDlg_OpenSave_GetFolderPathW CommDlg_OpenSave_GetFolderPath
+#define CommDlg_OpenSave_GetFolderIDList(d,i,m) (int)SendMessage(d,CDM_GETFOLDERIDLIST,m,(LPARAM)i)
+#define CommDlg_OpenSave_SetControlText(d,i,t) (void)SendMessage(d,CDM_SETCONTROLTEXT,i,(LPARAM)t)
+#define CommDlg_OpenSave_HideControl(d,i) (void)SendMessage(d,CDM_HIDECONTROL,i,0)
+#define CommDlg_OpenSave_SetDefExt(d,e) (void)SendMessage(d,CDM_SETDEFEXT,0,(LPARAM)e)
+
+typedef UINT (APIENTRY *__CDHOOKPROC)(HWND,UINT,WPARAM,LPARAM);
+typedef __CDHOOKPROC LPCCHOOKPROC;
+typedef __CDHOOKPROC LPCFHOOKPROC;
+typedef __CDHOOKPROC LPFRHOOKPROC;
+typedef __CDHOOKPROC LPOFNHOOKPROC;
+typedef __CDHOOKPROC LPPAGEPAINTHOOK;
+typedef __CDHOOKPROC LPPAGESETUPHOOK;
+typedef __CDHOOKPROC LPSETUPHOOKPROC;
+typedef __CDHOOKPROC LPPRINTHOOKPROC;
+typedef struct tagCHOOSECOLORA {
+ DWORD lStructSize;
+ HWND hwndOwner;
+ HWND hInstance;
+ COLORREF rgbResult;
+ COLORREF* lpCustColors;
+ DWORD Flags;
+ LPARAM lCustData;
+ LPCCHOOKPROC lpfnHook;
+ LPCSTR lpTemplateName;
+} CHOOSECOLORA,*LPCHOOSECOLORA;
+typedef struct tagCHOOSECOLORW {
+ DWORD lStructSize;
+ HWND hwndOwner;
+ HWND hInstance;
+ COLORREF rgbResult;
+ COLORREF* lpCustColors;
+ DWORD Flags;
+ LPARAM lCustData;
+ LPCCHOOKPROC lpfnHook;
+ LPCWSTR lpTemplateName;
+} CHOOSECOLORW,*LPCHOOSECOLORW;
+typedef struct tagCHOOSEFONTA {
+ DWORD lStructSize;
+ HWND hwndOwner;
+ HDC hDC;
+ LPLOGFONTA lpLogFont;
+ INT iPointSize;
+ DWORD Flags;
+ DWORD rgbColors;
+ LPARAM lCustData;
+ LPCFHOOKPROC lpfnHook;
+ LPCSTR lpTemplateName;
+ HINSTANCE hInstance;
+ LPSTR lpszStyle;
+ WORD nFontType;
+ WORD ___MISSING_ALIGNMENT__;
+ INT nSizeMin;
+ INT nSizeMax;
+} CHOOSEFONTA,*LPCHOOSEFONTA;
+typedef struct tagCHOOSEFONTW {
+ DWORD lStructSize;
+ HWND hwndOwner;
+ HDC hDC;
+ LPLOGFONTW lpLogFont;
+ INT iPointSize;
+ DWORD Flags;
+ DWORD rgbColors;
+ LPARAM lCustData;
+ LPCFHOOKPROC lpfnHook;
+ LPCWSTR lpTemplateName;
+ HINSTANCE hInstance;
+ LPWSTR lpszStyle;
+ WORD nFontType;
+ WORD ___MISSING_ALIGNMENT__;
+ INT nSizeMin;
+ INT nSizeMax;
+} CHOOSEFONTW,*LPCHOOSEFONTW;
+typedef struct tagDEVNAMES {
+ WORD wDriverOffset;
+ WORD wDeviceOffset;
+ WORD wOutputOffset;
+ WORD wDefault;
+} DEVNAMES,*LPDEVNAMES;
+typedef struct {
+ DWORD lStructSize;
+ HWND hwndOwner;
+ HINSTANCE hInstance;
+ DWORD Flags;
+ LPSTR lpstrFindWhat;
+ LPSTR lpstrReplaceWith;
+ WORD wFindWhatLen;
+ WORD wReplaceWithLen;
+ LPARAM lCustData;
+ LPFRHOOKPROC lpfnHook;
+ LPCSTR lpTemplateName;
+} FINDREPLACEA,*LPFINDREPLACEA;
+typedef struct {
+ DWORD lStructSize;
+ HWND hwndOwner;
+ HINSTANCE hInstance;
+ DWORD Flags;
+ LPWSTR lpstrFindWhat;
+ LPWSTR lpstrReplaceWith;
+ WORD wFindWhatLen;
+ WORD wReplaceWithLen;
+ LPARAM lCustData;
+ LPFRHOOKPROC lpfnHook;
+ LPCWSTR lpTemplateName;
+} FINDREPLACEW,*LPFINDREPLACEW;
+typedef struct tagOFNA {
+ DWORD lStructSize;
+ HWND hwndOwner;
+ HINSTANCE hInstance;
+ LPCSTR lpstrFilter;
+ LPSTR lpstrCustomFilter;
+ DWORD nMaxCustFilter;
+ DWORD nFilterIndex;
+ LPSTR lpstrFile;
+ DWORD nMaxFile;
+ LPSTR lpstrFileTitle;
+ DWORD nMaxFileTitle;
+ LPCSTR lpstrInitialDir;
+ LPCSTR lpstrTitle;
+ DWORD Flags;
+ WORD nFileOffset;
+ WORD nFileExtension;
+ LPCSTR lpstrDefExt;
+ DWORD lCustData;
+ LPOFNHOOKPROC lpfnHook;
+ LPCSTR lpTemplateName;
+} OPENFILENAMEA,*LPOPENFILENAMEA;
+typedef struct tagOFNW {
+ DWORD lStructSize;
+ HWND hwndOwner;
+ HINSTANCE hInstance;
+ LPCWSTR lpstrFilter;
+ LPWSTR lpstrCustomFilter;
+ DWORD nMaxCustFilter;
+ DWORD nFilterIndex;
+ LPWSTR lpstrFile;
+ DWORD nMaxFile;
+ LPWSTR lpstrFileTitle;
+ DWORD nMaxFileTitle;
+ LPCWSTR lpstrInitialDir;
+ LPCWSTR lpstrTitle;
+ DWORD Flags;
+ WORD nFileOffset;
+ WORD nFileExtension;
+ LPCWSTR lpstrDefExt;
+ DWORD lCustData;
+ LPOFNHOOKPROC lpfnHook;
+ LPCWSTR lpTemplateName;
+} OPENFILENAMEW,*LPOPENFILENAMEW;
+typedef struct _OFNOTIFYA {
+ NMHDR hdr;
+ LPOPENFILENAMEA lpOFN;
+ LPSTR pszFile;
+} OFNOTIFYA,*LPOFNOTIFYA;
+typedef struct _OFNOTIFYW {
+ NMHDR hdr;
+ LPOPENFILENAMEW lpOFN;
+ LPWSTR pszFile;
+} OFNOTIFYW,*LPOFNOTIFYW;
+typedef struct tagPSDA {
+ DWORD lStructSize;
+ HWND hwndOwner;
+ HGLOBAL hDevMode;
+ HGLOBAL hDevNames;
+ DWORD Flags;
+ POINT ptPaperSize;
+ RECT rtMinMargin;
+ RECT rtMargin;
+ HINSTANCE hInstance;
+ LPARAM lCustData;
+ LPPAGESETUPHOOK lpfnPageSetupHook;
+ LPPAGEPAINTHOOK lpfnPagePaintHook;
+ LPCSTR lpPageSetupTemplateName;
+ HGLOBAL hPageSetupTemplate;
+} PAGESETUPDLGA,*LPPAGESETUPDLGA;
+typedef struct tagPSDW {
+ DWORD lStructSize;
+ HWND hwndOwner;
+ HGLOBAL hDevMode;
+ HGLOBAL hDevNames;
+ DWORD Flags;
+ POINT ptPaperSize;
+ RECT rtMinMargin;
+ RECT rtMargin;
+ HINSTANCE hInstance;
+ LPARAM lCustData;
+ LPPAGESETUPHOOK lpfnPageSetupHook;
+ LPPAGEPAINTHOOK lpfnPagePaintHook;
+ LPCWSTR lpPageSetupTemplateName;
+ HGLOBAL hPageSetupTemplate;
+} PAGESETUPDLGW,*LPPAGESETUPDLGW;
+typedef struct tagPDA {
+ DWORD lStructSize;
+ HWND hwndOwner;
+ HANDLE hDevMode;
+ HANDLE hDevNames;
+ HDC hDC;
+ DWORD Flags;
+ WORD nFromPage;
+ WORD nToPage;
+ WORD nMinPage;
+ WORD nMaxPage;
+ WORD nCopies;
+ HINSTANCE hInstance;
+ DWORD lCustData;
+ LPPRINTHOOKPROC lpfnPrintHook;
+ LPSETUPHOOKPROC lpfnSetupHook;
+ LPCSTR lpPrintTemplateName;
+ LPCSTR lpSetupTemplateName;
+ HANDLE hPrintTemplate;
+ HANDLE hSetupTemplate;
+} PRINTDLGA,*LPPRINTDLGA;
+typedef struct tagPDW {
+ DWORD lStructSize;
+ HWND hwndOwner;
+ HANDLE hDevMode;
+ HANDLE hDevNames;
+ HDC hDC;
+ DWORD Flags;
+ WORD nFromPage;
+ WORD nToPage;
+ WORD nMinPage;
+ WORD nMaxPage;
+ WORD nCopies;
+ HINSTANCE hInstance;
+ DWORD lCustData;
+ LPPRINTHOOKPROC lpfnPrintHook;
+ LPSETUPHOOKPROC lpfnSetupHook;
+ LPCWSTR lpPrintTemplateName;
+ LPCWSTR lpSetupTemplateName;
+ HANDLE hPrintTemplate;
+ HANDLE hSetupTemplate;
+} PRINTDLGW,*LPPRINTDLGW;
+
+BOOL WINAPI ChooseColorA(LPCHOOSECOLORA);
+BOOL WINAPI ChooseColorW(LPCHOOSECOLORW);
+BOOL WINAPI ChooseFontA(LPCHOOSEFONTA);
+BOOL WINAPI ChooseFontW(LPCHOOSEFONTW);
+DWORD WINAPI CommDlgExtendedError(void);
+HWND WINAPI FindTextA(LPFINDREPLACEA);
+HWND WINAPI FindTextW(LPFINDREPLACEW);
+short WINAPI GetFileTitleA(LPCSTR,LPSTR,WORD);
+short WINAPI GetFileTitleW(LPCWSTR,LPWSTR,WORD);
+BOOL WINAPI GetOpenFileNameA(LPOPENFILENAMEA);
+BOOL WINAPI GetOpenFileNameW(LPOPENFILENAMEW);
+BOOL WINAPI GetSaveFileNameA(LPOPENFILENAMEA);
+BOOL WINAPI GetSaveFileNameW(LPOPENFILENAMEW);
+BOOL WINAPI PageSetupDlgA(LPPAGESETUPDLGA);
+BOOL WINAPI PageSetupDlgW(LPPAGESETUPDLGW);
+BOOL WINAPI PrintDlgA(LPPRINTDLGA);
+BOOL WINAPI PrintDlgW(LPPRINTDLGW);
+HWND WINAPI ReplaceTextA(LPFINDREPLACEA);
+HWND WINAPI ReplaceTextW(LPFINDREPLACEW);
+
+#ifdef UNICODE
+#define LBSELCHSTRING LBSELCHSTRINGW
+#define SHAREVISTRING SHAREVISTRINGW
+#define FILEOKSTRING FILEOKSTRINGW
+#define COLOROKSTRING COLOROKSTRINGW
+#define SETRGBSTRING SETRGBSTRINGW
+#define HELPMSGSTRING HELPMSGSTRINGW
+#define FINDMSGSTRING FINDMSGSTRINGW
+typedef CHOOSECOLORW CHOOSECOLOR,*LPCHOOSECOLOR;
+typedef CHOOSEFONTW CHOOSEFONT,*LPCHOOSEFONT;
+typedef FINDREPLACEW FINDREPLACE,*LPFINDREPLACE;
+typedef OPENFILENAMEW OPENFILENAME,*LPOPENFILENAME;
+typedef OFNOTIFYW OFNOTIFY,*LPOFNOTIFY;
+typedef PAGESETUPDLGW PAGESETUPDLG,*LPPAGESETUPDLG;
+typedef PRINTDLGW PRINTDLG,*LPPRINTDLG;
+#define ChooseColor ChooseColorW
+#define ChooseFont ChooseFontW
+#define FindText FindTextW
+#define GetFileTitle GetFileTitleW
+#define GetOpenFileName GetOpenFileNameW
+#define GetSaveFileName GetSaveFileNameW
+#define PageSetupDlg PageSetupDlgW
+#define PrintDlg PrintDlgW
+#define ReplaceText ReplaceTextW
+#else
+#define LBSELCHSTRING LBSELCHSTRINGA
+#define SHAREVISTRING SHAREVISTRINGA
+#define FILEOKSTRING FILEOKSTRINGA
+#define COLOROKSTRING COLOROKSTRINGA
+#define SETRGBSTRING SETRGBSTRINGA
+#define HELPMSGSTRING HELPMSGSTRINGA
+#define FINDMSGSTRING FINDMSGSTRINGA
+typedef CHOOSECOLORA CHOOSECOLOR,*LPCHOOSECOLOR;
+typedef CHOOSEFONTA CHOOSEFONT,*LPCHOOSEFONT;
+typedef FINDREPLACEA FINDREPLACE,*LPFINDREPLACE;
+typedef OPENFILENAMEA OPENFILENAME,*LPOPENFILENAME;
+typedef OFNOTIFYA OFNOTIFY,*LPOFNOTIFY;
+typedef PAGESETUPDLGA PAGESETUPDLG,*LPPAGESETUPDLG;
+typedef PRINTDLGA PRINTDLG,*LPPRINTDLG;
+#define ChooseColor ChooseColorA
+#define ChooseFont ChooseFontA
+#define FindText FindTextA
+#define GetFileTitle GetFileTitleA
+#define GetOpenFileName GetOpenFileNameA
+#define GetSaveFileName GetSaveFileNameA
+#define PageSetupDlg PageSetupDlgA
+#define PrintDlg PrintDlgA
+#define ReplaceText ReplaceTextA
+#endif
+#pragma pack(pop)
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/winsup/w32api/include/cpl.h b/winsup/w32api/include/cpl.h
new file mode 100644
index 000000000..f5ce29d00
--- /dev/null
+++ b/winsup/w32api/include/cpl.h
@@ -0,0 +1,54 @@
+#ifndef _CPL_H
+#define _CPL_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+#define WM_CPL_LAUNCH (WM_USER+1000)
+#define WM_CPL_LAUNCHED (WM_USER+1001)
+#define CPL_DYNAMIC_RES 0
+#define CPL_INIT 1
+#define CPL_GETCOUNT 2
+#define CPL_INQUIRE 3
+#define CPL_SELECT 4
+#define CPL_DBLCLK 5
+#define CPL_STOP 6
+#define CPL_EXIT 7
+#define CPL_NEWINQUIRE 8
+#define CPL_STARTWPARMS 9
+#define CPL_SETUP 200
+typedef LONG(APIENTRY *APPLET_PROC)(HWND,UINT,LONG,LONG);
+typedef struct tagCPLINFO {
+ int idIcon;
+ int idName;
+ int idInfo;
+ LONG lData;
+} CPLINFO,*LPCPLINFO;
+typedef struct tagNEWCPLINFOA {
+ DWORD dwSize;
+ DWORD dwFlags;
+ DWORD dwHelpContext;
+ LONG lData;
+ HICON hIcon;
+ CHAR szName[32];
+ CHAR szInfo[64];
+ CHAR szHelpFile[128];
+} NEWCPLINFOA,*LPNEWCPLINFOA;
+typedef struct tagNEWCPLINFOW {
+ DWORD dwSize;
+ DWORD dwFlags;
+ DWORD dwHelpContext;
+ LONG lData;
+ HICON hIcon;
+ WCHAR szName[32];
+ WCHAR szInfo[64];
+ WCHAR szHelpFile[128];
+} NEWCPLINFOW,*LPNEWCPLINFOW;
+#ifdef UNICODE
+typedef NEWCPLINFOW NEWCPLINFO,*LPNEWCPLINFO;
+#else
+typedef NEWCPLINFOA NEWCPLINFO,*LPNEWCPLINFO;
+#endif
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/winsup/w32api/include/cplext.h b/winsup/w32api/include/cplext.h
new file mode 100644
index 000000000..8c2207d16
--- /dev/null
+++ b/winsup/w32api/include/cplext.h
@@ -0,0 +1,6 @@
+#ifndef _CPLEXT_H
+#define _CPLEXT_H
+#define CPLPAGE_MOUSE_BUTTONS 1
+#define CPLPAGE_MOUSE_PTRMOTION 2
+#define CPLPAGE_KEYBOARD_SPEED 1
+#endif
diff --git a/winsup/w32api/include/custcntl.h b/winsup/w32api/include/custcntl.h
new file mode 100644
index 000000000..8c3d463ab
--- /dev/null
+++ b/winsup/w32api/include/custcntl.h
@@ -0,0 +1,98 @@
+#ifndef _CUSTCNTL_H
+#define _CUSTCNTL_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define CCF_NOTEXT 1
+#define CCHCCCLASS 32
+#define CCHCCDESC 32
+#define CCHCCTEXT 256
+
+typedef struct tagCCSTYLEA {
+ DWORD flStyle;
+ DWORD flExtStyle;
+ CHAR szText[CCHCCTEXT];
+ LANGID lgid;
+ WORD wReserved1;
+} CCSTYLEA,*LPCCSTYLEA;
+typedef struct tagCCSTYLEW {
+ DWORD flStyle;
+ DWORD flExtStyle;
+ WCHAR szText[CCHCCTEXT];
+ LANGID lgid;
+ WORD wReserved1;
+} CCSTYLEW,*LPCCSTYLEW;
+typedef struct tagCCSTYLEFLAGA {
+ DWORD flStyle;
+ DWORD flStyleMask;
+ LPSTR pszStyle;
+} CCSTYLEFLAGA,*LPCCSTYLEFLAGA;
+typedef struct tagCCSTYLEFLAGW {
+ DWORD flStyle;
+ DWORD flStyleMask;
+ LPWSTR pszStyle;
+} CCSTYLEFLAGW,*LPCCSTYLEFLAGW;
+typedef BOOL(CALLBACK* LPFNCCSTYLEA)(HWND,LPCCSTYLEA);
+typedef INT(CALLBACK* LPFNCCSIZETOTEXTA)(DWORD,DWORD,HFONT,LPSTR);
+typedef struct tagCCINFOA {
+ CHAR szClass[CCHCCCLASS];
+ DWORD flOptions;
+ CHAR szDesc[CCHCCDESC];
+ UINT cxDefault;
+ UINT cyDefault;
+ DWORD flStyleDefault;
+ DWORD flExtStyleDefault;
+ DWORD flCtrlTypeMask;
+ CHAR szTextDefault[CCHCCTEXT];
+ INT cStyleFlags;
+ LPCCSTYLEFLAGA aStyleFlags;
+ LPFNCCSTYLEA lpfnStyle;
+ LPFNCCSIZETOTEXTA lpfnSizeToText;
+ DWORD dwReserved1;
+ DWORD dwReserved2;
+} CCINFOA,*LPCCINFOA;
+typedef UINT(CALLBACK* LPFNCCINFOA)(LPCCINFOA);
+typedef BOOL(CALLBACK* LPFNCCSTYLEW)(HWND,LPCCSTYLEW);
+typedef INT (CALLBACK* LPFNCCSIZETOTEXTW)(DWORD,DWORD,HFONT,LPWSTR);
+typedef struct tagCCINFOW {
+ WCHAR szClass[CCHCCCLASS];
+ DWORD flOptions;
+ WCHAR szDesc[CCHCCDESC];
+ UINT cxDefault;
+ UINT cyDefault;
+ DWORD flStyleDefault;
+ DWORD flExtStyleDefault;
+ DWORD flCtrlTypeMask;
+ WCHAR szTextDefault[CCHCCTEXT];
+ INT cStyleFlags;
+ LPCCSTYLEFLAGW aStyleFlags;
+ LPFNCCSTYLEW lpfnStyle;
+ LPFNCCSIZETOTEXTW lpfnSizeToText;
+ DWORD dwReserved1;
+ DWORD dwReserved2;
+} CCINFOW,*LPCCINFOW;
+typedef UINT(CALLBACK* LPFNCCINFOW)(LPCCINFOW);
+
+UINT CALLBACK CustomControlInfoA(LPCCINFOA acci);
+UINT CALLBACK CustomControlInfoW(LPCCINFOW acci);
+
+#ifdef UNICODE
+typedef CCSTYLEW CCSTYLE,*LPCCSTYLE;
+typedef CCSTYLEFLAGW CCSTYLEFLAG,*LPCCSTYLEFLAG;
+typedef CCINFOW CCINFO,*LPCCINFO;
+#define LPFNCCSTYLE LPFNCCSTYLEW
+#define LPFNCCSIZETOTEXT LPFNCCSIZETOTEXTW
+#define LPFNCCINFO LPFNCCINFOW
+#else
+typedef CCSTYLEA CCSTYLE,*LPCCSTYLE;
+typedef CCSTYLEFLAGA CCSTYLEFLAG,*LPCCSTYLEFLAG;
+typedef CCINFOA CCINFO,*LPCCINFO;
+#define LPFNCCSTYLE LPFNCCSTYLEA
+#define LPFNCCSIZETOTEXT LPFNCCSIZETOTEXTA
+#define LPFNCCINFO LPFNCCINFOA
+#endif
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/winsup/w32api/include/dbt.h b/winsup/w32api/include/dbt.h
new file mode 100644
index 000000000..071b0077b
--- /dev/null
+++ b/winsup/w32api/include/dbt.h
@@ -0,0 +1,86 @@
+#ifndef _DBT_H
+#define _DBT_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+#define DBT_NO_DISK_SPACE 0x47
+#define DBT_CONFIGMGPRIVATE 0x7FFF
+#define DBT_DEVICEARRIVAL 0x8000
+#define DBT_DEVICEQUERYREMOVE 0x8001
+#define DBT_DEVICEQUERYREMOVEFAILED 0x8002
+#define DBT_DEVICEREMOVEPENDING 0x8003
+#define DBT_DEVICEREMOVECOMPLETE 0x8004
+#define DBT_DEVICETYPESPECIFIC 0x8005
+#define DBT_DEVTYP_OEM 0
+#define DBT_DEVTYP_DEVNODE 1
+#define DBT_DEVTYP_VOLUME 2
+#define DBT_DEVTYP_PORT 3
+#define DBT_DEVTYP_NET 4
+#define DBT_APPYBEGIN 0
+#define DBT_APPYEND 1
+#define DBT_DEVNODES_CHANGED 7
+#define DBT_QUERYCHANGECONFIG 0x17
+#define DBT_CONFIGCHANGED 0x18
+#define DBT_CONFIGCHANGECANCELED 0x19
+#define DBT_MONITORCHANGE 0x1B
+#define DBT_SHELLLOGGEDON 32
+#define DBT_CONFIGMGAPI32 34
+#define DBT_VXDINITCOMPLETE 35
+#define DBT_VOLLOCKQUERYLOCK 0x8041
+#define DBT_VOLLOCKLOCKTAKEN 0x8042
+#define DBT_VOLLOCKLOCKFAILED 0x8043
+#define DBT_VOLLOCKQUERYUNLOCK 0x8044
+#define DBT_VOLLOCKLOCKRELEASED 0x8045
+#define DBT_VOLLOCKUNLOCKFAILED 0x8046
+#define DBT_USERDEFINED 0xFFFF
+#define DBTF_MEDIA 1
+#define DBTF_NET 2
+#define BSM_ALLCOMPONENTS 0
+#define BSM_VXDS 1
+#define BSM_NETDRIVER 2
+#define BSM_INSTALLABLEDRIVERS 4
+#define BSM_APPLICATIONS 8
+#define BSF_QUERY 1
+#define BSF_IGNORECURRENTTASK 2
+#define BSF_FLUSHDISK 4
+#define BSF_NOHANG 8
+#define BSF_POSTMESSAGE 16
+#define BSF_FORCEIFHUNG 32
+#define BSF_NOTIMEOUTIFNOTHUNG 64
+#define BSF_MSGSRV32ISOK_BIT 31
+#define BSF_MSGSRV32ISOK 0x80000000
+
+typedef struct _DEV_BROADCAST_HDR {
+ DWORD dbch_size;
+ DWORD dbch_devicetype;
+ DWORD dbch_reserved;
+} DEV_BROADCAST_HDR,*PDEV_BROADCAST_HDR;
+typedef struct _DEV_BROADCAST_OEM {
+ DWORD dbco_size;
+ DWORD dbco_devicetype;
+ DWORD dbco_reserved;
+ DWORD dbco_identifier;
+ DWORD dbco_suppfunc;
+} DEV_BROADCAST_OEM,*PDEV_BROADCAST_OEM;
+typedef struct _DEV_BROADCAST_PORT {
+ DWORD dbcp_size;
+ DWORD dbcp_devicetype;
+ DWORD dbcp_reserved;
+ char dbcp_name[1];
+} DEV_BROADCAST_PORT,*PDEV_BROADCAST_PORT;
+typedef struct _DEV_BROADCAST_USERDEFINED {
+ struct _DEV_BROADCAST_HDR dbud_dbh;
+ char dbud_szName[1];
+} DEV_BROADCAST_USERDEFINED;
+typedef struct _DEV_BROADCAST_VOLUME {
+ DWORD dbcv_size;
+ DWORD dbcv_devicetype;
+ DWORD dbcv_reserved;
+ DWORD dbcv_unitmask;
+ WORD dbcv_flags;
+} DEV_BROADCAST_VOLUME,*PDEV_BROADCAST_VOLUME;
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/winsup/w32api/include/dde.h b/winsup/w32api/include/dde.h
new file mode 100644
index 000000000..474f12691
--- /dev/null
+++ b/winsup/w32api/include/dde.h
@@ -0,0 +1,60 @@
+#ifndef _DDE_H
+#define _DDE_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+#define WM_DDE_FIRST 0x03E0
+#define WM_DDE_INITIATE (WM_DDE_FIRST)
+#define WM_DDE_TERMINATE (WM_DDE_FIRST+1)
+#define WM_DDE_ADVISE (WM_DDE_FIRST+2)
+#define WM_DDE_UNADVISE (WM_DDE_FIRST+3)
+#define WM_DDE_ACK (WM_DDE_FIRST+4)
+#define WM_DDE_DATA (WM_DDE_FIRST+5)
+#define WM_DDE_REQUEST (WM_DDE_FIRST+6)
+#define WM_DDE_POKE (WM_DDE_FIRST+7)
+#define WM_DDE_EXECUTE (WM_DDE_FIRST+8)
+#define WM_DDE_LAST (WM_DDE_FIRST+8)
+
+#ifndef RC_INVOKED
+typedef struct {
+ unsigned short bAppReturnCode:8,reserved:6,fBusy:1,fAck:1;
+} DDEACK;
+typedef struct {
+ unsigned short reserved:14,fDeferUpd:1,fAckReq:1;
+ short cfFormat;
+} DDEADVISE;
+typedef struct {
+ unsigned short unused:12,fResponse:1,fRelease:1,reserved:1,fAckReq:1;
+ short cfFormat;
+ BYTE Value[1];
+} DDEDATA;
+typedef struct {
+ unsigned short unused:13,fRelease:1,fReserved:2;
+ short cfFormat;
+ BYTE Value[1];
+} DDEPOKE;
+typedef struct {
+ unsigned short unused:13,
+ fRelease:1,
+ fDeferUpd:1,
+ fAckReq:1;
+ short cfFormat;
+} DDELN;
+
+typedef struct {
+ unsigned short unused:12,fAck:1,fRelease:1,fReserved:1,fAckReq:1;
+ short cfFormat;
+ BYTE rgb[1];
+} DDEUP;
+BOOL WINAPI DdeSetQualityOfService(HWND,const SECURITY_QUALITY_OF_SERVICE*,PSECURITY_QUALITY_OF_SERVICE);
+BOOL WINAPI ImpersonateDdeClientWindow(HWND,HWND);
+LONG WINAPI PackDDElParam(UINT,UINT,UINT);
+BOOL WINAPI UnpackDDElParam(UINT,LONG,PUINT,PUINT);
+BOOL WINAPI FreeDDElParam(UINT,LONG);
+LONG WINAPI ReuseDDElParam(LONG,UINT,UINT,UINT,UINT);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/winsup/w32api/include/ddeml.h b/winsup/w32api/include/ddeml.h
new file mode 100644
index 000000000..352783e34
--- /dev/null
+++ b/winsup/w32api/include/ddeml.h
@@ -0,0 +1,241 @@
+#ifndef _DDEML_H
+#define _DDEML_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define EXPENTRY CALLBACK
+#define CP_WINANSI 1004
+#define CP_WINUNICODE 1200
+#define XTYPF_NOBLOCK 2
+#define XTYPF_NODATA 4
+#define XTYPF_ACKREQ 8
+#define XCLASS_MASK 0xFC00
+#define XCLASS_BOOL 0x1000
+#define XCLASS_DATA 0x2000
+#define XCLASS_FLAGS 0x4000
+#define XCLASS_NOTIFICATION 0x8000
+#define XST_NULL 0
+#define XST_INCOMPLETE 1
+#define XST_CONNECTED 2
+#define XST_INIT1 3
+#define XST_INIT2 4
+#define XST_REQSENT 5
+#define XST_DATARCVD 6
+#define XST_POKESENT 7
+#define XST_POKEACKRCVD 8
+#define XST_EXECSENT 9
+#define XST_EXECACKRCVD 10
+#define XST_ADVSENT 11
+#define XST_UNADVSENT 12
+#define XST_ADVACKRCVD 13
+#define XST_UNADVACKRCVD 14
+#define XST_ADVDATASENT 15
+#define XST_ADVDATAACKRCVD 16
+#define XTYP_ERROR (XCLASS_NOTIFICATION|XTYPF_NOBLOCK)
+#define XTYP_ADVDATA (16|XCLASS_FLAGS)
+#define XTYP_ADVREQ (32|XCLASS_DATA|XTYPF_NOBLOCK)
+#define XTYP_ADVSTART (0x30|XCLASS_BOOL)
+#define XTYP_ADVSTOP (0x0040|XCLASS_NOTIFICATION)
+#define XTYP_EXECUTE (0x0050|XCLASS_FLAGS)
+#define XTYP_CONNECT (0x0060|XCLASS_BOOL|XTYPF_NOBLOCK)
+#define XTYP_CONNECT_CONFIRM (0x0070|XCLASS_NOTIFICATION|XTYPF_NOBLOCK)
+#define XTYP_XACT_COMPLETE (0x0080|XCLASS_NOTIFICATION)
+#define XTYP_POKE (0x0090|XCLASS_FLAGS)
+#define XTYP_REGISTER (0x00A0|XCLASS_NOTIFICATION|XTYPF_NOBLOCK)
+#define XTYP_REQUEST (0x00B0|XCLASS_DATA)
+#define XTYP_DISCONNECT (0x00C0|XCLASS_NOTIFICATION|XTYPF_NOBLOCK)
+#define XTYP_UNREGISTER (0x00D0|XCLASS_NOTIFICATION|XTYPF_NOBLOCK)
+#define XTYP_WILDCONNECT (0x00E0|XCLASS_DATA|XTYPF_NOBLOCK)
+#define XTYP_MASK 0xF0
+#define XTYP_SHIFT 4
+#define TIMEOUT_ASYNC 0xFFFFFFFF
+#define QID_SYNC 0xFFFFFFFF
+#define ST_CONNECTED 1
+#define ST_ADVISE 2
+#define ST_ISLOCAL 4
+#define ST_BLOCKED 8
+#define ST_CLIENT 16
+#define ST_TERMINATED 32
+#define ST_INLIST 64
+#define ST_BLOCKNEXT 128
+#define ST_ISSELF 256
+#define CADV_LATEACK 0xFFFF
+#define DMLERR_NO_ERROR 0
+#define DMLERR_FIRST 0x4000
+#define DMLERR_ADVACKTIMEOUT 0x4000
+#define DMLERR_BUSY 0x4001
+#define DMLERR_DATAACKTIMEOUT 0x4002
+#define DMLERR_DLL_NOT_INITIALIZED 0x4003
+#define DMLERR_DLL_USAGE 0x4004
+#define DMLERR_EXECACKTIMEOUT 0x4005
+#define DMLERR_INVALIDPARAMETER 0x4006
+#define DMLERR_LOW_MEMORY 0x4007
+#define DMLERR_MEMORY_ERROR 0x4008
+#define DMLERR_NOTPROCESSED 0x4009
+#define DMLERR_NO_CONV_ESTABLISHED 0x400a
+#define DMLERR_POKEACKTIMEOUT 0x400b
+#define DMLERR_POSTMSG_FAILED 0x400c
+#define DMLERR_REENTRANCY 0x400d
+#define DMLERR_SERVER_DIED 0x400e
+#define DMLERR_SYS_ERROR 0x400f
+#define DMLERR_UNADVACKTIMEOUT 0x4010
+#define DMLERR_UNFOUND_QUEUE_ID 0x4011
+#define DMLERR_LAST 0x4011
+#define DDE_FACK 0x8000
+#define DDE_FBUSY 0x4000
+#define DDE_FDEFERUPD 0x4000
+#define DDE_FACKREQ 0x8000
+#define DDE_FRELEASE 0x2000
+#define DDE_FREQUESTED 0x1000
+#define DDE_FAPPSTATUS 0x00ff
+#define DDE_FNOTPROCESSED 0
+#define DDE_FACKRESERVED (~(DDE_FACK|DDE_FBUSY|DDE_FAPPSTATUS))
+#define DDE_FADVRESERVED (~(DDE_FACKREQ|DDE_FDEFERUPD))
+#define DDE_FDATRESERVED (~(DDE_FACKREQ|DDE_FRELEASE|DDE_FREQUESTED))
+#define DDE_FPOKRESERVED (~DDE_FRELEASE)
+#define MSGF_DDEMGR 0x8001
+#define CBR_BLOCK ((HDDEDATA)0xffffffff)
+#define CBF_FAIL_SELFCONNECTIONS 0x1000
+#define CBF_FAIL_CONNECTIONS 0x2000
+#define CBF_FAIL_ADVISES 0x4000
+#define CBF_FAIL_EXECUTES 0x8000
+#define CBF_FAIL_POKES 0x10000
+#define CBF_FAIL_REQUESTS 0x20000
+#define CBF_FAIL_ALLSVRXACTIONS 0x3f000
+#define CBF_SKIP_CONNECT_CONFIRMS 0x40000
+#define CBF_SKIP_REGISTRATIONS 0x80000
+#define CBF_SKIP_UNREGISTRATIONS 0x100000
+#define CBF_SKIP_DISCONNECTS 0x200000
+#define CBF_SKIP_ALLNOTIFICATIONS 0x3c0000
+#define APPCMD_CLIENTONLY 0x10L
+#define APPCMD_FILTERINITS 0x20L
+#define APPCMD_MASK 0xFF0L
+#define APPCLASS_STANDARD 0
+#define APPCLASS_MASK 0xFL
+#define EC_ENABLEALL 0
+#define EC_ENABLEONE ST_BLOCKNEXT
+#define EC_DISABLE ST_BLOCKED
+#define EC_QUERYWAITING 2
+#define DNS_REGISTER 1
+#define DNS_UNREGISTER 2
+#define DNS_FILTERON 4
+#define DNS_FILTEROFF 8
+#define HDATA_APPOWNED 1
+#define MAX_MONITORS 4
+#define APPCLASS_MONITOR 1L
+#define XTYP_MONITOR (XCLASS_NOTIFICATION|XTYPF_NOBLOCK|0xF0)
+#define MF_HSZ_INFO 0x1000000
+#define MF_SENDMSGS 0x2000000
+#define MF_POSTMSGS 0x4000000
+#define MF_CALLBACKS 0x8000000
+#define MF_ERRORS 0x10000000
+#define MF_LINKS 0x20000000
+#define MF_CONV 0x40000000
+#define MF_MASK 0xFF000000
+
+DECLARE_HANDLE(HCONVLIST);
+DECLARE_HANDLE(HCONV);
+DECLARE_HANDLE(HSZ);
+DECLARE_HANDLE(HDDEDATA);
+typedef HDDEDATA CALLBACK FNCALLBACK(UINT,UINT,HCONV,HSZ,HSZ,HDDEDATA,DWORD,DWORD);
+typedef HDDEDATA(CALLBACK *PFNCALLBACK)(UINT,UINT,HCONV,HSZ,HSZ,HDDEDATA,DWORD,DWORD);
+typedef struct tagHSZPAIR {
+ HSZ hszSvc;
+ HSZ hszTopic;
+} HSZPAIR, *PHSZPAIR;
+typedef struct tagCONVCONTEXT {
+ UINT cb;
+ UINT wFlags;
+ UINT wCountryID;
+ int iCodePage;
+ DWORD dwLangID;
+ DWORD dwSecurity;
+ SECURITY_QUALITY_OF_SERVICE qos;
+} CONVCONTEXT,*PCONVCONTEXT;
+typedef struct tagCONVINFO {
+ DWORD cb;
+ DWORD hUser;
+ HCONV hConvPartner;
+ HSZ hszSvcPartner;
+ HSZ hszServiceReq;
+ HSZ hszTopic;
+ HSZ hszItem;
+ UINT wFmt;
+ UINT wType;
+ UINT wStatus;
+ UINT wConvst;
+ UINT wLastError;
+ HCONVLIST hConvList;
+ CONVCONTEXT ConvCtxt;
+ HWND hwnd;
+ HWND hwndPartner;
+} CONVINFO,*PCONVINFO;
+typedef struct tagDDEML_MSG_HOOK_DATA {
+ UINT uiLo;
+ UINT uiHi;
+ DWORD cbData;
+ DWORD Data[8];
+} DDEML_MSG_HOOK_DATA;
+
+BOOL WINAPI DdeAbandonTransaction(DWORD,HCONV,DWORD);
+PBYTE WINAPI DdeAccessData(HDDEDATA,PDWORD);
+HDDEDATA WINAPI DdeAddData(HDDEDATA,PBYTE,DWORD,DWORD);
+HDDEDATA WINAPI DdeClientTransaction(PBYTE,DWORD,HCONV,HSZ,UINT,UINT,DWORD,PDWORD);
+int WINAPI DdeCmpStringHandles(HSZ,HSZ);
+HCONV WINAPI DdeConnect(DWORD,HSZ,HSZ,PCONVCONTEXT);
+HCONVLIST WINAPI DdeConnectList(DWORD,HSZ,HSZ,HCONVLIST,PCONVCONTEXT);
+HDDEDATA WINAPI DdeCreateDataHandle(DWORD,PBYTE,DWORD,DWORD,HSZ,UINT,UINT);
+HSZ WINAPI DdeCreateStringHandleA(DWORD,LPSTR,int);
+HSZ WINAPI DdeCreateStringHandleW(DWORD,LPWSTR,int);
+BOOL WINAPI DdeDisconnect(HCONV);
+BOOL WINAPI DdeDisconnectList(HCONVLIST);
+BOOL WINAPI DdeEnableCallback(DWORD,HCONV,UINT);
+BOOL WINAPI DdeFreeDataHandle(HDDEDATA);
+BOOL WINAPI DdeFreeStringHandle(DWORD,HSZ);
+DWORD WINAPI DdeGetData(HDDEDATA,PBYTE,DWORD,DWORD);
+UINT WINAPI DdeGetLastError(DWORD);
+BOOL WINAPI DdeImpersonateClient(HCONV);
+UINT WINAPI DdeInitializeA(PDWORD,PFNCALLBACK,DWORD,DWORD);
+UINT WINAPI DdeInitializeW(PDWORD,PFNCALLBACK,DWORD,DWORD);
+BOOL WINAPI DdeKeepStringHandle(DWORD,HSZ);
+HDDEDATA WINAPI DdeNameService(DWORD,HSZ,HSZ,UINT);
+BOOL WINAPI DdePostAdvise(DWORD,HSZ,HSZ);
+UINT WINAPI DdeQueryConvInfo(HCONV,DWORD,PCONVINFO);
+HCONV WINAPI DdeQueryNextServer(HCONVLIST,HCONV);
+DWORD WINAPI DdeQueryStringA(DWORD,HSZ,LPSTR,DWORD,int);
+DWORD WINAPI DdeQueryStringW(DWORD,HSZ,LPWSTR,DWORD,int);
+HCONV WINAPI DdeReconnect(HCONV);
+BOOL WINAPI DdeSetUserHandle(HCONV,DWORD,DWORD);
+BOOL WINAPI DdeUnaccessData(HDDEDATA);
+BOOL WINAPI DdeUninitialize(DWORD);
+
+#ifdef UNICODE
+#define SZDDESYS_TOPIC L"System"
+#define SZDDESYS_ITEM_TOPICS L"Topics"
+#define SZDDESYS_ITEM_SYSITEMS L"SysItems"
+#define SZDDESYS_ITEM_RTNMSG L"ReturnMessage"
+#define SZDDESYS_ITEM_STATUS L"Status"
+#define SZDDESYS_ITEM_FORMATS L"Formats"
+#define SZDDESYS_ITEM_HELP L"Help"
+#define SZDDE_ITEM_ITEMLIST L"TopicItemList"
+#define DdeCreateStringHandle DdeCreateStringHandleW
+#define DdeInitialize DdeInitializeW
+#define DdeQueryString DdeQueryStringW
+#else
+#define SZDDESYS_TOPIC "System"
+#define SZDDESYS_ITEM_TOPICS "Topics"
+#define SZDDESYS_ITEM_SYSITEMS "SysItems"
+#define SZDDESYS_ITEM_RTNMSG "ReturnMessage"
+#define SZDDESYS_ITEM_STATUS "Status"
+#define SZDDESYS_ITEM_FORMATS "Formats"
+#define SZDDESYS_ITEM_HELP "Help"
+#define SZDDE_ITEM_ITEMLIST "TopicItemList"
+#define DdeCreateStringHandle DdeCreateStringHandleA
+#define DdeInitialize DdeInitializeA
+#define DdeQueryString DdeQueryStringA
+#endif
+#ifdef __cplusplus
+}
+#endif
+#endif /* _DDEML_H */
diff --git a/winsup/w32api/include/dlgs.h b/winsup/w32api/include/dlgs.h
new file mode 100644
index 000000000..d26e19156
--- /dev/null
+++ b/winsup/w32api/include/dlgs.h
@@ -0,0 +1,182 @@
+#ifndef _DLGS_H
+#define _DLGS_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+#define FILEOPENORD 1536
+#define MULTIFILEOPENORD 1537
+#define PRINTDLGORD 1538
+#define PRNSETUPDLGORD 1539
+#define FINDDLGORD 1540
+#define REPLACEDLGORD 1541
+#define FONTDLGORD 1542
+#define FORMATDLGORD31 1543
+#define FORMATDLGORD30 1544
+#define PAGESETUPDLGORD 1546
+#define ctlFirst 0x400
+#define ctlLast 0x4ff
+#define chx1 0x410
+#define chx2 0x411
+#define chx3 0x412
+#define chx4 0x413
+#define chx5 0x414
+#define chx6 0x415
+#define chx7 0x416
+#define chx8 0x417
+#define chx9 0x418
+#define chx10 0x419
+#define chx11 0x41a
+#define chx12 0x41b
+#define chx13 0x41c
+#define chx14 0x41d
+#define chx15 0x41e
+#define chx16 0x41f
+#define cmb1 0x470
+#define cmb2 0x471
+#define cmb3 0x472
+#define cmb4 0x473
+#define cmb5 0x474
+#define cmb6 0x475
+#define cmb7 0x476
+#define cmb8 0x477
+#define cmb9 0x478
+#define cmb10 0x479
+#define cmb11 0x47a
+#define cmb12 0x47b
+#define cmb13 0x47c
+#define cmb14 0x47d
+#define cmb15 0x47e
+#define cmb16 0x47f
+#define edt1 0x480
+#define edt2 0x481
+#define edt3 0x482
+#define edt4 0x483
+#define edt5 0x484
+#define edt6 0x485
+#define edt7 0x486
+#define edt8 0x487
+#define edt9 0x488
+#define edt10 0x489
+#define edt11 0x48a
+#define edt12 0x48b
+#define edt13 0x48c
+#define edt14 0x48d
+#define edt15 0x48e
+#define edt16 0x48f
+#define frm1 0x434
+#define frm2 0x435
+#define frm3 0x436
+#define frm4 0x437
+#define grp1 0x430
+#define grp2 0x431
+#define grp3 0x432
+#define grp4 0x433
+#define ico1 0x43c
+#define ico2 0x43d
+#define ico3 0x43e
+#define ico4 0x43f
+#define lst1 0x460
+#define lst2 0x461
+#define lst3 0x462
+#define lst4 0x463
+#define lst5 0x464
+#define lst6 0x465
+#define lst7 0x466
+#define lst8 0x467
+#define lst9 0x468
+#define lst10 0x469
+#define lst11 0x46a
+#define lst12 0x46b
+#define lst13 0x46c
+#define lst14 0x46d
+#define lst15 0x46e
+#define lst16 0x46f
+#define psh1 0x400
+#define psh2 0x401
+#define psh3 0x402
+#define psh4 0x403
+#define psh5 0x404
+#define psh6 0x405
+#define psh7 0x406
+#define psh8 0x407
+#define psh9 0x408
+#define psh10 0x409
+#define psh11 0x40a
+#define psh12 0x40b
+#define psh13 0x40c
+#define psh14 0x40d
+#define psh15 0x40e
+#define pshHelp 0x40e
+#define psh16 0x40f
+#define rad1 0x420
+#define rad2 0x421
+#define rad3 0x422
+#define rad4 0x423
+#define rad5 0x424
+#define rad6 0x425
+#define rad7 0x426
+#define rad8 0x427
+#define rad9 0x428
+#define rad10 0x429
+#define rad11 0x42a
+#define rad12 0x42b
+#define rad13 0x42c
+#define rad14 0x42d
+#define rad15 0x42e
+#define rad16 0x42f
+#define rct1 0x438
+#define rct2 0x439
+#define rct3 0x43a
+#define rct4 0x43b
+#define scr1 0x490
+#define scr2 0x491
+#define scr3 0x492
+#define scr4 0x493
+#define scr5 0x494
+#define scr6 0x495
+#define scr7 0x496
+#define scr8 0x497
+#define stc1 0x440
+#define stc2 0x441
+#define stc3 0x442
+#define stc4 0x443
+#define stc5 0x444
+#define stc6 0x445
+#define stc7 0x446
+#define stc8 0x447
+#define stc9 0x448
+#define stc10 0x449
+#define stc11 0x44a
+#define stc12 0x44b
+#define stc13 0x44c
+#define stc14 0x44d
+#define stc15 0x44e
+#define stc16 0x44f
+#define stc17 0x450
+#define stc18 0x451
+#define stc19 0x452
+#define stc20 0x453
+#define stc21 0x454
+#define stc22 0x455
+#define stc23 0x456
+#define stc24 0x457
+#define stc25 0x458
+#define stc26 0x459
+#define stc27 0x45a
+#define stc28 0x45b
+#define stc29 0x45c
+#define stc30 0x45d
+#define stc31 0x45e
+#define stc32 0x45f
+#ifndef RC_INVOKED
+typedef struct tagCRGB {
+ BYTE bRed;
+ BYTE bGreen;
+ BYTE bBlue;
+ BYTE bExtra;
+} CRGB;
+#endif
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/winsup/w32api/include/httpext.h b/winsup/w32api/include/httpext.h
new file mode 100644
index 000000000..4b6f9e282
--- /dev/null
+++ b/winsup/w32api/include/httpext.h
@@ -0,0 +1,87 @@
+/*
+ httpext.h - Header for ISAPI extensions.
+
+ This file is part of a free library for the Win32 API.
+
+ 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.
+*/
+
+#ifndef _HTTPEXT_H
+#define _HTTPEXT_H
+
+#include <windows.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define HSE_VERSION_MAJOR 2
+#define HSE_VERSION_MINOR 0
+#define HSE_LOG_BUFFER_LEN 80
+#define HSE_MAX_EXT_DLL_NAME_LEN 256
+#define HSE_STATUS_SUCCESS 1
+#define HSE_STATUS_SUCCESS_AND_KEEP_CONN 2
+#define HSE_STATUS_PENDING 3
+#define HSE_STATUS_ERROR 4
+#define HSE_REQ_BASE 0
+#define HSE_REQ_SEND_URL_REDIRECT_RESP 1
+#define HSE_REQ_SEND_URL 2
+#define HSE_REQ_SEND_RESPONSE_HEADER 3
+#define HSE_REQ_DONE_WITH_SESSION 4
+#define HSE_REQ_END_RESERVED 1000
+#define HSE_TERM_ADVISORY_UNLOAD 0x00000001
+#define HSE_TERM_MUST_UNLOAD 0x00000002
+#define HSE_IO_SYNC 0x00000001
+#define HSE_IO_ASYNC 0x00000002
+#define HSE_IO_DISCONNECT_AFTER_SEND 0x00000004
+#define HSE_IO_SEND_HEADERS 0x00000008
+typedef LPVOID HCONN;
+typedef struct _HSE_VERSION_INFO {
+ DWORD dwExtensionVersion;
+ CHAR lpszExtensionDesc[HSE_MAX_EXT_DLL_NAME_LEN];
+} HSE_VERSION_INFO, *LPHSE_VERSION_INFO;
+typedef struct _EXTENSION_CONTROL_BLOCK {
+ DWORD cbSize;
+ DWORD dwVersion;
+ HCONN ConnID;
+ DWORD dwHttpStatusCode;
+ CHAR lpszLogData[HSE_LOG_BUFFER_LEN];
+ LPSTR lpszMethod;
+ LPSTR lpszQueryString;
+ LPSTR lpszPathInfo;
+ LPSTR lpszPathTranslated;
+ DWORD cbTotalBytes;
+ DWORD cbAvailable;
+ LPBYTE lpbData;
+ LPSTR lpszContentType;
+ BOOL (PASCAL *GetServerVariable)(HCONN,LPSTR,LPVOID,LPDWORD);
+ BOOL (PASCAL *WriteClient)(HCONN,LPVOID,LPDWORD,DWORD);
+ BOOL (PASCAL *ReadClient)(HCONN,LPVOID,LPDWORD);
+ BOOL (PASCAL *ServerSupportFunction)(HCONN,DWORD,LPVOID,LPDWORD,LPDWORD);
+} EXTENSION_CONTROL_BLOCK, *LPEXTENSION_CONTROL_BLOCK;
+typedef BOOL (PASCAL *PFN_GETEXTENSIONVERSION)(HSE_VERSION_INFO*);
+typedef DWORD (PASCAL *PFN_HTTPEXTENSIONPROC)(EXTENSION_CONTROL_BLOCK*);
+typedef BOOL (PASCAL *PFN_TERMINATEEXTENSION)(DWORD);
+typedef VOID (PASCAL *PFN_HSE_IO_COMPLETION)(EXTENSION_CONTROL_BLOCK*,PVOID,DWORD,DWORD);
+typedef struct _HSE_TF_INFO {
+ PFN_HSE_IO_COMPLETION pfnHseIO;
+ PVOID pContext;
+ HANDLE hFile;
+ LPCSTR pszStatusCode;
+ DWORD BytesToWrite;
+ DWORD Offset;
+ PVOID pHead;
+ DWORD HeadLength;
+ PVOID pTail;
+ DWORD TailLength;
+ DWORD dwFlags;
+} HSE_TF_INFO, *LPHSE_TF_INFO;
+BOOL PASCAL GetExtensionVersion(HSE_VERSION_INFO*);
+DWORD PASCAL HttpExtensionProc(EXTENSION_CONTROL_BLOCK*);
+BOOL PASCAL TerminateExtension(DWORD);
+#ifdef __cplusplus
+}
+#endif
+#endif /* _HTTPEXT_H */
diff --git a/winsup/w32api/include/imagehlp.h b/winsup/w32api/include/imagehlp.h
new file mode 100644
index 000000000..2a3eb6f08
--- /dev/null
+++ b/winsup/w32api/include/imagehlp.h
@@ -0,0 +1,326 @@
+/*
+ imagehlp.h - Include file for IMAGEHLP.DLL APIs
+
+ Written by Mumit Khan <khan@nanotech.wisc.edu>
+
+ This file is part of a free library for the Win32 API.
+
+ NOTE: This strictly does not belong in the Win32 API since it's
+ really part of Platform SDK. However,GDB needs it and we might
+ as well provide it here.
+
+ 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.
+
+*/
+
+#ifndef _IMAGEHLP_H
+#define _IMAGEHLP_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define API_VERSION_NUMBER 7
+#define BIND_NO_BOUND_IMPORTS 0x00000001
+#define BIND_NO_UPDATE 0x00000002
+#define BIND_ALL_IMAGES 0x00000004
+#define BIND_CACHE_IMPORT_DLLS 0x00000008
+#define CBA_DEFERRED_SYMBOL_LOAD_START 1
+#define CBA_DEFERRED_SYMBOL_LOAD_COMPLETE 2
+#define CBA_DEFERRED_SYMBOL_LOAD_FAILURE 3
+#define CBA_SYMBOLS_UNLOADED 4
+#define CBA_DUPLICATE_SYMBOL 5
+#define CERT_PE_IMAGE_DIGEST_DEBUG_INFO 1
+#define CERT_PE_IMAGE_DIGEST_RESOURCES 2
+#define CERT_PE_IMAGE_DIGEST_ALL_IMPORT_INFO 4
+#define CERT_PE_IMAGE_DIGEST_NON_PE_INFO 8
+#define CERT_SECTION_TYPE_ANY 255
+#define CHECKSUM_SUCCESS 0
+#define CHECKSUM_OPEN_FAILURE 1
+#define CHECKSUM_MAP_FAILURE 2
+#define CHECKSUM_MAPVIEW_FAILURE 3
+#define CHECKSUM_UNICODE_FAILURE 4
+#define IMAGE_SEPARATION 65536
+#define SPLITSYM_REMOVE_PRIVATE 1
+#define SPLITSYM_EXTRACT_ALL 2
+#define SPLITSYM_SYMBOLPATH_IS_SRC 4
+#define SYMF_OMAP_GENERATED 1
+#define SYMF_OMAP_MODIFIED 2
+#define SYMOPT_CASE_INSENSITIVE 1
+#define SYMOPT_UNDNAME 2
+#define SYMOPT_DEFERRED_LOADS 4
+#define SYMOPT_NO_CPP 8
+#define SYMOPT_LOAD_LINES 16
+#define SYMOPT_OMAP_FIND_NEAREST 32
+#define UNDNAME_COMPLETE 0
+#define UNDNAME_NO_LEADING_UNDERSCORES 1
+#define UNDNAME_NO_MS_KEYWORDS 2
+#define UNDNAME_NO_FUNCTION_RETURNS 4
+#define UNDNAME_NO_ALLOCATION_MODEL 8
+#define UNDNAME_NO_ALLOCATION_LANGUAGE 16
+#define UNDNAME_NO_MS_THISTYPE 32
+#define UNDNAME_NO_CV_THISTYPE 64
+#define UNDNAME_NO_THISTYPE 96
+#define UNDNAME_NO_ACCESS_SPECIFIERS 128
+#define UNDNAME_NO_THROW_SIGNATURES 256
+#define UNDNAME_NO_MEMBER_TYPE 512
+#define UNDNAME_NO_RETURN_UDT_MODEL 1024
+#define UNDNAME_32_BIT_DECODE 2048
+#define UNDNAME_NAME_ONLY 4096
+#define UNDNAME_NO_ARGUMENTS 8192
+#define UNDNAME_NO_SPECIAL_SYMS 16384
+
+#define _IMAGEHLPAPI DECLSPEC_IMPORT WINAPI
+
+#ifndef RC_INVOKED
+
+typedef enum _IMAGEHLP_STATUS_REASON {
+ BindOutOfMemory,
+ BindRvaToVaFailed,
+ BindNoRoomInImage,
+ BindImportModuleFailed,
+ BindImportProcedureFailed,
+ BindImportModule,
+ BindImportProcedure,
+ BindForwarder,
+ BindForwarderNOT,
+ BindImageModified,
+ BindExpandFileHeaders,
+ BindImageComplete,
+ BindMismatchedSymbols,
+ BindSymbolsNotUpdated
+} IMAGEHLP_STATUS_REASON;
+typedef BOOL(STDCALL*PIMAGEHLP_STATUS_ROUTINE)(IMAGEHLP_STATUS_REASON,LPSTR,LPSTR,ULONG,ULONG);
+typedef struct _LOADED_IMAGE {
+ LPSTR ModuleName;
+ HANDLE hFile;
+ PUCHAR MappedAddress;
+ PIMAGE_NT_HEADERS FileHeader;
+ PIMAGE_SECTION_HEADER LastRvaSection;
+ ULONG NumberOfSections;
+ PIMAGE_SECTION_HEADER Sections;
+ ULONG Characteristics;
+ BOOLEAN fSystemImage;
+ BOOLEAN fDOSImage;
+ LIST_ENTRY Links;
+ ULONG SizeOfImage;
+} LOADED_IMAGE,*PLOADED_IMAGE;
+typedef struct _IMAGE_DEBUG_INFORMATION {
+ LIST_ENTRY List;
+ DWORD Size;
+ PVOID MappedBase;
+ USHORT Machine;
+ USHORT Characteristics;
+ DWORD CheckSum;
+ DWORD ImageBase;
+ DWORD SizeOfImage;
+ DWORD NumberOfSections;
+ PIMAGE_SECTION_HEADER Sections;
+ DWORD ExportedNamesSize;
+ LPSTR ExportedNames;
+ DWORD NumberOfFunctionTableEntries;
+ PIMAGE_FUNCTION_ENTRY FunctionTableEntries;
+ DWORD LowestFunctionStartingAddress;
+ DWORD HighestFunctionEndingAddress;
+ DWORD NumberOfFpoTableEntries;
+ PFPO_DATA FpoTableEntries;
+ DWORD SizeOfCoffSymbols;
+ PIMAGE_COFF_SYMBOLS_HEADER CoffSymbols;
+ DWORD SizeOfCodeViewSymbols;
+ PVOID CodeViewSymbols;
+ LPSTR ImageFilePath;
+ LPSTR ImageFileName;
+ LPSTR DebugFilePath;
+ DWORD TimeDateStamp;
+ BOOL RomImage;
+ PIMAGE_DEBUG_DIRECTORY DebugDirectory;
+ DWORD NumberOfDebugDirectories;
+ DWORD Reserved[3];
+} IMAGE_DEBUG_INFORMATION,*PIMAGE_DEBUG_INFORMATION;
+typedef enum {
+ AddrMode1616,
+ AddrMode1632,
+ AddrModeReal,
+ AddrModeFlat
+} ADDRESS_MODE;
+typedef struct _tagADDRESS {
+ DWORD Offset;
+ WORD Segment;
+ ADDRESS_MODE Mode;
+} ADDRESS,*LPADDRESS;
+typedef struct _KDHELP {
+ DWORD Thread;
+ DWORD ThCallbackStack;
+ DWORD NextCallback;
+ DWORD FramePointer;
+ DWORD KiCallUserMode;
+ DWORD KeUserCallbackDispatcher;
+ DWORD SystemRangeStart;
+} KDHELP,*PKDHELP;
+typedef struct _tagSTACKFRAME {
+ ADDRESS AddrPC;
+ ADDRESS AddrReturn;
+ ADDRESS AddrFrame;
+ ADDRESS AddrStack;
+ LPVOID FuncTableEntry;
+ DWORD Params[4];
+ BOOL Far;
+ BOOL Virtual;
+ DWORD Reserved[3];
+ KDHELP KdHelp;
+} STACKFRAME,*LPSTACKFRAME;
+typedef BOOL(STDCALL*PREAD_PROCESS_MEMORY_ROUTINE)(HANDLE ,LPCVOID,LPVOID,DWORD,LPDWORD);
+typedef LPVOID(STDCALL*PFUNCTION_TABLE_ACCESS_ROUTINE)(HANDLE,DWORD);
+typedef DWORD(STDCALL*PGET_MODULE_BASE_ROUTINE)(HANDLE,DWORD);
+typedef DWORD(STDCALL*PTRANSLATE_ADDRESS_ROUTINE)(HANDLE,HANDLE,LPADDRESS);
+typedef struct API_VERSION {
+ USHORT MajorVersion;
+ USHORT MinorVersion;
+ USHORT Revision;
+ USHORT Reserved;
+} API_VERSION,*LPAPI_VERSION;
+typedef BOOL(CALLBACK*PSYM_ENUMMODULES_CALLBACK)(LPSTR,ULONG,PVOID);
+typedef BOOL(CALLBACK*PSYM_ENUMSYMBOLS_CALLBACK)(LPSTR,ULONG,ULONG,PVOID);
+typedef BOOL(CALLBACK*PENUMLOADED_MODULES_CALLBACK)(LPSTR,ULONG,ULONG,PVOID);
+typedef BOOL(CALLBACK*PSYMBOL_REGISTERED_CALLBACK)(HANDLE,ULONG,PVOID,PVOID);
+typedef enum {
+ SymNone,
+ SymCoff,
+ SymCv,
+ SymPdb,
+ SymExport,
+ SymDeferred,
+ SymSym
+} SYM_TYPE;
+typedef struct _IMAGEHLP_SYMBOL {
+ DWORD SizeOfStruct;
+ DWORD Address;
+ DWORD Size;
+ DWORD Flags;
+ DWORD MaxNameLength;
+ CHAR Name[1];
+} IMAGEHLP_SYMBOL,*PIMAGEHLP_SYMBOL;
+typedef struct _IMAGEHLP_MODULE {
+ DWORD SizeOfStruct;
+ DWORD BaseOfImage;
+ DWORD ImageSize;
+ DWORD TimeDateStamp;
+ DWORD CheckSum;
+ DWORD NumSyms;
+ SYM_TYPE SymType;
+ CHAR ModuleName[32];
+ CHAR ImageName[256];
+ CHAR LoadedImageName[256];
+} IMAGEHLP_MODULE,*PIMAGEHLP_MODULE;
+typedef struct _IMAGEHLP_LINE {
+ DWORD SizeOfStruct;
+ DWORD Key;
+ DWORD LineNumber;
+ PCHAR FileName;
+ DWORD Address;
+} IMAGEHLP_LINE,*PIMAGEHLP_LINE;
+typedef struct _IMAGEHLP_DEFERRED_SYMBOL_LOAD {
+ DWORD SizeOfStruct;
+ DWORD BaseOfImage;
+ DWORD CheckSum;
+ DWORD TimeDateStamp;
+ CHAR FileName[MAX_PATH];
+ BOOLEAN Reparse;
+} IMAGEHLP_DEFERRED_SYMBOL_LOAD,*PIMAGEHLP_DEFERRED_SYMBOL_LOAD;
+typedef struct _IMAGEHLP_DUPLICATE_SYMBOL {
+ DWORD SizeOfStruct;
+ DWORD NumberOfDups;
+ PIMAGEHLP_SYMBOL Symbol;
+ ULONG SelectedSymbol;
+} IMAGEHLP_DUPLICATE_SYMBOL,*PIMAGEHLP_DUPLICATE_SYMBOL;
+typedef PVOID DIGEST_HANDLE;
+typedef BOOL(WINAPI*DIGEST_FUNCTION)(DIGEST_HANDLE refdata,PBYTE pData,DWORD dwLength);
+
+PIMAGE_NT_HEADERS _IMAGEHLPAPI CheckSumMappedFile(LPVOID,DWORD,LPDWORD,LPDWORD);
+DWORD _IMAGEHLPAPI MapFileAndCheckSumA(LPSTR,LPDWORD,LPDWORD);
+DWORD _IMAGEHLPAPI MapFileAndCheckSumW(PWSTR,LPDWORD,LPDWORD);
+BOOL _IMAGEHLPAPI TouchFileTimes(HANDLE,LPSYSTEMTIME);
+BOOL _IMAGEHLPAPI SplitSymbols(LPSTR,LPSTR,LPSTR,DWORD);
+HANDLE _IMAGEHLPAPI FindDebugInfoFile(LPSTR,LPSTR,LPSTR);
+HANDLE _IMAGEHLPAPI FindExecutableImage(LPSTR,LPSTR,LPSTR);
+BOOL _IMAGEHLPAPI UpdateDebugInfoFile(LPSTR,LPSTR,LPSTR,PIMAGE_NT_HEADERS);
+BOOL _IMAGEHLPAPI UpdateDebugInfoFileEx(LPSTR,LPSTR,LPSTR,PIMAGE_NT_HEADERS,DWORD);
+BOOL _IMAGEHLPAPI BindImage(IN LPSTR,IN LPSTR,IN LPSTR);
+BOOL _IMAGEHLPAPI BindImageEx(IN DWORD,IN LPSTR,IN LPSTR,IN LPSTR,IN PIMAGEHLP_STATUS_ROUTINE);
+BOOL _IMAGEHLPAPI ReBaseImage(IN LPSTR,IN LPSTR,IN BOOL, IN BOOL,IN BOOL, IN ULONG, OUT ULONG*, OUT ULONG*, OUT ULONG*, IN OUT ULONG*, IN ULONG);
+
+PLOADED_IMAGE _IMAGEHLPAPI ImageLoad(LPSTR,LPSTR);
+BOOL _IMAGEHLPAPI ImageUnload(PLOADED_IMAGE);
+PIMAGE_NT_HEADERS _IMAGEHLPAPI ImageNtHeader(IN PVOID);
+PVOID _IMAGEHLPAPI ImageDirectoryEntryToData(IN PVOID,IN BOOLEAN,IN USHORT,OUT PULONG);
+PIMAGE_SECTION_HEADER _IMAGEHLPAPI ImageRvaToSection(IN PIMAGE_NT_HEADERS,IN PVOID,IN ULONG);
+PVOID _IMAGEHLPAPI ImageRvaToVa(IN PIMAGE_NT_HEADERS,IN PVOID,IN ULONG,IN OUT PIMAGE_SECTION_HEADER*);
+BOOL _IMAGEHLPAPI MapAndLoad(LPSTR,LPSTR,PLOADED_IMAGE,BOOL,BOOL);
+BOOL _IMAGEHLPAPI GetImageConfigInformation(PLOADED_IMAGE,PIMAGE_LOAD_CONFIG_DIRECTORY);
+DWORD _IMAGEHLPAPI GetImageUnusedHeaderBytes(PLOADED_IMAGE,LPDWORD);
+BOOL _IMAGEHLPAPI SetImageConfigInformation(PLOADED_IMAGE,PIMAGE_LOAD_CONFIG_DIRECTORY);
+BOOL _IMAGEHLPAPI UnMapAndLoad(PLOADED_IMAGE);
+PIMAGE_DEBUG_INFORMATION _IMAGEHLPAPI MapDebugInformation(HANDLE,LPSTR,LPSTR,DWORD);
+BOOL _IMAGEHLPAPI UnmapDebugInformation(PIMAGE_DEBUG_INFORMATION);
+HANDLE _IMAGEHLPAPI FindExecutableImage(LPSTR,LPSTR,LPSTR);
+BOOL _IMAGEHLPAPI SearchTreeForFile(LPSTR,LPSTR,LPSTR);
+BOOL _IMAGEHLPAPI MakeSureDirectoryPathExists(LPCSTR);
+DWORD _IMAGEHLPAPI WINAPI UnDecorateSymbolName(LPCSTR,LPSTR,DWORD, DWORD);
+BOOL
+_IMAGEHLPAPI
+StackWalk(DWORD,HANDLE,HANDLE,LPSTACKFRAME,LPVOID,PREAD_PROCESS_MEMORY_ROUTINE,PFUNCTION_TABLE_ACCESS_ROUTINE,PGET_MODULE_BASE_ROUTINE,PTRANSLATE_ADDRESS_ROUTINE);
+LPAPI_VERSION _IMAGEHLPAPI ImagehlpApiVersion(VOID);
+LPAPI_VERSION _IMAGEHLPAPI ImagehlpApiVersionEx(LPAPI_VERSION);
+DWORD _IMAGEHLPAPI GetTimestampForLoadedLibrary(HMODULE);
+BOOL _IMAGEHLPAPI RemovePrivateCvSymbolic(PCHAR,PCHAR*,ULONG*);
+VOID _IMAGEHLPAPI RemoveRelocations(PCHAR);
+DWORD _IMAGEHLPAPI SymSetOptions(IN DWORD);
+DWORD _IMAGEHLPAPI SymGetOptions(VOID);
+BOOL _IMAGEHLPAPI SymCleanup(IN HANDLE);
+BOOL _IMAGEHLPAPI SymEnumerateModules(IN HANDLE,IN PSYM_ENUMMODULES_CALLBACK,IN PVOID);
+BOOL _IMAGEHLPAPI SymEnumerateSymbols(IN HANDLE,IN DWORD,IN PSYM_ENUMSYMBOLS_CALLBACK,IN PVOID);
+BOOL _IMAGEHLPAPI EnumerateLoadedModules(IN HANDLE,IN PENUMLOADED_MODULES_CALLBACK,IN PVOID);
+LPVOID _IMAGEHLPAPI SymFunctionTableAccess(HANDLE,DWORD);
+BOOL _IMAGEHLPAPI SymGetModuleInfo(IN HANDLE,IN DWORD,OUT PIMAGEHLP_MODULE);
+DWORD _IMAGEHLPAPI SymGetModuleBase(IN HANDLE,IN DWORD);
+BOOL _IMAGEHLPAPI SymGetSymFromAddr(IN HANDLE,IN DWORD,OUT PDWORD,OUT PIMAGEHLP_SYMBOL);
+BOOL _IMAGEHLPAPI SymGetSymFromName(IN HANDLE,IN LPSTR,OUT PIMAGEHLP_SYMBOL);
+BOOL _IMAGEHLPAPI SymGetSymNext(IN HANDLE,IN OUT PIMAGEHLP_SYMBOL);
+BOOL _IMAGEHLPAPI SymGetSymPrev(IN HANDLE,IN OUT PIMAGEHLP_SYMBOL);
+BOOL _IMAGEHLPAPI SymGetLineFromAddr(IN HANDLE,IN DWORD,OUT PDWORD,OUT PIMAGEHLP_LINE);
+BOOL _IMAGEHLPAPI SymGetLineFromName(IN HANDLE,IN LPSTR,IN LPSTR,IN DWORD,OUT PLONG,IN OUT PIMAGEHLP_LINE);
+BOOL _IMAGEHLPAPI SymGetLineNext(IN HANDLE,IN OUT PIMAGEHLP_LINE);
+BOOL _IMAGEHLPAPI SymGetLinePrev(IN HANDLE,IN OUT PIMAGEHLP_LINE);
+BOOL _IMAGEHLPAPI SymMatchFileName(IN LPSTR,IN LPSTR,OUT LPSTR*,OUT LPSTR*);
+BOOL _IMAGEHLPAPI SymInitialize(IN HANDLE,IN LPSTR,IN BOOL);
+BOOL _IMAGEHLPAPI SymGetSearchPath(IN HANDLE,OUT LPSTR,IN DWORD);
+BOOL _IMAGEHLPAPI SymSetSearchPath(IN HANDLE,IN LPSTR);
+BOOL _IMAGEHLPAPI SymLoadModule(IN HANDLE,IN HANDLE,IN PSTR,IN PSTR,IN DWORD,IN DWORD);
+BOOL _IMAGEHLPAPI SymUnloadModule(IN HANDLE,IN DWORD);
+BOOL _IMAGEHLPAPI SymUnDName(IN PIMAGEHLP_SYMBOL,OUT LPSTR,IN DWORD);
+BOOL _IMAGEHLPAPI SymRegisterCallback(IN HANDLE,IN PSYMBOL_REGISTERED_CALLBACK,IN PVOID);
+BOOL _IMAGEHLPAPI ImageGetDigestStream(IN HANDLE,IN DWORD,IN DIGEST_FUNCTION,IN DIGEST_HANDLE);
+BOOL _IMAGEHLPAPI ImageAddCertificate(IN HANDLE,IN LPWIN_CERTIFICATE,OUT PDWORD);
+BOOL _IMAGEHLPAPI ImageRemoveCertificate(IN HANDLE,IN DWORD);
+BOOL _IMAGEHLPAPI ImageEnumerateCertificates(IN HANDLE,IN WORD,OUT PDWORD,IN OUT PDWORD OPTIONAL,IN OUT DWORD OPTIONAL);
+BOOL _IMAGEHLPAPI ImageGetCertificateData(IN HANDLE,IN DWORD,OUT LPWIN_CERTIFICATE,IN OUT PDWORD);
+BOOL _IMAGEHLPAPI ImageGetCertificateHeader(IN HANDLE,IN DWORD,IN OUT LPWIN_CERTIFICATE);
+BOOL _IMAGEHLPAPI CopyPdb(CHAR const*,CHAR const*,BOOL);
+BOOL _IMAGEHLPAPI RemovePrivateCvSymbolicEx(PCHAR,ULONG,PCHAR*,ULONG*);
+
+#endif /* RC_INVOKED */
+
+#ifdef UNICODE
+#define MapFileAndCheckSum MapFileAndCheckSumW
+#else
+#define MapFileAndCheckSum MapFileAndCheckSumA
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _IMAGEHLP_H */
+
diff --git a/winsup/w32api/include/imm.h b/winsup/w32api/include/imm.h
new file mode 100644
index 000000000..30d97013c
--- /dev/null
+++ b/winsup/w32api/include/imm.h
@@ -0,0 +1,420 @@
+#ifndef _IMM_H
+#define _IMM_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+#define WM_CONVERTREQUESTEX 0x108
+#define WM_IME_STARTCOMPOSITION 0x10D
+#define WM_IME_ENDCOMPOSITION 0x10E
+#define WM_IME_COMPOSITION 0x10F
+#define WM_IME_KEYLAST 0x10F
+#define WM_IME_SETCONTEXT 0x281
+#define WM_IME_NOTIFY 0x282
+#define WM_IME_CONTROL 0x283
+#define WM_IME_COMPOSITIONFULL 0x284
+#define WM_IME_SELECT 0x285
+#define WM_IME_CHAR 0x286
+#define WM_IME_KEYDOWN 0x290
+#define WM_IME_KEYUP 0x291
+#define IMC_GETCANDIDATEPOS 7
+#define IMC_SETCANDIDATEPOS 8
+#define IMC_GETCOMPOSITIONFONT 9
+#define IMC_SETCOMPOSITIONFONT 10
+#define IMC_GETCOMPOSITIONWINDOW 11
+#define IMC_SETCOMPOSITIONWINDOW 12
+#define IMC_GETSTATUSWINDOWPOS 15
+#define IMC_SETSTATUSWINDOWPOS 16
+#define IMC_CLOSESTATUSWINDOW 0x21
+#define IMC_OPENSTATUSWINDOW 0x22
+#define IMN_CLOSESTATUSWINDOW 1
+#define IMN_OPENSTATUSWINDOW 2
+#define IMN_CHANGECANDIDATE 3
+#define IMN_CLOSECANDIDATE 4
+#define IMN_OPENCANDIDATE 5
+#define IMN_SETCONVERSIONMODE 6
+#define IMN_SETSENTENCEMODE 7
+#define IMN_SETOPENSTATUS 8
+#define IMN_SETCANDIDATEPOS 9
+#define IMN_SETCOMPOSITIONFONT 10
+#define IMN_SETCOMPOSITIONWINDOW 11
+#define IMN_SETSTATUSWINDOWPOS 12
+#define IMN_GUIDELINE 13
+#define IMN_PRIVATE 14
+#define NI_OPENCANDIDATE 16
+#define NI_CLOSECANDIDATE 17
+#define NI_SELECTCANDIDATESTR 18
+#define NI_CHANGECANDIDATELIST 19
+#define NI_FINALIZECONVERSIONRESULT 20
+#define NI_COMPOSITIONSTR 21
+#define NI_SETCANDIDATE_PAGESTART 22
+#define NI_SETCANDIDATE_PAGESIZE 23
+#define NI_IMEMENUSELECTED 24
+#define ISC_SHOWUICANDIDATEWINDOW 1
+#define ISC_SHOWUICOMPOSITIONWINDOW 0x80000000
+#define ISC_SHOWUIGUIDELINE 0x40000000
+#define ISC_SHOWUIALLCANDIDATEWINDOW 15
+#define ISC_SHOWUIALL 0xC000000F
+#define CPS_COMPLETE 1
+#define CPS_CONVERT 2
+#define CPS_REVERT 3
+#define CPS_CANCEL 4
+#define IME_CHOTKEY_IME_NONIME_TOGGLE 16
+#define IME_CHOTKEY_SHAPE_TOGGLE 17
+#define IME_CHOTKEY_SYMBOL_TOGGLE 18
+#define IME_JHOTKEY_CLOSE_OPEN 0x30
+#define IME_KHOTKEY_SHAPE_TOGGLE 0x50
+#define IME_KHOTKEY_HANJACONVERT 0x51
+#define IME_KHOTKEY_ENGLISH 0x52
+#define IME_THOTKEY_IME_NONIME_TOGGLE 0x70
+#define IME_THOTKEY_SHAPE_TOGGLE 0x71
+#define IME_THOTKEY_SYMBOL_TOGGLE 0x72
+#define IME_HOTKEY_DSWITCH_FIRST 256
+#define IME_HOTKEY_DSWITCH_LAST 0x11F
+#define IME_ITHOTKEY_RESEND_RESULTSTR 512
+#define IME_ITHOTKEY_PREVIOUS_COMPOSITION 513
+#define IME_ITHOTKEY_UISTYLE_TOGGLE 514
+#define GCS_COMPREADSTR 1
+#define GCS_COMPREADATTR 2
+#define GCS_COMPREADCLAUSE 4
+#define GCS_COMPSTR 8
+#define GCS_COMPATTR 16
+#define GCS_COMPCLAUSE 32
+#define GCS_CURSORPOS 128
+#define GCS_DELTASTART 256
+#define GCS_RESULTREADSTR 512
+#define GCS_RESULTREADCLAUSE 1024
+#define GCS_RESULTSTR 2048
+#define GCS_RESULTCLAUSE 4096
+#define CS_INSERTCHAR 0x2000
+#define CS_NOMOVECARET 0x4000
+#define IMEVER_0310 0x3000A
+#define IMEVER_0400 0x40000
+#define IME_PROP_AT_CARET 0x10000
+#define IME_PROP_SPECIAL_UI 0x20000
+#define IME_PROP_CANDLIST_START_FROM_1 0x40000
+#define IME_PROP_UNICODE 0x80000
+#define UI_CAP_2700 1
+#define UI_CAP_ROT90 2
+#define UI_CAP_ROTANY 4
+#define SCS_CAP_COMPSTR 1
+#define SCS_CAP_MAKEREAD 2
+#define SELECT_CAP_CONVERSION 1
+#define SELECT_CAP_SENTENCE 2
+#define GGL_LEVEL 1
+#define GGL_INDEX 2
+#define GGL_STRING 3
+#define GGL_PRIVATE 4
+#define GL_LEVEL_NOGUIDELINE 0
+#define GL_LEVEL_FATAL 1
+#define GL_LEVEL_ERROR 2
+#define GL_LEVEL_WARNING 3
+#define GL_LEVEL_INFORMATION 4
+#define GL_ID_UNKNOWN 0
+#define GL_ID_NOMODULE 1
+#define GL_ID_NODICTIONARY 16
+#define GL_ID_CANNOTSAVE 17
+#define GL_ID_NOCONVERT 32
+#define GL_ID_TYPINGERROR 33
+#define GL_ID_TOOMANYSTROKE 34
+#define GL_ID_READINGCONFLICT 35
+#define GL_ID_INPUTREADING 36
+#define GL_ID_INPUTRADICAL 37
+#define GL_ID_INPUTCODE 38
+#define GL_ID_INPUTSYMBOL 39
+#define GL_ID_CHOOSECANDIDATE 40
+#define GL_ID_REVERSECONVERSION 41
+#define GL_ID_PRIVATE_FIRST 0x8000
+#define GL_ID_PRIVATE_LAST 0xFFFF
+#define IGP_GETIMEVERSION (DWORD)(-4)
+#define IGP_PROPERTY 4
+#define IGP_CONVERSION 8
+#define IGP_SENTENCE 12
+#define IGP_UI 16
+#define IGP_SETCOMPSTR 0x14
+#define IGP_SELECT 0x18
+#define SCS_SETSTR (GCS_COMPREADSTR|GCS_COMPSTR)
+#define SCS_CHANGEATTR (GCS_COMPREADATTR|GCS_COMPATTR)
+#define SCS_CHANGECLAUSE (GCS_COMPREADCLAUSE|GCS_COMPCLAUSE)
+#define ATTR_INPUT 0
+#define ATTR_TARGET_CONVERTED 1
+#define ATTR_CONVERTED 2
+#define ATTR_TARGET_NOTCONVERTED 3
+#define ATTR_INPUT_ERROR 4
+#define ATTR_FIXEDCONVERTED 5
+#define CFS_DEFAULT 0
+#define CFS_RECT 1
+#define CFS_POINT 2
+#define CFS_SCREEN 4
+#define CFS_FORCE_POSITION 32
+#define CFS_CANDIDATEPOS 64
+#define CFS_EXCLUDE 128
+#define GCL_CONVERSION 1
+#define GCL_REVERSECONVERSION 2
+#define GCL_REVERSE_LENGTH 3
+#define IME_CMODE_ALPHANUMERIC 0
+#define IME_CMODE_NATIVE 1
+#define IME_CMODE_CHINESE IME_CMODE_NATIVE
+#define IME_CMODE_HANGEUL IME_CMODE_NATIVE
+#define IME_CMODE_HANGUL IME_CMODE_NATIVE
+#define IME_CMODE_JAPANESE IME_CMODE_NATIVE
+#define IME_CMODE_KATAKANA 2
+#define IME_CMODE_LANGUAGE 3
+#define IME_CMODE_FULLSHAPE 8
+#define IME_CMODE_ROMAN 16
+#define IME_CMODE_CHARCODE 32
+#define IME_CMODE_HANJACONVERT 64
+#define IME_CMODE_SOFTKBD 128
+#define IME_CMODE_NOCONVERSION 256
+#define IME_CMODE_EUDC 512
+#define IME_CMODE_SYMBOL 1024
+#define IME_CMODE_FIXED 2048
+#define IME_SMODE_NONE 0
+#define IME_SMODE_PLAURALCLAUSE 1
+#define IME_SMODE_SINGLECONVERT 2
+#define IME_SMODE_AUTOMATIC 4
+#define IME_SMODE_PHRASEPREDICT 8
+#define IME_CAND_UNKNOWN 0
+#define IME_CAND_READ 1
+#define IME_CAND_CODE 2
+#define IME_CAND_MEANING 3
+#define IME_CAND_RADICAL 4
+#define IME_CAND_STROKE 5
+#define IMM_ERROR_NODATA (-1)
+#define IMM_ERROR_GENERAL (-2)
+#define IME_CONFIG_GENERAL 1
+#define IME_CONFIG_REGISTERWORD 2
+#define IME_CONFIG_SELECTDICTIONARY 3
+#define IME_ESC_QUERY_SUPPORT 3
+#define IME_ESC_RESERVED_FIRST 4
+#define IME_ESC_RESERVED_LAST 0x7FF
+#define IME_ESC_PRIVATE_FIRST 0x800
+#define IME_ESC_PRIVATE_LAST 0xFFF
+#define IME_ESC_SEQUENCE_TO_INTERNAL 0x1001
+#define IME_ESC_GET_EUDC_DICTIONARY 0x1003
+#define IME_ESC_SET_EUDC_DICTIONARY 0x1004
+#define IME_ESC_MAX_KEY 0x1005
+#define IME_ESC_IME_NAME 0x1006
+#define IME_ESC_SYNC_HOTKEY 0x1007
+#define IME_ESC_HANJA_MODE 0x1008
+#define IME_ESC_AUTOMATA 0x1009
+#define IME_REGWORD_STYLE_EUDC 1
+#define IME_REGWORD_STYLE_USER_FIRST 0x80000000
+#define IME_REGWORD_STYLE_USER_LAST 0xFFFFFFFF
+#define SOFTKEYBOARD_TYPE_T1 1
+#define SOFTKEYBOARD_TYPE_C1 2
+#define IMEMENUITEM_STRING_SIZE 80
+#define MOD_ALT 1
+#define MOD_CONTROL 2
+#define MOD_SHIFT 4
+#define MOD_WIN 8
+#define MOD_IGNORE_ALL_MODIFIER 1024
+#define MOD_ON_KEYUP 2048
+#define MOD_RIGHT 16384
+#define MOD_LEFT 32768
+#define IACE_CHILDREN 1
+#define IACE_DEFAULT 16
+#define IACE_IGNORENOCONTEXT 32
+#define IGIMIF_RIGHTMENU 1
+#define IGIMII_CMODE 1
+#define IGIMII_SMODE 2
+#define IGIMII_CONFIGURE 4
+#define IGIMII_TOOLS 8
+#define IGIMII_HELP 16
+#define IGIMII_OTHER 32
+#define IGIMII_INPUTTOOLS 64
+#define IMFT_RADIOCHECK 1
+#define IMFT_SEPARATOR 2
+#define IMFT_SUBMENU 4
+#define IMFS_GRAYED MFS_GRAYED
+#define IMFS_DISABLED MFS_DISABLED
+#define IMFS_CHECKED MFS_CHECKED
+#define IMFS_HILITE MFS_HILITE
+#define IMFS_ENABLED MFS_ENABLED
+#define IMFS_UNCHECKED MFS_UNCHECKED
+#define IMFS_UNHILITE MFS_UNHILITE
+#define IMFS_DEFAULT MFS_DEFAULT
+#ifndef VK_PROCESSKEY
+#define VK_PROCESSKEY 0x0E5
+#endif
+#define STYLE_DESCRIPTION_SIZE 32
+typedef DWORD HIMC;
+typedef DWORD HIMCC;
+typedef HKL *LPHKL;
+typedef struct tagCOMPOSITIONFORM {
+ DWORD dwStyle;
+ POINT ptCurrentPos;
+ RECT rcArea;
+} COMPOSITIONFORM,*PCOMPOSITIONFORM,*LPCOMPOSITIONFORM;
+typedef struct tagCANDIDATEFORM {
+ DWORD dwIndex;
+ DWORD dwStyle;
+ POINT ptCurrentPos;
+ RECT rcArea;
+} CANDIDATEFORM,*PCANDIDATEFORM,*LPCANDIDATEFORM;
+typedef struct tagCANDIDATELIST {
+ DWORD dwSize;
+ DWORD dwStyle;
+ DWORD dwCount;
+ DWORD dwSelection;
+ DWORD dwPageStart;
+ DWORD dwPageSize;
+ DWORD dwOffset[1];
+} CANDIDATELIST,*PCANDIDATELIST,*LPCANDIDATELIST;
+typedef struct tagREGISTERWORDA {
+ LPSTR lpReading;
+ LPSTR lpWord;
+} REGISTERWORDA,*PREGISTERWORDA,*LPREGISTERWORDA;
+typedef struct tagREGISTERWORDW {
+ LPWSTR lpReading;
+ LPWSTR lpWord;
+} REGISTERWORDW,*PREGISTERWORDW,*LPREGISTERWORDW;
+typedef struct tagSTYLEBUFA {
+ DWORD dwStyle;
+ CHAR szDescription[STYLE_DESCRIPTION_SIZE];
+} STYLEBUFA,*PSTYLEBUFA,*LPSTYLEBUFA;
+typedef struct tagSTYLEBUFW {
+ DWORD dwStyle;
+ WCHAR szDescription[STYLE_DESCRIPTION_SIZE];
+} STYLEBUFW,*PSTYLEBUFW,*LPSTYLEBUFW;
+typedef struct tagIMEMENUITEMINFOA {
+ UINT cbSize;
+ UINT fType;
+ UINT fState;
+ UINT wID;
+ HBITMAP hbmpChecked;
+ HBITMAP hbmpUnchecked;
+ DWORD dwItemData;
+ CHAR szString[IMEMENUITEM_STRING_SIZE];
+ HBITMAP hbmpItem;
+} IMEMENUITEMINFOA,*PIMEMENUITEMINFOA,*LPIMEMENUITEMINFOA;
+typedef struct tagIMEMENUITEMINFOW {
+ UINT cbSize;
+ UINT fType;
+ UINT fState;
+ UINT wID;
+ HBITMAP hbmpChecked;
+ HBITMAP hbmpUnchecked;
+ DWORD dwItemData;
+ WCHAR szString[IMEMENUITEM_STRING_SIZE];
+ HBITMAP hbmpItem;
+} IMEMENUITEMINFOW,*PIMEMENUITEMINFOW,*LPIMEMENUITEMINFOW;
+typedef int (CALLBACK *REGISTERWORDENUMPROCA)(LPCSTR, DWORD, LPCSTR, LPVOID);
+typedef int (CALLBACK *REGISTERWORDENUMPROCW)(LPCWSTR, DWORD, LPCWSTR, LPVOID);
+#ifdef UNICODE
+#define REGISTERWORDENUMPROC REGISTERWORDENUMPROCW
+typedef REGISTERWORDW REGISTERWORD,*PREGISTERWORD,*LPREGISTERWORD;
+typedef STYLEBUFW STYLEBUF,*PSTYLEBUF,*LPSTYLEBUF;
+typedef IMEMENUITEMINFOW IMEMENUITEMINFO,*PIMEMENUITEMINFO,*LPIMEMENUITEMINFO;
+#else
+#define REGISTERWORDENUMPROC REGISTERWORDENUMPROCA
+typedef REGISTERWORDA REGISTERWORD,*PREGISTERWORD,*LPREGISTERWORD;
+typedef STYLEBUFA STYLEBUF,*PSTYLEBUF,*LPSTYLEBUF;
+typedef IMEMENUITEMINFOA IMEMENUITEMINFO,*PIMEMENUITEMINFO,*LPIMEMENUITEMINFO;
+#endif
+HKL WINAPI ImmInstallIMEA(LPCSTR,LPCSTR);
+HKL WINAPI ImmInstallIMEW(LPCWSTR,LPCWSTR);
+HWND WINAPI ImmGetDefaultIMEWnd(HWND);
+UINT WINAPI ImmGetDescriptionA(HKL,LPSTR,UINT);
+UINT WINAPI ImmGetDescriptionW(HKL,LPWSTR,UINT);
+UINT WINAPI ImmGetIMEFileNameA(HKL,LPSTR,UINT);
+UINT WINAPI ImmGetIMEFileNameW(HKL,LPWSTR,UINT);
+DWORD WINAPI ImmGetProperty(HKL,DWORD);
+BOOL WINAPI ImmIsIME(HKL);
+BOOL WINAPI ImmSimulateHotKey(HWND,DWORD);
+HIMC WINAPI ImmCreateContext(void);
+BOOL WINAPI ImmDestroyContext(HIMC);
+HIMC WINAPI ImmGetContext(HWND);
+BOOL WINAPI ImmReleaseContext(HWND,HIMC);
+HIMC WINAPI ImmAssociateContext(HWND,HIMC);
+LONG WINAPI ImmGetCompositionStringA(HIMC,DWORD,PVOID,DWORD);
+LONG WINAPI ImmGetCompositionStringW(HIMC,DWORD,PVOID,DWORD);
+BOOL WINAPI ImmSetCompositionStringA(HIMC,DWORD,PCVOID,DWORD,PCVOID,DWORD);
+BOOL WINAPI ImmSetCompositionStringW(HIMC,DWORD,PCVOID,DWORD,PCVOID,DWORD);
+DWORD WINAPI ImmGetCandidateListCountA(HIMC,PDWORD);
+DWORD WINAPI ImmGetCandidateListCountW(HIMC,PDWORD);
+DWORD WINAPI ImmGetCandidateListA(HIMC,DWORD,PCANDIDATELIST,DWORD);
+DWORD WINAPI ImmGetCandidateListW(HIMC,DWORD,PCANDIDATELIST,DWORD);
+DWORD WINAPI ImmGetGuideLineA(HIMC,DWORD,LPSTR,DWORD);
+DWORD WINAPI ImmGetGuideLineW(HIMC,DWORD,LPWSTR,DWORD);
+BOOL WINAPI ImmGetConversionStatus(HIMC,LPDWORD,PDWORD);
+BOOL WINAPI ImmSetConversionStatus(HIMC,DWORD,DWORD);
+BOOL WINAPI ImmGetOpenStatus(HIMC);
+BOOL WINAPI ImmSetOpenStatus(HIMC,BOOL);
+BOOL WINAPI ImmGetCompositionFontA(HIMC,LPLOGFONTA);
+BOOL WINAPI ImmGetCompositionFontW(HIMC,LPLOGFONTW);
+BOOL WINAPI ImmSetCompositionFontA(HIMC,LPLOGFONTA);
+BOOL WINAPI ImmSetCompositionFontW(HIMC,LPLOGFONTW);
+BOOL WINAPI ImmConfigureIMEA(HKL,HWND,DWORD,PVOID);
+BOOL WINAPI ImmConfigureIMEW(HKL,HWND,DWORD,PVOID);
+LRESULT WINAPI ImmEscapeA(HKL,HIMC,UINT,PVOID);
+LRESULT WINAPI ImmEscapeW(HKL,HIMC,UINT,PVOID);
+DWORD WINAPI ImmGetConversionListA(HKL,HIMC,LPCSTR,PCANDIDATELIST,DWORD,UINT);
+DWORD WINAPI ImmGetConversionListW(HKL,HIMC,LPCWSTR,PCANDIDATELIST,DWORD,UINT);
+BOOL WINAPI ImmNotifyIME(HIMC,DWORD,DWORD,DWORD);
+BOOL WINAPI ImmGetStatusWindowPos(HIMC,LPPOINT);
+BOOL WINAPI ImmSetStatusWindowPos(HIMC,LPPOINT);
+BOOL WINAPI ImmGetCompositionWindow(HIMC,PCOMPOSITIONFORM);
+BOOL WINAPI ImmSetCompositionWindow(HIMC,PCOMPOSITIONFORM);
+BOOL WINAPI ImmGetCandidateWindow(HIMC,DWORD,PCANDIDATEFORM);
+BOOL WINAPI ImmSetCandidateWindow(HIMC,PCANDIDATEFORM);
+BOOL WINAPI ImmIsUIMessageA(HWND,UINT,WPARAM,LPARAM);
+BOOL WINAPI ImmIsUIMessageW(HWND,UINT,WPARAM,LPARAM);
+UINT WINAPI ImmGetVirtualKey(HWND);
+BOOL WINAPI ImmRegisterWordA(HKL,LPCSTR,DWORD,LPCSTR);
+BOOL WINAPI ImmRegisterWordW(HKL,LPCWSTR,DWORD,LPCWSTR);
+BOOL WINAPI ImmUnregisterWordA(HKL,LPCSTR,DWORD,LPCSTR);
+BOOL WINAPI ImmUnregisterWordW(HKL,LPCWSTR,DWORD,LPCWSTR);
+UINT WINAPI ImmGetRegisterWordStyleA(HKL,UINT,PSTYLEBUFA);
+UINT WINAPI ImmGetRegisterWordStyleW(HKL,UINT,PSTYLEBUFW);
+UINT WINAPI ImmEnumRegisterWordA(HKL,REGISTERWORDENUMPROCA,LPCSTR,DWORD,LPCSTR,PVOID);
+UINT WINAPI ImmEnumRegisterWordW(HKL,REGISTERWORDENUMPROCW,LPCWSTR,DWORD,LPCWSTR,PVOID);
+BOOL WINAPI EnableEUDC(BOOL);
+BOOL WINAPI ImmDisableIME(DWORD);
+DWORD WINAPI ImmGetImeMenuItemsA(HIMC,DWORD,DWORD,LPIMEMENUITEMINFOA,LPIMEMENUITEMINFOA,DWORD);
+DWORD WINAPI ImmGetImeMenuItemsW(HIMC,DWORD,DWORD,LPIMEMENUITEMINFOW,LPIMEMENUITEMINFOW,DWORD);
+
+#ifdef UNICODE
+#define ImmEnumRegisterWord ImmEnumRegisterWordW
+#define ImmGetRegisterWordStyle ImmGetRegisterWordStyleW
+#define ImmUnregisterWord ImmUnregisterWordW
+#define ImmRegisterWord ImmRegisterWordW
+#define ImmInstallIME ImmInstallIMEW
+#define ImmIsUIMessage ImmIsUIMessageW
+#define ImmGetConversionList ImmGetConversionListW
+#define ImmEscape ImmEscapeW
+#define ImmConfigureIME ImmConfigureIMEW
+#define ImmSetCompositionFont ImmSetCompositionFontW
+#define ImmGetCompositionFont ImmGetCompositionFontW
+#define ImmGetGuideLine ImmGetGuideLineW
+#define ImmGetCandidateList ImmGetCandidateListW
+#define ImmGetCandidateListCount ImmGetCandidateListCountW
+#define ImmSetCompositionString ImmSetCompositionStringW
+#define ImmGetCompositionString ImmGetCompositionStringW
+#define ImmGetDescription ImmGetDescriptionW
+#define ImmGetIMEFileName ImmGetIMEFileNameW
+#define ImmGetImeMenuItems ImmGetImeMenuItemsW
+#else
+#define ImmEnumRegisterWord ImmEnumRegisterWordA
+#define ImmGetRegisterWordStyle ImmGetRegisterWordStyleA
+#define ImmUnregisterWord ImmUnregisterWordA
+#define ImmRegisterWord ImmRegisterWordA
+#define ImmInstallIME ImmInstallIMEA
+#define ImmIsUIMessage ImmIsUIMessageA
+#define ImmGetConversionList ImmGetConversionListA
+#define ImmEscape ImmEscapeA
+#define ImmConfigureIME ImmConfigureIMEA
+#define ImmSetCompositionFont ImmSetCompositionFontA
+#define ImmGetCompositionFont ImmGetCompositionFontA
+#define ImmGetGuideLine ImmGetGuideLineA
+#define ImmGetCandidateList ImmGetCandidateListA
+#define ImmGetCandidateListCount ImmGetCandidateListCountA
+#define ImmSetCompositionString ImmSetCompositionStringA
+#define ImmGetCompositionString ImmGetCompositionStringA
+#define ImmGetDescription ImmGetDescriptionA
+#define ImmGetIMEFileName ImmGetIMEFileNameA
+#define ImmGetImeMenuItems ImmGetImeMenuItemsW
+#endif
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/winsup/w32api/include/initguid.h b/winsup/w32api/include/initguid.h
new file mode 100644
index 000000000..08092a299
--- /dev/null
+++ b/winsup/w32api/include/initguid.h
@@ -0,0 +1,8 @@
+#ifndef _INITGUID_H
+#define _INITGUID_H
+#ifndef DEFINE_GUID
+#include <basetyps.h>
+#endif
+#undef DEFINE_GUID
+#define DEFINE_GUID(n,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) const GUID n GUID_SECT = {l,w1,w2,{b1,b2,b3,b4,b5,b6,b7,b8}}
+#endif
diff --git a/winsup/w32api/include/intshcut.h b/winsup/w32api/include/intshcut.h
new file mode 100644
index 000000000..a9d7ee008
--- /dev/null
+++ b/winsup/w32api/include/intshcut.h
@@ -0,0 +1,78 @@
+#ifndef _INTSHCUT_H
+#define _INTSHCUT_H
+#include <isguids.h>
+#ifdef __cplusplus
+extern "C" {
+#endif
+#define INTSHCUTAPI DECLSPEC_IMPORT
+#define E_FLAGS MAKE_SCODE(SEVERITY_ERROR,FACILITY_ITF,0x1000)
+#define IS_E_EXEC_FAILED MAKE_SCODE(SEVERITY_ERROR,FACILITY_ITF,0x2002)
+#define URL_E_INVALID_SYNTAX MAKE_SCODE(SEVERITY_ERROR,FACILITY_ITF,0x1001)
+#define URL_E_UNREGISTERED_PROTOCOL MAKE_SCODE(SEVERITY_ERROR,FACILITY_ITF,0x1002)
+typedef enum iurl_seturl_flags {
+ IURL_SETURL_FL_GUESS_PROTOCOL=1,
+ IURL_SETURL_FL_USE_DEFAULT_PROTOCOL,
+ ALL_IURL_SETURL_FLAGS=(IURL_SETURL_FL_GUESS_PROTOCOL|IURL_SETURL_FL_USE_DEFAULT_PROTOCOL)
+} IURL_SETURL_FLAGS;
+typedef enum iurl_invokecommand_flags {
+ IURL_INVOKECOMMAND_FL_ALLOW_UI=1,
+ IURL_INVOKECOMMAND_FL_USE_DEFAULT_VERB,
+ ALL_IURL_INVOKECOMMAND_FLAGS=(IURL_INVOKECOMMAND_FL_ALLOW_UI|IURL_INVOKECOMMAND_FL_USE_DEFAULT_VERB)
+} IURL_INVOKECOMMAND_FLAGS;
+typedef enum translateurl_in_flags {
+ TRANSLATEURL_FL_GUESS_PROTOCOL=1,
+ TRANSLATEURL_FL_USE_DEFAULT_PROTOCOL,
+ ALL_TRANSLATEURL_FLAGS=(TRANSLATEURL_FL_GUESS_PROTOCOL|TRANSLATEURL_FL_USE_DEFAULT_PROTOCOL)
+} TRANSLATEURL_IN_FLAGS;
+typedef enum urlassociationdialog_in_flags {
+ URLASSOCDLG_FL_USE_DEFAULT_NAME=1,
+ URLASSOCDLG_FL_REGISTER_ASSOC,
+ ALL_URLASSOCDLG_FLAGS=(URLASSOCDLG_FL_USE_DEFAULT_NAME|URLASSOCDLG_FL_REGISTER_ASSOC)
+} URLASSOCIATIONDIALOG_IN_FLAGS;
+typedef enum mimeassociationdialog_in_flags {
+ MIMEASSOCDLG_FL_REGISTER_ASSOC=1,
+ ALL_MIMEASSOCDLG_FLAGS=MIMEASSOCDLG_FL_REGISTER_ASSOC
+} MIMEASSOCIATIONDIALOG_IN_FLAGS;
+typedef struct urlinvokecommandinfo {
+ DWORD dwcbSize;
+ DWORD dwFlags;
+ HWND hwndParent;
+ PCSTR pcszVerb;
+} URLINVOKECOMMANDINFO,*PURLINVOKECOMMANDINFO;
+typedef const URLINVOKECOMMANDINFO CURLINVOKECOMMANDINFO;
+typedef const URLINVOKECOMMANDINFO *PCURLINVOKECOMMANDINFO;
+#undef INTERFACE
+#define INTERFACE IUniformResourceLocator
+DECLARE_INTERFACE_(IUniformResourceLocator,IUnknown)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(SetURL)(THIS_ PCSTR,DWORD) PURE;
+ STDMETHOD(GetURL)(THIS_ PSTR*) PURE;
+ STDMETHOD(InvokeCommand)(THIS_ PURLINVOKECOMMANDINFO) PURE;
+};
+typedef IUniformResourceLocator *PIUniformResourceLocator;
+typedef const IUniformResourceLocator CIUniformResourceLocator;
+typedef const IUniformResourceLocator *PCIUniformResourceLocator;
+
+BOOL WINAPI InetIsOffline(DWORD);
+HRESULT WINAPI MIMEAssociationDialogA(HWND,DWORD,PCSTR,PCSTR,PSTR,UINT);
+HRESULT WINAPI MIMEAssociationDialogW(HWND,DWORD,PCWSTR,PCWSTR,PWSTR,UINT);
+HRESULT WINAPI TranslateURLA(PCSTR,DWORD,PSTR*);
+HRESULT WINAPI TranslateURLW(PCWSTR,DWORD,PWSTR*);
+HRESULT WINAPI URLAssociationDialogA(HWND,DWORD,PCSTR,PCSTR,PSTR,UINT);
+HRESULT WINAPI URLAssociationDialogW(HWND,DWORD,PCWSTR,PCWSTR,PWSTR,UINT);
+#ifdef UNICODE
+#define TranslateURL TranslateURLW
+#define MIMEAssociationDialog MIMEAssociationDialogW
+#define URLAssociationDialog URLAssociationDialogW
+#else
+#define TranslateURL TranslateURLA
+#define MIMEAssociationDialog MIMEAssociationDialogA
+#define URLAssociationDialog URLAssociationDialogA
+#endif
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/winsup/w32api/include/isguids.h b/winsup/w32api/include/isguids.h
new file mode 100644
index 000000000..6518e66a6
--- /dev/null
+++ b/winsup/w32api/include/isguids.h
@@ -0,0 +1,11 @@
+#ifndef _ISGUID_H
+#define _ISGUID_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+extern const GUID CLSID_InternetShortcut;
+extern const GUID IID_IUniformResourceLocator;
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/winsup/w32api/include/largeint.h b/winsup/w32api/include/largeint.h
new file mode 100644
index 000000000..1e90de07d
--- /dev/null
+++ b/winsup/w32api/include/largeint.h
@@ -0,0 +1,109 @@
+/*
+ largeint.h
+
+ Header for 64 bit integer arithmetics library
+
+ */
+#ifndef _LARGEINT_H
+#define _LARGEINT_H
+
+#include <windows.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef HAVE_INT64
+#define _toi (__int64)
+#define _toui (unsigned __int64)
+#else
+#error "64 bit integers not supported"
+#endif
+
+/*
+ We don't let the compiler see the prototypes if we are compiling the
+ library because if it does it will choke on conflicting types in the
+ prototypes.
+*/
+
+#if defined(LARGEINT_PROTOS) || defined(__COMPILING_LARGEINT)
+
+#ifndef __COMPILING_LARGEINT
+/* addition/subtraction */
+LARGE_INTEGER WINAPI LargeIntegerAdd (LARGE_INTEGER, LARGE_INTEGER);
+LARGE_INTEGER WINAPI LargeIntegerSubtract (LARGE_INTEGER, LARGE_INTEGER);
+
+/* bit operations */
+LARGE_INTEGER WINAPI LargeIntegerArithmeticShift (LARGE_INTEGER, int);
+LARGE_INTEGER WINAPI LargeIntegerShiftLeft (LARGE_INTEGER, int);
+LARGE_INTEGER WINAPI LargeIntegerShiftRight (LARGE_INTEGER, int);
+LARGE_INTEGER WINAPI LargeIntegerNegate (LARGE_INTEGER);
+
+/* conversion */
+LARGE_INTEGER WINAPI ConvertLongToLargeInteger (LONG);
+LARGE_INTEGER WINAPI ConvertUlongToLargeInteger (ULONG);
+
+/* multiplication */
+LARGE_INTEGER WINAPI EnlargedIntegerMultiply (LONG, LONG);
+LARGE_INTEGER WINAPI EnlargedUnsignedMultiply (ULONG, ULONG);
+LARGE_INTEGER WINAPI ExtendedIntegerMultiply (LARGE_INTEGER, LONG);
+/* FIXME: is this not part of largeint? */
+LARGE_INTEGER WINAPI LargeIntegerMultiply (LARGE_INTEGER, LARGE_INTEGER);
+#endif /* __COMPILING_LARGEINT */
+
+#else
+
+#define LargeIntegerAdd(a,b) (LARGE_INTEGER)(_toi(a) + _toi(b))
+#define LargeIntegerSubtract(a,b) (LARGE_INTEGER)(_toi(a) - _toi(b))
+#define LargeIntegerRightShift(i,n) (LARGE_INTEGER)(_toi(i) >> (n))
+#define LargeIntegerArithmeticShift LargeIntegerRightShift
+#define LargeIntegerLeftShift(i,n) (LARGE_INTEGER)(_toi(i) << (n))
+#define LargeIntegerNegate(i) (LARGE_INTEGER)(- _toi(i))
+#define EnlargedIntegerMultiply(a,b) (LARGE_INTEGER)(_toi(a) * _toi(b))
+#define EnlargedUnsignedMultiply(a,b) (LARGE_INTEGER)(_toui(a) * _toui(b))
+#define ExtendedIntegerMultiply(a,b) (LARGE_INTEGER)(_toi(a) * _toi(b))
+/* FIXME: should this exist */
+#define LargeIntegerMultiply(a,b) (LARGE_INTEGER)(_toi(a) * _toi(b))
+#define ConvertLongToLargeInteger(l) (LARGE_INTEGER)(_toi(l))
+#define ConvertUlongToLargeInteger(ul) (LARGE_INTEGER)(_toui(ul))
+
+#endif /* LARGEINT_PROTOS || __COMPILING_LARGEINT */
+
+#ifndef __COMPILING_LARGEINT
+/* division; no macros of these because of multiple expansion */
+LARGE_INTEGER WINAPI LargeIntegerDivide (LARGE_INTEGER, LARGE_INTEGER, PLARGE_INTEGER);
+ULONG WINAPI EnlargedUnsignedDivide (ULARGE_INTEGER, ULONG, PULONG);
+LARGE_INTEGER WINAPI ExtendedLargeIntegerDivide (LARGE_INTEGER, ULONG, PULONG);
+LARGE_INTEGER WINAPI ExtendedMagicDivide (LARGE_INTEGER, LARGE_INTEGER, int);
+#endif /* __COMPILING_LARGEINT */
+
+#define LargeIntegerAnd(dest, src, m) \
+{ \
+ dest._STRUCT_NAME(u.)LowPart = s._STRUCT_NAME(u.)LowPart & m._STRUCT_NAME(u.)LowPart; \
+ dest._STRUCT_NAME(u.)HighPart = s._STRUCT_NAME(u.)HighPart & m._STRUCT_NAME(u.)HighPart; \
+}
+
+/* comparision */
+#define LargeIntegerGreaterThan(a,b) (_toi(a) > _toi(b))
+#define LargeIntegerGreaterThanOrEqual(a,b) (_toi(a) >= _toi(b))
+#define LargeIntegerEqualTo(a,b) (_toi(a) == _toi(b))
+#define LargeIntegerNotEqualTo(a,b) (_toi(a) != _toi(b))
+#define LargeIntegerLessThan(a,b) (_toi(a) < _toi(b))
+#define LargeIntegerLessThanOrEqualTo(a,b) (_toi(a) <= _toi(b))
+#define LargeIntegerGreaterThanZero(a) (_toi(a) > 0)
+#define LargeIntegerGreaterOrEqualToZero(a) ((a)._STRUCT_NAME(u.)HighPart > 0)
+#define LargeIntegerEqualToZero(a) !((a)._STRUCT_NAME(u.)LowPart | (a)._STRUCT_NAME(u.)HighPart)
+#define LargeIntegerNotEqualToZero(a) ((a)._STRUCT_NAME(u.)LowPart | (a)._STRUCT_NAME(u.)HighPart)
+#define LargeIntegerLessThanZero(a) ((a)._STRUCT_NAME(u.)HighPart < 0)
+#define LargeIntegerLessOrEqualToZero(a) (_toi(a) <= 0)
+
+#ifndef __COMPILING_LARGEINT
+#undef _toi
+#undef _toui
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _LARGEINT_H */
diff --git a/winsup/w32api/include/lm.h b/winsup/w32api/include/lm.h
new file mode 100644
index 000000000..d7a83558b
--- /dev/null
+++ b/winsup/w32api/include/lm.h
@@ -0,0 +1,22 @@
+#ifndef _LM_H
+#define _LM_H
+
+#include <lmcons.h>
+#include <lmaccess.h>
+#include <lmalert.h>
+#include <lmat.h>
+#include <lmaudit.h>
+#include <lmchdev.h>
+#include <lmconfig.h>
+#include <lmmsg.h>
+#include <lmshare.h>
+#include <lmapibuf.h>
+#include <lmremutl.h>
+#include <lmrepl.h>
+#include <lmuse.h>
+#include <lmerrlog.h>
+#include <lmsvc.h>
+#include <lmwksta.h>
+#include <lmstats.h>
+
+#endif
diff --git a/winsup/w32api/include/lmaccess.h b/winsup/w32api/include/lmaccess.h
new file mode 100644
index 000000000..8a7b9ba88
--- /dev/null
+++ b/winsup/w32api/include/lmaccess.h
@@ -0,0 +1,605 @@
+#ifndef _LMACCESS_H
+#define _LMACCESS_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+#include <lmcons.h>
+#define GROUP_SPECIALGRP_USERS L"USERS"
+#define GROUP_SPECIALGRP_ADMINS L"ADMINS"
+#define GROUP_SPECIALGRP_GUESTS L"GUESTS"
+#define GROUP_SPECIALGRP_LOCAL L"LOCAL"
+#define ACCESS_LETTERS "RWCXDAP "
+#define NETLOGON_CONTROL_QUERY 1
+#define NETLOGON_CONTROL_REPLICATE 2
+#define NETLOGON_CONTROL_SYNCHRONIZE 3
+#define NETLOGON_CONTROL_PDC_REPLICATE 4
+#define NETLOGON_CONTROL_REDISCOVER 5
+#define NETLOGON_CONTROL_TC_QUERY 6
+#define NETLOGON_CONTROL_BACKUP_CHANGE_LOG 65532
+#define NETLOGON_CONTROL_TRUNCATE_LOG 65533
+#define NETLOGON_CONTROL_SET_DBFLAG 65534
+#define NETLOGON_CONTROL_BREAKPOINT 65535
+#define UF_SCRIPT 1
+#define UF_ACCOUNTDISABLE 2
+#define UF_HOMEDIR_REQUIRED 8
+#define UF_LOCK 16
+#define UF_PASSWD_NOTREQD 32
+#define UF_PASSWD_CANT_CHANGE 64
+#define UF_TEMP_DUPLICATE_ACCOUNT 256
+#define UF_NORMAL_ACCOUNT 512
+#define UF_INTERDOMAIN_TRUST_ACCOUNT 2048
+#define UF_WORKSTATION_TRUST_ACCOUNT 4096
+#define UF_SERVER_TRUST_ACCOUNT 8192
+#define UF_MACHINE_ACCOUNT_MASK (UF_INTERDOMAIN_TRUST_ACCOUNT|UF_WORKSTATION_TRUST_ACCOUNT|UF_SERVER_TRUST_ACCOUNT)
+#define UF_ACCOUNT_TYPE_MASK (UF_TEMP_DUPLICATE_ACCOUNT|UF_NORMAL_ACCOUNT|UF_INTERDOMAIN_TRUST_ACCOUNT|UF_WORKSTATION_TRUST_ACCOUNT|UF_SERVER_TRUST_ACCOUNT)
+#define UF_DONT_EXPIRE_PASSWD 65536
+#define UF_SETTABLE_BITS (UF_SCRIPT|UF_ACCOUNTDISABLE|UF_LOCK|UF_HOMEDIR_REQUIRED|UF_PASSWD_NOTREQD|UF_PASSWD_CANT_CHANGE|UF_ACCOUNT_TYPE_MASK|UF_DONT_EXPIRE_PASSWD)
+#define FILTER_TEMP_DUPLICATE_ACCOUNT 1
+#define FILTER_NORMAL_ACCOUNT 2
+#define FILTER_INTERDOMAIN_TRUST_ACCOUNT 8
+#define FILTER_WORKSTATION_TRUST_ACCOUNT 16
+#define FILTER_SERVER_TRUST_ACCOUNT 32
+#define LG_INCLUDE_INDIRECT 1
+#define AF_OP_PRINT 1
+#define AF_OP_COMM 2
+#define AF_OP_SERVER 4
+#define AF_OP_ACCOUNTS 8
+#define AF_SETTABLE_BITS (AF_OP_PRINT|AF_OP_COMM|AF_OP_SERVER|AF_OP_ACCOUNTS)
+#define UAS_ROLE_STANDALONE 0
+#define UAS_ROLE_MEMBER 1
+#define UAS_ROLE_BACKUP 2
+#define UAS_ROLE_PRIMARY 3
+#define USER_NAME_PARMNUM 1
+#define USER_PASSWORD_PARMNUM 3
+#define USER_PASSWORD_AGE_PARMNUM 4
+#define USER_PRIV_PARMNUM 5
+#define USER_HOME_DIR_PARMNUM 6
+#define USER_COMMENT_PARMNUM 7
+#define USER_FLAGS_PARMNUM 8
+#define USER_SCRIPT_PATH_PARMNUM 9
+#define USER_AUTH_FLAGS_PARMNUM 10
+#define USER_FULL_NAME_PARMNUM 11
+#define USER_USR_COMMENT_PARMNUM 12
+#define USER_PARMS_PARMNUM 13
+#define USER_WORKSTATIONS_PARMNUM 14
+#define USER_LAST_LOGON_PARMNUM 15
+#define USER_LAST_LOGOFF_PARMNUM 16
+#define USER_ACCT_EXPIRES_PARMNUM 17
+#define USER_MAX_STORAGE_PARMNUM 18
+#define USER_UNITS_PER_WEEK_PARMNUM 19
+#define USER_LOGON_HOURS_PARMNUM 20
+#define USER_PAD_PW_COUNT_PARMNUM 21
+#define USER_NUM_LOGONS_PARMNUM 22
+#define USER_LOGON_SERVER_PARMNUM 23
+#define USER_COUNTRY_CODE_PARMNUM 24
+#define USER_CODE_PAGE_PARMNUM 25
+#define USER_PRIMARY_GROUP_PARMNUM 51
+#define USER_PROFILE 52
+#define USER_PROFILE_PARMNUM 52
+#define USER_HOME_DIR_DRIVE_PARMNUM 53
+#define USER_NAME_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+USER_NAME_PARMNUM)
+#define USER_PASSWORD_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+USER_PASSWORD_PARMNUM)
+#define USER_PASSWORD_AGE_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+USER_PASSWORD_AGE_PARMNUM)
+#define USER_PRIV_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+USER_PRIV_PARMNUM)
+#define USER_HOME_DIR_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+USER_HOME_DIR_PARMNUM)
+#define USER_COMMENT_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+USER_COMMENT_PARMNUM)
+#define USER_FLAGS_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+USER_FLAGS_PARMNUM)
+#define USER_SCRIPT_PATH_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+USER_SCRIPT_PATH_PARMNUM)
+#define USER_AUTH_FLAGS_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+USER_AUTH_FLAGS_PARMNUM)
+#define USER_FULL_NAME_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+USER_FULL_NAME_PARMNUM)
+#define USER_USR_COMMENT_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+USER_USR_COMMENT_PARMNUM)
+#define USER_PARMS_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+USER_PARMS_PARMNUM)
+#define USER_WORKSTATIONS_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+USER_WORKSTATIONS_PARMNUM)
+#define USER_LAST_LOGON_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+USER_LAST_LOGON_PARMNUM)
+#define USER_LAST_LOGOFF_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+USER_LAST_LOGOFF_PARMNUM)
+#define USER_ACCT_EXPIRES_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+USER_ACCT_EXPIRES_PARMNUM)
+#define USER_MAX_STORAGE_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+USER_MAX_STORAGE_PARMNUM)
+#define USER_UNITS_PER_WEEK_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+USER_UNITS_PER_WEEK_PARMNUM)
+#define USER_LOGON_HOURS_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+USER_LOGON_HOURS_PARMNUM)
+#define USER_PAD_PW_COUNT_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+USER_PAD_PW_COUNT_PARMNUM)
+#define USER_NUM_LOGONS_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+USER_NUM_LOGONS_PARMNUM)
+#define USER_LOGON_SERVER_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+USER_LOGON_SERVER_PARMNUM)
+#define USER_COUNTRY_CODE_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+USER_COUNTRY_CODE_PARMNUM)
+#define USER_CODE_PAGE_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+USER_CODE_PAGE_PARMNUM)
+#define USER_PRIMARY_GROUP_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+USER_PRIMARY_GROUP_PARMNUM)
+#define USER_POSIX_ID_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+USER_POSIX_ID_PARMNUM)
+#define USER_HOME_DIR_DRIVE_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+USER_HOME_DIR_DRIVE_PARMNUM)
+#define NULL_USERSETINFO_PASSWD " "
+#define TIMEQ_FOREVER ((ULONG)-1)
+#define USER_MAXSTORAGE_UNLIMITED ((ULONG)-1)
+#define USER_NO_LOGOFF ((ULONG)-1L)
+#define UNITS_PER_DAY 24
+#define UNITS_PER_WEEK 168
+#define USER_PRIV_MASK 3
+#define USER_PRIV_GUEST 0
+#define USER_PRIV_USER 1
+#define USER_PRIV_ADMIN 2
+#define MAX_PASSWD_LEN PWLEN
+#define DEF_MIN_PWLEN 6
+#define DEF_PWUNIQUENESS 5
+#define DEF_MAX_PWHIST 8
+#define DEF_MAX_PWAGE TIMEQ_FOREVER
+#define DEF_MIN_PWAGE 0
+#define DEF_FORCE_LOGOFF (ULONG)0xffffffff
+#define DEF_MAX_BADPW 0
+#define ONE_DAY 86400
+#define VALIDATED_LOGON 0
+#define PASSWORD_EXPIRED 2
+#define NON_VALIDATED_LOGON 3
+#define VALID_LOGOFF 1
+#define MODALS_MIN_PASSWD_LEN_PARMNUM 1
+#define MODALS_MAX_PASSWD_AGE_PARMNUM 2
+#define MODALS_MIN_PASSWD_AGE_PARMNUM 3
+#define MODALS_FORCE_LOGOFF_PARMNUM 4
+#define MODALS_PASSWD_HIST_LEN_PARMNUM 5
+#define MODALS_ROLE_PARMNUM 6
+#define MODALS_PRIMARY_PARMNUM 7
+#define MODALS_DOMAIN_NAME_PARMNUM 8
+#define MODALS_DOMAIN_ID_PARMNUM 9
+#define MODALS_LOCKOUT_DURATION_PARMNUM 10
+#define MODALS_LOCKOUT_OBSERVATION_WINDOW_PARMNUM 11
+#define MODALS_LOCKOUT_THRESHOLD_PARMNUM 12
+#define MODALS_MIN_PASSWD_LEN_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+MODALS_MIN_PASSWD_LEN_PARMNUM)
+#define MODALS_MAX_PASSWD_AGE_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+MODALS_MAX_PASSWD_AGE_PARMNUM)
+#define MODALS_MIN_PASSWD_AGE_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+MODALS_MIN_PASSWD_AGE_PARMNUM)
+#define MODALS_FORCE_LOGOFF_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+MODALS_FORCE_LOGOFF_PARMNUM)
+#define MODALS_PASSWD_HIST_LEN_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+MODALS_PASSWD_HIST_LEN_PARMNUM)
+#define MODALS_ROLE_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+MODALS_ROLE_PARMNUM)
+#define MODALS_PRIMARY_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+MODALS_PRIMARY_PARMNUM)
+#define MODALS_DOMAIN_NAME_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+MODALS_DOMAIN_NAME_PARMNUM)
+#define MODALS_DOMAIN_ID_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+MODALS_DOMAIN_ID_PARMNUM)
+#define GROUPIDMASK 0x8000
+#define GROUP_ALL_PARMNUM 0
+#define GROUP_NAME_PARMNUM 1
+#define GROUP_COMMENT_PARMNUM 2
+#define GROUP_ATTRIBUTES_PARMNUM 3
+#define GROUP_ALL_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+GROUP_ALL_PARMNUM)
+#define GROUP_NAME_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+GROUP_NAME_PARMNUM)
+#define GROUP_COMMENT_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+GROUP_COMMENT_PARMNUM)
+#define GROUP_ATTRIBUTES_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+GROUP_ATTRIBUTES_PARMNUM)
+#define GROUP_POSIX_ID_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+GROUP_POSIX_ID_PARMNUM)
+#define LOCALGROUP_NAME_PARMNUM 1
+#define LOCALGROUP_COMMENT_PARMNUM 2
+#define MAXPERMENTRIES 64
+#define ACCESS_NONE 0
+#define ACCESS_ALL (ACCESS_READ|ACCESS_WRITE|ACCESS_CREATE|ACCESS_EXEC|ACCESS_DELETE|ACCESS_ATRIB|ACCESS_PERM)
+#define ACCESS_READ 1
+#define ACCESS_WRITE 2
+#define ACCESS_CREATE 4
+#define ACCESS_EXEC 8
+#define ACCESS_DELETE 16
+#define ACCESS_ATRIB 32
+#define ACCESS_PERM 64
+#define ACCESS_GROUP 0x8000
+#define ACCESS_AUDIT 1
+#define ACCESS_SUCCESS_OPEN 16
+#define ACCESS_SUCCESS_WRITE 32
+#define ACCESS_SUCCESS_DELETE 64
+#define ACCESS_SUCCESS_ACL 128
+#define ACCESS_SUCCESS_MASK 240
+#define ACCESS_FAIL_OPEN 256
+#define ACCESS_FAIL_WRITE 512
+#define ACCESS_FAIL_DELETE 1024
+#define ACCESS_FAIL_ACL 2048
+#define ACCESS_FAIL_MASK 3840
+#define ACCESS_FAIL_SHIFT 4
+#define ACCESS_RESOURCE_NAME_PARMNUM 1
+#define ACCESS_ATTR_PARMNUM 2
+#define ACCESS_COUNT_PARMNUM 3
+#define ACCESS_ACCESS_LIST_PARMNUM 4
+#define ACCESS_RESOURCE_NAME_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+ACCESS_RESOURCE_NAME_PARMNUM)
+#define ACCESS_ATTR_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+ACCESS_ATTR_PARMNUM)
+#define ACCESS_COUNT_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+ACCESS_COUNT_PARMNUM)
+#define ACCESS_ACCESS_LIST_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+ACCESS_ACCESS_LIST_PARMNUM)
+#define NETLOGON_REPLICATION_NEEDED 1
+#define NETLOGON_REPLICATION_IN_PROGRESS 2
+#define NETLOGON_FULL_SYNC_REPLICATION 4
+#define NETLOGON_REDO_NEEDED 8
+
+typedef struct _USER_INFO_0 { LPWSTR usri0_name; }USER_INFO_0,*PUSER_INFO_0,*LPUSER_INFO_0;
+typedef struct _USER_INFO_1 {
+ LPWSTR usri1_name;
+ LPWSTR usri1_password;
+ DWORD usri1_password_age;
+ DWORD usri1_priv;
+ LPWSTR usri1_home_dir;
+ LPWSTR usri1_comment;
+ DWORD usri1_flags;
+ LPWSTR usri1_script_path;
+}USER_INFO_1,*PUSER_INFO_1,*LPUSER_INFO_1;
+typedef struct _USER_INFO_2 {
+ LPWSTR usri2_name;
+ LPWSTR usri2_password;
+ DWORD usri2_password_age;
+ DWORD usri2_priv;
+ LPWSTR usri2_home_dir;
+ LPWSTR usri2_comment;
+ DWORD usri2_flags;
+ LPWSTR usri2_script_path;
+ DWORD usri2_auth_flags;
+ LPWSTR usri2_full_name;
+ LPWSTR usri2_usr_comment;
+ LPWSTR usri2_parms;
+ LPWSTR usri2_workstations;
+ DWORD usri2_last_logon;
+ DWORD usri2_last_logoff;
+ DWORD usri2_acct_expires;
+ DWORD usri2_max_storage;
+ DWORD usri2_units_per_week;
+ PBYTE usri2_logon_hours;
+ DWORD usri2_bad_pw_count;
+ DWORD usri2_num_logons;
+ LPWSTR usri2_logon_server;
+ DWORD usri2_country_code;
+ DWORD usri2_code_page;
+}USER_INFO_2,*PUSER_INFO_2,*LPUSER_INFO_2;
+typedef struct _USER_INFO_3 {
+ LPWSTR usri3_name;
+ LPWSTR usri3_password;
+ DWORD usri3_password_age;
+ DWORD usri3_priv;
+ LPWSTR usri3_home_dir;
+ LPWSTR usri3_comment;
+ DWORD usri3_flags;
+ LPWSTR usri3_script_path;
+ DWORD usri3_auth_flags;
+ LPWSTR usri3_full_name;
+ LPWSTR usri3_usr_comment;
+ LPWSTR usri3_parms;
+ LPWSTR usri3_workstations;
+ DWORD usri3_last_logon;
+ DWORD usri3_last_logoff;
+ DWORD usri3_acct_expires;
+ DWORD usri3_max_storage;
+ DWORD usri3_units_per_week;
+ PBYTE usri3_logon_hours;
+ DWORD usri3_bad_pw_count;
+ DWORD usri3_num_logons;
+ LPWSTR usri3_logon_server;
+ DWORD usri3_country_code;
+ DWORD usri3_code_page;
+ DWORD usri3_user_id;
+ DWORD usri3_primary_group_id;
+ LPWSTR usri3_profile;
+ LPWSTR usri3_home_dir_drive;
+ DWORD usri3_password_expired;
+}USER_INFO_3,*PUSER_INFO_3,*LPUSER_INFO_3;
+typedef struct _USER_INFO_10 {
+ LPWSTR usri10_name;
+ LPWSTR usri10_comment;
+ LPWSTR usri10_usr_comment;
+ LPWSTR usri10_full_name;
+}USER_INFO_10,*PUSER_INFO_10,*LPUSER_INFO_10;
+typedef struct _USER_INFO_11 {
+ LPWSTR usri11_name;
+ LPWSTR usri11_comment;
+ LPWSTR usri11_usr_comment;
+ LPWSTR usri11_full_name;
+ DWORD usri11_priv;
+ DWORD usri11_auth_flags;
+ DWORD usri11_password_age;
+ LPWSTR usri11_home_dir;
+ LPWSTR usri11_parms;
+ DWORD usri11_last_logon;
+ DWORD usri11_last_logoff;
+ DWORD usri11_bad_pw_count;
+ DWORD usri11_num_logons;
+ LPWSTR usri11_logon_server;
+ DWORD usri11_country_code;
+ LPWSTR usri11_workstations;
+ DWORD usri11_max_storage;
+ DWORD usri11_units_per_week;
+ PBYTE usri11_logon_hours;
+ DWORD usri11_code_page;
+}USER_INFO_11,*PUSER_INFO_11,*LPUSER_INFO_11;
+typedef struct _USER_INFO_20 {
+ LPWSTR usri20_name;
+ LPWSTR usri20_full_name;
+ LPWSTR usri20_comment;
+ DWORD usri20_flags;
+ DWORD usri20_user_id;
+}USER_INFO_20,*PUSER_INFO_20,*LPUSER_INFO_20;
+typedef struct _USER_INFO_21 {
+ BYTE usri21_password[ENCRYPTED_PWLEN];
+}USER_INFO_21,*PUSER_INFO_21,*LPUSER_INFO_21;
+typedef struct _USER_INFO_22 {
+ LPWSTR usri22_name;
+ BYTE usri22_password[ENCRYPTED_PWLEN];
+ DWORD usri22_password_age;
+ DWORD usri22_priv;
+ LPWSTR usri22_home_dir;
+ LPWSTR usri22_comment;
+ DWORD usri22_flags;
+ LPWSTR usri22_script_path;
+ DWORD usri22_auth_flags;
+ LPWSTR usri22_full_name;
+ LPWSTR usri22_usr_comment;
+ LPWSTR usri22_parms;
+ LPWSTR usri22_workstations;
+ DWORD usri22_last_logon;
+ DWORD usri22_last_logoff;
+ DWORD usri22_acct_expires;
+ DWORD usri22_max_storage;
+ DWORD usri22_units_per_week;
+ PBYTE usri22_logon_hours;
+ DWORD usri22_bad_pw_count;
+ DWORD usri22_num_logons;
+ LPWSTR usri22_logon_server;
+ DWORD usri22_country_code;
+ DWORD usri22_code_page;
+ }USER_INFO_22,*PUSER_INFO_22,*LPUSER_INFO_22;
+typedef struct _USER_INFO_1003 {
+ LPWSTR usri1003_password;
+} USER_INFO_1003,*PUSER_INFO_1003,*LPUSER_INFO_1003;
+typedef struct _USER_INFO_1005 {
+ DWORD usri1005_priv;
+} USER_INFO_1005,*PUSER_INFO_1005,*LPUSER_INFO_1005;
+typedef struct _USER_INFO_1006 {
+ LPWSTR usri1006_home_dir;
+} USER_INFO_1006,*PUSER_INFO_1006,*LPUSER_INFO_1006;
+typedef struct _USER_INFO_1007 {
+ LPWSTR usri1007_comment;
+} USER_INFO_1007,*PUSER_INFO_1007,*LPUSER_INFO_1007;
+typedef struct _USER_INFO_1008 {
+ DWORD usri1008_flags;
+} USER_INFO_1008,*PUSER_INFO_1008,*LPUSER_INFO_1008;
+typedef struct _USER_INFO_1009 {
+ LPWSTR usri1009_script_path;
+} USER_INFO_1009,*PUSER_INFO_1009,*LPUSER_INFO_1009;
+typedef struct _USER_INFO_1010 {
+ DWORD usri1010_auth_flags;
+} USER_INFO_1010,*PUSER_INFO_1010,*LPUSER_INFO_1010;
+typedef struct _USER_INFO_1011 {
+ LPWSTR usri1011_full_name;
+} USER_INFO_1011,*PUSER_INFO_1011,*LPUSER_INFO_1011;
+typedef struct _USER_INFO_1012 {
+ LPWSTR usri1012_usr_comment;
+} USER_INFO_1012,*PUSER_INFO_1012,*LPUSER_INFO_1012;
+typedef struct _USER_INFO_1013 {
+ LPWSTR usri1013_parms;
+} USER_INFO_1013,*PUSER_INFO_1013,*LPUSER_INFO_1013;
+typedef struct _USER_INFO_1014 {
+ LPWSTR usri1014_workstations;
+} USER_INFO_1014,*PUSER_INFO_1014,*LPUSER_INFO_1014;
+typedef struct _USER_INFO_1017 {
+ DWORD usri1017_acct_expires;
+} USER_INFO_1017,*PUSER_INFO_1017,*LPUSER_INFO_1017;
+typedef struct _USER_INFO_1018 {
+ DWORD usri1018_max_storage;
+} USER_INFO_1018,*PUSER_INFO_1018,*LPUSER_INFO_1018;
+typedef struct _USER_INFO_1020 {
+ DWORD usri1020_units_per_week;
+ PBYTE usri1020_logon_hours;
+} USER_INFO_1020,*PUSER_INFO_1020,*LPUSER_INFO_1020;
+typedef struct _USER_INFO_1023 {
+ LPWSTR usri1023_logon_server;
+} USER_INFO_1023,*PUSER_INFO_1023,*LPUSER_INFO_1023;
+typedef struct _USER_INFO_1024 {
+ DWORD usri1024_country_code;
+} USER_INFO_1024,*PUSER_INFO_1024,*LPUSER_INFO_1024;
+typedef struct _USER_INFO_1025 {
+ DWORD usri1025_code_page;
+} USER_INFO_1025,*PUSER_INFO_1025,*LPUSER_INFO_1025;
+typedef struct _USER_INFO_1051 {
+ DWORD usri1051_primary_group_id;
+} USER_INFO_1051,*PUSER_INFO_1051,*LPUSER_INFO_1051;
+typedef struct _USER_INFO_1052 {
+ LPWSTR usri1052_profile;
+} USER_INFO_1052,*PUSER_INFO_1052,*LPUSER_INFO_1052;
+typedef struct _USER_INFO_1053 {
+ LPWSTR usri1053_home_dir_drive;
+} USER_INFO_1053,*PUSER_INFO_1053,*LPUSER_INFO_1053;
+typedef struct _USER_MODALS_INFO_0 {
+ DWORD usrmod0_min_passwd_len;
+ DWORD usrmod0_max_passwd_age;
+ DWORD usrmod0_min_passwd_age;
+ DWORD usrmod0_force_logoff;
+ DWORD usrmod0_password_hist_len;
+}USER_MODALS_INFO_0,*PUSER_MODALS_INFO_0,*LPUSER_MODALS_INFO_0;
+typedef struct _USER_MODALS_INFO_1 {
+ DWORD usrmod1_role;
+ LPWSTR usrmod1_primary;
+}USER_MODALS_INFO_1,*PUSER_MODALS_INFO_1,*LPUSER_MODALS_INFO_1;
+typedef struct _USER_MODALS_INFO_2 {
+ LPWSTR usrmod2_domain_name;
+ PSID usrmod2_domain_id;
+}USER_MODALS_INFO_2,*PUSER_MODALS_INFO_2,*LPUSER_MODALS_INFO_2;
+typedef struct _USER_MODALS_INFO_3 {
+ DWORD usrmod3_lockout_duration;
+ DWORD usrmod3_lockout_observation_window;
+ DWORD usrmod3_lockout_threshold;
+}USER_MODALS_INFO_3,*PUSER_MODALS_INFO_3,*LPUSER_MODALS_INFO_3;
+typedef struct _USER_MODALS_INFO_1001 {
+ DWORD usrmod1001_min_passwd_len;
+} USER_MODALS_INFO_1001,*PUSER_MODALS_INFO_1001,*LPUSER_MODALS_INFO_1001;
+typedef struct _USER_MODALS_INFO_1002 {
+ DWORD usrmod1002_max_passwd_age;
+} USER_MODALS_INFO_1002,*PUSER_MODALS_INFO_1002,*LPUSER_MODALS_INFO_1002;
+typedef struct _USER_MODALS_INFO_1003 {
+ DWORD usrmod1003_min_passwd_age;
+} USER_MODALS_INFO_1003,*PUSER_MODALS_INFO_1003,*LPUSER_MODALS_INFO_1003;
+typedef struct _USER_MODALS_INFO_1004 {
+ DWORD usrmod1004_force_logoff;
+} USER_MODALS_INFO_1004,*PUSER_MODALS_INFO_1004,*LPUSER_MODALS_INFO_1004;
+typedef struct _USER_MODALS_INFO_1005 {
+ DWORD usrmod1005_password_hist_len;
+} USER_MODALS_INFO_1005,*PUSER_MODALS_INFO_1005,*LPUSER_MODALS_INFO_1005;
+typedef struct _USER_MODALS_INFO_1006 {
+ DWORD usrmod1006_role;
+} USER_MODALS_INFO_1006,*PUSER_MODALS_INFO_1006,*LPUSER_MODALS_INFO_1006;
+typedef struct _USER_MODALS_INFO_1007 {
+ LPWSTR usrmod1007_primary;
+} USER_MODALS_INFO_1007,*PUSER_MODALS_INFO_1007,*LPUSER_MODALS_INFO_1007;
+typedef struct _GROUP_INFO_0 {
+ LPWSTR grpi0_name;
+}GROUP_INFO_0,*PGROUP_INFO_0,*LPGROUP_INFO_0;
+typedef struct _GROUP_INFO_1 {
+ LPWSTR grpi1_name;
+ LPWSTR grpi1_comment;
+}GROUP_INFO_1,*PGROUP_INFO_1,*LPGROUP_INFO_1;
+typedef struct _GROUP_INFO_2 {
+ LPWSTR grpi2_name;
+ LPWSTR grpi2_comment;
+ DWORD grpi2_group_id;
+ DWORD grpi2_attributes;
+}GROUP_INFO_2,*PGROUP_INFO_2;
+typedef struct _GROUP_INFO_1002 {
+ LPWSTR grpi1002_comment;
+} GROUP_INFO_1002,*PGROUP_INFO_1002,*LPGROUP_INFO_1002;
+typedef struct _GROUP_INFO_1005 {
+ DWORD grpi1005_attributes;
+} GROUP_INFO_1005,*PGROUP_INFO_1005,*LPGROUP_INFO_1005;
+typedef struct _GROUP_USERS_INFO_0 {
+ LPWSTR grui0_name;
+} GROUP_USERS_INFO_0,*PGROUP_USERS_INFO_0,*LPGROUP_USERS_INFO_0;
+typedef struct _GROUP_USERS_INFO_1 {
+ LPWSTR grui1_name;
+ DWORD grui1_attributes;
+} GROUP_USERS_INFO_1,*PGROUP_USERS_INFO_1,*LPGROUP_USERS_INFO_1;
+typedef struct _LOCALGROUP_INFO_0 {
+ LPWSTR lgrpi0_name;
+}LOCALGROUP_INFO_0,*PLOCALGROUP_INFO_0,*LPLOCALGROUP_INFO_0;
+typedef struct _LOCALGROUP_INFO_1 {
+ LPWSTR lgrpi1_name;
+ LPWSTR lgrpi1_comment;
+}LOCALGROUP_INFO_1,*PLOCALGROUP_INFO_1,*LPLOCALGROUP_INFO_1;
+typedef struct _LOCALGROUP_INFO_1002 {
+ LPWSTR lgrpi1002_comment;
+}LOCALGROUP_INFO_1002,*PLOCALGROUP_INFO_1002,*LPLOCALGROUP_INFO_1002;
+typedef struct _LOCALGROUP_MEMBERS_INFO_0 {
+ PSID lgrmi0_sid;
+} LOCALGROUP_MEMBERS_INFO_0,*PLOCALGROUP_MEMBERS_INFO_0,*LPLOCALGROUP_MEMBERS_INFO_0;
+typedef struct _LOCALGROUP_MEMBERS_INFO_1 {
+ PSID lgrmi1_sid;
+ SID_NAME_USE lgrmi1_sidusage;
+ LPWSTR lgrmi1_name;
+} LOCALGROUP_MEMBERS_INFO_1,*PLOCALGROUP_MEMBERS_INFO_1,*LPLOCALGROUP_MEMBERS_INFO_1;
+typedef struct _LOCALGROUP_MEMBERS_INFO_2 {
+ PSID lgrmi2_sid;
+ SID_NAME_USE lgrmi2_sidusage;
+ LPWSTR lgrmi2_domainandname;
+} LOCALGROUP_MEMBERS_INFO_2,*PLOCALGROUP_MEMBERS_INFO_2,*LPLOCALGROUP_MEMBERS_INFO_2;
+typedef struct _LOCALGROUP_MEMBERS_INFO_3 {
+ LPWSTR lgrmi3_domainandname;
+} LOCALGROUP_MEMBERS_INFO_3,*PLOCALGROUP_MEMBERS_INFO_3,
+*LPLOCALGROUP_MEMBERS_INFO_3;
+typedef struct _LOCALGROUP_USERS_INFO_0 {
+ LPWSTR lgrui0_name;
+} LOCALGROUP_USERS_INFO_0,*PLOCALGROUP_USERS_INFO_0,*LPLOCALGROUP_USERS_INFO_0;
+typedef struct _NET_DISPLAY_USER {
+ LPWSTR usri1_name;
+ LPWSTR usri1_comment;
+ DWORD usri1_flags;
+ LPWSTR usri1_full_name;
+ DWORD usri1_user_id;
+ DWORD usri1_next_index;
+} NET_DISPLAY_USER,*PNET_DISPLAY_USER;
+typedef struct _NET_DISPLAY_MACHINE {
+ LPWSTR usri2_name;
+ LPWSTR usri2_comment;
+ DWORD usri2_flags;
+ DWORD usri2_user_id;
+ DWORD usri2_next_index;
+} NET_DISPLAY_MACHINE,*PNET_DISPLAY_MACHINE;
+typedef struct _NET_DISPLAY_GROUP {
+ LPWSTR grpi3_name;
+ LPWSTR grpi3_comment;
+ DWORD grpi3_group_id;
+ DWORD grpi3_attributes;
+ DWORD grpi3_next_index;
+} NET_DISPLAY_GROUP,*PNET_DISPLAY_GROUP;
+typedef struct _ACCESS_INFO_0 {
+ LPTSTR acc0_resource_name;
+}ACCESS_INFO_0,*PACCESS_INFO_0,*LPACCESS_INFO_0;
+typedef struct _ACCESS_INFO_1 {
+ LPTSTR acc1_resource_name;
+ DWORD acc1_attr;
+ DWORD acc1_count;
+}ACCESS_INFO_1,*PACCESS_INFO_1,*LPACCESS_INFO_1;
+typedef struct _ACCESS_INFO_1002 {
+ DWORD acc1002_attr;
+} ACCESS_INFO_1002,*PACCESS_INFO_1002,*LPACCESS_INFO_1002;
+typedef struct _ACCESS_LIST {
+ LPTSTR acl_ugname;
+ DWORD acl_access;
+}ACCESS_LIST,*PACCESS_LIST,*LPACCESS_LIST;
+typedef struct _NETLOGON_INFO_1 {
+ DWORD netlog1_flags;
+ NET_API_STATUS netlog1_pdc_connection_status;
+} NETLOGON_INFO_1,*PNETLOGON_INFO_1;
+typedef struct _NETLOGON_INFO_2 {
+ DWORD netlog2_flags;
+ NET_API_STATUS netlog2_pdc_connection_status;
+ LPWSTR netlog2_trusted_dc_name;
+ NET_API_STATUS netlog2_tc_connection_status;
+} NETLOGON_INFO_2,*PNETLOGON_INFO_2;
+typedef struct _NETLOGON_INFO_3 {
+ DWORD netlog3_flags;
+ DWORD netlog3_logon_attempts;
+ DWORD netlog3_reserved1;
+ DWORD netlog3_reserved2;
+ DWORD netlog3_reserved3;
+ DWORD netlog3_reserved4;
+ DWORD netlog3_reserved5;
+} NETLOGON_INFO_3,*PNETLOGON_INFO_3;
+
+#if 0
+/* MS has these defined, but the RxNetAccessXX functions aren't documented nor do
+ they exist in any headers */
+#define NetAccessAdd RxNetAccessAdd
+#define NetAccessEnum RxNetAccessEnum
+#define NetAccessGetInfo RxNetAccessGetInfo
+#define NetAccessSetInfo RxNetAccessSetInfo
+#define NetAccessDel RxNetAccessDel
+#define NetAccessGetUserPerms RxNetAccessGetUserPerms
+/* These are obsolete */
+NET_API_STATUS WINAPI NetAccessAdd(LPTSTR,DWORD,PBYTE,PDWORD);
+NET_API_STATUS WINAPI NetAccessEnum(LPTSTR,LPTSTR,DWORD,DWORD,PBYTE*,DWORD,PDWORD,PDWORD,PDWORD);
+NET_API_STATUS WINAPI NetAccessGetInfo(LPTSTR,LPTSTR,DWORD,PBYTE*);
+NET_API_STATUS WINAPI NetAccessSetInfo(LPTSTR,LPTSTR,DWORD,PBYTE,PDWORD);
+NET_API_STATUS WINAPI NetAccessDel(LPTSTR,LPTSTR);
+NET_API_STATUS WINAPI NetAccessGetUserPerms(LPTSTR,LPTSTR,LPTSTR,PDWORD);
+#endif
+
+NET_API_STATUS WINAPI NetUserAdd(LPWSTR,DWORD,PBYTE,PDWORD);
+NET_API_STATUS WINAPI NetUserEnum(LPWSTR,DWORD,DWORD,PBYTE*,DWORD,PDWORD,PDWORD,PDWORD);
+NET_API_STATUS WINAPI NetUserGetInfo(LPWSTR,LPWSTR,DWORD,PBYTE*);
+NET_API_STATUS WINAPI NetUserSetInfo(LPWSTR,LPWSTR,DWORD,PBYTE,PDWORD);
+NET_API_STATUS WINAPI NetUserDel(LPWSTR,LPWSTR);
+NET_API_STATUS WINAPI NetUserGetGroups(LPWSTR,LPWSTR,DWORD,PBYTE*,DWORD,PDWORD,PDWORD);
+NET_API_STATUS WINAPI NetUserSetGroups(LPWSTR,LPWSTR,DWORD,PBYTE,DWORD);
+NET_API_STATUS WINAPI NetUserGetLocalGroups(LPWSTR,LPWSTR,DWORD,DWORD,PBYTE*,DWORD,PDWORD,PDWORD);
+NET_API_STATUS WINAPI NetUserModalsGet(LPWSTR,DWORD,PBYTE*);
+NET_API_STATUS WINAPI NetUserModalsSet(LPWSTR,DWORD,PBYTE,PDWORD);
+NET_API_STATUS WINAPI NetUserChangePassword(LPWSTR,LPWSTR,LPWSTR,LPWSTR);
+NET_API_STATUS WINAPI NetGroupAdd(LPWSTR,DWORD,PBYTE,PDWORD);
+NET_API_STATUS WINAPI NetGroupAddUser(LPWSTR,LPWSTR,LPWSTR);
+NET_API_STATUS WINAPI NetGroupEnum(LPWSTR,DWORD,PBYTE*,DWORD,PDWORD,PDWORD,PDWORD);
+NET_API_STATUS WINAPI NetGroupGetInfo(LPWSTR,LPWSTR,DWORD,PBYTE*);
+NET_API_STATUS WINAPI NetGroupSetInfo(LPWSTR,LPWSTR,DWORD,PBYTE,PDWORD);
+NET_API_STATUS WINAPI NetGroupDel(LPWSTR,LPWSTR);
+NET_API_STATUS WINAPI NetGroupDelUser(LPWSTR,LPWSTR,LPWSTR);
+NET_API_STATUS WINAPI NetGroupGetUsers(LPWSTR,LPWSTR,DWORD,PBYTE*,DWORD,PDWORD,PDWORD,PDWORD);
+NET_API_STATUS WINAPI NetGroupSetUsers(LPWSTR,LPWSTR,DWORD,PBYTE,DWORD);
+NET_API_STATUS WINAPI NetLocalGroupAdd(LPWSTR,DWORD,PBYTE,PDWORD);
+NET_API_STATUS WINAPI NetLocalGroupAddMember(LPWSTR,LPWSTR,PSID);
+NET_API_STATUS WINAPI NetLocalGroupEnum(LPWSTR,DWORD,PBYTE*,DWORD,PDWORD,PDWORD,PDWORD);
+NET_API_STATUS WINAPI NetLocalGroupGetInfo(LPWSTR,LPWSTR,DWORD,PBYTE*);
+NET_API_STATUS WINAPI NetLocalGroupSetInfo(LPWSTR,LPWSTR,DWORD,PBYTE,PDWORD);
+NET_API_STATUS WINAPI NetLocalGroupDel(LPWSTR,LPWSTR);
+NET_API_STATUS WINAPI NetLocalGroupDelMember(LPWSTR,LPWSTR,PSID);
+NET_API_STATUS WINAPI NetLocalGroupGetMembers(LPWSTR,LPWSTR,DWORD,PBYTE*,DWORD,
+PDWORD,PDWORD,PDWORD);
+NET_API_STATUS WINAPI NetLocalGroupSetMembers(LPWSTR,LPWSTR,DWORD,PBYTE,DWORD);
+NET_API_STATUS WINAPI NetLocalGroupAddMembers(LPWSTR,LPWSTR,DWORD,PBYTE,DWORD);
+NET_API_STATUS WINAPI NetLocalGroupDelMembers(LPWSTR,LPWSTR,DWORD,PBYTE,DWORD);
+NET_API_STATUS WINAPI NetQueryDisplayInformation(LPWSTR,DWORD,DWORD,DWORD,DWORD,PDWORD,PVOID*);
+NET_API_STATUS WINAPI NetGetDisplayInformationIndex(LPWSTR,DWORD,LPWSTR,PDWORD);
+NET_API_STATUS WINAPI NetGetDCName(LPWSTR,LPWSTR,PBYTE*);
+NET_API_STATUS WINAPI NetGetAnyDCName(LPWSTR,LPWSTR,PBYTE*);
+NET_API_STATUS WINAPI I_NetLogonControl(LPWSTR,DWORD,DWORD,PBYTE*);
+NET_API_STATUS WINAPI I_NetLogonControl2(LPWSTR,DWORD,DWORD,PBYTE,PBYTE*);
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/winsup/w32api/include/lmalert.h b/winsup/w32api/include/lmalert.h
new file mode 100644
index 000000000..d4899bc30
--- /dev/null
+++ b/winsup/w32api/include/lmalert.h
@@ -0,0 +1,56 @@
+#ifndef _LMALERT_H
+#define _LMALERT_H
+#define ALERTER_MAILSLOT TEXT("\\\\.\\MAILSLOT\\Alerter")
+#define ALERT_PRINT_EVENT TEXT("PRINTING")
+#define ALERT_MESSAGE_EVENT TEXT("MESSAGE")
+#define ALERT_ERRORLOG_EVENT TEXT("ERRORLOG")
+#define ALERT_ADMIN_EVENT TEXT("ADMIN")
+#define ALERT_USER_EVENT TEXT("USER")
+#define ALERT_OTHER_INFO(x) ((PBYTE)(x)+sizeof(STD_ALERT))
+#define ALERT_VAR_DATA(p) ((PBYTE)(p)+sizeof(*p))
+#define PRJOB_QSTATUS 3
+#define PRJOB_DEVSTATUS 508
+#define PRJOB_COMPLETE 4
+#define PRJOB_INTERV 8
+#define PRJOB_ 16
+#define PRJOB_DESTOFFLINE 32
+#define PRJOB_DESTPAUSED 64
+#define PRJOB_NOTIFY 128
+#define PRJOB_DESTNOPAPER 256
+#define PRJOB_DELETED 32768
+#define PRJOB_QS_QUEUED 0
+#define PRJOB_QS_PAUSED 1
+#define PRJOB_QS_SPOOLING 2
+#define PRJOB_QS_PRINTING 3
+#ifdef __cplusplus
+extern "C" {
+#endif
+typedef struct _ADMIN_OTHER_INFO {
+ DWORD alrtad_errcode;
+ DWORD alrtad_numstrings;
+}ADMIN_OTHER_INFO,*PADMIN_OTHER_INFO,*LPADMIN_OTHER_INFO;
+typedef struct _STD_ALERT {
+ DWORD alrt_timestamp;
+ TCHAR alrt_eventname[EVLEN+1];
+ TCHAR alrt_servicename[SNLEN+1];
+}STD_ALERT,*PSTD_ALERT,*LPSTD_ALERT;
+typedef struct _ERRLOG_OTHER_INFO {
+ DWORD alrter_errcode;
+ DWORD alrter_offset;
+}ERRLOG_OTHER_INFO,*PERRLOG_OTHER_INFO,*LPERRLOG_OTHER_INFO;
+typedef struct _PRINT_OTHER_INFO {
+ DWORD alrtpr_jobid;
+ DWORD alrtpr_status;
+ DWORD alrtpr_submitted;
+ DWORD alrtpr_size;
+}PRINT_OTHER_INFO,*PPRINT_OTHER_INFO,*LPPRINT_OTHER_INFO;
+typedef struct _USER_OTHER_INFO {
+ DWORD alrtus_errcode;
+ DWORD alrtus_numstrings;
+}USER_OTHER_INFO,*PUSER_OTHER_INFO,*LPUSER_OTHER_INFO;
+NET_API_STATUS WINAPI NetAlertRaise(LPCWSTR,PVOID,DWORD);
+NET_API_STATUS WINAPI NetAlertRaiseEx(LPCWSTR,PVOID,DWORD,LPCWSTR);
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/winsup/w32api/include/lmapibuf.h b/winsup/w32api/include/lmapibuf.h
new file mode 100644
index 000000000..2340d6d10
--- /dev/null
+++ b/winsup/w32api/include/lmapibuf.h
@@ -0,0 +1,14 @@
+#ifndef _LMAPIBUF_H
+#define _LMAPIBUF_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+NET_API_STATUS WINAPI NetApiBufferAllocate(DWORD,PVOID*);
+NET_API_STATUS WINAPI NetApiBufferFree(PVOID);
+NET_API_STATUS WINAPI NetApiBufferReallocate(PVOID,DWORD,PVOID*);
+NET_API_STATUS WINAPI NetApiBufferSize(PVOID,PDWORD);
+NET_API_STATUS WINAPI NetapipBufferAllocate(DWORD,PVOID*);
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/winsup/w32api/include/lmat.h b/winsup/w32api/include/lmat.h
new file mode 100644
index 000000000..4d2cf8c11
--- /dev/null
+++ b/winsup/w32api/include/lmat.h
@@ -0,0 +1,35 @@
+#ifndef _LMAT_H
+#define _LMAT_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+#define JOB_RUN_PERIODICALLY 1
+#define JOB_EXEC_ERROR 2
+#define JOB_RUNS_TODAY 4
+#define JOB_ADD_CURRENT_DATE 8
+#define JOB_NONINTERACTIVE 16
+#define JOB_INPUT_FLAGS (JOB_RUN_PERIODICALLY|JOB_ADD_CURRENT_DATE|JOB_NONINTERACTIVE)
+#define JOB_OUTPUT_FLAGS (JOB_RUN_PERIODICALLY|JOB_EXEC_ERROR|JOB_RUNS_TODAY|JOB_NONINTERACTIVE)
+typedef struct _AT_ENUM {
+ DWORD JobId;
+ DWORD JobTime;
+ DWORD DaysOfMonth;
+ UCHAR DaysOfWeek;
+ UCHAR Flags;
+ LPWSTR Command;
+} AT_ENUM,*PAT_ENUM,*LPAT_ENUM;
+typedef struct _AT_INFO {
+ DWORD JobTime;
+ DWORD DaysOfMonth;
+ UCHAR DaysOfWeek;
+ UCHAR Flags;
+ LPWSTR Command;
+} AT_INFO,*PAT_INFO,*LPAT_INFO;
+NET_API_STATUS WINAPI NetScheduleJobAdd(LPWSTR,PBYTE,LPDWORD);
+NET_API_STATUS WINAPI NetScheduleJobDel(LPWSTR,DWORD,DWORD);
+NET_API_STATUS WINAPI NetScheduleJobEnum(LPWSTR,PBYTE*,DWORD,PDWORD,PDWORD,PDWORD);
+NET_API_STATUS WINAPI NetScheduleJobGetInfo(LPWSTR,DWORD,PBYTE*);
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/winsup/w32api/include/lmaudit.h b/winsup/w32api/include/lmaudit.h
new file mode 100644
index 000000000..1d944b2cb
--- /dev/null
+++ b/winsup/w32api/include/lmaudit.h
@@ -0,0 +1,246 @@
+#ifndef _LMAUDIT_H
+#define _LMAUDIT_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+#define REVISED_AUDIT_ENTRY_STRUCT
+#define LOGFLAGS_FORWARD 0
+#define LOGFLAGS_BACKWARD 1
+#define LOGFLAGS_SEEK 2
+#define ACTION_LOCKOUT 0
+#define ACTION_ADMINUNLOCK 1
+#define AE_GUEST 0
+#define AE_USER 1
+#define AE_ADMIN 2
+#define AE_NORMAL 0
+#define AE_USERLIMIT 0
+#define AE_GENERAL 0
+#define AE_ERROR 1
+#define AE_SESSDIS 1
+#define AE_BADPW 1
+#define AE_AUTODIS 2
+#define AE_UNSHARE 2
+#define AE_ADMINPRIVREQD 2
+#define AE_ADMINDIS 3
+#define AE_NOACCESSPERM 3
+#define AE_ACCRESTRICT 4
+#define AE_NORMAL_CLOSE 0
+#define AE_SES_CLOSE 1
+#define AE_ADMIN_CLOSE 2
+#define AE_LIM_UNKNOWN 0
+#define AE_LIM_LOGONHOURS 1
+#define AE_LIM_EXPIRED 2
+#define AE_LIM_INVAL_WKSTA 3
+#define AE_LIM_DISABLED 4
+#define AE_LIM_DELETED 5
+#define AE_MOD 0
+#define AE_DELETE 1
+#define AE_ADD 2
+#define AE_UAS_USER 0
+#define AE_UAS_GROUP 1
+#define AE_UAS_MODALS 2
+#define SVAUD_SERVICE 1
+#define SVAUD_GOODSESSLOGON 6
+#define SVAUD_BADSESSLOGON 24
+#define SVAUD_SESSLOGON (SVAUD_GOODSESSLOGON|SVAUD_BADSESSLOGON)
+#define SVAUD_GOODNETLOGON 96
+#define SVAUD_BADNETLOGON 384
+#define SVAUD_NETLOGON (SVAUD_GOODNETLOGON|SVAUD_BADNETLOGON)
+#define SVAUD_LOGON (SVAUD_NETLOGON|SVAUD_SESSLOGON)
+#define SVAUD_GOODUSE 0x600
+#define SVAUD_BADUSE 0x1800
+#define SVAUD_USE (SVAUD_GOODUSE|SVAUD_BADUSE)
+#define SVAUD_USERLIST 8192
+#define SVAUD_PERMISSIONS 16384
+#define SVAUD_RESOURCE 32768
+#define SVAUD_LOGONLIM 65536
+#define AA_AUDIT_ALL 1
+#define AA_A_OWNER 4
+#define AA_CLOSE 8
+#define AA_S_OPEN 16
+#define AA_S_WRITE 32
+#define AA_S_CREATE 32
+#define AA_S_DELETE 64
+#define AA_S_ACL 128
+#define AA_S_ALL 253
+#define AA_F_OPEN 256
+#define AA_F_WRITE 512
+#define AA_F_CREATE 512
+#define AA_F_DELETE 1024
+#define AA_F_ACL 2048
+#define AA_F_ALL (AA_F_OPEN|AA_F_WRITE|AA_F_DELETE|AA_F_ACL)
+#define AA_A_OPEN 2048
+#define AA_A_WRITE 4096
+#define AA_A_CREATE 8192
+#define AA_A_DELETE 16384
+#define AA_A_ACL 32768
+#define AA_A_ALL (AA_F_OPEN|AA_F_WRITE|AA_F_DELETE|AA_F_ACL)
+typedef struct _AUDIT_ENTRY {
+ DWORD ae_len;
+ DWORD ae_reserved;
+ DWORD ae_time;
+ DWORD ae_type;
+ DWORD ae_data_offset;
+ DWORD ae_data_size;
+} AUDIT_ENTRY,*PAUDIT_ENTRY,*LPAUDIT_ENTRY;
+typedef struct _HLOG {
+ DWORD time;
+ DWORD last_flags;
+ DWORD offset;
+ DWORD rec_offset;
+} HLOG,*PHLOG,*LPHLOG;
+typedef struct _AE_SRVSTATUS {
+ DWORD ae_sv_status;
+} AE_SRVSTATUS,*PAE_SRVSTATUS,*LPAE_SRVSTATUS;
+typedef struct _AE_SESSLOGON {
+ DWORD ae_so_compname;
+ DWORD ae_so_username;
+ DWORD ae_so_privilege;
+} AE_SESSLOGON,*PAE_SESSLOGON,*LPAE_SESSLOGON;
+typedef struct _AE_SESSLOGOFF {
+ DWORD ae_sf_compname;
+ DWORD ae_sf_username;
+ DWORD ae_sf_reason;
+} AE_SESSLOGOFF,*PAE_SESSLOGOFF,*LPAE_SESSLOGOFF;
+typedef struct _AE_SESSPWERR {
+ DWORD ae_sp_compname;
+ DWORD ae_sp_username;
+} AE_SESSPWERR,*PAE_SESSPWERR,*LPAE_SESSPWERR;
+typedef struct _AE_CONNSTART {
+ DWORD ae_ct_compname;
+ DWORD ae_ct_username;
+ DWORD ae_ct_netname;
+ DWORD ae_ct_connid;
+} AE_CONNSTART,*PAE_CONNSTART,*LPAE_CONNSTART;
+typedef struct _AE_CONNSTOP {
+ DWORD ae_cp_compname;
+ DWORD ae_cp_username;
+ DWORD ae_cp_netname;
+ DWORD ae_cp_connid;
+ DWORD ae_cp_reason;
+} AE_CONNSTOP,*PAE_CONNSTOP,*LPAE_CONNSTOP;
+typedef struct _AE_CONNREJ {
+ DWORD ae_cr_compname;
+ DWORD ae_cr_username;
+ DWORD ae_cr_netname;
+ DWORD ae_cr_reason;
+} AE_CONNREJ,*PAE_CONNREJ,*LPAE_CONNREJ;
+typedef struct _AE_RESACCESS {
+ DWORD ae_ra_compname;
+ DWORD ae_ra_username;
+ DWORD ae_ra_resname;
+ DWORD ae_ra_operation;
+ DWORD ae_ra_returncode;
+ DWORD ae_ra_restype;
+ DWORD ae_ra_fileid;
+} AE_RESACCESS,*PAE_RESACCESS,*LPAE_RESACCESS;
+typedef struct _AE_RESACCESSREJ {
+ DWORD ae_rr_compname;
+ DWORD ae_rr_username;
+ DWORD ae_rr_resname;
+ DWORD ae_rr_operation;
+} AE_RESACCESSREJ,*PAE_RESACCESSREJ,*LPAE_RESACCESSREJ;
+typedef struct _AE_CLOSEFILE {
+ DWORD ae_cf_compname;
+ DWORD ae_cf_username;
+ DWORD ae_cf_resname;
+ DWORD ae_cf_fileid;
+ DWORD ae_cf_duration;
+ DWORD ae_cf_reason;
+} AE_CLOSEFILE,*PAE_CLOSEFILE,*LPAE_CLOSEFILE;
+typedef struct _AE_SERVICESTAT {
+ DWORD ae_ss_compname;
+ DWORD ae_ss_username;
+ DWORD ae_ss_svcname;
+ DWORD ae_ss_status;
+ DWORD ae_ss_code;
+ DWORD ae_ss_text;
+ DWORD ae_ss_returnval;
+} AE_SERVICESTAT,*PAE_SERVICESTAT,*LPAE_SERVICESTAT;
+typedef struct _AE_ACLMOD {
+ DWORD ae_am_compname;
+ DWORD ae_am_username;
+ DWORD ae_am_resname;
+ DWORD ae_am_action;
+ DWORD ae_am_datalen;
+} AE_ACLMOD,*PAE_ACLMOD,*LPAE_ACLMOD;
+typedef struct _AE_UASMOD {
+ DWORD ae_um_compname;
+ DWORD ae_um_username;
+ DWORD ae_um_resname;
+ DWORD ae_um_rectype;
+ DWORD ae_um_action;
+ DWORD ae_um_datalen;
+} AE_UASMOD,*PAE_UASMOD,*LPAE_UASMOD;
+typedef struct _AE_NETLOGON {
+ DWORD ae_no_compname;
+ DWORD ae_no_username;
+ DWORD ae_no_privilege;
+ DWORD ae_no_authflags;
+} AE_NETLOGON,*PAE_NETLOGON,*LPAE_NETLOGON;
+typedef struct _AE_NETLOGOFF {
+ DWORD ae_nf_compname;
+ DWORD ae_nf_username;
+ DWORD ae_nf_reserved1;
+ DWORD ae_nf_reserved2;
+} AE_NETLOGOFF,*PAE_NETLOGOFF,*LPAE_NETLOGOFF;
+typedef struct _AE_ACCLIM {
+ DWORD ae_al_compname;
+ DWORD ae_al_username;
+ DWORD ae_al_resname;
+ DWORD ae_al_limit;
+} AE_ACCLIM,*PAE_ACCLIM,*LPAE_ACCLIM;
+typedef struct _AE_LOCKOUT {
+ DWORD ae_lk_compname;
+ DWORD ae_lk_username;
+ DWORD ae_lk_action;
+ DWORD ae_lk_bad_pw_count;
+} AE_LOCKOUT,*PAE_LOCKOUT,*LPAE_LOCKOUT;
+typedef struct _AE_GENERIC {
+ DWORD ae_ge_msgfile;
+ DWORD ae_ge_msgnum;
+ DWORD ae_ge_params;
+ DWORD ae_ge_param1;
+ DWORD ae_ge_param2;
+ DWORD ae_ge_param3;
+ DWORD ae_ge_param4;
+ DWORD ae_ge_param5;
+ DWORD ae_ge_param6;
+ DWORD ae_ge_param7;
+ DWORD ae_ge_param8;
+ DWORD ae_ge_param9;
+} AE_GENERIC,*PAE_GENERIC,*LPAE_GENERIC;
+NET_API_STATUS WINAPI NetAuditClear(LPCWSTR,LPCWSTR,LPCWSTR);
+NET_API_STATUS WINAPI NetAuditRead(LPTSTR,LPTSTR,LPHLOG,DWORD,PDWORD,DWORD,DWORD,PBYTE*,DWORD,PDWORD,PDWORD);
+NET_API_STATUS WINAPI NetAuditWrite(DWORD,PBYTE,DWORD,LPTSTR,PBYTE);
+
+/* These conflict with struct typedefs, why? */
+#define AE_SRVSTATUS 0
+#define AE_SESSLOGON 1
+#define AE_SESSLOGOFF 2
+#define AE_SESSPWERR 3
+#define AE_CONNSTART 4
+#define AE_CONNSTOP 5
+#define AE_CONNREJ 6
+#define AE_RESACCESS 7
+#define AE_RESACCESSREJ 8
+#define AE_CLOSEFILE 9
+#define AE_SERVICESTAT 11
+#define AE_ACLMOD 12
+#define AE_UASMOD 13
+#define AE_NETLOGON 14
+#define AE_NETLOGOFF 15
+#define AE_NETLOGDENIED 16
+#define AE_ACCLIMITEXCD 17
+#define AE_RESACCESS2 18
+#define AE_ACLMODFAIL 19
+#define AE_LOCKOUT 20
+#define AE_GENERIC_TYPE 21
+#define AE_SRVSTART 0
+#define AE_SRVPAUSED 1
+#define AE_SRVCONT 2
+#define AE_SRVSTOP 3
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/winsup/w32api/include/lmbrowsr.h b/winsup/w32api/include/lmbrowsr.h
new file mode 100644
index 000000000..85e40bbdb
--- /dev/null
+++ b/winsup/w32api/include/lmbrowsr.h
@@ -0,0 +1,70 @@
+#ifndef _LMBROWSR_H
+#define _LMBROWSR_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+#define BROWSER_ROLE_PDC 1
+#define BROWSER_ROLE_BDC 2
+typedef struct _BROWSER_STATISTICS {
+ LARGE_INTEGER StatisticsStartTime;
+ LARGE_INTEGER NumberOfServerAnnouncements;
+ LARGE_INTEGER NumberOfDomainAnnouncements;
+ ULONG NumberOfElectionPackets;
+ ULONG NumberOfMailslotWrites;
+ ULONG NumberOfGetBrowserServerListRequests;
+ ULONG NumberOfServerEnumerations;
+ ULONG NumberOfDomainEnumerations;
+ ULONG NumberOfOtherEnumerations;
+ ULONG NumberOfMissedServerAnnouncements;
+ ULONG NumberOfMissedMailslotDatagrams;
+ ULONG NumberOfMissedGetBrowserServerListRequests;
+ ULONG NumberOfFailedServerAnnounceAllocations;
+ ULONG NumberOfFailedMailslotAllocations;
+ ULONG NumberOfFailedMailslotReceives;
+ ULONG NumberOfFailedMailslotWrites;
+ ULONG NumberOfFailedMailslotOpens;
+ ULONG NumberOfDuplicateMasterAnnouncements;
+LARGE_INTEGER NumberOfIllegalDatagrams;
+} BROWSER_STATISTICS,*PBROWSER_STATISTICS,*LPBROWSER_STATISTICS;
+typedef struct _BROWSER_STATISTICS_100 {
+ LARGE_INTEGER StartTime;
+ LARGE_INTEGER NumberOfServerAnnouncements;
+ LARGE_INTEGER NumberOfDomainAnnouncements;
+ ULONG NumberOfElectionPackets;
+ ULONG NumberOfMailslotWrites;
+ ULONG NumberOfGetBrowserServerListRequests;
+ LARGE_INTEGER NumberOfIllegalDatagrams;
+} BROWSER_STATISTICS_100,*PBROWSER_STATISTICS_100;
+typedef struct _BROWSER_STATISTICS_101 {
+ LARGE_INTEGER StartTime;
+ LARGE_INTEGER NumberOfServerAnnouncements;
+ LARGE_INTEGER NumberOfDomainAnnouncements;
+ ULONG NumberOfElectionPackets;
+ ULONG NumberOfMailslotWrites;
+ ULONG NumberOfGetBrowserServerListRequests;
+ LARGE_INTEGER NumberOfIllegalDatagrams;
+ ULONG NumberOfMissedServerAnnouncements;
+ ULONG NumberOfMissedMailslotDatagrams;
+ ULONG NumberOfMissedGetBrowserServerListRequests;
+ ULONG NumberOfFailedServerAnnounceAllocations;
+ ULONG NumberOfFailedMailslotAllocations;
+ ULONG NumberOfFailedMailslotReceives;
+ ULONG NumberOfFailedMailslotWrites;
+ ULONG NumberOfFailedMailslotOpens;
+ ULONG NumberOfDuplicateMasterAnnouncements;
+} BROWSER_STATISTICS_101,*PBROWSER_STATISTICS_101;
+
+NET_API_STATUS WINAPI I_BrowserServerEnum(LPCWSTR,LPCWSTR,LPCWSTR,DWORD,PBYTE*,DWORD,PDWORD,PDWORD,DWORD,LPCWSTR,PDWORD);
+NET_API_STATUS WINAPI I_BrowserServerEnumEx(LPCWSTR,LPCWSTR,LPCWSTR,DWORD,PBYTE*,DWORD,PDWORD,PDWORD,DWORD,LPCWSTR,LPCWSTR);
+NET_API_STATUS I_BrowserQueryEmulatedDomains(LPWSTR,PBYTE*,PDWORD);
+NET_API_STATUS I_BrowserQueryOtherDomains(LPCWSTR,PBYTE*,PDWORD,PDWORD);
+NET_API_STATUS I_BrowserResetNetlogonState(LPCWSTR);
+NET_API_STATUS I_BrowserSetNetlogonState(LPWSTR,LPWSTR,LPWSTR,DWORD);
+NET_API_STATUS I_BrowserQueryStatistics(LPCWSTR,LPBROWSER_STATISTICS*);
+NET_API_STATUS I_BrowserResetStatistics(LPCWSTR);
+WORD I_BrowserServerEnumForXactsrv(LPCWSTR,LPCWSTR,ULONG,USHORT,PVOID,WORD,DWORD,PDWORD,PDWORD,DWORD,LPCWSTR,LPCWSTR,PWORD);
+NET_API_STATUS I_BrowserDebugTrace(PWCHAR,PCHAR);
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/winsup/w32api/include/lmchdev.h b/winsup/w32api/include/lmchdev.h
new file mode 100644
index 000000000..c7a6814f7
--- /dev/null
+++ b/winsup/w32api/include/lmchdev.h
@@ -0,0 +1,57 @@
+#ifndef _LMCHDEV_H
+#define _LMCHDEV_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+#define CHARDEVQ_NO_REQUESTS (-1)
+#define CHARDEV_CLOSE 0
+#define CHARDEVQ_MAX_PRIORITY 1
+#define CHARDEVQ_DEV_PARMNUM 1
+#define HANDLE_INFO_LEVEL_1 1
+#define HANDLE_CHARTIME_PARMNUM 1
+#define HANDLE_CHARCOUNT_PARMNUM 2
+#define CHARDEV_STAT_OPENED 2
+#define CHARDEVQ_PRIORITY_PARMNUM 2
+#define CHARDEVQ_DEVS_PARMNUM 3
+#define CHARDEV_STAT_ERROR 4
+#define CHARDEVQ_NUMUSERS_PARMNUM 4
+#define CHARDEVQ_NUMAHEAD_PARMNUM 5
+#define CHARDEVQ_DEF_PRIORITY 5
+#define CHARDEVQ_PRIORITY_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+CHARDEVQ_PRIORITY_PARMNUM)
+#define CHARDEVQ_DEVS_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+CHARDEVQ_DEVS_PARMNUM)
+#define CHARDEVQ_MIN_PRIORITY 9
+typedef struct _CHARDEV_INFO_0 { LPWSTR ch0_dev; } CHARDEV_INFO_0,*PCHARDEV_INFO_0,*LPCHARDEV_INFO_0;
+typedef struct _CHARDEV_INFO_1 {
+ LPWSTR ch1_dev;
+ DWORD ch1_status;
+ LPWSTR ch1_username;
+ DWORD ch1_time;
+} CHARDEV_INFO_1,*PCHARDEV_INFO_1,*LPCHARDEV_INFO_1;
+typedef struct _CHARDEVQ_INFO_0 { LPWSTR cq0_dev; } CHARDEVQ_INFO_0,*PCHARDEVQ_INFO_0,*LPCHARDEVQ_INFO_0;
+typedef struct _CHARDEVQ_INFO_1 {
+ LPWSTR cq1_dev;
+ DWORD cq1_priority;
+ LPWSTR cq1_devs;
+ DWORD cq1_numusers;
+ DWORD cq1_numahead;
+} CHARDEVQ_INFO_1,*PCHARDEVQ_INFO_1,*LPCHARDEVQ_INFO_1;
+typedef struct _CHARDEVQ_INFO_1002 { DWORD cq1002_priority; } CHARDEVQ_INFO_1002,*PCHARDEVQ_INFO_1002,*LPCHARDEVQ_INFO_1002;
+typedef struct _CHARDEVQ_INFO_1003 { LPWSTR cq1003_devs; } CHARDEVQ_INFO_1003,*PCHARDEVQ_INFO_1003,*LPCHARDEVQ_INFO_1003;
+typedef struct _HANDLE_INFO_1 {
+ DWORD hdli1_chartime;
+ DWORD hdli1_charcount;
+}HANDLE_INFO_1,*PHANDLE_INFO_1,*LPHANDLE_INFO_1;
+NET_API_STATUS WINAPI NetCharDevEnum(LPCWSTR,DWORD,PBYTE*,DWORD,PDWORD,PDWORD,PDWORD);
+NET_API_STATUS WINAPI NetCharDevGetInfo(LPCWSTR,LPCWSTR,DWORD,PBYTE*);
+NET_API_STATUS WINAPI NetCharDevControl(LPCWSTR,LPCWSTR,DWORD);
+NET_API_STATUS WINAPI NetCharDevQEnum(LPCWSTR,LPCWSTR,DWORD,PBYTE*,DWORD,PDWORD,PDWORD,PDWORD);
+NET_API_STATUS WINAPI NetCharDevQGetInfo(LPCWSTR,LPCWSTR,LPCWSTR,DWORD,PBYTE*);
+NET_API_STATUS WINAPI NetCharDevQSetInfo(LPCWSTR,LPCWSTR,DWORD,PBYTE,PDWORD);
+NET_API_STATUS WINAPI NetCharDevQPurge(LPCWSTR,LPCWSTR);
+NET_API_STATUS WINAPI NetCharDevQPurgeSelf(LPCWSTR,LPCWSTR,LPCWSTR);
+NET_API_STATUS WINAPI NetHandleGetInfo(HANDLE,DWORD,PBYTE*);
+NET_API_STATUS WINAPI NetHandleSetInfo(HANDLE,DWORD,PBYTE,DWORD,PDWORD);
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/winsup/w32api/include/lmconfig.h b/winsup/w32api/include/lmconfig.h
new file mode 100644
index 000000000..746a5ddc8
--- /dev/null
+++ b/winsup/w32api/include/lmconfig.h
@@ -0,0 +1,17 @@
+#ifndef _LMCONFIG_H
+#define _LMCONFIG_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+#define REVISED_CONFIG_APIS
+typedef struct _CONFIG_INFO_0 {
+ LPWSTR cfgi0_key;
+ LPWSTR cfgi0_data;
+} CONFIG_INFO_0,*PCONFIG_INFO_0,*LPCONFIG_INFO_0;
+NET_API_STATUS WINAPI NetConfigGet(LPCWSTR,LPCWSTR,LPCWSTR,PBYTE*);
+NET_API_STATUS WINAPI NetConfigGetAll(LPCWSTR,LPCWSTR,PBYTE*);
+NET_API_STATUS WINAPI NetConfigSet(LPCWSTR,LPCWSTR,LPCWSTR,DWORD,DWORD,PBYTE,DWORD);
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/winsup/w32api/include/lmcons.h b/winsup/w32api/include/lmcons.h
new file mode 100644
index 000000000..6a0d1575a
--- /dev/null
+++ b/winsup/w32api/include/lmcons.h
@@ -0,0 +1,60 @@
+#ifndef _LMCONS_H
+#define _LMCONS_H
+#define MESSAGE_FILENAME TEXT("NETMSG")
+#define OS2MSG_FILENAME TEXT("BASE")
+#define HELP_MSG_FILENAME TEXT("NETH")
+#define NET_API_FUNCTION __stdcall
+#define NET_API_STATUS DWORD
+#define API_RET_TYPE NET_API_STATUS
+#define MIN_LANMAN_MESSAGE_ID NERR_BASE
+#define MAX_LANMAN_MESSAGE_ID 5799
+#define CNLEN 15
+#define DNLEN 15
+#define LM20_CNLEN 15
+#define LM20_DNLEN 15
+#define LM20_SNLEN 15
+#define LM20_STXTLEN 63
+#define LM20_UNCLEN (LM20_CNLEN+2)
+#define LM20_NNLEN 12
+#define LM20_RMLEN (LM20_UNCLEN+1+LM20_NNLEN)
+#define UNCLEN (CNLEN+2)
+#define NNLEN 80
+#define RMLEN (UNCLEN+1+NNLEN)
+#define SNLEN 80
+#define STXTLEN 256
+#define PATHLEN 256
+#define LM20_PATHLEN 256
+#define DEVLEN 80
+#define LM20_DEVLEN 8
+#define EVLEN 16
+#define UNLEN 256
+#define LM20_UNLEN 20
+#define GNLEN UNLEN
+#define LM20_GNLEN LM20_UNLEN
+#define PWLEN 256
+#define LM20_PWLEN 14
+#define SHPWLEN 8
+#define CLTYPE_LEN 12
+#define MAXCOMMENTSZ 256
+#define LM20_MAXCOMMENTSZ 48
+#define QNLEN NNLEN
+#define LM20_QNLEN LM20_NNLEN
+#define ALERTSZ 128
+#define MAXDEVENTRIES (sizeof(int)*8)
+#define NETBIOS_NAME_LEN 16
+#define MAX_PREFERRED_LENGTH ((DWORD)-1)
+#define CRYPT_KEY_LEN 7
+#define CRYPT_TXT_LEN 8
+#define ENCRYPTED_PWLEN 16
+#define SESSION_PWLEN 24
+#define SESSION_CRYPT_KLEN 21
+#define PARMNUM_ALL 0
+#define PARM_ERROR_UNKNOWN ((DWORD)-1)
+#define PARM_ERROR_NONE 0
+#define PARMNUM_BASE_INFOLEVEL 1000
+#define PLATFORM_ID_DOS 300
+#define PLATFORM_ID_OS2 400
+#define PLATFORM_ID_NT 500
+#define PLATFORM_ID_OSF 600
+#define PLATFORM_ID_VMS 700
+#endif
diff --git a/winsup/w32api/include/lmerr.h b/winsup/w32api/include/lmerr.h
new file mode 100644
index 000000000..8400f983b
--- /dev/null
+++ b/winsup/w32api/include/lmerr.h
@@ -0,0 +1,277 @@
+#ifndef _LMERR_H
+#define _LMERR_H
+#include <winerror.h>
+#define NERR_Success 0
+#define NERR_BASE 2100
+#define NERR_NetNotStarted (NERR_BASE+2)
+#define NERR_UnknownServer (NERR_BASE+3)
+#define NERR_ShareMem (NERR_BASE+4)
+#define NERR_NoNetworkResource (NERR_BASE+5)
+#define NERR_RemoteOnly (NERR_BASE+6)
+#define NERR_DevNotRedirected (NERR_BASE+7)
+#define NERR_ServerNotStarted (NERR_BASE+14)
+#define NERR_ItemNotFound (NERR_BASE+15)
+#define NERR_UnknownDevDir (NERR_BASE+16)
+#define NERR_RedirectedPath (NERR_BASE+17)
+#define NERR_DuplicateShare (NERR_BASE+18)
+#define NERR_NoRoom (NERR_BASE+19)
+#define NERR_TooManyItems (NERR_BASE+21)
+#define NERR_InvalidMaxUsers (NERR_BASE+22)
+#define NERR_BufTooSmall (NERR_BASE+23)
+#define NERR_RemoteErr (NERR_BASE+27)
+#define NERR_LanmanIniError (NERR_BASE+31)
+#define NERR_NetworkError (NERR_BASE+36)
+#define NERR_WkstaInconsistentState (NERR_BASE+37)
+#define NERR_WkstaNotStarted (NERR_BASE+38)
+#define NERR_BrowserNotStarted (NERR_BASE+39)
+#define NERR_InternalError (NERR_BASE+40)
+#define NERR_BadTransactConfig (NERR_BASE+41)
+#define NERR_InvalidAPI (NERR_BASE+42)
+#define NERR_BadEventName (NERR_BASE+43)
+#define NERR_DupNameReboot (NERR_BASE+44)
+#define NERR_CfgCompNotFound (NERR_BASE+46)
+#define NERR_CfgParamNotFound (NERR_BASE+47)
+#define NERR_LineTooLong (NERR_BASE+49)
+#define NERR_QNotFound (NERR_BASE+50)
+#define NERR_JobNotFound (NERR_BASE+51)
+#define NERR_DestNotFound (NERR_BASE+52)
+#define NERR_DestExists (NERR_BASE+53)
+#define NERR_QExists (NERR_BASE+54)
+#define NERR_QNoRoom (NERR_BASE+55)
+#define NERR_JobNoRoom (NERR_BASE+56)
+#define NERR_DestNoRoom (NERR_BASE+57)
+#define NERR_DestIdle (NERR_BASE+58)
+#define NERR_DestInvalidOp (NERR_BASE+59)
+#define NERR_ProcNoRespond (NERR_BASE+60)
+#define NERR_SpoolerNotLoaded (NERR_BASE+61)
+#define NERR_DestInvalidState (NERR_BASE+62)
+#define NERR_QInvalidState (NERR_BASE+63)
+#define NERR_JobInvalidState (NERR_BASE+64)
+#define NERR_SpoolNoMemory (NERR_BASE+65)
+#define NERR_DriverNotFound (NERR_BASE+66)
+#define NERR_DataTypeInvalid (NERR_BASE+67)
+#define NERR_ProcNotFound (NERR_BASE+68)
+#define NERR_ServiceTableLocked (NERR_BASE+80)
+#define NERR_ServiceTableFull (NERR_BASE+81)
+#define NERR_ServiceInstalled (NERR_BASE+82)
+#define NERR_ServiceEntryLocked (NERR_BASE+83)
+#define NERR_ServiceNotInstalled (NERR_BASE+84)
+#define NERR_BadServiceName (NERR_BASE+85)
+#define NERR_ServiceCtlTimeout (NERR_BASE+86)
+#define NERR_ServiceCtlBusy (NERR_BASE+87)
+#define NERR_BadServiceProgName (NERR_BASE+88)
+#define NERR_ServiceNotCtrl (NERR_BASE+89)
+#define NERR_ServiceKillProc (NERR_BASE+90)
+#define NERR_ServiceCtlNotValid (NERR_BASE+91)
+#define NERR_NotInDispatchTbl (NERR_BASE+92)
+#define NERR_BadControlRecv (NERR_BASE+93)
+#define NERR_ServiceNotStarting (NERR_BASE+94)
+#define NERR_AlreadyLoggedOn (NERR_BASE+100)
+#define NERR_NotLoggedOn (NERR_BASE+101)
+#define NERR_BadUsername (NERR_BASE+102)
+#define NERR_BadPassword (NERR_BASE+103)
+#define NERR_UnableToAddName_W (NERR_BASE+104)
+#define NERR_UnableToAddName_F (NERR_BASE+105)
+#define NERR_UnableToDelName_W (NERR_BASE+106)
+#define NERR_UnableToDelName_F (NERR_BASE+107)
+#define NERR_LogonsPaused (NERR_BASE+109)
+#define NERR_LogonServerConflict (NERR_BASE+110)
+#define NERR_LogonNoUserPath (NERR_BASE+111)
+#define NERR_LogonScriptError (NERR_BASE+112)
+#define NERR_StandaloneLogon (NERR_BASE+114)
+#define NERR_LogonServerNotFound (NERR_BASE+115)
+#define NERR_LogonDomainExists (NERR_BASE+116)
+#define NERR_NonValidatedLogon (NERR_BASE+117)
+#define NERR_ACFNotFound (NERR_BASE+119)
+#define NERR_GroupNotFound (NERR_BASE+120)
+#define NERR_UserNotFound (NERR_BASE+121)
+#define NERR_ResourceNotFound (NERR_BASE+122)
+#define NERR_GroupExists (NERR_BASE+123)
+#define NERR_UserExists (NERR_BASE+124)
+#define NERR_ResourceExists (NERR_BASE+125)
+#define NERR_NotPrimary (NERR_BASE+126)
+#define NERR_ACFNotLoaded (NERR_BASE+127)
+#define NERR_ACFNoRoom (NERR_BASE+128)
+#define NERR_ACFFileIOFail (NERR_BASE+129)
+#define NERR_ACFTooManyLists (NERR_BASE+130)
+#define NERR_UserLogon (NERR_BASE+131)
+#define NERR_ACFNoParent (NERR_BASE+132)
+#define NERR_CanNotGrowSegment (NERR_BASE+133)
+#define NERR_SpeGroupOp (NERR_BASE+134)
+#define NERR_NotInCache (NERR_BASE+135)
+#define NERR_UserInGroup (NERR_BASE+136)
+#define NERR_UserNotInGroup (NERR_BASE+137)
+#define NERR_AccountUndefined (NERR_BASE+138)
+#define NERR_AccountExpired (NERR_BASE+139)
+#define NERR_InvalidWorkstation (NERR_BASE+140)
+#define NERR_InvalidLogonHours (NERR_BASE+141)
+#define NERR_PasswordExpired (NERR_BASE+142)
+#define NERR_PasswordCantChange (NERR_BASE+143)
+#define NERR_PasswordHistConflict (NERR_BASE+144)
+#define NERR_PasswordTooShort (NERR_BASE+145)
+#define NERR_PasswordTooRecent (NERR_BASE+146)
+#define NERR_InvalidDatabase (NERR_BASE+147)
+#define NERR_DatabaseUpToDate (NERR_BASE+148)
+#define NERR_SyncRequired (NERR_BASE+149)
+#define NERR_UseNotFound (NERR_BASE+150)
+#define NERR_BadAsgType (NERR_BASE+151)
+#define NERR_DeviceIsShared (NERR_BASE+152)
+#define NERR_NoComputerName (NERR_BASE+170)
+#define NERR_MsgAlreadyStarted (NERR_BASE+171)
+#define NERR_MsgInitFailed (NERR_BASE+172)
+#define NERR_NameNotFound (NERR_BASE+173)
+#define NERR_AlreadyForwarded (NERR_BASE+174)
+#define NERR_AddForwarded (NERR_BASE+175)
+#define NERR_AlreadyExists (NERR_BASE+176)
+#define NERR_TooManyNames (NERR_BASE+177)
+#define NERR_DelComputerName (NERR_BASE+178)
+#define NERR_LocalForward (NERR_BASE+179)
+#define NERR_GrpMsgProcessor (NERR_BASE+180)
+#define NERR_PausedRemote (NERR_BASE+181)
+#define NERR_BadReceive (NERR_BASE+182)
+#define NERR_NameInUse (NERR_BASE+183)
+#define NERR_MsgNotStarted (NERR_BASE+184)
+#define NERR_NotLocalName (NERR_BASE+185)
+#define NERR_NoForwardName (NERR_BASE+186)
+#define NERR_RemoteFull (NERR_BASE+187)
+#define NERR_NameNotForwarded (NERR_BASE+188)
+#define NERR_TruncatedBroadcast (NERR_BASE+189)
+#define NERR_InvalidDevice (NERR_BASE+194)
+#define NERR_WriteFault (NERR_BASE+195)
+#define NERR_DuplicateName (NERR_BASE+197)
+#define NERR_DeleteLater (NERR_BASE+198)
+#define NERR_IncompleteDel (NERR_BASE+199)
+#define NERR_MultipleNets (NERR_BASE+200)
+#define NERR_NetNameNotFound (NERR_BASE+210)
+#define NERR_DeviceNotShared (NERR_BASE+211)
+#define NERR_ClientNameNotFound (NERR_BASE+212)
+#define NERR_FileIdNotFound (NERR_BASE+214)
+#define NERR_ExecFailure (NERR_BASE+215)
+#define NERR_TmpFile (NERR_BASE+216)
+#define NERR_TooMuchData (NERR_BASE+217)
+#define NERR_DeviceShareConflict (NERR_BASE+218)
+#define NERR_BrowserTableIncomplete (NERR_BASE+219)
+#define NERR_NotLocalDomain (NERR_BASE+220)
+#define NERR_DevInvalidOpCode (NERR_BASE+231)
+#define NERR_DevNotFound (NERR_BASE+232)
+#define NERR_DevNotOpen (NERR_BASE+233)
+#define NERR_BadQueueDevString (NERR_BASE+234)
+#define NERR_BadQueuePriority (NERR_BASE+235)
+#define NERR_NoCommDevs (NERR_BASE+237)
+#define NERR_QueueNotFound (NERR_BASE+238)
+#define NERR_BadDevString (NERR_BASE+240)
+#define NERR_BadDev (NERR_BASE+241)
+#define NERR_InUseBySpooler (NERR_BASE+242)
+#define NERR_CommDevInUse (NERR_BASE+243)
+#define NERR_InvalidComputer (NERR_BASE+251)
+#define NERR_MaxLenExceeded (NERR_BASE+254)
+#define NERR_BadComponent (NERR_BASE+256)
+#define NERR_CantType (NERR_BASE+257)
+#define NERR_TooManyEntries (NERR_BASE+262)
+#define NERR_ProfileFileTooBig (NERR_BASE+270)
+#define NERR_ProfileOffset (NERR_BASE+271)
+#define NERR_ProfileCleanup (NERR_BASE+272)
+#define NERR_ProfileUnknownCmd (NERR_BASE+273)
+#define NERR_ProfileLoadErr (NERR_BASE+274)
+#define NERR_ProfileSaveErr (NERR_BASE+275)
+#define NERR_LogOverflow (NERR_BASE+277)
+#define NERR_LogFileChanged (NERR_BASE+278)
+#define NERR_LogFileCorrupt (NERR_BASE+279)
+#define NERR_SourceIsDir (NERR_BASE+280)
+#define NERR_BadSource (NERR_BASE+281)
+#define NERR_BadDest (NERR_BASE+282)
+#define NERR_DifferentServers (NERR_BASE+283)
+#define NERR_RunSrvPaused (NERR_BASE+285)
+#define NERR_ErrCommRunSrv (NERR_BASE+289)
+#define NERR_ErrorExecingGhost (NERR_BASE+291)
+#define NERR_ShareNotFound (NERR_BASE+292)
+#define NERR_InvalidLana (NERR_BASE+300)
+#define NERR_OpenFiles (NERR_BASE+301)
+#define NERR_ActiveConns (NERR_BASE+302)
+#define NERR_BadPasswordCore (NERR_BASE+303)
+#define NERR_DevInUse (NERR_BASE+304)
+#define NERR_LocalDrive (NERR_BASE+305)
+#define NERR_AlertExists (NERR_BASE+330)
+#define NERR_TooManyAlerts (NERR_BASE+331)
+#define NERR_NoSuchAlert (NERR_BASE+332)
+#define NERR_BadRecipient (NERR_BASE+333)
+#define NERR_AcctLimitExceeded (NERR_BASE+334)
+#define NERR_InvalidLogSeek (NERR_BASE+340)
+#define NERR_BadUasConfig (NERR_BASE+350)
+#define NERR_InvalidUASOp (NERR_BASE+351)
+#define NERR_LastAdmin (NERR_BASE+352)
+#define NERR_DCNotFound (NERR_BASE+353)
+#define NERR_LogonTrackingError (NERR_BASE+354)
+#define NERR_NetlogonNotStarted (NERR_BASE+355)
+#define NERR_CanNotGrowUASFile (NERR_BASE+356)
+#define NERR_TimeDiffAtDC (NERR_BASE+357)
+#define NERR_PasswordMismatch (NERR_BASE+358)
+#define NERR_NoSuchServer (NERR_BASE+360)
+#define NERR_NoSuchSession (NERR_BASE+361)
+#define NERR_NoSuchConnection (NERR_BASE+362)
+#define NERR_TooManyServers (NERR_BASE+363)
+#define NERR_TooManySessions (NERR_BASE+364)
+#define NERR_TooManyConnections (NERR_BASE+365)
+#define NERR_TooManyFiles (NERR_BASE+366)
+#define NERR_NoAlternateServers (NERR_BASE+367)
+#define NERR_TryDownLevel (NERR_BASE+370)
+#define NERR_UPSDriverNotStarted (NERR_BASE+380)
+#define NERR_UPSInvalidConfig (NERR_BASE+381)
+#define NERR_UPSInvalidCommPort (NERR_BASE+382)
+#define NERR_UPSSignalAsserted (NERR_BASE+383)
+#define NERR_UPSShutdownFailed (NERR_BASE+384)
+#define NERR_BadDosRetCode (NERR_BASE+400)
+#define NERR_ProgNeedsExtraMem (NERR_BASE+401)
+#define NERR_BadDosFunction (NERR_BASE+402)
+#define NERR_RemoteBootFailed (NERR_BASE+403)
+#define NERR_BadFileCheckSum (NERR_BASE+404)
+#define NERR_NoRplBootSystem (NERR_BASE+405)
+#define NERR_RplLoadrNetBiosErr (NERR_BASE+406)
+#define NERR_RplLoadrDiskErr (NERR_BASE+407)
+#define NERR_ImageParamErr (NERR_BASE+408)
+#define NERR_TooManyImageParams (NERR_BASE+409)
+#define NERR_NonDosFloppyUsed (NERR_BASE+410)
+#define NERR_RplBootRestart (NERR_BASE+411)
+#define NERR_RplSrvrCallFailed (NERR_BASE+412)
+#define NERR_CantConnectRplSrvr (NERR_BASE+413)
+#define NERR_CantOpenImageFile (NERR_BASE+414)
+#define NERR_CallingRplSrvr (NERR_BASE+415)
+#define NERR_StartingRplBoot (NERR_BASE+416)
+#define NERR_RplBootServiceTerm (NERR_BASE+417)
+#define NERR_RplBootStartFailed (NERR_BASE+418)
+#define NERR_RPL_CONNECTED (NERR_BASE+419)
+#define NERR_BrowserConfiguredToNotRun (NERR_BASE+450)
+#define NERR_RplNoAdaptersStarted (NERR_BASE+510)
+#define NERR_RplBadRegistry (NERR_BASE+511)
+#define NERR_RplBadDatabase (NERR_BASE+512)
+#define NERR_RplRplfilesShare (NERR_BASE+513)
+#define NERR_RplNotRplServer (NERR_BASE+514)
+#define NERR_RplCannotEnum (NERR_BASE+515)
+#define NERR_RplWkstaInfoCorrupted (NERR_BASE+516)
+#define NERR_RplWkstaNotFound (NERR_BASE+517)
+#define NERR_RplWkstaNameUnavailable (NERR_BASE+518)
+#define NERR_RplProfileInfoCorrupted (NERR_BASE+519)
+#define NERR_RplProfileNotFound (NERR_BASE+520)
+#define NERR_RplProfileNameUnavailable (NERR_BASE+521)
+#define NERR_RplProfileNotEmpty (NERR_BASE+522)
+#define NERR_RplConfigInfoCorrupted (NERR_BASE+523)
+#define NERR_RplConfigNotFound (NERR_BASE+524)
+#define NERR_RplAdapterInfoCorrupted (NERR_BASE+525)
+#define NERR_RplInternal (NERR_BASE+526)
+#define NERR_RplVendorInfoCorrupted (NERR_BASE+527)
+#define NERR_RplBootInfoCorrupted (NERR_BASE+528)
+#define NERR_RplWkstaNeedsUserAcct (NERR_BASE+529)
+#define NERR_RplNeedsRPLUSERAcct (NERR_BASE+530)
+#define NERR_RplBootNotFound (NERR_BASE+531)
+#define NERR_RplIncompatibleProfile (NERR_BASE+532)
+#define NERR_RplAdapterNameUnavailable (NERR_BASE+533)
+#define NERR_RplConfigNotEmpty (NERR_BASE+534)
+#define NERR_RplBootInUse (NERR_BASE+535)
+#define NERR_RplBackupDatabase (NERR_BASE+536)
+#define NERR_RplAdapterNotFound (NERR_BASE+537)
+#define NERR_RplVendorNotFound (NERR_BASE+538)
+#define NERR_RplVendorNameUnavailable (NERR_BASE+539)
+#define NERR_RplBootNameUnavailable (NERR_BASE+540)
+#define NERR_RplConfigNameUnavailable (NERR_BASE+541)
+#define MAX_NERR (NERR_BASE+899)
+#endif
diff --git a/winsup/w32api/include/lmerrlog.h b/winsup/w32api/include/lmerrlog.h
new file mode 100644
index 000000000..7948af28f
--- /dev/null
+++ b/winsup/w32api/include/lmerrlog.h
@@ -0,0 +1,207 @@
+#ifndef _LMERRLOG_H
+#define _LMERRLOG_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+#define ERRLOG_BASE 3100
+#define ERRLOG2_BASE 5700
+#define LOGFLAGS_FORWARD 0
+#define LOGFLAGS_BACKWARD 1
+#define LOGFLAGS_SEEK 2
+#define NELOG_Internal_Error ERRLOG_BASE
+#define NELOG_Resource_Shortage (ERRLOG_BASE+1)
+#define NELOG_Unable_To_Lock_Segment (ERRLOG_BASE+2)
+#define NELOG_Unable_To_Unlock_Segment (ERRLOG_BASE+3)
+#define NELOG_Uninstall_Service (ERRLOG_BASE+4)
+#define NELOG_Init_Exec_Fail (ERRLOG_BASE+5)
+#define NELOG_Ncb_Error (ERRLOG_BASE+6)
+#define NELOG_Net_Not_Started (ERRLOG_BASE+7)
+#define NELOG_Ioctl_Error (ERRLOG_BASE+8)
+#define NELOG_System_Semaphore (ERRLOG_BASE+9)
+#define NELOG_Init_OpenCreate_Err (ERRLOG_BASE+10)
+#define NELOG_NetBios (ERRLOG_BASE+11)
+#define NELOG_SMB_Illegal (ERRLOG_BASE+12)
+#define NELOG_Service_Fail (ERRLOG_BASE+13)
+#define NELOG_Entries_Lost (ERRLOG_BASE+14)
+#define NELOG_Init_Seg_Overflow (ERRLOG_BASE+20)
+#define NELOG_Srv_No_Mem_Grow (ERRLOG_BASE+21)
+#define NELOG_Access_File_Bad (ERRLOG_BASE+22)
+#define NELOG_Srvnet_Not_Started (ERRLOG_BASE+23)
+#define NELOG_Init_Chardev_Err (ERRLOG_BASE+24)
+#define NELOG_Remote_API (ERRLOG_BASE+25)
+#define NELOG_Ncb_TooManyErr (ERRLOG_BASE+26)
+#define NELOG_Mailslot_err (ERRLOG_BASE+27)
+#define NELOG_ReleaseMem_Alert (ERRLOG_BASE+28)
+#define NELOG_AT_cannot_write (ERRLOG_BASE+29)
+#define NELOG_Cant_Make_Msg_File (ERRLOG_BASE+30)
+#define NELOG_Exec_Netservr_NoMem (ERRLOG_BASE+31)
+#define NELOG_Server_Lock_Failure (ERRLOG_BASE+32)
+#define NELOG_Msg_Shutdown (ERRLOG_BASE+40)
+#define NELOG_Msg_Sem_Shutdown (ERRLOG_BASE+41)
+#define NELOG_Msg_Log_Err (ERRLOG_BASE+50)
+#define NELOG_VIO_POPUP_ERR (ERRLOG_BASE+51)
+#define NELOG_Msg_Unexpected_SMB_Type (ERRLOG_BASE+52)
+#define NELOG_Wksta_Infoseg (ERRLOG_BASE+60)
+#define NELOG_Wksta_Compname (ERRLOG_BASE+61)
+#define NELOG_Wksta_BiosThreadFailure (ERRLOG_BASE+62)
+#define NELOG_Wksta_IniSeg (ERRLOG_BASE+63)
+#define NELOG_Wksta_HostTab_Full (ERRLOG_BASE+64)
+#define NELOG_Wksta_Bad_Mailslot_SMB (ERRLOG_BASE+65)
+#define NELOG_Wksta_UASInit (ERRLOG_BASE+66)
+#define NELOG_Wksta_SSIRelogon (ERRLOG_BASE+67)
+#define NELOG_Build_Name (ERRLOG_BASE+70)
+#define NELOG_Name_Expansion (ERRLOG_BASE+71)
+#define NELOG_Message_Send (ERRLOG_BASE+72)
+#define NELOG_Mail_Slt_Err (ERRLOG_BASE+73)
+#define NELOG_AT_cannot_read (ERRLOG_BASE+74)
+#define NELOG_AT_sched_err (ERRLOG_BASE+75)
+#define NELOG_AT_schedule_file_created (ERRLOG_BASE+76)
+#define NELOG_Srvnet_NB_Open (ERRLOG_BASE+77)
+#define NELOG_AT_Exec_Err (ERRLOG_BASE+78)
+#define NELOG_Lazy_Write_Err (ERRLOG_BASE+80)
+#define NELOG_HotFix (ERRLOG_BASE+81)
+#define NELOG_HardErr_From_Server (ERRLOG_BASE+82)
+#define NELOG_LocalSecFail1 (ERRLOG_BASE+83)
+#define NELOG_LocalSecFail2 (ERRLOG_BASE+84)
+#define NELOG_LocalSecFail3 (ERRLOG_BASE+85)
+#define NELOG_LocalSecGeneralFail (ERRLOG_BASE+86)
+#define NELOG_NetWkSta_Internal_Error (ERRLOG_BASE+90)
+#define NELOG_NetWkSta_No_Resource (ERRLOG_BASE+91)
+#define NELOG_NetWkSta_SMB_Err (ERRLOG_BASE+92)
+#define NELOG_NetWkSta_VC_Err (ERRLOG_BASE+93)
+#define NELOG_NetWkSta_Stuck_VC_Err (ERRLOG_BASE+94)
+#define NELOG_NetWkSta_NCB_Err (ERRLOG_BASE+95)
+#define NELOG_NetWkSta_Write_Behind_Err (ERRLOG_BASE+96)
+#define NELOG_NetWkSta_Reset_Err (ERRLOG_BASE+97)
+#define NELOG_NetWkSta_Too_Many (ERRLOG_BASE+98)
+#define NELOG_Srv_Thread_Failure (ERRLOG_BASE+104)
+#define NELOG_Srv_Close_Failure (ERRLOG_BASE+105)
+#define NELOG_ReplUserCurDir (ERRLOG_BASE+106)
+#define NELOG_ReplCannotMasterDir (ERRLOG_BASE+107)
+#define NELOG_ReplUpdateError (ERRLOG_BASE+108)
+#define NELOG_ReplLostMaster (ERRLOG_BASE+109)
+#define NELOG_NetlogonAuthDCFail (ERRLOG_BASE+110)
+#define NELOG_ReplLogonFailed (ERRLOG_BASE+111)
+#define NELOG_ReplNetErr (ERRLOG_BASE+112)
+#define NELOG_ReplMaxFiles (ERRLOG_BASE+113)
+#define NELOG_ReplMaxTreeDepth (ERRLOG_BASE+114)
+#define NELOG_ReplBadMsg (ERRLOG_BASE+115)
+#define NELOG_ReplSysErr (ERRLOG_BASE+116)
+#define NELOG_ReplUserLoged (ERRLOG_BASE+117)
+#define NELOG_ReplBadImport (ERRLOG_BASE+118)
+#define NELOG_ReplBadExport (ERRLOG_BASE+119)
+#define NELOG_ReplSignalFileErr (ERRLOG_BASE+120)
+#define NELOG_DiskFT (ERRLOG_BASE+121)
+#define NELOG_ReplAccessDenied (ERRLOG_BASE+122)
+#define NELOG_NetlogonFailedPrimary (ERRLOG_BASE+123)
+#define NELOG_NetlogonPasswdSetFailed (ERRLOG_BASE+124)
+#define NELOG_NetlogonTrackingError (ERRLOG_BASE+125)
+#define NELOG_NetlogonSyncError (ERRLOG_BASE+126)
+#define NELOG_UPS_PowerOut (ERRLOG_BASE+130)
+#define NELOG_UPS_Shutdown (ERRLOG_BASE+131)
+#define NELOG_UPS_CmdFileError (ERRLOG_BASE+132)
+#define NELOG_UPS_CannotOpenDriver (ERRLOG_BASE+133)
+#define NELOG_UPS_PowerBack (ERRLOG_BASE+134)
+#define NELOG_UPS_CmdFileConfig (ERRLOG_BASE+135)
+#define NELOG_UPS_CmdFileExec (ERRLOG_BASE+136)
+#define NELOG_Missing_Parameter (ERRLOG_BASE+150)
+#define NELOG_Invalid_Config_Line (ERRLOG_BASE+151)
+#define NELOG_Invalid_Config_File (ERRLOG_BASE+152)
+#define NELOG_File_Changed (ERRLOG_BASE+153)
+#define NELOG_Files_Dont_Fit (ERRLOG_BASE+154)
+#define NELOG_Wrong_DLL_Version (ERRLOG_BASE+155)
+#define NELOG_Error_in_DLL (ERRLOG_BASE+156)
+#define NELOG_System_Error (ERRLOG_BASE+157)
+#define NELOG_FT_ErrLog_Too_Large (ERRLOG_BASE+158)
+#define NELOG_FT_Update_In_Progress (ERRLOG_BASE+159)
+#define NELOG_OEM_Code (ERRLOG_BASE+199)
+#define NELOG_NetlogonSSIInitError ERRLOG2_BASE
+#define NELOG_NetlogonFailedToUpdateTrustList (ERRLOG2_BASE+1)
+#define NELOG_NetlogonFailedToAddRpcInterface (ERRLOG2_BASE+2)
+#define NELOG_NetlogonFailedToReadMailslot (ERRLOG2_BASE+3)
+#define NELOG_NetlogonFailedToRegisterSC (ERRLOG2_BASE+4)
+#define NELOG_NetlogonChangeLogCorrupt (ERRLOG2_BASE+5)
+#define NELOG_NetlogonFailedToCreateShare (ERRLOG2_BASE+6)
+#define NELOG_NetlogonDownLevelLogonFailed (ERRLOG2_BASE+7)
+#define NELOG_NetlogonDownLevelLogoffFailed (ERRLOG2_BASE+8)
+#define NELOG_NetlogonNTLogonFailed (ERRLOG2_BASE+9)
+#define NELOG_NetlogonNTLogoffFailed (ERRLOG2_BASE+10)
+#define NELOG_NetlogonPartialSyncCallSuccess (ERRLOG2_BASE+11)
+#define NELOG_NetlogonPartialSyncCallFailed (ERRLOG2_BASE+12)
+#define NELOG_NetlogonFullSyncCallSuccess (ERRLOG2_BASE+13)
+#define NELOG_NetlogonFullSyncCallFailed (ERRLOG2_BASE+14)
+#define NELOG_NetlogonPartialSyncSuccess (ERRLOG2_BASE+15)
+#define NELOG_NetlogonPartialSyncFailed (ERRLOG2_BASE+16)
+#define NELOG_NetlogonFullSyncSuccess (ERRLOG2_BASE+17)
+#define NELOG_NetlogonFullSyncFailed (ERRLOG2_BASE+18)
+#define NELOG_NetlogonAuthNoDomainController (ERRLOG2_BASE+19)
+#define NELOG_NetlogonAuthNoTrustLsaSecret (ERRLOG2_BASE+20)
+#define NELOG_NetlogonAuthNoTrustSamAccount (ERRLOG2_BASE+21)
+#define NELOG_NetlogonServerAuthFailed (ERRLOG2_BASE+22)
+#define NELOG_NetlogonServerAuthNoTrustSamAccount (ERRLOG2_BASE+23)
+#define NELOG_FailedToRegisterSC (ERRLOG2_BASE+24)
+#define NELOG_FailedToSetServiceStatus (ERRLOG2_BASE+25)
+#define NELOG_FailedToGetComputerName (ERRLOG2_BASE+26)
+#define NELOG_DriverNotLoaded (ERRLOG2_BASE+27)
+#define NELOG_NoTranportLoaded (ERRLOG2_BASE+28)
+#define NELOG_NetlogonFailedDomainDelta (ERRLOG2_BASE+29)
+#define NELOG_NetlogonFailedGlobalGroupDelta (ERRLOG2_BASE+30)
+#define NELOG_NetlogonFailedLocalGroupDelta (ERRLOG2_BASE+31)
+#define NELOG_NetlogonFailedUserDelta (ERRLOG2_BASE+32)
+#define NELOG_NetlogonFailedPolicyDelta (ERRLOG2_BASE+33)
+#define NELOG_NetlogonFailedTrustedDomainDelta (ERRLOG2_BASE+34)
+#define NELOG_NetlogonFailedAccountDelta (ERRLOG2_BASE+35)
+#define NELOG_NetlogonFailedSecretDelta (ERRLOG2_BASE+36)
+#define NELOG_NetlogonSystemError (ERRLOG2_BASE+37)
+#define NELOG_NetlogonDuplicateMachineAccounts (ERRLOG2_BASE+38)
+#define NELOG_NetlogonTooManyGlobalGroups (ERRLOG2_BASE+39)
+#define NELOG_NetlogonBrowserDriver (ERRLOG2_BASE+40)
+#define NELOG_NetlogonAddNameFailure (ERRLOG2_BASE+41)
+#define NELOG_RplMessages (ERRLOG2_BASE+42)
+#define NELOG_RplXnsBoot (ERRLOG2_BASE+43)
+#define NELOG_RplSystem (ERRLOG2_BASE+44)
+#define NELOG_RplWkstaTimeout (ERRLOG2_BASE+45)
+#define NELOG_RplWkstaFileOpen (ERRLOG2_BASE+46)
+#define NELOG_RplWkstaFileRead (ERRLOG2_BASE+47)
+#define NELOG_RplWkstaMemory (ERRLOG2_BASE+48)
+#define NELOG_RplWkstaFileChecksum (ERRLOG2_BASE+49)
+#define NELOG_RplWkstaFileLineCount (ERRLOG2_BASE+50)
+#define NELOG_RplWkstaBbcFile (ERRLOG2_BASE+51)
+#define NELOG_RplWkstaFileSize (ERRLOG2_BASE+52)
+#define NELOG_RplWkstaInternal (ERRLOG2_BASE+53)
+#define NELOG_RplWkstaWrongVersion (ERRLOG2_BASE+54)
+#define NELOG_RplWkstaNetwork (ERRLOG2_BASE+55)
+#define NELOG_RplAdapterResource (ERRLOG2_BASE+56)
+#define NELOG_RplFileCopy (ERRLOG2_BASE+57)
+#define NELOG_RplFileDelete (ERRLOG2_BASE+58)
+#define NELOG_RplFilePerms (ERRLOG2_BASE+59)
+#define NELOG_RplCheckConfigs (ERRLOG2_BASE+60)
+#define NELOG_RplCreateProfiles (ERRLOG2_BASE+61)
+#define NELOG_RplRegistry (ERRLOG2_BASE+62)
+#define NELOG_RplReplaceRPLDISK (ERRLOG2_BASE+63)
+#define NELOG_RplCheckSecurity (ERRLOG2_BASE+64)
+#define NELOG_RplBackupDatabase (ERRLOG2_BASE+65)
+#define NELOG_RplInitDatabase (ERRLOG2_BASE+66)
+#define NELOG_RplRestoreDatabaseFailure (ERRLOG2_BASE+67)
+#define NELOG_RplRestoreDatabaseSuccess (ERRLOG2_BASE+68)
+#define NELOG_RplInitRestoredDatabase (ERRLOG2_BASE+69)
+#define NELOG_NetlogonSessionTypeWrong (ERRLOG2_BASE+70)
+#define REVISED_ERROR_LOG_STRUCT
+typedef struct _ERROR_LOG {
+ DWORD el_len;
+ DWORD el_reserved;
+ DWORD el_time;
+ DWORD el_error;
+ LPWSTR el_name;
+ LPWSTR el_text;
+ LPBYTE el_data;
+ DWORD el_data_size;
+ DWORD el_nstrings;
+} ERROR_LOG,*PERROR_LOG,*LPERROR_LOG;
+NET_API_STATUS WINAPI NetErrorLogClear(LPCWSTR,LPCWSTR,LPBYTE);
+NET_API_STATUS WINAPI NetErrorLogRead(LPCWSTR,LPWSTR,LPHLOG,DWORD,LPDWORD,DWORD,DWORD,LPBYTE*,DWORD,LPDWORD,LPDWORD);
+NET_API_STATUS WINAPI NetErrorLogWrite(LPBYTE,DWORD,LPCWSTR,LPBYTE,DWORD,LPBYTE,DWORD,LPBYTE);
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/winsup/w32api/include/lmmsg.h b/winsup/w32api/include/lmmsg.h
new file mode 100644
index 000000000..01689812e
--- /dev/null
+++ b/winsup/w32api/include/lmmsg.h
@@ -0,0 +1,23 @@
+#ifndef _LMMSG_H
+#define _LMMSG_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+#define MSGNAME_NOT_FORWARDED 0
+#define MSGNAME_FORWARDED_TO 4
+#define MSGNAME_FORWARDED_FROM 16
+typedef struct _MSG_INFO_0 { LPWSTR msgi0_name; }MSG_INFO_0,*PMSG_INFO_0,*LPMSG_INFO_0;
+typedef struct _MSG_INFO_1 {
+ LPWSTR msgi1_name;
+ DWORD msgi1_forward_flag;
+ LPWSTR msgi1_forward;
+}MSG_INFO_1,*PMSG_INFO_1,*LPMSG_INFO_1;
+NET_API_STATUS WINAPI NetMessageBufferSend(LPCWSTR,LPCWSTR,LPCWSTR,PBYTE,DWORD);
+NET_API_STATUS WINAPI NetMessageNameAdd(LPCWSTR,LPCWSTR);
+NET_API_STATUS WINAPI NetMessageNameDel(LPCWSTR,LPCWSTR);
+NET_API_STATUS WINAPI NetMessageNameEnum(LPCWSTR,DWORD,PBYTE*,DWORD,PDWORD,PDWORD,PDWORD);
+NET_API_STATUS WINAPI NetMessageNameGetInfo(LPCWSTR,LPCWSTR,DWORD,PBYTE*);
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/winsup/w32api/include/lmremutl.h b/winsup/w32api/include/lmremutl.h
new file mode 100644
index 000000000..553bdbd5b
--- /dev/null
+++ b/winsup/w32api/include/lmremutl.h
@@ -0,0 +1,41 @@
+#ifndef _LMREMUTL_H
+#define _LMREMUTL_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+#define SUPPORTS_REMOTE_ADMIN_PROTOCOL 2
+#define SUPPORTS_RPC 4
+#define SUPPORTS_SAM_PROTOCOL 8
+#define SUPPORTS_UNICODE 16
+#define SUPPORTS_LOCAL 32
+#define SUPPORTS_ANY 0xFFFFFFFF
+#define NO_PERMISSION_REQUIRED 1
+#define ALLOCATE_RESPONSE 2
+#define USE_SPECIFIC_TRANSPORT 0x80000000
+#ifndef DESC_CHAR_UNICODE
+typedef CHAR DESC_CHAR;
+#else
+typedef WCHAR DESC_CHAR;
+#endif
+typedef DESC_CHAR *LPDESC;
+typedef struct _TIME_OF_DAY_INFO {
+ DWORD tod_elapsedt;
+ DWORD tod_msecs;
+ DWORD tod_hours;
+ DWORD tod_mins;
+ DWORD tod_secs;
+ DWORD tod_hunds;
+ LONG tod_timezone;
+ DWORD tod_tinterval;
+ DWORD tod_day;
+ DWORD tod_month;
+ DWORD tod_year;
+ DWORD tod_weekday;
+} TIME_OF_DAY_INFO,*PTIME_OF_DAY_INFO,*LPTIME_OF_DAY_INFO;
+NET_API_STATUS WINAPI NetRemoteTOD(LPCWSTR,PBYTE*);
+NET_API_STATUS WINAPI NetRemoteComputerSupports(LPCWSTR,DWORD,PDWORD);
+NET_API_STATUS RxRemoteApi(DWORD,LPCWSTR,LPDESC,LPDESC,LPDESC,LPDESC,LPDESC,LPDESC,LPDESC,DWORD,... );
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/winsup/w32api/include/lmrepl.h b/winsup/w32api/include/lmrepl.h
new file mode 100644
index 000000000..f0ca544a7
--- /dev/null
+++ b/winsup/w32api/include/lmrepl.h
@@ -0,0 +1,90 @@
+#ifndef _LMREPL_H
+#define _LMREPL_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+#define REPL_ROLE_EXPORT 1
+#define REPL_ROLE_IMPORT 2
+#define REPL_ROLE_BOTH 3
+#define REPL_INTERVAL_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+0)
+#define REPL_PULSE_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+1)
+#define REPL_GUARDTIME_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+2)
+#define REPL_RANDOM_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+3)
+#define REPL_UNLOCK_NOFORCE 0
+#define REPL_UNLOCK_FORCE 1
+#define REPL_STATE_OK 0
+#define REPL_STATE_NO_MASTER 1
+#define REPL_STATE_NO_SYNC 2
+#define REPL_STATE_NEVER_REPLICATED 3
+#define REPL_INTEGRITY_FILE 1
+#define REPL_INTEGRITY_TREE 2
+#define REPL_EXTENT_FILE 1
+#define REPL_EXTENT_TREE 2
+#define REPL_EXPORT_INTEGRITY_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+0)
+#define REPL_EXPORT_EXTENT_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+1)
+typedef struct _REPL_INFO_0 {
+ DWORD rp0_role;
+ LPWSTR rp0_exportpath;
+ LPWSTR rp0_exportlist;
+ LPWSTR rp0_importpath;
+ LPWSTR rp0_importlist;
+ LPWSTR rp0_logonusername;
+ DWORD rp0_interval;
+ DWORD rp0_pulse;
+ DWORD rp0_guardtime;
+ DWORD rp0_random;
+} REPL_INFO_0,*PREPL_INFO_0,*LPREPL_INFO_0;
+typedef struct _REPL_INFO_1000 { DWORD rp1000_interval; } REPL_INFO_1000,*PREPL_INFO_1000,*LPREPL_INFO_1000;
+typedef struct _REPL_INFO_1001 { DWORD rp1001_pulse; } REPL_INFO_1001,*PREPL_INFO_1001,*LPREPL_INFO_1001;
+typedef struct _REPL_INFO_1002 { DWORD rp1002_guardtime; } REPL_INFO_1002,*PREPL_INFO_1002,*LPREPL_INFO_1002;
+typedef struct _REPL_INFO_1003 { DWORD rp1003_random; } REPL_INFO_1003,*PREPL_INFO_1003,*LPREPL_INFO_1003;
+
+NET_API_STATUS WINAPI NetReplGetInfo(LPCWSTR,DWORD,PBYTE*);
+NET_API_STATUS WINAPI NetReplSetInfo(LPCWSTR,DWORD,PBYTE,PDWORD);
+typedef struct _REPL_EDIR_INFO_0 {
+ LPWSTR rped0_dirname;
+} REPL_EDIR_INFO_0,*PREPL_EDIR_INFO_0,*LPREPL_EDIR_INFO_0;
+typedef struct _REPL_EDIR_INFO_1 {
+ LPWSTR rped1_dirname;
+ DWORD rped1_integrity;
+ DWORD rped1_extent;
+} REPL_EDIR_INFO_1,*PREPL_EDIR_INFO_1,*LPREPL_EDIR_INFO_1;
+typedef struct _REPL_EDIR_INFO_2 {
+ LPWSTR rped2_dirname;
+ DWORD rped2_integrity;
+ DWORD rped2_extent;
+ DWORD rped2_lockcount;
+ DWORD rped2_locktime;
+} REPL_EDIR_INFO_2,*PREPL_EDIR_INFO_2,*LPREPL_EDIR_INFO_2;
+typedef struct _REPL_EDIR_INFO_1000 {
+ DWORD rped1000_integrity;
+} REPL_EDIR_INFO_1000,*PREPL_EDIR_INFO_1000,*LPREPL_EDIR_INFO_1000;
+typedef struct _REPL_EDIR_INFO_1001 {
+ DWORD rped1001_extent;
+} REPL_EDIR_INFO_1001,*PREPL_EDIR_INFO_1001,*LPREPL_EDIR_INFO_1001;
+typedef struct _REPL_IDIR_INFO_0 { LPWSTR rpid0_dirname; } REPL_IDIR_INFO_0,*PREPL_IDIR_INFO_0,*LPREPL_IDIR_INFO_0;
+typedef struct _REPL_IDIR_INFO_1 {
+ LPWSTR rpid1_dirname;
+ DWORD rpid1_state;
+ LPWSTR rpid1_mastername;
+ DWORD rpid1_last_update_time;
+ DWORD rpid1_lockcount;
+ DWORD rpid1_locktime;
+} REPL_IDIR_INFO_1,*PREPL_IDIR_INFO_1,*LPREPL_IDIR_INFO_1;
+NET_API_STATUS WINAPI NetReplExportDirAdd(LPCWSTR,DWORD,PBYTE,PDWORD);
+NET_API_STATUS WINAPI NetReplExportDirDel(LPCWSTR,LPCWSTR);
+NET_API_STATUS WINAPI NetReplExportDirEnum(LPCWSTR,DWORD,PBYTE*,DWORD,PDWORD,PDWORD,PDWORD);
+NET_API_STATUS WINAPI NetReplExportDirGetInfo(LPCWSTR,LPCWSTR,DWORD,PBYTE*);
+NET_API_STATUS WINAPI NetReplExportDirSetInfo(LPCWSTR,LPCWSTR,DWORD,PBYTE,PDWORD);
+NET_API_STATUS WINAPI NetReplExportDirLock(LPCWSTR,LPCWSTR);
+NET_API_STATUS WINAPI NetReplExportDirUnlock(LPCWSTR,LPCWSTR,DWORD);
+NET_API_STATUS WINAPI NetReplImportDirAdd(LPCWSTR,DWORD,PBYTE,PDWORD);
+NET_API_STATUS WINAPI NetReplImportDirDel(LPCWSTR,LPCWSTR);
+NET_API_STATUS WINAPI NetReplImportDirEnum(LPCWSTR,DWORD,PBYTE*,DWORD,PDWORD,PDWORD,PDWORD);
+NET_API_STATUS WINAPI NetReplImportDirGetInfo(LPCWSTR,LPCWSTR,DWORD,PBYTE*);
+NET_API_STATUS WINAPI NetReplImportDirLock(LPCWSTR,LPCWSTR);
+NET_API_STATUS WINAPI NetReplImportDirUnlock(LPCWSTR,LPCWSTR,DWORD);
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/winsup/w32api/include/lmserver.h b/winsup/w32api/include/lmserver.h
new file mode 100644
index 000000000..0064d0baf
--- /dev/null
+++ b/winsup/w32api/include/lmserver.h
@@ -0,0 +1,602 @@
+#ifndef _LMSERVER_H
+#define _LMSERVER_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+#include <winsvc.h>
+
+typedef struct _SERVER_INFO_100 {
+DWORD sv100_platform_id;
+LPTSTR sv100_name;
+} SERVER_INFO_100,*PSERVER_INFO_100,*LPSERVER_INFO_100;
+typedef struct _SERVER_INFO_101 {
+DWORD sv101_platform_id;
+LPTSTR sv101_name;
+DWORD sv101_version_major;
+DWORD sv101_version_minor;
+DWORD sv101_type;
+LPTSTR sv101_comment;
+} SERVER_INFO_101,*PSERVER_INFO_101,*LPSERVER_INFO_101;
+typedef struct _SERVER_INFO_102 {
+DWORD sv102_platform_id;
+LPTSTR sv102_name;
+DWORD sv102_version_major;
+DWORD sv102_version_minor;
+DWORD sv102_type;
+LPTSTR sv102_comment;
+DWORD sv102_users;
+LONG sv102_disc;
+BOOL sv102_hidden;
+DWORD sv102_announce;
+DWORD sv102_anndelta;
+DWORD sv102_licenses;
+LPTSTR sv102_userpath;
+} SERVER_INFO_102,*PSERVER_INFO_102,*LPSERVER_INFO_102;
+typedef struct _SERVER_INFO_402 {
+DWORD sv402_ulist_mtime;
+DWORD sv402_glist_mtime;
+DWORD sv402_alist_mtime;
+LPTSTR sv402_alerts;
+DWORD sv402_security;
+DWORD sv402_numadmin;
+DWORD sv402_lanmask;
+LPTSTR sv402_guestacct;
+DWORD sv402_chdevs;
+DWORD sv402_chdevq;
+DWORD sv402_chdevjobs;
+DWORD sv402_connections;
+DWORD sv402_shares;
+DWORD sv402_openfiles;
+DWORD sv402_sessopens;
+DWORD sv402_sessvcs;
+DWORD sv402_sessreqs;
+DWORD sv402_opensearch;
+DWORD sv402_activelocks;
+DWORD sv402_numreqbuf;
+DWORD sv402_sizreqbuf;
+DWORD sv402_numbigbuf;
+DWORD sv402_numfiletasks;
+DWORD sv402_alertsched;
+DWORD sv402_erroralert;
+DWORD sv402_logonalert;
+DWORD sv402_accessalert;
+DWORD sv402_diskalert;
+DWORD sv402_netioalert;
+DWORD sv402_maxauditsz;
+LPTSTR sv402_srvheuristics;
+} SERVER_INFO_402,*PSERVER_INFO_402,*LPSERVER_INFO_402;
+typedef struct _SERVER_INFO_403 {
+DWORD sv403_ulist_mtime;
+DWORD sv403_glist_mtime;
+DWORD sv403_alist_mtime;
+LPTSTR sv403_alerts;
+DWORD sv403_security;
+DWORD sv403_numadmin;
+DWORD sv403_lanmask;
+LPTSTR sv403_guestacct;
+DWORD sv403_chdevs;
+DWORD sv403_chdevq;
+DWORD sv403_chdevjobs;
+DWORD sv403_connections;
+DWORD sv403_shares;
+DWORD sv403_openfiles;
+DWORD sv403_sessopens;
+DWORD sv403_sessvcs;
+DWORD sv403_sessreqs;
+DWORD sv403_opensearch;
+DWORD sv403_activelocks;
+DWORD sv403_numreqbuf;
+DWORD sv403_sizreqbuf;
+DWORD sv403_numbigbuf;
+DWORD sv403_numfiletasks;
+DWORD sv403_alertsched;
+DWORD sv403_erroralert;
+DWORD sv403_logonalert;
+DWORD sv403_accessalert;
+DWORD sv403_diskalert;
+DWORD sv403_netioalert;
+DWORD sv403_maxauditsz;
+LPTSTR sv403_srvheuristics;
+DWORD sv403_auditedevents;
+DWORD sv403_autoprofile;
+LPTSTR sv403_autopath;
+} SERVER_INFO_403,*PSERVER_INFO_403,*LPSERVER_INFO_403;
+typedef struct _SERVER_INFO_502 {
+DWORD sv502_sessopens;
+DWORD sv502_sessvcs;
+DWORD sv502_opensearch;
+DWORD sv502_sizreqbuf;
+DWORD sv502_initworkitems;
+DWORD sv502_maxworkitems;
+DWORD sv502_rawworkitems;
+DWORD sv502_irpstacksize;
+DWORD sv502_maxrawbuflen;
+DWORD sv502_sessusers;
+DWORD sv502_sessconns;
+DWORD sv502_maxpagedmemoryusage;
+DWORD sv502_maxnonpagedmemoryusage;
+BOOL sv502_enablesoftcompat;
+BOOL sv502_enableforcedlogoff;
+BOOL sv502_timesource;
+BOOL sv502_acceptdownlevelapis;
+BOOL sv502_lmannounce;
+} SERVER_INFO_502,*PSERVER_INFO_502,*LPSERVER_INFO_502;
+typedef struct _SERVER_INFO_503 {
+DWORD sv503_sessopens;
+DWORD sv503_sessvcs;
+DWORD sv503_opensearch;
+DWORD sv503_sizreqbuf;
+DWORD sv503_initworkitems;
+DWORD sv503_maxworkitems;
+DWORD sv503_rawworkitems;
+DWORD sv503_irpstacksize;
+DWORD sv503_maxrawbuflen;
+DWORD sv503_sessusers;
+DWORD sv503_sessconns;
+DWORD sv503_maxpagedmemoryusage;
+DWORD sv503_maxnonpagedmemoryusage;
+BOOL sv503_enablesoftcompat;
+BOOL sv503_enableforcedlogoff;
+BOOL sv503_timesource;
+BOOL sv503_acceptdownlevelapis;
+BOOL sv503_lmannounce;
+LPTSTR sv503_domain;
+DWORD sv503_maxcopyreadlen;
+DWORD sv503_maxcopywritelen;
+DWORD sv503_minkeepsearch;
+DWORD sv503_maxkeepsearch;
+DWORD sv503_minkeepcomplsearch;
+DWORD sv503_maxkeepcomplsearch;
+DWORD sv503_threadcountadd;
+DWORD sv503_numblockthreads;
+DWORD sv503_scavtimeout;
+DWORD sv503_minrcvqueue;
+DWORD sv503_minfreeworkitems;
+DWORD sv503_xactmemsize;
+DWORD sv503_threadpriority;
+DWORD sv503_maxmpxct;
+DWORD sv503_oplockbreakwait;
+DWORD sv503_oplockbreakresponsewait;
+BOOL sv503_enableoplocks;
+BOOL sv503_enableoplockforceclose;
+BOOL sv503_enablefcbopens;
+BOOL sv503_enableraw;
+BOOL sv503_enablesharednetdrives;
+DWORD sv503_minfreeconnections;
+DWORD sv503_maxfreeconnections;
+} SERVER_INFO_503,*PSERVER_INFO_503,*LPSERVER_INFO_503;
+typedef struct _SERVER_INFO_599 {
+DWORD sv599_sessopens;
+DWORD sv599_sessvcs;
+DWORD sv599_opensearch;
+DWORD sv599_sizreqbuf;
+DWORD sv599_initworkitems;
+DWORD sv599_maxworkitems;
+DWORD sv599_rawworkitems;
+DWORD sv599_irpstacksize;
+DWORD sv599_maxrawbuflen;
+DWORD sv599_sessusers;
+DWORD sv599_sessconns;
+DWORD sv599_maxpagedmemoryusage;
+DWORD sv599_maxnonpagedmemoryusage;
+BOOL sv599_enablesoftcompat;
+BOOL sv599_enableforcedlogoff;
+BOOL sv599_timesource;
+BOOL sv599_acceptdownlevelapis;
+BOOL sv599_lmannounce;
+LPTSTR sv599_domain;
+DWORD sv599_maxcopyreadlen;
+DWORD sv599_maxcopywritelen;
+DWORD sv599_minkeepsearch;
+DWORD sv599_maxkeepsearch;
+DWORD sv599_minkeepcomplsearch;
+DWORD sv599_maxkeepcomplsearch;
+DWORD sv599_threadcountadd;
+DWORD sv599_numblockthreads;
+DWORD sv599_scavtimeout;
+DWORD sv599_minrcvqueue;
+DWORD sv599_minfreeworkitems;
+DWORD sv599_xactmemsize;
+DWORD sv599_threadpriority;
+DWORD sv599_maxmpxct;
+DWORD sv599_oplockbreakwait;
+DWORD sv599_oplockbreakresponsewait;
+BOOL sv599_enableoplocks;
+BOOL sv599_enableoplockforceclose;
+BOOL sv599_enablefcbopens;
+BOOL sv599_enableraw;
+BOOL sv599_enablesharednetdrives;
+DWORD sv599_minfreeconnections;
+DWORD sv599_maxfreeconnections;
+DWORD sv599_initsesstable;
+DWORD sv599_initconntable;
+DWORD sv599_initfiletable;
+DWORD sv599_initsearchtable;
+DWORD sv599_alertschedule;
+DWORD sv599_errorthreshold;
+DWORD sv599_networkerrorthreshold;
+DWORD sv599_diskspacethreshold;
+DWORD sv599_reserved;
+DWORD sv599_maxlinkdelay;
+DWORD sv599_minlinkthroughput;
+DWORD sv599_linkinfovalidtime;
+DWORD sv599_scavqosinfoupdatetime;
+DWORD sv599_maxworkitemidletime;
+} SERVER_INFO_599,*PSERVER_INFO_599,*LPSERVER_INFO_599;
+typedef struct _SERVER_INFO_598 {
+DWORD sv598_maxrawworkitems;
+DWORD sv598_maxthreadsperqueue;
+DWORD sv598_producttype;
+DWORD sv598_serversize;
+DWORD sv598_connectionlessautodisc;
+DWORD sv598_sharingviolationretries;
+DWORD sv598_sharingviolationdelay;
+DWORD sv598_maxglobalopensearch;
+DWORD sv598_removeduplicatesearches;
+DWORD sv598_lockviolationoffset;
+DWORD sv598_lockviolationdelay;
+DWORD sv598_mdlreadswitchover;
+DWORD sv598_cachedopenlimit;
+DWORD sv598_otherqueueaffinity;
+BOOL sv598_restrictnullsessaccess;
+BOOL sv598_enablewfw311directipx;
+DWORD sv598_queuesamplesecs;
+DWORD sv598_balancecount;
+DWORD sv598_preferredaffinity;
+DWORD sv598_maxfreerfcbs;
+DWORD sv598_maxfreemfcbs;
+DWORD sv598_maxfreelfcbs;
+DWORD sv598_maxfreepagedpoolchunks;
+DWORD sv598_minpagedpoolchunksize;
+DWORD sv598_maxpagedpoolchunksize;
+BOOL sv598_sendsfrompreferredprocessor;
+} SERVER_INFO_598,*PSERVER_INFO_598,*LPSERVER_INFO_598;
+typedef struct _SERVER_INFO_1005 {LPTSTR sv1005_comment; } SERVER_INFO_1005,*PSERVER_INFO_1005,*LPSERVER_INFO_1005;
+typedef struct _SERVER_INFO_1107 { DWORD sv1107_users; } SERVER_INFO_1107,*PSERVER_INFO_1107,*LPSERVER_INFO_1107;
+typedef struct _SERVER_INFO_1010 { LONG sv1010_disc; } SERVER_INFO_1010,*PSERVER_INFO_1010,*LPSERVER_INFO_1010;
+typedef struct _SERVER_INFO_1016 { BOOL sv1016_hidden; } SERVER_INFO_1016,*PSERVER_INFO_1016,*LPSERVER_INFO_1016;
+typedef struct _SERVER_INFO_1017 { DWORD sv1017_announce; } SERVER_INFO_1017,*PSERVER_INFO_1017,*LPSERVER_INFO_1017;
+typedef struct _SERVER_INFO_1018 { DWORD sv1018_anndelta; } SERVER_INFO_1018,*PSERVER_INFO_1018,*LPSERVER_INFO_1018;
+typedef struct _SERVER_INFO_1501 { DWORD sv1501_sessopens; } SERVER_INFO_1501,*PSERVER_INFO_1501,*LPSERVER_INFO_1501;
+typedef struct _SERVER_INFO_1502 { DWORD sv1502_sessvcs; } SERVER_INFO_1502,*PSERVER_INFO_1502,*LPSERVER_INFO_1502;
+typedef struct _SERVER_INFO_1503 { DWORD sv1503_opensearch; } SERVER_INFO_1503,*PSERVER_INFO_1503,*LPSERVER_INFO_1503;
+typedef struct _SERVER_INFO_1506 { DWORD sv1506_maxworkitems; } SERVER_INFO_1506,*PSERVER_INFO_1506,*LPSERVER_INFO_1506;
+typedef struct _SERVER_INFO_1509 { DWORD sv1509_maxrawbuflen; } SERVER_INFO_1509,*PSERVER_INFO_1509,*LPSERVER_INFO_1509;
+typedef struct _SERVER_INFO_1510 { DWORD sv1510_sessusers; } SERVER_INFO_1510,*PSERVER_INFO_1510,*LPSERVER_INFO_1510;
+typedef struct _SERVER_INFO_1511 { DWORD sv1511_sessconns; } SERVER_INFO_1511,*PSERVER_INFO_1511,*LPSERVER_INFO_1511;
+typedef struct _SERVER_INFO_1512 { DWORD sv1512_maxnonpagedmemoryusage; } SERVER_INFO_1512,*PSERVER_INFO_1512,*LPSERVER_INFO_1512;
+typedef struct _SERVER_INFO_1513 { DWORD sv1513_maxpagedmemoryusage; } SERVER_INFO_1513,*PSERVER_INFO_1513,*LPSERVER_INFO_1513;
+typedef struct _SERVER_INFO_1514 { BOOL sv1514_enablesoftcompat; } SERVER_INFO_1514,*PSERVER_INFO_1514,*LPSERVER_INFO_1514;
+typedef struct _SERVER_INFO_1515 { BOOL sv1515_enableforcedlogoff; } SERVER_INFO_1515,*PSERVER_INFO_1515,*LPSERVER_INFO_1515;
+typedef struct _SERVER_INFO_1516 { BOOL sv1516_timesource; } SERVER_INFO_1516,*PSERVER_INFO_1516,*LPSERVER_INFO_1516;
+typedef struct _SERVER_INFO_1518 { BOOL sv1518_lmannounce; } SERVER_INFO_1518,*PSERVER_INFO_1518,*LPSERVER_INFO_1518;
+typedef struct _SERVER_INFO_1520 { DWORD sv1520_maxcopyreadlen; } SERVER_INFO_1520,*PSERVER_INFO_1520,*LPSERVER_INFO_1520;
+typedef struct _SERVER_INFO_1521 { DWORD sv1521_maxcopywritelen; } SERVER_INFO_1521,*PSERVER_INFO_1521,*LPSERVER_INFO_1521;
+typedef struct _SERVER_INFO_1522 { DWORD sv1522_minkeepsearch; } SERVER_INFO_1522,*PSERVER_INFO_1522,*LPSERVER_INFO_1522;
+typedef struct _SERVER_INFO_1523 { DWORD sv1523_maxkeepsearch; } SERVER_INFO_1523,*PSERVER_INFO_1523,*LPSERVER_INFO_1523;
+typedef struct _SERVER_INFO_1524 { DWORD sv1524_minkeepcomplsearch; } SERVER_INFO_1524,*PSERVER_INFO_1524,*LPSERVER_INFO_1524;
+typedef struct _SERVER_INFO_1525 { DWORD sv1525_maxkeepcomplsearch; } SERVER_INFO_1525,*PSERVER_INFO_1525,*LPSERVER_INFO_1525;
+typedef struct _SERVER_INFO_1528 { DWORD sv1528_scavtimeout; } SERVER_INFO_1528,*PSERVER_INFO_1528,*LPSERVER_INFO_1528;
+typedef struct _SERVER_INFO_1529 { DWORD sv1529_minrcvqueue; } SERVER_INFO_1529,*PSERVER_INFO_1529,*LPSERVER_INFO_1529;
+typedef struct _SERVER_INFO_1530 { DWORD sv1530_minfreeworkitems; } SERVER_INFO_1530,*PSERVER_INFO_1530,*LPSERVER_INFO_1530;
+typedef struct _SERVER_INFO_1533 { DWORD sv1533_maxmpxct; } SERVER_INFO_1533,*PSERVER_INFO_1533,*LPSERVER_INFO_1533;
+typedef struct _SERVER_INFO_1534 { DWORD sv1534_oplockbreakwait; } SERVER_INFO_1534,*PSERVER_INFO_1534,*LPSERVER_INFO_1534;
+typedef struct _SERVER_INFO_1535 { DWORD sv1535_oplockbreakresponsewait; } SERVER_INFO_1535,*PSERVER_INFO_1535,*LPSERVER_INFO_1535;
+typedef struct _SERVER_INFO_1536 { BOOL sv1536_enableoplocks; } SERVER_INFO_1536,*PSERVER_INFO_1536,*LPSERVER_INFO_1536;
+typedef struct _SERVER_INFO_1537 { BOOL sv1537_enableoplockforceclose; } SERVER_INFO_1537,*PSERVER_INFO_1537,*LPSERVER_INFO_1537;
+typedef struct _SERVER_INFO_1538 { BOOL sv1538_enablefcbopens; } SERVER_INFO_1538,*PSERVER_INFO_1538,*LPSERVER_INFO_1538;
+typedef struct _SERVER_INFO_1539 { BOOL sv1539_enableraw; } SERVER_INFO_1539,*PSERVER_INFO_1539,*LPSERVER_INFO_1539;
+typedef struct _SERVER_INFO_1540 { BOOL sv1540_enablesharednetdrives; } SERVER_INFO_1540,*PSERVER_INFO_1540,*LPSERVER_INFO_1540;
+typedef struct _SERVER_INFO_1541 { BOOL sv1541_minfreeconnections; } SERVER_INFO_1541,*PSERVER_INFO_1541,*LPSERVER_INFO_1541;
+typedef struct _SERVER_INFO_1542 { BOOL sv1542_maxfreeconnections; } SERVER_INFO_1542,*PSERVER_INFO_1542,*LPSERVER_INFO_1542;
+typedef struct _SERVER_INFO_1543 { DWORD sv1543_initsesstable; } SERVER_INFO_1543,*PSERVER_INFO_1543,*LPSERVER_INFO_1543;
+typedef struct _SERVER_INFO_1544 { DWORD sv1544_initconntable; } SERVER_INFO_1544,*PSERVER_INFO_1544,*LPSERVER_INFO_1544;
+typedef struct _SERVER_INFO_1545 { DWORD sv1545_initfiletable; } SERVER_INFO_1545,*PSERVER_INFO_1545,*LPSERVER_INFO_1545;
+typedef struct _SERVER_INFO_1546 { DWORD sv1546_initsearchtable; } SERVER_INFO_1546,*PSERVER_INFO_1546,*LPSERVER_INFO_1546;
+typedef struct _SERVER_INFO_1547 { DWORD sv1547_alertschedule; } SERVER_INFO_1547,*PSERVER_INFO_1547,*LPSERVER_INFO_1547;
+typedef struct _SERVER_INFO_1548 { DWORD sv1548_errorthreshold; } SERVER_INFO_1548,*PSERVER_INFO_1548,*LPSERVER_INFO_1548;
+typedef struct _SERVER_INFO_1549 { DWORD sv1549_networkerrorthreshold; } SERVER_INFO_1549,*PSERVER_INFO_1549,*LPSERVER_INFO_1549;
+typedef struct _SERVER_INFO_1550 { DWORD sv1550_diskspacethreshold; } SERVER_INFO_1550,*PSERVER_INFO_1550,*LPSERVER_INFO_1550;
+typedef struct _SERVER_INFO_1552 { DWORD sv1552_maxlinkdelay; } SERVER_INFO_1552,*PSERVER_INFO_1552,*LPSERVER_INFO_1552;
+typedef struct _SERVER_INFO_1553 { DWORD sv1553_minlinkthroughput; } SERVER_INFO_1553,*PSERVER_INFO_1553,*LPSERVER_INFO_1553;
+typedef struct _SERVER_INFO_1554 { DWORD sv1554_linkinfovalidtime; } SERVER_INFO_1554,*PSERVER_INFO_1554,*LPSERVER_INFO_1554;
+typedef struct _SERVER_INFO_1555 { DWORD sv1555_scavqosinfoupdatetime; } SERVER_INFO_1555,*PSERVER_INFO_1555,*LPSERVER_INFO_1555;
+typedef struct _SERVER_INFO_1556 { DWORD sv1556_maxworkitemidletime; } SERVER_INFO_1556,*PSERVER_INFO_1556,*LPSERVER_INFO_1556;
+typedef struct _SERVER_INFO_1557 { DWORD sv1557_maxrawworkitems; } SERVER_INFO_1557,*PSERVER_INFO_1557,*LPSERVER_INFO_1557;
+typedef struct _SERVER_INFO_1560 { DWORD sv1560_producttype; } SERVER_INFO_1560,*PSERVER_INFO_1560,*LPSERVER_INFO_1560;
+typedef struct _SERVER_INFO_1561 { DWORD sv1561_serversize; } SERVER_INFO_1561,*PSERVER_INFO_1561,*LPSERVER_INFO_1561;
+typedef struct _SERVER_INFO_1562 { DWORD sv1562_connectionlessautodisc; } SERVER_INFO_1562,*PSERVER_INFO_1562,*LPSERVER_INFO_1562;
+typedef struct _SERVER_INFO_1563 { DWORD sv1563_sharingviolationretries; } SERVER_INFO_1563,*PSERVER_INFO_1563,*LPSERVER_INFO_1563;
+typedef struct _SERVER_INFO_1564 { DWORD sv1564_sharingviolationdelay; } SERVER_INFO_1564,*PSERVER_INFO_1564,*LPSERVER_INFO_1564;
+typedef struct _SERVER_INFO_1565 { DWORD sv1565_maxglobalopensearch; } SERVER_INFO_1565,*PSERVER_INFO_1565,*LPSERVER_INFO_1565;
+typedef struct _SERVER_INFO_1566 { BOOL sv1566_removeduplicatesearches; } SERVER_INFO_1566,*PSERVER_INFO_1566,*LPSERVER_INFO_1566;
+typedef struct _SERVER_INFO_1567 { DWORD sv1567_lockviolationretries; } SERVER_INFO_1567,*PSERVER_INFO_1567,*LPSERVER_INFO_1567;
+typedef struct _SERVER_INFO_1568 { DWORD sv1568_lockviolationoffset; } SERVER_INFO_1568,*PSERVER_INFO_1568,*LPSERVER_INFO_1568;
+typedef struct _SERVER_INFO_1569 { DWORD sv1569_lockviolationdelay; } SERVER_INFO_1569,*PSERVER_INFO_1569,*LPSERVER_INFO_1569;
+typedef struct _SERVER_INFO_1570 { DWORD sv1570_mdlreadswitchover; } SERVER_INFO_1570,*PSERVER_INFO_1570,*LPSERVER_INFO_1570;
+typedef struct _SERVER_INFO_1571 { DWORD sv1571_cachedopenlimit; } SERVER_INFO_1571,*PSERVER_INFO_1571,*LPSERVER_INFO_1571;
+typedef struct _SERVER_INFO_1572 { DWORD sv1572_criticalthreads; } SERVER_INFO_1572,*PSERVER_INFO_1572,*LPSERVER_INFO_1572;
+typedef struct _SERVER_INFO_1573 { DWORD sv1573_restrictnullsessaccess; } SERVER_INFO_1573,*PSERVER_INFO_1573,*LPSERVER_INFO_1573;
+typedef struct _SERVER_INFO_1574 { DWORD sv1574_enablewfw311directipx;} SERVER_INFO_1574,*PSERVER_INFO_1574,*LPSERVER_INFO_1574;
+typedef struct _SERVER_INFO_1575 { DWORD sv1575_otherqueueaffinity; } SERVER_INFO_1575,*PSERVER_INFO_1575,*LPSERVER_INFO_1575;
+typedef struct _SERVER_INFO_1576 { DWORD sv1576_queuesamplesecs; } SERVER_INFO_1576,*PSERVER_INFO_1576,*LPSERVER_INFO_1576;
+typedef struct _SERVER_INFO_1577 { DWORD sv1577_balancecount; } SERVER_INFO_1577,*PSERVER_INFO_1577,*LPSERVER_INFO_1577;
+typedef struct _SERVER_INFO_1578 { DWORD sv1578_preferredaffinity; } SERVER_INFO_1578,*PSERVER_INFO_1578,*LPSERVER_INFO_1578;
+typedef struct _SERVER_INFO_1579 { DWORD sv1579_maxfreerfcbs; } SERVER_INFO_1579,*PSERVER_INFO_1579,*LPSERVER_INFO_1579;
+typedef struct _SERVER_INFO_1580 { DWORD sv1580_maxfreemfcbs; } SERVER_INFO_1580,*PSERVER_INFO_1580,*LPSERVER_INFO_1580;
+typedef struct _SERVER_INFO_1581 { DWORD sv1581_maxfreemlcbs; } SERVER_INFO_1581,*PSERVER_INFO_1581,*LPSERVER_INFO_1581;
+typedef struct _SERVER_INFO_1582 { DWORD sv1582_maxfreepagedpoolchunks; } SERVER_INFO_1582,*PSERVER_INFO_1582,*LPSERVER_INFO_1582;
+typedef struct _SERVER_INFO_1583 { DWORD sv1583_minpagedpoolchunksize; } SERVER_INFO_1583,*PSERVER_INFO_1583,*LPSERVER_INFO_1583;
+typedef struct _SERVER_INFO_1584 { DWORD sv1584_maxpagedpoolchunksize; } SERVER_INFO_1584,*PSERVER_INFO_1584,*LPSERVER_INFO_1584;
+typedef struct _SERVER_INFO_1585 { BOOL sv1585_sendsfrompreferredprocessor; } SERVER_INFO_1585,*PSERVER_INFO_1585,*LPSERVER_INFO_1585;
+typedef struct _SERVER_INFO_1586 { BOOL sv1586_maxthreadsperqueue; } SERVER_INFO_1586,*PSERVER_INFO_1586,*LPSERVER_INFO_1586;
+typedef struct _SERVER_TRANSPORT_INFO_0 {
+DWORD svti0_numberofvcs;
+LPTSTR svti0_transportname;
+PBYTE svti0_transportaddress;
+DWORD svti0_transportaddresslength;
+LPTSTR svti0_networkaddress;
+} SERVER_TRANSPORT_INFO_0,*PSERVER_TRANSPORT_INFO_0,*LPSERVER_TRANSPORT_INFO_0;
+
+NET_API_STATUS WINAPI NetServerEnum(LPCWSTR,DWORD,PBYTE*,DWORD,PDWORD,PDWORD,DWORD,LPCWSTR,PDWORD);
+NET_API_STATUS WINAPI NetServerEnumEx(LPCWSTR,DWORD,PBYTE*,DWORD,PDWORD,PDWORD,DWORD,LPCWSTR,LPCWSTR);
+NET_API_STATUS WINAPI NetServerGetInfo(LPTSTR,DWORD,PBYTE*);
+NET_API_STATUS WINAPI NetServerSetInfo(LPTSTR,DWORD,PBYTE,PDWORD);
+NET_API_STATUS NetServerSetInfoCommandLine(WORD,LPTSTR*);
+NET_API_STATUS WINAPI NetServerDiskEnum(LPTSTR,DWORD,PBYTE*,DWORD,PDWORD,PDWORD,PDWORD);
+NET_API_STATUS WINAPI NetServerComputerNameAdd(LPWSTR,LPWSTR,LPWSTR);
+NET_API_STATUS WINAPI NetServerComputerNameDel(LPWSTR,LPWSTR);
+NET_API_STATUS WINAPI NetServerTransportAdd(LPTSTR,DWORD,PBYTE);
+NET_API_STATUS WINAPI NetServerTransportAddEx(LPTSTR,DWORD,PBYTE);
+NET_API_STATUS WINAPI NetServerTransportDel(LPTSTR,DWORD,PBYTE);
+NET_API_STATUS WINAPI NetServerTransportEnum(LPTSTR,DWORD,PBYTE*,DWORD,PDWORD,PDWORD,PDWORD);
+BOOL SetServiceBits(SERVICE_STATUS_HANDLE,DWORD,BOOL,BOOL);
+
+#define SVI1_NUM_ELEMENTS 5
+#define SVI2_NUM_ELEMENTS 40
+#define SVI3_NUM_ELEMENTS 44
+#define SV_MAX_CMD_LEN PATHLEN
+#define SW_AUTOPROF_LOAD_MASK 1
+#define SW_AUTOPROF_SAVE_MASK 2
+#define SV_MAX_SRV_HEUR_LEN 32
+#define SV_USERS_PER_LICENSE 5
+#define SV_PLATFORM_ID_OS2 400
+#define SV_PLATFORM_ID_NT 500
+#define MAJOR_VERSION_MASK 15
+#define SV_TYPE_WORKSTATION 1
+#define SV_TYPE_SERVER 2
+#define SV_TYPE_SQLSERVER 4
+#define SV_TYPE_DOMAIN_CTRL 8
+#define SV_TYPE_DOMAIN_BAKCTRL 16
+#define SV_TYPE_TIME_SOURCE 32
+#define SV_TYPE_AFP 64
+#define SV_TYPE_NOVELL 128
+#define SV_TYPE_DOMAIN_MEMBER 256
+#define SV_TYPE_PRINTQ_SERVER 512
+#define SV_TYPE_DIALIN_SERVER 1024
+#define SV_TYPE_XENIX_SERVER 2048
+#define SV_TYPE_SERVER_UNIX SV_TYPE_XENIX_SERVER
+#define SV_TYPE_NT 4096
+#define SV_TYPE_WFW 8192
+#define SV_TYPE_SERVER_MFPN 16384
+#define SV_TYPE_SERVER_NT 32768
+#define SV_TYPE_POTENTIAL_BROWSER 65536
+#define SV_TYPE_BACKUP_BROWSER 0x20000
+#define SV_TYPE_MASTER_BROWSER 0x40000
+#define SV_TYPE_DOMAIN_MASTER 0x80000
+#define SV_TYPE_SERVER_OSF 0x100000
+#define SV_TYPE_SERVER_VMS 0x200000
+#define SV_TYPE_WINDOWS 0x400000
+#define SV_TYPE_ALTERNATE_XPORT 0x20000000
+#define SV_TYPE_LOCAL_LIST_ONLY 0x40000000
+#define SV_TYPE_DOMAIN_ENUM 0x80000000
+#define SV_TYPE_ALL 0xFFFFFFFF
+#define SV_NODISC (-1)
+#define SV_USERSECURITY 1
+#define SV_SHARESECURITY 0
+#define SV_HIDDEN 1
+#define SV_VISIBLE 0
+#define SV_PLATFORM_ID_PARMNUM 101
+#define SV_NAME_PARMNUM 102
+#define SV_VERSION_MAJOR_PARMNUM 103
+#define SV_VERSION_MINOR_PARMNUM 104
+#define SV_TYPE_PARMNUM 105
+#define SV_COMMENT_PARMNUM 5
+#define SV_USERS_PARMNUM 107
+#define SV_DISC_PARMNUM 10
+#define SV_HIDDEN_PARMNUM 16
+#define SV_ANNOUNCE_PARMNUM 17
+#define SV_ANNDELTA_PARMNUM 18
+#define SV_USERPATH_PARMNUM 112
+#define SV_ULIST_MTIME_PARMNUM 401
+#define SV_GLIST_MTIME_PARMNUM 402
+#define SV_ALIST_MTIME_PARMNUM 403
+#define SV_ALERTS_PARMNUM 11
+#define SV_SECURITY_PARMNUM 405
+#define SV_NUMADMIN_PARMNUM 406
+#define SV_LANMASK_PARMNUM 407
+#define SV_GUESTACC_PARMNUM 408
+#define SV_CHDEVQ_PARMNUM 410
+#define SV_CHDEVJOBS_PARMNUM 411
+#define SV_CONNECTIONS_PARMNUM 412
+#define SV_SHARES_PARMNUM 413
+#define SV_OPENFILES_PARMNUM 414
+#define SV_SESSREQS_PARMNUM 417
+#define SV_ACTIVELOCKS_PARMNUM 419
+#define SV_NUMREQBUF_PARMNUM 420
+#define SV_NUMBIGBUF_PARMNUM 422
+#define SV_NUMFILETASKS_PARMNUM 423
+#define SV_ALERTSCHED_PARMNUM 37
+#define SV_ERRORALERT_PARMNUM 38
+#define SV_LOGONALERT_PARMNUM 39
+#define SV_ACCESSALERT_PARMNUM 40
+#define SV_DISKALERT_PARMNUM 41
+#define SV_NETIOALERT_PARMNUM 42
+#define SV_MAXAUDITSZ_PARMNUM 43
+#define SV_SRVHEURISTICS_PARMNUM 431
+#define SV_SESSOPENS_PARMNUM 501
+#define SV_SESSVCS_PARMNUM 502
+#define SV_OPENSEARCH_PARMNUM 503
+#define SV_SIZREQBUF_PARMNUM 504
+#define SV_INITWORKITEMS_PARMNUM 505
+#define SV_MAXWORKITEMS_PARMNUM 506
+#define SV_RAWWORKITEMS_PARMNUM 507
+#define SV_IRPSTACKSIZE_PARMNUM 508
+#define SV_MAXRAWBUFLEN_PARMNUM 509
+#define SV_SESSUSERS_PARMNUM 510
+#define SV_SESSCONNS_PARMNUM 511
+#define SV_MAXNONPAGEDMEMORYUSAGE_PARMNUM 512
+#define SV_MAXPAGEDMEMORYUSAGE_PARMNUM 513
+#define SV_ENABLESOFTCOMPAT_PARMNUM 514
+#define SV_ENABLEFORCEDLOGOFF_PARMNUM 515
+#define SV_TIMESOURCE_PARMNUM 516
+#define SV_ACCEPTDOWNLEVELAPIS_PARMNUM 517
+#define SV_LMANNOUNCE_PARMNUM 518
+#define SV_DOMAIN_PARMNUM 519
+#define SV_MAXCOPYREADLEN_PARMNUM 520
+#define SV_MAXCOPYWRITELEN_PARMNUM 521
+#define SV_MINKEEPSEARCH_PARMNUM 522
+#define SV_MAXKEEPSEARCH_PARMNUM 523
+#define SV_MINKEEPCOMPLSEARCH_PARMNUM 524
+#define SV_MAXKEEPCOMPLSEARCH_PARMNUM 525
+#define SV_THREADCOUNTADD_PARMNUM 526
+#define SV_NUMBLOCKTHREADS_PARMNUM 527
+#define SV_SCAVTIMEOUT_PARMNUM 528
+#define SV_MINRCVQUEUE_PARMNUM 529
+#define SV_MINFREEWORKITEMS_PARMNUM 530
+#define SV_XACTMEMSIZE_PARMNUM 531
+#define SV_THREADPRIORITY_PARMNUM 532
+#define SV_MAXMPXCT_PARMNUM 533
+#define SV_OPLOCKBREAKWAIT_PARMNUM 534
+#define SV_OPLOCKBREAKRESPONSEWAIT_PARMNUM 535
+#define SV_ENABLEOPLOCKS_PARMNUM 536
+#define SV_ENABLEOPLOCKFORCECLOSE_PARMNUM 537
+#define SV_ENABLEFCBOPENS_PARMNUM 538
+#define SV_ENABLERAW_PARMNUM 539
+#define SV_ENABLESHAREDNETDRIVES_PARMNUM 540
+#define SV_MINFREECONNECTIONS_PARMNUM 541
+#define SV_MAXFREECONNECTIONS_PARMNUM 542
+#define SV_INITSESSTABLE_PARMNUM 543
+#define SV_INITCONNTABLE_PARMNUM 544
+#define SV_INITFILETABLE_PARMNUM 545
+#define SV_INITSEARCHTABLE_PARMNUM 546
+#define SV_ALERTSCHEDULE_PARMNUM 547
+#define SV_ERRORTHRESHOLD_PARMNUM 548
+#define SV_NETWORKERRORTHRESHOLD_PARMNUM 549
+#define SV_DISKSPACETHRESHOLD_PARMNUM 550
+#define SV_MAXLINKDELAY_PARMNUM 552
+#define SV_MINLINKTHROUGHPUT_PARMNUM 553
+#define SV_LINKINFOVALIDTIME_PARMNUM 554
+#define SV_SCAVQOSINFOUPDATETIME_PARMNUM 555
+#define SV_MAXWORKITEMIDLETIME_PARMNUM 556
+#define SV_MAXRAWWORKITEMS_PARMNUM 557
+#define SV_PRODUCTTYPE_PARMNUM 560
+#define SV_SERVERSIZE_PARMNUM 561
+#define SV_CONNECTIONLESSAUTODISC_PARMNUM 562
+#define SV_SHARINGVIOLATIONRETRIES_PARMNUM 563
+#define SV_SHARINGVIOLATIONDELAY_PARMNUM 564
+#define SV_MAXGLOBALOPENSEARCH_PARMNUM 565
+#define SV_REMOVEDUPLICATESEARCHES_PARMNUM 566
+#define SV_LOCKVIOLATIONRETRIES_PARMNUM 567
+#define SV_LOCKVIOLATIONOFFSET_PARMNUM 568
+#define SV_LOCKVIOLATIONDELAY_PARMNUM 569
+#define SV_MDLREADSWITCHOVER_PARMNUM 570
+#define SV_CACHEDOPENLIMIT_PARMNUM 571
+#define SV_CRITICALTHREADS_PARMNUM 572
+#define SV_RESTRICTNULLSESSACCESS_PARMNUM 573
+#define SV_ENABLEWFW311DIRECTIPX_PARMNUM 574
+#define SV_OTHERQUEUEAFFINITY_PARMNUM 575
+#define SV_QUEUESAMPLESECS_PARMNUM 576
+#define SV_BALANCECOUNT_PARMNUM 577
+#define SV_PREFERREDAFFINITY_PARMNUM 578
+#define SV_MAXFREERFCBS_PARMNUM 579
+#define SV_MAXFREEMFCBS_PARMNUM 580
+#define SV_MAXFREELFCBS_PARMNUM 581
+#define SV_MAXFREEPAGEDPOOLCHUNKS_PARMNUM 582
+#define SV_MINPAGEDPOOLCHUNKSIZE_PARMNUM 583
+#define SV_MAXPAGEDPOOLCHUNKSIZE_PARMNUM 584
+#define SV_SENDSFROMPREFERREDPROCESSOR_PARMNUM 585
+#define SV_MAXTHREADSPERQUEUE_PARMNUM 586
+#define SV_COMMENT_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_COMMENT_PARMNUM)
+#define SV_USERS_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_USERS_PARMNUM)
+#define SV_DISC_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_DISC_PARMNUM)
+#define SV_HIDDEN_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_HIDDEN_PARMNUM)
+#define SV_ANNOUNCE_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_ANNOUNCE_PARMNUM)
+#define SV_ANNDELTA_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_ANNDELTA_PARMNUM)
+#define SV_SESSOPENS_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_SESSOPENS_PARMNUM)
+#define SV_SESSVCS_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_SESSVCS_PARMNUM)
+#define SV_OPENSEARCH_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_OPENSEARCH_PARMNUM)
+#define SV_MAXWORKITEMS_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_MAXWORKITEMS_PARMNUM)
+#define SV_MAXRAWBUFLEN_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_MAXRAWBUFLEN_PARMNUM)
+#define SV_SESSUSERS_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_SESSUSERS_PARMNUM)
+#define SV_SESSCONNS_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_SESSCONNS_PARMNUM)
+#define SV_MAXNONPAGEDMEMORYUSAGE_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_MAXNONPAGEDMEMORYUSAGE_PARMNUM)
+#define SV_MAXPAGEDMEMORYUSAGE_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_MAXPAGEDMEMORYUSAGE_PARMNUM)
+#define SV_ENABLESOFTCOMPAT_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_ENABLESOFTCOMPAT_PARMNUM)
+#define SV_ENABLEFORCEDLOGOFF_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_ENABLEFORCEDLOGOFF_PARMNUM)
+#define SV_TIMESOURCE_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_TIMESOURCE_PARMNUM)
+#define SV_LMANNOUNCE_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_LMANNOUNCE_PARMNUM)
+#define SV_MAXCOPYREADLEN_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_MAXCOPYREADLEN_PARMNUM)
+#define SV_MAXCOPYWRITELEN_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_MAXCOPYWRITELEN_PARMNUM)
+#define SV_MINKEEPSEARCH_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_MINKEEPSEARCH_PARMNUM)
+#define SV_MAXKEEPSEARCH_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_MAXKEEPSEARCH_PARMNUM)
+#define SV_MINKEEPCOMPLSEARCH_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_MINKEEPCOMPLSEARCH_PARMNUM)
+#define SV_MAXKEEPCOMPLSEARCH_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_MAXKEEPCOMPLSEARCH_PARMNUM)
+#define SV_SCAVTIMEOUT_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_SCAVTIMEOUT_PARMNUM)
+#define SV_MINRCVQUEUE_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_MINRCVQUEUE_PARMNUM)
+#define SV_MINFREEWORKITEMS_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_MINFREEWORKITEMS_PARMNUM)
+#define SV_MAXMPXCT_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_MAXMPXCT_PARMNUM)
+#define SV_OPLOCKBREAKWAIT_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_OPLOCKBREAKWAIT_PARMNUM)
+#define SV_OPLOCKBREAKRESPONSEWAIT_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_OPLOCKBREAKRESPONSEWAIT_PARMNUM)
+#define SV_ENABLEOPLOCKS_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_ENABLEOPLOCKS_PARMNUM)
+#define SV_ENABLEOPLOCKFORCECLOSE_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_ENABLEOPLOCKFORCECLOSE_PARMNUM)
+#define SV_ENABLEFCBOPENS_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_ENABLEFCBOPENS_PARMNUM)
+#define SV_ENABLERAW_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_ENABLERAW_PARMNUM)
+#define SV_ENABLESHAREDNETDRIVES_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_ENABLESHAREDNETDRIVES_PARMNUM)
+#define SV_MINFREECONNECTIONS_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_MINFREECONNECTIONS_PARMNUM)
+#define SV_MAXFREECONNECTIONS_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_MAXFREECONNECTIONS_PARMNUM)
+#define SV_INITSESSTABLE_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_INITSESSTABLE_PARMNUM)
+#define SV_INITCONNTABLE_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_INITCONNTABLE_PARMNUM)
+#define SV_INITFILETABLE_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_INITFILETABLE_PARMNUM)
+#define SV_INITSEARCHTABLE_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_INITSEARCHTABLE_PARMNUM)
+#define SV_ALERTSCHEDULE_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_ALERTSCHEDULE_PARMNUM)
+#define SV_ERRORTHRESHOLD_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_ERRORTHRESHOLD_PARMNUM)
+#define SV_NETWORKERRORTHRESHOLD_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_NETWORKERRORTHRESHOLD_PARMNUM)
+#define SV_DISKSPACETHRESHOLD_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_DISKSPACETHRESHOLD_PARMNUM)
+#define SV_MAXLINKDELAY_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_MAXLINKDELAY_PARMNUM)
+#define SV_MINLINKTHROUGHPUT_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_MINLINKTHROUGHPUT_PARMNUM)
+#define SV_LINKINFOVALIDTIME_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_LINKINFOVALIDTIME_PARMNUM)
+#define SV_SCAVQOSINFOUPDATETIME_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_SCAVQOSINFOUPDATETIME_PARMNUM)
+#define SV_MAXWORKITEMIDLETIME_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_MAXWORKITEMIDLETIME_PARMNUM)
+#define SV_MAXRAWWORKITEMS_INFOLOEVEL (PARMNUM_BASE_INFOLEVEL+SV_MAXRAWWORKITEMS_PARMNUM)
+#define SV_PRODUCTTYPE_INFOLOEVEL (PARMNUM_BASE_INFOLEVEL+SV_PRODUCTTYPE_PARMNUM)
+#define SV_SERVERSIZE_INFOLOEVEL (PARMNUM_BASE_INFOLEVEL+SV_SERVERSIZE_PARMNUM)
+#define SV_CONNECTIONLESSAUTODISC_INFOLOEVEL (PARMNUM_BASE_INFOLEVEL+SV_CONNECTIONLESSAUTODISC_PARMNUM)
+#define SV_SHARINGVIOLATIONRETRIES_INFOLOEVEL (PARMNUM_BASE_INFOLEVEL+SV_SHARINGVIOLATIONRETRIES_PARMNUM)
+#define SV_SHARINGVIOLATIONDELAY_INFOLOEVEL (PARMNUM_BASE_INFOLEVEL+SV_SHARINGVIOLATIONDELAY_PARMNUM)
+#define SV_MAXGLOBALOPENSEARCH_INFOLOEVEL (PARMNUM_BASE_INFOLEVEL+SV_MAXGLOBALOPENSEARCH_PARMNUM)
+#define SV_REMOVEDUPLICATESEARCHES_INFOLOEVEL (PARMNUM_BASE_INFOLEVEL+SV_REMOVEDUPLICATESEARCHES_PARMNUM)
+#define SV_LOCKVIOLATIONRETRIES_INFOLOEVEL (PARMNUM_BASE_INFOLEVEL+SV_LOCKVIOLATIONRETRIES_PARMNUM)
+#define SV_LOCKVIOLATIONOFFSET_INFOLOEVEL (PARMNUM_BASE_INFOLEVEL+SV_LOCKVIOLATIONOFFSET_PARMNUM)
+#define SV_LOCKVIOLATIONDELAY_INFOLOEVEL (PARMNUM_BASE_INFOLEVEL+SV_LOCKVIOLATIONDELAY_PARMNUM)
+#define SV_MDLREADSWITCHOVER_INFOLOEVEL (PARMNUM_BASE_INFOLEVEL+SV_MDLREADSWITCHOVER_PARMNUM)
+#define SV_CACHEDOPENLIMIT_INFOLOEVEL (PARMNUM_BASE_INFOLEVEL+SV_CACHEDOPENLIMIT_PARMNUM)
+#define SV_CRITICALTHREADS_INFOLOEVEL (PARMNUM_BASE_INFOLEVEL+SV_CRITICALTHREADS_PARMNUM)
+#define SV_RESTRICTNULLSESSACCESS_INFOLOEVEL (PARMNUM_BASE_INFOLEVEL+SV_RESTRICTNULLSESSACCESS_PARMNUM)
+#define SV_ENABLEWFW311DIRECTIPX_INFOLOEVEL (PARMNUM_BASE_INFOLEVEL+SV_ENABLEWFW311DIRECTIPX_PARMNUM)
+#define SV_OTHERQUEUEAFFINITY_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_OTHERQUEUEAFFINITY_PARMNUM)
+#define SV_QUEUESAMPLESECS_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_QUEUESAMPLESECS_PARMNUM)
+#define SV_BALANCECOUNT_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_BALANCECOUNT_PARMNUM)
+#define SV_PREFERREDAFFINITY_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_PREFERREDAFFINITY_PARMNUM)
+#define SV_MAXFREERFCBS_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_MAXFREERFCBS_PARMNUM)
+#define SV_MAXFREEMFCBS_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_MAXFREEMFCBS_PARMNUM)
+#define SV_MAXFREELFCBS_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_MAXFREELFCBS_PARMNUM)
+#define SV_MAXFREEPAGEDPOOLCHUNKS_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_MAXFREEPAGEDPOOLCHUNKS_PARMNUM)
+#define SV_MINPAGEDPOOLCHUNKSIZE_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_MINPAGEDPOOLCHUNKSIZE_PARMNUM)
+#define SV_MAXPAGEDPOOLCHUNKSIZE_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_MAXPAGEDPOOLCHUNKSIZE_PARMNUM)
+#define SV_SENDSFROMPREFERREDPROCESSOR_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_SENDSFROMPREFERREDPROCESSOR_PARMNUM)
+#define SV_MAXTHREADSPERQUEUE_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_MAXTHREADSPERQUEUE_PARMNUM)
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/winsup/w32api/include/lmshare.h b/winsup/w32api/include/lmshare.h
new file mode 100644
index 000000000..fa8f3b9aa
--- /dev/null
+++ b/winsup/w32api/include/lmshare.h
@@ -0,0 +1,142 @@
+#ifndef _LMSHARE_H
+#define _LMSHARE_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+#define SHARE_NETNAME_PARMNUM 1
+#define SHARE_TYPE_PARMNUM 3
+#define SHARE_REMARK_PARMNUM 4
+#define SHARE_PERMISSIONS_PARMNUM 5
+#define SHARE_MAX_USES_PARMNUM 6
+#define SHARE_CURRENT_USES_PARMNUM 7
+#define SHARE_PATH_PARMNUM 8
+#define SHARE_PASSWD_PARMNUM 9
+#define SHARE_FILE_SD_PARMNUM 501
+#define SHARE_REMARK_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SHARE_REMARK_PARMNUM)
+#define SHARE_MAX_USES_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SHARE_MAX_USES_PARMNUM)
+#define SHARE_FILE_SD_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SHARE_FILE_SD_PARMNUM)
+#define SHI1_NUM_ELEMENTS 4
+#define SHI2_NUM_ELEMENTS 10
+#define STYPE_DISKTREE 0
+#define STYPE_PRINTQ 1
+#define STYPE_DEVICE 2
+#define STYPE_IPC 3
+#define STYPE_DFS 100
+#define STYPE_SPECIAL 0x80000000
+#define SHI_USES_UNLIMITED (DWORD)(-1)
+#define SESS_GUEST 1
+#define SESS_NOENCRYPTION 2
+#define SESI1_NUM_ELEMENTS 8
+#define SESI2_NUM_ELEMENTS 9
+#define PERM_FILE_READ 1
+#define PERM_FILE_WRITE 2
+#define PERM_FILE_CREATE 4
+typedef struct _FILE_INFO_2 { DWORD fi2_id;} FILE_INFO_2,*PFILE_INFO_2,*LPFILE_INFO_2;
+typedef struct _FILE_INFO_3 {
+ DWORD fi3_id;
+ DWORD fi3_permissions;
+ DWORD fi3_num_locks;
+ LPTSTR fi3_pathname;
+ LPTSTR fi3_username;
+} FILE_INFO_3,*PFILE_INFO_3,*LPFILE_INFO_3;
+typedef struct _SHARE_INFO_0 { LPTSTR shi0_netname; } SHARE_INFO_0,*PSHARE_INFO_0,*LPSHARE_INFO_0;
+typedef struct _SHARE_INFO_1 {
+ LPTSTR shi1_netname;
+ DWORD shi1_type;
+ LPTSTR shi1_remark;
+} SHARE_INFO_1,*PSHARE_INFO_1,*LPSHARE_INFO_1;
+typedef struct _SHARE_INFO_2 {
+ LPTSTR shi2_netname;
+ DWORD shi2_type;
+ LPTSTR shi2_remark;
+ DWORD shi2_permissions;
+ DWORD shi2_max_uses;
+ DWORD shi2_current_uses;
+ LPTSTR shi2_path;
+ LPTSTR shi2_passwd;
+} SHARE_INFO_2,*PSHARE_INFO_2,*LPSHARE_INFO_2;
+typedef struct _SHARE_INFO_502 {
+ LPTSTR shi502_netname;
+ DWORD shi502_type;
+ LPTSTR shi502_remark;
+ DWORD shi502_permissions;
+ DWORD shi502_max_uses;
+ DWORD shi502_current_uses;
+ LPTSTR shi502_path;
+ LPTSTR shi502_passwd;
+ DWORD shi502_reserved;
+ PSECURITY_DESCRIPTOR shi502_security_descriptor;
+} SHARE_INFO_502,*PSHARE_INFO_502,*LPSHARE_INFO_502;
+typedef struct _SHARE_INFO_1004 {
+ LPTSTR shi1004_remark;
+} SHARE_INFO_1004,*PSHARE_INFO_1004,*LPSHARE_INFO_1004;
+typedef struct _SHARE_INFO_1006 {
+ DWORD shi1006_max_uses;
+} SHARE_INFO_1006,*PSHARE_INFO_1006,*LPSHARE_INFO_1006;
+typedef struct _SHARE_INFO_1501 {
+ DWORD shi1501_reserved;
+ PSECURITY_DESCRIPTOR shi1501_security_descriptor;
+} SHARE_INFO_1501,*PSHARE_INFO_1501,*LPSHARE_INFO_1501;
+typedef struct _SESSION_INFO_0 { LPTSTR sesi0_cname; } SESSION_INFO_0,*PSESSION_INFO_0,*LPSESSION_INFO_0;
+typedef struct _SESSION_INFO_1 {
+ LPTSTR sesi1_cname;
+ LPTSTR sesi1_username;
+ DWORD sesi1_num_opens;
+ DWORD sesi1_time;
+ DWORD sesi1_idle_time;
+ DWORD sesi1_user_flags;
+} SESSION_INFO_1,*PSESSION_INFO_1,*LPSESSION_INFO_1;
+typedef struct _SESSION_INFO_2 {
+ LPTSTR sesi2_cname;
+ LPTSTR sesi2_username;
+ DWORD sesi2_num_opens;
+ DWORD sesi2_time;
+ DWORD sesi2_idle_time;
+ DWORD sesi2_user_flags;
+ LPTSTR sesi2_cltype_name;
+} SESSION_INFO_2,*PSESSION_INFO_2,*LPSESSION_INFO_2;
+typedef struct _SESSION_INFO_10 {
+ LPTSTR sesi10_cname;
+ LPTSTR sesi10_username;
+ DWORD sesi10_time;
+ DWORD sesi10_idle_time;
+} SESSION_INFO_10,*PSESSION_INFO_10,*LPSESSION_INFO_10;
+typedef struct _SESSION_INFO_502 {
+ LPTSTR sesi502_cname;
+ LPTSTR sesi502_username;
+ DWORD sesi502_num_opens;
+ DWORD sesi502_time;
+ DWORD sesi502_idle_time;
+ DWORD sesi502_user_flags;
+ LPTSTR sesi502_cltype_name;
+ LPTSTR sesi502_transport;
+} SESSION_INFO_502,*PSESSION_INFO_502,*LPSESSION_INFO_502;
+typedef struct _CONNECTION_INFO_0 { DWORD coni0_id; } CONNECTION_INFO_0,*PCONNECTION_INFO_0,*LPCONNECTION_INFO_0;
+typedef struct _CONNECTION_INFO_1 {
+ DWORD coni1_id;
+ DWORD coni1_type;
+ DWORD coni1_num_opens;
+ DWORD coni1_num_users;
+ DWORD coni1_time;
+ LPTSTR coni1_username;
+ LPTSTR coni1_netname;
+} CONNECTION_INFO_1,*PCONNECTION_INFO_1,*LPCONNECTION_INFO_1;
+NET_API_STATUS WINAPI NetShareAdd(LPTSTR,DWORD,PBYTE,PDWORD);
+NET_API_STATUS WINAPI NetShareEnum(LPTSTR,DWORD,PBYTE*,DWORD,PDWORD,PDWORD,PDWORD);
+NET_API_STATUS WINAPI NetShareEnumSticky(LPTSTR,DWORD,PBYTE*,DWORD,PDWORD,PDWORD,PDWORD resume_handle);
+NET_API_STATUS WINAPI NetShareGetInfo(LPTSTR,LPTSTR,DWORD,PBYTE*);
+NET_API_STATUS WINAPI NetShareSetInfo(LPTSTR,LPTSTR,DWORD,PBYTE,PDWORD);
+NET_API_STATUS WINAPI NetShareDel(LPTSTR,LPTSTR,DWORD);
+NET_API_STATUS WINAPI NetShareDelSticky(LPTSTR,LPTSTR,DWORD);
+NET_API_STATUS WINAPI NetShareCheck(LPTSTR,LPTSTR,PDWORD);
+NET_API_STATUS WINAPI NetSessionEnum(LPTSTR,LPTSTR,LPTSTR,DWORD,PBYTE*,DWORD,PDWORD,PDWORD,PDWORD);
+NET_API_STATUS WINAPI NetSessionDel(LPTSTR,LPTSTR,LPTSTR);
+NET_API_STATUS WINAPI NetSessionGetInfo(LPTSTR,LPTSTR,LPTSTR,DWORD,PBYTE*);
+NET_API_STATUS WINAPI NetConnectionEnum(LPTSTR,LPTSTR,DWORD,PBYTE*,DWORD,PDWORD,PDWORD,PDWORD);
+NET_API_STATUS WINAPI NetFileClose(LPTSTR,DWORD);
+NET_API_STATUS WINAPI NetFileEnum(LPTSTR,LPTSTR,LPTSTR,DWORD,PBYTE*,DWORD,PDWORD,PDWORD,PDWORD);
+NET_API_STATUS WINAPI NetFileGetInfo(LPTSTR,DWORD,DWORD,PBYTE*);
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/winsup/w32api/include/lmsname.h b/winsup/w32api/include/lmsname.h
new file mode 100644
index 000000000..2a0f42bcd
--- /dev/null
+++ b/winsup/w32api/include/lmsname.h
@@ -0,0 +1,54 @@
+#ifndef _LMSNAME_H
+#define _LMSNAME_H
+#define SERVICE_WORKSTATION TEXT("LanmanWorkstation")
+#define SERVICE_LM20_WORKSTATION TEXT("WORKSTATION")
+#define WORKSTATION_DISPLAY_NAME TEXT("Workstation")
+#define SERVICE_SERVER TEXT("LanmanServer")
+#define SERVICE_LM20_SERVER TEXT("SERVER")
+#define SERVER_DISPLAY_NAME TEXT("Server")
+#define SERVICE_BROWSER TEXT("BROWSER")
+#define SERVICE_LM20_BROWSER SERVICE_BROWSER
+#define SERVICE_MESSENGER TEXT("MESSENGER")
+#define SERVICE_LM20_MESSENGER SERVICE_MESSENGER
+#define SERVICE_NETRUN TEXT("NETRUN")
+#define SERVICE_LM20_NETRUN SERVICE_NETRUN
+#define SERVICE_SPOOLER TEXT("SPOOLER")
+#define SERVICE_LM20_SPOOLER SERVICE_SPOOLER
+#define SERVICE_ALERTER TEXT("ALERTER")
+#define SERVICE_LM20_ALERTER SERVICE_ALERTER
+#define SERVICE_NETLOGON TEXT("NETLOGON")
+#define SERVICE_LM20_NETLOGON SERVICE_NETLOGON
+#define SERVICE_NETPOPUP TEXT("NETPOPUP")
+#define SERVICE_LM20_NETPOPUP SERVICE_NETPOPUP
+#define SERVICE_SQLSERVER TEXT("SQLSERVER")
+#define SERVICE_LM20_SQLSERVER SERVICE_SQLSERVER
+#define SERVICE_REPL TEXT("REPLICATOR")
+#define SERVICE_LM20_REPL SERVICE_REPL
+#define SERVICE_RIPL TEXT("REMOTEBOOT")
+#define SERVICE_LM20_RIPL SERVICE_RIPL
+#define SERVICE_TIMESOURCE TEXT("TIMESOURCE")
+#define SERVICE_LM20_TIMESOURCE SERVICE_TIMESOURCE
+#define SERVICE_AFP TEXT("AFP")
+#define SERVICE_LM20_AFP SERVICE_AFP
+#define SERVICE_UPS TEXT("UPS")
+#define SERVICE_LM20_UPS SERVICE_UPS
+#define SERVICE_XACTSRV TEXT("XACTSRV")
+#define SERVICE_LM20_XACTSRV SERVICE_XACTSRV
+#define SERVICE_TCPIP TEXT("TCPIP")
+#define SERVICE_LM20_TCPIP SERVICE_TCPIP
+#define SERVICE_NBT TEXT("NBT")
+#define SERVICE_LM20_NBT SERVICE_NBT
+#define SERVICE_LMHOSTS TEXT("LMHOSTS")
+#define SERVICE_LM20_LMHOSTS SERVICE_LMHOSTS
+#define SERVICE_TELNET TEXT("Telnet")
+#define SERVICE_LM20_TELNET SERVICE_TELNET
+#define SERVICE_SCHEDULE TEXT("Schedule")
+#define SERVICE_LM20_SCHEDULE SERVICE_SCHEDULE
+#define SERVICE_NTLMSSP TEXT("NtLmSsp")
+#define SERVICE_DHCP TEXT("DHCP")
+#define SERVICE_LM20_DHCP SERVICE_DHCP
+#define SERVICE_NWSAP TEXT("NwSapAgent")
+#define SERVICE_LM20_NWSAP SERVICE_NWSAP
+#define NWSAP_DISPLAY_NAME TEXT("NW Sap Agent")
+#define SERVICE_NWCS TEXT("NWCWorkstation")
+#endif
diff --git a/winsup/w32api/include/lmstats.h b/winsup/w32api/include/lmstats.h
new file mode 100644
index 000000000..96bcedc3e
--- /dev/null
+++ b/winsup/w32api/include/lmstats.h
@@ -0,0 +1,110 @@
+#ifndef _LMSTATS_H
+#define _LMSTATS_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+#define STATSOPT_CLR 1
+#define STATS_NO_VALUE ((ULONG)-1)
+#define STATS_OVERFLOW ((ULONG)-2)
+typedef struct _STAT_SERVER_0 {
+ DWORD sts0_start;
+ DWORD sts0_fopens;
+ DWORD sts0_devopens;
+ DWORD sts0_jobsqueued;
+ DWORD sts0_sopens;
+ DWORD sts0_stimedout;
+ DWORD sts0_serrorout;
+ DWORD sts0_pwerrors;
+ DWORD sts0_permerrors;
+ DWORD sts0_syserrors;
+ DWORD sts0_bytessent_low;
+ DWORD sts0_bytessent_high;
+ DWORD sts0_bytesrcvd_low;
+ DWORD sts0_bytesrcvd_high;
+ DWORD sts0_avresponse;
+ DWORD sts0_reqbufneed;
+ DWORD sts0_bigbufneed;
+} STAT_SERVER_0,*PSTAT_SERVER_0,*LPSTAT_SERVER_0;
+#ifdef LM20_WORKSTATION_STATISTICS
+typedef struct _STAT_WORKSTATION_0 {
+ DWORD stw0_start;
+ DWORD stw0_numNCB_r;
+ DWORD stw0_numNCB_s;
+ DWORD stw0_numNCB_a;
+ DWORD stw0_fiNCB_r;
+ DWORD stw0_fiNCB_s;
+ DWORD stw0_fiNCB_a;
+ DWORD stw0_fcNCB_r;
+ DWORD stw0_fcNCB_s;
+ DWORD stw0_fcNCB_a;
+ DWORD stw0_sesstart;
+ DWORD stw0_sessfailcon;
+ DWORD stw0_sessbroke;
+ DWORD stw0_uses;
+ DWORD stw0_usefail;
+ DWORD stw0_autorec;
+ DWORD stw0_bytessent_r_lo;
+ DWORD stw0_bytessent_r_hi;
+ DWORD stw0_bytesrcvd_r_lo;
+ DWORD stw0_bytesrcvd_r_hi;
+ DWORD stw0_bytessent_s_lo;
+ DWORD stw0_bytessent_s_hi;
+ DWORD stw0_bytesrcvd_s_lo;
+ DWORD stw0_bytesrcvd_s_hi;
+ DWORD stw0_bytessent_a_lo;
+ DWORD stw0_bytessent_a_hi;
+ DWORD stw0_bytesrcvd_a_lo;
+ DWORD stw0_bytesrcvd_a_hi;
+ DWORD stw0_reqbufneed;
+ DWORD stw0_bigbufneed;
+} STAT_WORKSTATION_0,*PSTAT_WORKSTATION_0,*LPSTAT_WORKSTATION_0;
+#else
+typedef struct _STAT_WORKSTATION_0 {
+ LARGE_INTEGER StatisticsStartTime;
+ LARGE_INTEGER BytesReceived;
+ LARGE_INTEGER SmbsReceived;
+ LARGE_INTEGER PagingReadBytesRequested;
+ LARGE_INTEGER NonPagingReadBytesRequested;
+ LARGE_INTEGER CacheReadBytesRequested;
+ LARGE_INTEGER NetworkReadBytesRequested;
+ LARGE_INTEGER BytesTransmitted;
+ LARGE_INTEGER SmbsTransmitted;
+ LARGE_INTEGER PagingWriteBytesRequested;
+ LARGE_INTEGER NonPagingWriteBytesRequested;
+ LARGE_INTEGER CacheWriteBytesRequested;
+ LARGE_INTEGER NetworkWriteBytesRequested;
+ DWORD InitiallyFailedOperations;
+ DWORD FailedCompletionOperations;
+ DWORD ReadOperations;
+ DWORD RandomReadOperations;
+ DWORD ReadSmbs;
+ DWORD LargeReadSmbs;
+ DWORD SmallReadSmbs;
+ DWORD WriteOperations;
+ DWORD RandomWriteOperations;
+ DWORD WriteSmbs;
+ DWORD LargeWriteSmbs;
+ DWORD SmallWriteSmbs;
+ DWORD RawReadsDenied;
+ DWORD RawWritesDenied;
+ DWORD NetworkErrors;
+ DWORD Sessions;
+ DWORD FailedSessions;
+ DWORD Reconnects;
+ DWORD CoreConnects;
+ DWORD Lanman20Connects;
+ DWORD Lanman21Connects;
+ DWORD LanmanNtConnects;
+ DWORD ServerDisconnects;
+ DWORD HungSessions;
+ DWORD UseCount;
+ DWORD FailedUseCount;
+ DWORD CurrentCommands;
+} STAT_WORKSTATION_0,*PSTAT_WORKSTATION_0,*LPSTAT_WORKSTATION_0;
+#endif
+
+NET_API_STATUS WINAPI NetStatisticsGet(LPTSTR,LPTSTR,DWORD,DWORD,PBYTE*);
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/winsup/w32api/include/lmsvc.h b/winsup/w32api/include/lmsvc.h
new file mode 100644
index 000000000..a129bb0b4
--- /dev/null
+++ b/winsup/w32api/include/lmsvc.h
@@ -0,0 +1,130 @@
+#ifndef _LMSVC_H
+#define _LMSVC_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+#include <lmsname.h>
+#define SERVICE_DOS_ENCRYPTION TEXT("ENCRYPT")
+#define SERVICE_UNINSTALLED 0
+#define SERVICE_INSTALL_PENDING 1
+#define SERVICE_UNINSTALL_PENDING 2
+#define SERVICE_INSTALLED 3
+#define SERVICE_INSTALL_STATE 3
+#define SERVICE_PAUSE_STATE 18
+#define LM20_SERVICE_ACTIVE 0
+#define LM20_SERVICE_CONTINUE_PENDING 4
+#define LM20_SERVICE_PAUSE_PENDING 8
+#define LM20_SERVICE_PAUSED 18
+#define SERVICE_NOT_UNINSTALLABLE 0
+#define SERVICE_UNINSTALLABLE 16
+#define SERVICE_NOT_PAUSABLE 0
+#define SERVICE_PAUSABLE 32
+#define SERVICE_REDIR_PAUSED 0x700
+#define SERVICE_REDIR_DISK_PAUSED 256
+#define SERVICE_REDIR_PRINT_PAUSED 512
+#define SERVICE_REDIR_COMM_PAUSED 1024
+#define SERVICE_CTRL_INTERROGATE 0
+#define SERVICE_CTRL_PAUSE 1
+#define SERVICE_CTRL_CONTINUE 2
+#define SERVICE_CTRL_UNINSTALL 3
+#define SERVICE_CTRL_REDIR_DISK 1
+#define SERVICE_CTRL_REDIR_PRINT 2
+#define SERVICE_CTRL_REDIR_COMM 4
+#define SERVICE_IP_NO_HINT 0
+#define SERVICE_CCP_NO_HINT 0
+#define SERVICE_IP_QUERY_HINT 0x10000
+#define SERVICE_CCP_QUERY_HINT 0x10000
+#define SERVICE_IP_CHKPT_NUM 255
+#define SERVICE_CCP_CHKPT_NUM 255
+#define SERVICE_IP_WAIT_TIME 0xFF00
+#define SERVICE_CCP_WAIT_TIME 0xFF00
+#define SERVICE_IP_WAITTIME_SHIFT 8
+#define SERVICE_NTIP_WAITTIME_SHIFT 12
+#define UPPER_HINT_MASK 0xFF00
+#define LOWER_HINT_MASK 255
+#define UPPER_GET_HINT_MASK 0xFF00000
+#define LOWER_GET_HINT_MASK 0xFF00
+#define SERVICE_NT_MAXTIME 0xFFFF
+#define SERVICE_RESRV_MASK 0x1FFFF
+#define SERVICE_MAXTIME 255
+#define SERVICE_BASE 3050
+#define SERVICE_UIC_NORMAL 0
+#define SERVICE_UIC_BADPARMVAL (SERVICE_BASE+1)
+#define SERVICE_UIC_MISSPARM (SERVICE_BASE+2)
+#define SERVICE_UIC_UNKPARM (SERVICE_BASE+3)
+#define SERVICE_UIC_RESOURCE (SERVICE_BASE+4)
+#define SERVICE_UIC_CONFIG (SERVICE_BASE+5)
+#define SERVICE_UIC_SYSTEM (SERVICE_BASE+6)
+#define SERVICE_UIC_INTERNAL (SERVICE_BASE+7)
+#define SERVICE_UIC_AMBIGPARM (SERVICE_BASE+8)
+#define SERVICE_UIC_DUPPARM (SERVICE_BASE+9)
+#define SERVICE_UIC_KILL (SERVICE_BASE+10)
+#define SERVICE_UIC_EXEC (SERVICE_BASE+11)
+#define SERVICE_UIC_SUBSERV (SERVICE_BASE+12)
+#define SERVICE_UIC_CONFLPARM (SERVICE_BASE+13)
+#define SERVICE_UIC_FILE (SERVICE_BASE+14)
+#define SERVICE_UIC_M_NULL 0
+#define SERVICE_UIC_M_MEMORY (SERVICE_BASE+20)
+#define SERVICE_UIC_M_DISK (SERVICE_BASE+21)
+#define SERVICE_UIC_M_THREADS (SERVICE_BASE+22)
+#define SERVICE_UIC_M_PROCESSES (SERVICE_BASE+23)
+#define SERVICE_UIC_M_SECURITY (SERVICE_BASE+24)
+#define SERVICE_UIC_M_LANROOT (SERVICE_BASE+25)
+#define SERVICE_UIC_M_REDIR (SERVICE_BASE+26)
+#define SERVICE_UIC_M_SERVER (SERVICE_BASE+27)
+#define SERVICE_UIC_M_SEC_FILE_ERR (SERVICE_BASE+28)
+#define SERVICE_UIC_M_FILES (SERVICE_BASE+29)
+#define SERVICE_UIC_M_LOGS (SERVICE_BASE+30)
+#define SERVICE_UIC_M_LANGROUP (SERVICE_BASE+31)
+#define SERVICE_UIC_M_MSGNAME (SERVICE_BASE+32)
+#define SERVICE_UIC_M_ANNOUNCE (SERVICE_BASE+33)
+#define SERVICE_UIC_M_UAS (SERVICE_BASE+34)
+#define SERVICE_UIC_M_SERVER_SEC_ERR (SERVICE_BASE+35)
+#define SERVICE_UIC_M_WKSTA (SERVICE_BASE+37)
+#define SERVICE_UIC_M_ERRLOG (SERVICE_BASE+38)
+#define SERVICE_UIC_M_FILE_UW (SERVICE_BASE+39)
+#define SERVICE_UIC_M_ADDPAK (SERVICE_BASE+40)
+#define SERVICE_UIC_M_LAZY (SERVICE_BASE+41)
+#define SERVICE_UIC_M_UAS_MACHINE_ACCT (SERVICE_BASE+42)
+#define SERVICE_UIC_M_UAS_SERVERS_NMEMB (SERVICE_BASE+43)
+#define SERVICE_UIC_M_UAS_SERVERS_NOGRP (SERVICE_BASE+44)
+#define SERVICE_UIC_M_UAS_INVALID_ROLE (SERVICE_BASE+45)
+#define SERVICE_UIC_M_NETLOGON_NO_DC (SERVICE_BASE+46)
+#define SERVICE_UIC_M_NETLOGON_DC_CFLCT (SERVICE_BASE+47)
+#define SERVICE_UIC_M_NETLOGON_AUTH (SERVICE_BASE+48)
+#define SERVICE_UIC_M_UAS_PROLOG (SERVICE_BASE+49)
+#define SERVICE2_BASE 5600
+#define SERVICE_UIC_M_NETLOGON_MPATH (SERVICE2_BASE+0)
+#define SERVICE_UIC_M_LSA_MACHINE_ACCT (SERVICE2_BASE+1)
+#define SERVICE_UIC_M_DATABASE_ERROR (SERVICE2_BASE+2)
+
+typedef struct _SERVICE_INFO_0 { LPWSTR svci0_name;} SERVICE_INFO_0,*PSERVICE_INFO_0,* LPSERVICE_INFO_0;
+typedef struct _SERVICE_INFO_1 {
+ LPWSTR svci1_name;
+ DWORD svci1_status;
+ DWORD svci1_code;
+ DWORD svci1_pid;
+} SERVICE_INFO_1,*PSERVICE_INFO_1,* LPSERVICE_INFO_1;
+typedef struct _SERVICE_INFO_2 {
+ LPWSTR svci2_name;
+ DWORD svci2_status;
+ DWORD svci2_code;
+ DWORD svci2_pid;
+ LPWSTR svci2_text;
+ DWORD svci2_specific_error;
+ LPWSTR svci2_display_name;
+} SERVICE_INFO_2,*PSERVICE_INFO_2,* LPSERVICE_INFO_2;
+
+NET_API_STATUS WINAPI NetServiceControl(LPCWSTR,LPCWSTR,DWORD,DWORD,PBYTE*);
+NET_API_STATUS WINAPI NetServiceEnum(LPCWSTR,DWORD,PBYTE*,DWORD,PDWORD,PDWORD,PDWORD);
+NET_API_STATUS WINAPI NetServiceGetInfo(LPCWSTR,LPCWSTR,DWORD,PBYTE*);
+NET_API_STATUS WINAPI NetServiceInstall(LPCWSTR,LPCWSTR,DWORD,LPCWSTR*,PBYTE*);
+#define SERVICE_IP_CODE(t,n) ((long)SERVICE_IP_QUERY_HINT|(long)(n|(t<<SERVICE_IP_WAITTIME_SHIFT)))
+#define SERVICE_CCP_CODE(t,n) ((long)SERVICE_CCP_QUERY_HINT|(long)(n|(t<<SERVICE_IP_WAITTIME_SHIFT)))
+#define SERVICE_UIC_CODE(c,m) ((long)(((long)c<<16)|(long)(USHORT)m))
+#define SERVICE_NT_CCP_CODE(t,n) (((long)SERVICE_CCP_QUERY_HINT)|((long)(n))|(((t)&LOWER_HINT_MASK)<<SERVICE_IP_WAITTIME_SHIFT)|(((t)&UPPER_HINT_MASK)<<SERVICE_NTIP_WAITTIME_SHIFT))
+#define SERVICE_NT_WAIT_GET(c) ((((c)&UPPER_GET_HINT_MASK)>>SERVICE_NTIP_WAITTIME_SHIFT)|(((c)&LOWER_GET_HINT_MASK)>>SERVICE_IP_WAITTIME_SHIFT))
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/winsup/w32api/include/lmuse.h b/winsup/w32api/include/lmuse.h
new file mode 100644
index 000000000..a10696813
--- /dev/null
+++ b/winsup/w32api/include/lmuse.h
@@ -0,0 +1,56 @@
+#ifndef _LMUSE_H
+#define _LMUSE_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+#include <lmuseflg.h>
+#define USE_LOCAL_PARMNUM 1
+#define USE_REMOTE_PARMNUM 2
+#define USE_PASSWORD_PARMNUM 3
+#define USE_ASGTYPE_PARMNUM 4
+#define USE_USERNAME_PARMNUM 5
+#define USE_DOMAINNAME_PARMNUM 6
+#define USE_OK 0
+#define USE_PAUSED 1
+#define USE_SESSLOST 2
+#define USE_DISCONN 2
+#define USE_NETERR 3
+#define USE_CONN 4
+#define USE_RECONN 5
+#define USE_WILDCARD ((DWORD)-1)
+#define USE_DISKDEV 0
+#define USE_SPOOLDEV 1
+#define USE_CHARDEV 2
+#define USE_IPC 3
+typedef struct _USE_INFO_0 {
+ LPTSTR ui0_local;
+ LPTSTR ui0_remote;
+}USE_INFO_0,*PUSE_INFO_0,*LPUSE_INFO_0;
+typedef struct _USE_INFO_1 {
+ LPTSTR ui1_local;
+ LPTSTR ui1_remote;
+ LPTSTR ui1_password;
+ DWORD ui1_status;
+ DWORD ui1_asg_type;
+ DWORD ui1_refcount;
+ DWORD ui1_usecount;
+}USE_INFO_1,*PUSE_INFO_1,*LPUSE_INFO_1;
+typedef struct _USE_INFO_2 {
+ LPTSTR ui2_local;
+ LPTSTR ui2_remote;
+ LPTSTR ui2_password;
+ DWORD ui2_status;
+ DWORD ui2_asg_type;
+ DWORD ui2_refcount;
+ DWORD ui2_usecount;
+ LPTSTR ui2_username;
+ LPTSTR ui2_domainname;
+}USE_INFO_2,*PUSE_INFO_2,*LPUSE_INFO_2;
+NET_API_STATUS WINAPI NetUseAdd(LPTSTR,DWORD,PBYTE,PDWORD);
+NET_API_STATUS WINAPI NetUseDel(LPTSTR,LPTSTR,DWORD);
+NET_API_STATUS WINAPI NetUseEnum(LPTSTR,DWORD,PBYTE*,DWORD,PDWORD,PDWORD,PDWORD);
+NET_API_STATUS WINAPI NetUseGetInfo(LPTSTR,LPTSTR,DWORD,PBYTE*);
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/winsup/w32api/include/lmuseflg.h b/winsup/w32api/include/lmuseflg.h
new file mode 100644
index 000000000..7984b1969
--- /dev/null
+++ b/winsup/w32api/include/lmuseflg.h
@@ -0,0 +1,6 @@
+#ifndef _LMUSEFLG_H
+#define _LMUSEFLG_H
+#define USE_NOFORCE 0
+#define USE_FORCE 1
+#define USE_LOTS_OF_FORCE 2
+#endif
diff --git a/winsup/w32api/include/lmwksta.h b/winsup/w32api/include/lmwksta.h
new file mode 100644
index 000000000..6538fc9d1
--- /dev/null
+++ b/winsup/w32api/include/lmwksta.h
@@ -0,0 +1,229 @@
+#ifndef _LMWKSTA_H
+#define _LMWKSTA_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+#include <lmuseflg.h>
+#define WKSTA_PLATFORM_ID_PARMNUM 100
+#define WKSTA_COMPUTERNAME_PARMNUM 1
+#define WKSTA_LANGROUP_PARMNUM 2
+#define WKSTA_VER_MAJOR_PARMNUM 4
+#define WKSTA_VER_MINOR_PARMNUM 5
+#define WKSTA_LOGGED_ON_USERS_PARMNUM 6
+#define WKSTA_LANROOT_PARMNUM 7
+#define WKSTA_LOGON_DOMAIN_PARMNUM 8
+#define WKSTA_LOGON_SERVER_PARMNUM 9
+#define WKSTA_CHARWAIT_PARMNUM 10
+#define WKSTA_CHARTIME_PARMNUM 11
+#define WKSTA_CHARCOUNT_PARMNUM 12
+#define WKSTA_KEEPCONN_PARMNUM 13
+#define WKSTA_KEEPSEARCH_PARMNUM 14
+#define WKSTA_MAXCMDS_PARMNUM 15
+#define WKSTA_NUMWORKBUF_PARMNUM 16
+#define WKSTA_MAXWRKCACHE_PARMNUM 17
+#define WKSTA_SESSTIMEOUT_PARMNUM 18
+#define WKSTA_SIZERROR_PARMNUM 19
+#define WKSTA_NUMALERTS_PARMNUM 20
+#define WKSTA_NUMSERVICES_PARMNUM 21
+#define WKSTA_NUMCHARBUF_PARMNUM 22
+#define WKSTA_SIZCHARBUF_PARMNUM 23
+#define WKSTA_ERRLOGSZ_PARMNUM 27
+#define WKSTA_PRINTBUFTIME_PARMNUM 28
+#define WKSTA_SIZWORKBUF_PARMNUM 29
+#define WKSTA_MAILSLOTS_PARMNUM 30
+#define WKSTA_NUMDGRAMBUF_PARMNUM 31
+#define WKSTA_WRKHEURISTICS_PARMNUM 32
+#define WKSTA_MAXTHREADS_PARMNUM 33
+#define WKSTA_LOCKQUOTA_PARMNUM 41
+#define WKSTA_LOCKINCREMENT_PARMNUM 42
+#define WKSTA_LOCKMAXIMUM_PARMNUM 43
+#define WKSTA_PIPEINCREMENT_PARMNUM 44
+#define WKSTA_PIPEMAXIMUM_PARMNUM 45
+#define WKSTA_DORMANTFILELIMIT_PARMNUM 46
+#define WKSTA_CACHEFILETIMEOUT_PARMNUM 47
+#define WKSTA_USEOPPORTUNISTICLOCKING_PARMNUM 48
+#define WKSTA_USEUNLOCKBEHIND_PARMNUM 49
+#define WKSTA_USECLOSEBEHIND_PARMNUM 50
+#define WKSTA_BUFFERNAMEDPIPES_PARMNUM 51
+#define WKSTA_USELOCKANDREADANDUNLOCK_PARMNUM 52
+#define WKSTA_UTILIZENTCACHING_PARMNUM 53
+#define WKSTA_USERAWREAD_PARMNUM 54
+#define WKSTA_USERAWWRITE_PARMNUM 55
+#define WKSTA_USEWRITERAWWITHDATA_PARMNUM 56
+#define WKSTA_USEENCRYPTION_PARMNUM 57
+#define WKSTA_BUFFILESWITHDENYWRITE_PARMNUM 58
+#define WKSTA_BUFFERREADONLYFILES_PARMNUM 59
+#define WKSTA_FORCECORECREATEMODE_PARMNUM 60
+#define WKSTA_USE512BYTESMAXTRANSFER_PARMNUM 61
+#define WKSTA_READAHEADTHRUPUT_PARMNUM 62
+#define WKSTA_OTH_DOMAINS_PARMNUM 101
+#define TRANSPORT_QUALITYOFSERVICE_PARMNUM 201
+#define TRANSPORT_NAME_PARMNUM 202
+
+typedef struct _WKSTA_INFO_100 {
+ DWORD wki100_platform_id;
+ LPWSTR wki100_computername;
+ LPWSTR wki100_langroup;
+ DWORD wki100_ver_major;
+ DWORD wki100_ver_minor;
+}WKSTA_INFO_100,*PWKSTA_INFO_100,*LPWKSTA_INFO_100;
+typedef struct _WKSTA_INFO_101 {
+ DWORD wki101_platform_id;
+ LPWSTR wki101_computername;
+ LPWSTR wki101_langroup;
+ DWORD wki101_ver_major;
+ DWORD wki101_ver_minor;
+ LPWSTR wki101_lanroot;
+}WKSTA_INFO_101,*PWKSTA_INFO_101,*LPWKSTA_INFO_101;
+typedef struct _WKSTA_INFO_102 {
+ DWORD wki102_platform_id;
+ LPWSTR wki102_computername;
+ LPWSTR wki102_langroup;
+ DWORD wki102_ver_major;
+ DWORD wki102_ver_minor;
+ LPWSTR wki102_lanroot;
+ DWORD wki102_logged_on_users;
+}WKSTA_INFO_102,*PWKSTA_INFO_102,*LPWKSTA_INFO_102;
+typedef struct _WKSTA_INFO_302{
+ DWORD wki302_char_wait;
+ DWORD wki302_collection_time;
+ DWORD wki302_maximum_collection_count;
+ DWORD wki302_keep_conn;
+ DWORD wki302_keep_search;
+ DWORD wki302_max_cmds;
+ DWORD wki302_num_work_buf;
+ DWORD wki302_siz_work_buf;
+ DWORD wki302_max_wrk_cache;
+ DWORD wki302_sess_timeout;
+ DWORD wki302_siz_error;
+ DWORD wki302_num_alerts;
+ DWORD wki302_num_services;
+ DWORD wki302_errlog_sz;
+ DWORD wki302_print_buf_time;
+ DWORD wki302_num_char_buf;
+ DWORD wki302_siz_char_buf;
+ LPWSTR wki302_wrk_heuristics;
+ DWORD wki302_mailslots;
+ DWORD wki302_num_dgram_buf;
+}WKSTA_INFO_302,*PWKSTA_INFO_302,*LPWKSTA_INFO_302;
+typedef struct _WKSTA_INFO_402{
+ DWORD wki402_char_wait;
+ DWORD wki402_collection_time;
+ DWORD wki402_maximum_collection_count;
+ DWORD wki402_keep_conn;
+ DWORD wki402_keep_search;
+ DWORD wki402_max_cmds;
+ DWORD wki402_num_work_buf;
+ DWORD wki402_siz_work_buf;
+ DWORD wki402_max_wrk_cache;
+ DWORD wki402_sess_timeout;
+ DWORD wki402_siz_error;
+ DWORD wki402_num_alerts;
+ DWORD wki402_num_services;
+ DWORD wki402_errlog_sz;
+ DWORD wki402_print_buf_time;
+ DWORD wki402_num_char_buf;
+ DWORD wki402_siz_char_buf;
+ LPWSTR wki402_wrk_heuristics;
+ DWORD wki402_mailslots;
+ DWORD wki402_num_dgram_buf;
+ DWORD wki402_max_threads;
+}WKSTA_INFO_402,*PWKSTA_INFO_402,*LPWKSTA_INFO_402;
+typedef struct _WKSTA_INFO_502{
+ DWORD wki502_char_wait;
+ DWORD wki502_collection_time;
+ DWORD wki502_maximum_collection_count;
+ DWORD wki502_keep_conn;
+ DWORD wki502_max_cmds;
+ DWORD wki502_sess_timeout;
+ DWORD wki502_siz_char_buf;
+ DWORD wki502_max_threads;
+ DWORD wki502_lock_quota;
+ DWORD wki502_lock_increment;
+ DWORD wki502_lock_maximum;
+ DWORD wki502_pipe_increment;
+ DWORD wki502_pipe_maximum;
+ DWORD wki502_cache_file_timeout;
+ DWORD wki502_dormant_file_limit;
+ DWORD wki502_read_ahead_throughput;
+ DWORD wki502_num_mailslot_buffers;
+ DWORD wki502_num_srv_announce_buffers;
+ DWORD wki502_max_illegal_datagram_events;
+ DWORD wki502_illegal_datagram_event_reset_frequency;
+ BOOL wki502_log_election_packets;
+ BOOL wki502_use_opportunistic_locking;
+ BOOL wki502_use_unlock_behind;
+ BOOL wki502_use_close_behind;
+ BOOL wki502_buf_named_pipes;
+ BOOL wki502_use_lock_read_unlock;
+ BOOL wki502_utilize_nt_caching;
+ BOOL wki502_use_raw_read;
+ BOOL wki502_use_raw_write;
+ BOOL wki502_use_write_raw_data;
+ BOOL wki502_use_encryption;
+ BOOL wki502_buf_files_deny_write;
+ BOOL wki502_buf_read_only_files;
+ BOOL wki502_force_core_create_mode;
+ BOOL wki502_use_512_byte_max_transfer;
+}WKSTA_INFO_502,*PWKSTA_INFO_502,*LPWKSTA_INFO_502;
+typedef struct _WKSTA_INFO_1010 { DWORD wki1010_char_wait;} WKSTA_INFO_1010,*PWKSTA_INFO_1010,*LPWKSTA_INFO_1010;
+typedef struct _WKSTA_INFO_1011 { DWORD wki1011_collection_time;} WKSTA_INFO_1011,*PWKSTA_INFO_1011,*LPWKSTA_INFO_1011;
+typedef struct _WKSTA_INFO_1012 { DWORD wki1012_maximum_collection_count;} WKSTA_INFO_1012,*PWKSTA_INFO_1012,*LPWKSTA_INFO_1012;
+typedef struct _WKSTA_INFO_1027 { DWORD wki1027_errlog_sz;} WKSTA_INFO_1027,*PWKSTA_INFO_1027,*LPWKSTA_INFO_1027;
+typedef struct _WKSTA_INFO_1028 { DWORD wki1028_print_buf_time;} WKSTA_INFO_1028,*PWKSTA_INFO_1028,*LPWKSTA_INFO_1028;
+typedef struct _WKSTA_INFO_1032 { DWORD wki1032_wrk_heuristics;} WKSTA_INFO_1032,*PWKSTA_INFO_1032,*LPWKSTA_INFO_1032;
+typedef struct _WKSTA_INFO_1013 { DWORD wki1013_keep_conn;} WKSTA_INFO_1013,*PWKSTA_INFO_1013,*LPWKSTA_INFO_1013;
+typedef struct _WKSTA_INFO_1018 { DWORD wki1018_sess_timeout;} WKSTA_INFO_1018,*PWKSTA_INFO_1018,*LPWKSTA_INFO_1018;
+typedef struct _WKSTA_INFO_1023 { DWORD wki1023_siz_char_buf;} WKSTA_INFO_1023,*PWKSTA_INFO_1023,*LPWKSTA_INFO_1023;
+typedef struct _WKSTA_INFO_1033 { DWORD wki1033_max_threads;} WKSTA_INFO_1033,*PWKSTA_INFO_1033,*LPWKSTA_INFO_1033;
+typedef struct _WKSTA_INFO_1041 { DWORD wki1041_lock_quota;} WKSTA_INFO_1041,*PWKSTA_INFO_1041,*LPWKSTA_INFO_1041;
+typedef struct _WKSTA_INFO_1042 { DWORD wki1042_lock_increment;} WKSTA_INFO_1042,*PWKSTA_INFO_1042,*LPWKSTA_INFO_1042;
+typedef struct _WKSTA_INFO_1043 { DWORD wki1043_lock_maximum;} WKSTA_INFO_1043,*PWKSTA_INFO_1043,*LPWKSTA_INFO_1043;
+typedef struct _WKSTA_INFO_1044 { DWORD wki1044_pipe_increment;} WKSTA_INFO_1044,*PWKSTA_INFO_1044,*LPWKSTA_INFO_1044;
+typedef struct _WKSTA_INFO_1045 { DWORD wki1045_pipe_maximum;} WKSTA_INFO_1045,*PWKSTA_INFO_1045,*LPWKSTA_INFO_1045;
+typedef struct _WKSTA_INFO_1046 { DWORD wki1046_dormant_file_limit;} WKSTA_INFO_1046,*PWKSTA_INFO_1046,*LPWKSTA_INFO_1046;
+typedef struct _WKSTA_INFO_1047 { DWORD wki1047_cache_file_timeout;} WKSTA_INFO_1047,*PWKSTA_INFO_1047,*LPWKSTA_INFO_1047;
+typedef struct _WKSTA_INFO_1048 { BOOL wki1048_use_opportunistic_locking;} WKSTA_INFO_1048,*PWKSTA_INFO_1048,*LPWKSTA_INFO_1048;
+typedef struct _WKSTA_INFO_1049 { BOOL wki1049_use_unlock_behind;} WKSTA_INFO_1049,*PWKSTA_INFO_1049,*LPWKSTA_INFO_1049;
+typedef struct _WKSTA_INFO_1050 { BOOL wki1050_use_close_behind;} WKSTA_INFO_1050,*PWKSTA_INFO_1050,*LPWKSTA_INFO_1050;
+typedef struct _WKSTA_INFO_1051 { BOOL wki1051_buf_named_pipes;} WKSTA_INFO_1051,*PWKSTA_INFO_1051,*LPWKSTA_INFO_1051;
+typedef struct _WKSTA_INFO_1052 { BOOL wki1052_use_lock_read_unlock;} WKSTA_INFO_1052,*PWKSTA_INFO_1052,*LPWKSTA_INFO_1052;
+typedef struct _WKSTA_INFO_1053 { BOOL wki1053_utilize_nt_caching;} WKSTA_INFO_1053,*PWKSTA_INFO_1053,*LPWKSTA_INFO_1053;
+typedef struct _WKSTA_INFO_1054 { BOOL wki1054_use_raw_read;} WKSTA_INFO_1054,*PWKSTA_INFO_1054,*LPWKSTA_INFO_1054;
+typedef struct _WKSTA_INFO_1055 { BOOL wki1055_use_raw_write;} WKSTA_INFO_1055,*PWKSTA_INFO_1055,*LPWKSTA_INFO_1055;
+typedef struct _WKSTA_INFO_1056 { BOOL wki1056_use_write_raw_data;} WKSTA_INFO_1056,*PWKSTA_INFO_1056,*LPWKSTA_INFO_1056;
+typedef struct _WKSTA_INFO_1057 { BOOL wki1057_use_encryption;} WKSTA_INFO_1057,*PWKSTA_INFO_1057,*LPWKSTA_INFO_1057;
+typedef struct _WKSTA_INFO_1058 { BOOL wki1058_buf_files_deny_write;} WKSTA_INFO_1058,*PWKSTA_INFO_1058,*LPWKSTA_INFO_1058;
+typedef struct _WKSTA_INFO_1059 { BOOL wki1059_buf_read_only_files;} WKSTA_INFO_1059,*PWKSTA_INFO_1059,*LPWKSTA_INFO_1059;
+typedef struct _WKSTA_INFO_1060 { BOOL wki1060_force_core_create_mode;} WKSTA_INFO_1060,*PWKSTA_INFO_1060,*LPWKSTA_INFO_1060;
+typedef struct _WKSTA_INFO_1061 { BOOL wki1061_use_512_byte_max_transfer;} WKSTA_INFO_1061,*PWKSTA_INFO_1061,*LPWKSTA_INFO_1061;
+typedef struct _WKSTA_INFO_1062 { DWORD wki1062_read_ahead_throughput;} WKSTA_INFO_1062,*PWKSTA_INFO_1062,*LPWKSTA_INFO_1062;
+typedef struct _WKSTA_USER_INFO_0 { LPWSTR wkui0_username;}WKSTA_USER_INFO_0,*PWKSTA_USER_INFO_0,*LPWKSTA_USER_INFO_0;
+typedef struct _WKSTA_USER_INFO_1 {
+ LPWSTR wkui1_username;
+ LPWSTR wkui1_logon_domain;
+ LPWSTR wkui1_oth_domains;
+ LPWSTR wkui1_logon_server;
+}WKSTA_USER_INFO_1,*PWKSTA_USER_INFO_1,*LPWKSTA_USER_INFO_1;
+typedef struct _WKSTA_USER_INFO_1101 { LPWSTR wkui1101_oth_domains;} WKSTA_USER_INFO_1101,*PWKSTA_USER_INFO_1101,*LPWKSTA_USER_INFO_1101;
+typedef struct _WKSTA_TRANSPORT_INFO_0 {
+ DWORD wkti0_quality_of_service;
+ DWORD wkti0_number_of_vcs;
+ LPWSTR wkti0_transport_name;
+ LPWSTR wkti0_transport_address;
+ BOOL wkti0_wan_ish;
+}WKSTA_TRANSPORT_INFO_0,*PWKSTA_TRANSPORT_INFO_0,*LPWKSTA_TRANSPORT_INFO_0;
+
+NET_API_STATUS WINAPI NetWkstaGetInfo(LPWSTR,DWORD,PBYTE*);
+NET_API_STATUS WINAPI NetWkstaSetInfo(LPWSTR,DWORD,PBYTE,PDWORD);
+NET_API_STATUS WINAPI NetWkstaUserGetInfo(LPWSTR,DWORD,PBYTE*);
+NET_API_STATUS WINAPI NetWkstaUserSetInfo(LPWSTR,DWORD,PBYTE,PDWORD);
+NET_API_STATUS WINAPI NetWkstaUserEnum(LPWSTR,DWORD,PBYTE*,DWORD,PDWORD,PDWORD,PDWORD);
+NET_API_STATUS WINAPI NetWkstaTransportAdd(LPWSTR,DWORD,PBYTE,PDWORD);
+NET_API_STATUS WINAPI NetWkstaTransportDel(LPWSTR,LPWSTR,DWORD);
+NET_API_STATUS WINAPI NetWkstaTransportEnum(LPWSTR,DWORD,PBYTE*,DWORD,PDWORD,PDWORD,PDWORD);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/winsup/w32api/include/lzexpand.h b/winsup/w32api/include/lzexpand.h
new file mode 100644
index 000000000..5c06d14e4
--- /dev/null
+++ b/winsup/w32api/include/lzexpand.h
@@ -0,0 +1,36 @@
+#ifndef _LZEXPAND_H
+#define _LZEXPAND_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+#define LZERROR_BADINHANDLE (-1)
+#define LZERROR_BADOUTHANDLE (-2)
+#define LZERROR_READ (-3)
+#define LZERROR_WRITE (-4)
+#define LZERROR_GLOBALLOC (-5)
+#define LZERROR_GLOBLOCK (-6)
+#define LZERROR_BADVALUE (-7)
+#define LZERROR_UNKNOWNALG (-8)
+LONG WINAPI CopyLZFile(INT,INT);
+INT WINAPI GetExpandedNameA(LPSTR,LPSTR);
+INT WINAPI GetExpandedNameW(LPWSTR,LPWSTR);
+VOID APIENTRY LZClose(INT);
+LONG APIENTRY LZCopy(INT,INT);
+VOID WINAPI LZDone(VOID);
+INT WINAPI LZInit(INT);
+INT WINAPI LZOpenFileA(LPSTR,LPOFSTRUCT,WORD);
+INT WINAPI LZOpenFileW(LPWSTR,LPOFSTRUCT,WORD);
+INT WINAPI LZRead(INT,LPSTR,INT);
+LONG WINAPI LZSeek(INT,LONG,INT);
+INT WINAPI LZStart(VOID);
+#ifdef UNICODE
+#define GetExpandedName GetExpandedNameW
+#define LZOpenFile LZOpenFileW
+#else
+#define GetExpandedName GetExpandedNameA
+#define LZOpenFile LZOpenFileA
+#endif
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/winsup/w32api/include/mciavi.h b/winsup/w32api/include/mciavi.h
new file mode 100644
index 000000000..b56bb8f1c
--- /dev/null
+++ b/winsup/w32api/include/mciavi.h
@@ -0,0 +1,21 @@
+#ifndef _MCIAVI_H
+#define _MCIAVI_H
+#define MCI_MCIAVI_PLAY_WINDOW 0x1000000
+#define MCI_MCIAVI_PLAY_FULLSCREEN 0x2000000
+#define MCI_MCIAVI_PLAY_FULLBY2 0x4000000
+#define MCI_AVI_STATUS_FRAMES_SKIPPED 0x8001
+#define MCI_AVI_STATUS_LAST_PLAY_SPEED 0x8002
+#define MCI_AVI_STATUS_AUDIO_BREAKS 0x8003
+#define MCI_AVI_SETVIDEO_DRAW_PROCEDURE 0x8000
+#define MCI_AVI_SETVIDEO_PALETTE_COLOR 0x8100
+#define MCI_AVI_SETVIDEO_PALETTE_HALFTONE 0x0000FFFF
+#define MCIERR_AVI_OLDAVIFORMAT (MCIERR_CUSTOM_DRIVER_BASE+100)
+#define MCIERR_AVI_NOTINTERLEAVED (MCIERR_CUSTOM_DRIVER_BASE+101)
+#define MCIERR_AVI_NODISPDIB (MCIERR_CUSTOM_DRIVER_BASE+102)
+#define MCIERR_AVI_CANTPLAYFULLSCREEN (MCIERR_CUSTOM_DRIVER_BASE+103)
+#define MCIERR_AVI_TOOBIGFORVGA (MCIERR_CUSTOM_DRIVER_BASE+104)
+#define MCIERR_AVI_NOCOMPRESSOR (MCIERR_CUSTOM_DRIVER_BASE+105)
+#define MCIERR_AVI_DISPLAYERROR (MCIERR_CUSTOM_DRIVER_BASE+106)
+#define MCIERR_AVI_AUDIOERROR (MCIERR_CUSTOM_DRIVER_BASE+107)
+#define MCIERR_AVI_BADPALETTE (MCIERR_CUSTOM_DRIVER_BASE+108)
+#endif
diff --git a/winsup/w32api/include/mcx.h b/winsup/w32api/include/mcx.h
new file mode 100644
index 000000000..facc6d595
--- /dev/null
+++ b/winsup/w32api/include/mcx.h
@@ -0,0 +1,73 @@
+#ifndef _MCX_H
+#define _MCX_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+#define DIALOPTION_BILLING 64
+#define DIALOPTION_QUIET 128
+#define DIALOPTION_DIALTONE 256
+#define MDMVOLFLAG_LOW 1
+#define MDMVOLFLAG_MEDIUM 2
+#define MDMVOLFLAG_HIGH 4
+#define MDMVOL_LOW 0
+#define MDMVOL_MEDIUM 1
+#define MDMVOL_HIGH 2
+#define MDMSPKRFLAG_OFF 1
+#define MDMSPKRFLAG_DIAL 2
+#define MDMSPKRFLAG_ON 4
+#define MDMSPKRFLAG_CALLSETUP 8
+#define MDMSPKR_OFF 0
+#define MDMSPKR_DIAL 1
+#define MDMSPKR_ON 2
+#define MDMSPKR_CALLSETUP 3
+#define MDM_COMPRESSION 1
+#define MDM_ERROR_CONTROL 2
+#define MDM_FORCED_EC 4
+#define MDM_CELLULAR 8
+#define MDM_FLOWCONTROL_HARD 16
+#define MDM_FLOWCONTROL_SOFT 32
+#define MDM_CCITT_OVERRIDE 64
+#define MDM_SPEED_ADJUST 128
+#define MDM_TONE_DIAL 256
+#define MDM_BLIND_DIAL 512
+#define MDM_V23_OVERRIDE 1024
+typedef struct _MODEMDEVCAPS {
+ DWORD dwActualSize;
+ DWORD dwRequiredSize;
+ DWORD dwDevSpecificOffset;
+ DWORD dwDevSpecificSize;
+ DWORD dwModemProviderVersion;
+ DWORD dwModemManufacturerOffset;
+ DWORD dwModemManufacturerSize;
+ DWORD dwModemModelOffset;
+ DWORD dwModemModelSize;
+ DWORD dwModemVersionOffset;
+ DWORD dwModemVersionSize;
+ DWORD dwDialOptions;
+ DWORD dwCallSetupFailTimer;
+ DWORD dwInactivityTimeout;
+ DWORD dwSpeakerVolume;
+ DWORD dwSpeakerMode;
+ DWORD dwModemOptions;
+ DWORD dwMaxDTERate;
+ DWORD dwMaxDCERate;
+ BYTE abVariablePortion[1];
+} MODEMDEVCAPS,*PMODEMDEVCAPS,*LPMODEMDEVCAPS;
+typedef struct _MODEMSETTINGS {
+ DWORD dwActualSize;
+ DWORD dwRequiredSize;
+ DWORD dwDevSpecificOffset;
+ DWORD dwDevSpecificSize;
+ DWORD dwCallSetupFailTimer;
+ DWORD dwInactivityTimeout;
+ DWORD dwSpeakerVolume;
+ DWORD dwSpeakerMode;
+ DWORD dwPreferredModemOptions;
+ DWORD dwNegotiatedModemOptions;
+ DWORD dwNegotiatedDCERate;
+ BYTE abVariablePortion[1];
+} MODEMSETTINGS,*PMODEMSETTINGS,*LPMODEMSETTINGS;
+#ifdef __cplusplus
+}
+#endif
+#endif /* _MCX_H */
diff --git a/winsup/w32api/include/mmsystem.h b/winsup/w32api/include/mmsystem.h
new file mode 100644
index 000000000..a35a78929
--- /dev/null
+++ b/winsup/w32api/include/mmsystem.h
@@ -0,0 +1,1933 @@
+
+#ifndef _MMSYSTEM_H
+#define _MMSYSTEM_H
+#pragma pack(push,1)
+#ifdef __cplusplus
+extern "C" {
+#endif
+#define WINMMAPI DECLSPEC_IMPORT
+#define _loadds
+#define _huge
+#define MAXPNAMELEN 32
+#define MAXERRORLENGTH 256
+#define MAX_JOYSTICKOEMVXDNAME 260
+#define _MMRESULT_
+#define TIME_MS 1
+#define TIME_SAMPLES 2
+#define TIME_BYTES 4
+#define TIME_SMPTE 8
+#define TIME_MIDI 16
+#define TIME_TICKS 32
+#define MAKEFOURCC(c0,c1,c2,c3) ((DWORD)(BYTE)(c0)|((DWORD)(BYTE)(c1)<<8)|((DWORD)(BYTE)(c2)<<16)|((DWORD)(BYTE)(c3)<<24))
+#define MM_JOY1MOVE 0x3A0
+#define MM_JOY2MOVE 0x3A1
+#define MM_JOY1ZMOVE 0x3A2
+#define MM_JOY2ZMOVE 0x3A3
+#define MM_JOY1BUTTONDOWN 0x3B5
+#define MM_JOY2BUTTONDOWN 0x3B6
+#define MM_JOY1BUTTONUP 0x3B7
+#define MM_JOY2BUTTONUP 0x3B8
+#define MM_MCINOTIFY 0x3B9
+#define MM_WOM_OPEN 0x3BB
+#define MM_WOM_CLOSE 0x3BC
+#define MM_WOM_DONE 0x3BD
+#define MM_WIM_OPEN 0x3BE
+#define MM_WIM_CLOSE 0x3BF
+#define MM_WIM_DATA 0x3C0
+#define MM_MIM_OPEN 0x3C1
+#define MM_MIM_CLOSE 0x3C2
+#define MM_MIM_DATA 0x3C3
+#define MM_MIM_LONGDATA 0x3C4
+#define MM_MIM_ERROR 0x3C5
+#define MM_MIM_LONGERROR 0x3C6
+#define MM_MOM_OPEN 0x3C7
+#define MM_MOM_CLOSE 0x3C8
+#define MM_MOM_DONE 0x3C9
+#define MM_DRVM_OPEN 0x3D0
+#define MM_DRVM_CLOSE 0x3D1
+#define MM_DRVM_DATA 0x3D2
+#define MM_DRVM_ERROR 0x3D3
+#define MM_STREAM_OPEN 0x3D4
+#define MM_STREAM_CLOSE 0x3D5
+#define MM_STREAM_DONE 0x3D6
+#define MM_STREAM_ERROR 0x3D7
+#define MM_MOM_POSITIONCB 0x3CA
+#define MM_MCISIGNAL 0x3CB
+#define MM_MIM_MOREDATA 0x3CC
+#define MM_MIXM_LINE_CHANGE 0x3D0
+#define MM_MIXM_CONTROL_CHANGE 0x3D1
+#define MMSYSERR_BASE 0
+#define WAVERR_BASE 32
+#define MIDIERR_BASE 64
+#define TIMERR_BASE 96
+#define JOYERR_BASE 160
+#define MCIERR_BASE 256
+#define MIXERR_BASE 1024
+#define MCI_STRING_OFFSET 512
+#define MCI_VD_OFFSET 1024
+#define MCI_CD_OFFSET 1088
+#define MCI_WAVE_OFFSET 1152
+#define MCI_SEQ_OFFSET 1216
+#define MMSYSERR_NOERROR 0
+#define MMSYSERR_ERROR (MMSYSERR_BASE+1)
+#define MMSYSERR_BADDEVICEID (MMSYSERR_BASE+2)
+#define MMSYSERR_NOTENABLED (MMSYSERR_BASE+3)
+#define MMSYSERR_ALLOCATED (MMSYSERR_BASE+4)
+#define MMSYSERR_INVALHANDLE (MMSYSERR_BASE+5)
+#define MMSYSERR_NODRIVER (MMSYSERR_BASE+6)
+#define MMSYSERR_NOMEM (MMSYSERR_BASE+7)
+#define MMSYSERR_NOTSUPPORTED (MMSYSERR_BASE+8)
+#define MMSYSERR_BADERRNUM (MMSYSERR_BASE+9)
+#define MMSYSERR_INVALFLAG (MMSYSERR_BASE+10)
+#define MMSYSERR_INVALPARAM (MMSYSERR_BASE+11)
+#define MMSYSERR_HANDLEBUSY (MMSYSERR_BASE+12)
+#define MMSYSERR_INVALIDALIAS (MMSYSERR_BASE+13)
+#define MMSYSERR_BADDB (MMSYSERR_BASE+14)
+#define MMSYSERR_KEYNOTFOUND (MMSYSERR_BASE+15)
+#define MMSYSERR_READERROR (MMSYSERR_BASE+16)
+#define MMSYSERR_WRITEERROR (MMSYSERR_BASE+17)
+#define MMSYSERR_DELETEERROR (MMSYSERR_BASE+18)
+#define MMSYSERR_VALNOTFOUND (MMSYSERR_BASE+19)
+#define MMSYSERR_NODRIVERCB (MMSYSERR_BASE+20)
+#define MMSYSERR_LASTERROR (MMSYSERR_BASE+20)
+#define DRV_LOAD 1
+#define DRV_ENABLE 2
+#define DRV_OPEN 3
+#define DRV_CLOSE 4
+#define DRV_DISABLE 5
+#define DRV_FREE 6
+#define DRV_CONFIGURE 7
+#define DRV_QUERYCONFIGURE 8
+#define DRV_INSTALL 9
+#define DRV_REMOVE 10
+#define DRV_EXITSESSION 11
+#define DRV_POWER 15
+#define DRV_RESERVED 0x800
+#define DRV_USER 0x4000
+#define DRVCNF_CANCEL 0
+#define DRVCNF_OK 1
+#define DRVCNF_RESTART 2
+#define DRV_CANCEL DRVCNF_CANCEL
+#define DRV_OK DRVCNF_OK
+#define DRV_RESTART DRVCNF_RESTART
+#define DRV_MCI_FIRST DRV_RESERVED
+#define DRV_MCI_LAST (DRV_RESERVED+0xFFF)
+#define CALLBACK_TYPEMASK 0x70000
+#define CALLBACK_NULL 0
+#define CALLBACK_WINDOW 0x10000
+#define CALLBACK_TASK 0x20000
+#define CALLBACK_FUNCTION 0x30000
+#define CALLBACK_THREAD CALLBACK_TASK
+#define CALLBACK_EVENT 0x50000
+#define SND_SYNC 0
+#define SND_ASYNC 1
+#define SND_NODEFAULT 2
+#define SND_MEMORY 4
+#define SND_LOOP 8
+#define SND_NOSTOP 16
+#define SND_NOWAIT 0x2000
+#define SND_ALIAS 0x10000
+#define SND_ALIAS_ID 0x110000
+#define SND_FILENAME 0x20000
+#define SND_RESOURCE 0x40004
+#define SND_PURGE 0x40
+#define SND_APPLICATION 0x80
+#define SND_ALIAS_START 0
+#define sndAlias(c0,c1) (SND_ALIAS_START+(DWORD)(BYTE)(c0)|((DWORD)(BYTE)(c1)<<8))
+#define SND_ALIAS_SYSTEMASTERISK sndAlias('S','*')
+#define SND_ALIAS_SYSTEMQUESTION sndAlias('S','?')
+#define SND_ALIAS_SYSTEMHAND sndAlias('S','H')
+#define SND_ALIAS_SYSTEMEXIT sndAlias('S','E')
+#define SND_ALIAS_SYSTEMSTART sndAlias('S','S')
+#define SND_ALIAS_SYSTEMWELCOME sndAlias('S','W')
+#define SND_ALIAS_SYSTEMEXCLAMATION sndAlias('S','!')
+#define SND_ALIAS_SYSTEMDEFAULT sndAlias('S','D')
+#define WAVERR_BADFORMAT (WAVERR_BASE + 0)
+#define WAVERR_STILLPLAYING (WAVERR_BASE + 1)
+#define WAVERR_UNPREPARED (WAVERR_BASE + 2)
+#define WAVERR_SYNC (WAVERR_BASE + 3)
+#define WAVERR_LASTERROR (WAVERR_BASE + 3)
+#define WOM_OPEN MM_WOM_OPEN
+#define WOM_CLOSE MM_WOM_CLOSE
+#define WOM_DONE MM_WOM_DONE
+#define WIM_OPEN MM_WIM_OPEN
+#define WIM_CLOSE MM_WIM_CLOSE
+#define WIM_DATA MM_WIM_DATA
+#define WAVE_MAPPER ((UINT)-1)
+#define WAVE_FORMAT_QUERY 1
+#define WAVE_ALLOWSYNC 2
+#define WAVE_MAPPED 4
+#define WAVE_FORMAT_DIRECT 8
+#define WAVE_FORMAT_DIRECT_QUERY (WAVE_FORMAT_QUERY|WAVE_FORMAT_DIRECT)
+#define WHDR_DONE 1
+#define WHDR_PREPARED 2
+#define WHDR_BEGINLOOP 4
+#define WHDR_ENDLOOP 8
+#define WHDR_INQUEUE 16
+#define WAVECAPS_PITCH 1
+#define WAVECAPS_PLAYBACKRATE 2
+#define WAVECAPS_VOLUME 4
+#define WAVECAPS_LRVOLUME 8
+#define WAVECAPS_SYNC 16
+#define WAVECAPS_SAMPLEACCURATE 32
+#define WAVECAPS_DIRECTSOUND 64
+#define WAVE_INVALIDFORMAT 0
+#define WAVE_FORMAT_1M08 1
+#define WAVE_FORMAT_1S08 2
+#define WAVE_FORMAT_1M16 4
+#define WAVE_FORMAT_1S16 8
+#define WAVE_FORMAT_2M08 16
+#define WAVE_FORMAT_2S08 32
+#define WAVE_FORMAT_2M16 64
+#define WAVE_FORMAT_2S16 128
+#define WAVE_FORMAT_4M08 256
+#define WAVE_FORMAT_4S08 512
+#define WAVE_FORMAT_4M16 1024
+#define WAVE_FORMAT_4S16 2048
+#define WAVE_FORMAT_PCM 1
+#define MIDIERR_UNPREPARED MIDIERR_BASE
+#define MIDIERR_STILLPLAYING (MIDIERR_BASE+1)
+#define MIDIERR_NOMAP (MIDIERR_BASE+2)
+#define MIDIERR_NOTREADY (MIDIERR_BASE+3)
+#define MIDIERR_NODEVICE (MIDIERR_BASE+4)
+#define MIDIERR_INVALIDSETUP (MIDIERR_BASE+5)
+#define MIDIERR_BADOPENMODE (MIDIERR_BASE+6)
+#define MIDIERR_DONT_CONTINUE (MIDIERR_BASE+7)
+#define MIDIERR_LASTERROR (MIDIERR_BASE+7)
+#define MIDIPATCHSIZE 128
+#define MIM_OPEN MM_MIM_OPEN
+#define MIM_CLOSE MM_MIM_CLOSE
+#define MIM_DATA MM_MIM_DATA
+#define MIM_LONGDATA MM_MIM_LONGDATA
+#define MIM_ERROR MM_MIM_ERROR
+#define MIM_LONGERROR MM_MIM_LONGERROR
+#define MOM_OPEN MM_MOM_OPEN
+#define MOM_CLOSE MM_MOM_CLOSE
+#define MOM_DONE MM_MOM_DONE
+#define MIM_MOREDATA MM_MIM_MOREDATA
+#define MOM_POSITIONCB MM_MOM_POSITIONCB
+#define MIDIMAPPER ((UINT)-1)
+#define MIDI_MAPPER ((UINT)-1)
+#define MIDI_IO_STATUS 32
+#define MIDI_CACHE_ALL 1
+#define MIDI_CACHE_BESTFIT 2
+#define MIDI_CACHE_QUERY 3
+#define MIDI_UNCACHE 4
+#define MOD_MIDIPORT 1
+#define MOD_SYNTH 2
+#define MOD_SQSYNTH 3
+#define MOD_FMSYNTH 4
+#define MOD_MAPPER 5
+#define MIDICAPS_VOLUME 1
+#define MIDICAPS_LRVOLUME 2
+#define MIDICAPS_CACHE 4
+#define MIDICAPS_STREAM 8
+#define MHDR_DONE 1
+#define MHDR_PREPARED 2
+#define MHDR_INQUEUE 4
+#define MHDR_ISSTRM 8
+#define MEVT_F_SHORT 0
+#define MEVT_F_LONG 0x80000000
+#define MEVT_F_CALLBACK 0x40000000
+#define MEVT_EVENTTYPE(x) ((BYTE)(((x)>>24)&0xFF))
+#define MEVT_EVENTPARM(x) ((DWORD)((x)&0xFFFFFFL))
+#define MEVT_SHORTMSG 0
+#define MEVT_TEMPO 1
+#define MEVT_NOP 2
+#define MEVT_LONGMSG ((BYTE)0x80)
+#define MEVT_COMMENT ((BYTE)0x82)
+#define MEVT_VERSION ((BYTE)0x84)
+#define MIDISTRM_ERROR (-2)
+#define MIDIPROP_SET 0x80000000
+#define MIDIPROP_GET 0x40000000
+#define MIDIPROP_TIMEDIV 1
+#define MIDIPROP_TEMPO 2
+#define AUX_MAPPER ((UINT)-1)
+#define AUXCAPS_CDAUDIO 1
+#define AUXCAPS_AUXIN 2
+#define AUXCAPS_VOLUME 1
+#define AUXCAPS_LRVOLUME 2
+#define MIXER_SHORT_NAME_CHARS 16
+#define MIXER_LONG_NAME_CHARS 64
+#define MIXERR_INVALLINE MIXERR_BASE
+#define MIXERR_INVALCONTROL (MIXERR_BASE+1)
+#define MIXERR_INVALVALUE (MIXERR_BASE+2)
+#define MIXERR_LASTERROR (MIXERR_BASE+2)
+#define MIXER_OBJECTF_HANDLE 0x80000000
+#define MIXER_OBJECTF_MIXER 0
+#define MIXER_OBJECTF_HMIXER (MIXER_OBJECTF_HANDLE|MIXER_OBJECTF_MIXER)
+#define MIXER_OBJECTF_WAVEOUT 0x10000000
+#define MIXER_OBJECTF_HWAVEOUT (MIXER_OBJECTF_HANDLE|MIXER_OBJECTF_WAVEOUT)
+#define MIXER_OBJECTF_WAVEIN 0x20000000
+#define MIXER_OBJECTF_HWAVEIN (MIXER_OBJECTF_HANDLE|MIXER_OBJECTF_WAVEIN)
+#define MIXER_OBJECTF_MIDIOUT 0x30000000
+#define MIXER_OBJECTF_HMIDIOUT (MIXER_OBJECTF_HANDLE|MIXER_OBJECTF_MIDIOUT)
+#define MIXER_OBJECTF_MIDIIN 0x40000000
+#define MIXER_OBJECTF_HMIDIIN (MIXER_OBJECTF_HANDLE|MIXER_OBJECTF_MIDIIN)
+#define MIXER_OBJECTF_AUX 0x50000000
+#define MIXERLINE_LINEF_ACTIVE 1
+#define MIXERLINE_LINEF_DISCONNECTED 0x8000
+#define MIXERLINE_LINEF_SOURCE 0x80000000
+#define MIXERLINE_COMPONENTTYPE_DST_FIRST 0
+#define MIXERLINE_COMPONENTTYPE_DST_UNDEFINED MIXERLINE_COMPONENTTYPE_DST_FIRST
+#define MIXERLINE_COMPONENTTYPE_DST_DIGITAL (MIXERLINE_COMPONENTTYPE_DST_FIRST+1)
+#define MIXERLINE_COMPONENTTYPE_DST_LINE (MIXERLINE_COMPONENTTYPE_DST_FIRST+2)
+#define MIXERLINE_COMPONENTTYPE_DST_MONITOR (MIXERLINE_COMPONENTTYPE_DST_FIRST+3)
+#define MIXERLINE_COMPONENTTYPE_DST_SPEAKERS (MIXERLINE_COMPONENTTYPE_DST_FIRST+4)
+#define MIXERLINE_COMPONENTTYPE_DST_HEADPHONES (MIXERLINE_COMPONENTTYPE_DST_FIRST+5)
+#define MIXERLINE_COMPONENTTYPE_DST_TELEPHONE (MIXERLINE_COMPONENTTYPE_DST_FIRST+6)
+#define MIXERLINE_COMPONENTTYPE_DST_WAVEIN (MIXERLINE_COMPONENTTYPE_DST_FIRST+7)
+#define MIXERLINE_COMPONENTTYPE_DST_VOICEIN (MIXERLINE_COMPONENTTYPE_DST_FIRST+8)
+#define MIXERLINE_COMPONENTTYPE_DST_LAST (MIXERLINE_COMPONENTTYPE_DST_FIRST+8)
+#define MIXERLINE_COMPONENTTYPE_SRC_FIRST 0x1000
+#define MIXERLINE_COMPONENTTYPE_SRC_UNDEFINED MIXERLINE_COMPONENTTYPE_SRC_FIRST
+#define MIXERLINE_COMPONENTTYPE_SRC_DIGITAL (MIXERLINE_COMPONENTTYPE_SRC_FIRST+1)
+#define MIXERLINE_COMPONENTTYPE_SRC_LINE (MIXERLINE_COMPONENTTYPE_SRC_FIRST+2)
+#define MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE (MIXERLINE_COMPONENTTYPE_SRC_FIRST+3)
+#define MIXERLINE_COMPONENTTYPE_SRC_SYNTHESIZER (MIXERLINE_COMPONENTTYPE_SRC_FIRST+4)
+#define MIXERLINE_COMPONENTTYPE_SRC_COMPACTDISC (MIXERLINE_COMPONENTTYPE_SRC_FIRST+5)
+#define MIXERLINE_COMPONENTTYPE_SRC_TELEPHONE (MIXERLINE_COMPONENTTYPE_SRC_FIRST+6)
+#define MIXERLINE_COMPONENTTYPE_SRC_PCSPEAKER (MIXERLINE_COMPONENTTYPE_SRC_FIRST+7)
+#define MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT (MIXERLINE_COMPONENTTYPE_SRC_FIRST+8)
+#define MIXERLINE_COMPONENTTYPE_SRC_AUXILIARY (MIXERLINE_COMPONENTTYPE_SRC_FIRST+9)
+#define MIXERLINE_COMPONENTTYPE_SRC_ANALOG (MIXERLINE_COMPONENTTYPE_SRC_FIRST+10)
+#define MIXERLINE_COMPONENTTYPE_SRC_LAST (MIXERLINE_COMPONENTTYPE_SRC_FIRST+10)
+#define MIXERLINE_TARGETTYPE_UNDEFINED 0
+#define MIXERLINE_TARGETTYPE_WAVEOUT 1
+#define MIXERLINE_TARGETTYPE_WAVEIN 2
+#define MIXERLINE_TARGETTYPE_MIDIOUT 3
+#define MIXERLINE_TARGETTYPE_MIDIIN 4
+#define MIXERLINE_TARGETTYPE_AUX 5
+#define MIXER_GETLINEINFOF_DESTINATION 0
+#define MIXER_GETLINEINFOF_SOURCE 1
+#define MIXER_GETLINEINFOF_LINEID 2
+#define MIXER_GETLINEINFOF_COMPONENTTYPE 3
+#define MIXER_GETLINEINFOF_TARGETTYPE 4
+#define MIXER_GETLINEINFOF_QUERYMASK 15
+#define MIXERCONTROL_CONTROLF_UNIFORM 1
+#define MIXERCONTROL_CONTROLF_MULTIPLE 1
+#define MIXERCONTROL_CONTROLF_DISABLED 0x80000000
+#define MIXERCONTROL_CT_CLASS_MASK 0xF0000000
+#define MIXERCONTROL_CT_CLASS_CUSTOM 0
+#define MIXERCONTROL_CT_CLASS_METER 0x10000000
+#define MIXERCONTROL_CT_CLASS_SWITCH 0x20000000
+#define MIXERCONTROL_CT_CLASS_NUMBER 0x30000000
+#define MIXERCONTROL_CT_CLASS_SLIDER 0x40000000
+#define MIXERCONTROL_CT_CLASS_FADER 0x50000000
+#define MIXERCONTROL_CT_CLASS_TIME 0x60000000
+#define MIXERCONTROL_CT_CLASS_LIST 0x70000000
+#define MIXERCONTROL_CT_SUBCLASS_MASK 0xF000000
+#define MIXERCONTROL_CT_SC_SWITCH_BOOLEAN 0
+#define MIXERCONTROL_CT_SC_SWITCH_BUTTON 0x1000000
+#define MIXERCONTROL_CT_SC_METER_POLLED 0
+#define MIXERCONTROL_CT_SC_TIME_MICROSECS 0
+#define MIXERCONTROL_CT_SC_TIME_MILLISECS 0x1000000
+#define MIXERCONTROL_CT_SC_LIST_SINGLE 0
+#define MIXERCONTROL_CT_SC_LIST_MULTIPLE 0x1000000
+#define MIXERCONTROL_CT_UNITS_MASK 0xFF0000
+#define MIXERCONTROL_CT_UNITS_CUSTOM 0
+#define MIXERCONTROL_CT_UNITS_BOOLEAN 0x10000
+#define MIXERCONTROL_CT_UNITS_SIGNED 0x20000
+#define MIXERCONTROL_CT_UNITS_UNSIGNED 0x30000
+#define MIXERCONTROL_CT_UNITS_DECIBELS 0x40000
+#define MIXERCONTROL_CT_UNITS_PERCENT 0x50000
+#define MIXERCONTROL_CONTROLTYPE_CUSTOM (MIXERCONTROL_CT_CLASS_CUSTOM|MIXERCONTROL_CT_UNITS_CUSTOM)
+#define MIXERCONTROL_CONTROLTYPE_BOOLEANMETER (MIXERCONTROL_CT_CLASS_METER|MIXERCONTROL_CT_SC_METER_POLLED|MIXERCONTROL_CT_UNITS_BOOLEAN)
+#define MIXERCONTROL_CONTROLTYPE_SIGNEDMETER (MIXERCONTROL_CT_CLASS_METER|MIXERCONTROL_CT_SC_METER_POLLED|MIXERCONTROL_CT_UNITS_SIGNED)
+#define MIXERCONTROL_CONTROLTYPE_PEAKMETER (MIXERCONTROL_CONTROLTYPE_SIGNEDMETER+1)
+#define MIXERCONTROL_CONTROLTYPE_UNSIGNEDMETER (MIXERCONTROL_CT_CLASS_METER|MIXERCONTROL_CT_SC_METER_POLLED|MIXERCONTROL_CT_UNITS_UNSIGNED)
+#define MIXERCONTROL_CONTROLTYPE_BOOLEAN (MIXERCONTROL_CT_CLASS_SWITCH|MIXERCONTROL_CT_SC_SWITCH_BOOLEAN|MIXERCONTROL_CT_UNITS_BOOLEAN)
+#define MIXERCONTROL_CONTROLTYPE_ONOFF (MIXERCONTROL_CONTROLTYPE_BOOLEAN+1)
+#define MIXERCONTROL_CONTROLTYPE_MUTE (MIXERCONTROL_CONTROLTYPE_BOOLEAN+2)
+#define MIXERCONTROL_CONTROLTYPE_MONO (MIXERCONTROL_CONTROLTYPE_BOOLEAN+3)
+#define MIXERCONTROL_CONTROLTYPE_LOUDNESS (MIXERCONTROL_CONTROLTYPE_BOOLEAN+4)
+#define MIXERCONTROL_CONTROLTYPE_STEREOENH (MIXERCONTROL_CONTROLTYPE_BOOLEAN+5)
+#define MIXERCONTROL_CONTROLTYPE_BUTTON (MIXERCONTROL_CT_CLASS_SWITCH|MIXERCONTROL_CT_SC_SWITCH_BUTTON|MIXERCONTROL_CT_UNITS_BOOLEAN)
+#define MIXERCONTROL_CONTROLTYPE_DECIBELS (MIXERCONTROL_CT_CLASS_NUMBER|MIXERCONTROL_CT_UNITS_DECIBELS)
+#define MIXERCONTROL_CONTROLTYPE_SIGNED (MIXERCONTROL_CT_CLASS_NUMBER|MIXERCONTROL_CT_UNITS_SIGNED)
+#define MIXERCONTROL_CONTROLTYPE_UNSIGNED (MIXERCONTROL_CT_CLASS_NUMBER|MIXERCONTROL_CT_UNITS_UNSIGNED)
+#define MIXERCONTROL_CONTROLTYPE_PERCENT (MIXERCONTROL_CT_CLASS_NUMBER|MIXERCONTROL_CT_UNITS_PERCENT)
+#define MIXERCONTROL_CONTROLTYPE_SLIDER (MIXERCONTROL_CT_CLASS_SLIDER|MIXERCONTROL_CT_UNITS_SIGNED)
+#define MIXERCONTROL_CONTROLTYPE_PAN (MIXERCONTROL_CONTROLTYPE_SLIDER+1)
+#define MIXERCONTROL_CONTROLTYPE_QSOUNDPAN (MIXERCONTROL_CONTROLTYPE_SLIDER+2)
+#define MIXERCONTROL_CONTROLTYPE_FADER (MIXERCONTROL_CT_CLASS_FADER|MIXERCONTROL_CT_UNITS_UNSIGNED)
+#define MIXERCONTROL_CONTROLTYPE_VOLUME (MIXERCONTROL_CONTROLTYPE_FADER+1)
+#define MIXERCONTROL_CONTROLTYPE_BASS (MIXERCONTROL_CONTROLTYPE_FADER+2)
+#define MIXERCONTROL_CONTROLTYPE_TREBLE (MIXERCONTROL_CONTROLTYPE_FADER+3)
+#define MIXERCONTROL_CONTROLTYPE_EQUALIZER (MIXERCONTROL_CONTROLTYPE_FADER+4)
+#define MIXERCONTROL_CONTROLTYPE_SINGLESELECT (MIXERCONTROL_CT_CLASS_LIST|MIXERCONTROL_CT_SC_LIST_SINGLE|MIXERCONTROL_CT_UNITS_BOOLEAN)
+#define MIXERCONTROL_CONTROLTYPE_MUX (MIXERCONTROL_CONTROLTYPE_SINGLESELECT+1)
+#define MIXERCONTROL_CONTROLTYPE_MULTIPLESELECT (MIXERCONTROL_CT_CLASS_LIST|MIXERCONTROL_CT_SC_LIST_MULTIPLE|MIXERCONTROL_CT_UNITS_BOOLEAN)
+#define MIXERCONTROL_CONTROLTYPE_MIXER (MIXERCONTROL_CONTROLTYPE_MULTIPLESELECT+1)
+#define MIXERCONTROL_CONTROLTYPE_MICROTIME (MIXERCONTROL_CT_CLASS_TIME|MIXERCONTROL_CT_SC_TIME_MICROSECS|MIXERCONTROL_CT_UNITS_UNSIGNED)
+#define MIXERCONTROL_CONTROLTYPE_MILLITIME (MIXERCONTROL_CT_CLASS_TIME|MIXERCONTROL_CT_SC_TIME_MILLISECS|MIXERCONTROL_CT_UNITS_UNSIGNED)
+#define MIXER_GETLINECONTROLSF_ALL 0
+#define MIXER_GETLINECONTROLSF_ONEBYID 1
+#define MIXER_GETLINECONTROLSF_ONEBYTYPE 2
+#define MIXER_GETLINECONTROLSF_QUERYMASK 15
+#define MIXER_GETCONTROLDETAILSF_VALUE 0
+#define MIXER_GETCONTROLDETAILSF_LISTTEXT 1
+#define MIXER_GETCONTROLDETAILSF_QUERYMASK 15
+#define MIXER_SETCONTROLDETAILSF_VALUE 0
+#define MIXER_SETCONTROLDETAILSF_CUSTOM 1
+#define MIXER_SETCONTROLDETAILSF_QUERYMASK 15
+#define TIMERR_NOERROR 0
+#define TIMERR_NOCANDO (TIMERR_BASE+1)
+#define TIMERR_STRUCT (TIMERR_BASE+33)
+#define TIME_ONESHOT 0
+#define TIME_PERIODIC 1
+#define TIME_CALLBACK_FUNCTION 0
+#define TIME_CALLBACK_EVENT_SET 16
+#define TIME_CALLBACK_EVENT_PULSE 32
+#define JOYERR_NOERROR (0)
+#define JOYERR_PARMS (JOYERR_BASE+5)
+#define JOYERR_NOCANDO (JOYERR_BASE+6)
+#define JOYERR_UNPLUGGED (JOYERR_BASE+7)
+#define JOY_BUTTON1 1
+#define JOY_BUTTON2 2
+#define JOY_BUTTON3 4
+#define JOY_BUTTON4 8
+#define JOY_BUTTON1CHG 256
+#define JOY_BUTTON2CHG 512
+#define JOY_BUTTON3CHG 1024
+#define JOY_BUTTON4CHG 2048
+#define JOY_BUTTON5 257
+#define JOY_BUTTON6 513
+#define JOY_BUTTON7 1025
+#define JOY_BUTTON8 2049
+#define JOY_BUTTON9 256
+#define JOY_BUTTON10 512
+#define JOY_BUTTON11 1024
+#define JOY_BUTTON12 2048
+#define JOY_BUTTON13 4096
+#define JOY_BUTTON14 8192
+#define JOY_BUTTON15 16384
+#define JOY_BUTTON16 32768
+#define JOY_BUTTON17 65536
+#define JOY_BUTTON18 0x20000
+#define JOY_BUTTON19 0x40000
+#define JOY_BUTTON20 0x80000
+#define JOY_BUTTON21 0x100000
+#define JOY_BUTTON22 0x200000
+#define JOY_BUTTON23 0x400000
+#define JOY_BUTTON24 0x800000
+#define JOY_BUTTON25 0x1000000
+#define JOY_BUTTON26 0x2000000
+#define JOY_BUTTON27 0x4000000
+#define JOY_BUTTON28 0x8000000
+#define JOY_BUTTON29 0x10000000
+#define JOY_BUTTON30 0x20000000
+#define JOY_BUTTON31 0x40000000
+#define JOY_BUTTON32 0x80000000
+#define JOY_POVCENTERED ((WORD)-1)
+#define JOY_POVFORWARD 0
+#define JOY_POVRIGHT 9000
+#define JOY_POVBACKWARD 18000
+#define JOY_POVLEFT 27000
+#define JOY_RETURNX 1
+#define JOY_RETURNY 2
+#define JOY_RETURNZ 4l
+#define JOY_RETURNR 8
+#define JOY_RETURNU 16
+#define JOY_RETURNV 32
+#define JOY_RETURNPOV 64
+#define JOY_RETURNBUTTONS 128
+#define JOY_RETURNRAWDATA 256
+#define JOY_RETURNPOVCTS 512
+#define JOY_RETURNCENTERED 1024
+#define JOY_USEDEADZONE 2048
+#define JOY_RETURNALL (JOY_RETURNX|JOY_RETURNY|JOY_RETURNZ|JOY_RETURNR|JOY_RETURNU|JOY_RETURNV|JOY_RETURNPOV|JOY_RETURNBUTTONS)
+#define JOY_CAL_READALWAYS 0x10000
+#define JOY_CAL_READXYONLY 0x20000
+#define JOY_CAL_READ3 0x40000
+#define JOY_CAL_READ4 0x80000
+#define JOY_CAL_READXONLY 0x100000
+#define JOY_CAL_READYONLY 0x200000
+#define JOY_CAL_READ5 0x400000
+#define JOY_CAL_READ6 0x800000
+#define JOY_CAL_READZONLY 0x1000000
+#define JOY_CAL_READRONLY 0x2000000
+#define JOY_CAL_READUONLY 0x4000000
+#define JOY_CAL_READVONLY 0x8000000
+#define JOYSTICKID1 0
+#define JOYSTICKID2 1
+#define JOYCAPS_HASZ 1
+#define JOYCAPS_HASR 2
+#define JOYCAPS_HASU 4
+#define JOYCAPS_HASV 8
+#define JOYCAPS_HASPOV 16
+#define JOYCAPS_POV4DIR 32
+#define JOYCAPS_POVCTS 64
+#define MMIOERR_BASE 256
+#define MMIOERR_FILENOTFOUND (MMIOERR_BASE+1)
+#define MMIOERR_OUTOFMEMORY (MMIOERR_BASE+2)
+#define MMIOERR_CANNOTOPEN (MMIOERR_BASE+3)
+#define MMIOERR_CANNOTCLOSE (MMIOERR_BASE+4)
+#define MMIOERR_CANNOTREAD (MMIOERR_BASE+5)
+#define MMIOERR_CANNOTWRITE (MMIOERR_BASE+6)
+#define MMIOERR_CANNOTSEEK (MMIOERR_BASE+7)
+#define MMIOERR_CANNOTEXPAND (MMIOERR_BASE+8)
+#define MMIOERR_CHUNKNOTFOUND (MMIOERR_BASE+9)
+#define MMIOERR_UNBUFFERED (MMIOERR_BASE+10)
+#define MMIOERR_PATHNOTFOUND (MMIOERR_BASE+11)
+#define MMIOERR_ACCESSDENIED (MMIOERR_BASE+12)
+#define MMIOERR_SHARINGVIOLATION (MMIOERR_BASE+13)
+#define MMIOERR_NETWORKERROR (MMIOERR_BASE+14)
+#define MMIOERR_TOOMANYOPENFILES (MMIOERR_BASE+15)
+#define MMIOERR_INVALIDFILE (MMIOERR_BASE+16)
+#define CFSEPCHAR '+'
+#define MMIO_RWMODE 3
+#define MMIO_SHAREMODE 0x70
+#define MMIO_CREATE 0x1000
+#define MMIO_PARSE 256
+#define MMIO_DELETE 512
+#define MMIO_EXIST 0x4000
+#define MMIO_ALLOCBUF 0x10000
+#define MMIO_GETTEMP 0x20000
+#define MMIO_DIRTY 0x10000000
+#define MMIO_READ 0
+#define MMIO_WRITE 1
+#define MMIO_READWRITE 2
+#define MMIO_COMPAT 0
+#define MMIO_EXCLUSIVE 16
+#define MMIO_DENYWRITE 32
+#define MMIO_DENYREAD 0x30
+#define MMIO_DENYNONE 64
+#define MMIO_FHOPEN 16
+#define MMIO_EMPTYBUF 16
+#define MMIO_TOUPPER 16
+#define MMIO_INSTALLPROC 0x10000
+#define MMIO_GLOBALPROC 0x10000000
+#define MMIO_REMOVEPROC 0x20000
+#define MMIO_UNICODEPROC 0x1000000
+#define MMIO_FINDPROC 0x40000
+#define MMIO_FINDCHUNK 16
+#define MMIO_FINDRIFF 32
+#define MMIO_FINDLIST 64
+#define MMIO_CREATERIFF 32
+#define MMIO_CREATELIST 64
+#define MMIOM_READ MMIO_READ
+#define MMIOM_WRITE MMIO_WRITE
+#define MMIOM_SEEK 2
+#define MMIOM_OPEN 3
+#define MMIOM_CLOSE 4
+#define MMIOM_WRITEFLUSH 5
+#define MMIOM_RENAME 6
+#define MMIOM_USER 0x8000
+#define FOURCC_RIFF mmioFOURCC('R', 'I', 'F', 'F')
+#define FOURCC_LIST mmioFOURCC('L', 'I', 'S', 'T')
+#define FOURCC_DOS mmioFOURCC('D', 'O', 'S', ' ')
+#define FOURCC_MEM mmioFOURCC('M', 'E', 'M', ' ')
+#define MMIO_DEFAULTBUFFER 8192
+#define mmioFOURCC(c0,c1,c2,c3) MAKEFOURCC(c0,c1,c2,c3)
+#define MCIERR_INVALID_DEVICE_ID (MCIERR_BASE+1)
+#define MCIERR_UNRECOGNIZED_KEYWORD (MCIERR_BASE+3)
+#define MCIERR_UNRECOGNIZED_COMMAND (MCIERR_BASE+5)
+#define MCIERR_HARDWARE (MCIERR_BASE+6)
+#define MCIERR_INVALID_DEVICE_NAME (MCIERR_BASE+7)
+#define MCIERR_OUT_OF_MEMORY (MCIERR_BASE+8)
+#define MCIERR_DEVICE_OPEN (MCIERR_BASE+9)
+#define MCIERR_CANNOT_LOAD_DRIVER (MCIERR_BASE+10)
+#define MCIERR_MISSING_COMMAND_STRING (MCIERR_BASE+11)
+#define MCIERR_PARAM_OVERFLOW (MCIERR_BASE+12)
+#define MCIERR_MISSING_STRING_ARGUMENT (MCIERR_BASE+13)
+#define MCIERR_BAD_INTEGER (MCIERR_BASE+14)
+#define MCIERR_PARSER_INTERNAL (MCIERR_BASE+15)
+#define MCIERR_DRIVER_INTERNAL (MCIERR_BASE+16)
+#define MCIERR_MISSING_PARAMETER (MCIERR_BASE+17)
+#define MCIERR_UNSUPPORTED_FUNCTION (MCIERR_BASE+18)
+#define MCIERR_FILE_NOT_FOUND (MCIERR_BASE+19)
+#define MCIERR_DEVICE_NOT_READY (MCIERR_BASE+20)
+#define MCIERR_INTERNAL (MCIERR_BASE+21)
+#define MCIERR_DRIVER (MCIERR_BASE+22)
+#define MCIERR_CANNOT_USE_ALL (MCIERR_BASE+23)
+#define MCIERR_MULTIPLE (MCIERR_BASE+24)
+#define MCIERR_EXTENSION_NOT_FOUND (MCIERR_BASE+25)
+#define MCIERR_OUTOFRANGE (MCIERR_BASE+26)
+#define MCIERR_FLAGS_NOT_COMPATIBLE (MCIERR_BASE+28)
+#define MCIERR_FILE_NOT_SAVED (MCIERR_BASE+30)
+#define MCIERR_DEVICE_TYPE_REQUIRED (MCIERR_BASE+31)
+#define MCIERR_DEVICE_LOCKED (MCIERR_BASE+32)
+#define MCIERR_DUPLICATE_ALIAS (MCIERR_BASE+33)
+#define MCIERR_BAD_CONSTANT (MCIERR_BASE+34)
+#define MCIERR_MUST_USE_SHAREABLE (MCIERR_BASE+35)
+#define MCIERR_MISSING_DEVICE_NAME (MCIERR_BASE+36)
+#define MCIERR_BAD_TIME_FORMAT (MCIERR_BASE+37)
+#define MCIERR_NO_CLOSING_QUOTE (MCIERR_BASE+38)
+#define MCIERR_DUPLICATE_FLAGS (MCIERR_BASE+39)
+#define MCIERR_INVALID_FILE (MCIERR_BASE+40)
+#define MCIERR_NULL_PARAMETER_BLOCK (MCIERR_BASE+41)
+#define MCIERR_UNNAMED_RESOURCE (MCIERR_BASE+42)
+#define MCIERR_NEW_REQUIRES_ALIAS (MCIERR_BASE+43)
+#define MCIERR_NOTIFY_ON_AUTO_OPEN (MCIERR_BASE+44)
+#define MCIERR_NO_ELEMENT_ALLOWED (MCIERR_BASE+45)
+#define MCIERR_NONAPPLICABLE_FUNCTION (MCIERR_BASE+46)
+#define MCIERR_ILLEGAL_FOR_AUTO_OPEN (MCIERR_BASE+47)
+#define MCIERR_FILENAME_REQUIRED (MCIERR_BASE+48)
+#define MCIERR_EXTRA_CHARACTERS (MCIERR_BASE+49)
+#define MCIERR_DEVICE_NOT_INSTALLED (MCIERR_BASE+50)
+#define MCIERR_GET_CD (MCIERR_BASE+51)
+#define MCIERR_SET_CD (MCIERR_BASE+52)
+#define MCIERR_SET_DRIVE (MCIERR_BASE+53)
+#define MCIERR_DEVICE_LENGTH (MCIERR_BASE+54)
+#define MCIERR_DEVICE_ORD_LENGTH (MCIERR_BASE+55)
+#define MCIERR_NO_INTEGER (MCIERR_BASE+56)
+#define MCIERR_WAVE_OUTPUTSINUSE (MCIERR_BASE+64)
+#define MCIERR_WAVE_SETOUTPUTINUSE (MCIERR_BASE+65)
+#define MCIERR_WAVE_INPUTSINUSE (MCIERR_BASE+66)
+#define MCIERR_WAVE_SETINPUTINUSE (MCIERR_BASE+67)
+#define MCIERR_WAVE_OUTPUTUNSPECIFIED (MCIERR_BASE+68)
+#define MCIERR_WAVE_INPUTUNSPECIFIED (MCIERR_BASE+69)
+#define MCIERR_WAVE_OUTPUTSUNSUITABLE (MCIERR_BASE+70)
+#define MCIERR_WAVE_SETOUTPUTUNSUITABLE (MCIERR_BASE+71)
+#define MCIERR_WAVE_INPUTSUNSUITABLE (MCIERR_BASE+72)
+#define MCIERR_WAVE_SETINPUTUNSUITABLE (MCIERR_BASE+73)
+#define MCIERR_SEQ_DIV_INCOMPATIBLE (MCIERR_BASE+80)
+#define MCIERR_SEQ_PORT_INUSE (MCIERR_BASE+81)
+#define MCIERR_SEQ_PORT_NONEXISTENT (MCIERR_BASE+82)
+#define MCIERR_SEQ_PORT_MAPNODEVICE (MCIERR_BASE+83)
+#define MCIERR_SEQ_PORT_MISCERROR (MCIERR_BASE+84)
+#define MCIERR_SEQ_TIMER (MCIERR_BASE+85)
+#define MCIERR_SEQ_PORTUNSPECIFIED (MCIERR_BASE+86)
+#define MCIERR_SEQ_NOMIDIPRESENT (MCIERR_BASE+87)
+#define MCIERR_NO_WINDOW (MCIERR_BASE+90)
+#define MCIERR_CREATEWINDOW (MCIERR_BASE+91)
+#define MCIERR_FILE_READ (MCIERR_BASE+92)
+#define MCIERR_FILE_WRITE (MCIERR_BASE+93)
+#define MCIERR_NO_IDENTITY (MCIERR_BASE+94)
+#define MCIERR_CUSTOM_DRIVER_BASE (MCIERR_BASE+256)
+#define MCI_FIRST DRV_MCI_FIRST
+#define MCI_OPEN 0x803
+#define MCI_CLOSE 0x804
+#define MCI_ESCAPE 0x805
+#define MCI_PLAY 0x806
+#define MCI_SEEK 0x807
+#define MCI_STOP 0x808
+#define MCI_PAUSE 0x809
+#define MCI_INFO 0x80A
+#define MCI_GETDEVCAPS 0x80B
+#define MCI_SPIN 0x80C
+#define MCI_SET 0x80D
+#define MCI_STEP 0x80E
+#define MCI_RECORD 0x80F
+#define MCI_SYSINFO 0x810
+#define MCI_BREAK 0x811
+#define MCI_SAVE 0x813
+#define MCI_STATUS 0x814
+#define MCI_CUE 0x830
+#define MCI_REALIZE 0x840
+#define MCI_WINDOW 0x841
+#define MCI_PUT 0x842
+#define MCI_WHERE 0x843
+#define MCI_FREEZE 0x844
+#define MCI_UNFREEZE 0x845
+#define MCI_LOAD 0x850
+#define MCI_CUT 0x851
+#define MCI_COPY 0x852
+#define MCI_PASTE 0x853
+#define MCI_UPDATE 0x854
+#define MCI_RESUME 0x855
+#define MCI_DELETE 0x856
+#define MCI_USER_MESSAGES (DRV_MCI_FIRST+0x400)
+#define MCI_LAST 0xFFF
+#define MCI_ALL_DEVICE_ID ((MCIDEVICEID)-1)
+#define MCI_DEVTYPE_VCR 513
+#define MCI_DEVTYPE_VIDEODISC 514
+#define MCI_DEVTYPE_OVERLAY 515
+#define MCI_DEVTYPE_CD_AUDIO 516
+#define MCI_DEVTYPE_DAT 517
+#define MCI_DEVTYPE_SCANNER 518
+#define MCI_DEVTYPE_ANIMATION 519
+#define MCI_DEVTYPE_DIGITAL_VIDEO 520
+#define MCI_DEVTYPE_OTHER 521
+#define MCI_DEVTYPE_WAVEFORM_AUDIO 522
+#define MCI_DEVTYPE_SEQUENCER 523
+#define MCI_DEVTYPE_FIRST MCI_DEVTYPE_VCR
+#define MCI_DEVTYPE_LAST MCI_DEVTYPE_SEQUENCER
+#define MCI_DEVTYPE_FIRST_USER 0x1000
+#define MCI_MODE_NOT_READY (MCI_STRING_OFFSET+12)
+#define MCI_MODE_STOP (MCI_STRING_OFFSET+13)
+#define MCI_MODE_PLAY (MCI_STRING_OFFSET+14)
+#define MCI_MODE_RECORD (MCI_STRING_OFFSET+15)
+#define MCI_MODE_SEEK (MCI_STRING_OFFSET+16)
+#define MCI_MODE_PAUSE (MCI_STRING_OFFSET+17)
+#define MCI_MODE_OPEN (MCI_STRING_OFFSET+18)
+#define MCI_FORMAT_MILLISECONDS 0
+#define MCI_FORMAT_HMS 1
+#define MCI_FORMAT_MSF 2
+#define MCI_FORMAT_FRAMES 3
+#define MCI_FORMAT_SMPTE_24 4
+#define MCI_FORMAT_SMPTE_25 5
+#define MCI_FORMAT_SMPTE_30 6
+#define MCI_FORMAT_SMPTE_30DROP 7
+#define MCI_FORMAT_BYTES 8
+#define MCI_FORMAT_SAMPLES 9
+#define MCI_FORMAT_TMSF 10
+#define MCI_MSF_MINUTE(t) ((BYTE)(t))
+#define MCI_MSF_SECOND(t) ((BYTE)(((WORD)(t))>>8))
+#define MCI_MSF_FRAME(t) ((BYTE)((t)>>16))
+#define MCI_MAKE_MSF(m,s,f) ((DWORD)(((BYTE)(m)|((WORD)(s)<<8))|(((DWORD)(BYTE)(f))<<16)))
+#define MCI_TMSF_TRACK(t) ((BYTE)(t))
+#define MCI_TMSF_MINUTE(t) ((BYTE)(((WORD)(t))>>8))
+#define MCI_TMSF_SECOND(t) ((BYTE)((t)>>16))
+#define MCI_TMSF_FRAME(t) ((BYTE)((t)>>24))
+#define MCI_MAKE_TMSF(t,m,s,f) ((DWORD)(((BYTE)(t)|((WORD)(m)<<8))|(((DWORD)(BYTE)(s)|((WORD)(f)<<8))<<16)))
+#define MCI_HMS_HOUR(t) ((BYTE)(t))
+#define MCI_HMS_MINUTE(t) ((BYTE)(((WORD)(t))>>8))
+#define MCI_HMS_SECOND(t) ((BYTE)((t)>>16))
+#define MCI_MAKE_HMS(h,m,s) ((DWORD)(((BYTE)(h)|((WORD)(m)<<8))|(((DWORD)(BYTE)(s))<<16)))
+#define MCI_NOTIFY_SUCCESSFUL 1
+#define MCI_NOTIFY_SUPERSEDED 2
+#define MCI_NOTIFY_ABORTED 4
+#define MCI_NOTIFY_FAILURE 8
+#define MCI_NOTIFY 1
+#define MCI_WAIT 2
+#define MCI_FROM 4
+#define MCI_TO 8
+#define MCI_TRACK 16
+#define MCI_OPEN_SHAREABLE 256
+#define MCI_OPEN_ELEMENT 512
+#define MCI_OPEN_ALIAS 1024
+#define MCI_OPEN_ELEMENT_ID 2048
+#define MCI_OPEN_TYPE_ID 0x1000
+#define MCI_OPEN_TYPE 0x2000
+#define MCI_SEEK_TO_START 256
+#define MCI_SEEK_TO_END 512
+#define MCI_STATUS_ITEM 256
+#define MCI_STATUS_START 512
+#define MCI_STATUS_LENGTH 1
+#define MCI_STATUS_POSITION 2
+#define MCI_STATUS_NUMBER_OF_TRACKS 3
+#define MCI_STATUS_MODE 4
+#define MCI_STATUS_MEDIA_PRESENT 5
+#define MCI_STATUS_TIME_FORMAT 6
+#define MCI_STATUS_READY 7
+#define MCI_STATUS_CURRENT_TRACK 8
+#define MCI_INFO_PRODUCT 256
+#define MCI_INFO_FILE 512
+#define MCI_INFO_MEDIA_UPC 1024
+#define MCI_INFO_MEDIA_IDENTITY 2048
+#define MCI_INFO_NAME 0x1000
+#define MCI_INFO_COPYRIGHT 0x2000
+#define MCI_GETDEVCAPS_ITEM 256
+#define MCI_GETDEVCAPS_CAN_RECORD 1
+#define MCI_GETDEVCAPS_HAS_AUDIO 2
+#define MCI_GETDEVCAPS_HAS_VIDEO 3
+#define MCI_GETDEVCAPS_DEVICE_TYPE 4
+#define MCI_GETDEVCAPS_USES_FILES 5
+#define MCI_GETDEVCAPS_COMPOUND_DEVICE 6
+#define MCI_GETDEVCAPS_CAN_EJECT 7
+#define MCI_GETDEVCAPS_CAN_PLAY 8
+#define MCI_GETDEVCAPS_CAN_SAVE 9
+#define MCI_SYSINFO_QUANTITY 256
+#define MCI_SYSINFO_OPEN 512
+#define MCI_SYSINFO_NAME 1024
+#define MCI_SYSINFO_INSTALLNAME 2048
+#define MCI_SET_DOOR_OPEN 256
+#define MCI_SET_DOOR_CLOSED 512
+#define MCI_SET_TIME_FORMAT 1024
+#define MCI_SET_AUDIO 2048
+#define MCI_SET_VIDEO 0x1000
+#define MCI_SET_ON 0x2000
+#define MCI_SET_OFF 0x4000
+#define MCI_SET_AUDIO_ALL 0
+#define MCI_SET_AUDIO_LEFT 1
+#define MCI_SET_AUDIO_RIGHT 2
+#define MCI_BREAK_KEY 256
+#define MCI_BREAK_HWND 512
+#define MCI_BREAK_OFF 1024
+#define MCI_RECORD_INSERT 256
+#define MCI_RECORD_OVERWRITE 512
+#define MCI_SAVE_FILE 256
+#define MCI_LOAD_FILE 256
+#define MCI_VD_MODE_PARK (MCI_VD_OFFSET+1)
+#define MCI_VD_MEDIA_CLV (MCI_VD_OFFSET+2)
+#define MCI_VD_MEDIA_CAV (MCI_VD_OFFSET+3)
+#define MCI_VD_MEDIA_OTHER (MCI_VD_OFFSET+4)
+#define MCI_VD_FORMAT_TRACK 0x4001
+#define MCI_VD_PLAY_REVERSE 0x10000
+#define MCI_VD_PLAY_FAST 0x20000
+#define MCI_VD_PLAY_SPEED 0x40000
+#define MCI_VD_PLAY_SCAN 0x80000
+#define MCI_VD_PLAY_SLOW 0x100000
+#define MCI_VD_SEEK_REVERSE 0x10000
+#define MCI_VD_STATUS_SPEED 0x4002
+#define MCI_VD_STATUS_FORWARD 0x4003
+#define MCI_VD_STATUS_MEDIA_TYPE 0x4004
+#define MCI_VD_STATUS_SIDE 0x4005
+#define MCI_VD_STATUS_DISC_SIZE 0x4006
+#define MCI_VD_GETDEVCAPS_CLV 0x10000
+#define MCI_VD_GETDEVCAPS_CAV 0x20000
+#define MCI_VD_SPIN_UP 0x10000
+#define MCI_VD_SPIN_DOWN 0x20000
+#define MCI_VD_GETDEVCAPS_CAN_REVERSE 0x4002
+#define MCI_VD_GETDEVCAPS_FAST_RATE 0x4003
+#define MCI_VD_GETDEVCAPS_SLOW_RATE 0x4004
+#define MCI_VD_GETDEVCAPS_NORMAL_RATE 0x4005
+#define MCI_VD_STEP_FRAMES 0x10000
+#define MCI_VD_STEP_REVERSE 0x20000
+#define MCI_VD_ESCAPE_STRING 256
+#define MCI_CDA_STATUS_TYPE_TRACK 0x4001
+#define MCI_CDA_TRACK_AUDIO MCI_CD_OFFSET
+#define MCI_CDA_TRACK_OTHER (MCI_CD_OFFSET+1)
+#define MCI_WAVE_PCM MCI_WAVE_OFFSET
+#define MCI_WAVE_MAPPER (MCI_WAVE_OFFSET+1)
+#define MCI_WAVE_OPEN_BUFFER 0x10000
+#define MCI_WAVE_SET_FORMATTAG 0x10000
+#define MCI_WAVE_SET_CHANNELS 0x20000
+#define MCI_WAVE_SET_SAMPLESPERSEC 0x40000
+#define MCI_WAVE_SET_AVGBYTESPERSEC 0x80000
+#define MCI_WAVE_SET_BLOCKALIGN 0x100000
+#define MCI_WAVE_SET_BITSPERSAMPLE 0x200000
+#define MCI_WAVE_INPUT 0x400000
+#define MCI_WAVE_OUTPUT 0x800000
+#define MCI_WAVE_STATUS_FORMATTAG 0x4001
+#define MCI_WAVE_STATUS_CHANNELS 0x4002
+#define MCI_WAVE_STATUS_SAMPLESPERSEC 0x4003
+#define MCI_WAVE_STATUS_AVGBYTESPERSEC 0x4004
+#define MCI_WAVE_STATUS_BLOCKALIGN 0x4005
+#define MCI_WAVE_STATUS_BITSPERSAMPLE 0x4006
+#define MCI_WAVE_STATUS_LEVEL 0x4007
+#define MCI_WAVE_SET_ANYINPUT 0x4000000
+#define MCI_WAVE_SET_ANYOUTPUT 0x8000000
+#define MCI_WAVE_GETDEVCAPS_INPUTS 0x4001
+#define MCI_WAVE_GETDEVCAPS_OUTPUTS 0x4002
+#define MCI_SEQ_DIV_PPQN MCI_SEQ_OFFSET
+#define MCI_SEQ_DIV_SMPTE_24 (MCI_SEQ_OFFSET+1)
+#define MCI_SEQ_DIV_SMPTE_25 (MCI_SEQ_OFFSET+2)
+#define MCI_SEQ_DIV_SMPTE_30DROP (MCI_SEQ_OFFSET+3)
+#define MCI_SEQ_DIV_SMPTE_30 (MCI_SEQ_OFFSET+4)
+#define MCI_SEQ_FORMAT_SONGPTR 0x4001
+#define MCI_SEQ_FILE 0x4002
+#define MCI_SEQ_MIDI 0x4003
+#define MCI_SEQ_SMPTE 0x4004
+#define MCI_SEQ_NONE 65533
+#define MCI_SEQ_MAPPER 65535
+#define MCI_SEQ_STATUS_TEMPO 0x4002
+#define MCI_SEQ_STATUS_PORT 0x4003
+#define MCI_SEQ_STATUS_SLAVE 0x4007
+#define MCI_SEQ_STATUS_MASTER 0x4008
+#define MCI_SEQ_STATUS_OFFSET 0x4009
+#define MCI_SEQ_STATUS_DIVTYPE 0x400A
+#define MCI_SEQ_STATUS_NAME 0x400B
+#define MCI_SEQ_STATUS_COPYRIGHT 0x400C
+#define MCI_SEQ_SET_TEMPO 0x10000
+#define MCI_SEQ_SET_PORT 0x20000
+#define MCI_SEQ_SET_SLAVE 0x40000
+#define MCI_SEQ_SET_MASTER 0x80000
+#define MCI_SEQ_SET_OFFSET 0x1000000
+#define MCI_ANIM_OPEN_WS 0x10000
+#define MCI_ANIM_OPEN_PARENT 0x20000
+#define MCI_ANIM_OPEN_NOSTATIC 0x40000
+#define MCI_ANIM_PLAY_SPEED 0x10000
+#define MCI_ANIM_PLAY_REVERSE 0x20000
+#define MCI_ANIM_PLAY_FAST 0x40000
+#define MCI_ANIM_PLAY_SLOW 0x80000
+#define MCI_ANIM_PLAY_SCAN 0x100000
+#define MCI_ANIM_STEP_REVERSE 0x10000
+#define MCI_ANIM_STEP_FRAMES 0x20000
+#define MCI_ANIM_STATUS_SPEED 0x4001
+#define MCI_ANIM_STATUS_FORWARD 0x4002
+#define MCI_ANIM_STATUS_HWND 0x4003
+#define MCI_ANIM_STATUS_HPAL 0x4004
+#define MCI_ANIM_STATUS_STRETCH 0x4005
+#define MCI_ANIM_INFO_TEXT 0x10000
+#define MCI_ANIM_GETDEVCAPS_CAN_REVERSE 0x4001
+#define MCI_ANIM_GETDEVCAPS_FAST_RATE 0x4002
+#define MCI_ANIM_GETDEVCAPS_SLOW_RATE 0x4003
+#define MCI_ANIM_GETDEVCAPS_NORMAL_RATE 0x4004
+#define MCI_ANIM_GETDEVCAPS_PALETTES 0x4006
+#define MCI_ANIM_GETDEVCAPS_CAN_STRETCH 0x4007
+#define MCI_ANIM_GETDEVCAPS_MAX_WINDOWS 0x4008
+#define MCI_ANIM_REALIZE_NORM 0x10000
+#define MCI_ANIM_REALIZE_BKGD 0x20000
+#define MCI_ANIM_WINDOW_HWND 0x10000
+#define MCI_ANIM_WINDOW_STATE 0x40000
+#define MCI_ANIM_WINDOW_TEXT 0x80000
+#define MCI_ANIM_WINDOW_ENABLE_STRETCH 0x100000
+#define MCI_ANIM_WINDOW_DISABLE_STRETCH 0x200000
+#define MCI_ANIM_WINDOW_DEFAULT 0xL
+#define MCI_ANIM_RECT 0x10000
+#define MCI_ANIM_PUT_SOURCE 0x20000
+#define MCI_ANIM_PUT_DESTINATION 0x40000
+#define MCI_ANIM_WHERE_SOURCE 0x20000
+#define MCI_ANIM_WHERE_DESTINATION 0x40000
+#define MCI_ANIM_UPDATE_HDC 0x20000
+#define MCI_OVLY_OPEN_WS 0x10000
+#define MCI_OVLY_OPEN_PARENT 0x20000
+#define MCI_OVLY_STATUS_HWND 0x4001
+#define MCI_OVLY_STATUS_STRETCH 0x4002
+#define MCI_OVLY_INFO_TEXT 0x10000
+#define MCI_OVLY_GETDEVCAPS_CAN_STRETCH 0x4001
+#define MCI_OVLY_GETDEVCAPS_CAN_FREEZE 0x4002
+#define MCI_OVLY_GETDEVCAPS_MAX_WINDOWS 0x4003
+#define MCI_OVLY_WINDOW_HWND 0x10000
+#define MCI_OVLY_WINDOW_STATE 0x40000
+#define MCI_OVLY_WINDOW_TEXT 0x80000
+#define MCI_OVLY_WINDOW_ENABLE_STRETCH 0x100000
+#define MCI_OVLY_WINDOW_DISABLE_STRETCH 0x200000
+#define MCI_OVLY_WINDOW_DEFAULT 0xL
+#define MCI_OVLY_RECT 0x10000
+#define MCI_OVLY_PUT_SOURCE 0x20000
+#define MCI_OVLY_PUT_DESTINATION 0x40000
+#define MCI_OVLY_PUT_FRAME 0x80000
+#define MCI_OVLY_PUT_VIDEO 0x100000
+#define MCI_OVLY_WHERE_SOURCE 0x20000
+#define MCI_OVLY_WHERE_DESTINATION 0x40000
+#define MCI_OVLY_WHERE_FRAME 0x80000
+#define MCI_OVLY_WHERE_VIDEO 0x100000
+#define NEWTRANSPARENT 3
+#define QUERYROPSUPPORT 40
+#define SELECTDIB 41
+#define DIBINDEX(n) MAKELONG((n),0x10FF)
+#define SC_SCREENSAVE 0xF140
+#define CAPS1 94
+#define C1_TRANSPARENT 1
+#ifndef SEEK_SET
+#define SEEK_SET 0
+#endif
+#ifndef SEEK_CUR
+#define SEEK_CUR 1
+#endif
+#ifndef SEEK_END
+#define SEEK_END 2
+#endif
+
+typedef DWORD MCIERROR;
+typedef UINT MCIDEVICEID;
+typedef UINT(CALLBACK *YIELDPROC)(MCIDEVICEID,DWORD);
+typedef UINT MMVERSION;
+typedef UINT MMRESULT;
+typedef struct mmtime_tag {
+ UINT wType;
+ union {
+ DWORD ms;
+ DWORD sample;
+ DWORD cb;
+ DWORD ticks;
+ struct {
+ BYTE hour;
+ BYTE min;
+ BYTE sec;
+ BYTE frame;
+ BYTE fps;
+ BYTE dummy;
+ BYTE pad[2];
+ } smpte;
+ struct {
+ DWORD songptrpos;
+ } midi;
+ } u;
+} MMTIME,*PMMTIME,*LPMMTIME;
+DECLARE_HANDLE(HDRVR);
+typedef struct tagDRVCONFIGINFO {
+ DWORD dwDCISize;
+ LPCWSTR lpszDCISectionName;
+ LPCWSTR lpszDCIAliasName;
+} DRVCONFIGINFO,*PDRVCONFIGINFO,*LPDRVCONFIGINFO;
+typedef struct DRVCONFIGINFOEX {
+ DWORD dwDCISize;
+ LPCWSTR lpszDCISectionName;
+ LPCWSTR lpszDCIAliasName;
+ DWORD dnDevNode;
+} DRVCONFIGINFOEX,*PDRVCONFIGINFOEX,*LPDRVCONFIGINFOEX;
+typedef LRESULT(CALLBACK* DRIVERPROC)(DWORD,HDRVR,UINT,LPARAM,LPARAM);
+typedef void (CALLBACK DRVCALLBACK)(HDRVR,UINT,DWORD,DWORD,DWORD);
+typedef DRVCALLBACK *LPDRVCALLBACK;
+typedef DRVCALLBACK *PDRVCALLBACK;
+DECLARE_HANDLE(HWAVE);
+DECLARE_HANDLE(HWAVEIN);
+DECLARE_HANDLE(HWAVEOUT);
+typedef HWAVEIN *LPHWAVEIN;
+typedef HWAVEOUT *LPHWAVEOUT;
+typedef DRVCALLBACK WAVECALLBACK;
+typedef WAVECALLBACK *LPWAVECALLBACK;
+typedef struct wavehdr_tag {
+ LPSTR lpData;
+ DWORD dwBufferLength;
+ DWORD dwBytesRecorded;
+ DWORD dwUser;
+ DWORD dwFlags;
+ DWORD dwLoops;
+ struct wavehdr_tag *lpNext;
+ DWORD reserved;
+} WAVEHDR,*PWAVEHDR,*LPWAVEHDR;
+typedef struct tagWAVEOUTCAPSA {
+ WORD wMid;
+ WORD wPid;
+ MMVERSION vDriverVersion;
+ CHAR szPname[MAXPNAMELEN];
+ DWORD dwFormats;
+ WORD wChannels;
+ WORD wReserved1;
+ DWORD dwSupport;
+} WAVEOUTCAPSA,*PWAVEOUTCAPSA,*LPWAVEOUTCAPSA;
+typedef struct tagWAVEOUTCAPSW {
+ WORD wMid;
+ WORD wPid;
+ MMVERSION vDriverVersion;
+ WCHAR szPname[MAXPNAMELEN];
+ DWORD dwFormats;
+ WORD wChannels;
+ WORD wReserved1;
+ DWORD dwSupport;
+} WAVEOUTCAPSW,*PWAVEOUTCAPSW,*LPWAVEOUTCAPSW;
+typedef struct tagWAVEINCAPSA {
+ WORD wMid;
+ WORD wPid;
+ MMVERSION vDriverVersion;
+ CHAR szPname[MAXPNAMELEN];
+ DWORD dwFormats;
+ WORD wChannels;
+ WORD wReserved1;
+} WAVEINCAPSA,*PWAVEINCAPSA,*LPWAVEINCAPSA;
+typedef struct tagWAVEINCAPSW {
+ WORD wMid;
+ WORD wPid;
+ MMVERSION vDriverVersion;
+ WCHAR szPname[MAXPNAMELEN];
+ DWORD dwFormats;
+ WORD wChannels;
+ WORD wReserved1;
+} WAVEINCAPSW,*PWAVEINCAPSW,*LPWAVEINCAPSW;
+typedef struct waveformat_tag {
+ WORD wFormatTag;
+ WORD nChannels;
+ DWORD nSamplesPerSec;
+ DWORD nAvgBytesPerSec;
+ WORD nBlockAlign;
+} WAVEFORMAT,*PWAVEFORMAT,*LPWAVEFORMAT;
+typedef struct pcmwaveformat_tag {
+ WAVEFORMAT wf;
+ WORD wBitsPerSample;
+} PCMWAVEFORMAT, *PPCMWAVEFORMAT,*LPPCMWAVEFORMAT;
+#ifndef _WAVEFORMATEX_
+#define _WAVEFORMATEX_
+typedef struct tWAVEFORMATEX {
+ WORD wFormatTag;
+ WORD nChannels;
+ DWORD nSamplesPerSec;
+ DWORD nAvgBytesPerSec;
+ WORD nBlockAlign;
+ WORD wBitsPerSample;
+ WORD cbSize;
+} WAVEFORMATEX,*PWAVEFORMATEX,*LPWAVEFORMATEX;
+typedef const WAVEFORMATEX *LPCWAVEFORMATEX;
+#endif
+DECLARE_HANDLE(HMIDI);
+DECLARE_HANDLE(HMIDIIN);
+DECLARE_HANDLE(HMIDIOUT);
+DECLARE_HANDLE(HMIDISTRM);
+typedef HMIDI *LPHMIDI;
+typedef HMIDIIN *LPHMIDIIN;
+typedef HMIDIOUT *LPHMIDIOUT;
+typedef HMIDISTRM *LPHMIDISTRM;
+typedef DRVCALLBACK MIDICALLBACK;
+typedef MIDICALLBACK *LPMIDICALLBACK;
+typedef WORD PATCHARRAY[MIDIPATCHSIZE];
+typedef WORD *LPPATCHARRAY;
+typedef WORD KEYARRAY[MIDIPATCHSIZE];
+typedef WORD *LPKEYARRAY;
+typedef struct tagMIDIOUTCAPSA {
+ WORD wMid;
+ WORD wPid;
+ MMVERSION vDriverVersion;
+ CHAR szPname[MAXPNAMELEN];
+ WORD wTechnology;
+ WORD wVoices;
+ WORD wNotes;
+ WORD wChannelMask;
+ DWORD dwSupport;
+} MIDIOUTCAPSA,*PMIDIOUTCAPSA,*LPMIDIOUTCAPSA;
+typedef struct tagMIDIOUTCAPSW {
+ WORD wMid;
+ WORD wPid;
+ MMVERSION vDriverVersion;
+ WCHAR szPname[MAXPNAMELEN];
+ WORD wTechnology;
+ WORD wVoices;
+ WORD wNotes;
+ WORD wChannelMask;
+ DWORD dwSupport;
+} MIDIOUTCAPSW,*PMIDIOUTCAPSW,*LPMIDIOUTCAPSW;
+typedef struct tagMIDIINCAPSA {
+ WORD wMid;
+ WORD wPid;
+ MMVERSION vDriverVersion;
+ CHAR szPname[MAXPNAMELEN];
+ DWORD dwSupport;
+} MIDIINCAPSA,*PMIDIINCAPSA,*LPMIDIINCAPSA;
+typedef struct tagMIDIINCAPSW {
+ WORD wMid;
+ WORD wPid;
+ MMVERSION vDriverVersion;
+ WCHAR szPname[MAXPNAMELEN];
+ DWORD dwSupport;
+} MIDIINCAPSW,*PMIDIINCAPSW,*NPMIDIINCAPSW,*LPMIDIINCAPSW;
+typedef struct midihdr_tag {
+ LPSTR lpData;
+ DWORD dwBufferLength;
+ DWORD dwBytesRecorded;
+ DWORD dwUser;
+ DWORD dwFlags;
+ struct midihdr_tag *lpNext;
+ DWORD reserved;
+ DWORD dwOffset;
+ DWORD dwReserved[8];
+} MIDIHDR,*PMIDIHDR,*LPMIDIHDR;
+typedef struct midievent_tag {
+ DWORD dwDeltaTime;
+ DWORD dwStreamID;
+ DWORD dwEvent;
+ DWORD dwParms[1];
+} MIDIEVENT;
+typedef struct midistrmbuffver_tag {
+ DWORD dwVersion;
+ DWORD dwMid;
+ DWORD dwOEMVersion;
+} MIDISTRMBUFFVER;
+typedef struct midiproptimediv_tag {
+ DWORD cbStruct;
+ DWORD dwTimeDiv;
+} MIDIPROPTIMEDIV,*LPMIDIPROPTIMEDIV;
+typedef struct midiproptempo_tag {
+ DWORD cbStruct;
+ DWORD dwTempo;
+} MIDIPROPTEMPO,*LPMIDIPROPTEMPO;
+typedef struct tagAUXCAPSA {
+ WORD wMid;
+ WORD wPid;
+ MMVERSION vDriverVersion;
+ CHAR szPname[MAXPNAMELEN];
+ WORD wTechnology;
+ WORD wReserved1;
+ DWORD dwSupport;
+} AUXCAPSA,*PAUXCAPSA,*LPAUXCAPSA;
+typedef struct tagAUXCAPSW {
+ WORD wMid;
+ WORD wPid;
+ MMVERSION vDriverVersion;
+ WCHAR szPname[MAXPNAMELEN];
+ WORD wTechnology;
+ WORD wReserved1;
+ DWORD dwSupport;
+} AUXCAPSW,*PAUXCAPSW,*LPAUXCAPSW;
+DECLARE_HANDLE(HMIXEROBJ);
+typedef HMIXEROBJ *LPHMIXEROBJ;
+DECLARE_HANDLE(HMIXER);
+typedef HMIXER *LPHMIXER;
+typedef struct tagMIXERCAPSA {
+ WORD wMid;
+ WORD wPid;
+ MMVERSION vDriverVersion;
+ CHAR szPname[MAXPNAMELEN];
+ DWORD fdwSupport;
+ DWORD cDestinations;
+} MIXERCAPSA,*PMIXERCAPSA,*LPMIXERCAPSA;
+typedef struct tagMIXERCAPSW {
+ WORD wMid;
+ WORD wPid;
+ MMVERSION vDriverVersion;
+ WCHAR szPname[MAXPNAMELEN];
+ DWORD fdwSupport;
+ DWORD cDestinations;
+} MIXERCAPSW,*PMIXERCAPSW,*LPMIXERCAPSW;
+typedef struct tagMIXERLINEA {
+ DWORD cbStruct;
+ DWORD dwDestination;
+ DWORD dwSource;
+ DWORD dwLineID;
+ DWORD fdwLine;
+ DWORD dwUser;
+ DWORD dwComponentType;
+ DWORD cChannels;
+ DWORD cConnections;
+ DWORD cControls;
+ CHAR szShortName[MIXER_SHORT_NAME_CHARS];
+ CHAR szName[MIXER_LONG_NAME_CHARS];
+ struct {
+ DWORD dwType;
+ DWORD dwDeviceID;
+ WORD wMid;
+ WORD wPid;
+ MMVERSION vDriverVersion;
+ CHAR szPname[MAXPNAMELEN];
+ } Target;
+} MIXERLINEA,*PMIXERLINEA,*LPMIXERLINEA;
+typedef struct tagMIXERLINEW {
+ DWORD cbStruct;
+ DWORD dwDestination;
+ DWORD dwSource;
+ DWORD dwLineID;
+ DWORD fdwLine;
+ DWORD dwUser;
+ DWORD dwComponentType;
+ DWORD cChannels;
+ DWORD cConnections;
+ DWORD cControls;
+ WCHAR szShortName[MIXER_SHORT_NAME_CHARS];
+ WCHAR szName[MIXER_LONG_NAME_CHARS];
+ struct {
+ DWORD dwType;
+ DWORD dwDeviceID;
+ WORD wMid;
+ WORD wPid;
+ MMVERSION vDriverVersion;
+ WCHAR szPname[MAXPNAMELEN];
+ } Target;
+} MIXERLINEW,*PMIXERLINEW,*LPMIXERLINEW;
+typedef struct tagMIXERCONTROLA {
+ DWORD cbStruct;
+ DWORD dwControlID;
+ DWORD dwControlType;
+ DWORD fdwControl;
+ DWORD cMultipleItems;
+ CHAR szShortName[MIXER_SHORT_NAME_CHARS];
+ CHAR szName[MIXER_LONG_NAME_CHARS];
+ union {
+ struct {
+ LONG lMinimum;
+ LONG lMaximum;
+ }_STRUCT_NAME(s);
+ struct {
+ DWORD dwMinimum;
+ DWORD dwMaximum;
+ }_STRUCT_NAME(s1);
+ DWORD dwReserved[6];
+ } Bounds;
+ union {
+ DWORD cSteps;
+ DWORD cbCustomData;
+ DWORD dwReserved[6];
+ } Metrics;
+} MIXERCONTROLA,*PMIXERCONTROLA,*LPMIXERCONTROLA;
+typedef struct tagMIXERCONTROLW {
+ DWORD cbStruct;
+ DWORD dwControlID;
+ DWORD dwControlType;
+ DWORD fdwControl;
+ DWORD cMultipleItems;
+ WCHAR szShortName[MIXER_SHORT_NAME_CHARS];
+ WCHAR szName[MIXER_LONG_NAME_CHARS];
+ union {
+ struct {
+ LONG lMinimum;
+ LONG lMaximum;
+ }_STRUCT_NAME(s);
+ struct {
+ DWORD dwMinimum;
+ DWORD dwMaximum;
+ }_STRUCT_NAME(s1);
+ DWORD dwReserved[6];
+ } Bounds;
+ union {
+ DWORD cSteps;
+ DWORD cbCustomData;
+ DWORD dwReserved[6];
+ } Metrics;
+} MIXERCONTROLW,*PMIXERCONTROLW,*LPMIXERCONTROLW;
+typedef struct tagMIXERLINECONTROLSA {
+ DWORD cbStruct;
+ DWORD dwLineID;
+ union {
+ DWORD dwControlID;
+ DWORD dwControlType;
+ } DUMMYUNIONNAME;
+ DWORD cControls;
+ DWORD cbmxctrl;
+ LPMIXERCONTROLA pamxctrl;
+} MIXERLINECONTROLSA,*PMIXERLINECONTROLSA,*LPMIXERLINECONTROLSA;
+typedef struct tagMIXERLINECONTROLSW {
+ DWORD cbStruct;
+ DWORD dwLineID;
+ union {
+ DWORD dwControlID;
+ DWORD dwControlType;
+ } DUMMYUNIONNAME;
+ DWORD cControls;
+ DWORD cbmxctrl;
+ LPMIXERCONTROLW pamxctrl;
+} MIXERLINECONTROLSW,*PMIXERLINECONTROLSW,*LPMIXERLINECONTROLSW;
+typedef struct tMIXERCONTROLDETAILS {
+ DWORD cbStruct;
+ DWORD dwControlID;
+ DWORD cChannels;
+ union {
+ HWND hwndOwner;
+ DWORD cMultipleItems;
+ } DUMMYUNIONNAME;
+ DWORD cbDetails;
+ PVOID paDetails;
+} MIXERCONTROLDETAILS,*PMIXERCONTROLDETAILS,*LPMIXERCONTROLDETAILS;
+typedef struct tagMIXERCONTROLDETAILS_LISTTEXTA {
+ DWORD dwParam1;
+ DWORD dwParam2;
+ CHAR szName[MIXER_LONG_NAME_CHARS];
+} MIXERCONTROLDETAILS_LISTTEXTA,*PMIXERCONTROLDETAILS_LISTTEXTA,*LPMIXERCONTROLDETAILS_LISTTEXTA;
+typedef struct tagMIXERCONTROLDETAILS_LISTTEXTW {
+ DWORD dwParam1;
+ DWORD dwParam2;
+ WCHAR szName[MIXER_LONG_NAME_CHARS];
+} MIXERCONTROLDETAILS_LISTTEXTW,*PMIXERCONTROLDETAILS_LISTTEXTW,*LPMIXERCONTROLDETAILS_LISTTEXTW;
+typedef struct tMIXERCONTROLDETAILS_BOOLEAN {
+ LONG fValue;
+} MIXERCONTROLDETAILS_BOOLEAN,*PMIXERCONTROLDETAILS_BOOLEAN,*LPMIXERCONTROLDETAILS_BOOLEAN;
+typedef struct tMIXERCONTROLDETAILS_SIGNED {
+ LONG lValue;
+} MIXERCONTROLDETAILS_SIGNED,*PMIXERCONTROLDETAILS_SIGNED,*LPMIXERCONTROLDETAILS_SIGNED;
+typedef struct tMIXERCONTROLDETAILS_UNSIGNED {
+ DWORD dwValue;
+} MIXERCONTROLDETAILS_UNSIGNED,*PMIXERCONTROLDETAILS_UNSIGNED,*LPMIXERCONTROLDETAILS_UNSIGNED;
+typedef void(CALLBACK TIMECALLBACK)(UINT,UINT,DWORD,DWORD,DWORD);
+typedef TIMECALLBACK *LPTIMECALLBACK;
+typedef struct timecaps_tag {
+ UINT wPeriodMin;
+ UINT wPeriodMax;
+} TIMECAPS,*PTIMECAPS,*LPTIMECAPS;
+typedef struct tagJOYCAPSA {
+ WORD wMid;
+ WORD wPid;
+ CHAR szPname[MAXPNAMELEN];
+ UINT wXmin;
+ UINT wXmax;
+ UINT wYmin;
+ UINT wYmax;
+ UINT wZmin;
+ UINT wZmax;
+ UINT wNumButtons;
+ UINT wPeriodMin;
+ UINT wPeriodMax;
+ UINT wRmin;
+ UINT wRmax;
+ UINT wUmin;
+ UINT wUmax;
+ UINT wVmin;
+ UINT wVmax;
+ UINT wCaps;
+ UINT wMaxAxes;
+ UINT wNumAxes;
+ UINT wMaxButtons;
+ CHAR szRegKey[MAXPNAMELEN];
+ CHAR szOEMVxD[MAX_JOYSTICKOEMVXDNAME];
+} JOYCAPSA,*PJOYCAPSA,*LPJOYCAPSA;
+typedef struct tagJOYCAPSW {
+ WORD wMid;
+ WORD wPid;
+ WCHAR szPname[MAXPNAMELEN];
+ UINT wXmin;
+ UINT wXmax;
+ UINT wYmin;
+ UINT wYmax;
+ UINT wZmin;
+ UINT wZmax;
+ UINT wNumButtons;
+ UINT wPeriodMin;
+ UINT wPeriodMax;
+ UINT wRmin;
+ UINT wRmax;
+ UINT wUmin;
+ UINT wUmax;
+ UINT wVmin;
+ UINT wVmax;
+ UINT wCaps;
+ UINT wMaxAxes;
+ UINT wNumAxes;
+ UINT wMaxButtons;
+ WCHAR szRegKey[MAXPNAMELEN];
+ WCHAR szOEMVxD[MAX_JOYSTICKOEMVXDNAME];
+} JOYCAPSW,*PJOYCAPSW,*LPJOYCAPSW;
+typedef struct joyinfo_tag {
+ UINT wXpos;
+ UINT wYpos;
+ UINT wZpos;
+ UINT wButtons;
+} JOYINFO,*PJOYINFO,*LPJOYINFO;
+typedef struct joyinfoex_tag {
+ DWORD dwSize;
+ DWORD dwFlags;
+ DWORD dwXpos;
+ DWORD dwYpos;
+ DWORD dwZpos;
+ DWORD dwRpos;
+ DWORD dwUpos;
+ DWORD dwVpos;
+ DWORD dwButtons;
+ DWORD dwButtonNumber;
+ DWORD dwPOV;
+ DWORD dwReserved1;
+ DWORD dwReserved2;
+} JOYINFOEX,*PJOYINFOEX,*LPJOYINFOEX;
+typedef DWORD FOURCC;
+typedef char *HPSTR;
+DECLARE_HANDLE(HMMIO);
+typedef LRESULT (CALLBACK MMIOPROC)(LPSTR,UINT,LPARAM,LPARAM);
+typedef MMIOPROC *LPMMIOPROC;
+typedef struct _MMIOINFO {
+ DWORD dwFlags;
+ FOURCC fccIOProc;
+ LPMMIOPROC pIOProc;
+ UINT wErrorRet;
+ HTASK htask;
+ LONG cchBuffer;
+ HPSTR pchBuffer;
+ HPSTR pchNext;
+ HPSTR pchEndRead;
+ HPSTR pchEndWrite;
+ LONG lBufOffset;
+ LONG lDiskOffset;
+ DWORD adwInfo[3];
+ DWORD dwReserved1;
+ DWORD dwReserved2;
+ HMMIO hmmio;
+} MMIOINFO,*PMMIOINFO,*LPMMIOINFO;
+typedef const MMIOINFO *LPCMMIOINFO;
+typedef struct _MMCKINFO {
+ FOURCC ckid;
+ DWORD cksize;
+ FOURCC fccType;
+ DWORD dwDataOffset;
+ DWORD dwFlags;
+} MMCKINFO,*PMMCKINFO,*LPMMCKINFO;
+typedef const MMCKINFO *LPCMMCKINFO;
+typedef struct tagMCI_GENERIC_PARMS {
+ DWORD dwCallback;
+} MCI_GENERIC_PARMS,*PMCI_GENERIC_PARMS,*LPMCI_GENERIC_PARMS;
+typedef struct tagMCI_OPEN_PARMSA {
+ DWORD dwCallback;
+ MCIDEVICEID wDeviceID;
+ LPCSTR lpstrDeviceType;
+ LPCSTR lpstrElementName;
+ LPCSTR lpstrAlias;
+} MCI_OPEN_PARMSA,*PMCI_OPEN_PARMSA,*LPMCI_OPEN_PARMSA;
+typedef struct tagMCI_OPEN_PARMSW {
+ DWORD dwCallback;
+ MCIDEVICEID wDeviceID;
+ LPCWSTR lpstrDeviceType;
+ LPCWSTR lpstrElementName;
+ LPCWSTR lpstrAlias;
+} MCI_OPEN_PARMSW,*PMCI_OPEN_PARMSW,*LPMCI_OPEN_PARMSW;
+typedef struct tagMCI_PLAY_PARMS {
+ DWORD dwCallback;
+ DWORD dwFrom;
+ DWORD dwTo;
+} MCI_PLAY_PARMS,*PMCI_PLAY_PARMS,*LPMCI_PLAY_PARMS;
+typedef struct tagMCI_SEEK_PARMS {
+ DWORD dwCallback;
+ DWORD dwTo;
+} MCI_SEEK_PARMS, *PMCI_SEEK_PARMS,*LPMCI_SEEK_PARMS;
+typedef struct tagMCI_STATUS_PARMS {
+ DWORD dwCallback;
+ DWORD dwReturn;
+ DWORD dwItem;
+ DWORD dwTrack;
+} MCI_STATUS_PARMS,*PMCI_STATUS_PARMS,*LPMCI_STATUS_PARMS;
+typedef struct tagMCI_INFO_PARMSA {
+ DWORD dwCallback;
+ LPSTR lpstrReturn;
+ DWORD dwRetSize;
+} MCI_INFO_PARMSA,*LPMCI_INFO_PARMSA;
+typedef struct tagMCI_INFO_PARMSW {
+ DWORD dwCallback;
+ LPWSTR lpstrReturn;
+ DWORD dwRetSize;
+} MCI_INFO_PARMSW,*LPMCI_INFO_PARMSW;
+typedef struct tagMCI_GETDEVCAPS_PARMS {
+ DWORD dwCallback;
+ DWORD dwReturn;
+ DWORD dwItem;
+} MCI_GETDEVCAPS_PARMS,*PMCI_GETDEVCAPS_PARMS,*LPMCI_GETDEVCAPS_PARMS;
+typedef struct tagMCI_SYSINFO_PARMSA {
+ DWORD dwCallback;
+ LPSTR lpstrReturn;
+ DWORD dwRetSize;
+ DWORD dwNumber;
+ UINT wDeviceType;
+} MCI_SYSINFO_PARMSA,*PMCI_SYSINFO_PARMSA,*LPMCI_SYSINFO_PARMSA;
+typedef struct tagMCI_SYSINFO_PARMSW {
+ DWORD dwCallback;
+ LPWSTR lpstrReturn;
+ DWORD dwRetSize;
+ DWORD dwNumber;
+ UINT wDeviceType;
+} MCI_SYSINFO_PARMSW,*PMCI_SYSINFO_PARMSW,*LPMCI_SYSINFO_PARMSW;
+typedef struct tagMCI_SET_PARMS {
+ DWORD dwCallback;
+ DWORD dwTimeFormat;
+ DWORD dwAudio;
+} MCI_SET_PARMS,*PMCI_SET_PARMS,*LPMCI_SET_PARMS;
+typedef struct tagMCI_BREAK_PARMS {
+ DWORD dwCallback;
+ int nVirtKey;
+ HWND hwndBreak;
+} MCI_BREAK_PARMS,*PMCI_BREAK_PARMS,*LPMCI_BREAK_PARMS;
+typedef struct tagMCI_SAVE_PARMSA {
+ DWORD dwCallback;
+ LPCSTR lpfilename;
+} MCI_SAVE_PARMSA,*PMCI_SAVE_PARMSA,*LPMCI_SAVE_PARMSA;
+typedef struct tagMCI_SAVE_PARMSW {
+ DWORD dwCallback;
+ LPCWSTR lpfilename;
+} MCI_SAVE_PARMSW,*PMCI_SAVE_PARMSW,*LPMCI_SAVE_PARMSW;
+typedef struct tagMCI_LOAD_PARMSA {
+ DWORD dwCallback;
+ LPCSTR lpfilename;
+} MCI_LOAD_PARMSA,*PMCI_LOAD_PARMSA,*LPMCI_LOAD_PARMSA;
+typedef struct tagMCI_LOAD_PARMSW {
+ DWORD dwCallback;
+ LPCWSTR lpfilename;
+} MCI_LOAD_PARMSW,*PMCI_LOAD_PARMSW,*LPMCI_LOAD_PARMSW;
+typedef struct tagMCI_RECORD_PARMS {
+ DWORD dwCallback;
+ DWORD dwFrom;
+ DWORD dwTo;
+} MCI_RECORD_PARMS,*LPMCI_RECORD_PARMS;
+typedef struct tagMCI_VD_PLAY_PARMS {
+ DWORD dwCallback;
+ DWORD dwFrom;
+ DWORD dwTo;
+ DWORD dwSpeed;
+} MCI_VD_PLAY_PARMS,*PMCI_VD_PLAY_PARMS,*LPMCI_VD_PLAY_PARMS;
+typedef struct tagMCI_VD_STEP_PARMS {
+ DWORD dwCallback;
+ DWORD dwFrames;
+} MCI_VD_STEP_PARMS,*PMCI_VD_STEP_PARMS,*LPMCI_VD_STEP_PARMS;
+typedef struct tagMCI_VD_ESCAPE_PARMSA {
+ DWORD dwCallback;
+ LPCSTR lpstrCommand;
+} MCI_VD_ESCAPE_PARMSA,*PMCI_VD_ESCAPE_PARMSA,*LPMCI_VD_ESCAPE_PARMSA;
+typedef struct tagMCI_VD_ESCAPE_PARMSW {
+ DWORD dwCallback;
+ LPCWSTR lpstrCommand;
+} MCI_VD_ESCAPE_PARMSW,*PMCI_VD_ESCAPE_PARMSW,*LPMCI_VD_ESCAPE_PARMSW;
+typedef struct tagMCI_WAVE_OPEN_PARMSA {
+ DWORD dwCallback;
+ MCIDEVICEID wDeviceID;
+ LPCSTR lpstrDeviceType;
+ LPCSTR lpstrElementName;
+ LPCSTR lpstrAlias;
+ DWORD dwBufferSeconds;
+} MCI_WAVE_OPEN_PARMSA,*PMCI_WAVE_OPEN_PARMSA,*LPMCI_WAVE_OPEN_PARMSA;
+typedef struct tagMCI_WAVE_OPEN_PARMSW {
+ DWORD dwCallback;
+ MCIDEVICEID wDeviceID;
+ LPCWSTR lpstrDeviceType;
+ LPCWSTR lpstrElementName;
+ LPCWSTR lpstrAlias;
+ DWORD dwBufferSeconds;
+} MCI_WAVE_OPEN_PARMSW,*PMCI_WAVE_OPEN_PARMSW,*LPMCI_WAVE_OPEN_PARMSW;
+typedef struct tagMCI_WAVE_DELETE_PARMS {
+ DWORD dwCallback;
+ DWORD dwFrom;
+ DWORD dwTo;
+} MCI_WAVE_DELETE_PARMS, *PMCI_WAVE_DELETE_PARMS,*LPMCI_WAVE_DELETE_PARMS;
+typedef struct tagMCI_WAVE_SET_PARMS {
+ DWORD dwCallback;
+ DWORD dwTimeFormat;
+ DWORD dwAudio;
+ UINT wInput;
+ UINT wOutput;
+ WORD wFormatTag;
+ WORD wReserved2;
+ WORD nChannels;
+ WORD wReserved3;
+ DWORD nSamplesPerSec;
+ DWORD nAvgBytesPerSec;
+ WORD nBlockAlign;
+ WORD wReserved4;
+ WORD wBitsPerSample;
+ WORD wReserved5;
+} MCI_WAVE_SET_PARMS,*PMCI_WAVE_SET_PARMS,*LPMCI_WAVE_SET_PARMS;
+
+LRESULT WINAPI CloseDriver(HDRVR,LONG,LONG);
+HDRVR WINAPI OpenDriver(LPCWSTR,LPCWSTR,LONG);
+LRESULT WINAPI SendDriverMessage(HDRVR,UINT,LONG,LONG);
+HMODULE WINAPI DrvGetModuleHandle(HDRVR);
+HMODULE WINAPI GetDriverModuleHandle(HDRVR);
+LRESULT WINAPI DefDriverProc(DWORD,HDRVR,UINT,LPARAM,LPARAM);
+UINT WINAPI mmsystemGetVersion(void);
+#define OutputDebugStr OutputDebugString
+BOOL WINAPI sndPlaySoundA(LPCSTR,UINT);
+BOOL WINAPI sndPlaySoundW(LPCWSTR,UINT);
+BOOL WINAPI PlaySoundA(LPCSTR,HMODULE,DWORD);
+BOOL WINAPI PlaySoundW(LPCWSTR,HMODULE,DWORD);
+UINT WINAPI waveOutGetNumDevs(void);
+MMRESULT WINAPI waveOutGetDevCapsA(UINT,LPWAVEOUTCAPSA,UINT);
+MMRESULT WINAPI waveOutGetDevCapsW(UINT,LPWAVEOUTCAPSW,UINT);
+MMRESULT WINAPI waveOutGetVolume(HWAVEOUT,PDWORD);
+MMRESULT WINAPI waveOutSetVolume(HWAVEOUT,DWORD);
+MMRESULT WINAPI waveOutGetErrorTextA(MMRESULT,LPSTR,UINT);
+MMRESULT WINAPI waveOutGetErrorTextW(MMRESULT,LPWSTR,UINT);
+MMRESULT WINAPI waveOutOpen(LPHWAVEOUT,UINT,LPCWAVEFORMATEX,DWORD,DWORD,DWORD);
+MMRESULT WINAPI waveOutClose(HWAVEOUT);
+MMRESULT WINAPI waveOutPrepareHeader(HWAVEOUT,LPWAVEHDR,UINT);
+MMRESULT WINAPI waveOutUnprepareHeader(HWAVEOUT,LPWAVEHDR,UINT);
+MMRESULT WINAPI waveOutWrite(HWAVEOUT,LPWAVEHDR,UINT);
+MMRESULT WINAPI waveOutPause(HWAVEOUT);
+MMRESULT WINAPI waveOutRestart(HWAVEOUT);
+MMRESULT WINAPI waveOutReset(HWAVEOUT);
+MMRESULT WINAPI waveOutBreakLoop(HWAVEOUT);
+MMRESULT WINAPI waveOutGetPosition(HWAVEOUT,LPMMTIME,UINT);
+MMRESULT WINAPI waveOutGetPitch(HWAVEOUT,PDWORD);
+MMRESULT WINAPI waveOutSetPitch(HWAVEOUT,DWORD);
+MMRESULT WINAPI waveOutGetPlaybackRate(HWAVEOUT,PDWORD);
+MMRESULT WINAPI waveOutSetPlaybackRate(HWAVEOUT,DWORD);
+MMRESULT WINAPI waveOutGetID(HWAVEOUT,LPUINT);
+MMRESULT WINAPI waveOutMessage(HWAVEOUT,UINT,DWORD,DWORD);
+UINT WINAPI waveInGetNumDevs(void);
+MMRESULT WINAPI waveInGetDevCapsA(UINT,LPWAVEINCAPSA,UINT);
+MMRESULT WINAPI waveInGetDevCapsW(UINT,LPWAVEINCAPSW,UINT);
+MMRESULT WINAPI waveInGetErrorTextA(MMRESULT,LPSTR,UINT);
+MMRESULT WINAPI waveInGetErrorTextW(MMRESULT,LPWSTR,UINT);
+MMRESULT WINAPI waveInOpen(LPHWAVEIN,UINT,LPCWAVEFORMATEX,DWORD,DWORD,DWORD);
+MMRESULT WINAPI waveInClose(HWAVEIN);
+MMRESULT WINAPI waveInPrepareHeader(HWAVEIN,LPWAVEHDR,UINT);
+MMRESULT WINAPI waveInUnprepareHeader(HWAVEIN,LPWAVEHDR,UINT);
+MMRESULT WINAPI waveInAddBuffer(HWAVEIN,LPWAVEHDR,UINT);
+MMRESULT WINAPI waveInStart(HWAVEIN);
+MMRESULT WINAPI waveInStop(HWAVEIN);
+MMRESULT WINAPI waveInReset(HWAVEIN);
+MMRESULT WINAPI waveInGetPosition(HWAVEIN,LPMMTIME,UINT);
+MMRESULT WINAPI waveInGetID(HWAVEIN,LPUINT);
+MMRESULT WINAPI waveInMessage(HWAVEIN,UINT,DWORD,DWORD);
+UINT WINAPI midiOutGetNumDevs(void);
+MMRESULT WINAPI midiStreamOpen(LPHMIDISTRM,LPUINT,DWORD,DWORD,DWORD,DWORD);
+MMRESULT WINAPI midiStreamClose(HMIDISTRM);
+MMRESULT WINAPI midiStreamProperty(HMIDISTRM,LPBYTE,DWORD);
+MMRESULT WINAPI midiStreamPosition(HMIDISTRM,LPMMTIME,UINT);
+MMRESULT WINAPI midiStreamOut(HMIDISTRM,LPMIDIHDR,UINT);
+MMRESULT WINAPI midiStreamPause(HMIDISTRM);
+MMRESULT WINAPI midiStreamRestart(HMIDISTRM);
+MMRESULT WINAPI midiStreamStop(HMIDISTRM);
+MMRESULT WINAPI midiConnect(HMIDI,HMIDIOUT,PVOID);
+MMRESULT WINAPI midiDisconnect(HMIDI,HMIDIOUT,PVOID);
+MMRESULT WINAPI midiOutGetDevCapsA(UINT,LPMIDIOUTCAPSA,UINT);
+MMRESULT WINAPI midiOutGetDevCapsW(UINT,LPMIDIOUTCAPSW,UINT);
+MMRESULT WINAPI midiOutGetVolume(HMIDIOUT,PDWORD);
+MMRESULT WINAPI midiOutSetVolume(HMIDIOUT,DWORD);
+MMRESULT WINAPI midiOutGetErrorTextA(MMRESULT,LPSTR,UINT);
+MMRESULT WINAPI midiOutGetErrorTextW(MMRESULT,LPWSTR,UINT);
+MMRESULT WINAPI midiOutOpen(LPHMIDIOUT,UINT,DWORD,DWORD,DWORD);
+MMRESULT WINAPI midiOutClose(HMIDIOUT);
+MMRESULT WINAPI midiOutPrepareHeader(HMIDIOUT,LPMIDIHDR,UINT);
+MMRESULT WINAPI midiOutUnprepareHeader(HMIDIOUT,LPMIDIHDR,UINT);
+MMRESULT WINAPI midiOutShortMsg(HMIDIOUT,DWORD);
+MMRESULT WINAPI midiOutLongMsg(HMIDIOUT,LPMIDIHDR,UINT);
+MMRESULT WINAPI midiOutReset(HMIDIOUT);
+MMRESULT WINAPI midiOutCachePatches(HMIDIOUT,UINT,LPWORD,UINT);
+MMRESULT WINAPI midiOutCacheDrumPatches(HMIDIOUT,UINT,LPWORD,UINT);
+MMRESULT WINAPI midiOutGetID(HMIDIOUT,LPUINT);
+MMRESULT WINAPI midiOutMessage(HMIDIOUT,UINT,DWORD,DWORD);
+UINT WINAPI midiInGetNumDevs(void);
+MMRESULT WINAPI midiInGetDevCapsA(UINT,LPMIDIINCAPSA,UINT);
+MMRESULT WINAPI midiInGetDevCapsW(UINT,LPMIDIINCAPSW,UINT);
+MMRESULT WINAPI midiInGetErrorTextA(MMRESULT,LPSTR,UINT);
+MMRESULT WINAPI midiInGetErrorTextW(MMRESULT,LPWSTR,UINT);
+MMRESULT WINAPI midiInOpen(LPHMIDIIN,UINT,DWORD,DWORD,DWORD);
+MMRESULT WINAPI midiInClose(HMIDIIN);
+MMRESULT WINAPI midiInPrepareHeader(HMIDIIN,LPMIDIHDR,UINT);
+MMRESULT WINAPI midiInUnprepareHeader(HMIDIIN,LPMIDIHDR,UINT);
+MMRESULT WINAPI midiInAddBuffer(HMIDIIN,LPMIDIHDR,UINT);
+MMRESULT WINAPI midiInStart(HMIDIIN);
+MMRESULT WINAPI midiInStop(HMIDIIN);
+MMRESULT WINAPI midiInReset(HMIDIIN);
+MMRESULT WINAPI midiInGetID(HMIDIIN,LPUINT);
+MMRESULT WINAPI midiInMessage(HMIDIIN,UINT,DWORD,DWORD);
+UINT WINAPI auxGetNumDevs(void);
+MMRESULT WINAPI auxGetDevCapsA(UINT,LPAUXCAPSA,UINT);
+MMRESULT WINAPI auxGetDevCapsW(UINT,LPAUXCAPSW,UINT);
+MMRESULT WINAPI auxSetVolume(UINT,DWORD);
+MMRESULT WINAPI auxGetVolume(UINT,PDWORD);
+MMRESULT WINAPI auxOutMessage(UINT,UINT,DWORD,DWORD);
+UINT WINAPI mixerGetNumDevs(void);
+MMRESULT WINAPI mixerGetDevCapsA(UINT,LPMIXERCAPSA,UINT);
+MMRESULT WINAPI mixerGetDevCapsW(UINT,LPMIXERCAPSW,UINT);
+MMRESULT WINAPI mixerOpen(LPHMIXER,UINT,DWORD,DWORD,DWORD);
+MMRESULT WINAPI mixerClose(HMIXER);
+DWORD WINAPI mixerMessage(HMIXER,UINT,DWORD,DWORD);
+MMRESULT WINAPI mixerGetLineInfoA(HMIXEROBJ,LPMIXERLINEA,DWORD);
+MMRESULT WINAPI mixerGetLineInfoW(HMIXEROBJ,LPMIXERLINEW,DWORD);
+MMRESULT WINAPI mixerGetID(HMIXEROBJ,PUINT,DWORD);
+MMRESULT WINAPI mixerGetLineControlsA(HMIXEROBJ,LPMIXERLINECONTROLSA,DWORD);
+MMRESULT WINAPI mixerGetLineControlsW(HMIXEROBJ,LPMIXERLINECONTROLSW,DWORD);
+MMRESULT WINAPI mixerGetControlDetailsA(HMIXEROBJ,LPMIXERCONTROLDETAILS,DWORD);
+MMRESULT WINAPI mixerGetControlDetailsW(HMIXEROBJ,LPMIXERCONTROLDETAILS,DWORD);
+MMRESULT WINAPI mixerSetControlDetails(HMIXEROBJ,LPMIXERCONTROLDETAILS,DWORD);
+MMRESULT WINAPI timeGetSystemTime(LPMMTIME,UINT);
+DWORD WINAPI timeGetTime(void);
+MMRESULT WINAPI timeSetEvent(UINT,UINT,LPTIMECALLBACK,DWORD,UINT);
+MMRESULT WINAPI timeKillEvent(UINT);
+MMRESULT WINAPI timeGetDevCaps(LPTIMECAPS,UINT);
+MMRESULT WINAPI timeBeginPeriod(UINT);
+MMRESULT WINAPI timeEndPeriod(UINT);
+UINT WINAPI joyGetNumDevs(void);
+MMRESULT WINAPI joyGetDevCapsA(UINT,LPJOYCAPSA,UINT);
+MMRESULT WINAPI joyGetDevCapsW(UINT,LPJOYCAPSW,UINT);
+MMRESULT WINAPI joyGetPos(UINT,LPJOYINFO);
+MMRESULT WINAPI joyGetPosEx(UINT,LPJOYINFOEX);
+MMRESULT WINAPI joyGetThreshold(UINT,LPUINT);
+MMRESULT WINAPI joyReleaseCapture(UINT);
+MMRESULT WINAPI joySetCapture(HWND,UINT,UINT,BOOL);
+MMRESULT WINAPI joySetThreshold(UINT,UINT);
+FOURCC WINAPI mmioStringToFOURCCA(LPCSTR,UINT);
+FOURCC WINAPI mmioStringToFOURCCW(LPCWSTR,UINT);
+LPMMIOPROC WINAPI mmioInstallIOProcA(FOURCC,LPMMIOPROC,DWORD);
+LPMMIOPROC WINAPI mmioInstallIOProcW(FOURCC,LPMMIOPROC,DWORD);
+HMMIO WINAPI mmioOpenA(LPSTR,LPMMIOINFO,DWORD);
+HMMIO WINAPI mmioOpenW(LPWSTR,LPMMIOINFO,DWORD);
+MMRESULT WINAPI mmioRenameA(LPCSTR,LPCSTR,LPCMMIOINFO,DWORD);
+MMRESULT WINAPI mmioRenameW(LPCWSTR,LPCWSTR,LPCMMIOINFO,DWORD);
+MMRESULT WINAPI mmioClose(HMMIO,UINT);
+LONG WINAPI mmioRead(HMMIO,HPSTR,LONG);
+LONG WINAPI mmioWrite(HMMIO,LPCSTR,LONG);
+LONG WINAPI mmioSeek(HMMIO,LONG,int);
+MMRESULT WINAPI mmioGetInfo(HMMIO,LPMMIOINFO,UINT);
+MMRESULT WINAPI mmioSetInfo(HMMIO,LPCMMIOINFO,UINT);
+MMRESULT WINAPI mmioSetBuffer(HMMIO,LPSTR,LONG,UINT);
+MMRESULT WINAPI mmioFlush(HMMIO,UINT);
+MMRESULT WINAPI mmioAdvance(HMMIO,LPMMIOINFO,UINT);
+LRESULT WINAPI mmioSendMessage(HMMIO,UINT,LPARAM,LPARAM);
+MMRESULT WINAPI mmioDescend(HMMIO,LPMMCKINFO,const MMCKINFO*,UINT);
+MMRESULT WINAPI mmioAscend(HMMIO,LPMMCKINFO,UINT);
+MMRESULT WINAPI mmioCreateChunk(HMMIO,LPMMCKINFO,UINT);
+MCIERROR WINAPI mciSendCommandA(MCIDEVICEID,UINT,DWORD,DWORD);
+MCIERROR WINAPI mciSendCommandW(MCIDEVICEID,UINT,DWORD,DWORD);
+MCIERROR WINAPI mciSendStringA(LPCSTR,LPSTR,UINT,HWND);
+MCIERROR WINAPI mciSendStringW(LPCWSTR,LPWSTR,UINT,HWND);
+MCIDEVICEID WINAPI mciGetDeviceIDA(LPCSTR);
+MCIDEVICEID WINAPI mciGetDeviceIDW(LPCWSTR);
+MCIDEVICEID WINAPI mciGetDeviceIDFromElementIDA(DWORD,LPCSTR);
+MCIDEVICEID WINAPI mciGetDeviceIDFromElementIDW(DWORD,LPCWSTR);
+BOOL WINAPI mciGetErrorStringA(MCIERROR,LPSTR,UINT);
+BOOL WINAPI mciGetErrorStringW(MCIERROR,LPWSTR,UINT);
+BOOL WINAPI mciSetYieldProc(MCIDEVICEID,YIELDPROC,DWORD);
+HTASK WINAPI mciGetCreatorTask(MCIDEVICEID);
+YIELDPROC WINAPI mciGetYieldProc(MCIDEVICEID,PDWORD);
+
+typedef struct tagMCI_SEQ_SET_PARMS {
+ DWORD dwCallback;
+ DWORD dwTimeFormat;
+ DWORD dwAudio;
+ DWORD dwTempo;
+ DWORD dwPort;
+ DWORD dwSlave;
+ DWORD dwMaster;
+ DWORD dwOffset;
+} MCI_SEQ_SET_PARMS,*PMCI_SEQ_SET_PARMS,*LPMCI_SEQ_SET_PARMS;
+typedef struct tagMCI_ANIM_OPEN_PARMSA {
+ DWORD dwCallback;
+ MCIDEVICEID wDeviceID;
+ LPCSTR lpstrDeviceType;
+ LPCSTR lpstrElementName;
+ LPCSTR lpstrAlias;
+ DWORD dwStyle;
+ HWND hWndParent;
+} MCI_ANIM_OPEN_PARMSA,*PMCI_ANIM_OPEN_PARMSA,*LPMCI_ANIM_OPEN_PARMSA;
+typedef struct tagMCI_ANIM_OPEN_PARMSW {
+ DWORD dwCallback;
+ MCIDEVICEID wDeviceID;
+ LPCWSTR lpstrDeviceType;
+ LPCWSTR lpstrElementName;
+ LPCWSTR lpstrAlias;
+ DWORD dwStyle;
+ HWND hWndParent;
+} MCI_ANIM_OPEN_PARMSW,*PMCI_ANIM_OPEN_PARMSW,*LPMCI_ANIM_OPEN_PARMSW;
+typedef struct tagMCI_ANIM_PLAY_PARMS {
+ DWORD dwCallback;
+ DWORD dwFrom;
+ DWORD dwTo;
+ DWORD dwSpeed;
+} MCI_ANIM_PLAY_PARMS,*PMCI_ANIM_PLAY_PARMS,*LPMCI_ANIM_PLAY_PARMS;
+typedef struct tagMCI_ANIM_STEP_PARMS {
+ DWORD dwCallback;
+ DWORD dwFrames;
+} MCI_ANIM_STEP_PARMS,*PMCI_ANIM_STEP_PARMS,*LPMCI_ANIM_STEP_PARMS;
+typedef struct tagMCI_ANIM_WINDOW_PARMSA {
+ DWORD dwCallback;
+ HWND hWnd;
+ UINT nCmdShow;
+ LPCSTR lpstrText;
+} MCI_ANIM_WINDOW_PARMSA,*PMCI_ANIM_WINDOW_PARMSA,*LPMCI_ANIM_WINDOW_PARMSA;
+typedef struct tagMCI_ANIM_WINDOW_PARMSW {
+ DWORD dwCallback;
+ HWND hWnd;
+ UINT nCmdShow;
+ LPCWSTR lpstrText;
+} MCI_ANIM_WINDOW_PARMSW,*PMCI_ANIM_WINDOW_PARMSW,*LPMCI_ANIM_WINDOW_PARMSW;
+typedef struct tagMCI_ANIM_RECT_PARMS {
+ DWORD dwCallback;
+#ifdef MCI_USE_OFFEXT
+ POINT ptOffset;
+ POINT ptExtent;
+#else
+ RECT rc;
+#endif
+} MCI_ANIM_RECT_PARMS,*PMCI_ANIM_RECT_PARMS,*LPMCI_ANIM_RECT_PARMS;
+typedef struct tagMCI_ANIM_UPDATE_PARMS {
+ DWORD dwCallback;
+ RECT rc;
+ HDC hDC;
+} MCI_ANIM_UPDATE_PARMS,*PMCI_ANIM_UPDATE_PARMS,*LPMCI_ANIM_UPDATE_PARMS;
+typedef struct tagMCI_OVLY_OPEN_PARMSA {
+ DWORD dwCallback;
+ MCIDEVICEID wDeviceID;
+ LPCSTR lpstrDeviceType;
+ LPCSTR lpstrElementName;
+ LPCSTR lpstrAlias;
+ DWORD dwStyle;
+ HWND hWndParent;
+} MCI_OVLY_OPEN_PARMSA,*PMCI_OVLY_OPEN_PARMSA,*LPMCI_OVLY_OPEN_PARMSA;
+typedef struct tagMCI_OVLY_OPEN_PARMSW {
+ DWORD dwCallback;
+ MCIDEVICEID wDeviceID;
+ LPCWSTR lpstrDeviceType;
+ LPCWSTR lpstrElementName;
+ LPCWSTR lpstrAlias;
+ DWORD dwStyle;
+ HWND hWndParent;
+} MCI_OVLY_OPEN_PARMSW,*PMCI_OVLY_OPEN_PARMSW,*LPMCI_OVLY_OPEN_PARMSW;
+typedef struct tagMCI_OVLY_WINDOW_PARMSA {
+ DWORD dwCallback;
+ HWND hWnd;
+ UINT nCmdShow;
+ LPCSTR lpstrText;
+} MCI_OVLY_WINDOW_PARMSA,*PMCI_OVLY_WINDOW_PARMSA,*LPMCI_OVLY_WINDOW_PARMSA;
+typedef struct tagMCI_OVLY_WINDOW_PARMSW {
+ DWORD dwCallback;
+ HWND hWnd;
+ UINT nCmdShow;
+ LPCWSTR lpstrText;
+} MCI_OVLY_WINDOW_PARMSW,*PMCI_OVLY_WINDOW_PARMSW,*LPMCI_OVLY_WINDOW_PARMSW;
+typedef struct tagMCI_OVLY_RECT_PARMS {
+ DWORD dwCallback;
+#ifdef MCI_USE_OFFEXT
+ POINT ptOffset;
+ POINT ptExtent;
+#else
+ RECT rc;
+#endif
+} MCI_OVLY_RECT_PARMS,*PMCI_OVLY_RECT_PARMS,*LPMCI_OVLY_RECT_PARMS;
+typedef struct tagMCI_OVLY_SAVE_PARMSA {
+ DWORD dwCallback;
+ LPCSTR lpfilename;
+ RECT rc;
+} MCI_OVLY_SAVE_PARMSA,*PMCI_OVLY_SAVE_PARMSA,*LPMCI_OVLY_SAVE_PARMSA;
+typedef struct tagMCI_OVLY_SAVE_PARMSW {
+ DWORD dwCallback;
+ LPCWSTR lpfilename;
+ RECT rc;
+} MCI_OVLY_SAVE_PARMSW,*PMCI_OVLY_SAVE_PARMSW,*LPMCI_OVLY_SAVE_PARMSW;
+typedef struct tagMCI_OVLY_LOAD_PARMSA {
+ DWORD dwCallback;
+ LPCSTR lpfilename;
+ RECT rc;
+} MCI_OVLY_LOAD_PARMSA,*PMCI_OVLY_LOAD_PARMSA,*LPMCI_OVLY_LOAD_PARMSA;
+typedef struct tagMCI_OVLY_LOAD_PARMSW {
+ DWORD dwCallback;
+ LPCWSTR lpfilename;
+ RECT rc;
+} MCI_OVLY_LOAD_PARMSW,*PMCI_OVLY_LOAD_PARMSW,*LPMCI_OVLY_LOAD_PARMSW;
+
+#ifdef UNICODE
+typedef WAVEOUTCAPSW WAVEOUTCAPS,*PWAVEOUTCAPS,*LPWAVEOUTCAPS;
+typedef WAVEINCAPSW WAVEINCAPS,*PWAVEINCAPS,*LPWAVEINCAPS;
+typedef MIDIOUTCAPSW MIDIOUTCAPS,*PMIDIOUTCAPS,*LPMIDIOUTCAPS;
+typedef MIDIINCAPSW MIDIINCAPS,*PMIDIINCAPS,*LPMIDIINCAPS;
+typedef AUXCAPSW AUXCAPS,*PAUXCAPS,*LPAUXCAPS;
+typedef MIXERCAPSW MIXERCAPS,*PMIXERCAPS,*LPMIXERCAPS;
+typedef MIXERLINEW MIXERLINE,*PMIXERLINE,*LPMIXERLINE;
+typedef MIXERCONTROLA MIXERCONTROL,*PMIXERCONTROL,*LPMIXERCONTROL;
+typedef MIXERLINECONTROLSW MIXERLINECONTROLS,*PMIXERLINECONTROLS,*LPMIXERLINECONTROLS;
+typedef MIXERCONTROLDETAILS_LISTTEXTW MIXERCONTROLDETAILS_LISTTEXT,*PMIXERCONTROLDETAILS_LISTTEXT,*LPMIXERCONTROLDETAILS_LISTTEXT;
+typedef JOYCAPSW JOYCAPS,*PJOYCAPS,*LPJOYCAPS;
+typedef MCI_OPEN_PARMSW MCI_OPEN_PARMS,*PMCI_OPEN_PARMS,*LPMCI_OPEN_PARMS;
+typedef MCI_INFO_PARMSW MCI_INFO_PARMS,*LPMCI_INFO_PARMS;
+typedef MCI_SYSINFO_PARMSW MCI_SYSINFO_PARMS,*PMCI_SYSINFO_PARMS,*LPMCI_SYSINFO_PARMS;
+typedef MCI_SAVE_PARMSW MCI_SAVE_PARMS,*PMCI_SAVE_PARMS,*LPMCI_SAVE_PARMS;
+typedef MCI_LOAD_PARMSW MCI_LOAD_PARMS,*PMCI_LOAD_PARMS,*LPMCI_LOAD_PARMS;
+typedef MCI_VD_ESCAPE_PARMSW MCI_VD_ESCAPE_PARMS,*PMCI_VD_ESCAPE_PARMS,*LPMCI_VD_ESCAPE_PARMS;
+typedef MCI_WAVE_OPEN_PARMSW MCI_WAVE_OPEN_PARMS,*PMCI_WAVE_OPEN_PARMS,*LPMCI_WAVE_OPEN_PARMS;
+typedef MCI_ANIM_OPEN_PARMSW MCI_ANIM_OPEN_PARMS,*PMCI_ANIM_OPEN_PARMS,*LPMCI_ANIM_OPEN_PARMS;
+typedef MCI_ANIM_WINDOW_PARMSW MCI_ANIM_WINDOW_PARMS,*PMCI_ANIM_WINDOW_PARMS,*LPMCI_ANIM_WINDOW_PARMS;
+typedef MCI_OVLY_OPEN_PARMSW MCI_OVLY_OPEN_PARMS,*PMCI_OVLY_OPEN_PARMS,*LPMCI_OVLY_OPEN_PARMS;
+typedef MCI_OVLY_WINDOW_PARMSW MCI_OVLY_WINDOW_PARMS,*PMCI_OVLY_WINDOW_PARMS,*LPMCI_OVLY_WINDOW_PARMS;
+typedef MCI_OVLY_SAVE_PARMSW MCI_OVLY_SAVE_PARMS,*PMCI_OVLY_SAVE_PARMS,*LPMCI_OVLY_SAVE_PARMS;
+#define sndPlaySound sndPlaySoundW
+#define PlaySound PlaySoundW
+#define waveOutGetDevCaps waveOutGetDevCapsW
+#define waveOutGetErrorText waveOutGetErrorTextW
+#define waveInGetDevCaps waveInGetDevCapsW
+#define waveInGetErrorText waveInGetErrorTextW
+#define midiOutGetDevCaps midiOutGetDevCapsW
+#define midiOutGetErrorText midiOutGetErrorTextW
+#define midiInGetDevCaps midiInGetDevCapsW
+#define midiInGetErrorText midiInGetErrorTextW
+#define auxGetDevCaps auxGetDevCapsW
+#define mixerGetDevCaps mixerGetDevCapsW
+#define mixerGetLineInfo mixerGetLineInfoW
+#define mixerGetLineControls mixerGetLineControlsW
+#define mixerGetControlDetails mixerGetControlDetailsW
+#define joyGetDevCaps joyGetDevCapsW
+#define mmioInstallIOProc mmioInstallIOProcW
+#define mmioStringToFOURCC mmioStringToFOURCCW
+#define mmioOpen mmioOpenW
+#define mmioRename mmioRenameW
+#define mciSendCommand mciSendCommandW
+#define mciSendString mciSendStringW
+#define mciGetDeviceID mciGetDeviceIDW
+#define mciGetDeviceIDFromElementID mciGetDeviceIDFromElementIDW
+#define mciGetErrorString mciGetErrorStringW
+#else
+typedef WAVEOUTCAPSA WAVEOUTCAPS,*PWAVEOUTCAPS,*LPWAVEOUTCAPS;
+typedef WAVEINCAPSA WAVEINCAPS,*PWAVEINCAPS,*LPWAVEINCAPS;
+typedef MIDIOUTCAPSA MIDIOUTCAPS,*PMIDIOUTCAPS,*LPMIDIOUTCAPS;
+typedef MIDIINCAPSA MIDIINCAPS,*PMIDIINCAPS,*LPMIDIINCAPS;
+typedef AUXCAPSA AUXCAPS,*PAUXCAPS,*LPAUXCAPS;
+typedef MIXERCAPSA MIXERCAPS,*PMIXERCAPS,*LPMIXERCAPS;
+typedef MIXERLINEA MIXERLINE,*PMIXERLINE,*LPMIXERLINE;
+typedef MIXERCONTROLA MIXERCONTROL,*PMIXERCONTROL,*LPMIXERCONTROL;
+typedef MIXERLINECONTROLSA MIXERLINECONTROLS,*PMIXERLINECONTROLS,*LPMIXERLINECONTROLS;
+typedef MIXERCONTROLDETAILS_LISTTEXTA MIXERCONTROLDETAILS_LISTTEXT,*PMIXERCONTROLDETAILS_LISTTEXT,*LPMIXERCONTROLDETAILS_LISTTEXT;
+typedef JOYCAPSA JOYCAPS,*PJOYCAPS,*LPJOYCAPS;
+typedef MCI_OPEN_PARMSA MCI_OPEN_PARMS,*PMCI_OPEN_PARMS,*LPMCI_OPEN_PARMS;
+typedef MCI_INFO_PARMSA MCI_INFO_PARMS,*LPMCI_INFO_PARMS;
+typedef MCI_SYSINFO_PARMSA MCI_SYSINFO_PARMS,*PMCI_SYSINFO_PARMS,*LPMCI_SYSINFO_PARMS;
+typedef MCI_SAVE_PARMSA MCI_SAVE_PARMS,*PMCI_SAVE_PARMS,*LPMCI_SAVE_PARMS;
+typedef MCI_LOAD_PARMSA MCI_LOAD_PARMS,*PMCI_LOAD_PARMS,*LPMCI_LOAD_PARMS;
+typedef MCI_VD_ESCAPE_PARMSA MCI_VD_ESCAPE_PARMS,*PMCI_VD_ESCAPE_PARMS,*LPMCI_VD_ESCAPE_PARMS;
+typedef MCI_WAVE_OPEN_PARMSA MCI_WAVE_OPEN_PARMS,*PMCI_WAVE_OPEN_PARMS,*LPMCI_WAVE_OPEN_PARMS;
+typedef MCI_ANIM_OPEN_PARMSA MCI_ANIM_OPEN_PARMS,*PMCI_ANIM_OPEN_PARMS,*LPMCI_ANIM_OPEN_PARMS;
+typedef MCI_ANIM_WINDOW_PARMSA MCI_ANIM_WINDOW_PARMS,*PMCI_ANIM_WINDOW_PARMS,*LPMCI_ANIM_WINDOW_PARMS;
+typedef MCI_OVLY_OPEN_PARMSA MCI_OVLY_OPEN_PARMS,*PMCI_OVLY_OPEN_PARMS,*LPMCI_OVLY_OPEN_PARMS;
+typedef MCI_OVLY_WINDOW_PARMSA MCI_OVLY_WINDOW_PARMS,*PMCI_OVLY_WINDOW_PARMS,*LPMCI_OVLY_WINDOW_PARMS;
+typedef MCI_OVLY_SAVE_PARMSA MCI_OVLY_SAVE_PARMS,*PMCI_OVLY_SAVE_PARMS,*LPMCI_OVLY_SAVE_PARMS;
+#define sndPlaySound sndPlaySoundA
+#define PlaySound PlaySoundA
+#define waveOutGetDevCaps waveOutGetDevCapsA
+#define waveOutGetErrorText waveOutGetErrorTextA
+#define waveInGetDevCaps waveInGetDevCapsA
+#define waveInGetErrorText waveInGetErrorTextA
+#define midiOutGetDevCaps midiOutGetDevCapsA
+#define midiOutGetErrorText midiOutGetErrorTextA
+#define midiInGetDevCaps midiInGetDevCapsA
+#define midiInGetErrorText midiInGetErrorTextA
+#define auxGetDevCaps auxGetDevCapsA
+#define mixerGetDevCaps mixerGetDevCapsA
+#define mixerGetLineInfo mixerGetLineInfoA
+#define mixerGetLineControls mixerGetLineControlsA
+#define mixerGetControlDetails mixerGetControlDetailsA
+#define joyGetDevCaps joyGetDevCapsA
+#define mmioInstallIOProc mmioInstallIOProcA
+#define mmioStringToFOURCC mmioStringToFOURCCA
+#define mmioOpen mmioOpenA
+#define mmioRename mmioRenameA
+#define mciSendCommand mciSendCommandA
+#define mciSendString mciSendStringA
+#define mciGetDeviceID mciGetDeviceIDA
+#define mciGetDeviceIDFromElementID mciGetDeviceIDFromElementIDA
+#define mciGetErrorString mciGetErrorStringA
+#endif
+#ifdef __cplusplus
+}
+#endif
+#pragma pack(pop)
+#endif
diff --git a/winsup/w32api/include/nb30.h b/winsup/w32api/include/nb30.h
new file mode 100644
index 000000000..c12b94355
--- /dev/null
+++ b/winsup/w32api/include/nb30.h
@@ -0,0 +1,182 @@
+#ifndef _NB30_H
+#define _NB30_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+#define NCBNAMSZ 16
+#define MAX_LANA 254
+#define NAME_FLAGS_MASK 0x87
+#define GROUP_NAME 0x80
+#define UNIQUE_NAME 0x00
+#define REGISTERING 0x00
+#define REGISTERED 0x04
+#define DEREGISTERED 0x05
+#define DUPLICATE 0x06
+#define DUPLICATE_DEREG 0x07
+#define LISTEN_OUTSTANDING 0x01
+#define CALL_PENDING 0x02
+#define SESSION_ESTABLISHED 0x03
+#define HANGUP_PENDING 0x04
+#define HANGUP_COMPLETE 0x05
+#define SESSION_ABORTED 0x06
+#define ALL_TRANSPORTS "M\0\0\0"
+#define MS_NBF "MNBF"
+#define NCBCALL 0x10
+#define NCBLISTEN 0x11
+#define NCBHANGUP 0x12
+#define NCBSEND 0x14
+#define NCBRECV 0x15
+#define NCBRECVANY 0x16
+#define NCBCHAINSEND 0x17
+#define NCBDGSEND 0x20
+#define NCBDGRECV 0x21
+#define NCBDGSENDBC 0x22
+#define NCBDGRECVBC 0x23
+#define NCBADDNAME 0x30
+#define NCBDELNAME 0x31
+#define NCBRESET 0x32
+#define NCBASTAT 0x33
+#define NCBSSTAT 0x34
+#define NCBCANCEL 0x35
+#define NCBADDGRNAME 0x36
+#define NCBENUM 0x37
+#define NCBUNLINK 0x70
+#define NCBSENDNA 0x71
+#define NCBCHAINSENDNA 0x72
+#define NCBLANSTALERT 0x73
+#define NCBACTION 0x77
+#define NCBFINDNAME 0x78
+#define NCBTRACE 0x79
+#define ASYNCH 0x80
+#define NRC_GOODRET 0x00
+#define NRC_BUFLEN 0x01
+#define NRC_ILLCMD 0x03
+#define NRC_CMDTMO 0x05
+#define NRC_INCOMP 0x06
+#define NRC_BADDR 0x07
+#define NRC_SNUMOUT 0x08
+#define NRC_NORES 0x09
+#define NRC_SCLOSED 0x0a
+#define NRC_CMDCAN 0x0b
+#define NRC_DUPNAME 0x0d
+#define NRC_NAMTFUL 0x0e
+#define NRC_ACTSES 0x0f
+#define NRC_LOCTFUL 0x11
+#define NRC_REMTFUL 0x12
+#define NRC_ILLNN 0x13
+#define NRC_NOCALL 0x14
+#define NRC_NOWILD 0x15
+#define NRC_INUSE 0x16
+#define NRC_NAMERR 0x17
+#define NRC_SABORT 0x18
+#define NRC_NAMCONF 0x19
+#define NRC_IFBUSY 0x21
+#define NRC_TOOMANY 0x22
+#define NRC_BRIDGE 0x23
+#define NRC_CANOCCR 0x24
+#define NRC_CANCEL 0x26
+#define NRC_DUPENV 0x30
+#define NRC_ENVNOTDEF 0x34
+#define NRC_OSRESNOTAV 0x35
+#define NRC_MAXAPPS 0x36
+#define NRC_NOSAPS 0x37
+#define NRC_NORESOURCES 0x38
+#define NRC_INVADDRESS 0x39
+#define NRC_INVDDID 0x3B
+#define NRC_LOCKFAIL 0x3C
+#define NRC_OPENERR 0x3f
+#define NRC_SYSTEM 0x40
+#define NRC_PENDING 0xff
+#define NCB_POST void CALLBACK
+typedef struct _ACTION_HEADER {
+ ULONG transport_id;
+ USHORT action_code;
+ USHORT reserved;
+} ACTION_HEADER,*PACTION_HEADER;
+typedef struct _ADAPTER_STATUS {
+ UCHAR adapter_address[6];
+ UCHAR rev_major;
+ UCHAR reserved0;
+ UCHAR adapter_type;
+ UCHAR rev_minor;
+ WORD duration;
+ WORD frmr_recv;
+ WORD frmr_xmit;
+ WORD iframe_recv_err;
+ WORD xmit_aborts;
+ DWORD xmit_success;
+ DWORD recv_success;
+ WORD iframe_xmit_err;
+ WORD recv_buff_unavail;
+ WORD t1_timeouts;
+ WORD ti_timeouts;
+ DWORD reserved1;
+ WORD free_ncbs;
+ WORD max_cfg_ncbs;
+ WORD max_ncbs;
+ WORD xmit_buf_unavail;
+ WORD max_dgram_size;
+ WORD pending_sess;
+ WORD max_cfg_sess;
+ WORD max_sess;
+ WORD max_sess_pkt_size;
+ WORD name_count;
+} ADAPTER_STATUS,*PADAPTER_STATUS;
+typedef struct _FIND_NAME_BUFFER {
+ UCHAR length;
+ UCHAR access_control;
+ UCHAR frame_control;
+ UCHAR destination_addr[6];
+ UCHAR source_addr[6];
+ UCHAR routing_info[18];
+} FIND_NAME_BUFFER,*PFIND_NAME_BUFFER;
+typedef struct _FIND_NAME_HEADER {
+ WORD node_count;
+ UCHAR reserved;
+ UCHAR unique_group;
+} FIND_NAME_HEADER,*PFIND_NAME_HEADER;
+typedef struct _LANA_ENUM {
+ UCHAR length;
+ UCHAR lana[MAX_LANA+1];
+} LANA_ENUM,*PLANA_ENUM;
+typedef struct _NAME_BUFFER {
+ UCHAR name[NCBNAMSZ];
+ UCHAR name_num;
+ UCHAR name_flags;
+} NAME_BUFFER,*PNAME_BUFFER;
+typedef struct _NCB {
+ UCHAR ncb_command;
+ UCHAR ncb_retcode;
+ UCHAR ncb_lsn;
+ UCHAR ncb_num;
+ PUCHAR ncb_buffer;
+ WORD ncb_length;
+ UCHAR ncb_callname[NCBNAMSZ];
+ UCHAR ncb_name[NCBNAMSZ];
+ UCHAR ncb_rto;
+ UCHAR ncb_sto;
+ void (CALLBACK *ncb_post)(struct _NCB*);
+ UCHAR ncb_lana_num;
+ UCHAR ncb_cmd_cplt;
+ UCHAR ncb_reserve[10];
+ HANDLE ncb_event;
+} NCB,*PNCB;
+typedef struct _SESSION_BUFFER {
+ UCHAR lsn;
+ UCHAR state;
+ UCHAR local_name[NCBNAMSZ];
+ UCHAR remote_name[NCBNAMSZ];
+ UCHAR rcvs_outstanding;
+ UCHAR sends_outstanding;
+} SESSION_BUFFER,*PSESSION_BUFFER;
+typedef struct _SESSION_HEADER {
+ UCHAR sess_name;
+ UCHAR num_sess;
+ UCHAR rcv_dg_outstanding;
+ UCHAR rcv_any_outstanding;
+} SESSION_HEADER,*PSESSION_HEADER;
+UCHAR WINAPI Netbios(PNCB);
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/winsup/w32api/include/nddeapi.h b/winsup/w32api/include/nddeapi.h
new file mode 100644
index 000000000..a4dc03bcf
--- /dev/null
+++ b/winsup/w32api/include/nddeapi.h
@@ -0,0 +1,127 @@
+#ifndef _NDDEAPI_H
+#define _NDDEAPI_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+#define CNLEN 15
+#define UNCLEN 17
+#define SEP_CHAR ','
+#define BAR_CHAR "|"
+#define SEP_WCHAR L','
+#define BAR_WCHAR L"|"
+#define NDDE_NO_ERROR 0
+#define NDDE_ACCESS_DENIED 1
+#define NDDE_BUF_TOO_SMALL 2
+#define NDDE_ERROR_MORE_DATA 3
+#define NDDE_INVALID_SERVER 4
+#define NDDE_INVALID_SHARE 5
+#define NDDE_INVALID_PARAMETER 6
+#define NDDE_INVALID_LEVEL 7
+#define NDDE_INVALID_PASSWORD 8
+#define NDDE_INVALID_ITEMNAME 9
+#define NDDE_INVALID_TOPIC 10
+#define NDDE_INTERNAL_ERROR 11
+#define NDDE_OUT_OF_MEMORY 12
+#define NDDE_INVALID_APPNAME 13
+#define NDDE_NOT_IMPLEMENTED 14
+#define NDDE_SHARE_ALREADY_EXIST 15
+#define NDDE_SHARE_NOT_EXIST 16
+#define NDDE_INVALID_FILENAME 17
+#define NDDE_NOT_RUNNING 18
+#define NDDE_INVALID_WINDOW 19
+#define NDDE_INVALID_SESSION 20
+#define NDDE_INVALID_ITEM_LIST 21
+#define NDDE_SHARE_DATA_CORRUPTED 22
+#define NDDE_REGISTRY_ERROR 23
+#define NDDE_CANT_ACCESS_SERVER 24
+#define NDDE_INVALID_SPECIAL_COMMAND 25
+#define NDDE_INVALID_SECURITY_DESC 26
+#define NDDE_TRUST_SHARE_FAIL 27
+#define MAX_NDDESHARENAME 256
+#define MAX_DOMAINNAME 15
+#define MAX_USERNAME 15
+#define MAX_APPNAME 255
+#define MAX_TOPICNAME 255
+#define MAX_ITEMNAME 255
+#define NDDEF_NOPASSWORDPROMPT 0x0001
+#define NDDEF_NOCACHELOOKUP 0x0002
+#define NDDEF_STRIP_NDDE 0x0004
+#define SHARE_TYPE_OLD 0x01
+#define SHARE_TYPE_NEW 0x02
+#define SHARE_TYPE_STATIC 0x04
+#define NDDE_TRUST_SHARE_START 0x80000000L
+#define NDDE_TRUST_SHARE_INIT 0x40000000L
+#define NDDE_TRUST_SHARE_DEL 0x20000000L
+#define NDDE_TRUST_CMD_SHOW 0x10000000L
+#define NDDE_CMD_SHOW_MASK 0x0000FFFFL
+struct NDdeShareInfo_tag {
+ LONG lRevision;
+ LPTSTR lpszShareName;
+ LONG lShareType;
+ LPTSTR lpszAppTopicList;
+ LONG fSharedFlag;
+ LONG fService;
+ LONG fStartAppFlag;
+ LONG nCmdShow;
+ LONG qModifyId[2];
+ LONG cNumItems;
+ LPTSTR lpszItemList;
+} NDDESHAREINFO,*PNDDESHAREINFO;
+
+UINT WINAPI NDdeGetErrorStringA(UINT,LPSTR,DWORD);
+UINT WINAPI NDdeGetErrorStringW(UINT,LPWSTR,DWORD);
+UINT WINAPI NDdeGetShareSecurityA(LPSTR,LPSTR,SECURITY_INFORMATION,PSECURITY_DESCRIPTOR,DWORD,PDWORD);
+UINT WINAPI NDdeGetShareSecurityW(LPWSTR,LPWSTR,SECURITY_INFORMATION,PSECURITY_DESCRIPTOR,DWORD,PDWORD);
+UINT WINAPI NDdeGetTrustedShareA(LPSTR,LPSTR,PDWORD,PDWORD,PDWORD);
+UINT WINAPI NDdeGetTrustedShareW(LPWSTR,LPWSTR,PDWORD,PDWORD,PDWORD);
+BOOL WINAPI NDdeIsValidShareNameA(LPSTR);
+BOOL WINAPI NDdeIsValidShareNameW(LPWSTR);
+BOOL WINAPI NDdeIsValidAppTopicListA(LPSTR);
+BOOL WINAPI NDdeIsValidAppTopicListW(LPWSTR);
+UINT WINAPI NDdeSetShareSecurityA(LPSTR,LPSTR,SECURITY_INFORMATION,PSECURITY_DESCRIPTOR);
+UINT WINAPI NDdeSetShareSecurityW(LPWSTR,LPWSTR,SECURITY_INFORMATION,PSECURITY_DESCRIPTOR);
+UINT WINAPI NDdeSetTrustedShareA(LPSTR,LPSTR,DWORD);
+UINT WINAPI NDdeSetTrustedShareW(LPWSTR,LPWSTR,DWORD);
+UINT WINAPI NDdeShareAddA(LPSTR,UINT,PSECURITY_DESCRIPTOR,PBYTE,DWORD);
+UINT WINAPI NDdeShareAddW(LPWSTR,UINT,PSECURITY_DESCRIPTOR,PBYTE,DWORD);
+UINT WINAPI NDdeShareDelA(LPSTR,LPSTR,UINT);
+UINT WINAPI NDdeShareDelW(LPWSTR,LPWSTR,UINT);
+UINT WINAPI NDdeShareEnumA(LPSTR,UINT,PBYTE,DWORD,PDWORD,PDWORD);
+UINT WINAPI NDdeShareEnumW(LPWSTR,UINT,PBYTE,DWORD,PDWORD,PDWORD);
+UINT WINAPI NDdeShareGetInfoA(LPSTR,LPSTR,UINT,PBYTE,DWORD,PDWORD,PWORD);
+UINT WINAPI NDdeShareGetInfoW(LPWSTR,LPWSTR,UINT,PBYTE,DWORD,PDWORD,PWORD);
+UINT WINAPI NDdeShareSetInfoA(LPSTR,LPSTR,UINT,PBYTE,DWORD,WORD);
+UINT WINAPI NDdeShareSetInfoW(LPWSTR,LPWSTR,UINT,PBYTE,DWORD,WORD);
+UINT WINAPI NDdeTrustedShareEnumA(LPSTR,UINT,PBYTE,DWORD,PDWORD,PDWORD);
+UINT WINAPI NDdeTrustedShareEnumW(LPWSTR,UINT,PBYTE,DWORD,PDWORD,PDWORD);
+#ifdef UNICODE
+#define NDdeShareAdd NDdeShareAddW
+#define NDdeShareDel NDdeShareDelW
+#define NDdeSetShareSecurity NDdeSetShareSecurityW
+#define NDdeGetShareSecurity NDdeGetShareSecurityW
+#define NDdeShareEnum NDdeShareEnumW
+#define NDdeShareGetInfo NDdeShareGetInfoW
+#define NDdeShareSetInfo NDdeShareSetInfoW
+#define NDdeGetErrorString NDdeGetErrorStringW
+#define NDdeSetTrustedShare NDdeSetTrustedShareW
+#define NDdeGetTrustedShare NDdeGetTrustedShareW
+#define NDdeTrustedShareEnum NDdeTrustedShareEnumW
+#else
+#define NDdeShareAdd NDdeShareAddA
+#define NDdeShareDel NDdeShareDelA
+#define NDdeSetShareSecurity NDdeSetShareSecurityA
+#define NDdeGetShareSecurity NDdeGetShareSecurityA
+#define NDdeShareEnum NDdeShareEnumA
+#define NDdeShareGetInfo NDdeShareGetInfoA
+#define NDdeShareSetInfo NDdeShareSetInfoA
+#define NDdeGetErrorString NDdeGetErrorStringA
+#define NDdeIsValidShareName NDdeIsValidShareNameA
+#define NDdeIsValidAppTopicList NDdeIsValidAppTopicListA
+#define NDdeSetTrustedShare NDdeSetTrustedShareA
+#define NDdeGetTrustedShare NDdeGetTrustedShareA
+#define NDdeTrustedShareEnum NDdeTrustedShareEnumA
+#endif
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/winsup/w32api/include/nspapi.h b/winsup/w32api/include/nspapi.h
new file mode 100644
index 000000000..97dde1639
--- /dev/null
+++ b/winsup/w32api/include/nspapi.h
@@ -0,0 +1,19 @@
+#ifndef _NSPAPI_H
+#define _NSPAPI_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+typedef struct _SOCKET_ADDRESS {
+ LPSOCKADDR lpSockaddr;
+ INT iSockaddrLength;
+} SOCKET_ADDRESS,*PSOCKET_ADDRESS,*LPSOCKET_ADDRESS;
+typedef struct _CSADDR_INFO {
+ SOCKET_ADDRESS LocalAddr;
+ SOCKET_ADDRESS RemoteAddr;
+ INT iSocketType;
+ INT iProtocol;
+} CSADDR_INFO,*PCSADDR_INFO,*LPCSADDR_INFO;
+#ifdef __cplusplus
+}
+#endif
+#endif /* _NSPAPI_H */
diff --git a/winsup/w32api/include/oaidl.h b/winsup/w32api/include/oaidl.h
new file mode 100644
index 000000000..cc0e932a5
--- /dev/null
+++ b/winsup/w32api/include/oaidl.h
@@ -0,0 +1,513 @@
+#ifndef _OAIDL_H
+#define _OAIDL_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+#ifdef NONAMELESSUNION
+#define __VARIANT_NAME_1 n1
+#define __VARIANT_NAME_2 n2
+#define __VARIANT_NAME_3 n3
+#define __VARIANT_NAME_4 n4
+#else
+#define __tagVARIANT
+#define __VARIANT_NAME_1
+#define __VARIANT_NAME_2
+#define __VARIANT_NAME_3
+#define __VARIANT_NAME_4
+#endif
+#define DISPID_UNKNOWN (-1)
+#define DISPID_VALUE (0)
+#define DISPID_PROPERTYPUT (-3)
+#define DISPID_NEWENUM (-4)
+#define DISPID_EVALUATE (-5)
+#define DISPID_CONSTRUCTOR (-6)
+#define DISPID_DESTRUCTOR (-7)
+#define DISPID_COLLECT (-8)
+#define FADF_AUTO (1)
+#define FADF_STATIC (2)
+#define FADF_EMBEDDED (4)
+#define FADF_FIXEDSIZE (16)
+#define FADF_BSTR (256)
+#define FADF_UNKNOWN (512)
+#define FADF_DISPATCH (1024)
+#define FADF_VARIANT (2048)
+#define FADF_RESERVED (0xf0e8)
+#define PARAMFLAG_NONE (0)
+#define PARAMFLAG_FIN (1)
+#define PARAMFLAG_FOUT (2)
+#define PARAMFLAG_FLCID (4)
+#define PARAMFLAG_FRETVAL (8)
+#define PARAMFLAG_FOPT (16)
+#define PARAMFLAG_FHASDEFAULT (32)
+#define IDLFLAG_NONE PARAMFLAG_NONE
+#define IDLFLAG_FIN PARAMFLAG_FIN
+#define IDLFLAG_FOUT PARAMFLAG_FOUT
+#define IDLFLAG_FLCID PARAMFLAG_FLCID
+#define IDLFLAG_FRETVAL PARAMFLAG_FRETVAL
+#define IMPLTYPEFLAG_FDEFAULT 1
+#define IMPLTYPEFLAG_FSOURCE 2
+#define IMPLTYPEFLAG_FRESTRICTED 4
+#define IMPLTYPEFLAG_FDEFAULTVTABLE 8
+
+typedef interface ITypeLib *LPTYPELIB;
+typedef interface ICreateTypeInfo *LPCREATETYPEINFO;
+typedef interface ICreateTypeInfo2 *LPCREATETYPEINFO2;
+typedef interface ICreateTypeLib *LPCREATETYPELIB;
+typedef interface ICreateTypeLib2 *LPCREATETYPELIB2;
+typedef interface ITypeComp *LPTYPECOMP;
+typedef interface ITypeInfo *LPTYPEINFO;
+typedef interface IErrorInfo *LPERRORINFO;
+typedef interface IDispatch *LPDISPATCH;
+typedef interface IEnumVARIANT *LPENUMVARIANT;
+typedef interface ICreateErrorInfo *LPCREATEERRORINFO;
+
+extern const IID IID_ITypeLib;
+extern const IID IID_ICreateTypeInfo;
+extern const IID IID_ICreateTypeInfo2;
+extern const IID IID_ICreateTypeLib;
+extern const IID IID_ICreateTypeLib2;
+extern const IID IID_ITypeInfo;
+extern const IID IID_IErrorInfo;
+extern const IID IID_IDispatch;
+extern const IID IID_IEnumVARIANT;
+extern const IID IID_ICreateErrorInfo;
+extern const GUID IID_ISupportErrorInfo;
+
+typedef enum tagSYSKIND {
+ SYS_WIN16,SYS_WIN32,SYS_MAC
+} SYSKIND;
+typedef enum tagLIBFLAGS {
+ LIBFLAG_FRESTRICTED=1,LIBFLAG_FCONTROL=2,LIBFLAG_FHIDDEN=4,
+ LIBFLAG_FHASDISKIMAGE=8
+} LIBFLAGS;
+typedef struct tagTLIBATTR {
+ GUID guid;
+ LCID lcid;
+ SYSKIND syskind;
+ WORD wMajorVerNum;
+ WORD wMinorVerNum;
+ WORD wLibFlags;
+} TLIBATTR,*LPTLIBATTR;
+typedef CY CURRENCY;
+typedef struct tagSAFEARRAYBOUND {
+ ULONG cElements;
+ LONG lLbound;
+}SAFEARRAYBOUND,*LPSAFEARRAYBOUND;
+typedef struct _wireSAFEARR_BSTR
+{
+ ULONG Size;
+ wireBSTR *aBstr;
+}SAFEARR_BSTR;
+typedef struct _wireSAFEARR_UNKNOWN {
+ ULONG Size;
+ IUnknown **apUnknown;
+}SAFEARR_UNKNOWN;
+typedef struct _wireSAFEARR_DISPATCH {
+ ULONG Size;
+ LPDISPATCH *apDispatch;
+}SAFEARR_DISPATCH;
+typedef struct _wireSAFEARR_VARIANT {
+ ULONG Size;
+ struct _wireVARIANT *aVariant;
+}SAFEARR_VARIANT;
+typedef enum tagSF_TYPE {
+ SF_ERROR=VT_ERROR,
+ SF_I1=VT_I1,
+ SF_I2=VT_I2,
+ SF_I4=VT_I4,
+ SF_I8=VT_I8,
+ SF_BSTR=VT_BSTR,
+ SF_UNKNOWN=VT_UNKNOWN,
+ SF_DISPATCH=VT_DISPATCH,
+ SF_VARIANT=VT_VARIANT
+}SF_TYPE;
+typedef struct _wireSAFEARRAY_UNION {
+ ULONG sfType;
+ union {
+ SAFEARR_BSTR BstrStr;
+ SAFEARR_UNKNOWN UnknownStr;
+ SAFEARR_DISPATCH DispatchStr;
+ SAFEARR_VARIANT VariantStr;
+ BYTE_SIZEDARR ByteStr;
+ WORD_SIZEDARR WordStr;
+ DWORD_SIZEDARR LongStr;
+ HYPER_SIZEDARR HyperStr;
+ }u;
+}SAFEARRAYUNION;
+typedef struct _wireSAFEARRAY {
+ USHORT cDims;
+ USHORT fFeatures;
+ ULONG cbElements;
+ ULONG cLocks;
+ SAFEARRAYUNION uArrayStructs;
+ SAFEARRAYBOUND rgsabound[1];
+}*wireSAFEARRAY;
+typedef wireSAFEARRAY *wirePSAFEARRAY;
+typedef struct tagSAFEARRAY {
+ USHORT cDims;
+ USHORT fFeatures;
+ ULONG cbElements;
+ ULONG cLocks;
+ PVOID pvData;
+ SAFEARRAYBOUND rgsabound[1];
+}SAFEARRAY,*LPSAFEARRAY;
+typedef struct tagVARIANT {
+ union {
+ struct __tagVARIANT {
+ VARTYPE vt;
+ WORD wReserved1;
+ WORD wReserved2;
+ WORD wReserved3;
+ union {
+ long lVal;
+ unsigned char bVal;
+ short iVal;
+ float fltVal;
+ double dblVal;
+ VARIANT_BOOL boolVal;
+ SCODE scode;
+ CY cyVal;
+ DATE date;
+ BSTR bstrVal;
+ IUnknown *punkVal;
+ LPDISPATCH pdispVal;
+ SAFEARRAY *parray;
+ unsigned char *pbVal;
+ short *piVal;
+ long *plVal;
+ float *pfltVal;
+ double *pdblVal;
+ VARIANT_BOOL *pboolVal;
+ SCODE *pscode;
+ CY *pcyVal;
+ DATE *pdate;
+ BSTR *pbstrVal;
+ IUnknown **ppunkVal;
+ LPDISPATCH *ppdispVal;
+ SAFEARRAY **pparray;
+ struct tagVARIANT *pvarVal;
+ void *byref;
+ CHAR cVal;
+ USHORT uiVal;
+ ULONG ulVal;
+ INT intVal;
+ UINT uintVal;
+ DECIMAL *pdecVal;
+ CHAR *pcVal;
+ USHORT *puiVal;
+ ULONG *pulVal;
+ INT *pintVal;
+ UINT *puintVal;
+ struct {
+ PVOID pvRecord;
+ struct IRecordInfo *pRecInfo;
+ } __VARIANT_NAME_4;
+ } __VARIANT_NAME_3;
+ } __VARIANT_NAME_2;
+ DECIMAL decVal;
+ } __VARIANT_NAME_1;
+} VARIANT,*LPVARIANT;
+typedef VARIANT VARIANTARG;
+typedef VARIANT *LPVARIANTARG;
+typedef struct _wireVARIANT {
+ DWORD clSize;
+ DWORD rpcReserved;
+ USHORT vt;
+ USHORT wReserved1;
+ USHORT wReserved2;
+ USHORT wReserved3;
+ union {
+ LONG lVal;
+ BYTE bVal;
+ SHORT iVal;
+ FLOAT fltVal;
+ DOUBLE dblVal;
+ VARIANT_BOOL boolVal;
+ SCODE scode;
+ CY cyVal;
+ DATE date;
+ wireBSTR bstrVal;
+ IUnknown *punkVal;
+ LPDISPATCH pdispVal;
+ wireSAFEARRAY parray;
+ BYTE *pbVal;
+ SHORT *piVal;
+ LONG *plVal;
+ FLOAT *pfltVal;
+ DOUBLE *pdblVal;
+ VARIANT_BOOL *pboolVal;
+ SCODE *pscode;
+ CY *pcyVal;
+ DATE *pdate;
+ wireBSTR *pbstrVal;
+ IUnknown **ppunkVal;
+ LPDISPATCH *ppdispVal;
+ wireSAFEARRAY *pparray;
+ struct _wireVARIANT *pvarVal;
+ CHAR cVal;
+ USHORT uiVal;
+ ULONG ulVal;
+ INT intVal;
+ UINT uintVal;
+ DECIMAL decVal;
+ DECIMAL *pdecVal;
+ CHAR *pcVal;
+ USHORT *puiVal;
+ ULONG *pulVal;
+ INT *pintVal;
+ UINT *puintVal;
+ } DUMMYUNIONNAME;
+} wireVARIANT;
+typedef LONG DISPID;
+typedef DISPID MEMBERID;
+typedef DWORD HREFTYPE;
+typedef enum tagTYPEKIND {
+ TKIND_ENUM,TKIND_RECORD,TKIND_MODULE,TKIND_INTERFACE,TKIND_DISPATCH,
+ TKIND_COCLASS,TKIND_ALIAS,TKIND_UNION,TKIND_MAX
+}TYPEKIND;
+typedef struct tagTYPEDESC {
+ union {
+ struct tagTYPEDESC *lptdesc;
+ struct tagARRAYDESC *lpadesc;
+ HREFTYPE hreftype;
+ } DUMMYUNIONNAME;
+ VARTYPE vt;
+}TYPEDESC;
+typedef struct tagARRAYDESC {
+ TYPEDESC tdescElem;
+ USHORT cDims;
+ SAFEARRAYBOUND rgbounds[1];
+}ARRAYDESC;
+typedef struct tagPARAMDESCEX {
+ ULONG cBytes;
+ VARIANTARG varDefaultValue;
+}PARAMDESCEX,*LPPARAMDESCEX;
+typedef struct tagPARAMDESC {
+ LPPARAMDESCEX pparamdescex;
+ USHORT wParamFlags;
+}PARAMDESC,*LPPARAMDESC;
+typedef struct tagIDLDESC {
+ ULONG dwReserved;
+ USHORT wIDLFlags;
+}IDLDESC,*LPIDLDESC;
+typedef struct tagELEMDESC {
+ TYPEDESC tdesc;
+ union {
+ IDLDESC idldesc;
+ PARAMDESC paramdesc;
+ } DUMMYUNIONNAME;
+} ELEMDESC,*LPELEMDESC;
+typedef struct tagTYPEATTR {
+ GUID guid;
+ LCID lcid;
+ DWORD dwReserved;
+ MEMBERID memidConstructor;
+ MEMBERID memidDestructor;
+ LPOLESTR lpstrSchema;
+ ULONG cbSizeInstance;
+ TYPEKIND typekind;
+ WORD cFuncs;
+ WORD cVars;
+ WORD cImplTypes;
+ WORD cbSizeVft;
+ WORD cbAlignment;
+ WORD wTypeFlags;
+ WORD wMajorVerNum;
+ WORD wMinorVerNum;
+ TYPEDESC tdescAlias;
+ IDLDESC idldescType;
+}TYPEATTR,*LPTYPEATTR;
+typedef struct tagDISPPARAMS {
+ VARIANTARG *rgvarg;
+ DISPID *rgdispidNamedArgs;
+ UINT cArgs;
+ UINT cNamedArgs;
+}DISPPARAMS;
+typedef struct tagEXCEPINFO {
+ WORD wCode;
+ WORD wReserved;
+ BSTR bstrSource;
+ BSTR bstrDescription;
+ BSTR bstrHelpFile;
+ DWORD dwHelpContext;
+ PVOID pvReserved;
+ HRESULT(__stdcall * pfnDeferredFillIn)(struct tagEXCEPINFO*);
+ SCODE scode;
+} EXCEPINFO,*LPEXCEPINFO;
+typedef enum tagCALLCONV {
+ CC_FASTCALL,CC_CDECL,CC_MSCPASCAL,CC_PASCAL=CC_MSCPASCAL,
+ CC_MACPASCAL,CC_STDCALL,CC_FPFASTCALL,CC_SYSCALL,CC_MPWCDECL,
+ CC_MPWPASCAL,CC_MAX=CC_MPWPASCAL
+}CALLCONV;
+typedef enum tagFUNCKIND {
+ FUNC_VIRTUAL,FUNC_PUREVIRTUAL,FUNC_NONVIRTUAL,
+ FUNC_STATIC,FUNC_DISPATCH
+}FUNCKIND;
+typedef enum tagINVOKEKIND {
+ INVOKE_FUNC=1,INVOKE_PROPERTYGET,INVOKE_PROPERTYPUT=4,
+ INVOKE_PROPERTYPUTREF=8
+}INVOKEKIND;
+typedef struct tagFUNCDESC {
+ MEMBERID memid;
+ SCODE *lprgscode;
+ ELEMDESC *lprgelemdescParam;
+ FUNCKIND funckind;
+ INVOKEKIND invkind;
+ CALLCONV callconv;
+ SHORT cParams;
+ SHORT cParamsOpt;
+ SHORT oVft;
+ SHORT cScodes;
+ ELEMDESC elemdescFunc;
+ WORD wFuncFlags;
+}FUNCDESC,*LPFUNCDESC;
+typedef enum tagVARKIND {
+ VAR_PERINSTANCE,VAR_STATIC,VAR_CONST,VAR_DISPATCH
+} VARKIND;
+typedef struct tagVARDESC {
+ MEMBERID memid;
+ LPOLESTR lpstrSchema;
+ union {
+ ULONG oInst;
+ VARIANT *lpvarValue;
+ } DUMMYUNIONNAME;
+ ELEMDESC elemdescVar;
+ WORD wVarFlags;
+ VARKIND varkind;
+} VARDESC,*LPVARDESC;
+typedef enum tagTYPEFLAGS {
+ TYPEFLAG_FAPPOBJECT=1,TYPEFLAG_FCANCREATE=2,TYPEFLAG_FLICENSED=4,
+ TYPEFLAG_FPREDECLID=8,TYPEFLAG_FHIDDEN=16,TYPEFLAG_FCONTROL=32,
+ TYPEFLAG_FDUAL=64,TYPEFLAG_FNONEXTENSIBLE=128,
+ TYPEFLAG_FOLEAUTOMATION=256,TYPEFLAG_FRESTRICTED=512,
+ TYPEFLAG_FAGGREGATABLE=1024,TYPEFLAG_FREPLACEABLE=2048,
+ TYPEFLAG_FDISPATCHABLE=4096,TYPEFLAG_FREVERSEBIND=8192
+} TYPEFLAGS;
+typedef enum tagFUNCFLAGS {
+ FUNCFLAG_FRESTRICTED=1,FUNCFLAG_FSOURCE=2,FUNCFLAG_FBINDABLE=4,
+ FUNCFLAG_FREQUESTEDIT=8,FUNCFLAG_FDISPLAYBIND=16,FUNCFLAG_FDEFAULTBIND=32,
+ FUNCFLAG_FHIDDEN=64,FUNCFLAG_FUSESGETLASTERROR=128,FUNCFLAG_FDEFAULTCOLLELEM=256,
+ FUNCFLAG_FUIDEFAULT=512,FUNCFLAG_FNONBROWSABLE=1024,FUNCFLAG_FREPLACEABLE=2048,
+ FUNCFLAG_FIMMEDIATEBIND=4096
+} FUNCFLAGS;
+typedef enum tagVARFLAGS {
+ VARFLAG_FREADONLY=1,VARFLAG_FSOURCE=2,VARFLAG_FBINDABLE=4,VARFLAG_FREQUESTEDIT=8,
+ VARFLAG_FDISPLAYBIND=16,VARFLAG_FDEFAULTBIND=32,VARFLAG_FHIDDEN=64,VARFLAG_FRESTRICTED=128,
+ VARFLAG_FDEFAULTCOLLELEM=256,VARFLAG_FUIDEFAULT=512,VARFLAG_FNONBROWSABLE=1024,
+ VARFLAG_FREPLACEABLE=2048,VARFLAG_FIMMEDIATEBIND=4096
+} VARFLAGS;
+typedef struct tagCLEANLOCALSTORAGE {
+ IUnknown *pInterface;
+ PVOID pStorage;
+ DWORD flags;
+} CLEANLOCALSTORAGE;
+typedef struct tagCUSTDATAITEM {
+ GUID guid;
+ VARIANTARG varValue;
+} CUSTDATAITEM,*LPCUSTDATAITEM;
+typedef struct tagCUSTDATA {
+ DWORD cCustData;
+ LPCUSTDATAITEM prgCustData;
+} CUSTDATA,*LPCUSTDATA;
+
+typedef enum tagDESCKIND {
+ DESCKIND_NONE=0,DESCKIND_FUNCDESC=DESCKIND_NONE+1,
+ DESCKIND_VARDESC=DESCKIND_FUNCDESC+1,DESCKIND_TYPECOMP=DESCKIND_VARDESC+1,
+ DESCKIND_IMPLICITAPPOBJ=DESCKIND_TYPECOMP+1,
+ DESCKIND_MAX=DESCKIND_IMPLICITAPPOBJ+1
+} DESCKIND;
+
+typedef union tagBINDPTR {
+ LPFUNCDESC lpfuncdesc;
+ LPVARDESC lpvardesc;
+ LPTYPECOMP lptcomp;
+} BINDPTR,*LPBINDPTR;
+
+#undef INTERFACE
+#define INTERFACE IDispatch
+DECLARE_INTERFACE_(IDispatch,IUnknown)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(GetTypeInfoCount)(THIS_ UINT*) PURE;
+ STDMETHOD(GetTypeInfo)(THIS_ UINT,LCID,LPTYPEINFO*) PURE;
+ STDMETHOD(GetIDsOfNames)(THIS_ REFIID,LPOLESTR*,UINT,LCID,DISPID*) PURE;
+ STDMETHOD(Invoke)(THIS_ DISPID,REFIID,LCID,WORD,DISPPARAMS*,VARIANT*,EXCEPINFO*,UINT*) PURE;
+};
+
+#undef INTERFACE
+#define INTERFACE IEnumVARIANT
+DECLARE_INTERFACE_(IEnumVARIANT,IUnknown)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(Next)(THIS_ ULONG,VARIANT*,ULONG*) PURE;
+ STDMETHOD(Skip)(THIS_ ULONG) PURE;
+ STDMETHOD(Reset)(THIS) PURE;
+ STDMETHOD(Clone)(THIS_ IEnumVARIANT**) PURE;
+};
+
+#undef INTERFACE
+#define INTERFACE ITypeComp
+DECLARE_INTERFACE_(ITypeComp,IUnknown)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(Bind)(THIS_ LPOLESTR,ULONG,WORD,LPTYPEINFO*,DESCKIND*,LPBINDPTR) PURE;
+ STDMETHOD(BindType)(THIS_ LPOLESTR,ULONG,LPTYPEINFO*,LPTYPECOMP*) PURE;
+};
+
+#undef INTERFACE
+#define INTERFACE ITypeInfo
+DECLARE_INTERFACE_(ITypeInfo,IUnknown)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(GetTypeAttr)(THIS_ LPTYPEATTR*) PURE;
+ STDMETHOD(GetTypeComp)(THIS_ LPTYPECOMP*) PURE;
+ STDMETHOD(GetFuncDesc)(THIS_ UINT,LPFUNCDESC*) PURE;
+ STDMETHOD(GetVarDesc)(THIS_ UINT,LPVARDESC*) PURE;
+ STDMETHOD(GetNames)(THIS_ MEMBERID,BSTR*,UINT,UINT*) PURE;
+ STDMETHOD(GetRefTypeOfImplType)(THIS_ UINT,HREFTYPE*) PURE;
+ STDMETHOD(GetImplTypeFlags)(THIS_ UINT,INT*) PURE;
+ STDMETHOD(GetIDsOfNames)(THIS_ LPOLESTR*,UINT,MEMBERID*) PURE;
+ STDMETHOD(Invoke)(THIS_ PVOID,MEMBERID,WORD,DISPPARAMS*,VARIANT*,EXCEPINFO*,UINT*) PURE;
+ STDMETHOD(GetDocumentation)(THIS_ MEMBERID,BSTR*,BSTR*,DWORD*,BSTR*) PURE;
+ STDMETHOD(GetDllEntry)(THIS_ MEMBERID,INVOKEKIND,BSTR*,BSTR*,WORD*) PURE;
+ STDMETHOD(GetRefTypeInfo)(THIS_ HREFTYPE,LPTYPEINFO*) PURE;
+ STDMETHOD(AddressOfMember)(THIS_ MEMBERID,INVOKEKIND,PVOID*) PURE;
+ STDMETHOD(CreateInstance)(THIS_ LPUNKNOWN,REFIID,PVOID*) PURE;
+ STDMETHOD(GetMops)(THIS_ MEMBERID,BSTR*) PURE;
+ STDMETHOD(GetContainingTypeLib)(THIS_ LPTYPELIB*,UINT*) PURE;
+ STDMETHOD_(void,ReleaseTypeAttr)(THIS_ LPTYPEATTR) PURE;
+ STDMETHOD_(void,ReleaseFuncDesc)(THIS_ LPFUNCDESC) PURE;
+ STDMETHOD_(void,ReleaseVarDesc)(THIS_ LPVARDESC) PURE;
+};
+
+#undef INTERFACE
+#define INTERFACE ITypeLib
+DECLARE_INTERFACE_(ITypeLib,IUnknown)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD_(UINT,GetTypeInfoCount)(THIS) PURE;
+ STDMETHOD(GetTypeInfo)(THIS_ UINT,ITypeInfo**) PURE;
+ STDMETHOD(GetTypeInfoType)(THIS_ UINT,TYPEKIND*) PURE;
+ STDMETHOD(GetTypeInfoOfGuid)(THIS_ REFGUID,ITypeInfo**) PURE;
+ STDMETHOD(GetLibAttr)(THIS_ TLIBATTR**) PURE;
+ STDMETHOD(GetTypeComp)(THIS_ ITypeComp*) PURE;
+ STDMETHOD(GetDocumentation)(THIS_ INT,BSTR*,BSTR*,DWORD*,BSTR*) PURE;
+ STDMETHOD(IsName)(THIS_ LPOLESTR,ULONG,BOOL*) PURE;
+ STDMETHOD(FindName)(THIS_ LPOLESTR,ULONG,ITypeInfo**,MEMBERID*,USHORT*) PURE;
+ STDMETHOD_(void,ReleaseTLibAttr)(THIS_ TLIBATTR*) PURE;
+};
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/winsup/w32api/include/objbase.h b/winsup/w32api/include/objbase.h
new file mode 100644
index 000000000..5e83ad5ae
--- /dev/null
+++ b/winsup/w32api/include/objbase.h
@@ -0,0 +1,151 @@
+#ifndef _OBJBASE_H
+#define _OBJBASE_H
+#include <rpc.h>
+#include <rpcndr.h>
+#include <stdlib.h>
+#pragma pack(push,8)
+#include <basetyps.h>
+
+#define WINOLEAPI STDAPI
+#define WINOLEAPI_(type) STDAPI_(type)
+#define FARSTRUCT
+#define HUGEP
+#define LISet32(li,v) ((li).HighPart=(v)<0?-1:0,(li).LowPart=(v))
+#define ULISet32(li,v) ((li).HighPart=0,(li).LowPart=(v))
+#define CLSCTX_ALL (CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER|CLSCTX_LOCAL_SERVER)
+#define CLSCTX_INPROC (CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER)
+#define CLSCTX_SERVER (CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER|CLSCTX_REMOTE_SERVER)
+#define MARSHALINTERFACE_MIN 500
+#define CWCSTORAGENAME 32
+#define STGM_DIRECT 0
+#define STGM_TRANSACTED 0x10000L
+#define STGM_SIMPLE 0x8000000L
+#define STGM_READ 0
+#define STGM_WRITE 1
+#define STGM_READWRITE 2
+#define STGM_SHARE_DENY_NONE 0x40
+#define STGM_SHARE_DENY_READ 0x30
+#define STGM_SHARE_DENY_WRITE 0x20
+#define STGM_SHARE_EXCLUSIVE 0x10
+#define STGM_PRIORITY 0x40000L
+#define STGM_DELETEONRELEASE 0x4000000
+#define STGM_NOSCRATCH 0x100000
+#define STGM_CREATE 0x1000
+#define STGM_CONVERT 0x20000
+#define STGM_FAILIFTHERE 0
+#define CWCSTORAGENAME 32
+#define ASYNC_MODE_COMPATIBILITY 1
+#define ASYNC_MODE_DEFAULT 0
+#define STGTY_REPEAT 256
+#define STG_TOEND 0xFFFFFFFF
+#define STG_LAYOUT_SEQUENTIAL 0
+#define STG_LAYOUT_INTERLEAVED 1
+typedef enum tagREGCLS {
+ REGCLS_SINGLEUSE = 0,
+ REGCLS_MULTIPLEUSE = 1,
+ REGCLS_MULTI_SEPARATE = 2
+} REGCLS;
+#include <wtypes.h>
+#include <unknwn.h>
+#include <objidl.h>
+
+#ifdef __cplusplus
+inline BOOL IsEqualGUID(REFGUID rguid1, REFGUID rguid2)
+ { return !memcmp(&rguid1, &rguid2, sizeof(GUID)); }
+inline BOOL operator==(const GUID& guidOne, const GUID& guidOther)
+ { return !memcmp(&guidOne,&guidOther,sizeof(GUID)); }
+inline BOOL operator!=(const GUID& g1, const GUID& g2)
+ { return !(g1 == g2); }
+#else
+#define IsEqualGUID(rguid1, rguid2) (!memcmp(rguid1, rguid2, sizeof(GUID)))
+#endif
+#define IsEqualIID(id1,id2) IsEqualGUID(id1,id2)
+#define IsEqualCLSID(id1,id2) IsEqualGUID(id1,id2)
+#include <cguid.h>
+
+typedef enum tagCOINIT {
+ COINIT_APARTMENTTHREADED = 0x2,
+ COINIT_MULTITHREADED = 0x0,
+ COINIT_DISABLE_OLE1DDE = 0x4,
+ COINIT_SPEED_OVER_MEMORY = 0x8,
+} COINIT;
+
+WINOLEAPI_(DWORD) CoBuildVersion(void);
+WINOLEAPI CoInitialize(PVOID);
+WINOLEAPI_(void) CoUninitialize(void);
+WINOLEAPI CoGetMalloc(DWORD,LPMALLOC*);
+WINOLEAPI_(DWORD) CoGetCurrentProcess(void);
+WINOLEAPI CoRegisterMallocSpy(LPMALLOCSPY);
+WINOLEAPI CoRevokeMallocSpy(void);
+WINOLEAPI CoCreateStandardMalloc(DWORD,IMalloc**);
+#if DBG == 1
+WINOLEAPI_(ULONG) DebugCoGetRpcFault(void);
+WINOLEAPI_(void) DebugCoSetRpcFault(ULONG);
+#endif
+WINOLEAPI CoGetClassObject(REFCLSID,DWORD,PVOID,REFIID,PVOID*);
+WINOLEAPI CoRegisterClassObject(REFCLSID,LPUNKNOWN,DWORD,DWORD,PDWORD);
+WINOLEAPI CoRevokeClassObject(DWORD);
+WINOLEAPI CoGetMarshalSizeMax(ULONG*,REFIID,LPUNKNOWN,DWORD,PVOID,DWORD);
+WINOLEAPI CoMarshalInterface(LPSTREAM,REFIID,LPUNKNOWN,DWORD,PVOID,DWORD);
+WINOLEAPI CoUnmarshalInterface(LPSTREAM,REFIID,PVOID*);
+WINOLEAPI CoMarshalHresult(LPSTREAM,HRESULT);
+WINOLEAPI CoUnmarshalHresult(LPSTREAM,HRESULT*);
+WINOLEAPI CoReleaseMarshalData(LPSTREAM);
+WINOLEAPI CoDisconnectObject(LPUNKNOWN,DWORD);
+WINOLEAPI CoLockObjectExternal(LPUNKNOWN,BOOL,BOOL);
+WINOLEAPI CoGetStandardMarshal(REFIID,LPUNKNOWN,DWORD,PVOID,DWORD,LPMARSHAL*);
+WINOLEAPI_(BOOL) CoIsHandlerConnected(LPUNKNOWN);
+WINOLEAPI_(BOOL) CoHasStrongExternalConnections(LPUNKNOWN);
+WINOLEAPI CoMarshalInterThreadInterfaceInStream(REFIID,LPUNKNOWN,LPSTREAM*);
+WINOLEAPI CoGetInterfaceAndReleaseStream(LPSTREAM,REFIID,PVOID*);
+WINOLEAPI CoCreateFreeThreadedMarshaler(LPUNKNOWN,LPUNKNOWN*);
+WINOLEAPI_(HINSTANCE) CoLoadLibrary(LPOLESTR,BOOL);
+WINOLEAPI_(void) CoFreeLibrary(HINSTANCE);
+WINOLEAPI_(void) CoFreeAllLibraries(void);
+WINOLEAPI_(void) CoFreeUnusedLibraries(void);
+WINOLEAPI CoCreateInstance(REFCLSID,LPUNKNOWN,DWORD,REFIID,PVOID*);
+WINOLEAPI StringFromCLSID(REFCLSID,LPOLESTR*);
+WINOLEAPI CLSIDFromString(LPOLESTR,LPCLSID);
+WINOLEAPI StringFromIID(REFIID,LPOLESTR*);
+WINOLEAPI IIDFromString(LPOLESTR,LPIID);
+WINOLEAPI_(BOOL) CoIsOle1Class(REFCLSID);
+WINOLEAPI ProgIDFromCLSID(REFCLSID,LPOLESTR*);
+WINOLEAPI CLSIDFromProgID(LPCOLESTR,LPCLSID);
+WINOLEAPI_(int) StringFromGUID2(REFGUID,LPOLESTR,int);
+WINOLEAPI CoCreateGuid(GUID*);
+WINOLEAPI_(BOOL) CoFileTimeToDosDateTime(FILETIME*,LPWORD,LPWORD);
+WINOLEAPI_(BOOL) CoDosDateTimeToFileTime(WORD,WORD,FILETIME*);
+WINOLEAPI CoFileTimeNow(FILETIME*);
+WINOLEAPI CoRegisterMessageFilter(LPMESSAGEFILTER,LPMESSAGEFILTER*);
+WINOLEAPI CoGetTreatAsClass(REFCLSID,LPCLSID);
+WINOLEAPI CoTreatAsClass(REFCLSID,REFCLSID);
+typedef HRESULT (STDAPICALLTYPE *LPFNGETCLASSOBJECT)(REFCLSID,REFIID,PVOID*);
+typedef HRESULT (STDAPICALLTYPE *LPFNCANUNLOADNOW)(void);
+STDAPI DllGetClassObject(REFCLSID,REFIID,PVOID*);
+STDAPI DllCanUnloadNow(void);
+WINOLEAPI_(PVOID) CoTaskMemAlloc(ULONG);
+WINOLEAPI_(PVOID) CoTaskMemRealloc(PVOID,ULONG);
+WINOLEAPI_(void) CoTaskMemFree(PVOID);
+WINOLEAPI CreateDataAdviseHolder(LPDATAADVISEHOLDER*);
+WINOLEAPI CreateDataCache(LPUNKNOWN,REFCLSID,REFIID,PVOID*);
+WINOLEAPI StgCreateDocfile(const OLECHAR*,DWORD,DWORD,IStorage**);
+WINOLEAPI StgCreateDocfileOnILockBytes(ILockBytes*,DWORD,DWORD,IStorage**);
+WINOLEAPI StgOpenStorage(const OLECHAR*,IStorage*,DWORD,SNB,DWORD,IStorage**);
+WINOLEAPI StgOpenStorageOnILockBytes(ILockBytes*,IStorage*,DWORD,SNB,DWORD,IStorage**);
+WINOLEAPI StgIsStorageFile(const OLECHAR*);
+WINOLEAPI StgIsStorageILockBytes(ILockBytes*);
+WINOLEAPI StgSetTimes(OLECHAR const*,FILETIME const*,FILETIME const*,FILETIME const*);
+WINOLEAPI BindMoniker(LPMONIKER,DWORD,REFIID,PVOID*);
+WINOLEAPI MkParseDisplayName(LPBC,LPCOLESTR,ULONG*,LPMONIKER*);
+WINOLEAPI MonikerRelativePathTo(LPMONIKER,LPMONIKER,LPMONIKER*,BOOL);
+WINOLEAPI MonikerCommonPrefixWith(LPMONIKER,LPMONIKER,LPMONIKER*);
+WINOLEAPI CreateBindCtx(DWORD,LPBC*);
+WINOLEAPI CreateGenericComposite(LPMONIKER,LPMONIKER,LPMONIKER*);
+WINOLEAPI GetClassFile (LPCOLESTR,CLSID*);
+WINOLEAPI CreateFileMoniker(LPCOLESTR,LPMONIKER*);
+WINOLEAPI CreateItemMoniker(LPCOLESTR,LPCOLESTR,LPMONIKER*);
+WINOLEAPI CreateAntiMoniker(LPMONIKER*);
+WINOLEAPI CreatePointerMoniker(LPUNKNOWN,LPMONIKER*);
+WINOLEAPI GetRunningObjectTable(DWORD,LPRUNNINGOBJECTTABLE*);
+#pragma pack(pop)
+#endif
diff --git a/winsup/w32api/include/objfwd.h b/winsup/w32api/include/objfwd.h
new file mode 100644
index 000000000..ce567b6d9
--- /dev/null
+++ b/winsup/w32api/include/objfwd.h
@@ -0,0 +1,51 @@
+#ifndef _OBJFWD_H
+#define _OBJFWD_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+typedef interface IMoniker *LPMONIKER;
+typedef interface IStream *LPSTREAM;
+typedef interface IMarshal *LPMARSHAL;
+typedef interface IMalloc *LPMALLOC;
+typedef interface IMallocSpy *LPMALLOCSPY;
+typedef interface IMessageFilter *LPMESSAGEFILTER;
+typedef interface IPersist *LPPERSIST;
+typedef interface IPersistStream *LPPERSISTSTREAM;
+typedef interface IRunningObjectTable *LPRUNNINGOBJECTTABLE;
+typedef interface IBindCtx *LPBINDCTX,*LPBC;
+typedef interface IAdviseSink *LPADVISESINK;
+typedef interface IAdviseSink2 *LPADVISESINK2;
+typedef interface IDataObject *LPDATAOBJECT;
+typedef interface IDataAdviseHolder *LPDATAADVISEHOLDER;
+typedef interface IEnumMoniker *LPENUMMONIKER;
+typedef interface IEnumFORMATETC *LPENUMFORMATETC;
+typedef interface IEnumSTATDATA *LPENUMSTATDATA;
+typedef interface IEnumSTATSTG *LPENUMSTATSTG;
+typedef interface IEnumSTATPROPSTG LPENUMSTATPROPSTG;
+typedef interface IEnumString *LPENUMSTRING;
+typedef interface IEnumUnknown *LPENUMUNKNOWN;
+typedef interface IStorage *LPSTORAGE;
+typedef interface IPersistStorage *LPPERSISTSTORAGE;
+typedef interface ILockBytes *LPLOCKBYTES;
+typedef interface IStdMarshalInfo *LPSTDMARSHALINFO;
+typedef interface IExternalConnection *LPEXTERNALCONNECTION;
+typedef interface IRunnableObject *LPRUNNABLEOBJECT;
+typedef interface IROTData *LPROTDATA;
+typedef interface IPersistFile *LPPERSISTFILE;
+typedef interface IRootStorage *LPROOTSTORAGE;
+typedef interface IRpcChannelBuffer *LPRPCCHANNELBUFFER;
+typedef interface IRpcProxyBuffer *LPRPCPROXYBUFFER;
+typedef interface IRpcStubBuffer *LPRPCSTUBBUFFER;
+typedef interface IPropertyStorage *LPPROPERTYSTORAGE;
+typedef interface IEnumSTATPROPSETSTG *LPENUMSTATPROPSETSTG;
+typedef interface IPropertySetStorage *LPPROPERTYSETSTORAGE;
+typedef interface IClientSecurity *LPCLIENTSECURITY;
+typedef interface IServerSecurity *LPSERVERSECURITY;
+typedef interface IClassActivator *LPCLASSACTIVATOR;
+typedef interface IFillLockBytes *LPFILLLOCKBYTES;
+typedef interface IProgressNotify *LPPROGRESSNOTIFY;
+typedef interface ILayoutStorage *LPLAYOUTSTORAGE;
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/winsup/w32api/include/objidl.h b/winsup/w32api/include/objidl.h
new file mode 100644
index 000000000..4c8eb07fc
--- /dev/null
+++ b/winsup/w32api/include/objidl.h
@@ -0,0 +1,1660 @@
+#ifndef _OBJIDL_H
+#define _OBJIDL_H
+
+#include <objfwd.h>
+
+typedef struct tagSTATSTG {
+ LPOLESTR pwcsName;
+ DWORD type;
+ ULARGE_INTEGER cbSize;
+ FILETIME mtime;
+ FILETIME ctime;
+ FILETIME atime;
+ DWORD grfMode;
+ DWORD grfLocksSupported;
+ CLSID clsid;
+ DWORD grfStateBits;
+ DWORD reserved;
+} STATSTG;
+typedef enum tagSTGTY {
+ STGTY_STORAGE=1,
+ STGTY_STREAM,
+ STGTY_LOCKBYTES,
+ STGTY_PROPERTY
+} STGTY;
+typedef enum tagSTREAM_SEEK {
+ STREAM_SEEK_SET,
+ STREAM_SEEK_CUR,
+ STREAM_SEEK_END
+} STREAM_SEEK;
+typedef struct tagINTERFACEINFO {
+ LPUNKNOWN pUnk;
+ IID iid;
+ WORD wMethod;
+} INTERFACEINFO,*LPINTERFACEINFO;
+typedef enum tagCALLTYPE {
+ CALLTYPE_TOPLEVEL=1,
+ CALLTYPE_NESTED,
+ CALLTYPE_ASYNC,
+ CALLTYPE_TOPLEVEL_CALLPENDING,
+ CALLTYPE_ASYNC_CALLPENDING
+} CALLTYPE;
+typedef enum tagPENDINGTYPE {
+ PENDINGTYPE_TOPLEVEL=1,
+ PENDINGTYPE_NESTED
+} PENDINGTYPE;
+typedef enum tagPENDINGMSG {
+ PENDINGMSG_CANCELCALL=0,
+ PENDINGMSG_WAITNOPROCESS,
+ PENDINGMSG_WAITDEFPROCESS
+} PENDINGMSG;
+typedef OLECHAR **SNB;
+typedef enum tagDATADIR {
+ DATADIR_GET=1,
+ DATADIR_SET
+} DATADIR;
+typedef WORD CLIPFORMAT,*LPCLIPFORMAT;
+typedef struct tagDVTARGETDEVICE {
+ DWORD tdSize;
+ WORD tdDriverNameOffset;
+ WORD tdDeviceNameOffset;
+ WORD tdPortNameOffset;
+ WORD tdExtDevmodeOffset;
+ BYTE tdData[1];
+} DVTARGETDEVICE;
+typedef struct tagFORMATETC {
+ CLIPFORMAT cfFormat;
+ DVTARGETDEVICE*ptd;
+ DWORD dwAspect;
+ LONG lindex;
+ DWORD tymed;
+} FORMATETC,*LPFORMATETC;
+typedef struct tagRemSTGMEDIUM {
+ DWORD tymed;
+ DWORD dwHandleType;
+ ULONG pData;
+ unsigned long pUnkForRelease;
+ unsigned long cbData;
+ BYTE data[1];
+} RemSTGMEDIUM;
+typedef struct tagHLITEM {
+ ULONG uHLID;
+ LPWSTR pwzFriendlyName;
+} HLITEM;
+typedef struct tagSTATDATA {
+ FORMATETC formatetc;
+ DWORD grfAdvf;
+ struct IAdviseSink *pAdvSink;
+ DWORD dwConnection;
+} STATDATA;
+typedef struct tagSTATPROPSETSTG {
+ FMTID fmtid;
+ CLSID clsid;
+ DWORD grfFlags;
+ FILETIME mtime;
+ FILETIME ctime;
+ FILETIME atime;
+} STATPROPSETSTG;
+typedef enum tagEXTCONN {
+ EXTCONN_STRONG=1,
+ EXTCONN_WEAK=2,
+ EXTCONN_CALLABLE=4
+} EXTCONN;
+typedef struct tagMULTI_QI {
+ const IID *pIID;
+ IUnknown *pItf;
+ HRESULT hr;
+} MULTI_QI;
+typedef struct _AUTH_IDENTITY {
+ USHORT *User;
+ ULONG UserLength;
+ USHORT *Domain;
+ ULONG DomainLength;
+ USHORT *Password;
+ ULONG PasswordLength;
+ ULONG Flags;
+} AUTH_IDENTITY;
+typedef struct _COAUTHINFO{
+ DWORD dwAuthnSvc;
+ DWORD dwAuthzSvc;
+ LPWSTR pwszServerPrincName;
+ DWORD dwAuthnLevel;
+ DWORD dwImpersonationLevel;
+ AUTH_IDENTITY *pAuthIdentityData;
+ DWORD dwCapabilities;
+} COAUTHINFO;
+typedef struct _COSERVERINFO {
+ DWORD dwReserved1;
+ LPWSTR pwszName;
+ COAUTHINFO *pAuthInfo;
+ DWORD dwReserved2;
+} COSERVERINFO;
+typedef struct tagBIND_OPTS {
+ DWORD cbStruct;
+ DWORD grfFlags;
+ DWORD grfMode;
+ DWORD dwTickCountDeadline;
+} BIND_OPTS,*LPBIND_OPTS;
+typedef struct tagBIND_OPTS2 {
+ DWORD cbStruct;
+ DWORD grfFlags;
+ DWORD grfMode;
+ DWORD dwTickCountDeadline;
+ DWORD dwTrackFlags;
+ DWORD dwClassContext;
+ LCID locale;
+ COSERVERINFO *pServerInfo;
+} BIND_OPTS2,*LPBIND_OPTS2;
+typedef enum tagBIND_FLAGS {
+ BIND_MAYBOTHERUSER=1,
+ BIND_JUSTTESTEXISTENCE
+} BIND_FLAGS;
+typedef struct tagSTGMEDIUM {
+ DWORD tymed;
+ union {
+ HBITMAP hBitmap;
+ PVOID hMetaFilePict;
+ HENHMETAFILE hEnhMetaFile;
+ HGLOBAL hGlobal;
+ LPCSTR lpszFileName;
+ LPSTREAM pstm;
+ LPSTORAGE pstg;
+ } DUMMYUNIONNAME;
+ LPUNKNOWN pUnkForRelease;
+} STGMEDIUM,*LPSTGMEDIUM;
+typedef enum tagLOCKTYPE {
+ LOCK_WRITE=1,
+ LOCK_EXCLUSIVE=2,
+ LOCK_ONLYONCE=4
+} LOCKTYPE;
+typedef unsigned long RPCOLEDATAREP;
+typedef struct tagRPCOLEMESSAGE {
+ PVOID reserved1;
+ RPCOLEDATAREP dataRepresentation;
+ PVOID Buffer;
+ ULONG cbBuffer;
+ ULONG iMethod;
+ PVOID reserved2[5];
+ ULONG rpcFlags;
+} RPCOLEMESSAGE;
+typedef enum tagMKSYS {
+ MKSYS_NONE,
+ MKSYS_GENERICCOMPOSITE,
+ MKSYS_FILEMONIKER,
+ MKSYS_ANTIMONIKER,
+ MKSYS_ITEMMONIKER,
+ MKSYS_POINTERMONIKER
+} MKSYS;
+typedef enum tagMKREDUCE {
+ MKRREDUCE_ALL,
+ MKRREDUCE_ONE=196608,
+ MKRREDUCE_TOUSER=131072,
+ MKRREDUCE_THROUGHUSER=65536
+} MKRREDUCE;
+typedef struct tagRemSNB {
+ unsigned long ulCntStr;
+ unsigned long ulCntChar;
+ OLECHAR rgString[1];
+} RemSNB;
+typedef enum tagADVF {
+ ADVF_NODATA=1,ADVF_PRIMEFIRST=2,ADVF_ONLYONCE=4,ADVF_DATAONSTOP=64,
+ ADVFCACHE_NOHANDLER=8,ADVFCACHE_FORCEBUILTIN=16,ADVFCACHE_ONSAVE=32
+} ADVF;
+typedef enum tagTYMED {
+ TYMED_HGLOBAL=1,TYMED_FILE=2,TYMED_ISTREAM=4,TYMED_ISTORAGE=8,
+ TYMED_GDI=16,TYMED_MFPICT=32,TYMED_ENHMF=64,TYMED_NULL=0
+} TYMED;
+typedef enum tagSERVERCALL {
+ SERVERCALL_ISHANDLED,SERVERCALL_REJECTED,SERVERCALL_RETRYLATER
+} SERVERCALL;
+typedef struct tagCAUB {
+ ULONG cElems;
+ unsigned char *pElems;
+}CAUB;
+typedef struct tagCAI {
+ ULONG cElems;
+ short *pElems;
+}CAI;
+typedef struct tagCAUI {
+ ULONG cElems;
+ USHORT *pElems;
+}CAUI;
+typedef struct tagCAL {
+ ULONG cElems;
+ long *pElems;
+}CAL;
+typedef struct tagCAUL {
+ ULONG cElems;
+ ULONG *pElems;
+}CAUL;
+typedef struct tagCAFLT {
+ ULONG cElems;
+ float *pElems;
+}CAFLT;
+typedef struct tagCADBL {
+ ULONG cElems;
+ double *pElems;
+}CADBL;
+typedef struct tagCACY {
+ ULONG cElems;
+ CY *pElems;
+}CACY;
+typedef struct tagCADATE {
+ ULONG cElems;
+ DATE *pElems;
+}CADATE;
+typedef struct tagCABSTR {
+ ULONG cElems;
+ BSTR *pElems;
+}CABSTR;
+typedef struct tagCABSTRBLOB {
+ ULONG cElems;
+ BSTRBLOB *pElems;
+}CABSTRBLOB;
+typedef struct tagCABOOL {
+ ULONG cElems;
+ VARIANT_BOOL *pElems;
+}CABOOL;
+typedef struct tagCASCODE {
+ ULONG cElems;
+ SCODE *pElems;
+}CASCODE;
+typedef struct tagCAH {
+ ULONG cElems;
+ LARGE_INTEGER *pElems;
+}CAH;
+typedef struct tagCAUH {
+ ULONG cElems;
+ ULARGE_INTEGER *pElems;
+}CAUH;
+typedef struct tagCALPSTR {
+ ULONG cElems;
+ LPSTR *pElems;
+}CALPSTR;
+typedef struct tagCALPWSTR {
+ ULONG cElems;
+ LPWSTR *pElems;
+}CALPWSTR;
+typedef struct tagCAFILETIME {
+ ULONG cElems;
+ FILETIME *pElems;
+}CAFILETIME;
+typedef struct tagCACLIPDATA {
+ ULONG cElems;
+ CLIPDATA *pElems;
+}CACLIPDATA;
+typedef struct tagCACLSID {
+ ULONG cElems;
+ CLSID *pElems;
+}CACLSID;
+typedef struct tagPROPVARIANT *LPPROPVARIANT;
+typedef struct tagCAPROPVARIANT {
+ ULONG cElems;
+ LPPROPVARIANT pElems;
+}CAPROPVARIANT;
+typedef struct tagPROPVARIANT {
+ VARTYPE vt;
+ WORD wReserved1;
+ WORD wReserved2;
+ WORD wReserved3;
+ union {
+ UCHAR bVal;
+ short iVal;
+ USHORT uiVal;
+ VARIANT_BOOL boolVal;
+#ifndef __cplusplus
+ _VARIANT_BOOL bool;
+#endif
+ long lVal;
+ ULONG ulVal;
+ float fltVal;
+ SCODE scode;
+ LARGE_INTEGER hVal;
+ ULARGE_INTEGER uhVal;
+ double dblVal;
+ CY cyVal;
+ DATE date;
+ FILETIME filetime;
+ CLSID *puuid;
+ BLOB blob;
+ CLIPDATA *pclipdata;
+ LPSTREAM pStream;
+ LPSTORAGE pStorage;
+ BSTR bstrVal;
+ BSTRBLOB bstrblobVal;
+ LPSTR pszVal;
+ LPWSTR pwszVal;
+ CAUB caub;
+ CAI cai;
+ CAUI caui;
+ CABOOL cabool;
+ CAL cal;
+ CAUL caul;
+ CAFLT caflt;
+ CASCODE cascode;
+ CAH cah;
+ CAUH cauh;
+ CADBL cadbl;
+ CACY cacy;
+ CADATE cadate;
+ CAFILETIME cafiletime;
+ CACLSID cauuid;
+ CACLIPDATA caclipdata;
+ CABSTR cabstr;
+ CABSTRBLOB cabstrblob;
+ CALPSTR calpstr;
+ CALPWSTR calpwstr;
+ CAPROPVARIANT capropvar;
+ } DUMMYUNIONNAME;
+} PROPVARIANT;
+typedef struct tagPROPSPEC {
+ ULONG ulKind;
+ union {
+ PROPID propid;
+ LPOLESTR lpwstr;
+ } DUMMYUNIONNAME;
+}PROPSPEC;
+typedef struct tagSTATPROPSTG {
+ LPOLESTR lpwstrName;
+ PROPID propid;
+ VARTYPE vt;
+} STATPROPSTG;
+typedef enum PROPSETFLAG {
+ PROPSETFLAG_DEFAULT,PROPSETFLAG_NONSIMPLE,PROPSETFLAG_ANSI,
+ PROPSETFLAG_UNBUFFERED=4
+} PROPSETFLAG;
+typedef struct tagSTORAGELAYOUT {
+ DWORD LayoutType;
+ OLECHAR* pwcsElementName;
+ LARGE_INTEGER cOffset;
+ LARGE_INTEGER cBytes;
+} STORAGELAYOUT;
+DECLARE_ENUMERATOR(FORMATETC);
+DECLARE_ENUMERATOR(HLITEM);
+DECLARE_ENUMERATOR(STATDATA);
+DECLARE_ENUMERATOR(STATPROPSETSTG);
+DECLARE_ENUMERATOR(STATPROPSTG);
+DECLARE_ENUMERATOR(STATSTG);
+DECLARE_ENUMERATOR_(IEnumString,LPOLESTR);
+DECLARE_ENUMERATOR_(IEnumMoniker,interface IMoniker);
+DECLARE_ENUMERATOR_(IEnumUnknown,IUnknown*);
+
+EXTERN_C const IID IID_ISequentialStream;
+#undef INTERFACE
+#define INTERFACE ISequentialStream
+DECLARE_INTERFACE_(ISequentialStream,IUnknown)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(Read)(THIS_ void*,ULONG,ULONG*) PURE;
+ STDMETHOD(Write)(THIS_ void const*,ULONG,ULONG*) PURE;
+};
+
+EXTERN_C const IID IID_IStream;
+#undef INTERFACE
+#define INTERFACE IStream
+DECLARE_INTERFACE_(IStream,ISequentialStream)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(Read)(THIS_ void*,ULONG,ULONG*) PURE;
+ STDMETHOD(Write)(THIS_ void const*,ULONG,ULONG*) PURE;
+ STDMETHOD(Seek)(THIS_ LARGE_INTEGER,DWORD,ULARGE_INTEGER*) PURE;
+ STDMETHOD(SetSize)(THIS_ ULARGE_INTEGER) PURE;
+ STDMETHOD(CopyTo)(THIS_ IStream*,ULARGE_INTEGER,ULARGE_INTEGER*,ULARGE_INTEGER*) PURE;
+ STDMETHOD(Commit)(THIS_ DWORD) PURE;
+ STDMETHOD(Revert)(THIS) PURE;
+ STDMETHOD(LockRegion)(THIS_ ULARGE_INTEGER,ULARGE_INTEGER,DWORD) PURE;
+ STDMETHOD(UnlockRegion)(THIS_ ULARGE_INTEGER,ULARGE_INTEGER,DWORD) PURE;
+ STDMETHOD(Stat)(THIS_ STATSTG*,DWORD) PURE;
+ STDMETHOD(Clone)(THIS_ LPSTREAM*) PURE;
+};
+
+EXTERN_C const IID IID_IMarshal;
+#undef INTERFACE
+#define INTERFACE IMarshal
+DECLARE_INTERFACE_(IMarshal,IUnknown)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(GetUnmarshalClass) (THIS_ REFIID,DWORD,PVOID,DWORD,CLSID) PURE;
+ STDMETHOD(GetMarshalSizeMax) (THIS_ REFIID,DWORD,PVOID,DWORD,PDWORD) PURE;
+ STDMETHOD(MarshalInterface) (THIS_ REFIID,DWORD,DWORD) PURE;
+ STDMETHOD(UnmarshalInterface) (THIS_ IStream*,void**) PURE;
+ STDMETHOD(ReleaseMarshalData) (THIS_ IStream*) PURE;
+ STDMETHOD(DisconnectObject) (THIS_ DWORD) PURE;
+};
+
+EXTERN_C const IID IID_IStdMarshalInfo;
+#undef INTERFACE
+#define INTERFACE IStdMarshalInfo
+DECLARE_INTERFACE_(IStdMarshalInfo,IUnknown)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(GetClassForHandler)(THIS_ DWORD,PVOID,CLSID*) PURE;
+};
+
+EXTERN_C const IID IID_IMalloc;
+#undef INTERFACE
+#define INTERFACE IMalloc
+DECLARE_INTERFACE_(IMalloc,IUnknown)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD_(void*,Alloc)(THIS_ ULONG) PURE;
+ STDMETHOD_(void,ReAlloc)(THIS_ void*) PURE;
+ STDMETHOD_(void*,Free)(THIS_ void*) PURE;
+ STDMETHOD_(ULONG,GetSize)(THIS_ void*) PURE;
+ STDMETHOD_(int,DidAlloc)(THIS_ void*) PURE;
+ STDMETHOD_(void,HeapMinimize)(THIS) PURE;
+};
+
+EXTERN_C const IID IID_IMallocSpy;
+#undef INTERFACE
+#define INTERFACE IMallocSpy
+DECLARE_INTERFACE_(IMallocSpy,IUnknown)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD_(ULONG,PreAlloc)(THIS_ ULONG) PURE;
+ STDMETHOD_(void*,PostAlloc)(THIS_ void*) PURE;
+ STDMETHOD_(void*,PreFree)(THIS_ void*,BOOL) PURE;
+ STDMETHOD_(void,PostFree)(THIS_ BOOL) PURE;
+ STDMETHOD_(ULONG,PreRealloc)(THIS_ void*,ULONG,void*) PURE;
+ STDMETHOD_(void*,PostRealloc)(THIS_ void*,BOOL) PURE;
+ STDMETHOD_(void*,PreGetSize)(THIS_ void*,BOOL) PURE;
+ STDMETHOD_(ULONG,PostGetSize)(THIS_ ULONG,BOOL) PURE;
+ STDMETHOD_(void*,PreDidAlloc)(THIS_ void*,BOOL) PURE;
+ STDMETHOD_(int,PostDidAlloc)(THIS_ void*,BOOL,int) PURE;
+ STDMETHOD_(void,PreHeapMinimize)(THIS) PURE;
+ STDMETHOD_(void,PostHeapMinimize)(THIS) PURE;
+};
+
+EXTERN_C const IID IID_IMessageFilter;
+#undef INTERFACE
+#define INTERFACE IMessageFilter
+DECLARE_INTERFACE_(IMessageFilter,IUnknown)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD_(DWORD,HandleInComingCall)(THIS_ DWORD,HTASK,DWORD,LPINTERFACEINFO) PURE;
+ STDMETHOD_(DWORD,RetryRejectedCall)(THIS_ HTASK,DWORD,DWORD) PURE;
+ STDMETHOD_(DWORD,MessagePending)(THIS_ HTASK,DWORD,DWORD) PURE;
+};
+
+EXTERN_C const IID IID_IPersist;
+#undef INTERFACE
+#define INTERFACE IPersist
+DECLARE_INTERFACE_(IPersist,IUnknown)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(GetClassID)(THIS_ LPCLSID) PURE;
+};
+
+EXTERN_C const IID IID_IPersistStream;
+#undef INTERFACE
+#define INTERFACE IPersistStream
+DECLARE_INTERFACE_(IPersistStream,IPersist)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(GetClassID)(THIS_ CLSID*) PURE;
+ STDMETHOD(IsDirty)(THIS) PURE;
+ STDMETHOD(Load)(THIS_ IStream*) PURE;
+ STDMETHOD(Save)(THIS_ IStream*,BOOL) PURE;
+ STDMETHOD(GetSizeMax)(THIS_ PULARGE_INTEGER) PURE;
+};
+
+EXTERN_C const IID IID_IRunningObjectTable;
+#undef INTERFACE
+#define INTERFACE IRunningObjectTable
+DECLARE_INTERFACE_(IRunningObjectTable,IUnknown)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(Register)(THIS_ LPUNKNOWN,LPMONIKER,PDWORD) PURE;
+ STDMETHOD(Revoke)(THIS_ DWORD) PURE;
+ STDMETHOD(IsRunning)(THIS_ LPMONIKER) PURE;
+ STDMETHOD(GetObject)(THIS_ LPMONIKER,LPUNKNOWN*) PURE;
+ STDMETHOD(NoteChangeTime)(THIS_ DWORD,LPFILETIME) PURE;
+ STDMETHOD(GetTimeOfLastChange)(THIS_ LPMONIKER,LPFILETIME) PURE;
+ STDMETHOD(EnumRunning)(THIS_ IEnumMoniker**) PURE;
+};
+
+EXTERN_C const IID IID_IBindCtx;
+#undef INTERFACE
+#define INTERFACE IBindCtx
+DECLARE_INTERFACE_(IBindCtx,IUnknown)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(RegisterObjectBound)(THIS_ LPUNKNOWN) PURE;
+ STDMETHOD(RevokeObjectBound)(THIS_ LPUNKNOWN) PURE;
+ STDMETHOD(ReleaseBoundObjects)(THIS) PURE;
+ STDMETHOD(SetBindOptions)(THIS_ LPBIND_OPTS) PURE;
+ STDMETHOD(GetBindOptions)(THIS_ LPBIND_OPTS) PURE;
+ STDMETHOD(GetRunningObjectTable)(THIS_ IRunningObjectTable**) PURE;
+ STDMETHOD(RegisterObjectParam)(THIS_ LPOLESTR,IUnknown*) PURE;
+ STDMETHOD(GetObjectParam)(THIS_ LPOLESTR,IUnknown**) PURE;
+ STDMETHOD(EnumObjectParam)(THIS_ IEnumString**) PURE;
+ STDMETHOD(RevokeObjectParam)(THIS_ LPOLESTR) PURE;
+};
+
+EXTERN_C const IID IID_IPersistStream;
+#undef INTERFACE
+#define INTERFACE IMoniker
+DECLARE_INTERFACE_(IMoniker,IPersistStream)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(GetClassID)(THIS_ CLSID*) PURE;
+ STDMETHOD(IsDirty)(THIS) PURE;
+ STDMETHOD(Load)(THIS_ IStream*) PURE;
+ STDMETHOD(Save)(THIS_ IStream*,BOOL) PURE;
+ STDMETHOD(GetSizeMax)(THIS_ PULARGE_INTEGER) PURE;
+ STDMETHOD(BindToObject)(THIS_ IBindCtx*,IMoniker*,REFIID,PVOID*) PURE;
+ STDMETHOD(BindToStorage)(THIS_ IBindCtx*,IMoniker*,REFIID,PVOID*) PURE;
+ STDMETHOD(Reduce)(THIS_ IBindCtx*,DWORD,IMoniker**,IMoniker**) PURE;
+ STDMETHOD(ComposeWith)(THIS_ IMoniker*,BOOL,IMoniker**) PURE;
+ STDMETHOD(Enum)(THIS_ BOOL,IEnumMoniker**) PURE;
+ STDMETHOD(IsEqual)(THIS_ IMoniker*) PURE;
+ STDMETHOD(Hash)(THIS_ PDWORD) PURE;
+ STDMETHOD(IsRunning)(THIS_ IBindCtx*,IMoniker*,IMoniker*) PURE;
+ STDMETHOD(GetTimeOfLastChange)(THIS_ IBindCtx*,IMoniker*,LPFILETIME) PURE;
+ STDMETHOD(Inverse)(THIS_ IMoniker**) PURE;
+ STDMETHOD(CommonPrefixWith)(THIS_ IMoniker*,IMoniker**) PURE;
+ STDMETHOD(RelativePathTo)(THIS_ IMoniker*,IMoniker**) PURE;
+ STDMETHOD(GetDisplayName)(THIS_ IBindCtx*,IMoniker*,LPOLESTR*) PURE;
+ STDMETHOD(ParseDisplayName)(THIS_ IBindCtx*,IMoniker*,LPOLESTR,ULONG*,IMoniker**) PURE;
+ STDMETHOD(IsSystemMoniker)(THIS_ PDWORD) PURE;
+};
+
+EXTERN_C const IID IID_IPersistStorage;
+#undef INTERFACE
+#define INTERFACE IPersistStorage
+DECLARE_INTERFACE_(IPersistStorage,IPersist)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(GetClassID)(THIS_ CLSID) PURE;
+ STDMETHOD(IsDirty)(THIS) PURE;
+ STDMETHOD(InitNew)(THIS_ LPSTORAGE) PURE;
+ STDMETHOD(Load)(THIS_ LPSTORAGE) PURE;
+ STDMETHOD(Save)(THIS_ LPSTORAGE,BOOL) PURE;
+ STDMETHOD(SaveCompleted)(THIS_ LPSTORAGE) PURE;
+ STDMETHOD(HandsOffStorage)(THIS) PURE;
+};
+
+EXTERN_C const IID IID_IPersistFile;
+#undef INTERFACE
+#define INTERFACE IPersistFile
+DECLARE_INTERFACE_(IPersistFile,IPersist)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(GetClassID)(THIS_ CLSID) PURE;
+ STDMETHOD(IsDirty)(THIS) PURE;
+ STDMETHOD(Load)(THIS_ LPCOLESTR,DWORD) PURE;
+ STDMETHOD(Save)(THIS_ LPCOLESTR,BOOL) PURE;
+ STDMETHOD(SaveCompleted)(THIS_ LPCOLESTR) PURE;
+ STDMETHOD(GetCurFile)(THIS_ LPOLESTR*) PURE;
+};
+
+EXTERN_C const IID IID_IAdviseSink;
+#undef INTERFACE
+#define INTERFACE IAdviseSink
+DECLARE_INTERFACE_(IAdviseSink,IUnknown)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD_(void,OnDataChange)(THIS_ FORMATETC*,STGMEDIUM*) PURE;
+ STDMETHOD_(void,OnViewChange)(THIS_ DWORD,LONG) PURE;
+ STDMETHOD_(void,OnRename)(THIS_ IMoniker*) PURE;
+ STDMETHOD_(void,OnSave)(THIS) PURE;
+ STDMETHOD_(void,OnClose)(THIS) PURE;
+};
+
+EXTERN_C const IID IID_IAdviseSink2;
+#undef INTERFACE
+#define INTERFACE IAdviseSink2
+DECLARE_INTERFACE_(IAdviseSink2,IAdviseSink)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD_(void,OnDataChange)(THIS_ FORMATETC*,STGMEDIUM*) PURE;
+ STDMETHOD_(void,OnViewChange)(THIS_ DWORD,LONG) PURE;
+ STDMETHOD_(void,OnRename)(THIS_ IMoniker*) PURE;
+ STDMETHOD_(void,OnSave)(THIS) PURE;
+ STDMETHOD_(void,OnClose)(THIS) PURE;
+ STDMETHOD_(void,OnLinkSrcChange)(THIS_ IMoniker*);
+};
+
+EXTERN_C const IID IID_IDataObject;
+#undef INTERFACE
+#define INTERFACE IDataObject
+DECLARE_INTERFACE_(IDataObject,IUnknown)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(GetData)(THIS_ FORMATETC*,STGMEDIUM*) PURE;
+ STDMETHOD(GetDataHere)(THIS_ FORMATETC*,STGMEDIUM*) PURE;
+ STDMETHOD(QueryGetData)(THIS_ FORMATETC*) PURE;
+ STDMETHOD(GetCanonicalFormatEtc)(THIS_ FORMATETC*,FORMATETC*) PURE;
+ STDMETHOD(SetData)(THIS_ FORMATETC*,STGMEDIUM*,BOOL) PURE;
+ STDMETHOD(EnumFormatEtc)(THIS_ DWORD,IEnumFORMATETC**) PURE;
+ STDMETHOD(DAdvise)(THIS_ FORMATETC*,DWORD,IAdviseSink*,PDWORD) PURE;
+ STDMETHOD(DUnadvise)(THIS_ DWORD) PURE;
+ STDMETHOD(EnumDAdvise)(THIS_ IEnumSTATDATA**) PURE;
+};
+
+EXTERN_C const IID IID_IDataAdviseHolder;
+#undef INTERFACE
+#define INTERFACE IDataAdviseHolder
+DECLARE_INTERFACE_(IDataAdviseHolder,IUnknown)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(Advise)(THIS_ IDataObject*,FORMATETC*,DWORD,IAdviseSink*,PDWORD) PURE;
+ STDMETHOD(Unadvise)(THIS_ DWORD) PURE;
+ STDMETHOD(EnumAdvise)(THIS_ IEnumSTATDATA**) PURE;
+ STDMETHOD(SendOnDataChange)(THIS_ IDataObject*,DWORD,DWORD) PURE;
+};
+
+EXTERN_C const IID IID_IStorage;
+#undef INTERFACE
+#define INTERFACE IStorage
+DECLARE_INTERFACE_(IStorage,IUnknown)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(CreateStream)(THIS_ LPCWSTR,DWORD,DWORD,DWORD,IStream**) PURE;
+ STDMETHOD(OpenStream)(THIS_ LPCWSTR,PVOID,DWORD,DWORD,IStream**) PURE;
+ STDMETHOD(CreateStorage)(THIS_ LPCWSTR,DWORD,DWORD,DWORD,IStorage**) PURE;
+ STDMETHOD(OpenStorage)(THIS_ LPCWSTR,IStorage*,DWORD,SNB,DWORD,IStorage**) PURE;
+ STDMETHOD(CopyTo)(THIS_ DWORD,IID const*,SNB,IStorage*) PURE;
+ STDMETHOD(MoveElementTo)(THIS_ LPCWSTR,IStorage*,LPCWSTR,DWORD) PURE;
+ STDMETHOD(Commit)(THIS_ DWORD) PURE;
+ STDMETHOD(Revert)(THIS) PURE;
+ STDMETHOD(EnumElements)(THIS_ DWORD,PVOID,DWORD,IEnumSTATSTG**) PURE;
+ STDMETHOD(DestroyElement)(THIS_ LPCWSTR) PURE;
+ STDMETHOD(RenameElement)(THIS_ LPCWSTR,LPCWSTR) PURE;
+ STDMETHOD(SetElementTimes)(THIS_ LPCWSTR,FILETIME const*,FILETIME const*,FILETIME const*) PURE;
+ STDMETHOD(SetClass)(THIS_ REFCLSID) PURE;
+ STDMETHOD(SetStateBits)(THIS_ DWORD,DWORD) PURE;
+ STDMETHOD(Stat)(THIS_ STATSTG*,DWORD) PURE;
+};
+
+EXTERN_C const IID IID_IRootStorage;
+#undef INTERFACE
+#define INTERFACE IRootStorage
+DECLARE_INTERFACE_(IRootStorage,IPersist)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(SwitchToFile)(THIS_ LPOLESTR) PURE;
+};
+
+EXTERN_C const IID IID_IRpcChannelBuffer;
+#undef INTERFACE
+#define INTERFACE IRpcChannelBuffer
+DECLARE_INTERFACE_(IRpcChannelBuffer,IUnknown)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(GetBuffer)(THIS_ RPCOLEMESSAGE*,REFIID) PURE;
+ STDMETHOD(SendReceive)(THIS_ RPCOLEMESSAGE*,PULONG) PURE;
+ STDMETHOD(FreeBuffer)(THIS_ RPCOLEMESSAGE*) PURE;
+ STDMETHOD(GetDestCtx)(THIS_ PDWORD,PVOID*) PURE;
+ STDMETHOD(IsConnected)(THIS) PURE;
+};
+
+EXTERN_C const IID IID_IRpcProxyBuffer;
+#undef INTERFACE
+#define INTERFACE IRpcProxyBuffer
+DECLARE_INTERFACE_(IRpcProxyBuffer,IUnknown)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(Connect)(THIS_ IRpcChannelBuffer*) PURE;
+ STDMETHOD_(void,Disconnect)(THIS) PURE;
+
+};
+
+EXTERN_C const IID IID_IRpcStubBuffer;
+#undef INTERFACE
+#define INTERFACE IRpcStubBuffer
+DECLARE_INTERFACE_(IRpcStubBuffer,IUnknown)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(Connect)(THIS_ LPUNKNOWN) PURE;
+ STDMETHOD_(void,Disconnect)(THIS) PURE;
+ STDMETHOD(Invoke)(THIS_ RPCOLEMESSAGE*,LPRPCSTUBBUFFER) PURE;
+ STDMETHOD_(LPRPCSTUBBUFFER,IsIIDSupported)(THIS_ REFIID) PURE;
+ STDMETHOD_(ULONG,CountRefs)(THIS) PURE;
+ STDMETHOD(DebugServerQueryInterface)(THIS_ PVOID*) PURE;
+ STDMETHOD(DebugServerRelease)(THIS_ PVOID) PURE;
+};
+
+EXTERN_C const IID IID_IPSFactoryBuffer;
+#undef INTERFACE
+#define INTERFACE IPSFactoryBuffer
+DECLARE_INTERFACE_(IPSFactoryBuffer,IUnknown)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(CreateProxy)(THIS_ LPUNKNOWN,REFIID,LPRPCPROXYBUFFER*,PVOID*) PURE;
+ STDMETHOD(CreateStub)(THIS_ REFIID,LPUNKNOWN,LPRPCSTUBBUFFER*) PURE;
+};
+
+EXTERN_C const IID IID_ILockBytes;
+#undef INTERFACE
+#define INTERFACE ILockBytes
+DECLARE_INTERFACE_(ILockBytes,IUnknown)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(ReadAt)(THIS_ ULARGE_INTEGER,PVOID,ULONG,ULONG*) PURE;
+ STDMETHOD(WriteAt)(THIS_ ULARGE_INTEGER,PCVOID,ULONG,ULONG*) PURE;
+ STDMETHOD(Flush)(THIS) PURE;
+ STDMETHOD(SetSize)(THIS_ ULARGE_INTEGER) PURE;
+ STDMETHOD(LockRegion)(THIS_ ULARGE_INTEGER,ULARGE_INTEGER,DWORD) PURE;
+ STDMETHOD(UnlockRegion)(THIS_ ULARGE_INTEGER,ULARGE_INTEGER,DWORD) PURE;
+ STDMETHOD(Stat)(THIS_ STATSTG*,DWORD) PURE;
+};
+
+EXTERN_C const IID IID_IExternalConnection;
+#undef INTERFACE
+#define INTERFACE IExternalConnection
+DECLARE_INTERFACE_(IExternalConnection,IUnknown)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(AddConnection)(THIS_ DWORD,DWORD) PURE;
+ STDMETHOD(ReleaseConnection)(THIS_ DWORD,DWORD,BOOL) PURE;
+};
+
+EXTERN_C const IID IID_IRunnableObject;
+#undef INTERFACE
+#define INTERFACE IRunnableObject
+DECLARE_INTERFACE_(IRunnableObject,IUnknown)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(GetRunningClass)(THIS_ LPCLSID) PURE;
+ STDMETHOD(Run)(THIS_ LPBC) PURE;
+ STDMETHOD_(BOOL,IsRunning)(THIS) PURE;
+ STDMETHOD(LockRunning)(THIS_ BOOL,BOOL) PURE;
+ STDMETHOD(SetContainedObject)(THIS_ BOOL) PURE;
+};
+
+EXTERN_C const IID IID_IROTData;
+#undef INTERFACE
+#define INTERFACE IROTData
+DECLARE_INTERFACE_(IROTData,IUnknown)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(GetComparisonData)(THIS_ PVOID,ULONG,PULONG) PURE;
+};
+
+EXTERN_C const IID IID_IChannelHook;
+#undef INTERFACE
+#define INTERFACE IChannelHook
+DECLARE_INTERFACE_(IChannelHook,IUnknown)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD_(void,ClientGetSize)(THIS_ REFGUID,REFIID,PULONG) PURE;
+ STDMETHOD_(void,ClientFillBuffer)(THIS_ REFGUID,REFIID,PULONG,PVOID) PURE;
+ STDMETHOD_(void,ClientNotify)(THIS_ REFGUID,REFIID,ULONG,PVOID,DWORD,HRESULT) PURE;
+ STDMETHOD_(void,ServerNotify)(THIS_ REFGUID,REFIID,ULONG,PVOID,DWORD) PURE;
+ STDMETHOD_(void,ServerGetSize)(THIS_ REFGUID,REFIID,HRESULT,PULONG) PURE;
+ STDMETHOD_(void,ServerFillBuffer)(THIS_ REFGUID,REFIID,PULONG,PVOID,HRESULT) PURE;
+};
+
+EXTERN_C const IID IID_IPropertyStorage;
+#undef INTERFACE
+#define INTERFACE IPropertyStorage
+DECLARE_INTERFACE_(IPropertyStorage,IUnknown)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(ReadMultiple)(THIS_ ULONG,PROPSPEC const*,PROPVARIANT*) PURE;
+ STDMETHOD(WriteMultiple)(THIS_ ULONG,PROPSPEC const*,PROPVARIANT*,PROPID) PURE;
+ STDMETHOD(DeleteMultiple)(THIS_ ULONG,PROPSPEC const*) PURE;
+ STDMETHOD(ReadPropertyNames)(THIS_ ULONG,PROPID const*,LPWSTR*) PURE;
+ STDMETHOD(WritePropertyNames)(THIS_ ULONG,PROPID const*,LPWSTR const*) PURE;
+ STDMETHOD(DeletePropertyNames)(THIS_ ULONG,PROPID const*) PURE;
+ STDMETHOD(SetClass)(THIS_ REFCLSID) PURE;
+ STDMETHOD(Commit)(THIS_ DWORD) PURE;
+ STDMETHOD(Revert)(THIS) PURE;
+ STDMETHOD(Enum)(THIS_ IEnumSTATPROPSTG**) PURE;
+ STDMETHOD(Stat)(THIS_ STATPROPSTG*) PURE;
+ STDMETHOD(SetTimes)(THIS_ FILETIME const*,FILETIME const*,FILETIME const*) PURE;
+};
+
+EXTERN_C const IID IID_IPropertySetStorage;
+#undef INTERFACE
+#define INTERFACE IPropertySetStorage
+DECLARE_INTERFACE_(IPropertySetStorage,IUnknown)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(Create)(THIS_ REFFMTID,CLSID*,DWORD,DWORD,LPPROPERTYSTORAGE*) PURE;
+ STDMETHOD(Open)(THIS_ REFFMTID,DWORD,LPPROPERTYSTORAGE*) PURE;
+ STDMETHOD(Delete)(THIS_ REFFMTID) PURE;
+ STDMETHOD(Enum)(THIS_ IEnumSTATPROPSETSTG**) PURE;
+};
+
+EXTERN_C const IID IID_IClientSecurity;
+#undef INTERFACE
+#define INTERFACE IClientSecurity
+DECLARE_INTERFACE_(IClientSecurity,IUnknown)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(QueryBlanket)(THIS_ PVOID,PDWORD,PDWORD,OLECHAR**,PDWORD,PDWORD,RPC_AUTH_IDENTITY_HANDLE**,PDWORD*) PURE;
+ STDMETHOD(SetBlanket)(THIS_ PVOID,DWORD,DWORD,LPWSTR,DWORD,DWORD,RPC_AUTH_IDENTITY_HANDLE*,DWORD) PURE;
+ STDMETHOD(CopyProxy)(THIS_ LPUNKNOWN,LPUNKNOWN*) PURE;
+};
+
+EXTERN_C const IID IID_IServerSecurity;
+#undef INTERFACE
+#define INTERFACE IServerSecurity
+DECLARE_INTERFACE_(IServerSecurity,IUnknown)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(QueryBlanket)(THIS_ PDWORD,PDWORD,OLECHAR**,PDWORD,PDWORD,RPC_AUTHZ_HANDLE*,PDWORD*) PURE;
+ STDMETHOD(ImpersonateClient)(THIS) PURE;
+ STDMETHOD(RevertToSelf)(THIS) PURE;
+ STDMETHOD(IsImpersonating)(THIS) PURE;
+};
+
+EXTERN_C const IID IID_IClassActivator;
+#undef INTERFACE
+#define INTERFACE IClassActivator
+DECLARE_INTERFACE_(IClassActivator,IUnknown)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(GetClassObject)(THIS_ REFCLSID,DWORD,LCID,REFIID,PVOID*) PURE;
+};
+
+EXTERN_C const IID IID_IFillLockBytes;
+#undef INTERFACE
+#define INTERFACE IFillLockBytes
+DECLARE_INTERFACE_(IFillLockBytes,IUnknown)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(FillAppend)(THIS_ void const*,ULONG,PULONG) PURE;
+ STDMETHOD(FillAt)(THIS_ ULARGE_INTEGER,void const*,ULONG,PULONG) PURE;
+ STDMETHOD(SetFillSize)(THIS_ ULARGE_INTEGER) PURE;
+ STDMETHOD(Terminate)(THIS_ BOOL) PURE;
+};
+
+EXTERN_C const IID IID_IProgressNotify;
+#undef INTERFACE
+#define INTERFACE IProgressNotify
+DECLARE_INTERFACE_(IProgressNotify,IUnknown)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(OnProgress)(THIS_ DWORD,DWORD,BOOL,BOOL) PURE;
+};
+
+EXTERN_C const IID IID_ILayoutStorage;
+#undef INTERFACE
+#define INTERFACE ILayoutStorage
+DECLARE_INTERFACE_(ILayoutStorage,IUnknown)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(LayoutScript)(THIS_ STORAGELAYOUT*,DWORD,DWORD) PURE;
+ STDMETHOD(BeginMonitor)(THIS) PURE;
+ STDMETHOD(EndMonitor)(THIS) PURE;
+ STDMETHOD(ReLayoutDocfile)(THIS_ OLECHAR*) PURE;
+};
+
+HRESULT STDMETHODCALLTYPE IMarshal_GetUnmarshalClass_Proxy(IMarshal*,REFIID,void*,DWORD,void*,DWORD,CLSID*);
+void STDMETHODCALLTYPE IMarshal_GetUnmarshalClass_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IMarshal_GetMarshalSizeMax_Proxy(IMarshal*,REFIID,void*,DWORD,void*,DWORD,DWORD*);
+void STDMETHODCALLTYPE IMarshal_GetMarshalSizeMax_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IMarshal_MarshalInterface_Proxy(IMarshal*,IStream*,REFIID,void*,DWORD,void*,DWORD);
+void STDMETHODCALLTYPE IMarshal_MarshalInterface_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IMarshal_UnmarshalInterface_Proxy(IMarshal*,IStream*,REFIID,void**);
+void STDMETHODCALLTYPE IMarshal_UnmarshalInterface_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IMarshal_ReleaseMarshalData_Proxy(IMarshal*,IStream*);
+void STDMETHODCALLTYPE IMarshal_ReleaseMarshalData_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IMarshal_DisconnectObject_Proxy(IMarshal*,DWORD);
+void STDMETHODCALLTYPE IMarshal_DisconnectObject_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+void* STDMETHODCALLTYPE IMalloc_Alloc_Proxy(IMalloc*,ULONG);
+void STDMETHODCALLTYPE IMalloc_Alloc_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+void* STDMETHODCALLTYPE IMalloc_Realloc_Proxy(IMalloc*,void*,ULONG);
+void STDMETHODCALLTYPE IMalloc_Realloc_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+void STDMETHODCALLTYPE IMalloc_Free_Proxy(IMalloc*,void*);
+void STDMETHODCALLTYPE IMalloc_Free_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+ULONG STDMETHODCALLTYPE IMalloc_GetSize_Proxy(IMalloc*,void*);
+void STDMETHODCALLTYPE IMalloc_GetSize_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+int STDMETHODCALLTYPE IMalloc_DidAlloc_Proxy(IMalloc*,void*);
+void STDMETHODCALLTYPE IMalloc_DidAlloc_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+void STDMETHODCALLTYPE IMalloc_HeapMinimize_Proxy(IMalloc*);
+void STDMETHODCALLTYPE IMalloc_HeapMinimize_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+ULONG STDMETHODCALLTYPE IMallocSpy_PreAlloc_Proxy(IMallocSpy*,ULONG cbRequest);
+void STDMETHODCALLTYPE IMallocSpy_PreAlloc_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+void* STDMETHODCALLTYPE IMallocSpy_PostAlloc_Proxy(IMallocSpy*,void*);
+void STDMETHODCALLTYPE IMallocSpy_PostAlloc_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+void* STDMETHODCALLTYPE IMallocSpy_PreFree_Proxy(IMallocSpy*,void*,BOOL);
+void STDMETHODCALLTYPE IMallocSpy_PreFree_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+void STDMETHODCALLTYPE IMallocSpy_PostFree_Proxy(IMallocSpy*,BOOL);
+void STDMETHODCALLTYPE IMallocSpy_PostFree_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+ULONG STDMETHODCALLTYPE IMallocSpy_PreRealloc_Proxy(IMallocSpy*,void*,ULONG,void**,BOOL);
+void STDMETHODCALLTYPE IMallocSpy_PreRealloc_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+void* STDMETHODCALLTYPE IMallocSpy_PostRealloc_Proxy(IMallocSpy*,void*,BOOL);
+void STDMETHODCALLTYPE IMallocSpy_PostRealloc_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+void* STDMETHODCALLTYPE IMallocSpy_PreGetSize_Proxy(IMallocSpy*,void*,BOOL);
+void STDMETHODCALLTYPE IMallocSpy_PreGetSize_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+ULONG STDMETHODCALLTYPE IMallocSpy_PostGetSize_Proxy(IMallocSpy*,ULONG,BOOL);
+void STDMETHODCALLTYPE IMallocSpy_PostGetSize_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+void* STDMETHODCALLTYPE IMallocSpy_PreDidAlloc_Proxy(IMallocSpy*,void*,BOOL);
+void STDMETHODCALLTYPE IMallocSpy_PreDidAlloc_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+int STDMETHODCALLTYPE IMallocSpy_PostDidAlloc_Proxy(IMallocSpy*,void*,BOOL,int);
+void STDMETHODCALLTYPE IMallocSpy_PostDidAlloc_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+void STDMETHODCALLTYPE IMallocSpy_PreHeapMinimize_Proxy(IMallocSpy* );
+void STDMETHODCALLTYPE IMallocSpy_PreHeapMinimize_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+void STDMETHODCALLTYPE IMallocSpy_PostHeapMinimize_Proxy(IMallocSpy*);
+void STDMETHODCALLTYPE IMallocSpy_PostHeapMinimize_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IStdMarshalInfo_GetClassForHandler_Proxy(IStdMarshalInfo*,DWORD,void*,CLSID*);
+void STDMETHODCALLTYPE IStdMarshalInfo_GetClassForHandler_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+DWORD STDMETHODCALLTYPE IExternalConnection_AddConnection_Proxy(IExternalConnection*,DWORD,DWORD);
+void STDMETHODCALLTYPE IExternalConnection_AddConnection_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+DWORD STDMETHODCALLTYPE IExternalConnection_ReleaseConnection_Proxy(IExternalConnection*,DWORD,DWORD,BOOL);
+void STDMETHODCALLTYPE IExternalConnection_ReleaseConnection_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IEnumUnknown_RemoteNext_Proxy(IEnumUnknown*,ULONG,IUnknown**,ULONG*);
+void STDMETHODCALLTYPE IEnumUnknown_RemoteNext_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IEnumUnknown_Skip_Proxy(IEnumUnknown*,ULONG);
+void STDMETHODCALLTYPE IEnumUnknown_Skip_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IEnumUnknown_Reset_Proxy(IEnumUnknown* );
+void STDMETHODCALLTYPE IEnumUnknown_Reset_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IEnumUnknown_Clone_Proxy(IEnumUnknown*,IEnumUnknown**);
+void STDMETHODCALLTYPE IEnumUnknown_Clone_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IBindCtx_RegisterObjectBound_Proxy(IBindCtx*,IUnknown*punk);
+void STDMETHODCALLTYPE IBindCtx_RegisterObjectBound_Stub(IRpcStubBuffer*,IRpcChannelBuffer*_pRpcChannelBuffer,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IBindCtx_RevokeObjectBound_Proxy(IBindCtx*,IUnknown*punk);
+void STDMETHODCALLTYPE IBindCtx_RevokeObjectBound_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IBindCtx_ReleaseBoundObjects_Proxy(IBindCtx*);
+void STDMETHODCALLTYPE IBindCtx_ReleaseBoundObjects_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IBindCtx_SetBindOptions_Proxy(IBindCtx*,BIND_OPTS*);
+void STDMETHODCALLTYPE IBindCtx_SetBindOptions_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IBindCtx_GetBindOptions_Proxy(IBindCtx*,BIND_OPTS*pbindopts);
+void STDMETHODCALLTYPE IBindCtx_GetBindOptions_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IBindCtx_GetRunningObjectTable_Proxy(IBindCtx*,IRunningObjectTable**);
+void STDMETHODCALLTYPE IBindCtx_GetRunningObjectTable_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IBindCtx_RegisterObjectParam_Proxy(IBindCtx*,LPCSTR,IUnknown*);
+void STDMETHODCALLTYPE IBindCtx_RegisterObjectParam_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IBindCtx_GetObjectParam_Proxy(IBindCtx*,LPCSTR,IUnknown**);
+void STDMETHODCALLTYPE IBindCtx_GetObjectParam_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IBindCtx_EnumObjectParam_Proxy(IBindCtx*,IEnumString**);
+void STDMETHODCALLTYPE IBindCtx_EnumObjectParam_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IBindCtx_RevokeObjectParam_Proxy(IBindCtx*,LPCSTR);
+void STDMETHODCALLTYPE IBindCtx_RevokeObjectParam_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IEnumMoniker_RemoteNext_Proxy(IEnumMoniker*,ULONG,IMoniker**,ULONG*);
+void STDMETHODCALLTYPE IEnumMoniker_RemoteNext_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IEnumMoniker_Skip_Proxy(IEnumMoniker*,ULONG);
+void STDMETHODCALLTYPE IEnumMoniker_Skip_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IEnumMoniker_Reset_Proxy(IEnumMoniker*);
+void STDMETHODCALLTYPE IEnumMoniker_Reset_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IEnumMoniker_Clone_Proxy(IEnumMoniker*,IEnumMoniker**);
+void STDMETHODCALLTYPE IEnumMoniker_Clone_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IRunnableObject_GetRunningClass_Proxy(IRunnableObject*,LPCLSID);
+void STDMETHODCALLTYPE IRunnableObject_GetRunningClass_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IRunnableObject_Run_Proxy(IRunnableObject*,LPBINDCTX);
+void STDMETHODCALLTYPE IRunnableObject_Run_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+BOOL STDMETHODCALLTYPE IRunnableObject_IsRunning_Proxy(IRunnableObject*);
+void STDMETHODCALLTYPE IRunnableObject_IsRunning_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IRunnableObject_LockRunning_Proxy(IRunnableObject*,BOOL,BOOL);
+void STDMETHODCALLTYPE IRunnableObject_LockRunning_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IRunnableObject_SetContainedObject_Proxy(IRunnableObject*,BOOL);
+void STDMETHODCALLTYPE IRunnableObject_SetContainedObject_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IRunningObjectTable_Register_Proxy(IRunningObjectTable*,DWORD,IUnknown*,IMoniker*,DWORD*);
+void STDMETHODCALLTYPE IRunningObjectTable_Register_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IRunningObjectTable_Revoke_Proxy(IRunningObjectTable*,DWORD);
+void STDMETHODCALLTYPE IRunningObjectTable_Revoke_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IRunningObjectTable_IsRunning_Proxy(IRunningObjectTable*,IMoniker*);
+void STDMETHODCALLTYPE IRunningObjectTable_IsRunning_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IRunningObjectTable_GetObject_Proxy(IRunningObjectTable*,IMoniker*,IUnknown**);
+void STDMETHODCALLTYPE IRunningObjectTable_GetObject_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IRunningObjectTable_NoteChangeTime_Proxy(IRunningObjectTable*,DWORD,FILETIME*);
+void STDMETHODCALLTYPE IRunningObjectTable_NoteChangeTime_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IRunningObjectTable_GetTimeOfLastChange_Proxy(IRunningObjectTable*,IMoniker*,FILETIME*);
+void STDMETHODCALLTYPE IRunningObjectTable_GetTimeOfLastChange_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IRunningObjectTable_EnumRunning_Proxy(IRunningObjectTable*,IEnumMoniker**);
+void STDMETHODCALLTYPE IRunningObjectTable_EnumRunning_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IPersist_GetClassID_Proxy(IPersist*,CLSID*);
+void STDMETHODCALLTYPE IPersist_GetClassID_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IPersistStream_IsDirty_Proxy(IPersistStream*);
+void STDMETHODCALLTYPE IPersistStream_IsDirty_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IPersistStream_Load_Proxy(IPersistStream*,IStream*);
+void STDMETHODCALLTYPE IPersistStream_Load_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IPersistStream_Save_Proxy(IPersistStream*,IStream*,BOOL);
+void STDMETHODCALLTYPE IPersistStream_Save_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IPersistStream_GetSizeMax_Proxy(IPersistStream*,ULARGE_INTEGER*);
+void STDMETHODCALLTYPE IPersistStream_GetSizeMax_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IMoniker_RemoteBindToObject_Proxy(IMoniker*,IBindCtx*,IMoniker*,REFIID,IUnknown**);
+void STDMETHODCALLTYPE IMoniker_RemoteBindToObject_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IMoniker_RemoteBindToStorage_Proxy(IMoniker*,IBindCtx*,IMoniker*,REFIID,IUnknown**);
+void STDMETHODCALLTYPE IMoniker_RemoteBindToStorage_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IMoniker_Reduce_Proxy(IMoniker*,IBindCtx*,DWORD,IMoniker**,IMoniker**);
+void STDMETHODCALLTYPE IMoniker_Reduce_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IMoniker_ComposeWith_Proxy(IMoniker*,IMoniker*,BOOL,IMoniker**);
+void STDMETHODCALLTYPE IMoniker_ComposeWith_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IMoniker_Enum_Proxy(IMoniker*,BOOL,IEnumMoniker**);
+void STDMETHODCALLTYPE IMoniker_Enum_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IMoniker_IsEqual_Proxy(IMoniker*,IMoniker*);
+void STDMETHODCALLTYPE IMoniker_IsEqual_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IMoniker_Hash_Proxy(IMoniker*,DWORD*);
+void STDMETHODCALLTYPE IMoniker_Hash_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IMoniker_IsRunning_Proxy(IMoniker*,IBindCtx*,IMoniker*,IMoniker*);
+void STDMETHODCALLTYPE IMoniker_IsRunning_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IMoniker_GetTimeOfLastChange_Proxy(IMoniker*,IBindCtx*,IMoniker*,FILETIME*);
+void STDMETHODCALLTYPE IMoniker_GetTimeOfLastChange_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IMoniker_Inverse_Proxy(IMoniker*,IMoniker**);
+void STDMETHODCALLTYPE IMoniker_Inverse_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IMoniker_CommonPrefixWith_Proxy(IMoniker*,IMoniker*,IMoniker**);
+void STDMETHODCALLTYPE IMoniker_CommonPrefixWith_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IMoniker_RelativePathTo_Proxy(IMoniker*,IMoniker*,IMoniker**);
+void STDMETHODCALLTYPE IMoniker_RelativePathTo_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IMoniker_GetDisplayName_Proxy(IMoniker*,IBindCtx*,IMoniker*,LPCSTR*);
+void STDMETHODCALLTYPE IMoniker_GetDisplayName_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IMoniker_ParseDisplayName_Proxy(IMoniker*,IBindCtx*,IMoniker*,LPCSTR,ULONG*,IMoniker**);
+void STDMETHODCALLTYPE IMoniker_ParseDisplayName_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IMoniker_IsSystemMoniker_Proxy(IMoniker*,DWORD*);
+void STDMETHODCALLTYPE IMoniker_IsSystemMoniker_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IROTData_GetComparisonData_Proxy(IROTData*,BYTE*,ULONG cbMax,ULONG*);
+void STDMETHODCALLTYPE IROTData_GetComparisonData_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IEnumString_RemoteNext_Proxy(IEnumString*,ULONG,LPCSTR*rgelt,ULONG*);
+void STDMETHODCALLTYPE IEnumString_RemoteNext_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IEnumString_Skip_Proxy(IEnumString*,ULONG);
+void STDMETHODCALLTYPE IEnumString_Skip_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IEnumString_Reset_Proxy(IEnumString*);
+void STDMETHODCALLTYPE IEnumString_Reset_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IEnumString_Clone_Proxy(IEnumString*,IEnumString**);
+void STDMETHODCALLTYPE IEnumString_Clone_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IStream_RemoteRead_Proxy(IStream*,BYTE*,ULONG,ULONG*);
+void STDMETHODCALLTYPE IStream_RemoteRead_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IStream_RemoteWrite_Proxy(IStream*,BYTE*pv,ULONG,ULONG*);
+void STDMETHODCALLTYPE IStream_RemoteWrite_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IStream_RemoteSeek_Proxy(IStream*,LARGE_INTEGER,DWORD,ULARGE_INTEGER*);
+void STDMETHODCALLTYPE IStream_RemoteSeek_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IStream_SetSize_Proxy(IStream*,ULARGE_INTEGER);
+void STDMETHODCALLTYPE IStream_SetSize_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IStream_RemoteCopyTo_Proxy(IStream*,IStream*,ULARGE_INTEGER,ULARGE_INTEGER*,ULARGE_INTEGER*);
+void STDMETHODCALLTYPE IStream_RemoteCopyTo_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IStream_Commit_Proxy(IStream*,DWORD);
+void STDMETHODCALLTYPE IStream_Commit_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IStream_Revert_Proxy(IStream*);
+void STDMETHODCALLTYPE IStream_Revert_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IStream_LockRegion_Proxy(IStream*,ULARGE_INTEGER,ULARGE_INTEGER,DWORD);
+void STDMETHODCALLTYPE IStream_LockRegion_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IStream_UnlockRegion_Proxy(IStream*,ULARGE_INTEGER,ULARGE_INTEGER,DWORD);
+void STDMETHODCALLTYPE IStream_UnlockRegion_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IStream_Stat_Proxy(IStream*,STATSTG*,DWORD);
+void STDMETHODCALLTYPE IStream_Stat_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IStream_Clone_Proxy(IStream*,IStream**);
+void STDMETHODCALLTYPE IStream_Clone_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IEnumSTATSTG_RemoteNext_Proxy(IEnumSTATSTG*,ULONG,STATSTG*,ULONG*);
+void STDMETHODCALLTYPE IEnumSTATSTG_RemoteNext_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IEnumSTATSTG_Skip_Proxy(IEnumSTATSTG*,ULONG celt);
+void STDMETHODCALLTYPE IEnumSTATSTG_Skip_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IEnumSTATSTG_Reset_Proxy(IEnumSTATSTG*);
+void STDMETHODCALLTYPE IEnumSTATSTG_Reset_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IEnumSTATSTG_Clone_Proxy(IEnumSTATSTG*,IEnumSTATSTG**);
+void STDMETHODCALLTYPE IEnumSTATSTG_Clone_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IStorage_CreateStream_Proxy(IStorage*,OLECHAR*,DWORD,DWORD,DWORD,IStream**);
+void STDMETHODCALLTYPE IStorage_CreateStream_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IStorage_RemoteOpenStream_Proxy(IStorage*,const OLECHAR*,unsigned long,BYTE*,DWORD,DWORD,IStream**);
+void STDMETHODCALLTYPE IStorage_RemoteOpenStream_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IStorage_CreateStorage_Proxy(IStorage*,OLECHAR*,DWORD,DWORD,DWORD,IStorage**);
+void STDMETHODCALLTYPE IStorage_CreateStorage_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IStorage_OpenStorage_Proxy(IStorage*,OLECHAR*,IStorage*,DWORD,SNB,DWORD,IStorage**);
+void STDMETHODCALLTYPE IStorage_OpenStorage_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IStorage_CopyTo_Proxy(IStorage*,DWORD,const IID*,SNB,IStorage*);
+void STDMETHODCALLTYPE IStorage_CopyTo_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IStorage_MoveElementTo_Proxy(IStorage*,const OLECHAR*,IStorage*,const OLECHAR*,DWORD);
+void STDMETHODCALLTYPE IStorage_MoveElementTo_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IStorage_Commit_Proxy(IStorage*,DWORD);
+void STDMETHODCALLTYPE IStorage_Commit_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IStorage_Revert_Proxy(IStorage*);
+void STDMETHODCALLTYPE IStorage_Revert_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IStorage_RemoteEnumElements_Proxy(IStorage*,DWORD,unsigned long,BYTE*,DWORD,IEnumSTATSTG**);
+void STDMETHODCALLTYPE IStorage_RemoteEnumElements_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IStorage_DestroyElement_Proxy(IStorage*,OLECHAR*);
+void STDMETHODCALLTYPE IStorage_DestroyElement_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IStorage_RenameElement_Proxy(IStorage*,const OLECHAR*,const OLECHAR*);
+void STDMETHODCALLTYPE IStorage_RenameElement_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IStorage_SetElementTimes_Proxy(IStorage*,const OLECHAR*,const FILETIME*,const FILETIME*,const FILETIME*);
+void STDMETHODCALLTYPE IStorage_SetElementTimes_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IStorage_SetClass_Proxy(IStorage*,REFCLSID);
+void STDMETHODCALLTYPE IStorage_SetClass_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IStorage_SetStateBits_Proxy(IStorage*,DWORD,DWORD);
+void STDMETHODCALLTYPE IStorage_SetStateBits_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IStorage_Stat_Proxy(IStorage*,STATSTG*,DWORD);
+void STDMETHODCALLTYPE IStorage_Stat_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IPersistFile_IsDirty_Proxy(IPersistFile*);
+void STDMETHODCALLTYPE IPersistFile_IsDirty_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IPersistFile_Load_Proxy(IPersistFile*,LPCOLESTR,DWORD);
+void STDMETHODCALLTYPE IPersistFile_Load_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IPersistFile_Save_Proxy(IPersistFile*,LPCOLESTR pszFileName,BOOL);
+void STDMETHODCALLTYPE IPersistFile_Save_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IPersistFile_SaveCompleted_Proxy(IPersistFile*,LPCOLESTR);
+void STDMETHODCALLTYPE IPersistFile_SaveCompleted_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IPersistFile_GetCurFile_Proxy(IPersistFile*,LPCSTR*);
+void STDMETHODCALLTYPE IPersistFile_GetCurFile_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IPersistStorage_IsDirty_Proxy(IPersistStorage*);
+void STDMETHODCALLTYPE IPersistStorage_IsDirty_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IPersistStorage_InitNew_Proxy(IPersistStorage*,IStorage*);
+void STDMETHODCALLTYPE IPersistStorage_InitNew_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IPersistStorage_Load_Proxy(IPersistStorage*,IStorage*);
+void STDMETHODCALLTYPE IPersistStorage_Load_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IPersistStorage_Save_Proxy(IPersistStorage*,IStorage*,BOOL);
+void STDMETHODCALLTYPE IPersistStorage_Save_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IPersistStorage_SaveCompleted_Proxy(IPersistStorage*,IStorage*);
+void STDMETHODCALLTYPE IPersistStorage_SaveCompleted_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IPersistStorage_HandsOffStorage_Proxy(IPersistStorage*);
+void STDMETHODCALLTYPE IPersistStorage_HandsOffStorage_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE ILockBytes_RemoteReadAt_Proxy(ILockBytes*,ULARGE_INTEGER,BYTE*,ULONG,ULONG*);
+void STDMETHODCALLTYPE ILockBytes_RemoteReadAt_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE ILockBytes_RemoteWriteAt_Proxy(ILockBytes*,ULARGE_INTEGER,BYTE*pv,ULONG,ULONG*);
+void STDMETHODCALLTYPE ILockBytes_RemoteWriteAt_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE ILockBytes_Flush_Proxy(ILockBytes*);
+void STDMETHODCALLTYPE ILockBytes_Flush_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE ILockBytes_SetSize_Proxy(ILockBytes*,ULARGE_INTEGER);
+void STDMETHODCALLTYPE ILockBytes_SetSize_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE ILockBytes_LockRegion_Proxy(ILockBytes*,ULARGE_INTEGER,ULARGE_INTEGER,DWORD);
+void STDMETHODCALLTYPE ILockBytes_LockRegion_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE ILockBytes_UnlockRegion_Proxy(ILockBytes*,ULARGE_INTEGER,ULARGE_INTEGER,DWORD);
+void STDMETHODCALLTYPE ILockBytes_UnlockRegion_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE ILockBytes_Stat_Proxy(ILockBytes*,STATSTG*,DWORD);
+void STDMETHODCALLTYPE ILockBytes_Stat_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IEnumFORMATETC_RemoteNext_Proxy(IEnumFORMATETC*,ULONG,FORMATETC*,ULONG*);
+void STDMETHODCALLTYPE IEnumFORMATETC_RemoteNext_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IEnumFORMATETC_Skip_Proxy(IEnumFORMATETC*,ULONG);
+void STDMETHODCALLTYPE IEnumFORMATETC_Skip_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IEnumFORMATETC_Reset_Proxy(IEnumFORMATETC*);
+void STDMETHODCALLTYPE IEnumFORMATETC_Reset_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IEnumFORMATETC_Clone_Proxy(IEnumFORMATETC*,IEnumFORMATETC**);
+void STDMETHODCALLTYPE IEnumFORMATETC_Clone_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IEnumFORMATETC_Next_Proxy(IEnumFORMATETC*,ULONG,FORMATETC*,ULONG*);
+HRESULT STDMETHODCALLTYPE IEnumFORMATETC_Next_Stub(IEnumFORMATETC*,ULONG,FORMATETC*,ULONG*);
+HRESULT STDMETHODCALLTYPE IEnumSTATDATA_RemoteNext_Proxy(IEnumSTATDATA*,ULONG,STATDATA*,ULONG*);
+void STDMETHODCALLTYPE IEnumSTATDATA_RemoteNext_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IEnumSTATDATA_Skip_Proxy(IEnumSTATDATA*,ULONG);
+void STDMETHODCALLTYPE IEnumSTATDATA_Skip_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IEnumSTATDATA_Reset_Proxy(IEnumSTATDATA*);
+void STDMETHODCALLTYPE IEnumSTATDATA_Reset_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IEnumSTATDATA_Clone_Proxy(IEnumSTATDATA*,IEnumSTATDATA**);
+void STDMETHODCALLTYPE IEnumSTATDATA_Clone_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IEnumSTATDATA_Next_Proxy(IEnumSTATDATA*,ULONG,STATDATA*,ULONG*);
+HRESULT STDMETHODCALLTYPE IEnumSTATDATA_Next_Stub(IEnumSTATDATA*,ULONG,STATDATA*,ULONG*);
+HRESULT STDMETHODCALLTYPE IRootStorage_SwitchToFile_Proxy(IRootStorage*,LPCSTR);
+void STDMETHODCALLTYPE IRootStorage_SwitchToFile_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+void STDMETHODCALLTYPE IAdviseSink_RemoteOnDataChange_Proxy(IAdviseSink*,FORMATETC*,RemSTGMEDIUM*);
+void STDMETHODCALLTYPE IAdviseSink_RemoteOnDataChange_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+void STDMETHODCALLTYPE IAdviseSink_RemoteOnViewChange_Proxy(IAdviseSink*,DWORD,LONG);
+void STDMETHODCALLTYPE IAdviseSink_RemoteOnViewChange_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+void STDMETHODCALLTYPE IAdviseSink_RemoteOnRename_Proxy(IAdviseSink*,IMoniker*);
+void STDMETHODCALLTYPE IAdviseSink_RemoteOnRename_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+void STDMETHODCALLTYPE IAdviseSink_RemoteOnSave_Proxy(IAdviseSink*);
+void STDMETHODCALLTYPE IAdviseSink_RemoteOnSave_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IAdviseSink_RemoteOnClose_Proxy(IAdviseSink*);
+void STDMETHODCALLTYPE IAdviseSink_RemoteOnClose_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+void STDMETHODCALLTYPE IAdviseSink_OnDataChange_Proxy(IAdviseSink*,FORMATETC*,STGMEDIUM*);
+void STDMETHODCALLTYPE IAdviseSink_OnDataChange_Stub(IAdviseSink*,FORMATETC*,RemSTGMEDIUM*);
+void STDMETHODCALLTYPE IAdviseSink_OnViewChange_Proxy(IAdviseSink*,DWORD,LONG);
+void STDMETHODCALLTYPE IAdviseSink_OnViewChange_Stub(IAdviseSink*,DWORD,LONG);
+void STDMETHODCALLTYPE IAdviseSink_OnRename_Proxy(IAdviseSink*,IMoniker*);
+void STDMETHODCALLTYPE IAdviseSink_OnRename_Stub(IAdviseSink*,IMoniker*);
+void STDMETHODCALLTYPE IAdviseSink_OnSave_Proxy(IAdviseSink*);
+void STDMETHODCALLTYPE IAdviseSink_OnSave_Stub(IAdviseSink*);
+void STDMETHODCALLTYPE IAdviseSink_OnClose_Proxy(IAdviseSink*);
+HRESULT STDMETHODCALLTYPE IAdviseSink_OnClose_Stub(IAdviseSink*);
+void STDMETHODCALLTYPE IAdviseSink2_RemoteOnLinkSrcChange_Proxy(IAdviseSink2*,IMoniker*);
+void STDMETHODCALLTYPE IAdviseSink2_RemoteOnLinkSrcChange_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+void STDMETHODCALLTYPE IAdviseSink2_OnLinkSrcChange_Proxy(IAdviseSink2*,IMoniker*);
+void STDMETHODCALLTYPE IAdviseSink2_OnLinkSrcChange_Stub(IAdviseSink2*,IMoniker*);
+HRESULT STDMETHODCALLTYPE IDataObject_RemoteGetData_Proxy(IDataObject*,FORMATETC*,RemSTGMEDIUM**);
+void STDMETHODCALLTYPE IDataObject_RemoteGetData_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IDataObject_RemoteGetDataHere_Proxy(IDataObject*,FORMATETC*,RemSTGMEDIUM**);
+void STDMETHODCALLTYPE IDataObject_RemoteGetDataHere_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IDataObject_QueryGetData_Proxy(IDataObject*,FORMATETC*);
+void STDMETHODCALLTYPE IDataObject_QueryGetData_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IDataObject_GetCanonicalFormatEtc_Proxy(IDataObject*,FORMATETC*,FORMATETC*);
+void STDMETHODCALLTYPE IDataObject_GetCanonicalFormatEtc_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IDataObject_RemoteSetData_Proxy(IDataObject*,FORMATETC*,RemSTGMEDIUM*,BOOL);
+void STDMETHODCALLTYPE IDataObject_RemoteSetData_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IDataObject_EnumFormatEtc_Proxy(IDataObject*,DWORD,IEnumFORMATETC**);
+void STDMETHODCALLTYPE IDataObject_EnumFormatEtc_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IDataObject_DAdvise_Proxy(IDataObject*,FORMATETC*,DWORD,IAdviseSink*,DWORD*);
+void STDMETHODCALLTYPE IDataObject_DAdvise_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IDataObject_DUnadvise_Proxy(IDataObject*,DWORD);
+void STDMETHODCALLTYPE IDataObject_DUnadvise_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IDataObject_EnumDAdvise_Proxy(IDataObject*,IEnumSTATDATA**);
+void STDMETHODCALLTYPE IDataObject_EnumDAdvise_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IDataObject_GetData_Proxy(IDataObject*,FORMATETC*,STGMEDIUM*);
+HRESULT STDMETHODCALLTYPE IDataObject_GetData_Stub(IDataObject*,FORMATETC*,RemSTGMEDIUM**);
+HRESULT STDMETHODCALLTYPE IDataObject_GetDataHere_Proxy(IDataObject*,FORMATETC*,STGMEDIUM*);
+HRESULT STDMETHODCALLTYPE IDataObject_GetDataHere_Stub(IDataObject*,FORMATETC*,RemSTGMEDIUM**);
+HRESULT STDMETHODCALLTYPE IDataObject_SetData_Proxy(IDataObject*,FORMATETC*,STGMEDIUM*,BOOL);
+HRESULT STDMETHODCALLTYPE IDataObject_SetData_Stub(IDataObject*,FORMATETC*,RemSTGMEDIUM*,BOOL);
+HRESULT STDMETHODCALLTYPE IDataAdviseHolder_Advise_Proxy(IDataAdviseHolder*,IDataObject*,FORMATETC*,DWORD,IAdviseSink*,DWORD*);
+void STDMETHODCALLTYPE IDataAdviseHolder_Advise_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IDataAdviseHolder_Unadvise_Proxy(IDataAdviseHolder*,DWORD);
+void STDMETHODCALLTYPE IDataAdviseHolder_Unadvise_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IDataAdviseHolder_EnumAdvise_Proxy(IDataAdviseHolder*,IEnumSTATDATA**);
+void STDMETHODCALLTYPE IDataAdviseHolder_EnumAdvise_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IDataAdviseHolder_SendOnDataChange_Proxy(IDataAdviseHolder*,IDataObject*,DWORD,DWORD);
+void STDMETHODCALLTYPE IDataAdviseHolder_SendOnDataChange_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+DWORD STDMETHODCALLTYPE IMessageFilter_HandleInComingCall_Proxy(IMessageFilter*,DWORD,HTASK,DWORD,LPINTERFACEINFO);
+void STDMETHODCALLTYPE IMessageFilter_HandleInComingCall_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+DWORD STDMETHODCALLTYPE IMessageFilter_RetryRejectedCall_Proxy(IMessageFilter*,HTASK,DWORD,DWORD);
+void STDMETHODCALLTYPE IMessageFilter_RetryRejectedCall_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+DWORD STDMETHODCALLTYPE IMessageFilter_MessagePending_Proxy(IMessageFilter*,HTASK,DWORD,DWORD);
+void STDMETHODCALLTYPE IMessageFilter_MessagePending_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IRpcChannelBuffer_GetBuffer_Proxy(IRpcChannelBuffer*,RPCOLEMESSAGE*,REFIID);
+void STDMETHODCALLTYPE IRpcChannelBuffer_GetBuffer_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IRpcChannelBuffer_SendReceive_Proxy(IRpcChannelBuffer*,RPCOLEMESSAGE*,ULONG*);
+void STDMETHODCALLTYPE IRpcChannelBuffer_SendReceive_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IRpcChannelBuffer_FreeBuffer_Proxy(IRpcChannelBuffer*,RPCOLEMESSAGE*);
+void STDMETHODCALLTYPE IRpcChannelBuffer_FreeBuffer_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IRpcChannelBuffer_GetDestCtx_Proxy(IRpcChannelBuffer*,DWORD*,void**);
+void STDMETHODCALLTYPE IRpcChannelBuffer_GetDestCtx_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IRpcChannelBuffer_IsConnected_Proxy(IRpcChannelBuffer*);
+void STDMETHODCALLTYPE IRpcChannelBuffer_IsConnected_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IRpcProxyBuffer_Connect_Proxy(IRpcProxyBuffer*,IRpcChannelBuffer*pRpcChannelBuffer);
+void STDMETHODCALLTYPE IRpcProxyBuffer_Connect_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+void STDMETHODCALLTYPE IRpcProxyBuffer_Disconnect_Proxy(IRpcProxyBuffer*);
+void STDMETHODCALLTYPE IRpcProxyBuffer_Disconnect_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IRpcStubBuffer_Connect_Proxy(IRpcStubBuffer*,IUnknown*);
+void STDMETHODCALLTYPE IRpcStubBuffer_Connect_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+void STDMETHODCALLTYPE IRpcStubBuffer_Disconnect_Proxy(IRpcStubBuffer*);
+void STDMETHODCALLTYPE IRpcStubBuffer_Disconnect_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IRpcStubBuffer_Invoke_Proxy(IRpcStubBuffer*,RPCOLEMESSAGE*,IRpcChannelBuffer*);
+void STDMETHODCALLTYPE IRpcStubBuffer_Invoke_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+IRpcStubBuffer*STDMETHODCALLTYPE IRpcStubBuffer_IsIIDSupported_Proxy(IRpcStubBuffer*,REFIID);
+void STDMETHODCALLTYPE IRpcStubBuffer_IsIIDSupported_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+ULONG STDMETHODCALLTYPE IRpcStubBuffer_CountRefs_Proxy(IRpcStubBuffer*);
+void STDMETHODCALLTYPE IRpcStubBuffer_CountRefs_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IRpcStubBuffer_DebugServerQueryInterface_Proxy(IRpcStubBuffer*,void**);
+void STDMETHODCALLTYPE IRpcStubBuffer_DebugServerQueryInterface_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+void STDMETHODCALLTYPE IRpcStubBuffer_DebugServerRelease_Proxy(IRpcStubBuffer*,void*);
+void STDMETHODCALLTYPE IRpcStubBuffer_DebugServerRelease_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IPSFactoryBuffer_CreateProxy_Proxy(IPSFactoryBuffer*,IUnknown*,REFIID,IRpcProxyBuffer**,void**);
+void STDMETHODCALLTYPE IPSFactoryBuffer_CreateProxy_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IPSFactoryBuffer_CreateStub_Proxy(IPSFactoryBuffer*,REFIID,IUnknown*,IRpcStubBuffer**);
+void STDMETHODCALLTYPE IPSFactoryBuffer_CreateStub_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD);
+void STDMETHODCALLTYPE SNB_to_xmit(SNB*,RemSNB**);
+void STDMETHODCALLTYPE SNB_from_xmit(RemSNB*,SNB*);
+void STDMETHODCALLTYPE SNB_free_inst(SNB*);
+void STDMETHODCALLTYPE SNB_free_xmit(RemSNB*);
+HRESULT STDMETHODCALLTYPE IEnumUnknown_Next_Proxy(IEnumUnknown*,ULONG,IUnknown**,ULONG*);
+HRESULT STDMETHODCALLTYPE IEnumUnknown_Next_Stub(IEnumUnknown*,ULONG,IUnknown**,ULONG*);
+HRESULT STDMETHODCALLTYPE IEnumMoniker_Next_Proxy(IEnumMoniker*,ULONG,IMoniker**,ULONG*);
+HRESULT STDMETHODCALLTYPE IEnumMoniker_Next_Stub(IEnumMoniker*,ULONG,IMoniker**,ULONG*);
+HRESULT STDMETHODCALLTYPE IMoniker_BindToObject_Proxy(IMoniker*,IBindCtx*,IMoniker*,REFIID,void**);
+HRESULT STDMETHODCALLTYPE IMoniker_BindToObject_Stub(IMoniker*,IBindCtx*,IMoniker*,REFIID,IUnknown**);
+HRESULT STDMETHODCALLTYPE IMoniker_BindToStorage_Proxy(IMoniker*,IBindCtx*,IMoniker*,REFIID,void**);
+HRESULT STDMETHODCALLTYPE IMoniker_BindToStorage_Stub(IMoniker*,IBindCtx*,IMoniker*,REFIID,IUnknown**);
+HRESULT STDMETHODCALLTYPE IEnumString_Next_Proxy(IEnumString*,ULONG,LPCSTR*,ULONG*);
+HRESULT STDMETHODCALLTYPE IEnumString_Next_Stub(IEnumString*,ULONG,LPCSTR*,ULONG*);
+HRESULT STDMETHODCALLTYPE IStream_Read_Proxy(IStream*,void*,ULONG,ULONG*);
+HRESULT STDMETHODCALLTYPE IStream_Read_Stub(IStream*,BYTE*,ULONG,ULONG*);
+HRESULT STDMETHODCALLTYPE IStream_Write_Proxy(IStream*,void*,ULONG,ULONG*);
+HRESULT STDMETHODCALLTYPE IStream_Write_Stub(IStream*,BYTE*,ULONG,ULONG*);
+HRESULT STDMETHODCALLTYPE IStream_Seek_Proxy(IStream*,LARGE_INTEGER,DWORD,ULARGE_INTEGER*);
+HRESULT STDMETHODCALLTYPE IStream_Seek_Stub(IStream*,LARGE_INTEGER,DWORD,ULARGE_INTEGER*);
+HRESULT STDMETHODCALLTYPE IStream_CopyTo_Proxy(IStream*,IStream*,ULARGE_INTEGER,ULARGE_INTEGER*,ULARGE_INTEGER*);
+HRESULT STDMETHODCALLTYPE IStream_CopyTo_Stub(IStream*,IStream*,ULARGE_INTEGER,ULARGE_INTEGER*,ULARGE_INTEGER*);
+HRESULT STDMETHODCALLTYPE IEnumSTATSTG_Next_Proxy(IEnumSTATSTG*,ULONG,STATSTG*,ULONG*);
+HRESULT STDMETHODCALLTYPE IEnumSTATSTG_Next_Stub(IEnumSTATSTG*,ULONG,STATSTG*,ULONG*);
+HRESULT STDMETHODCALLTYPE IStorage_OpenStream_Proxy(IStorage*,OLECHAR*,void*,DWORD,DWORD,IStream**);
+HRESULT STDMETHODCALLTYPE IStorage_OpenStream_Stub(IStorage*,OLECHAR*,unsigned long,BYTE*,DWORD,DWORD,IStream** );
+HRESULT STDMETHODCALLTYPE IStorage_EnumElements_Proxy(IStorage*,DWORD,void*,DWORD,IEnumSTATSTG**);
+HRESULT STDMETHODCALLTYPE IStorage_EnumElements_Stub(IStorage*,DWORD,unsigned long,BYTE*,DWORD,IEnumSTATSTG**);
+HRESULT STDMETHODCALLTYPE ILockBytes_ReadAt_Proxy(ILockBytes*,ULARGE_INTEGER,void*,ULONG,ULONG*);
+HRESULT STDMETHODCALLTYPE ILockBytes_ReadAt_Stub(ILockBytes*,ULARGE_INTEGER,BYTE*,ULONG,ULONG*);
+HRESULT STDMETHODCALLTYPE ILockBytes_WriteAt_Proxy(ILockBytes*,ULARGE_INTEGER,const void*,ULONG,ULONG*);
+HRESULT STDMETHODCALLTYPE ILockBytes_WriteAt_Stub(ILockBytes*,ULARGE_INTEGER,BYTE*,ULONG,ULONG*);
+#ifdef COBJMACROS
+#define IMarshal_QueryInterface(T,r,p) (T)->lpVtbl->QueryInterface(T,r,p)
+#define IMarshal_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IMarshal_Release(This) (This)->lpVtbl->Release(This)
+#define IMarshal_GetUnmarshalClass(T,r,pv,dw,pvD,m,pC) (T)->lpVtbl->GetUnmarshalClass(T,r,pv,dw,pvD,m,pC)
+#define IMarshal_GetMarshalSizeMax(T,r,pv,dw,pD,m,p) (T)->lpVtbl->GetMarshalSizeMax(T,r,pv,dw,pD,m,p)
+#define IMarshal_MarshalInterface(T,p,r,pv,dw,pvD,m) (T)->lpVtbl->MarshalInterface(T,p,r,pv,dw,pv,m)
+#define IMarshal_UnmarshalInterface(T,p,r,pp) (T)->lpVtbl->UnmarshalInterface(T,p,r,pp)
+#define IMarshal_ReleaseMarshalData(T,p) (T)->lpVtbl->ReleaseMarshalData(T,p)
+#define IMarshal_DisconnectObject(T,d) (T)->lpVtbl->DisconnectObject(T,d)
+#define IMalloc_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IMalloc_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IMalloc_Release(This) (This)->lpVtbl->Release(This)
+#define IMalloc_Alloc(This,cb) (This)->lpVtbl->Alloc(This,cb)
+#define IMalloc_Realloc(This,pv,cb) (This)->lpVtbl->Realloc(This,pv,cb)
+#define IMalloc_Free(This,pv) (This)->lpVtbl->Free(This,pv)
+#define IMalloc_GetSize(This,pv) (This)->lpVtbl->GetSize(This,pv)
+#define IMalloc_DidAlloc(This,pv) (This)->lpVtbl->DidAlloc(This,pv)
+#define IMalloc_HeapMinimize(This) (This)->lpVtbl->HeapMinimize(This)
+#define IMallocSpy_QueryInterface(T,r,p) (T)->lpVtbl->QueryInterface(T,r,p)
+#define IMallocSpy_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IMallocSpy_Release(This) (This)->lpVtbl->Release(This)
+#define IMallocSpy_PreAlloc(T,c) (T)->lpVtbl->PreAlloc(T,c)
+#define IMallocSpy_PostAlloc(This,p) (This)->lpVtbl->PostAlloc(This,p)
+#define IMallocSpy_PreFree(This,p,f) (This)->lpVtbl->PreFree(This,p,f)
+#define IMallocSpy_PostFree(This,fSpyed) (This)->lpVtbl->PostFree(This,fSpyed)
+#define IMallocSpy_PreRealloc(T,p,c,pp,f) (T)->lpVtbl->PreRealloc(T,p,c,pp,f)
+#define IMallocSpy_PostRealloc(T,p,f) (T)->lpVtbl->PostRealloc(T,p,f)
+#define IMallocSpy_PreGetSize(This,p,f) (This)->lpVtbl->PreGetSize(This,p,f)
+#define IMallocSpy_PostGetSize(This,cbActual,fSpyed) (This)->lpVtbl->PostGetSize(This,cbActual,fSpyed)
+#define IMallocSpy_PreDidAlloc(This,pRequest,fSpyed) (This)->lpVtbl->PreDidAlloc(This,pRequest,fSpyed)
+#define IMallocSpy_PostDidAlloc(This,pRequest,fSpyed,fActual) (This)->lpVtbl->PostDidAlloc(This,pRequest,fSpyed,fActual)
+#define IMallocSpy_PreHeapMinimize(T) (T)->lpVtbl->PreHeapMinimize(T)
+#define IMallocSpy_PostHeapMinimize(T) (T)->lpVtbl->PostHeapMinimize(T)
+#define IStdMarshalInfo_QueryInterface(T,r,p) (This)->lpVtbl->QueryInterface(T,r,p)
+#define IStdMarshalInfo_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IStdMarshalInfo_Release(This) (This)->lpVtbl->Release(This)
+#define IStdMarshalInfo_GetClassForHandler(This,D,p,C) (This)->lpVtbl->GetClassForHandler(This,D,p,C)
+#define IExternalConnection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IExternalConnection_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IExternalConnection_Release(This) (This)->lpVtbl->Release(This)
+#define IExternalConnection_AddConnection(T,e,r) (T)->lpVtbl->AddConnection(T,e,r)
+#define IExternalConnection_ReleaseConnection(This,e,r,f) (This)->lpVtbl->ReleaseConnection(This,e,r,f)
+#define IEnumUnknown_QueryInterface(T,r,p) (This)->lpVtbl->QueryInterface(T,r,p)
+#define IEnumUnknown_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IEnumUnknown_Release(This) (This)->lpVtbl->Release(This)
+#define IEnumUnknown_Next(This,celt,rgelt,p) (This)->lpVtbl->Next(This,celt,rgelt,p)
+#define IEnumUnknown_Skip(This,celt) (This)->lpVtbl->Skip(This,celt)
+#define IEnumUnknown_Reset(This) (This)->lpVtbl->Reset(This)
+#define IEnumUnknown_Clone(This,ppenum) (This)->lpVtbl->Clone(This,ppenum)
+#define IBindCtx_QueryInterface(T,r,p) (T)->lpVtbl->QueryInterface(T,r,p)
+#define IBindCtx_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IBindCtx_Release(This) (This)->lpVtbl->Release(This)
+#define IBindCtx_RegisterObjectBound(T,p) (T)->lpVtbl->RegisterObjectBound(T,p)
+#define IBindCtx_RevokeObjectBound(T,p) (T)->lpVtbl->RevokeObjectBound(T,p)
+#define IBindCtx_ReleaseBoundObjects(T) (T)->lpVtbl->ReleaseBoundObjects(T)
+#define IBindCtx_SetBindOptions(T,p) (T)->lpVtbl->SetBindOptions(T,p)
+#define IBindCtx_GetBindOptions(This,pbindopts) (This)->lpVtbl->GetBindOptions(This,pbindopts)
+#define IBindCtx_GetRunningObjectTable(This,pprot) (This)->lpVtbl->GetRunningObjectTable(This,pprot)
+#define IBindCtx_RegisterObjectParam(This,pszKey,punk) (This)->lpVtbl->RegisterObjectParam(This,pszKey,punk)
+#define IBindCtx_GetObjectParam(This,pszKey,ppunk) (This)->lpVtbl->GetObjectParam(This,pszKey,ppunk)
+#define IBindCtx_EnumObjectParam(This,ppenum) (This)->lpVtbl->EnumObjectParam(This,ppenum)
+#define IBindCtx_RevokeObjectParam(This,pszKey) (This)->lpVtbl->RevokeObjectParam(This,pszKey)
+#define IEnumMoniker_QueryInterface(T,r,p) (T)->lpVtbl->QueryInterface(T,r,p)
+#define IEnumMoniker_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IEnumMoniker_Release(This) (This)->lpVtbl->Release(This)
+#define IEnumMoniker_Next(This,celt,rgelt,pceltFetched) (This)->lpVtbl->Next(This,celt,rgelt,pceltFetched)
+#define IEnumMoniker_Skip(This,celt) (This)->lpVtbl->Skip(This,celt)
+#define IEnumMoniker_Reset(This) (This)->lpVtbl->Reset(This)
+#define IEnumMoniker_Clone(This,ppenum) (This)->lpVtbl->Clone(This,ppenum)
+#define IRunnableObject_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IRunnableObject_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IRunnableObject_Release(This) (This)->lpVtbl->Release(This)
+#define IRunnableObject_GetRunningClass(This,lpClsid) (This)->lpVtbl->GetRunningClass(This,lpClsid)
+#define IRunnableObject_Run(This,pbc) (This)->lpVtbl->Run(This,pbc)
+#define IRunnableObject_IsRunning(This) (This)->lpVtbl->IsRunning(This)
+#define IRunnableObject_LockRunning(This,fLock,fLastUnlockCloses) (This)->lpVtbl->LockRunning(This,fLock,fLastUnlockCloses)
+#define IRunnableObject_SetContainedObject(This,fContained) (This)->lpVtbl->SetContainedObject(This,fContained)
+#define IRunningObjectTable_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IRunningObjectTable_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IRunningObjectTable_Release(This) (This)->lpVtbl->Release(This)
+#define IRunningObjectTable_Register(This,grfFlags,punkObject,pmkObjectName,pdwRegister) (This)->lpVtbl->Register(This,grfFlags,punkObject,pmkObjectName,pdwRegister)
+#define IRunningObjectTable_Revoke(This,dwRegister) (This)->lpVtbl->Revoke(This,dwRegister)
+#define IRunningObjectTable_IsRunning(This,pmkObjectName) (This)->lpVtbl->IsRunning(This,pmkObjectName)
+#define IRunningObjectTable_GetObject(This,pmkObjectName,ppunkObject) (This)->lpVtbl->GetObject(This,pmkObjectName,ppunkObject)
+#define IRunningObjectTable_NoteChangeTime(This,dwRegister,pfiletime) (This)->lpVtbl->NoteChangeTime(This,dwRegister,pfiletime)
+#define IRunningObjectTable_GetTimeOfLastChange(This,pmkObjectName,pfiletime) (This)->lpVtbl->GetTimeOfLastChange(This,pmkObjectName,pfiletime)
+#define IRunningObjectTable_EnumRunning(This,ppenumMoniker) (This)->lpVtbl->EnumRunning(This,ppenumMoniker)
+#define IPersist_QueryInterface(T,r,p) (T)->lpVtbl->QueryInterface(T,r,p)
+#define IPersist_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IPersist_Release(This) (This)->lpVtbl->Release(This)
+#define IPersist_GetClassID(This,pClassID) (This)->lpVtbl->GetClassID(This,pClassID)
+#define IPersistStream_QueryInterface(T,r,p) (T)->lpVtbl->QueryInterface(T,r,p)
+#define IPersistStream_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IPersistStream_Release(This) (This)->lpVtbl->Release(This)
+#define IPersistStream_GetClassID(T,p) (T)->lpVtbl->GetClassID(T,p)
+#define IPersistStream_IsDirty(This) (This)->lpVtbl->IsDirty(This)
+#define IPersistStream_Load(This,pStm) (This)->lpVtbl->Load(This,pStm)
+#define IPersistStream_Save(T,p,f) (T)->lpVtbl->Save(T,p,f)
+#define IPersistStream_GetSizeMax(T,p) (T)->lpVtbl->GetSizeMax(T,p)
+#define IMoniker_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IMoniker_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IMoniker_Release(This) (This)->lpVtbl->Release(This)
+#define IMoniker_GetClassID(This,pClassID) (This)->lpVtbl->GetClassID(This,pClassID)
+#define IMoniker_IsDirty(This) (This)->lpVtbl->IsDirty(This)
+#define IMoniker_Load(This,pStm) (This)->lpVtbl->Load(This,pStm)
+#define IMoniker_Save(This,pStm,fClearDirty) (This)->lpVtbl->Save(This,pStm,fClearDirty)
+#define IMoniker_GetSizeMax(This,pcbSize) (This)->lpVtbl->GetSizeMax(This,pcbSize)
+#define IMoniker_BindToObject(T,p,pm,r,pp) (T)->lpVtbl->BindToObject(T,p,pm,r,pp)
+#define IMoniker_BindToStorage(This,pbc,pmkToLeft,riid,ppvObj) (This)->lpVtbl->BindToStorage(This,pbc,pmkToLeft,riid,ppvObj)
+#define IMoniker_Reduce(This,pbc,dwReduceHowFar,ppmkToLeft,ppmkReduced) (This)->lpVtbl->Reduce(This,pbc,dwReduceHowFar,ppmkToLeft,ppmkReduced)
+#define IMoniker_ComposeWith(This,pmkRight,fOnlyIfNotGeneric,ppmkComposite) (This)->lpVtbl->ComposeWith(This,pmkRight,fOnlyIfNotGeneric,ppmkComposite)
+#define IMoniker_Enum(T,f,pp) (T)->lpVtbl->Enum(T,f,pp)
+#define IMoniker_IsEqual(This,p) (This)->lpVtbl->IsEqual(This,p)
+#define IMoniker_Hash(This,pdwHash) (This)->lpVtbl->Hash(This,pdwHash)
+#define IMoniker_IsRunning(T,pbc,Left,N) (T)->lpVtbl->IsRunning(T,pbc,Left,N)
+#define IMoniker_GetTimeOfLastChange(This,pbc,pmkToLeft,pFileTime) (This)->lpVtbl->GetTimeOfLastChange(This,pbc,pmkToLeft,pFileTime)
+#define IMoniker_Inverse(This,ppmk) (This)->lpVtbl->Inverse(This,ppmk)
+#define IMoniker_CommonPrefixWith(This,pmkOther,ppmkPrefix) (This)->lpVtbl->CommonPrefixWith(This,pmkOther,ppmkPrefix)
+#define IMoniker_RelativePathTo(This,pmkOther,ppmkRelPath) (This)->lpVtbl->RelativePathTo(This,pmkOther,ppmkRelPath)
+#define IMoniker_GetDisplayName(This,pbc,pmkToLeft,ppszDisplayName) (This)->lpVtbl->GetDisplayName(This,pbc,pmkToLeft,ppszDisplayName)
+#define IMoniker_ParseDisplayName(This,pbc,pmkToLeft,pszDisplayName,pchEaten,ppmkOut) (This)->lpVtbl->ParseDisplayName(This,pbc,pmkToLeft,pszDisplayName,pchEaten,ppmkOut)
+#define IMoniker_IsSystemMoniker(This,pdwMksys) (This)->lpVtbl->IsSystemMoniker(This,pdwMksys)
+#define IROTData_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IROTData_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IROTData_Release(This) (This)->lpVtbl->Release(This)
+#define IROTData_GetComparisonData(This,pbData,cbMax,pcbData) (This)->lpVtbl->GetComparisonData(This,pbData,cbMax,pcbData)
+#define IEnumString_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IEnumString_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IEnumString_Release(This) (This)->lpVtbl->Release(This)
+#define IEnumString_Next(This,celt,rgelt,pceltFetched) (This)->lpVtbl->Next(This,celt,rgelt,pceltFetched)
+#define IEnumString_Skip(This,celt) (This)->lpVtbl->Skip(This,celt)
+#define IEnumString_Reset(This) (This)->lpVtbl->Reset(This)
+#define IEnumString_Clone(This,ppenum) (This)->lpVtbl->Clone(This,ppenum)
+#define IStream_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IStream_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IStream_Release(This) (This)->lpVtbl->Release(This)
+#define IStream_Read(This,pv,cb,pcbRead) (This)->lpVtbl->Read(This,pv,cb,pcbRead)
+#define IStream_Write(This,pv,cb,pcbWritten) (This)->lpVtbl->Write(This,pv,cb,pcbWritten)
+#define IStream_Seek(This,dlibMove,dwOrigin,plibNewPosition) (This)->lpVtbl->Seek(This,dlibMove,dwOrigin,plibNewPosition)
+#define IStream_SetSize(This,libNewSize) (This)->lpVtbl->SetSize(This,libNewSize)
+#define IStream_CopyTo(This,pstm,cb,pcbRead,pcbWritten) (This)->lpVtbl->CopyTo(This,pstm,cb,pcbRead,pcbWritten)
+#define IStream_Commit(This,grfCommitFlags) (This)->lpVtbl->Commit(This,grfCommitFlags)
+#define IStream_Revert(This) (This)->lpVtbl->Revert(This)
+#define IStream_LockRegion(This,libOffset,cb,dwLockType) (This)->lpVtbl->LockRegion(This,libOffset,cb,dwLockType)
+#define IStream_UnlockRegion(This,libOffset,cb,dwLockType) (This)->lpVtbl->UnlockRegion(This,libOffset,cb,dwLockType)
+#define IStream_Stat(This,pstatstg,grfStatFlag) (This)->lpVtbl->Stat(This,pstatstg,grfStatFlag)
+#define IStream_Clone(This,ppstm) (This)->lpVtbl->Clone(This,ppstm)
+#define IEnumSTATSTG_QueryInterface(T,r,p) (T)->lpVtbl->QueryInterface(T,r,p)
+#define IEnumSTATSTG_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IEnumSTATSTG_Release(This) (This)->lpVtbl->Release(This)
+#define IEnumSTATSTG_Next(T,c,r,p) (T)->lpVtbl->Next(T,c,r,p)
+#define IEnumSTATSTG_Skip(This,celt) (This)->lpVtbl->Skip(This,celt)
+#define IEnumSTATSTG_Reset(This) (This)->lpVtbl->Reset(This)
+#define IEnumSTATSTG_Clone(This,ppenum) (This)->lpVtbl->Clone(This,ppenum)
+#define IStorage_QueryInterface(T,r,p) (T)->lpVtbl->QueryInterface(T,r,p)
+#define IStorage_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IStorage_Release(This) (This)->lpVtbl->Release(This)
+#define IStorage_CreateStream(T,p,g,r1,r2,pp) (T)->lpVtbl->CreateStream(T,p,g,r1,r2,pp)
+#define IStorage_OpenStream(T,p,r1,g,r2,pp) (T)->lpVtbl->OpenStream(T,p,r1,g,r2,pp)
+#define IStorage_CreateStorage(T,p,g,d,r2,pp) (This)->lpVtbl->CreateStorage(T,p,g,d,r2,pp)
+#define IStorage_OpenStorage(This,pwcsName,pstgPriority,grfMode,snbExclude,reserved,ppstg) (This)->lpVtbl->OpenStorage(This,pwcsName,pstgPriority,grfMode,snbExclude,reserved,ppstg)
+#define IStorage_CopyTo(This,ciidExclude,rgiidExclude,snbExclude,pstgDest) (This)->lpVtbl->CopyTo(This,ciidExclude,rgiidExclude,snbExclude,pstgDest)
+#define IStorage_MoveElementTo(This,pwcsName,pstgDest,pwcsNewName,grfFlags) (This)->lpVtbl->MoveElementTo(This,pwcsName,pstgDest,pwcsNewName,grfFlags)
+#define IStorage_Commit(This,g) (This)->lpVtbl->Commit(This,g)
+#define IStorage_Revert(This) (This)->lpVtbl->Revert(This)
+#define IStorage_EnumElements(This,reserved1,reserved2,reserved3,ppenum) (This)->lpVtbl->EnumElements(This,reserved1,reserved2,reserved3,ppenum)
+#define IStorage_DestroyElement(This,pwcsName) (This)->lpVtbl->DestroyElement(This,pwcsName)
+#define IStorage_RenameElement(This,pwcsOldName,pwcsNewName) (This)->lpVtbl->RenameElement(This,pwcsOldName,pwcsNewName)
+#define IStorage_SetElementTimes(This,pwcsName,pctime,patime,pmtime) (This)->lpVtbl->SetElementTimes(This,pwcsName,pctime,patime,pmtime)
+#define IStorage_SetClass(This,clsid) (This)->lpVtbl->SetClass(This,clsid)
+#define IStorage_SetStateBits(This,grfStateBits,grfMask) (This)->lpVtbl->SetStateBits(This,grfStateBits,grfMask)
+#define IStorage_Stat(This,p,g) (This)->lpVtbl->Stat(This,p,g)
+#define IPersistFile_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IPersistFile_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IPersistFile_Release(This) (This)->lpVtbl->Release(This)
+#define IPersistFile_GetClassID(This,pClassID) (This)->lpVtbl->GetClassID(This,pClassID)
+#define IPersistFile_IsDirty(This) (This)->lpVtbl->IsDirty(This)
+#define IPersistFile_Load(This,pszFileName,dwMode) (This)->lpVtbl->Load(This,pszFileName,dwMode)
+#define IPersistFile_Save(This,pszFileName,fRemember) (This)->lpVtbl->Save(This,pszFileName,fRemember)
+#define IPersistFile_SaveCompleted(This,pszFileName) (This)->lpVtbl->SaveCompleted(This,pszFileName)
+#define IPersistFile_GetCurFile(This,ppszFileName) (This)->lpVtbl->GetCurFile(This,ppszFileName)
+#define IPersistStorage_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IPersistStorage_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IPersistStorage_Release(This) (This)->lpVtbl->Release(This)
+#define IPersistStorage_GetClassID(This,pClassID) (This)->lpVtbl->GetClassID(This,pClassID)
+#define IPersistStorage_IsDirty(This) (This)->lpVtbl->IsDirty(This)
+#define IPersistStorage_InitNew(This,pStg) (This)->lpVtbl->InitNew(This,pStg)
+#define IPersistStorage_Load(This,pStg) (This)->lpVtbl->Load(This,pStg)
+#define IPersistStorage_Save(This,pStgSave,fSameAsLoad) (This)->lpVtbl->Save(This,pStgSave,fSameAsLoad)
+#define IPersistStorage_SaveCompleted(This,pStgNew) (This)->lpVtbl->SaveCompleted(This,pStgNew)
+#define IPersistStorage_HandsOffStorage(This) (This)->lpVtbl->HandsOffStorage(This)
+#define ILockBytes_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define ILockBytes_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define ILockBytes_Release(This) (This)->lpVtbl->Release(This)
+#define ILockBytes_ReadAt(This,ulOffset,pv,cb,pcbRead) (This)->lpVtbl->ReadAt(This,ulOffset,pv,cb,pcbRead)
+#define ILockBytes_WriteAt(This,ulOffset,pv,cb,pcbWritten) (This)->lpVtbl->WriteAt(This,ulOffset,pv,cb,pcbWritten)
+#define ILockBytes_Flush(This) (This)->lpVtbl->Flush(This)
+#define ILockBytes_SetSize(This,cb) (This)->lpVtbl->SetSize(This,cb)
+#define ILockBytes_LockRegion(This,libOffset,cb,dwLockType) (This)->lpVtbl->LockRegion(This,libOffset,cb,dwLockType)
+#define ILockBytes_UnlockRegion(This,libOffset,cb,dwLockType) (This)->lpVtbl->UnlockRegion(This,libOffset,cb,dwLockType)
+#define ILockBytes_Stat(This,pstatstg,grfStatFlag) (This)->lpVtbl->Stat(This,pstatstg,grfStatFlag)
+#define IEnumFORMATETC_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IEnumFORMATETC_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IEnumFORMATETC_Release(This) (This)->lpVtbl->Release(This)
+#define IEnumFORMATETC_Next(This,celt,rgelt,pceltFetched) (This)->lpVtbl->Next(This,celt,rgelt,pceltFetched)
+#define IEnumFORMATETC_Skip(This,celt) (This)->lpVtbl->Skip(This,celt)
+#define IEnumFORMATETC_Reset(This) (This)->lpVtbl->Reset(This)
+#define IEnumFORMATETC_Clone(This,ppenum) (This)->lpVtbl->Clone(This,ppenum)
+#define IEnumSTATDATA_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IEnumSTATDATA_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IEnumSTATDATA_Release(This) (This)->lpVtbl->Release(This)
+#define IEnumSTATDATA_Next(This,celt,rgelt,pceltFetched) (This)->lpVtbl->Next(This,celt,rgelt,pceltFetched)
+#define IEnumSTATDATA_Skip(This,celt) (This)->lpVtbl->Skip(This,celt)
+#define IEnumSTATDATA_Reset(This) (This)->lpVtbl->Reset(This)
+#define IEnumSTATDATA_Clone(This,ppenum) (This)->lpVtbl->Clone(This,ppenum)
+#define IRootStorage_QueryInterface(T,r,O) (T)->lpVtbl->QueryInterface(T,r,O)
+#define IRootStorage_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IRootStorage_Release(This) (This)->lpVtbl->Release(This)
+#define IRootStorage_SwitchToFile(This,pszFile) (This)->lpVtbl->SwitchToFile(This,pszFile)
+#define IAdviseSink_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IAdviseSink_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IAdviseSink_Release(This) (This)->lpVtbl->Release(This)
+#define IAdviseSink_OnDataChange(This,pFormatetc,pStgmed) (This)->lpVtbl->OnDataChange(This,pFormatetc,pStgmed)
+#define IAdviseSink_OnViewChange(This,dwAspect,lindex) (This)->lpVtbl->OnViewChange(This,dwAspect,lindex)
+#define IAdviseSink_OnRename(This,pmk) (This)->lpVtbl->OnRename(This,pmk)
+#define IAdviseSink_OnSave(This) (This)->lpVtbl->OnSave(This)
+#define IAdviseSink_OnClose(This) (This)->lpVtbl->OnClose(This)
+#define IAdviseSink2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IAdviseSink2_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IAdviseSink2_Release(This) (This)->lpVtbl->Release(This)
+#define IAdviseSink2_OnDataChange(This,pFormatetc,pStgmed) (This)->lpVtbl->OnDataChange(This,pFormatetc,pStgmed)
+#define IAdviseSink2_OnViewChange(This,dwAspect,lindex) (This)->lpVtbl->OnViewChange(This,dwAspect,lindex)
+#define IAdviseSink2_OnRename(This,pmk) (This)->lpVtbl->OnRename(This,pmk)
+#define IAdviseSink2_OnSave(This) (This)->lpVtbl->OnSave(This)
+#define IAdviseSink2_OnClose(This) (This)->lpVtbl->OnClose(This)
+#define IAdviseSink2_OnLinkSrcChange(This,pmk) (This)->lpVtbl->OnLinkSrcChange(This,pmk)
+#define IDataObject_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDataObject_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDataObject_Release(This) (This)->lpVtbl->Release(This)
+#define IDataObject_GetData(This,pformatetcIn,pmedium) (This)->lpVtbl->GetData(This,pformatetcIn,pmedium)
+#define IDataObject_GetDataHere(This,pformatetc,pmedium) (This)->lpVtbl->GetDataHere(This,pformatetc,pmedium)
+#define IDataObject_QueryGetData(This,pformatetc) (This)->lpVtbl->QueryGetData(This,pformatetc)
+#define IDataObject_GetCanonicalFormatEtc(This,pformatectIn,pformatetcOut) (This)->lpVtbl->GetCanonicalFormatEtc(This,pformatectIn,pformatetcOut)
+#define IDataObject_SetData(This,pformatetc,pmedium,fRelease) (This)->lpVtbl->SetData(This,pformatetc,pmedium,fRelease)
+#define IDataObject_EnumFormatEtc(This,dwDirection,ppenumFormatEtc) (This)->lpVtbl->EnumFormatEtc(This,dwDirection,ppenumFormatEtc)
+#define IDataObject_DAdvise(This,pformatetc,advf,pAdvSink,pdwConnection) (This)->lpVtbl->DAdvise(This,pformatetc,advf,pAdvSink,pdwConnection)
+#define IDataObject_DUnadvise(This,dwConnection) (This)->lpVtbl->DUnadvise(This,dwConnection)
+#define IDataObject_EnumDAdvise(This,ppenumAdvise) (This)->lpVtbl->EnumDAdvise(This,ppenumAdvise)
+#define IDataAdviseHolder_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDataAdviseHolder_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDataAdviseHolder_Release(This) (This)->lpVtbl->Release(This)
+#define IDataAdviseHolder_Advise(This,pDataObject,pFetc,advf,pAdvise,pdwConnection) (This)->lpVtbl->Advise(This,pDataObject,pFetc,advf,pAdvise,pdwConnection)
+#define IDataAdviseHolder_Unadvise(This,dwConnection) (This)->lpVtbl->Unadvise(This,dwConnection)
+#define IDataAdviseHolder_EnumAdvise(This,ppenumAdvise) (This)->lpVtbl->EnumAdvise(This,ppenumAdvise)
+#define IDataAdviseHolder_SendOnDataChange(This,pDataObject,dwReserved,advf) (This)->lpVtbl->SendOnDataChange(This,pDataObject,dwReserved,advf)
+#define IMessageFilter_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IMessageFilter_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IMessageFilter_Release(This) (This)->lpVtbl->Release(This)
+#define IMessageFilter_HandleInComingCall(T,d,h,dw,lp) (T)->lpVtbl->HandleInComingCall(T,d,h,dw,lp)
+#define IMessageFilter_RetryRejectedCall(s,C,T,R) (s)->lpVtbl->RetryRejectedCall(s,C,T,R)
+#define IMessageFilter_MessagePending(s,C,T,P) (s)->lpVtbl->MessagePending(This,C,T,P)
+#define IRpcChannelBuffer_QueryInterface(T,r,p) (T)->lpVtbl->QueryInterface(T,r,p)
+#define IRpcChannelBuffer_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IRpcChannelBuffer_Release(This) (This)->lpVtbl->Release(This)
+#define IRpcChannelBuffer_GetBuffer(This,pMessage,riid) (This)->lpVtbl->GetBuffer(This,pMessage,riid)
+#define IRpcChannelBuffer_SendReceive(T,p,pS) (T)->lpVtbl->SendReceive(T,p,pS)
+#define IRpcChannelBuffer_FreeBuffer(T,p) (T)->lpVtbl->FreeBuffer(T,p)
+#define IRpcChannelBuffer_GetDestCtx(This,pdwDestContext,ppvDestContext) (This)->lpVtbl->GetDestCtx(This,pdwDestContext,ppvDestContext)
+#define IRpcChannelBuffer_IsConnected(This) (This)->lpVtbl->IsConnected(This)
+#define IRpcProxyBuffer_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IRpcProxyBuffer_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IRpcProxyBuffer_Release(This) (This)->lpVtbl->Release(This)
+#define IRpcProxyBuffer_Connect(This,pRpcChannelBuffer) (This)->lpVtbl->Connect(This,pRpcChannelBuffer)
+#define IRpcProxyBuffer_Disconnect(This) (This)->lpVtbl->Disconnect(This)
+#define IRpcStubBuffer_QueryInterface(T,r,pp) (T)->lpVtbl->QueryInterface(T,r,pp)
+#define IRpcStubBuffer_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IRpcStubBuffer_Release(This) (This)->lpVtbl->Release(This)
+#define IRpcStubBuffer_Connect(This,p) (This)->lpVtbl->Connect(This,p)
+#define IRpcStubBuffer_Disconnect(This) (This)->lpVtbl->Disconnect(This)
+#define IRpcStubBuffer_Invoke(T,_prpcmsg,_p) (T)->lpVtbl->Invoke(This,_prpcmsg,_p)
+#define IRpcStubBuffer_IsIIDSupported(T,d) (T)->lpVtbl->IsIIDSupported(T,d)
+#define IRpcStubBuffer_CountRefs(This) (This)->lpVtbl->CountRefs(This)
+#define IRpcStubBuffer_DebugServerQueryInterface(T,p) (T)->lpVtbl->DebugServerQueryInterface(T,p)
+#define IRpcStubBuffer_DebugServerRelease(T,p) (T)->lpVtbl->DebugServerRelease(T,p)
+#define IPSFactoryBuffer_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IPSFactoryBuffer_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IPSFactoryBuffer_Release(This) (This)->lpVtbl->Release(This)
+#define IPSFactoryBuffer_CreateProxy(T,U,r,P,p) (T)->lpVtbl->CreateProxy(T,U,r,P,p)
+#define IPSFactoryBuffer_CreateStub(T,r,U,p) (T)->lpVtbl->CreateStub(T,r,U,p)
+#endif /* COBJMACROS */
+
+#endif
diff --git a/winsup/w32api/include/ocidl.h b/winsup/w32api/include/ocidl.h
new file mode 100644
index 000000000..2618d841d
--- /dev/null
+++ b/winsup/w32api/include/ocidl.h
@@ -0,0 +1,7 @@
+#ifndef _OCIDL_H
+#define _OCIDL_H
+
+#include <ole2.h>
+#include <olectl.h>
+
+#endif
diff --git a/winsup/w32api/include/ole.h b/winsup/w32api/include/ole.h
new file mode 100644
index 000000000..1aa3f0245
--- /dev/null
+++ b/winsup/w32api/include/ole.h
@@ -0,0 +1,304 @@
+#ifndef _OLE_H
+#define _OLE_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+#ifdef STRICT
+#define OLE_LPCSTR LPCSTR
+#define OLE_CONST const
+#else
+#define OLE_LPCSTR LPSTR
+#define OLE_CONST
+#endif
+#define LRESULT LONG
+#define HGLOBAL HANDLE
+#define OT_LINK 1L
+#define OT_EMBEDDED 2L
+#define OT_STATIC 3L
+#define OLEVERB_PRIMARY 0
+#define OF_SET 1
+#define OF_GET 2
+#define OF_HANDLER 4
+
+typedef struct _OLETARGETDEVICE {
+ USHORT otdDeviceNameOffset;
+ USHORT otdDriverNameOffset;
+ USHORT otdPortNameOffset;
+ USHORT otdExtDevmodeOffset;
+ USHORT otdExtDevmodeSize;
+ USHORT otdEnvironmentOffset;
+ USHORT otdEnvironmentSize;
+ BYTE otdData[1];
+} OLETARGETDEVICE;
+typedef OLETARGETDEVICE *LPOLETARGETDEVICE;
+typedef enum {
+OLE_OK,
+OLE_WAIT_FOR_RELEASE,
+OLE_BUSY,
+OLE_ERROR_PROTECT_ONLY,
+OLE_ERROR_MEMORY,
+OLE_ERROR_STREAM,
+OLE_ERROR_STATIC,
+OLE_ERROR_BLANK,
+OLE_ERROR_DRAW,
+OLE_ERROR_METAFILE,
+OLE_ERROR_ABORT,
+OLE_ERROR_CLIPBOARD,
+OLE_ERROR_FORMAT,
+OLE_ERROR_OBJECT,
+OLE_ERROR_OPTION,
+OLE_ERROR_PROTOCOL,
+OLE_ERROR_ADDRESS,
+OLE_ERROR_NOT_EQUAL,
+OLE_ERROR_HANDLE,
+OLE_ERROR_GENERIC,
+OLE_ERROR_CLASS,
+OLE_ERROR_SYNTAX,
+OLE_ERROR_DATATYPE,
+OLE_ERROR_PALETTE,
+OLE_ERROR_NOT_LINK,
+OLE_ERROR_NOT_EMPTY,
+OLE_ERROR_SIZE,
+OLE_ERROR_DRIVE,
+OLE_ERROR_NETWORK,
+OLE_ERROR_NAME,
+OLE_ERROR_TEMPLATE,
+OLE_ERROR_NEW,
+OLE_ERROR_EDIT,
+OLE_ERROR_OPEN,
+OLE_ERROR_NOT_OPEN,
+OLE_ERROR_LAUNCH,
+OLE_ERROR_COMM,
+OLE_ERROR_TERMINATE,
+OLE_ERROR_COMMAND,
+OLE_ERROR_SHOW,
+OLE_ERROR_DOVERB,
+OLE_ERROR_ADVISE_NATIVE,
+OLE_ERROR_ADVISE_PICT,
+OLE_ERROR_ADVISE_RENAME,
+OLE_ERROR_POKE_NATIVE,
+OLE_ERROR_REQUEST_NATIVE,
+OLE_ERROR_REQUEST_PICT,
+OLE_ERROR_SERVER_BLOCKED,
+OLE_ERROR_REGISTRATION,
+OLE_ERROR_ALREADY_REGISTERED,
+OLE_ERROR_TASK,
+OLE_ERROR_OUTOFDATE,
+OLE_ERROR_CANT_UPDATE_CLIENT,
+OLE_ERROR_UPDATE,
+OLE_ERROR_SETDATA_FORMAT,
+OLE_ERROR_STATIC_FROM_OTHER_OS,
+OLE_ERROR_FILE_VER,
+OLE_WARN_DELETE_DATA = 1000
+} OLESTATUS;
+typedef enum {
+ OLE_CHANGED,
+ OLE_SAVED,
+ OLE_CLOSED,
+ OLE_RENAMED,
+ OLE_QUERY_PAINT,
+ OLE_RELEASE,
+ OLE_QUERY_RETRY
+} OLE_NOTIFICATION;
+typedef enum {
+ OLE_NONE,
+ OLE_DELETE,
+ OLE_LNKPASTE,
+ OLE_EMBPASTE,
+ OLE_SHOW,
+ OLE_RUN,
+ OLE_ACTIVATE,
+ OLE_UPDATE,
+ OLE_CLOSE,
+ OLE_RECONNECT,
+ OLE_SETUPDATEOPTIONS,
+ OLE_SERVERUNLAUNCH,
+ OLE_LOADFROMSTREAM,
+ OLE_SETDATA,
+ OLE_REQUESTDATA,
+ OLE_OTHER,
+ OLE_CREATE,
+ OLE_CREATEFROMTEMPLATE,
+ OLE_CREATELINKFROMFILE,
+ OLE_COPYFROMLNK,
+ OLE_CREATEFROMFILE,
+ OLE_CREATEINVISIBLE
+} OLE_RELEASE_METHOD;
+typedef enum {
+ olerender_none,
+ olerender_draw,
+ olerender_format
+ } OLEOPT_RENDER;
+typedef WORD OLECLIPFORMAT;
+typedef enum {
+ oleupdate_always,
+ oleupdate_onsave,
+#ifdef OLE_INTERNAL
+ oleupdate_oncall,
+ oleupdate_onclose
+#else
+ oleupdate_oncall
+#endif
+} OLEOPT_UPDATE;
+typedef HANDLE HOBJECT;
+typedef LONG LHSERVER;
+typedef LONG LHCLIENTDOC;
+typedef LONG LHSERVERDOC;
+typedef struct _OLEOBJECT *LPOLEOBJECT;
+typedef struct _OLESTREAM *LPOLESTREAM;
+typedef struct _OLECLIENT *LPOLECLIENT;
+typedef struct _OLEOBJECTVTBL {
+ void *(CALLBACK* QueryProtocol)(LPOLEOBJECT,OLE_LPCSTR);
+ OLESTATUS (CALLBACK* Release)(LPOLEOBJECT);
+ OLESTATUS (CALLBACK* Show)(LPOLEOBJECT,BOOL);
+ OLESTATUS (CALLBACK* DoVerb)(LPOLEOBJECT,UINT,BOOL,BOOL);
+ OLESTATUS (CALLBACK* GetData)(LPOLEOBJECT,OLECLIPFORMAT,HANDLE*);
+ OLESTATUS (CALLBACK* SetData)(LPOLEOBJECT,OLECLIPFORMAT,HANDLE);
+ OLESTATUS (CALLBACK* SetTargetDevice)(LPOLEOBJECT,HGLOBAL);
+ OLESTATUS (CALLBACK* SetBounds)(LPOLEOBJECT,OLE_CONST RECT*);
+ OLECLIPFORMAT (CALLBACK* EnumFormats)(LPOLEOBJECT,OLECLIPFORMAT);
+ OLESTATUS (CALLBACK* SetColorScheme)(LPOLEOBJECT,OLE_CONST LOGPALETTE*);
+#ifndef SERVERONLY
+ OLESTATUS (CALLBACK* Delete)(LPOLEOBJECT);
+ OLESTATUS (CALLBACK* SetHostNames)(LPOLEOBJECT,OLE_LPCSTR,OLE_LPCSTR);
+ OLESTATUS (CALLBACK* SaveToStream)(LPOLEOBJECT,LPOLESTREAM);
+ OLESTATUS (CALLBACK* Clone)(LPOLEOBJECT,LPOLECLIENT,LHCLIENTDOC,OLE_LPCSTR,LPOLEOBJECT*);
+ OLESTATUS (CALLBACK* CopyFromLink)(LPOLEOBJECT,LPOLECLIENT,LHCLIENTDOC,OLE_LPCSTR,LPOLEOBJECT*);
+ OLESTATUS (CALLBACK* Equal)(LPOLEOBJECT,LPOLEOBJECT);
+ OLESTATUS (CALLBACK* CopyToClipboard)(LPOLEOBJECT);
+ OLESTATUS (CALLBACK* Draw)(LPOLEOBJECT,HDC,OLE_CONST RECT*,OLE_CONST RECT*,HDC);
+ OLESTATUS (CALLBACK* Activate)(LPOLEOBJECT,UINT,BOOL,BOOL,HWND,OLE_CONST RECT*);
+ OLESTATUS (CALLBACK* Execute)(LPOLEOBJECT,HGLOBAL,UINT);
+ OLESTATUS (CALLBACK* Close)(LPOLEOBJECT);
+ OLESTATUS (CALLBACK* Update)(LPOLEOBJECT);
+ OLESTATUS (CALLBACK* Reconnect)(LPOLEOBJECT);
+ OLESTATUS (CALLBACK* ObjectConvert)(LPOLEOBJECT,OLE_LPCSTR,LPOLECLIENT,LHCLIENTDOC,OLE_LPCSTR,LPOLEOBJECT*);
+ OLESTATUS (CALLBACK* GetLinkUpdateOptions)(LPOLEOBJECT,OLEOPT_UPDATE*);
+ OLESTATUS (CALLBACK* SetLinkUpdateOptions)(LPOLEOBJECT,OLEOPT_UPDATE);
+ OLESTATUS (CALLBACK* Rename)(LPOLEOBJECT,OLE_LPCSTR);
+ OLESTATUS (CALLBACK* QueryName)(LPOLEOBJECT,LPSTR,UINT*);
+ OLESTATUS (CALLBACK* QueryType)(LPOLEOBJECT,LONG*);
+ OLESTATUS (CALLBACK* QueryBounds)(LPOLEOBJECT,RECT*);
+ OLESTATUS (CALLBACK* QuerySize)(LPOLEOBJECT,DWORD*);
+ OLESTATUS (CALLBACK* QueryOpen)(LPOLEOBJECT);
+ OLESTATUS (CALLBACK* QueryOutOfDate)(LPOLEOBJECT);
+ OLESTATUS (CALLBACK* QueryReleaseStatus)(LPOLEOBJECT);
+ OLESTATUS (CALLBACK* QueryReleaseError)(LPOLEOBJECT);
+ OLE_RELEASE_METHOD (CALLBACK* QueryReleaseMethod)(LPOLEOBJECT);
+ OLESTATUS (CALLBACK* RequestData)(LPOLEOBJECT,OLECLIPFORMAT);
+ OLESTATUS (CALLBACK* ObjectLong)(LPOLEOBJECT,UINT,LONG*);
+ OLESTATUS (CALLBACK* ChangeData)(LPOLEOBJECT,HANDLE,LPOLECLIENT,BOOL);
+#endif
+} OLEOBJECTVTBL;
+typedef OLEOBJECTVTBL*LPOLEOBJECTVTBL;
+#ifndef OLE_INTERNAL
+typedef struct _OLEOBJECT { LPOLEOBJECTVTBL lpvtbl; } OLEOBJECT;
+#endif
+typedef struct _OLECLIENTVTBL { int (CALLBACK* CallBack)(LPOLECLIENT,OLE_NOTIFICATION,LPOLEOBJECT); } OLECLIENTVTBL;
+typedef OLECLIENTVTBL *LPOLECLIENTVTBL;
+typedef struct _OLECLIENT { LPOLECLIENTVTBL lpvtbl; } OLECLIENT;
+typedef struct _OLESTREAMVTBL {
+ DWORD (CALLBACK* Get)(LPOLESTREAM,void*,DWORD);
+ DWORD (CALLBACK* Put)(LPOLESTREAM,OLE_CONST void*,DWORD);
+} OLESTREAMVTBL;
+typedef OLESTREAMVTBL *LPOLESTREAMVTBL;
+typedef struct _OLESTREAM { LPOLESTREAMVTBL lpstbl; } OLESTREAM;
+typedef enum {
+ OLE_SERVER_MULTI,
+ OLE_SERVER_SINGLE
+} OLE_SERVER_USE;
+typedef struct _OLESERVER *LPOLESERVER;
+typedef struct _OLESERVERDOC *LPOLESERVERDOC;
+typedef struct _OLESERVERVTBL {
+ OLESTATUS (CALLBACK* Open)(LPOLESERVER,LHSERVERDOC,OLE_LPCSTR,LPOLESERVERDOC*);
+ OLESTATUS (CALLBACK* Create)(LPOLESERVER,LHSERVERDOC,OLE_LPCSTR,OLE_LPCSTR,LPOLESERVERDOC*);
+ OLESTATUS (CALLBACK* CreateFromTemplate)(LPOLESERVER,LHSERVERDOC,OLE_LPCSTR,OLE_LPCSTR,OLE_LPCSTR,LPOLESERVERDOC*);
+ OLESTATUS (CALLBACK* Edit)(LPOLESERVER,LHSERVERDOC,OLE_LPCSTR,OLE_LPCSTR,LPOLESERVERDOC*);
+ OLESTATUS (CALLBACK* Exit)(LPOLESERVER);
+ OLESTATUS (CALLBACK* Release)(LPOLESERVER);
+ OLESTATUS (CALLBACK* Execute)(LPOLESERVER,HGLOBAL);
+} OLESERVERVTBL;
+typedef OLESERVERVTBL *LPOLESERVERVTBL;
+typedef struct _OLESERVER { LPOLESERVERVTBL lpvtbl; } OLESERVER;
+typedef struct _OLESERVERDOCVTBL {
+ OLESTATUS (CALLBACK* Save)(LPOLESERVERDOC);
+ OLESTATUS (CALLBACK* Close)(LPOLESERVERDOC);
+ OLESTATUS (CALLBACK* SetHostNames)(LPOLESERVERDOC,OLE_LPCSTR,OLE_LPCSTR);
+ OLESTATUS (CALLBACK* SetDocDimensions)(LPOLESERVERDOC,OLE_CONST RECT*);
+ OLESTATUS (CALLBACK* GetObject)(LPOLESERVERDOC,OLE_LPCSTR,LPOLEOBJECT*,LPOLECLIENT);
+ OLESTATUS (CALLBACK* Release)(LPOLESERVERDOC);
+ OLESTATUS (CALLBACK* SetColorScheme)(LPOLESERVERDOC,OLE_CONST LOGPALETTE*);
+ OLESTATUS (CALLBACK* Execute)(LPOLESERVERDOC,HGLOBAL);
+} OLESERVERDOCVTBL;
+typedef OLESERVERDOCVTBL *LPOLESERVERDOCVTBL;
+typedef struct _OLESERVERDOC { LPOLESERVERDOCVTBL lpvtbl; } OLESERVERDOC;
+OLESTATUS WINAPI OleDelete(LPOLEOBJECT);
+OLESTATUS WINAPI OleRelease(LPOLEOBJECT);
+OLESTATUS WINAPI OleSaveToStream(LPOLEOBJECT,LPOLESTREAM);
+OLESTATUS WINAPI OleEqual(LPOLEOBJECT,LPOLEOBJECT );
+OLESTATUS WINAPI OleCopyToClipboard(LPOLEOBJECT);
+OLESTATUS WINAPI OleSetHostNames(LPOLEOBJECT,LPCSTR,LPCSTR);
+OLESTATUS WINAPI OleSetTargetDevice(LPOLEOBJECT,HGLOBAL);
+OLESTATUS WINAPI OleSetBounds(LPOLEOBJECT,LPCRECT);
+OLESTATUS WINAPI OleSetColorScheme(LPOLEOBJECT,const LOGPALETTE*);
+OLESTATUS WINAPI OleQueryBounds(LPOLEOBJECT,RECT*);
+OLESTATUS WINAPI OleQuerySize(LPOLEOBJECT,DWORD*);
+OLESTATUS WINAPI OleDraw(LPOLEOBJECT,HDC,LPCRECT,LPCRECT,HDC);
+OLESTATUS WINAPI OleQueryOpen(LPOLEOBJECT);
+OLESTATUS WINAPI OleActivate(LPOLEOBJECT,UINT,BOOL,BOOL,HWND,LPCRECT);
+OLESTATUS WINAPI OleExecute(LPOLEOBJECT,HGLOBAL,UINT);
+OLESTATUS WINAPI OleClose(LPOLEOBJECT);
+OLESTATUS WINAPI OleUpdate(LPOLEOBJECT);
+OLESTATUS WINAPI OleReconnect(LPOLEOBJECT);
+OLESTATUS WINAPI OleGetLinkUpdateOptions(LPOLEOBJECT,OLEOPT_UPDATE*);
+OLESTATUS WINAPI OleSetLinkUpdateOptions(LPOLEOBJECT,OLEOPT_UPDATE);
+void *WINAPI OleQueryProtocol(LPOLEOBJECT,LPCSTR);
+OLESTATUS WINAPI OleQueryReleaseStatus(LPOLEOBJECT);
+OLESTATUS WINAPI OleQueryReleaseError(LPOLEOBJECT);
+OLE_RELEASE_METHOD WINAPI OleQueryReleaseMethod(LPOLEOBJECT);
+OLESTATUS WINAPI OleQueryType(LPOLEOBJECT,LONG*);
+DWORD WINAPI OleQueryClientVersion(void);
+DWORD WINAPI OleQueryServerVersion(void);
+OLECLIPFORMAT WINAPI OleEnumFormats(LPOLEOBJECT,OLECLIPFORMAT);
+OLESTATUS WINAPI OleGetData(LPOLEOBJECT,OLECLIPFORMAT,HANDLE*);
+OLESTATUS WINAPI OleSetData(LPOLEOBJECT,OLECLIPFORMAT,HANDLE);
+OLESTATUS WINAPI OleQueryOutOfDate(LPOLEOBJECT);
+OLESTATUS WINAPI OleRequestData(LPOLEOBJECT,OLECLIPFORMAT);
+OLESTATUS WINAPI OleQueryLinkFromClip(LPCSTR,OLEOPT_RENDER,OLECLIPFORMAT);
+OLESTATUS WINAPI OleQueryCreateFromClip(LPCSTR,OLEOPT_RENDER,OLECLIPFORMAT);
+OLESTATUS WINAPI OleCreateFromClip(LPCSTR,LPOLECLIENT,LHCLIENTDOC,LPCSTR,LPOLEOBJECT*,OLEOPT_RENDER,OLECLIPFORMAT);
+OLESTATUS WINAPI OleCreateLinkFromClip(LPCSTR,LPOLECLIENT,LHCLIENTDOC,LPCSTR,LPOLEOBJECT*,OLEOPT_RENDER,OLECLIPFORMAT);
+OLESTATUS WINAPI OleCreateFromFile(LPCSTR,LPOLECLIENT,LPCSTR,LPCSTR,LHCLIENTDOC,LPCSTR,LPOLEOBJECT*,OLEOPT_RENDER,OLECLIPFORMAT);
+OLESTATUS WINAPI OleCreateLinkFromFile(LPCSTR,LPOLECLIENT,LPCSTR,LPCSTR,LPCSTR,LHCLIENTDOC,LPCSTR,LPOLEOBJECT*,OLEOPT_RENDER,OLECLIPFORMAT);
+OLESTATUS WINAPI OleLoadFromStream(LPOLESTREAM,LPCSTR,LPOLECLIENT,LHCLIENTDOC,LPCSTR,LPOLEOBJECT*);
+OLESTATUS WINAPI OleCreate(LPCSTR,LPOLECLIENT,LPCSTR,LHCLIENTDOC,LPCSTR,LPOLEOBJECT*,OLEOPT_RENDER,OLECLIPFORMAT);
+OLESTATUS WINAPI OleCreateInvisible(LPCSTR,LPOLECLIENT,LPCSTR,LHCLIENTDOC,LPCSTR,LPOLEOBJECT*,OLEOPT_RENDER,OLECLIPFORMAT,BOOL);
+OLESTATUS WINAPI OleCreateFromTemplate(LPCSTR,LPOLECLIENT,LPCSTR,LHCLIENTDOC,LPCSTR,LPOLEOBJECT*,OLEOPT_RENDER,OLECLIPFORMAT);
+OLESTATUS WINAPI OleClone(LPOLEOBJECT,LPOLECLIENT,LHCLIENTDOC,LPCSTR,LPOLEOBJECT*);
+OLESTATUS WINAPI OleCopyFromLink(LPOLEOBJECT,LPCSTR,LPOLECLIENT,LHCLIENTDOC,LPCSTR,LPOLEOBJECT*);
+OLESTATUS WINAPI OleObjectConvert(LPOLEOBJECT,LPCSTR,LPOLECLIENT,LHCLIENTDOC,LPCSTR,LPOLEOBJECT*);
+OLESTATUS WINAPI OleRename(LPOLEOBJECT,LPCSTR);
+OLESTATUS WINAPI OleQueryName(LPOLEOBJECT,LPSTR,UINT*);
+OLESTATUS WINAPI OleRevokeObject(LPOLECLIENT);
+BOOL WINAPI OleIsDcMeta(HDC);
+OLESTATUS WINAPI OleRegisterClientDoc(LPCSTR,LPCSTR,LONG,LHCLIENTDOC*);
+OLESTATUS WINAPI OleRevokeClientDoc(LHCLIENTDOC);
+OLESTATUS WINAPI OleRenameClientDoc(LHCLIENTDOC,LPCSTR);
+OLESTATUS WINAPI OleRevertClientDoc(LHCLIENTDOC);
+OLESTATUS WINAPI OleSavedClientDoc(LHCLIENTDOC);
+OLESTATUS WINAPI OleEnumObjects(LHCLIENTDOC,LPOLEOBJECT*);
+OLESTATUS WINAPI OleRegisterServer(LPCSTR,LPOLESERVER,LHSERVER*,HINSTANCE,OLE_SERVER_USE);
+OLESTATUS WINAPI OleRevokeServer(LHSERVER);
+OLESTATUS WINAPI OleBlockServer(LHSERVER);
+OLESTATUS WINAPI OleUnblockServer(LHSERVER,BOOL*);
+OLESTATUS WINAPI OleLockServer(LPOLEOBJECT,LHSERVER*);
+OLESTATUS WINAPI OleUnlockServer(LHSERVER);
+OLESTATUS WINAPI OleRegisterServerDoc(LHSERVER,LPCSTR,LPOLESERVERDOC,LHSERVERDOC*);
+OLESTATUS WINAPI OleRevokeServerDoc(LHSERVERDOC);
+OLESTATUS WINAPI OleRenameServerDoc(LHSERVERDOC,LPCSTR);
+OLESTATUS WINAPI OleRevertServerDoc(LHSERVERDOC);
+OLESTATUS WINAPI OleSavedServerDoc(LHSERVERDOC);
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/winsup/w32api/include/ole2.h b/winsup/w32api/include/ole2.h
new file mode 100644
index 000000000..0f5aa71fe
--- /dev/null
+++ b/winsup/w32api/include/ole2.h
@@ -0,0 +1,106 @@
+#ifndef _OLE2_H
+#define _OLE2_H
+#pragma pack(push,8)
+#include <winerror.h>
+#include <objbase.h>
+#include <olectlid.h>
+#include <oleauto.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+#define E_DRAW VIEW_E_DRAW
+#define DATA_E_FORMATETC DV_E_FORMATETC
+#define OLEIVERB_PRIMARY (0L)
+#define OLEIVERB_SHOW (-1L)
+#define OLEIVERB_OPEN (-2L)
+#define OLEIVERB_HIDE (-3L)
+#define OLEIVERB_UIACTIVATE (-4L)
+#define OLEIVERB_INPLACEACTIVATE (-5L)
+#define OLEIVERB_DISCARDUNDOSTATE (-6L)
+#define EMBDHLP_INPROC_HANDLER 0x0000L
+#define EMBDHLP_INPROC_SERVER 0x0001L
+#define EMBDHLP_CREATENOW 0x00000000L
+#define EMBDHLP_DELAYCREATE 0x00010000L
+#include <oleidl.h>
+
+typedef struct _OLESTREAMVTBL *LPOLESTREAMVTBL;
+typedef struct _OLESTREAM {
+ LPOLESTREAMVTBL lpstbl;
+} OLESTREAM,*LPOLESTREAM;
+typedef struct _OLESTREAMVTBL {
+ DWORD (CALLBACK* Get)(LPOLESTREAM,void*,DWORD);
+ DWORD (CALLBACK* Put)(LPOLESTREAM,const void*,DWORD);
+} OLESTREAMVTBL;
+
+WINOLEAPI CreateDataAdviseHolder(LPDATAADVISEHOLDER*);
+WINOLEAPI_(DWORD) OleBuildVersion(void);
+WINOLEAPI ReadClassStg(LPSTORAGE,CLSID*);
+WINOLEAPI WriteClassStg(LPSTORAGE,REFCLSID);
+WINOLEAPI ReadClassStm(LPSTREAM,CLSID*);
+WINOLEAPI WriteClassStm(LPSTREAM,REFCLSID);
+WINOLEAPI WriteFmtUserTypeStg(LPSTORAGE,CLIPFORMAT,LPOLESTR);
+WINOLEAPI ReadFmtUserTypeStg(LPSTORAGE,CLIPFORMAT*,LPOLESTR*);
+WINOLEAPI OleInitialize(PVOID);
+WINOLEAPI_(void) OleUninitialize(void);
+WINOLEAPI OleQueryLinkFromData(LPDATAOBJECT);
+WINOLEAPI OleQueryCreateFromData(LPDATAOBJECT);
+WINOLEAPI OleCreate(REFCLSID,REFIID,DWORD,LPFORMATETC,LPOLECLIENTSITE,LPSTORAGE,PVOID*);
+WINOLEAPI OleCreateFromData(LPDATAOBJECT,REFIID,DWORD,LPFORMATETC,LPOLECLIENTSITE,LPSTORAGE,PVOID*);
+WINOLEAPI OleCreateLinkFromData(LPDATAOBJECT,REFIID,DWORD,LPFORMATETC,LPOLECLIENTSITE,LPSTORAGE,PVOID*);
+WINOLEAPI OleCreateStaticFromData(LPDATAOBJECT,REFIID,DWORD,LPFORMATETC,LPOLECLIENTSITE,LPSTORAGE,PVOID*);
+WINOLEAPI OleCreateLink(LPMONIKER,REFIID,DWORD,LPFORMATETC,LPOLECLIENTSITE,LPSTORAGE,PVOID*);
+WINOLEAPI OleCreateLinkToFile(LPCOLESTR,REFIID,DWORD,LPFORMATETC,LPOLECLIENTSITE,LPSTORAGE,PVOID*);
+WINOLEAPI OleCreateFromFile(REFCLSID,LPCOLESTR,REFIID,DWORD,LPFORMATETC,LPOLECLIENTSITE,LPSTORAGE,PVOID*);
+WINOLEAPI OleLoad(LPSTORAGE,REFIID,LPOLECLIENTSITE,PVOID*);
+WINOLEAPI OleSave(LPPERSISTSTORAGE,LPSTORAGE,BOOL);
+WINOLEAPI OleLoadFromStream(LPSTREAM,REFIID,PVOID*);
+WINOLEAPI OleSaveToStream(LPPERSISTSTREAM,LPSTREAM);
+WINOLEAPI OleSetContainedObject(LPUNKNOWN,BOOL);
+WINOLEAPI OleNoteObjectVisible(LPUNKNOWN,BOOL);
+WINOLEAPI RegisterDragDrop(HWND,LPDROPTARGET);
+WINOLEAPI RevokeDragDrop(HWND);
+WINOLEAPI DoDragDrop(LPDATAOBJECT,LPDROPSOURCE,DWORD,PDWORD);
+WINOLEAPI OleSetClipboard(LPDATAOBJECT);
+WINOLEAPI OleGetClipboard(LPDATAOBJECT*);
+WINOLEAPI OleFlushClipboard(void);
+WINOLEAPI OleIsCurrentClipboard(LPDATAOBJECT);
+WINOLEAPI_(HOLEMENU) OleCreateMenuDescriptor(HMENU,LPOLEMENUGROUPWIDTHS);
+WINOLEAPI OleSetMenuDescriptor(HOLEMENU,HWND,HWND,LPOLEINPLACEFRAME,LPOLEINPLACEACTIVEOBJECT);
+WINOLEAPI OleDestroyMenuDescriptor(HOLEMENU);
+WINOLEAPI OleTranslateAccelerator(LPOLEINPLACEFRAME,LPOLEINPLACEFRAMEINFO,LPMSG);
+WINOLEAPI_(HANDLE) OleDuplicateData(HANDLE,CLIPFORMAT,UINT);
+WINOLEAPI OleDraw(LPUNKNOWN,DWORD,HDC,LPCRECT);
+WINOLEAPI OleRun(LPUNKNOWN);
+WINOLEAPI_(BOOL) OleIsRunning(LPOLEOBJECT);
+WINOLEAPI OleLockRunning(LPUNKNOWN,BOOL,BOOL);
+WINOLEAPI_(void) ReleaseStgMedium(LPSTGMEDIUM);
+WINOLEAPI CreateOleAdviseHolder(LPOLEADVISEHOLDER*);
+WINOLEAPI OleCreateDefaultHandler(REFCLSID,LPUNKNOWN,REFIID,PVOID*);
+WINOLEAPI OleCreateEmbeddingHelper(REFCLSID,LPUNKNOWN,DWORD,LPCLASSFACTORY,REFIID,PVOID*);
+WINOLEAPI_(BOOL) IsAccelerator(HACCEL,int,LPMSG,WORD*);
+WINOLEAPI_(HGLOBAL) OleGetIconOfFile(LPOLESTR,BOOL);
+WINOLEAPI_(HGLOBAL) OleGetIconOfClass(REFCLSID,LPOLESTR,BOOL);
+WINOLEAPI_(HGLOBAL) OleMetafilePictFromIconAndLabel(HICON,LPOLESTR,LPOLESTR,UINT);
+WINOLEAPI OleRegGetUserType(REFCLSID,DWORD,LPOLESTR*);
+WINOLEAPI OleRegGetMiscStatus(REFCLSID,DWORD,DWORD*);
+WINOLEAPI OleRegEnumFormatEtc (REFCLSID,DWORD,LPENUMFORMATETC*);
+WINOLEAPI OleRegEnumVerbs (REFCLSID,LPENUMOLEVERB*);
+WINOLEAPI OleConvertOLESTREAMToIStorage(LPOLESTREAM,LPSTORAGE,const DVTARGETDEVICE*);
+WINOLEAPI OleConvertIStorageToOLESTREAM(LPSTORAGE,LPOLESTREAM);
+WINOLEAPI GetHGlobalFromILockBytes(LPLOCKBYTES,HGLOBAL*);
+WINOLEAPI CreateILockBytesOnHGlobal(HGLOBAL,BOOL,LPLOCKBYTES*);
+WINOLEAPI GetHGlobalFromStream(LPSTREAM,HGLOBAL*);
+WINOLEAPI CreateStreamOnHGlobal(HGLOBAL,BOOL,LPSTREAM*);
+WINOLEAPI OleDoAutoConvert(LPSTORAGE,LPCLSID);
+WINOLEAPI OleGetAutoConvert(REFCLSID,LPCLSID);
+WINOLEAPI OleSetAutoConvert(REFCLSID,REFCLSID);
+WINOLEAPI GetConvertStg(LPSTORAGE);
+WINOLEAPI SetConvertStg(LPSTORAGE,BOOL);
+WINOLEAPI OleConvertIStorageToOLESTREAMEx(LPSTORAGE,CLIPFORMAT,LONG,LONG,DWORD,LPSTGMEDIUM,LPOLESTREAM);
+WINOLEAPI OleConvertOLESTREAMToIStorageEx(LPOLESTREAM,LPSTORAGE,CLIPFORMAT*,LONG*,LONG*,DWORD*,LPSTGMEDIUM);
+#ifdef __cplusplus
+}
+#endif
+#pragma pack(pop)
+#endif
diff --git a/winsup/w32api/include/ole2ver.h b/winsup/w32api/include/ole2ver.h
new file mode 100644
index 000000000..c7741dc19
--- /dev/null
+++ b/winsup/w32api/include/ole2ver.h
@@ -0,0 +1,5 @@
+#ifndef _OLE2VER_H
+#define _OLE2VER_H
+#define rmm 23
+#define rup 639
+#endif
diff --git a/winsup/w32api/include/oleauto.h b/winsup/w32api/include/oleauto.h
new file mode 100644
index 000000000..1b60e267d
--- /dev/null
+++ b/winsup/w32api/include/oleauto.h
@@ -0,0 +1,252 @@
+#ifndef _OLEAUTO_H
+#define _OLEAUTO_H
+#pragma pack(push,8)
+#define WINOLEAUTAPI STDAPI
+#define WINOLEAUTAPI_(type) STDAPI_(type)
+#define STDOLE_MAJORVERNUM 1
+#define STDOLE_MINORVERNUM 0
+#define STDOLE_LCID 0
+#define VARIANT_NOVALUEPROP 1
+#define VAR_TIMEVALUEONLY 0x0001
+#define VAR_DATEVALUEONLY 0x0002
+#define MEMBERID_NIL DISPID_UNKNOWN
+#define ID_DEFAULTINST (-2)
+#define DISPATCH_METHOD 1
+#define DISPATCH_PROPERTYGET 2
+#define DISPATCH_PROPERTYPUT 4
+#define DISPATCH_PROPERTYPUTREF 8
+#define LHashValOfName(l,n) LHashValOfNameSys(SYS_WIN32,l,n)
+#define WHashValOfLHashVal(h) ((unsigned short)(0x0000ffff&(h)))
+#define IsHashValCompatible(h1,h2) ((BOOL)((0x00ff0000&(h1))==(0x00ff0000&(h2))))
+#define ACTIVEOBJECT_STRONG 0
+#define ACTIVEOBJECT_WEAK 1
+#ifdef NONAMELESSUNION
+#define V_UNION(X,Y) ((X)->u.Y)
+#else
+#define V_UNION(X,Y) ((X)->Y)
+#endif
+#ifdef __cplusplus
+#define V_BOOL(X) V_UNION(X,boolVal)
+#else
+#define V_BOOL(X) V_UNION(X,bool)
+#endif
+#define V_VT(X) ((X)->vt)
+#define V_ISBYREF(X) (V_VT(X)&VT_BYREF)
+#define V_ISARRAY(X) (V_VT(X)&VT_ARRAY)
+#define V_ISVECTOR(X) (V_VT(X)&VT_VECTOR)
+#define V_NONE(X) V_I2(X)
+#define V_UI1(X) V_UNION(X,bVal)
+#define V_UI1REF(X) V_UNION(X,pbVal)
+#define V_I2(X) V_UNION(X,iVal)
+#define V_I2REF(X) V_UNION(X,piVal)
+#define V_I4(X) V_UNION(X,lVal)
+#define V_I4REF(X) V_UNION(X,plVal)
+#define V_I8(X) V_UNION(X,hVal)
+#define V_I8REF(X) V_UNION(X,phVal)
+#define V_R4(X) V_UNION(X,fltVal)
+#define V_R4REF(X) V_UNION(X,pfltVal)
+#define V_R8(X) V_UNION(X,dblVal)
+#define V_R8REF(X) V_UNION(X,pdblVal)
+#define V_CY(X) V_UNION(X,cyVal)
+#define V_CYREF(X) V_UNION(X,pcyVal)
+#define V_DATE(X) V_UNION(X,date)
+#define V_DATEREF(X) V_UNION(X,pdate)
+#define V_BSTR(X) V_UNION(X,bstrVal)
+#define V_BSTRREF(X) V_UNION(X,pbstrVal)
+#define V_DISPATCH(X) V_UNION(X,pdispVal)
+#define V_DISPATCHREF(X) V_UNION(X,ppdispVal)
+#define V_ERROR(X) V_UNION(X,scode)
+#define V_ERRORREF(X) V_UNION(X,pscode)
+#define V_BOOLREF(X) V_UNION(X,pboolVal)
+#define V_UNKNOWN(X) V_UNION(X,punkVal)
+#define V_UNKNOWNREF(X) V_UNION(X,ppunkVal)
+#define V_VARIANTREF(X) V_UNION(X,pvarVal)
+#define V_LPSTR(X) V_UNION(X,pszVal)
+#define V_LPSTRREF(X) V_UNION(X,ppszVal)
+#define V_LPWSTR(X) V_UNION(X,pwszVal)
+#define V_LPWSTRREF(X) V_UNION(X,ppwszVal)
+#define V_FILETIME(X) V_UNION(X,filetime)
+#define V_FILETIMEREF(X) V_UNION(X,pfiletime)
+#define V_BLOB(X) V_UNION(X,blob)
+#define V_UUID(X) V_UNION(X,puuid)
+#define V_CLSID(X) V_UNION(X,puuid)
+#define V_ARRAY(X) V_UNION(X,parray)
+#define V_ARRAYREF(X) V_UNION(X,pparray)
+#define V_BYREF(X) V_UNION(X,byref)
+#define V_DECIMAL(X) V_UNION(X,decVal)
+#define V_DECIMALREF(X) V_UNION(X,pdecVal)
+
+#include <oaidl.h>
+
+typedef enum tagREGKIND {
+ REGKIND_DEFAULT,
+ REGKIND_REGISTER,
+ REGKIND_NONE
+} REGKIND;
+typedef struct tagPARAMDATA {
+ OLECHAR *szName;
+ VARTYPE vt;
+} PARAMDATA,*LPPARAMDATA;
+typedef struct tagMETHODDATA {
+ OLECHAR *szName;
+ PARAMDATA *ppdata;
+ DISPID dispid;
+ UINT iMeth;
+ CALLCONV cc;
+ UINT cArgs;
+ WORD wFlags;
+ VARTYPE vtReturn;
+} METHODDATA,*LPMETHODDATA;
+typedef struct tagINTERFACEDATA {
+ METHODDATA *pmethdata;
+ UINT cMembers;
+} INTERFACEDATA,*LPINTERFACEDATA;
+
+WINOLEAUTAPI_(BSTR) SysAllocString(const OLECHAR*);
+WINOLEAUTAPI_(int) SysReAllocString(BSTR*,const OLECHAR*);
+WINOLEAUTAPI_(BSTR) SysAllocStringLen(const OLECHAR*,unsigned int);
+WINOLEAUTAPI_(int) SysReAllocStringLen(BSTR*,const OLECHAR*,unsigned int);
+WINOLEAUTAPI_(void) SysFreeString(BSTR);
+WINOLEAUTAPI_(unsigned int) SysStringLen(BSTR);
+WINOLEAUTAPI_(unsigned int) SysStringByteLen(BSTR);
+WINOLEAUTAPI_(BSTR) SysAllocStringByteLen(const char*,unsigned int);
+WINOLEAUTAPI_(int) DosDateTimeToVariantTime(unsigned short,unsigned short,double*);
+WINOLEAUTAPI_(int) VariantTimeToDosDateTime(double,unsigned short*,unsigned short*);
+WINOLEAUTAPI_(int) VariantTimeToSystemTime(double,LPSYSTEMTIME);
+WINOLEAUTAPI SafeArrayAllocDescriptor(unsigned int,SAFEARRAY**);
+WINOLEAUTAPI SafeArrayAllocData(SAFEARRAY*);
+WINOLEAUTAPI_(SAFEARRAY*) SafeArrayCreate(VARTYPE,unsigned int,SAFEARRAYBOUND*);
+WINOLEAUTAPI SafeArrayDestroyDescriptor(SAFEARRAY*);
+WINOLEAUTAPI SafeArrayDestroyData(SAFEARRAY*);
+WINOLEAUTAPI SafeArrayDestroy(SAFEARRAY*);
+WINOLEAUTAPI SafeArrayRedim(SAFEARRAY*,SAFEARRAYBOUND*);
+WINOLEAUTAPI_(unsigned int) SafeArrayGetDim(SAFEARRAY*);
+WINOLEAUTAPI_(unsigned int) SafeArrayGetElemsize(SAFEARRAY*);
+WINOLEAUTAPI SafeArrayGetUBound(SAFEARRAY*,unsigned int,long*);
+WINOLEAUTAPI SafeArrayGetLBound(SAFEARRAY*,unsigned int,long*);
+WINOLEAUTAPI SafeArrayLock(SAFEARRAY*);
+WINOLEAUTAPI SafeArrayUnlock(SAFEARRAY*);
+WINOLEAUTAPI SafeArrayAccessData(SAFEARRAY*,void**);
+WINOLEAUTAPI SafeArrayUnaccessData(SAFEARRAY*);
+WINOLEAUTAPI SafeArrayGetElement(SAFEARRAY*,long*,void*);
+WINOLEAUTAPI SafeArrayPutElement(SAFEARRAY*,long*,void*);
+WINOLEAUTAPI SafeArrayCopy(SAFEARRAY*,SAFEARRAY**);
+WINOLEAUTAPI SafeArrayPtrOfIndex(SAFEARRAY*,long*,void**);
+WINOLEAUTAPI_(SAFEARRAY*) SafeArrayCreateVector(VARTYPE,LONG,UINT);
+WINOLEAUTAPI_(void) VariantInit(VARIANTARG*);
+WINOLEAUTAPI VariantClear(VARIANTARG*);
+WINOLEAUTAPI VariantCopy(VARIANTARG*,VARIANTARG*);
+WINOLEAUTAPI VariantCopyInd(VARIANT*,VARIANTARG*);
+WINOLEAUTAPI VariantChangeType(VARIANTARG*,VARIANTARG*,unsigned short,VARTYPE);
+WINOLEAUTAPI VariantChangeTypeEx(VARIANTARG*,VARIANTARG*,LCID,unsigned short,VARTYPE);
+WINOLEAUTAPI VarUI1FromI2(short,unsigned char*);
+WINOLEAUTAPI VarUI1FromI4(long,unsigned char*);
+WINOLEAUTAPI VarUI1FromR4(float,unsigned char*);
+WINOLEAUTAPI VarUI1FromR8(double,unsigned char*);
+WINOLEAUTAPI VarUI1FromCy(CY,unsigned char*);
+WINOLEAUTAPI VarUI1FromDate(DATE,unsigned char*);
+WINOLEAUTAPI VarUI1FromStr(OLECHAR*,LCID,unsigned long,unsigned char*);
+WINOLEAUTAPI VarUI1FromDisp(LPDISPATCH*,LCID,unsigned char*);
+WINOLEAUTAPI VarUI1FromBool(VARIANT_BOOL,unsigned char*);
+WINOLEAUTAPI VarI2FromUI1(unsigned char,short*);
+WINOLEAUTAPI VarI2FromI4(long,short*);
+WINOLEAUTAPI VarI2FromR4(float,short*);
+WINOLEAUTAPI VarI2FromR8(double,short*);
+WINOLEAUTAPI VarI2FromCy(CY cyIn,short*);
+WINOLEAUTAPI VarI2FromDate(DATE,short*);
+WINOLEAUTAPI VarI2FromStr(OLECHAR*,LCID,unsigned long,short*);
+WINOLEAUTAPI VarI2FromDisp(LPDISPATCH*,LCID,short*);
+WINOLEAUTAPI VarI2FromBool(VARIANT_BOOL,short*);
+WINOLEAUTAPI VarI4FromUI1(unsigned char,long*);
+WINOLEAUTAPI VarI4FromI2(short,long*);
+WINOLEAUTAPI VarI4FromR4(float,long*);
+WINOLEAUTAPI VarI4FromR8(double,long*);
+WINOLEAUTAPI VarI4FromCy(CY,long*);
+WINOLEAUTAPI VarI4FromDate(DATE,long*);
+WINOLEAUTAPI VarI4FromStr(OLECHAR*,LCID,unsigned long,long*);
+WINOLEAUTAPI VarI4FromDisp(LPDISPATCH*,LCID,long*);
+WINOLEAUTAPI VarI4FromBool(VARIANT_BOOL,long*);
+WINOLEAUTAPI VarR4FromUI1(unsigned char,float*);
+WINOLEAUTAPI VarR4FromI2(short,float*);
+WINOLEAUTAPI VarR4FromI4(long,float*);
+WINOLEAUTAPI VarR4FromR8(double,float*);
+WINOLEAUTAPI VarR4FromCy(CY,float*);
+WINOLEAUTAPI VarR4FromDate(DATE,float*);
+WINOLEAUTAPI VarR4FromStr(OLECHAR*,LCID,unsigned long,float*);
+WINOLEAUTAPI VarR4FromDisp(LPDISPATCH*,LCID,float*);
+WINOLEAUTAPI VarR4FromBool(VARIANT_BOOL,float*);
+WINOLEAUTAPI VarR8FromUI1(unsigned char,double*);
+WINOLEAUTAPI VarR8FromI2(short,double*);
+WINOLEAUTAPI VarR8FromI4(long,double*);
+WINOLEAUTAPI VarR8FromR4(float,double*);
+WINOLEAUTAPI VarR8FromCy(CY,double*);
+WINOLEAUTAPI VarR8FromDate(DATE,double*);
+WINOLEAUTAPI VarR8FromStr(OLECHAR*,LCID,unsigned long,double*);
+WINOLEAUTAPI VarR8FromDisp(LPDISPATCH*,LCID,double*);
+WINOLEAUTAPI VarR8FromBool(VARIANT_BOOL,double*);
+WINOLEAUTAPI VarDateFromUI1(unsigned char,DATE*);
+WINOLEAUTAPI VarDateFromI2(short,DATE*);
+WINOLEAUTAPI VarDateFromI4(long,DATE*);
+WINOLEAUTAPI VarDateFromR4(float,DATE*);
+WINOLEAUTAPI VarDateFromR8(double,DATE*);
+WINOLEAUTAPI VarDateFromCy(CY,DATE*);
+WINOLEAUTAPI VarDateFromStr(OLECHAR*,LCID,unsigned long,DATE*);
+WINOLEAUTAPI VarDateFromDisp(LPDISPATCH*,LCID,DATE*);
+WINOLEAUTAPI VarDateFromBool(VARIANT_BOOL,DATE*);
+WINOLEAUTAPI VarCyFromUI1(unsigned char,CY*);
+WINOLEAUTAPI VarCyFromI2(short,CY*);
+WINOLEAUTAPI VarCyFromI4(long,CY*);
+WINOLEAUTAPI VarCyFromR4(float,CY*);
+WINOLEAUTAPI VarCyFromR8(double,CY*);
+WINOLEAUTAPI VarCyFromDate(DATE,CY*);
+WINOLEAUTAPI VarCyFromStr(OLECHAR*,LCID,unsigned long,CY*);
+WINOLEAUTAPI VarCyFromDisp(LPDISPATCH*,LCID,CY*);
+WINOLEAUTAPI VarCyFromBool(VARIANT_BOOL,CY*);
+WINOLEAUTAPI VarBstrFromUI1(unsigned char,LCID,unsigned long,BSTR*);
+WINOLEAUTAPI VarBstrFromI2(short,LCID,unsigned long,BSTR*);
+WINOLEAUTAPI VarBstrFromI4(long,LCID,unsigned long,BSTR*);
+WINOLEAUTAPI VarBstrFromR4(float,LCID,unsigned long,BSTR*);
+WINOLEAUTAPI VarBstrFromR8(double,LCID,unsigned long,BSTR*);
+WINOLEAUTAPI VarBstrFromCy(CY,LCID,unsigned long,BSTR*);
+WINOLEAUTAPI VarBstrFromDate(DATE,LCID,unsigned long,BSTR*);
+WINOLEAUTAPI VarBstrFromDisp(LPDISPATCH*,LCID,unsigned long,BSTR*);
+WINOLEAUTAPI VarBstrFromBool(VARIANT_BOOL,LCID,unsigned long,BSTR*);
+WINOLEAUTAPI VarBoolFromUI1(unsigned char,VARIANT_BOOL*);
+WINOLEAUTAPI VarBoolFromI2(short,VARIANT_BOOL*);
+WINOLEAUTAPI VarBoolFromI4(long,VARIANT_BOOL*);
+WINOLEAUTAPI VarBoolFromR4(float,VARIANT_BOOL*);
+WINOLEAUTAPI VarBoolFromR8(double,VARIANT_BOOL*);
+WINOLEAUTAPI VarBoolFromDate(DATE,VARIANT_BOOL*);
+WINOLEAUTAPI VarBoolFromCy(CY,VARIANT_BOOL*);
+WINOLEAUTAPI VarBoolFromStr(OLECHAR*,LCID,unsigned long,VARIANT_BOOL*);
+WINOLEAUTAPI VarBoolFromDisp(LPDISPATCH*,LCID,VARIANT_BOOL*);
+WINOLEAUTAPI_(ULONG) LHashValOfNameSysA(SYSKIND,LCID,const char*);
+WINOLEAUTAPI_(ULONG) LHashValOfNameSys(SYSKIND,LCID,const OLECHAR*);
+WINOLEAUTAPI LoadTypeLib(const OLECHAR*,LPTYPELIB*);
+WINOLEAUTAPI LoadTypeLibEx(LPCOLESTR,REGKIND,LPTYPELIB*);
+WINOLEAUTAPI LoadRegTypeLib(REFGUID,WORD,WORD,LCID,LPTYPELIB*);
+WINOLEAUTAPI QueryPathOfRegTypeLib(REFGUID,unsigned short,unsigned short,LCID,LPBSTR);
+WINOLEAUTAPI RegisterTypeLib(LPTYPELIB,OLECHAR*,OLECHAR*);
+WINOLEAUTAPI DeregisterTypeLib(REFGUID,WORD,WORD,LCID);
+WINOLEAUTAPI CreateTypeLib(SYSKIND,const OLECHAR*,LPCREATETYPELIB*);
+WINOLEAUTAPI DispGetParam(DISPPARAMS*,UINT,VARTYPE,VARIANT*,UINT*);
+WINOLEAUTAPI DispGetIDsOfNames(LPTYPEINFO,OLECHAR**,UINT,DISPID*);
+WINOLEAUTAPI DispInvoke(void*,LPTYPEINFO,DISPID,WORD,DISPPARAMS*,VARIANT*,EXCEPINFO*,UINT*);
+WINOLEAUTAPI CreateDispTypeInfo(INTERFACEDATA*,LCID,LPTYPEINFO*);
+WINOLEAUTAPI CreateStdDispatch(IUnknown*,void*,LPTYPEINFO,IUnknown**);
+WINOLEAUTAPI RegisterActiveObject(IUnknown*,REFCLSID,DWORD,DWORD*);
+WINOLEAUTAPI RevokeActiveObject(DWORD,void*);
+WINOLEAUTAPI GetActiveObject(REFCLSID,void*,IUnknown**);
+WINOLEAUTAPI SetErrorInfo(unsigned long,LPERRORINFO);
+WINOLEAUTAPI GetErrorInfo(unsigned long,LPERRORINFO*);
+WINOLEAUTAPI CreateErrorInfo(LPCREATEERRORINFO*);
+WINOLEAUTAPI_(unsigned long) OaBuildVersion(void);
+WINOLEAUTAPI VectorFromBstr (BSTR, SAFEARRAY **);
+WINOLEAUTAPI BstrFromVector (SAFEARRAY *, BSTR *);
+
+WINOLEAUTAPI VarAdd(LPVARIANT, LPVARIANT, LPVARIANT);
+WINOLEAUTAPI VarSub(LPVARIANT, LPVARIANT, LPVARIANT);
+WINOLEAUTAPI VarMul(LPVARIANT, LPVARIANT, LPVARIANT);
+WINOLEAUTAPI VarDiv(LPVARIANT, LPVARIANT, LPVARIANT);
+#pragma pack(pop)
+#endif
diff --git a/winsup/w32api/include/olectl.h b/winsup/w32api/include/olectl.h
new file mode 100644
index 000000000..97ea9f40d
--- /dev/null
+++ b/winsup/w32api/include/olectl.h
@@ -0,0 +1,721 @@
+#ifndef _OLECTL_H
+#define _OLECTL_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <olectlid.h>
+
+#define STD_CTL_SCODE(n) MAKE_SCODE(SEVERITY_ERROR,FACILITY_CONTROL,n)
+#define CTL_E_ILLEGALFUNCTIONCALL STD_CTL_SCODE(5)
+#define CTL_E_OVERFLOW STD_CTL_SCODE(6)
+#define CTL_E_OUTOFMEMORY STD_CTL_SCODE(7)
+#define CTL_E_DIVISIONBYZERO STD_CTL_SCODE(11)
+#define CTL_E_OUTOFSTRINGSPACE STD_CTL_SCODE(14)
+#define CTL_E_OUTOFSTACKSPACE STD_CTL_SCODE(28)
+#define CTL_E_BADFILENAMEORNUMBER STD_CTL_SCODE(52)
+#define CTL_E_FILENOTFOUND STD_CTL_SCODE(53)
+#define CTL_E_BADFILEMODE STD_CTL_SCODE(54)
+#define CTL_E_FILEALREADYOPEN STD_CTL_SCODE(55)
+#define CTL_E_DEVICEIOERROR STD_CTL_SCODE(57)
+#define CTL_E_FILEALREADYEXISTS STD_CTL_SCODE(58)
+#define CTL_E_BADRECORDLENGTH STD_CTL_SCODE(59)
+#define CTL_E_DISKFULL STD_CTL_SCODE(61)
+#define CTL_E_BADRECORDNUMBER STD_CTL_SCODE(63)
+#define CTL_E_BADFILENAME STD_CTL_SCODE(64)
+#define CTL_E_TOOMANYFILES STD_CTL_SCODE(67)
+#define CTL_E_DEVICEUNAVAILABLE STD_CTL_SCODE(68)
+#define CTL_E_PERMISSIONDENIED STD_CTL_SCODE(70)
+#define CTL_E_DISKNOTREADY STD_CTL_SCODE(71)
+#define CTL_E_PATHFILEACCESSERROR STD_CTL_SCODE(75)
+#define CTL_E_PATHNOTFOUND STD_CTL_SCODE(76)
+#define CTL_E_INVALIDPATTERNSTRING STD_CTL_SCODE(93)
+#define CTL_E_INVALIDUSEOFNULL STD_CTL_SCODE(94)
+#define CTL_E_INVALIDFILEFORMAT STD_CTL_SCODE(321)
+#define CTL_E_INVALIDPROPERTYVALUE STD_CTL_SCODE(380)
+#define CTL_E_INVALIDPROPERTYARRAYINDEX STD_CTL_SCODE(381)
+#define CTL_E_SETNOTSUPPORTEDATRUNTIME STD_CTL_SCODE(382)
+#define CTL_E_SETNOTSUPPORTED STD_CTL_SCODE(383)
+#define CTL_E_NEEDPROPERTYARRAYINDEX STD_CTL_SCODE(385)
+#define CTL_E_SETNOTPERMITTED STD_CTL_SCODE(387)
+#define CTL_E_GETNOTSUPPORTEDATRUNTIME STD_CTL_SCODE(393)
+#define CTL_E_GETNOTSUPPORTED STD_CTL_SCODE(394)
+#define CTL_E_PROPERTYNOTFOUND STD_CTL_SCODE(422)
+#define CTL_E_INVALIDCLIPBOARDFORMAT STD_CTL_SCODE(460)
+#define CTL_E_INVALIDPICTURE STD_CTL_SCODE(481)
+#define CTL_E_PRINTERERROR STD_CTL_SCODE(482)
+#define CTL_E_CANTSAVEFILETOTEMP STD_CTL_SCODE(735)
+#define CTL_E_SEARCHTEXTNOTFOUND STD_CTL_SCODE(744)
+#define CTL_E_REPLACEMENTSTOOLONG STD_CTL_SCODE(746)
+#define CUSTOM_CTL_SCODE(n) MAKE_SCODE(SEVERITY_ERROR,FACILITY_CONTROL,n)
+#define CTL_E_CUSTOM_FIRST CUSTOM_CTL_SCODE(600)
+#define CLASS_E_NOTLICENSED (CLASSFACTORY_E_FIRST+2)
+#define CONNECT_E_FIRST MAKE_SCODE(SEVERITY_ERROR,FACILITY_ITF,0x200)
+#define CONNECT_E_LAST MAKE_SCODE(SEVERITY_ERROR,FACILITY_ITF,0x20F)
+#define CONNECT_S_FIRST MAKE_SCODE(SEVERITY_SUCCESS,FACILITY_ITF,0x200)
+#define CONNECT_S_LAST MAKE_SCODE(SEVERITY_SUCCESS,FACILITY_ITF,0x20F)
+#define CONNECT_E_NOCONNECTION (CONNECT_E_FIRST+0)
+#define CONNECT_E_ADVISELIMIT (CONNECT_E_FIRST+1)
+#define CONNECT_E_CANNOTCONNECT (CONNECT_E_FIRST+2)
+#define CONNECT_E_OVERRIDDEN (CONNECT_E_FIRST+3)
+#define SELFREG_E_FIRST MAKE_SCODE(SEVERITY_ERROR,FACILITY_ITF,0x200)
+#define SELFREG_E_LAST MAKE_SCODE(SEVERITY_ERROR,FACILITY_ITF,0x20F)
+#define SELFREG_S_FIRST MAKE_SCODE(SEVERITY_SUCCESS,FACILITY_ITF,0x200)
+#define SELFREG_S_LAST MAKE_SCODE(SEVERITY_SUCCESS,FACILITY_ITF,0x20F)
+#define SELFREG_E_TYPELIB (SELFREG_E_FIRST+0)
+#define SELFREG_E_CLASS (SELFREG_E_FIRST+1)
+#define PERPROP_E_FIRST MAKE_SCODE(SEVERITY_ERROR,FACILITY_ITF,0x200)
+#define PERPROP_E_LAST MAKE_SCODE(SEVERITY_ERROR,FACILITY_ITF,0x20F)
+#define PERPROP_S_FIRST MAKE_SCODE(SEVERITY_SUCCESS,FACILITY_ITF,0x200)
+#define PERPROP_S_LAST MAKE_SCODE(SEVERITY_SUCCESS,FACILITY_ITF,0x20F)
+#define PERPROP_E_NOPAGEAVAILABLE PERPROP_E_FIRST
+#define OLEMISC_RECOMPOSEONRESIZE 0x1
+#define OLEMISC_ONLYICONIC 0x2
+#define OLEMISC_INSERTNOTREPLACE 0x4
+#define OLEMISC_STATIC 0x8
+#define OLEMISC_CANTLINKINSIDE 0x10
+#define OLEMISC_CANLINKBYOLE1 0x20
+#define OLEMISC_ISLINKOBJECT 0x40
+#define OLEMISC_INSIDEOUT 0x80
+#define OLEMISC_ACTIVATEWHENVISIBLE 0x100
+#define OLEMISC_RENDERINGISDEVICEINDEPENDENT 0x200
+#define OLEMISC_INVISIBLEATRUNTIME 0x400
+#define OLEMISC_ALWAYSRUN 0x800
+#define OLEMISC_ACTSLIKEBUTTON 0x1000
+#define OLEMISC_ACTSLIKELABEL 0x2000
+#define OLEMISC_NOUIACTIVATE 0x4000
+#define OLEMISC_ALIGNABLE 0x8000
+#define OLEMISC_SIMPLEFRAME 0x10000
+#define OLEMISC_SETCLIENTSITEFIRST 0x20000
+#define OLEMISC_IMEMODE 0x40000
+#define OLEMISC_IGNOREACTIVATEWHENVISIBLE 0x80000
+#define OLEMISC_WANTSTOMENUMERGE 0x100000
+#define OLEMISC_SUPPORTSMULTILEVELUNDO 0x200000
+#define OLEIVERB_PROPERTIES (-7)
+#define VT_STREAMED_PROPSET 73
+#define VT_STORED_PROPSET 74
+#define VT_BLOB_PROPSET 75
+#define VT_VERBOSE_ENUM 76
+#define VT_COLOR VT_I4
+#define VT_XPOS_PIXELS VT_I4
+#define VT_YPOS_PIXELS VT_I4
+#define VT_XSIZE_PIXELS VT_I4
+#define VT_YSIZE_PIXELS VT_I4
+#define VT_XPOS_HIMETRIC VT_I4
+#define VT_YPOS_HIMETRIC VT_I4
+#define VT_XSIZE_HIMETRIC VT_I4
+#define VT_YSIZE_HIMETRIC VT_I4
+#define VT_TRISTATE VT_I2
+#define VT_OPTEXCLUSIVE VT_BOOL
+#define VT_FONT VT_DISPATCH
+#define VT_PICTURE VT_DISPATCH
+#define VT_HANDLE VT_I4
+#define OCM__BASE (WM_USER+0x1c00)
+#define OCM_COMMAND (OCM__BASE+WM_COMMAND)
+#define OCM_CTLCOLORBTN (OCM__BASE+WM_CTLCOLORBTN)
+#define OCM_CTLCOLOREDIT (OCM__BASE+WM_CTLCOLOREDIT)
+#define OCM_CTLCOLORDLG (OCM__BASE+WM_CTLCOLORDLG)
+#define OCM_CTLCOLORLISTBOX (OCM__BASE+WM_CTLCOLORLISTBOX)
+#define OCM_CTLCOLORMSGBOX (OCM__BASE+WM_CTLCOLORMSGBOX)
+#define OCM_CTLCOLORSCROLLBAR (OCM__BASE+WM_CTLCOLORSCROLLBAR)
+#define OCM_CTLCOLORSTATIC (OCM__BASE+WM_CTLCOLORSTATIC)
+#define OCM_DRAWITEM (OCM__BASE+WM_DRAWITEM)
+#define OCM_MEASUREITEM (OCM__BASE+WM_MEASUREITEM)
+#define OCM_DELETEITEM (OCM__BASE+WM_DELETEITEM)
+#define OCM_VKEYTOITEM (OCM__BASE+WM_VKEYTOITEM)
+#define OCM_CHARTOITEM (OCM__BASE+WM_CHARTOITEM)
+#define OCM_COMPAREITEM (OCM__BASE+WM_COMPAREITEM)
+#define OCM_HSCROLL (OCM__BASE+WM_HSCROLL)
+#define OCM_VSCROLL (OCM__BASE+WM_VSCROLL)
+#define OCM_PARENTNOTIFY (OCM__BASE+WM_PARENTNOTIFY)
+#define OCM_NOTIFY (OCM__BASE+WM_NOTIFY)
+#define CTRLINFO_EATS_RETURN 1
+#define CTRLINFO_EATS_ESCAPE 2
+#define XFORMCOORDS_POSITION 1
+#define XFORMCOORDS_SIZE 2
+#define XFORMCOORDS_HIMETRICTOCONTAINER 4
+#define XFORMCOORDS_CONTAINERTOHIMETRIC 8
+#define GUIDKIND_DEFAULT_SOURCE_DISP_IID 1
+#define PROPPAGESTATUS_DIRTY 1
+#define PROPPAGESTATUS_VALIDATE 2
+#define FONTSIZE(n) {n##0000,0}
+#define PICTURE_SCALABLE 1
+#define PICTURE_TRANSPARENT 2
+#define PICTYPE_UNINITIALIZED (-1)
+#define PICTYPE_NONE 0
+#define PICTYPE_BITMAP 1
+#define PICTYPE_METAFILE 2
+#define PICTYPE_ICON 3
+#define PICTYPE_ENHMETAFILE 4
+#define DISPID_AUTOSIZE (-500)
+#define DISPID_BACKCOLOR (-501)
+#define DISPID_BACKSTYLE (-502)
+#define DISPID_BORDERCOLOR (-503)
+#define DISPID_BORDERSTYLE (-504)
+#define DISPID_BORDERWIDTH (-505)
+#define DISPID_DRAWMODE (-507)
+#define DISPID_DRAWSTYLE (-508)
+#define DISPID_DRAWWIDTH (-509)
+#define DISPID_FILLCOLOR (-510)
+#define DISPID_FILLSTYLE (-511)
+#define DISPID_FONT (-512)
+#define DISPID_FORECOLOR (-513)
+#define DISPID_ENABLED (-514)
+#define DISPID_HWND (-515)
+#define DISPID_TABSTOP (-516)
+#define DISPID_TEXT (-517)
+#define DISPID_CAPTION (-518)
+#define DISPID_BORDERVISIBLE (-519)
+#define DISPID_APPEARANCE (-520)
+#define DISPID_REFRESH (-550)
+#define DISPID_DOCLICK (-551)
+#define DISPID_ABOUTBOX (-552)
+#define DISPID_CLICK (-600)
+#define DISPID_DBLCLICK (-601)
+#define DISPID_KEYDOWN (-602)
+#define DISPID_KEYPRESS (-603)
+#define DISPID_KEYUP (-604)
+#define DISPID_MOUSEDOWN (-605)
+#define DISPID_MOUSEMOVE (-606)
+#define DISPID_MOUSEUP (-607)
+#define DISPID_ERROREVENT (-608)
+#define DISPID_AMBIENT_BACKCOLOR (-701)
+#define DISPID_AMBIENT_DISPLAYNAME (-702)
+#define DISPID_AMBIENT_FONT (-703)
+#define DISPID_AMBIENT_FORECOLOR (-704)
+#define DISPID_AMBIENT_LOCALEID (-705)
+#define DISPID_AMBIENT_MESSAGEREFLECT (-706)
+#define DISPID_AMBIENT_SCALEUNITS (-707)
+#define DISPID_AMBIENT_TEXTALIGN (-708)
+#define DISPID_AMBIENT_USERMODE (-709)
+#define DISPID_AMBIENT_UIDEAD (-710)
+#define DISPID_AMBIENT_SHOWGRABHANDLES (-711)
+#define DISPID_AMBIENT_SHOWHATCHING (-712)
+#define DISPID_AMBIENT_DISPLAYASDEFAULT (-713)
+#define DISPID_AMBIENT_SUPPORTSMNEMONICS (-714)
+#define DISPID_AMBIENT_AUTOCLIP (-715)
+#define DISPID_AMBIENT_APPEARANCE (-716)
+#define DISPID_FONT_NAME 0
+#define DISPID_FONT_SIZE 2
+#define DISPID_FONT_BOLD 3
+#define DISPID_FONT_ITALIC 4
+#define DISPID_FONT_UNDER 5
+#define DISPID_FONT_STRIKE 6
+#define DISPID_FONT_WEIGHT 7
+#define DISPID_FONT_CHARSET 8
+#define DISPID_PICT_HANDLE 0
+#define DISPID_PICT_HPAL 2
+#define DISPID_PICT_TYPE 3
+#define DISPID_PICT_WIDTH 4
+#define DISPID_PICT_HEIGHT 5
+#define DISPID_PICT_RENDER 6
+
+#pragma pack(push,8)
+#ifndef OLE2ANSI
+typedef TEXTMETRICW TEXTMETRICOLE;
+#else
+typedef TEXTMETRIC TEXTMETRICOLE;
+#endif
+typedef TEXTMETRICOLE *LPTEXTMETRICOLE;
+typedef interface IOleControl *LPOLECONTROL;
+typedef interface IOleControlSite *LPOLECONTROLSITE;
+typedef interface ISimpleFrameSite *LPSIMPLEFRAMESITE;
+typedef interface IErrorLog *LPERRORLOG;
+typedef interface IPropertyBag *LPPROPERTYBAG;
+typedef interface IPersistPropertyBag *LPPERSISTPROPERTYBAG;
+typedef interface IPersistStreamInit *LPPERSISTSTREAMINIT;
+typedef interface IPersistMemory *LPPERSISTMEMORY;
+typedef interface IPropertyNotifySink* LPPROPERTYNOTIFYSINK;
+typedef interface IProvideClassInfo *LPPROVIDECLASSINFO;
+typedef interface IProvideClassInfo2 *LPPROVIDECLASSINFO2;
+typedef interface IConnectionPointContainer *LPCONNECTIONPOINTCONTAINER;
+typedef interface IEnumConnectionPoints *LPENUMCONNECTIONPOINTS;
+typedef interface IConnectionPoint *LPCONNECTIONPOINT;
+typedef interface IEnumConnections *LPENUMCONNECTIONS;
+typedef interface IClassFactory2 *LPCLASSFACTORY2;
+typedef interface ISpecifyPropertyPages *LPSPECIFYPROPERTYPAGES;
+typedef interface IPerPropertyBrowsing *LPPERPROPERTYBROWSING;
+typedef interface IPropertyPageSite *LPPROPERTYPAGESITE;
+typedef interface IPropertyPage *LPPROPERTYPAGE;
+typedef interface IPropertyPage2 *LPPROPERTYPAGE2;
+typedef interface IFont *LPFONT;
+typedef interface IFontDisp *LPFONTDISP;
+typedef interface IPicture *LPPICTURE;
+typedef interface IPictureDisp *LPPICTUREDISP;
+typedef DWORD OLE_COLOR;
+typedef long OLE_XPOS_PIXELS;
+typedef long OLE_YPOS_PIXELS;
+typedef long OLE_XSIZE_PIXELS;
+typedef long OLE_YSIZE_PIXELS;
+typedef long OLE_XPOS_HIMETRIC;
+typedef long OLE_YPOS_HIMETRIC;
+typedef long OLE_XSIZE_HIMETRIC;
+typedef long OLE_YSIZE_HIMETRIC;
+typedef float OLE_XPOS_CONTAINER;
+typedef float OLE_YPOS_CONTAINER;
+typedef float OLE_XSIZE_CONTAINER;
+typedef float OLE_YSIZE_CONTAINER;
+typedef VARIANT_BOOL OLE_OPTEXCLUSIVE;
+typedef VARIANT_BOOL OLE_CANCELBOOL;
+typedef VARIANT_BOOL OLE_ENABLEDEFAULTBOOL;
+typedef UINT OLE_HANDLE;
+typedef enum { triUnchecked,triChecked1,triGray } OLE_TRISTATE;
+typedef struct tagPOINTF {
+ float x;
+ float y;
+} POINTF,*LPPOINTF;
+typedef struct tagCONTROLINFO {
+ ULONG cb;
+ HACCEL hAccel;
+ USHORT cAccel;
+ DWORD dwFlags;
+} CONTROLINFO,*LPCONTROLINFO;
+typedef struct tagCONNECTDATA {
+ LPUNKNOWN pUnk;
+ DWORD dwCookie;
+} CONNECTDATA,*LPCONNECTDATA;
+typedef struct tagLICINFO {
+ long cbLicInfo;
+ BOOL fRuntimeKeyAvail;
+ BOOL fLicVerified;
+} LICINFO,*LPLICINFO;
+typedef struct tagCAUUID {
+ ULONG cElems;
+ GUID *pElems;
+} CAUUID,*LPCAUUID;
+typedef struct tagCALPOLESTR {
+ ULONG cElems;
+ LPOLESTR *pElems;
+} CALPOLESTR,*LPCALPOLESTR;
+typedef struct tagCADWORD {
+ ULONG cElems;
+ DWORD *pElems;
+} CADWORD,*LPCADWORD;
+typedef struct tagOCPFIPARAMS {
+ ULONG cbStructSize;
+ HWND hWndOwner;
+ int x;
+ int y;
+ LPCOLESTR lpszCaption;
+ ULONG cObjects;
+ LPUNKNOWN *lplpUnk;
+ ULONG cPages;
+ CLSID *lpPages;
+ LCID lcid;
+ DISPID dispidInitialProperty;
+} OCPFIPARAMS,*LPOCPFIPARAMS;
+typedef struct tagPROPPAGEINFO {
+ size_t cb;
+ LPOLESTR pszTitle;
+ SIZE size;
+ LPOLESTR pszDocString;
+ LPOLESTR pszHelpFile;
+ DWORD dwHelpContext;
+} PROPPAGEINFO,*LPPROPPAGEINFO;
+typedef struct tagFONTDESC {
+ UINT cbSizeofstruct;
+ LPOLESTR lpstrName;
+ CY cySize;
+ SHORT sWeight;
+ SHORT sCharset;
+ BOOL fItalic;
+ BOOL fUnderline;
+ BOOL fStrikethrough;
+} FONTDESC,*LPFONTDESC;
+typedef struct tagPICTDESC {
+ UINT cbSizeofstruct;
+ UINT picType;
+ union {
+ struct {
+ HBITMAP hbitmap;
+ HPALETTE hpal;
+ } bmp;
+ struct {
+ HMETAFILE hmeta;
+ int xExt;
+ int yExt;
+ } wmf;
+ struct {
+ HICON hicon;
+ } icon;
+ struct {
+ HENHMETAFILE hemf;
+ } emf;
+ } DUMMYUNIONNAME;
+} PICTDESC,*LPPICTDESC;
+
+EXTERN_C const IID IID_IOleControl;
+#undef INTERFACE
+#define INTERFACE IOleControl
+DECLARE_INTERFACE_(IOleControl,IUnknown)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(GetControlInfo)(THIS_ LPCONTROLINFO) PURE;
+ STDMETHOD(OnMnemonic)(THIS_ LPMSG) PURE;
+ STDMETHOD(OnAmbientPropertyChange)(THIS_ DISPID) PURE;
+ STDMETHOD(FreezeEvents)(THIS_ BOOL) PURE;
+};
+EXTERN_C const IID IID_IOleControlSite;
+#undef INTERFACE
+#define INTERFACE IOleControlSite
+DECLARE_INTERFACE_(IOleControlSite,IUnknown)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(OnControlInfoChanged)(THIS) PURE;
+ STDMETHOD(LockInPlaceActive)(THIS_ BOOL) PURE;
+ STDMETHOD(GetExtendedControl)(THIS_ LPDISPATCH*) PURE;
+ STDMETHOD(TransformCoords)(THIS_ POINTL*,POINTF*,DWORD) PURE;
+ STDMETHOD(TranslateAccelerator)(THIS_ LPMSG,DWORD) PURE;
+ STDMETHOD(OnFocus)(THIS_ BOOL) PURE;
+ STDMETHOD(ShowPropertyFrame)(THIS) PURE;
+};
+EXTERN_C const IID IID_ISimpleFrameSite;
+#undef INTERFACE
+#define INTERFACE ISimpleFrameSite
+DECLARE_INTERFACE_(ISimpleFrameSite,IUnknown)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(PreMessageFilter)(THIS_ HWND,UINT,WPARAM,LPARAM,LRESULT*,PDWORD) PURE;
+ STDMETHOD(PostMessageFilter)(THIS_ HWND,UINT,WPARAM,LPARAM,LRESULT*,DWORD) PURE;
+};
+EXTERN_C const IID IID_IErrorLog;
+#undef INTERFACE
+#define INTERFACE IErrorLog
+DECLARE_INTERFACE_(IErrorLog,IUnknown)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(AddError)(THIS_ LPCOLESTR,LPEXCEPINFO) PURE;
+};
+EXTERN_C const IID IID_IPropertyBag;
+#undef INTERFACE
+#define INTERFACE IPropertyBag
+DECLARE_INTERFACE_(IPropertyBag,IUnknown)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(Read)(THIS_ LPCOLESTR,LPVARIANT,LPERRORLOG) PURE;
+ STDMETHOD(Write)(THIS_ LPCOLESTR,LPVARIANT) PURE;
+};
+EXTERN_C const IID IID_IPersistPropertyBag;
+#undef INTERFACE
+#define INTERFACE IPersistPropertyBag
+DECLARE_INTERFACE_(IPersistPropertyBag,IPersist)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(GetClassID)(THIS_ LPCLSID) PURE;
+ STDMETHOD(InitNew)(THIS) PURE;
+ STDMETHOD(Load)(THIS_ LPPROPERTYBAG,LPERRORLOG) PURE;
+ STDMETHOD(Save)(THIS_ LPPROPERTYBAG,BOOL,BOOL) PURE;
+};
+EXTERN_C const IID IID_IPersistStreamInit;
+#undef INTERFACE
+#define INTERFACE IPersistStreamInit
+DECLARE_INTERFACE_(IPersistStreamInit,IPersist)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(GetClassID)(THIS_ LPCLSID) PURE;
+ STDMETHOD(IsDirty)(THIS) PURE;
+ STDMETHOD(Load)(THIS_ LPSTREAM) PURE;
+ STDMETHOD(Save)(THIS_ LPSTREAM,BOOL) PURE;
+ STDMETHOD(GetSizeMax)(THIS_ PULARGE_INTEGER) PURE;
+ STDMETHOD(InitNew)(THIS) PURE;
+};
+EXTERN_C const IID IID_IPersistMemory;
+#undef INTERFACE
+#define INTERFACE IPersistMemory
+DECLARE_INTERFACE_(IPersistMemory,IPersist)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(GetClassID)(THIS_ LPCLSID) PURE;
+ STDMETHOD(IsDirty)(THIS) PURE;
+ STDMETHOD(Load)(THIS_ PVOID,ULONG) PURE;
+ STDMETHOD(Save)(THIS_ PVOID,BOOL,ULONG) PURE;
+ STDMETHOD(GetSizeMax)(THIS_ PULONG) PURE;
+ STDMETHOD(InitNew)(THIS) PURE;
+};
+EXTERN_C const IID IID_IPropertyNotifySink;
+#undef INTERFACE
+#define INTERFACE IPropertyNotifySink
+DECLARE_INTERFACE_(IPropertyNotifySink,IUnknown)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(OnChanged)(THIS_ DISPID) PURE;
+ STDMETHOD(OnRequestEdit)(THIS_ DISPID) PURE;
+};
+EXTERN_C const IID IID_IProvideClassInfo;
+#undef INTERFACE
+#define INTERFACE IProvideClassInfo
+DECLARE_INTERFACE_(IProvideClassInfo,IUnknown)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(GetClassInfo)(THIS_ LPTYPEINFO*) PURE;
+};
+EXTERN_C const IID IID_IProvideClassInfo2;
+#undef INTERFACE
+#define INTERFACE IProvideClassInfo2
+DECLARE_INTERFACE_(IProvideClassInfo2,IProvideClassInfo)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(GetClassInfo)(THIS_ LPTYPEINFO*) PURE;
+ STDMETHOD(GetGUID)(THIS_ DWORD,GUID*) PURE;
+};
+EXTERN_C const IID IID_IConnectionPointContainer;
+#undef INTERFACE
+#define INTERFACE IConnectionPointContainer
+DECLARE_INTERFACE_(IConnectionPointContainer,IUnknown)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(EnumConnectionPoints)(THIS_ LPENUMCONNECTIONPOINTS*) PURE;
+ STDMETHOD(FindConnectionPoint)(THIS_ REFIID,LPCONNECTIONPOINT*) PURE;
+};
+EXTERN_C const IID IID_IEnumConnectionPoints;
+#undef INTERFACE
+#define INTERFACE IEnumConnectionPoints
+DECLARE_INTERFACE_(IEnumConnectionPoints,IUnknown)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(Next)(THIS_ ULONG,LPCONNECTIONPOINT*,ULONG*) PURE;
+ STDMETHOD(Skip)(THIS_ ULONG) PURE;
+ STDMETHOD(Reset)(THIS) PURE;
+ STDMETHOD(Clone)(THIS_ LPENUMCONNECTIONPOINTS*) PURE;
+};
+EXTERN_C const IID IID_IConnectionPoint;
+#undef INTERFACE
+#define INTERFACE IConnectionPoint
+DECLARE_INTERFACE_(IConnectionPoint,IUnknown)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(GetConnectionInterface)(THIS_ IID*) PURE;
+ STDMETHOD(GetConnectionPointContainer)(THIS_ IConnectionPointContainer**) PURE;
+ STDMETHOD(Advise)(THIS_ LPUNKNOWN,PDWORD) PURE;
+ STDMETHOD(Unadvise)(THIS_ DWORD) PURE;
+ STDMETHOD(EnumConnections)(THIS_ LPENUMCONNECTIONS*) PURE;
+};
+EXTERN_C const IID IID_IEnumConnections;
+#undef INTERFACE
+#define INTERFACE IEnumConnections
+DECLARE_INTERFACE_(IEnumConnections,IUnknown)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(Next)(THIS_ ULONG,LPCONNECTDATA,PULONG) PURE;
+ STDMETHOD(Skip)(THIS_ ULONG) PURE;
+ STDMETHOD(Reset)(THIS) PURE;
+ STDMETHOD(Clone)(THIS_ LPENUMCONNECTIONS*) PURE;
+};
+EXTERN_C const IID IID_IClassFactory2;
+#undef INTERFACE
+#define INTERFACE IClassFactory2
+DECLARE_INTERFACE_(IClassFactory2,IClassFactory)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(CreateInstance)(THIS_ LPUNKNOWN,REFIID,PVOID*) PURE;
+ STDMETHOD(LockServer)(THIS_ BOOL) PURE;
+ STDMETHOD(GetLicInfo)(THIS_ LPLICINFO) PURE;
+ STDMETHOD(RequestLicKey)(THIS_ DWORD,BSTR*) PURE;
+ STDMETHOD(CreateInstanceLic)(THIS_ LPUNKNOWN,LPUNKNOWN,REFIID,BSTR,PVOID*) PURE;
+};
+EXTERN_C const IID IID_ISpecifyPropertyPages;
+#undef INTERFACE
+#define INTERFACE ISpecifyPropertyPages
+DECLARE_INTERFACE_(ISpecifyPropertyPages,IUnknown)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(GetPages)(THIS_ CAUUID*) PURE;
+};
+EXTERN_C const IID IID_IPerPropertyBrowsing;
+#undef INTERFACE
+#define INTERFACE IPerPropertyBrowsing
+DECLARE_INTERFACE_(IPerPropertyBrowsing,IUnknown)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(GetDisplayString)(THIS_ DISPID,BSTR*) PURE;
+ STDMETHOD(MapPropertyToPage)(THIS_ DISPID,LPCLSID) PURE;
+ STDMETHOD(GetPredefinedStrings)(THIS_ DISPID,CALPOLESTR*,CADWORD*) PURE;
+ STDMETHOD(GetPredefinedValue)(THIS_ DISPID,DWORD,VARIANT*) PURE;
+};
+EXTERN_C const IID IID_IPropertyPageSite;
+#undef INTERFACE
+#define INTERFACE IPropertyPageSite
+DECLARE_INTERFACE_(IPropertyPageSite,IUnknown)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(OnStatusChange)(THIS_ DWORD) PURE;
+ STDMETHOD(GetLocaleID)(THIS_ LCID*) PURE;
+ STDMETHOD(GetPageContainer)(THIS_ LPUNKNOWN*) PURE;
+ STDMETHOD(TranslateAccelerator)(THIS_ LPMSG) PURE;
+};
+EXTERN_C const IID IID_IPropertyPage;
+#undef INTERFACE
+#define INTERFACE IPropertyPage
+DECLARE_INTERFACE_(IPropertyPage,IUnknown)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(SetPageSite)(THIS_ LPPROPERTYPAGESITE) PURE;
+ STDMETHOD(Activate)(THIS_ HWND,LPCRECT,BOOL) PURE;
+ STDMETHOD(Deactivate)(THIS) PURE;
+ STDMETHOD(GetPageInfo)(THIS_ LPPROPPAGEINFO) PURE;
+ STDMETHOD(SetObjects)(THIS_ ULONG,LPUNKNOWN*) PURE;
+ STDMETHOD(Show)(THIS_ UINT) PURE;
+ STDMETHOD(Move)(THIS_ LPCRECT) PURE;
+ STDMETHOD(IsPageDirty)(THIS) PURE;
+ STDMETHOD(Apply)(THIS) PURE;
+ STDMETHOD(Help)(THIS_ LPCOLESTR) PURE;
+ STDMETHOD(TranslateAccelerator)(THIS_ LPMSG) PURE;
+};
+EXTERN_C const IID IID_IPropertyPage2;
+#undef INTERFACE
+#define INTERFACE IPropertyPage2
+DECLARE_INTERFACE_(IPropertyPage2,IPropertyPage)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(SetPageSite)(THIS_ LPPROPERTYPAGESITE) PURE;
+ STDMETHOD(Activate)(THIS_ HWND,LPCRECT,BOOL) PURE;
+ STDMETHOD(Deactivate)(THIS) PURE;
+ STDMETHOD(GetPageInfo)(THIS_ LPPROPPAGEINFO) PURE;
+ STDMETHOD(SetObjects)(THIS_ ULONG,LPUNKNOWN*) PURE;
+ STDMETHOD(Show)(THIS_ UINT) PURE;
+ STDMETHOD(Move)(THIS_ LPCRECT) PURE;
+ STDMETHOD(IsPageDirty)(THIS) PURE;
+ STDMETHOD(Apply)(THIS) PURE;
+ STDMETHOD(Help)(THIS_ LPCOLESTR) PURE;
+ STDMETHOD(TranslateAccelerator)(THIS_ LPMSG) PURE;
+ STDMETHOD(EditProperty)(THIS_ DISPID) PURE;
+};
+EXTERN_C const IID IID_IFont;
+#undef INTERFACE
+#define INTERFACE IFont
+DECLARE_INTERFACE_(IFont,IUnknown)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(get_Name)(THIS_ BSTR*) PURE;
+ STDMETHOD(put_Name)(THIS_ BSTR) PURE;
+ STDMETHOD(get_Size)(THIS_ CY*) PURE;
+ STDMETHOD(put_Size)(THIS_ CY) PURE;
+ STDMETHOD(get_Bold)(THIS_ BOOL*) PURE;
+ STDMETHOD(put_Bold)(THIS_ BOOL) PURE;
+ STDMETHOD(get_Italic)(THIS_ BOOL*) PURE;
+ STDMETHOD(put_Italic)(THIS_ BOOL) PURE;
+ STDMETHOD(get_Underline)(THIS_ BOOL*) PURE;
+ STDMETHOD(put_Underline)(THIS_ BOOL) PURE;
+ STDMETHOD(get_Strikethrough)(THIS_ BOOL*) PURE;
+ STDMETHOD(put_Strikethrough)(THIS_ BOOL) PURE;
+ STDMETHOD(get_Weight)(THIS_ short*) PURE;
+ STDMETHOD(put_Weight)(THIS_ short) PURE;
+ STDMETHOD(get_Charset)(THIS_ short*) PURE;
+ STDMETHOD(put_Charset)(THIS_ short) PURE;
+ STDMETHOD(get_hFont)(THIS_ HFONT*) PURE;
+ STDMETHOD(Clone)(THIS_ IFont**) PURE;
+ STDMETHOD(IsEqual)(THIS_ IFont*) PURE;
+ STDMETHOD(SetRatio)(THIS_ long,long) PURE;
+ STDMETHOD(QueryTextMetrics)(THIS_ LPTEXTMETRICOLE) PURE;
+ STDMETHOD(AddRefHfont)(THIS_ HFONT) PURE;
+ STDMETHOD(ReleaseHfont)(THIS_ HFONT) PURE;
+ STDMETHOD(SetHdc)(THIS_ HDC) PURE;
+};
+EXTERN_C const IID IID_IFontDisp;
+#undef INTERFACE
+#define INTERFACE IFontDisp
+DECLARE_INTERFACE_(IFontDisp,IDispatch)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(GetTypeInfoCount)(THIS_ UINT*) PURE;
+ STDMETHOD(GetTypeInfo)(THIS_ UINT,LCID,LPTYPEINFO*) PURE;
+ STDMETHOD(GetIDsOfNames)(THIS_ REFIID,LPOLESTR*,UINT,LCID,DISPID*) PURE;
+ STDMETHOD(Invoke)(THIS_ DISPID,REFIID,LCID,WORD,DISPPARAMS*,VARIANT*,EXCEPINFO*,UINT*) PURE;
+};
+EXTERN_C const IID IID_IPicture;
+#undef INTERFACE
+#define INTERFACE IPicture
+DECLARE_INTERFACE_(IPicture,IUnknown)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(get_Handle)(THIS_ OLE_HANDLE*) PURE;
+ STDMETHOD(get_hPal)(THIS_ OLE_HANDLE*) PURE;
+ STDMETHOD(get_Type)(THIS_ short*) PURE;
+ STDMETHOD(get_Width)(THIS_ OLE_XSIZE_HIMETRIC*) PURE;
+ STDMETHOD(get_Height)(THIS_ OLE_YSIZE_HIMETRIC*) PURE;
+ STDMETHOD(Render)(THIS_ HDC,long,long,long,long,OLE_XPOS_HIMETRIC,OLE_YPOS_HIMETRIC,OLE_XSIZE_HIMETRIC,OLE_YSIZE_HIMETRIC,LPCRECT) PURE;
+ STDMETHOD(set_hPal)(THIS_ OLE_HANDLE) PURE;
+ STDMETHOD(get_CurDC)(THIS_ HDC*) PURE;
+ STDMETHOD(SelectPicture)(THIS_ HDC,HDC*,OLE_HANDLE*) PURE;
+ STDMETHOD(get_KeepOriginalFormat)(THIS_ BOOL*) PURE;
+ STDMETHOD(put_KeepOriginalFormat)(THIS_ BOOL) PURE;
+ STDMETHOD(PictureChanged)(THIS) PURE;
+ STDMETHOD(SaveAsFile)(THIS_ LPSTREAM,BOOL,LONG*) PURE;
+ STDMETHOD(get_Attributes)(THIS_ PDWORD) PURE;
+};
+EXTERN_C const IID IID_IPictureDisp;
+#undef INTERFACE
+#define INTERFACE IPictureDisp
+DECLARE_INTERFACE_(IPictureDisp,IDispatch)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(GetTypeInfoCount)(THIS_ UINT*) PURE;
+ STDMETHOD(GetTypeInfo)(THIS_ UINT,LCID,LPTYPEINFO*) PURE;
+ STDMETHOD(GetIDsOfNames)(THIS_ REFIID,LPOLESTR*,UINT,LCID,DISPID*) PURE;
+ STDMETHOD(Invoke)(THIS_ DISPID,REFIID,LCID,WORD,DISPPARAMS*,VARIANT*,EXCEPINFO*,UINT*) PURE;
+};
+#pragma pack(pop)
+
+STDAPI DllRegisterServer(void);
+STDAPI DllUnregisterServer(void);
+STDAPI OleCreateFontIndirect(LPFONTDESC,REFIID,PVOID*);
+STDAPI OleCreatePictureIndirect(LPPICTDESC,REFIID,BOOL,PVOID*);
+STDAPI OleCreatePropertyFrame(HWND,UINT,UINT,LPCOLESTR,ULONG,LPUNKNOWN*,ULONG,LPCLSID,LCID,DWORD,PVOID);
+STDAPI OleCreatePropertyFrameIndirect(LPOCPFIPARAMS);
+STDAPI_(HCURSOR) OleIconToCursor(HINSTANCE,HICON);
+STDAPI OleLoadPicture(LPSTREAM,LONG,BOOL,REFIID,PVOID*);
+STDAPI OleTranslateColor(OLE_COLOR,HPALETTE,COLORREF*);
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/winsup/w32api/include/olectlid.h b/winsup/w32api/include/olectlid.h
new file mode 100644
index 000000000..2aefe9718
--- /dev/null
+++ b/winsup/w32api/include/olectlid.h
@@ -0,0 +1,109 @@
+#ifndef _OLECTLID_H
+#define _OLECTLID_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern const GUID IID_IDispatch;
+extern const GUID IID_IPropertyNotifySink;
+extern const GUID IID_IClassFactory2;
+extern const GUID IID_IProvideClassInfo;
+extern const GUID IID_IProvideClassInfo2;
+extern const GUID IID_IConnectionPointContainer;
+extern const GUID IID_IEnumConnectionPoints;
+extern const GUID IID_IConnectionPoint;
+extern const GUID IID_IEnumConnections;
+extern const GUID IID_IOleControl;
+extern const GUID IID_IOleControlSite;
+extern const GUID IID_ISimpleFrameSite;
+extern const GUID IID_IPersistStreamInit;
+extern const GUID IID_IPersistMemory;
+extern const GUID IID_IPersistPropertyBag;
+extern const GUID IID_IPropertyBag;
+extern const GUID IID_IErrorLog;
+extern const GUID IID_IPropertyFrame;
+extern const GUID IID_ISpecifyPropertyPages;
+extern const GUID IID_IPerPropertyBrowsing;
+extern const GUID IID_IPropertyPageSite;
+extern const GUID IID_IPropertyPage;
+extern const GUID IID_IPropertyPage2;
+extern const GUID CLSID_CFontPropPage;
+extern const GUID CLSID_CColorPropPage;
+extern const GUID CLSID_CPicturePropPage;
+extern const GUID CLSID_PersistPropset;
+extern const GUID CLSID_ConvertVBX;
+extern const GUID CLSID_StdFont;
+extern const GUID CLSID_StdPicture;
+extern const GUID IID_IFont;
+extern const GUID IID_IFontDisp;
+extern const GUID IID_IPicture;
+extern const GUID IID_IPictureDisp;
+extern const GUID GUID_HIMETRIC;
+extern const GUID GUID_COLOR;
+extern const GUID GUID_XPOSPIXEL;
+extern const GUID GUID_YPOSPIXEL;
+extern const GUID GUID_XSIZEPIXEL;
+extern const GUID GUID_YSIZEPIXEL;
+extern const GUID GUID_XPOS;
+extern const GUID GUID_YPOS;
+extern const GUID GUID_XSIZE;
+extern const GUID GUID_YSIZE;
+extern const GUID GUID_TRISTATE;
+extern const GUID GUID_OPTIONVALUEEXCLUSIVE;
+extern const GUID GUID_CHECKVALUEEXCLUSIVE;
+extern const GUID GUID_FONTNAME;
+extern const GUID GUID_FONTSIZE;
+extern const GUID GUID_FONTBOLD;
+extern const GUID GUID_FONTITALIC;
+extern const GUID GUID_FONTUNDERSCORE;
+extern const GUID GUID_FONTSTRIKETHROUGH;
+extern const GUID GUID_HANDLE;
+extern const GUID IID_IEnumUnknown;
+extern const GUID IID_IEnumString;
+extern const GUID IID_IEnumMoniker;
+extern const GUID IID_IEnumFORMATETC;
+extern const GUID IID_IEnumOLEVERB;
+extern const GUID IID_IEnumSTATDATA;
+extern const GUID IID_IEnumGeneric;
+extern const GUID IID_IEnumHolder;
+extern const GUID IID_IEnumCallback;
+extern const GUID IID_IPersistStream;
+extern const GUID IID_IPersistStorage;
+extern const GUID IID_IPersistFile;
+extern const GUID IID_IPersist;
+extern const GUID IID_IViewObject;
+extern const GUID IID_IDataObject;
+extern const GUID IID_IAdviseSink;
+extern const GUID IID_IDataAdviseHolder;
+extern const GUID IID_IOleAdviseHolder;
+extern const GUID IID_IOleObject;
+extern const GUID IID_IOleInPlaceObject;
+extern const GUID IID_IOleWindow;
+extern const GUID IID_IOleInPlaceUIWindow;
+extern const GUID IID_IOleInPlaceFrame;
+extern const GUID IID_IOleInPlaceActiveObject;
+extern const GUID IID_IOleClientSite;
+extern const GUID IID_IOleInPlaceSite;
+extern const GUID IID_IParseDisplayName;
+extern const GUID IID_IOleContainer;
+extern const GUID IID_IOleItemContainer;
+extern const GUID IID_IOleLink;
+extern const GUID IID_IOleCache;
+extern const GUID IID_IOleManager;
+extern const GUID IID_IOlePresObj;
+extern const GUID IID_IDropSource;
+extern const GUID IID_IDropTarget;
+extern const GUID IID_IDebug;
+extern const GUID IID_IDebugStream;
+extern const GUID IID_IAdviseSink2;
+extern const GUID IID_IRunnableObject;
+extern const GUID IID_IViewObject2;
+extern const GUID IID_IOleCache2;
+extern const GUID IID_IOleCacheControl;
+extern const GUID CLSID_Picture_Metafile;
+extern const GUID CLSID_Picture_Dib;
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/winsup/w32api/include/oledlg.h b/winsup/w32api/include/oledlg.h
new file mode 100644
index 000000000..24cfd4bc2
--- /dev/null
+++ b/winsup/w32api/include/oledlg.h
@@ -0,0 +1,931 @@
+#ifndef _OLEDLG_H
+#define _OLEDLG_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+#include <windows.h>
+#include <shellapi.h>
+#include <commdlg.h>
+#include <ole2.h>
+#include <string.h>
+/* #include <tchar.h> */
+#include <dlgs.h>
+#include <prsht.h>
+#define PS_MAXLINKTYPES 8
+#define OLESTDDELIM TEXT("\\")
+#define SZOLEUI_MSG_HELP TEXT("OLEUI_MSG_HELP")
+#define SZOLEUI_MSG_ENDDIALOG TEXT("OLEUI_MSG_ENDDIALOG")
+#define SZOLEUI_MSG_BROWSE TEXT("OLEUI_MSG_BROWSE")
+#define SZOLEUI_MSG_CHANGEICON TEXT("OLEUI_MSG_CHANGEICON")
+#define SZOLEUI_MSG_CLOSEBUSYDIALOG TEXT("OLEUI_MSG_CLOSEBUSYDIALOG")
+#define SZOLEUI_MSG_CONVERT TEXT("OLEUI_MSG_CONVERT")
+#define SZOLEUI_MSG_CHANGESOURCE TEXT("OLEUI_MSG_CHANGESOURCE")
+#define SZOLEUI_MSG_ADDCONTROL TEXT("OLEUI_MSG_ADDCONTROL")
+#define SZOLEUI_MSG_BROWSE_OFN TEXT("OLEUI_MSG_BROWSE_OFN")
+#define PROP_HWND_CHGICONDLG TEXT("HWND_CIDLG")
+#define IDC_OLEUIHELP 99
+#define IDC_IO_CREATENEW 2100
+#define IDC_IO_CREATEFROMFILE 2101
+#define IDC_IO_LINKFILE 2102
+#define IDC_IO_OBJECTTYPELIST 2103
+#define IDC_IO_DISPLAYASICON 2104
+#define IDC_IO_CHANGEICON 2105
+#define IDC_IO_FILE 2106
+#define IDC_IO_FILEDISPLAY 2107
+#define IDC_IO_RESULTIMAGE 2108
+#define IDC_IO_RESULTTEXT 2109
+#define IDC_IO_ICONDISPLAY 2110
+#define IDC_IO_OBJECTTYPETEXT 2111
+#define IDC_IO_FILETEXT 2112
+#define IDC_IO_FILETYPE 2113
+#define IDC_IO_INSERTCONTROL 2114
+#define IDC_IO_ADDCONTROL 2115
+#define IDC_IO_CONTROLTYPELIST 2116
+#define IDC_PS_PASTE 500
+#define IDC_PS_PASTELINK 501
+#define IDC_PS_SOURCETEXT 502
+#define IDC_PS_PASTELIST 503
+#define IDC_PS_PASTELINKLIST 504
+#define IDC_PS_DISPLAYLIST 505
+#define IDC_PS_DISPLAYASICON 506
+#define IDC_PS_ICONDISPLAY 507
+#define IDC_PS_CHANGEICON 508
+#define IDC_PS_RESULTIMAGE 509
+#define IDC_PS_RESULTTEXT 510
+#define IDC_CI_GROUP 120
+#define IDC_CI_CURRENT 121
+#define IDC_CI_CURRENTICON 122
+#define IDC_CI_DEFAULT 123
+#define IDC_CI_DEFAULTICON 124
+#define IDC_CI_FROMFILE 125
+#define IDC_CI_FROMFILEEDIT 126
+#define IDC_CI_ICONLIST 127
+#define IDC_CI_LABEL 128
+#define IDC_CI_LABELEDIT 129
+#define IDC_CI_BROWSE 130
+#define IDC_CI_ICONDISPLAY 131
+#define IDC_CV_OBJECTTYPE 150
+#define IDC_CV_DISPLAYASICON 152
+#define IDC_CV_CHANGEICON 153
+#define IDC_CV_ACTIVATELIST 154
+#define IDC_CV_CONVERTTO 155
+#define IDC_CV_ACTIVATEAS 156
+#define IDC_CV_RESULTTEXT 157
+#define IDC_CV_CONVERTLIST 158
+#define IDC_CV_ICONDISPLAY 165
+#define IDC_EL_CHANGESOURCE 201
+#define IDC_EL_AUTOMATIC 202
+#define IDC_EL_CANCELLINK 209
+#define IDC_EL_UPDATENOW 210
+#define IDC_EL_OPENSOURCE 211
+#define IDC_EL_MANUAL 212
+#define IDC_EL_LINKSOURCE 216
+#define IDC_EL_LINKTYPE 217
+#define IDC_EL_LINKSLISTBOX 206
+#define IDC_EL_COL1 220
+#define IDC_EL_COL2 221
+#define IDC_EL_COL3 222
+#define IDC_BZ_RETRY 600
+#define IDC_BZ_ICON 601
+#define IDC_BZ_MESSAGE1 602
+#define IDC_BZ_SWITCHTO 604
+#define IDC_UL_METER 1029
+#define IDC_UL_STOP 1030
+#define IDC_UL_PERCENT 1031
+#define IDC_UL_PROGRESS 1032
+#define IDC_PU_LINKS 900
+#define IDC_PU_TEXT 901
+#define IDC_PU_CONVERT 902
+#define IDC_PU_ICON 908
+#define IDC_GP_OBJECTNAME 1009
+#define IDC_GP_OBJECTTYPE 1010
+#define IDC_GP_OBJECTSIZE 1011
+#define IDC_GP_CONVERT 1013
+#define IDC_GP_OBJECTICON 1014
+#define IDC_GP_OBJECTLOCATION 1022
+#define IDC_VP_PERCENT 1000
+#define IDC_VP_CHANGEICON 1001
+#define IDC_VP_EDITABLE 1002
+#define IDC_VP_ASICON 1003
+#define IDC_VP_RELATIVE 1005
+#define IDC_VP_SPIN 1006
+#define IDC_VP_SCALETXT 1034
+#define IDC_VP_ICONDISPLAY 1021
+#define IDC_VP_RESULTIMAGE 1033
+#define IDC_LP_OPENSOURCE 1006
+#define IDC_LP_UPDATENOW 1007
+#define IDC_LP_BREAKLINK 1008
+#define IDC_LP_LINKSOURCE 1012
+#define IDC_LP_CHANGESOURCE 1015
+#define IDC_LP_AUTOMATIC 1016
+#define IDC_LP_MANUAL 1017
+#define IDC_LP_DATE 1018
+#define IDC_LP_TIME 1019
+#define IDD_INSERTOBJECT 1000
+#define IDD_CHANGEICON 1001
+#define IDD_CONVERT 1002
+#define IDD_PASTESPECIAL 1003
+#define IDD_EDITLINKS 1004
+#define IDD_BUSY 1006
+#define IDD_UPDATELINKS 1007
+#define IDD_CHANGESOURCE 1009
+#define IDD_INSERTFILEBROWSE 1010
+#define IDD_CHANGEICONBROWSE 1011
+#define IDD_CONVERTONLY 1012
+#define IDD_CHANGESOURCE4 1013
+#define IDD_GNRLPROPS 1100
+#define IDD_VIEWPROPS 1101
+#define IDD_LINKPROPS 1102
+#define IDD_CANNOTUPDATELINK 1008
+#define IDD_LINKSOURCEUNAVAILABLE 1020
+#define IDD_SERVERNOTFOUND 1023
+#define IDD_OUTOFMEMORY 1024
+#define IDD_SERVERNOTREGW 1021
+#define IDD_LINKTYPECHANGEDW 1022
+#define IDD_SERVERNOTREGA 1025
+#define IDD_LINKTYPECHANGEDA 1026
+#define ID_BROWSE_CHANGEICON 1
+#define ID_BROWSE_INSERTFILE 2
+#define ID_BROWSE_ADDCONTROL 3
+#define ID_BROWSE_CHANGESOURCE 4
+#define OLEUI_FALSE 0
+#define OLEUI_SUCCESS 1
+#define OLEUI_OK 1
+#define OLEUI_CANCEL 2
+#define OLEUI_ERR_STANDARDMIN 100
+#define OLEUI_ERR_STRUCTURENULL 101
+#define OLEUI_ERR_STRUCTUREINVALID 102
+#define OLEUI_ERR_CBSTRUCTINCORRECT 103
+#define OLEUI_ERR_HWNDOWNERINVALID 104
+#define OLEUI_ERR_LPSZCAPTIONINVALID 105
+#define OLEUI_ERR_LPFNHOOKINVALID 106
+#define OLEUI_ERR_HINSTANCEINVALID 107
+#define OLEUI_ERR_LPSZTEMPLATEINVALID 108
+#define OLEUI_ERR_HRESOURCEINVALID 109
+#define OLEUI_ERR_FINDTEMPLATEFAILURE 110
+#define OLEUI_ERR_LOADTEMPLATEFAILURE 111
+#define OLEUI_ERR_DIALOGFAILURE 112
+#define OLEUI_ERR_LOCALMEMALLOC 113
+#define OLEUI_ERR_GLOBALMEMALLOC 114
+#define OLEUI_ERR_LOADSTRING 115
+#define OLEUI_ERR_OLEMEMALLOC 116
+#define OLEUI_ERR_STANDARDMAX 116
+#define OPF_OBJECTISLINK 1
+#define OPF_NOFILLDEFAULT 2
+#define OPF_SHOWHELP 4
+#define OPF_DISABLECONVERT 8
+#define OLEUI_OPERR_SUBPROPNULL OLEUI_ERR_STANDARDMAX
+#define OLEUI_OPERR_SUBPROPINVALID (OLEUI_ERR_STANDARDMAX+1)
+#define OLEUI_OPERR_PROPSHEETNULL (OLEUI_ERR_STANDARDMAX+2)
+#define OLEUI_OPERR_PROPSHEETINVALID (OLEUI_ERR_STANDARDMAX+3)
+#define OLEUI_OPERR_SUPPROP (OLEUI_ERR_STANDARDMAX+4)
+#define OLEUI_OPERR_PROPSINVALID (OLEUI_ERR_STANDARDMAX+5)
+#define OLEUI_OPERR_PAGESINCORRECT (OLEUI_ERR_STANDARDMAX+6)
+#define OLEUI_OPERR_INVALIDPAGES (OLEUI_ERR_STANDARDMAX+7)
+#define OLEUI_OPERR_NOTSUPPORTED (OLEUI_ERR_STANDARDMAX+8)
+#define OLEUI_OPERR_DLGPROCNOTNULL (OLEUI_ERR_STANDARDMAX+9)
+#define OLEUI_OPERR_LPARAMNOTZERO (OLEUI_ERR_STANDARDMAX+10)
+#define OLEUI_GPERR_STRINGINVALID (OLEUI_ERR_STANDARDMAX+11)
+#define OLEUI_GPERR_CLASSIDINVALID (OLEUI_ERR_STANDARDMAX+12)
+#define OLEUI_GPERR_LPCLSIDEXCLUDEINVALID (OLEUI_ERR_STANDARDMAX+13)
+#define OLEUI_GPERR_CBFORMATINVALID (OLEUI_ERR_STANDARDMAX+14)
+#define OLEUI_VPERR_METAPICTINVALID (OLEUI_ERR_STANDARDMAX+15)
+#define OLEUI_VPERR_DVASPECTINVALID (OLEUI_ERR_STANDARDMAX+16)
+#define OLEUI_LPERR_LINKCNTRNULL (OLEUI_ERR_STANDARDMAX+17)
+#define OLEUI_LPERR_LINKCNTRINVALID (OLEUI_ERR_STANDARDMAX+18)
+#define OLEUI_OPERR_PROPERTYSHEET (OLEUI_ERR_STANDARDMAX+19)
+#define OLEUI_OPERR_OBJINFOINVALID (OLEUI_ERR_STANDARDMAX+20)
+#define OLEUI_OPERR_LINKINFOINVALID (OLEUI_ERR_STANDARDMAX+21)
+#define OLEUI_QUERY_GETCLASSID 65280
+#define OLEUI_QUERY_LINKBROKEN 65281
+#define IOF_SHOWHELP 1
+#define IOF_SELECTCREATENEW 2
+#define IOF_SELECTCREATEFROMFILE 4
+#define IOF_CHECKLINK 8
+#define IOF_CHECKDISPLAYASICON 16
+#define IOF_CREATENEWOBJECT 32
+#define IOF_CREATEFILEOBJECT 64
+#define IOF_CREATELINKOBJECT 128
+#define IOF_DISABLELINK 256
+#define IOF_VERIFYSERVERSEXIST 512
+#define IOF_DISABLEDISPLAYASICON 1024
+#define IOF_HIDECHANGEICON 2048
+#define IOF_SHOWINSERTCONTROL 4096
+#define IOF_SELECTCREATECONTROL 8192
+#define OLEUI_IOERR_LPSZFILEINVALID OLEUI_ERR_STANDARDMAX
+#define OLEUI_IOERR_LPSZLABELINVALID (OLEUI_ERR_STANDARDMAX+1)
+#define OLEUI_IOERR_HICONINVALID (OLEUI_ERR_STANDARDMAX+2)
+#define OLEUI_IOERR_LPFORMATETCINVALID (OLEUI_ERR_STANDARDMAX+3)
+#define OLEUI_IOERR_PPVOBJINVALID (OLEUI_ERR_STANDARDMAX+4)
+#define OLEUI_IOERR_LPIOLECLIENTSITEINVALID (OLEUI_ERR_STANDARDMAX+5)
+#define OLEUI_IOERR_LPISTORAGEINVALID (OLEUI_ERR_STANDARDMAX+6)
+#define OLEUI_IOERR_SCODEHASERROR (OLEUI_ERR_STANDARDMAX+7)
+#define OLEUI_IOERR_LPCLSIDEXCLUDEINVALID (OLEUI_ERR_STANDARDMAX+8)
+#define OLEUI_IOERR_CCHFILEINVALID (OLEUI_ERR_STANDARDMAX+9)
+#define PSF_SHOWHELP 1
+#define PSF_SELECTPASTE 2
+#define PSF_SELECTPASTELINK 4
+#define PSF_CHECKDISPLAYASICON 8
+#define PSF_DISABLEDISPLAYASICON 16
+#define PSF_HIDECHANGEICON 32
+#define PSF_STAYONCLIPBOARDCHANGE 64
+#define PSF_NOREFRESHDATAOBJECT 128
+#define OLEUI_IOERR_SRCDATAOBJECTINVALID OLEUI_ERR_STANDARDMAX
+#define OLEUI_IOERR_ARRPASTEENTRIESINVALID (OLEUI_ERR_STANDARDMAX+1)
+#define OLEUI_IOERR_ARRLINKTYPESINVALID (OLEUI_ERR_STANDARDMAX+2)
+#define OLEUI_PSERR_CLIPBOARDCHANGED (OLEUI_ERR_STANDARDMAX+3)
+#define OLEUI_PSERR_GETCLIPBOARDFAILED (OLEUI_ERR_STANDARDMAX+4)
+#define OLEUI_ELERR_LINKCNTRNULL OLEUI_ERR_STANDARDMAX
+#define OLEUI_ELERR_LINKCNTRINVALID (OLEUI_ERR_STANDARDMAX+1)
+#define ELF_SHOWHELP 1
+#define ELF_DISABLEUPDATENOW 2
+#define ELF_DISABLEOPENSOURCE 4
+#define ELF_DISABLECHANGESOURCE 8
+#define ELF_DISABLECANCELLINK 16
+#define CIF_SHOWHELP 1
+#define CIF_SELECTCURRENT 2
+#define CIF_SELECTDEFAULT 4
+#define CIF_SELECTFROMFILE 8
+#define CIF_USEICONEXE 16
+#define OLEUI_CIERR_MUSTHAVECLSID OLEUI_ERR_STANDARDMAX
+#define OLEUI_CIERR_MUSTHAVECURRENTMETAFILE (OLEUI_ERR_STANDARDMAX+1)
+#define OLEUI_CIERR_SZICONEXEINVALID (OLEUI_ERR_STANDARDMAX+2)
+#define CF_SHOWHELPBUTTON 1
+#define CF_SETCONVERTDEFAULT 2
+#define CF_SETACTIVATEDEFAULT 4
+#define CF_SELECTCONVERTTO 8
+#define CF_SELECTACTIVATEAS 16
+#define CF_DISABLEDISPLAYASICON 32
+#define CF_DISABLEACTIVATEAS 64
+#define CF_HIDECHANGEICON 128
+#define CF_CONVERTONLY 256
+#define OLEUI_CTERR_CLASSIDINVALID (OLEUI_ERR_STANDARDMAX+1)
+#define OLEUI_CTERR_DVASPECTINVALID (OLEUI_ERR_STANDARDMAX+2)
+#define OLEUI_CTERR_CBFORMATINVALID (OLEUI_ERR_STANDARDMAX+3)
+#define OLEUI_CTERR_HMETAPICTINVALID (OLEUI_ERR_STANDARDMAX+4)
+#define OLEUI_CTERR_STRINGINVALID (OLEUI_ERR_STANDARDMAX+5)
+#define BZ_DISABLECANCELBUTTON 1
+#define BZ_DISABLESWITCHTOBUTTON 2
+#define BZ_DISABLERETRYBUTTON 4
+#define BZ_NOTRESPONDINGDIALOG 8
+#define OLEUI_BZERR_HTASKINVALID OLEUI_ERR_STANDARDMAX
+#define OLEUI_BZ_SWITCHTOSELECTED (OLEUI_ERR_STANDARDMAX+1)
+#define OLEUI_BZ_RETRYSELECTED (OLEUI_ERR_STANDARDMAX+2)
+#define OLEUI_BZ_CALLUNBLOCKED (OLEUI_ERR_STANDARDMAX+3)
+#define CSF_SHOWHELP 1
+#define CSF_VALIDSOURCE 2
+#define CSF_ONLYGETSOURCE 4
+#define CSF_EXPLORER 8
+#define OLEUI_CSERR_LINKCNTRNULL OLEUI_ERR_STANDARDMAX
+#define OLEUI_CSERR_LINKCNTRINVALID (OLEUI_ERR_STANDARDMAX+1)
+#define OLEUI_CSERR_FROMNOTNULL (OLEUI_ERR_STANDARDMAX+2)
+#define OLEUI_CSERR_TONOTNULL (OLEUI_ERR_STANDARDMAX+3)
+#define OLEUI_CSERR_SOURCENULL (OLEUI_ERR_STANDARDMAX+4)
+#define OLEUI_CSERR_SOURCEINVALID (OLEUI_ERR_STANDARDMAX+5)
+#define OLEUI_CSERR_SOURCEPARSERROR (OLEUI_ERR_STANDARDMAX+6)
+#define OLEUI_CSERR_SOURCEPARSEERROR (OLEUI_ERR_STANDARDMAX+7)
+#define VPF_SELECTRELATIVE 1
+#define VPF_DISABLERELATIVE 2
+#define VPF_DISABLESCALE 4
+
+#ifndef RC_INVOKED
+#pragma pack(push, 8)
+typedef UINT (CALLBACK *LPFNOLEUIHOOK)(HWND, UINT, WPARAM, LPARAM);
+typedef struct tagOLEUIINSERTOBJECTW {
+ DWORD cbStruct;
+ DWORD dwFlags;
+ HWND hWndOwner;
+ LPCWSTR lpszCaption;
+ LPFNOLEUIHOOK lpfnHook;
+ LPARAM lCustData;
+ HINSTANCE hInstance;
+ LPCWSTR lpszTemplate;
+ HRSRC hResource;
+ CLSID clsid;
+ LPWSTR lpszFile;
+ UINT cchFile;
+ UINT cClsidExclude;
+ LPCLSID lpClsidExclude;
+ IID iid;
+ DWORD oleRender;
+ LPFORMATETC lpFormatEtc;
+ LPOLECLIENTSITE lpIOleClientSite;
+ LPSTORAGE lpIStorage;
+ PVOID *ppvObj;
+ SCODE sc;
+ HGLOBAL hMetaPict;
+} OLEUIINSERTOBJECTW,*POLEUIINSERTOBJECTW,*LPOLEUIINSERTOBJECTW;
+typedef struct tagOLEUIINSERTOBJECTA {
+ DWORD cbStruct;
+ DWORD dwFlags;
+ HWND hWndOwner;
+ LPCSTR lpszCaption;
+ LPFNOLEUIHOOK lpfnHook;
+ LPARAM lCustData;
+ HINSTANCE hInstance;
+ LPCSTR lpszTemplate;
+ HRSRC hResource;
+ CLSID clsid;
+ LPSTR lpszFile;
+ UINT cchFile;
+ UINT cClsidExclude;
+ LPCLSID lpClsidExclude;
+ IID iid;
+ DWORD oleRender;
+ LPFORMATETC lpFormatEtc;
+ LPOLECLIENTSITE lpIOleClientSite;
+ LPSTORAGE lpIStorage;
+ PVOID *ppvObj;
+ SCODE sc;
+ HGLOBAL hMetaPict;
+} OLEUIINSERTOBJECTA,*POLEUIINSERTOBJECTA,*LPOLEUIINSERTOBJECTA;
+STDAPI_(UINT) OleUIInsertObjectW(LPOLEUIINSERTOBJECTW);
+STDAPI_(UINT) OleUIInsertObjectA(LPOLEUIINSERTOBJECTA);
+typedef enum tagOLEUIPASTEFLAG {
+ OLEUIPASTE_PASTEONLY,
+ OLEUIPASTE_LINKTYPE1,
+ OLEUIPASTE_LINKTYPE2,
+ OLEUIPASTE_LINKTYPE3=4,
+ OLEUIPASTE_LINKTYPE4=8,
+ OLEUIPASTE_LINKTYPE5=16,
+ OLEUIPASTE_LINKTYPE6=32,
+ OLEUIPASTE_LINKTYPE7=64,
+ OLEUIPASTE_LINKTYPE8=128,
+ OLEUIPASTE_PASTE=512,
+ OLEUIPASTE_LINKANYTYPE=1024,
+ OLEUIPASTE_ENABLEICON=2048,
+} OLEUIPASTEFLAG;
+typedef struct tagOLEUIPASTEENTRYW {
+ FORMATETC fmtetc;
+ LPCWSTR lpstrFormatName;
+ LPCWSTR lpstrResultText;
+ DWORD dwFlags;
+ DWORD dwScratchSpace;
+} OLEUIPASTEENTRYW,*POLEUIPASTEENTRYW,*LPOLEUIPASTEENTRYW;
+typedef struct tagOLEUIPASTEENTRYA {
+ FORMATETC fmtetc;
+ LPCSTR lpstrFormatName;
+ LPCSTR lpstrResultText;
+ DWORD dwFlags;
+ DWORD dwScratchSpace;
+} OLEUIPASTEENTRYA,*POLEUIPASTEENTRYA,*LPOLEUIPASTEENTRYA;
+typedef struct tagOLEUIPASTESPECIALW {
+ DWORD cbStruct;
+ DWORD dwFlags;
+ HWND hWndOwner;
+ LPCWSTR lpszCaption;
+ LPFNOLEUIHOOK lpfnHook;
+ LPARAM lCustData;
+ HINSTANCE hInstance;
+ LPCWSTR lpszTemplate;
+ HRSRC hResource;
+ LPDATAOBJECT lpSrcDataObj;
+ LPOLEUIPASTEENTRYW arrPasteEntries;
+ int cPasteEntries;
+ UINT *arrLinkTypes;
+ int cLinkTypes;
+ UINT cClsidExclude;
+ LPCLSID lpClsidExclude;
+ int nSelectedIndex;
+ BOOL fLink;
+ HGLOBAL hMetaPict;
+ SIZEL sizel;
+} OLEUIPASTESPECIALW,*POLEUIPASTESPECIALW,*LPOLEUIPASTESPECIALW;
+typedef struct tagOLEUIPASTESPECIALA {
+ DWORD cbStruct;
+ DWORD dwFlags;
+ HWND hWndOwner;
+ LPCSTR lpszCaption;
+ LPFNOLEUIHOOK lpfnHook;
+ LPARAM lCustData;
+ HINSTANCE hInstance;
+ LPCSTR lpszTemplate;
+ HRSRC hResource;
+ LPDATAOBJECT lpSrcDataObj;
+ LPOLEUIPASTEENTRYA arrPasteEntries;
+ int cPasteEntries;
+ UINT *arrLinkTypes;
+ int cLinkTypes;
+ UINT cClsidExclude;
+ LPCLSID lpClsidExclude;
+ int nSelectedIndex;
+ BOOL fLink;
+ HGLOBAL hMetaPict;
+ SIZEL sizel;
+} OLEUIPASTESPECIALA,*POLEUIPASTESPECIALA,*LPOLEUIPASTESPECIALA;
+#undef INTERFACE
+#define INTERFACE IOleUILinkContainerW
+DECLARE_INTERFACE_(IOleUILinkContainerW, IUnknown)
+{
+ STDMETHOD(QueryInterface) (THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef) (THIS) PURE;
+ STDMETHOD_(ULONG,Release) (THIS) PURE;
+ STDMETHOD_(DWORD,GetNextLink) (THIS_ DWORD dwLink) PURE;
+ STDMETHOD(SetLinkUpdateOptions) (THIS_ DWORD,DWORD) PURE;
+ STDMETHOD(GetLinkUpdateOptions) (THIS_ DWORD,PDWORD) PURE;
+ STDMETHOD(SetLinkSource) (THIS_ DWORD, LPWSTR,ULONG,PULONG,BOOL) PURE;
+ STDMETHOD(GetLinkSource) (THIS_ DWORD,LPWSTR*,PULONG,LPWSTR*,LPWSTR*,BOOL*,BOOL*) PURE;
+ STDMETHOD(OpenLinkSource) (THIS_ DWORD) PURE;
+ STDMETHOD(UpdateLink) (THIS_ DWORD,BOOL,BOOL) PURE;
+ STDMETHOD(CancelLink) (THIS_ DWORD) PURE;
+};
+typedef IOleUILinkContainerW *LPOLEUILINKCONTAINERW;
+#undef INTERFACE
+#define INTERFACE IOleUILinkContainerA
+DECLARE_INTERFACE_(IOleUILinkContainerA, IUnknown)
+{
+ STDMETHOD(QueryInterface) (THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef) (THIS) PURE;
+ STDMETHOD_(ULONG,Release) (THIS) PURE;
+ STDMETHOD_(DWORD,GetNextLink) (THIS_ DWORD) PURE;
+ STDMETHOD(SetLinkUpdateOptions) (THIS_ DWORD,DWORD) PURE;
+ STDMETHOD(GetLinkUpdateOptions) (THIS_ DWORD,PDWORD) PURE;
+ STDMETHOD(SetLinkSource) (THIS_ DWORD, LPSTR,ULONG,PULONG,BOOL) PURE;
+ STDMETHOD(GetLinkSource) (THIS_ DWORD,LPSTR*,PULONG,LPSTR*,LPSTR*,BOOL*,BOOL*) PURE;
+ STDMETHOD(OpenLinkSource) (THIS_ DWORD) PURE;
+ STDMETHOD(UpdateLink) (THIS_ DWORD,BOOL,BOOL) PURE;
+ STDMETHOD(CancelLink) (THIS_ DWORD) PURE;
+};
+typedef IOleUILinkContainerA *LPOLEUILINKCONTAINERA;
+typedef struct tagOLEUIEDITLINKSW {
+ DWORD cbStruct;
+ DWORD dwFlags;
+ HWND hWndOwner;
+ LPCWSTR lpszCaption;
+ LPFNOLEUIHOOK lpfnHook;
+ LPARAM lCustData;
+ HINSTANCE hInstance;
+ LPCWSTR lpszTemplate;
+ HRSRC hResource;
+ LPOLEUILINKCONTAINERW lpOleUILinkContainer;
+} OLEUIEDITLINKSW,*POLEUIEDITLINKSW,*LPOLEUIEDITLINKSW;
+typedef struct tagOLEUIEDITLINKSA {
+ DWORD cbStruct;
+ DWORD dwFlags;
+ HWND hWndOwner;
+ LPCSTR lpszCaption;
+ LPFNOLEUIHOOK lpfnHook;
+ LPARAM lCustData;
+ HINSTANCE hInstance;
+ LPCSTR lpszTemplate;
+ HRSRC hResource;
+ LPOLEUILINKCONTAINERA lpOleUILinkContainer;
+} OLEUIEDITLINKSA,*POLEUIEDITLINKSA,*LPOLEUIEDITLINKSA;
+typedef struct tagOLEUICHANGEICONW {
+ DWORD cbStruct;
+ DWORD dwFlags;
+ HWND hWndOwner;
+ LPCWSTR lpszCaption;
+ LPFNOLEUIHOOK lpfnHook;
+ LPARAM lCustData;
+ HINSTANCE hInstance;
+ LPCWSTR lpszTemplate;
+ HRSRC hResource;
+ HGLOBAL hMetaPict;
+ CLSID clsid;
+ WCHAR szIconExe[MAX_PATH];
+ int cchIconExe;
+} OLEUICHANGEICONW,*POLEUICHANGEICONW,*LPOLEUICHANGEICONW;
+typedef struct tagOLEUICHANGEICONA {
+ DWORD cbStruct;
+ DWORD dwFlags;
+ HWND hWndOwner;
+ LPCSTR lpszCaption;
+ LPFNOLEUIHOOK lpfnHook;
+ LPARAM lCustData;
+ HINSTANCE hInstance;
+ LPCSTR lpszTemplate;
+ HRSRC hResource;
+ HGLOBAL hMetaPict;
+ CLSID clsid;
+ CHAR szIconExe[MAX_PATH];
+ int cchIconExe;
+} OLEUICHANGEICONA,*POLEUICHANGEICONA,*LPOLEUICHANGEICONA;
+typedef struct tagOLEUICONVERTW {
+ DWORD cbStruct;
+ DWORD dwFlags;
+ HWND hWndOwner;
+ LPCWSTR lpszCaption;
+ LPFNOLEUIHOOK lpfnHook;
+ LPARAM lCustData;
+ HINSTANCE hInstance;
+ LPCWSTR lpszTemplate;
+ HRSRC hResource;
+ CLSID clsid;
+ CLSID clsidConvertDefault;
+ CLSID clsidActivateDefault;
+ CLSID clsidNew;
+ DWORD dvAspect;
+ WORD wFormat;
+ BOOL fIsLinkedObject;
+ HGLOBAL hMetaPict;
+ LPWSTR lpszUserType;
+ BOOL fObjectsIconChanged;
+ LPWSTR lpszDefLabel;
+ UINT cClsidExclude;
+ LPCLSID lpClsidExclude;
+} OLEUICONVERTW,*POLEUICONVERTW,*LPOLEUICONVERTW;
+typedef struct tagOLEUICONVERTA {
+ DWORD cbStruct;
+ DWORD dwFlags;
+ HWND hWndOwner;
+ LPCSTR lpszCaption;
+ LPFNOLEUIHOOK lpfnHook;
+ LPARAM lCustData;
+ HINSTANCE hInstance;
+ LPCSTR lpszTemplate;
+ HRSRC hResource;
+ CLSID clsid;
+ CLSID clsidConvertDefault;
+ CLSID clsidActivateDefault;
+ CLSID clsidNew;
+ DWORD dvAspect;
+ WORD wFormat;
+ BOOL fIsLinkedObject;
+ HGLOBAL hMetaPict;
+ LPSTR lpszUserType;
+ BOOL fObjectsIconChanged;
+ LPSTR lpszDefLabel;
+ UINT cClsidExclude;
+ LPCLSID lpClsidExclude;
+} OLEUICONVERTA,*POLEUICONVERTA,*LPOLEUICONVERTA;
+typedef struct tagOLEUIBUSYW {
+ DWORD cbStruct;
+ DWORD dwFlags;
+ HWND hWndOwner;
+ LPCWSTR lpszCaption;
+ LPFNOLEUIHOOK lpfnHook;
+ LPARAM lCustData;
+ HINSTANCE hInstance;
+ LPCWSTR lpszTemplate;
+ HRSRC hResource;
+ HTASK hTask;
+ HWND *lphWndDialog;
+} OLEUIBUSYW,*POLEUIBUSYW,*LPOLEUIBUSYW;
+typedef struct tagOLEUIBUSYA {
+ DWORD cbStruct;
+ DWORD dwFlags;
+ HWND hWndOwner;
+ LPCSTR lpszCaption;
+ LPFNOLEUIHOOK lpfnHook;
+ LPARAM lCustData;
+ HINSTANCE hInstance;
+ LPCSTR lpszTemplate;
+ HRSRC hResource;
+ HTASK hTask;
+ HWND *lphWndDialog;
+} OLEUIBUSYA,*POLEUIBUSYA,*LPOLEUIBUSYA;
+typedef struct tagOLEUICHANGESOURCEW {
+ DWORD cbStruct;
+ DWORD dwFlags;
+ HWND hWndOwner;
+ LPCWSTR lpszCaption;
+ LPFNOLEUIHOOK lpfnHook;
+ LPARAM lCustData;
+ HINSTANCE hInstance;
+ LPCWSTR lpszTemplate;
+ HRSRC hResource;
+ OPENFILENAMEW* lpOFN;
+ DWORD dwReserved1[4];
+ LPOLEUILINKCONTAINERW lpOleUILinkContainer;
+ DWORD dwLink;
+ LPWSTR lpszDisplayName;
+ ULONG nFileLength;
+ LPWSTR lpszFrom;
+ LPWSTR lpszTo;
+} OLEUICHANGESOURCEW,*POLEUICHANGESOURCEW,*LPOLEUICHANGESOURCEW;
+typedef struct tagOLEUICHANGESOURCEA {
+ DWORD cbStruct;
+ DWORD dwFlags;
+ HWND hWndOwner;
+ LPCSTR lpszCaption;
+ LPFNOLEUIHOOK lpfnHook;
+ LPARAM lCustData;
+ HINSTANCE hInstance;
+ LPCSTR lpszTemplate;
+ HRSRC hResource;
+ OPENFILENAMEA *lpOFN;
+ DWORD dwReserved1[4];
+ LPOLEUILINKCONTAINERA lpOleUILinkContainer;
+ DWORD dwLink;
+ LPSTR lpszDisplayName;
+ ULONG nFileLength;
+ LPSTR lpszFrom;
+ LPSTR lpszTo;
+} OLEUICHANGESOURCEA,*POLEUICHANGESOURCEA,*LPOLEUICHANGESOURCEA;
+#undef INTERFACE
+#define INTERFACE IOleUIObjInfoW
+DECLARE_INTERFACE_(IOleUIObjInfoW, IUnknown)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(GetObjectInfo)(THIS_ DWORD,PDWORD,LPWSTR*,LPWSTR*,LPWSTR*,LPWSTR*) PURE;
+ STDMETHOD(GetConvertInfo)(THIS_ DWORD,CLSID*,PWORD,CLSID*,LPCLSID*,UINT*) PURE;
+ STDMETHOD(ConvertObject)(THIS_ DWORD,REFCLSID) PURE;
+ STDMETHOD(GetViewInfo)(THIS_ DWORD,HGLOBAL*,PDWORD,int*) PURE;
+ STDMETHOD(SetViewInfo)(THIS_ DWORD,HGLOBAL,DWORD,int,BOOL) PURE;
+};
+typedef IOleUIObjInfoW *LPOLEUIOBJINFOW;
+#undef INTERFACE
+#define INTERFACE IOleUIObjInfoA
+DECLARE_INTERFACE_(IOleUIObjInfoA, IUnknown)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(GetObjectInfo)(THIS_ DWORD,PDWORD,LPSTR*,LPSTR*,LPSTR*,LPSTR*) PURE;
+ STDMETHOD(GetConvertInfo)(THIS_ DWORD,CLSID*,PWORD,CLSID*,LPCLSID*,UINT*) PURE;
+ STDMETHOD(ConvertObject)(THIS_ DWORD,REFCLSID) PURE;
+ STDMETHOD(GetViewInfo)(THIS_ DWORD,HGLOBAL*,PDWORD,int*) PURE;
+ STDMETHOD(SetViewInfo)(THIS_ DWORD,HGLOBAL,DWORD,int,BOOL) PURE;
+};
+typedef IOleUIObjInfoA *LPOLEUIOBJINFOA;
+#undef INTERFACE
+#define INTERFACE IOleUILinkInfoW
+DECLARE_INTERFACE_(IOleUILinkInfoW, IOleUILinkContainerW)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD_(DWORD,GetNextLink)(THIS_ DWORD) PURE;
+ STDMETHOD(SetLinkUpdateOptions)(THIS_ DWORD,DWORD) PURE;
+ STDMETHOD(GetLinkUpdateOptions)(THIS_ DWORD,DWORD*) PURE;
+ STDMETHOD(SetLinkSource)(THIS_ DWORD,LPWSTR,ULONG,PULONG,BOOL) PURE;
+ STDMETHOD(GetLinkSource)(THIS_ DWORD,LPWSTR*,PULONG,LPWSTR*,LPWSTR*,BOOL*,BOOL*) PURE;
+ STDMETHOD(OpenLinkSource)(THIS_ DWORD) PURE;
+ STDMETHOD(UpdateLink)(THIS_ DWORD,BOOL,BOOL) PURE;
+ STDMETHOD(CancelLink)(THIS_ DWORD) PURE;
+ STDMETHOD(GetLastUpdate)(THIS_ DWORD,FILETIME*) PURE;
+};
+typedef IOleUILinkInfoW *LPOLEUILINKINFOW;
+#undef INTERFACE
+#define INTERFACE IOleUILinkInfoA
+DECLARE_INTERFACE_(IOleUILinkInfoA, IOleUILinkContainerA)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD_(DWORD,GetNextLink)(THIS_ DWORD) PURE;
+ STDMETHOD(SetLinkUpdateOptions)(THIS_ DWORD,DWORD) PURE;
+ STDMETHOD(GetLinkUpdateOptions)(THIS_ DWORD,DWORD*) PURE;
+ STDMETHOD(SetLinkSource)(THIS_ DWORD,LPSTR,ULONG,PULONG,BOOL) PURE;
+ STDMETHOD(GetLinkSource)(THIS_ DWORD,LPSTR*,PULONG,LPSTR*,LPSTR*,BOOL*,BOOL*) PURE;
+ STDMETHOD(OpenLinkSource)(THIS_ DWORD) PURE;
+ STDMETHOD(UpdateLink)(THIS_ DWORD,BOOL,BOOL) PURE;
+ STDMETHOD(CancelLink)(THIS_ DWORD) PURE;
+ STDMETHOD(GetLastUpdate)(THIS_ DWORD,FILETIME*) PURE;
+};
+typedef IOleUILinkInfoA* LPOLEUILINKINFOA;
+struct tagOLEUIOBJECTPROPSW;
+struct tagOLEUIOBJECTPROPSA;
+typedef struct tagOLEUIGNRLPROPSW {
+ DWORD cbStruct;
+ DWORD dwFlags;
+ DWORD dwReserved1[2];
+ LPFNOLEUIHOOK lpfnHook;
+ LPARAM lCustData;
+ DWORD dwReserved2[3];
+ struct tagOLEUIOBJECTPROPSW* lpOP;
+} OLEUIGNRLPROPSW,*POLEUIGNRLPROPSW,*LPOLEUIGNRLPROPSW;
+typedef struct tagOLEUIGNRLPROPSA {
+ DWORD cbStruct;
+ DWORD dwFlags;
+ DWORD dwReserved1[2];
+ LPFNOLEUIHOOK lpfnHook;
+ LPARAM lCustData;
+ DWORD dwReserved2[3];
+ struct tagOLEUIOBJECTPROPSA* lpOP;
+} OLEUIGNRLPROPSA,*POLEUIGNRLPROPSA,*LPOLEUIGNRLPROPSA;
+typedef struct tagOLEUIVIEWPROPSW {
+ DWORD cbStruct;
+ DWORD dwFlags;
+ DWORD dwReserved1[2];
+ LPFNOLEUIHOOK lpfnHook;
+ LPARAM lCustData;
+ DWORD dwReserved2[3];
+ struct tagOLEUIOBJECTPROPSW* lpOP;
+ int nScaleMin;
+ int nScaleMax;
+} OLEUIVIEWPROPSW,*POLEUIVIEWPROPSW,*LPOLEUIVIEWPROPSW;
+typedef struct tagOLEUIVIEWPROPSA {
+ DWORD cbStruct;
+ DWORD dwFlags;
+ DWORD dwReserved1[2];
+ LPFNOLEUIHOOK lpfnHook;
+ LPARAM lCustData;
+ DWORD dwReserved2[3];
+ struct tagOLEUIOBJECTPROPSA *lpOP;
+ int nScaleMin;
+ int nScaleMax;
+} OLEUIVIEWPROPSA,*POLEUIVIEWPROPSA,*LPOLEUIVIEWPROPSA;
+typedef struct tagOLEUILINKPROPSW {
+ DWORD cbStruct;
+ DWORD dwFlags;
+ DWORD dwReserved1[2];
+ LPFNOLEUIHOOK lpfnHook;
+ LPARAM lCustData;
+ DWORD dwReserved2[3];
+ struct tagOLEUIOBJECTPROPSW *lpOP;
+} OLEUILINKPROPSW, *POLEUILINKPROPSW,* LPOLEUILINKPROPSW;
+typedef struct tagOLEUILINKPROPSA {
+ DWORD cbStruct;
+ DWORD dwFlags;
+ DWORD dwReserved1[2];
+ LPFNOLEUIHOOK lpfnHook;
+ LPARAM lCustData;
+ DWORD dwReserved2[3];
+ struct tagOLEUIOBJECTPROPSA* lpOP;
+} OLEUILINKPROPSA,*POLEUILINKPROPSA,*LPOLEUILINKPROPSA;
+typedef struct tagOLEUIOBJECTPROPSW {
+ DWORD cbStruct;
+ DWORD dwFlags;
+ LPPROPSHEETHEADERW lpPS;
+ DWORD dwObject;
+ LPOLEUIOBJINFOW lpObjInfo;
+ DWORD dwLink;
+ LPOLEUILINKINFOW lpLinkInfo;
+ LPOLEUIGNRLPROPSW lpGP;
+ LPOLEUIVIEWPROPSW lpVP;
+ LPOLEUILINKPROPSW lpLP;
+} OLEUIOBJECTPROPSW,*POLEUIOBJECTPROPSW,*LPOLEUIOBJECTPROPSW;
+typedef struct tagOLEUIOBJECTPROPSA {
+ DWORD cbStruct;
+ DWORD dwFlags;
+ LPPROPSHEETHEADERA lpPS;
+ DWORD dwObject;
+ LPOLEUIOBJINFOA lpObjInfo;
+ DWORD dwLink;
+ LPOLEUILINKINFOA lpLinkInfo;
+ LPOLEUIGNRLPROPSA lpGP;
+ LPOLEUIVIEWPROPSA lpVP;
+ LPOLEUILINKPROPSA lpLP;
+} OLEUIOBJECTPROPSA,*POLEUIOBJECTPROPSA,*LPOLEUIOBJECTPROPSA;
+
+STDAPI_(BOOL) OleUIAddVerbMenuW(LPOLEOBJECT,LPCWSTR,HMENU,UINT,UINT,UINT,BOOL,UINT,HMENU*);
+STDAPI_(BOOL) OleUIAddVerbMenuA(LPOLEOBJECT,LPCSTR,HMENU,UINT,UINT,UINT,BOOL,UINT,HMENU*);
+STDAPI_(UINT) OleUIBusyW(LPOLEUIBUSYW);
+STDAPI_(UINT) OleUIBusyA(LPOLEUIBUSYA);
+STDAPI_(BOOL) OleUICanConvertOrActivateAs(REFCLSID,BOOL,WORD);
+STDAPI_(UINT) OleUIChangeIconW(LPOLEUICHANGEICONW);
+STDAPI_(UINT) OleUIChangeIconA(LPOLEUICHANGEICONA);
+STDAPI_(UINT) OleUIChangeSourceW(LPOLEUICHANGESOURCEW);
+STDAPI_(UINT) OleUIChangeSourceA(LPOLEUICHANGESOURCEA);
+STDAPI_(UINT) OleUIConvertW(LPOLEUICONVERTW);
+STDAPI_(UINT) OleUIConvertA(LPOLEUICONVERTA);
+STDAPI_(UINT) OleUIEditLinksW(LPOLEUIEDITLINKSW);
+STDAPI_(UINT) OleUIEditLinksA(LPOLEUIEDITLINKSA);
+STDAPI_(UINT) OleUIObjectPropertiesW(LPOLEUIOBJECTPROPSW);
+STDAPI_(UINT) OleUIObjectPropertiesA(LPOLEUIOBJECTPROPSA);
+STDAPI_(UINT) OleUIPasteSpecialW(LPOLEUIPASTESPECIALW);
+STDAPI_(UINT) OleUIPasteSpecialA(LPOLEUIPASTESPECIALA);
+int OleUIPromptUserW(int,HWND,...);
+int OleUIPromptUserA(int,HWND,...);
+STDAPI_(BOOL) OleUIUpdateLinksW(LPOLEUILINKCONTAINERW,HWND,LPWSTR,int);
+STDAPI_(BOOL) OleUIUpdateLinksA(LPOLEUILINKCONTAINERA,HWND,LPSTR,int);
+
+#ifdef UNICODE
+#define IDD_SERVERNOTREG IDD_SERVERNOTREGW
+#define IDD_LINKTYPECHANGED IDD_LINKTYPECHANGEDW
+#define OleUIUpdateLinks OleUIUpdateLinksW
+#define OleUIAddVerbMenu OleUIAddVerbMenuW
+#define tagOLEUIOBJECTPROPS tagOLEUIOBJECTPROPSW
+#define OLEUIOBJECTPROPS OLEUIOBJECTPROPSW
+#define POLEUIOBJECTPROPS POLEUIOBJECTPROPSW
+#define LPOLEUIOBJECTPROPS LPOLEUIOBJECTPROPSW
+#define OleUIObjectProperties OleUIObjectPropertiesW
+#define tagOLEUIINSERTOBJECT tagOLEUIINSERTOBJECTW
+#define OLEUIINSERTOBJECT OLEUIINSERTOBJECTW
+#define POLEUIINSERTOBJECT POLEUIINSERTOBJECTW
+#define LPOLEUIINSERTOBJECT LPOLEUIINSERTOBJECTW
+#define OleUIInsertObject OleUIInsertObjectW
+#define OleUIPromptUser OleUIPromptUserW
+#define tagOLEUIPASTEENTRY tagOLEUIPASTEENTRYW
+#define OLEUIPASTEENTRY OLEUIPASTEENTRYW
+#define POLEUIPASTEENTRY POLEUIPASTEENTRYW
+#define LPOLEUIPASTEENTRY LPOLEUIPASTEENTRYW
+#define tagOLEUIPASTESPECIAL tagOLEUIPASTESPECIALW
+#define OLEUIPASTESPECIAL OLEUIPASTESPECIALW
+#define POLEUIPASTESPECIAL POLEUIPASTESPECIALW
+#define LPOLEUIPASTESPECIAL LPOLEUIPASTESPECIALW
+#define OleUIPasteSpecial OleUIPasteSpecialW
+#define IOleUILinkContainer IOleUILinkContainerW
+#define LPOLEUILINKCONTAINER LPOLEUILINKCONTAINERW
+#define tagOLEUIEDITLINKS tagOLEUIEDITLINKSW
+#define OLEUIEDITLINKS OLEUIEDITLINKSW
+#define POLEUIEDITLINKS POLEUIEDITLINKSW
+#define LPOLEUIEDITLINKS LPOLEUIEDITLINKSW
+#define OleUIEditLinks OleUIEditLinksW
+#define tagOLEUICHANGEICON tagOLEUICHANGEICONW
+#define OLEUICHANGEICON OLEUICHANGEICONW
+#define POLEUICHANGEICON POLEUICHANGEICONW
+#define LPOLEUICHANGEICON LPOLEUICHANGEICONW
+#define OleUIChangeIcon OleUIChangeIconW
+#define tagOLEUICONVERT tagOLEUICONVERTW
+#define OLEUICONVERT OLEUICONVERTW
+#define POLEUICONVERT POLEUICONVERTW
+#define LPOLEUICONVERT LPOLEUICONVERTW
+#define OleUIConvert OleUIConvertW
+#define tagOLEUIBUSY tagOLEUIBUSYW
+#define OLEUIBUSY OLEUIBUSYW
+#define POLEUIBUSY POLEUIBUSYW
+#define LPOLEUIBUSY LPOLEUIBUSYW
+#define OleUIBusy OleUIBusyW
+#define tagOLEUICHANGESOURCE tagOLEUICHANGESOURCEW
+#define OLEUICHANGESOURCE OLEUICHANGESOURCEW
+#define POLEUICHANGESOURCE POLEUICHANGESOURCEW
+#define LPOLEUICHANGESOURCE LPOLEUICHANGESOURCEW
+#define OleUIChangeSource OleUIChangeSourceW
+#define IOleUIObjInfo IOleUIObjInfoW
+#define LPOLEUIOBJINFO LPOLEUIOBJINFOW
+#define IOleUILinkInfo IOleUILinkInfoW
+#define IOleUILinkInfoVtbl IOleUILinkInfoWVtbl
+#define LPOLEUILINKINFO LPOLEUILINKINFOW
+#define tagOLEUIGNRLPROPS tagOLEUIGNRLPROPSW
+#define OLEUIGNRLPROPS OLEUIGNRLPROPSW
+#define POLEUIGNRLPROPS POLEUIGNRLPROPSW
+#define LPOLEUIGNRLPROPS LPOLEUIGNRLPROPSW
+#define tagOLEUIVIEWPROPS tagOLEUIVIEWPROPSW
+#define OLEUIVIEWPROPS OLEUIVIEWPROPSW
+#define POLEUIVIEWPROPS POLEUIVIEWPROPSW
+#define LPOLEUIVIEWPROPS LPOLEUIVIEWPROPSW
+#define tagOLEUILINKPROPS tagOLEUILINKPROPSW
+#define OLEUILINKPROPS OLEUILINKPROPSW
+#define POLEUILINKPROPS POLEUILINKPROPSW
+#define LPOLEUILINKPROPS LPOLEUILINKPROPSW
+#else
+#define IDD_SERVERNOTREG IDD_SERVERNOTREGA
+#define IDD_LINKTYPECHANGED IDD_LINKTYPECHANGEDA
+#define OleUIUpdateLinks OleUIUpdateLinksA
+#define OleUIAddVerbMenu OleUIAddVerbMenuA
+#define tagOLEUIOBJECTPROPS tagOLEUIOBJECTPROPSA
+#define OLEUIOBJECTPROPS OLEUIOBJECTPROPSA
+#define POLEUIOBJECTPROPS POLEUIOBJECTPROPSA
+#define LPOLEUIOBJECTPROPS LPOLEUIOBJECTPROPSA
+#define OleUIObjectProperties OleUIObjectPropertiesA
+#define tagOLEUIINSERTOBJECT tagOLEUIINSERTOBJECTA
+#define OLEUIINSERTOBJECT OLEUIINSERTOBJECTA
+#define POLEUIINSERTOBJECT POLEUIINSERTOBJECTA
+#define LPOLEUIINSERTOBJECT LPOLEUIINSERTOBJECTA
+#define OleUIInsertObject OleUIInsertObjectA
+#define OleUIPromptUser OleUIPromptUserA
+#define tagOLEUIPASTEENTRY tagOLEUIPASTEENTRYA
+#define OLEUIPASTEENTRY OLEUIPASTEENTRYA
+#define POLEUIPASTEENTRY POLEUIPASTEENTRYA
+#define LPOLEUIPASTEENTRY LPOLEUIPASTEENTRYA
+#define tagOLEUIPASTESPECIAL tagOLEUIPASTESPECIALA
+#define OLEUIPASTESPECIAL OLEUIPASTESPECIALA
+#define POLEUIPASTESPECIAL POLEUIPASTESPECIALA
+#define LPOLEUIPASTESPECIAL LPOLEUIPASTESPECIALA
+#define OleUIPasteSpecial OleUIPasteSpecialA
+#define IOleUILinkContainer IOleUILinkContainerA
+#define LPOLEUILINKCONTAINER LPOLEUILINKCONTAINERA
+#define tagOLEUIEDITLINKS tagOLEUIEDITLINKSA
+#define OLEUIEDITLINKS OLEUIEDITLINKSA
+#define POLEUIEDITLINKS POLEUIEDITLINKSA
+#define LPOLEUIEDITLINKS LPOLEUIEDITLINKSA
+#define OleUIEditLinks OleUIEditLinksA
+#define tagOLEUICHANGEICON tagOLEUICHANGEICONA
+#define OLEUICHANGEICON OLEUICHANGEICONA
+#define POLEUICHANGEICON POLEUICHANGEICONA
+#define LPOLEUICHANGEICON LPOLEUICHANGEICONA
+#define OleUIChangeIcon OleUIChangeIconA
+#define tagOLEUICONVERT tagOLEUICONVERTA
+#define OLEUICONVERT OLEUICONVERTA
+#define POLEUICONVERT POLEUICONVERTA
+#define LPOLEUICONVERT LPOLEUICONVERTA
+#define OleUIConvert OleUIConvertA
+#define tagOLEUIBUSY tagOLEUIBUSYA
+#define OLEUIBUSY OLEUIBUSYA
+#define POLEUIBUSY POLEUIBUSYA
+#define LPOLEUIBUSY LPOLEUIBUSYA
+#define OleUIBusy OleUIBusyA
+#define tagOLEUICHANGESOURCE tagOLEUICHANGESOURCEA
+#define OLEUICHANGESOURCE OLEUICHANGESOURCEA
+#define POLEUICHANGESOURCE POLEUICHANGESOURCEA
+#define LPOLEUICHANGESOURCE LPOLEUICHANGESOURCEA
+#define OleUIChangeSource OleUIChangeSourceA
+#define IOleUIObjInfo IOleUIObjInfoA
+#define LPOLEUIOBJINFO LPOLEUIOBJINFOA
+#define IOleUILinkInfo IOleUILinkInfoA
+#define IOleUILinkInfoVtbl IOleUILinkInfoAVtbl
+#define LPOLEUILINKINFO LPOLEUILINKINFOA
+#define tagOLEUIGNRLPROPS tagOLEUIGNRLPROPSA
+#define OLEUIGNRLPROPS OLEUIGNRLPROPSA
+#define POLEUIGNRLPROPS POLEUIGNRLPROPSA
+#define LPOLEUIGNRLPROPS LPOLEUIGNRLPROPSA
+#define tagOLEUIVIEWPROPS tagOLEUIVIEWPROPSA
+#define OLEUIVIEWPROPS OLEUIVIEWPROPSA
+#define POLEUIVIEWPROPS POLEUIVIEWPROPSA
+#define LPOLEUIVIEWPROPS LPOLEUIVIEWPROPSA
+#define tagOLEUILINKPROPS tagOLEUILINKPROPSA
+#define OLEUILINKPROPS OLEUILINKPROPSA
+#define POLEUILINKPROPS POLEUILINKPROPSA
+#define LPOLEUILINKPROPS LPOLEUILINKPROPSA
+#endif
+#pragma pack(pop)
+#endif
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/winsup/w32api/include/oleidl.h b/winsup/w32api/include/oleidl.h
new file mode 100644
index 000000000..e6b951f1d
--- /dev/null
+++ b/winsup/w32api/include/oleidl.h
@@ -0,0 +1,320 @@
+#ifndef _OLEIDL_H
+#define _OLEIDL_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <objfwd.h>
+typedef interface IParseDisplayname *LPPARSEDISPLAYNAME;
+typedef interface IOleContainer *LPOLECONTAINER;
+typedef interface IOleClientSite *LPOLECLIENTSITE;
+typedef interface IOleObject *LPOLEOBJECT;
+typedef interface IDropTarget *LPDROPTARGET;
+typedef interface IDropSource *LPDROPSOURCE;
+typedef interface IEnumOleDocumentViews *LPENUMOLEDOCUMENTVIEWS;
+typedef interface IEnumOleUndoUnits *LPENUMOLEUNDOUNITS;
+typedef interface IEnumOLEVERB *LPENUMOLEVERB;
+typedef interface IOleWindow *LPOLEWINDOW;
+typedef interface IOleInPlaceUIWindow *LPOLEINPLACEUIWINDOW;
+typedef interface IOleInPlaceActiveObject *LPOLEINPLACEACTIVEOBJECT;
+typedef interface IOleInPlaceFrame *LPOLEINPLACEFRAME;
+typedef interface IOleAdviseHolder *LPOLEADVISEHOLDER;
+typedef interface IViewObject *LPVIEWOBJECT;
+typedef interface IViewObject2 *LPVIEWOBJECT2;
+
+typedef enum tagOLEWHICHMK {
+ OLEWHICHMK_CONTAINER=1,
+ OLEWHICHMK_OBJREL,
+ OLEWHICHMK_OBJFULL
+} OLEWHICHMK;
+typedef enum tagOLEGETMONIKER {
+ OLEGETMONIKER_ONLYIFTHERE=1,
+ OLEGETMONIKER_FORCEASSIGN,
+ OLEGETMONIKER_UNASSIGN,
+ OLEGETMONIKER_TEMPFORUSER
+} OLEGETMONIKER;
+typedef enum tagDROPEFFECT {
+ DROPEFFECT_NONE=0,
+ DROPEFFECT_COPY=1,
+ DROPEFFECT_MOVE=2,
+ DROPEFFECT_LINK=4,
+ DROPEFFECT_SCROLL=0x80000000
+} DROPEFFECT;
+typedef struct tagOleMenuGroupWidths {
+ LONG width[6];
+} OLEMENUGROUPWIDTHS,*LPOLEMENUGROUPWIDTHS;
+typedef HGLOBAL HOLEMENU;
+typedef enum tagOLECLOSE {
+ OLECLOSE_SAVEIFDIRTY,
+ OLECLOSE_NOSAVE,
+ OLECLOSE_PROMPTSAVE
+} OLECLOSE;
+typedef struct tagOLEVERB {
+ LONG lVerb;
+ LPWSTR lpszVerbName;
+ DWORD fuFlags;
+ DWORD grfAttribs;
+} OLEVERB,*LPOLEVERB;
+typedef RECT BORDERWIDTHS;
+typedef LPRECT LPBORDERWIDTHS;
+typedef LPCRECT LPCBORDERWIDTHS;
+typedef struct tagOIFI {
+ UINT cb;
+ BOOL fMDIApp;
+ HWND hwndFrame;
+ HACCEL haccel;
+ UINT cAccelEntries;
+}OLEINPLACEFRAMEINFO,*LPOLEINPLACEFRAMEINFO;
+
+/*DECLARE_ENUMERATOR_(IEnumOleDocumentViews,IOleDocumentView);*/
+DECLARE_ENUMERATOR(OLEVERB);
+typedef IEnumOLEVERB IEnumOleVerb;
+
+EXTERN_C const IID IID_IParseDisplayName;
+#undef INTERFACE
+#define INTERFACE IParseDisplayName
+DECLARE_INTERFACE_(IParseDisplayName,IUnknown)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(ParseDisplayName)(THIS_ IBindCtx*,LPOLESTR,ULONG*,IMoniker**) PURE;
+};
+
+EXTERN_C const IID IID_IOleContainer;
+#undef INTERFACE
+#define INTERFACE IOleContainer
+DECLARE_INTERFACE_(IOleContainer,IParseDisplayName)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(ParseDisplayName)(THIS_ IBindCtx*,LPOLESTR,ULONG*,IMoniker**) PURE;
+ STDMETHOD(EnumObjects)(THIS_ DWORD,IEnumUnknown**) PURE;
+ STDMETHOD(LockContainer)(THIS_ BOOL) PURE;
+};
+
+EXTERN_C const IID IID_IOleClientSite;
+#undef INTERFACE
+#define INTERFACE IOleClientSite
+DECLARE_INTERFACE_(IOleClientSite,IUnknown)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(SaveObject)(THIS) PURE;
+ STDMETHOD(GetMoniker)(THIS_ DWORD,DWORD,LPMONIKER*) PURE;
+ STDMETHOD(GetContainer)(THIS_ LPOLECONTAINER*) PURE;
+ STDMETHOD(ShowObject)(THIS) PURE;
+ STDMETHOD(OnShowWindow)(THIS_ BOOL) PURE;
+ STDMETHOD(RequestNewObjectLayout)(THIS) PURE;
+};
+
+EXTERN_C const IID IID_IOleObject;
+#undef INTERFACE
+#define INTERFACE IOleObject
+DECLARE_INTERFACE_(IOleObject,IUnknown)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(SetClientSite)(THIS_ LPOLECLIENTSITE) PURE;
+ STDMETHOD(GetClientSite)(THIS_ LPOLECLIENTSITE*) PURE;
+ STDMETHOD(SetHostNames)(THIS_ LPCOLESTR,LPCOLESTR) PURE;
+ STDMETHOD(Close)(THIS_ DWORD) PURE;
+ STDMETHOD(SetMoniker)(THIS_ DWORD,LPMONIKER) PURE;
+ STDMETHOD(GetMoniker)(THIS_ DWORD,DWORD,LPMONIKER*) PURE;
+ STDMETHOD(InitFromData)(THIS_ LPDATAOBJECT,BOOL,DWORD) PURE;
+ STDMETHOD(GetClipboardData)(THIS_ DWORD,LPDATAOBJECT*) PURE;
+ STDMETHOD(DoVerb)(THIS_ LONG,LPMSG,LPOLECLIENTSITE,LONG,HWND,LPCRECT) PURE;
+ STDMETHOD(EnumVerbs)(THIS_ LPENUMOLEVERB*) PURE;
+ STDMETHOD(Update)(THIS) PURE;
+ STDMETHOD(IsUpToDate)(THIS) PURE;
+ STDMETHOD(GetUserClassID)(THIS_ LPCLSID) PURE;
+ STDMETHOD(GetUserType)(THIS_ DWORD,LPOLESTR) PURE;
+ STDMETHOD(SetExtent)(THIS_ DWORD,SIZEL*) PURE;
+ STDMETHOD(GetExtent)(THIS_ DWORD,SIZEL*) PURE;
+ STDMETHOD(Advise)(THIS_ LPADVISESINK,PDWORD) PURE;
+ STDMETHOD(Unadvise)(THIS_ DWORD) PURE;
+ STDMETHOD(EnumAdvise)(THIS_ LPENUMSTATDATA*) PURE;
+ STDMETHOD(GetMiscStatus)(THIS_ DWORD,PDWORD) PURE;
+ STDMETHOD(SetColorScheme)(THIS_ LPLOGPALETTE) PURE;
+};
+
+EXTERN_C const IID IID_IOleWindow;
+#undef INTERFACE
+#define INTERFACE IOleWindow
+DECLARE_INTERFACE_(IOleWindow,IUnknown)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(GetWindow)(THIS_ HWND*) PURE;
+ STDMETHOD(ContextSensitiveHelp)(THIS_ BOOL) PURE;
+};
+
+EXTERN_C const IID IID_IOleInPlaceUIWindow;
+#undef INTERFACE
+#define INTERFACE IOleInPlaceUIWindow
+DECLARE_INTERFACE_(IOleInPlaceUIWindow,IOleWindow)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(GetWindow)(THIS_ HWND*) PURE;
+ STDMETHOD(ContextSensitiveHelp)(THIS_ BOOL) PURE;
+ STDMETHOD(GetBorder)(THIS_ LPRECT) PURE;
+ STDMETHOD(RequestBorderSpace)(THIS_ LPCBORDERWIDTHS) PURE;
+ STDMETHOD(SetBorderSpace)(THIS_ LPCBORDERWIDTHS) PURE;
+ STDMETHOD(SetActiveObject)(THIS_ LPOLEINPLACEACTIVEOBJECT,LPCOLESTR) PURE;
+};
+
+EXTERN_C const IID IID_IOleInPlaceActiveObject;
+#undef INTERFACE
+#define INTERFACE IOleInPlaceActiveObject
+DECLARE_INTERFACE_(IOleInPlaceActiveObject,IOleWindow)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(GetWindow)(THIS_ HWND*) PURE;
+ STDMETHOD(ContextSensitiveHelp)(THIS_ BOOL) PURE;
+ STDMETHOD(TranslateAccelerator)(THIS_ LPMSG) PURE;
+ STDMETHOD(OnFrameWindowActivate)(THIS_ BOOL) PURE;
+ STDMETHOD(OnDocWindowActivate)(THIS_ BOOL) PURE;
+ STDMETHOD(ResizeBorder)(THIS_ LPCRECT,LPOLEINPLACEUIWINDOW,BOOL) PURE;
+ STDMETHOD(EnableModeless)(THIS_ BOOL) PURE;
+};
+
+EXTERN_C const IID IID_IOleInPlaceFrame;
+#undef INTERFACE
+#define INTERFACE IOleInPlaceFrame
+DECLARE_INTERFACE_(IOleInPlaceFrame,IOleInPlaceUIWindow)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(GetWindow)(THIS_ HWND*) PURE;
+ STDMETHOD(ContextSensitiveHelp)(THIS_ BOOL) PURE;
+ STDMETHOD(GetBorder)(THIS_ LPRECT) PURE;
+ STDMETHOD(RequestBorderSpace)(THIS_ LPCBORDERWIDTHS) PURE;
+ STDMETHOD(SetBorderSpace)(THIS_ LPCBORDERWIDTHS) PURE;
+ STDMETHOD(SetActiveObject)(THIS_ LPOLEINPLACEACTIVEOBJECT,LPCOLESTR) PURE;
+ STDMETHOD(InsertMenus)(THIS_ HMENU,LPOLEMENUGROUPWIDTHS) PURE;
+ STDMETHOD(SetMenu)(THIS_ HMENU,HOLEMENU,HWND) PURE;
+ STDMETHOD(RemoveMenus)(THIS_ HMENU) PURE;
+ STDMETHOD(SetStatusText)(THIS_ LPCOLESTR) PURE;
+ STDMETHOD(EnableModeless)(THIS_ BOOL) PURE;
+ STDMETHOD(TranslateAccelerator)(THIS_ LPMSG,WORD) PURE;
+};
+
+EXTERN_C const IID IID_IOleAdviseHolder;
+#undef INTERFACE
+#define INTERFACE IOleAdviseHolder
+DECLARE_INTERFACE_(IOleAdviseHolder,IUnknown)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(Advise)(THIS_ LPADVISESINK,PDWORD) PURE;
+ STDMETHOD(Unadvise)(THIS_ DWORD) PURE;
+ STDMETHOD(EnumAdvise)(THIS_ LPENUMSTATDATA*) PURE;
+ STDMETHOD(SendOnRename)(THIS_ LPMONIKER) PURE;
+ STDMETHOD(SendOnSave)(THIS) PURE;
+ STDMETHOD(SendOnClose)(THIS) PURE;
+};
+
+EXTERN_C const IID IID_IDropSource;
+#undef INTERFACE
+#define INTERFACE IDropSource
+DECLARE_INTERFACE_(IDropSource,IUnknown)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(QueryContinueDrag)(THIS_ BOOL,DWORD) PURE;
+ STDMETHOD(GiveFeedback)(THIS_ DWORD) PURE;
+};
+
+EXTERN_C const IID IID_IDropTarget;
+#undef INTERFACE
+#define INTERFACE IDropTarget
+DECLARE_INTERFACE_(IDropTarget,IUnknown)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(DragEnter)(THIS_ LPDATAOBJECT,DWORD,POINTL,PDWORD) PURE;
+ STDMETHOD(DragOver)(THIS_ DWORD,POINTL,PDWORD) PURE;
+ STDMETHOD(DragLeave)(THIS) PURE;
+ STDMETHOD(Drop)(THIS_ LPDATAOBJECT,DWORD,POINTL,PDWORD) PURE;
+};
+
+typedef BOOL(CALLBACK *__IView_pfncont)(DWORD);
+EXTERN_C const IID IID_IViewObject;
+#undef INTERFACE
+#define INTERFACE IViewObject
+DECLARE_INTERFACE_(IViewObject,IUnknown)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(Draw)(THIS_ DWORD,LONG,PVOID,DVTARGETDEVICE*,HDC,HDC,LPCRECTL,LPCRECTL,__IView_pfncont pfnContinue,DWORD) PURE;
+ STDMETHOD(GetColorSet)(THIS_ DWORD,LONG,PVOID,DVTARGETDEVICE*,HDC,LPLOGPALETTE*) PURE;
+ STDMETHOD(Freeze)(THIS_ DWORD,LONG,PVOID,PDWORD) PURE;
+ STDMETHOD(Unfreeze)(THIS_ DWORD) PURE;
+ STDMETHOD(SetAdvise)(THIS_ DWORD,DWORD,IAdviseSink*) PURE;
+ STDMETHOD(GetAdvise)(THIS_ PDWORD,PDWORD,IAdviseSink**) PURE;
+};
+
+EXTERN_C const IID IID_IViewObject2;
+#undef INTERFACE
+#define INTERFACE IViewObject2
+DECLARE_INTERFACE_(IViewObject2,IUnknown)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(Draw)(THIS_ DWORD,LONG,PVOID,DVTARGETDEVICE*,HDC,HDC,LPCRECTL,LPCRECTL,__IView_pfncont pfnContinue,DWORD) PURE;
+ STDMETHOD(GetColorSet)(THIS_ DWORD,LONG,PVOID,DVTARGETDEVICE*,HDC,LPLOGPALETTE*) PURE;
+ STDMETHOD(Freeze)(THIS_ DWORD,LONG,PVOID,PDWORD) PURE;
+ STDMETHOD(Unfreeze)(THIS_ DWORD) PURE;
+ STDMETHOD(SetAdvise)(THIS_ DWORD,DWORD,IAdviseSink*) PURE;
+ STDMETHOD(GetAdvise)(THIS_ PDWORD,PDWORD,IAdviseSink**) PURE;
+ STDMETHOD(GetExtent)(THIS_ DWORD,DWORD,DVTARGETDEVICE*,LPSIZEL) PURE;
+};
+
+EXTERN_C const IID IID_ISupportErrorInfo;
+#undef INTERFACE
+#define INTERFACE ISupportErrorInfo
+DECLARE_INTERFACE_(ISupportErrorInfo, IUnknown)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(InterfaceSupportsErrorInfo)(THIS_ REFIID) PURE;
+
+};
+
+EXTERN_C const IID IID_IErrorInfo;
+#undef INTERFACE
+#define INTERFACE IErrorInfo
+DECLARE_INTERFACE_(IErrorInfo, IUnknown)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+
+ STDMETHOD(GetGUID)(THIS_ REFIID) PURE;
+ STDMETHOD(GetSource)(THIS_ BSTR*) PURE;
+ STDMETHOD(GetDescription)(THIS_ BSTR*) PURE;
+ STDMETHOD(GetHelpContext)(THIS_ DWORD*) PURE;
+
+ };
+
+#ifdef __cplusplus
+}
+#endif
+#endif
+
diff --git a/winsup/w32api/include/pbt.h b/winsup/w32api/include/pbt.h
new file mode 100644
index 000000000..fba11e3d0
--- /dev/null
+++ b/winsup/w32api/include/pbt.h
@@ -0,0 +1,16 @@
+#ifndef _PBT_H
+#define _PBT_H
+#define PBT_APMQUERYSUSPEND 0
+#define PBT_APMQUERYSTANDBY 1
+#define PBT_APMQUERYSUSPENDFAILED 2
+#define PBT_APMQUERYSTANDBYFAILED 3
+#define PBT_APMSUSPEND 4
+#define PBT_APMSTANDBY 5
+#define PBT_APMRESUMECRITICAL 6
+#define PBT_APMRESUMESUSPEND 8
+#define PBT_APMRESUMESTANDBY 8
+#define PBTF_APMRESUMEFROMFAILURE 1
+#define PBT_APMBATTERYLOW 9
+#define PBT_APMPOWERSTATUSCHANGE 10
+#define PBT_APMOEMEVENT 11
+#endif
diff --git a/winsup/w32api/include/poppack.h b/winsup/w32api/include/poppack.h
new file mode 100644
index 000000000..bb04d4524
--- /dev/null
+++ b/winsup/w32api/include/poppack.h
@@ -0,0 +1,3 @@
+#ifndef RC_INVOKED
+#pragma pack(pop)
+#endif
diff --git a/winsup/w32api/include/prsht.h b/winsup/w32api/include/prsht.h
new file mode 100644
index 000000000..8b2ab2de2
--- /dev/null
+++ b/winsup/w32api/include/prsht.h
@@ -0,0 +1,244 @@
+#ifndef _PRSHT_H
+#define _PRSHT_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define MAXPROPPAGES 100
+#define PSP_DEFAULT 0
+#define PSP_DLGINDIRECT 1
+#define PSP_USEHICON 2
+#define PSP_USEICONID 4
+#define PSP_USETITLE 8
+#define PSP_RTLREADING 16
+#define PSP_HASHELP 32
+#define PSP_USEREFPARENT 64
+#define PSP_USECALLBACK 128
+#define PSPCB_RELEASE 1
+#define PSPCB_CREATE 2
+#define PSH_DEFAULT 0
+#define PSH_PROPTITLE 1
+#define PSH_USEHICON 2
+#define PSH_USEICONID 4
+#define PSH_PROPSHEETPAGE 8
+#define PSH_WIZARD 32
+#define PSH_USEPSTARTPAGE 64
+#define PSH_NOAPPLYNOW 128
+#define PSH_USECALLBACK 256
+#define PSH_HASHELP 512
+#define PSH_MODELESS 1024
+#define PSH_RTLREADING 2048
+#define PSCB_INITIALIZED 1
+#define PSCB_PRECREATE 2
+#define PSM_GETTABCONTROL 1140
+#define PSM_GETCURRENTPAGEHWND 1142
+#define PSM_ISDIALOGMESSAGE 1141
+#define PSM_PRESSBUTTON 1137
+#define PSM_SETCURSELID 1138
+#define PSM_SETFINISHTEXTW 1145
+#define PSM_SETFINISHTEXTA 1139
+#define PSN_FIRST (-200)
+#define PSN_LAST (-299)
+#define PSN_APPLY (-202)
+#define PSN_HELP (-205)
+#define PSN_KILLACTIVE (-201)
+#define PSN_QUERYCANCEL (-209)
+#define PSN_RESET (-203)
+#define PSN_SETACTIVE (-200)
+#define PSN_WIZBACK (-206)
+#define PSN_WIZFINISH (-208)
+#define PSN_WIZNEXT (-207)
+#define PSNRET_NOERROR 0
+#define PSNRET_INVALID 1
+#define PSNRET_INVALID_NOCHANGEPAGE 2
+#define ID_PSRESTARTWINDOWS 2
+#define ID_PSREBOOTSYSTEM 3
+#define WIZ_CXDLG 276
+#define WIZ_CYDLG 140
+#define WIZ_CXBMP 80
+#define WIZ_BODYX 92
+#define WIZ_BODYCX 184
+#define PROP_SM_CXDLG 212
+#define PROP_SM_CYDLG 188
+#define PROP_MED_CXDLG 227
+#define PROP_MED_CYDLG 215
+#define PROP_LG_CXDLG 252
+#define PROP_LG_CYDLG 218
+#define PSBTN_MAX 6
+#define PSBTN_BACK 0
+#define PSBTN_NEXT 1
+#define PSBTN_FINISH 2
+#define PSBTN_OK 3
+#define PSBTN_APPLYNOW 4
+#define PSBTN_CANCEL 5
+#define PSBTN_HELP 6
+#define PSWIZB_BACK 1
+#define PSWIZB_NEXT 2
+#define PSWIZB_FINISH 4
+#define PSWIZB_DISABLEDFINISH 8
+#define PSM_SETWIZBUTTONS (WM_USER+112)
+#define PSM_APPLY (WM_USER+110)
+#define PSM_UNCHANGED (WM_USER+109)
+#define PSM_QUERYSIBLINGS (WM_USER+108)
+#define PSM_CANCELTOCLOSE (WM_USER+107)
+#define PSM_REBOOTSYSTEM (WM_USER+106)
+#define PSM_RESTARTWINDOWS (WM_USER+105)
+#define PSM_CHANGED (WM_USER+104)
+#define PSM_ADDPAGE (WM_USER+103)
+#define PSM_REMOVEPAGE (WM_USER+102)
+#define PSM_SETCURSEL (WM_USER+101)
+#define PSM_SETTITLEA (WM_USER+111)
+#define PSM_SETTITLEW (WM_USER+120)
+
+#ifndef RC_INVOKED
+
+#pragma pack(push,8)
+typedef struct _PROPSHEETPAGEA {
+ DWORD dwSize;
+ DWORD dwFlags;
+ HINSTANCE hInstance;
+ union {
+ LPCSTR pszTemplate;
+ LPCDLGTEMPLATE pResource;
+ } DUMMYUNIONNAME;
+ union {
+ HICON hIcon;
+ LPCSTR pszIcon;
+ } DUMMYUNIONNAME2;
+ LPCSTR pszTitle;
+ DLGPROC pfnDlgProc;
+ LPARAM lParam;
+ UINT(CALLBACK *pfnCallback)(HWND,UINT,struct _PROPSHEETPAGEA*);
+ UINT *pcRefParent;
+} PROPSHEETPAGEA,*LPPROPSHEETPAGEA;
+typedef const PROPSHEETPAGEA *LPCPROPSHEETPAGEA;
+typedef struct _PROPSHEETPAGEW {
+ DWORD dwSize;
+ DWORD dwFlags;
+ HINSTANCE hInstance;
+ union {
+ LPCWSTR pszTemplate;
+ LPCDLGTEMPLATE pResource;
+ } DUMMYUNIONNAME;
+ union {
+ HICON hIcon;
+ LPCWSTR pszIcon;
+ } DUMMYUNIONNAME2;
+ LPCWSTR pszTitle;
+ DLGPROC pfnDlgProc;
+ LPARAM lParam;
+ UINT(CALLBACK *pfnCallback)(HWND,UINT,struct _PROPSHEETPAGEW*);
+ UINT *pcRefParent;
+} PROPSHEETPAGEW,*LPPROPSHEETPAGEW;
+typedef const PROPSHEETPAGEA *LPCPROPSHEETPAGEW;
+typedef UINT(CALLBACK *LPFNPSPCALLBACKA)(HWND,UINT,LPPROPSHEETPAGEA);
+typedef UINT(CALLBACK *LPFNPSPCALLBACKW)(HWND,UINT,LPPROPSHEETPAGEW);
+typedef int(CALLBACK *PFNPROPSHEETCALLBACK)(HWND,UINT,LPARAM);
+DECLARE_HANDLE(HPROPSHEETPAGE);
+typedef struct _PROPSHEETHEADERA {
+ DWORD dwSize;
+ DWORD dwFlags;
+ HWND hwndParent;
+ HINSTANCE hInstance;
+ union {
+ HICON hIcon;
+ LPCSTR pszIcon;
+ }DUMMYUNIONNAME;
+ LPCSTR pszCaption;
+ UINT nPages;
+ union {
+ UINT nStartPage;
+ LPCSTR pStartPage;
+ }DUMMYUNIONNAME2;
+ union {
+ LPCPROPSHEETPAGEA ppsp;
+ HPROPSHEETPAGE *phpage;
+ }DUMMYUNIONNAME3;
+ PFNPROPSHEETCALLBACK pfnCallback;
+} PROPSHEETHEADERA,*LPPROPSHEETHEADERA;
+typedef const PROPSHEETHEADERA *LPCPROPSHEETHEADERA;
+typedef struct _PROPSHEETHEADERW {
+ DWORD dwSize;
+ DWORD dwFlags;
+ HWND hwndParent;
+ HINSTANCE hInstance;
+ union {
+ HICON hIcon;
+ LPCWSTR pszIcon;
+ }DUMMYUNIONNAME;
+ LPCWSTR pszCaption;
+ UINT nPages;
+ union {
+ UINT nStartPage;
+ LPCWSTR pStartPage;
+ }DUMMYUNIONNAME2;
+ union {
+ LPCPROPSHEETPAGEW ppsp;
+ HPROPSHEETPAGE *phpage;
+ }DUMMYUNIONNAME3;
+ PFNPROPSHEETCALLBACK pfnCallback;
+} PROPSHEETHEADERW,*LPPROPSHEETHEADERW;
+typedef const PROPSHEETHEADERW *LPCPROPSHEETHEADERW;
+typedef BOOL(CALLBACK *LPFNADDPROPSHEETPAGE)(HPROPSHEETPAGE,LPARAM);
+typedef BOOL(CALLBACK *LPFNADDPROPSHEETPAGES)(LPVOID,LPFNADDPROPSHEETPAGE,LPARAM);
+typedef struct _PSHNOTIFY {
+ NMHDR hdr;
+ LPARAM lParam;
+} PSHNOTIFY,*LPPSHNOTIFY;
+
+#pragma pack(pop)
+
+HPROPSHEETPAGE WINAPI CreatePropertySheetPageA(LPCPROPSHEETPAGEA);
+HPROPSHEETPAGE WINAPI CreatePropertySheetPageW(LPCPROPSHEETPAGEW);
+BOOL WINAPI DestroyPropertySheetPage(HPROPSHEETPAGE);
+int WINAPI PropertySheetA(LPCPROPSHEETHEADERA);
+int WINAPI PropertySheetW(LPCPROPSHEETHEADERW);
+#define PropSheet_AddPage(d,p) SendMessage(d,PSM_ADDPAGE,0,(LPARAM)p)
+#define PropSheet_Apply(d) SendMessage(d,PSM_APPLY,0,0)
+#define PropSheet_CancelToClose(d) SendMessage(d,PSM_CANCELTOCLOSE,0,0)
+#define PropSheet_Changed(d,w) SendMessage(d,PSM_CHANGED,(WPARAM)w,0)
+#define PropSheet_GetCurrentPageHwnd(d) (HWND)SendMessage(d,PSM_GETCURRENTPAGEHWND,0,0)
+#define PropSheet_GetTabControl(d) (HWND)SendMessage(d,PSM_GETTABCONTROL,0,0)
+#define PropSheet_IsDialogMessage(d,m) (BOOL)SendMessage(d,PSM_ISDIALOGMESSAGE,0,(LPARAM)m)
+#define PropSheet_PressButton(d,i) SendMessage(d,PSM_PRESSBUTTON,i,0)
+#define PropSheet_QuerySiblings(d,w,l) SendMessage(d,PSM_QUERYSIBLINGS,w,l)
+#define PropSheet_RebootSystem(d) SendMessage(d,PSM_REBOOTSYSTEM,0,0)
+#define PropSheet_RemovePage(d,i,p) SendMessage(d,PSM_REMOVEPAGE,i,(LPARAM)p)
+#define PropSheet_RestartWindows(d) SendMessage(d,PSM_RESTARTWINDOWS,0,0)
+#define PropSheet_SetCurSel(d,p,i) SendMessage(d,PSM_SETCURSEL,i,(LPARAM)p)
+#define PropSheet_SetCurSelByID(d,i) SendMessage(d,PSM_SETCURSELID,0,i)
+#define PropSheet_SetFinishText(d,s) SendMessage(d,PSM_SETFINISHTEXT,0,(LPARAM)s)
+#define PropSheet_SetTitle(d,w,s) SendMessage(d,PSM_SETTITLE,w,(LPARAM)s)
+#define PropSheet_SetWizButtons(d,f) PostMessage(d,PSM_SETWIZBUTTONS,0,(LPARAM)f)
+#define PropSheet_UnChanged(d,w) SendMessage(d,PSM_UNCHANGED,(WPARAM)w,0)
+#endif
+
+#ifdef UNICODE
+#define LPFNPSPCALLBACK LPFNPSPCALLBACKW
+#define PROPSHEETPAGE PROPSHEETPAGEW
+#define LPPROPSHEETPAGE LPPROPSHEETPAGEW
+#define LPCPROPSHEETPAGE LPCPROPSHEETPAGEW
+#define PROPSHEETHEADER PROPSHEETHEADERW
+#define LPPROPSHEETHEADER LPPROPSHEETHEADERW
+#define LPCPROPSHEETHEADER LPCPROPSHEETHEADERW
+#define PSM_SETTITLE PSM_SETTITLEW
+#define PSM_SETFINISHTEXT PSM_SETFINISHTEXTW
+#define CreatePropertySheetPage CreatePropertySheetPageW
+#define PropertySheet PropertySheetW
+#else
+#define LPFNPSPCALLBACK LPFNPSPCALLBACKA
+#define PROPSHEETPAGE PROPSHEETPAGEA
+#define LPPROPSHEETPAGE LPPROPSHEETPAGEA
+#define LPCPROPSHEETPAGE LPCPROPSHEETPAGEA
+#define PROPSHEETHEADER PROPSHEETHEADERA
+#define LPPROPSHEETHEADER LPPROPSHEETHEADERA
+#define LPCPROPSHEETHEADER LPCPROPSHEETHEADERA
+#define PSM_SETTITLE PSM_SETTITLEA
+#define PSM_SETFINISHTEXT PSM_SETFINISHTEXTA
+#define CreatePropertySheetPage CreatePropertySheetPageA
+#define PropertySheet PropertySheetA
+#endif
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/winsup/w32api/include/psapi.h b/winsup/w32api/include/psapi.h
new file mode 100644
index 000000000..4c4827382
--- /dev/null
+++ b/winsup/w32api/include/psapi.h
@@ -0,0 +1,92 @@
+/*
+ psapi.h - Include file for PSAPI.DLL APIs
+
+ Written by Mumit Khan <khan@nanotech.wisc.edu>
+
+ This file is part of a free library for the Win32 API.
+
+ NOTE: This strictly does not belong in the Win32 API since it's
+ really part of Platform SDK. However,GDB needs it and we might
+ as well provide it here.
+
+ 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.
+
+*/
+#ifndef _PSAPI_H
+#define _PSAPI_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef RC_INVOKED
+
+typedef struct _MODULEINFO {
+ LPVOID lpBaseOfDll;
+ DWORD SizeOfImage;
+ LPVOID EntryPoint;
+} MODULEINFO,*LPMODULEINFO;
+
+typedef struct _PSAPI_WS_WATCH_INFORMATION {
+ LPVOID FaultingPc;
+ LPVOID FaultingVa;
+} PSAPI_WS_WATCH_INFORMATION,*PPSAPI_WS_WATCH_INFORMATION;
+
+typedef struct _PROCESS_MEMORY_COUNTERS {
+ DWORD cb;
+ DWORD PageFaultCount;
+ DWORD PeakWorkingSetSize;
+ DWORD WorkingSetSize;
+ DWORD QuotaPeakPagedPoolUsage;
+ DWORD QuotaPagedPoolUsage;
+ DWORD QuotaPeakNonPagedPoolUsage;
+ DWORD QuotaNonPagedPoolUsage;
+ DWORD PagefileUsage;
+ DWORD PeakPagefileUsage;
+} PROCESS_MEMORY_COUNTERS,*PPROCESS_MEMORY_COUNTERS;
+
+/* Grouped by application,not in alphabetical order. */
+BOOL WINAPI EnumProcesses(DWORD *,DWORD,DWORD *);
+BOOL WINAPI EnumProcessModules(HANDLE,HMODULE *,DWORD,LPDWORD);
+DWORD WINAPI GetModuleBaseNameA(HANDLE,HMODULE,LPSTR,DWORD);
+DWORD WINAPI GetModuleBaseNameW(HANDLE,HMODULE,LPWSTR,DWORD);
+DWORD WINAPI GetModuleFileNameExA(HANDLE,HMODULE,LPSTR,DWORD);
+DWORD WINAPI GetModuleFileNameExW(HANDLE,HMODULE,LPWSTR,DWORD);
+BOOL WINAPI GetModuleInformation(HANDLE,HMODULE,LPMODULEINFO,DWORD);
+BOOL WINAPI EmptyWorkingSet(HANDLE);
+BOOL WINAPI QueryWorkingSet(HANDLE,PVOID,DWORD);
+BOOL WINAPI InitializeProcessForWsWatch(HANDLE);
+BOOL WINAPI GetWsChanges(HANDLE,PPSAPI_WS_WATCH_INFORMATION,DWORD);
+DWORD WINAPI GetMappedFileNameW(HANDLE,LPVOID,LPWSTR,DWORD);
+DWORD WINAPI GetMappedFileNameA(HANDLE,LPVOID,LPSTR,DWORD);
+BOOL WINAPI EnumDeviceDrivers(LPVOID *,DWORD,LPDWORD);
+DWORD WINAPI GetDeviceDriverBaseNameA(LPVOID,LPSTR,DWORD);
+DWORD WINAPI GetDeviceDriverBaseNameW(LPVOID,LPWSTR,DWORD);
+DWORD WINAPI GetDeviceDriverFileNameA(LPVOID,LPSTR,DWORD);
+DWORD WINAPI GetDeviceDriverFileNameW(LPVOID,LPWSTR,DWORD);
+BOOL WINAPI GetProcessMemoryInfo(HANDLE,PPROCESS_MEMORY_COUNTERS,DWORD);
+
+#endif /* not RC_INVOKED */
+
+#ifdef UNICODE
+#define GetModuleBaseName GetModuleBaseNameW
+#define GetModuleFileNameEx GetModuleFileNameExW
+#define GetMappedFilenameEx GetMappedFilenameExW
+#define GetDeviceDriverBaseName GetDeviceDriverBaseNameW
+#define GetDeviceDriverFileName GetDeviceDriverFileNameW
+#else
+#define GetModuleBaseName GetModuleBaseNameA
+#define GetModuleFileNameEx GetModuleFileNameExA
+#define GetMappedFilenameEx GetMappedFilenameExA
+#define GetDeviceDriverBaseName GetDeviceDriverBaseNameA
+#define GetDeviceDriverFileName GetDeviceDriverFileNameA
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _PSAPI_H */
+
diff --git a/winsup/w32api/include/pshpack1.h b/winsup/w32api/include/pshpack1.h
new file mode 100644
index 000000000..3cbcf238b
--- /dev/null
+++ b/winsup/w32api/include/pshpack1.h
@@ -0,0 +1,3 @@
+#ifndef RC_INVOKED
+#pragma pack(push,1)
+#endif
diff --git a/winsup/w32api/include/pshpack2.h b/winsup/w32api/include/pshpack2.h
new file mode 100644
index 000000000..4d88e004e
--- /dev/null
+++ b/winsup/w32api/include/pshpack2.h
@@ -0,0 +1,3 @@
+#ifndef RC_INVOKED
+#pragma pack(push,2)
+#endif
diff --git a/winsup/w32api/include/pshpack4.h b/winsup/w32api/include/pshpack4.h
new file mode 100644
index 000000000..c1c3cf959
--- /dev/null
+++ b/winsup/w32api/include/pshpack4.h
@@ -0,0 +1,3 @@
+#ifndef RC_INVOKED
+#pragma pack(push,4)
+#endif
diff --git a/winsup/w32api/include/pshpack8.h b/winsup/w32api/include/pshpack8.h
new file mode 100644
index 000000000..f0c4539b9
--- /dev/null
+++ b/winsup/w32api/include/pshpack8.h
@@ -0,0 +1,3 @@
+#ifndef RC_INVOKED
+#pragma pack(push,8)
+#endif
diff --git a/winsup/w32api/include/rapi.h b/winsup/w32api/include/rapi.h
new file mode 100644
index 000000000..9d63d06a9
--- /dev/null
+++ b/winsup/w32api/include/rapi.h
@@ -0,0 +1,64 @@
+/*
+ rapi.h - main header file for the RAPI API
+
+ Copyright 1999 Cygnus Solutions.
+
+ This file is part of Cygwin.
+
+ This software is a copyrighted work licensed under the terms of the
+ Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+ details.
+*/
+
+#ifndef _RAPI_H
+#define _RAPI_H
+
+typedef struct IRAPIStream
+{
+ struct IRAPIStreamVtbl * lpVtbl;
+} IRAPIStream;
+
+typedef struct IRAPIStreamVtbl IRAPIStreamVtbl;
+
+typedef enum tagRAPISTREAMFLAG
+{
+ STREAM_TIMEOUT_READ
+} RAPISTREAMFLAG;
+
+struct IRAPIStreamVtbl
+{
+ HRESULT (__stdcall * SetRapiStat)( IRAPIStream * This, RAPISTREAMFLAG Flag, DWORD dwValue) ;
+ HRESULT (__stdcall * GetRapiStat)( IRAPIStream * This, RAPISTREAMFLAG Flag, DWORD *pdwValue) ;
+};
+
+// RAPI extension on Windows CE (e.g., MyFunctionFOO) called via CeRapiInvoke should be declared as:
+// EXTERN_C RAPIEXT MyFunctionFOO;
+typedef HRESULT (STDAPICALLTYPE RAPIEXT)(
+ DWORD cbInput, // [IN]
+ BYTE *pInput, // [IN]
+ DWORD *pcbOutput, // [OUT]
+ BYTE **ppOutput, // [OUT]
+ IRAPIStream *pIRAPIStream // [IN]
+ );
+
+typedef struct _RAPIINIT
+{
+ DWORD cbSize;
+ HANDLE heRapiInit;
+ HRESULT hrRapiInit;
+} RAPIINIT;
+
+STDAPI CeRapiInit();
+STDAPI CeRapiInitEx(RAPIINIT*);
+STDAPI_(BOOL) CeCreateProcess(LPCWSTR, LPCWSTR, LPSECURITY_ATTRIBUTES, LPSECURITY_ATTRIBUTES,
+ BOOL, DWORD, LPVOID, LPWSTR, LPSTARTUPINFO, LPPROCESS_INFORMATION);
+STDAPI CeRapiUninit();
+
+STDAPI_(BOOL) CeWriteFile(HANDLE, LPCVOID, DWORD, LPDWORD, LPOVERLAPPED);
+STDAPI_(HANDLE) CeCreateFile(LPCWSTR, DWORD, DWORD, LPSECURITY_ATTRIBUTES, DWORD, DWORD, HANDLE);
+STDAPI_(BOOL) CeCreateDirectory(LPCWSTR, LPSECURITY_ATTRIBUTES);
+STDAPI_(DWORD) CeGetLastError(void);
+STDAPI_(BOOL) CeGetFileTime(HANDLE, LPFILETIME, LPFILETIME, LPFILETIME);
+STDAPI_(BOOL) CeCloseHandle(HANDLE);
+
+#endif /* _RAPI_H */
diff --git a/winsup/w32api/include/regstr.h b/winsup/w32api/include/regstr.h
new file mode 100644
index 000000000..bec0a97a1
--- /dev/null
+++ b/winsup/w32api/include/regstr.h
@@ -0,0 +1,763 @@
+#ifndef _REGSTR_H
+#define _REGSTR_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+#define REGSTR_KEY_CLASS TEXT("Class")
+#define REGSTR_KEY_CONFIG TEXT("Config")
+#define REGSTR_KEY_ENUM TEXT("Enum")
+#define REGSTR_KEY_ROOTENUM TEXT("Root")
+#define REGSTR_KEY_BIOSENUM TEXT("BIOS")
+#define REGSTR_KEY_PCMCIAENUM TEXT("PCMCIA")
+#define REGSTR_KEY_PCIENUM TEXT("PCI")
+#define REGSTR_KEY_LOGCONFIG TEXT("LogConfig")
+#define REGSTR_KEY_SYSTEMBOARD TEXT("*PNP0C01")
+#define REGSTR_KEY_APM TEXT("*PNP0C05")
+#define REGSTR_KEY_INIUPDATE TEXT("IniUpdate")
+#define REG_KEY_INSTDEV TEXT("Installed")
+#define REGSTR_KEY_DOSOPTCDROM TEXT("CD-ROM")
+#define REGSTR_KEY_DOSOPTMOUSE TEXT("MOUSE")
+#define REGSTR_DEFAULT_INSTANCE TEXT("0000")
+#define REGSTR_PATH_MOTHERBOARD REGSTR_KEY_SYSTEMBOARD TEXT("\\" REGSTR_DEFAULT_INSTANCE
+#define REGSTR_PATH_SETUP TEXT("Software\\Microsoft\\Windows\\CurrentVersion")
+#define REGSTR_PATH_PIFCONVERT TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\PIFConvert")
+#define REGSTR_PATH_MSDOSOPTS TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\MS-DOSOptions")
+#define REGSTR_PATH_MSDOSEMU TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\MS-DOS Emulation")
+#define REGSTR_PATH_NEWDOSBOX TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\MS-DOS Emulation\\AppCompat")
+#define REGSTR_PATH_RUNONCE TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\RunOnce")
+#define REGSTR_PATH_RUN TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Run")
+#define REGSTR_PATH_RUNSERVICESONCE TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\RunServicesOnce")
+#define REGSTR_PATH_RUNSERVICES TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\RunServices")
+#define REGSTR_PATH_EXPLORER TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer")
+#define REGSTR_PATH_DETECT TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Detect")
+#define REGSTR_PATH_APPPATHS TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\App Paths")
+#define REGSTR_PATH_UNINSTALL TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall")
+#define REGSTR_PATH_REALMODENET TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Network\\Real Mode Net")
+#define REGSTR_PATH_NETEQUIV TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Network\\Equivalent")
+#define REGSTR_PATH_CVNETWORK TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Network")
+#define REGSTR_PATH_IDCONFIGDB TEXT("System\\CurrentControlSet\\Control\\IDConfigDB")
+#define REGSTR_PATH_CLASS TEXT("System\\CurrentControlSet\\Services\\Class")
+#define REGSTR_PATH_DISPLAYSETTINGS TEXT("Display\\Settings")
+#define REGSTR_PATH_FONTS TEXT("Display\\Fonts")
+#define REGSTR_PATH_ENUM TEXT("Enum")
+#define REGSTR_PATH_ROOT TEXT("Enum\\Root")
+#define REGSTR_PATH_SERVICES TEXT("System\\CurrentControlSet\\Services")
+#define REGSTR_PATH_VXD TEXT("System\\CurrentControlSet\\Services\\VxD")
+#define REGSTR_PATH_IOS TEXT("System\\CurrentControlSet\\Services\\VxD\\IOS")
+#define REGSTR_PATH_VMM TEXT("System\\CurrentControlSet\\Services\\VxD\\VMM")
+#define REGSTR_PATH_VPOWERD TEXT("System\\CurrentControlSet\\Services\\VxD\\VPOWERD")
+#define REGSTR_PATH_VNETSUP TEXT("System\\CurrentControlSet\\Services\\VxD\\VNETSUP")
+#define REGSTR_PATH_NWREDIR TEXT("System\\CurrentControlSet\\Services\\VxD\\NWREDIR")
+#define REGSTR_PATH_NCPSERVER TEXT("System\\CurrentControlSet\\Services\\NcpServer\\Parameters")
+#define REGSTR_PATH_IOARB TEXT("System\\CurrentControlSet\\Services\\Arbitrators\\IOArb")
+#define REGSTR_PATH_ADDRARB TEXT("System\\CurrentControlSet\\Services\\Arbitrators\\AddrArb")
+#define REGSTR_PATH_DMAARB TEXT("System\\CurrentControlSet\\Services\\Arbitrators\\DMAArb")
+#define REGSTR_PATH_IRQARB TEXT("System\\CurrentControlSet\\Services\\Arbitrators\\IRQArb")
+#define REGSTR_PATH_CODEPAGE TEXT("System\\CurrentControlSet\\Control\\Nls\\Codepage")
+#define REGSTR_PATH_FILESYSTEM TEXT("System\\CurrentControlSet\\Control\\FileSystem")
+#define REGSTR_PATH_FILESYSTEM_NOVOLTRACK TEXT("System\\CurrentControlSet\\Control\\FileSystem\\NoVolTrack")
+#define REGSTR_PATH_CDFS TEXT("System\\CurrentControlSet\\Control\\FileSystem\\CDFS")
+#define REGSTR_PATH_WINBOOT TEXT("System\\CurrentControlSet\\Control\\WinBoot")
+#define REGSTR_PATH_INSTALLEDFILES TEXT("System\\CurrentControlSet\\Control\\InstalledFiles")
+#define REGSTR_PATH_VMM32FILES TEXT("System\\CurrentControlSet\\Control\\VMM32Files")
+#define REGSTR_MAX_VALUE_LENGTH 256
+#define REGSTR_VAL_BITSPERPIXEL TEXT("BitsPerPixel")
+#define REGSTR_VAL_RESOLUTION TEXT("Resolution")
+#define REGSTR_VAL_DPILOGICALX TEXT("DPILogicalX")
+#define REGSTR_VAL_DPILOGICALY TEXT("DPILogicalY")
+#define REGSTR_VAL_DPIPHYSICALX TEXT("DPIPhysicalX")
+#define REGSTR_VAL_DPIPHYSICALY TEXT("DPIPhysicalY")
+#define REGSTR_VAL_REFRESHRATE TEXT("RefreshRate")
+#define REGSTR_VAL_DISPLAYFLAGS TEXT("DisplayFlags")
+#define REGSTR_PATH_CONTROLPANEL TEXT("Control Panel")
+#define REGSTR_PATH_CONTROLSFOLDER TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Controls Folder")
+#define REGSTR_VAL_DOSCP TEXT("OEMCP")
+#define REGSTR_VAL_WINCP TEXT("ACP")
+#define REGSTR_PATH_DYNA_ENUM TEXT("Config Manager\\Enum")
+#define REGSTR_VAL_HARDWARE_KEY TEXT("HardWareKey")
+#define REGSTR_VAL_ALLOCATION TEXT("Allocation")
+#define REGSTR_VAL_PROBLEM TEXT("Problem")
+#define REGSTR_VAL_STATUS TEXT("Status")
+#define REGSTR_VAL_DONTUSEMEM TEXT("DontAllocLastMem")
+#define REGSTR_VAL_SYSTEMROOT TEXT("SystemRoot")
+#define REGSTR_VAL_BOOTCOUNT TEXT("BootCount")
+#define REGSTR_VAL_REALNETSTART TEXT("RealNetStart")
+#define REGSTR_VAL_MEDIA TEXT("MediaPath")
+#define REGSTR_VAL_CONFIG TEXT("ConfigPath")
+#define REGSTR_VAL_DEVICEPATH TEXT("DevicePath")
+#define REGSTR_VAL_SRCPATH TEXT("SourcePath")
+#define REGSTR_VAL_OLDWINDIR TEXT("OldWinDir")
+#define REGSTR_VAL_SETUPFLAGS TEXT("SetupFlags")
+#define REGSTR_VAL_REGOWNER TEXT("RegisteredOwner")
+#define REGSTR_VAL_REGORGANIZATION TEXT("RegisteredOrganization")
+#define REGSTR_VAL_LICENSINGINFO TEXT("LicensingInfo")
+#define REGSTR_VAL_OLDMSDOSVER TEXT("OldMSDOSVer")
+#define REGSTR_VAL_FIRSTINSTALLDATETIME TEXT("FirstInstallDateTime")
+#define REGSTR_VAL_INSTALLTYPE TEXT("InstallType")
+#define REGSTR_VAL_WRAPPER TEXT("Wrapper")
+#define IT_COMPACT 0
+#define IT_TYPICAL 1
+#define IT_PORTABLE 2
+#define IT_CUSTOM 3
+#define REGSTR_KEY_SETUP TEXT("\\Setup")
+#define REGSTR_VAL_BOOTDIR TEXT("BootDir")
+#define REGSTR_VAL_WINBOOTDIR TEXT("WinbootDir")
+#define REGSTR_VAL_WINDIR TEXT("WinDir")
+#define REGSTR_VAL_APPINSTPATH TEXT("AppInstallPath")
+#define REGSTR_PATH_EBD REGSTR_PATH_SETUP REGSTR_KEY_SETUP TEXT("\\EBD")
+#define REGSTR_KEY_EBDFILESLOCAL TEXT("EBDFilesLocale")
+#define REGSTR_KEY_EBDFILESKEYBOARD TEXT("EBDFilesKeyboard")
+#define REGSTR_KEY_EBDAUTOEXECBATLOCAL TEXT("EBDAutoexecBatLocale")
+#define REGSTR_KEY_EBDAUTOEXECBATKEYBOARD TEXT("EBDAutoexecBatKeyboard")
+#define REGSTR_KEY_EBDCONFIGSYSLOCAL TEXT("EBDConfigSysLocale")
+#define REGSTR_KEY_EBDCONFIGSYSKEYBOARD TEXT("EBDConfigSysKeyboard")
+#define REGSTR_VAL_MSDOSMODE TEXT("MSDOSMode")
+#define REGSTR_VAL_MSDOSMODEDISCARD TEXT("Discard")
+#define REGSTR_VAL_DOSOPTGLOBALFLAGS TEXT("GlobalFlags")
+#define DOSOPTGF_DEFCLEAN 1
+#define REGSTR_VAL_DOSOPTFLAGS TEXT("Flags")
+#define REGSTR_VAL_OPTORDER TEXT("Order")
+#define REGSTR_VAL_CONFIGSYS TEXT("Config.Sys")
+#define REGSTR_VAL_AUTOEXEC TEXT("Autoexec.Bat")
+#define REGSTR_VAL_STDDOSOPTION TEXT("StdOption")
+#define REGSTR_VAL_DOSOPTTIP TEXT("TipText")
+#define DOSOPTF_DEFAULT 1
+#define DOSOPTF_SUPPORTED 2
+#define DOSOPTF_ALWAYSUSE 4
+#define DOSOPTF_USESPMODE 8
+#define DOSOPTF_PROVIDESUMB 16
+#define DOSOPTF_NEEDSETUP 32
+#define DOSOPTF_INDOSSTART 64
+#define DOSOPTF_MULTIPLE 128
+#define SUF_FIRSTTIME 1
+#define SUF_EXPRESS 2
+#define SUF_BATCHINF 4
+#define SUF_CLEAN 8
+#define SUF_INSETUP 16
+#define SUF_NETSETUP 32
+#define SUF_NETHDBOOT 64
+#define SUF_NETRPLBOOT 128
+#define SUF_SBSCOPYOK 256
+#define REGSTR_VAL_DOSPAGER TEXT("DOSPager")
+#define REGSTR_VAL_VXDGROUPS TEXT("VXDGroups")
+#define REGSTR_VAL_VPOWERDFLAGS TEXT("Flags")
+#define VPDF_DISABLEPWRMGMT 1
+#define VPDF_FORCEAPM10MODE 2
+#define VPDF_SKIPINTELSLCHECK 4
+#define VPDF_DISABLEPWRSTATUSPOLL 8
+#define REGSTR_VAL_WORKGROUP TEXT("Workgroup")
+#define REGSTR_VAL_DIRECTHOST TEXT("DirectHost")
+#define REGSTR_VAL_FILESHARING TEXT("FileSharing")
+#define REGSTR_VAL_PRINTSHARING TEXT("PrintSharing")
+#define REGSTR_VAL_FIRSTNETDRIVE TEXT("FirstNetworkDrive")
+#define REGSTR_VAL_MAXCONNECTIONS TEXT("MaxConnections")
+#define REGSTR_VAL_APISUPPORT TEXT("APISupport")
+#define REGSTR_VAL_MAXRETRY TEXT("MaxRetry")
+#define REGSTR_VAL_MINRETRY TEXT("MinRetry")
+#define REGSTR_VAL_SUPPORTLFN TEXT("SupportLFN")
+#define REGSTR_VAL_SUPPORTBURST TEXT("SupportBurst")
+#define REGSTR_VAL_SUPPORTTUNNELLING TEXT("SupportTunnelling")
+#define REGSTR_VAL_FULLTRACE TEXT("FullTrace")
+#define REGSTR_VAL_READCACHING TEXT("ReadCaching")
+#define REGSTR_VAL_SHOWDOTS TEXT("ShowDots")
+#define REGSTR_VAL_GAPTIME TEXT("GapTime")
+#define REGSTR_VAL_SEARCHMODE TEXT("SearchMode")
+#define REGSTR_VAL_SHELLVERSION TEXT("ShellVersion")
+#define REGSTR_VAL_MAXLIP TEXT("MaxLIP")
+#define REGSTR_VAL_PRESERVECASE TEXT("PreserveCase")
+#define REGSTR_VAL_OPTIMIZESFN TEXT("OptimizeSFN")
+#define REGSTR_VAL_NCP_BROWSEMASTER TEXT("BrowseMaster")
+#define REGSTR_VAL_NCP_USEPEERBROWSING TEXT("Use_PeerBrowsing")
+#define REGSTR_VAL_NCP_USESAP TEXT("Use_Sap")
+#define REGSTR_VAL_WIN31FILESYSTEM TEXT("Win31FileSystem")
+#define REGSTR_VAL_PRESERVELONGNAMES TEXT("PreserveLongNames")
+#define REGSTR_VAL_DRIVEWRITEBEHIND TEXT("DriveWriteBehind")
+#define REGSTR_VAL_ASYNCFILECOMMIT TEXT("AsyncFileCommit")
+#define REGSTR_VAL_PATHCACHECOUNT TEXT("PathCache")
+#define REGSTR_VAL_NAMECACHECOUNT TEXT("NameCache")
+#define REGSTR_VAL_CONTIGFILEALLOC TEXT("ContigFileAllocSize")
+#define REGSTR_VAL_VOLIDLETIMEOUT TEXT("VolumeIdleTimeout")
+#define REGSTR_VAL_BUFFIDLETIMEOUT TEXT("BufferIdleTimeout")
+#define REGSTR_VAL_BUFFAGETIMEOUT TEXT("BufferAgeTimeout")
+#define REGSTR_VAL_NAMENUMERICTAIL TEXT("NameNumericTail")
+#define REGSTR_VAL_READAHEADTHRESHOLD TEXT("ReadAheadThreshold")
+#define REGSTR_VAL_DOUBLEBUFFER TEXT("DoubleBuffer")
+#define REGSTR_VAL_SOFTCOMPATMODE TEXT("SoftCompatMode")
+#define REGSTR_VAL_DRIVESPINDOWN TEXT("DriveSpinDown")
+#define REGSTR_VAL_FORCEPMIO TEXT("ForcePMIO")
+#define REGSTR_VAL_FORCERMIO TEXT("ForceRMIO")
+#define REGSTR_VAL_LASTBOOTPMDRVS TEXT("LastBootPMDrvs")
+#define REGSTR_VAL_VIRTUALHDIRQ TEXT("VirtualHDIRQ")
+#define REGSTR_VAL_SRVNAMECACHECOUNT TEXT("ServerNameCacheMax")
+#define REGSTR_VAL_SRVNAMECACHE TEXT("ServerNameCache")
+#define REGSTR_VAL_SRVNAMECACHENETPROV TEXT("ServerNameCacheNumNets")
+#define REGSTR_VAL_AUTOMOUNT TEXT("AutoMountDrives")
+#define REGSTR_VAL_COMPRESSIONMETHOD TEXT("CompressionAlgorithm")
+#define REGSTR_VAL_COMPRESSIONTHRESHOLD TEXT("CompressionThreshold")
+#define REGSTR_VAL_CDCACHESIZE TEXT("CacheSize")
+#define REGSTR_VAL_CDPREFETCH TEXT("Prefetch")
+#define REGSTR_VAL_CDPREFETCHTAIL TEXT("PrefetchTail")
+#define REGSTR_VAL_CDRAWCACHE TEXT("RawCache")
+#define REGSTR_VAL_CDEXTERRORS TEXT("ExtendedErrors")
+#define REGSTR_VAL_CDSVDSENSE TEXT("SVDSense")
+#define REGSTR_VAL_CDSHOWVERSIONS TEXT("ShowVersions")
+#define REGSTR_VAL_CDCOMPATNAMES TEXT("MSCDEXCompatNames")
+#define REGSTR_VAL_CDNOREADAHEAD TEXT("NoReadAhead")
+#define REGSTR_VAL_SCSI TEXT("SCSI\\")
+#define REGSTR_VAL_ESDI TEXT("ESDI\\")
+#define REGSTR_VAL_FLOP TEXT("FLOP\\")
+#define REGSTR_VAL_DISK TEXT("GenDisk")
+#define REGSTR_VAL_CDROM TEXT("GenCD")
+#define REGSTR_VAL_TAPE TEXT("TAPE")
+#define REGSTR_VAL_SCANNER TEXT("SCANNER")
+#define REGSTR_VAL_FLOPPY TEXT("FLOPPY")
+#define REGSTR_VAL_SCSITID TEXT("SCSITargetID")
+#define REGSTR_VAL_SCSILUN TEXT("SCSILUN")
+#define REGSTR_VAL_REVLEVEL TEXT("RevisionLevel")
+#define REGSTR_VAL_PRODUCTID TEXT("ProductId")
+#define REGSTR_VAL_PRODUCTTYPE TEXT("ProductType")
+#define REGSTR_VAL_DEVTYPE TEXT("DeviceType")
+#define REGSTR_VAL_REMOVABLE TEXT("Removable")
+#define REGSTR_VAL_CURDRVLET TEXT("CurrentDriveLetterAssignment")
+#define REGSTR_VAL_USRDRVLET TEXT("UserDriveLetterAssignment")
+#define REGSTR_VAL_SYNCDATAXFER TEXT("SyncDataXfer")
+#define REGSTR_VAL_AUTOINSNOTE TEXT("AutoInsertNotification")
+#define REGSTR_VAL_DISCONNECT TEXT("Disconnect")
+#define REGSTR_VAL_INT13 TEXT("Int13")
+#define REGSTR_VAL_PMODE_INT13 TEXT("PModeInt13")
+#define REGSTR_VAL_USERSETTINGS TEXT("AdapterSettings")
+#define REGSTR_VAL_NOIDE TEXT("NoIDE")
+#define REGSTR_VAL_DISKCLASSNAME TEXT("DiskDrive")
+#define REGSTR_VAL_CDROMCLASSNAME TEXT("CDROM")
+#define REGSTR_VAL_FORCELOAD TEXT("ForceLoadPD")
+#define REGSTR_VAL_FORCEFIFO TEXT("ForceFIFO")
+#define REGSTR_VAL_FORCECL TEXT("ForceChangeLine")
+#define REGSTR_VAL_NOUSECLASS TEXT("NoUseClass")
+#define REGSTR_VAL_NOINSTALLCLASS TEXT("NoInstallClass")
+#define REGSTR_VAL_NODISPLAYCLASS TEXT("NoDisplayClass")
+#define REGSTR_VAL_SILENTINSTALL TEXT("SilentInstall")
+#define REGSTR_KEY_PCMCIA_CLASS TEXT("PCMCIA")
+#define REGSTR_KEY_SCSI_CLASS TEXT("SCSIAdapter")
+#define REGSTR_KEY_PORTS_CLASS TEXT("ports")
+#define REGSTR_KEY_MEDIA_CLASS TEXT("MEDIA")
+#define REGSTR_KEY_DISPLAY_CLASS TEXT("Display")
+#define REGSTR_KEY_KEYBOARD_CLASS TEXT("Keyboard")
+#define REGSTR_KEY_MOUSE_CLASS TEXT("Mouse")
+#define REGSTR_KEY_MONITOR_CLASS TEXT("Monitor")
+#define REGSTR_VAL_PCMCIA_OPT TEXT("Options")
+#define PCMCIA_OPT_HAVE_SOCKET 1
+#define PCMCIA_OPT_AUTOMEM 4
+#define PCMCIA_OPT_NO_SOUND 8
+#define PCMCIA_OPT_NO_AUDIO 16
+#define PCMCIA_OPT_NO_APMREMOVE 32
+#define REGSTR_VAL_PCMCIA_MEM TEXT("Memory")
+#define PCMCIA_DEF_MEMBEGIN 0xC0000
+#define PCMCIA_DEF_MEMEND 0xFFFFFF
+#define PCMCIA_DEF_MEMLEN 0x1000
+#define REGSTR_VAL_PCMCIA_ALLOC TEXT("AllocMemWin")
+#define REGSTR_VAL_PCMCIA_ATAD TEXT("ATADelay")
+#define REGSTR_VAL_PCMCIA_SIZ TEXT("MinRegionSize")
+#define PCMCIA_DEF_MIN_REGION 0x10000
+#define REGSTR_VAL_P1284MDL TEXT("Model")
+#define REGSTR_VAL_P1284MFG TEXT("Manufacturer")
+#define REGSTR_VAL_ISAPNP TEXT("ISAPNP")
+#define REGSTR_VAL_ISAPNP_RDP_OVERRIDE TEXT("RDPOverRide")
+#define REGSTR_VAL_PCI TEXT("PCI")
+#define REGSTR_PCI_OPTIONS TEXT("Options")
+#define REGSTR_PCI_DUAL_IDE TEXT("PCIDualIDE")
+#define PCI_OPTIONS_USE_BIOS 1
+#define PCI_OPTIONS_USE_IRQ_STEERING 2
+#define PCI_FLAG_NO_VIDEO_IRQ 1
+#define PCI_FLAG_PCMCIA_WANT_IRQ 2
+#define PCI_FLAG_DUAL_IDE 4
+#define PCI_FLAG_NO_ENUM_AT_ALL 8
+#define PCI_FLAG_ENUM_NO_RESOURCE 16
+#define PCI_FLAG_NEED_DWORD_ACCESS 32
+#define PCI_FLAG_SINGLE_FUNCTION 64
+#define PCI_FLAG_ALWAYS_ENABLED 128
+#define PCI_FLAG_IS_IDE 256
+#define PCI_FLAG_IS_VIDEO 512
+#define PCI_FLAG_FAIL_START 1024
+#define REGSTR_KEY_CRASHES TEXT("Crashes")
+#define REGSTR_KEY_DANGERS TEXT("Dangers")
+#define REGSTR_KEY_DETMODVARS TEXT("DetModVars")
+#define REGSTR_KEY_NDISINFO TEXT("NDISInfo")
+#define REGSTR_VAL_PROTINIPATH TEXT("ProtIniPath")
+#define REGSTR_VAL_RESOURCES TEXT("Resources")
+#define REGSTR_VAL_CRASHFUNCS TEXT("CrashFuncs")
+#define REGSTR_VAL_CLASS TEXT("Class")
+#define REGSTR_VAL_DEVDESC TEXT("DeviceDesc")
+#define REGSTR_VAL_BOOTCONFIG TEXT("BootConfig")
+#define REGSTR_VAL_DETFUNC TEXT("DetFunc")
+#define REGSTR_VAL_DETFLAGS TEXT("DetFlags")
+#define REGSTR_VAL_COMPATIBLEIDS TEXT("CompatibleIDs")
+#define REGSTR_VAL_DETCONFIG TEXT("DetConfig")
+#define REGSTR_VAL_VERIFYKEY TEXT("VerifyKey")
+#define REGSTR_VAL_COMINFO TEXT("ComInfo")
+#define REGSTR_VAL_INFNAME TEXT("InfName")
+#define REGSTR_VAL_CARDSPECIFIC TEXT("CardSpecific")
+#define REGSTR_VAL_NETOSTYPE TEXT("NetOSType")
+#define REGSTR_DATA_NETOS_NDIS TEXT("NDIS")
+#define REGSTR_DATA_NETOS_ODI TEXT("ODI")
+#define REGSTR_DATA_NETOS_IPX TEXT("IPX")
+#define REGSTR_VAL_MFG TEXT("Mfg")
+#define REGSTR_VAL_SCAN_ONLY_FIRST TEXT("ScanOnlyFirstDrive")
+#define REGSTR_VAL_SHARE_IRQ TEXT("ForceIRQSharing")
+#define REGSTR_VAL_NONSTANDARD_ATAPI TEXT("NonStandardATAPI")
+#define REGSTR_VAL_IDE_FORCE_SERIALIZE TEXT("ForceSerialization")
+#define REGSTR_VAL_MAX_HCID_LEN 1024
+#define REGSTR_VAL_HWREV TEXT("HWRevision")
+#define REGSTR_VAL_ENABLEINTS TEXT("EnableInts")
+#define REGDF_NOTDETIO 1
+#define REGDF_NOTDETMEM 2
+#define REGDF_NOTDETIRQ 4
+#define REGDF_NOTDETDMA 8
+#define REGDF_NOTDETALL (REGDF_NOTDETIO | REGDF_NOTDETMEM | REGDF_NOTDETIRQ | REGDF_NOTDETDMA)
+#define REGDF_NEEDFULLCONFIG 16
+#define REGDF_GENFORCEDCONFIG 32
+#define REGDF_NODETCONFIG 0x8000
+#define REGDF_CONFLICTIO 0x10000
+#define REGDF_CONFLICTMEM 0x20000
+#define REGDF_CONFLICTIRQ 0x40000
+#define REGDF_CONFLICTDMA 0x80000
+#define REGDF_CONFLICTALL (REGDF_CONFLICTIO | REGDF_CONFLICTMEM | REGDF_CONFLICTIRQ | REGDF_CONFLICTDMA)
+#define REGDF_MAPIRQ2TO9 0x100000
+#define REGDF_NOTVERIFIED 0x80000000
+#define REGSTR_VAL_APMBIOSVER TEXT("APMBiosVer")
+#define REGSTR_VAL_APMFLAGS TEXT("APMFlags")
+#define REGSTR_VAL_SLSUPPORT TEXT("SLSupport")
+#define REGSTR_VAL_MACHINETYPE TEXT("MachineType")
+#define REGSTR_VAL_SETUPMACHINETYPE TEXT("SetupMachineType")
+#define REGSTR_MACHTYPE_UNKNOWN TEXT("Unknown")
+#define REGSTR_MACHTYPE_IBMPC TEXT("IBM PC")
+#define REGSTR_MACHTYPE_IBMPCJR TEXT("IBM PCjr")
+#define REGSTR_MACHTYPE_IBMPCCONV TEXT("IBM PC Convertible")
+#define REGSTR_MACHTYPE_IBMPCXT TEXT("IBM PC/XT")
+#define REGSTR_MACHTYPE_IBMPCXT_286 TEXT("IBM PC/XT 286")
+#define REGSTR_MACHTYPE_IBMPCAT TEXT("IBM PC/AT")
+#define REGSTR_MACHTYPE_IBMPS2_25 TEXT("IBM PS/2-25")
+#define REGSTR_MACHTYPE_IBMPS2_30_286 TEXT("IBM PS/2-30 286")
+#define REGSTR_MACHTYPE_IBMPS2_30 TEXT("IBM PS/2-30")
+#define REGSTR_MACHTYPE_IBMPS2_50 TEXT("IBM PS/2-50")
+#define REGSTR_MACHTYPE_IBMPS2_50Z TEXT("IBM PS/2-50Z")
+#define REGSTR_MACHTYPE_IBMPS2_55SX TEXT("IBM PS/2-55SX")
+#define REGSTR_MACHTYPE_IBMPS2_60 TEXT("IBM PS/2-60")
+#define REGSTR_MACHTYPE_IBMPS2_65SX TEXT("IBM PS/2-65SX")
+#define REGSTR_MACHTYPE_IBMPS2_70 TEXT("IBM PS/2-70")
+#define REGSTR_MACHTYPE_IBMPS2_P70 TEXT("IBM PS/2-P70")
+#define REGSTR_MACHTYPE_IBMPS2_70_80 TEXT("IBM PS/2-70/80")
+#define REGSTR_MACHTYPE_IBMPS2_80 TEXT("IBM PS/2-80")
+#define REGSTR_MACHTYPE_IBMPS2_90 TEXT("IBM PS/2-90")
+#define REGSTR_MACHTYPE_IBMPS1 TEXT("IBM PS/1")
+#define REGSTR_MACHTYPE_PHOENIX_PCAT TEXT("Phoenix PC/AT Compatible")
+#define REGSTR_MACHTYPE_HP_VECTRA TEXT("HP Vectra")
+#define REGSTR_MACHTYPE_ATT_PC TEXT("AT&T PC")
+#define REGSTR_MACHTYPE_ZENITH_PC TEXT("Zenith PC")
+#define REGSTR_VAL_APMMENUSUSPEND TEXT("APMMenuSuspend")
+#define APMMENUSUSPEND_DISABLED 0
+#define APMMENUSUSPEND_ENABLED 1
+#define APMMENUSUSPEND_UNDOCKED 2
+#define APMMENUSUSPEND_NOCHANGE 128
+#define REGSTR_VAL_BUSTYPE TEXT("BusType")
+#define REGSTR_VAL_CPU TEXT("CPU")
+#define REGSTR_VAL_NDP TEXT("NDP")
+#define REGSTR_VAL_PNPBIOSVER TEXT("PnPBIOSVer")
+#define REGSTR_VAL_PNPSTRUCOFFSET TEXT("PnPStrucOffset")
+#define REGSTR_VAL_PCIBIOSVER TEXT("PCIBIOSVer")
+#define REGSTR_VAL_HWMECHANISM TEXT("HWMechanism")
+#define REGSTR_VAL_LASTPCIBUSNUM TEXT("LastPCIBusNum")
+#define REGSTR_VAL_CONVMEM TEXT("ConvMem")
+#define REGSTR_VAL_EXTMEM TEXT("ExtMem")
+#define REGSTR_VAL_COMPUTERNAME TEXT("ComputerName")
+#define REGSTR_VAL_BIOSNAME TEXT("BIOSName")
+#define REGSTR_VAL_BIOSVERSION TEXT("BIOSVersion")
+#define REGSTR_VAL_BIOSDATE TEXT("BIOSDate")
+#define REGSTR_VAL_MODEL TEXT("Model")
+#define REGSTR_VAL_SUBMODEL TEXT("Submodel")
+#define REGSTR_VAL_REVISION TEXT("Revision")
+#define REGSTR_VAL_FIFODEPTH TEXT("FIFODepth")
+#define REGSTR_VAL_RDINTTHRESHOLD TEXT("RDIntThreshold")
+#define REGSTR_VAL_WRINTTHRESHOLD TEXT("WRIntThreshold")
+#define REGSTR_VAL_PRIORITY TEXT("Priority")
+#define REGSTR_VAL_DRIVER TEXT("Driver")
+#define REGSTR_VAL_FUNCDESC TEXT("FunctionDesc")
+#define REGSTR_VAL_FORCEDCONFIG TEXT("ForcedConfig")
+#define REGSTR_VAL_CONFIGFLAGS TEXT("ConfigFlags")
+#define REGSTR_VAL_CSCONFIGFLAGS TEXT("CSConfigFlags")
+#define CONFIGFLAG_DISABLED 1
+#define CONFIGFLAG_REMOVED 2
+#define CONFIGFLAG_MANUAL_INSTALL 4
+#define CONFIGFLAG_IGNORE_BOOT_LC 8
+#define CONFIGFLAG_NET_BOOT 16
+#define CONFIGFLAG_REINSTALL 32
+#define CONFIGFLAG_FAILEDINSTALL 64
+#define CONFIGFLAG_CANTSTOPACHILD 128
+#define CONFIGFLAG_OKREMOVEROM 256
+#define CONFIGFLAG_NOREMOVEEXIT 512
+#define CSCONFIGFLAG_BITS 7
+#define CSCONFIGFLAG_DISABLED 1
+#define CSCONFIGFLAG_DO_NOT_CREATE 2
+#define CSCONFIGFLAG_DO_NOT_START 4
+#define DMSTATEFLAG_APPLYTOALL 1
+#define REGSTR_VAL_ROOT_DEVNODE TEXT("HTREE\\ROOT\\0")
+#define REGSTR_VAL_RESERVED_DEVNODE TEXT("HTREE\\RESERVED\\0")
+#define REGSTR_PATH_READDATAPORT REGSTR_KEY_ISAENUM TEXT("\\ReadDataPort\\0")
+#define REGSTR_PATH_MULTI_FUNCTION TEXT("MF")
+#define REGSTR_VAL_RESOURCE_MAP TEXT("ResourceMap")
+#define REGSTR_PATH_CHILD_PREFIX TEXT("Child")
+#define NUM_RESOURCE_MAP 256
+#define REGSTR_VAL_MF_FLAGS TEXT("MFFlags")
+#define MF_FLAGS_EVEN_IF_NO_RESOURCE 1
+#define MF_FLAGS_NO_CREATE_IF_NO_RESOURCE 2
+#define MF_FLAGS_FILL_IN_UNKNOWN_RESOURCE 4
+#define MF_FLAGS_CREATE_BUT_NO_SHOW_DISABLED 8
+#define EISAFLAG_NO_IO_MERGE 1
+#define EISAFLAG_SLOT_IO_FIRST 2
+#define EISA_NO_MAX_FUNCTION 0xFF
+#define NUM_EISA_RANGES 4
+#define REGSTR_VAL_DRVDESC TEXT("DriverDesc")
+#define REGSTR_VAL_DEVLOADER TEXT("DevLoader")
+#define REGSTR_VAL_STATICVXD TEXT("StaticVxD")
+#define REGSTR_VAL_PROPERTIES TEXT("Properties")
+#define REGSTR_VAL_MANUFACTURER TEXT("Manufacturer")
+#define REGSTR_VAL_EXISTS TEXT("Exists")
+#define REGSTR_VAL_CMENUMFLAGS TEXT("CMEnumFlags")
+#define REGSTR_VAL_CMDRIVFLAGS TEXT("CMDrivFlags")
+#define REGSTR_VAL_ENUMERATOR TEXT("Enumerator")
+#define REGSTR_VAL_DEVICEDRIVER TEXT("DeviceDriver")
+#define REGSTR_VAL_PORTNAME TEXT("PortName")
+#define REGSTR_VAL_INFPATH TEXT("InfPath")
+#define REGSTR_VAL_INFSECTION TEXT("InfSection")
+#define REGSTR_VAL_POLLING TEXT("Polling")
+#define REGSTR_VAL_DONTLOADIFCONFLICT TEXT("DontLoadIfConflict")
+#define REGSTR_VAL_PORTSUBCLASS TEXT("PortSubClass")
+#define REGSTR_VAL_NETCLEAN TEXT("NetClean")
+#define REGSTR_VAL_IDE_NO_SERIALIZE TEXT("IDENoSerialize")
+#define REGSTR_VAL_NOCMOSORFDPT TEXT("NoCMOSorFDPT")
+#define REGSTR_VAL_COMVERIFYBASE TEXT("COMVerifyBase")
+#define REGSTR_KEY_OVERRIDE TEXT("Override")
+#define REGSTR_VAL_CONFIGMG TEXT("CONFIGMG")
+#define REGSTR_VAL_SYSDM TEXT("SysDM")
+#define REGSTR_VAL_SYSDMFUNC TEXT("SysDMFunc")
+#define REGSTR_VAL_PRIVATE TEXT("Private")
+#define REGSTR_VAL_PRIVATEFUNC TEXT("PrivateFunc")
+#define REGSTR_VAL_DETECT TEXT("Detect")
+#define REGSTR_VAL_DETECTFUNC TEXT("DetectFunc")
+#define REGSTR_VAL_ASKFORCONFIG TEXT("AskForConfig")
+#define REGSTR_VAL_ASKFORCONFIGFUNC TEXT("AskForConfigFunc")
+#define REGSTR_VAL_WAITFORUNDOCK TEXT("WaitForUndock")
+#define REGSTR_VAL_WAITFORUNDOCKFUNC TEXT("WaitForUndockFunc")
+#define REGSTR_VAL_REMOVEROMOKAY TEXT("RemoveRomOkay")
+#define REGSTR_VAL_REMOVEROMOKAYFUNC TEXT("RemoveRomOkayFunc")
+#define REGSTR_VAL_CURCONFIG TEXT("CurrentConfig")
+#define REGSTR_VAL_FRIENDLYNAME TEXT("FriendlyName")
+#define REGSTR_VAL_CURRENTCONFIG TEXT("CurrentConfig")
+#define REGSTR_VAL_MAP TEXT("Map")
+#define REGSTR_VAL_ID TEXT("CurrentID")
+#define REGSTR_VAL_DOCKED TEXT("CurrentDockedState")
+#define REGSTR_VAL_CHECKSUM TEXT("CurrentChecksum")
+#define REGSTR_VAL_HWDETECT TEXT("HardwareDetect")
+#define REGSTR_VAL_INHIBITRESULTS TEXT("InhibitResults")
+#define REGSTR_VAL_PROFILEFLAGS TEXT("ProfileFlags")
+#define REGSTR_KEY_PCMCIA TEXT("PCMCIA\\")
+#define REGSTR_KEY_PCUNKNOWN TEXT("UNKNOWN_MANUFACTURER")
+#define REGSTR_VAL_PCSSDRIVER TEXT("Driver")
+#define REGSTR_KEY_PCMTD TEXT("MTD-")
+#define REGSTR_VAL_PCMTDRIVER TEXT("MTD")
+#define REGSTR_VAL_HARDWAREID TEXT("HardwareID")
+#define REGSTR_VAL_INSTALLER TEXT("Installer")
+#define REGSTR_VAL_INSICON TEXT("Icon")
+#define REGSTR_VAL_ENUMPROPPAGES TEXT("EnumPropPages")
+#define REGSTR_VAL_BASICPROPERTIES TEXT("BasicProperties")
+#define REGSTR_VAL_PRIVATEPROBLEM TEXT("PrivateProblem")
+#define REGSTR_KEY_CURRENT TEXT("Current")
+#define REGSTR_KEY_DEFAULT TEXT("Default")
+#define REGSTR_KEY_MODES TEXT("Modes")
+#define REGSTR_VAL_MODE TEXT("Mode")
+#define REGSTR_VAL_BPP TEXT("BPP")
+#define REGSTR_VAL_HRES TEXT("HRes")
+#define REGSTR_VAL_VRES TEXT("VRes")
+#define REGSTR_VAL_FONTSIZE TEXT("FontSize")
+#define REGSTR_VAL_DRV TEXT("drv")
+#define REGSTR_VAL_GRB TEXT("grb")
+#define REGSTR_VAL_VDD TEXT("vdd")
+#define REGSTR_VAL_VER TEXT("Ver")
+#define REGSTR_VAL_MAXRES TEXT("MaxResolution")
+#define REGSTR_VAL_DPMS TEXT("DPMS")
+#define REGSTR_VAL_RESUMERESET TEXT("ResumeReset")
+#define REGSTR_VAL_DESCRIPTION TEXT("Description")
+#define REGSTR_KEY_SYSTEM TEXT("System")
+#define REGSTR_KEY_USER TEXT("User")
+#define REGSTR_VAL_DPI TEXT("dpi")
+#define REGSTR_VAL_PCICOPTIONS TEXT("PCICOptions")
+#ifndef NEC_98
+#define PCIC_DEFAULT_IRQMASK 0x4EB8
+#else
+#define PCIC_DEFAULT_IRQMASK 0x1468
+#endif
+#define PCIC_DEFAULT_NUMSOCKETS 0
+#define REGSTR_VAL_PCICIRQMAP TEXT("PCICIRQMap")
+#define REGSTR_PATH_APPEARANCE TEXT("Control Panel\\Appearance")
+#define REGSTR_PATH_LOOKSCHEMES TEXT("Control Panel\\Appearance\\Schemes")
+#define REGSTR_VAL_CUSTOMCOLORS TEXT("CustomColors")
+#define REGSTR_PATH_SCREENSAVE TEXT("Control Panel\\Desktop")
+#define REGSTR_VALUE_USESCRPASSWORD TEXT("ScreenSaveUsePassword")
+#define REGSTR_VALUE_SCRPASSWORD TEXT("ScreenSave_Data")
+#define REGSTR_VALUE_LOWPOWERTIMEOUT TEXT("ScreenSaveLowPowerTimeout")
+#define REGSTR_VALUE_POWEROFFTIMEOUT TEXT("ScreenSavePowerOffTimeout")
+#define REGSTR_VALUE_LOWPOWERACTIVE TEXT("ScreenSaveLowPowerActive")
+#define REGSTR_VALUE_POWEROFFACTIVE TEXT("ScreenSavePowerOffActive")
+#define REGSTR_PATH_WINDOWSAPPLETS TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Applets")
+#define REGSTR_PATH_SYSTRAY TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Applets\\SysTray")
+#define REGSTR_VAL_SYSTRAYSVCS TEXT("Services")
+#define REGSTR_VAL_SYSTRAYBATFLAGS TEXT("PowerFlags")
+#define REGSTR_VAL_SYSTRAYPCCARDFLAGS TEXT("PCMCIAFlags")
+#define REGSTR_PATH_NETWORK_USERSETTINGS TEXT("Network")
+#define REGSTR_KEY_NETWORK_PERSISTENT TEXT("\\Persistent")
+#define REGSTR_KEY_NETWORK_RECENT TEXT("\\Recent")
+#define REGSTR_VAL_REMOTE_PATH TEXT("RemotePath")
+#define REGSTR_VAL_USER_NAME TEXT("UserName")
+#define REGSTR_VAL_PROVIDER_NAME TEXT("ProviderName")
+#define REGSTR_VAL_CONNECTION_TYPE TEXT("ConnectionType")
+#define REGSTR_VAL_UPGRADE TEXT("Upgrade")
+#define REGSTR_KEY_LOGON TEXT("\\Logon")
+#define REGSTR_VAL_MUSTBEVALIDATED TEXT("MustBeValidated")
+#define REGSTR_VAL_RUNLOGINSCRIPT TEXT("ProcessLoginScript")
+#define REGSTR_KEY_NETWORKPROVIDER TEXT("\\NetworkProvider")
+#define REGSTR_PATH_NW32NETPROVIDER REGSTR_PATH_SERVICES TEXT("\\NWNP32" REGSTR_KEY_NETWORKPROVIDER
+#define REGSTR_PATH_MS32NETPROVIDER REGSTR_PATH_SERVICES TEXT("\\MSNP32" REGSTR_KEY_NETWORKPROVIDER
+#define REGSTR_VAL_AUTHENT_AGENT TEXT("AuthenticatingAgent")
+#define REGSTR_VAL_PREFREDIR TEXT("PreferredRedir")
+#define REGSTR_VAL_AUTOSTART TEXT("AutoStart")
+#define REGSTR_VAL_AUTOLOGON TEXT("AutoLogon")
+#define REGSTR_VAL_NETCARD TEXT("Netcard")
+#define REGSTR_VAL_TRANSPORT TEXT("Transport")
+#define REGSTR_VAL_DYNAMIC TEXT("Dynamic")
+#define REGSTR_VAL_TRANSITION TEXT("Transition")
+#define REGSTR_VAL_STATICDRIVE TEXT("StaticDrive")
+#define REGSTR_VAL_LOADHI TEXT("LoadHi")
+#define REGSTR_VAL_LOADRMDRIVERS TEXT("LoadRMDrivers")
+#define REGSTR_VAL_SETUPN TEXT("SetupN")
+#define REGSTR_VAL_SETUPNPATH TEXT("SetupNPath")
+#define REGSTR_VAL_WRKGRP_FORCEMAPPING TEXT("WrkgrpForceMapping")
+#define REGSTR_VAL_WRKGRP_REQUIRED TEXT("WrkgrpRequired")
+#define REGSTR_PATH_CURRENT_CONTROL_SET TEXT("System\\CurrentControlSet\\Control")
+#define REGSTR_VAL_CURRENT_USER TEXT("Current User")
+#define REGSTR_PATH_PWDPROVIDER TEXT("System\\CurrentControlSet\\Control\\PwdProvider")
+#define REGSTR_VAL_PWDPROVIDER_PATH TEXT("ProviderPath")
+#define REGSTR_VAL_PWDPROVIDER_DESC TEXT("Description")
+#define REGSTR_VAL_PWDPROVIDER_CHANGEPWD TEXT("ChangePassword")
+#define REGSTR_VAL_PWDPROVIDER_CHANGEPWDHWND TEXT("ChangePasswordHwnd")
+#define REGSTR_VAL_PWDPROVIDER_GETPWDSTATUS TEXT("GetPasswordStatus")
+#define REGSTR_VAL_PWDPROVIDER_ISNP TEXT("NetworkProvider")
+#define REGSTR_VAL_PWDPROVIDER_CHANGEORDER TEXT("ChangeOrder")
+#define REGSTR_PATH_POLICIES TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Policies")
+#define REGSTR_PATH_UPDATE TEXT("System\\CurrentControlSet\\Control\\Update")
+#define REGSTR_VALUE_ENABLE TEXT("Enable")
+#define REGSTR_VALUE_VERBOSE TEXT("Verbose")
+#define REGSTR_VALUE_NETPATH TEXT("NetworkPath")
+#define REGSTR_VALUE_DEFAULTLOC TEXT("UseDefaultNetLocation")
+#define REGSTR_KEY_NETWORK TEXT("Network")
+#define REGSTR_KEY_SYSTEM TEXT("System")
+#define REGSTR_KEY_PRINTERS TEXT("Printers")
+#define REGSTR_KEY_WINOLDAPP TEXT("WinOldApp")
+#define REGSTR_VAL_NOFILESHARING TEXT("NoFileSharing")
+#define REGSTR_VAL_NOPRINTSHARING TEXT("NoPrintSharing")
+#define REGSTR_VAL_NOFILESHARINGCTRL TEXT("NoFileSharingControl")
+#define REGSTR_VAL_NOPRINTSHARINGCTRL TEXT("NoPrintSharingControl")
+#define REGSTR_VAL_HIDESHAREPWDS TEXT("HideSharePwds")
+#define REGSTR_VAL_DISABLEPWDCACHING TEXT("DisablePwdCaching")
+#define REGSTR_VAL_ALPHANUMPWDS TEXT("AlphanumPwds")
+#define REGSTR_VAL_NETSETUP_DISABLE TEXT("NoNetSetup")
+#define REGSTR_VAL_NETSETUP_NOCONFIGPAGE TEXT("NoNetSetupConfigPage")
+#define REGSTR_VAL_NETSETUP_NOIDPAGE TEXT("NoNetSetupIDPage")
+#define REGSTR_VAL_NETSETUP_NOSECURITYPAGE TEXT("NoNetSetupSecurityPage")
+#define REGSTR_VAL_SYSTEMCPL_NOVIRTMEMPAGE TEXT("NoVirtMemPage")
+#define REGSTR_VAL_SYSTEMCPL_NODEVMGRPAGE TEXT("NoDevMgrPage")
+#define REGSTR_VAL_SYSTEMCPL_NOCONFIGPAGE TEXT("NoConfigPage")
+#define REGSTR_VAL_SYSTEMCPL_NOFILESYSPAGE TEXT("NoFileSysPage")
+#define REGSTR_VAL_DISPCPL_NODISPCPL TEXT("NoDispCPL")
+#define REGSTR_VAL_DISPCPL_NOBACKGROUNDPAGE TEXT("NoDispBackgroundPage")
+#define REGSTR_VAL_DISPCPL_NOSCRSAVPAGE TEXT("NoDispScrSavPage")
+#define REGSTR_VAL_DISPCPL_NOAPPEARANCEPAGE TEXT("NoDispAppearancePage")
+#define REGSTR_VAL_DISPCPL_NOSETTINGSPAGE TEXT("NoDispSettingsPage")
+#define REGSTR_VAL_SECCPL_NOSECCPL TEXT("NoSecCPL")
+#define REGSTR_VAL_SECCPL_NOPWDPAGE TEXT("NoPwdPage")
+#define REGSTR_VAL_SECCPL_NOADMINPAGE TEXT("NoAdminPage")
+#define REGSTR_VAL_SECCPL_NOPROFILEPAGE TEXT("NoProfilePage")
+#define REGSTR_VAL_PRINTERS_HIDETABS TEXT("NoPrinterTabs")
+#define REGSTR_VAL_PRINTERS_NODELETE TEXT("NoDeletePrinter")
+#define REGSTR_VAL_PRINTERS_NOADD TEXT("NoAddPrinter")
+#define REGSTR_VAL_WINOLDAPP_DISABLED TEXT("Disabled")
+#define REGSTR_VAL_WINOLDAPP_NOREALMODE TEXT("NoRealMode")
+#define REGSTR_VAL_NOENTIRENETWORK TEXT("NoEntireNetwork")
+#define REGSTR_VAL_NOWORKGROUPCONTENTS TEXT("NoWorkgroupContents")
+#define REGSTR_VAL_MINPWDLEN TEXT("MinPwdLen")
+#define REGSTR_VAL_PWDEXPIRATION TEXT("PwdExpiration")
+#define REGSTR_VAL_WIN31PROVIDER TEXT("Win31Provider")
+#define REGSTR_VAL_DISABLEREGTOOLS TEXT("DisableRegistryTools")
+#define REGSTR_PATH_WINLOGON TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Winlogon")
+#define REGSTR_VAL_LEGALNOTICECAPTION TEXT("LegalNoticeCaption")
+#define REGSTR_VAL_LEGALNOTICETEXT TEXT("LegalNoticeText")
+#define REGSTR_VAL_RESTRICTRUN TEXT("RestrictRun")
+#define REGSTR_KEY_POL_USERS TEXT("Users")
+#define REGSTR_KEY_POL_COMPUTERS TEXT("Computers")
+#define REGSTR_KEY_POL_USERGROUPS TEXT("UserGroups")
+#define REGSTR_KEY_POL_DEFAULT TEXT(".default")
+#define REGSTR_KEY_POL_USERGROUPDATA TEXT("GroupData\\UserGroups\\Priority")
+#define REGSTR_PATH_TIMEZONE TEXT("System\\CurrentControlSet\\Control\\TimeZoneInformation")
+#define REGSTR_VAL_TZBIAS TEXT("Bias")
+#define REGSTR_VAL_TZDLTBIAS TEXT("DaylightBias")
+#define REGSTR_VAL_TZSTDBIAS TEXT("StandardBias")
+#define REGSTR_VAL_TZACTBIAS TEXT("ActiveTimeBias")
+#define REGSTR_VAL_TZDLTFLAG TEXT("DaylightFlag")
+#define REGSTR_VAL_TZSTDSTART TEXT("StandardStart")
+#define REGSTR_VAL_TZDLTSTART TEXT("DaylightStart")
+#define REGSTR_VAL_TZDLTNAME TEXT("DaylightName")
+#define REGSTR_VAL_TZSTDNAME TEXT("StandardName")
+#define REGSTR_VAL_TZNOCHANGESTART TEXT("NoChangeStart")
+#define REGSTR_VAL_TZNOCHANGEEND TEXT("NoChangeEnd")
+#define REGSTR_VAL_TZNOAUTOTIME TEXT("DisableAutoDaylightTimeSet")
+#define REGSTR_PATH_FLOATINGPOINTPROCESSOR TEXT("HARDWARE\\DESCRIPTION\\System\\FloatingPointProcessor")
+#define REGSTR_PATH_FLOATINGPOINTPROCESSOR0 TEXT("HARDWARE\\DESCRIPTION\\System\\FloatingPointProcessor\\0")
+#define REGSTR_PATH_COMPUTRNAME TEXT("System\\CurrentControlSet\\Control\\ComputerName\\ComputerName")
+#define REGSTR_VAL_COMPUTRNAME TEXT("ComputerName")
+#define REGSTR_PATH_SHUTDOWN TEXT("System\\CurrentControlSet\\Control\\Shutdown")
+#define REGSTR_VAL_FORCEREBOOT TEXT("ForceReboot")
+#define REGSTR_VAL_SETUPPROGRAMRAN TEXT("SetupProgramRan")
+#define REGSTR_VAL_DOES_POLLING TEXT("PollingSupportNeeded")
+#define REGSTR_PATH_KNOWNDLLS TEXT("System\\CurrentControlSet\\Control\\SessionManager\\KnownDLLs")
+#define REGSTR_PATH_KNOWN16DLLS TEXT("System\\CurrentControlSet\\Control\\SessionManager\\Known16DLLs")
+#define REGSTR_PATH_CHECKVERDLLS TEXT("System\\CurrentControlSet\\Control\\SessionManager\\CheckVerDLLs")
+#define REGSTR_PATH_WARNVERDLLS TEXT("System\\CurrentControlSet\\Control\\SessionManager\\WarnVerDLLs")
+#define REGSTR_PATH_HACKINIFILE TEXT("System\\CurrentControlSet\\Control\\SessionManager\\HackIniFiles")
+#define REGSTR_PATH_CHECKBADAPPS TEXT("System\\CurrentControlSet\\Control\\SessionManager\\CheckBadApps")
+#define REGSTR_PATH_APPPATCH TEXT("System\\CurrentControlSet\\Control\\SessionManager\\AppPatches")
+#define REGSTR_PATH_KNOWNVXDS TEXT("System\\CurrentControlSet\\Control\\SessionManager\\KnownVxDs")
+#define REGSTR_VAL_UNINSTALLER_DISPLAYNAME TEXT("DisplayName")
+#define REGSTR_VAL_UNINSTALLER_COMMANDLINE TEXT("UninstallString")
+#define REGSTR_PATH_DESKTOP REGSTR_PATH_SCREENSAVE
+#define REGSTR_PATH_MOUSE TEXT("Control Panel\\Mouse")
+#define REGSTR_PATH_KEYBOARD TEXT("Control Panel\\Keyboard")
+#define REGSTR_PATH_COLORS TEXT("Control Panel\\Colors")
+#define REGSTR_PATH_SOUND TEXT("Control Panel\\Sound")
+#define REGSTR_PATH_METRICS TEXT("Control Panel\\Desktop\\WindowMetrics")
+#define REGSTR_PATH_ICONS TEXT("Control Panel\\Icons")
+#define REGSTR_PATH_CURSORS TEXT("Control Panel\\Cursors")
+#define REGSTR_PATH_CHECKDISK TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Applets\\Check Drive")
+#define REGSTR_PATH_CHECKDISKSET TEXT("Settings")
+#define REGSTR_PATH_CHECKDISKUDRVS TEXT("NoUnknownDDErrDrvs")
+#define REGSTR_PATH_FAULT TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Fault")
+#define REGSTR_VAL_FAULT_LOGFILE TEXT("LogFile")
+#define REGSTR_PATH_AEDEBUG TEXT("Software\\Microsoft\\Windows NT\\CurrentVersion\\AeDebug")
+#define REGSTR_VAL_AEDEBUG_DEBUGGER TEXT("Debugger")
+#define REGSTR_VAL_AEDEBUG_AUTO TEXT("Auto")
+#define REGSTR_PATH_GRPCONV TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\GrpConv")
+#define REGSTR_VAL_REGITEMDELETEMESSAGE TEXT("Removal Message")
+#define REGSTR_PATH_LASTCHECK TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\LastCheck")
+#define REGSTR_PATH_LASTOPTIMIZE TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\LastOptimize")
+#define REGSTR_PATH_LASTBACKUP TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\LastBackup")
+#define REGSTR_PATH_CHKLASTCHECK TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Applets\\Check Drive\\LastCheck")
+#define REGSTR_PATH_CHKLASTSURFAN TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Applets\\Check Drive\\LastSurfaceAnalysis")
+#define DTRESULTOK 0
+#define DTRESULTFIX 1
+#define DTRESULTPROB 2
+#define DTRESULTPART 3
+#define REGSTR_KEY_SHARES TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Network\\LanMan")
+#define REGSTR_VAL_SHARES_FLAGS TEXT("Flags")
+#define REGSTR_VAL_SHARES_TYPE TEXT("Type")
+#define REGSTR_VAL_SHARES_PATH TEXT("Path")
+#define REGSTR_VAL_SHARES_REMARK TEXT("Remark")
+#define REGSTR_VAL_SHARES_RW_PASS TEXT("Parm1")
+#define REGSTR_VAL_SHARES_RO_PASS TEXT("Parm2")
+#define REGSTR_PATH_PRINT TEXT("System\\CurrentControlSet\\Control\\Print")
+#define REGSTR_PATH_PRINTERS TEXT("System\\CurrentControlSet\\Control\\Print\\Printers")
+#define REGSTR_PATH_PROVIDERS TEXT("System\\CurrentControlSet\\Control\\Print\\Providers")
+#define REGSTR_PATH_MONITORS TEXT("System\\CurrentControlSet\\Control\\Print\\Monitors")
+#define REGSTR_PATH_ENVIRONMENTS TEXT("System\\CurrentControlSet\\Control\\Print\\Environments")
+#define REGSTR_VAL_START_ON_BOOT TEXT("StartOnBoot")
+#define REGSTR_VAL_PRINTERS_MASK TEXT("PrintersMask")
+#define REGSTR_VAL_DOS_SPOOL_MASK TEXT("DOSSpoolMask")
+#define REGSTR_KEY_CURRENT_ENV TEXT("\\Windows 4.0")
+#define REGSTR_KEY_DRIVERS TEXT("\\Drivers")
+#define REGSTR_KEY_PRINT_PROC TEXT("\\Print Processors")
+#define REGSTR_PATH_EVENTLABELS TEXT("AppEvents\\EventLabels")
+#define REGSTR_PATH_SCHEMES TEXT("AppEvents\\Schemes")
+#define REGSTR_PATH_APPS REGSTR_PATH_SCHEMES TEXT("\\Apps")
+#define REGSTR_PATH_APPS_DEFAULT REGSTR_PATH_SCHEMES TEXT("\\Apps\\.Default")
+#define REGSTR_PATH_NAMES REGSTR_PATH_SCHEMES TEXT("\\Names")
+#define REGSTR_PATH_MULTIMEDIA REGSTR_PATH_SETUP TEXT("\\Multimedia")
+#define REGSTR_PATH_MULTIMEDIA_AUDIO TEXT("Software\\Microsoft\\Multimedia\\Audio")
+#define REGSTR_PATH_MEDIARESOURCES REGSTR_PATH_CURRENT_CONTROL_SET TEXT("\\MediaResources")
+#define REGSTR_PATH_MEDIAPROPERTIES REGSTR_PATH_CURRENT_CONTROL_SET TEXT("\\MediaProperties")
+#define REGSTR_PATH_PRIVATEPROPERTIES REGSTR_PATH_MEDIAPROPERTIES TEXT("\\PrivateProperties")
+#define REGSTR_PATH_PUBLICPROPERTIES REGSTR_PATH_MEDIAPROPERTIES TEXT("\\PublicProperties")
+#define REGSTR_PATH_JOYOEM REGSTR_PATH_PRIVATEPROPERTIES TEXT("\\Joystick\\OEM")
+#define REGSTR_PATH_JOYCONFIG REGSTR_PATH_MEDIARESOURCES TEXT("\\Joystick")
+#define REGSTR_KEY_JOYCURR TEXT("CurrentJoystickSettings")
+#define REGSTR_KEY_JOYSETTINGS TEXT("JoystickSettings")
+#define REGSTR_VAL_JOYUSERVALUES TEXT("JoystickUserValues")
+#define REGSTR_VAL_JOYCALLOUT TEXT("JoystickCallout")
+#define REGSTR_VAL_JOYNCONFIG TEXT("Joystick%dConfiguration")
+#define REGSTR_VAL_JOYNOEMNAME TEXT("Joystick%dOEMName")
+#define REGSTR_VAL_JOYNOEMCALLOUT TEXT("Joystick%dOEMCallout")
+#define REGSTR_VAL_JOYOEMCALLOUT TEXT("OEMCallout")
+#define REGSTR_VAL_JOYOEMNAME TEXT("OEMName")
+#define REGSTR_VAL_JOYOEMDATA TEXT("OEMData")
+#define REGSTR_VAL_JOYOEMXYLABEL TEXT("OEMXYLabel")
+#define REGSTR_VAL_JOYOEMZLABEL TEXT("OEMZLabel")
+#define REGSTR_VAL_JOYOEMRLABEL TEXT("OEMRLabel")
+#define REGSTR_VAL_JOYOEMPOVLABEL TEXT("OEMPOVLabel")
+#define REGSTR_VAL_JOYOEMULABEL TEXT("OEMULabel")
+#define REGSTR_VAL_JOYOEMVLABEL TEXT("OEMVLabel")
+#define REGSTR_VAL_JOYOEMTESTMOVEDESC TEXT("OEMTestMoveDesc")
+#define REGSTR_VAL_JOYOEMTESTBUTTONDESC TEXT("OEMTestButtonDesc")
+#define REGSTR_VAL_JOYOEMTESTMOVECAP TEXT("OEMTestMoveCap")
+#define REGSTR_VAL_JOYOEMTESTBUTTONCAP TEXT("OEMTestButtonCap")
+#define REGSTR_VAL_JOYOEMTESTWINCAP TEXT("OEMTestWinCap")
+#define REGSTR_VAL_JOYOEMCALCAP TEXT("OEMCalCap")
+#define REGSTR_VAL_JOYOEMCALWINCAP TEXT("OEMCalWinCap")
+#define REGSTR_VAL_JOYOEMCAL1 TEXT("OEMCal1")
+#define REGSTR_VAL_JOYOEMCAL2 TEXT("OEMCal2")
+#define REGSTR_VAL_JOYOEMCAL3 TEXT("OEMCal3")
+#define REGSTR_VAL_JOYOEMCAL4 TEXT("OEMCal4")
+#define REGSTR_VAL_JOYOEMCAL5 TEXT("OEMCal5")
+#define REGSTR_VAL_JOYOEMCAL6 TEXT("OEMCal6")
+#define REGSTR_VAL_JOYOEMCAL7 TEXT("OEMCal7")
+#define REGSTR_VAL_JOYOEMCAL8 TEXT("OEMCal8")
+#define REGSTR_VAL_JOYOEMCAL9 TEXT("OEMCal9")
+#define REGSTR_VAL_JOYOEMCAL10 TEXT("OEMCal10")
+#define REGSTR_VAL_JOYOEMCAL11 TEXT("OEMCal11")
+#define REGSTR_VAL_JOYOEMCAL12 TEXT("OEMCal12")
+#ifndef NEC_98
+#define REGSTR_KEY_ISAENUM TEXT("ISAPnP")
+#define REGSTR_KEY_EISAENUM TEXT("EISA")
+#define REGSTR_VAL_EISA_RANGES TEXT("EISARanges")
+#define REGSTR_VAL_EISA_FUNCTIONS TEXT("EISAFunctions")
+#define REGSTR_VAL_EISA_FUNCTIONS_MASK TEXT("EISAFunctionsMask")
+#define REGSTR_VAL_EISA_FLAGS TEXT("EISAFlags")
+#define REGSTR_VAL_EISA_SIMULATE_INT15 TEXT("EISASimulateInt15")
+#else
+#define REGSTR_KEY_ISAENUM TEXT("C98PnP")
+#define REGSTR_KEY_EISAENUM TEXT("NESA")
+#define REGSTR_VAL_EISA_RANGES TEXT("NESARanges")
+#define REGSTR_VAL_EISA_FUNCTIONS TEXT("NESAFunctions")
+#define REGSTR_VAL_EISA_FUNCTIONS_MASK TEXT("NESAFunctionsMask")
+#define REGSTR_VAL_EISA_FLAGS TEXT("NESAFlags")
+#define REGSTR_VAL_EISA_SIMULATE_INT15 TEXT("NESASimulateInt15")
+#endif
+typedef struct _DSKTLSYSTEMTIME {
+ WORD wYear;
+ WORD wMonth;
+ WORD wDayOfWeek;
+ WORD wDay;
+ WORD wHour;
+ WORD wMinute;
+ WORD wSecond;
+ WORD wMilliseconds;
+ WORD wResult;
+} DSKTLSYSTEMTIME,*PDSKTLSYSTEMTIME,*LPDSKTLSYSTEMTIME;
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/winsup/w32api/include/richedit.h b/winsup/w32api/include/richedit.h
new file mode 100644
index 000000000..5262b5089
--- /dev/null
+++ b/winsup/w32api/include/richedit.h
@@ -0,0 +1,349 @@
+#ifndef _RICHEDIT_H
+#define _RICHEDIT_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+#pragma pack(push,4)
+
+#define CF_RTF TEXT("Rich Text Format")
+#define CF_RTFNOOBJS TEXT("Rich Text Format Without Objects")
+#define CF_RETEXTOBJ TEXT("RichEdit Text and Objects")
+#define CFM_BOLD 1
+#define CFM_ITALIC 2
+#define CFM_UNDERLINE 4
+#define CFM_STRIKEOUT 8
+#define CFM_PROTECTED 16
+#define CFM_SIZE 0x80000000
+#define CFM_COLOR 0x40000000
+#define CFM_FACE 0x20000000
+#define CFM_OFFSET 0x10000000
+#define CFM_CHARSET 0x08000000
+#define CFE_BOLD 1
+#define CFE_ITALIC 2
+#define CFE_UNDERLINE 4
+#define CFE_STRIKEOUT 8
+#define CFE_PROTECTED 16
+#define CFE_AUTOCOLOR 0x40000000
+#define IMF_FORCENONE 1
+#define IMF_FORCEENABLE 2
+#define IMF_FORCEDISABLE 4
+#define IMF_CLOSESTATUSWINDOW 8
+#define IMF_VERTICAL 32
+#define IMF_FORCEACTIVE 64
+#define IMF_FORCEINACTIVE 128
+#define IMF_FORCEREMEMBER 256
+#define SEL_EMPTY 0
+#define SEL_TEXT 1
+#define SEL_OBJECT 2
+#define SEL_MULTICHAR 4
+#define SEL_MULTIOBJECT 8
+#define MAX_TAB_STOPS 32
+#define PFM_ALIGNMENT 8
+#define PFM_NUMBERING 32
+#define PFM_OFFSET 4
+#define PFM_OFFSETINDENT 0x80000000
+#define PFM_RIGHTINDENT 2
+#define PFM_STARTINDENT 1
+#define PFM_TABSTOPS 16
+#define PFN_BULLET 1
+#define PFA_LEFT 1
+#define PFA_RIGHT 2
+#define PFA_CENTER 3
+#define SF_TEXT 1
+#define SF_RTF 2
+#define SF_RTFNOOBJS 3
+#define SF_TEXTIZED 4
+#define SFF_PLAINRTF 0x4000
+#define SFF_SELECTION 0x8000
+#define WB_CLASSIFY 3
+#define WB_MOVEWORDLEFT 4
+#define WB_MOVEWORDRIGHT 5
+#define WB_LEFTBREAK 6
+#define WB_RIGHTBREAK 7
+#define WB_MOVEWORDPREV 4
+#define WB_MOVEWORDNEXT 5
+#define WB_PREVBREAK 6
+#define WB_NEXTBREAK 7
+#define WBF_WORDWRAP 16
+#define WBF_WORDBREAK 32
+#define WBF_OVERFLOW 64
+#define WBF_LEVEL1 128
+#define WBF_LEVEL2 256
+#define WBF_CUSTOM 512
+#define ES_DISABLENOSCROLL 8192
+#define ES_EX_NOCALLOLEINIT 16777216
+#define ES_NOIME 524288
+#define ES_SAVESEL 32768
+#define ES_SELFIME 262144
+#define ES_SUNKEN 16384
+#define ES_VERTICAL 4194304
+#define ES_SELECTIONBAR 16777216
+#define EM_CANPASTE (WM_USER+50)
+#define EM_DISPLAYBAND (WM_USER+51)
+#define EM_EXGETSEL (WM_USER+52)
+#define EM_EXLIMITTEXT (WM_USER+53)
+#define EM_EXLINEFROMCHAR (WM_USER+54)
+#define EM_EXSETSEL (WM_USER+55)
+#define EM_FINDTEXT (WM_USER+56)
+#define EM_FORMATRANGE (WM_USER+57)
+#define EM_GETCHARFORMAT (WM_USER+58)
+#define EM_GETEVENTMASK (WM_USER+59)
+#define EM_GETOLEINTERFACE (WM_USER+60)
+#define EM_GETPARAFORMAT (WM_USER+61)
+#define EM_GETSELTEXT (WM_USER+62)
+#define EM_HIDESELECTION (WM_USER+63)
+#define EM_PASTESPECIAL (WM_USER+64)
+#define EM_REQUESTRESIZE (WM_USER+65)
+#define EM_SELECTIONTYPE (WM_USER+66)
+#define EM_SETBKGNDCOLOR (WM_USER+67)
+#define EM_SETCHARFORMAT (WM_USER+68)
+#define EM_SETEVENTMASK (WM_USER+69)
+#define EM_SETOLECALLBACK (WM_USER+70)
+#define EM_SETPARAFORMAT (WM_USER+71)
+#define EM_SETTARGETDEVICE (WM_USER+72)
+#define EM_STREAMIN (WM_USER+73)
+#define EM_STREAMOUT (WM_USER+74)
+#define EM_GETTEXTRANGE (WM_USER+75)
+#define EM_FINDWORDBREAK (WM_USER+76)
+#define EM_SETOPTIONS (WM_USER+77)
+#define EM_GETOPTIONS (WM_USER+78)
+#define EM_FINDTEXTEX (WM_USER+79)
+#define EM_GETWORDBREAKPROCEX (WM_USER+80)
+#define EM_SETWORDBREAKPROCEX (WM_USER+81)
+#define EN_CORRECTTEXT 1797
+#define EN_DROPFILES 1795
+#define EN_IMECHANGE 1799
+#define EN_MSGFILTER 1792
+#define EN_OLEOPFAILED 1801
+#define EN_PROTECTED 1796
+#define EN_REQUESTRESIZE 1793
+#define EN_SAVECLIPBOARD 1800
+#define EN_SELCHANGE 1794
+#define EN_STOPNOUNDO 1798
+#define ENM_NONE 0
+#define ENM_CHANGE 1
+#define ENM_CORRECTTEXT 4194304
+#define ENM_DROPFILES 1048576
+#define ENM_KEYEVENTS 65536
+#define ENM_MOUSEEVENTS 131072
+#define ENM_PROTECTED 2097152
+#define ENM_REQUESTRESIZE 262144
+#define ENM_SCROLL 4
+#define ENM_SELCHANGE 524288
+#define ENM_UPDATE 2
+#define ECO_AUTOWORDSELECTION 1
+#define ECO_AUTOVSCROLL 64
+#define ECO_AUTOHSCROLL 128
+#define ECO_NOHIDESEL 256
+#define ECO_READONLY 2048
+#define ECO_WANTRETURN 4096
+#define ECO_SAVESEL 0x8000
+#define ECO_SELECTIONBAR 0x1000000
+#define ECO_VERTICAL 0x400000
+#define ECOOP_SET 1
+#define ECOOP_OR 2
+#define ECOOP_AND 3
+#define ECOOP_XOR 4
+#define SCF_DEFAULT 0
+#define SCF_SELECTION 1
+#define SCF_WORD 2
+#define SCF_ALL 4
+#define SCF_USEUIRULES 8
+#define yHeightCharPtsMost 1638
+#define lDefaultTab 720
+
+typedef struct _charformat {
+ UINT cbSize;
+ DWORD dwMask;
+ DWORD dwEffects;
+ LONG yHeight;
+ LONG yOffset;
+ COLORREF crTextColor;
+ BYTE bCharSet;
+ BYTE bPitchAndFamily;
+ char szFaceName[LF_FACESIZE];
+} CHARFORMATA;
+typedef struct _charformatw {
+ UINT cbSize;
+ DWORD dwMask;
+ DWORD dwEffects;
+ LONG yHeight;
+ LONG yOffset;
+ COLORREF crTextColor;
+ BYTE bCharSet;
+ BYTE bPitchAndFamily;
+ WCHAR szFaceName[LF_FACESIZE];
+} CHARFORMATW;
+typedef struct _charformat2a {
+ UINT cbSize;
+ DWORD dwMask;
+ DWORD dwEffects;
+ LONG yHeight;
+ LONG yOffset;
+ COLORREF crTextColor;
+ BYTE bCharSet;
+ BYTE bPitchAndFamily;
+ char szFaceName[LF_FACESIZE];
+ WORD wWeight;
+ SHORT sSpacing;
+ COLORREF crBackColor;
+ LCID lcid;
+ DWORD dwReserved;
+ SHORT sStyle;
+ WORD wKerning;
+ BYTE bUnderlineType;
+ BYTE bAnimation;
+ BYTE bRevAuthor;
+} CHARFORMAT2A;
+typedef struct _charformat2w {
+ UINT cbSize;
+ DWORD dwMask;
+ DWORD dwEffects;
+ LONG yHeight;
+ LONG yOffset;
+ COLORREF crTextColor;
+ BYTE bCharSet;
+ BYTE bPitchAndFamily;
+ WCHAR szFaceName[LF_FACESIZE];
+ WORD wWeight;
+ SHORT sSpacing;
+ COLORREF crBackColor;
+ LCID lcid;
+ DWORD dwReserved;
+ SHORT sStyle;
+ WORD wKerning;
+ BYTE bUnderlineType;
+ BYTE bAnimation;
+ BYTE bRevAuthor;
+} CHARFORMAT2W;
+typedef struct _charrange {
+ LONG cpMin;
+ LONG cpMax;
+} CHARRANGE;
+typedef struct _compcolor {
+ COLORREF crText;
+ COLORREF crBackground;
+ DWORD dwEffects;
+} COMPCOLOR;
+typedef DWORD(CALLBACK *EDITSTREAMCALLBACK)(DWORD,PBYTE,LONG,LONG*);
+typedef struct _editstream {
+ DWORD dwCookie;
+ DWORD dwError;
+ EDITSTREAMCALLBACK pfnCallback;
+} EDITSTREAM;
+typedef struct _encorrecttext {
+ NMHDR nmhdr;
+ CHARRANGE chrg;
+ WORD seltyp;
+} ENCORRECTTEXT;
+typedef struct _endropfiles {
+ NMHDR nmhdr;
+ HANDLE hDrop;
+ LONG cp;
+ BOOL fProtected;
+} ENDROPFILES;
+typedef struct {
+ NMHDR nmhdr;
+ LONG iob;
+ LONG lOper;
+ HRESULT hr;
+} ENOLEOPFAILED;
+typedef struct _enprotected {
+ NMHDR nmhdr;
+ UINT msg;
+ WPARAM wParam;
+ LPARAM lParam;
+ CHARRANGE chrg;
+} ENPROTECTED,*LPENPROTECTED;
+typedef struct _ensaveclipboard {
+ NMHDR nmhdr;
+ LONG cObjectCount;
+ LONG cch;
+} ENSAVECLIPBOARD;
+typedef struct _findtextA {
+ CHARRANGE chrg;
+ LPSTR lpstrText;
+} FINDTEXTA;
+typedef struct _findtextW {
+ CHARRANGE chrg;
+ LPWSTR lpstrText;
+} FINDTEXTW;
+typedef struct _findtextexA {
+ CHARRANGE chrg;
+ LPSTR lpstrText;
+ CHARRANGE chrgText;
+} FINDTEXTEXA;
+typedef struct _findtextexW {
+ CHARRANGE chrg;
+ LPWSTR lpstrText;
+ CHARRANGE chrgText;
+} FINDTEXTEXW;
+typedef struct _formatrange {
+ HDC hdc;
+ HDC hdcTarget;
+ RECT rc;
+ RECT rcPage;
+ CHARRANGE chrg;
+} FORMATRANGE;
+typedef struct _msgfilter {
+ NMHDR nmhdr;
+ UINT msg;
+ WPARAM wParam;
+ LPARAM lParam;
+} MSGFILTER;
+typedef struct _paraformat {
+ UINT cbSize;
+ DWORD dwMask;
+ WORD wNumbering;
+ WORD wReserved;
+ LONG dxStartIndent;
+ LONG dxRightIndent;
+ LONG dxOffset;
+ WORD wAlignment;
+ SHORT cTabCount;
+ LONG rgxTabs[MAX_TAB_STOPS];
+} PARAFORMAT;
+typedef struct _selchange {
+ NMHDR nmhdr;
+ CHARRANGE chrg;
+ WORD seltyp;
+} SELCHANGE;
+typedef struct _textrange {
+ CHARRANGE chrg;
+ LPSTR lpstrText;
+} TEXTRANGEA;
+typedef struct _textrangew {
+ CHARRANGE chrg;
+ LPWSTR lpstrText;
+} TEXTRANGEW;
+typedef struct _reqresize {
+ NMHDR nmhdr;
+ RECT rc;
+} REQRESIZE;
+typedef struct _repastespecial {
+ DWORD dwAspect;
+ DWORD dwParam;
+} REPASTESPECIAL;
+typedef struct _punctuation {
+ UINT iSize;
+ LPSTR szPunctuation;
+} PUNCTUATION;
+typedef LONG (*EDITWORDBREAKPROCEX)(char*,LONG,BYTE,INT);
+#ifdef UNICODE
+typedef CHARFORMATW CHARFORMAT;
+typedef CHARFORMAT2W CHARFORMAT2;
+typedef FINDTEXTW FINDTEXT;
+typedef FINDTEXTEXW FINDTEXTEX;
+typedef TEXTRANGEW TEXTRANGE;
+#else
+typedef CHARFORMATA CHARFORMAT;
+typedef CHARFORMAT2A CHARFORMAT2;
+typedef FINDTEXTA FINDTEXT;
+typedef FINDTEXTEXA FINDTEXTEX;
+typedef TEXTRANGEA TEXTRANGE;
+#endif
+#pragma pack(pop)
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/winsup/w32api/include/richole.h b/winsup/w32api/include/richole.h
new file mode 100644
index 000000000..90f390bde
--- /dev/null
+++ b/winsup/w32api/include/richole.h
@@ -0,0 +1,103 @@
+#ifndef _RICHOLE_H
+#define _RICHOLE_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+#pragma pack(push,4)
+#define REO_GETOBJ_NO_INTERFACES 0
+#define REO_GETOBJ_POLEOBJ 1
+#define REO_GETOBJ_PSTG 2
+#define REO_GETOBJ_POLESITE 4
+#define REO_GETOBJ_ALL_INTERFACES 7
+#define REO_CP_SELECTION ((ULONG)-1)
+#define REO_IOB_SELECTION ((ULONG)-1)
+#define REO_IOB_USE_CP ((ULONG)-2)
+#define REO_NULL 0
+#define REO_READWRITEMASK 0x3FL
+#define REO_DONTNEEDPALETTE 32
+#define REO_BLANK 16
+#define REO_DYNAMICSIZE 8
+#define REO_INVERTEDSELECT 4
+#define REO_BELOWBASELINE 2
+#define REO_RESIZABLE 1
+#define REO_LINK 0x80000000
+#define REO_STATIC 0x40000000
+#define REO_SELECTED 0x08000000
+#define REO_OPEN 0x4000000
+#define REO_INPLACEACTIVE 0x2000000
+#define REO_HILITED 0x1000000
+#define REO_LINKAVAILABLE 0x800000
+#define REO_GETMETAFILE 0x400000
+#define RECO_PASTE 0
+#define RECO_DROP 1
+#define RECO_COPY 2
+#define RECO_CUT 3
+#define RECO_DRAG 4
+
+extern const GUID IID_IRichEditOle;
+extern const GUID IID_IRichEditOleCallback;
+#ifndef INITGUID
+typedef struct _reobject {
+ DWORD cbStruct;
+ LONG cp;
+ CLSID clsid;
+ LPOLEOBJECT poleobj;
+ LPSTORAGE pstg;
+ LPOLECLIENTSITE polesite;
+ SIZEL sizel;
+ DWORD dvaspect;
+ DWORD dwFlags;
+ DWORD dwUser;
+} REOBJECT;
+
+#undef INTERFACE
+#define INTERFACE IRichEditOle
+DECLARE_INTERFACE_(IRichEditOle, IUnknown)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(GetClientSite)(THIS_ LPOLECLIENTSITE*) PURE;
+ STDMETHOD_(LONG,GetObjectCount)(THIS) PURE;
+ STDMETHOD_(LONG,GetLinkCount)(THIS) PURE;
+ STDMETHOD(GetObject)(THIS_ LONG, REOBJECT*,DWORD) PURE;
+ STDMETHOD(InsertObject)(THIS_ REOBJECT*) PURE;
+ STDMETHOD(ConvertObject)(THIS_ LONG,REFCLSID,LPCSTR) PURE;
+ STDMETHOD(ActivateAs)(THIS_ REFCLSID,REFCLSID) PURE;
+ STDMETHOD(SetHostNames)(THIS_ LPCSTR,LPCSTR) PURE;
+ STDMETHOD(SetLinkAvailable)(THIS_ LONG,BOOL) PURE;
+ STDMETHOD(SetDvaspect)(THIS_ LONG,DWORD) PURE;
+ STDMETHOD(HandsOffStorage)(THIS_ LONG) PURE;
+ STDMETHOD(SaveCompleted)(THIS_ LONG,LPSTORAGE) PURE;
+ STDMETHOD(InPlaceDeactivate)(THIS) PURE;
+ STDMETHOD(ContextSensitiveHelp)(THIS_ BOOL) PURE;
+ STDMETHOD(GetClipboardData)(THIS_ CHARRANGE*,DWORD,LPDATAOBJECT*) PURE;
+ STDMETHOD(ImportDataObject)(THIS_ LPDATAOBJECT,CLIPFORMAT,HGLOBAL) PURE;
+};
+typedef IRichEditOle *LPRICHEDITOLE;
+
+#undef INTERFACE
+#define INTERFACE IRichEditOleCallback
+DECLARE_INTERFACE_(IRichEditOleCallback, IUnknown)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(GetNewStorage)(THIS_ LPSTORAGE*) PURE;
+ STDMETHOD(GetInPlaceContext)(THIS_ LPOLEINPLACEFRAME*,LPOLEINPLACEUIWINDOW*,LPOLEINPLACEFRAMEINFO) PURE;
+ STDMETHOD(ShowContainerUI)(THIS_ BOOL) PURE;
+ STDMETHOD(QueryInsertObject)(THIS_ LPCLSID,LPSTORAGE,LONG) PURE;
+ STDMETHOD(DeleteObject)(THIS_ LPOLEOBJECT) PURE;
+ STDMETHOD(QueryAcceptData) (THIS_ LPDATAOBJECT,CLIPFORMAT*,DWORD,BOOL,HGLOBAL) PURE;
+ STDMETHOD(ContextSensitiveHelp) (THIS_ BOOL) PURE;
+ STDMETHOD(GetClipboardData) (THIS_ CHARRANGE*,DWORD,LPDATAOBJECT*) PURE;
+ STDMETHOD(GetDragDropEffect) (THIS_ BOOL,DWORD,PDWORD) PURE;
+ STDMETHOD(GetContextMenu) (THIS_ WORD,LPOLEOBJECT,CHARRANGE*,HMENU*) PURE;
+};
+typedef IRichEditOleCallback FAR * LPRICHEDITOLECALLBACK;
+#endif
+#pragma pack(pop)
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/winsup/w32api/include/rpc.h b/winsup/w32api/include/rpc.h
new file mode 100644
index 000000000..eeb602f9f
--- /dev/null
+++ b/winsup/w32api/include/rpc.h
@@ -0,0 +1,54 @@
+#ifndef _RPC_H
+#define _RPC_H
+#ifndef RPC_NO_WINDOWS_H
+#include <windows.h>
+#endif
+#ifdef __cplusplus
+extern "C" {
+#endif
+#define __RPC_WIN32__
+#ifndef _WIN95
+#define __RPC_NT__
+#define RPC_UNICODE_SUPPORTED
+#endif
+
+#ifndef __MIDL_USER_DEFINED
+#define midl_user_allocate MIDL_user_allocate
+#define midl_user_free MIDL_user_free
+#define __MIDL_USER_DEFINED
+#endif
+#define RPC_UNICODE_SUPPORTED
+#define __RPC_FAR
+#define __RPC_API __stdcall
+#define __RPC_USER __stdcall
+#define __RPC_STUB __stdcall
+#define RPC_ENTRY __stdcall
+typedef void *I_RPC_HANDLE;
+typedef long RPC_STATUS;
+
+#include <rpcdce.h>
+#include <rpcnsi.h>
+#include <rpcnterr.h>
+
+#include <winerror.h>
+
+/* SEH is not supported */
+#if 0
+#include <excpt.h>
+#define RpcTryExcept __try {
+#define RpcExcept(x) } __except (x) {
+#define RpcEndExcept }
+#define RpcTryFinally __try {
+#define RpcFinally } __finally {
+#define RpcEndFinally }
+#define RpcExceptionCode() GetExceptionCode()
+#define RpcAbnormalTermination() AbnormalTermination()
+#endif /* 0 */
+
+RPC_STATUS RPC_ENTRY RpcImpersonateClient(RPC_BINDING_HANDLE);
+RPC_STATUS RPC_ENTRY RpcRevertToSelf();
+long RPC_ENTRY I_RpcMapWin32Status(RPC_STATUS);
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/winsup/w32api/include/rpcdce.h b/winsup/w32api/include/rpcdce.h
new file mode 100644
index 000000000..97d93ce59
--- /dev/null
+++ b/winsup/w32api/include/rpcdce.h
@@ -0,0 +1,381 @@
+#ifndef _RPCDCE_H
+#define _RPCDCE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+#include <basetyps.h>
+
+#define IN
+#define OUT
+#define OPTIONAL
+#define uuid_t UUID
+#define rpc_binding_handle_t RPC_BINDING_HANDLE
+#define rpc_binding_vector_t RPC_BINDING_VECTOR
+#define uuid_vector_t UUID_VECTOR
+#define RPC_C_BINDING_INFINITE_TIMEOUT 10
+#define RPC_C_BINDING_MIN_TIMEOUT 0
+#define RPC_C_BINDING_DEFAULT_TIMEOUT 5
+#define RPC_C_BINDING_MAX_TIMEOUT 9
+#define RPC_C_CANCEL_INFINITE_TIMEOUT (-1)
+#define RPC_C_LISTEN_MAX_CALLS_DEFAULT 1234
+#define RPC_C_PROTSEQ_MAX_REQS_DEFAULT 10
+#define RPC_C_BIND_TO_ALL_NICS 1
+#define RPC_C_USE_INTERNET_PORT 1
+#define RPC_C_USE_INTRANET_PORT 2
+#define RPC_MGR_EPV void
+#define RPC_C_STATS_CALLS_IN 0
+#define RPC_C_STATS_CALLS_OUT 1
+#define RPC_C_STATS_PKTS_IN 2
+#define RPC_C_STATS_PKTS_OUT 3
+#define RPC_IF_AUTOLISTEN 0x0001
+#define RPC_IF_OLE 2
+#define RPC_C_MGMT_INQ_IF_IDS 0
+#define RPC_C_MGMT_INQ_PRINC_NAME 1
+#define RPC_C_MGMT_INQ_STATS 2
+#define RPC_C_MGMT_IS_SERVER_LISTEN 3
+#define RPC_C_MGMT_STOP_SERVER_LISTEN 4
+#define RPC_C_EP_ALL_ELTS 0
+#define RPC_C_EP_MATCH_BY_IF 1
+#define RPC_C_EP_MATCH_BY_OBJ 2
+#define RPC_C_EP_MATCH_BY_BOTH 3
+#define RPC_C_VERS_ALL 1
+#define RPC_C_VERS_COMPATIBLE 2
+#define RPC_C_VERS_EXACT 3
+#define RPC_C_VERS_MAJOR_ONLY 4
+#define RPC_C_VERS_UPTO 5
+#define DCE_C_ERROR_STRING_LEN 256
+#define RPC_C_PARM_MAX_PACKET_LENGTH 1
+#define RPC_C_PARM_BUFFER_LENGTH 2
+#define RPC_C_AUTHN_LEVEL_DEFAULT 0
+#define RPC_C_AUTHN_LEVEL_NONE 1
+#define RPC_C_AUTHN_LEVEL_CONNECT 2
+#define RPC_C_AUTHN_LEVEL_CALL 3
+#define RPC_C_AUTHN_LEVEL_PKT 4
+#define RPC_C_AUTHN_LEVEL_PKT_INTEGRITY 5
+#define RPC_C_AUTHN_LEVEL_PKT_PRIVACY 6
+#define RPC_C_IMP_LEVEL_ANONYMOUS 1
+#define RPC_C_IMP_LEVEL_IDENTIFY 2
+#define RPC_C_IMP_LEVEL_IMPERSONATE 3
+#define RPC_C_IMP_LEVEL_DELEGATE 4
+#define RPC_C_QOS_IDENTITY_STATIC 0
+#define RPC_C_QOS_IDENTITY_DYNAMIC 1
+#define RPC_C_QOS_CAPABILITIES_DEFAULT 0
+#define RPC_C_QOS_CAPABILITIES_MUTUAL_AUTH 1
+#define RPC_C_PROTECT_LEVEL_DEFAULT(RPC_C_AUTHN_LEVEL_DEFAULT)
+#define RPC_C_PROTECT_LEVEL_NONE(RPC_C_AUTHN_LEVEL_NONE)
+#define RPC_C_PROTECT_LEVEL_CONNECT(RPC_C_AUTHN_LEVEL_CONNECT)
+#define RPC_C_PROTECT_LEVEL_CALL(RPC_C_AUTHN_LEVEL_CALL)
+#define RPC_C_PROTECT_LEVEL_PKT(RPC_C_AUTHN_LEVEL_PKT)
+#define RPC_C_PROTECT_LEVEL_PKT_INTEGRITY(RPC_C_AUTHN_LEVEL_PKT_INTEGRITY)
+#define RPC_C_PROTECT_LEVEL_PKT_PRIVACY(RPC_C_AUTHN_LEVEL_PKT_PRIVACY)
+#define RPC_C_AUTHN_NONE 0
+#define RPC_C_AUTHN_DCE_PRIVATE 1
+#define RPC_C_AUTHN_DCE_PUBLIC 2
+#define RPC_C_AUTHN_DEC_PUBLIC 4
+#define RPC_C_AUTHN_WINNT 10
+#define RPC_C_AUTHN_DEFAULT 0xFFFFFFFF
+#define RPC_C_SECURITY_QOS_VERSION L
+#define SEC_WINNT_AUTH_IDENTITY_ANSI 0x1
+#define SEC_WINNT_AUTH_IDENTITY_UNICODE 0x2
+#define RPC_C_AUTHZ_NONE 0
+#define RPC_C_AUTHZ_NAME 1
+#define RPC_C_AUTHZ_DCE 2
+
+typedef I_RPC_HANDLE RPC_BINDING_HANDLE;
+typedef RPC_BINDING_HANDLE handle_t;
+typedef struct _RPC_BINDING_VECTOR {
+ unsigned long Count;
+ RPC_BINDING_HANDLE BindingH[1];
+} RPC_BINDING_VECTOR;
+typedef struct _UUID_VECTOR {
+ unsigned long Count;
+ UUID *Uuid[1];
+} UUID_VECTOR;
+typedef void *RPC_IF_HANDLE;
+typedef struct _RPC_IF_ID {
+ UUID Uuid;
+ unsigned short VersMajor;
+ unsigned short VersMinor;
+} RPC_IF_ID;
+typedef struct _RPC_POLICY {
+ unsigned int Length ;
+ unsigned long EndpointFlags ;
+ unsigned long NICFlags ;
+} RPC_POLICY,*PRPC_POLICY ;
+typedef void __RPC_USER RPC_OBJECT_INQ_FN(UUID*,UUID*,RPC_STATUS*);
+typedef RPC_STATUS RPC_IF_CALLBACK_FN(RPC_IF_HANDLE,void*);
+typedef struct {
+ unsigned int Count;
+ unsigned long Stats[1];
+} RPC_STATS_VECTOR;
+typedef struct {
+ unsigned long Count;
+ RPC_IF_ID*IfId[1];
+} RPC_IF_ID_VECTOR;
+typedef void *RPC_AUTH_IDENTITY_HANDLE;
+typedef void *RPC_AUTHZ_HANDLE;
+typedef struct _RPC_SECURITY_QOS {
+ unsigned long Version;
+ unsigned long Capabilities;
+ unsigned long IdentityTracking;
+ unsigned long ImpersonationType;
+} RPC_SECURITY_QOS,*PRPC_SECURITY_QOS;
+typedef struct _SEC_WINNT_AUTH_IDENTITY_W {
+ unsigned short *User;
+ unsigned long UserLength;
+ unsigned short *Domain;
+ unsigned long DomainLength;
+ unsigned short *Password;
+ unsigned long PasswordLength;
+ unsigned long Flags;
+} SEC_WINNT_AUTH_IDENTITY_W,*PSEC_WINNT_AUTH_IDENTITY_W;
+typedef struct _SEC_WINNT_AUTH_IDENTITY_A {
+ unsigned char *User;
+ unsigned long UserLength;
+ unsigned char *Domain;
+ unsigned long DomainLength;
+ unsigned char *Password;
+ unsigned long PasswordLength;
+ unsigned long Flags;
+} SEC_WINNT_AUTH_IDENTITY_A,*PSEC_WINNT_AUTH_IDENTITY_A;
+typedef struct {
+ unsigned char *UserName;
+ unsigned char *ComputerName;
+ unsigned short Privilege;
+ unsigned long AuthFlags;
+} RPC_CLIENT_INFORMATION1,* PRPC_CLIENT_INFORMATION1;
+typedef I_RPC_HANDLE *RPC_EP_INQ_HANDLE;
+typedef int(__RPC_API *RPC_MGMT_AUTHORIZATION_FN)(RPC_BINDING_HANDLE,unsigned long,RPC_STATUS*);
+
+#ifdef RPC_UNICODE_SUPPORTED
+typedef struct _RPC_PROTSEQ_VECTORA {
+ unsigned int Count;
+ unsigned char*Protseq[1];
+} RPC_PROTSEQ_VECTORA;
+typedef struct _RPC_PROTSEQ_VECTORW {
+ unsigned int Count;
+ unsigned short*Protseq[1];
+} RPC_PROTSEQ_VECTORW;
+RPC_STATUS RPC_ENTRY RpcBindingFromStringBindingA(unsigned char *,RPC_BINDING_HANDLE *);
+RPC_STATUS RPC_ENTRY RpcBindingFromStringBindingW(unsigned short *,RPC_BINDING_HANDLE *);
+RPC_STATUS RPC_ENTRY RpcBindingToStringBindingA(RPC_BINDING_HANDLE,unsigned char**);
+RPC_STATUS RPC_ENTRY RpcBindingToStringBindingW(RPC_BINDING_HANDLE,unsigned short**);
+RPC_STATUS RPC_ENTRY RpcStringBindingComposeA(unsigned char *,unsigned char *,unsigned char *,unsigned char *,unsigned char *,unsigned char **);
+RPC_STATUS RPC_ENTRY RpcStringBindingComposeW(unsigned short *,unsigned short *,unsigned short *,unsigned short *,unsigned short *,unsigned short **);
+RPC_STATUS RPC_ENTRY RpcStringBindingParseA(unsigned char *,unsigned char **,unsigned char **,unsigned char **,unsigned char **,unsigned char **);
+RPC_STATUS RPC_ENTRY RpcStringBindingParseW(unsigned short *,unsigned short **,unsigned short **,unsigned short **,unsigned short **,unsigned short **);
+RPC_STATUS RPC_ENTRY RpcStringFreeA(unsigned char**);
+RPC_STATUS RPC_ENTRY RpcStringFreeW(unsigned short**);
+RPC_STATUS RPC_ENTRY RpcNetworkIsProtseqValidA(unsigned char*);
+RPC_STATUS RPC_ENTRY RpcNetworkIsProtseqValidW(unsigned short*);
+RPC_STATUS RPC_ENTRY RpcNetworkInqProtseqsA(RPC_PROTSEQ_VECTORA**);
+RPC_STATUS RPC_ENTRY RpcNetworkInqProtseqsW(RPC_PROTSEQ_VECTORW**);
+RPC_STATUS RPC_ENTRY RpcProtseqVectorFreeA(RPC_PROTSEQ_VECTORA**);
+RPC_STATUS RPC_ENTRY RpcProtseqVectorFreeW(RPC_PROTSEQ_VECTORW**);
+RPC_STATUS RPC_ENTRY RpcServerUseProtseqA(unsigned char*,unsigned int,void*);
+RPC_STATUS RPC_ENTRY RpcServerUseProtseqW(unsigned short*,unsigned int,void*);
+RPC_STATUS RPC_ENTRY RpcServerUseProtseqExA(unsigned char*,unsigned int MaxCalls,void*,PRPC_POLICY);
+RPC_STATUS RPC_ENTRY RpcServerUseProtseqExW(unsigned short*,unsigned int,void*,PRPC_POLICY);
+RPC_STATUS RPC_ENTRY RpcServerUseProtseqEpA(unsigned char*,unsigned int,unsigned char*,void*);
+RPC_STATUS RPC_ENTRY RpcServerUseProtseqEpExA(unsigned char*,unsigned int,unsigned char*,void*,PRPC_POLICY);
+RPC_STATUS RPC_ENTRY RpcServerUseProtseqEpW(unsigned short*,unsigned int,unsigned short*,void*);
+RPC_STATUS RPC_ENTRY RpcServerUseProtseqEpExW(unsigned short*,unsigned int,unsigned short*,void*,PRPC_POLICY);
+RPC_STATUS RPC_ENTRY RpcServerUseProtseqIfA(unsigned char*,unsigned int,RPC_IF_HANDLE,void*);
+RPC_STATUS RPC_ENTRY RpcServerUseProtseqIfExA(unsigned char*,unsigned int,RPC_IF_HANDLE,void*,PRPC_POLICY);
+RPC_STATUS RPC_ENTRY RpcServerUseProtseqIfW(unsigned short*,unsigned int,RPC_IF_HANDLE,void*);
+RPC_STATUS RPC_ENTRY RpcServerUseProtseqIfExW(unsigned short*,unsigned int,RPC_IF_HANDLE,void*,PRPC_POLICY);
+RPC_STATUS RPC_ENTRY RpcMgmtInqServerPrincNameA(RPC_BINDING_HANDLE,unsigned long,unsigned char**);
+RPC_STATUS RPC_ENTRY RpcMgmtInqServerPrincNameW(RPC_BINDING_HANDLE,unsigned long,unsigned short**);
+RPC_STATUS RPC_ENTRY RpcServerInqDefaultPrincNameA(unsigned long,unsigned char**);
+RPC_STATUS RPC_ENTRY RpcServerInqDefaultPrincNameW(unsigned long,unsigned short**);
+RPC_STATUS RPC_ENTRY RpcNsBindingInqEntryNameA(RPC_BINDING_HANDLE,unsigned long,unsigned char**);
+RPC_STATUS RPC_ENTRY RpcNsBindingInqEntryNameW(RPC_BINDING_HANDLE,unsigned long,unsigned short**);
+RPC_STATUS RPC_ENTRY RpcBindingInqAuthClientA(RPC_BINDING_HANDLE,RPC_AUTHZ_HANDLE *,unsigned char**,unsigned long*,unsigned long*,unsigned long*);
+RPC_STATUS RPC_ENTRY RpcBindingInqAuthClientW(RPC_BINDING_HANDLE,RPC_AUTHZ_HANDLE *,unsigned short**,unsigned long*,unsigned long*,unsigned long*);
+RPC_STATUS RPC_ENTRY RpcBindingInqAuthInfoA(RPC_BINDING_HANDLE,unsigned char**,unsigned long*,unsigned long*,RPC_AUTH_IDENTITY_HANDLE*,unsigned long*);
+RPC_STATUS RPC_ENTRY RpcBindingInqAuthInfoW(RPC_BINDING_HANDLE,unsigned short**,unsigned long*,unsigned long*,RPC_AUTH_IDENTITY_HANDLE*,unsigned long*);
+RPC_STATUS RPC_ENTRY RpcBindingSetAuthInfoA(RPC_BINDING_HANDLE,unsigned char*,unsigned long,unsigned long,RPC_AUTH_IDENTITY_HANDLE,unsigned long);
+RPC_STATUS RPC_ENTRY RpcBindingSetAuthInfoExA(RPC_BINDING_HANDLE,unsigned char*,unsigned long,unsigned long,RPC_AUTH_IDENTITY_HANDLE,unsigned long,RPC_SECURITY_QOS*);
+RPC_STATUS RPC_ENTRY RpcBindingSetAuthInfoW(RPC_BINDING_HANDLE,unsigned short*,unsigned long,unsigned long,RPC_AUTH_IDENTITY_HANDLE,unsigned long);
+RPC_STATUS RPC_ENTRY RpcBindingSetAuthInfoExW(RPC_BINDING_HANDLE,unsigned short*,unsigned long,unsigned long,RPC_AUTH_IDENTITY_HANDLE,unsigned long,RPC_SECURITY_QOS*);
+RPC_STATUS RPC_ENTRY RpcBindingInqAuthInfoExA(RPC_BINDING_HANDLE,unsigned char**,unsigned long*,unsigned long*,RPC_AUTH_IDENTITY_HANDLE*,unsigned long*,unsigned long,RPC_SECURITY_QOS*);
+RPC_STATUS RPC_ENTRY RpcBindingInqAuthInfoExW(RPC_BINDING_HANDLE,unsigned short ** , unsigned long *, unsigned long *, RPC_AUTH_IDENTITY_HANDLE *, unsigned long *, unsigned long , RPC_SECURITY_QOS *);
+typedef void(__RPC_USER *RPC_AUTH_KEY_RETRIEVAL_FN)(void*,unsigned short*,unsigned long,void**,RPC_STATUS*);
+RPC_STATUS RPC_ENTRY RpcServerRegisterAuthInfoA(unsigned char*,unsigned long,RPC_AUTH_KEY_RETRIEVAL_FN,void*);
+RPC_STATUS RPC_ENTRY RpcServerRegisterAuthInfoW(unsigned short*,unsigned long,RPC_AUTH_KEY_RETRIEVAL_FN,void*);
+RPC_STATUS RPC_ENTRY UuidToStringA(UUID*,unsigned char**);
+RPC_STATUS RPC_ENTRY UuidFromStringA(unsigned char*,UUID*);
+RPC_STATUS RPC_ENTRY UuidToStringW(UUID*,unsigned short**);
+RPC_STATUS RPC_ENTRY UuidFromStringW(unsigned short*,UUID*);
+RPC_STATUS RPC_ENTRY RpcEpRegisterNoReplaceA(RPC_IF_HANDLE,RPC_BINDING_VECTOR*,UUID_VECTOR*,unsigned char*);
+RPC_STATUS RPC_ENTRY RpcEpRegisterNoReplaceW(RPC_IF_HANDLE,RPC_BINDING_VECTOR*, UUID_VECTOR*,unsigned short*);
+RPC_STATUS RPC_ENTRY RpcEpRegisterA(RPC_IF_HANDLE,RPC_BINDING_VECTOR*,UUID_VECTOR*,unsigned char*);
+RPC_STATUS RPC_ENTRY RpcEpRegisterW(RPC_IF_HANDLE,RPC_BINDING_VECTOR*,UUID_VECTOR*,unsigned short*);
+RPC_STATUS RPC_ENTRY DceErrorInqTextA(RPC_STATUS,unsigned char*);
+RPC_STATUS RPC_ENTRY DceErrorInqTextW(RPC_STATUS,unsigned short*);
+RPC_STATUS RPC_ENTRY RpcMgmtEpEltInqNextA(RPC_EP_INQ_HANDLE,RPC_IF_ID*,RPC_BINDING_HANDLE*,UUID*,unsigned char**);
+RPC_STATUS RPC_ENTRY RpcMgmtEpEltInqNextW(RPC_EP_INQ_HANDLE,RPC_IF_ID*,RPC_BINDING_HANDLE*,UUID*,unsigned short**);
+#ifdef UNICODE
+#define RPC_PROTSEQ_VECTOR RPC_PROTSEQ_VECTORW
+#define SEC_WINNT_AUTH_IDENTITY SEC_WINNT_AUTH_IDENTITY_W
+#define PSEC_WINNT_AUTH_IDENTITY PSEC_WINNT_AUTH_IDENTITY_W
+#define _SEC_WINNT_AUTH_IDENTITY _SEC_WINNT_AUTH_IDENTITY_W
+#define RpcMgmtEpEltInqNext RpcMgmtEpEltInqNextW
+#define RpcBindingFromStringBinding RpcBindingFromStringBindingW
+#define RpcBindingToStringBinding RpcBindingToStringBindingW
+#define RpcStringBindingCompose RpcStringBindingComposeW
+#define RpcStringBindingParse RpcStringBindingParseW
+#define RpcStringFree RpcStringFreeW
+#define RpcNetworkIsProtseqValid RpcNetworkIsProtseqValidW
+#define RpcNetworkInqProtseqs RpcNetworkInqProtseqsW
+#define RpcProtseqVectorFree RpcProtseqVectorFreeW
+#define RpcServerUseProtseq RpcServerUseProtseqW
+#define RpcServerUseProtseqEx RpcServerUseProtseqExW
+#define RpcServerUseProtseqEp RpcServerUseProtseqEpW
+#define RpcServerUseProtseqEpEx RpcServerUseProtseqEpExW
+#define RpcServerUseProtseqIf RpcServerUseProtseqIfW
+#define RpcServerUseProtseqIfEx RpcServerUseProtseqIfExW
+#define RpcMgmtInqServerPrincName RpcMgmtInqServerPrincNameW
+#define RpcServerInqDefaultPrincName RpcServerInqDefaultPrincNameW
+#define RpcNsBindingInqEntryName RpcNsBindingInqEntryNameW
+#define RpcBindingInqAuthClient RpcBindingInqAuthClientW
+#define RpcBindingInqAuthInfo RpcBindingInqAuthInfoW
+#define RpcBindingSetAuthInfo RpcBindingSetAuthInfoW
+#define RpcServerRegisterAuthInfo RpcServerRegisterAuthInfoW
+#define RpcBindingInqAuthInfoEx RpcBindingInqAuthInfoExW
+#define RpcBindingSetAuthInfoEx RpcBindingSetAuthInfoExW
+#define UuidFromString UuidFromStringW
+#define UuidToString UuidToStringW
+#define RpcEpRegisterNoReplace RpcEpRegisterNoReplaceW
+#define RpcEpRegister RpcEpRegisterW
+#define DceErrorInqText DceErrorInqTextW
+#else /* UNICODE */
+#define RPC_PROTSEQ_VECTOR RPC_PROTSEQ_VECTORA
+#define SEC_WINNT_AUTH_IDENTITY SEC_WINNT_AUTH_IDENTITY_A
+#define PSEC_WINNT_AUTH_IDENTITY PSEC_WINNT_AUTH_IDENTITY_A
+#define _SEC_WINNT_AUTH_IDENTITY _SEC_WINNT_AUTH_IDENTITY_A
+#define RpcMgmtEpEltInqNext RpcMgmtEpEltInqNextA
+#define RpcBindingFromStringBinding RpcBindingFromStringBindingA
+#define RpcBindingToStringBinding RpcBindingToStringBindingA
+#define RpcStringBindingCompose RpcStringBindingComposeA
+#define RpcStringBindingParse RpcStringBindingParseA
+#define RpcStringFree RpcStringFreeA
+#define RpcNetworkIsProtseqValid RpcNetworkIsProtseqValidA
+#define RpcNetworkInqProtseqs RpcNetworkInqProtseqsA
+#define RpcProtseqVectorFree RpcProtseqVectorFreeA
+#define RpcServerUseProtseq RpcServerUseProtseqA
+#define RpcServerUseProtseqEx RpcServerUseProtseqExA
+#define RpcServerUseProtseqEp RpcServerUseProtseqEpA
+#define RpcServerUseProtseqEpEx RpcServerUseProtseqEpExA
+#define RpcServerUseProtseqIf RpcServerUseProtseqIfA
+#define RpcServerUseProtseqIfEx RpcServerUseProtseqIfExA
+#define RpcMgmtInqServerPrincName RpcMgmtInqServerPrincNameA
+#define RpcServerInqDefaultPrincName RpcServerInqDefaultPrincNameA
+#define RpcNsBindingInqEntryName RpcNsBindingInqEntryNameA
+#define RpcBindingInqAuthClient RpcBindingInqAuthClientA
+#define RpcBindingInqAuthInfo RpcBindingInqAuthInfoA
+#define RpcBindingSetAuthInfo RpcBindingSetAuthInfoA
+#define RpcServerRegisterAuthInfo RpcServerRegisterAuthInfoA
+#define RpcBindingInqAuthInfoEx RpcBindingInqAuthInfoExA
+#define RpcBindingSetAuthInfoEx RpcBindingSetAuthInfoExA
+#define UuidFromString UuidFromStringA
+#define UuidToString UuidToStringA
+#define RpcEpRegisterNoReplace RpcEpRegisterNoReplaceA
+#define RpcEpRegister RpcEpRegisterA
+#define DceErrorInqText DceErrorInqTextA
+#endif /* UNICODE */
+#else /* RPC_UNICODE_SUPPORTED */
+typedef struct _RPC_PROTSEQ_VECTOR {
+ unsigned int Count;
+ unsigned char*Protseq[1];
+} RPC_PROTSEQ_VECTOR;
+RPC_STATUS RPC_ENTRY RpcBindingFromStringBinding(unsigned char *,RPC_BINDING_HANDLE *);
+RPC_STATUS RPC_ENTRY RpcBindingToStringBinding(RPC_BINDING_HANDLE,unsigned char **);
+RPC_STATUS RPC_ENTRY RpcStringBindingCompose(unsigned char *,unsigned char *,unsigned char *,unsigned char *,unsigned char *,unsigned char **);
+RPC_STATUS RPC_ENTRY RpcStringBindingParse(unsigned char *,unsigned char **,unsigned char **,unsigned char **,unsigned char **,unsigned char **);
+RPC_STATUS RPC_ENTRY RpcStringFree(unsigned char**);
+RPC_STATUS RPC_ENTRY RpcNetworkIsProtseqValid(unsigned char*);
+RPC_STATUS RPC_ENTRY RpcNetworkInqProtseqs(RPC_PROTSEQ_VECTOR **);
+RPC_STATUS RPC_ENTRY RpcServerInqBindings(RPC_BINDING_VECTOR **);
+RPC_STATUS RPC_ENTRY RpcServerUseProtseq(unsigned char*,unsigned int,void*);
+RPC_STATUS RPC_ENTRY RpcServerUseProtseqEx(unsigned char*,unsigned int,void*,PRPC_POLICY);
+RPC_STATUS RPC_ENTRY RpcServerUseProtseqEp(unsigned char*,unsigned int,unsigned char*,void*);
+RPC_STATUS RPC_ENTRY RpcServerUseProtseqEpEx(unsigned char*,unsigned int,unsigned char*,void*,PRPC_POLICY);
+RPC_STATUS RPC_ENTRY RpcServerUseProtseqIf(unsigned char*,unsigned int,RPC_IF_HANDLE,void*);
+RPC_STATUS RPC_ENTRY RpcServerUseProtseqIfEx(unsigned char*,unsigned int,RPC_IF_HANDLE,void*,PRPC_POLICY);
+RPC_STATUS RPC_ENTRY RpcMgmtInqServerPrincName(RPC_BINDING_HANDLE,unsigned long,unsigned char**);
+RPC_STATUS RPC_ENTRY RpcServerInqDefaultPrincName(unsigned long,unsigned char**);
+RPC_STATUS RPC_ENTRY RpcNsBindingInqEntryName(RPC_BINDING_HANDLE,unsigned long,unsigned char**);
+RPC_STATUS RPC_ENTRY RpcBindingInqAuthClient(RPC_BINDING_HANDLE,RPC_AUTHZ_HANDLE*,unsigned char**,unsigned long*,unsigned long*,unsigned long*);
+RPC_STATUS RPC_ENTRY RpcBindingInqAuthInfo(RPC_BINDING_HANDLE,unsigned char **,unsigned long *,unsigned long *,RPC_AUTH_IDENTITY_HANDLE *,unsigned long *);
+RPC_STATUS RPC_ENTRY RpcBindingSetAuthInfo(RPC_BINDING_HANDLE,unsigned char *,unsigned long,unsigned long,RPC_AUTH_IDENTITY_HANDLE,unsigned long);
+typedef void(__RPC_USER *RPC_AUTH_KEY_RETRIEVAL_FN)(void*,unsigned char*,unsigned long,void**,RPC_STATUS*);
+RPC_STATUS RPC_ENTRY RpcServerRegisterAuthInfo(unsigned char*,unsigned long,RPC_AUTH_KEY_RETRIEVAL_FN,void*);
+RPC_STATUS RPC_ENTRY UuidToString(UUID*,unsigned char**);
+RPC_STATUS RPC_ENTRY UuidFromString(unsigned char*,UUID*);
+RPC_STATUS RPC_ENTRY RpcEpRegisterNoReplace(RPC_IF_HANDLE,RPC_BINDING_VECTOR*,UUID_VECTOR*,unsigned char*);
+RPC_STATUS RPC_ENTRY RpcEpRegister(RPC_IF_HANDLE,RPC_BINDING_VECTOR*,UUID_VECTOR*,unsigned char*);
+RPC_STATUS RPC_ENTRY DceErrorInqText(RPC_STATUS,unsigned char*);
+RPC_STATUS RPC_ENTRY RpcMgmtEpEltInqNext(RPC_EP_INQ_HANDLE,RPC_IF_ID *,RPC_BINDING_HANDLE *,unsigned char **);
+#endif /* RPC_UNICODE_SUPPORTED */
+
+RPC_STATUS RPC_ENTRY RpcBindingCopy(RPC_BINDING_HANDLE,RPC_BINDING_HANDLE*);
+RPC_STATUS RPC_ENTRY RpcBindingFree(RPC_BINDING_HANDLE*);
+RPC_STATUS RPC_ENTRY RpcBindingInqObject(RPC_BINDING_HANDLE,UUID *);
+RPC_STATUS RPC_ENTRY RpcBindingReset(RPC_BINDING_HANDLE);
+RPC_STATUS RPC_ENTRY RpcBindingSetObject(RPC_BINDING_HANDLE,UUID *);
+RPC_STATUS RPC_ENTRY RpcMgmtInqDefaultProtectLevel(unsigned long,unsigned long *);
+RPC_STATUS RPC_ENTRY RpcBindingVectorFree(RPC_BINDING_VECTOR **);
+RPC_STATUS RPC_ENTRY RpcIfInqId(RPC_IF_HANDLE,RPC_IF_ID *);
+RPC_STATUS RPC_ENTRY RpcMgmtInqComTimeout(RPC_BINDING_HANDLE,unsigned int*);
+RPC_STATUS RPC_ENTRY RpcMgmtSetComTimeout(RPC_BINDING_HANDLE,unsigned int);
+RPC_STATUS RPC_ENTRY RpcMgmtSetCancelTimeout(long Timeout);
+RPC_STATUS RPC_ENTRY RpcObjectInqType(UUID *,UUID *);
+RPC_STATUS RPC_ENTRY RpcObjectSetInqFn(RPC_OBJECT_INQ_FN *);
+RPC_STATUS RPC_ENTRY RpcObjectSetType(UUID *,UUID *);
+RPC_STATUS RPC_ENTRY RpcProtseqVectorFree(RPC_PROTSEQ_VECTOR **);
+RPC_STATUS RPC_ENTRY RpcServerInqIf(RPC_IF_HANDLE,UUID*,RPC_MGR_EPV**);
+RPC_STATUS RPC_ENTRY RpcServerListen(unsigned int,unsigned int,unsigned int);
+RPC_STATUS RPC_ENTRY RpcServerRegisterIf(RPC_IF_HANDLE,UUID*,RPC_MGR_EPV*);
+RPC_STATUS RPC_ENTRY RpcServerRegisterIfEx(RPC_IF_HANDLE,UUID*,RPC_MGR_EPV*,unsigned int,unsigned int,RPC_IF_CALLBACK_FN*);
+RPC_STATUS RPC_ENTRY RpcServerUnregisterIf(RPC_IF_HANDLE,UUID*,unsigned int);
+RPC_STATUS RPC_ENTRY RpcServerUseAllProtseqs(unsigned int,void*);
+RPC_STATUS RPC_ENTRY RpcServerUseAllProtseqsEx(unsigned int,void*,PRPC_POLICY);
+RPC_STATUS RPC_ENTRY RpcServerUseAllProtseqsIf(unsigned int,RPC_IF_HANDLE,void*);
+RPC_STATUS RPC_ENTRY RpcServerUseAllProtseqsIfEx(unsigned int,RPC_IF_HANDLE,void*,PRPC_POLICY);
+RPC_STATUS RPC_ENTRY RpcMgmtStatsVectorFree(RPC_STATS_VECTOR**);
+RPC_STATUS RPC_ENTRY RpcMgmtInqStats(RPC_BINDING_HANDLE,RPC_STATS_VECTOR**);
+RPC_STATUS RPC_ENTRY RpcMgmtIsServerListening(RPC_BINDING_HANDLE);
+RPC_STATUS RPC_ENTRY RpcMgmtStopServerListening(RPC_BINDING_HANDLE);
+RPC_STATUS RPC_ENTRY RpcMgmtWaitServerListen(void);
+RPC_STATUS RPC_ENTRY RpcMgmtSetServerStackSize(unsigned long);
+void RPC_ENTRY RpcSsDontSerializeContext(void);
+RPC_STATUS RPC_ENTRY RpcMgmtEnableIdleCleanup(void);
+RPC_STATUS RPC_ENTRY RpcMgmtInqIfIds(RPC_BINDING_HANDLE,RPC_IF_ID_VECTOR**);
+RPC_STATUS RPC_ENTRY RpcIfIdVectorFree(RPC_IF_ID_VECTOR**);
+RPC_STATUS RPC_ENTRY RpcEpResolveBinding(RPC_BINDING_HANDLE,RPC_IF_HANDLE);
+RPC_STATUS RPC_ENTRY RpcBindingServerFromClient(RPC_BINDING_HANDLE,RPC_BINDING_HANDLE*);
+void RPC_ENTRY RpcRaiseException(RPC_STATUS);
+RPC_STATUS RPC_ENTRY RpcTestCancel();
+RPC_STATUS RPC_ENTRY RpcCancelThread(void*);
+RPC_STATUS RPC_ENTRY UuidCreate(UUID*);
+signed int RPC_ENTRY UuidCompare(UUID*,UUID*, RPC_STATUS*);
+RPC_STATUS RPC_ENTRY UuidCreateNil(UUID*);
+int RPC_ENTRY UuidEqual(UUID*,UUID*, RPC_STATUS*);
+unsigned short RPC_ENTRY UuidHash(UUID*,RPC_STATUS*);
+int RPC_ENTRY UuidIsNil(UUID*,RPC_STATUS*);
+RPC_STATUS RPC_ENTRY RpcEpUnregister(RPC_IF_HANDLE,RPC_BINDING_VECTOR*,UUID_VECTOR*);
+RPC_STATUS RPC_ENTRY RpcMgmtEpEltInqBegin(RPC_BINDING_HANDLE,unsigned long,RPC_IF_ID*,unsigned long,UUID*,RPC_EP_INQ_HANDLE*);
+RPC_STATUS RPC_ENTRY RpcMgmtEpEltInqDone(RPC_EP_INQ_HANDLE*);
+RPC_STATUS RPC_ENTRY RpcMgmtEpUnregister(RPC_BINDING_HANDLE,RPC_IF_ID*,RPC_BINDING_HANDLE,UUID*);
+RPC_STATUS RPC_ENTRY RpcMgmtSetAuthorizationFn(RPC_MGMT_AUTHORIZATION_FN);
+RPC_STATUS RPC_ENTRY RpcMgmtInqParameter(unsigned int,unsigned long*);
+RPC_STATUS RPC_ENTRY RpcMgmtSetParameter(unsigned int,unsigned long);
+RPC_STATUS RPC_ENTRY RpcMgmtBindingInqParameter(RPC_BINDING_HANDLE,unsigned int,unsigned long*);
+RPC_STATUS RPC_ENTRY RpcMgmtBindingSetParameter(RPC_BINDING_HANDLE,unsigned int,unsigned long);
+#include <rpcdcep.h>
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/winsup/w32api/include/rpcdce2.h b/winsup/w32api/include/rpcdce2.h
new file mode 100644
index 000000000..ec0f62e35
--- /dev/null
+++ b/winsup/w32api/include/rpcdce2.h
@@ -0,0 +1,52 @@
+#ifndef _RPCDCE2_H
+#define _RPCDCE2_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+#include <rpcdce.h>
+
+#define RPC_C_EP_ALL_ELTS 0
+#define RPC_C_EP_MATCH_BY_IF 1
+#define RPC_C_EP_MATCH_BY_OBJ 2
+#define RPC_C_EP_MATCH_BY_BOTH 3
+#define RPC_C_VERS_ALL 1
+#define RPC_C_VERS_COMPATIBLE 2
+#define RPC_C_VERS_EXACT 3
+#define RPC_C_VERS_MAJOR_ONLY 4
+#define RPC_C_VERS_UPTO 5
+#define DCE_C_ERROR_STRING_LEN 256
+#define RPC_C_MGMT_INQ_IF_IDS 0
+#define RPC_C_MGMT_INQ_PRINC_NAME 1
+#define RPC_C_MGMT_INQ_STATS 2
+#define RPC_C_MGMT_IS_SERVER_LISTEN 3
+#define RPC_C_MGMT_STOP_SERVER_LISTEN 4
+
+int RPC_ENTRY UuidCompare(UUID*,UUID*,RPC_STATUS*);
+RPC_STATUS RPC_ENTRY UuidCreateNil(UUID*);
+int RPC_ENTRY UuidEqual(UUID*,UUID*,RPC_STATUS*);
+unsigned short RPC_ENTRY UuidHash(UUID*,RPC_STATUS*);
+int RPC_ENTRY UuidIsNil(UUID*,RPC_STATUS*);
+#ifdef RPC_UNICODE_SUPPORTED
+RPC_STATUS RPC_ENTRY DceErrorInqTextA(RPC_STATUS,unsigned char*);
+RPC_STATUS RPC_ENTRY DceErrorInqTextW(RPC_STATUS,unsigned short*);
+RPC_STATUS RPC_ENTRY RpcMgmtEpEltInqNextA(RPC_EP_INQ_HANDLE,RPC_IF_ID*,RPC_BINDING_HANDLE*,UUID*,unsigned char**);
+RPC_STATUS RPC_ENTRY RpcMgmtEpEltInqNextW(RPC_EP_INQ_HANDLE,RPC_IF_ID*,RPC_BINDING_HANDLE*,UUID*,unsigned short**);
+#ifdef UNICODE
+#define RpcMgmtEpEltInqNext RpcMgmtEpEltInqNextW
+#define DceErrorInqText DceErrorInqTextW
+#else
+#define RpcMgmtEpEltInqNext RpcMgmtEpEltInqNextA
+#define DceErrorInqText DceErrorInqTextA
+#endif /* UNICODE */
+#else /* RPC_UNICODE_SUPPORTED */
+RPC_STATUS RPC_ENTRY DceErrorInqText(RPC_STATUS,unsigned char*);
+RPC_STATUS RPC_ENTRY RpcMgmtEpEltInqNext(RPC_EP_INQ_HANDLE,RPC_IF_ID*,RPC_BINDING_HANDLE*,UUID*,unsigned char**);
+#endif
+RPC_STATUS RPC_ENTRY RpcMgmtEpEltInqBegin(RPC_BINDING_HANDLE,unsigned long,RPC_IF_ID*,unsigned long,UUID*,RPC_EP_INQ_HANDLE*);
+RPC_STATUS RPC_ENTRY RpcMgmtEpEltInqDone(RPC_EP_INQ_HANDLE*);
+RPC_STATUS RPC_ENTRY RpcMgmtEpUnregister(RPC_BINDING_HANDLE,RPC_IF_ID*,RPC_BINDING_HANDLE,UUID*);
+RPC_STATUS RPC_ENTRY RpcMgmtSetAuthorizationFn(RPC_MGMT_AUTHORIZATION_FN);
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/winsup/w32api/include/rpcdcep.h b/winsup/w32api/include/rpcdcep.h
new file mode 100644
index 000000000..82d731ebd
--- /dev/null
+++ b/winsup/w32api/include/rpcdcep.h
@@ -0,0 +1,124 @@
+#ifndef _RPCDCEP_H
+#define _RPCDCEP_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+#define RPC_NCA_FLAGS_DEFAULT 0
+#define RPC_NCA_FLAGS_IDEMPOTENT 1
+#define RPC_NCA_FLAGS_BROADCAST 2
+#define RPC_NCA_FLAGS_MAYBE 4
+#define RPCFLG_ASYNCHRONOUS 0x40000000
+#define RPCFLG_INPUT_SYNCHRONOUS 0x20000000
+#define RPC_FLAGS_VALID_BIT 0x8000
+#define TRANSPORT_TYPE_CN 1
+#define TRANSPORT_TYPE_DG 2
+#define TRANSPORT_TYPE_LPC 4
+#define TRANSPORT_TYPE_WMSG 8
+
+typedef struct _RPC_VERSION {
+ unsigned short MajorVersion;
+ unsigned short MinorVersion;
+} RPC_VERSION;
+typedef struct _RPC_SYNTAX_IDENTIFIER {
+ GUID SyntaxGUID;
+ RPC_VERSION SyntaxVersion;
+} RPC_SYNTAX_IDENTIFIER, *PRPC_SYNTAX_IDENTIFIER;
+typedef struct _RPC_MESSAGE {
+ HANDLE Handle;
+ unsigned long DataRepresentation;
+ void *Buffer;
+ unsigned int BufferLength;
+ unsigned int ProcNum;
+ PRPC_SYNTAX_IDENTIFIER TransferSyntax;
+ void *RpcInterfaceInformation;
+ void *ReservedForRuntime;
+ void *ManagerEpv;
+ void *ImportContext;
+ unsigned long RpcFlags;
+} RPC_MESSAGE,*PRPC_MESSAGE;
+typedef long __stdcall RPC_FORWARD_FUNCTION(GUID*,RPC_VERSION*,GUID*,unsigned char*,void**);
+typedef void(__stdcall *RPC_DISPATCH_FUNCTION) ( PRPC_MESSAGE Message);
+typedef struct {
+ unsigned int DispatchTableCount;
+ RPC_DISPATCH_FUNCTION *DispatchTable;
+ int Reserved;
+} RPC_DISPATCH_TABLE,*PRPC_DISPATCH_TABLE;
+typedef struct _RPC_PROTSEQ_ENDPOINT {
+ unsigned char *RpcProtocolSequence;
+ unsigned char *Endpoint;
+} RPC_PROTSEQ_ENDPOINT,*PRPC_PROTSEQ_ENDPOINT;
+typedef struct _RPC_SERVER_INTERFACE {
+ unsigned int Length;
+ RPC_SYNTAX_IDENTIFIER InterfaceId;
+ RPC_SYNTAX_IDENTIFIER TransferSyntax;
+ PRPC_DISPATCH_TABLE DispatchTable;
+ unsigned int RpcProtseqEndpointCount;
+ PRPC_PROTSEQ_ENDPOINT RpcProtseqEndpoint;
+ void *DefaultManagerEpv;
+ void const *InterpreterInfo;
+} RPC_SERVER_INTERFACE,*PRPC_SERVER_INTERFACE;
+typedef struct _RPC_CLIENT_INTERFACE {
+ unsigned int Length;
+ RPC_SYNTAX_IDENTIFIER InterfaceId;
+ RPC_SYNTAX_IDENTIFIER TransferSyntax;
+ PRPC_DISPATCH_TABLE DispatchTable;
+ unsigned int RpcProtseqEndpointCount;
+ PRPC_PROTSEQ_ENDPOINT RpcProtseqEndpoint;
+ unsigned long Reserved;
+ void const *InterpreterInfo;
+} RPC_CLIENT_INTERFACE,*PRPC_CLIENT_INTERFACE;
+typedef void *I_RPC_MUTEX;
+typedef struct _RPC_TRANSFER_SYNTAX {
+ GUID Uuid;
+ unsigned short VersMajor;
+ unsigned short VersMinor;
+} RPC_TRANSFER_SYNTAX;
+typedef long(__stdcall *RPC_BLOCKING_FUNCTION)(void*,void*);
+
+long __stdcall I_RpcGetBuffer(RPC_MESSAGE*);
+long __stdcall I_RpcSendReceive(RPC_MESSAGE*);
+long __stdcall I_RpcFreeBuffer(RPC_MESSAGE*);
+void __stdcall I_RpcRequestMutex(I_RPC_MUTEX*);
+void __stdcall I_RpcClearMutex(I_RPC_MUTEX);
+void __stdcall I_RpcDeleteMutex(I_RPC_MUTEX);
+void* __stdcall I_RpcAllocate(unsigned int);
+void __stdcall I_RpcFree(void*);
+void __stdcall I_RpcPauseExecution(unsigned long);
+typedef void(__stdcall *PRPC_RUNDOWN) (void*);
+long __stdcall I_RpcMonitorAssociation(HANDLE,PRPC_RUNDOWN,void*);
+long __stdcall I_RpcStopMonitorAssociation(HANDLE);
+HANDLE __stdcall I_RpcGetCurrentCallHandle(void);
+long __stdcall I_RpcGetAssociationContext(void**);
+long __stdcall I_RpcSetAssociationContext(void*);
+#ifdef __RPC_NT__
+long __stdcall I_RpcNsBindingSetEntryName(HANDLE,unsigned long,unsigned short*);
+long __stdcall I_RpcBindingInqDynamicEndpoint(HANDLE, unsigned short**);
+#else
+long __stdcall I_RpcNsBindingSetEntryName(HANDLE,unsigned long,unsigned char*);
+long __stdcall I_RpcBindingInqDynamicEndpoint(HANDLE,unsigned char**);
+#endif
+long __stdcall I_RpcBindingInqTransportType(HANDLE,unsigned int*);
+long __stdcall I_RpcIfInqTransferSyntaxes(HANDLE,RPC_TRANSFER_SYNTAX*,unsigned int,unsigned int*);
+long __stdcall I_UuidCreate(GUID*);
+long __stdcall I_RpcBindingCopy(HANDLE,HANDLE*);
+long __stdcall I_RpcBindingIsClientLocal(HANDLE,unsigned int*);
+void __stdcall I_RpcSsDontSerializeContext(void);
+long __stdcall I_RpcServerRegisterForwardFunction(RPC_FORWARD_FUNCTION*);
+long __stdcall I_RpcConnectionInqSockBuffSize(unsigned long*,unsigned long*);
+long __stdcall I_RpcConnectionSetSockBuffSize(unsigned long,unsigned long);
+long __stdcall I_RpcBindingSetAsync(HANDLE,RPC_BLOCKING_FUNCTION);
+long __stdcall I_RpcAsyncSendReceive(RPC_MESSAGE*,void*);
+long __stdcall I_RpcGetThreadWindowHandle(void**);
+long __stdcall I_RpcServerThreadPauseListening();
+long __stdcall I_RpcServerThreadContinueListening();
+long __stdcall I_RpcServerUnregisterEndpointA(unsigned char*,unsigned char*);
+long __stdcall I_RpcServerUnregisterEndpointW(unsigned short*,unsigned short*);
+#ifdef UNICODE
+#define I_RpcServerUnregisterEndpoint I_RpcServerUnregisterEndpointW
+#else
+#define I_RpcServerUnregisterEndpoint I_RpcServerUnregisterEndpointA
+#endif
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/winsup/w32api/include/rpcndr.h b/winsup/w32api/include/rpcndr.h
new file mode 100644
index 000000000..8b6c37b45
--- /dev/null
+++ b/winsup/w32api/include/rpcndr.h
@@ -0,0 +1,466 @@
+#ifndef __RPCNDR_H__
+#define __RPCNDR_H__
+#include <rpcnsip.h>
+#ifdef __cplusplus
+extern "C" {
+#endif
+#include <objfwd.h>
+#define DECLSPEC_UUID(x)
+#define MIDL_INTERFACE(x) struct
+#define NDR_CHAR_REP_MASK (unsigned long)0xFL
+#define NDR_INT_REP_MASK (unsigned long)0xF0L
+#define NDR_FLOAT_REP_MASK (unsigned long)0xFF00L
+#define NDR_LITTLE_ENDIAN (unsigned long)0x10L
+#define NDR_BIG_ENDIAN (unsigned long)0
+#define NDR_IEEE_FLOAT (unsigned long)0
+#define NDR_VAX_FLOAT (unsigned long)0x100L
+#define NDR_ASCII_CHAR (unsigned long)0
+#define NDR_EBCDIC_CHAR (unsigned long)1
+#define NDR_LOCAL_DATA_REPRESENTATION (unsigned long)0x10L
+#define NDR_LOCAL_ENDIAN NDR_LITTLE_ENDIAN
+#define __RPC_CALLEE __stdcall
+#ifndef __MIDL_USER_DEFINED
+#define midl_user_allocate MIDL_user_allocate
+#define midl_user_free MIDL_user_free
+#define __MIDL_USER_DEFINED
+#endif
+#define RPC_VAR_ENTRY __cdecl
+#ifdef _M_IX86
+#define __MIDL_DECLSPEC_DLLIMPORT __declspec(dllimport)
+#define __MIDL_DECLSPEC_DLLEXPORT __declspec(dllexport)
+#else
+#define __MIDL_DECLSPEC_DLLIMPORT
+#define __MIDL_DECLSPEC_DLLEXPORT
+#endif
+#if defined(HAVE_INT64) || (defined(_INTEGRAL_MAX_BITS) && _INTEGRAL_MAX_BITS >= 64)
+#define hyper __int64
+#define MIDL_uhyper unsigned __int64
+#else
+#define hyper double
+#define MIDL_uhyper double
+#endif
+#define small char
+typedef unsigned char byte;
+#define NDRSContextValue(hContext) (&(hContext)->userContext)
+#define cbNDRContext 20
+#define byte_from_ndr(source, target) { *(target) = *(*(char**)&(source)->Buffer)++; }
+#define byte_array_from_ndr(Source, LowerIndex, UpperIndex, Target) { NDRcopy ((((char *)(Target))+(LowerIndex)), (Source)->Buffer, (unsigned int)((UpperIndex)-(LowerIndex))); *(unsigned long *)&(Source)->Buffer += ((UpperIndex)-(LowerIndex)); }
+#define boolean_from_ndr(source, target) { *(target) = *(*(char**)&(source)->Buffer)++; }
+#define boolean_array_from_ndr(Source, LowerIndex, UpperIndex, Target) { NDRcopy ((((char *)(Target))+(LowerIndex)), (Source)->Buffer, (unsigned int)((UpperIndex)-(LowerIndex))); *(unsigned long *)&(Source)->Buffer += ((UpperIndex)-(LowerIndex)); }
+#define small_from_ndr(source, target) { *(target) = *(*(char**)&(source)->Buffer)++; }
+#define small_from_ndr_temp(source, target, format) { *(target) = *(*(char**)(source))++; }
+#define small_array_from_ndr(Source, LowerIndex, UpperIndex, Target) { NDRcopy ((((char *)(Target))+(LowerIndex)), (Source)->Buffer, (unsigned int)((UpperIndex)-(LowerIndex))); *(unsigned long *)&(Source)->Buffer += ((UpperIndex)-(LowerIndex)); }
+#define MIDL_ascii_strlen(string) strlen(string)
+#define MIDL_ascii_strcpy(target,source) strcpy(target,source)
+#define MIDL_memset(s,c,n) memset(s,c,n)
+#define _midl_ma1( p, cast ) *(*( cast **)&p)++
+#define _midl_ma2( p, cast ) *(*( cast **)&p)++
+#define _midl_ma4( p, cast ) *(*( cast **)&p)++
+#define _midl_ma8( p, cast ) *(*( cast **)&p)++
+#define _midl_unma1( p, cast ) *(( cast *)p)++
+#define _midl_unma2( p, cast ) *(( cast *)p)++
+#define _midl_unma3( p, cast ) *(( cast *)p)++
+#define _midl_unma4( p, cast ) *(( cast *)p)++
+#define _midl_fa2( p ) (p = (RPC_BUFPTR )((unsigned long)(p+1) & 0xfffffffe))
+#define _midl_fa4( p ) (p = (RPC_BUFPTR )((unsigned long)(p+3) & 0xfffffffc))
+#define _midl_fa8( p ) (p = (RPC_BUFPTR )((unsigned long)(p+7) & 0xfffffff8))
+#define _midl_addp( p, n ) (p += n)
+#define _midl_marsh_lhs( p, cast ) *(*( cast **)&p)++
+#define _midl_marsh_up( mp, p ) *(*(unsigned long **)&mp)++ = (unsigned long)p
+#define _midl_advmp( mp ) *(*(unsigned long **)&mp)++
+#define _midl_unmarsh_up( p ) (*(*(unsigned long **)&p)++)
+#define NdrMarshConfStringHdr( p, s, l ) (_midl_ma4( p, unsigned long) = s, _midl_ma4( p, unsigned long) = 0, _midl_ma4( p, unsigned long) = l)
+#define NdrUnMarshConfStringHdr(p, s, l) ((s=_midl_unma4(p,unsigned long), (_midl_addp(p,4)), (l=_midl_unma4(p,unsigned long))
+#define NdrMarshCCtxtHdl(pc,p) (NDRCContextMarshall( (NDR_CCONTEXT)pc, p ),p+20)
+#define NdrUnMarshCCtxtHdl(pc,p,h,drep) (NDRCContextUnmarshall((NDR_CONTEXT)pc,h,p,drep), p+20)
+#define NdrUnMarshSCtxtHdl(pc, p,drep) (pc = NdrSContextUnMarshall(p,drep ))
+#define NdrMarshSCtxtHdl(pc,p,rd) (NdrSContextMarshall((NDR_SCONTEXT)pc,p, (NDR_RUNDOWN)rd)
+#define NdrFieldOffset(s,f) (long)(& (((s *)0)->f))
+#define NdrFieldPad(s,f,p,t) (NdrFieldOffset(s,f) - NdrFieldOffset(s,p) - sizeof(t))
+#define NdrFcShort(s) (unsigned char)(s & 0xff), (unsigned char)(s >> 8)
+#define NdrFcLong(s) (unsigned char)(s & 0xff), (unsigned char)((s & 0x0000ff00) >> 8), (unsigned char)((s & 0x00ff0000) >> 16), (unsigned char)(s >> 24)
+#ifdef CONST_VTABLE
+#define CONST_VTBL const
+#else
+#define CONST_VTBL
+#endif
+typedef void *NDR_CCONTEXT;
+typedef struct {
+ void *pad[2];
+ void *userContext;
+} *NDR_SCONTEXT;
+typedef void (__RPC_USER *NDR_RUNDOWN)(void*);
+typedef struct _SCONTEXT_QUEUE {
+ unsigned long NumberOfObjects;
+ NDR_SCONTEXT *ArrayOfObjects;
+} SCONTEXT_QUEUE,*PSCONTEXT_QUEUE;
+struct _MIDL_STUB_MESSAGE;
+struct _MIDL_STUB_DESC;
+struct _FULL_PTR_XLAT_TABLES;
+typedef unsigned char *RPC_BUFPTR;
+typedef unsigned long RPC_LENGTH;
+typedef void(__RPC_USER *EXPR_EVAL)(struct _MIDL_STUB_MESSAGE*);
+typedef const unsigned char *PFORMAT_STRING;
+typedef struct {
+ long Dimension;
+ unsigned long *BufferConformanceMark;
+ unsigned long *BufferVarianceMark;
+ unsigned long *MaxCountArray;
+ unsigned long *OffsetArray;
+ unsigned long *ActualCountArray;
+} ARRAY_INFO,*PARRAY_INFO;
+
+RPC_BINDING_HANDLE RPC_ENTRY NDRCContextBinding(NDR_CCONTEXT);
+void RPC_ENTRY NDRCContextMarshall(NDR_CCONTEXT,void*);
+void RPC_ENTRY NDRCContextUnmarshall(NDR_CCONTEXT*,RPC_BINDING_HANDLE,void*,unsigned long);
+void RPC_ENTRY NDRSContextMarshall(NDR_SCONTEXT,void*,NDR_RUNDOWN);
+NDR_SCONTEXT RPC_ENTRY NDRSContextUnmarshall(void*pBuff,unsigned long);
+void RPC_ENTRY RpcSsDestroyClientContext(void**);
+void RPC_ENTRY NDRcopy(void*,void*,unsigned int);
+unsigned int RPC_ENTRY MIDL_wchar_strlen(wchar_t*);
+void RPC_ENTRY MIDL_wchar_strcpy(void*,wchar_t*);
+void RPC_ENTRY char_from_ndr(PRPC_MESSAGE,unsigned char*);
+void RPC_ENTRY char_array_from_ndr(PRPC_MESSAGE,unsigned long,unsigned long,unsigned char*);
+void RPC_ENTRY short_from_ndr(PRPC_MESSAGE,unsigned short*);
+void RPC_ENTRY short_array_from_ndr(PRPC_MESSAGE,unsigned long,unsigned long,unsigned short*);
+void RPC_ENTRY short_from_ndr_temp(unsigned char**,unsigned short*,unsigned long);
+void RPC_ENTRY long_from_ndr(PRPC_MESSAGE,unsigned long*);
+void RPC_ENTRY long_array_from_ndr(PRPC_MESSAGE,unsigned long,unsigned long,unsigned long*);
+void RPC_ENTRY long_from_ndr_temp(unsigned char**,unsigned long*,unsigned long);
+void RPC_ENTRY enum_from_ndr(PRPC_MESSAGE,unsigned int*);
+void RPC_ENTRY float_from_ndr(PRPC_MESSAGE,void*);
+void RPC_ENTRY float_array_from_ndr(PRPC_MESSAGE,unsigned long,unsigned long,void*);
+void RPC_ENTRY double_from_ndr(PRPC_MESSAGE,void*);
+void RPC_ENTRY double_array_from_ndr(PRPC_MESSAGE,unsigned long,unsigned long,void*);
+void RPC_ENTRY hyper_from_ndr(PRPC_MESSAGE,hyper*);
+void RPC_ENTRY hyper_array_from_ndr(PRPC_MESSAGE,unsigned long,unsigned long,hyper*);
+void RPC_ENTRY hyper_from_ndr_temp(unsigned char**,hyper*,unsigned long);
+void RPC_ENTRY data_from_ndr(PRPC_MESSAGE,void*,char*,unsigned char);
+void RPC_ENTRY data_into_ndr(void*,PRPC_MESSAGE,char*,unsigned char);
+void RPC_ENTRY tree_into_ndr(void*,PRPC_MESSAGE,char*,unsigned char);
+void RPC_ENTRY data_size_ndr(void*,PRPC_MESSAGE,char*,unsigned char);
+void RPC_ENTRY tree_size_ndr(void*,PRPC_MESSAGE,char*,unsigned char);
+void RPC_ENTRY tree_peek_ndr(PRPC_MESSAGE,unsigned char**,char*,unsigned char);
+void *RPC_ENTRY midl_allocate(int);
+
+#pragma pack(push,4)
+typedef struct _MIDL_STUB_MESSAGE {
+ PRPC_MESSAGE RpcMsg;
+ unsigned char *Buffer;
+ unsigned char *BufferStart;
+ unsigned char *BufferEnd;
+ unsigned char *BufferMark;
+ unsigned long BufferLength;
+ unsigned long MemorySize;
+ unsigned char *Memory;
+ int IsClient;
+ int ReuseBuffer;
+ unsigned char *AllocAllNodesMemory;
+ unsigned char *AllocAllNodesMemoryEnd;
+ int IgnoreEmbeddedPointers;
+ unsigned char *PointerBufferMark;
+ unsigned char fBufferValid;
+ unsigned char Unused;
+ unsigned long MaxCount;
+ unsigned long Offset;
+ unsigned long ActualCount;
+ void*(__RPC_API *pfnAllocate)(unsigned int);
+ void(__RPC_API *pfnFree)(void*);
+ unsigned char *StackTop;
+ unsigned char *pPresentedType;
+ unsigned char *pTransmitType;
+ handle_t SavedHandle;
+ const struct _MIDL_STUB_DESC *StubDesc;
+ struct _FULL_PTR_XLAT_TABLES *FullPtrXlatTables;
+ unsigned long FullPtrRefId;
+ int fCheckBounds;
+ int fInDontFree :1;
+ int fDontCallFreeInst :1;
+ int fInOnlyParam :1;
+ int fHasReturn :1;
+ unsigned long dwDestContext;
+ void*pvDestContext;
+ NDR_SCONTEXT *SavedContextHandles;
+ long ParamNumber;
+ struct IRpcChannelBuffer *pRpcChannelBuffer;
+ PARRAY_INFO pArrayInfo;
+ unsigned long *SizePtrCountArray;
+ unsigned long *SizePtrOffsetArray;
+ unsigned long *SizePtrLengthArray;
+ void*pArgQueue;
+ unsigned long dwStubPhase;
+ unsigned long Reserved[5];
+} MIDL_STUB_MESSAGE,*PMIDL_STUB_MESSAGE;
+#pragma pack(pop)
+typedef void*(__RPC_API *GENERIC_BINDING_ROUTINE)(void*);
+typedef void (__RPC_API *GENERIC_UNBIND_ROUTINE)(void*,unsigned char*);
+typedef struct _GENERIC_BINDING_ROUTINE_PAIR {
+ GENERIC_BINDING_ROUTINE pfnBind;
+ GENERIC_UNBIND_ROUTINE pfnUnbind;
+} GENERIC_BINDING_ROUTINE_PAIR,*PGENERIC_BINDING_ROUTINE_PAIR;
+typedef struct __GENERIC_BINDING_INFO {
+ void *pObj;
+ unsigned int Size;
+ GENERIC_BINDING_ROUTINE pfnBind;
+ GENERIC_UNBIND_ROUTINE pfnUnbind;
+} GENERIC_BINDING_INFO,*PGENERIC_BINDING_INFO;
+typedef void(__RPC_USER *XMIT_HELPER_ROUTINE)(PMIDL_STUB_MESSAGE);
+typedef struct _XMIT_ROUTINE_QUINTUPLE {
+ XMIT_HELPER_ROUTINE pfnTranslateToXmit;
+ XMIT_HELPER_ROUTINE pfnTranslateFromXmit;
+ XMIT_HELPER_ROUTINE pfnFreeXmit;
+ XMIT_HELPER_ROUTINE pfnFreeInst;
+} XMIT_ROUTINE_QUINTUPLE,*PXMIT_ROUTINE_QUINTUPLE;
+typedef struct _MALLOC_FREE_STRUCT {
+void*(__RPC_USER *pfnAllocate)(unsigned int);
+void(__RPC_USER *pfnFree)(void*);
+} MALLOC_FREE_STRUCT;
+typedef struct _COMM_FAULT_OFFSETS {
+ short CommOffset;
+ short FaultOffset;
+} COMM_FAULT_OFFSETS;
+typedef struct _MIDL_STUB_DESC {
+ void*RpcInterfaceInformation;
+ void*(__RPC_API *pfnAllocate)(unsigned int);
+ void(__RPC_API *pfnFree)(void*);
+ union {
+ handle_t *pAutoHandle;
+ handle_t *pPrimitiveHandle;
+ PGENERIC_BINDING_INFO pGenericBindingInfo;
+ } IMPLICIT_HANDLE_INFO;
+ const NDR_RUNDOWN *apfnNdrRundownRoutines;
+ const GENERIC_BINDING_ROUTINE_PAIR *aGenericBindingRoutinePairs;
+ const EXPR_EVAL *apfnExprEval;
+ const XMIT_ROUTINE_QUINTUPLE *aXmitQuintuple;
+ const unsigned char *pFormatTypes;
+ int fCheckBounds;
+ unsigned long Version;
+ MALLOC_FREE_STRUCT *pMallocFreeStruct;
+ long MIDLVersion;
+ const COMM_FAULT_OFFSETS *CommFaultOffsets;
+} MIDL_STUB_DESC;
+typedef const MIDL_STUB_DESC *PMIDL_STUB_DESC;
+typedef void*PMIDL_XMIT_TYPE;
+typedef struct _MIDL_FORMAT_STRING {
+ short Pad;
+ unsigned char Format[1];
+} MIDL_FORMAT_STRING;
+typedef void(__RPC_API *STUB_THUNK)(PMIDL_STUB_MESSAGE);
+typedef long(__RPC_API *SERVER_ROUTINE)();
+typedef struct _MIDL_SERVER_INFO_ {
+ PMIDL_STUB_DESC pStubDesc;
+ const SERVER_ROUTINE *DispatchTable;
+ PFORMAT_STRING ProcString;
+ const unsigned short *FmtStringOffset;
+ const STUB_THUNK *ThunkTable;
+} MIDL_SERVER_INFO,*PMIDL_SERVER_INFO;
+typedef struct _MIDL_STUBLESS_PROXY_INFO {
+ PMIDL_STUB_DESC pStubDesc;
+ PFORMAT_STRING ProcFormatString;
+ const unsigned short *FormatStringOffset;
+} MIDL_STUBLESS_PROXY_INFO;
+typedef MIDL_STUBLESS_PROXY_INFO *PMIDL_STUBLESS_PROXY_INFO;
+typedef union _CLIENT_CALL_RETURN {
+ void *Pointer;
+ long Simple;
+} CLIENT_CALL_RETURN;
+typedef enum { XLAT_SERVER = 1,XLAT_CLIENT } XLAT_SIDE;
+typedef struct _FULL_PTR_TO_REFID_ELEMENT {
+ struct _FULL_PTR_TO_REFID_ELEMENT *Next;
+ void*Pointer;
+ unsigned long RefId;
+ unsigned char State;
+} FULL_PTR_TO_REFID_ELEMENT,*PFULL_PTR_TO_REFID_ELEMENT;
+typedef struct _FULL_PTR_XLAT_TABLES {
+ struct {
+ void **XlatTable;
+ unsigned char *StateTable;
+ unsigned long NumberOfEntries;
+ } RefIdToPointer;
+ struct {
+ PFULL_PTR_TO_REFID_ELEMENT *XlatTable;
+ unsigned long NumberOfBuckets;
+ unsigned long HashMask;
+ } PointerToRefId;
+ unsigned long NextRefId;
+ XLAT_SIDE XlatSide;
+} FULL_PTR_XLAT_TABLES,*PFULL_PTR_XLAT_TABLES;
+void RPC_ENTRY NdrSimpleTypeMarshall(PMIDL_STUB_MESSAGE,unsigned char*,unsigned char);
+unsigned char *RPC_ENTRY NdrPointerMarshall(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING pFormat);
+unsigned char *RPC_ENTRY NdrSimpleStructMarshall(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING);
+unsigned char *RPC_ENTRY NdrConformantStructMarshall(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING);
+unsigned char *RPC_ENTRY NdrConformantVaryingStructMarshall(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING);
+unsigned char *RPC_ENTRY NdrHardStructMarshall(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING);
+unsigned char *RPC_ENTRY NdrComplexStructMarshall(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING);
+unsigned char *RPC_ENTRY NdrFixedArrayMarshall(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING);
+unsigned char *RPC_ENTRY NdrConformantArrayMarshall(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING);
+unsigned char *RPC_ENTRY NdrConformantVaryingArrayMarshall(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING);
+unsigned char *RPC_ENTRY NdrVaryingArrayMarshall(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING);
+unsigned char *RPC_ENTRY NdrComplexArrayMarshall(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING);
+unsigned char *RPC_ENTRY NdrNonConformantStringMarshall(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING);
+unsigned char *RPC_ENTRY NdrConformantStringMarshall(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING);
+unsigned char *RPC_ENTRY NdrEncapsulatedUnionMarshall(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING);
+unsigned char *RPC_ENTRY NdrNonEncapsulatedUnionMarshall(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING);
+unsigned char *RPC_ENTRY NdrByteCountPointerMarshall(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING);
+unsigned char *RPC_ENTRY NdrXmitOrRepAsMarshall(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING);
+unsigned char *RPC_ENTRY NdrInterfacePointerMarshall(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING);
+void RPC_ENTRY NdrClientContextMarshall(PMIDL_STUB_MESSAGE,NDR_CCONTEXT,int);
+void RPC_ENTRY NdrServerContextMarshall(PMIDL_STUB_MESSAGE,NDR_SCONTEXT,NDR_RUNDOWN);
+void RPC_ENTRY NdrSimpleTypeUnmarshall(PMIDL_STUB_MESSAGE,unsigned char*,unsigned char);
+unsigned char *RPC_ENTRY NdrPointerUnmarshall(PMIDL_STUB_MESSAGE,unsigned char**,PFORMAT_STRING,unsigned char);
+unsigned char *RPC_ENTRY NdrSimpleStructUnmarshall(PMIDL_STUB_MESSAGE,unsigned char**,PFORMAT_STRING,unsigned char);
+unsigned char *RPC_ENTRY NdrConformantStructUnmarshall(PMIDL_STUB_MESSAGE,unsigned char**,PFORMAT_STRING,unsigned char);
+unsigned char *RPC_ENTRY NdrConformantVaryingStructUnmarshall(PMIDL_STUB_MESSAGE,unsigned char**,PFORMAT_STRING,unsigned char);
+unsigned char *RPC_ENTRY NdrHardStructUnmarshall(PMIDL_STUB_MESSAGE,unsigned char**,PFORMAT_STRING,unsigned char);
+unsigned char *RPC_ENTRY NdrComplexStructUnmarshall(PMIDL_STUB_MESSAGE,unsigned char**,PFORMAT_STRING,unsigned char);
+unsigned char *RPC_ENTRY NdrFixedArrayUnmarshall(PMIDL_STUB_MESSAGE,unsigned char**,PFORMAT_STRING,unsigned char);
+unsigned char *RPC_ENTRY NdrConformantArrayUnmarshall(PMIDL_STUB_MESSAGE,unsigned char**,PFORMAT_STRING,unsigned char);
+unsigned char *RPC_ENTRY NdrConformantVaryingArrayUnmarshall(PMIDL_STUB_MESSAGE,unsigned char**,PFORMAT_STRING,unsigned char);
+unsigned char *RPC_ENTRY NdrVaryingArrayUnmarshall(PMIDL_STUB_MESSAGE,unsigned char**,PFORMAT_STRING,unsigned char);
+unsigned char *RPC_ENTRY NdrComplexArrayUnmarshall(PMIDL_STUB_MESSAGE,unsigned char**,PFORMAT_STRING,unsigned char);
+unsigned char *RPC_ENTRY NdrNonConformantStringUnmarshall(PMIDL_STUB_MESSAGE,unsigned char**,PFORMAT_STRING,unsigned char);
+unsigned char *RPC_ENTRY NdrConformantStringUnmarshall(PMIDL_STUB_MESSAGE,unsigned char**,PFORMAT_STRING,unsigned char);
+unsigned char *RPC_ENTRY NdrEncapsulatedUnionUnmarshall(PMIDL_STUB_MESSAGE,unsigned char**,PFORMAT_STRING,unsigned char);
+unsigned char *RPC_ENTRY NdrNonEncapsulatedUnionUnmarshall(PMIDL_STUB_MESSAGE,unsigned char**,PFORMAT_STRING,unsigned char);
+unsigned char *RPC_ENTRY NdrByteCountPointerUnmarshall(PMIDL_STUB_MESSAGE,unsigned char**,PFORMAT_STRING,unsigned char);
+unsigned char *RPC_ENTRY NdrXmitOrRepAsUnmarshall(PMIDL_STUB_MESSAGE,unsigned char**,PFORMAT_STRING,unsigned char);
+unsigned char *RPC_ENTRY NdrInterfacePointerUnmarshall(PMIDL_STUB_MESSAGE,unsigned char**,PFORMAT_STRING,unsigned char);
+void RPC_ENTRY NdrClientContextUnmarshall(PMIDL_STUB_MESSAGE,NDR_CCONTEXT*,RPC_BINDING_HANDLE);
+NDR_SCONTEXT RPC_ENTRY NdrServerContextUnmarshall(PMIDL_STUB_MESSAGE);
+void RPC_ENTRY NdrPointerBufferSize(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING);
+void RPC_ENTRY NdrSimpleStructBufferSize(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING);
+void RPC_ENTRY NdrConformantStructBufferSize(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING);
+void RPC_ENTRY NdrConformantVaryingStructBufferSize(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING);
+void RPC_ENTRY NdrHardStructBufferSize(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING);
+void RPC_ENTRY NdrComplexStructBufferSize(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING);
+void RPC_ENTRY NdrFixedArrayBufferSize(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING);
+void RPC_ENTRY NdrConformantArrayBufferSize(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING);
+void RPC_ENTRY NdrConformantVaryingArrayBufferSize(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING);
+void RPC_ENTRY NdrVaryingArrayBufferSize(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING);
+void RPC_ENTRY NdrComplexArrayBufferSize(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING);
+void RPC_ENTRY NdrConformantStringBufferSize(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING);
+void RPC_ENTRY NdrNonConformantStringBufferSize(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING);
+void RPC_ENTRY NdrEncapsulatedUnionBufferSize(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING);
+void RPC_ENTRY NdrNonEncapsulatedUnionBufferSize(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING);
+void RPC_ENTRY NdrByteCountPointerBufferSize(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING);
+void RPC_ENTRY NdrXmitOrRepAsBufferSize(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING);
+void RPC_ENTRY NdrInterfacePointerBufferSize(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING);
+void RPC_ENTRY NdrContextHandleSize(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING);
+unsigned long RPC_ENTRY NdrPointerMemorySize(PMIDL_STUB_MESSAGE,PFORMAT_STRING);
+unsigned long RPC_ENTRY NdrSimpleStructMemorySize(PMIDL_STUB_MESSAGE,PFORMAT_STRING);
+unsigned long RPC_ENTRY NdrConformantStructMemorySize(PMIDL_STUB_MESSAGE,PFORMAT_STRING);
+unsigned long RPC_ENTRY NdrConformantVaryingStructMemorySize(PMIDL_STUB_MESSAGE,PFORMAT_STRING);
+unsigned long RPC_ENTRY NdrHardStructMemorySize(PMIDL_STUB_MESSAGE,PFORMAT_STRING);
+unsigned long RPC_ENTRY NdrComplexStructMemorySize(PMIDL_STUB_MESSAGE,PFORMAT_STRING);
+unsigned long RPC_ENTRY NdrFixedArrayMemorySize(PMIDL_STUB_MESSAGE,PFORMAT_STRING);
+unsigned long RPC_ENTRY NdrConformantArrayMemorySize(PMIDL_STUB_MESSAGE,PFORMAT_STRING);
+unsigned long RPC_ENTRY NdrConformantVaryingArrayMemorySize(PMIDL_STUB_MESSAGE,PFORMAT_STRING);
+unsigned long RPC_ENTRY NdrVaryingArrayMemorySize(PMIDL_STUB_MESSAGE,PFORMAT_STRING);
+unsigned long RPC_ENTRY NdrComplexArrayMemorySize(PMIDL_STUB_MESSAGE,PFORMAT_STRING);
+unsigned long RPC_ENTRY NdrConformantStringMemorySize(PMIDL_STUB_MESSAGE,PFORMAT_STRING);
+unsigned long RPC_ENTRY NdrNonConformantStringMemorySize(PMIDL_STUB_MESSAGE,PFORMAT_STRING);
+unsigned long RPC_ENTRY NdrEncapsulatedUnionMemorySize(PMIDL_STUB_MESSAGE,PFORMAT_STRING);
+unsigned long RPC_ENTRY NdrNonEncapsulatedUnionMemorySize(PMIDL_STUB_MESSAGE,PFORMAT_STRING);
+unsigned long RPC_ENTRY NdrXmitOrRepAsMemorySize(PMIDL_STUB_MESSAGE,PFORMAT_STRING);
+unsigned long RPC_ENTRY NdrInterfacePointerMemorySize(PMIDL_STUB_MESSAGE,PFORMAT_STRING);
+void RPC_ENTRY NdrPointerFree(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING);
+void RPC_ENTRY NdrSimpleStructFree(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING);
+void RPC_ENTRY NdrConformantStructFree(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING);
+void RPC_ENTRY NdrConformantVaryingStructFree(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING);
+void RPC_ENTRY NdrHardStructFree(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING);
+void RPC_ENTRY NdrComplexStructFree(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING);
+void RPC_ENTRY NdrFixedArrayFree(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING);
+void RPC_ENTRY NdrConformantArrayFree(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING);
+void RPC_ENTRY NdrConformantVaryingArrayFree(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING);
+void RPC_ENTRY NdrVaryingArrayFree(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING);
+void RPC_ENTRY NdrComplexArrayFree(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING);
+void RPC_ENTRY NdrEncapsulatedUnionFree(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING);
+void RPC_ENTRY NdrNonEncapsulatedUnionFree(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING);
+void RPC_ENTRY NdrByteCountPointerFree(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING);
+void RPC_ENTRY NdrXmitOrRepAsFree(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING);
+void RPC_ENTRY NdrInterfacePointerFree(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING);
+void RPC_ENTRY NdrConvert(PMIDL_STUB_MESSAGE,PFORMAT_STRING);
+void RPC_ENTRY NdrClientInitializeNew(PRPC_MESSAGE,PMIDL_STUB_MESSAGE,PMIDL_STUB_DESC,unsigned int);
+unsigned char *RPC_ENTRY NdrServerInitializeNew(PRPC_MESSAGE,PMIDL_STUB_MESSAGE,PMIDL_STUB_DESC);
+void RPC_ENTRY NdrClientInitialize(PRPC_MESSAGE,PMIDL_STUB_MESSAGE,PMIDL_STUB_DESC,unsigned int);
+unsigned char *RPC_ENTRY NdrServerInitialize(PRPC_MESSAGE,PMIDL_STUB_MESSAGE,PMIDL_STUB_DESC);
+unsigned char *RPC_ENTRY NdrServerInitializeUnmarshall(PMIDL_STUB_MESSAGE,PMIDL_STUB_DESC,PRPC_MESSAGE);
+void RPC_ENTRY NdrServerInitializeMarshall(PRPC_MESSAGE,PMIDL_STUB_MESSAGE);
+unsigned char *RPC_ENTRY NdrGetBuffer(PMIDL_STUB_MESSAGE,unsigned long,RPC_BINDING_HANDLE);
+unsigned char *RPC_ENTRY NdrNsGetBuffer(PMIDL_STUB_MESSAGE,unsigned long,RPC_BINDING_HANDLE);
+unsigned char *RPC_ENTRY NdrSendReceive(PMIDL_STUB_MESSAGE,unsigned char*);
+unsigned char *RPC_ENTRY NdrNsSendReceive(PMIDL_STUB_MESSAGE,unsigned char*,RPC_BINDING_HANDLE*);
+void RPC_ENTRY NdrFreeBuffer(PMIDL_STUB_MESSAGE);
+CLIENT_CALL_RETURN RPC_VAR_ENTRY NdrClientCall(PMIDL_STUB_DESC,PFORMAT_STRING,...);
+typedef enum {
+ STUB_UNMARSHAL,
+ STUB_CALL_SERVER,
+ STUB_MARSHAL,
+ STUB_CALL_SERVER_NO_HRESULT
+} STUB_PHASE;
+typedef enum {
+ PROXY_CALCSIZE,
+ PROXY_GETBUFFER,
+ PROXY_MARSHAL,
+ PROXY_SENDRECEIVE,
+ PROXY_UNMARSHAL
+} PROXY_PHASE;
+long RPC_ENTRY NdrStubCall(struct IRpcStubBuffer*,struct IRpcChannelBuffer*,PRPC_MESSAGE,unsigned long*);
+void RPC_ENTRY NdrServerCall(PRPC_MESSAGE);
+int RPC_ENTRY NdrServerUnmarshall(struct IRpcChannelBuffer*,PRPC_MESSAGE,PMIDL_STUB_MESSAGE,PMIDL_STUB_DESC,PFORMAT_STRING,void*);
+void RPC_ENTRY NdrServerMarshall(struct IRpcStubBuffer*,struct IRpcChannelBuffer*,PMIDL_STUB_MESSAGE,PFORMAT_STRING);
+RPC_STATUS RPC_ENTRY NdrMapCommAndFaultStatus(PMIDL_STUB_MESSAGE,unsigned long*,unsigned long*,RPC_STATUS);
+int RPC_ENTRY NdrSH_UPDecision(PMIDL_STUB_MESSAGE,unsigned char**,RPC_BUFPTR);
+int RPC_ENTRY NdrSH_TLUPDecision(PMIDL_STUB_MESSAGE,unsigned char**);
+int RPC_ENTRY NdrSH_TLUPDecisionBuffer(PMIDL_STUB_MESSAGE,unsigned char**);
+int RPC_ENTRY NdrSH_IfAlloc(PMIDL_STUB_MESSAGE,unsigned char**,unsigned long);
+int RPC_ENTRY NdrSH_IfAllocRef(PMIDL_STUB_MESSAGE,unsigned char**,unsigned long);
+int RPC_ENTRY NdrSH_IfAllocSet(PMIDL_STUB_MESSAGE,unsigned char**,unsigned long);
+RPC_BUFPTR RPC_ENTRY NdrSH_IfCopy(PMIDL_STUB_MESSAGE,unsigned char**,unsigned long);
+RPC_BUFPTR RPC_ENTRY NdrSH_IfAllocCopy(PMIDL_STUB_MESSAGE,unsigned char**,unsigned long);
+unsigned long RPC_ENTRY NdrSH_Copy(unsigned char*,unsigned char*,unsigned long);
+void RPC_ENTRY NdrSH_IfFree(PMIDL_STUB_MESSAGE,unsigned char*);
+RPC_BUFPTR RPC_ENTRY NdrSH_StringMarshall(PMIDL_STUB_MESSAGE,unsigned char*,unsigned long,int);
+RPC_BUFPTR RPC_ENTRY NdrSH_StringUnMarshall(PMIDL_STUB_MESSAGE,unsigned char**,int);
+typedef void *RPC_SS_THREAD_HANDLE;
+typedef void* __RPC_API RPC_CLIENT_ALLOC(unsigned int);
+typedef void __RPC_API RPC_CLIENT_FREE(void*);
+void*RPC_ENTRY RpcSsAllocate(unsigned int);
+void RPC_ENTRY RpcSsDisableAllocate(void);
+void RPC_ENTRY RpcSsEnableAllocate(void);
+void RPC_ENTRY RpcSsFree(void*);
+RPC_SS_THREAD_HANDLE RPC_ENTRY RpcSsGetThreadHandle(void);
+void RPC_ENTRY RpcSsSetClientAllocFree(RPC_CLIENT_ALLOC*,RPC_CLIENT_FREE*);
+void RPC_ENTRY RpcSsSetThreadHandle(RPC_SS_THREAD_HANDLE);
+void RPC_ENTRY RpcSsSwapClientAllocFree(RPC_CLIENT_ALLOC*,RPC_CLIENT_FREE*,RPC_CLIENT_ALLOC**,RPC_CLIENT_FREE**);
+void*RPC_ENTRY RpcSmAllocate(unsigned int,RPC_STATUS*);
+RPC_STATUS RPC_ENTRY RpcSmClientFree(void*);
+RPC_STATUS RPC_ENTRY RpcSmDestroyClientContext(void**);
+RPC_STATUS RPC_ENTRY RpcSmDisableAllocate(void);
+RPC_STATUS RPC_ENTRY RpcSmEnableAllocate(void);
+RPC_STATUS RPC_ENTRY RpcSmFree(void*);
+RPC_SS_THREAD_HANDLE RPC_ENTRY RpcSmGetThreadHandle(RPC_STATUS*);
+RPC_STATUS RPC_ENTRY RpcSmSetClientAllocFree(RPC_CLIENT_ALLOC*,RPC_CLIENT_FREE*);
+RPC_STATUS RPC_ENTRY RpcSmSetThreadHandle(RPC_SS_THREAD_HANDLE);
+RPC_STATUS RPC_ENTRY RpcSmSwapClientAllocFree(RPC_CLIENT_ALLOC*,RPC_CLIENT_FREE*,RPC_CLIENT_ALLOC**,RPC_CLIENT_FREE**);
+void RPC_ENTRY NdrRpcSsEnableAllocate(PMIDL_STUB_MESSAGE);
+void RPC_ENTRY NdrRpcSsDisableAllocate(PMIDL_STUB_MESSAGE);
+void RPC_ENTRY NdrRpcSmSetClientToOsf(PMIDL_STUB_MESSAGE);
+void*RPC_ENTRY NdrRpcSmClientAllocate(unsigned int);
+void RPC_ENTRY NdrRpcSmClientFree(void*);
+void*RPC_ENTRY NdrRpcSsDefaultAllocate(unsigned int);
+void RPC_ENTRY NdrRpcSsDefaultFree(void*);
+PFULL_PTR_XLAT_TABLES RPC_ENTRY NdrFullPointerXlatInit(unsigned long,XLAT_SIDE);
+void RPC_ENTRY NdrFullPointerXlatFree(PFULL_PTR_XLAT_TABLES);
+int RPC_ENTRY NdrFullPointerQueryPointer(PFULL_PTR_XLAT_TABLES,void*,unsigned char,unsigned long*);
+int RPC_ENTRY NdrFullPointerQueryRefId(PFULL_PTR_XLAT_TABLES,unsigned long,unsigned char,void**);
+void RPC_ENTRY NdrFullPointerInsertRefId(PFULL_PTR_XLAT_TABLES,unsigned long,void*);
+int RPC_ENTRY NdrFullPointerFree(PFULL_PTR_XLAT_TABLES,void*);
+void*RPC_ENTRY NdrAllocate(PMIDL_STUB_MESSAGE,unsigned int);
+void RPC_ENTRY NdrClearOutParameters(PMIDL_STUB_MESSAGE,PFORMAT_STRING,void*);
+void*RPC_ENTRY NdrOleAllocate(unsigned int);
+void RPC_ENTRY NdrOleFree(void*);
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/winsup/w32api/include/rpcnsi.h b/winsup/w32api/include/rpcnsi.h
new file mode 100644
index 000000000..69547c8e4
--- /dev/null
+++ b/winsup/w32api/include/rpcnsi.h
@@ -0,0 +1,118 @@
+#ifndef _RPCNSI_H
+#define _RPCNSI_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+typedef void *RPC_NS_HANDLE;
+#define RPC_C_NS_SYNTAX_DEFAULT 0
+#define RPC_C_NS_SYNTAX_DCE 3
+#define RPC_C_PROFILE_DEFAULT_ELT 0
+#define RPC_C_PROFILE_ALL_ELT 1
+#define RPC_C_PROFILE_MATCH_BY_IF 2
+#define RPC_C_PROFILE_MATCH_BY_MBR 3
+#define RPC_C_PROFILE_MATCH_BY_BOTH 4
+#define RPC_C_NS_DEFAULT_EXP_AGE -1
+
+RPC_STATUS RPC_ENTRY RpcNsBindingExportA(unsigned long,unsigned char*,RPC_IF_HANDLE,RPC_BINDING_VECTOR*,UUID_VECTOR*);
+RPC_STATUS RPC_ENTRY RpcNsBindingUnexportA(unsigned long,unsigned char*,RPC_IF_HANDLE,UUID_VECTOR*);
+RPC_STATUS RPC_ENTRY RpcNsBindingLookupBeginA(unsigned long,unsigned char*,RPC_IF_HANDLE,UUID*,unsigned long,RPC_NS_HANDLE*);
+RPC_STATUS RPC_ENTRY RpcNsBindingLookupNext(RPC_NS_HANDLE,RPC_BINDING_VECTOR**);
+RPC_STATUS RPC_ENTRY RpcNsBindingLookupDone(RPC_NS_HANDLE*);
+RPC_STATUS RPC_ENTRY RpcNsGroupDeleteA(unsigned long,unsigned char*);
+RPC_STATUS RPC_ENTRY RpcNsGroupMbrAddA(unsigned long,unsigned char*,unsigned long,unsigned char*);
+RPC_STATUS RPC_ENTRY RpcNsGroupMbrRemoveA(unsigned long,unsigned char*,unsigned long,unsigned char*);
+RPC_STATUS RPC_ENTRY RpcNsGroupMbrInqBeginA(unsigned long,unsigned char*,unsigned long,RPC_NS_HANDLE*);
+RPC_STATUS RPC_ENTRY RpcNsGroupMbrInqNextA(RPC_NS_HANDLE,unsigned char**);
+RPC_STATUS RPC_ENTRY RpcNsGroupMbrInqDone(RPC_NS_HANDLE*);
+RPC_STATUS RPC_ENTRY RpcNsProfileDeleteA(unsigned long,unsigned char*);
+RPC_STATUS RPC_ENTRY RpcNsProfileEltAddA(unsigned long,unsigned char*,RPC_IF_ID*,unsigned long,unsigned char*,unsigned long,unsigned char*);
+RPC_STATUS RPC_ENTRY RpcNsProfileEltRemoveA(unsigned long,unsigned char*,RPC_IF_ID*,unsigned long,unsigned char*);
+RPC_STATUS RPC_ENTRY RpcNsProfileEltInqBeginA(unsigned long,unsigned char*,unsigned long,RPC_IF_ID*,unsigned long,unsigned long,unsigned char*,RPC_NS_HANDLE*);
+RPC_STATUS RPC_ENTRY RpcNsProfileEltInqNextA(RPC_NS_HANDLE,RPC_IF_ID*,unsigned char**,unsigned long*,unsigned char**);
+RPC_STATUS RPC_ENTRY RpcNsProfileEltInqDone(RPC_NS_HANDLE*);
+RPC_STATUS RPC_ENTRY RpcNsEntryObjectInqNext(IN RPC_NS_HANDLE,OUT UUID*);
+RPC_STATUS RPC_ENTRY RpcNsEntryObjectInqDone(IN OUT RPC_NS_HANDLE*);
+RPC_STATUS RPC_ENTRY RpcNsEntryExpandNameA(unsigned long,unsigned char*,unsigned char**);
+RPC_STATUS RPC_ENTRY RpcNsMgmtBindingUnexportA(unsigned long,unsigned char*,RPC_IF_ID*,unsigned long,UUID_VECTOR*);
+RPC_STATUS RPC_ENTRY RpcNsMgmtEntryCreateA(unsigned long,unsigned char*);
+RPC_STATUS RPC_ENTRY RpcNsMgmtEntryDeleteA(unsigned long,unsigned char*);
+RPC_STATUS RPC_ENTRY RpcNsMgmtEntryInqIfIdsA(unsigned long,unsigned char*,RPC_IF_ID_VECTOR**);
+RPC_STATUS RPC_ENTRY RpcNsMgmtHandleSetExpAge(RPC_NS_HANDLE,unsigned long);
+RPC_STATUS RPC_ENTRY RpcNsMgmtInqExpAge(unsigned long*);
+RPC_STATUS RPC_ENTRY RpcNsMgmtSetExpAge(unsigned long);
+RPC_STATUS RPC_ENTRY RpcNsBindingImportNext(RPC_NS_HANDLE,RPC_BINDING_HANDLE*);
+RPC_STATUS RPC_ENTRY RpcNsBindingImportDone(RPC_NS_HANDLE*);
+RPC_STATUS RPC_ENTRY RpcNsBindingSelect(RPC_BINDING_VECTOR*,RPC_BINDING_HANDLE*);
+#ifndef UNICODE_ONLY
+RPC_STATUS RPC_ENTRY RpcNsEntryObjectInqBeginA(unsigned long,unsigned char*,RPC_NS_HANDLE*);
+RPC_STATUS RPC_ENTRY RpcNsBindingImportBeginA(unsigned long,unsigned char*,RPC_IF_HANDLE,UUID*,RPC_NS_HANDLE*);
+#endif
+#ifdef RPC_UNICODE_SUPPORTED
+RPC_STATUS RPC_ENTRY RpcNsBindingExportW(unsigned long,unsigned short*,RPC_IF_HANDLE,RPC_BINDING_VECTOR*,UUID_VECTOR*);
+RPC_STATUS RPC_ENTRY RpcNsBindingUnexportW(unsigned long,unsigned short*,RPC_IF_HANDLE,UUID_VECTOR*);
+RPC_STATUS RPC_ENTRY RpcNsBindingLookupBeginW(unsigned long,unsigned short*,RPC_IF_HANDLE,UUID*,unsigned long,RPC_NS_HANDLE*);
+RPC_STATUS RPC_ENTRY RpcNsGroupDeleteW(unsigned long,unsigned short*);
+RPC_STATUS RPC_ENTRY RpcNsGroupMbrAddW(unsigned long,unsigned short*,unsigned long,unsigned short*);
+RPC_STATUS RPC_ENTRY RpcNsGroupMbrRemoveW(unsigned long,unsigned short*,unsigned long,unsigned short*);
+RPC_STATUS RPC_ENTRY RpcNsGroupMbrInqBeginW(unsigned long,unsigned short*,unsigned long,RPC_NS_HANDLE*);
+RPC_STATUS RPC_ENTRY RpcNsGroupMbrInqNextW(RPC_NS_HANDLE,unsigned short**);
+RPC_STATUS RPC_ENTRY RpcNsProfileDeleteW(unsigned long,unsigned short*);
+RPC_STATUS RPC_ENTRY RpcNsProfileEltAddW(unsigned long,unsigned short*, RPC_IF_ID*,unsigned long,unsigned short*,unsigned long,unsigned short*);
+RPC_STATUS RPC_ENTRY RpcNsProfileEltRemoveW(unsigned long,unsigned short*, RPC_IF_ID*,unsigned long,unsigned short*);
+RPC_STATUS RPC_ENTRY RpcNsProfileEltInqBeginW(unsigned long,unsigned short*, unsigned long,RPC_IF_ID*,unsigned long,unsigned long,unsigned short*, RPC_NS_HANDLE*);
+RPC_STATUS RPC_ENTRY RpcNsProfileEltInqNextW(RPC_NS_HANDLE,RPC_IF_ID*, unsigned short**,unsigned long*,unsigned short**);
+RPC_STATUS RPC_ENTRY RpcNsEntryObjectInqBeginW(unsigned long,unsigned short*,RPC_NS_HANDLE*);
+RPC_STATUS RPC_ENTRY RpcNsEntryExpandNameW(unsigned long,unsigned short*,unsigned short**);
+RPC_STATUS RPC_ENTRY RpcNsMgmtBindingUnexportW(unsigned long,unsigned short*,RPC_IF_ID*,unsigned long,UUID_VECTOR*);
+RPC_STATUS RPC_ENTRY RpcNsMgmtEntryCreateW(unsigned long,unsigned short*);
+RPC_STATUS RPC_ENTRY RpcNsMgmtEntryDeleteW(unsigned long,unsigned short*);
+RPC_STATUS RPC_ENTRY RpcNsMgmtEntryInqIfIdsW(unsigned long,unsigned short , RPC_IF_ID_VECTOR**);
+RPC_STATUS RPC_ENTRY RpcNsBindingImportBeginW(unsigned long,unsigned short*,RPC_IF_HANDLE,UUID*,RPC_NS_HANDLE*);
+#endif /* RPC_UNICODE_SUPPORTED */
+#ifdef UNICODE
+#define RpcNsBindingLookupBegin RpcNsBindingLookupBeginW
+#define RpcNsBindingImportBegin RpcNsBindingImportBeginW
+#define RpcNsBindingExport RpcNsBindingExportW
+#define RpcNsBindingUnexport RpcNsBindingUnexportW
+#define RpcNsGroupDelete RpcNsGroupDeleteW
+#define RpcNsGroupMbrAdd RpcNsGroupMbrAddW
+#define RpcNsGroupMbrRemove RpcNsGroupMbrRemoveW
+#define RpcNsGroupMbrInqBegin RpcNsGroupMbrInqBeginW
+#define RpcNsGroupMbrInqNext RpcNsGroupMbrInqNextW
+#define RpcNsEntryExpandName RpcNsEntryExpandNameW
+#define RpcNsEntryObjectInqBegin RpcNsEntryObjectInqBeginW
+#define RpcNsMgmtBindingUnexport RpcNsMgmtBindingUnexportW
+#define RpcNsMgmtEntryCreate RpcNsMgmtEntryCreateW
+#define RpcNsMgmtEntryDelete RpcNsMgmtEntryDeleteW
+#define RpcNsMgmtEntryInqIfIds RpcNsMgmtEntryInqIfIdsW
+#define RpcNsProfileDelete RpcNsProfileDeleteW
+#define RpcNsProfileEltAdd RpcNsProfileEltAddW
+#define RpcNsProfileEltRemove RpcNsProfileEltRemoveW
+#define RpcNsProfileEltInqBegin RpcNsProfileEltInqBeginW
+#define RpcNsProfileEltInqNext RpcNsProfileEltInqNextW
+#else
+#define RpcNsBindingLookupBegin RpcNsBindingLookupBeginA
+#define RpcNsBindingImportBegin RpcNsBindingImportBeginA
+#define RpcNsBindingExport RpcNsBindingExportA
+#define RpcNsBindingUnexport RpcNsBindingUnexportA
+#define RpcNsGroupDelete RpcNsGroupDeleteA
+#define RpcNsGroupMbrAdd RpcNsGroupMbrAddA
+#define RpcNsGroupMbrRemove RpcNsGroupMbrRemoveA
+#define RpcNsGroupMbrInqBegin RpcNsGroupMbrInqBeginA
+#define RpcNsGroupMbrInqNext RpcNsGroupMbrInqNextA
+#define RpcNsEntryExpandName RpcNsEntryExpandNameA
+#define RpcNsEntryObjectInqBegin RpcNsEntryObjectInqBeginA
+#define RpcNsMgmtBindingUnexport RpcNsMgmtBindingUnexportA
+#define RpcNsMgmtEntryCreate RpcNsMgmtEntryCreateA
+#define RpcNsMgmtEntryDelete RpcNsMgmtEntryDeleteA
+#define RpcNsMgmtEntryInqIfIds RpcNsMgmtEntryInqIfIdsA
+#define RpcNsProfileDelete RpcNsProfileDeleteA
+#define RpcNsProfileEltAdd RpcNsProfileEltAddA
+#define RpcNsProfileEltRemove RpcNsProfileEltRemoveA
+#define RpcNsProfileEltInqBegin RpcNsProfileEltInqBeginA
+#define RpcNsProfileEltInqNext RpcNsProfileEltInqNextA
+#endif
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/winsup/w32api/include/rpcnsip.h b/winsup/w32api/include/rpcnsip.h
new file mode 100644
index 000000000..4f05d297d
--- /dev/null
+++ b/winsup/w32api/include/rpcnsip.h
@@ -0,0 +1,21 @@
+#ifndef _RPCNSIP_H
+#define _RPCNSIP_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+typedef struct {
+ RPC_NS_HANDLE LookupContext;
+ RPC_BINDING_HANDLE ProposedHandle;
+ RPC_BINDING_VECTOR *Bindings;
+} RPC_IMPORT_CONTEXT_P,*PRPC_IMPORT_CONTEXT_P;
+RPC_STATUS RPC_ENTRY I_RpcNsGetBuffer(IN PRPC_MESSAGE);
+RPC_STATUS RPC_ENTRY I_RpcNsSendReceive(IN PRPC_MESSAGE,OUT RPC_BINDING_HANDLE*);
+void RPC_ENTRY I_RpcNsRaiseException(IN PRPC_MESSAGE,IN RPC_STATUS);
+RPC_STATUS RPC_ENTRY I_RpcReBindBuffer(IN PRPC_MESSAGE);
+RPC_STATUS RPC_ENTRY I_NsServerBindSearch();
+RPC_STATUS RPC_ENTRY I_NsClientBindSearch();
+void RPC_ENTRY I_NsClientBindDone();
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/winsup/w32api/include/rpcnterr.h b/winsup/w32api/include/rpcnterr.h
new file mode 100644
index 000000000..6b075ae07
--- /dev/null
+++ b/winsup/w32api/include/rpcnterr.h
@@ -0,0 +1,18 @@
+#ifndef _RPCNTERR_H
+#define _RPCNTERR_H
+#define RPC_S_OK ERROR_SUCCESS
+#define RPC_S_INVALID_ARG ERROR_INVALID_PARAMETER
+#define RPC_S_OUT_OF_MEMORY ERROR_OUTOFMEMORY
+#define RPC_S_OUT_OF_THREADS ERROR_MAX_THRDS_REACHED
+#define RPC_S_INVALID_LEVEL ERROR_INVALID_PARAMETER
+#define RPC_S_BUFFER_TOO_SMALL ERROR_INSUFFICIENT_BUFFER
+#define RPC_S_INVALID_SECURITY_DESC ERROR_INVALID_SECURITY_DESCR
+#define RPC_S_ACCESS_DENIED ERROR_ACCESS_DENIED
+#define RPC_S_SERVER_OUT_OF_MEMORY ERROR_NOT_ENOUGH_SERVER_MEMORY
+#define RPC_X_NO_MEMORY RPC_S_OUT_OF_MEMORY
+#define RPC_X_INVALID_BOUND RPC_S_INVALID_BOUND
+#define RPC_X_INVALID_TAG RPC_S_INVALID_TAG
+#define RPC_X_ENUM_VALUE_TOO_LARGE RPC_X_ENUM_VALUE_OUT_OF_RANGE
+#define RPC_X_SS_CONTEXT_MISMATCH ERROR_INVALID_HANDLE
+#define RPC_X_INVALID_BUFFER ERROR_INVALID_USER_BUFFER
+#endif
diff --git a/winsup/w32api/include/rpcproxy.h b/winsup/w32api/include/rpcproxy.h
new file mode 100644
index 000000000..fa968fc3a
--- /dev/null
+++ b/winsup/w32api/include/rpcproxy.h
@@ -0,0 +1,185 @@
+/*
+ -DREGISTER_PROXY_DLL Generates DllMain, DllRegisterServer, and DllUnregisterServer
+ -DPROXY_CLSID=clsid Specifies a class ID to be used by the proxy DLL.
+ -DPROXY_CLSID_IS={..} Specifies the class ID to be used by the proxy DLL.
+ -DNT35_STRICT No new features
+*/
+#ifndef _RPCPROXY_H
+#define _RPCPROXY_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+#include <rpc.h>
+#include <rpcndr.h>
+#include <string.h>
+
+#define CStdStubBuffer_METHODS CStdStubBuffer_QueryInterface,CStdStubBuffer_AddRef,\
+CStdStubBuffer_Release,CStdStubBuffer_Connect,CStdStubBuffer_Disconnect,CStdStubBuffer_Invoke,\
+CStdStubBuffer_IsIIDSupported,CStdStubBuffer_CountRefs,CStdStubBuffer_DebugServerQueryInterface,\
+CStdStubBuffer_DebugServerRelease
+#define IID_GENERIC_CHECK_IID(name,pIID,index) memcmp(pIID,name##_ProxyVtblList[index]->header.piid,16)
+#define IID_BS_LOOKUP_SETUP int result, low=-1;
+#define IID_BS_LOOKUP_INITIAL_TEST(name,sz,split) if ((result = name##_CHECK_IID(split))>0) { low=sz-split;} else if (!result) { low = split; goto found_label; }
+#define IID_BS_LOOKUP_NEXT_TEST(name,split) if ((result = name##_CHECK_IID(low+split))>=0) { low=low+split; if (!result) goto found_label; }
+#define IID_BS_LOOKUP_RETURN_RESULT(name,sz,index) low+=1; if ((low>=sz )||(result=name##_CHECK_IID(low))) goto not_found_label; found_label: (index)=low; return 1; not_found_label: return 0;
+#define REGISTER_PROXY_DLL_ROUTINES(pProxyFileList, pClsID) \
+HINSTANCE hProxyDll = 0; \
+BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved) \
+{ \
+if(fdwReason == DLL_PROCESS_ATTACH) hProxyDll = hinstDLL; \
+return TRUE; \
+} \
+HRESULT STDAPICALLTYPE DllRegisterServer() \
+{\
+return NdrDllRegisterProxy(hProxyDll, pProxyFileList, pClsID); \
+}\
+HRESULT STDAPICALLTYPE DllUnregisterServer()\
+{\
+return NdrDllUnregisterProxy(hProxyDll, pProxyFileList, pClsID);\
+}
+#ifdef PROXY_CLSID
+#define CLSID_PSFACTORYBUFFER extern CLSID PROXY_CLSID;
+#else
+#ifdef PROXY_CLSID_IS
+#define CLSID_PSFACTORYBUFFER const CLSID CLSID_PSFactoryBuffer = PROXY_CLSID_IS;
+#define PROXY_CLSID CLSID_PSFactoryBuffer
+#else
+#define CLSID_PSFACTORYBUFFER
+#endif
+#endif
+#ifndef PROXY_CLSID
+#define GET_DLL_CLSID (aProxyFileList[0]->pStubVtblList[0] != 0 ? aProxyFileList[0]->pStubVtblList[0]->header.piid : 0)
+#else
+#define GET_DLL_CLSID &PROXY_CLSID
+#endif
+#define EXTERN_PROXY_FILE(name) EXTERN_C const ProxyFileInfo name##_ProxyFileInfo;
+#define PROXYFILE_LIST_START const ProxyFileInfo * aProxyFileList[] = {
+#define REFERENCE_PROXY_FILE(name) & name##_ProxyFileInfo
+#define PROXYFILE_LIST_END 0 };
+#define DLLDATA_GETPROXYDLLINFO(pPFList,pClsid) \
+void RPC_ENTRY GetProxyDllInfo( const ProxyFileInfo*** pInfo, const CLSID ** pId ) \
+{ *pInfo = pPFList; *pId = pClsid; };
+#define DLLGETCLASSOBJECTROUTINE(pPFlist, pClsid,pFactory) HRESULT STDAPICALLTYPE DllGetClassObject(REFCLSID rclsid,REFIID riid,void **ppv) \
+{ return NdrDllGetClassObject(rclsid,riid,ppv,pPFlist,pClsid,pFactory ); }
+#define DLLCANUNLOADNOW(pFactory) HRESULT STDAPICALLTYPE DllCanUnloadNow() \
+{ return NdrDllCanUnloadNow( pFactory ); }
+#define DLLDUMMYPURECALL void __cdecl _purecall(void) { }
+#define CSTDSTUBBUFFERRELEASE(pFactory) ULONG STDMETHODCALLTYPE CStdStubBuffer_Release(IRpcStubBuffer *This) \
+{ return NdrCStdStubBuffer_Release(This,(IPSFactoryBuffer *)pFactory); }
+#ifdef PROXY_DELEGATION
+#define CSTDSTUBBUFFER2RELEASE(pFactory) ULONG STDMETHODCALLTYPE CStdStubBuffer2_Release(IRpcStubBuffer *This) \
+{ return NdrCStdStubBuffer2_Release(This,(IPSFactoryBuffer *)pFactory); }
+#else
+#define CSTDSTUBBUFFER2RELEASE(pFactory)
+#endif
+
+#ifdef REGISTER_PROXY_DLL
+#define DLLREGISTRY_ROUTINES(pProxyFileList,pClsID ) REGISTER_PROXY_DLL_ROUTINES(pProxyFileList,pClsID)
+#else
+#define DLLREGISTRY_ROUTINES(pProxyFileList,pClsID)
+#endif
+#define DLLDATA_ROUTINES(pProxyFileList,pClsID) \
+CLSID_PSFACTORYBUFFER \
+CStdPSFactoryBuffer gPFactory = {0,0,0,0}; \
+DLLDATA_GETPROXYDLLINFO(pProxyFileList,pClsID) \
+DLLGETCLASSOBJECTROUTINE(pProxyFileList,pClsID,&gPFactory) \
+DLLCANUNLOADNOW(&gPFactory) \
+CSTDSTUBBUFFERRELEASE(&gPFactory) \
+CSTDSTUBBUFFER2RELEASE(&gPFactory) \
+DLLDUMMYPURECALL \
+DLLREGISTRY_ROUTINES(pProxyFileList, pClsID)
+
+#define DLLDATA_STANDARD_ROUTINES DLLDATA_ROUTINES( (const ProxyFileInfo**) pProxyFileList, &CLSID_PSFactoryBuffer)
+
+struct tagCInterfaceStubVtbl;
+struct tagCInterfaceProxyVtbl;
+typedef struct tagCInterfaceStubVtbl *PCInterfaceStubVtblList;
+typedef struct tagCInterfaceProxyVtbl *PCInterfaceProxyVtblList;
+typedef const char *PCInterfaceName;
+typedef int __stdcall IIDLookupRtn(const IID*,int*);
+typedef IIDLookupRtn *PIIDLookup;
+typedef struct tagProxyFileInfo {
+ const PCInterfaceProxyVtblList *pProxyVtblList;
+ const PCInterfaceStubVtblList *pStubVtblList;
+ const PCInterfaceName * pNamesArray;
+ const IID ** pDelegatedIIDs;
+ const PIIDLookup pIIDLookupRtn;
+ unsigned short TableSize;
+ unsigned short TableVersion;
+ unsigned long Filler1;
+ unsigned long Filler2;
+ unsigned long Filler3;
+ unsigned long Filler4;
+}ProxyFileInfo;
+typedef ProxyFileInfo ExtendedProxyFileInfo;
+
+typedef struct tagCInterfaceProxyHeader {
+#ifdef USE_STUBLESS_PROXY
+ const void *pStublessProxyInfo;
+#endif
+ const IID *piid;
+} CInterfaceProxyHeader;
+typedef struct tagCInterfaceProxyVtbl {
+ CInterfaceProxyHeader header;
+ void *Vtbl[0];
+} CInterfaceProxyVtbl;
+typedef void (__RPC_STUB *PRPC_STUB_FUNCTION)(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,DWORD*);
+typedef struct tagCInterfaceStubHeader {
+ const IID *piid;
+ const MIDL_SERVER_INFO *pServerInfo;
+ unsigned long DispatchTableCount;
+ const PRPC_STUB_FUNCTION *pDispatchTable;
+} CInterfaceStubHeader;
+typedef struct tagCInterfaceStubVtbl {
+ CInterfaceStubHeader header;
+ IRpcStubBufferVtbl Vtbl;
+} CInterfaceStubVtbl;
+typedef struct tagCStdStubBuffer {
+ const struct IRpcStubBufferVtbl * lpVtbl;
+ long RefCount;
+ struct IUnknown *pvServerObject;
+} CStdStubBuffer;
+typedef struct tagCStdPSFactoryBuffer {
+ const IPSFactoryBufferVtbl *lpVtbl;
+ long RefCount;
+ const ProxyFileInfo ** pProxyFileList;
+ long Filler1;
+} CStdPSFactoryBuffer;
+void RPC_ENTRY NdrProxyInitialize(void*,PRPC_MESSAGE,PMIDL_STUB_MESSAGE,PMIDL_STUB_DESC,unsigned int);
+void RPC_ENTRY NdrProxyGetBuffer(void*,PMIDL_STUB_MESSAGE);
+void RPC_ENTRY NdrProxySendReceive(void*,MIDL_STUB_MESSAGE*);
+void RPC_ENTRY NdrProxyFreeBuffer(void*,MIDL_STUB_MESSAGE*);
+HRESULT RPC_ENTRY NdrProxyErrorHandler(DWORD);
+void RPC_ENTRY NdrStubInitialize(PRPC_MESSAGE,PMIDL_STUB_MESSAGE,PMIDL_STUB_DESC,IRpcChannelBuffer*);
+void __RPC_STUB NdrStubForwardingFunction(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,DWORD*);
+void RPC_ENTRY NdrStubGetBuffer(IRpcStubBuffer*,IRpcChannelBuffer*,PMIDL_STUB_MESSAGE);
+HRESULT RPC_ENTRY NdrStubErrorHandler(DWORD);
+HRESULT STDMETHODCALLTYPE CStdStubBuffer_QueryInterface(IRpcStubBuffer*,REFIID,void**);
+ULONG STDMETHODCALLTYPE CStdStubBuffer_AddRef(IRpcStubBuffer*);
+ULONG STDMETHODCALLTYPE CStdStubBuffer_Release(IRpcStubBuffer*);
+ULONG STDMETHODCALLTYPE NdrCStdStubBuffer_Release(IRpcStubBuffer*,IPSFactoryBuffer*);
+HRESULT STDMETHODCALLTYPE CStdStubBuffer_Connect(IRpcStubBuffer*,IUnknown*);
+void STDMETHODCALLTYPE CStdStubBuffer_Disconnect(IRpcStubBuffer*);
+HRESULT STDMETHODCALLTYPE CStdStubBuffer_Invoke(IRpcStubBuffer*,RPCOLEMESSAGE*,IRpcChannelBuffer*);
+IRpcStubBuffer* STDMETHODCALLTYPE CStdStubBuffer_IsIIDSupported(IRpcStubBuffer*,REFIID);
+ULONG STDMETHODCALLTYPE CStdStubBuffer_CountRefs(IRpcStubBuffer*);
+HRESULT STDMETHODCALLTYPE CStdStubBuffer_DebugServerQueryInterface(IRpcStubBuffer*,void**);
+void STDMETHODCALLTYPE CStdStubBuffer_DebugServerRelease(IRpcStubBuffer*,void*);
+HRESULT RPC_ENTRY NdrDllGetClassObject(REFCLSID,REFIID,void**,const ProxyFileInfo**,const CLSID*,CStdPSFactoryBuffer*);
+HRESULT RPC_ENTRY NdrDllCanUnloadNow(CStdPSFactoryBuffer*);
+#ifndef NT35_STRICT
+HRESULT RPC_ENTRY NdrDllRegisterProxy(HMODULE,const ProxyFileInfo**,const CLSID*);
+HRESULT RPC_ENTRY NdrDllUnregisterProxy(HMODULE,const ProxyFileInfo**,const CLSID*);
+#define STUB_FORWARDING_FUNCTION NdrStubForwardingFunction
+ULONG STDMETHODCALLTYPE
+CStdStubBuffer2_Release(IRpcStubBuffer*);
+ULONG STDMETHODCALLTYPE
+NdrCStdStubBuffer2_Release(IRpcStubBuffer*,IPSFactoryBuffer*);
+#define CStdStubBuffer_DELEGATING_METHODS 0, 0, CStdStubBuffer2_Release, 0, 0, 0, 0, 0, 0, 0
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+#endif
+
diff --git a/winsup/w32api/include/scrnsave.h b/winsup/w32api/include/scrnsave.h
new file mode 100644
index 000000000..30889d0ea
--- /dev/null
+++ b/winsup/w32api/include/scrnsave.h
@@ -0,0 +1,78 @@
+/*
+ Screen saver library by Anders Norlander <anorland@hem2.passagen.se>
+
+ This library is (hopefully) compatible with Microsoft's
+ screen saver library.
+
+ This is public domain software.
+
+ */
+#ifndef _SCRNSAVE_H
+#define _SCRNSAVE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* configure dialog identifier */
+#define DLG_SCRNSAVECONFIGURE 2003
+
+#define idsIsPassword 1000
+#define idsIniFile 1001
+#define idsScreenSaver 1002
+#define idsPassword 1003
+#define idsDifferentPW 1004
+#define idsChangePW 1005
+#define idsBadOldPW 1006
+#define idsAppName 1007
+#define idsNoHelpMemory 1008
+#define idsHelpFile 1009
+#define idsDefKeyword 1010
+
+#define IDS_DESCRIPTION 1
+#define ID_APP 100
+
+#define WS_GT (WS_GROUP | WS_TABSTOP)
+#define SCRM_VERIFYPW WM_APP
+#define MAXFILELEN 13
+#define TITLEBARNAMELEN 40
+#define APPNAMEBUFFERLEN 40
+#define BUFFLEN 255
+
+#ifndef RC_INVOKED
+
+/* functions provided by the aothor of the screen saver */
+BOOL WINAPI ScreenSaverConfigureDialog(HWND,UINT,WPARAM,LPARAM);
+BOOL WINAPI RegisterDialogClasses(HANDLE);
+LONG WINAPI ScreenSaverProc(HWND,UINT,WPARAM,LPARAM);
+
+/* Change name of function if we are using UNICODE */
+#ifdef UNICODE
+#define DefScreenSaverProc DefScreenSaverProcW
+#endif
+
+/* default screen saver proc; call instead of DefWindowProc */
+LONG WINAPI DefScreenSaverProc(HWND,UINT,WPARAM,LPARAM);
+
+/* change password */
+void WINAPI ScreenSaverChangePassword(HWND);
+
+/* globals that may be used by screen saver */
+extern HINSTANCE hMainInstance;
+extern HWND hMainWindow;
+extern BOOL fChildPreview;
+extern TCHAR szName[];
+extern TCHAR szAppName[];
+extern TCHAR szIniFile[];
+extern TCHAR szScreenSaver[];
+extern TCHAR szHelpFile[];
+extern TCHAR szNoHelpMemory[];
+extern UINT MyHelpMessage;
+
+#endif /* RC_INVOKED */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SCRNSAVE_H */
diff --git a/winsup/w32api/include/shellapi.h b/winsup/w32api/include/shellapi.h
new file mode 100644
index 000000000..4e1c9a7dc
--- /dev/null
+++ b/winsup/w32api/include/shellapi.h
@@ -0,0 +1,251 @@
+#ifndef _SHELLAPI_H
+#define _SHELLAPI_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+#define WINSHELLAPI DECLSPEC_IMPORT
+#define ABE_LEFT 0
+#define ABE_TOP 1
+#define ABE_RIGHT 2
+#define ABE_BOTTOM 3
+#define SEE_MASK_CLASSNAME 1
+#define SEE_MASK_CLASSKEY 3
+#define SEE_MASK_IDLIST 4
+#define SEE_MASK_INVOKEIDLIST 12
+#define SEE_MASK_ICON 16
+#define SEE_MASK_HOTKEY 32
+#define SEE_MASK_NOCLOSEPROCESS 64
+#define SEE_MASK_CONNECTNETDRV 128
+#define SEE_MASK_FLAG_DDEWAIT 256
+#define SEE_MASK_DOENVSUBST 512
+#define SEE_MASK_FLAG_NO_UI 1024
+#define SEE_MASK_UNICODE 65536
+#define ABM_NEW 0
+#define ABM_REMOVE 1
+#define ABM_QUERYPOS 2
+#define ABM_SETPOS 3
+#define ABM_GETSTATE 4
+#define ABM_GETTASKBARPOS 5
+#define ABM_ACTIVATE 6
+#define ABM_GETAUTOHIDEBAR 7
+#define ABM_SETAUTOHIDEBAR 8
+#define ABM_WINDOWPOSCHANGED 9
+#define ABN_STATECHANGE 0
+#define ABN_POSCHANGED 1
+#define ABN_FULLSCREENAPP 2
+#define ABN_WINDOWARRANGE 3
+#define NIM_ADD 0
+#define NIM_MODIFY 1
+#define NIM_DELETE 2
+#define NIF_MESSAGE 1
+#define NIF_ICON 2
+#define NIF_TIP 4
+#define SE_ERR_FNF 2
+#define SE_ERR_PNF 3
+#define SE_ERR_ACCESSDENIED 5
+#define SE_ERR_OOM 8
+#define SE_ERR_DLLNOTFOUND 32
+#define SE_ERR_SHARE 26
+#define SE_ERR_ASSOCINCOMPLETE 27
+#define SE_ERR_DDETIMEOUT 28
+#define SE_ERR_DDEFAIL 29
+#define SE_ERR_DDEBUSY 30
+#define SE_ERR_NOASSOC 31
+#define FO_MOVE 1
+#define FO_COPY 2
+#define FO_DELETE 3
+#define FO_RENAME 4
+#define FOF_MULTIDESTFILES 1
+#define FOF_CONFIRMMOUSE 2
+#define FOF_SILENT 4
+#define FOF_RENAMEONCOLLISION 8
+#define FOF_NOCONFIRMATION 16
+#define FOF_WANTMAPPINGHANDLE 32
+#define FOF_ALLOWUNDO 64
+#define FOF_FILESONLY 128
+#define FOF_SIMPLEPROGRESS 256
+#define FOF_NOCONFIRMMKDIR 512
+#define PO_DELETE 19
+#define PO_RENAME 20
+#define PO_PORTCHANGE 32
+#define PO_REN_PORT 52
+#define SHGFI_ICON 256
+#define SHGFI_DISPLAYNAME 512
+#define SHGFI_TYPENAME 1024
+#define SHGFI_ATTRIBUTES 2048
+#define SHGFI_ICONLOCATION 4096
+#define SHGFI_EXETYPE 8192
+#define SHGFI_SYSICONINDEX 16384
+#define SHGFI_LINKOVERLAY 32768
+#define SHGFI_SELECTED 65536
+#define SHGFI_LARGEICON 0
+#define SHGFI_SMALLICON 1
+#define SHGFI_OPENICON 2
+#define SHGFI_SHELLICONSIZE 4
+#define SHGFI_PIDL 8
+#define SHGFI_USEFILEATTRIBUTES 16
+
+typedef WORD FILEOP_FLAGS;
+typedef WORD PRINTEROP_FLAGS;
+typedef struct _AppBarData {
+ DWORD cbSize;
+ HWND hWnd;
+ UINT uCallbackMessage;
+ UINT uEdge;
+ RECT rc;
+ LPARAM lParam;
+} APPBARDATA,*PAPPBARDATA;
+DECLARE_HANDLE(HDROP);
+typedef struct _NOTIFYICONDATAA {
+ DWORD cbSize;
+ HWND hWnd;
+ UINT uID;
+ UINT uFlags;
+ UINT uCallbackMessage;
+ HICON hIcon;
+ CHAR szTip[64];
+} NOTIFYICONDATAA,*PNOTIFYICONDATAA;
+typedef struct _NOTIFYICONDATAW {
+ DWORD cbSize;
+ HWND hWnd;
+ UINT uID;
+ UINT uFlags;
+ UINT uCallbackMessage;
+ HICON hIcon;
+ WCHAR szTip[64];
+} NOTIFYICONDATAW,*PNOTIFYICONDATAW;
+typedef struct _SHELLEXECUTEINFOA {
+ DWORD cbSize;
+ ULONG fMask;
+ HWND hwnd;
+ LPCSTR lpVerb;
+ LPCSTR lpFile;
+ LPCSTR lpParameters;
+ LPCSTR lpDirectory;
+ int nShow;
+ HINSTANCE hInstApp;
+ PVOID lpIDList;
+ LPCSTR lpClass;
+ HKEY hkeyClass;
+ DWORD dwHotKey;
+ HANDLE hIcon;
+ HANDLE hProcess;
+} SHELLEXECUTEINFOA,*LPSHELLEXECUTEINFOA;
+typedef struct _SHELLEXECUTEINFOW {
+ DWORD cbSize;
+ ULONG fMask;
+ HWND hwnd;
+ LPCWSTR lpVerb;
+ LPCWSTR lpFile;
+ LPCWSTR lpParameters;
+ LPCWSTR lpDirectory;
+ int nShow;
+ HINSTANCE hInstApp;
+ PVOID lpIDList;
+ LPCWSTR lpClass;
+ HKEY hkeyClass;
+ DWORD dwHotKey;
+ HANDLE hIcon;
+ HANDLE hProcess;
+} SHELLEXECUTEINFOW,*LPSHELLEXECUTEINFOW;
+typedef struct _SHFILEOPSTRUCTA {
+ HWND hwnd;
+ UINT wFunc;
+ LPCSTR pFrom;
+ LPCSTR pTo;
+ FILEOP_FLAGS fFlags;
+ BOOL fAnyOperationsAborted;
+ PVOID hNameMappings;
+ LPCSTR lpszProgressTitle;
+} SHFILEOPSTRUCTA,*LPSHFILEOPSTRUCTA;
+typedef struct _SHFILEOPSTRUCTW {
+ HWND hwnd;
+ UINT wFunc;
+ LPCWSTR pFrom;
+ LPCWSTR pTo;
+ FILEOP_FLAGS fFlags;
+ BOOL fAnyOperationsAborted;
+ PVOID hNameMappings;
+ LPCWSTR lpszProgressTitle;
+} SHFILEOPSTRUCTW,*LPSHFILEOPSTRUCTW;
+typedef struct _SHFILEINFOA {
+ HICON hIcon;
+ int iIcon;
+ DWORD dwAttributes;
+ CHAR szDisplayName[MAX_PATH];
+ CHAR szTypeName[80];
+} SHFILEINFOA;
+typedef struct _SHFILEINFOW {
+ HICON hIcon;
+ int iIcon;
+ DWORD dwAttributes;
+ WCHAR szDisplayName[MAX_PATH];
+ WCHAR szTypeName[80];
+} SHFILEINFOW;
+
+LPWSTR *CommandLineToArgvW(LPCWSTR,int*);
+void WINAPI DragAcceptFiles(HWND,BOOL);
+void WINAPI DragFinish(HDROP);
+UINT WINAPI DragQueryFileA(HDROP,UINT,LPSTR,UINT);
+UINT WINAPI DragQueryFileW(HDROP,UINT,LPWSTR,UINT);
+BOOL WINAPI DragQueryPoint(HDROP,LPPOINT);
+HICON WINAPI ExtractAssociatedIconA(HINSTANCE,LPCSTR,PWORD);
+HICON WINAPI ExtractAssociatedIconW(HINSTANCE,LPCWSTR,PWORD);
+HICON WINAPI ExtractIconA(HINSTANCE,LPCSTR,UINT);
+HICON WINAPI ExtractIconW(HINSTANCE,LPCWSTR,UINT);
+HICON WINAPI ExtractIconExA(LPCSTR,int,HICON*,HICON*,UINT);
+HICON WINAPI ExtractIconExW(LPCWSTR,int,HICON*,HICON*,UINT);
+HINSTANCE WINAPI FindExecutableA(LPCSTR,LPCSTR,LPSTR);
+HINSTANCE WINAPI FindExecutableW(LPCWSTR,LPCWSTR,LPWSTR);
+UINT WINAPI SHAppBarMessage(DWORD,PAPPBARDATA);
+BOOL WINAPI Shell_NotifyIconA(DWORD,PNOTIFYICONDATAA);
+BOOL WINAPI Shell_NotifyIconW(DWORD,PNOTIFYICONDATAW);
+int WINAPI ShellAboutA(HWND,LPCSTR,LPCSTR,HICON);
+int WINAPI ShellAboutW(HWND,LPCWSTR,LPCWSTR,HICON);
+HINSTANCE WINAPI ShellExecuteA(HWND,LPCSTR,LPCSTR,LPCSTR,LPCSTR,INT);
+HINSTANCE WINAPI ShellExecuteW(HWND,LPCWSTR,LPCWSTR,LPCWSTR,LPCWSTR,INT);
+BOOL WINAPI ShellExecuteExA(LPSHELLEXECUTEINFOA);
+BOOL WINAPI ShellExecuteExW(LPSHELLEXECUTEINFOW);
+int WINAPI SHFileOperationA(LPSHFILEOPSTRUCTA);
+int WINAPI SHFileOperationW(LPSHFILEOPSTRUCTW);
+void WINAPI SHFreeNameMappings(HANDLE);
+DWORD WINAPI SHGetFileInfoA(LPCSTR,DWORD,SHFILEINFOA*,UINT,UINT);
+DWORD WINAPI SHGetFileInfoW(LPCWSTR,DWORD,SHFILEINFOW*,UINT,UINT);
+
+#ifdef UNICODE
+typedef NOTIFYICONDATAW NOTIFYICONDATA,*PNOTIFYICONDATA;
+typedef SHELLEXECUTEINFOW SHELLEXECUTEINFO,*LPSHELLEXECUTEINFO;
+typedef SHFILEOPSTRUCTW SHFILEOPSTRUCT,*LPSHFILEOPSTRUCT;
+typedef SHFILEINFOW SHFILEINFO;
+#define DragQueryFile DragQueryFileW
+#define ExtractAssociatedIcon ExtractAssociatedIconW
+#define ExtractIcon ExtractIconW
+#define ExtractIconEx ExtractIconExW
+#define FindExecutable FindExecutableW
+#define Shell_NotifyIcon Shell_NotifyIconW
+#define ShellAbout ShellAboutW
+#define ShellExecute ShellExecuteW
+#define ShellExecuteEx ShellExecuteExW
+#define SHFileOperation SHFileOperationW
+#define SHGetFileInfo SHGetFileInfoW
+#else
+typedef NOTIFYICONDATAA NOTIFYICONDATA,*PNOTIFYICONDATA;
+typedef SHELLEXECUTEINFOA SHELLEXECUTEINFO,*LPSHELLEXECUTEINFO;
+typedef SHFILEOPSTRUCTA SHFILEOPSTRUCT,*LPSHFILEOPSTRUCT;
+typedef SHFILEINFOA SHFILEINFO;
+#define DragQueryFile DragQueryFileA
+#define ExtractAssociatedIcon ExtractAssociatedIconA
+#define ExtractIcon ExtractIconA
+#define ExtractIconEx ExtractIconExA
+#define FindExecutable FindExecutableA
+#define Shell_NotifyIcon Shell_NotifyIconA
+#define ShellAbout ShellAboutA
+#define ShellExecute ShellExecuteA
+#define ShellExecuteEx ShellExecuteExA
+#define SHFileOperation SHFileOperationA
+#define SHGetFileInfo SHGetFileInfoA
+#endif
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/winsup/w32api/include/shlguid.h b/winsup/w32api/include/shlguid.h
new file mode 100644
index 000000000..d658e6ebc
--- /dev/null
+++ b/winsup/w32api/include/shlguid.h
@@ -0,0 +1,73 @@
+#ifndef _SHLGUID_H
+#define _SHLGUID_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+#define DEFINE_SHLGUID(n,l,w1,w2) DEFINE_GUID(n,l,w1,w2,0xC0,0,0,0,0,0,0,0x46)
+#define SID_SShellBrowser IID_IShellBrowser
+extern const GUID CLSID_ShellDesktop;
+extern const GUID CLSID_ShellLink;
+extern const GUID FMTID_Intshcut;
+extern const GUID FMTID_InternetSite;
+extern const GUID CGID_Explorer;
+extern const GUID CGID_ShellDocView;
+extern const GUID IID_INewShortcutHookA;
+extern const GUID IID_IShellBrowser;
+extern const GUID IID_IShellView;
+extern const GUID IID_IContextMenu;
+extern const GUID IID_IShellIcon;
+extern const GUID IID_IShellFolder;
+extern const GUID IID_IShellExtInit;
+extern const GUID IID_IShellPropSheetExt;
+extern const GUID IID_IPersistFolder;
+extern const GUID IID_IExtractIconA;
+extern const GUID IID_IShellLinkA;
+extern const GUID IID_IShellCopyHookA;
+extern const GUID IID_IFileViewerA;
+extern const GUID IID_ICommDlgBrowser;
+extern const GUID IID_IEnumIDList;
+extern const GUID IID_IFileViewerSite;
+extern const GUID IID_IContextMenu2;
+extern const GUID IID_IShellExecuteHookA;
+extern const GUID IID_IPropSheetPage;
+extern const GUID IID_INewShortcutHookW;
+extern const GUID IID_IFileViewerW;
+extern const GUID IID_IShellLinkW;
+extern const GUID IID_IExtractIconW;
+extern const GUID IID_IShellExecuteHookW;
+extern const GUID IID_IShellCopyHookW;
+extern const GUID IID_IShellView2;
+extern const GUID LIBID_SHDocVw;
+extern const GUID IID_IShellExplorer;
+extern const GUID DIID_DShellExplorerEvents;
+extern const GUID CLSID_ShellExplorer;
+extern const GUID IID_ISHItemOC;
+extern const GUID DIID_DSHItemOCEvents;
+extern const GUID CLSID_SHItemOC;
+extern const GUID IID_DHyperLink;
+extern const GUID IID_DIExplorer;
+extern const GUID DIID_DExplorerEvents;
+extern const GUID CLSID_InternetExplorer;
+extern const GUID CLSID_StdHyperLink;
+extern const GUID CLSID_FileTypes;
+extern const GUID CLSID_InternetShortcut;
+extern const GUID IID_IUniformResourceLocator;
+#ifdef UNICODE
+#define IID_IFileViewer IID_IFileViewerW
+#define IID_IShellLink IID_IShellLinkW
+#define IID_IExtractIcon IID_IExtractIconW
+#define IID_IShellCopyHook IID_IShellCopyHookW
+#define IID_IShellExecuteHook IID_IShellExecuteHookW
+#define IID_INewShortcutHook IID_INewShortcutHookW
+#else
+#define IID_IFileViewer IID_IFileViewerA
+#define IID_IShellLink IID_IShellLinkA
+#define IID_IExtractIcon IID_IExtractIconA
+#define IID_IShellCopyHook IID_IShellCopyHookA
+#define IID_IShellExecuteHook IID_IShellExecuteHookA
+#define IID_INewShortcutHook IID_INewShortcutHookA
+#endif
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/winsup/w32api/include/shlobj.h b/winsup/w32api/include/shlobj.h
new file mode 100644
index 000000000..6ce37ec29
--- /dev/null
+++ b/winsup/w32api/include/shlobj.h
@@ -0,0 +1,695 @@
+#ifndef _SHLOBJ_H
+#define _SHLOBJ_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <ole2.h>
+#include <shlguid.h>
+#include <shellapi.h>
+#pragma pack(push,1)
+#include <commctrl.h>
+
+#define BIF_RETURNONLYFSDIRS 1
+#define BIF_DONTGOBELOWDOMAIN 2
+#define BIF_STATUSTEXT 4
+#define BIF_RETURNFSANCESTORS 8
+#define BIF_BROWSEFORCOMPUTER 0x1000
+#define BIF_BROWSEFORPRINTER 0x2000
+#define BFFM_INITIALIZED 1
+#define BFFM_SELCHANGED 2
+#define BFFM_SETSTATUSTEXT (WM_USER + 100)
+#define BFFM_ENABLEOK (WM_USER + 101)
+#define BFFM_SETSELECTION (WM_USER + 102)
+#define CMIC_MASK_HOTKEY SEE_MASK_HOTKEY
+#define CMIC_MASK_ICON SEE_MASK_ICON
+#define CMIC_MASK_FLAG_NO_UI SEE_MASK_FLAG_NO_UI
+#define CMDSTR_NEWFOLDER "NewFolder"
+#define CMDSTR_VIEWLIST "ViewList"
+#define CMDSTR_VIEWDETAILS "ViewDetails"
+#define DVASPECT_SHORTNAME 2
+#define SHARD_PIDL 1
+#define SHARD_PATH 2
+#define SHCNE_RENAMEITEM 1
+#define SHCNE_CREATE 2
+#define SHCNE_DELETE 4
+#define SHCNE_MKDIR 8
+#define SHCNE_RMDIR 16
+#define SHCNE_MEDIAINSERTED 32
+#define SHCNE_MEDIAREMOVED 64
+#define SHCNE_DRIVEREMOVED 128
+#define SHCNE_DRIVEADD 256
+#define SHCNE_NETSHARE 512
+#define SHCNE_NETUNSHARE 1024
+#define SHCNE_ATTRIBUTES 2048
+#define SHCNE_UPDATEDIR 4096
+#define SHCNE_UPDATEITEM 8192
+#define SHCNE_SERVERDISCONNECT 16384
+#define SHCNE_UPDATEIMAGE 32768
+#define SHCNE_DRIVEADDGUI 65536
+#define SHCNE_RENAMEFOLDER 0x20000
+#define SHCNE_FREESPACE 0x40000
+#define SHCNE_ASSOCCHANGED 0x8000000
+#define SHCNE_DISKEVENTS 0x2381F
+#define SHCNE_GLOBALEVENTS 0xC0581E0
+#define SHCNE_ALLEVENTS 0x7FFFFFFF
+#define SHCNE_INTERRUPT 0x80000000
+#define SHCNF_IDLIST 0
+#define SHCNF_PATH 1
+#define SHCNF_PRINTER 2
+#define SHCNF_DWORD 3
+#define SHCNF_TYPE 0xFF
+#define SHCNF_FLUSH 0x1000
+#define SHCNF_FLUSHNOWAIT 0x2000
+#define SFGAO_CANCOPY DROPEFFECT_COPY
+#define SFGAO_CANMOVE DROPEFFECT_MOVE
+#define SFGAO_CANLINK DROPEFFECT_LINK
+#define SFGAO_CANRENAME 0x00000010L
+#define SFGAO_CANDELETE 0x00000020L
+#define SFGAO_HASPROPSHEET 0x00000040L
+#define SFGAO_DROPTARGET 0x00000100L
+#define SFGAO_CAPABILITYMASK 0x00000177L
+#define SFGAO_LINK 0x00010000L
+#define SFGAO_SHARE 0x00020000L
+#define SFGAO_READONLY 0x00040000L
+#define SFGAO_GHOSTED 0x00080000L
+#define SFGAO_DISPLAYATTRMASK 0x000F0000L
+#define SFGAO_FILESYSANCESTOR 0x10000000L
+#define SFGAO_FOLDER 0x20000000L
+#define SFGAO_FILESYSTEM 0x40000000L
+#define SFGAO_HASSUBFOLDER 0x80000000L
+#define SFGAO_CONTENTSMASK 0x80000000L
+#define SFGAO_VALIDATE 0x01000000L
+#define SFGAO_REMOVABLE 0x02000000L
+#define STRRET_WSTR 0
+#define STRRET_OFFSET 1
+#define STRRET_CSTR 2
+#define SHGDFIL_FINDDATA 1
+#define SHGDFIL_NETRESOURCE 2
+#define SHGDFIL_DESCRIPTIONID 3
+#define SHDID_ROOT_REGITEM 1
+#define SHDID_FS_FILE 2
+#define SHDID_FS_DIRECTORY 3
+#define SHDID_FS_OTHER 4
+#define SHDID_COMPUTER_DRIVE35 5
+#define SHDID_COMPUTER_DRIVE525 6
+#define SHDID_COMPUTER_REMOVABLE 7
+#define SHDID_COMPUTER_FIXED 8
+#define SHDID_COMPUTER_NETDRIVE 9
+#define SHDID_COMPUTER_CDROM 10
+#define SHDID_COMPUTER_RAMDISK 11
+#define SHDID_COMPUTER_OTHER 12
+#define SHDID_NET_DOMAIN 13
+#define SHDID_NET_SERVER 14
+#define SHDID_NET_SHARE 15
+#define SHDID_NET_RESTOFNET 16
+#define SHDID_NET_OTHER 17
+#ifndef REGSTR_PATH_EXPLORER
+#define REGSTR_PATH_EXPLORER "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer"
+#endif
+#define REGSTR_PATH_SPECIAL_FOLDERS REGSTR_PATH_EXPLORER "\\Shell Folders"
+#define CSIDL_DESKTOP 0
+#define CSIDL_PROGRAMS 2
+#define CSIDL_CONTROLS 3
+#define CSIDL_PRINTERS 4
+#define CSIDL_PERSONAL 5
+#define CSIDL_FAVORITES 6
+#define CSIDL_STARTUP 7
+#define CSIDL_RECENT 8
+#define CSIDL_SENDTO 9
+#define CSIDL_BITBUCKET 10
+#define CSIDL_STARTMENU 11
+#define CSIDL_DESKTOPDIRECTORY 16
+#define CSIDL_DRIVES 17
+#define CSIDL_NETWORK 18
+#define CSIDL_NETHOOD 19
+#define CSIDL_FONTS 20
+#define CSIDL_TEMPLATES 21
+#define CFSTR_SHELLIDLIST "Shell IDList Array"
+#define CFSTR_SHELLIDLISTOFFSET "Shell Object Offsets"
+#define CFSTR_NETRESOURCES "Net Resource"
+#define CFSTR_FILEDESCRIPTOR "FileGroupDescriptor"
+#define CFSTR_FILECONTENTS "FileContents"
+#define CFSTR_FILENAME "FileName"
+#define CFSTR_PRINTERGROUP "PrinterFriendlyName"
+#define CFSTR_FILENAMEMAP "FileNameMap"
+#define CMF_NORMAL 0
+#define CMF_DEFAULTONLY 1
+#define CMF_VERBSONLY 2
+#define CMF_EXPLORE 4
+#define CMF_RESERVED 0xffff0000
+#define GCS_VERB 0
+#define GCS_HELPTEXT 1
+#define GCS_VALIDATE 2
+#define CMDSTR_NEWFOLDER "NewFolder"
+#define CMDSTR_VIEWLIST "ViewList"
+#define CMDSTR_VIEWDETAILS "ViewDetails"
+#define CMIC_MASK_HOTKEY SEE_MASK_HOTKEY
+#define CMIC_MASK_ICON SEE_MASK_ICON
+#define CMIC_MASK_FLAG_NO_UI SEE_MASK_FLAG_NO_UI
+#define CMIC_MASK_MODAL 0x80000000
+#define CMIC_VALID_SEE_FLAGS SEE_VALID_CMIC_FLAGS
+#define GIL_OPENICON 1
+#define GIL_FORSHELL 2
+#define GIL_SIMULATEDOC 1
+#define GIL_PERINSTANCE 2
+#define GIL_PERCLASS 4
+#define GIL_NOTFILENAME 8
+#define GIL_DONTCACHE 16
+#define FVSIF_RECT 1
+#define FVSIF_PINNED 2
+#define FVSIF_NEWFAILED 0x8000000
+#define FVSIF_NEWFILE 0x80000000
+#define FVSIF_CANVIEWIT 0x40000000
+#define CDBOSC_SETFOCUS 0
+#define CDBOSC_KILLFOCUS 1
+#define CDBOSC_SELCHANGE 2
+#define CDBOSC_RENAME 3
+#define FCIDM_SHVIEWFIRST 0
+#define FCIDM_SHVIEWLAST 0x7fff
+#define FCIDM_BROWSERFIRST 0xa000
+#define FCIDM_BROWSERLAST 0xbf00
+#define FCIDM_GLOBALFIRST 0x8000
+#define FCIDM_GLOBALLAST 0x9fff
+#define FCIDM_MENU_FILE FCIDM_GLOBALFIRST
+#define FCIDM_MENU_EDIT (FCIDM_GLOBALFIRST+0x0040)
+#define FCIDM_MENU_VIEW (FCIDM_GLOBALFIRST+0x0080)
+#define FCIDM_MENU_VIEW_SEP_OPTIONS (FCIDM_GLOBALFIRST+0x0081)
+#define FCIDM_MENU_TOOLS (FCIDM_GLOBALFIRST+0x00c0)
+#define FCIDM_MENU_TOOLS_SEP_GOTO (FCIDM_GLOBALFIRST+0x00c1)
+#define FCIDM_MENU_HELP (FCIDM_GLOBALFIRST+0x0100)
+#define FCIDM_MENU_FIND (FCIDM_GLOBALFIRST+0x0140)
+#define FCIDM_MENU_EXPLORE (FCIDM_GLOBALFIRST+0x0150)
+#define FCIDM_MENU_FAVORITES (FCIDM_GLOBALFIRST+0x0170) 
+#define FCIDM_TOOLBAR FCIDM_BROWSERFIRST
+#define FCIDM_STATUS (FCIDM_BROWSERFIRST+1)
+#define SBSP_DEFBROWSER 0
+#define SBSP_SAMEBROWSER 1
+#define SBSP_NEWBROWSER 2
+#define SBSP_DEFMODE 0
+#define SBSP_OPENMODE 16
+#define SBSP_EXPLOREMODE 32
+#define SBSP_ABSOLUTE 0
+#define SBSP_RELATIVE 0x1000
+#define SBSP_PARENT 0x2000
+#define SBSP_INITIATEDBYHLINKFRAME 0x80000000
+#define SBSP_REDIRECT 0x40000000
+#define FCW_STATUS 1
+#define FCW_TOOLBAR 2
+#define FCW_TREE 3
+#define FCT_MERGE 1
+#define FCT_CONFIGABLE 2
+#define FCT_ADDTOEND 4
+#define SVSI_DESELECT 0
+#define SVSI_SELECT 1
+#define SVSI_EDIT 3
+#define SVSI_DESELECTOTHERS 4
+#define SVSI_ENSUREVISIBLE 8
+#define SVSI_FOCUSED 16
+#define SVGIO_BACKGROUND 0
+#define SVGIO_SELECTION 1
+#define SVGIO_ALLVIEW 2
+#define SV2GV_CURRENTVIEW ((UINT)-1)
+#define SV2GV_DEFAULTVIEW ((UINT)-2)
+
+typedef struct _IDA {
+ UINT cidl;
+ UINT aoffset[1];
+} CIDA,*LPIDA;
+typedef struct _SHITEMID {
+ USHORT cb;
+ BYTE abID[1];
+} SHITEMID, * LPSHITEMID;
+typedef const SHITEMID *LPCSHITEMID;
+typedef struct _ITEMIDLIST {
+ SHITEMID mkid;
+} ITEMIDLIST,*LPITEMIDLIST;
+typedef const ITEMIDLIST *LPCITEMIDLIST;
+typedef int (CALLBACK* BFFCALLBACK)(HWND,UINT,LPARAM,LPARAM);
+typedef struct _browseinfo {
+ HWND hwndOwner;
+ LPCITEMIDLIST pidlRoot;
+ LPSTR pszDisplayName;
+ LPCSTR lpszTitle;
+ UINT ulFlags;
+ BFFCALLBACK lpfn;
+ LPARAM lParam;
+ int iImage;
+} BROWSEINFO,*PBROWSEINFO,*LPBROWSEINFO;
+typedef struct _CMInvokeCommandInfo {
+ DWORD cbSize;
+ DWORD fMask;
+ HWND hwnd;
+ LPCSTR lpVerb;
+ LPCSTR lpParameters;
+ LPCSTR lpDirectory;
+ int nShow;
+ DWORD dwHotKey;
+ HANDLE hIcon;
+} CMINVOKECOMMANDINFO,*LPCMINVOKECOMMANDINFO;
+typedef struct _DROPFILES {
+ DWORD pFiles;
+ POINT pt;
+ BOOL fNC;
+ BOOL fWide;
+} DROPFILES,*LPDROPFILES;
+typedef enum tagSHGDN {
+ SHGDN_NORMAL=0,
+ SHGDN_INFOLDER,
+ SHGDN_FORPARSING=0x8000
+} SHGNO;
+typedef enum tagSHCONTF {
+ SHCONTF_FOLDERS=32,
+ SHCONTF_NONFOLDERS=64,
+ SHCONTF_INCLUDEHIDDEN=128
+} SHCONTF;
+typedef struct _STRRET {
+ UINT uType;
+ union {
+ LPWSTR pOleStr;
+ UINT uOffset;
+ char cStr[MAX_PATH];
+ } DUMMYUNIONNAME;
+} STRRET,*LPSTRRET;
+typedef enum {
+ FD_CLSID=1,FD_SIZEPOINT=2,FD_ATTRIBUTES=4,FD_CREATETIME=8,FD_ACCESSTIME=16,
+ FD_WRITESTIME=32,FD_FILESIZE=64,FD_LINKUI=0x8000
+} FD_FLAGS;
+typedef struct _FILEDESCRIPTOR {
+ DWORD dwFlags;
+ CLSID clsid;
+ SIZEL sizel;
+ POINTL pointl;
+ DWORD dwFileAttributes;
+ FILETIME ftCreationTime;
+ FILETIME ftLastAccessTime;
+ FILETIME ftLastWriteTime;
+ DWORD nFileSizeHigh;
+ DWORD nFileSizeLow;
+ CHAR cFileName[MAX_PATH];
+} FILEDESCRIPTOR,*LPFILEDESCRIPTOR;
+typedef struct _FILEGROUPDESCRIPTOR {
+ UINT cItems;
+ FILEDESCRIPTOR fgd[1];
+} FILEGROUPDESCRIPTOR,*LPFILEGROUPDESCRIPTOR;
+typedef enum {
+ SLR_NO_UI=1,
+ SLR_ANY_MATCH=2,
+ SLR_UPDATE=4
+} SLR_FLAGS;
+typedef enum {
+ SLGP_SHORTPATH=1,
+ SLGP_UNCPRIORITY
+} SLGP_FLAGS;
+typedef PBYTE LPVIEWSETTINGS;
+typedef enum {
+ FWF_AUTOARRANGE=1,FWF_ABBREVIATEDNAMES=2,FWF_SNAPTOGRID=4,FWF_OWNERDATA=8,
+ FWF_BESTFITWINDOW=16,FWF_DESKTOP=32,FWF_SINGLESEL=64,FWF_NOSUBFOLDERS=128,
+ FWF_TRANSPARENT=256,FWF_NOCLIENTEDGE=512,FWF_NOSCROLL=0x400,FWF_ALIGNLEFT=0x800,
+ FWF_SINGLECLICKACTIVATE=0x8000
+} FOLDERFLAGS;
+typedef enum {
+ FVM_ICON=1,
+ FVM_SMALLICON,
+ FVM_LIST,
+ FVM_DETAILS
+} FOLDERVIEWMODE;
+typedef struct {
+ UINT ViewMode;
+ UINT fFlags;
+} FOLDERSETTINGS,*LPFOLDERSETTINGS;
+typedef const FOLDERSETTINGS *LPCFOLDERSETTINGS;
+typedef struct {
+ DWORD cbSize;
+ HWND hwndOwner;
+ int iShow;
+ DWORD dwFlags;
+ RECT rect;
+ LPUNKNOWN punkRel;
+ OLECHAR strNewFile[MAX_PATH];
+} FVSHOWINFO,*LPFVSHOWINFO;
+typedef struct _NRESARRAY {
+ UINT cItems;
+ NETRESOURCE nr[1];
+} NRESARRAY, *LPNRESARRAY;
+enum { SBSC_HIDE,SBSC_SHOW,SBSC_TOGGLE,SBSC_QUERY };
+enum {
+ SBCMDID_ENABLESHOWTREE,SBCMDID_SHOWCONTROL,SBCMDID_CANCELNAVIGATION,
+ SBCMDID_MAYSAVECHANGES,SBCMDID_SETHLINKFRAME,SBCMDID_ENABLESTOP,SBCMDID_OPTIONS
+};
+typedef enum {
+ SVUIA_DEACTIVATE,SVUIA_ACTIVATE_NOFOCUS,SVUIA_ACTIVATE_FOCUS,
+ SVUIA_INPLACEACTIVATE
+} SVUIA_STATUS;
+
+DECLARE_ENUMERATOR_(IEnumIDList,LPITEMIDLIST);
+typedef IEnumIDList *LPENUMIDLIST;
+
+#undef INTERFACE
+#define INTERFACE IContextMenu
+DECLARE_INTERFACE_(IContextMenu,IUnknown)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(QueryContextMenu)(THIS_ HMENU,UINT,UINT,UINT,UINT) PURE;
+ STDMETHOD(InvokeCommand)(THIS_ LPCMINVOKECOMMANDINFO) PURE;
+ STDMETHOD(GetCommandString)(THIS_ UINT,UINT,PUINT,LPSTR,UINT) PURE;
+};
+typedef IContextMenu *LPCONTEXTMENU;
+
+#undef INTERFACE
+#define INTERFACE IContextMenu2
+DECLARE_INTERFACE_(IContextMenu2,IUnknown)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(QueryContextMenu)(THIS_ HMENU,UINT,UINT,UINT,UINT) PURE;
+ STDMETHOD(HandleMenuMsg)(THIS_ UINT,WPARAM,LPARAM) PURE;
+ STDMETHOD(InvokeCommand)(THIS_ LPCMINVOKECOMMANDINFO) PURE;
+ STDMETHOD(GetCommandString)(THIS_ UINT,UINT,PUINT,LPSTR,UINT) PURE;
+};
+typedef IContextMenu2 *LPCONTEXTMENU2;
+
+#undef INTERFACE
+#define INTERFACE IShellExtInit
+DECLARE_INTERFACE_(IShellExtInit, IUnknown)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(Initialize)(THIS_ LPCITEMIDLIST,LPDATAOBJECT,HKEY) PURE;
+};
+typedef IShellExtInit *LPSHELLEXTINIT;
+
+#undef INTERFACE
+#define INTERFACE IShellPropSheetExt
+DECLARE_INTERFACE_(IShellPropSheetExt, IUnknown)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(AddPages)(THIS_ LPFNADDPROPSHEETPAGE,LPARAM) PURE;
+ STDMETHOD(ReplacePage)(THIS_ UINT,LPFNADDPROPSHEETPAGE,LPARAM) PURE;
+};
+typedef IShellPropSheetExt *LPSHELLPROPSHEETEXT;
+
+#undef INTERFACE
+#define INTERFACE IExtractIcon
+DECLARE_INTERFACE_(IExtractIcon, IUnknown) // exic
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(GetIconLocation)(THIS_ UINT,LPSTR,UINT,int*,PUINT) PURE;
+ STDMETHOD(Extract)(THIS_ LPCSTR,UINT,HICON*,HICON*,UINT) PURE;
+};
+typedef IExtractIcon *LPEXTRACTICON;
+
+#undef INTERFACE
+#define INTERFACE IShellLinkA
+DECLARE_INTERFACE_(IShellLinkA, IUnknown)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(GetPath)(THIS_ LPSTR,int,LPWIN32_FIND_DATAA*,DWORD) PURE;
+ STDMETHOD(GetIDList)(THIS_ LPITEMIDLIST*) PURE;
+ STDMETHOD(SetIDList)(THIS_ LPCITEMIDLIST) PURE;
+ STDMETHOD(GetDescription)(THIS_ LPSTR,int) PURE;
+ STDMETHOD(SetDescription)(THIS_ LPCSTR) PURE;
+ STDMETHOD(GetWorkingDirectory)(THIS_ LPSTR,int) PURE;
+ STDMETHOD(SetWorkingDirectory)(THIS_ LPCSTR) PURE;
+ STDMETHOD(GetArguments)(THIS_ LPSTR,int) PURE;
+ STDMETHOD(SetArguments)(THIS_ LPCSTR) PURE;
+ STDMETHOD(GetHotkey)(THIS_ PWORD) PURE;
+ STDMETHOD(SetHotkey)(THIS_ WORD) PURE;
+ STDMETHOD(GetShowCmd)(THIS_ int*) PURE;
+ STDMETHOD(SetShowCmd)(THIS_ int) PURE;
+ STDMETHOD(GetIconLocation)(THIS_ LPSTR,int,int*) PURE;
+ STDMETHOD(SetIconLocation)(THIS_ LPCSTR,int) PURE;
+ STDMETHOD(SetRelativePath)(THIS_ LPCSTR ,DWORD) PURE;
+ STDMETHOD(Resolve)(THIS_ HWND,DWORD) PURE;
+ STDMETHOD(SetPath)(THIS_ LPCSTR) PURE;
+};
+#undef INTERFACE
+#define INTERFACE IShellLinkW
+DECLARE_INTERFACE_(IShellLinkW, IUnknown)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(GetPath)(THIS_ LPSTR,int,LPWIN32_FIND_DATAW*,DWORD) PURE;
+ STDMETHOD(GetIDList)(THIS_ LPITEMIDLIST*) PURE;
+ STDMETHOD(SetIDList)(THIS_ LPCITEMIDLIST) PURE;
+ STDMETHOD(GetDescription)(THIS_ LPWSTR,int) PURE;
+ STDMETHOD(SetDescription)(THIS_ LPCWSTR) PURE;
+ STDMETHOD(GetWorkingDirectory)(THIS_ LPWSTR,int) PURE;
+ STDMETHOD(SetWorkingDirectory)(THIS_ LPCWSTR) PURE;
+ STDMETHOD(GetArguments)(THIS_ LPWSTR,int) PURE;
+ STDMETHOD(SetArguments)(THIS_ LPCWSTR) PURE;
+ STDMETHOD(GetHotkey)(THIS_ PWORD) PURE;
+ STDMETHOD(SetHotkey)(THIS_ WORD) PURE;
+ STDMETHOD(GetShowCmd)(THIS_ int*) PURE;
+ STDMETHOD(SetShowCmd)(THIS_ int) PURE;
+ STDMETHOD(GetIconLocation)(THIS_ LPWSTR,int,int*) PURE;
+ STDMETHOD(SetIconLocation)(THIS_ LPCWSTR,int) PURE;
+ STDMETHOD(SetRelativePath)(THIS_ LPCWSTR ,DWORD) PURE;
+ STDMETHOD(Resolve)(THIS_ HWND,DWORD) PURE;
+ STDMETHOD(SetPath)(THIS_ LPCWSTR) PURE;
+};
+
+#undef INTERFACE
+#define INTERFACE IShellFolder
+DECLARE_INTERFACE_(IShellFolder, IUnknown)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(ParseDisplayName)(THIS_ HWND,LPBC,LPOLESTR,PULONG,LPITEMIDLIST*,PULONG) PURE;
+ STDMETHOD(EnumObjects)(THIS_ HWND,DWORD,LPENUMIDLIST*) PURE;
+ STDMETHOD(BindToObject)(THIS_ LPCITEMIDLIST,LPBC,REFIID,PVOID*) PURE;
+ STDMETHOD(BindToStorage)(THIS_ LPCITEMIDLIST,LPBC,REFIID,PVOID*) PURE;
+ STDMETHOD(CompareIDs)(THIS_ LPARAM,LPCITEMIDLIST,LPCITEMIDLIST) PURE;
+ STDMETHOD(CreateViewObject)(THIS_ HWND,REFIID,PVOID*) PURE;
+ STDMETHOD(GetAttributesOf)(THIS_ UINT,LPCITEMIDLIST*,PULONG) PURE;
+ STDMETHOD(GetUIObjectOf)(THIS_ HWND,UINT,LPCITEMIDLIST*,REFIID,PUINT,PVOID*) PURE;
+ STDMETHOD(GetDisplayNameOf)(THIS_ LPCITEMIDLIST,DWORD,LPSTRRET) PURE;
+ STDMETHOD(SetNameOf)(THIS_ HWND,LPCITEMIDLIST,LPCOLESTR,DWORD,LPITEMIDLIST*) PURE;
+};
+typedef IShellFolder *LPSHELLFOLDER;
+
+#undef INTERFACE
+#define INTERFACE ICopyHook
+DECLARE_INTERFACE_(ICopyHook, IUnknown)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD_(UINT,CopyCallback)(THIS_ HWND,UINT,UINT,LPCSTR,DWORD,LPCSTR,DWORD) PURE;
+};
+typedef ICopyHook *LPCOPYHOOK;
+
+#undef INTERFACE
+#define INTERFACE IFileViewerSite
+DECLARE_INTERFACE(IFileViewerSite)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(SetPinnedWindow)(THIS_ HWND) PURE;
+ STDMETHOD(GetPinnedWindow)(THIS_ HWND*) PURE;
+};
+typedef IFileViewerSite *LPFILEVIEWERSITE;
+
+#undef INTERFACE
+#define INTERFACE IFileViewer
+DECLARE_INTERFACE(IFileViewer)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(ShowInitialize)(THIS_ LPFILEVIEWERSITE) PURE;
+ STDMETHOD(Show)(THIS_ LPFVSHOWINFO) PURE;
+ STDMETHOD(PrintTo)(THIS_ LPSTR,BOOL) PURE;
+};
+typedef IFileViewer *LPFILEVIEWER;
+
+#undef INTERFACE
+#define INTERFACE ICommDlgBrowser
+DECLARE_INTERFACE_(ICommDlgBrowser,IUnknown)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(OnDefaultCommand)(THIS) PURE;
+ STDMETHOD(OnStateChange)(THIS_ ULONG) PURE;
+ STDMETHOD(IncludeObject)(THIS_ LPCITEMIDLIST) PURE;
+};
+typedef ICommDlgBrowser *LPCOMMDLGBROWSER;
+
+#undef INTERFACE
+#define INTERFACE IPersistFolder
+DECLARE_INTERFACE_(IPersistFolder,IPersist)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(GetClassID)(THIS_ CLSID) PURE;
+ STDMETHOD(Initialize)(THIS_ LPCITEMIDLIST) PURE;
+};
+typedef IPersistFolder *LPPERSISTFOLDER;
+
+typedef interface IShellBrowser *LPSHELLBROWSER;
+typedef interface IShellView *LPSHELLVIEW;
+
+#undef INTERFACE
+#define INTERFACE IShellBrowser
+DECLARE_INTERFACE_(IShellBrowser,IOleWindow)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(GetWindow)(THIS_ HWND*) PURE;
+ STDMETHOD(ContextSensitiveHelp)(THIS_ BOOL) PURE;
+ STDMETHOD(InsertMenusSB)(THIS_ HMENU,LPOLEMENUGROUPWIDTHS) PURE;
+ STDMETHOD(SetMenuSB)(THIS_ HMENU,HOLEMENU,HWND) PURE;
+ STDMETHOD(RemoveMenusSB)(THIS_ HMENU) PURE;
+ STDMETHOD(SetStatusTextSB) (THIS_ LPCOLESTR) PURE;
+ STDMETHOD(EnableModelessSB) (THIS_ BOOL ) PURE;
+ STDMETHOD(TranslateAcceleratorSB) (THIS_ LPMSG,WORD) PURE;
+ STDMETHOD(BrowseObject)(THIS_ LPCITEMIDLIST,UINT) PURE;
+ STDMETHOD(GetViewStateStream)(THIS_ DWORD,LPSTREAM*) PURE;
+ STDMETHOD(GetControlWindow)(THIS_ UINT,HWND*) PURE;
+ STDMETHOD(SendControlMsg)(THIS_ UINT,UINT,WPARAM,LPARAM,LRESULT*) PURE;
+ STDMETHOD(QueryActiveShellView)(THIS_ LPSHELLVIEW*) PURE;
+ STDMETHOD(OnViewWindowActive)(THIS_ LPSHELLVIEW) PURE;
+ STDMETHOD(SetToolbarItems)(THIS_ LPTBBUTTON,UINT,UINT) PURE;
+};
+
+#undef INTERFACE
+#define INTERFACE IShellView
+DECLARE_INTERFACE_(IShellView,IOleWindow)
+{
+
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(GetWindow)(THIS_ HWND*) PURE;
+ STDMETHOD(ContextSensitiveHelp)(THIS_ BOOL) PURE;
+ STDMETHOD(TranslateAccelerator) (THIS_ LPMSG) PURE;
+#ifdef _FIX_ENABLEMODELESS_CONFLICT
+ STDMETHOD(EnableModelessSV)(THIS_ BOOL) PURE;
+#else
+ STDMETHOD(EnableModeless)(THIS_ BOOL) PURE;
+#endif
+ STDMETHOD(UIActivate)(THIS_ UINT) PURE;
+ STDMETHOD(Refresh) (THIS) PURE;
+ STDMETHOD(CreateViewWindow)(THIS_ IShellView*,LPCFOLDERSETTINGS,LPSHELLBROWSER,RECT*,HWND*) PURE;
+ STDMETHOD(DestroyViewWindow)(THIS) PURE;
+ STDMETHOD(GetCurrentInfo)(THIS_ LPFOLDERSETTINGS) PURE;
+ STDMETHOD(AddPropertySheetPages)(THIS_ DWORD,LPFNADDPROPSHEETPAGE,LPARAM) PURE;
+ STDMETHOD(SaveViewState)(THIS) PURE;
+ STDMETHOD(SelectItem)(THIS_ LPCITEMIDLIST,UINT) PURE;
+ STDMETHOD(GetItemObject)(THIS_ UINT,REFIID,PVOID*) PURE;
+};
+typedef GUID SHELLVIEWID;
+typedef struct _SV2CVW2_PARAMS {
+ DWORD cbSize;
+ IShellView *psvPrev;
+ FOLDERSETTINGS const *pfs;
+ IShellBrowser *psbOwner;
+ RECT *prcView;
+ SHELLVIEWID const *pvid;
+ HWND hwndView;
+} SV2CVW2_PARAMS,*LPSV2CVW2_PARAMS;
+#undef INTERFACE
+#define INTERFACE IShellView2
+DECLARE_INTERFACE_(IShellView2,IShellView)
+{
+
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(GetWindow)(THIS_ HWND*) PURE;
+ STDMETHOD(ContextSensitiveHelp)(THIS_ BOOL) PURE;
+ STDMETHOD(TranslateAccelerator) (THIS_ LPMSG) PURE;
+#ifdef _FIX_ENABLEMODELESS_CONFLICT
+ STDMETHOD(EnableModelessSV)(THIS_ BOOL) PURE;
+#else
+ STDMETHOD(EnableModeless)(THIS_ BOOL) PURE;
+#endif
+ STDMETHOD(UIActivate)(THIS_ UINT) PURE;
+ STDMETHOD(Refresh) (THIS) PURE;
+ STDMETHOD(CreateViewWindow)(THIS_ IShellView*,LPCFOLDERSETTINGS,LPSHELLBROWSER,RECT*,HWND*) PURE;
+ STDMETHOD(DestroyViewWindow)(THIS) PURE;
+ STDMETHOD(GetCurrentInfo)(THIS_ LPFOLDERSETTINGS) PURE;
+ STDMETHOD(AddPropertySheetPages)(THIS_ DWORD,LPFNADDPROPSHEETPAGE,LPARAM) PURE;
+ STDMETHOD(SaveViewState)(THIS) PURE;
+ STDMETHOD(SelectItem)(THIS_ LPCITEMIDLIST,UINT) PURE;
+ STDMETHOD(GetItemObject)(THIS_ UINT,REFIID,PVOID*) PURE;
+ STDMETHOD(GetView)(THIS_ SHELLVIEWID*,ULONG) PURE;
+ STDMETHOD(CreateViewWindow2)(THIS_ LPSV2CVW2_PARAMS) PURE;
+};
+
+#undef INTERFACE
+#define INTERFACE IShellExecuteHookA
+DECLARE_INTERFACE_(IShellExecuteHookA,IUnknown)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(Execute)(THIS_ LPSHELLEXECUTEINFOA) PURE;
+};
+#undef INTERFACE
+#define INTERFACE IShellExecuteHookW
+DECLARE_INTERFACE_(IShellExecuteHookW,IUnknown)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(Execute)(THIS_ LPSHELLEXECUTEINFOW) PURE;
+};
+
+#undef INTERFACE
+#define INTERFACE IShellIcon
+DECLARE_INTERFACE_(IShellIcon,IUnknown)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(GetIconOf)(THIS_ LPCITEMIDLIST,UINT,PINT) PURE;
+};
+typedef IShellIcon *LPSHELLICON;
+
+void WINAPI SHAddToRecentDocs(UINT,PCVOID);
+LPITEMIDLIST WINAPI SHBrowseForFolder(PBROWSEINFO);
+void WINAPI SHChangeNotify(LONG,UINT,PCVOID,PCVOID);
+HRESULT WINAPI ShGetDataFromIDListA(LPSHELLFOLDER,LPCITEMIDLIST,int,PVOID,int);
+HRESULT WINAPI ShGetDataFromIDListW(LPSHELLFOLDER,LPCITEMIDLIST,int,PVOID,int);
+HRESULT WINAPI SHGetDesktopFolder(LPSHELLFOLDER*);
+HRESULT WINAPI SHGetInstanceExplorer(LPUNKNOWN);
+HRESULT WINAPI SHGetMalloc(LPMALLOC*);
+BOOL WINAPI SHGetPathFromIDList(LPCITEMIDLIST,LPSTR);
+HRESULT WINAPI SHGetSpecialFolderLocation(HWND,int,LPITEMIDLIST*);
+HRESULT WINAPI SHLoadInProc(REFCLSID);
+
+#ifdef UNICODE
+typedef IShellExecuteHookW IShellExecuteHook;
+typedef IShellLinkW IShellLink;
+#define ShGetDataFromIDList ShGetDataFromIDListW
+#else
+typedef IShellExecuteHookA IShellExecuteHook;
+typedef IShellLinkA IShellLink;
+#define ShGetDataFromIDList ShGetDataFromIDListA
+#endif
+
+#pragma pack(pop)
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* _SHLOBJ_H */
diff --git a/winsup/w32api/include/sql.h b/winsup/w32api/include/sql.h
new file mode 100644
index 000000000..cbad41d3a
--- /dev/null
+++ b/winsup/w32api/include/sql.h
@@ -0,0 +1,705 @@
+#ifndef _SQL_H
+#define _SQL_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+#ifndef ODBCVER
+#define ODBCVER 0x0250
+#endif
+#include "sqltypes.h"
+/* FIXME! */
+#define SQL_SPEC_MAJOR (ODBCVER/0x100)
+#define SQL_SPEC_MINOR (ODBCVER&0xFF00)
+#define SQL_SPEC_STRING "02.50"
+#define SQL_ACCESSIBLE_PROCEDURES 20
+#define SQL_ACCESSIBLE_TABLES 19
+#define SQL_ACCESS_MODE 101
+#define SQL_ACTIVE_CONNECTIONS 0
+#define SQL_ACTIVE_STATEMENTS 1
+#define SQL_ALL_EXCEPT_LIKE 2
+#define SQL_ALL_TYPES 0
+#define SQL_ALTER_TABLE 86
+#define SQL_API_ALL_FUNCTIONS 0
+#define SQL_API_LOADBYORDINAL 199
+#define SQL_API_SQLALLOCCONNECT 1
+#define SQL_API_SQLALLOCENV 2
+#define SQL_API_SQLALLOCSTMT 3
+#define SQL_API_SQLBINDCOL 4
+#define SQL_API_SQLBINDPARAMETER 72
+#define SQL_API_SQLBROWSECONNECT 55
+#define SQL_API_SQLCANCEL 5
+#define SQL_API_SQLCOLATTRIBUTES 6
+#define SQL_API_SQLCOLUMNPRIVILEGES 56
+#define SQL_API_SQLCOLUMNS 40
+#define SQL_API_SQLCONNECT 7
+#define SQL_API_SQLDATASOURCES 57
+#define SQL_API_SQLDESCRIBECOL 8
+#define SQL_API_SQLDESCRIBEPARAM 58
+#define SQL_API_SQLDISCONNECT 9
+#define SQL_API_SQLDRIVERCONNECT 41
+#define SQL_API_SQLDRIVERS 71
+#define SQL_API_SQLERROR 10
+#define SQL_API_SQLEXECDIRECT 11
+#define SQL_API_SQLEXECUTE 12
+#define SQL_API_SQLEXTENDEDFETCH 59
+#define SQL_API_SQLFETCH 13
+#define SQL_API_SQLFOREIGNKEYS 60
+#define SQL_API_SQLFREECONNECT 14
+#define SQL_API_SQLFREEENV 15
+#define SQL_API_SQLFREESTMT 16
+#define SQL_API_SQLGETCONNECTOPTION 42
+#define SQL_API_SQLGETCURSORNAME 17
+#define SQL_API_SQLGETDATA 43
+#define SQL_API_SQLGETFUNCTIONS 44
+#define SQL_API_SQLGETINFO 45
+#define SQL_API_SQLGETSTMTOPTION 46
+#define SQL_API_SQLGETTYPEINFO 47
+#define SQL_API_SQLMORERESULTS 61
+#define SQL_API_SQLNATIVESQL 62
+#define SQL_API_SQLNUMPARAMS 63
+#define SQL_API_SQLNUMRESULTCOLS 18
+#define SQL_API_SQLPARAMDATA 48
+#define SQL_API_SQLPARAMOPTIONS 64
+#define SQL_API_SQLPREPARE 19
+#define SQL_API_SQLPRIMARYKEYS 65
+#define SQL_API_SQLPROCEDURECOLUMNS 66
+#define SQL_API_SQLPROCEDURES 67
+#define SQL_API_SQLPUTDATA 49
+#define SQL_API_SQLROWCOUNT 20
+#define SQL_API_SQLSETCONNECTOPTION 50
+#define SQL_API_SQLSETCURSORNAME 21
+#define SQL_API_SQLSETPARAM 22
+#define SQL_API_SQLSETPOS 68
+#define SQL_API_SQLSETSCROLLOPTIONS 69
+#define SQL_API_SQLSETSTMTOPTION 51
+#define SQL_API_SQLSPECIALCOLUMNS 52
+#define SQL_API_SQLSTATISTICS 53
+#define SQL_API_SQLTABLEPRIVILEGES 70
+#define SQL_API_SQLTABLES 54
+#define SQL_API_SQLTRANSACT 23
+#define SQL_ASYNC_ENABLE_OFF 0
+#define SQL_ASYNC_ENABLE_ON 1
+#define SQL_ASYNC_ENABLE 4
+#define SQL_ASYNC_ENABLE_DEFAULT SQL_ASYNC_ENABLE_OFF
+#define SQL_ATTR_READONLY 0
+#define SQL_ATTR_READWRITE_UNKNOWN 2
+#define SQL_ATTR_WRITE 1
+#define SQL_AT_ADD_COLUMN 1
+#define SQL_AT_DROP_COLUMN 2
+#define SQL_AUTOCOMMIT 102
+#define SQL_AUTOCOMMIT_DEFAULT SQL_AUTOCOMMIT_ON
+#define SQL_AUTOCOMMIT_OFF 0UL
+#define SQL_AUTOCOMMIT_ON 1UL
+#define SQL_BEST_ROWID 1
+#define SQL_BIGINT (-5)
+#define SQL_BINARY (-2)
+#define SQL_BIND_BY_COLUMN 0UL
+#define SQL_BIND_TYPE 5
+#define SQL_BIND_TYPE_DEFAULT SQL_BIND_BY_COLUMN
+#define SQL_BIT (-7)
+#define SQL_BOOKMARK_PERSISTENCE 82
+#define SQL_BP_CLOSE 1
+#define SQL_BP_DELETE 2
+#define SQL_BP_DROP 4
+#define SQL_BP_OTHER_HSTMT 32
+#define SQL_BP_SCROLL 64
+#define SQL_BP_TRANSACTION 8
+#define SQL_BP_UPDATE 16
+#define SQL_CB_CLOSE 1
+#define SQL_CB_DELETE 0
+#define SQL_CB_NON_NULL 1
+#define SQL_CB_NULL 0
+#define SQL_CB_PRESERVE 2
+#define SQL_CC_CLOSE SQL_CB_CLOSE
+#define SQL_CC_DELETE SQL_CB_DELETE
+#define SQL_CC_PRESERVE SQL_CB_PRESERVE
+#define SQL_CHAR 1
+#define SQL_CLOSE 0
+#define SQL_CN_ANY 2
+#define SQL_CN_DIFFERENT 1
+#define SQL_CN_NONE 0
+#define SQL_COLUMN_ALIAS 87
+#define SQL_COLUMN_AUTO_INCREMENT 11
+#define SQL_COLUMN_CASE_SENSITIVE 12
+#define SQL_COLUMN_COUNT 0
+#define SQL_COLUMN_DISPLAY_SIZE 6
+#define SQL_COLUMN_DRIVER_START 1000
+#define SQL_COLUMN_LABEL 18
+#define SQL_COLUMN_LENGTH 3
+#define SQL_COLUMN_MONEY 9
+#define SQL_COLUMN_NAME 1
+#define SQL_COLUMN_NULLABLE 7
+#define SQL_COLUMN_OWNER_NAME 16
+#define SQL_COLUMN_PRECISION 4
+#define SQL_COLUMN_QUALIFIER_NAME 17
+#define SQL_COLUMN_SCALE 5
+#define SQL_COLUMN_SEARCHABLE 13
+#define SQL_COLUMN_TABLE_NAME 15
+#define SQL_COLUMN_TYPE 2
+#define SQL_COLUMN_TYPE_NAME 14
+#define SQL_COLUMN_UNSIGNED 8
+#define SQL_COLUMN_UPDATABLE 10
+#define SQL_COLATT_OPT_MAX SQL_COLUMN_LABEL
+#define SQL_COLATT_OPT_MIN SQL_COLUMN_COUNT
+#define SQL_COMMIT 0
+#define SQL_CONCAT_NULL_BEHAVIOR 22
+#define SQL_CONCURRENCY 7
+#define SQL_CONCUR_READ_ONLY 1
+#define SQL_CONCUR_ROWVER 3
+#define SQL_CONCUR_DEFAULT SQL_CONCUR_READ_ONLY
+#define SQL_CONCUR_LOCK 2
+#define SQL_CONCUR_TIMESTAMP SQL_CONCUR_ROWVER
+#define SQL_CONCUR_VALUES 4
+#define SQL_CONNECT_OPT_DRVR_START 1000
+#define SQL_PACKET_SIZE 112
+#define SQL_CONN_OPT_MAX SQL_PACKET_SIZE
+#define SQL_CONN_OPT_MIN SQL_ACCESS_MODE
+#define SQL_CONVERT_BIGINT 53
+#define SQL_CONVERT_BINARY 54
+#define SQL_CONVERT_BIT 55
+#define SQL_CONVERT_CHAR 56
+#define SQL_CONVERT_DATE 57
+#define SQL_CONVERT_DECIMAL 58
+#define SQL_CONVERT_DOUBLE 59
+#define SQL_CONVERT_FLOAT 60
+#define SQL_CONVERT_FUNCTIONS 48
+#define SQL_CONVERT_INTEGER 61
+#define SQL_CONVERT_LONGVARBINARY 71
+#define SQL_CONVERT_LONGVARCHAR 62
+#define SQL_CONVERT_NUMERIC 63
+#define SQL_CONVERT_REAL 64
+#define SQL_CONVERT_SMALLINT 65
+#define SQL_CONVERT_TIME 66
+#define SQL_CONVERT_TIMESTAMP 67
+#define SQL_CONVERT_TINYINT 68
+#define SQL_CONVERT_VARBINARY 69
+#define SQL_CONVERT_VARCHAR 70
+#define SQL_CORRELATION_NAME 74
+#define SQL_CR_CLOSE SQL_CB_CLOSE
+#define SQL_CR_DELETE SQL_CB_DELETE
+#define SQL_CR_PRESERVE SQL_CB_PRESERVE
+#define SQL_CURRENT_QUALIFIER 109
+#define SQL_CUR_DEFAULT SQL_CUR_USE_DRIVER
+#define SQL_CUR_USE_DRIVER 2UL
+#define SQL_CUR_USE_IF_NEEDED 0UL
+#define SQL_CUR_USE_ODBC 1UL
+#define SQL_CURSOR_COMMIT_BEHAVIOR 23
+#define SQL_CURSOR_DYNAMIC 2UL
+#define SQL_CURSOR_FORWARD_ONLY 0UL
+#define SQL_CURSOR_KEYSET_DRIVEN 1UL
+#define SQL_CURSOR_ROLLBACK_BEHAVIOR 24
+#define SQL_CURSOR_STATIC 3UL
+#define SQL_CURSOR_TYPE 6
+#define SQL_CURSOR_TYPE_DEFAULT SQL_CURSOR_FORWARD_ONLY
+#define SQL_CVT_BIGINT 0x00004000L
+#define SQL_CVT_BINARY 0x00000400L
+#define SQL_CVT_BIT 0x00001000L
+#define SQL_CVT_CHAR 1
+#define SQL_CVT_DATE 0x00008000L
+#define SQL_CVT_DECIMAL 4
+#define SQL_CVT_DOUBLE 128
+#define SQL_CVT_FLOAT 32
+#define SQL_CVT_INTEGER 8
+#define SQL_CVT_LONGVARBINARY 0x00040000L
+#define SQL_CVT_LONGVARCHAR 512
+#define SQL_CVT_NUMERIC 2
+#define SQL_CVT_REAL 64
+#define SQL_CVT_SMALLINT 16
+#define SQL_CVT_TIME 0x10000L
+#define SQL_CVT_TIMESTAMP 0x20000L
+#define SQL_CVT_TINYINT 0x2000L
+#define SQL_CVT_VARBINARY 0x800L
+#define SQL_CVT_VARCHAR 256
+#define SQL_DATABASE_NAME 16
+#define SQL_DATA_AT_EXEC (-2)
+#define SQL_DATA_SOURCE_NAME 2
+#define SQL_DATA_SOURCE_READ_ONLY 25
+#define SQL_DATE 9
+#define SQL_DBMS_NAME 17
+#define SQL_DBMS_VER 18
+#define SQL_DECIMAL 3
+#define SQL_DEFAULT_TXN_ISOLATION 26
+#define SQL_DOUBLE 8
+#define SQL_DRIVER_HDBC 3
+#define SQL_DRIVER_HENV 4
+#define SQL_DRIVER_HLIB 76
+#define SQL_DRIVER_HSTMT 5
+#define SQL_DRIVER_NAME 6
+#define SQL_DRIVER_ODBC_VER 77
+#define SQL_DRIVER_VER 7
+#define SQL_DROP 1
+#define SQL_ENSURE 1
+#define SQL_ERROR (-1)
+#define SQL_EXPRESSIONS_IN_ORDERBY 27
+#define SQL_EXT_API_LAST SQL_API_SQLBINDPARAMETER
+#define SQL_EXT_API_START 40
+#define SQL_FD_FETCH_ABSOLUTE 16
+#define SQL_FD_FETCH_BOOKMARK 128
+#define SQL_FD_FETCH_FIRST 2
+#define SQL_FD_FETCH_LAST 4
+#define SQL_FD_FETCH_NEXT 1
+#define SQL_FD_FETCH_PREV SQL_FD_FETCH_PRIOR
+#define SQL_FD_FETCH_PRIOR 8
+#define SQL_FD_FETCH_RELATIVE 32
+#define SQL_FD_FETCH_RESUME 64
+#define SQL_FETCH_DIRECTION 8
+#define SQL_FETCH_FIRST 2
+#define SQL_FETCH_NEXT 1
+#define SQL_FETCH_PREV SQL_FETCH_PRIOR
+#define SQL_FETCH_RESUME 7
+#define SQL_FILE_NOT_SUPPORTED 0
+#define SQL_FILE_QUALIFIER 2
+#define SQL_FILE_TABLE 1
+#define SQL_FILE_USAGE 84
+#define SQL_FLOAT 6
+#define SQL_FN_CVT_CONVERT 1
+#define SQL_FN_NUM_ABS 1
+#define SQL_FN_NUM_ACOS 2
+#define SQL_FN_NUM_ASIN 4
+#define SQL_FN_NUM_ATAN 8
+#define SQL_FN_NUM_ATAN2 16
+#define SQL_FN_NUM_CEILING 32
+#define SQL_FN_NUM_COS 64
+#define SQL_FN_NUM_COT 128
+#define SQL_FN_NUM_DEGREES 0x40000L
+#define SQL_FN_NUM_EXP 256
+#define SQL_FN_NUM_FLOOR 512
+#define SQL_FN_NUM_LOG 1024
+#define SQL_FN_NUM_LOG10 0x80000L
+#define SQL_FN_NUM_MOD 0x800L
+#define SQL_FN_NUM_PI 0x10000L
+#define SQL_FN_NUM_POWER 0x100000L
+#define SQL_FN_NUM_RADIANS 0x200000L
+#define SQL_FN_NUM_RAND 0x20000L
+#define SQL_FN_NUM_ROUND 0x400000L
+#define SQL_FN_NUM_SIGN 0x1000L
+#define SQL_FN_NUM_SIN 0x2000L
+#define SQL_FN_NUM_SQRT 0x00004000L
+#define SQL_FN_NUM_TAN 0x00008000L
+#define SQL_FN_NUM_TRUNCATE 0x00800000L
+#define SQL_FN_STR_ASCII 0x00002000L
+#define SQL_FN_STR_CHAR 0x00004000L
+#define SQL_FN_STR_CONCAT 1
+#define SQL_FN_STR_DIFFERENCE 0x00008000L
+#define SQL_FN_STR_INSERT 2
+#define SQL_FN_STR_LCASE 64
+#define SQL_FN_STR_LEFT 4
+#define SQL_FN_STR_LENGTH 16
+#define SQL_FN_STR_LOCATE 32
+#define SQL_FN_STR_LOCATE_2 0x00010000L
+#define SQL_FN_STR_LTRIM 8
+#define SQL_FN_STR_REPEAT 128
+#define SQL_FN_STR_REPLACE 256
+#define SQL_FN_STR_RIGHT 512
+#define SQL_FN_STR_RTRIM 1024
+#define SQL_FN_STR_SOUNDEX 0x00020000L
+#define SQL_FN_STR_SPACE 0x00040000L
+#define SQL_FN_STR_SUBSTRING 0x00000800L
+#define SQL_FN_STR_UCASE 0x00001000L
+#define SQL_FN_SYS_DBNAME 0x00000002L
+#define SQL_FN_SYS_IFNULL 0x00000004L
+#define SQL_FN_SYS_USERNAME 0x00000001L
+#define SQL_FN_TD_CURDATE 0x00000002L
+#define SQL_FN_TD_CURTIME 0x00000200L
+#define SQL_FN_TD_DAYNAME 0x00008000L
+#define SQL_FN_TD_DAYOFMONTH 0x00000004L
+#define SQL_FN_TD_DAYOFWEEK 0x00000008L
+#define SQL_FN_TD_DAYOFYEAR 0x00000010L
+#define SQL_FN_TD_HOUR 0x00000400L
+#define SQL_FN_TD_MINUTE 0x00000800L
+#define SQL_FN_TD_MONTH 32
+#define SQL_FN_TD_MONTHNAME 0x00010000L
+#define SQL_FN_TD_NOW 1
+#define SQL_FN_TD_QUARTER 64
+#define SQL_FN_TD_SECOND 0x00001000L
+#define SQL_FN_TD_TIMESTAMPADD 0x00002000L
+#define SQL_FN_TD_TIMESTAMPDIFF 0x00004000L
+#define SQL_FN_TD_WEEK 128
+#define SQL_FN_TD_YEAR 256
+#define SQL_FN_TSI_DAY 16
+#define SQL_FN_TSI_FRAC_SECOND 1
+#define SQL_FN_TSI_HOUR 8
+#define SQL_FN_TSI_MINUTE 4
+#define SQL_FN_TSI_MONTH 64
+#define SQL_FN_TSI_QUARTER 128
+#define SQL_FN_TSI_SECOND 2
+#define SQL_FN_TSI_WEEK 32
+#define SQL_FN_TSI_YEAR 256
+#define SQL_GB_GROUP_BY_CONTAINS_SELECT 2
+#define SQL_GB_GROUP_BY_EQUALS_SELECT 1
+#define SQL_GB_NOT_SUPPORTED 0
+#define SQL_GB_NO_RELATION 3
+#define SQL_GD_ANY_COLUMN 1
+#define SQL_GD_ANY_ORDER 2
+#define SQL_GD_BLOCK 4
+#define SQL_GD_BOUND 8
+#define SQL_GETDATA_EXTENSIONS 81
+#define SQL_GET_BOOKMARK 13
+#define SQL_GROUP_BY 88
+#define SQL_IC_LOWER 2
+#define SQL_IC_MIXED 4
+#define SQL_IC_SENSITIVE 3
+#define SQL_IC_UPPER 1
+#define SQL_IDENTIFIER_CASE 28
+#define SQL_IDENTIFIER_QUOTE_CHAR 29
+#define SQL_INDEX_ALL 1
+#define SQL_INDEX_CLUSTERED 1
+#define SQL_INDEX_HASHED 2
+#define SQL_INDEX_OTHER 3
+#define SQL_INDEX_UNIQUE 0
+#define SQL_INFO_DRIVER_START 1000
+#define SQL_INFO_FIRST 0
+#define SQL_INFO_LAST SQL_QUALIFIER_LOCATION
+#define SQL_INTEGER 4
+#define SQL_INTERVAL_DAY (-83)
+#define SQL_INTERVAL_DAY_TO_HOUR (-87)
+#define SQL_INTERVAL_DAY_TO_MINUTE (-88)
+#define SQL_INTERVAL_DAY_TO_SECOND (-89)
+#define SQL_INTERVAL_HOUR (-84)
+#define SQL_INTERVAL_HOUR_TO_MINUTE (-90)
+#define SQL_INTERVAL_HOUR_TO_SECOND (-91)
+#define SQL_INTERVAL_MINUTE (-85)
+#define SQL_INTERVAL_MINUTE_TO_SECOND (-92)
+#define SQL_INTERVAL_MONTH (-81)
+#define SQL_INTERVAL_SECOND (-86)
+#define SQL_INTERVAL_YEAR (-80)
+#define SQL_INTERVAL_YEAR_TO_MONTH (-82)
+#define SQL_INVALID_HANDLE (-2)
+#define SQL_KEYSET_SIZE 8
+#define SQL_KEYSET_SIZE_DEFAULT 0
+#define SQL_KEYWORDS 89
+#define SQL_LCK_EXCLUSIVE 2
+#define SQL_LCK_NO_CHANGE 1
+#define SQL_LCK_UNLOCK 4
+#define SQL_LIKE_ESCAPE_CLAUSE 113
+#define SQL_LIKE_ONLY 1
+#define SQL_LOCK_TYPES 78
+#define SQL_LOGIN_TIMEOUT 103
+#define SQL_LOGIN_TIMEOUT_DEFAULT 15UL
+#define SQL_LONGVARBINARY (-4)
+#define SQL_LONGVARCHAR (-1)
+#define SQL_MAX_BINARY_LITERAL_LEN 112
+#define SQL_MAX_CHAR_LITERAL_LEN 108
+#define SQL_MAX_COLUMNS_IN_GROUP_BY 97
+#define SQL_MAX_COLUMNS_IN_INDEX 98
+#define SQL_MAX_COLUMNS_IN_ORDER_BY 99
+#define SQL_MAX_COLUMNS_IN_SELECT 100
+#define SQL_MAX_COLUMNS_IN_TABLE 101
+#define SQL_MAX_COLUMN_NAME_LEN 30
+#define SQL_MAX_CURSOR_NAME_LEN 31
+#define SQL_MAX_DSN_LENGTH 32
+#define SQL_MAX_INDEX_SIZE 102
+#define SQL_MAX_LENGTH 3
+#define SQL_MAX_LENGTH_DEFAULT 0
+#define SQL_MAX_MESSAGE_LENGTH 512
+#define SQL_MAX_OPTION_STRING_LENGTH 256
+#define SQL_MAX_OWNER_NAME_LEN 32
+#define SQL_MAX_PROCEDURE_NAME_LEN 33
+#define SQL_MAX_QUALIFIER_NAME_LEN 34
+#define SQL_MAX_ROWS 1
+#define SQL_MAX_ROWS_DEFAULT 0UL
+#define SQL_MAX_ROW_SIZE 104
+#define SQL_MAX_ROW_SIZE_INCLUDES_LONG 103
+#define SQL_MAX_STATEMENT_LEN 105
+#define SQL_MAX_TABLES_IN_SELECT 106
+#define SQL_MAX_TABLE_NAME_LEN 35
+#define SQL_MAX_USER_NAME_LEN 107
+#define SQL_MODE_DEFAULT SQL_MODE_READ_WRITE
+#define SQL_MODE_READ_ONLY 1UL
+#define SQL_MODE_READ_WRITE 0UL
+#define SQL_MULTIPLE_ACTIVE_TXN 37
+#define SQL_MULT_RESULT_SETS 36
+#define SQL_NC_END 4
+#define SQL_NC_HIGH 0
+#define SQL_NC_LOW 1
+#define SQL_NC_START 2
+#define SQL_NEED_DATA 99
+#define SQL_NEED_LONG_DATA_LEN 111
+#define SQL_NNC_NON_NULL 1
+#define SQL_NNC_NULL 0
+#define SQL_NON_NULLABLE_COLUMNS 75
+#define SQL_NOSCAN 2
+#define SQL_NOSCAN_DEFAULT SQL_NOSCAN_OFF
+#define SQL_NOSCAN_OFF 0
+#define SQL_NOSCAN_ON 1
+#define SQL_NO_DATA 100
+#define SQL_NO_NULLS 0
+#define SQL_NO_TOTAL (-4)
+#define SQL_NTS (-3)
+#define SQL_NULLABLE 1
+#define SQL_NULLABLE_UNKNOWN 2
+#define SQL_NULL_COLLATION 85
+#define SQL_NULL_DATA (-1)
+#define SQL_NULL_HDBC 0
+#define SQL_NULL_HENV 0
+#define SQL_NULL_HSTMT 0
+#define SQL_NUMERIC 2
+#define SQL_NUMERIC_FUNCTIONS 49
+#define SQL_NUM_EXTENSIONS (SQL_EXT_API_LAST-SQL_EXT_API_START+1)
+#define SQL_NUM_FUNCTIONS 23
+#define SQL_OAC_LEVEL1 1
+#define SQL_OAC_LEVEL2 2
+#define SQL_OAC_NONE 0
+#define SQL_ODBC_API_CONFORMANCE 9
+#define SQL_ODBC_CURSORS 110
+#define SQL_ODBC_KEYWORDS "ABSOLUTE,ACTION,ADA,ADD,ALL,ALLOCATE,ALTER,AND,ANY,ARE,AS,"\
+"ASC,ASSERTION,AT,AUTHORIZATION,AVG,"\
+"BEGIN,BETWEEN,BIT,BIT_LENGTH,BOTH,BY,CASCADE,CASCADED,CASE,CAST,CATALOG,"\
+"CHAR,CHAR_LENGTH,CHARACTER,CHARACTER_LENGTH,CHECK,CLOSE,COALESCE,"\
+"COBOL,COLLATE,COLLATION,COLUMN,COMMIT,CONNECT,CONNECTION,CONSTRAINT,"\
+"CONSTRAINTS,CONTINUE,CONVERT,CORRESPONDING,COUNT,CREATE,CROSS,CURRENT,"\
+"CURRENT_DATE,CURRENT_TIME,CURRENT_TIMESTAMP,CURRENT_USER,CURSOR,"\
+"DATE,DAY,DEALLOCATE,DEC,DECIMAL,DECLARE,DEFAULT,DEFERRABLE,"\
+"DEFERRED,DELETE,DESC,DESCRIBE,DESCRIPTOR,DIAGNOSTICS,DISCONNECT,"\
+"DISTINCT,DOMAIN,DOUBLE,DROP,""ELSE,END,END-EXEC,ESCAPE,EXCEPT,EXCEPTION,EXEC,EXECUTE,"\
+"EXISTS,EXTERNAL,EXTRACT,""FALSE,FETCH,FIRST,FLOAT,FOR,FOREIGN,FORTRAN,FOUND,FROM,FULL,"\
+"GET,GLOBAL,GO,GOTO,GRANT,GROUP,HAVING,HOUR,"\
+"IDENTITY,IMMEDIATE,IN,INCLUDE,INDEX,INDICATOR,INITIALLY,INNER,"\
+"INPUT,INSENSITIVE,INSERT,INTEGER,INTERSECT,INTERVAL,INTO,IS,ISOLATION,"\
+"JOIN,KEY,LANGUAGE,LAST,LEADING,LEFT,LEVEL,LIKE,LOCAL,LOWER,"\
+"MATCH,MAX,MIN,MINUTE,MODULE,MONTH,MUMPS,"\
+"NAMES,NATIONAL,NATURAL,NCHAR,NEXT,NO,NONE,NOT,NULL,NULLIF,NUMERIC,"\
+"OCTET_LENGTH,OF,ON,ONLY,OPEN,OPTION,OR,ORDER,OUTER,OUTPUT,OVERLAPS,"\
+"PAD,PARTIAL,PASCAL,PLI,POSITION,PRECISION,PREPARE,PRESERVE,"\
+"PRIMARY,PRIOR,PRIVILEGES,PROCEDURE,PUBLIC,"\
+"REFERENCES,RELATIVE,RESTRICT,REVOKE,RIGHT,ROLLBACK,ROWS,"\
+"SCHEMA,SCROLL,SECOND,SECTION,SELECT,SEQUENCE,SESSION,SESSION_USER,SET,SIZE,"\
+"SMALLINT,SOME,SPACE,SQL,SQLCA,SQLCODE,SQLERROR,SQLSTATE,SQLWARNING,"\
+"SUBSTRING,SUM,SYSTEM_USER,"\
+"TABLE,TEMPORARY,THEN,TIME,TIMESTAMP,TIMEZONE_HOUR,TIMEZONE_MINUTE,"\
+"TO,TRAILING,TRANSACTION,TRANSLATE,TRANSLATION,TRIM,TRUE,"\
+"UNION,UNIQUE,UNKNOWN,UPDATE,UPPER,USAGE,USER,USING,"\
+"VALUE,VALUES,VARCHAR,VARYING,VIEW,WHEN,WHENEVER,WHERE,WITH,WORK,YEAR"
+#define SQL_ODBC_SAG_CLI_CONFORMANCE 12
+#define SQL_ODBC_SQL_CONFORMANCE 15
+#define SQL_ODBC_SQL_OPT_IEF 73
+#define SQL_ODBC_VER 10
+#define SQL_OJ_ALL_COMPARISON_OPS 64
+#define SQL_OJ_CAPABILITIES 65003
+#define SQL_OJ_FULL 4
+#define SQL_OJ_INNER 32
+#define SQL_OJ_LEFT 1
+#define SQL_OJ_NESTED 8
+#define SQL_OJ_NOT_ORDERED 16
+#define SQL_OJ_RIGHT 2
+#define SQL_OPT_TRACE_OFF 0
+#define SQL_OPT_TRACE_ON 1
+#define SQL_OPT_TRACE 104
+#define SQL_OPT_TRACEFILE 105
+#define SQL_OPT_TRACE_DEFAULT SQL_OPT_TRACE_OFF
+#define SQL_OPT_TRACE_FILE_DEFAULT "\\SQL.LOG"
+#define SQL_ORDER_BY_COLUMNS_IN_SELECT 90
+#define SQL_OSCC_COMPLIANT 1
+#define SQL_OSCC_NOT_COMPLIANT 0
+#define SQL_OSC_CORE 1
+#define SQL_OSC_EXTENDED 2
+#define SQL_OSC_MINIMUM 0
+#define SQL_OUTER_JOINS 38
+#define SQL_OU_DML_STATEMENTS 1
+#define SQL_OU_INDEX_DEFINITION 8
+#define SQL_OU_PRIVILEGE_DEFINITION 16
+#define SQL_OU_PROCEDURE_INVOCATION 2
+#define SQL_OU_TABLE_DEFINITION 4
+#define SQL_OWNER_TERM 39
+#define SQL_OWNER_USAGE 91
+#define SQL_PC_NOT_PSEUDO 1
+#define SQL_PC_PSEUDO 2
+#define SQL_PC_UNKNOWN 0
+#define SQL_PC_NON_PSEUDO SQL_PC_NOT_PSEUDO
+#define SQL_POSITIONED_STATEMENTS 80
+#define SQL_POS_ADD 16
+#define SQL_POS_DELETE 8
+#define SQL_POS_OPERATIONS 79
+#define SQL_POS_POSITION 1
+#define SQL_POS_REFRESH 2
+#define SQL_POS_UPDATE 4
+#define SQL_PROCEDURES 21
+#define SQL_PROCEDURE_TERM 40
+#define SQL_PS_POSITIONED_DELETE 1
+#define SQL_PS_POSITIONED_UPDATE 2
+#define SQL_PS_SELECT_FOR_UPDATE 4
+#define SQL_QL_END 2
+#define SQL_QL_START 1
+#define SQL_QUALIFIER_LOCATION 114
+#define SQL_QUALIFIER_NAME_SEPARATOR 41
+#define SQL_QUALIFIER_TERM 42
+#define SQL_QUALIFIER_USAGE 92
+#define SQL_QUERY_TIMEOUT 0
+#define SQL_QUERY_TIMEOUT_DEFAULT 0UL
+#define SQL_QUICK 0
+#define SQL_QUIET_MODE 111
+#define SQL_QUOTED_IDENTIFIER_CASE 93
+#define SQL_QU_DML_STATEMENTS 1
+#define SQL_QU_INDEX_DEFINITION 8
+#define SQL_QU_PRIVILEGE_DEFINITION 16
+#define SQL_QU_PROCEDURE_INVOCATION 2
+#define SQL_QU_TABLE_DEFINITION 4
+#define SQL_RD_DEFAULT SQL_RD_ON
+#define SQL_RD_OFF 0
+#define SQL_RD_ON 1
+#define SQL_REAL 7
+#define SQL_RESET_PARAMS 3
+#define SQL_RETRIEVE_DATA 11
+#define SQL_ROLLBACK 1
+#define SQL_ROWSET_SIZE 9
+#define SQL_ROWSET_SIZE_DEFAULT 1UL
+#define SQL_ROWVER 2
+#define SQL_ROW_NUMBER 14
+#define SQL_ROW_UPDATES 11
+#define SQL_SCCO_LOCK 2
+#define SQL_SCCO_OPT_ROWVER 4
+#define SQL_SCCO_OPT_TIMESTAMP SQL_SCCO_OPT_ROWVER
+#define SQL_SCCO_OPT_VALUES 8
+#define SQL_SCCO_READ_ONLY 1
+#define SQL_SCOPE_CURROW 0
+#define SQL_SCOPE_SESSION 2
+#define SQL_SCOPE_TRANSACTION 1
+#define SQL_SCROLL_CONCURRENCY 43
+#define SQL_SCROLL_DYNAMIC (-2L)
+#define SQL_SCROLL_FORWARD_ONLY 0
+#define SQL_SCROLL_KEYSET_DRIVEN (-1L)
+#define SQL_SCROLL_OPTIONS 44
+#define SQL_SCROLL_STATIC (-3L)
+#define SQL_SC_NON_UNIQUE 0
+#define SQL_SC_TRY_UNIQUE 1
+#define SQL_SC_UNIQUE 2
+#define SQL_SEARCHABLE 3
+#define SQL_SEARCH_PATTERN_ESCAPE 14
+#define SQL_SERVER_NAME 13
+#define SQL_SIGNED_OFFSET (-20)
+#define SQL_SIMULATE_CURSOR 10
+#define SQL_SMALLINT 5
+#define SQL_SO_DYNAMIC 4
+#define SQL_SO_FORWARD_ONLY 1
+#define SQL_SO_KEYSET_DRIVEN 2
+#define SQL_SO_MIXED 8
+#define SQL_SO_STATIC 16
+#define SQL_SPECIAL_CHARACTERS 94
+#define SQL_SQLSTATE_SIZE 5
+#define SQL_SQ_COMPARISON 1
+#define SQL_SQ_CORRELATED_SUBQUERIES 16
+#define SQL_SQ_EXISTS 2
+#define SQL_SQ_IN 4
+#define SQL_SQ_QUANTIFIED 8
+#define SQL_SS_ADDITIONS 1
+#define SQL_SS_DELETIONS 2
+#define SQL_SS_UPDATES 4
+#define SQL_STATIC_SENSITIVITY 83
+#define SQL_STILL_EXECUTING 2
+#define SQL_STMT_OPT_MAX SQL_ROW_NUMBER
+#define SQL_STMT_OPT_MIN SQL_QUERY_TIMEOUT
+#define SQL_STRING_FUNCTIONS 50
+#define SQL_SUBQUERIES 95
+#define SQL_SUCCESS 0
+#define SQL_SUCCESS_WITH_INFO 1
+#define SQL_SYSTEM_FUNCTIONS 51
+#define SQL_TABLE_STAT 0
+#define SQL_TABLE_TERM 45
+#define SQL_TC_ALL 0x0002
+#define SQL_TC_DDL_COMMIT 3
+#define SQL_TC_DDL_IGNORE 4
+#define SQL_TC_DML 1
+#define SQL_TC_NONE 0
+#define SQL_TIME 10
+#define SQL_TIMEDATE_ADD_INTERVALS 109
+#define SQL_TIMEDATE_DIFF_INTERVALS 110
+#define SQL_TIMEDATE_FUNCTIONS 52
+#define SQL_TIMESTAMP 11
+#define SQL_TINYINT (-6)
+#define SQL_TRANSLATE_DLL 106
+#define SQL_TRANSLATE_OPTION 107
+#define SQL_TXN_CAPABLE 46
+#define SQL_TXN_ISOLATION 108
+#define SQL_TXN_ISOLATION_OPTION 72
+#define SQL_TXN_READ_COMMITTED 2
+#define SQL_TXN_READ_UNCOMMITTED 1
+#define SQL_TXN_REPEATABLE_READ 4
+#define SQL_TXN_SERIALIZABLE 8
+#define SQL_TXN_VERSIONING 16
+#define SQL_TYPE_NULL 0
+#define SQL_UB_OFF 0
+#define SQL_UB_ON 1
+#define SQL_UNBIND 2
+#define SQL_UNICODE (-95)
+#define SQL_UNICODE_CHAR SQL_UNICODE
+#define SQL_UNICODE_LONGVARCHAR (-97)
+#define SQL_UNICODE_VARCHAR (-96)
+#define SQL_UNION 96
+#define SQL_UNSEARCHABLE 0
+#define SQL_UNSIGNED_OFFSET (-22)
+#define SQL_USER_NAME 47
+#define SQL_USE_BOOKMARKS 12
+#define SQL_U_UNION 1
+#define SQL_U_UNION_ALL 2
+#define SQL_VARBINARY (-3)
+#define SQL_VARCHAR 12
+#define SQL_C_BINARY SQL_BINARY
+#define SQL_C_BIT SQL_BIT
+#define SQL_C_BOOKMARK SQL_C_ULONG
+#define SQL_C_CHAR SQL_CHAR
+#define SQL_C_DATE SQL_DATE
+#define SQL_C_DEFAULT 99
+#define SQL_C_DOUBLE SQL_DOUBLE
+#define SQL_C_FLOAT SQL_REAL
+#define SQL_C_LONG SQL_INTEGER
+#define SQL_C_SHORT SQL_SMALLINT
+#define SQL_C_SLONG SQL_C_LONG+SQL_SIGNED_OFFSET
+#define SQL_C_SSHORT SQL_C_SHORT+SQL_SIGNED_OFFSET
+#define SQL_C_STINYINT SQL_TINYINT+SQL_SIGNED_OFFSET
+#define SQL_C_TIME SQL_TIME
+#define SQL_C_TIMESTAMP SQL_TIMESTAMP
+#define SQL_C_TINYINT SQL_TINYINT
+#define SQL_C_ULONG SQL_C_LONG+SQL_UNSIGNED_OFFSET
+#define SQL_C_USHORT SQL_C_SHORT+SQL_UNSIGNED_OFFSET
+#define SQL_C_UTINYINT SQL_TINYINT+SQL_UNSIGNED_OFFSET
+#define SQL_TYPE_DRIVER_END SQL_UNICODE_LONGVARCHAR
+#define SQL_TYPE_DRIVER_START SQL_INTERVAL_YEAR
+#define SQL_TYPE_MAX SQL_VARCHAR
+#define SQL_TYPE_MIN SQL_BIT
+#define SQL_UB_DEFAULT SQL_UB_OFF
+
+SQLRETURN SQL_API SQLAllocConnect(SQLHENV,SQLHDBC*);
+SQLRETURN SQL_API SQLAllocEnv(SQLHENV *);
+SQLRETURN SQL_API SQLAllocStmt(SQLHDBC,SQLHSTMT*);
+SQLRETURN SQL_API SQLAllocHandle(SQLSMALLINT,SQLHANDLE,SQLHANDLE*);
+SQLRETURN SQL_API SQLBindCol(SQLHSTMT,SQLUSMALLINT,SQLSMALLINT,SQLPOINTER,SQLINTEGER,SQLINTEGER*);
+SQLRETURN SQL_API SQLCancel(SQLHSTMT);
+SQLRETURN SQL_API SQLColAttributes(SQLHSTMT,SQLUSMALLINT,SQLUSMALLINT,SQLPOINTER,SQLSMALLINT,SQLSMALLINT*,SQLINTEGER*);
+SQLRETURN SQL_API SQLConnect(SQLHDBC,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT);
+SQLRETURN SQL_API SQLDescribeCol(SQLHSTMT,SQLUSMALLINT,SQLCHAR*,SQLSMALLINT,SQLSMALLINT*,SQLSMALLINT*,SQLUINTEGER*,SQLSMALLINT*,SQLSMALLINT*);
+SQLRETURN SQL_API SQLDisconnect(SQLHDBC);
+SQLRETURN SQL_API SQLError(SQLHENV,SQLHDBC,SQLHSTMT,SQLCHAR*,SQLINTEGER*,SQLCHAR*,SQLSMALLINT,SQLSMALLINT*);
+SQLRETURN SQL_API SQLExecDirect(SQLHSTMT,SQLCHAR*,SQLINTEGER);
+SQLRETURN SQL_API SQLExecute(SQLHSTMT);
+SQLRETURN SQL_API SQLFetch(SQLHSTMT);
+SQLRETURN SQL_API SQLFreeConnect(SQLHDBC);
+SQLRETURN SQL_API SQLFreeEnv(SQLHENV);
+SQLRETURN SQL_API SQLFreeStmt(SQLHSTMT,SQLUSMALLINT);
+SQLRETURN SQL_API SQLFreeHandle(SQLSMALLINT,SQLHANDLE);
+SQLRETURN SQL_API SQLGetCursorName(SQLHSTMT,SQLCHAR*,SQLSMALLINT,SQLSMALLINT*);
+SQLRETURN SQL_API SQLNumResultCols(SQLHSTMT,SQLSMALLINT*);
+SQLRETURN SQL_API SQLPrepare(SQLHSTMT,SQLCHAR*,SQLINTEGER);
+SQLRETURN SQL_API SQLRowCount(SQLHSTMT,SQLINTEGER*);
+SQLRETURN SQL_API SQLSetCursorName(SQLHSTMT,SQLCHAR*,SQLSMALLINT);
+SQLRETURN SQL_API SQLTransact(SQLHENV,SQLHDBC,SQLUSMALLINT);
+SQLRETURN SQL_API SQLSetParam(SQLHSTMT,SQLUSMALLINT,SQLSMALLINT,SQLSMALLINT,SQLUINTEGER,SQLSMALLINT,SQLPOINTER,SQLINTEGER*);
+SQLRETURN SQL_API SQLColumns(SQLHSTMT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT);
+SQLRETURN SQL_API SQLGetConnectOption(SQLHDBC,SQLUSMALLINT,SQLPOINTER);
+SQLRETURN SQL_API SQLGetData(SQLHSTMT,SQLUSMALLINT,SQLSMALLINT,SQLPOINTER,SQLINTEGER,SQLINTEGER*);
+SQLRETURN SQL_API SQLGetFunctions(SQLHDBC,SQLUSMALLINT,SQLUSMALLINT*);
+SQLRETURN SQL_API SQLGetInfo(SQLHDBC,SQLUSMALLINT,SQLPOINTER,SQLSMALLINT,SQLSMALLINT*);
+SQLRETURN SQL_API SQLGetStmtOption(SQLHSTMT,SQLUSMALLINT,SQLPOINTER);
+SQLRETURN SQL_API SQLGetTypeInfo(SQLHSTMT,SQLSMALLINT);
+SQLRETURN SQL_API SQLParamData(SQLHSTMT,SQLPOINTER*);
+SQLRETURN SQL_API SQLPutData(SQLHSTMT,SQLPOINTER,SQLINTEGER);
+SQLRETURN SQL_API SQLSetConnectOption(SQLHDBC,SQLUSMALLINT,SQLUINTEGER);
+SQLRETURN SQL_API SQLSetStmtOption(SQLHSTMT,SQLUSMALLINT,SQLUINTEGER);
+SQLRETURN SQL_API SQLSpecialColumns(SQLHSTMT,SQLUSMALLINT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLUSMALLINT,SQLUSMALLINT fNullable);
+SQLRETURN SQL_API SQLStatistics(SQLHSTMT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLUSMALLINT,SQLUSMALLINT);
+SQLRETURN SQL_API SQLTables(SQLHSTMT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT);
+SQLRETURN SQL_API SQLDataSources(SQLHENV,SQLUSMALLINT,SQLCHAR*,SQLSMALLINT,SQLSMALLINT*,SQLCHAR*,SQLSMALLINT,SQLSMALLINT*);
+SQLRETURN SQL_API SQLSetScrollOptions(SQLHSTMT,SQLUSMALLINT,SQLINTEGER,SQLUSMALLINT);
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/winsup/w32api/include/sqlext.h b/winsup/w32api/include/sqlext.h
new file mode 100644
index 000000000..fc0538601
--- /dev/null
+++ b/winsup/w32api/include/sqlext.h
@@ -0,0 +1,79 @@
+#ifndef _SQLEXT_H
+#define _SQLEXT_H
+#include <sql.h>
+#ifdef __cplusplus
+extern "C" {
+#endif
+#define SQL_DEFAULT_PARAM (-5)
+#define SQL_IGNORE (-6)
+#define SQL_LEN_DATA_AT_EXEC_OFFSET (-100)
+#define SQL_LEN_DATA_AT_EXEC(l) (-l+SQL_LEN_DATA_AT_EXEC_OFFSET)
+#define SQL_ENTIRE_ROWSET 0
+#define SQL_POSITION 0
+#define SQL_REFRESH 1
+#define SQL_UPDATE 2
+#define SQL_DELETE 3
+#define SQL_ADD 4
+#define SQL_LOCK_NO_CHANGE 0
+#define SQL_LOCK_EXCLUSIVE 1
+#define SQL_LOCK_UNLOCK 2
+#define SQL_POSITION_TO(s,r) SQLSetPos(s,r,SQL_POSITION,SQL_LOCK_NO_CHANGE)
+#define SQL_LOCK_RECORD(s,i,l) SQLSetPos(s,r,SQL_POSITION,l)
+#define SQL_REFRESH_RECORD(s,i,f) SQLSetPos(s,r,SQL_REFRESH,fLock)
+#define SQL_UPDATE_RECORD(s,r) SQLSetPos(s,r,SQL_UPDATE,SQL_LOCK_NO_CHANGE)
+#define SQL_DELETE_RECORD(s,r) SQLSetPos(s,r,SQL_DELETE,SQL_LOCK_NO_CHANGE)
+#define SQL_ADD_RECORD(s,r) SQLSetPos(s,r,SQL_ADD,SQL_LOCK_NO_CHANGE)
+#define SQL_DRIVER_NOPROMPT 0
+#define SQL_DRIVER_COMPLETE 1
+#define SQL_DRIVER_PROMPT 2
+#define SQL_DRIVER_COMPLETE_REQUIRED 3
+#define SQL_FETCH_LAST 3
+#define SQL_FETCH_PRIOR 4
+#define SQL_FETCH_ABSOLUTE 5
+#define SQL_FETCH_RELATIVE 6
+#define SQL_FETCH_BOOKMARK 8
+#define SQL_ROW_SUCCESS 0
+#define SQL_ROW_DELETED 1
+#define SQL_ROW_UPDATED 2
+#define SQL_ROW_NOROW 3
+#define SQL_ROW_ADDED 4
+#define SQL_ROW_ERROR 5
+#define SQL_CASCADE 0
+#define SQL_RESTRICT 1
+#define SQL_SET_NULL 2
+#define SQL_NO_ACTION 3
+#define SQL_SET_DEFAULT 4
+#define SQL_PARAM_TYPE_UNKNOWN 0
+#define SQL_PARAM_INPUT 1
+#define SQL_PARAM_INPUT_OUTPUT 2
+#define SQL_RESULT_COL 3
+#define SQL_PARAM_OUTPUT 4
+#define SQL_RETURN_VALUE 5
+#define SQL_PT_UNKNOWN 0
+#define SQL_PT_PROCEDURE 1
+#define SQL_PT_FUNCTION 2
+#define SQL_PARAM_TYPE_DEFAULT SQL_PARAM_INPUT_OUTPUT
+#define SQL_SETPARAM_VALUE_MAX (-1L)
+#define SQL_NO_DATA_FOUND SQL_NO_DATA
+
+SQLRETURN SQL_API SQLDriverConnect(SQLHDBC,SQLHWND,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLSMALLINT*,SQLUSMALLINT);
+SQLRETURN SQL_API SQLBrowseConnect(SQLHDBC,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLSMALLINT*);
+SQLRETURN SQL_API SQLColumnPrivileges(SQLHSTMT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT);
+SQLRETURN SQL_API SQLDescribeParam(SQLHSTMT,SQLUSMALLINT,SQLSMALLINT*,SQLUINTEGER*,SQLSMALLINT*,SQLSMALLINT*);
+SQLRETURN SQL_API SQLExtendedFetch(SQLHSTMT,SQLUSMALLINT,SQLINTEGER,SQLUINTEGER*,SQLUSMALLINT*);
+SQLRETURN SQL_API SQLForeignKeys(SQLHSTMT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT);
+SQLRETURN SQL_API SQLMoreResults(SQLHSTMT);
+SQLRETURN SQL_API SQLNativeSql(SQLHDBC,SQLCHAR*,SQLINTEGER,SQLCHAR*,SQLINTEGER,SQLINTEGER*);
+SQLRETURN SQL_API SQLNumParams(SQLHSTMT,SQLSMALLINT*);
+SQLRETURN SQL_API SQLParamOptions(SQLHSTMT,SQLUINTEGER,SQLUINTEGER*);
+SQLRETURN SQL_API SQLPrimaryKeys(SQLHSTMT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT);
+SQLRETURN SQL_API SQLProcedureColumns(SQLHSTMT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT);
+SQLRETURN SQL_API SQLProcedures(SQLHSTMT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT);
+SQLRETURN SQL_API SQLSetPos(SQLHSTMT,SQLUSMALLINT,SQLUSMALLINT,SQLUSMALLINT);
+SQLRETURN SQL_API SQLTablePrivileges(SQLHSTMT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT);
+SQLRETURN SQL_API SQLDrivers(SQLHENV,SQLUSMALLINT,SQLCHAR*,SQLSMALLINT,SQLSMALLINT*,SQLCHAR*,SQLSMALLINT,SQLSMALLINT*);
+SQLRETURN SQL_API SQLBindParameter(SQLHSTMT,SQLUSMALLINT,SQLSMALLINT,SQLSMALLINT,SQLSMALLINT,SQLUINTEGER,SQLSMALLINT,SQLPOINTER,SQLINTEGER,SQLINTEGER*);
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/winsup/w32api/include/sqltypes.h b/winsup/w32api/include/sqltypes.h
new file mode 100644
index 000000000..4d9529d9d
--- /dev/null
+++ b/winsup/w32api/include/sqltypes.h
@@ -0,0 +1,61 @@
+#ifndef _SQLTYPES_H
+#define _SQLTYPES_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+#define SQL_API __stdcall
+#pragma pack(push,1)
+typedef signed char SCHAR;
+typedef long SDWORD;
+typedef short SWORD;
+typedef ULONG UDWORD;
+typedef USHORT UWORD;
+typedef long SLONG;
+typedef short SSHORT;
+typedef double SDOUBLE;
+typedef double LDOUBLE;
+typedef float SFLOAT;
+typedef PVOID PTR;
+typedef PVOID HENV;
+typedef PVOID HDBC;
+typedef PVOID HSTMT;
+typedef short RETCODE;
+typedef UCHAR SQLCHAR;
+typedef SCHAR SQLSCHAR;
+typedef SDWORD SQLINTEGER;
+typedef SWORD SQLSMALLINT;
+typedef UDWORD SQLUINTEGER;
+typedef UWORD SQLUSMALLINT;
+typedef PVOID SQLPOINTER;
+typedef HENV SQLHENV;
+typedef HDBC SQLHDBC;
+typedef HSTMT SQLHSTMT;
+typedef SQLSMALLINT SQLRETURN;
+typedef HWND SQLHWND;
+typedef ULONG BOOKMARK;
+typedef struct tagDATE_STRUCT {
+ SQLSMALLINT year;
+ SQLUSMALLINT month;
+ SQLUSMALLINT day;
+} DATE_STRUCT;
+typedef struct tagTIME_STRUCT {
+ SQLUSMALLINT hour;
+ SQLUSMALLINT minute;
+ SQLUSMALLINT second;
+} TIME_STRUCT;
+typedef struct tagTIMESTAMP_STRUCT {
+ SQLSMALLINT year;
+ SQLUSMALLINT month;
+ SQLUSMALLINT day;
+ SQLUSMALLINT hour;
+ SQLUSMALLINT minute;
+ SQLUSMALLINT second;
+ SQLUINTEGER fraction;
+} TIMESTAMP_STRUCT;
+typedef void* SQLHANDLE;
+typedef SQLHANDLE SQLHDESC;
+#pragma pack(pop)
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/winsup/w32api/include/unknwn.h b/winsup/w32api/include/unknwn.h
new file mode 100644
index 000000000..48cea3bc1
--- /dev/null
+++ b/winsup/w32api/include/unknwn.h
@@ -0,0 +1,67 @@
+#ifndef _UNKNWN_H
+#define _UNKNWN_H
+#include <windows.h>
+#ifdef __cplusplus
+extern "C"{
+#endif
+#include <objfwd.h>
+#include <wtypes.h>
+
+void * __RPC_USER MIDL_user_allocate(size_t);
+void __RPC_USER MIDL_user_free(void*);
+EXTERN_C const IID IID_IUnknown;
+EXTERN_C const IID IID_IClassFactory;
+#ifndef __IUnknown_INTERFACE_DEFINED__
+#define __IUnknown_INTERFACE_DEFINED__
+#undef INTERFACE
+#define INTERFACE IUnknown
+DECLARE_INTERFACE(IUnknown)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+};
+typedef IUnknown *LPUNKNOWN;
+#endif
+#ifndef __IClassFactory_INTERFACE_DEFINED__
+#define __IClassFactory_INTERFACE_DEFINED__
+#undef INTERFACE
+#define INTERFACE IClassFactory
+DECLARE_INTERFACE_(IClassFactory,IUnknown)
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+ STDMETHOD(CreateInstance)(THIS_ LPUNKNOWN,REFIID,PVOID*) PURE;
+ STDMETHOD(LockServer)(THIS_ BOOL) PURE;
+};
+typedef IClassFactory *LPCLASSFACTORY;
+#endif
+HRESULT STDMETHODCALLTYPE IUnknown_QueryInterface_Proxy(IUnknown*,REFIID,void**);
+void __RPC_STUB IUnknown_QueryInterface_Stub(LPRPCSTUBBUFFER,LPRPCCHANNELBUFFER,PRPC_MESSAGE,PDWORD);
+ULONG STDMETHODCALLTYPE IUnknown_AddRef_Proxy(IUnknown*);
+void __RPC_STUB IUnknown_AddRef_Stub(LPRPCSTUBBUFFER,LPRPCCHANNELBUFFER,PRPC_MESSAGE,PDWORD);
+ULONG STDMETHODCALLTYPE IUnknown_Release_Proxy(IUnknown*);
+void __RPC_STUB IUnknown_Release_Stub(LPRPCSTUBBUFFER,LPRPCCHANNELBUFFER,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IClassFactory_RemoteCreateInstance_Proxy(IClassFactory*,REFIID,IUnknown**);
+void __RPC_STUB IClassFactory_RemoteCreateInstance_Stub(LPRPCSTUBBUFFER,LPRPCCHANNELBUFFER,PRPC_MESSAGE,PDWORD);
+HRESULT __stdcall IClassFactory_RemoteLockServer_Proxy(IClassFactory*,BOOL);
+void __RPC_STUB IClassFactory_RemoteLockServer_Stub(LPRPCSTUBBUFFER,LPRPCCHANNELBUFFER,PRPC_MESSAGE,PDWORD);
+HRESULT STDMETHODCALLTYPE IClassFactory_CreateInstance_Proxy(IClassFactory*,IUnknown*,REFIID,void**);
+HRESULT STDMETHODCALLTYPE IClassFactory_CreateInstance_Stub(IClassFactory*,REFIID,IUnknown**);
+HRESULT STDMETHODCALLTYPE IClassFactory_LockServer_Proxy(IClassFactory*,BOOL);
+HRESULT STDMETHODCALLTYPE IClassFactory_LockServer_Stub(IClassFactory*,BOOL);
+#ifdef COBJMACROS
+#define IUnknown_QueryInterface(T,r,O) (T)->lpVtbl->QueryInterface(T,r,O)
+#define IUnknown_AddRef(T) (T)->lpVtbl->AddRef(T)
+#define IUnknown_Release(T) (T)->lpVtbl->Release(T)
+#define IClassFactory_QueryInterface(T,r,O) (T)->lpVtbl->QueryInterface(T,r,O)
+#define IClassFactory_AddRef(T) (T)->lpVtbl->AddRef(T)
+#define IClassFactory_Release(T) (T)->lpVtbl->Release(T)
+#define IClassFactory_CreateInstance(T,p,r,O) (T)->lpVtbl->CreateInstance(T,p,r,O)
+#define IClassFactory_LockServer(T,f) (T)->lpVtbl->LockServer(T,f)
+#endif
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/winsup/w32api/include/winbase.h b/winsup/w32api/include/winbase.h
new file mode 100644
index 000000000..eec682b66
--- /dev/null
+++ b/winsup/w32api/include/winbase.h
@@ -0,0 +1,1841 @@
+#ifndef _WINBASE_H
+#define _WINBASE_H
+#define WINBASEAPI DECLSPEC_IMPORT
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define SP_SERIALCOMM 1
+#define PST_UNSPECIFIED 0
+#define PST_RS232 1
+#define PST_PARALLELPORT 2
+#define PST_RS422 3
+#define PST_RS423 4
+#define PST_RS449 5
+#define PST_MODEM 6
+#define PST_FAX 0x21
+#define PST_SCANNER 0x22
+#define PST_NETWORK_BRIDGE 0x100
+#define PST_LAT 0x101
+#define PST_TCPIP_TELNET 0x102
+#define PST_X25 0x103
+#define BAUD_075 1
+#define BAUD_110 2
+#define BAUD_134_5 4
+#define BAUD_150 8
+#define BAUD_300 16
+#define BAUD_600 32
+#define BAUD_1200 64
+#define BAUD_1800 128
+#define BAUD_2400 256
+#define BAUD_4800 512
+#define BAUD_7200 1024
+#define BAUD_9600 2048
+#define BAUD_14400 4096
+#define BAUD_19200 8192
+#define BAUD_38400 16384
+#define BAUD_56K 32768
+#define BAUD_128K 65536
+#define BAUD_115200 131072
+#define BAUD_57600 262144
+#define BAUD_USER 0x10000000
+#define PCF_DTRDSR 1
+#define PCF_RTSCTS 2
+#define PCF_RLSD 4
+#define PCF_PARITY_CHECK 8
+#define PCF_XONXOFF 16
+#define PCF_SETXCHAR 32
+#define PCF_TOTALTIMEOUTS 64
+#define PCF_INTTIMEOUTS 128
+#define PCF_SPECIALCHARS 256
+#define PCF_16BITMODE 512
+#define SP_PARITY 1
+#define SP_BAUD 2
+#define SP_DATABITS 4
+#define SP_STOPBITS 8
+#define SP_HANDSHAKING 16
+#define SP_PARITY_CHECK 32
+#define SP_RLSD 64
+#define DATABITS_5 1
+#define DATABITS_6 2
+#define DATABITS_7 4
+#define DATABITS_8 8
+#define DATABITS_16 16
+#define DATABITS_16X 32
+#define STOPBITS_10 1
+#define STOPBITS_15 2
+#define STOPBITS_20 4
+#define PARITY_NONE 256
+#define PARITY_ODD 512
+#define PARITY_EVEN 1024
+#define PARITY_MARK 2048
+#define PARITY_SPACE 4096
+#define EXCEPTION_DEBUG_EVENT 1
+#define CREATE_THREAD_DEBUG_EVENT 2
+#define CREATE_PROCESS_DEBUG_EVENT 3
+#define EXIT_THREAD_DEBUG_EVENT 4
+#define EXIT_PROCESS_DEBUG_EVENT 5
+#define LOAD_DLL_DEBUG_EVENT 6
+#define UNLOAD_DLL_DEBUG_EVENT 7
+#define OUTPUT_DEBUG_STRING_EVENT 8
+#define RIP_EVENT 9
+#define HFILE_ERROR ((HFILE)-1)
+#define FILE_BEGIN 0
+#define FILE_CURRENT 1
+#define FILE_END 2
+#define OF_READ 0
+#define OF_READWRITE 2
+#define OF_WRITE 1
+#define OF_SHARE_COMPAT 0
+#define OF_SHARE_DENY_NONE 64
+#define OF_SHARE_DENY_READ 48
+#define OF_SHARE_DENY_WRITE 32
+#define OF_SHARE_EXCLUSIVE 16
+#define OF_CANCEL 2048
+#define OF_CREATE 4096
+#define OF_DELETE 512
+#define OF_EXIST 16384
+#define OF_PARSE 256
+#define OF_PROMPT 8192
+#define OF_REOPEN 32768
+#define OF_VERIFY 1024
+#define NMPWAIT_NOWAIT 1
+#define NMPWAIT_WAIT_FOREVER (-1)
+#define NMPWAIT_USE_DEFAULT_WAIT 0
+#define CE_BREAK 16
+#define CE_DNS 2048
+#define CE_FRAME 8
+#define CE_IOE 1024
+#define CE_MODE 32768
+#define CE_OOP 4096
+#define CE_OVERRUN 2
+#define CE_PTO 512
+#define CE_RXOVER 1
+#define CE_RXPARITY 4
+#define CE_TXFULL 256
+#define PROGRESS_CONTINUE 0
+#define PROGRESS_CANCEL 1
+#define PROGRESS_STOP 2
+#define PROGRESS_QUIET 3
+#define CALLBACK_CHUNK_FINISHED 0
+#define CALLBACK_STREAM_SWITCH 1
+#define COPY_FILE_FAIL_IF_EXISTS 1
+#define COPY_FILE_RESTARTABLE 2
+#define OFS_MAXPATHNAME 128
+#define DUPLICATE_CLOSE_SOURCE 1
+#define DUPLICATE_SAME_ACCESS 2
+#define FILE_MAP_ALL_ACCESS 0xf001f
+#define FILE_MAP_READ 4
+#define FILE_MAP_WRITE 2
+#define FILE_MAP_COPY 1
+#define MUTEX_ALL_ACCESS 0x1f0001
+#define MUTEX_MODIFY_STATE 1
+#define SEMAPHORE_ALL_ACCESS 0x1f0003
+#define SEMAPHORE_MODIFY_STATE 2
+#define EVENT_ALL_ACCESS 0x1f0003
+#define EVENT_MODIFY_STATE 2
+#define PIPE_ACCESS_DUPLEX 3
+#define PIPE_ACCESS_INBOUND 1
+#define PIPE_ACCESS_OUTBOUND 2
+#define PIPE_TYPE_BYTE 0
+#define PIPE_TYPE_MESSAGE 4
+#define PIPE_READMODE_BYTE 0
+#define PIPE_READMODE_MESSAGE 2
+#define PIPE_WAIT 0
+#define PIPE_NOWAIT 1
+#define PIPE_CLIENT_END 0
+#define PIPE_SERVER_END 1
+#define PIPE_UNLIMITED_INSTANCES 255
+#define CREATE_DEFAULT_ERROR_MODE 67108864
+#define DEBUG_PROCESS 1
+#define DEBUG_ONLY_THIS_PROCESS 2
+#define CREATE_SUSPENDED 4
+#define DETACHED_PROCESS 8
+#define CREATE_NEW_CONSOLE 16
+#define NORMAL_PRIORITY_CLASS 32
+#define IDLE_PRIORITY_CLASS 64
+#define HIGH_PRIORITY_CLASS 128
+#define REALTIME_PRIORITY_CLASS 256
+#define CREATE_NEW_PROCESS_GROUP 512
+#define CREATE_UNICODE_ENVIRONMENT 1024
+#define CREATE_SEPARATE_WOW_VDM 2048
+#define CREATE_SHARED_WOW_VDM 4096
+#define CREATE_FORCEDOS 8192
+#define CREATE_NO_WINDOW 0x8000000
+#define CONSOLE_TEXTMODE_BUFFER 1
+#define CREATE_NEW 1
+#define CREATE_ALWAYS 2
+#define OPEN_EXISTING 3
+#define OPEN_ALWAYS 4
+#define TRUNCATE_EXISTING 5
+#define FILE_FLAG_WRITE_THROUGH 0x80000000
+#define FILE_FLAG_OVERLAPPED 1073741824
+#define FILE_FLAG_NO_BUFFERING 536870912
+#define FILE_FLAG_RANDOM_ACCESS 268435456
+#define FILE_FLAG_SEQUENTIAL_SCAN 134217728
+#define FILE_FLAG_DELETE_ON_CLOSE 67108864
+#define FILE_FLAG_BACKUP_SEMANTICS 33554432
+#define FILE_FLAG_POSIX_SEMANTICS 16777216
+#define CLRDTR 6
+#define CLRRTS 4
+#define SETDTR 5
+#define SETRTS 3
+#define SETXOFF 1
+#define SETXON 2
+#define SETBREAK 8
+#define CLRBREAK 9
+#define STILL_ACTIVE 0x103
+#define FIND_FIRST_EX_CASE_SENSITIVE 1
+#define SCS_32BIT_BINARY 0
+#define SCS_DOS_BINARY 1
+#define SCS_OS216_BINARY 5
+#define SCS_PIF_BINARY 3
+#define SCS_POSIX_BINARY 4
+#define SCS_WOW_BINARY 2
+#define MAX_COMPUTERNAME_LENGTH 15
+#define HW_PROFILE_GUIDLEN 39
+#define MAX_PROFILE_LEN 80
+#define DOCKINFO_UNDOCKED 1
+#define DOCKINFO_DOCKED 2
+#define DOCKINFO_USER_SUPPLIED 4
+#define DOCKINFO_USER_UNDOCKED (DOCKINFO_USER_SUPPLIED|DOCKINFO_UNDOCKED)
+#define DOCKINFO_USER_DOCKED (DOCKINFO_USER_SUPPLIED|DOCKINFO_DOCKED)
+#define DRIVE_REMOVABLE 2
+#define DRIVE_FIXED 3
+#define DRIVE_REMOTE 4
+#define DRIVE_CDROM 5
+#define DRIVE_RAMDISK 6
+#define DRIVE_UNKNOWN 0
+#define DRIVE_NO_ROOT_DIR 1
+#define FILE_TYPE_UNKNOWN 0
+#define FILE_TYPE_DISK 1
+#define FILE_TYPE_CHAR 2
+#define FILE_TYPE_PIPE 3
+#define FILE_TYPE_REMOTE 0x8000
+#define HANDLE_FLAG_INHERIT 1
+#define HANDLE_FLAG_PROTECT_FROM_CLOSE 2
+#define STD_INPUT_HANDLE (DWORD)(0xfffffff6)
+#define STD_OUTPUT_HANDLE (DWORD)(0xfffffff5)
+#define STD_ERROR_HANDLE (DWORD)(0xfffffff4)
+#define INVALID_HANDLE_VALUE (HANDLE)(-1)
+#define GET_TAPE_MEDIA_INFORMATION 0
+#define GET_TAPE_DRIVE_INFORMATION 1
+#define SET_TAPE_MEDIA_INFORMATION 0
+#define SET_TAPE_DRIVE_INFORMATION 1
+#define THREAD_PRIORITY_ABOVE_NORMAL 1
+#define THREAD_PRIORITY_BELOW_NORMAL (-1)
+#define THREAD_PRIORITY_HIGHEST 2
+#define THREAD_PRIORITY_IDLE (-15)
+#define THREAD_PRIORITY_LOWEST (-2)
+#define THREAD_PRIORITY_NORMAL 0
+#define THREAD_PRIORITY_TIME_CRITICAL 15
+#define THREAD_PRIORITY_ERROR_RETURN 2147483647
+#define TIME_ZONE_ID_UNKNOWN 0
+#define TIME_ZONE_ID_STANDARD 1
+#define TIME_ZONE_ID_DAYLIGHT 2
+#define TIME_ZONE_ID_INVALID 0xFFFFFFFF
+#define FS_CASE_IS_PRESERVED 2
+#define FS_CASE_SENSITIVE 1
+#define FS_UNICODE_STORED_ON_DISK 4
+#define FS_PERSISTENT_ACLS 8
+#define FS_FILE_COMPRESSION 16
+#define FS_VOL_IS_COMPRESSED 32768
+#define GMEM_FIXED 0
+#define GMEM_MOVEABLE 2
+#define GMEM_MODIFY 128
+#define GPTR 64
+#define GHND 66
+#define GMEM_DDESHARE 8192
+#define GMEM_DISCARDABLE 256
+#define GMEM_LOWER 4096
+#define GMEM_NOCOMPACT 16
+#define GMEM_NODISCARD 32
+#define GMEM_NOT_BANKED 4096
+#define GMEM_NOTIFY 16384
+#define GMEM_SHARE 8192
+#define GMEM_ZEROINIT 64
+#define GMEM_DISCARDED 16384
+#define GMEM_INVALID_HANDLE 32768
+#define GMEM_LOCKCOUNT 255
+#define STATUS_WAIT_0 0
+#define STATUS_ABANDONED_WAIT_0 0x80
+#define STATUS_USER_APC 0xC0
+#define STATUS_TIMEOUT 0x102
+#define STATUS_PENDING 0x103
+#define STATUS_SEGMENT_NOTIFICATION 0x40000005
+#define STATUS_GUARD_PAGE_VIOLATION 0x80000001
+#define STATUS_DATATYPE_MISALIGNMENT 0x80000002
+#define STATUS_BREAKPOINT 0x80000003
+#define STATUS_SINGLE_STEP 0x80000004
+#define STATUS_ACCESS_VIOLATION 0xC0000005
+#define STATUS_IN_PAGE_ERROR 0xC0000006
+#define STATUS_INVALID_HANDLE 0xC0000008L
+#define STATUS_NO_MEMORY 0xC0000017
+#define STATUS_ILLEGAL_INSTRUCTION 0xC000001D
+#define STATUS_NONCONTINUABLE_EXCEPTION 0xC0000025
+#define STATUS_INVALID_DISPOSITION 0xC0000026
+#define STATUS_ARRAY_BOUNDS_EXCEEDED 0xC000008C
+#define STATUS_FLOAT_DENORMAL_OPERAND 0xC000008D
+#define STATUS_FLOAT_DIVIDE_BY_ZERO 0xC000008E
+#define STATUS_FLOAT_INEXACT_RESULT 0xC000008F
+#define STATUS_FLOAT_INVALID_OPERATION 0xC0000090
+#define STATUS_FLOAT_OVERFLOW 0xC0000091
+#define STATUS_FLOAT_STACK_CHECK 0xC0000092
+#define STATUS_FLOAT_UNDERFLOW 0xC0000093
+#define STATUS_INTEGER_DIVIDE_BY_ZERO 0xC0000094
+#define STATUS_INTEGER_OVERFLOW 0xC0000095
+#define STATUS_PRIVILEGED_INSTRUCTION 0xC0000096
+#define STATUS_STACK_OVERFLOW 0xC00000FD
+#define STATUS_CONTROL_C_EXIT 0xC000013A
+#define EXCEPTION_ACCESS_VIOLATION STATUS_ACCESS_VIOLATION
+#define EXCEPTION_DATATYPE_MISALIGNMENT STATUS_DATATYPE_MISALIGNMENT
+#define EXCEPTION_BREAKPOINT STATUS_BREAKPOINT
+#define EXCEPTION_SINGLE_STEP STATUS_SINGLE_STEP
+#define EXCEPTION_ARRAY_BOUNDS_EXCEEDED STATUS_ARRAY_BOUNDS_EXCEEDED
+#define EXCEPTION_FLT_DENORMAL_OPERAND STATUS_FLOAT_DENORMAL_OPERAND
+#define EXCEPTION_FLT_DIVIDE_BY_ZERO STATUS_FLOAT_DIVIDE_BY_ZERO
+#define EXCEPTION_FLT_INEXACT_RESULT STATUS_FLOAT_INEXACT_RESULT
+#define EXCEPTION_FLT_INVALID_OPERATION STATUS_FLOAT_INVALID_OPERATION
+#define EXCEPTION_FLT_OVERFLOW STATUS_FLOAT_OVERFLOW
+#define EXCEPTION_FLT_STACK_CHECK STATUS_FLOAT_STACK_CHECK
+#define EXCEPTION_FLT_UNDERFLOW STATUS_FLOAT_UNDERFLOW
+#define EXCEPTION_INT_DIVIDE_BY_ZERO STATUS_INTEGER_DIVIDE_BY_ZERO
+#define EXCEPTION_INT_OVERFLOW STATUS_INTEGER_OVERFLOW
+#define EXCEPTION_PRIV_INSTRUCTION STATUS_PRIVILEGED_INSTRUCTION
+#define EXCEPTION_IN_PAGE_ERROR STATUS_IN_PAGE_ERROR
+#define EXCEPTION_ILLEGAL_INSTRUCTION STATUS_ILLEGAL_INSTRUCTION
+#define EXCEPTION_NONCONTINUABLE_EXCEPTION STATUS_NONCONTINUABLE_EXCEPTION
+#define EXCEPTION_STACK_OVERFLOW STATUS_STACK_OVERFLOW
+#define EXCEPTION_INVALID_DISPOSITION STATUS_INVALID_DISPOSITION
+#define EXCEPTION_GUARD_PAGE STATUS_GUARD_PAGE_VIOLATION
+#define EXCEPTION_INVALID_HANDLE STATUS_INVALID_HANDLE
+#define CONTROL_C_EXIT STATUS_CONTROL_C_EXIT
+#define PROCESS_HEAP_REGION 1
+#define PROCESS_HEAP_UNCOMMITTED_RANGE 2
+#define PROCESS_HEAP_ENTRY_BUSY 4
+#define PROCESS_HEAP_ENTRY_MOVEABLE 16
+#define PROCESS_HEAP_ENTRY_DDESHARE 32
+#define DONT_RESOLVE_DLL_REFERENCES 1
+#define LOAD_LIBRARY_AS_DATAFILE 2
+#define LOAD_WITH_ALTERED_SEARCH_PATH 8
+#define LMEM_FIXED 0
+#define LMEM_MOVEABLE 2
+#define LMEM_NONZEROLHND 2
+#define LMEM_NONZEROLPTR 0
+#define LMEM_DISCARDABLE 3840
+#define LMEM_NOCOMPACT 16
+#define LMEM_NODISCARD 32
+#define LMEM_ZEROINIT 64
+#define LMEM_DISCARDED 16384
+#define LMEM_MODIFY 128
+#define LMEM_INVALID_HANDLE 32768
+#define LMEM_LOCKCOUNT 255
+#define LPTR 64
+#define LHND 66
+#define NONZEROLHND 2
+#define NONZEROLPTR 0
+#define LOCKFILE_FAIL_IMMEDIATELY 1
+#define LOCKFILE_EXCLUSIVE_LOCK 2
+#define LOGON32_PROVIDER_DEFAULT 0
+#define LOGON32_PROVIDER_WINNT35 1
+#define LOGON32_LOGON_INTERACTIVE 2
+#define LOGON32_LOGON_BATCH 4
+#define LOGON32_LOGON_SERVICE 5
+#define MOVEFILE_REPLACE_EXISTING 1
+#define MOVEFILE_COPY_ALLOWED 2
+#define MOVEFILE_DELAY_UNTIL_REBOOT 4
+#define MOVEFILE_WRITE_THROUGH 8
+#define MAXIMUM_WAIT_OBJECTS 64
+#define MAXIMUM_SUSPEND_COUNT 0x7F
+#define WAIT_OBJECT_0 0
+#define WAIT_ABANDONED_0 128
+#define WAIT_TIMEOUT 0x102
+#define WAIT_IO_COMPLETION 0xC0
+#define WAIT_ABANDONED 128
+#define WAIT_FAILED 0xFFFFFFFF
+#define PURGE_TXABORT 1
+#define PURGE_RXABORT 2
+#define PURGE_TXCLEAR 4
+#define PURGE_RXCLEAR 8
+#define EVENTLOG_FORWARDS_READ 4
+#define EVENTLOG_BACKWARDS_READ 8
+#define EVENTLOG_SEEK_READ 2
+#define EVENTLOG_SEQUENTIAL_READ 1
+#define EVENTLOG_ERROR_TYPE 1
+#define EVENTLOG_WARNING_TYPE 2
+#define EVENTLOG_INFORMATION_TYPE 4
+#define EVENTLOG_AUDIT_SUCCESS 8
+#define EVENTLOG_AUDIT_FAILURE 16
+#define FORMAT_MESSAGE_ALLOCATE_BUFFER 256
+#define FORMAT_MESSAGE_IGNORE_INSERTS 512
+#define FORMAT_MESSAGE_FROM_STRING 1024
+#define FORMAT_MESSAGE_FROM_HMODULE 2048
+#define FORMAT_MESSAGE_FROM_SYSTEM 4096
+#define FORMAT_MESSAGE_ARGUMENT_ARRAY 8192
+#define FORMAT_MESSAGE_MAX_WIDTH_MASK 255
+#define EV_BREAK 64
+#define EV_CTS 8
+#define EV_DSR 16
+#define EV_ERR 128
+#define EV_EVENT1 2048
+#define EV_EVENT2 4096
+#define EV_PERR 512
+#define EV_RING 256
+#define EV_RLSD 32
+#define EV_RX80FULL 1024
+#define EV_RXCHAR 1
+#define EV_RXFLAG 2
+#define EV_TXEMPTY 4
+#define SEM_FAILCRITICALERRORS 1
+#define SEM_NOALIGNMENTFAULTEXCEPT 4
+#define SEM_NOGPFAULTERRORBOX 2
+#define SEM_NOOPENFILEERRORBOX 32768
+#define SLE_ERROR 1
+#define SLE_MINORERROR 2
+#define SLE_WARNING 3
+#define SHUTDOWN_NORETRY 1
+#define EXCEPTION_EXECUTE_HANDLER 1
+#define EXCEPTION_CONTINUE_EXECUTION (-1)
+#define EXCEPTION_CONTINUE_SEARCH 0
+#define TLS_MINIMUM_AVAILABLE 64
+#define MAXINTATOM 0xC000
+#define INVALID_ATOM ((ATOM)0)
+#define IGNORE 0
+#define INFINITE 0xFFFFFFFF
+#define NOPARITY 0
+#define ODDPARITY 1
+#define EVENPARITY 2
+#define MARKPARITY 3
+#define SPACEPARITY 4
+#define ONESTOPBIT 0
+#define ONE5STOPBITS 1
+#define TWOSTOPBITS 2
+#define CBR_110 110
+#define CBR_300 300
+#define CBR_600 600
+#define CBR_1200 1200
+#define CBR_2400 2400
+#define CBR_4800 4800
+#define CBR_9600 9600
+#define CBR_14400 14400
+#define CBR_19200 19200
+#define CBR_38400 38400
+#define CBR_56000 56000
+#define CBR_57600 57600
+#define CBR_115200 115200
+#define CBR_128000 128000
+#define CBR_256000 256000
+#define VER_PLATFORM_WIN32s 0
+#define VER_PLATFORM_WIN32_WINDOWS 1
+#define VER_PLATFORM_WIN32_NT 2
+#define BACKUP_INVALID 0
+#define BACKUP_DATA 1
+#define BACKUP_EA_DATA 2
+#define BACKUP_SECURITY_DATA 3
+#define BACKUP_ALTERNATE_DATA 4
+#define BACKUP_LINK 5
+#define BACKUP_PROPERTY_DATA 6
+#define STREAM_NORMAL_ATTRIBUTE 0
+#define STREAM_MODIFIED_WHEN_READ 1
+#define STREAM_CONTAINS_SECURITY 2
+#define STREAM_CONTAINS_PROPERTIES 4
+#define STARTF_USESHOWWINDOW 1
+#define STARTF_USESIZE 2
+#define STARTF_USEPOSITION 4
+#define STARTF_USECOUNTCHARS 8
+#define STARTF_USEFILLATTRIBUTE 16
+#define STARTF_RUNFULLSCREEN 32
+#define STARTF_FORCEONFEEDBACK 64
+#define STARTF_FORCEOFFFEEDBACK 128
+#define STARTF_USESTDHANDLES 256
+#define STARTF_USEHOTKEY 512
+#define TC_NORMAL 0
+#define TC_HARDERR 1
+#define TC_GP_TRAP 2
+#define TC_SIGNAL 3
+#define AC_LINE_OFFLINE 0
+#define AC_LINE_ONLINE 1
+#define AC_LINE_BACKUP_POWER 2
+#define AC_LINE_UNKNOWN 255
+#define BATTERY_FLAG_HIGH 1
+#define BATTERY_FLAG_LOW 2
+#define BATTERY_FLAG_CRITICAL 4
+#define BATTERY_FLAG_CHARGING 8
+#define BATTERY_FLAG_NO_BATTERY 128
+#define BATTERY_FLAG_UNKNOWN 255
+#define BATTERY_PERCENTAGE_UNKNOWN 255
+#define BATTERY_LIFE_UNKNOWN 0xFFFFFFFF
+#define DDD_RAW_TARGET_PATH 1
+#define DDD_REMOVE_DEFINITION 2
+#define DDD_EXACT_MATCH_ON_REMOVE 4
+#define HINSTANCE_ERROR 32
+#define MS_CTS_ON 16
+#define MS_DSR_ON 32
+#define MS_RING_ON 64
+#define MS_RLSD_ON 128
+#define PROFILE_USER 0x10000000
+#define PROFILE_KERNEL 0x20000000
+#define PROFILE_SERVER 0x40000000
+#define DTR_CONTROL_DISABLE 0
+#define DTR_CONTROL_ENABLE 1
+#define DTR_CONTROL_HANDSHAKE 2
+#define RTS_CONTROL_DISABLE 0
+#define RTS_CONTROL_ENABLE 1
+#define RTS_CONTROL_HANDSHAKE 2
+#define RTS_CONTROL_TOGGLE 3
+#define SECURITY_ANONYMOUS (SecurityAnonymous<<16)
+#define SECURITY_IDENTIFICATION (SecurityIdentification<<16)
+#define SECURITY_IMPERSONATION (SecurityImpersonation<<16)
+#define SECURITY_DELEGATION (SecurityDelegation<<16)
+#define SECURITY_CONTEXT_TRACKING 0x40000
+#define SECURITY_EFFECTIVE_ONLY 0x80000
+#define SECURITY_SQOS_PRESENT 0x100000
+#define SECURITY_VALID_SQOS_FLAGS 0x1F0000
+#define INVALID_FILE_SIZE 0xFFFFFFFF
+#define TLS_OUT_OF_INDEXES (DWORD)0xFFFFFFFF
+
+#ifndef RC_INVOKED
+typedef struct _FILETIME {
+ DWORD dwLowDateTime;
+ DWORD dwHighDateTime;
+} FILETIME,*PFILETIME,*LPFILETIME;
+typedef struct _BY_HANDLE_FILE_INFORMATION {
+ DWORD dwFileAttributes;
+ FILETIME ftCreationTime;
+ FILETIME ftLastAccessTime;
+ FILETIME ftLastWriteTime;
+ DWORD dwVolumeSerialNumber;
+ DWORD nFileSizeHigh;
+ DWORD nFileSizeLow;
+ DWORD nNumberOfLinks;
+ DWORD nFileIndexHigh;
+ DWORD nFileIndexLow;
+} BY_HANDLE_FILE_INFORMATION,*LPBY_HANDLE_FILE_INFORMATION;
+typedef struct _DCB {
+ DWORD DCBlength;
+ DWORD BaudRate;
+ DWORD fBinary:1;
+ DWORD fParity:1;
+ DWORD fOutxCtsFlow:1;
+ DWORD fOutxDsrFlow:1;
+ DWORD fDtrControl:2;
+ DWORD fDsrSensitivity:1;
+ DWORD fTXContinueOnXoff:1;
+ DWORD fOutX:1;
+ DWORD fInX:1;
+ DWORD fErrorChar:1;
+ DWORD fNull:1;
+ DWORD fRtsControl:2;
+ DWORD fAbortOnError:1;
+ DWORD fDummy2:17;
+ WORD wReserved;
+ WORD XonLim;
+ WORD XoffLim;
+ BYTE ByteSize;
+ BYTE Parity;
+ BYTE StopBits;
+ char XonChar;
+ char XoffChar;
+ char ErrorChar;
+ char EofChar;
+ char EvtChar;
+ WORD wReserved1;
+} DCB,*LPDCB;
+typedef struct _COMM_CONFIG {
+ DWORD dwSize;
+ WORD wVersion;
+ WORD wReserved;
+ DCB dcb;
+ DWORD dwProviderSubType;
+ DWORD dwProviderOffset;
+ DWORD dwProviderSize;
+ WCHAR wcProviderData[1];
+} COMMCONFIG,*LPCOMMCONFIG;
+typedef struct _COMMPROP {
+ WORD wPacketLength;
+ WORD wPacketVersion;
+ DWORD dwServiceMask;
+ DWORD dwReserved1;
+ DWORD dwMaxTxQueue;
+ DWORD dwMaxRxQueue;
+ DWORD dwMaxBaud;
+ DWORD dwProvSubType;
+ DWORD dwProvCapabilities;
+ DWORD dwSettableParams;
+ DWORD dwSettableBaud;
+ WORD wSettableData;
+ WORD wSettableStopParity;
+ DWORD dwCurrentTxQueue;
+ DWORD dwCurrentRxQueue;
+ DWORD dwProvSpec1;
+ DWORD dwProvSpec2;
+ WCHAR wcProvChar[1];
+} COMMPROP,*LPCOMMPROP;
+typedef struct _COMMTIMEOUTS {
+ DWORD ReadIntervalTimeout;
+ DWORD ReadTotalTimeoutMultiplier;
+ DWORD ReadTotalTimeoutConstant;
+ DWORD WriteTotalTimeoutMultiplier;
+ DWORD WriteTotalTimeoutConstant;
+} COMMTIMEOUTS,*LPCOMMTIMEOUTS;
+typedef struct _COMSTAT {
+ DWORD fCtsHold:1;
+ DWORD fDsrHold:1;
+ DWORD fRlsdHold:1;
+ DWORD fXoffHold:1;
+ DWORD fXoffSent:1;
+ DWORD fEof:1;
+ DWORD fTxim:1;
+ DWORD fReserved:25;
+ DWORD cbInQue;
+ DWORD cbOutQue;
+} COMSTAT,*LPCOMSTAT;
+typedef DWORD (WINAPI *LPTHREAD_START_ROUTINE)(LPVOID);
+typedef struct _CREATE_PROCESS_DEBUG_INFO {
+ HANDLE hFile;
+ HANDLE hProcess;
+ HANDLE hThread;
+ LPVOID lpBaseOfImage;
+ DWORD dwDebugInfoFileOffset;
+ DWORD nDebugInfoSize;
+ LPVOID lpThreadLocalBase;
+ LPTHREAD_START_ROUTINE lpStartAddress;
+ LPVOID lpImageName;
+ WORD fUnicode;
+} CREATE_PROCESS_DEBUG_INFO,*LPCREATE_PROCESS_DEBUG_INFO;
+typedef struct _CREATE_THREAD_DEBUG_INFO {
+ HANDLE hThread;
+ LPVOID lpThreadLocalBase;
+ LPTHREAD_START_ROUTINE lpStartAddress;
+} CREATE_THREAD_DEBUG_INFO,*LPCREATE_THREAD_DEBUG_INFO;
+typedef struct _EXCEPTION_DEBUG_INFO {
+ EXCEPTION_RECORD ExceptionRecord;
+ DWORD dwFirstChance;
+} EXCEPTION_DEBUG_INFO,*LPEXCEPTION_DEBUG_INFO;
+typedef struct _EXIT_THREAD_DEBUG_INFO {
+ DWORD dwExitCode;
+} EXIT_THREAD_DEBUG_INFO,*LPEXIT_THREAD_DEBUG_INFO;
+typedef struct _EXIT_PROCESS_DEBUG_INFO {
+ DWORD dwExitCode;
+} EXIT_PROCESS_DEBUG_INFO,*LPEXIT_PROCESS_DEBUG_INFO;
+typedef struct _LOAD_DLL_DEBUG_INFO {
+ HANDLE hFile;
+ LPVOID lpBaseOfDll;
+ DWORD dwDebugInfoFileOffset;
+ DWORD nDebugInfoSize;
+ LPVOID lpImageName;
+ WORD fUnicode;
+} LOAD_DLL_DEBUG_INFO,*LPLOAD_DLL_DEBUG_INFO;
+typedef struct _UNLOAD_DLL_DEBUG_INFO {
+ LPVOID lpBaseOfDll;
+} UNLOAD_DLL_DEBUG_INFO,*LPUNLOAD_DLL_DEBUG_INFO;
+typedef struct _OUTPUT_DEBUG_STRING_INFO {
+ LPSTR lpDebugStringData;
+ WORD fUnicode;
+ WORD nDebugStringLength;
+} OUTPUT_DEBUG_STRING_INFO,*LPOUTPUT_DEBUG_STRING_INFO;
+typedef struct _RIP_INFO {
+ DWORD dwError;
+ DWORD dwType;
+} RIP_INFO,*LPRIP_INFO;
+typedef struct _DEBUG_EVENT {
+ DWORD dwDebugEventCode;
+ DWORD dwProcessId;
+ DWORD dwThreadId;
+ union {
+ EXCEPTION_DEBUG_INFO Exception;
+ CREATE_THREAD_DEBUG_INFO CreateThread;
+ CREATE_PROCESS_DEBUG_INFO CreateProcessInfo;
+ EXIT_THREAD_DEBUG_INFO ExitThread;
+ EXIT_PROCESS_DEBUG_INFO ExitProcess;
+ LOAD_DLL_DEBUG_INFO LoadDll;
+ UNLOAD_DLL_DEBUG_INFO UnloadDll;
+ OUTPUT_DEBUG_STRING_INFO DebugString;
+ RIP_INFO RipInfo;
+ } u;
+} DEBUG_EVENT,*LPDEBUG_EVENT;
+typedef struct _OVERLAPPED {
+ DWORD Internal;
+ DWORD InternalHigh;
+ DWORD Offset;
+ DWORD OffsetHigh;
+ HANDLE hEvent;
+} OVERLAPPED,*POVERLAPPED,*LPOVERLAPPED;
+typedef struct _STARTUPINFOA {
+ DWORD cb;
+ LPSTR lpReserved;
+ LPSTR lpDesktop;
+ LPSTR lpTitle;
+ DWORD dwX;
+ DWORD dwY;
+ DWORD dwXSize;
+ DWORD dwYSize;
+ DWORD dwXCountChars;
+ DWORD dwYCountChars;
+ DWORD dwFillAttribute;
+ DWORD dwFlags;
+ WORD wShowWindow;
+ WORD cbReserved2;
+ PBYTE lpReserved2;
+ HANDLE hStdInput;
+ HANDLE hStdOutput;
+ HANDLE hStdError;
+} STARTUPINFOA,*LPSTARTUPINFOA;
+typedef struct _STARTUPINFOW {
+ DWORD cb;
+ LPWSTR lpReserved;
+ LPWSTR lpDesktop;
+ LPWSTR lpTitle;
+ DWORD dwX;
+ DWORD dwY;
+ DWORD dwXSize;
+ DWORD dwYSize;
+ DWORD dwXCountChars;
+ DWORD dwYCountChars;
+ DWORD dwFillAttribute;
+ DWORD dwFlags;
+ WORD wShowWindow;
+ WORD cbReserved2;
+ PBYTE lpReserved2;
+ HANDLE hStdInput;
+ HANDLE hStdOutput;
+ HANDLE hStdError;
+} STARTUPINFOW,*LPSTARTUPINFOW;
+typedef struct _PROCESS_INFORMATION {
+ HANDLE hProcess;
+ HANDLE hThread;
+ DWORD dwProcessId;
+ DWORD dwThreadId;
+} PROCESS_INFORMATION,*LPPROCESS_INFORMATION;
+typedef struct _CRITICAL_SECTION_DEBUG {
+ WORD Type;
+ WORD CreatorBackTraceIndex;
+ struct _CRITICAL_SECTION *CriticalSection;
+ LIST_ENTRY ProcessLocksList;
+ DWORD EntryCount;
+ DWORD ContentionCount;
+ DWORD Spare [2];
+} CRITICAL_SECTION_DEBUG,*PCRITICAL_SECTION_DEBUG;
+typedef struct _CRITICAL_SECTION {
+ PCRITICAL_SECTION_DEBUG DebugInfo;
+ LONG LockCount;
+ LONG RecursionCount;
+ HANDLE OwningThread;
+ HANDLE LockSemaphore;
+ DWORD SpinCount;
+} CRITICAL_SECTION,*PCRITICAL_SECTION,*LPCRITICAL_SECTION;
+typedef struct _SYSTEMTIME {
+ WORD wYear;
+ WORD wMonth;
+ WORD wDayOfWeek;
+ WORD wDay;
+ WORD wHour;
+ WORD wMinute;
+ WORD wSecond;
+ WORD wMilliseconds;
+} SYSTEMTIME,*LPSYSTEMTIME;
+typedef struct _WIN32_FILE_ATTRIBUTE_DATA {
+ DWORD dwFileAttributes;
+ FILETIME ftCreationTime;
+ FILETIME ftLastAccessTime;
+ FILETIME ftLastWriteTime;
+ DWORD nFileSizeHigh;
+ DWORD nFileSizeLow;
+} WIN32_FILE_ATTRIBUTE_DATA,*LPWIN32_FILE_ATTRIBUTE_DATA;
+typedef struct _WIN32_FIND_DATAA {
+ DWORD dwFileAttributes;
+ FILETIME ftCreationTime;
+ FILETIME ftLastAccessTime;
+ FILETIME ftLastWriteTime;
+ DWORD nFileSizeHigh;
+ DWORD nFileSizeLow;
+ DWORD dwReserved0;
+ DWORD dwReserved1;
+ CHAR cFileName[MAX_PATH];
+ CHAR cAlternateFileName[14];
+} WIN32_FIND_DATAA,*LPWIN32_FIND_DATAA;
+typedef struct _WIN32_FIND_DATAW {
+ DWORD dwFileAttributes;
+ FILETIME ftCreationTime;
+ FILETIME ftLastAccessTime;
+ FILETIME ftLastWriteTime;
+ DWORD nFileSizeHigh;
+ DWORD nFileSizeLow;
+ DWORD dwReserved0;
+ DWORD dwReserved1;
+ WCHAR cFileName[MAX_PATH];
+ WCHAR cAlternateFileName[14];
+} WIN32_FIND_DATAW,*LPWIN32_FIND_DATAW;
+typedef struct _WIN32_STREAM_ID {
+ DWORD dwStreamId;
+ DWORD dwStreamAttributes;
+ LARGE_INTEGER Size;
+ DWORD dwStreamNameSize;
+ WCHAR cStreamName[ANYSIZE_ARRAY];
+} WIN32_STREAM_ID;
+typedef enum _FINDEX_INFO_LEVELS {
+ FindExInfoStandard,
+ FindExInfoMaxInfoLevel
+} FINDEX_INFO_LEVELS;
+typedef enum _FINDEX_SEARCH_OPS {
+ FindExSearchNameMatch,
+ FindExSearchLimitToDirectories,
+ FindExSearchLimitToDevices,
+ FindExSearchMaxSearchOp
+} FINDEX_SEARCH_OPS;
+typedef enum _ACL_INFORMATION_CLASS {
+ AclRevisionInformation=1,
+ AclSizeInformation
+} ACL_INFORMATION_CLASS;
+typedef struct tagHW_PROFILE_INFOA {
+ DWORD dwDockInfo;
+ CHAR szHwProfileGuid[HW_PROFILE_GUIDLEN];
+ CHAR szHwProfileName[MAX_PROFILE_LEN];
+} HW_PROFILE_INFOA,*LPHW_PROFILE_INFOA;
+typedef struct tagHW_PROFILE_INFOW {
+ DWORD dwDockInfo;
+ WCHAR szHwProfileGuid[HW_PROFILE_GUIDLEN];
+ WCHAR szHwProfileName[MAX_PROFILE_LEN];
+} HW_PROFILE_INFOW,*LPHW_PROFILE_INFOW;
+typedef enum _GET_FILEEX_INFO_LEVELS {
+ GetFileExInfoStandard,
+ GetFileExMaxInfoLevel
+} GET_FILEEX_INFO_LEVELS;
+typedef struct _SYSTEM_INFO {
+ union {
+ DWORD dwOemId;
+ struct {
+ WORD wProcessorArchitecture;
+ WORD wReserved;
+ } DUMMYSTRUCTNAME;
+ } DUMMYUNIONNAME;
+ DWORD dwPageSize;
+ PVOID lpMinimumApplicationAddress;
+ PVOID lpMaximumApplicationAddress;
+ DWORD dwActiveProcessorMask;
+ DWORD dwNumberOfProcessors;
+ DWORD dwProcessorType;
+ DWORD dwAllocationGranularity;
+ WORD wProcessorLevel;
+ WORD wProcessorRevision;
+} SYSTEM_INFO,*LPSYSTEM_INFO;
+typedef struct _SYSTEM_POWER_STATUS {
+ BYTE ACLineStatus;
+ BYTE BatteryFlag;
+ BYTE BatteryLifePercent;
+ BYTE Reserved1;
+ DWORD BatteryLifeTime;
+ DWORD BatteryFullLifeTime;
+} SYSTEM_POWER_STATUS,*LPSYSTEM_POWER_STATUS;
+typedef struct _TIME_ZONE_INFORMATION {
+ LONG Bias;
+ WCHAR StandardName[32];
+ SYSTEMTIME StandardDate;
+ LONG StandardBias;
+ WCHAR DaylightName[32];
+ SYSTEMTIME DaylightDate;
+ LONG DaylightBias;
+} TIME_ZONE_INFORMATION,*LPTIME_ZONE_INFORMATION;
+typedef struct _OSVERSIONINFOA {
+ DWORD dwOSVersionInfoSize;
+ DWORD dwMajorVersion;
+ DWORD dwMinorVersion;
+ DWORD dwBuildNumber;
+ DWORD dwPlatformId;
+ CHAR szCSDVersion[128];
+} OSVERSIONINFOA,*POSVERSIONINFOA,*LPOSVERSIONINFOA;
+typedef struct _OSVERSIONINFOW {
+ DWORD dwOSVersionInfoSize;
+ DWORD dwMajorVersion;
+ DWORD dwMinorVersion;
+ DWORD dwBuildNumber;
+ DWORD dwPlatformId;
+ WCHAR szCSDVersion[128];
+} OSVERSIONINFOW,*POSVERSIONINFOW,*LPOSVERSIONINFOW;
+typedef struct _MEMORYSTATUS {
+ DWORD dwLength;
+ DWORD dwMemoryLoad;
+ DWORD dwTotalPhys;
+ DWORD dwAvailPhys;
+ DWORD dwTotalPageFile;
+ DWORD dwAvailPageFile;
+ DWORD dwTotalVirtual;
+ DWORD dwAvailVirtual;
+} MEMORYSTATUS,*LPMEMORYSTATUS;
+typedef struct _LDT_ENTRY {
+ WORD LimitLow;
+ WORD BaseLow;
+ union {
+ struct {
+ BYTE BaseMid;
+ BYTE Flags1;
+ BYTE Flags2;
+ BYTE BaseHi;
+ } Bytes;
+ struct {
+ DWORD BaseMid:8;
+ DWORD Type:5;
+ DWORD Dpl:2;
+ DWORD Pres:1;
+ DWORD LimitHi:4;
+ DWORD Sys:1;
+ DWORD Reserved_0:1;
+ DWORD Default_Big:1;
+ DWORD Granularity:1;
+ DWORD BaseHi:8;
+ } Bits;
+ } HighWord;
+} LDT_ENTRY,*PLDT_ENTRY,*LPLDT_ENTRY;
+typedef struct _PROCESS_HEAP_ENTRY {
+ PVOID lpData;
+ DWORD cbData;
+ BYTE cbOverhead;
+ BYTE iRegionIndex;
+ WORD wFlags;
+ union {
+ struct {
+ HANDLE hMem;
+ DWORD dwReserved[3];
+ } Block;
+ struct {
+ DWORD dwCommittedSize;
+ DWORD dwUnCommittedSize;
+ LPVOID lpFirstBlock;
+ LPVOID lpLastBlock;
+ } Region;
+ } DUMMYUNIONNAME;
+} PROCESS_HEAP_ENTRY,*LPPROCESS_HEAP_ENTRY;
+typedef struct _OFSTRUCT {
+ BYTE cBytes;
+ BYTE fFixedDisk;
+ WORD nErrCode;
+ WORD Reserved1;
+ WORD Reserved2;
+ CHAR szPathName[OFS_MAXPATHNAME];
+} OFSTRUCT,*LPOFSTRUCT,*POFSTRUCT;
+typedef struct _WIN_CERTIFICATE {
+ DWORD dwLength;
+ WORD wRevision;
+ WORD wCertificateType;
+ BYTE bCertificate[1];
+} WIN_CERTIFICATE, *LPWIN_CERTIFICATE;
+
+typedef DWORD(WINAPI *LPPROGRESS_ROUTINE)(LARGE_INTEGER,LARGE_INTEGER,LARGE_INTEGER,LARGE_INTEGER,DWORD,DWORD,HANDLE,HANDLE,LPVOID);
+typedef void(WINAPI *LPFIBER_START_ROUTINE)(PVOID);
+typedef BOOL(CALLBACK *ENUMRESLANGPROC)(HANDLE,LPCTSTR,LPCTSTR,WORD,LONG);
+typedef BOOL(CALLBACK *ENUMRESNAMEPROC)(HANDLE,LPCTSTR,LPTSTR,LONG);
+typedef BOOL(CALLBACK *ENUMRESTYPEPROC)(HANDLE,LPTSTR,LONG);
+typedef void(CALLBACK *LPOVERLAPPED_COMPLETION_ROUTINE)(DWORD,DWORD,LPOVERLAPPED);
+typedef LONG(CALLBACK *PTOP_LEVEL_EXCEPTION_FILTER)(LPEXCEPTION_POINTERS);
+typedef PTOP_LEVEL_EXCEPTION_FILTER LPTOP_LEVEL_EXCEPTION_FILTER;
+typedef void(APIENTRY *PAPCFUNC)(DWORD);
+typedef void(CALLBACK *PTIMERAPCROUTINE)(PVOID,DWORD,DWORD);
+#define MAKEINTATOM(i) (LPTSTR)((DWORD)((WORD)(i)))
+/* Functions */
+#ifndef UNDER_CE
+int APIENTRY WinMain(HINSTANCE,HINSTANCE,LPSTR,int);
+#else
+int APIENTRY WinMain(HINSTANCE,HINSTANCE,LPWSTR,int);
+#endif
+int APIENTRY wWinMain(HINSTANCE,HINSTANCE,LPWSTR,int);
+long WINAPI _hread(HFILE,LPVOID,long);
+long WINAPI _hwrite(HFILE,LPCSTR,long);
+HFILE WINAPI _lclose(HFILE);
+HFILE WINAPI _lcreat(LPCSTR,int);
+LONG WINAPI _llseek(HFILE,LONG,int);
+HFILE WINAPI _lopen(LPCSTR,int);
+UINT WINAPI _lread(HFILE,LPVOID,UINT);
+UINT WINAPI _lwrite(HFILE,LPCSTR,UINT);
+#define AbnormalTermination() FALSE
+BOOL WINAPI AccessCheck(PSECURITY_DESCRIPTOR,HANDLE,DWORD,PGENERIC_MAPPING,PPRIVILEGE_SET,PDWORD,PDWORD,PBOOL);
+BOOL WINAPI AccessCheckAndAuditAlarmA(LPCSTR,LPVOID,LPSTR,LPSTR,PSECURITY_DESCRIPTOR,DWORD,PGENERIC_MAPPING,BOOL,PDWORD,PBOOL,PBOOL);
+BOOL WINAPI AccessCheckAndAuditAlarmW(LPCWSTR,LPVOID,LPWSTR,LPWSTR,PSECURITY_DESCRIPTOR,DWORD,PGENERIC_MAPPING,BOOL,PDWORD,PBOOL,PBOOL);
+BOOL WINAPI AddAccessAllowedAce(PACL,DWORD,DWORD,PSID);
+BOOL WINAPI AddAccessDeniedAce(PACL,DWORD,DWORD,PSID);
+BOOL WINAPI AddAce(PACL,DWORD,DWORD,PVOID,DWORD);
+ATOM WINAPI AddAtomA(LPCSTR);
+ATOM WINAPI AddAtomW(LPCWSTR);
+BOOL WINAPI AddAuditAccessAce(PACL,DWORD,DWORD,PSID,BOOL,BOOL);
+BOOL WINAPI AdjustTokenGroups(HANDLE,BOOL,PTOKEN_GROUPS,DWORD,PTOKEN_GROUPS,PDWORD);
+BOOL WINAPI AdjustTokenPrivileges(HANDLE,BOOL,PTOKEN_PRIVILEGES,DWORD,PTOKEN_PRIVILEGES,PDWORD);
+BOOL WINAPI AllocateAndInitializeSid(PSID_IDENTIFIER_AUTHORITY,BYTE,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,PSID*);
+BOOL WINAPI AllocateLocallyUniqueId(PLUID);
+BOOL WINAPI AreAllAccessesGranted(DWORD,DWORD);
+BOOL WINAPI AreAnyAccessesGranted(DWORD,DWORD);
+BOOL WINAPI AreFileApisANSI(void);
+BOOL WINAPI BackupEventLogA(HANDLE,LPCSTR);
+BOOL WINAPI BackupEventLogW(HANDLE,LPCWSTR);
+BOOL WINAPI BackupRead(HANDLE,PBYTE,DWORD,PDWORD,BOOL,BOOL,PVOID);
+BOOL WINAPI BackupSeek(HANDLE,DWORD,DWORD,PDWORD,PDWORD,PVOID);
+BOOL WINAPI BackupWrite(HANDLE,PBYTE,DWORD,PDWORD,BOOL,BOOL,PVOID);
+BOOL WINAPI Beep(DWORD,DWORD);
+HANDLE WINAPI BeginUpdateResourceA(LPCSTR,BOOL);
+HANDLE WINAPI BeginUpdateResourceW(LPCWSTR,BOOL);
+BOOL WINAPI BuildCommDCBA(LPCSTR,LPDCB);
+BOOL WINAPI BuildCommDCBW(LPCWSTR,LPDCB);
+BOOL WINAPI BuildCommDCBAndTimeoutsA(LPCSTR,LPDCB,LPCOMMTIMEOUTS);
+BOOL WINAPI BuildCommDCBAndTimeoutsW(LPCWSTR,LPDCB,LPCOMMTIMEOUTS);
+BOOL WINAPI CallNamedPipeA(LPCSTR,PVOID,DWORD,PVOID,DWORD,PDWORD,DWORD);
+BOOL WINAPI CallNamedPipeW(LPCWSTR,PVOID,DWORD,PVOID,DWORD,PDWORD,DWORD);
+BOOL WINAPI CancelIo(HANDLE);
+BOOL WINAPI CancelWaitableTimer(HANDLE);
+BOOL WINAPI ClearCommBreak(HANDLE);
+BOOL WINAPI ClearCommError(HANDLE,PDWORD,LPCOMSTAT);
+BOOL WINAPI ClearEventLogA(HANDLE,LPCSTR);
+BOOL WINAPI ClearEventLogW(HANDLE,LPCWSTR);
+BOOL WINAPI CloseEventLog(HANDLE);
+BOOL WINAPI CloseHandle(HANDLE);
+BOOL WINAPI CommConfigDialogA(LPSTR,HWND,LPCOMMCONFIG);
+BOOL WINAPI CommConfigDialogW(LPWSTR,HWND,LPCOMMCONFIG);
+LONG WINAPI CompareFileTime(CONST FILETIME*,CONST FILETIME*);
+BOOL WINAPI ConnectNamedPipe(HANDLE,LPOVERLAPPED);
+BOOL WINAPI ContinueDebugEvent(DWORD,DWORD,DWORD);
+PVOID WINAPI ConvertThreadToFiber(PVOID);
+BOOL WINAPI CopyFileA(LPCSTR,LPCSTR,BOOL);
+BOOL WINAPI CopyFileW(LPCWSTR,LPCWSTR,BOOL);
+BOOL WINAPI CopyFileExA(LPCSTR,LPCSTR,LPPROGRESS_ROUTINE,LPVOID,LPBOOL,DWORD);
+BOOL WINAPI CopyFileExW(LPCWSTR,LPCWSTR,LPPROGRESS_ROUTINE,LPVOID,LPBOOL,DWORD);
+#define RtlMoveMemory memmove
+#define RtlCopyMemory memcpy
+#define RtlFillMemory(d,l,f) memset((d), (f), (l))
+#define RtlZeroMemory(d,l) RtlFillMemory((d),(l),0)
+#define MoveMemory RtlMoveMemory
+#define CopyMemory RtlCopyMemory
+#define FillMemory RtlFillMemory
+#define ZeroMemory RtlZeroMemory
+BOOL WINAPI CopySid(DWORD,PSID,PSID);
+BOOL WINAPI CreateDirectoryA(LPCSTR,LPSECURITY_ATTRIBUTES);
+BOOL WINAPI CreateDirectoryW(LPCWSTR,LPSECURITY_ATTRIBUTES);
+BOOL WINAPI CreateDirectoryExA(LPCSTR,LPCSTR,LPSECURITY_ATTRIBUTES);
+BOOL WINAPI CreateDirectoryExW(LPCWSTR,LPCWSTR,LPSECURITY_ATTRIBUTES);
+HANDLE WINAPI CreateEventA(LPSECURITY_ATTRIBUTES,BOOL,BOOL,LPCSTR);
+HANDLE WINAPI CreateEventW(LPSECURITY_ATTRIBUTES,BOOL,BOOL,LPCWSTR);
+LPVOID WINAPI CreateFiber(DWORD,LPFIBER_START_ROUTINE,LPVOID);
+HANDLE WINAPI CreateFileA(LPCSTR,DWORD,DWORD,LPSECURITY_ATTRIBUTES,DWORD,DWORD,HANDLE);
+HANDLE WINAPI CreateFileW(LPCWSTR,DWORD,DWORD,LPSECURITY_ATTRIBUTES,DWORD,DWORD,HANDLE);
+HANDLE WINAPI CreateFileMappingA(HANDLE,LPSECURITY_ATTRIBUTES,DWORD,DWORD,DWORD,LPCSTR);
+HANDLE WINAPI CreateFileMappingW(HANDLE,LPSECURITY_ATTRIBUTES,DWORD,DWORD,DWORD,LPCWSTR);
+HANDLE WINAPI CreateIoCompletionPort(HANDLE,HANDLE,DWORD,DWORD);
+HANDLE WINAPI CreateMailslotA(LPCSTR,DWORD,DWORD,LPSECURITY_ATTRIBUTES);
+HANDLE WINAPI CreateMailslotW(LPCWSTR,DWORD,DWORD,LPSECURITY_ATTRIBUTES);
+HANDLE WINAPI CreateMutexA(LPSECURITY_ATTRIBUTES,BOOL,LPCSTR);
+HANDLE WINAPI CreateMutexW(LPSECURITY_ATTRIBUTES,BOOL,LPCWSTR);
+HANDLE WINAPI CreateNamedPipeA(LPCSTR,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,LPSECURITY_ATTRIBUTES);
+HANDLE WINAPI CreateNamedPipeW(LPCWSTR,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,LPSECURITY_ATTRIBUTES);
+BOOL WINAPI CreatePipe(PHANDLE,PHANDLE,LPSECURITY_ATTRIBUTES,DWORD);
+BOOL WINAPI CreatePrivateObjectSecurity(PSECURITY_DESCRIPTOR,PSECURITY_DESCRIPTOR,PSECURITY_DESCRIPTOR*,BOOL,HANDLE,PGENERIC_MAPPING);
+BOOL WINAPI CreateProcessA(LPCSTR,LPSTR,LPSECURITY_ATTRIBUTES,LPSECURITY_ATTRIBUTES,BOOL,DWORD,PVOID,LPCSTR,LPSTARTUPINFOA,LPPROCESS_INFORMATION);
+BOOL WINAPI CreateProcessW(LPCWSTR,LPWSTR,LPSECURITY_ATTRIBUTES,LPSECURITY_ATTRIBUTES,BOOL,DWORD,PVOID,LPCWSTR,LPSTARTUPINFOW,LPPROCESS_INFORMATION);
+BOOL WINAPI CreateProcessAsUserA(HANDLE,LPCSTR,LPSTR,LPSECURITY_ATTRIBUTES,LPSECURITY_ATTRIBUTES,BOOL,DWORD,PVOID,LPCSTR,LPSTARTUPINFOA,LPPROCESS_INFORMATION);
+BOOL WINAPI CreateProcessAsUserW(HANDLE,LPCWSTR,LPWSTR,LPSECURITY_ATTRIBUTES,LPSECURITY_ATTRIBUTES,BOOL,DWORD,PVOID,LPCWSTR,LPSTARTUPINFOW,LPPROCESS_INFORMATION);
+HANDLE WINAPI CreateRemoteThread(HANDLE,LPSECURITY_ATTRIBUTES,DWORD,LPTHREAD_START_ROUTINE,LPVOID,DWORD,LPDWORD);
+HANDLE WINAPI CreateSemaphoreA(LPSECURITY_ATTRIBUTES,LONG,LONG,LPCSTR);
+HANDLE WINAPI CreateSemaphoreW(LPSECURITY_ATTRIBUTES,LONG,LONG,LPCWSTR);
+DWORD WINAPI CreateTapePartition(HANDLE,DWORD,DWORD,DWORD);
+HANDLE WINAPI CreateThread(LPSECURITY_ATTRIBUTES,DWORD,LPTHREAD_START_ROUTINE,PVOID,DWORD,PDWORD);
+HANDLE WINAPI CreateWaitableTimerA(LPSECURITY_ATTRIBUTES,BOOL,LPCSTR);
+HANDLE WINAPI CreateWaitableTimerW(LPSECURITY_ATTRIBUTES,BOOL,LPCWSTR);
+BOOL WINAPI DebugActiveProcess(DWORD);
+void WINAPI DebugBreak(void);
+BOOL WINAPI DefineDosDeviceA(DWORD,LPCSTR,LPCSTR);
+BOOL WINAPI DefineDosDeviceW(DWORD,LPCWSTR,LPCWSTR);
+#define DefineHandleTable(w) ((w),TRUE)
+BOOL WINAPI DeleteAce(PACL,DWORD);
+ATOM WINAPI DeleteAtom(ATOM);
+void WINAPI DeleteCriticalSection(PCRITICAL_SECTION);
+void WINAPI DeleteFiber(PVOID);
+BOOL WINAPI DeleteFileA(LPCSTR);
+BOOL WINAPI DeleteFileW(LPCWSTR);
+BOOL WINAPI DeregisterEventSource(HANDLE);
+BOOL WINAPI DestroyPrivateObjectSecurity(PSECURITY_DESCRIPTOR*);
+BOOL WINAPI DeviceIoControl(HANDLE,DWORD,PVOID,DWORD,PVOID,DWORD,PDWORD,POVERLAPPED);
+BOOL WINAPI DisableThreadLibraryCalls(HMODULE);
+BOOL WINAPI DisconnectNamedPipe(HANDLE);
+BOOL WINAPI DosDateTimeToFileTime(WORD,WORD,LPFILETIME);
+BOOL WINAPI DuplicateHandle(HANDLE,HANDLE,HANDLE,PHANDLE,DWORD,BOOL,DWORD);
+BOOL WINAPI DuplicateToken(HANDLE,SECURITY_IMPERSONATION_LEVEL,PHANDLE);
+BOOL WINAPI DuplicateTokenEx(HANDLE,DWORD,LPSECURITY_ATTRIBUTES,SECURITY_IMPERSONATION_LEVEL,TOKEN_TYPE,PHANDLE);
+BOOL WINAPI EndUpdateResourceA(HANDLE,BOOL);
+BOOL WINAPI EndUpdateResourceW(HANDLE,BOOL);
+void WINAPI EnterCriticalSection(LPCRITICAL_SECTION);
+BOOL WINAPI EnumResourceLanguagesA(HINSTANCE,LPCSTR,LPCSTR,ENUMRESLANGPROC,LONG);
+BOOL WINAPI EnumResourceLanguagesW(HINSTANCE,LPCWSTR,LPCWSTR,ENUMRESLANGPROC,LONG);
+BOOL WINAPI EnumResourceNamesA(HINSTANCE,LPCSTR,ENUMRESNAMEPROC,LONG);
+BOOL WINAPI EnumResourceNamesW(HINSTANCE,LPCWSTR,ENUMRESNAMEPROC,LONG);
+BOOL WINAPI EnumResourceTypesA(HINSTANCE,ENUMRESTYPEPROC,LONG);
+BOOL WINAPI EnumResourceTypesW(HINSTANCE,ENUMRESTYPEPROC,LONG);
+BOOL WINAPI EqualPrefixSid(PSID,PSID);
+BOOL WINAPI EqualSid(PSID,PSID);
+DWORD WINAPI EraseTape(HANDLE,DWORD,BOOL);
+BOOL WINAPI EscapeCommFunction(HANDLE,DWORD);
+DECLSPEC_NORETURN void WINAPI ExitProcess(UINT);
+DECLSPEC_NORETURN void WINAPI ExitThread(DWORD);
+DWORD WINAPI ExpandEnvironmentStringsA(LPCSTR,LPSTR,DWORD);
+DWORD WINAPI ExpandEnvironmentStringsW(LPCWSTR,LPWSTR,DWORD);
+void WINAPI FatalAppExitA(UINT,LPCSTR);
+void WINAPI FatalAppExitW(UINT,LPCWSTR);
+void WINAPI FatalExit(int);
+BOOL WINAPI FileTimeToDosDateTime(CONST FILETIME *,LPWORD,LPWORD);
+BOOL WINAPI FileTimeToLocalFileTime(FILETIME *,LPFILETIME);
+BOOL WINAPI FileTimeToSystemTime(CONST FILETIME *,LPSYSTEMTIME);
+ATOM WINAPI FindAtomA(LPCSTR);
+ATOM WINAPI FindAtomW(LPCWSTR);
+BOOL WINAPI FindClose(HANDLE);
+BOOL WINAPI FindCloseChangeNotification(HANDLE);
+HANDLE WINAPI FindFirstChangeNotificationA(LPCSTR,BOOL,DWORD);
+HANDLE WINAPI FindFirstChangeNotificationW(LPCWSTR,BOOL,DWORD);
+HANDLE WINAPI FindFirstFileA(LPCSTR,LPWIN32_FIND_DATAA);
+HANDLE WINAPI FindFirstFileW(LPCWSTR,LPWIN32_FIND_DATAW);
+HANDLE WINAPI FindFirstFileExA(LPCSTR,FINDEX_INFO_LEVELS,PVOID,FINDEX_SEARCH_OPS,PVOID,DWORD);
+HANDLE WINAPI FindFirstFileExW(LPCWSTR,FINDEX_INFO_LEVELS,PVOID,FINDEX_SEARCH_OPS,PVOID,DWORD);
+BOOL WINAPI FindFirstFreeAce(PACL,PVOID*);
+BOOL WINAPI FindNextChangeNotification(HANDLE);
+BOOL WINAPI FindNextFileA(HANDLE,LPWIN32_FIND_DATAA);
+BOOL WINAPI FindNextFileW(HANDLE,LPWIN32_FIND_DATAW);
+HRSRC WINAPI FindResourceA(HMODULE,LPCSTR,LPCSTR);
+HRSRC WINAPI FindResourceW(HINSTANCE,LPCWSTR,LPCWSTR);
+HRSRC WINAPI FindResourceExA(HINSTANCE,LPCSTR,LPCSTR,WORD);
+HRSRC WINAPI FindResourceExW(HINSTANCE,LPCWSTR,LPCWSTR,WORD);
+BOOL WINAPI FlushFileBuffers(HANDLE);
+BOOL WINAPI FlushInstructionCache(HANDLE,PCVOID,DWORD);
+BOOL WINAPI FlushViewOfFile(PCVOID,DWORD);
+DWORD WINAPI FormatMessageA(DWORD,PCVOID,DWORD,DWORD,LPSTR,DWORD,va_list*);
+DWORD WINAPI FormatMessageW(DWORD,PCVOID,DWORD,DWORD,LPWSTR,DWORD,va_list*);
+BOOL WINAPI FreeEnvironmentStringsA(LPSTR);
+BOOL WINAPI FreeEnvironmentStringsW(LPWSTR);
+BOOL WINAPI FreeLibrary(HMODULE);
+void WINAPI FreeLibraryAndExitThread(HMODULE,DWORD);
+#define FreeModule(m) FreeLibrary(m)
+#define FreeProcInstance(p) (void)(p)
+BOOL WINAPI FreeResource(HGLOBAL);
+PVOID WINAPI FreeSid(PSID);
+BOOL WINAPI GetAce(PACL,DWORD,PVOID);
+BOOL WINAPI GetAclInformation(PACL,PVOID,DWORD,ACL_INFORMATION_CLASS);
+UINT WINAPI GetAtomNameA(ATOM,LPSTR,int);
+UINT WINAPI GetAtomNameW(ATOM,LPWSTR,int);
+BOOL WINAPI GetBinaryTypeA(LPCSTR,PDWORD);
+BOOL WINAPI GetBinaryTypeW(LPCWSTR,PDWORD);
+LPSTR WINAPI GetCommandLineA(VOID);
+LPWSTR WINAPI GetCommandLineW(VOID);
+BOOL WINAPI GetCommConfig(HANDLE,LPCOMMCONFIG,PDWORD);
+BOOL WINAPI GetCommMask(HANDLE,PDWORD);
+BOOL WINAPI GetCommModemStatus(HANDLE,PDWORD);
+BOOL WINAPI GetCommProperties(HANDLE,LPCOMMPROP);
+BOOL WINAPI GetCommState(HANDLE,LPDCB);
+BOOL WINAPI GetCommTimeouts(HANDLE,LPCOMMTIMEOUTS);
+DWORD WINAPI GetCompressedFileSizeA(LPCSTR,PDWORD);
+DWORD WINAPI GetCompressedFileSizeW(LPCWSTR,PDWORD);
+BOOL WINAPI GetComputerNameA(LPSTR,PDWORD);
+BOOL WINAPI GetComputerNameW(LPWSTR,PDWORD);
+DWORD WINAPI GetCurrentDirectoryA(DWORD,LPSTR);
+DWORD WINAPI GetCurrentDirectoryW(DWORD,LPWSTR);
+BOOL WINAPI GetCurrentHwProfileA(LPHW_PROFILE_INFOA);
+BOOL WINAPI GetCurrentHwProfileW(LPHW_PROFILE_INFOW);
+HANDLE WINAPI GetCurrentProcess(void);
+DWORD WINAPI GetCurrentProcessId(void);
+HANDLE WINAPI GetCurrentThread(void);
+DWORD WINAPI GetCurrentThreadId(void);
+#define GetCurrentTime GetTickCount
+BOOL WINAPI GetDefaultCommConfigA(LPCSTR,LPCOMMCONFIG,PDWORD);
+BOOL WINAPI GetDefaultCommConfigW(LPCWSTR,LPCOMMCONFIG,PDWORD);
+BOOL WINAPI GetDiskFreeSpaceA(LPCSTR,PDWORD,PDWORD,PDWORD,PDWORD);
+BOOL WINAPI GetDiskFreeSpaceW(LPCWSTR,PDWORD,PDWORD,PDWORD,PDWORD);
+BOOL WINAPI GetDiskFreeSpaceExA(LPCSTR,PULARGE_INTEGER,PULARGE_INTEGER,PULARGE_INTEGER);
+BOOL WINAPI GetDiskFreeSpaceExW(LPCWSTR,PULARGE_INTEGER,PULARGE_INTEGER,PULARGE_INTEGER);
+UINT WINAPI GetDriveTypeA(LPCSTR);
+UINT WINAPI GetDriveTypeW(LPCWSTR);
+LPSTR WINAPI GetEnvironmentStrings(void);
+LPSTR WINAPI GetEnvironmentStringsA(void);
+LPWSTR WINAPI GetEnvironmentStringsW(void);
+DWORD WINAPI GetEnvironmentVariableA(LPCSTR,LPSTR,DWORD);
+DWORD WINAPI GetEnvironmentVariableW(LPCWSTR,LPWSTR,DWORD);
+BOOL WINAPI GetExitCodeProcess(HANDLE,PDWORD);
+BOOL WINAPI GetExitCodeThread(HANDLE,PDWORD);
+DWORD WINAPI GetFileAttributesA(LPCSTR);
+DWORD WINAPI GetFileAttributesW(LPCWSTR);
+BOOL WINAPI GetFileAttributesExA(LPCSTR,GET_FILEEX_INFO_LEVELS,PVOID);
+BOOL WINAPI GetFileAttributesExW(LPCSTR,GET_FILEEX_INFO_LEVELS,PVOID);
+BOOL WINAPI GetFileInformationByHandle(HANDLE,LPBY_HANDLE_FILE_INFORMATION);
+BOOL WINAPI GetFileSecurityA(LPCSTR,SECURITY_INFORMATION,PSECURITY_DESCRIPTOR,DWORD,PDWORD);
+BOOL WINAPI GetFileSecurityW(LPCWSTR,SECURITY_INFORMATION,PSECURITY_DESCRIPTOR,DWORD,PDWORD);
+DWORD WINAPI GetFileSize(HANDLE,PDWORD);
+BOOL WINAPI GetFileTime(HANDLE,LPFILETIME,LPFILETIME,LPFILETIME);
+DWORD WINAPI GetFileType(HANDLE);
+#define GetFreeSpace(w) (0x100000L)
+DWORD WINAPI GetFullPathNameA(LPCSTR,DWORD,LPSTR,LPSTR*);
+DWORD WINAPI GetFullPathNameW(LPCWSTR,DWORD,LPWSTR,LPWSTR*);
+BOOL WINAPI GetHandleInformation(HANDLE,PDWORD);
+BOOL WINAPI GetKernelObjectSecurity(HANDLE,SECURITY_INFORMATION,PSECURITY_DESCRIPTOR,DWORD,PDWORD);
+DWORD WINAPI GetLengthSid(PSID);
+void WINAPI GetLocalTime(LPSYSTEMTIME);
+DWORD WINAPI GetLogicalDrives(void);
+DWORD WINAPI GetLogicalDriveStringsA(DWORD,LPSTR);
+DWORD WINAPI GetLogicalDriveStringsW(DWORD,LPWSTR);
+DWORD WINAPI GetLongPathNameA(LPCSTR,LPSTR,DWORD);
+DWORD WINAPI GetLongPathNameW(LPCWSTR,LPWSTR,DWORD);
+BOOL WINAPI GetMailslotInfo(HANDLE,PDWORD,PDWORD,PDWORD,PDWORD);
+DWORD WINAPI GetModuleFileNameA(HINSTANCE,LPSTR,DWORD);
+DWORD WINAPI GetModuleFileNameW(HINSTANCE,LPWSTR,DWORD);
+HMODULE WINAPI GetModuleHandleA(LPCSTR);
+HMODULE WINAPI GetModuleHandleW(LPCWSTR);
+BOOL WINAPI GetNamedPipeHandleStateA(HANDLE,PDWORD,PDWORD,PDWORD,PDWORD,LPSTR,DWORD);
+BOOL WINAPI GetNamedPipeHandleStateW(HANDLE,PDWORD,PDWORD,PDWORD,PDWORD,LPWSTR,DWORD);
+BOOL WINAPI GetNamedPipeInfo(HANDLE,PDWORD,PDWORD,PDWORD,PDWORD);
+BOOL WINAPI GetNumberOfEventLogRecords(HANDLE,PDWORD);
+BOOL WINAPI GetOldestEventLogRecord(HANDLE,PDWORD);
+BOOL WINAPI GetOverlappedResult(HANDLE,LPOVERLAPPED,PDWORD,BOOL);
+DWORD WINAPI GetPriorityClass(HANDLE);
+BOOL WINAPI GetPrivateObjectSecurity(PSECURITY_DESCRIPTOR,SECURITY_INFORMATION,PSECURITY_DESCRIPTOR,DWORD,PDWORD);
+UINT WINAPI GetPrivateProfileIntA(LPCSTR,LPCSTR,INT,LPCSTR);
+UINT WINAPI GetPrivateProfileIntW(LPCWSTR,LPCWSTR,INT,LPCWSTR);
+DWORD WINAPI GetPrivateProfileSectionA(LPCSTR,LPSTR,DWORD,LPCSTR);
+DWORD WINAPI GetPrivateProfileSectionW(LPCWSTR,LPWSTR,DWORD,LPCWSTR);
+DWORD WINAPI GetPrivateProfileSectionNamesA(LPSTR,DWORD,LPCSTR);
+DWORD WINAPI GetPrivateProfileSectionNamesW(LPWSTR,DWORD,LPCWSTR);
+DWORD WINAPI GetPrivateProfileStringA(LPCSTR,LPCSTR,LPCSTR,LPSTR,DWORD,LPCSTR);
+DWORD WINAPI GetPrivateProfileStringW(LPCWSTR,LPCWSTR,LPCWSTR,LPWSTR,DWORD,LPCWSTR);
+BOOL WINAPI GetPrivateProfileStructA(LPCSTR,LPCSTR,PVOID,UINT,LPCSTR);
+BOOL WINAPI GetPrivateProfileStructW(LPCWSTR,LPCWSTR,PVOID,UINT,LPCWSTR);
+FARPROC WINAPI GetProcAddress(HINSTANCE,LPCSTR);
+BOOL WINAPI GetProcessAffinityMask(HANDLE,PDWORD,PDWORD);
+HANDLE WINAPI GetProcessHeap(VOID);
+DWORD WINAPI GetProcessHeaps(DWORD,PHANDLE);
+BOOL WINAPI GetProcessPriorityBoost(HANDLE,PBOOL);
+BOOL WINAPI GetProcessShutdownParameters(PDWORD,PDWORD);
+BOOL WINAPI GetProcessTimes(HANDLE,LPFILETIME,LPFILETIME,LPFILETIME,LPFILETIME);
+DWORD WINAPI GetProcessVersion(DWORD);
+HWINSTA WINAPI GetProcessWindowStation(void);
+BOOL WINAPI GetProcessWorkingSetSize(HANDLE,PDWORD,PDWORD);
+UINT WINAPI GetProfileIntA(LPCSTR,LPCSTR,INT);
+UINT WINAPI GetProfileIntW(LPCWSTR,LPCWSTR,INT);
+DWORD WINAPI GetProfileSectionA(LPCSTR,LPSTR,DWORD);
+DWORD WINAPI GetProfileSectionW(LPCWSTR,LPWSTR,DWORD);
+DWORD WINAPI GetProfileStringA(LPCSTR,LPCSTR,LPCSTR,LPSTR,DWORD);
+DWORD WINAPI GetProfileStringW(LPCWSTR,LPCWSTR,LPCWSTR,LPWSTR,DWORD);
+BOOL WINAPI GetQueuedCompletionStatus(HANDLE,PDWORD,PDWORD,LPOVERLAPPED*,DWORD);
+BOOL WINAPI GetSecurityDescriptorControl(PSECURITY_DESCRIPTOR,PSECURITY_DESCRIPTOR_CONTROL,PDWORD);
+BOOL WINAPI GetSecurityDescriptorDacl(PSECURITY_DESCRIPTOR,LPBOOL,PACL*,LPBOOL);
+BOOL WINAPI GetSecurityDescriptorGroup(PSECURITY_DESCRIPTOR,PSID*,LPBOOL);
+DWORD WINAPI GetSecurityDescriptorLength(PSECURITY_DESCRIPTOR);
+BOOL WINAPI GetSecurityDescriptorOwner(PSECURITY_DESCRIPTOR,PSID*,LPBOOL);
+BOOL WINAPI GetSecurityDescriptorSacl(PSECURITY_DESCRIPTOR,LPBOOL,PACL*,LPBOOL);
+DWORD WINAPI GetShortPathNameA(LPCSTR,LPSTR,DWORD);
+DWORD WINAPI GetShortPathNameW(LPCWSTR,LPWSTR,DWORD);
+PSID_IDENTIFIER_AUTHORITY WINAPI GetSidIdentifierAuthority(PSID);
+DWORD WINAPI GetSidLengthRequired(UCHAR);
+PDWORD WINAPI GetSidSubAuthority(PSID,DWORD);
+PUCHAR WINAPI GetSidSubAuthorityCount(PSID);
+VOID WINAPI GetStartupInfoA(LPSTARTUPINFOA);
+VOID WINAPI GetStartupInfoW(LPSTARTUPINFOW);
+HANDLE WINAPI GetStdHandle(DWORD);
+UINT WINAPI GetSystemDirectoryA(LPSTR,UINT);
+UINT WINAPI GetSystemDirectoryW(LPWSTR,UINT);
+VOID WINAPI GetSystemInfo(LPSYSTEM_INFO);
+BOOL WINAPI GetSystemPowerStatus(LPSYSTEM_POWER_STATUS);
+VOID WINAPI GetSystemTime(LPSYSTEMTIME);
+BOOL WINAPI GetSystemTimeAdjustment(PDWORD,PDWORD,PBOOL);
+void WINAPI GetSystemTimeAsFileTime(LPFILETIME);
+DWORD WINAPI GetTapeParameters(HANDLE,DWORD,PDWORD,PVOID);
+DWORD WINAPI GetTapePosition(HANDLE,DWORD,PDWORD,PDWORD,PDWORD);
+DWORD WINAPI GetTapeStatus(HANDLE);
+UINT WINAPI GetTempFileNameA(LPCSTR,LPCSTR,UINT,LPSTR);
+UINT WINAPI GetTempFileNameW(LPCWSTR,LPCWSTR,UINT,LPWSTR);
+DWORD WINAPI GetTempPathA(DWORD,LPSTR);
+DWORD WINAPI GetTempPathW(DWORD,LPWSTR);
+BOOL WINAPI GetThreadContext(HANDLE,LPCONTEXT);
+int WINAPI GetThreadPriority(HANDLE);
+BOOL WINAPI GetThreadPriorityBoost(HANDLE,PBOOL);
+BOOL WINAPI GetThreadSelectorEntry(HANDLE,DWORD,LPLDT_ENTRY);
+BOOL WINAPI GetThreadTimes(HANDLE,LPFILETIME,LPFILETIME,LPFILETIME,LPFILETIME);
+DWORD WINAPI GetTickCount(void);
+DWORD WINAPI GetTimeZoneInformation(LPTIME_ZONE_INFORMATION);
+BOOL WINAPI GetTokenInformation(HANDLE,TOKEN_INFORMATION_CLASS,PVOID,DWORD,PDWORD);
+BOOL WINAPI GetUserNameA (LPSTR,PDWORD);
+BOOL WINAPI GetUserNameW(LPWSTR,PDWORD);
+DWORD WINAPI GetVersion(void);
+BOOL WINAPI GetVersionExA(LPOSVERSIONINFOA);
+BOOL WINAPI GetVersionExW(LPOSVERSIONINFOW);
+BOOL WINAPI GetVolumeInformationA(LPCSTR,LPSTR,DWORD,PDWORD,PDWORD,PDWORD,LPSTR,DWORD);
+BOOL WINAPI GetVolumeInformationW(LPCWSTR,LPWSTR,DWORD,PDWORD,PDWORD,PDWORD,LPWSTR,DWORD);
+UINT WINAPI GetWindowsDirectoryA(LPSTR,UINT);
+UINT WINAPI GetWindowsDirectoryW(LPWSTR,UINT);
+DWORD WINAPI GetWindowThreadProcessId(HWND,PDWORD);
+ATOM WINAPI GlobalAddAtomA(LPCSTR);
+ATOM WINAPI GlobalAddAtomW( LPCWSTR);
+HGLOBAL WINAPI GlobalAlloc(UINT,DWORD);
+UINT WINAPI GlobalCompact(DWORD);
+ATOM WINAPI GlobalDeleteAtom(ATOM);
+HGLOBAL GlobalDiscard(HGLOBAL);
+ATOM WINAPI GlobalFindAtomA(LPCSTR);
+ATOM WINAPI GlobalFindAtomW(LPCWSTR);
+VOID WINAPI GlobalFix(HGLOBAL);
+UINT WINAPI GlobalFlags(HGLOBAL);
+HGLOBAL WINAPI GlobalFree(HGLOBAL);
+UINT WINAPI GlobalGetAtomNameA(ATOM,LPSTR,int);
+UINT WINAPI GlobalGetAtomNameW(ATOM,LPWSTR,int);
+HGLOBAL WINAPI GlobalHandle(PCVOID);
+LPVOID WINAPI GlobalLock(HGLOBAL);
+VOID WINAPI GlobalMemoryStatus(LPMEMORYSTATUS);
+HGLOBAL WINAPI GlobalReAlloc(HGLOBAL,DWORD,UINT);
+DWORD WINAPI GlobalSize(HGLOBAL);
+VOID WINAPI GlobalUnfix(HGLOBAL);
+BOOL WINAPI GlobalUnlock(HGLOBAL);
+BOOL WINAPI GlobalUnWire(HGLOBAL);
+PVOID WINAPI GlobalWire(HGLOBAL);
+PVOID WINAPI HeapAlloc(HANDLE,DWORD,DWORD);
+UINT WINAPI HeapCompact(HANDLE,DWORD);
+HANDLE WINAPI HeapCreate(DWORD,DWORD,DWORD);
+BOOL WINAPI HeapDestroy(HANDLE);
+BOOL WINAPI HeapFree(HANDLE,DWORD,PVOID);
+BOOL WINAPI HeapLock(HANDLE);
+PVOID WINAPI HeapReAlloc(HANDLE,DWORD,PVOID,DWORD);
+DWORD WINAPI HeapSize(HANDLE,DWORD,PCVOID);
+BOOL WINAPI HeapUnlock(HANDLE);
+BOOL WINAPI HeapValidate(HANDLE,DWORD,PCVOID);
+BOOL WINAPI HeapWalk(HANDLE,LPPROCESS_HEAP_ENTRY);
+BOOL WINAPI ImpersonateLoggedOnUser(HANDLE);
+BOOL WINAPI ImpersonateNamedPipeClient(HANDLE);
+BOOL WINAPI ImpersonateSelf(SECURITY_IMPERSONATION_LEVEL);
+BOOL WINAPI InitAtomTable(DWORD);
+BOOL WINAPI InitializeAcl(PACL,DWORD,DWORD);
+VOID WINAPI InitializeCriticalSection(LPCRITICAL_SECTION);
+BOOL WINAPI InitializeSecurityDescriptor(PSECURITY_DESCRIPTOR,DWORD);
+BOOL WINAPI InitializeSid (PSID,PSID_IDENTIFIER_AUTHORITY,BYTE);
+PVOID WINAPI InterlockedCompareExchange(PVOID*,PVOID,PVOID);
+LONG WINAPI InterlockedDecrement(LPLONG);
+LONG WINAPI InterlockedExchange(PLONG,LONG);
+LONG WINAPI InterlockedExchangeAdd(PLONG,LONG);
+LONG WINAPI InterlockedIncrement(LPLONG);
+BOOL WINAPI IsBadCodePtr(FARPROC);
+BOOL WINAPI IsBadHugeReadPtr(PCVOID,UINT);
+BOOL WINAPI IsBadHugeWritePtr(PVOID,UINT);
+BOOL WINAPI IsBadReadPtr(PCVOID,UINT);
+BOOL WINAPI IsBadStringPtrA(LPCSTR,UINT);
+BOOL WINAPI IsBadStringPtrW(LPCWSTR,UINT);
+BOOL WINAPI IsBadWritePtr(PVOID,UINT);
+BOOL WINAPI IsDebuggerPresent(void);
+BOOL WINAPI IsProcessorFeaturePresent(DWORD);
+BOOL WINAPI IsTextUnicode(PCVOID,int,LPINT);
+BOOL WINAPI IsValidAcl(PACL);
+BOOL WINAPI IsValidSecurityDescriptor(PSECURITY_DESCRIPTOR);
+BOOL WINAPI IsValidSid(PSID);
+void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION);
+#define LimitEmsPages(n)
+HINSTANCE WINAPI LoadLibraryA(LPCSTR);
+HINSTANCE WINAPI LoadLibraryExA(LPCSTR,HANDLE,DWORD);
+HINSTANCE WINAPI LoadLibraryExW(LPCWSTR,HANDLE,DWORD);
+HINSTANCE WINAPI LoadLibraryW(LPCWSTR);
+DWORD WINAPI LoadModule(LPCSTR,PVOID);
+HGLOBAL WINAPI LoadResource(HINSTANCE,HRSRC);
+HLOCAL WINAPI LocalAlloc(UINT,UINT);
+UINT WINAPI LocalCompact(UINT);
+HLOCAL LocalDiscard(HLOCAL);
+BOOL WINAPI LocalFileTimeToFileTime(CONST FILETIME *,LPFILETIME);
+UINT WINAPI LocalFlags(HLOCAL);
+HLOCAL WINAPI LocalFree(HLOCAL);
+HLOCAL WINAPI LocalHandle(LPCVOID);
+PVOID WINAPI LocalLock(HLOCAL);
+HLOCAL WINAPI LocalReAlloc(HLOCAL,UINT,UINT);
+UINT WINAPI LocalShrink(HLOCAL,UINT);
+UINT WINAPI LocalSize(HLOCAL);
+BOOL WINAPI LocalUnlock(HLOCAL);
+BOOL WINAPI LockFile(HANDLE,DWORD,DWORD,DWORD,DWORD);
+BOOL WINAPI LockFileEx(HANDLE,DWORD,DWORD,DWORD,DWORD,LPOVERLAPPED);
+PVOID WINAPI LockResource(HGLOBAL);
+#define LockSegment(w) GlobalFix((HANDLE)(w))
+BOOL WINAPI LogonUserA(LPSTR,LPSTR,LPSTR,DWORD,DWORD,PHANDLE);
+BOOL WINAPI LogonUserW(LPWSTR,LPWSTR,LPWSTR,DWORD,DWORD,PHANDLE);
+BOOL WINAPI LookupAccountNameA(LPCSTR,LPCSTR,PSID,PDWORD,LPSTR,PDWORD,PSID_NAME_USE);
+BOOL WINAPI LookupAccountNameW(LPCWSTR,LPCWSTR,PSID,PDWORD,LPWSTR,PDWORD,PSID_NAME_USE);
+BOOL WINAPI LookupAccountSidA(LPCSTR,PSID,LPSTR,PDWORD,LPSTR,PDWORD,PSID_NAME_USE);
+BOOL WINAPI LookupAccountSidW(LPCWSTR,PSID,LPWSTR,PDWORD,LPWSTR,PDWORD,PSID_NAME_USE);
+BOOL WINAPI LookupPrivilegeDisplayNameA(LPCSTR,LPCSTR,LPSTR,PDWORD,PDWORD);
+BOOL WINAPI LookupPrivilegeDisplayNameW(LPCWSTR,LPCWSTR,LPWSTR,PDWORD,PDWORD);
+BOOL WINAPI LookupPrivilegeNameA(LPCSTR,PLUID,LPSTR,PDWORD);
+BOOL WINAPI LookupPrivilegeNameW(LPCWSTR,PLUID,LPWSTR,PDWORD);
+BOOL WINAPI LookupPrivilegeValueA(LPCSTR,LPCSTR,PLUID);
+BOOL WINAPI LookupPrivilegeValueW(LPCWSTR,LPCWSTR,PLUID);
+LPSTR WINAPI lstrcatA(LPSTR,LPCSTR);
+LPWSTR WINAPI lstrcatW(LPWSTR,LPCWSTR);
+int WINAPI lstrcmpA(LPCSTR,LPCSTR);
+int WINAPI lstrcmpiA(LPCSTR,LPCSTR);
+int WINAPI lstrcmpiW( LPCWSTR,LPCWSTR);
+int WINAPI lstrcmpW(LPCWSTR,LPCWSTR);
+LPSTR WINAPI lstrcpyA(LPSTR,LPCSTR);
+LPSTR WINAPI lstrcpynA(LPSTR,LPCSTR,int);
+LPWSTR WINAPI lstrcpynW(LPWSTR,LPCWSTR,int);
+LPWSTR WINAPI lstrcpyW(LPWSTR,LPCWSTR);
+int WINAPI lstrlenA(LPCSTR);
+int WINAPI lstrlenW(LPCWSTR);
+BOOL WINAPI MakeAbsoluteSD(PSECURITY_DESCRIPTOR,PSECURITY_DESCRIPTOR,PDWORD,PACL,PDWORD,PACL,PDWORD,PSID,PDWORD,PSID,PDWORD);
+#define MakeProcInstance(p,i) (p)
+BOOL WINAPI MakeSelfRelativeSD(PSECURITY_DESCRIPTOR,PSECURITY_DESCRIPTOR,PDWORD);
+VOID WINAPI MapGenericMask(PDWORD,PGENERIC_MAPPING);
+PVOID WINAPI MapViewOfFile(HANDLE,DWORD,DWORD,DWORD,DWORD);
+PVOID WINAPI MapViewOfFileEx(HANDLE,DWORD,DWORD,DWORD,DWORD,PVOID);
+BOOL WINAPI MoveFileA(LPCSTR,LPCSTR);
+BOOL WINAPI MoveFileExA(LPCSTR,LPCSTR,DWORD);
+BOOL WINAPI MoveFileExW(LPCWSTR,LPCWSTR,DWORD);
+BOOL WINAPI MoveFileW(LPCWSTR,LPCWSTR);
+int WINAPI MulDiv(int,int,int);
+BOOL WINAPI NotifyChangeEventLog(HANDLE,HANDLE);
+BOOL WINAPI ObjectCloseAuditAlarmA(LPCSTR,PVOID,BOOL);
+BOOL WINAPI ObjectCloseAuditAlarmW(LPCWSTR,PVOID,BOOL);
+BOOL WINAPI ObjectDeleteAuditAlarmA(LPCSTR,PVOID,BOOL);
+BOOL WINAPI ObjectDeleteAuditAlarmW(LPCWSTR,PVOID,BOOL);
+BOOL WINAPI ObjectOpenAuditAlarmA(LPCSTR,PVOID,LPSTR,LPSTR,PSECURITY_DESCRIPTOR,HANDLE,DWORD,DWORD,PPRIVILEGE_SET,BOOL,BOOL,PBOOL);
+BOOL WINAPI ObjectOpenAuditAlarmW(LPCWSTR,PVOID,LPWSTR,LPWSTR,PSECURITY_DESCRIPTOR,HANDLE,DWORD,DWORD,PPRIVILEGE_SET,BOOL,BOOL,PBOOL);
+BOOL WINAPI ObjectPrivilegeAuditAlarmA(LPCSTR,PVOID,HANDLE,DWORD,PPRIVILEGE_SET,BOOL);
+BOOL WINAPI ObjectPrivilegeAuditAlarmW(LPCWSTR,PVOID,HANDLE,DWORD,PPRIVILEGE_SET,BOOL);
+HANDLE WINAPI OpenBackupEventLogA(LPCSTR,LPCSTR);
+HANDLE WINAPI OpenBackupEventLogW(LPCWSTR,LPCWSTR);
+HANDLE WINAPI OpenEventA(DWORD,BOOL,LPCSTR);
+HANDLE WINAPI OpenEventLogA (LPCSTR,LPCSTR);
+HANDLE WINAPI OpenEventLogW(LPCWSTR,LPCWSTR);
+HANDLE WINAPI OpenEventW(DWORD,BOOL,LPCWSTR);
+HFILE WINAPI OpenFile(LPCSTR,LPOFSTRUCT,UINT);
+HANDLE WINAPI OpenFileMappingA(DWORD,BOOL,LPCSTR);
+HANDLE WINAPI OpenFileMappingW(DWORD,BOOL,LPCWSTR);
+HANDLE WINAPI OpenMutexA(DWORD,BOOL,LPCSTR);
+HANDLE WINAPI OpenMutexW(DWORD,BOOL,LPCWSTR);
+HANDLE WINAPI OpenProcess(DWORD,BOOL,DWORD);
+BOOL WINAPI OpenProcessToken(HANDLE,DWORD,PHANDLE);
+HANDLE WINAPI OpenSemaphoreA(DWORD,BOOL,LPCSTR);
+HANDLE WINAPI OpenSemaphoreW(DWORD,BOOL,LPCWSTR);
+BOOL WINAPI OpenThreadToken(HANDLE,DWORD,BOOL,PHANDLE);
+HANDLE WINAPI OpenWaitableTimerA(DWORD,BOOL,LPCSTR);
+HANDLE WINAPI OpenWaitableTimerW(DWORD,BOOL,LPCWSTR);
+void WINAPI OutputDebugStringA(LPCSTR);
+void WINAPI OutputDebugStringW(LPCWSTR);
+BOOL WINAPI PeekNamedPipe(HANDLE,PVOID,DWORD,PDWORD,PDWORD,PDWORD);
+BOOL WINAPI PostQueuedCompletionStatus(HANDLE,DWORD,DWORD,LPOVERLAPPED);
+DWORD WINAPI PrepareTape(HANDLE,DWORD,BOOL);
+BOOL WINAPI PrivilegeCheck (HANDLE,PPRIVILEGE_SET,PBOOL);
+BOOL WINAPI PrivilegedServiceAuditAlarmA(LPCSTR,LPCSTR,HANDLE,PPRIVILEGE_SET,BOOL);
+BOOL WINAPI PrivilegedServiceAuditAlarmW(LPCWSTR,LPCWSTR,HANDLE,PPRIVILEGE_SET,BOOL);
+BOOL WINAPI PulseEvent(HANDLE);
+BOOL WINAPI PurgeComm(HANDLE,DWORD);
+DWORD WINAPI QueryDosDeviceA(LPCSTR,LPSTR,DWORD);
+DWORD WINAPI QueryDosDeviceW(LPCWSTR,LPWSTR,DWORD);
+BOOL WINAPI QueryPerformanceCounter(PLARGE_INTEGER);
+BOOL WINAPI QueryPerformanceFrequency(PLARGE_INTEGER);
+DWORD WINAPI QueueUserAPC(PAPCFUNC,HANDLE,DWORD);
+void WINAPI RaiseException(DWORD,DWORD,DWORD,const DWORD*);
+BOOL WINAPI ReadDirectoryChangesW(HANDLE,PVOID,DWORD,BOOL,DWORD,PDWORD,LPOVERLAPPED,LPOVERLAPPED_COMPLETION_ROUTINE);
+BOOL WINAPI ReadEventLogA(HANDLE,DWORD,DWORD,PVOID,DWORD,DWORD *,DWORD *);
+BOOL WINAPI ReadEventLogW(HANDLE,DWORD,DWORD,PVOID,DWORD,DWORD *,DWORD *);
+BOOL WINAPI ReadFile(HANDLE,PVOID,DWORD,PDWORD,LPOVERLAPPED);
+BOOL WINAPI ReadFileEx(HANDLE,PVOID,DWORD,LPOVERLAPPED,LPOVERLAPPED_COMPLETION_ROUTINE);
+BOOL WINAPI ReadProcessMemory(HANDLE,PCVOID,PVOID,DWORD,PDWORD);
+HANDLE WINAPI RegisterEventSourceA (LPCSTR,LPCSTR);
+HANDLE WINAPI RegisterEventSourceW(LPCWSTR,LPCWSTR);
+BOOL WINAPI ReleaseMutex(HANDLE);
+BOOL WINAPI ReleaseSemaphore(HANDLE,LONG,LPLONG);
+BOOL WINAPI RemoveDirectoryA(LPCSTR);
+BOOL WINAPI RemoveDirectoryW(LPCWSTR);
+BOOL WINAPI ReportEventA(HANDLE,WORD,WORD,DWORD,PSID,WORD,DWORD,LPCSTR*,PVOID);
+BOOL WINAPI ReportEventW(HANDLE,WORD,WORD,DWORD,PSID,WORD,DWORD,LPCWSTR*,PVOID);
+BOOL WINAPI ResetEvent(HANDLE);
+DWORD WINAPI ResumeThread(HANDLE);
+BOOL WINAPI RevertToSelf(void);
+DWORD WINAPI SearchPathA(LPCSTR,LPCSTR,LPCSTR,DWORD,LPSTR,LPSTR*);
+DWORD WINAPI SearchPathW(LPCWSTR,LPCWSTR,LPCWSTR,DWORD,LPWSTR,LPWSTR*);
+BOOL WINAPI SetAclInformation(PACL,PVOID,DWORD,ACL_INFORMATION_CLASS);
+BOOL WINAPI SetCommBreak(HANDLE);
+BOOL WINAPI SetCommConfig(HANDLE,LPCOMMCONFIG,DWORD);
+BOOL WINAPI SetCommMask(HANDLE,DWORD);
+BOOL WINAPI SetCommState(HANDLE,LPDCB);
+BOOL WINAPI SetCommTimeouts(HANDLE,LPCOMMTIMEOUTS);
+BOOL WINAPI SetComputerNameA(LPCSTR);
+BOOL WINAPI SetComputerNameW(LPCWSTR);
+BOOL WINAPI SetCurrentDirectoryA(LPCSTR);
+BOOL WINAPI SetCurrentDirectoryW(LPCWSTR);
+BOOL WINAPI SetDefaultCommConfigA(LPCSTR,LPCOMMCONFIG,DWORD);
+BOOL WINAPI SetDefaultCommConfigW(LPCWSTR,LPCOMMCONFIG,DWORD);
+BOOL WINAPI SetEndOfFile(HANDLE);
+BOOL WINAPI SetEnvironmentVariableA(LPCSTR,LPCSTR);
+BOOL WINAPI SetEnvironmentVariableW(LPCWSTR,LPCWSTR);
+UINT WINAPI SetErrorMode(UINT);
+BOOL WINAPI SetEvent(HANDLE);
+VOID WINAPI SetFileApisToANSI(void);
+VOID WINAPI SetFileApisToOEM(void);
+BOOL WINAPI SetFileAttributesA(LPCSTR,DWORD);
+BOOL WINAPI SetFileAttributesW(LPCWSTR,DWORD);
+DWORD WINAPI SetFilePointer(HANDLE,LONG,PLONG,DWORD);
+BOOL WINAPI SetFileSecurityA(LPCSTR,SECURITY_INFORMATION,PSECURITY_DESCRIPTOR);
+BOOL WINAPI SetFileSecurityW(LPCWSTR,SECURITY_INFORMATION,PSECURITY_DESCRIPTOR);
+BOOL WINAPI SetFileTime(HANDLE,const FILETIME*,const FILETIME*,const FILETIME*);
+UINT WINAPI SetHandleCount(UINT);
+BOOL WINAPI SetHandleInformation(HANDLE,DWORD,DWORD);
+BOOL WINAPI SetKernelObjectSecurity(HANDLE,SECURITY_INFORMATION,PSECURITY_DESCRIPTOR);
+void WINAPI SetLastError(DWORD);
+void WINAPI SetLastErrorEx(DWORD,DWORD);
+BOOL WINAPI SetLocalTime(const SYSTEMTIME*);
+BOOL WINAPI SetMailslotInfo(HANDLE,DWORD);
+BOOL WINAPI SetNamedPipeHandleState(HANDLE,PDWORD,PDWORD,PDWORD);
+BOOL WINAPI SetPriorityClass(HANDLE,DWORD);
+BOOL WINAPI SetPrivateObjectSecurity(SECURITY_INFORMATION,PSECURITY_DESCRIPTOR,PSECURITY_DESCRIPTOR *,PGENERIC_MAPPING,HANDLE);
+BOOL WINAPI SetProcessAffinityMask(HANDLE,DWORD);
+BOOL WINAPI SetProcessPriorityBoost(HANDLE,BOOL);
+BOOL WINAPI SetProcessShutdownParameters(DWORD,DWORD);
+BOOL WINAPI SetProcessWorkingSetSize(HANDLE,DWORD,DWORD);
+BOOL WINAPI SetSecurityDescriptorDacl(PSECURITY_DESCRIPTOR,BOOL,PACL,BOOL);
+BOOL WINAPI SetSecurityDescriptorGroup(PSECURITY_DESCRIPTOR,PSID,BOOL);
+BOOL WINAPI SetSecurityDescriptorOwner(PSECURITY_DESCRIPTOR,PSID,BOOL);
+BOOL WINAPI SetSecurityDescriptorSacl(PSECURITY_DESCRIPTOR,BOOL,PACL,BOOL);
+BOOL WINAPI SetStdHandle(DWORD,HANDLE);
+#define SetSwapAreaSize(w) (w)
+BOOL WINAPI SetSystemPowerState(BOOL,BOOL);
+BOOL WINAPI SetSystemTime(const SYSTEMTIME*);
+BOOL WINAPI SetSystemTimeAdjustment(DWORD,BOOL);
+DWORD WINAPI SetTapeParameters(HANDLE,DWORD,PVOID);
+DWORD WINAPI SetTapePosition(HANDLE,DWORD,DWORD,DWORD,DWORD,BOOL);
+DWORD WINAPI SetThreadAffinityMask(HANDLE,DWORD);
+BOOL WINAPI SetThreadContext(HANDLE,const CONTEXT*);
+DWORD WINAPI SetThreadIdealProcessor(HANDLE,DWORD);
+BOOL WINAPI SetThreadPriority(HANDLE,int);
+BOOL WINAPI SetThreadPriorityBoost(HANDLE,BOOL);
+BOOL WINAPI SetThreadToken (PHANDLE,HANDLE);
+BOOL WINAPI SetTimeZoneInformation(const TIME_ZONE_INFORMATION *);
+BOOL WINAPI SetTokenInformation(HANDLE,TOKEN_INFORMATION_CLASS,PVOID,DWORD);
+LPTOP_LEVEL_EXCEPTION_FILTER WINAPI SetUnhandledExceptionFilter(LPTOP_LEVEL_EXCEPTION_FILTER);
+BOOL WINAPI SetupComm(HANDLE,DWORD,DWORD);
+BOOL WINAPI SetVolumeLabelA(LPCSTR,LPCSTR);
+BOOL WINAPI SetVolumeLabelW(LPCWSTR,LPCWSTR);
+BOOL WINAPI SetWaitableTimer(HANDLE,const LARGE_INTEGER*,LONG,PTIMERAPCROUTINE,PVOID,BOOL);
+BOOL WINAPI SignalObjectAndWait(HANDLE,HANDLE,DWORD,BOOL);
+DWORD WINAPI SizeofResource(HINSTANCE,HRSRC);
+void WINAPI Sleep(DWORD);
+DWORD WINAPI SleepEx(DWORD,BOOL);
+DWORD WINAPI SuspendThread(HANDLE);
+void WINAPI SwitchToFiber(PVOID);
+BOOL WINAPI SwitchToThread(void);
+BOOL WINAPI SystemTimeToFileTime(const SYSTEMTIME*,LPFILETIME);
+BOOL WINAPI SystemTimeToTzSpecificLocalTime(LPTIME_ZONE_INFORMATION,LPSYSTEMTIME,LPSYSTEMTIME);
+BOOL WINAPI TerminateProcess(HANDLE,UINT);
+BOOL WINAPI TerminateThread(HANDLE,DWORD);
+DWORD WINAPI TlsAlloc(VOID);
+BOOL WINAPI TlsFree(DWORD);
+PVOID WINAPI TlsGetValue(DWORD);
+BOOL WINAPI TlsSetValue(DWORD,PVOID);
+BOOL WINAPI TransactNamedPipe(HANDLE,PVOID,DWORD,PVOID,DWORD,PDWORD,LPOVERLAPPED);
+BOOL WINAPI TransmitCommChar(HANDLE,char);
+BOOL WINAPI TryEnterCriticalSection(LPCRITICAL_SECTION);
+LONG WINAPI UnhandledExceptionFilter(LPEXCEPTION_POINTERS);
+BOOL WINAPI UnlockFile(HANDLE,DWORD,DWORD,DWORD,DWORD);
+BOOL WINAPI UnlockFileEx(HANDLE,DWORD,DWORD,DWORD,LPOVERLAPPED);
+#define UnlockResource(h) (h)
+#define UnlockSegment(w) GlobalUnfix((HANDLE)(w))
+BOOL WINAPI UnmapViewOfFile(PVOID);
+BOOL WINAPI UpdateResourceA(HANDLE,LPCSTR,LPCSTR,WORD,PVOID,DWORD);
+BOOL WINAPI UpdateResourceW(HANDLE,LPCWSTR,LPCWSTR,WORD,PVOID,DWORD);
+PVOID WINAPI VirtualAlloc(PVOID,DWORD,DWORD,DWORD);
+BOOL WINAPI VirtualFree(PVOID,DWORD,DWORD);
+BOOL WINAPI VirtualFreeEx(HANDLE,PVOID,DWORD,DWORD);
+BOOL WINAPI VirtualLock(PVOID,DWORD);
+BOOL WINAPI VirtualProtect(PVOID,DWORD,DWORD,PDWORD);
+BOOL WINAPI VirtualProtectEx(HANDLE,PVOID,DWORD,DWORD,PDWORD);
+DWORD WINAPI VirtualQuery(LPCVOID,PMEMORY_BASIC_INFORMATION,DWORD);
+DWORD WINAPI VirtualQueryEx(HANDLE,LPCVOID,PMEMORY_BASIC_INFORMATION,DWORD);
+BOOL WINAPI VirtualUnlock(PVOID,DWORD);
+BOOL WINAPI WaitCommEvent(HANDLE,PDWORD,LPOVERLAPPED);
+BOOL WINAPI WaitForDebugEvent(LPDEBUG_EVENT,DWORD);
+DWORD WINAPI WaitForMultipleObjects(DWORD,const HANDLE*,BOOL,DWORD);
+DWORD WINAPI WaitForMultipleObjectsEx(DWORD,const HANDLE*,BOOL,DWORD,BOOL);
+DWORD WINAPI WaitForSingleObject(HANDLE,DWORD);
+DWORD WINAPI WaitForSingleObjectEx(HANDLE,DWORD,BOOL);
+BOOL WINAPI WaitNamedPipeA(LPCSTR,DWORD);
+BOOL WINAPI WaitNamedPipeW(LPCWSTR,DWORD);
+BOOL WINAPI WinLoadTrustProvider(GUID*);
+BOOL WINAPI WriteFile(HANDLE,PCVOID,DWORD,PDWORD,LPOVERLAPPED);
+BOOL WINAPI WriteFileEx(HANDLE,PCVOID,DWORD,LPOVERLAPPED,LPOVERLAPPED_COMPLETION_ROUTINE);
+BOOL WINAPI WritePrivateProfileSectionA(LPCSTR,LPCSTR,LPCSTR);
+BOOL WINAPI WritePrivateProfileSectionW(LPCWSTR,LPCWSTR,LPCWSTR);
+BOOL WINAPI WritePrivateProfileStringA(LPCSTR,LPCSTR,LPCSTR,LPCSTR);
+BOOL WINAPI WritePrivateProfileStringW(LPCWSTR,LPCWSTR,LPCWSTR,LPCWSTR);
+BOOL WINAPI WritePrivateProfileStructA(LPCSTR,LPCSTR,PVOID,UINT,LPCSTR);
+BOOL WINAPI WritePrivateProfileStructW(LPCWSTR,LPCWSTR,PVOID,UINT,LPCWSTR);
+BOOL WINAPI WriteProcessMemory(HANDLE,PVOID,PVOID,DWORD,PDWORD);
+BOOL WINAPI WriteProfileSectionA(LPCSTR,LPCSTR);
+BOOL WINAPI WriteProfileSectionW(LPCWSTR,LPCWSTR);
+BOOL WINAPI WriteProfileStringA(LPCSTR,LPCSTR,LPCSTR);
+BOOL WINAPI WriteProfileStringW(LPCWSTR,LPCWSTR,LPCWSTR);
+DWORD WINAPI WriteTapemark(HANDLE,DWORD,DWORD,BOOL);
+#define Yield()
+
+#ifdef UNICODE
+typedef STARTUPINFOW STARTUPINFO,*LPSTARTUPINFO;
+typedef WIN32_FIND_DATAW WIN32_FIND_DATA,*LPWIN32_FIND_DATA;
+typedef HW_PROFILE_INFOW HW_PROFILE_INFO,*LPHW_PROFILE_INFO;
+typedef OSVERSIONINFOW OSVERSIONINFO,*POSVERSIONINFO,*LPOSVERSIONINFO;
+#define AccessCheckAndAuditAlarm AccessCheckAndAuditAlarmW
+#define AddAtom AddAtomW
+#define BackupEventLog BackupEventLogW
+#define BeginUpdateResource BeginUpdateResourceW
+#define BuildCommDCB BuildCommDCBW
+#define BuildCommDCBAndTimeouts BuildCommDCBAndTimeoutsW
+#define CallNamedPipe CallNamedPipeW
+#define ClearEventLog ClearEventLogW
+#define CommConfigDialog CommConfigDialogW
+#define CopyFile CopyFileW
+#define CopyFileEx CopyFileExW
+#define CreateDirectory CreateDirectoryW
+#define CreateDirectoryEx CreateDirectoryExW
+#define CreateEvent CreateEventW
+#define CreateFile CreateFileW
+#define CreateFileMapping CreateFileMappingW
+#define CreateMailslot CreateMailslotW
+#define CreateMutex CreateMutexW
+#define CreateNamedPipe CreateNamedPipeW
+#define CreateProcess CreateProcessW
+#define CreateProcessAsUser CreateProcessAsUserW
+#define CreateSemaphore CreateSemaphoreW
+#define CreateWaitableTimer CreateWaitableTimerW
+#define DefineDosDevice DefineDosDeviceW
+#define DeleteFile DeleteFileW
+#define EndUpdateResource EndUpdateResourceW
+#define EnumResourceLanguages EnumResourceLanguagesW
+#define EnumResourceNames EnumResourceNamesW
+#define EnumResourceTypes EnumResourceTypesW
+#define ExpandEnvironmentStrings ExpandEnvironmentStringsW
+#define FatalAppExit FatalAppExitW
+#define FindAtom FindAtomW
+#define FindFirstChangeNotification FindFirstChangeNotificationW
+#define FindFirstFile FindFirstFileW
+#define FindFirstFileEx FindFirstFileExW
+#define FindNextFile FindNextFileW
+#define FindResource FindResourceW
+#define FindResourceEx FindResourceExW
+#define FormatMessage FormatMessageW
+#define FreeEnvironmentStrings FreeEnvironmentStringsW
+#define GetAtomName GetAtomNameW
+#define GetBinaryType GetBinaryTypeW
+#define GetCommandLine GetCommandLineW
+#define GetCompressedFileSize GetCompressedFileSizeW
+#define GetComputerName GetComputerNameW
+#define GetCurrentDirectory GetCurrentDirectoryW
+#define GetDefaultCommConfig GetDefaultCommConfigW
+#define GetDiskFreeSpace GetDiskFreeSpaceW
+#define GetDiskFreeSpaceEx GetDiskFreeSpaceExW
+#define GetDriveType GetDriveTypeW
+#define GetEnvironmentStrings GetEnvironmentStringsW
+#define GetEnvironmentVariable GetEnvironmentVariableW
+#define GetFileAttributes GetFileAttributesW
+#define GetFileSecurity GetFileSecurityW
+#define GetFileAttributesEx GetFileAttributesExW
+#define GetFullPathName GetFullPathNameW
+#define GetLogicalDriveStrings GetLogicalDriveStringsW
+#define GetLongPathName GetLongPathNameW
+#define GetModuleFileName GetModuleFileNameW
+#define GetModuleHandle GetModuleHandleW
+#define GetNamedPipeHandleState GetNamedPipeHandleStateW
+#define GetPrivateProfileInt GetPrivateProfileIntW
+#define GetPrivateProfileSection GetPrivateProfileSectionW
+#define GetPrivateProfileSectionNames GetPrivateProfileSectionNamesW
+#define GetPrivateProfileString GetPrivateProfileStringW
+#define GetPrivateProfileStruct GetPrivateProfileStructW
+#define GetProfileInt GetProfileIntW
+#define GetProfileSection GetProfileSectionW
+#define GetProfileString GetProfileStringW
+#define GetShortPathName GetShortPathNameW
+#define GetStartupInfo GetStartupInfoW
+#define GetSystemDirectory GetSystemDirectoryW
+#define GetTempFileName GetTempFileNameW
+#define GetTempPath GetTempPathW
+#define GetUserName GetUserNameW
+#define GetVersionEx GetVersionExW
+#define GetVolumeInformation GetVolumeInformationW
+#define GetWindowsDirectory GetWindowsDirectoryW
+#define GlobalAddAtom GlobalAddAtomW
+#define GlobalFindAtom GlobalFindAtomW
+#define GlobalGetAtomName GlobalGetAtomNameW
+#define IsBadStringPtr IsBadStringPtrW
+#define LoadLibrary LoadLibraryW
+#define LoadLibraryEx LoadLibraryExW
+#define LogonUser LogonUserW
+#define LookupAccountName LookupAccountNameW
+#define LookupAccountSid LookupAccountSidW
+#define LookupPrivilegeDisplayName LookupPrivilegeDisplayNameW
+#define LookupPrivilegeName LookupPrivilegeNameW
+#define LookupPrivilegeValue LookupPrivilegeValueW
+#define lstrcat lstrcatW
+#define lstrcmp lstrcmpW
+#define lstrcmpi lstrcmpiW
+#define lstrcpy lstrcpyW
+#define lstrcpyn lstrcpynW
+#define lstrlen lstrlenW
+#define MoveFile MoveFileW
+#define MoveFileEx MoveFileExW
+#define ObjectCloseAuditAlarm ObjectCloseAuditAlarmW
+#define ObjectDeleteAuditAlarm ObjectDeleteAuditAlarmW
+#define ObjectOpenAuditAlarm ObjectOpenAuditAlarmW
+#define ObjectPrivilegeAuditAlarm ObjectPrivilegeAuditAlarmW
+#define OpenBackupEventLog OpenBackupEventLogW
+#define OpenEvent OpenEventW
+#define OpenEventLog OpenEventLogW
+#define OpenFileMapping OpenFileMappingW
+#define OpenMutex OpenMutexW
+#define OpenSemaphore OpenSemaphoreW
+#define OutputDebugString OutputDebugStringW
+#define PrivilegedServiceAuditAlarm PrivilegedServiceAuditAlarmW
+#define QueryDosDevice QueryDosDeviceW
+#define ReadEventLog ReadEventLogW
+#define RegisterEventSource RegisterEventSourceW
+#define RemoveDirectory RemoveDirectoryW
+#define ReportEvent ReportEventW
+#define SearchPath SearchPathW
+#define SetComputerName SetComputerNameW
+#define SetCurrentDirectory SetCurrentDirectoryW
+#define SetDefaultCommConfig SetDefaultCommConfigW
+#define SetEnvironmentVariable SetEnvironmentVariableW
+#define SetFileAttributes SetFileAttributesW
+#define SetFileSecurity SetFileSecurityW
+#define SetVolumeLabel SetVolumeLabelW
+#define UpdateResource UpdateResourceW
+#define WaitNamedPipe WaitNamedPipeW
+#define WritePrivateProfileSection WritePrivateProfileSectionW
+#define WritePrivateProfileString WritePrivateProfileStringW
+#define WritePrivateProfileStruct WritePrivateProfileStructW
+#define WriteProfileSection WriteProfileSectionW
+#define WriteProfileString WriteProfileStringW
+#else
+typedef STARTUPINFOA STARTUPINFO,*LPSTARTUPINFO;
+typedef WIN32_FIND_DATAA WIN32_FIND_DATA,*LPWIN32_FIND_DATA;
+typedef HW_PROFILE_INFOA HW_PROFILE_INFO,*LPHW_PROFILE_INFO;
+typedef OSVERSIONINFOA OSVERSIONINFO,*POSVERSIONINFO,*LPOSVERSIONINFO;
+#define AccessCheckAndAuditAlarm AccessCheckAndAuditAlarmA
+#define AddAtom AddAtomA
+#define BackupEventLog BackupEventLogA
+#define BeginUpdateResource BeginUpdateResourceA
+#define BuildCommDCB BuildCommDCBA
+#define BuildCommDCBAndTimeouts BuildCommDCBAndTimeoutsA
+#define CallNamedPipe CallNamedPipeA
+#define ClearEventLog ClearEventLogA
+#define CommConfigDialog CommConfigDialogA
+#define CopyFile CopyFileA
+#define CopyFileEx CopyFileExA
+#define CreateDirectory CreateDirectoryA
+#define CreateDirectoryEx CreateDirectoryExA
+#define CreateEvent CreateEventA
+#define CreateFile CreateFileA
+#define CreateFileMapping CreateFileMappingA
+#define CreateMailslot CreateMailslotA
+#define CreateMutex CreateMutexA
+#define CreateNamedPipe CreateNamedPipeA
+#define CreateProcess CreateProcessA
+#define CreateProcessAsUser CreateProcessAsUserA
+#define CreateSemaphore CreateSemaphoreA
+#define CreateWaitableTimer CreateWaitableTimerA
+#define DefineDosDevice DefineDosDeviceA
+#define DeleteFile DeleteFileA
+#define EndUpdateResource EndUpdateResourceA
+#define EnumResourceLanguages EnumResourceLanguagesA
+#define EnumResourceNames EnumResourceNamesA
+#define EnumResourceTypes EnumResourceTypesA
+#define ExpandEnvironmentStrings ExpandEnvironmentStringsA
+#define FatalAppExit FatalAppExitA
+#define FindAtom FindAtomA
+#define FindFirstChangeNotification FindFirstChangeNotificationA
+#define FindFirstFile FindFirstFileA
+#define FindFirstFileEx FindFirstFileExW
+#define FindNextFile FindNextFileA
+#define FindResource FindResourceA
+#define FindResourceEx FindResourceExA
+#define FormatMessage FormatMessageA
+#define FreeEnvironmentStrings FreeEnvironmentStringsA
+#define GetAtomName GetAtomNameA
+#define GetBinaryType GetBinaryTypeA
+#define GetCommandLine GetCommandLineA
+#define GetComputerName GetComputerNameA
+#define GetCompressedFileSize GetCompressedFileSizeA
+#define GetCurrentDirectory GetCurrentDirectoryA
+#define GetDefaultCommConfig GetDefaultCommConfigA
+#define GetDiskFreeSpace GetDiskFreeSpaceA
+#define GetDiskFreeSpaceEx GetDiskFreeSpaceExA
+#define GetDriveType GetDriveTypeA
+#define GetEnvironmentStringsA GetEnvironmentStrings
+#define GetEnvironmentVariable GetEnvironmentVariableA
+#define GetFileAttributes GetFileAttributesA
+#define GetFileSecurity GetFileSecurityA
+#define GetFileAttributesEx GetFileAttributesExA
+#define GetFullPathName GetFullPathNameA
+#define GetLogicalDriveStrings GetLogicalDriveStringsA
+#define GetLongPathName GetLongPathNameA
+#define GetNamedPipeHandleState GetNamedPipeHandleStateA
+#define GetModuleHandle GetModuleHandleA
+#define GetModuleFileName GetModuleFileNameA
+#define GetPrivateProfileInt GetPrivateProfileIntA
+#define GetPrivateProfileSection GetPrivateProfileSectionA
+#define GetPrivateProfileSectionNames GetPrivateProfileSectionNamesA
+#define GetPrivateProfileString GetPrivateProfileStringA
+#define GetPrivateProfileStruct GetPrivateProfileStructA
+#define GetProfileInt GetProfileIntA
+#define GetProfileSection GetProfileSectionA
+#define GetProfileString GetProfileStringA
+#define GetShortPathName GetShortPathNameA
+#define GetStartupInfo GetStartupInfoA
+#define GetSystemDirectory GetSystemDirectoryA
+#define GetTempFileName GetTempFileNameA
+#define GetTempPath GetTempPathA
+#define GetUserName GetUserNameA
+#define GetVersionEx GetVersionExA
+#define GetVolumeInformation GetVolumeInformationA
+#define GetWindowsDirectory GetWindowsDirectoryA
+#define GlobalAddAtom GlobalAddAtomA
+#define GlobalFindAtom GlobalFindAtomA
+#define GlobalGetAtomName GlobalGetAtomNameA
+#define IsBadStringPtr IsBadStringPtrA
+#define LoadLibrary LoadLibraryA
+#define LoadLibraryEx LoadLibraryExA
+#define LogonUser LogonUserA
+#define LookupAccountName LookupAccountNameA
+#define LookupAccountSid LookupAccountSidA
+#define LookupPrivilegeDisplayName LookupPrivilegeDisplayNameA
+#define LookupPrivilegeName LookupPrivilegeNameA
+#define LookupPrivilegeValue LookupPrivilegeValueA
+#define lstrcat lstrcatA
+#define lstrcmp lstrcmpA
+#define lstrcmpi lstrcmpiA
+#define lstrcpy lstrcpyA
+#define lstrcpyn lstrcpynA
+#define lstrlen lstrlenA
+#define MoveFile MoveFileA
+#define MoveFileEx MoveFileExA
+#define ObjectCloseAuditAlarm ObjectCloseAuditAlarmA
+#define ObjectDeleteAuditAlarm ObjectDeleteAuditAlarmA
+#define ObjectOpenAuditAlarm ObjectOpenAuditAlarmA
+#define ObjectPrivilegeAuditAlarm ObjectPrivilegeAuditAlarmA
+#define OpenBackupEventLog OpenBackupEventLogA
+#define OpenEvent OpenEventA
+#define OpenEventLog OpenEventLogA
+#define OpenFileMapping OpenFileMappingA
+#define OpenMutex OpenMutexA
+#define OpenSemaphore OpenSemaphoreA
+#define OutputDebugString OutputDebugStringA
+#define PrivilegedServiceAuditAlarm PrivilegedServiceAuditAlarmA
+#define QueryDosDevice QueryDosDeviceA
+#define ReadEventLog ReadEventLogA
+#define RegisterEventSource RegisterEventSourceA
+#define RemoveDirectory RemoveDirectoryA
+#define ReportEvent ReportEventA
+#define SearchPath SearchPathA
+#define SetComputerName SetComputerNameA
+#define SetCurrentDirectory SetCurrentDirectoryA
+#define SetDefaultCommConfig SetDefaultCommConfigA
+#define SetEnvironmentVariable SetEnvironmentVariableA
+#define SetFileAttributes SetFileAttributesA
+#define SetFileSecurity SetFileSecurityA
+#define SetVolumeLabel SetVolumeLabelA
+#define UpdateResource UpdateResourceA
+#define WaitNamedPipe WaitNamedPipeA
+#define WritePrivateProfileSection WritePrivateProfileSectionA
+#define WritePrivateProfileString WritePrivateProfileStringA
+#define WritePrivateProfileStruct WritePrivateProfileStructA
+#define WriteProfileSection WriteProfileSectionA
+#define WriteProfileString WriteProfileStringA
+#endif
+#endif
+#ifdef __cplusplus
+}
+#endif
+#endif /* _WINBASE_H */
diff --git a/winsup/w32api/include/wincon.h b/winsup/w32api/include/wincon.h
new file mode 100644
index 000000000..4ed04abf1
--- /dev/null
+++ b/winsup/w32api/include/wincon.h
@@ -0,0 +1,203 @@
+#ifndef _WINCON_H
+#define _WINCON_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define FOREGROUND_BLUE 1
+#define FOREGROUND_GREEN 2
+#define FOREGROUND_RED 4
+#define FOREGROUND_INTENSITY 8
+#define BACKGROUND_BLUE 16
+#define BACKGROUND_GREEN 32
+#define BACKGROUND_RED 64
+#define BACKGROUND_INTENSITY 128
+#define CTRL_C_EVENT 0
+#define CTRL_BREAK_EVENT 1
+#define CTRL_CLOSE_EVENT 2
+#define CTRL_LOGOFF_EVENT 5
+#define CTRL_SHUTDOWN_EVENT 6
+#define ENABLE_LINE_INPUT 2
+#define ENABLE_ECHO_INPUT 4
+#define ENABLE_PROCESSED_INPUT 1
+#define ENABLE_WINDOW_INPUT 8
+#define ENABLE_MOUSE_INPUT 16
+#define ENABLE_PROCESSED_OUTPUT 1
+#define ENABLE_WRAP_AT_EOL_OUTPUT 2
+#define KEY_EVENT 1
+#define MOUSE_EVENT 2
+#define WINDOW_BUFFER_SIZE_EVENT 4
+#define MENU_EVENT 8
+#define FOCUS_EVENT 16
+#define CAPSLOCK_ON 128
+#define ENHANCED_KEY 256
+#define RIGHT_ALT_PRESSED 1
+#define LEFT_ALT_PRESSED 2
+#define RIGHT_CTRL_PRESSED 4
+#define LEFT_CTRL_PRESSED 8
+#define SHIFT_PRESSED 16
+#define NUMLOCK_ON 32
+#define SCROLLLOCK_ON 64
+#define FROM_LEFT_1ST_BUTTON_PRESSED 1
+#define RIGHTMOST_BUTTON_PRESSED 2
+#define FROM_LEFT_2ND_BUTTON_PRESSED 4
+#define FROM_LEFT_3RD_BUTTON_PRESSED 8
+#define FROM_LEFT_4TH_BUTTON_PRESSED 16
+#define MOUSE_MOVED 1
+#define DOUBLE_CLICK 2
+#define MOUSE_WHEELED 4
+
+typedef struct _CHAR_INFO {
+ union {
+ WCHAR UnicodeChar;
+ CHAR AsciiChar;
+ } Char;
+ WORD Attributes;
+} CHAR_INFO,*PCHAR_INFO;
+typedef struct _SMALL_RECT {
+ SHORT Left;
+ SHORT Top;
+ SHORT Right;
+ SHORT Bottom;
+} SMALL_RECT,*PSMALL_RECT;
+typedef struct _CONSOLE_CURSOR_INFO {
+ DWORD dwSize;
+ BOOL bVisible;
+} CONSOLE_CURSOR_INFO,*PCONSOLE_CURSOR_INFO;
+typedef struct _COORD {
+ SHORT X;
+ SHORT Y;
+} COORD;
+typedef struct _CONSOLE_SCREEN_BUFFER_INFO {
+ COORD dwSize;
+ COORD dwCursorPosition;
+ WORD wAttributes;
+ SMALL_RECT srWindow;
+ COORD dwMaximumWindowSize;
+} CONSOLE_SCREEN_BUFFER_INFO,*PCONSOLE_SCREEN_BUFFER_INFO;
+typedef BOOL(CALLBACK *PHANDLER_ROUTINE)(DWORD);
+typedef struct _KEY_EVENT_RECORD {
+ BOOL bKeyDown;
+ WORD wRepeatCount;
+ WORD wVirtualKeyCode;
+ WORD wVirtualScanCode;
+ union {
+ WCHAR UnicodeChar;
+ CHAR AsciiChar;
+ } uChar;
+ DWORD dwControlKeyState;
+}
+#ifdef __GNUC__
+/* gcc's alignment is not what win32 expects */
+ PACKED
+#endif
+KEY_EVENT_RECORD;
+
+typedef struct _MOUSE_EVENT_RECORD {
+ COORD dwMousePosition;
+ DWORD dwButtonState;
+ DWORD dwControlKeyState;
+ DWORD dwEventFlags;
+} MOUSE_EVENT_RECORD;
+typedef struct _WINDOW_BUFFER_SIZE_RECORD { COORD dwSize; } WINDOW_BUFFER_SIZE_RECORD;
+typedef struct _MENU_EVENT_RECORD { UINT dwCommandId; } MENU_EVENT_RECORD,*PMENU_EVENT_RECORD;
+typedef struct _FOCUS_EVENT_RECORD { BOOL bSetFocus; } FOCUS_EVENT_RECORD;
+typedef struct _INPUT_RECORD {
+ WORD EventType;
+ union {
+ KEY_EVENT_RECORD KeyEvent;
+ MOUSE_EVENT_RECORD MouseEvent;
+ WINDOW_BUFFER_SIZE_RECORD WindowBufferSizeEvent;
+ MENU_EVENT_RECORD MenuEvent;
+ FOCUS_EVENT_RECORD FocusEvent;
+ } Event;
+} INPUT_RECORD,*PINPUT_RECORD;
+
+BOOL WINAPI AllocConsole(void);
+HANDLE WINAPI CreateConsoleScreenBuffer(DWORD,DWORD,LPSECURITY_ATTRIBUTES,DWORD,PVOID);
+BOOL WINAPI FillConsoleOutputAttribute(HANDLE,WORD,DWORD,COORD,PDWORD);
+BOOL WINAPI FillConsoleOutputCharacterA(HANDLE,CHAR,DWORD,COORD,PDWORD);
+BOOL WINAPI FillConsoleOutputCharacterW(HANDLE,WCHAR,DWORD,COORD,PDWORD);
+BOOL WINAPI FlushConsoleInputBuffer(HANDLE);
+BOOL WINAPI FreeConsole(void);
+BOOL WINAPI GenerateConsoleCtrlEvent(DWORD,DWORD);
+UINT WINAPI GetConsoleCP(void);
+BOOL WINAPI GetConsoleCursorInfo(HANDLE,PCONSOLE_CURSOR_INFO);
+BOOL WINAPI GetConsoleMode(HANDLE,PDWORD);
+UINT WINAPI GetConsoleOutputCP(void);
+BOOL WINAPI GetConsoleScreenBufferInfo(HANDLE,PCONSOLE_SCREEN_BUFFER_INFO);
+DWORD WINAPI GetConsoleTitleA(LPSTR,DWORD);
+DWORD WINAPI GetConsoleTitleW(LPWSTR,DWORD);
+COORD WINAPI GetLargestConsoleWindowSize(HANDLE);
+BOOL WINAPI GetNumberOfConsoleInputEvents(HANDLE,PDWORD);
+BOOL WINAPI GetNumberOfConsoleMouseButtons(PDWORD);
+BOOL WINAPI PeekConsoleInputA(HANDLE,PINPUT_RECORD,DWORD,PDWORD);
+BOOL WINAPI PeekConsoleInputW(HANDLE,PINPUT_RECORD,DWORD,PDWORD);
+BOOL WINAPI ReadConsoleA(HANDLE,PVOID,DWORD,PDWORD,PVOID);
+BOOL WINAPI ReadConsoleW(HANDLE,PVOID,DWORD,PDWORD,PVOID);
+BOOL WINAPI ReadConsoleInputA(HANDLE,PINPUT_RECORD,DWORD,PDWORD);
+BOOL WINAPI ReadConsoleInputW(HANDLE,PINPUT_RECORD,DWORD,PDWORD);
+BOOL WINAPI ReadConsoleOutputAttribute(HANDLE,LPWORD,DWORD,COORD,LPDWORD);
+BOOL WINAPI ReadConsoleOutputCharacterA(HANDLE,LPSTR,DWORD,COORD,PDWORD);
+BOOL WINAPI ReadConsoleOutputCharacterW(HANDLE,LPWSTR,DWORD,COORD,PDWORD);
+BOOL WINAPI ReadConsoleOutputA(HANDLE,PCHAR_INFO,COORD,COORD,PSMALL_RECT);
+BOOL WINAPI ReadConsoleOutputW(HANDLE,PCHAR_INFO,COORD,COORD,PSMALL_RECT);
+BOOL WINAPI ScrollConsoleScreenBufferA(HANDLE,const SMALL_RECT*,const SMALL_RECT*,COORD,const CHAR_INFO*);
+BOOL WINAPI ScrollConsoleScreenBufferW(HANDLE,const SMALL_RECT*,const SMALL_RECT*,COORD,const CHAR_INFO*);
+BOOL WINAPI SetConsoleActiveScreenBuffer(HANDLE);
+BOOL WINAPI SetConsoleCP(UINT);
+BOOL WINAPI SetConsoleCtrlHandler(PHANDLER_ROUTINE,BOOL);
+BOOL WINAPI SetConsoleCursorInfo(HANDLE,const CONSOLE_CURSOR_INFO*);
+BOOL WINAPI SetConsoleCursorPosition(HANDLE,COORD);
+BOOL WINAPI SetConsoleMode(HANDLE,DWORD);
+BOOL WINAPI SetConsoleOutputCP(UINT);
+BOOL WINAPI SetConsoleScreenBufferSize(HANDLE,COORD);
+BOOL WINAPI SetConsoleTextAttribute(HANDLE,WORD);
+BOOL WINAPI SetConsoleTitleA(LPCSTR);
+BOOL WINAPI SetConsoleTitleW(LPCWSTR);
+BOOL WINAPI SetConsoleWindowInfo(HANDLE,BOOL,const SMALL_RECT*);
+BOOL WINAPI WriteConsoleA(HANDLE,PCVOID,DWORD,PDWORD,PVOID);
+BOOL WINAPI WriteConsoleW(HANDLE,PCVOID,DWORD,PDWORD,PVOID);
+BOOL WINAPI WriteConsoleInputA(HANDLE,const INPUT_RECORD*,DWORD,PDWORD);
+BOOL WINAPI WriteConsoleInputW(HANDLE,const INPUT_RECORD*,DWORD,PDWORD);
+BOOL WINAPI WriteConsoleOutputA(HANDLE,const CHAR_INFO*,COORD,COORD,PSMALL_RECT);
+BOOL WINAPI WriteConsoleOutputW(HANDLE,const CHAR_INFO*,COORD,COORD,PSMALL_RECT);
+BOOL WINAPI WriteConsoleOutputAttribute(HANDLE,const WORD*,DWORD,COORD,PDWORD);
+BOOL WINAPI WriteConsoleOutputCharacterA(HANDLE,LPCSTR,DWORD,COORD,PDWORD);
+BOOL WINAPI WriteConsoleOutputCharacterW(HANDLE,LPCWSTR,DWORD,COORD,PDWORD);
+
+#ifdef UNICODE
+#define FillConsoleOutputCharacter FillConsoleOutputCharacterW
+#define GetConsoleTitle GetConsoleTitleW
+#define PeekConsoleInput PeekConsoleInputW
+#define ReadConsole ReadConsoleW
+#define ReadConsoleInput ReadConsoleInputW
+#define ReadConsoleOutput ReadConsoleOutputW
+#define ReadConsoleOutputCharacter ReadConsoleOutputCharacterW
+#define ScrollConsoleScreenBuffer ScrollConsoleScreenBufferW
+#define SetConsoleTitle SetConsoleTitleW
+#define WriteConsole WriteConsoleW
+#define WriteConsoleInput WriteConsoleInputW
+#define WriteConsoleOutput WriteConsoleOutputW
+#define WriteConsoleOutputCharacter WriteConsoleOutputCharacterW
+#else
+#define FillConsoleOutputCharacter FillConsoleOutputCharacterA
+#define GetConsoleTitle GetConsoleTitleA
+#define PeekConsoleInput PeekConsoleInputA
+#define ReadConsole ReadConsoleA
+#define ReadConsoleInput ReadConsoleInputA
+#define ReadConsoleOutput ReadConsoleOutputA
+#define ReadConsoleOutputCharacter ReadConsoleOutputCharacterA
+#define ScrollConsoleScreenBuffer ScrollConsoleScreenBufferA
+#define SetConsoleTitle SetConsoleTitleA
+#define WriteConsole WriteConsoleA
+#define WriteConsoleInput WriteConsoleInputA
+#define WriteConsoleOutput WriteConsoleOutputA
+#define WriteConsoleOutputCharacter WriteConsoleOutputCharacterA
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/winsup/w32api/include/wincrypt.h b/winsup/w32api/include/wincrypt.h
new file mode 100644
index 000000000..db6bd1e89
--- /dev/null
+++ b/winsup/w32api/include/wincrypt.h
@@ -0,0 +1,184 @@
+#ifndef _WINCRYPT_H
+#define _WINCRYPT_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+#define MS_DEF_PROV_A "Microsoft Base Cryptographic Provider v1.0"
+#define MS_DEF_PROV_W L"Microsoft Base Cryptographic Provider v1.0"
+#define GET_ALG_CLASS(x) (x&57344)
+#define GET_ALG_TYPE(x) (x&7680)
+#define GET_ALG_SID(x) (x&511)
+#define ALG_CLASS_ANY 0
+#define ALG_CLASS_SIGNATURE 8192
+#define ALG_CLASS_MSG_ENCRYPT 16384
+#define ALG_CLASS_DATA_ENCRYPT 24576
+#define ALG_CLASS_HASH 32768
+#define ALG_CLASS_KEY_EXCHANGE 40960
+#define ALG_TYPE_ANY 0
+#define ALG_TYPE_DSS 512
+#define ALG_TYPE_RSA 1024
+#define ALG_TYPE_BLOCK 1536
+#define ALG_TYPE_STREAM 2048
+#define ALG_SID_ANY 0
+#define ALG_SID_RSA_ANY 0
+#define ALG_SID_RSA_PKCS 1
+#define ALG_SID_RSA_MSATWORK 2
+#define ALG_SID_RSA_ENTRUST 3
+#define ALG_SID_RSA_PGP 4
+#define ALG_SID_DSS_ANY 0
+#define ALG_SID_DSS_PKCS 1
+#define ALG_SID_DSS_DMS 2
+#define ALG_SID_DES 1
+#define ALG_SID_RC2 2
+#define ALG_SID_RC4 1
+#define ALG_SID_SEAL 2
+#define ALG_SID_MD2 1
+#define ALG_SID_MD4 2
+#define ALG_SID_MD5 3
+#define ALG_SID_SHA 4
+#define ALG_SID_MAC 5
+#define ALG_SID_EXAMPLE 80
+#define CALG_MD2 (ALG_CLASS_HASH|ALG_TYPE_ANY|ALG_SID_MD2)
+#define CALG_MD4 (ALG_CLASS_HASH|ALG_TYPE_ANY|ALG_SID_MD4)
+#define CALG_MD5 (ALG_CLASS_HASH|ALG_TYPE_ANY|ALG_SID_MD5)
+#define CALG_SHA (ALG_CLASS_HASH|ALG_TYPE_ANY|ALG_SID_SHA)
+#define CALG_MAC (ALG_CLASS_HASH|ALG_TYPE_ANY|ALG_SID_MAC)
+#define CALG_RSA_SIGN (ALG_CLASS_SIGNATURE|ALG_TYPE_RSA|ALG_SID_RSA_ANY)
+#define CALG_DSS_SIGN (ALG_CLASS_SIGNATURE|ALG_TYPE_DSS|ALG_SID_DSS_ANY)
+#define CALG_RSA_KEYX (ALG_CLASS_KEY_EXCHANGE|ALG_TYPE_RSA|ALG_SID_RSA_ANY)
+#define CALG_DES (ALG_CLASS_DATA_ENCRYPT|ALG_TYPE_BLOCK|ALG_SID_DES)
+#define CALG_RC2 (ALG_CLASS_DATA_ENCRYPT|ALG_TYPE_BLOCK|ALG_SID_RC2)
+#define CALG_RC4 (ALG_CLASS_DATA_ENCRYPT|ALG_TYPE_STREAM|ALG_SID_RC4)
+#define CALG_SEAL (ALG_CLASS_DATA_ENCRYPT|ALG_TYPE_STREAM|ALG_SID_SEAL)
+#define CRYPT_VERIFYCONTEXT 0xF0000000
+#define CRYPT_NEWKEYSET 8
+#define CRYPT_DELETEKEYSET 16
+#define CRYPT_EXPORTABLE 1
+#define CRYPT_USER_PROTECTED 2
+#define CRYPT_CREATE_SALT 4
+#define CRYPT_UPDATE_KEY 8
+#define SIMPLEBLOB 1
+#define PUBLICKEYBLOB 6
+#define AT_KEYEXCHANGE 1
+#define AT_SIGNATURE 2
+#define CRYPT_USERDATA 1
+#define KP_IV 1
+#define KP_SALT 2
+#define KP_PADDING 3
+#define KP_MODE 4
+#define KP_MODE_BITS 5
+#define KP_PERMISSIONS 6
+#define KP_ALGID 7
+#define KP_BLOCKLEN 8
+#define PKCS5_PADDING 1
+#define CRYPT_MODE_CBC 1
+#define CRYPT_MODE_ECB 2
+#define CRYPT_MODE_OFB 3
+#define CRYPT_MODE_CFB 4
+#define CRYPT_MODE_CTS 5
+#define CRYPT_ENCRYPT 1
+#define CRYPT_DECRYPT 2
+#define CRYPT_EXPORT 4
+#define CRYPT_READ 8
+#define CRYPT_WRITE 16
+#define CRYPT_MAC 32
+#define HP_ALGID 1
+#define HP_HASHVAL 2
+#define HP_HASHSIZE 4
+#define CRYPT_FAILED FALSE
+#define CRYPT_SUCCEED TRUE
+#define RCRYPT_SUCCEEDED(r) ((r)==CRYPT_SUCCEED)
+#define RCRYPT_FAILED(r) ((r)==CRYPT_FAILED)
+#define PP_ENUMALGS 1
+#define PP_ENUMCONTAINERS 2
+#define PP_IMPTYPE 3
+#define PP_NAME 4
+#define PP_VERSION 5
+#define PP_CONTAINER 6
+#define CRYPT_FIRST 1
+#define CRYPT_NEXT 2
+#define CRYPT_IMPL_HARDWARE 1
+#define CRYPT_IMPL_SOFTWARE 2
+#define CRYPT_IMPL_MIXED 3
+#define CRYPT_IMPL_UNKNOWN 4
+#define PROV_RSA_FULL 1
+#define PROV_RSA_SIG 2
+#define PROV_DSS 3
+#define PROV_FORTEZZA 4
+#define PROV_MS_MAIL 5
+#define PROV_SSL 6
+#define PROV_STT_MER 7
+#define PROV_STT_ACQ 8
+#define PROV_STT_BRND 9
+#define PROV_STT_ROOT 10
+#define PROV_STT_ISS 11
+#define MAXUIDLEN 64
+#define CUR_BLOB_VERSION 2
+typedef UINT ALG_ID;
+typedef struct _VTableProvStruc {FARPROC FuncVerifyImage;} VTableProvStruc,*PVTableProvStruc;
+typedef ULONG HCRYPTPROV;
+typedef ULONG HCRYPTKEY;
+typedef ULONG HCRYPTHASH;
+typedef struct _PROV_ENUMALGS {
+ ALG_ID aiAlgid;
+ DWORD dwBitLen;
+ DWORD dwNameLen;
+ CHAR szName[20];
+} PROV_ENUMALGS;
+typedef struct _PUBLICKEYSTRUC {
+ BYTE bType;
+ BYTE bVersion;
+ WORD reserved;
+ ALG_ID aiKeyAlg;
+} PUBLICKEYSTRUC;
+typedef struct _RSAPUBKEY {
+ DWORD magic;
+ DWORD bitlen;
+ DWORD pubexp;
+} RSAPUBKEY;
+BOOL WINAPI CryptAcquireContextA(HCRYPTPROV*,LPCSTR,LPCSTR,DWORD,DWORD);
+BOOL WINAPI CryptAcquireContextW(HCRYPTPROV*,LPCWSTR,LPCWSTR,DWORD,DWORD);
+BOOL WINAPI CryptReleaseContext(HCRYPTPROV,DWORD);
+BOOL WINAPI CryptGenKey(HCRYPTPROV,ALG_ID,DWORD,HCRYPTKEY*);
+BOOL WINAPI CryptDeriveKey(HCRYPTPROV,ALG_ID,HCRYPTHASH,DWORD,HCRYPTKEY*);
+BOOL WINAPI CryptDestroyKey(HCRYPTKEY);
+BOOL WINAPI CryptSetKeyParam(HCRYPTKEY,DWORD,PBYTE,DWORD);
+BOOL WINAPI CryptGetKeyParam(HCRYPTKEY,DWORD,PBYTE,PDWORD,DWORD);
+BOOL WINAPI CryptSetHashParam(HCRYPTHASH,DWORD,PBYTE,DWORD);
+BOOL WINAPI CryptGetHashParam(HCRYPTHASH,DWORD,PBYTE,PDWORD,DWORD);
+BOOL WINAPI CryptSetProvParam(HCRYPTPROV,DWORD,PBYTE,DWORD);
+BOOL WINAPI CryptGetProvParam(HCRYPTPROV,DWORD,PBYTE,PDWORD,DWORD);
+BOOL WINAPI CryptGenRandom(HCRYPTPROV,DWORD,PBYTE);
+BOOL WINAPI CryptGetUserKey(HCRYPTPROV,DWORD,HCRYPTKEY*);
+BOOL WINAPI CryptExportKey(HCRYPTKEY,HCRYPTKEY,DWORD,DWORD,PBYTE,PDWORD);
+BOOL WINAPI CryptImportKey(HCRYPTPROV,PBYTE,DWORD,HCRYPTKEY,DWORD,HCRYPTKEY*);
+BOOL WINAPI CryptEncrypt(HCRYPTKEY,HCRYPTHASH,BOOL,DWORD,PBYTE,PDWORD,DWORD);
+BOOL WINAPI CryptDecrypt(HCRYPTKEY,HCRYPTHASH,BOOL,DWORD,PBYTE,PDWORD);
+BOOL WINAPI CryptCreateHash(HCRYPTPROV,ALG_ID,HCRYPTKEY,DWORD,HCRYPTHASH*);
+BOOL WINAPI CryptHashData(HCRYPTHASH,PBYTE,DWORD,DWORD);
+BOOL WINAPI CryptHashSessionKey(HCRYPTHASH,HCRYPTKEY,DWORD);
+BOOL WINAPI CryptGetHashValue(HCRYPTHASH,DWORD,PBYTE,PDWORD);
+BOOL WINAPI CryptDestroyHash(HCRYPTHASH);
+BOOL WINAPI CryptSignHashA(HCRYPTHASH,DWORD,LPCSTR,DWORD,PBYTE,PDWORD);
+BOOL WINAPI CryptSignHashW(HCRYPTHASH,DWORD,LPCWSTR,DWORD,PBYTE,PDWORD);
+BOOL WINAPI CryptVerifySignatureA(HCRYPTHASH,PBYTE,DWORD,HCRYPTKEY,LPCSTR,DWORD);
+BOOL WINAPI CryptVerifySignatureW(HCRYPTHASH,PBYTE,DWORD,HCRYPTKEY,LPCWSTR,DWORD);
+BOOL WINAPI CryptSetProviderA(LPCSTR,DWORD);
+BOOL WINAPI CryptSetProviderW(LPCWSTR,DWORD);
+#ifdef UNICODE
+#define CryptAcquireContext CryptAcquireContextW
+#define CryptSignHash CryptSignHashW
+#define CryptVerifySignature CryptVerifySignatureW
+#define CryptSetProvider CryptSetProviderW
+#define MS_DEF_PROV MS_DEF_PROV_W
+#else
+#define CryptAcquireContext CryptAcquireContextA
+#define CryptSignHash CryptSignHashA
+#define CryptVerifySignature CryptVerifySignatureA
+#define CryptSetProvider CryptSetProviderA
+#define MS_DEF_PROV MS_DEF_PROV_A
+#endif
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/winsup/w32api/include/windef.h b/winsup/w32api/include/windef.h
new file mode 100644
index 000000000..433cacfbb
--- /dev/null
+++ b/winsup/w32api/include/windef.h
@@ -0,0 +1,223 @@
+#ifndef _WINDEF_H
+#define _WINDEF_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef WINVER
+#define WINVER 0x0400
+#endif
+#ifndef _WIN32_WINNT
+#define _WIN32_WINNT WINVER
+#endif
+#ifndef WIN32
+#define WIN32
+#endif
+#ifndef _WIN32
+#define _WIN32
+#endif
+#define FAR
+#define far
+#define NEAR
+#define near
+#ifndef CONST
+#define CONST const
+#endif
+#undef MAX_PATH
+#define MAX_PATH 260
+
+#ifndef NULL
+#ifdef __cplusplus
+#define NULL 0
+#else
+#define NULL ((void*)0)
+#endif
+#endif
+#ifndef FALSE
+#define FALSE 0
+#endif
+#ifndef TRUE
+#define TRUE 1
+#endif
+#define IN
+#define OUT
+#define OPTIONAL
+
+#ifdef __GNUC__
+#define PACKED __attribute__((packed))
+#ifndef _stdcall
+#define _stdcall __attribute__((stdcall))
+#endif
+#ifndef __stdcall
+#define __stdcall __attribute__((stdcall))
+#endif
+#ifndef _cdecl
+#define _cdecl __attribute__((cdecl))
+#endif
+#ifndef __cdecl
+#define __cdecl __attribute__((cdecl))
+#endif
+#ifndef __declspec
+#define __declspec(e) __attribute__((e))
+#endif
+#ifndef _declspec
+#define _declspec(e) __attribute__((e))
+#endif
+#else
+#define PACKED
+#define _cdecl
+#define __cdecl
+#endif
+
+#undef pascal
+#undef _pascal
+#undef __pascal
+#define pascal __stdcall
+#define _pascal __stdcall
+#define __pascal __stdcall
+#define PASCAL _pascal
+#define CDECL _cdecl
+#define STDCALL __stdcall
+#define WINAPI __stdcall
+#define WINAPIV __cdecl
+#define APIENTRY __stdcall
+#define CALLBACK __stdcall
+#define APIPRIVATE __stdcall
+
+#define DECLSPEC_IMPORT __declspec(dllimport)
+#define DECLSPEC_EXPORT __declspec(dllexport)
+#define DECLSPEC_NORETURN __declspec(noreturn)
+#define MAKEWORD(a,b) ((WORD)(((BYTE)(a))|(((WORD)((BYTE)(b)))<<8)))
+#define MAKELONG(a,b) ((LONG)(((WORD)(a))|(((DWORD)((WORD)(b)))<<16)))
+#define LOWORD(l) ((WORD)((DWORD)(l)))
+#define HIWORD(l) ((WORD)(((DWORD)(l)>>16)&0xFFFF))
+#define LOBYTE(w) ((BYTE)(w))
+#define HIBYTE(w) ((BYTE)(((WORD)(w)>>8)&0xFF))
+
+#ifndef _export
+#define _export
+#endif
+#ifndef __export
+#define __export
+#endif
+
+#ifndef NOMINMAX
+#ifndef max
+#define max(a,b) ((a)>(b)?(a):(b))
+#endif
+#ifndef min
+#define min(a,b) ((a)<(b)?(a):(b))
+#endif
+#endif
+
+#define UNREFERENCED_PARAMETER(P) {(P)=(P);}
+#define UNREFERENCED_LOCAL_VARIABLE(L) {(L)=(L);}
+#define DBG_UNREFERENCED_PARAMETER(P)
+#define DBG_UNREFERENCED_LOCAL_VARIABLE(L)
+
+typedef unsigned long DWORD;
+typedef int WINBOOL,*PWINBOOL,*LPWINBOOL;
+/* FIXME: Is there a good solution to this? */
+#ifndef __OBJC__
+typedef WINBOOL BOOL;
+#else
+#define BOOL WINBOOL
+#endif
+typedef BOOL *PBOOL,*LPBOOL;
+typedef unsigned char BYTE;
+typedef unsigned short WORD;
+typedef float FLOAT;
+typedef FLOAT *PFLOAT;
+typedef BYTE *PBYTE,*LPBYTE;
+typedef int *PINT,*LPINT;
+typedef WORD *PWORD,*LPWORD;
+typedef long *LPLONG;
+typedef DWORD *PDWORD,*LPDWORD;
+typedef void *PVOID,*LPVOID;
+typedef CONST void *PCVOID,*LPCVOID;
+typedef int INT;
+typedef unsigned int UINT,*PUINT,*LPUINT;
+
+#include <winnt.h>
+
+typedef UINT WPARAM;
+typedef LONG LPARAM;
+typedef LONG LRESULT;
+#ifndef _HRESULT_DEFINED
+typedef LONG HRESULT;
+#define _HRESULT_DEFINED
+#endif
+typedef WORD ATOM;
+typedef HANDLE HGLOBAL;
+typedef HANDLE HLOCAL;
+typedef HANDLE GLOBALHANDLE;
+typedef HANDLE LOCALHANDLE;
+typedef void *HGDIOBJ;
+DECLARE_HANDLE(HACCEL);
+DECLARE_HANDLE(HBITMAP);
+DECLARE_HANDLE(HBRUSH);
+DECLARE_HANDLE(HCOLORSPACE);
+DECLARE_HANDLE(HDC);
+DECLARE_HANDLE(HGLRC);
+DECLARE_HANDLE(HDESK);
+DECLARE_HANDLE(HENHMETAFILE);
+DECLARE_HANDLE(HFONT);
+DECLARE_HANDLE(HICON);
+DECLARE_HANDLE(HKEY);
+/* FIXME: How to handle these. SM_CMONITORS etc in winuser.h also. */
+/* #if (WINVER >= 0x0500) */
+DECLARE_HANDLE(HMONITOR);
+DECLARE_HANDLE(HTERMINAL);
+DECLARE_HANDLE(HWINEVENTHOOK);
+/* #endif */
+typedef HKEY *PHKEY;
+DECLARE_HANDLE(HMENU);
+DECLARE_HANDLE(HMETAFILE);
+DECLARE_HANDLE(HINSTANCE);
+typedef HINSTANCE HMODULE;
+DECLARE_HANDLE(HPALETTE);
+DECLARE_HANDLE(HPEN);
+DECLARE_HANDLE(HRGN);
+DECLARE_HANDLE(HRSRC);
+DECLARE_HANDLE(HSTR);
+DECLARE_HANDLE(HTASK);
+DECLARE_HANDLE(HWND);
+DECLARE_HANDLE(HWINSTA);
+DECLARE_HANDLE(HKL);
+typedef int HFILE;
+typedef HICON HCURSOR;
+typedef DWORD COLORREF;
+typedef int (WINAPI *FARPROC)();
+typedef int (WINAPI *NEARPROC)();
+typedef int (WINAPI *PROC)();
+typedef struct tagRECT {
+ LONG left;
+ LONG top;
+ LONG right;
+ LONG bottom;
+} RECT,*PRECT,*LPRECT;
+typedef const RECT *LPCRECT;
+typedef struct tagRECTL {
+ LONG left;
+ LONG top;
+ LONG right;
+ LONG bottom;
+} RECTL,*PRECTL,*LPRECTL;
+typedef const RECTL *LPCRECTL;
+typedef struct tagPOINT {
+ LONG x;
+ LONG y;
+} POINT,POINTL,*PPOINT,*LPPOINT,*PPOINTL,*LPPOINTL;
+typedef struct tagSIZE {
+ LONG cx;
+ LONG cy;
+} SIZE,SIZEL,*PSIZE,*LPSIZE,*PSIZEL,*LPSIZEL;
+typedef struct tagPOINTS {
+ SHORT x;
+ SHORT y;
+} POINTS,*PPOINTS,*LPPOINTS;
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/winsup/w32api/include/windows.h b/winsup/w32api/include/windows.h
new file mode 100644
index 000000000..60cabfb6d
--- /dev/null
+++ b/winsup/w32api/include/windows.h
@@ -0,0 +1,137 @@
+/*
+ windows.h - main header file for the Win32 API
+
+ Written by Anders Norlander <anorland@hem2.passagen.se>
+
+ This file is part of a free library for the Win32 API.
+
+ 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.
+
+*/
+#ifndef _WINDOWS_H
+#define _WINDOWS_H
+/* translate GCC target defines to MS equivalents. Keep this synchronized
+ with winnt.h. */
+#if defined(__i686__) && !defined(_M_IX86)
+#define _M_IX86 600
+#elif defined(__i586__) && !defined(_M_IX86)
+#define _M_IX86 500
+#elif defined(__i486__) && !defined(_M_IX86)
+#define _M_IX86 400
+#elif defined(__i386__) && !defined(_M_IX86)
+#define _M_IX86 300
+#endif
+#if defined(_M_IX86) && !defined(_X86_)
+#define _X86_
+#elif defined(_M_ALPHA) && !defined(_ALPHA_)
+#define _ALPHA_
+#elif defined(_M_PPC) && !defined(_PPC_)
+#define _PPC_
+#elif defined(_M_MRX000) && !defined(_MIPS_)
+#define _MIPS_
+#elif defined(_M_M68K) && !defined(_68K_)
+#define _68K_
+#endif
+
+#ifdef RC_INVOKED
+/* winresrc.h includes the necessary headers */
+#include <winresrc.h>
+#else
+
+#ifdef __GNUC__
+#ifndef NONAMELESSUNION
+#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95)
+#define _ANONYMOUS_UNION
+#define _ANONYMOUS_STRUCT
+#else
+#if defined(__cplusplus)
+#define _ANONYMOUS_UNION
+#endif
+#endif /* __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95) */
+#endif /* NONAMELESSUNION */
+#endif /* __GNUC__ */
+
+#ifndef _ANONYMOUS_UNION
+#define _UNION_NAME(x) x
+#define DUMMYUNIONNAME u
+#define DUMMYUNIONNAME2 u2
+#define DUMMYUNIONNAME3 u3
+#define DUMMYUNIONNAME4 u4
+#define DUMMYUNIONNAME5 u5
+#define DUMMYUNIONNAME6 u6
+#define DUMMYUNIONNAME7 u7
+#define DUMMYUNIONNAME8 u8
+#else
+#define _UNION_NAME(x)
+#define DUMMYUNIONNAME
+#define DUMMYUNIONNAME2
+#define DUMMYUNIONNAME3
+#define DUMMYUNIONNAME4
+#define DUMMYUNIONNAME5
+#define DUMMYUNIONNAME6
+#define DUMMYUNIONNAME7
+#define DUMMYUNIONNAME8
+#endif
+#ifndef _ANONYMOUS_STRUCT
+#define _STRUCT_NAME(x) x
+#define DUMMYSTRUCTNAME s
+#define DUMMYSTRUCTNAME2 s2
+#define DUMMYSTRUCTNAME3 s3
+#else
+#define _STRUCT_NAME(x)
+#define DUMMYSTRUCTNAME
+#define DUMMYSTRUCTNAME2
+#define DUMMYSTRUCTNAME3
+#endif
+
+#ifndef NO_STRICT
+#ifndef STRICT
+#define STRICT 1
+#endif
+#endif
+
+#include <stdarg.h>
+#include <windef.h>
+#include <wincon.h>
+#include <basetyps.h>
+#include <excpt.h>
+#include <winbase.h>
+#include <wingdi.h>
+#include <winuser.h>
+#include <winnls.h>
+#include <winver.h>
+#include <winnetwk.h>
+#include <winreg.h>
+#include <winsvc.h>
+
+#ifndef WIN32_LEAN_AND_MEAN
+#include <commdlg.h>
+#include <cderr.h>
+#include <dde.h>
+#include <ddeml.h>
+#include <dlgs.h>
+#include <lzexpand.h>
+#include <mmsystem.h>
+#include <nb30.h>
+#include <rpc.h>
+#include <shellapi.h>
+#include <winperf.h>
+#include <winspool.h>
+#if defined(Win32_Winsock) || !(defined(__INSIDE_CYGWIN__) || defined(__CYGWIN__) || defined(__CYGWIN32__) || defined(_UWIN))
+#include <winsock.h>
+#endif
+#endif /* WIN32_LEAN_AND_MEAN */
+
+#endif /* RC_INVOKED */
+
+#ifdef __OBJC__
+/* FIXME: Not undefining BOOL here causes all BOOLs to be WINBOOL (int),
+ but undefining it causes trouble as well if a file is included after
+ windows.h
+*/
+#undef BOOL
+#endif
+
+#endif
diff --git a/winsup/w32api/include/windowsx.h b/winsup/w32api/include/windowsx.h
new file mode 100644
index 000000000..8e6e44cf2
--- /dev/null
+++ b/winsup/w32api/include/windowsx.h
@@ -0,0 +1,505 @@
+#ifndef _WINDOWSX_H
+#define _WINDOWSX_H
+#define WM_CTLCOLOR 25
+#define Button_Enable(hwndCtl,fEnable) EnableWindow((hwndCtl),(fEnable))
+#define Button_GetCheck(hwndCtl) ((int)(DWORD)SendMessage((hwndCtl),BM_GETCHECK,0,0))
+#define Button_GetState(hwndCtl) ((int)(DWORD)SendMessage((hwndCtl),BM_GETSTATE,0,0))
+#define Button_GetText(hwndCtl,lpch,cchMax) GetWindowText((hwndCtl),(lpch),(cchMax))
+#define Button_GetTextLength(hwndCtl) GetWindowTextLength(hwndCtl)
+#define Button_SetCheck(hwndCtl,check) ((void)SendMessage((hwndCtl),BM_SETCHECK,(WPARAM)(int)(check),0))
+#define Button_SetState(hwndCtl,state) ((UINT)(DWORD)SendMessage((hwndCtl),BM_SETSTATE,(WPARAM)(int)(state),0))
+#define Button_SetStyle(hwndCtl,style,fRedraw) ((void)SendMessage((hwndCtl),BM_SETSTYLE,(WPARAM)LOWORD(style),MAKELPARAM(((fRedraw) ? TRUE : FALSE),0)))
+#define Button_SetText(hwndCtl,lpsz) SetWindowText((hwndCtl),(lpsz))
+#define CheckDefDlgRecursion(pfRecursion) if (*(pfRecursion)) {*(pfRecursion) = FALSE; return FALSE; }
+#define ComboBox_AddItemData(hwndCtl,data) ((int)(DWORD)SendMessage((hwndCtl),CB_ADDSTRING,0,(LPARAM)(data)))
+#define ComboBox_AddString(hwndCtl,lpsz) ((int)(DWORD)SendMessage((hwndCtl),CB_ADDSTRING,0,(LPARAM)(LPCTSTR)(lpsz)))
+#define ComboBox_DeleteString(hwndCtl,index) ((int)(DWORD)SendMessage((hwndCtl),CB_DELETESTRING,(WPARAM)(int)(index),0))
+#define ComboBox_Dir(hwndCtl,attrs,lpszFileSpec) ((int)(DWORD)SendMessage((hwndCtl),CB_DIR,(WPARAM)(UINT)(attrs),(LPARAM)(LPCTSTR)(lpszFileSpec)))
+#define ComboBox_Enable(hwndCtl,fEnable) EnableWindow((hwndCtl),(fEnable))
+#define ComboBox_FindItemData(hwndCtl,indexStart,data) ((int)(DWORD)SendMessage((hwndCtl),CB_FINDSTRING,(WPARAM)(int)(indexStart),(LPARAM)(data)))
+#define ComboBox_FindString(hwndCtl,indexStart,lpszFind) ((int)(DWORD)SendMessage((hwndCtl),CB_FINDSTRING,(WPARAM)(int)(indexStart),(LPARAM)(LPCTSTR)(lpszFind)))
+#define ComboBox_FindStringExact(hwndCtl,indexStart,lpszFind) ((int)(DWORD)SendMessage((hwndCtl),CB_FINDSTRINGEXACT,(WPARAM)(int)(indexStart),(LPARAM)(LPCTSTR)(lpszFind)))
+#define ComboBox_GetCount(hwndCtl) ((int)(DWORD)SendMessage((hwndCtl),CB_GETCOUNT,0,0))
+#define ComboBox_GetCurSel(hwndCtl) ((int)(DWORD)SendMessage((hwndCtl),CB_GETCURSEL,0,0))
+#define ComboBox_GetDroppedControlRect(hwndCtl,lprc) ((void)SendMessage((hwndCtl),CB_GETDROPPEDCONTROLRECT,0,(LPARAM)(RECT*)(lprc)))
+#define ComboBox_GetDroppedState(hwndCtl) ((BOOL)(DWORD)SendMessage((hwndCtl),CB_GETDROPPEDSTATE,0,0))
+#define ComboBox_GetEditSel(hwndCtl) ((DWORD)SendMessage((hwndCtl),CB_GETEDITSEL,0,0))
+#define ComboBox_GetExtendedUI(hwndCtl) ((UINT)(DWORD)SendMessage((hwndCtl),CB_GETEXTENDEDUI,0,0))
+#define ComboBox_GetItemData(hwndCtl,index) ((LRESULT)(DWORD)SendMessage((hwndCtl),CB_GETITEMDATA,(WPARAM)(int)(index),0))
+#define ComboBox_GetItemHeight(hwndCtl) ((int)(DWORD)SendMessage((hwndCtl),CB_GETITEMHEIGHT,0,0))
+#define ComboBox_GetLBText(hwndCtl,index,lpszBuffer) ((int)(DWORD)SendMessage((hwndCtl),CB_GETLBTEXT,(WPARAM)(int)(index),(LPARAM)(LPCTSTR)(lpszBuffer)))
+#define ComboBox_GetLBTextLen(hwndCtl,index) ((int)(DWORD)SendMessage((hwndCtl),CB_GETLBTEXTLEN,(WPARAM)(int)(index),0))
+#define ComboBox_GetText(hwndCtl,lpch,cchMax) GetWindowText((hwndCtl),(lpch),(cchMax))
+#define ComboBox_GetTextLength(hwndCtl) GetWindowTextLength(hwndCtl)
+#define ComboBox_InsertItemData(hwndCtl,index,data) ((int)(DWORD)SendMessage((hwndCtl),CB_INSERTSTRING,(WPARAM)(int)(index),(LPARAM)(data)))
+#define ComboBox_InsertString(hwndCtl,index,lpsz) ((int)(DWORD)SendMessage((hwndCtl),CB_INSERTSTRING,(WPARAM)(int)(index),(LPARAM)(LPCTSTR)(lpsz)))
+#define ComboBox_LimitText(hwndCtl,cchLimit) ((int)(DWORD)SendMessage((hwndCtl),CB_LIMITTEXT,(WPARAM)(int)(cchLimit),0))
+#define ComboBox_ResetContent(hwndCtl) ((int)(DWORD)SendMessage((hwndCtl),CB_RESETCONTENT,0,0))
+#define ComboBox_SelectItemData(hwndCtl,indexStart,data) ((int)(DWORD)SendMessage((hwndCtl),CB_SELECTSTRING,(WPARAM)(int)(indexStart),(LPARAM)(data)))
+#define ComboBox_SelectString(hwndCtl,indexStart,lpszSelect) ((int)(DWORD)SendMessage((hwndCtl),CB_SELECTSTRING,(WPARAM)(int)(indexStart),(LPARAM)(LPCTSTR)(lpszSelect)))
+#define ComboBox_SetCurSel(hwndCtl,index) ((int)(DWORD)SendMessage((hwndCtl),CB_SETCURSEL,(WPARAM)(int)(index),0))
+#define ComboBox_SetEditSel(hwndCtl,ichStart,ichEnd) ((int)(DWORD)SendMessage((hwndCtl),CB_SETEDITSEL,0,MAKELPARAM((ichStart),(ichEnd))))
+#define ComboBox_SetExtendedUI(hwndCtl,flags) ((int)(DWORD)SendMessage((hwndCtl),CB_SETEXTENDEDUI,(WPARAM)(UINT)(flags),0))
+#define ComboBox_SetItemData(hwndCtl,index,data) ((int)(DWORD)SendMessage((hwndCtl),CB_SETITEMDATA,(WPARAM)(int)(index),(LPARAM)(data)))
+#define ComboBox_SetItemHeight(hwndCtl,index,cyItem) ((int)(DWORD)SendMessage((hwndCtl),CB_SETITEMHEIGHT,(WPARAM)(int)(index),(LPARAM)(int)cyItem))
+#define ComboBox_SetText(hwndCtl,lpsz) SetWindowText((hwndCtl),(lpsz))
+#define ComboBox_ShowDropdown(hwndCtl,fShow) ((BOOL)(DWORD)SendMessage((hwndCtl),CB_SHOWDROPDOWN,(WPARAM)(BOOL)(fShow),0))
+#define CopyRgn(hrgnDst,hrgnSrc) CombineRgn(hrgnDst,hrgnSrc,0,RGN_COPY)
+#define DECLARE_HANDLE32 DECLARE_HANDLE
+#define DefDlgProcEx(hwnd,msg,wParam,lParam,pfRecursion) (*(pfRecursion) = TRUE,DefDlgProc(hwnd,msg,wParam,lParam))
+#define DeleteBitmap(hbm) DeleteObject((HGDIOBJ)(HBITMAP)(hbm))
+#define DeleteBrush(hbr) DeleteObject((HGDIOBJ)(HBRUSH)(hbr))
+#define DeleteFont(hfont) DeleteObject((HGDIOBJ)(HFONT)(hfont))
+#define DeletePalette(hpal) DeleteObject((HGDIOBJ)(HPALETTE)(hpal))
+#define DeletePen(hpen) DeleteObject((HGDIOBJ)(HPEN)(hpen))
+#define DeleteRgn(hrgn) DeleteObject((HGDIOBJ)(HRGN)(hrgn))
+#define Edit_CanUndo(hwndCtl) ((BOOL)(DWORD)SendMessage((hwndCtl),EM_CANUNDO,0,0))
+#define Edit_EmptyUndoBuffer(hwndCtl) ((void)SendMessage((hwndCtl),EM_EMPTYUNDOBUFFER,0,0))
+#define Edit_Enable(hwndCtl,fEnable) EnableWindow((hwndCtl),(fEnable))
+#define Edit_FmtLines(hwndCtl,fAddEOL) ((BOOL)(DWORD)SendMessage((hwndCtl),EM_FMTLINES,(WPARAM)(BOOL)(fAddEOL),0))
+#define Edit_GetFirstVisibleLine(hwndCtl) ((int)(DWORD)SendMessage((hwndCtl),EM_GETFIRSTVISIBLELINE,0,0))
+#define Edit_GetHandle(hwndCtl) ((HLOCAL)(UINT)(DWORD)SendMessage((hwndCtl),EM_GETHANDLE,0,0))
+#define Edit_GetLine(hwndCtl,line,lpch,cchMax) ((*((int*)(lpch)) = (cchMax)),((int)(DWORD)SendMessage((hwndCtl),EM_GETLINE,(WPARAM)(int)(line),(LPARAM)(LPTSTR)(lpch))))
+#define Edit_GetLineCount(hwndCtl) ((int)(DWORD)SendMessage((hwndCtl),EM_GETLINECOUNT,0,0))
+#define Edit_GetModify(hwndCtl) ((BOOL)(DWORD)SendMessage((hwndCtl),EM_GETMODIFY,0,0))
+#define Edit_GetPasswordChar(hwndCtl) ((TCHAR)(DWORD)SendMessage((hwndCtl),EM_GETPASSWORDCHAR,0,0))
+#define Edit_GetRect(hwndCtl,lprc) ((void)SendMessage((hwndCtl),EM_GETRECT,0,(LPARAM)(RECT*)(lprc)))
+#define Edit_GetSel(hwndCtl) ((DWORD)SendMessage((hwndCtl),EM_GETSEL,0,0))
+#define Edit_GetText(hwndCtl,lpch,cchMax) GetWindowText((hwndCtl),(lpch),(cchMax))
+#define Edit_GetTextLength(hwndCtl) GetWindowTextLength(hwndCtl)
+#define Edit_GetWordBreakProc(hwndCtl) ((EDITWORDBREAKPROC)SendMessage((hwndCtl),EM_GETWORDBREAKPROC,0,0))
+#define Edit_LimitText(hwndCtl,cchMax) ((void)SendMessage((hwndCtl),EM_LIMITTEXT,(WPARAM)(cchMax),0))
+#define Edit_LineFromChar(hwndCtl,ich) ((int)(DWORD)SendMessage((hwndCtl),EM_LINEFROMCHAR,(WPARAM)(int)(ich),0))
+#define Edit_LineIndex(hwndCtl,line) ((int)(DWORD)SendMessage((hwndCtl),EM_LINEINDEX,(WPARAM)(int)(line),0))
+#define Edit_LineLength(hwndCtl,line) ((int)(DWORD)SendMessage((hwndCtl),EM_LINELENGTH,(WPARAM)(int)(line),0))
+#define Edit_ReplaceSel(hwndCtl,lpszReplace) ((void)SendMessage((hwndCtl),EM_REPLACESEL,0,(LPARAM)(LPCTSTR)(lpszReplace)))
+#define Edit_Scroll(hwndCtl,dv,dh) ((void)SendMessage((hwndCtl),EM_LINESCROLL,(WPARAM)(dh),(LPARAM)(dv)))
+#define Edit_ScrollCaret(hwndCtl) ((BOOL)(DWORD)SendMessage((hwndCtl),EM_SCROLLCARET,0,0))
+#define Edit_SetHandle(hwndCtl,h) ((void)SendMessage((hwndCtl),EM_SETHANDLE,(WPARAM)(UINT)(HLOCAL)(h),0))
+#define Edit_SetModify(hwndCtl,fModified) ((void)SendMessage((hwndCtl),EM_SETMODIFY,(WPARAM)(UINT)(fModified),0))
+#define Edit_SetPasswordChar(hwndCtl,ch) ((void)SendMessage((hwndCtl),EM_SETPASSWORDCHAR,(WPARAM)(UINT)(ch),0))
+#define Edit_SetReadOnly(hwndCtl,fReadOnly) ((BOOL)(DWORD)SendMessage((hwndCtl),EM_SETREADONLY,(WPARAM)(BOOL)(fReadOnly),0))
+#define Edit_SetRect(hwndCtl,lprc) ((void)SendMessage((hwndCtl),EM_SETRECT,0,(LPARAM)(const RECT*)(lprc)))
+#define Edit_SetRectNoPaint(hwndCtl,lprc) ((void)SendMessage((hwndCtl),EM_SETRECTNP,0,(LPARAM)(const RECT*)(lprc)))
+#define Edit_SetSel(hwndCtl,ichStart,ichEnd) ((void)SendMessage((hwndCtl),EM_SETSEL,(ichStart),(ichEnd)))
+#define Edit_SetTabStops(hwndCtl,cTabs,lpTabs) ((void)SendMessage((hwndCtl),EM_SETTABSTOPS,(WPARAM)(int)(cTabs),(LPARAM)(const int*)(lpTabs)))
+#define Edit_SetText(hwndCtl,lpsz) SetWindowText((hwndCtl),(lpsz))
+#define Edit_SetWordBreakProc(hwndCtl,lpfnWordBreak) ((void)SendMessage((hwndCtl),EM_SETWORDBREAKPROC,0,(LPARAM)(EDITWORDBREAKPROC)(lpfnWordBreak)))
+#define Edit_Undo(hwndCtl) ((BOOL)(DWORD)SendMessage((hwndCtl),EM_UNDO,0,0))
+#define FORWARD_WM_ACTIVATE(hwnd,state,hwndActDeact,fMinimized,fn) (void)(fn)((hwnd),WM_ACTIVATE,MAKEWPARAM((state),(fMinimized)),(LPARAM)(HWND)(hwndActDeact))
+#define FORWARD_WM_ACTIVATEAPP(hwnd,fActivate,dwThreadId,fn) (void)(fn)((hwnd),WM_ACTIVATEAPP,(WPARAM)(BOOL)(fActivate),(LPARAM)(dwThreadId))
+#define FORWARD_WM_ASKCBFORMATNAME(hwnd,cchMax,rgchName,fn) (void)(fn)((hwnd),WM_ASKCBFORMATNAME,(WPARAM)(int)(cchMax),(LPARAM)(rgchName))
+#define FORWARD_WM_CANCELMODE(hwnd,fn) (void)(fn)((hwnd),WM_CANCELMODE,0,0)
+#define FORWARD_WM_CHANGECBCHAIN(hwnd,hwndRemove,hwndNext,fn) (void)(fn)((hwnd),WM_CHANGECBCHAIN,(WPARAM)(HWND)(hwndRemove),(LPARAM)(HWND)(hwndNext))
+#define FORWARD_WM_CHAR(hwnd,ch,cRepeat,fn) (void)(fn)((hwnd),WM_CHAR,(WPARAM)(TCHAR)(ch),MAKELPARAM((cRepeat),0))
+#define FORWARD_WM_CHARTOITEM(hwnd,ch,hwndListBox,iCaret,fn) (int)(DWORD)(fn)((hwnd),WM_CHARTOITEM,MAKEWPARAM((UINT)(iCaret),(UINT)(ch)),(LPARAM)(hwndListBox))
+#define FORWARD_WM_CHILDACTIVATE(hwnd,fn) (void)(fn)((hwnd),WM_CHILDACTIVATE,0,0)
+#define FORWARD_WM_CLEAR(hwnd,fn) (void)(fn)((hwnd),WM_CLEAR,0,0)
+#define FORWARD_WM_CLOSE(hwnd,fn) (void)(fn)((hwnd),WM_CLOSE,0,0)
+#define FORWARD_WM_COMMAND(hwnd,id,hwndCtl,codeNotify,fn) (void)(fn)((hwnd),WM_COMMAND,MAKEWPARAM((UINT)(id),(UINT)(codeNotify)),(LPARAM)(HWND)(hwndCtl))
+#define FORWARD_WM_COMMNOTIFY(hwnd,cid,flags,fn) (void)(fn)((hwnd),WM_COMMNOTIFY,(WPARAM)(cid),MAKELPARAM((flags),0))
+#define FORWARD_WM_COMPACTING(hwnd,compactRatio,fn) (void)(fn)((hwnd),WM_COMPACTING,(WPARAM)(UINT)(compactRatio),0)
+#define FORWARD_WM_COMPAREITEM(hwnd,lpCompareItem,fn) (int)(DWORD)(fn)((hwnd),WM_COMPAREITEM,(WPARAM)(((const COMPAREITEMSTRUCT*)(lpCompareItem))->CtlID),(LPARAM)(const COMPAREITEMSTRUCT*)(lpCompareItem))
+#define FORWARD_WM_COPY(hwnd,fn) (void)(fn)((hwnd),WM_COPY,0,0)
+#define FORWARD_WM_CREATE(hwnd,lpCreateStruct,fn) (BOOL)(DWORD)(fn)((hwnd),WM_CREATE,0,(LPARAM)(LPCREATESTRUCT)(lpCreateStruct))
+#define FORWARD_WM_CTLCOLORBTN(hwnd,hdc,hwndChild,fn) (HBRUSH)(UINT)(DWORD)(fn)((hwnd),WM_CTLCOLORBTN,(WPARAM)(HDC)(hdc),(LPARAM)(HWND)(hwndChild))
+#define FORWARD_WM_CTLCOLORDLG(hwnd,hdc,hwndChild,fn) (HBRUSH)(UINT)(DWORD)(fn)((hwnd),WM_CTLCOLORDLG,(WPARAM)(HDC)(hdc),(LPARAM)(HWND)(hwndChild))
+#define FORWARD_WM_CTLCOLOREDIT(hwnd,hdc,hwndChild,fn) (HBRUSH)(UINT)(DWORD)(fn)((hwnd),WM_CTLCOLOREDIT,(WPARAM)(HDC)(hdc),(LPARAM)(HWND)(hwndChild))
+#define FORWARD_WM_CTLCOLORLISTBOX(hwnd,hdc,hwndChild,fn) (HBRUSH)(UINT)(DWORD)(fn)((hwnd),WM_CTLCOLORLISTBOX,(WPARAM)(HDC)(hdc),(LPARAM)(HWND)(hwndChild))
+#define FORWARD_WM_CTLCOLORMSGBOX(hwnd,hdc,hwndChild,fn) (HBRUSH)(UINT)(DWORD)(fn)((hwnd),WM_CTLCOLORMSGBOX,(WPARAM)(HDC)(hdc),(LPARAM)(HWND)(hwndChild))
+#define FORWARD_WM_CTLCOLORSCROLLBAR(hwnd,hdc,hwndChild,fn) (HBRUSH)(UINT)(DWORD)(fn)((hwnd),WM_CTLCOLORSCROLLBAR,(WPARAM)(HDC)(hdc),(LPARAM)(HWND)(hwndChild))
+#define FORWARD_WM_CTLCOLORSTATIC(hwnd,hdc,hwndChild,fn) (HBRUSH)(UINT)(DWORD)(fn)((hwnd),WM_CTLCOLORSTATIC,(WPARAM)(HDC)(hdc),(LPARAM)(HWND)(hwndChild))
+#define FORWARD_WM_CUT(hwnd,fn) (void)(fn)((hwnd),WM_CUT,0,0)
+#define FORWARD_WM_DEADCHAR(hwnd,ch,cRepeat,fn) (void)(fn)((hwnd),WM_DEADCHAR,(WPARAM)(TCHAR)(ch),MAKELPARAM((cRepeat),0))
+#define FORWARD_WM_DELETEITEM(hwnd,lpDeleteItem,fn) (void)(fn)((hwnd),WM_DELETEITEM,(WPARAM)(((const DELETEITEMSTRUCT*)(lpDeleteItem))->CtlID),(LPARAM)(const DELETEITEMSTRUCT*)(lpDeleteItem))
+#define FORWARD_WM_DESTROY(hwnd,fn) (void)(fn)((hwnd),WM_DESTROY,0,0)
+#define FORWARD_WM_DESTROYCLIPBOARD(hwnd,fn) (void)(fn)((hwnd),WM_DESTROYCLIPBOARD,0,0)
+#define FORWARD_WM_DEVMODECHANGE(hwnd,lpszDeviceName,fn) (void)(fn)((hwnd),WM_DEVMODECHANGE,0,(LPARAM)(LPCTSTR)(lpszDeviceName))
+#define FORWARD_WM_DRAWCLIPBOARD(hwnd,fn) (void)(fn)((hwnd),WM_DRAWCLIPBOARD,0,0)
+#define FORWARD_WM_DRAWITEM(hwnd,lpDrawItem,fn) (void)(fn)((hwnd),WM_DRAWITEM,(WPARAM)(((const DRAWITEMSTRUCT*)lpDrawItem)->CtlID),(LPARAM)(const DRAWITEMSTRUCT*)(lpDrawItem))
+#define FORWARD_WM_DROPFILES(hwnd,hdrop,fn) (void)(fn)((hwnd),WM_DROPFILES,(WPARAM)(HDROP)(hdrop),0)
+#define FORWARD_WM_ENABLE(hwnd,fEnable,fn) (void)(fn)((hwnd),WM_ENABLE,(WPARAM)(BOOL)(fEnable),0)
+#define FORWARD_WM_ENDSESSION(hwnd,fEnding,fn) (void)(fn)((hwnd),WM_ENDSESSION,(WPARAM)(BOOL)(fEnding),0)
+#define FORWARD_WM_ENTERIDLE(hwnd,source,hwndSource,fn) (void)(fn)((hwnd),WM_ENTERIDLE,(WPARAM)(UINT)(source),(LPARAM)(HWND)(hwndSource))
+#define FORWARD_WM_ERASEBKGND(hwnd,hdc,fn) (BOOL)(DWORD)(fn)((hwnd),WM_ERASEBKGND,(WPARAM)(HDC)(hdc),0)
+#define FORWARD_WM_FONTCHANGE(hwnd,fn) (void)(fn)((hwnd),WM_FONTCHANGE,0,0)
+#define FORWARD_WM_GETDLGCODE(hwnd,lpmsg,fn) (UINT)(DWORD)(fn)((hwnd),WM_GETDLGCODE,(lpmsg ? lpmsg->wParam : 0),(LPARAM)(LPMSG)(lpmsg))
+#define FORWARD_WM_GETFONT(hwnd,fn) (HFONT)(UINT)(DWORD)(fn)((hwnd),WM_GETFONT,0,0)
+#define FORWARD_WM_GETMINMAXINFO(hwnd,lpMinMaxInfo,fn) (void)(fn)((hwnd),WM_GETMINMAXINFO,0,(LPARAM)(LPMINMAXINFO)(lpMinMaxInfo))
+#define FORWARD_WM_GETTEXT(hwnd,cchTextMax,lpszText,fn) (int)(DWORD)(fn)((hwnd),WM_GETTEXT,(WPARAM)(int)(cchTextMax),(LPARAM)(LPTSTR)(lpszText))
+#define FORWARD_WM_GETTEXTLENGTH(hwnd,fn) (int)(DWORD)(fn)((hwnd),WM_GETTEXTLENGTH,0,0)
+#define FORWARD_WM_HSCROLL(hwnd,hwndCtl,code,pos,fn) (void)(fn)((hwnd),WM_HSCROLL,MAKEWPARAM((UINT)(int)(code),(UINT)(int)(pos)),(LPARAM)(UINT)(hwndCtl))
+#define FORWARD_WM_HSCROLLCLIPBOARD(hwnd,hwndCBViewer,code,pos,fn) (void)(fn)((hwnd),WM_HSCROLLCLIPBOARD,(WPARAM)(HWND)(hwndCBViewer),MAKELPARAM((code),(pos)))
+#define FORWARD_WM_ICONERASEBKGND(hwnd,hdc,fn) (BOOL)(DWORD)(fn)((hwnd),WM_ICONERASEBKGND,(WPARAM)(HDC)(hdc),0)
+#define FORWARD_WM_INITDIALOG(hwnd,hwndFocus,lParam,fn) (BOOL)(DWORD)(fn)((hwnd),WM_INITDIALOG,(WPARAM)(HWND)(hwndFocus),(lParam))
+#define FORWARD_WM_INITMENU(hwnd,hMenu,fn) (void)(fn)((hwnd),WM_INITMENU,(WPARAM)(HMENU)(hMenu),0)
+#define FORWARD_WM_INITMENUPOPUP(hwnd,hMenu,item,fSystemMenu,fn) (void)(fn)((hwnd),WM_INITMENUPOPUP,(WPARAM)(HMENU)(hMenu),MAKELPARAM((item),(fSystemMenu)))
+#define FORWARD_WM_KEYDOWN(hwnd,vk,cRepeat,flags,fn) (void)(fn)((hwnd),WM_KEYDOWN,(WPARAM)(UINT)(vk),MAKELPARAM((cRepeat),(flags)))
+#define FORWARD_WM_KEYUP(hwnd,vk,cRepeat,flags,fn) (void)(fn)((hwnd),WM_KEYUP,(WPARAM)(UINT)(vk),MAKELPARAM((cRepeat),(flags)))
+#define FORWARD_WM_KILLFOCUS(hwnd,hwndNewFocus,fn) (void)(fn)((hwnd),WM_KILLFOCUS,(WPARAM)(HWND)(hwndNewFocus),0)
+#define FORWARD_WM_LBUTTONDOWN(hwnd,fDoubleClick,x,y,keyFlags,fn) (void)(fn)((hwnd),(fDoubleClick) ? WM_LBUTTONDBLCLK : WM_LBUTTONDOWN,(WPARAM)(UINT)(keyFlags),MAKELPARAM((x),(y)))
+#define FORWARD_WM_LBUTTONUP(hwnd,x,y,keyFlags,fn) (void)(fn)((hwnd),WM_LBUTTONUP,(WPARAM)(UINT)(keyFlags),MAKELPARAM((x),(y)))
+#define FORWARD_WM_MBUTTONDOWN(hwnd,fDoubleClick,x,y,keyFlags,fn) (void)(fn)((hwnd),(fDoubleClick) ? WM_MBUTTONDBLCLK : WM_MBUTTONDOWN,(WPARAM)(UINT)(keyFlags),MAKELPARAM((x),(y)))
+#define FORWARD_WM_MBUTTONUP(hwnd,x,y,keyFlags,fn) (void)(fn)((hwnd),WM_MBUTTONUP,(WPARAM)(UINT)(keyFlags),MAKELPARAM((x),(y)))
+#define FORWARD_WM_MDIACTIVATE(hwnd,fActive,hwndActivate,hwndDeactivate,fn) (void)(fn)(hwnd,WM_MDIACTIVATE,(WPARAM)(hwndDeactivate),(LPARAM)(hwndActivate))
+#define FORWARD_WM_MDICASCADE(hwnd,cmd,fn) (BOOL)(DWORD)(fn)((hwnd),WM_MDICASCADE,(WPARAM)(cmd),0)
+#define FORWARD_WM_MDICREATE(hwnd,lpmcs,fn) (HWND)(UINT)(DWORD)(fn)((hwnd),WM_MDICREATE,0,(LPARAM)(LPMDICREATESTRUCT)(lpmcs))
+#define FORWARD_WM_MDIDESTROY(hwnd,hwndDestroy,fn) (void)(fn)((hwnd),WM_MDIDESTROY,(WPARAM)(hwndDestroy),0)
+#define FORWARD_WM_MDIGETACTIVE(hwnd,fn) (HWND)(UINT)(DWORD)(fn)((hwnd),WM_MDIGETACTIVE,0,0)
+#define FORWARD_WM_MDIICONARRANGE(hwnd,fn) (void)(fn)((hwnd),WM_MDIICONARRANGE,0,0)
+#define FORWARD_WM_MDIMAXIMIZE(hwnd,hwndMaximize,fn) (void)(fn)((hwnd),WM_MDIMAXIMIZE,(WPARAM)(hwndMaximize),0)
+#define FORWARD_WM_MDINEXT(hwnd,hwndCur,fPrev,fn) (HWND)(UINT)(DWORD)(fn)((hwnd),WM_MDINEXT,(WPARAM)(hwndCur),(LPARAM)(fPrev))
+#define FORWARD_WM_MDIRESTORE(hwnd,hwndRestore,fn) (void)(fn)((hwnd),WM_MDIRESTORE,(WPARAM)(hwndRestore),0)
+#define FORWARD_WM_MDISETMENU(hwnd,fRefresh,hmenuFrame,hmenuWindow,fn) (HMENU)(UINT)(DWORD)(fn)((hwnd),WM_MDISETMENU,(WPARAM)((fRefresh) ? (hmenuFrame) : 0),(LPARAM)(hmenuWindow))
+#define FORWARD_WM_MDITILE(hwnd,cmd,fn) (BOOL)(DWORD)(fn)((hwnd),WM_MDITILE,(WPARAM)(cmd),0)
+#define FORWARD_WM_MEASUREITEM(hwnd,lpMeasureItem,fn) (void)(fn)((hwnd),WM_MEASUREITEM,(WPARAM)(((MEASUREITEMSTRUCT*)lpMeasureItem)->CtlID),(LPARAM)(MEASUREITEMSTRUCT*)(lpMeasureItem))
+#define FORWARD_WM_MENUCHAR(hwnd,ch,flags,hmenu,fn) (DWORD)(fn)((hwnd),WM_MENUCHAR,MAKEWPARAM(flags,(WORD)(ch)),(LPARAM)(HMENU)(hmenu))
+#define FORWARD_WM_MENUSELECT(hwnd,hmenu,item,hmenuPopup,flags,fn) (void)(fn)((hwnd),WM_MENUSELECT,MAKEWPARAM((item),(flags)),(LPARAM)(HMENU)((hmenu) ? (hmenu) : (hmenuPopup)))
+#define FORWARD_WM_MOUSEACTIVATE(hwnd,hwndTopLevel,codeHitTest,msg,fn) (int)(DWORD)(fn)((hwnd),WM_MOUSEACTIVATE,(WPARAM)(HWND)(hwndTopLevel),MAKELPARAM((codeHitTest),(msg)))
+#define FORWARD_WM_MOUSEMOVE(hwnd,x,y,keyFlags,fn) (void)(fn)((hwnd),WM_MOUSEMOVE,(WPARAM)(UINT)(keyFlags),MAKELPARAM((x),(y)))
+#define FORWARD_WM_MOVE(hwnd,x,y,fn) (void)(fn)((hwnd),WM_MOVE,0,MAKELPARAM((x),(y)))
+#define FORWARD_WM_NCACTIVATE(hwnd,fActive,hwndActDeact,fMinimized,fn) (BOOL)(DWORD)(fn)((hwnd),WM_NCACTIVATE,(WPARAM)(BOOL)(fActive),0)
+#define FORWARD_WM_NCCALCSIZE(hwnd,fCalcValidRects,lpcsp,fn) (UINT)(DWORD)(fn)((hwnd),WM_NCCALCSIZE,0,(LPARAM)(NCCALCSIZE_PARAMS*)(lpcsp))
+#define FORWARD_WM_NCCREATE(hwnd,lpCreateStruct,fn) (BOOL)(DWORD)(fn)((hwnd),WM_NCCREATE,0,(LPARAM)(LPCREATESTRUCT)(lpCreateStruct))
+#define FORWARD_WM_NCDESTROY(hwnd,fn) (void)(fn)((hwnd),WM_NCDESTROY,0,0)
+#define FORWARD_WM_NCHITTEST(hwnd,x,y,fn) (UINT)(DWORD)(fn)((hwnd),WM_NCHITTEST,0,MAKELPARAM((x),(y)))
+#define FORWARD_WM_NCLBUTTONDOWN(hwnd,fDoubleClick,x,y,codeHitTest,fn) (void)(fn)((hwnd),(fDoubleClick) ? WM_NCLBUTTONDBLCLK : WM_NCLBUTTONDOWN,(WPARAM)(UINT)(codeHitTest),MAKELPARAM((x),(y)))
+#define FORWARD_WM_NCLBUTTONUP(hwnd,x,y,codeHitTest,fn) (void)(fn)((hwnd),WM_NCLBUTTONUP,(WPARAM)(UINT)(codeHitTest),MAKELPARAM((x),(y)))
+#define FORWARD_WM_NCMBUTTONDOWN(hwnd,fDoubleClick,x,y,codeHitTest,fn) (void)(fn)((hwnd),(fDoubleClick) ? WM_NCMBUTTONDBLCLK : WM_NCMBUTTONDOWN,(WPARAM)(UINT)(codeHitTest),MAKELPARAM((x),(y)) )
+#define FORWARD_WM_NCMBUTTONUP(hwnd,x,y,codeHitTest,fn) (void)(fn)((hwnd),WM_NCMBUTTONUP,(WPARAM)(UINT)(codeHitTest),MAKELPARAM((x),(y)) )
+#define FORWARD_WM_NCMOUSEMOVE(hwnd,x,y,codeHitTest,fn) (void)(fn)((hwnd),WM_NCMOUSEMOVE,(WPARAM)(UINT)(codeHitTest),MAKELPARAM((x),(y)))
+#define FORWARD_WM_NCPAINT(hwnd,hrgn,fn) (void)(fn)((hwnd),WM_NCPAINT,(WPARAM)(HRGN)(hrgn),0)
+#define FORWARD_WM_NCRBUTTONDOWN(hwnd,fDoubleClick,x,y,codeHitTest,fn) (void)(fn)((hwnd),(fDoubleClick) ? WM_NCRBUTTONDBLCLK : WM_NCRBUTTONDOWN,(WPARAM)(UINT)(codeHitTest),MAKELPARAM((x),(y)) )
+#define FORWARD_WM_NCRBUTTONUP(hwnd,x,y,codeHitTest,fn) (void)(fn)((hwnd),WM_NCRBUTTONUP,(WPARAM)(UINT)(codeHitTest),MAKELPARAM((x),(y)) )
+#define FORWARD_WM_NEXTDLGCTL(hwnd,hwndSetFocus,fNext,fn) (HWND)(UINT)(DWORD)(fn)((hwnd),WM_NEXTDLGCTL,(WPARAM)(HWND)(hwndSetFocus),(LPARAM)(fNext))
+#define FORWARD_WM_PAINT(hwnd,fn) (void)(fn)((hwnd),WM_PAINT,0,0)
+#define FORWARD_WM_PAINTCLIPBOARD(hwnd,hwndCBViewer,lpPaintStruct,fn) (void)(fn)((hwnd),WM_PAINTCLIPBOARD,(WPARAM)(HWND)(hwndCBViewer),(LPARAM)(LPPAINTSTRUCT)(lpPaintStruct))
+#define FORWARD_WM_PALETTECHANGED(hwnd,hwndPaletteChange,fn) (void)(fn)((hwnd),WM_PALETTECHANGED,(WPARAM)(HWND)(hwndPaletteChange),0)
+#define FORWARD_WM_PALETTEISCHANGING(hwnd,hwndPaletteChange,fn) (void)(fn)((hwnd),WM_PALETTEISCHANGING,(WPARAM)(HWND)(hwndPaletteChange),0)
+#define FORWARD_WM_PARENTNOTIFY(hwnd,msg,hwndChild,idChild,fn) (void)(fn)((hwnd),WM_PARENTNOTIFY,MAKEWPARAM(msg,idChild),(LPARAM)(hwndChild))
+#define FORWARD_WM_PASTE(hwnd,fn) (void)(fn)((hwnd),WM_PASTE,0,0)
+#define FORWARD_WM_POWER(hwnd,code,fn) (void)(fn)((hwnd),WM_POWER,(WPARAM)(int)(code),0)
+#define FORWARD_WM_QUERYDRAGICON(hwnd,fn) (HICON)(UINT)(DWORD)(fn)((hwnd),WM_QUERYDRAGICON,0,0)
+#define FORWARD_WM_QUERYENDSESSION(hwnd,fn) (BOOL)(DWORD)(fn)((hwnd),WM_QUERYENDSESSION,0,0)
+#define FORWARD_WM_QUERYNEWPALETTE(hwnd,fn) (BOOL)(DWORD)(fn)((hwnd),WM_QUERYNEWPALETTE,0,0)
+#define FORWARD_WM_QUERYOPEN(hwnd,fn) (BOOL)(DWORD)(fn)((hwnd),WM_QUERYOPEN,0,0)
+#define FORWARD_WM_QUEUESYNC(hwnd,fn) (void)(fn)((hwnd),WM_QUEUESYNC,0,0)
+#define FORWARD_WM_QUIT(hwnd,exitCode,fn) (void)(fn)((hwnd),WM_QUIT,(WPARAM)(exitCode),0)
+#define FORWARD_WM_RBUTTONDOWN(hwnd,fDoubleClick,x,y,keyFlags,fn) (void)(fn)((hwnd),(fDoubleClick) ? WM_RBUTTONDBLCLK : WM_RBUTTONDOWN,(WPARAM)(UINT)(keyFlags),MAKELPARAM((x),(y)))
+#define FORWARD_WM_RBUTTONUP(hwnd,x,y,keyFlags,fn) (void)(fn)((hwnd),WM_RBUTTONUP,(WPARAM)(UINT)(keyFlags),MAKELPARAM((x),(y)))
+#define FORWARD_WM_RENDERALLFORMATS(hwnd,fn) (void)(fn)((hwnd),WM_RENDERALLFORMATS,0,0)
+#define FORWARD_WM_RENDERFORMAT(hwnd,fmt,fn) (HANDLE)(UINT)(DWORD)(fn)((hwnd),WM_RENDERFORMAT,(WPARAM)(UINT)(fmt),0)
+#define FORWARD_WM_SETCURSOR(hwnd,hwndCursor,codeHitTest,msg,fn) (BOOL)(DWORD)(fn)((hwnd),WM_SETCURSOR,(WPARAM)(HWND)(hwndCursor),MAKELPARAM((codeHitTest),(msg)))
+#define FORWARD_WM_SETFOCUS(hwnd,hwndOldFocus,fn) (void)(fn)((hwnd),WM_SETFOCUS,(WPARAM)(HWND)(hwndOldFocus),0)
+#define FORWARD_WM_SETFONT(hwnd,hfont,fRedraw,fn) (void)(fn)((hwnd),WM_SETFONT,(WPARAM)(HFONT)(hfont),(LPARAM)(BOOL)(fRedraw))
+#define FORWARD_WM_SETREDRAW(hwnd,fRedraw,fn) (void)(fn)((hwnd),WM_SETREDRAW,(WPARAM)(BOOL)(fRedraw),0)
+#define FORWARD_WM_SETTEXT(hwnd,lpszText,fn) (void)(fn)((hwnd),WM_SETTEXT,0,(LPARAM)(LPCTSTR)(lpszText))
+#define FORWARD_WM_SHOWWINDOW(hwnd,fShow,status,fn) (void)(fn)((hwnd),WM_SHOWWINDOW,(WPARAM)(BOOL)(fShow),(LPARAM)(UINT)(status))
+#define FORWARD_WM_SIZE(hwnd,state,cx,cy,fn) (void)(fn)((hwnd),WM_SIZE,(WPARAM)(UINT)(state),MAKELPARAM((cx),(cy)))
+#define FORWARD_WM_SIZECLIPBOARD(hwnd,hwndCBViewer,lprc,fn) (void)(fn)((hwnd),WM_SIZECLIPBOARD,(WPARAM)(HWND)(hwndCBViewer),(LPARAM)(LPRECT)(lprc))
+#define FORWARD_WM_SPOOLERSTATUS(hwnd,status,cJobInQueue,fn) (void)(fn)((hwnd),WM_SPOOLERSTATUS,(WPARAM)(status),MAKELPARAM((cJobInQueue),0))
+#define FORWARD_WM_SYSCHAR(hwnd,ch,cRepeat,fn) (void)(fn)((hwnd),WM_SYSCHAR,(WPARAM)(TCHAR)(ch),MAKELPARAM((cRepeat),0))
+#define FORWARD_WM_SYSCOLORCHANGE(hwnd,fn) (void)(fn)((hwnd),WM_SYSCOLORCHANGE,0,0)
+#define FORWARD_WM_SYSCOMMAND(hwnd,cmd,x,y,fn) (void)(fn)((hwnd),WM_SYSCOMMAND,(WPARAM)(UINT)(cmd),MAKELPARAM((x),(y)))
+#define FORWARD_WM_SYSDEADCHAR(hwnd,ch,cRepeat,fn) (void)(fn)((hwnd),WM_SYSDEADCHAR,(WPARAM)(TCHAR)(ch),MAKELPARAM((cRepeat),0))
+#define FORWARD_WM_SYSKEYDOWN(hwnd,vk,cRepeat,flags,fn) (void)(fn)((hwnd),WM_SYSKEYDOWN,(WPARAM)(UINT)(vk),MAKELPARAM((cRepeat),(flags)))
+#define FORWARD_WM_SYSKEYUP(hwnd,vk,cRepeat,flags,fn) (void)(fn)((hwnd),WM_SYSKEYUP,(WPARAM)(UINT)(vk),MAKELPARAM((cRepeat),(flags)))
+#define FORWARD_WM_SYSTEMERROR(hwnd,errCode,fn) 0
+#define FORWARD_WM_TIMECHANGE(hwnd,fn) (void)(fn)((hwnd),WM_TIMECHANGE,0,0)
+#define FORWARD_WM_TIMER(hwnd,id,fn) (void)(fn)((hwnd),WM_TIMER,(WPARAM)(UINT)(id),0)
+#define FORWARD_WM_UNDO(hwnd,fn) (void)(fn)((hwnd),WM_UNDO,0,0)
+#define FORWARD_WM_VKEYTOITEM(hwnd,vk,hwndListBox,iCaret,fn) (int)(DWORD)(fn)((hwnd),WM_VKEYTOITEM,MAKEWPARAM((vk),(iCaret)),(LPARAM)(hwndListBox))
+#define FORWARD_WM_VSCROLL(hwnd,hwndCtl,code,pos,fn) (void)(fn)((hwnd),WM_VSCROLL,MAKEWPARAM((UINT)(int)(code),(UINT)(int)(pos)),(LPARAM)(HWND)(hwndCtl))
+#define FORWARD_WM_VSCROLLCLIPBOARD(hwnd,hwndCBViewer,code,pos,fn) (void)(fn)((hwnd),WM_VSCROLLCLIPBOARD,(WPARAM)(HWND)(hwndCBViewer),MAKELPARAM((code),(pos)))
+#define FORWARD_WM_WINDOWPOSCHANGED(hwnd,lpwpos,fn) (void)(fn)((hwnd),WM_WINDOWPOSCHANGED,0,(LPARAM)(const LPWINDOWPOS)(lpwpos))
+#define FORWARD_WM_WINDOWPOSCHANGING(hwnd,lpwpos,fn) (BOOL)(DWORD)(fn)((hwnd),WM_WINDOWPOSCHANGING,0,(LPARAM)(LPWINDOWPOS)(lpwpos))
+#define FORWARD_WM_WININICHANGE(hwnd,lpszSectionName,fn) (void)(fn)((hwnd),WM_WININICHANGE,0,(LPARAM)(LPCTSTR)(lpszSectionName))
+#define GET_EM_LINESCROLL_MPS(vert,horz) (WPARAM)horz,(LONG)vert
+#define GET_EM_SETSEL_END(wp,lp) (lp)
+#define GET_EM_SETSEL_MPS(iStart,iEnd) (WPARAM)(iStart),(LONG)(iEnd)
+#define GET_EM_SETSEL_START(wp,lp) (INT)(wp)
+#define GET_LPARAM(wp,lp) (lp)
+#define GET_WM_ACTIVATE_FMINIMIZED(wp,lp) (BOOL)HIWORD(wp)
+#define GET_WM_ACTIVATE_HWND(wp,lp) (HWND)(lp)
+#define GET_WM_ACTIVATE_MPS(s,fmin,hwnd) (WPARAM)MAKELONG((s),(fmin)),(LONG)(hwnd)
+#define GET_WM_ACTIVATE_STATE(wp,lp) LOWORD(wp)
+#define GET_WM_CHANGECBCHAIN_HWNDNEXT(wp,lp) (HWND)(lp)
+#define GET_WM_CHARTOITEM_CHAR(wp,lp) (TCHAR)LOWORD(wp)
+#define GET_WM_CHARTOITEM_HWND(wp,lp) (HWND)(lp)
+#define GET_WM_CHARTOITEM_MPS(ch,pos,hwnd) (WPARAM)MAKELONG((pos),(ch)),(LONG)(hwnd)
+#define GET_WM_CHARTOITEM_POS(wp,lp) HIWORD(wp)
+#define GET_WM_COMMAND_CMD(wp,lp) HIWORD(wp)
+#define GET_WM_COMMAND_HWND(wp,lp) (HWND)(lp)
+#define GET_WM_COMMAND_ID(wp,lp) LOWORD(wp)
+#define GET_WM_COMMAND_MPS(id,hwnd,cmd) (WPARAM)MAKELONG(id,cmd),(LONG)(hwnd)
+#define GET_WM_CTLCOLOR_HDC(wp,lp,msg) (HDC)(wp)
+#define GET_WM_CTLCOLOR_HWND(wp,lp,msg) (HWND)(lp)
+#define GET_WM_CTLCOLOR_MPS(hdc,hwnd,type) (WPARAM)(hdc),(LONG)(hwnd)
+#define GET_WM_CTLCOLOR_MSG(type) (WORD)(WM_CTLCOLORMSGBOX+(type))
+#define GET_WM_CTLCOLOR_TYPE(wp,lp,msg) (WORD)(msg - WM_CTLCOLORMSGBOX)
+#define GET_WM_HSCROLL_CODE(wp,lp) LOWORD(wp)
+#define GET_WM_HSCROLL_HWND(wp,lp) (HWND)(lp)
+#define GET_WM_HSCROLL_MPS(code,pos,hwnd) (WPARAM)MAKELONG(code,pos),(LONG)(hwnd)
+#define GET_WM_HSCROLL_POS(wp,lp) HIWORD(wp)
+#define GET_WM_MDIACTIVATE_FACTIVATE(hwnd,wp,lp) (lp == (LONG)hwnd)
+#define GET_WM_MDIACTIVATE_HWNDACTIVATE(wp,lp) (HWND)(lp)
+#define GET_WM_MDIACTIVATE_HWNDDEACT(wp,lp) (HWND)(wp)
+#define GET_WM_MDIACTIVATE_MPS(f,hwndD,hwndA) (WPARAM)(hwndA),0
+#define GET_WM_MDISETMENU_MPS(hmenuF,hmenuW) (WPARAM)hmenuF,(LONG)hmenuW
+#define GET_WM_MENUCHAR_CHAR(wp,lp) (TCHAR)LOWORD(wp)
+#define GET_WM_MENUCHAR_FMENU(wp,lp) (BOOL)HIWORD(wp)
+#define GET_WM_MENUCHAR_HMENU(wp,lp) (HMENU)(lp)
+#define GET_WM_MENUCHAR_MPS(ch,hmenu,f) (WPARAM)MAKELONG(ch,f),(LONG)(hmenu)
+#define GET_WM_MENUSELECT_CMD(wp,lp) LOWORD(wp)
+#define GET_WM_MENUSELECT_FLAGS(wp,lp) (UINT)(int)(short)HIWORD(wp)
+#define GET_WM_MENUSELECT_HMENU(wp,lp) (HMENU)(lp)
+#define GET_WM_MENUSELECT_MPS(cmd,f,hmenu) (WPARAM)MAKELONG(cmd,f),(LONG)(hmenu)
+#define GET_WM_PARENTNOTIFY2_MPS(msg,x,y) (WPARAM)MAKELONG(0,msg),MAKELONG(x,y)
+#define GET_WM_PARENTNOTIFY_HWNDCHILD(wp,lp) (HWND)(lp)
+#define GET_WM_PARENTNOTIFY_ID(wp,lp) HIWORD(wp)
+#define GET_WM_PARENTNOTIFY_MPS(msg,id,hwnd) (WPARAM)MAKELONG(id,msg),(LONG)(hwnd)
+#define GET_WM_PARENTNOTIFY_MSG(wp,lp) LOWORD(wp)
+#define GET_WM_PARENTNOTIFY_X(wp,lp) (int)(short)LOWORD(lp)
+#define GET_WM_PARENTNOTIFY_Y(wp,lp) (int)(short)HIWORD(lp)
+#define GET_WM_VKEYTOITEM_CODE(wp,lp) (int)(short)LOWORD(wp)
+#define GET_WM_VKEYTOITEM_HWND(wp,lp) (HWND)(lp)
+#define GET_WM_VKEYTOITEM_ITEM(wp,lp) HIWORD(wp)
+#define GET_WM_VKEYTOITEM_MPS(code,item,hwnd) (WPARAM)MAKELONG(item,code),(LONG)(hwnd)
+#define GET_WM_VSCROLL_CODE(wp,lp) LOWORD(wp)
+#define GET_WM_VSCROLL_HWND(wp,lp) (HWND)(lp)
+#define GET_WM_VSCROLL_MPS(code,pos,hwnd) (WPARAM)MAKELONG(code,pos),(LONG)(hwnd)
+#define GET_WM_VSCROLL_POS(wp,lp) HIWORD(wp)
+#define GET_WPARAM(wp,lp) (wp)
+#define GET_X_LPARAM(lp) ((int)(short)LOWORD(lp))
+#define GET_Y_LPARAM(lp) ((int)(short)HIWORD(lp))
+#define GetFirstChild(hwnd) GetTopWindow(hwnd)
+#define GetFirstSibling(hwnd) GetWindow(hwnd,GW_HWNDFIRST)
+#define GetInstanceModule(hInstance) (HMODULE)(hInstance)
+#define GetLastSibling(hwnd) GetWindow(hwnd,GW_HWNDLAST)
+#define GetNextSibling(hwnd) GetWindow(hwnd,GW_HWNDNEXT)
+#define GetPrevSibling(hwnd) GetWindow(hwnd,GW_HWNDPREV)
+#define GetStockBrush(i) ((HBRUSH)GetStockObject(i))
+#define GetStockFont(i) ((HFONT)GetStockObject(i))
+#define GetStockPen(i) ((HPEN)GetStockObject(i))
+#define GetWindowExStyle(hwnd) ((DWORD)GetWindowLong(hwnd,GWL_EXSTYLE))
+#define GetWindowFont(hwnd) FORWARD_WM_GETFONT((hwnd),SendMessage)
+#define GetWindowID(hwnd) GetDlgCtrlID(hwnd)
+#define GetWindowInstance(hwnd) ((HMODULE)GetWindowLong(hwnd,GWL_HINSTANCE))
+#define GetWindowOwner(hwnd) GetWindow(hwnd,GW_OWNER)
+#define GetWindowStyle(hwnd) ((DWORD)GetWindowLong(hwnd,GWL_STYLE))
+#define GlobalAllocPtr(flags,cb) (GlobalLock(GlobalAlloc((flags),(cb))))
+#define GlobalFreePtr(lp) (GlobalUnlockPtr(lp),(BOOL)GlobalFree(GlobalPtrHandle(lp)))
+#define GlobalLockPtr(lp) ((BOOL)GlobalLock(GlobalPtrHandle(lp)))
+#define GlobalPtrHandle(lp) ((HGLOBAL)GlobalHandle(lp))
+#define GlobalReAllocPtr(lp,cbNew,flags) (GlobalUnlockPtr(lp),GlobalLock(GlobalReAlloc(GlobalPtrHandle(lp) ,(cbNew),(flags))))
+#define GlobalUnlockPtr(lp) GlobalUnlock(GlobalPtrHandle(lp))
+#define HANDLE_MSG(hwnd,message,fn) case (message): return HANDLE_##message((hwnd),(wParam),(lParam),(fn))
+#define HANDLE_WM_ACTIVATE(hwnd,wParam,lParam,fn) ((fn)((hwnd),(UINT)LOWORD(wParam),(HWND)(lParam),(BOOL)HIWORD(wParam)),0)
+#define HANDLE_WM_ACTIVATEAPP(hwnd,wParam,lParam,fn) ((fn)((hwnd),(BOOL)(wParam),(DWORD)(lParam)),0)
+#define HANDLE_WM_ASKCBFORMATNAME(hwnd,wParam,lParam,fn) ((fn)((hwnd),(int)(wParam),(LPTSTR)(lParam)),0)
+#define HANDLE_WM_CANCELMODE(hwnd,wParam,lParam,fn) ((fn)(hwnd),0)
+#define HANDLE_WM_CHANGECBCHAIN(hwnd,wParam,lParam,fn) ((fn)((hwnd),(HWND)(wParam),(HWND)(lParam)),0)
+#define HANDLE_WM_CHAR(hwnd,wParam,lParam,fn) ((fn)((hwnd),(TCHAR)(wParam),(int)(short)LOWORD(lParam)),0)
+#define HANDLE_WM_CHARTOITEM(hwnd,wParam,lParam,fn) (LRESULT)(DWORD)(int)(fn)((hwnd),(UINT)LOWORD(wParam),(HWND)(lParam),(int)(short)HIWORD(wParam))
+#define HANDLE_WM_CHILDACTIVATE(hwnd,wParam,lParam,fn) ((fn)(hwnd),0)
+#define HANDLE_WM_CLEAR(hwnd,wParam,lParam,fn) ((fn)(hwnd),0)
+#define HANDLE_WM_CLOSE(hwnd,wParam,lParam,fn) ((fn)(hwnd),0)
+#define HANDLE_WM_COMMAND(hwnd,wParam,lParam,fn) ((fn)((hwnd),(int)(LOWORD(wParam)),(HWND)(lParam),(UINT)HIWORD(wParam)),0)
+#define HANDLE_WM_COMMNOTIFY(hwnd,wParam,lParam,fn) ((fn)((hwnd),(int)(wParam),(UINT)LOWORD(lParam)),0)
+#define HANDLE_WM_COMPACTING(hwnd,wParam,lParam,fn) ((fn)((hwnd),(UINT)(wParam)),0)
+#define HANDLE_WM_COMPAREITEM(hwnd,wParam,lParam,fn) (LRESULT)(DWORD)(int)(fn)((hwnd),(const COMPAREITEMSTRUCT*)(lParam))
+#define HANDLE_WM_COPY(hwnd,wParam,lParam,fn) ((fn)(hwnd),0)
+#define HANDLE_WM_CREATE(hwnd,wParam,lParam,fn) ((fn)((hwnd),(LPCREATESTRUCT)(lParam)) ? 0 : (LRESULT)-1L)
+#define HANDLE_WM_CTLCOLORBTN(hwnd,wParam,lParam,fn) (LRESULT)(DWORD)(UINT)(HBRUSH)(fn)((hwnd),(HDC)(wParam),(HWND)(lParam),CTLCOLOR_BTN)
+#define HANDLE_WM_CTLCOLORDLG(hwnd,wParam,lParam,fn) (LRESULT)(DWORD)(UINT)(HBRUSH)(fn)((hwnd),(HDC)(wParam),(HWND)(lParam),CTLCOLOR_DLG)
+#define HANDLE_WM_CTLCOLOREDIT(hwnd,wParam,lParam,fn) (LRESULT)(DWORD)(UINT)(HBRUSH)(fn)((hwnd),(HDC)(wParam),(HWND)(lParam),CTLCOLOR_EDIT)
+#define HANDLE_WM_CTLCOLORLISTBOX(hwnd,wParam,lParam,fn) (LRESULT)(DWORD)(UINT)(HBRUSH)(fn)((hwnd),(HDC)(wParam),(HWND)(lParam),CTLCOLOR_LISTBOX)
+#define HANDLE_WM_CTLCOLORMSGBOX(hwnd,wParam,lParam,fn) (LRESULT)(DWORD)(UINT)(HBRUSH)(fn)((hwnd),(HDC)(wParam),(HWND)(lParam),CTLCOLOR_MSGBOX)
+#define HANDLE_WM_CTLCOLORSCROLLBAR(hwnd,wParam,lParam,fn) (LRESULT)(DWORD)(UINT)(HBRUSH)(fn)((hwnd),(HDC)(wParam),(HWND)(lParam),CTLCOLOR_SCROLLBAR)
+#define HANDLE_WM_CTLCOLORSTATIC(hwnd,wParam,lParam,fn) (LRESULT)(DWORD)(UINT)(HBRUSH)(fn)((hwnd),(HDC)(wParam),(HWND)(lParam),CTLCOLOR_STATIC)
+#define HANDLE_WM_CUT(hwnd,wParam,lParam,fn) ((fn)(hwnd),0)
+#define HANDLE_WM_DEADCHAR(hwnd,wParam,lParam,fn) ((fn)((hwnd),(TCHAR)(wParam),(int)(short)LOWORD(lParam)),0)
+#define HANDLE_WM_DELETEITEM(hwnd,wParam,lParam,fn) ((fn)((hwnd),(const DELETEITEMSTRUCT*)(lParam)),0)
+#define HANDLE_WM_DESTROY(hwnd,wParam,lParam,fn) ((fn)(hwnd),0)
+#define HANDLE_WM_DESTROYCLIPBOARD(hwnd,wParam,lParam,fn) ((fn)(hwnd),0)
+#define HANDLE_WM_DEVMODECHANGE(hwnd,wParam,lParam,fn) ((fn)((hwnd),(LPCTSTR)(lParam)),0)
+#define HANDLE_WM_DRAWCLIPBOARD(hwnd,wParam,lParam,fn) ((fn)(hwnd),0)
+#define HANDLE_WM_DRAWITEM(hwnd,wParam,lParam,fn) ((fn)((hwnd),(const DRAWITEMSTRUCT*)(lParam)),0)
+#define HANDLE_WM_DROPFILES(hwnd,wParam,lParam,fn) ((fn)((hwnd),(HDROP)(wParam)),0)
+#define HANDLE_WM_ENABLE(hwnd,wParam,lParam,fn) ((fn)((hwnd),(BOOL)(wParam)),0)
+#define HANDLE_WM_ENDSESSION(hwnd,wParam,lParam,fn) ((fn)((hwnd),(BOOL)(wParam)),0)
+#define HANDLE_WM_ENTERIDLE(hwnd,wParam,lParam,fn) ((fn)((hwnd),(UINT)(wParam),(HWND)(lParam)),0)
+#define HANDLE_WM_ERASEBKGND(hwnd,wParam,lParam,fn) (LRESULT)(DWORD)(BOOL)(fn)((hwnd),(HDC)(wParam))
+#define HANDLE_WM_FONTCHANGE(hwnd,wParam,lParam,fn) ((fn)(hwnd),0)
+#define HANDLE_WM_GETDLGCODE(hwnd,wParam,lParam,fn) (LRESULT)(DWORD)(UINT)(fn)(hwnd,(LPMSG)(lParam))
+#define HANDLE_WM_GETFONT(hwnd,wParam,lParam,fn) (LRESULT)(DWORD)(UINT)(HFONT)(fn)(hwnd)
+#define HANDLE_WM_GETMINMAXINFO(hwnd,wParam,lParam,fn) ((fn)((hwnd),(LPMINMAXINFO)(lParam)),0)
+#define HANDLE_WM_GETTEXT(hwnd,wParam,lParam,fn) (LRESULT)(DWORD)(int)(fn)((hwnd),(int)(wParam),(LPTSTR)(lParam))
+#define HANDLE_WM_GETTEXTLENGTH(hwnd,wParam,lParam,fn) (LRESULT)(DWORD)(int)(fn)(hwnd)
+#define HANDLE_WM_HSCROLL(hwnd,wParam,lParam,fn) ((fn)((hwnd),(HWND)(lParam),(UINT)(LOWORD(wParam)),(int)(short)HIWORD(wParam)),0)
+#define HANDLE_WM_HSCROLLCLIPBOARD(hwnd,wParam,lParam,fn) ((fn)((hwnd),(HWND)(wParam),(UINT)LOWORD(lParam),(int)(short)HIWORD(lParam)),0)
+#define HANDLE_WM_ICONERASEBKGND(hwnd,wParam,lParam,fn) (LRESULT)(DWORD)(BOOL)(fn)((hwnd),(HDC)(wParam))
+#define HANDLE_WM_INITDIALOG(hwnd,wParam,lParam,fn) (LRESULT)(DWORD)(UINT)(BOOL)(fn)((hwnd),(HWND)(wParam),lParam)
+#define HANDLE_WM_INITMENU(hwnd,wParam,lParam,fn) ((fn)((hwnd),(HMENU)(wParam)),0)
+#define HANDLE_WM_INITMENUPOPUP(hwnd,wParam,lParam,fn) ((fn)((hwnd),(HMENU)(wParam),(UINT)LOWORD(lParam),(BOOL)HIWORD(lParam)),0)
+#define HANDLE_WM_KEYDOWN(hwnd,wParam,lParam,fn) ((fn)((hwnd),(UINT)(wParam),TRUE,(int)(short)LOWORD(lParam),(UINT)HIWORD(lParam)),0)
+#define HANDLE_WM_KEYUP(hwnd,wParam,lParam,fn) ((fn)((hwnd),(UINT)(wParam),FALSE,(int)(short)LOWORD(lParam),(UINT)HIWORD(lParam)),0)
+#define HANDLE_WM_KILLFOCUS(hwnd,wParam,lParam,fn) ((fn)((hwnd),(HWND)(wParam)),0)
+#define HANDLE_WM_LBUTTONDBLCLK(hwnd,wParam,lParam,fn) ((fn)((hwnd),TRUE,(int)(short)LOWORD(lParam),(int)(short)HIWORD(lParam),(UINT)(wParam)),0)
+#define HANDLE_WM_LBUTTONDOWN(hwnd,wParam,lParam,fn) ((fn)((hwnd),FALSE,(int)(short)LOWORD(lParam),(int)(short)HIWORD(lParam),(UINT)(wParam)),0)
+#define HANDLE_WM_LBUTTONUP(hwnd,wParam,lParam,fn) ((fn)((hwnd),(int)(short)LOWORD(lParam),(int)(short)HIWORD(lParam),(UINT)(wParam)),0)
+#define HANDLE_WM_MBUTTONDBLCLK(hwnd,wParam,lParam,fn) ((fn)((hwnd),TRUE,(int)(short)LOWORD(lParam),(int)(short)HIWORD(lParam),(UINT)(wParam)),0)
+#define HANDLE_WM_MBUTTONDOWN(hwnd,wParam,lParam,fn) ((fn)((hwnd),FALSE,(int)(short)LOWORD(lParam),(int)(short)HIWORD(lParam),(UINT)(wParam)),0)
+#define HANDLE_WM_MBUTTONUP(hwnd,wParam,lParam,fn) ((fn)((hwnd),(int)(short)LOWORD(lParam),(int)(short)HIWORD(lParam),(UINT)(wParam)),0)
+#define HANDLE_WM_MDIACTIVATE(hwnd,wParam,lParam,fn) ((fn)((hwnd),(BOOL)(lParam == (LPARAM)hwnd),(HWND)(lParam),(HWND)(wParam)),0)
+#define HANDLE_WM_MDICASCADE(hwnd,wParam,lParam,fn) (LRESULT)(DWORD)(fn)((hwnd),(UINT)(wParam))
+#define HANDLE_WM_MDICREATE(hwnd,wParam,lParam,fn) (LRESULT)(DWORD)(UINT)(fn)((hwnd),(LPMDICREATESTRUCT)(lParam))
+#define HANDLE_WM_MDIDESTROY(hwnd,wParam,lParam,fn) ((fn)((hwnd),(HWND)(wParam)),0)
+#define HANDLE_WM_MDIGETACTIVE(hwnd,wParam,lParam,fn) (LRESULT)(DWORD)(UINT)(fn)(hwnd)
+#define HANDLE_WM_MDIICONARRANGE(hwnd,wParam,lParam,fn) ((fn)(hwnd),0)
+#define HANDLE_WM_MDIMAXIMIZE(hwnd,wParam,lParam,fn) ((fn)((hwnd),(HWND)(wParam)),0)
+#define HANDLE_WM_MDINEXT(hwnd,wParam,lParam,fn) (LRESULT)(HWND)(fn)((hwnd),(HWND)(wParam),(BOOL)lParam)
+#define HANDLE_WM_MDIRESTORE(hwnd,wParam,lParam,fn) ((fn)((hwnd),(HWND)(wParam)),0)
+#define HANDLE_WM_MDISETMENU(hwnd,wParam,lParam,fn) (LRESULT)(DWORD)(UINT)(fn)((hwnd),(BOOL)(wParam),(HMENU)(wParam),(HMENU)(lParam))
+#define HANDLE_WM_MDITILE(hwnd,wParam,lParam,fn) (LRESULT)(DWORD)(fn)((hwnd),(UINT)(wParam))
+#define HANDLE_WM_MEASUREITEM(hwnd,wParam,lParam,fn) ((fn)((hwnd),(MEASUREITEMSTRUCT*)(lParam)),0)
+#define HANDLE_WM_MENUCHAR(hwnd,wParam,lParam,fn) (LRESULT)(DWORD)(fn)((hwnd),(UINT)(LOWORD(wParam)),(UINT)HIWORD(wParam),(HMENU)(lParam))
+#define HANDLE_WM_MENUSELECT(hwnd,wParam,lParam,fn) ((fn)((hwnd),(HMENU)(lParam),(int)(LOWORD(wParam)),(HIWORD(wParam) & MF_POPUP) ? GetSubMenu((HMENU)lParam,LOWORD(wParam)) : 0,(UINT)(((short)HIWORD(wParam) == -1) ? 0xFFFFFFFF : HIWORD(wParam))),0)
+#define HANDLE_WM_MOUSEACTIVATE(hwnd,wParam,lParam,fn) (LRESULT)(DWORD)(int)(fn)((hwnd),(HWND)(wParam),(UINT)LOWORD(lParam),(UINT)HIWORD(lParam))
+#define HANDLE_WM_MOUSEMOVE(hwnd,wParam,lParam,fn) ((fn)((hwnd),(int)(short)LOWORD(lParam),(int)(short)HIWORD(lParam),(UINT)(wParam)),0)
+#define HANDLE_WM_MOVE(hwnd,wParam,lParam,fn) ((fn)((hwnd),(int)(short)LOWORD(lParam),(int)(short)HIWORD(lParam)),0)
+#define HANDLE_WM_NCACTIVATE(hwnd,wParam,lParam,fn) (LRESULT)(DWORD)(BOOL)(fn)((hwnd),(BOOL)(wParam),0,0)
+#define HANDLE_WM_NCCALCSIZE(hwnd,wParam,lParam,fn) (LRESULT)(DWORD)(UINT)(fn)((hwnd),(BOOL)(0),(NCCALCSIZE_PARAMS*)(lParam))
+#define HANDLE_WM_NCCREATE(hwnd,wParam,lParam,fn) (LRESULT)(DWORD)(BOOL)(fn)((hwnd),(LPCREATESTRUCT)(lParam))
+#define HANDLE_WM_NCDESTROY(hwnd,wParam,lParam,fn) ((fn)(hwnd),0)
+#define HANDLE_WM_NCHITTEST(hwnd,wParam,lParam,fn) (LRESULT)(DWORD)(UINT)(fn)((hwnd),(int)(short)LOWORD(lParam),(int)(short)HIWORD(lParam))
+#define HANDLE_WM_NCLBUTTONDBLCLK(hwnd,wParam,lParam,fn) ((fn)((hwnd),TRUE,(int)(short)LOWORD(lParam),(int)(short)HIWORD(lParam),(UINT)(wParam)),0)
+#define HANDLE_WM_NCLBUTTONDOWN(hwnd,wParam,lParam,fn) ((fn)((hwnd),FALSE,(int)(short)LOWORD(lParam),(int)(short)HIWORD(lParam),(UINT)(wParam)),0)
+#define HANDLE_WM_NCLBUTTONUP(hwnd,wParam,lParam,fn) ((fn)((hwnd),(int)(short)LOWORD(lParam),(int)(short)HIWORD(lParam),(UINT)(wParam)),0)
+#define HANDLE_WM_NCMBUTTONDBLCLK(hwnd,wParam,lParam,fn) ((fn)((hwnd),TRUE,(int)(short)LOWORD(lParam),(int)(short)HIWORD(lParam),(UINT)(wParam)),0)
+#define HANDLE_WM_NCMBUTTONDOWN(hwnd,wParam,lParam,fn) ((fn)((hwnd),FALSE,(int)(short)LOWORD(lParam),(int)(short)HIWORD(lParam),(UINT)(wParam)),0)
+#define HANDLE_WM_NCMBUTTONUP(hwnd,wParam,lParam,fn) ((fn)((hwnd),(int)(short)LOWORD(lParam),(int)(short)HIWORD(lParam),(UINT)(wParam)),0)
+#define HANDLE_WM_NCMOUSEMOVE(hwnd,wParam,lParam,fn) ((fn)((hwnd),(int)(short)LOWORD(lParam),(int)(short)HIWORD(lParam),(UINT)(wParam)),0)
+#define HANDLE_WM_NCPAINT(hwnd,wParam,lParam,fn) ((fn)((hwnd),(HRGN)(wParam)),0)
+#define HANDLE_WM_NCRBUTTONDBLCLK(hwnd,wParam,lParam,fn) ((fn)((hwnd),TRUE,(int)(short)LOWORD(lParam),(int)(short)HIWORD(lParam),(UINT)(wParam)),0)
+#define HANDLE_WM_NCRBUTTONDOWN(hwnd,wParam,lParam,fn) ((fn)((hwnd),FALSE,(int)(short)LOWORD(lParam),(int)(short)HIWORD(lParam),(UINT)(wParam)),0)
+#define HANDLE_WM_NCRBUTTONUP(hwnd,wParam,lParam,fn) ((fn)((hwnd),(int)(short)LOWORD(lParam),(int)(short)HIWORD(lParam),(UINT)(wParam)),0)
+#define HANDLE_WM_NEXTDLGCTL(hwnd,wParam,lParam,fn) (LRESULT)(DWORD)(UINT)(HWND)(fn)((hwnd),(HWND)(wParam),(BOOL)(lParam))
+#define HANDLE_WM_PAINT(hwnd,wParam,lParam,fn) ((fn)(hwnd),0)
+#define HANDLE_WM_PAINTCLIPBOARD(hwnd,wParam,lParam,fn) ((fn)((hwnd),(HWND)(wParam),(const LPPAINTSTRUCT)GlobalLock((HGLOBAL)(lParam))),GlobalUnlock((HGLOBAL)(lParam)),0)
+#define HANDLE_WM_PALETTECHANGED(hwnd,wParam,lParam,fn) ((fn)((hwnd),(HWND)(wParam)),0)
+#define HANDLE_WM_PALETTEISCHANGING(hwnd,wParam,lParam,fn) ((fn)((hwnd),(HWND)(wParam)),0)
+#define HANDLE_WM_PARENTNOTIFY(hwnd,wParam,lParam,fn) ((fn)((hwnd),(UINT)LOWORD(wParam),(HWND)(lParam),(UINT)HIWORD(wParam)),0)
+#define HANDLE_WM_PASTE(hwnd,wParam,lParam,fn) ((fn)(hwnd),0)
+#define HANDLE_WM_POWER(hwnd,wParam,lParam,fn) ((fn)((hwnd),(int)(wParam)),0)
+#define HANDLE_WM_QUERYDRAGICON(hwnd,wParam,lParam,fn) (LRESULT)(DWORD)(UINT)(fn)(hwnd)
+#define HANDLE_WM_QUERYENDSESSION(hwnd,wParam,lParam,fn) MAKELRESULT((BOOL)(fn)(hwnd),0)
+#define HANDLE_WM_QUERYNEWPALETTE(hwnd,wParam,lParam,fn) MAKELRESULT((BOOL)(fn)(hwnd),0)
+#define HANDLE_WM_QUERYOPEN(hwnd,wParam,lParam,fn) MAKELRESULT((BOOL)(fn)(hwnd),0)
+#define HANDLE_WM_QUEUESYNC(hwnd,wParam,lParam,fn) ((fn)(hwnd),0)
+#define HANDLE_WM_QUIT(hwnd,wParam,lParam,fn) ((fn)((hwnd),(int)(wParam)),0)
+#define HANDLE_WM_RBUTTONDBLCLK(hwnd,wParam,lParam,fn) ((fn)((hwnd),TRUE,(int)(short)LOWORD(lParam),(int)(short)HIWORD(lParam),(UINT)(wParam)),0)
+#define HANDLE_WM_RBUTTONDOWN(hwnd,wParam,lParam,fn) ((fn)((hwnd),FALSE,(int)(short)LOWORD(lParam),(int)(short)HIWORD(lParam),(UINT)(wParam)),0)
+#define HANDLE_WM_RBUTTONUP(hwnd,wParam,lParam,fn) ((fn)((hwnd),(int)(short)LOWORD(lParam),(int)(short)HIWORD(lParam),(UINT)(wParam)),0)
+#define HANDLE_WM_RENDERALLFORMATS(hwnd,wParam,lParam,fn) ((fn)(hwnd),0)
+#define HANDLE_WM_RENDERFORMAT(hwnd,wParam,lParam,fn) (LRESULT)(DWORD)(UINT)(HANDLE)(fn)((hwnd),(UINT)(wParam))
+#define HANDLE_WM_SETCURSOR(hwnd,wParam,lParam,fn) (LRESULT)(DWORD)(BOOL)(fn)((hwnd),(HWND)(wParam),(UINT)LOWORD(lParam),(UINT)HIWORD(lParam))
+#define HANDLE_WM_SETFOCUS(hwnd,wParam,lParam,fn) ((fn)((hwnd),(HWND)(wParam)),0)
+#define HANDLE_WM_SETFONT(hwnd,wParam,lParam,fn) ((fn)((hwnd),(HFONT)(wParam),(BOOL)(lParam)),0)
+#define HANDLE_WM_SETREDRAW(hwnd,wParam,lParam,fn) ((fn)((hwnd),(BOOL)(wParam)),0)
+#define HANDLE_WM_SETTEXT(hwnd,wParam,lParam,fn) ((fn)((hwnd),(LPCTSTR)(lParam)),0)
+#define HANDLE_WM_SHOWWINDOW(hwnd,wParam,lParam,fn) ((fn)((hwnd),(BOOL)(wParam),(UINT)(lParam)),0)
+#define HANDLE_WM_SIZE(hwnd,wParam,lParam,fn) ((fn)((hwnd),(UINT)(wParam),(int)(short)LOWORD(lParam),(int)(short)HIWORD(lParam)),0)
+#define HANDLE_WM_SIZECLIPBOARD(hwnd,wParam,lParam,fn) ((fn)((hwnd),(HWND)(wParam),(const LPRECT)GlobalLock((HGLOBAL)(lParam))),GlobalUnlock((HGLOBAL)(lParam)),0)
+#define HANDLE_WM_SPOOLERSTATUS(hwnd,wParam,lParam,fn) ((fn)((hwnd),(UINT)(wParam),(int)(short)LOWORD(lParam)),0)
+#define HANDLE_WM_SYSCHAR(hwnd,wParam,lParam,fn) ((fn)((hwnd),(TCHAR)(wParam),(int)(short)LOWORD(lParam)),0)
+#define HANDLE_WM_SYSCOLORCHANGE(hwnd,wParam,lParam,fn) ((fn)(hwnd),0)
+#define HANDLE_WM_SYSCOMMAND(hwnd,wParam,lParam,fn) ((fn)((hwnd),(UINT)(wParam),(int)(short)LOWORD(lParam),(int)(short)HIWORD(lParam)),0)
+#define HANDLE_WM_SYSDEADCHAR(hwnd,wParam,lParam,fn) ((fn)((hwnd),(TCHAR)(wParam),(int)(short)LOWORD(lParam)),0)
+#define HANDLE_WM_SYSKEYDOWN(hwnd,wParam,lParam,fn) ((fn)((hwnd),(UINT)(wParam),TRUE,(int)(short)LOWORD(lParam),(UINT)HIWORD(lParam)),0)
+#define HANDLE_WM_SYSKEYUP(hwnd,wParam,lParam,fn) ((fn)((hwnd),(UINT)(wParam),FALSE,(int)(short)LOWORD(lParam),(UINT)HIWORD(lParam)),0)
+#define HANDLE_WM_SYSTEMERROR(hwnd,wParam,lParam,fn) 0
+#define HANDLE_WM_TIMECHANGE(hwnd,wParam,lParam,fn) ((fn)(hwnd),0)
+#define HANDLE_WM_TIMER(hwnd,wParam,lParam,fn) ((fn)((hwnd),(UINT)(wParam)),0)
+#define HANDLE_WM_UNDO(hwnd,wParam,lParam,fn) ((fn)(hwnd),0)
+#define HANDLE_WM_VKEYTOITEM(hwnd,wParam,lParam,fn) (LRESULT)(DWORD)(int)(fn)((hwnd),(UINT)LOWORD(wParam),(HWND)(lParam),(int)(short)HIWORD(wParam))
+#define HANDLE_WM_VSCROLL(hwnd,wParam,lParam,fn) ((fn)((hwnd),(HWND)(lParam),(UINT)(LOWORD(wParam)),(int)(short)HIWORD(wParam)),0)
+#define HANDLE_WM_VSCROLLCLIPBOARD(hwnd,wParam,lParam,fn) ((fn)((hwnd),(HWND)(wParam),(UINT)LOWORD(lParam),(int)(short)HIWORD(lParam)),0)
+#define HANDLE_WM_WINDOWPOSCHANGED(hwnd,wParam,lParam,fn) ((fn)((hwnd),(const LPWINDOWPOS)(lParam)),0)
+#define HANDLE_WM_WINDOWPOSCHANGING(hwnd,wParam,lParam,fn) (LRESULT)(DWORD)(BOOL)(fn)((hwnd),(LPWINDOWPOS)(lParam))
+#define HANDLE_WM_WININICHANGE(hwnd,wParam,lParam,fn) ((fn)((hwnd),(LPCTSTR)(lParam)),0)
+#define InsetRect(lprc,dx,dy) InflateRect((lprc),-(dx),-(dy))
+#define IntersectRgn(hrgnResult,hrgnA,hrgnB) CombineRgn(hrgnResult,hrgnA,hrgnB,RGN_AND)
+#define IsLButtonDown() (GetKeyState(VK_LBUTTON) < 0)
+#define IsMButtonDown() (GetKeyState(VK_MBUTTON) < 0)
+#define IsMaximized(hwnd) IsZoomed(hwnd)
+#define IsMinimized(hwnd) IsIconic(hwnd)
+#define IsRButtonDown() (GetKeyState(VK_RBUTTON) < 0)
+#define IsRestored(hwnd) ((GetWindowStyle(hwnd) & (WS_MINIMIZE | WS_MAXIMIZE)) == 0)
+#define ListBox_AddItemData(hwndCtl,data) ((int)(DWORD)SendMessage((hwndCtl),LB_ADDSTRING,0,(LPARAM)(data)))
+#define ListBox_AddString(hwndCtl,lpsz) ((int)(DWORD)SendMessage((hwndCtl),LB_ADDSTRING,0,(LPARAM)(LPCTSTR)(lpsz)))
+#define ListBox_DeleteString(hwndCtl,index) ((int)(DWORD)SendMessage((hwndCtl),LB_DELETESTRING,(WPARAM)(int)(index),0))
+#define ListBox_Dir(hwndCtl,attrs,lpszFileSpec) ((int)(DWORD)SendMessage((hwndCtl),LB_DIR,(WPARAM)(UINT)(attrs),(LPARAM)(LPCTSTR)(lpszFileSpec)))
+#define ListBox_Enable(hwndCtl,fEnable) EnableWindow((hwndCtl),(fEnable))
+#define ListBox_FindItemData(hwndCtl,indexStart,data) ((int)(DWORD)SendMessage((hwndCtl),LB_FINDSTRING,(WPARAM)(int)(indexStart),(LPARAM)(data)))
+#define ListBox_FindString(hwndCtl,indexStart,lpszFind) ((int)(DWORD)SendMessage((hwndCtl),LB_FINDSTRING,(WPARAM)(int)(indexStart),(LPARAM)(LPCTSTR)(lpszFind)))
+#define ListBox_FindStringExact(hwndCtl,indexStart,lpszFind) ((int)(DWORD)SendMessage((hwndCtl),LB_FINDSTRINGEXACT,(WPARAM)(int)(indexStart),(LPARAM)(LPCTSTR)(lpszFind)))
+#define ListBox_GetCaretIndex(hwndCtl) ((int)(DWORD)SendMessage((hwndCtl),LB_GETCARETINDEX,0,0))
+#define ListBox_GetCount(hwndCtl) ((int)(DWORD)SendMessage((hwndCtl),LB_GETCOUNT,0,0))
+#define ListBox_GetCurSel(hwndCtl) ((int)(DWORD)SendMessage((hwndCtl),LB_GETCURSEL,0,0))
+#define ListBox_GetHorizontalExtent(hwndCtl) ((int)(DWORD)SendMessage((hwndCtl),LB_GETHORIZONTALEXTENT,0,0))
+#define ListBox_GetItemData(hwndCtl,index) ((LRESULT)(DWORD)SendMessage((hwndCtl),LB_GETITEMDATA,(WPARAM)(int)(index),0))
+#define ListBox_GetItemHeight(hwndCtl,index) ((int)(DWORD)SendMessage((hwndCtl),LB_GETITEMHEIGHT,(WPARAM)(int)(index),0))
+#define ListBox_GetItemRect(hwndCtl,index,lprc) ((int)(DWORD)SendMessage((hwndCtl),LB_GETITEMRECT,(WPARAM)(int)(index),(LPARAM)(RECT*)(lprc)))
+#define ListBox_GetSel(hwndCtl,index) ((int)(DWORD)SendMessage((hwndCtl),LB_GETSEL,(WPARAM)(int)(index),0))
+#define ListBox_GetSelCount(hwndCtl) ((int)(DWORD)SendMessage((hwndCtl),LB_GETSELCOUNT,0,0))
+#define ListBox_GetSelItems(hwndCtl,cItems,lpItems) ((int)(DWORD)SendMessage((hwndCtl),LB_GETSELITEMS,(WPARAM)(int)(cItems),(LPARAM)(int*)(lpItems)))
+#define ListBox_GetText(hwndCtl,index,lpszBuffer) ((int)(DWORD)SendMessage((hwndCtl),LB_GETTEXT,(WPARAM)(int)(index),(LPARAM)(LPCTSTR)(lpszBuffer)))
+#define ListBox_GetTextLen(hwndCtl,index) ((int)(DWORD)SendMessage((hwndCtl),LB_GETTEXTLEN,(WPARAM)(int)(index),0))
+#define ListBox_GetTopIndex(hwndCtl) ((int)(DWORD)SendMessage((hwndCtl),LB_GETTOPINDEX,0,0))
+#define ListBox_InsertItemData(hwndCtl,index,data) ((int)(DWORD)SendMessage((hwndCtl),LB_INSERTSTRING,(WPARAM)(int)(index),(LPARAM)(data)))
+#define ListBox_InsertString(hwndCtl,index,lpsz) ((int)(DWORD)SendMessage((hwndCtl),LB_INSERTSTRING,(WPARAM)(int)(index),(LPARAM)(LPCTSTR)(lpsz)))
+#define ListBox_ResetContent(hwndCtl) ((BOOL)(DWORD)SendMessage((hwndCtl),LB_RESETCONTENT,0,0))
+#define ListBox_SelItemRange(hwndCtl,fSelect,first,last) ((int)(DWORD)SendMessage((hwndCtl),LB_SELITEMRANGE,(WPARAM)(BOOL)(fSelect),MAKELPARAM((first),(last))))
+#define ListBox_SelectItemData(hwndCtl,indexStart,data) ((int)(DWORD)SendMessage((hwndCtl),LB_SELECTSTRING,(WPARAM)(int)(indexStart),(LPARAM)(data)))
+#define ListBox_SelectString(hwndCtl,indexStart,lpszFind) ((int)(DWORD)SendMessage((hwndCtl),LB_SELECTSTRING,(WPARAM)(int)(indexStart),(LPARAM)(LPCTSTR)(lpszFind)))
+#define ListBox_SetCaretIndex(hwndCtl,index) ((int)(DWORD)SendMessage((hwndCtl),LB_SETCARETINDEX,(WPARAM)(int)(index),0))
+#define ListBox_SetColumnWidth(hwndCtl,cxColumn) ((void)SendMessage((hwndCtl),LB_SETCOLUMNWIDTH,(WPARAM)(int)(cxColumn),0))
+#define ListBox_SetCurSel(hwndCtl,index) ((int)(DWORD)SendMessage((hwndCtl),LB_SETCURSEL,(WPARAM)(int)(index),0))
+#define ListBox_SetHorizontalExtent(hwndCtl,cxExtent) ((void)SendMessage((hwndCtl),LB_SETHORIZONTALEXTENT,(WPARAM)(int)(cxExtent),0))
+#define ListBox_SetItemData(hwndCtl,index,data) ((int)(DWORD)SendMessage((hwndCtl),LB_SETITEMDATA,(WPARAM)(int)(index),(LPARAM)(data)))
+#define ListBox_SetItemHeight(hwndCtl,index,cy) ((int)(DWORD)SendMessage((hwndCtl),LB_SETITEMHEIGHT,(WPARAM)(int)(index),MAKELPARAM((cy),0)))
+#define ListBox_SetSel(hwndCtl,fSelect,index) ((int)(DWORD)SendMessage((hwndCtl),LB_SETSEL,(WPARAM)(BOOL)(fSelect),(LPARAM)(index)))
+#define ListBox_SetTabStops(hwndCtl,cTabs,lpTabs) ((BOOL)(DWORD)SendMessage((hwndCtl),LB_SETTABSTOPS,(WPARAM)(int)(cTabs),(LPARAM)(int*)(lpTabs)))
+#define ListBox_SetTopIndex(hwndCtl,indexTop) ((int)(DWORD)SendMessage((hwndCtl),LB_SETTOPINDEX,(WPARAM)(int)(indexTop),0))
+#define MapWindowRect(hwndFrom,hwndTo,lprc) MapWindowPoints((hwndFrom),(hwndTo),(POINT*)(lprc),2)
+#define ScrollBar_Enable(hwndCtl,flags) EnableScrollBar((hwndCtl),SB_CTL,(flags))
+#define ScrollBar_GetPos(hwndCtl) GetScrollPos((hwndCtl),SB_CTL)
+#define ScrollBar_GetRange(hwndCtl,lpposMin,lpposMax) GetScrollRange((hwndCtl),SB_CTL,(lpposMin),(lpposMax))
+#define ScrollBar_SetPos(hwndCtl,pos,fRedraw) SetScrollPos((hwndCtl),SB_CTL,(pos),(fRedraw))
+#define ScrollBar_SetRange(hwndCtl,posMin,posMax,fRedraw) SetScrollRange((hwndCtl),SB_CTL,(posMin),(posMax),(fRedraw))
+#define ScrollBar_Show(hwndCtl,fShow) ShowWindow((hwndCtl),(fShow) ? SW_SHOWNORMAL : SW_HIDE)
+#define SelectBitmap(hdc,hbm) ((HBITMAP)SelectObject((hdc),(HGDIOBJ)(HBITMAP)(hbm)))
+#define SelectBrush(hdc,hbr) ((HBRUSH)SelectObject((hdc),(HGDIOBJ)(HBRUSH)(hbr)))
+#define SelectFont(hdc,hfont) ((HFONT)SelectObject((hdc),(HGDIOBJ)(HFONT)(hfont)))
+#define SelectPen(hdc,hpen) ((HPEN)SelectObject((hdc),(HGDIOBJ)(HPEN)(hpen)))
+#define SetDlgMsgResult(hwnd,msg,result) (( (msg) == WM_CTLCOLORMSGBOX || (msg) == WM_CTLCOLOREDIT || (msg) == WM_CTLCOLORLISTBOX || (msg) == WM_CTLCOLORBTN || (msg) == WM_CTLCOLORDLG || (msg) == WM_CTLCOLORSCROLLBAR || (msg) == WM_CTLCOLORSTATIC || (msg) == WM_COMPAREITEM || (msg) == WM_VKEYTOITEM || (msg) == WM_CHARTOITEM || (msg) == WM_QUERYDRAGICON || (msg) == WM_INITDIALOG ) ? (BOOL)(result) : (SetWindowLong((hwnd),DWL_MSGRESULT,(LPARAM)(LRESULT)(result)),TRUE))
+#define SetWindowFont(hwnd,hfont,fRedraw) FORWARD_WM_SETFONT((hwnd),(hfont),(fRedraw),SendMessage)
+#define SetWindowRedraw(hwnd,fRedraw) ((void)SendMessage(hwnd,WM_SETREDRAW,(WPARAM)(BOOL)(fRedraw),0))
+#define Static_Enable(hwndCtl,fEnable) EnableWindow((hwndCtl),(fEnable))
+#define Static_GetIcon(hwndCtl,hIcon) ((HICON)(UINT)(DWORD)SendMessage((hwndCtl),STM_GETICON,0,0))
+#define Static_GetText(hwndCtl,lpch,cchMax) GetWindowText((hwndCtl),(lpch),(cchMax))
+#define Static_GetTextLength(hwndCtl) GetWindowTextLength(hwndCtl)
+#define Static_SetIcon(hwndCtl,hIcon) ((HICON)(UINT)(DWORD)SendMessage((hwndCtl),STM_SETICON,(WPARAM)(HICON)(hIcon),0))
+#define Static_SetText(hwndCtl,lpsz) SetWindowText((hwndCtl),(lpsz))
+#define SubclassDialog(hwndDlg,lpfn) ((DLGPROC)SetWindowLong(hwndDlg,DWL_DLGPROC,(LPARAM)(DLGPROC)(lpfn)))
+#define SubclassWindow(hwnd,lpfn) ((WNDPROC)SetWindowLong((hwnd),GWL_WNDPROC,(LPARAM)(WNDPROC)(lpfn)))
+#define SubtractRgn(hrgnResult,hrgnA,hrgnB) CombineRgn(hrgnResult,hrgnA,hrgnB,RGN_DIFF)
+#define UnionRgn(hrgnResult,hrgnA,hrgnB) CombineRgn(hrgnResult,hrgnA,hrgnB,RGN_OR)
+#define XorRgn(hrgnResult,hrgnA,hrgnB) CombineRgn(hrgnResult,hrgnA,hrgnB,RGN_XOR)
+#define _fmemcpy memcpy
+#define _fmemmove memmove
+#define _fmemset memset
+#define _fmemcmp memcmp
+#define hmemcpy MoveMemory
+#endif
diff --git a/winsup/w32api/include/winerror.h b/winsup/w32api/include/winerror.h
new file mode 100644
index 000000000..46db8e4f8
--- /dev/null
+++ b/winsup/w32api/include/winerror.h
@@ -0,0 +1,1011 @@
+#ifndef _WINERROR_H
+#define _WINERROR_H
+#define ERROR_SUCCESS 0L
+#define NO_ERROR 0L
+#define ERROR_INVALID_FUNCTION 1L
+#define ERROR_FILE_NOT_FOUND 2L
+#define ERROR_PATH_NOT_FOUND 3L
+#define ERROR_TOO_MANY_OPEN_FILES 4L
+#define ERROR_ACCESS_DENIED 5L
+#define ERROR_INVALID_HANDLE 6L
+#define ERROR_ARENA_TRASHED 7L
+#define ERROR_NOT_ENOUGH_MEMORY 8L
+#define ERROR_INVALID_BLOCK 9L
+#define ERROR_BAD_ENVIRONMENT 10L
+#define ERROR_BAD_FORMAT 11L
+#define ERROR_INVALID_ACCESS 12L
+#define ERROR_INVALID_DATA 13L
+#define ERROR_OUTOFMEMORY 14L
+#define ERROR_INVALID_DRIVE 15L
+#define ERROR_CURRENT_DIRECTORY 16L
+#define ERROR_NOT_SAME_DEVICE 17L
+#define ERROR_NO_MORE_FILES 18L
+#define ERROR_WRITE_PROTECT 19L
+#define ERROR_BAD_UNIT 20L
+#define ERROR_NOT_READY 21L
+#define ERROR_BAD_COMMAND 22L
+#define ERROR_CRC 23L
+#define ERROR_BAD_LENGTH 24L
+#define ERROR_SEEK 25L
+#define ERROR_NOT_DOS_DISK 26L
+#define ERROR_SECTOR_NOT_FOUND 27L
+#define ERROR_OUT_OF_PAPER 28L
+#define ERROR_WRITE_FAULT 29L
+#define ERROR_READ_FAULT 30L
+#define ERROR_GEN_FAILURE 31L
+#define ERROR_SHARING_VIOLATION 32L
+#define ERROR_LOCK_VIOLATION 33L
+#define ERROR_WRONG_DISK 34L
+#define ERROR_SHARING_BUFFER_EXCEEDED 36L
+#define ERROR_HANDLE_EOF 38L
+#define ERROR_HANDLE_DISK_FULL 39L
+#define ERROR_NOT_SUPPORTED 50L
+#define ERROR_REM_NOT_LIST 51L
+#define ERROR_DUP_NAME 52L
+#define ERROR_BAD_NETPATH 53L
+#define ERROR_NETWORK_BUSY 54L
+#define ERROR_DEV_NOT_EXIST 55L
+#define ERROR_TOO_MANY_CMDS 56L
+#define ERROR_ADAP_HDW_ERR 57L
+#define ERROR_BAD_NET_RESP 58L
+#define ERROR_UNEXP_NET_ERR 59L
+#define ERROR_BAD_REM_ADAP 60L
+#define ERROR_PRINTQ_FULL 61L
+#define ERROR_NO_SPOOL_SPACE 62L
+#define ERROR_PRINT_CANCELLED 63L
+#define ERROR_NETNAME_DELETED 64L
+#define ERROR_NETWORK_ACCESS_DENIED 65L
+#define ERROR_BAD_DEV_TYPE 66L
+#define ERROR_BAD_NET_NAME 67L
+#define ERROR_TOO_MANY_NAMES 68L
+#define ERROR_TOO_MANY_SESS 69L
+#define ERROR_SHARING_PAUSED 70L
+#define ERROR_REQ_NOT_ACCEP 71L
+#define ERROR_REDIR_PAUSED 72L
+#define ERROR_FILE_EXISTS 80L
+#define ERROR_CANNOT_MAKE 82L
+#define ERROR_FAIL_I24 83L
+#define ERROR_OUT_OF_STRUCTURES 84L
+#define ERROR_ALREADY_ASSIGNED 85L
+#define ERROR_INVALID_PASSWORD 86L
+#define ERROR_INVALID_PARAMETER 87L
+#define ERROR_NET_WRITE_FAULT 88L
+#define ERROR_NO_PROC_SLOTS 89L
+#define ERROR_TOO_MANY_SEMAPHORES 100L
+#define ERROR_EXCL_SEM_ALREADY_OWNED 101L
+#define ERROR_SEM_IS_SET 102L
+#define ERROR_TOO_MANY_SEM_REQUESTS 103L
+#define ERROR_INVALID_AT_INTERRUPT_TIME 104L
+#define ERROR_SEM_OWNER_DIED 105L
+#define ERROR_SEM_USER_LIMIT 106L
+#define ERROR_DISK_CHANGE 107L
+#define ERROR_DRIVE_LOCKED 108L
+#define ERROR_BROKEN_PIPE 109L
+#define ERROR_OPEN_FAILED 110L
+#define ERROR_BUFFER_OVERFLOW 111L
+#define ERROR_DISK_FULL 112L
+#define ERROR_NO_MORE_SEARCH_HANDLES 113L
+#define ERROR_INVALID_TARGET_HANDLE 114L
+#define ERROR_INVALID_CATEGORY 117L
+#define ERROR_INVALID_VERIFY_SWITCH 118L
+#define ERROR_BAD_DRIVER_LEVEL 119L
+#define ERROR_CALL_NOT_IMPLEMENTED 120L
+#define ERROR_SEM_TIMEOUT 121L
+#define ERROR_INSUFFICIENT_BUFFER 122L
+#define ERROR_INVALID_NAME 123L
+#define ERROR_INVALID_LEVEL 124L
+#define ERROR_NO_VOLUME_LABEL 125L
+#define ERROR_MOD_NOT_FOUND 126L
+#define ERROR_PROC_NOT_FOUND 127L
+#define ERROR_WAIT_NO_CHILDREN 128L
+#define ERROR_CHILD_NOT_COMPLETE 129L
+#define ERROR_DIRECT_ACCESS_HANDLE 130L
+#define ERROR_NEGATIVE_SEEK 131L
+#define ERROR_SEEK_ON_DEVICE 132L
+#define ERROR_IS_JOIN_TARGET 133L
+#define ERROR_IS_JOINED 134L
+#define ERROR_IS_SUBSTED 135L
+#define ERROR_NOT_JOINED 136L
+#define ERROR_NOT_SUBSTED 137L
+#define ERROR_JOIN_TO_JOIN 138L
+#define ERROR_SUBST_TO_SUBST 139L
+#define ERROR_JOIN_TO_SUBST 140L
+#define ERROR_SUBST_TO_JOIN 141L
+#define ERROR_BUSY_DRIVE 142L
+#define ERROR_SAME_DRIVE 143L
+#define ERROR_DIR_NOT_ROOT 144L
+#define ERROR_DIR_NOT_EMPTY 145L
+#define ERROR_IS_SUBST_PATH 146L
+#define ERROR_IS_JOIN_PATH 147L
+#define ERROR_PATH_BUSY 148L
+#define ERROR_IS_SUBST_TARGET 149L
+#define ERROR_SYSTEM_TRACE 150L
+#define ERROR_INVALID_EVENT_COUNT 151L
+#define ERROR_TOO_MANY_MUXWAITERS 152L
+#define ERROR_INVALID_LIST_FORMAT 153L
+#define ERROR_LABEL_TOO_LONG 154L
+#define ERROR_TOO_MANY_TCBS 155L
+#define ERROR_SIGNAL_REFUSED 156L
+#define ERROR_DISCARDED 157L
+#define ERROR_NOT_LOCKED 158L
+#define ERROR_BAD_THREADID_ADDR 159L
+#define ERROR_BAD_ARGUMENTS 160L
+#define ERROR_BAD_PATHNAME 161L
+#define ERROR_SIGNAL_PENDING 162L
+#define ERROR_MAX_THRDS_REACHED 164L
+#define ERROR_LOCK_FAILED 167L
+#define ERROR_BUSY 170L
+#define ERROR_CANCEL_VIOLATION 173L
+#define ERROR_ATOMIC_LOCKS_NOT_SUPPORTED 174L
+#define ERROR_INVALID_SEGMENT_NUMBER 180L
+#define ERROR_INVALID_ORDINAL 182L
+#define ERROR_ALREADY_EXISTS 183L
+#define ERROR_INVALID_FLAG_NUMBER 186L
+#define ERROR_SEM_NOT_FOUND 187L
+#define ERROR_INVALID_STARTING_CODESEG 188L
+#define ERROR_INVALID_STACKSEG 189L
+#define ERROR_INVALID_MODULETYPE 190L
+#define ERROR_INVALID_EXE_SIGNATURE 191L
+#define ERROR_EXE_MARKED_INVALID 192L
+#define ERROR_BAD_EXE_FORMAT 193L
+#define ERROR_ITERATED_DATA_EXCEEDS_64k 194L
+#define ERROR_INVALID_MINALLOCSIZE 195L
+#define ERROR_DYNLINK_FROM_INVALID_RING 196L
+#define ERROR_IOPL_NOT_ENABLED 197L
+#define ERROR_INVALID_SEGDPL 198L
+#define ERROR_AUTODATASEG_EXCEEDS_64k 199L
+#define ERROR_RING2SEG_MUST_BE_MOVABLE 200L
+#define ERROR_RELOC_CHAIN_XEEDS_SEGLIM 201L
+#define ERROR_INFLOOP_IN_RELOC_CHAIN 202L
+#define ERROR_ENVVAR_NOT_FOUND 203L
+#define ERROR_NO_SIGNAL_SENT 205L
+#define ERROR_FILENAME_EXCED_RANGE 206L
+#define ERROR_RING2_STACK_IN_USE 207L
+#define ERROR_META_EXPANSION_TOO_LONG 208L
+#define ERROR_INVALID_SIGNAL_NUMBER 209L
+#define ERROR_THREAD_1_INACTIVE 210L
+#define ERROR_LOCKED 212L
+#define ERROR_TOO_MANY_MODULES 214L
+#define ERROR_NESTING_NOT_ALLOWED 215L
+#define ERROR_BAD_PIPE 230L
+#define ERROR_PIPE_BUSY 231L
+#define ERROR_NO_DATA 232L
+#define ERROR_PIPE_NOT_CONNECTED 233L
+#define ERROR_MORE_DATA 234L
+#define ERROR_VC_DISCONNECTED 240L
+#define ERROR_INVALID_EA_NAME 254L
+#define ERROR_EA_LIST_INCONSISTENT 255L
+#define ERROR_NO_MORE_ITEMS 259L
+#define ERROR_CANNOT_COPY 266L
+#define ERROR_DIRECTORY 267L
+#define ERROR_EAS_DIDNT_FIT 275L
+#define ERROR_EA_FILE_CORRUPT 276L
+#define ERROR_EA_TABLE_FULL 277L
+#define ERROR_INVALID_EA_HANDLE 278L
+#define ERROR_EAS_NOT_SUPPORTED 282L
+#define ERROR_NOT_OWNER 288L
+#define ERROR_TOO_MANY_POSTS 298L
+#define ERROR_PARTIAL_COPY 299L
+#define ERROR_MR_MID_NOT_FOUND 317L
+#define ERROR_INVALID_ADDRESS 487L
+#define ERROR_ARITHMETIC_OVERFLOW 534L
+#define ERROR_PIPE_CONNECTED 535L
+#define ERROR_PIPE_LISTENING 536L
+#define ERROR_EA_ACCESS_DENIED 994L
+#define ERROR_OPERATION_ABORTED 995L
+#define ERROR_IO_INCOMPLETE 996L
+#define ERROR_IO_PENDING 997L
+#define ERROR_NOACCESS 998L
+#define ERROR_SWAPERROR 999L
+#define ERROR_STACK_OVERFLOW 1001L
+#define ERROR_INVALID_MESSAGE 1002L
+#define ERROR_CAN_NOT_COMPLETE 1003L
+#define ERROR_INVALID_FLAGS 1004L
+#define ERROR_UNRECOGNIZED_VOLUME 1005L
+#define ERROR_FILE_INVALID 1006L
+#define ERROR_FULLSCREEN_MODE 1007L
+#define ERROR_NO_TOKEN 1008L
+#define ERROR_BADDB 1009L
+#define ERROR_BADKEY 1010L
+#define ERROR_CANTOPEN 1011L
+#define ERROR_CANTREAD 1012L
+#define ERROR_CANTWRITE 1013L
+#define ERROR_REGISTRY_RECOVERED 1014L
+#define ERROR_REGISTRY_CORRUPT 1015L
+#define ERROR_REGISTRY_IO_FAILED 1016L
+#define ERROR_NOT_REGISTRY_FILE 1017L
+#define ERROR_KEY_DELETED 1018L
+#define ERROR_NO_LOG_SPACE 1019L
+#define ERROR_KEY_HAS_CHILDREN 1020L
+#define ERROR_CHILD_MUST_BE_VOLATILE 1021L
+#define ERROR_NOTIFY_ENUM_DIR 1022L
+#define ERROR_DEPENDENT_SERVICES_RUNNING 1051L
+#define ERROR_INVALID_SERVICE_CONTROL 1052L
+#define ERROR_SERVICE_REQUEST_TIMEOUT 1053L
+#define ERROR_SERVICE_NO_THREAD 1054L
+#define ERROR_SERVICE_DATABASE_LOCKED 1055L
+#define ERROR_SERVICE_ALREADY_RUNNING 1056L
+#define ERROR_INVALID_SERVICE_ACCOUNT 1057L
+#define ERROR_SERVICE_DISABLED 1058L
+#define ERROR_CIRCULAR_DEPENDENCY 1059L
+#define ERROR_SERVICE_DOES_NOT_EXIST 1060L
+#define ERROR_SERVICE_CANNOT_ACCEPT_CTRL 1061L
+#define ERROR_SERVICE_NOT_ACTIVE 1062L
+#define ERROR_FAILED_SERVICE_CONTROLLER_CONNECT 1063L
+#define ERROR_EXCEPTION_IN_SERVICE 1064L
+#define ERROR_DATABASE_DOES_NOT_EXIST 1065L
+#define ERROR_SERVICE_SPECIFIC_ERROR 1066L
+#define ERROR_PROCESS_ABORTED 1067L
+#define ERROR_SERVICE_DEPENDENCY_FAIL 1068L
+#define ERROR_SERVICE_LOGON_FAILED 1069L
+#define ERROR_SERVICE_START_HANG 1070L
+#define ERROR_INVALID_SERVICE_LOCK 1071L
+#define ERROR_SERVICE_MARKED_FOR_DELETE 1072L
+#define ERROR_SERVICE_EXISTS 1073L
+#define ERROR_ALREADY_RUNNING_LKG 1074L
+#define ERROR_SERVICE_DEPENDENCY_DELETED 1075L
+#define ERROR_BOOT_ALREADY_ACCEPTED 1076L
+#define ERROR_SERVICE_NEVER_STARTED 1077L
+#define ERROR_DUPLICATE_SERVICE_NAME 1078L
+#define ERROR_END_OF_MEDIA 1100L
+#define ERROR_FILEMARK_DETECTED 1101L
+#define ERROR_BEGINNING_OF_MEDIA 1102L
+#define ERROR_SETMARK_DETECTED 1103L
+#define ERROR_NO_DATA_DETECTED 1104L
+#define ERROR_PARTITION_FAILURE 1105L
+#define ERROR_INVALID_BLOCK_LENGTH 1106L
+#define ERROR_DEVICE_NOT_PARTITIONED 1107L
+#define ERROR_UNABLE_TO_LOCK_MEDIA 1108L
+#define ERROR_UNABLE_TO_UNLOAD_MEDIA 1109L
+#define ERROR_MEDIA_CHANGED 1110L
+#define ERROR_BUS_RESET 1111L
+#define ERROR_NO_MEDIA_IN_DRIVE 1112L
+#define ERROR_NO_UNICODE_TRANSLATION 1113L
+#define ERROR_DLL_INIT_FAILED 1114L
+#define ERROR_SHUTDOWN_IN_PROGRESS 1115L
+#define ERROR_NO_SHUTDOWN_IN_PROGRESS 1116L
+#define ERROR_IO_DEVICE 1117L
+#define ERROR_SERIAL_NO_DEVICE 1118L
+#define ERROR_IRQ_BUSY 1119L
+#define ERROR_MORE_WRITES 1120L
+#define ERROR_COUNTER_TIMEOUT 1121L
+#define ERROR_FLOPPY_ID_MARK_NOT_FOUND 1122L
+#define ERROR_FLOPPY_WRONG_CYLINDER 1123L
+#define ERROR_FLOPPY_UNKNOWN_ERROR 1124L
+#define ERROR_FLOPPY_BAD_REGISTERS 1125L
+#define ERROR_DISK_RECALIBRATE_FAILED 1126L
+#define ERROR_DISK_OPERATION_FAILED 1127L
+#define ERROR_DISK_RESET_FAILED 1128L
+#define ERROR_EOM_OVERFLOW 1129L
+#define ERROR_NOT_ENOUGH_SERVER_MEMORY 1130L
+#define ERROR_POSSIBLE_DEADLOCK 1131L
+#define ERROR_MAPPED_ALIGNMENT 1132L
+#define ERROR_SET_POWER_STATE_VETOED 1140L
+#define ERROR_SET_POWER_STATE_FAILED 1141L
+#define ERROR_OLD_WIN_VERSION 1150L
+#define ERROR_APP_WRONG_OS 1151L
+#define ERROR_SINGLE_INSTANCE_APP 1152L
+#define ERROR_RMODE_APP 1153L
+#define ERROR_INVALID_DLL 1154L
+#define ERROR_NO_ASSOCIATION 1155L
+#define ERROR_DDE_FAIL 1156L
+#define ERROR_DLL_NOT_FOUND 1157L
+#define ERROR_BAD_USERNAME 2202L
+#define ERROR_NOT_CONNECTED 2250L
+#define ERROR_OPEN_FILES 2401L
+#define ERROR_ACTIVE_CONNECTIONS 2402L
+#define ERROR_DEVICE_IN_USE 2404L
+#define ERROR_BAD_DEVICE 1200L
+#define ERROR_CONNECTION_UNAVAIL 1201L
+#define ERROR_DEVICE_ALREADY_REMEMBERED 1202L
+#define ERROR_NO_NET_OR_BAD_PATH 1203L
+#define ERROR_BAD_PROVIDER 1204L
+#define ERROR_CANNOT_OPEN_PROFILE 1205L
+#define ERROR_BAD_PROFILE 1206L
+#define ERROR_NOT_CONTAINER 1207L
+#define ERROR_EXTENDED_ERROR 1208L
+#define ERROR_INVALID_GROUPNAME 1209L
+#define ERROR_INVALID_COMPUTERNAME 1210L
+#define ERROR_INVALID_EVENTNAME 1211L
+#define ERROR_INVALID_DOMAINNAME 1212L
+#define ERROR_INVALID_SERVICENAME 1213L
+#define ERROR_INVALID_NETNAME 1214L
+#define ERROR_INVALID_SHARENAME 1215L
+#define ERROR_INVALID_PASSWORDNAME 1216L
+#define ERROR_INVALID_MESSAGENAME 1217L
+#define ERROR_INVALID_MESSAGEDEST 1218L
+#define ERROR_SESSION_CREDENTIAL_CONFLICT 1219L
+#define ERROR_REMOTE_SESSION_LIMIT_EXCEEDED 1220L
+#define ERROR_DUP_DOMAINNAME 1221L
+#define ERROR_NO_NETWORK 1222L
+#define ERROR_CANCELLED 1223L
+#define ERROR_USER_MAPPED_FILE 1224L
+#define ERROR_CONNECTION_REFUSED 1225L
+#define ERROR_GRACEFUL_DISCONNECT 1226L
+#define ERROR_ADDRESS_ALREADY_ASSOCIATED 1227L
+#define ERROR_ADDRESS_NOT_ASSOCIATED 1228L
+#define ERROR_CONNECTION_INVALID 1229L
+#define ERROR_CONNECTION_ACTIVE 1230L
+#define ERROR_NETWORK_UNREACHABLE 1231L
+#define ERROR_HOST_UNREACHABLE 1232L
+#define ERROR_PROTOCOL_UNREACHABLE 1233L
+#define ERROR_PORT_UNREACHABLE 1234L
+#define ERROR_REQUEST_ABORTED 1235L
+#define ERROR_CONNECTION_ABORTED 1236L
+#define ERROR_RETRY 1237L
+#define ERROR_CONNECTION_COUNT_LIMIT 1238L
+#define ERROR_LOGIN_TIME_RESTRICTION 1239L
+#define ERROR_LOGIN_WKSTA_RESTRICTION 1240L
+#define ERROR_INCORRECT_ADDRESS 1241L
+#define ERROR_ALREADY_REGISTERED 1242L
+#define ERROR_SERVICE_NOT_FOUND 1243L
+#define ERROR_NOT_AUTHENTICATED 1244L
+#define ERROR_NOT_LOGGED_ON 1245L
+#define ERROR_CONTINUE 1246L
+#define ERROR_ALREADY_INITIALIZED 1247L
+#define ERROR_NO_MORE_DEVICES 1248L
+#define ERROR_NOT_ALL_ASSIGNED 1300L
+#define ERROR_SOME_NOT_MAPPED 1301L
+#define ERROR_NO_QUOTAS_FOR_ACCOUNT 1302L
+#define ERROR_LOCAL_USER_SESSION_KEY 1303L
+#define ERROR_NULL_LM_PASSWORD 1304L
+#define ERROR_UNKNOWN_REVISION 1305L
+#define ERROR_REVISION_MISMATCH 1306L
+#define ERROR_INVALID_OWNER 1307L
+#define ERROR_INVALID_PRIMARY_GROUP 1308L
+#define ERROR_NO_IMPERSONATION_TOKEN 1309L
+#define ERROR_CANT_DISABLE_MANDATORY 1310L
+#define ERROR_NO_LOGON_SERVERS 1311L
+#define ERROR_NO_SUCH_LOGON_SESSION 1312L
+#define ERROR_NO_SUCH_PRIVILEGE 1313L
+#define ERROR_PRIVILEGE_NOT_HELD 1314L
+#define ERROR_INVALID_ACCOUNT_NAME 1315L
+#define ERROR_USER_EXISTS 1316L
+#define ERROR_NO_SUCH_USER 1317L
+#define ERROR_GROUP_EXISTS 1318L
+#define ERROR_NO_SUCH_GROUP 1319L
+#define ERROR_MEMBER_IN_GROUP 1320L
+#define ERROR_MEMBER_NOT_IN_GROUP 1321L
+#define ERROR_LAST_ADMIN 1322L
+#define ERROR_WRONG_PASSWORD 1323L
+#define ERROR_ILL_FORMED_PASSWORD 1324L
+#define ERROR_PASSWORD_RESTRICTION 1325L
+#define ERROR_LOGON_FAILURE 1326L
+#define ERROR_ACCOUNT_RESTRICTION 1327L
+#define ERROR_INVALID_LOGON_HOURS 1328L
+#define ERROR_INVALID_WORKSTATION 1329L
+#define ERROR_PASSWORD_EXPIRED 1330L
+#define ERROR_ACCOUNT_DISABLED 1331L
+#define ERROR_NONE_MAPPED 1332L
+#define ERROR_TOO_MANY_LUIDS_REQUESTED 1333L
+#define ERROR_LUIDS_EXHAUSTED 1334L
+#define ERROR_INVALID_SUB_AUTHORITY 1335L
+#define ERROR_INVALID_ACL 1336L
+#define ERROR_INVALID_SID 1337L
+#define ERROR_INVALID_SECURITY_DESCR 1338L
+#define ERROR_BAD_INHERITANCE_ACL 1340L
+#define ERROR_SERVER_DISABLED 1341L
+#define ERROR_SERVER_NOT_DISABLED 1342L
+#define ERROR_INVALID_ID_AUTHORITY 1343L
+#define ERROR_ALLOTTED_SPACE_EXCEEDED 1344L
+#define ERROR_INVALID_GROUP_ATTRIBUTES 1345L
+#define ERROR_BAD_IMPERSONATION_LEVEL 1346L
+#define ERROR_CANT_OPEN_ANONYMOUS 1347L
+#define ERROR_BAD_VALIDATION_CLASS 1348L
+#define ERROR_BAD_TOKEN_TYPE 1349L
+#define ERROR_NO_SECURITY_ON_OBJECT 1350L
+#define ERROR_CANT_ACCESS_DOMAIN_INFO 1351L
+#define ERROR_INVALID_SERVER_STATE 1352L
+#define ERROR_INVALID_DOMAIN_STATE 1353L
+#define ERROR_INVALID_DOMAIN_ROLE 1354L
+#define ERROR_NO_SUCH_DOMAIN 1355L
+#define ERROR_DOMAIN_EXISTS 1356L
+#define ERROR_DOMAIN_LIMIT_EXCEEDED 1357L
+#define ERROR_INTERNAL_DB_CORRUPTION 1358L
+#define ERROR_INTERNAL_ERROR 1359L
+#define ERROR_GENERIC_NOT_MAPPED 1360L
+#define ERROR_BAD_DESCRIPTOR_FORMAT 1361L
+#define ERROR_NOT_LOGON_PROCESS 1362L
+#define ERROR_LOGON_SESSION_EXISTS 1363L
+#define ERROR_NO_SUCH_PACKAGE 1364L
+#define ERROR_BAD_LOGON_SESSION_STATE 1365L
+#define ERROR_LOGON_SESSION_COLLISION 1366L
+#define ERROR_INVALID_LOGON_TYPE 1367L
+#define ERROR_CANNOT_IMPERSONATE 1368L
+#define ERROR_RXACT_INVALID_STATE 1369L
+#define ERROR_RXACT_COMMIT_FAILURE 1370L
+#define ERROR_SPECIAL_ACCOUNT 1371L
+#define ERROR_SPECIAL_GROUP 1372L
+#define ERROR_SPECIAL_USER 1373L
+#define ERROR_MEMBERS_PRIMARY_GROUP 1374L
+#define ERROR_TOKEN_ALREADY_IN_USE 1375L
+#define ERROR_NO_SUCH_ALIAS 1376L
+#define ERROR_MEMBER_NOT_IN_ALIAS 1377L
+#define ERROR_MEMBER_IN_ALIAS 1378L
+#define ERROR_ALIAS_EXISTS 1379L
+#define ERROR_LOGON_NOT_GRANTED 1380L
+#define ERROR_TOO_MANY_SECRETS 1381L
+#define ERROR_SECRET_TOO_LONG 1382L
+#define ERROR_INTERNAL_DB_ERROR 1383L
+#define ERROR_TOO_MANY_CONTEXT_IDS 1384L
+#define ERROR_LOGON_TYPE_NOT_GRANTED 1385L
+#define ERROR_NT_CROSS_ENCRYPTION_REQUIRED 1386L
+#define ERROR_NO_SUCH_MEMBER 1387L
+#define ERROR_INVALID_MEMBER 1388L
+#define ERROR_TOO_MANY_SIDS 1389L
+#define ERROR_LM_CROSS_ENCRYPTION_REQUIRED 1390L
+#define ERROR_NO_INHERITANCE 1391L
+#define ERROR_FILE_CORRUPT 1392L
+#define ERROR_DISK_CORRUPT 1393L
+#define ERROR_NO_USER_SESSION_KEY 1394L
+#define ERROR_LICENSE_QUOTA_EXCEEDED 1395L
+#define ERROR_INVALID_WINDOW_HANDLE 1400L
+#define ERROR_INVALID_MENU_HANDLE 1401L
+#define ERROR_INVALID_CURSOR_HANDLE 1402L
+#define ERROR_INVALID_ACCEL_HANDLE 1403L
+#define ERROR_INVALID_HOOK_HANDLE 1404L
+#define ERROR_INVALID_DWP_HANDLE 1405L
+#define ERROR_TLW_WITH_WSCHILD 1406L
+#define ERROR_CANNOT_FIND_WND_CLASS 1407L
+#define ERROR_WINDOW_OF_OTHER_THREAD 1408L
+#define ERROR_HOTKEY_ALREADY_REGISTERED 1409L
+#define ERROR_CLASS_ALREADY_EXISTS 1410L
+#define ERROR_CLASS_DOES_NOT_EXIST 1411L
+#define ERROR_CLASS_HAS_WINDOWS 1412L
+#define ERROR_INVALID_INDEX 1413L
+#define ERROR_INVALID_ICON_HANDLE 1414L
+#define ERROR_PRIVATE_DIALOG_INDEX 1415L
+#define ERROR_LISTBOX_ID_NOT_FOUND 1416L
+#define ERROR_NO_WILDCARD_CHARACTERS 1417L
+#define ERROR_CLIPBOARD_NOT_OPEN 1418L
+#define ERROR_HOTKEY_NOT_REGISTERED 1419L
+#define ERROR_WINDOW_NOT_DIALOG 1420L
+#define ERROR_CONTROL_ID_NOT_FOUND 1421L
+#define ERROR_INVALID_COMBOBOX_MESSAGE 1422L
+#define ERROR_WINDOW_NOT_COMBOBOX 1423L
+#define ERROR_INVALID_EDIT_HEIGHT 1424L
+#define ERROR_DC_NOT_FOUND 1425L
+#define ERROR_INVALID_HOOK_FILTER 1426L
+#define ERROR_INVALID_FILTER_PROC 1427L
+#define ERROR_HOOK_NEEDS_HMOD 1428L
+#define ERROR_GLOBAL_ONLY_HOOK 1429L
+#define ERROR_JOURNAL_HOOK_SET 1430L
+#define ERROR_HOOK_NOT_INSTALLED 1431L
+#define ERROR_INVALID_LB_MESSAGE 1432L
+#define ERROR_SETCOUNT_ON_BAD_LB 1433L
+#define ERROR_LB_WITHOUT_TABSTOPS 1434L
+#define ERROR_DESTROY_OBJECT_OF_OTHER_THREAD 1435L
+#define ERROR_CHILD_WINDOW_MENU 1436L
+#define ERROR_NO_SYSTEM_MENU 1437L
+#define ERROR_INVALID_MSGBOX_STYLE 1438L
+#define ERROR_INVALID_SPI_VALUE 1439L
+#define ERROR_SCREEN_ALREADY_LOCKED 1440L
+#define ERROR_HWNDS_HAVE_DIFF_PARENT 1441L
+#define ERROR_NOT_CHILD_WINDOW 1442L
+#define ERROR_INVALID_GW_COMMAND 1443L
+#define ERROR_INVALID_THREAD_ID 1444L
+#define ERROR_NON_MDICHILD_WINDOW 1445L
+#define ERROR_POPUP_ALREADY_ACTIVE 1446L
+#define ERROR_NO_SCROLLBARS 1447L
+#define ERROR_INVALID_SCROLLBAR_RANGE 1448L
+#define ERROR_INVALID_SHOWWIN_COMMAND 1449L
+#define ERROR_NO_SYSTEM_RESOURCES 1450L
+#define ERROR_NONPAGED_SYSTEM_RESOURCES 1451L
+#define ERROR_PAGED_SYSTEM_RESOURCES 1452L
+#define ERROR_WORKING_SET_QUOTA 1453L
+#define ERROR_PAGEFILE_QUOTA 1454L
+#define ERROR_COMMITMENT_LIMIT 1455L
+#define ERROR_MENU_ITEM_NOT_FOUND 1456L
+#define ERROR_EVENTLOG_FILE_CORRUPT 1500L
+#define ERROR_EVENTLOG_CANT_START 1501L
+#define ERROR_LOG_FILE_FULL 1502L
+#define ERROR_EVENTLOG_FILE_CHANGED 1503L
+#define RPC_S_INVALID_STRING_BINDING 1700L
+#define RPC_S_WRONG_KIND_OF_BINDING 1701L
+#define RPC_S_INVALID_BINDING 1702L
+#define RPC_S_PROTSEQ_NOT_SUPPORTED 1703L
+#define RPC_S_INVALID_RPC_PROTSEQ 1704L
+#define RPC_S_INVALID_STRING_UUID 1705L
+#define RPC_S_INVALID_ENDPOINT_FORMAT 1706L
+#define RPC_S_INVALID_NET_ADDR 1707L
+#define RPC_S_NO_ENDPOINT_FOUND 1708L
+#define RPC_S_INVALID_TIMEOUT 1709L
+#define RPC_S_OBJECT_NOT_FOUND 1710L
+#define RPC_S_ALREADY_REGISTERED 1711L
+#define RPC_S_TYPE_ALREADY_REGISTERED 1712L
+#define RPC_S_ALREADY_LISTENING 1713L
+#define RPC_S_NO_PROTSEQS_REGISTERED 1714L
+#define RPC_S_NOT_LISTENING 1715L
+#define RPC_S_UNKNOWN_MGR_TYPE 1716L
+#define RPC_S_UNKNOWN_IF 1717L
+#define RPC_S_NO_BINDINGS 1718L
+#define RPC_S_NO_PROTSEQS 1719L
+#define RPC_S_CANT_CREATE_ENDPOINT 1720L
+#define RPC_S_OUT_OF_RESOURCES 1721L
+#define RPC_S_SERVER_UNAVAILABLE 1722L
+#define RPC_S_SERVER_TOO_BUSY 1723L
+#define RPC_S_INVALID_NETWORK_OPTIONS 1724L
+#define RPC_S_NO_CALL_ACTIVE 1725L
+#define RPC_S_CALL_FAILED 1726L
+#define RPC_S_CALL_FAILED_DNE 1727L
+#define RPC_S_PROTOCOL_ERROR 1728L
+#define RPC_S_UNSUPPORTED_TRANS_SYN 1730L
+#define RPC_S_UNSUPPORTED_TYPE 1732L
+#define RPC_S_INVALID_TAG 1733L
+#define RPC_S_INVALID_BOUND 1734L
+#define RPC_S_NO_ENTRY_NAME 1735L
+#define RPC_S_INVALID_NAME_SYNTAX 1736L
+#define RPC_S_UNSUPPORTED_NAME_SYNTAX 1737L
+#define RPC_S_UUID_NO_ADDRESS 1739L
+#define RPC_S_DUPLICATE_ENDPOINT 1740L
+#define RPC_S_UNKNOWN_AUTHN_TYPE 1741L
+#define RPC_S_MAX_CALLS_TOO_SMALL 1742L
+#define RPC_S_STRING_TOO_LONG 1743L
+#define RPC_S_PROTSEQ_NOT_FOUND 1744L
+#define RPC_S_PROCNUM_OUT_OF_RANGE 1745L
+#define RPC_S_BINDING_HAS_NO_AUTH 1746L
+#define RPC_S_UNKNOWN_AUTHN_SERVICE 1747L
+#define RPC_S_UNKNOWN_AUTHN_LEVEL 1748L
+#define RPC_S_INVALID_AUTH_IDENTITY 1749L
+#define RPC_S_UNKNOWN_AUTHZ_SERVICE 1750L
+#define EPT_S_INVALID_ENTRY 1751L
+#define EPT_S_CANT_PERFORM_OP 1752L
+#define EPT_S_NOT_REGISTERED 1753L
+#define RPC_S_NOTHING_TO_EXPORT 1754L
+#define RPC_S_INCOMPLETE_NAME 1755L
+#define RPC_S_INVALID_VERS_OPTION 1756L
+#define RPC_S_NO_MORE_MEMBERS 1757L
+#define RPC_S_NOT_ALL_OBJS_UNEXPORTED 1758L
+#define RPC_S_INTERFACE_NOT_FOUND 1759L
+#define RPC_S_ENTRY_ALREADY_EXISTS 1760L
+#define RPC_S_ENTRY_NOT_FOUND 1761L
+#define RPC_S_NAME_SERVICE_UNAVAILABLE 1762L
+#define RPC_S_INVALID_NAF_ID 1763L
+#define RPC_S_CANNOT_SUPPORT 1764L
+#define RPC_S_NO_CONTEXT_AVAILABLE 1765L
+#define RPC_S_INTERNAL_ERROR 1766L
+#define RPC_S_ZERO_DIVIDE 1767L
+#define RPC_S_ADDRESS_ERROR 1768L
+#define RPC_S_FP_DIV_ZERO 1769L
+#define RPC_S_FP_UNDERFLOW 1770L
+#define RPC_S_FP_OVERFLOW 1771L
+#define RPC_X_NO_MORE_ENTRIES 1772L
+#define RPC_X_SS_CHAR_TRANS_OPEN_FAIL 1773L
+#define RPC_X_SS_CHAR_TRANS_SHORT_FILE 1774L
+#define RPC_X_SS_IN_NULL_CONTEXT 1775L
+#define RPC_X_SS_CONTEXT_DAMAGED 1777L
+#define RPC_X_SS_HANDLES_MISMATCH 1778L
+#define RPC_X_SS_CANNOT_GET_CALL_HANDLE 1779L
+#define RPC_X_NULL_REF_POINTER 1780L
+#define RPC_X_ENUM_VALUE_OUT_OF_RANGE 1781L
+#define RPC_X_BYTE_COUNT_TOO_SMALL 1782L
+#define RPC_X_BAD_STUB_DATA 1783L
+#define ERROR_INVALID_USER_BUFFER 1784L
+#define ERROR_UNRECOGNIZED_MEDIA 1785L
+#define ERROR_NO_TRUST_LSA_SECRET 1786L
+#define ERROR_NO_TRUST_SAM_ACCOUNT 1787L
+#define ERROR_TRUSTED_DOMAIN_FAILURE 1788L
+#define ERROR_TRUSTED_RELATIONSHIP_FAILURE 1789L
+#define ERROR_TRUST_FAILURE 1790L
+#define RPC_S_CALL_IN_PROGRESS 1791L
+#define ERROR_NETLOGON_NOT_STARTED 1792L
+#define ERROR_ACCOUNT_EXPIRED 1793L
+#define ERROR_REDIRECTOR_HAS_OPEN_HANDLES 1794L
+#define ERROR_PRINTER_DRIVER_ALREADY_INSTALLED 1795L
+#define ERROR_UNKNOWN_PORT 1796L
+#define ERROR_UNKNOWN_PRINTER_DRIVER 1797L
+#define ERROR_UNKNOWN_PRINTPROCESSOR 1798L
+#define ERROR_INVALID_SEPARATOR_FILE 1799L
+#define ERROR_INVALID_PRIORITY 1800L
+#define ERROR_INVALID_PRINTER_NAME 1801L
+#define ERROR_PRINTER_ALREADY_EXISTS 1802L
+#define ERROR_INVALID_PRINTER_COMMAND 1803L
+#define ERROR_INVALID_DATATYPE 1804L
+#define ERROR_INVALID_ENVIRONMENT 1805L
+#define RPC_S_NO_MORE_BINDINGS 1806L
+#define ERROR_NOLOGON_INTERDOMAIN_TRUST_ACCOUNT 1807L
+#define ERROR_NOLOGON_WORKSTATION_TRUST_ACCOUNT 1808L
+#define ERROR_NOLOGON_SERVER_TRUST_ACCOUNT 1809L
+#define ERROR_DOMAIN_TRUST_INCONSISTENT 1810L
+#define ERROR_SERVER_HAS_OPEN_HANDLES 1811L
+#define ERROR_RESOURCE_DATA_NOT_FOUND 1812L
+#define ERROR_RESOURCE_TYPE_NOT_FOUND 1813L
+#define ERROR_RESOURCE_NAME_NOT_FOUND 1814L
+#define ERROR_RESOURCE_LANG_NOT_FOUND 1815L
+#define ERROR_NOT_ENOUGH_QUOTA 1816L
+#define RPC_S_NO_INTERFACES 1817L
+#define RPC_S_CALL_CANCELLED 1818L
+#define RPC_S_BINDING_INCOMPLETE 1819L
+#define RPC_S_COMM_FAILURE 1820L
+#define RPC_S_UNSUPPORTED_AUTHN_LEVEL 1821L
+#define RPC_S_NO_PRINC_NAME 1822L
+#define RPC_S_NOT_RPC_ERROR 1823L
+#define RPC_S_UUID_LOCAL_ONLY 1824L
+#define RPC_S_SEC_PKG_ERROR 1825L
+#define RPC_S_NOT_CANCELLED 1826L
+#define RPC_X_INVALID_ES_ACTION 1827L
+#define RPC_X_WRONG_ES_VERSION 1828L
+#define RPC_X_WRONG_STUB_VERSION 1829L
+#define RPC_S_GROUP_MEMBER_NOT_FOUND 1898L
+#define EPT_S_CANT_CREATE 1899L
+#define RPC_S_INVALID_OBJECT 1900L
+#define ERROR_INVALID_TIME 1901L
+#define ERROR_INVALID_FORM_NAME 1902L
+#define ERROR_INVALID_FORM_SIZE 1903L
+#define ERROR_ALREADY_WAITING 1904L
+#define ERROR_PRINTER_DELETED 1905L
+#define ERROR_INVALID_PRINTER_STATE 1906L
+#define ERROR_PASSWORD_MUST_CHANGE 1907L
+#define ERROR_DOMAIN_CONTROLLER_NOT_FOUND 1908L
+#define ERROR_ACCOUNT_LOCKED_OUT 1909L
+#define ERROR_NO_BROWSER_SERVERS_FOUND 6118L
+#define ERROR_INVALID_PIXEL_FORMAT 2000L
+#define ERROR_BAD_DRIVER 2001L
+#define ERROR_INVALID_WINDOW_STYLE 2002L
+#define ERROR_METAFILE_NOT_SUPPORTED 2003L
+#define ERROR_TRANSFORM_NOT_SUPPORTED 2004L
+#define ERROR_CLIPPING_NOT_SUPPORTED 2005L
+#define ERROR_UNKNOWN_PRINT_MONITOR 3000L
+#define ERROR_PRINTER_DRIVER_IN_USE 3001L
+#define ERROR_SPOOL_FILE_NOT_FOUND 3002L
+#define ERROR_SPL_NO_STARTDOC 3003L
+#define ERROR_SPL_NO_ADDJOB 3004L
+#define ERROR_PRINT_PROCESSOR_ALREADY_INSTALLED 3005L
+#define ERROR_PRINT_MONITOR_ALREADY_INSTALLED 3006L
+#define ERROR_WINS_INTERNAL 4000L
+#define ERROR_CAN_NOT_DEL_LOCAL_WINS 4001L
+#define ERROR_STATIC_INIT 4002L
+#define ERROR_INC_BACKUP 4003L
+#define ERROR_FULL_BACKUP 4004L
+#define ERROR_REC_NON_EXISTENT 4005L
+#define ERROR_RPL_NOT_ALLOWED 4006L
+#define SEVERITY_SUCCESS 0
+#define SEVERITY_ERROR 1
+#define FACILITY_WINDOWS 8
+#define FACILITY_STORAGE 3
+#define FACILITY_RPC 1
+#define FACILITY_WIN32 7
+#define FACILITY_CONTROL 10
+#define FACILITY_NULL 0
+#define FACILITY_ITF 4
+#define FACILITY_DISPATCH 2
+#define SUCCEEDED(Status) ((HRESULT)(Status) >= 0)
+#define FAILED(Status) ((HRESULT)(Status)<0)
+#define IS_ERROR(Status) ((unsigned long)(Status) >> 31 == SEVERITY_ERROR)
+#define HRESULT_CODE(r) ((r)&0xFFFF)
+#define SCODE_CODE(c) ((c)&0xFFFF)
+#define HRESULT_FACILITY(r) (((r)>>16)&0x1fff)
+#define SCODE_FACILITY(c) (((c)>>16)&0x1fff)
+#define HRESULT_SEVERITY(r) (((r)>>31)&0x1)
+#define SCODE_SEVERITY(c) (((c)>>31)&0x1)
+#define MAKE_HRESULT(s,f,c) ((HRESULT)(((unsigned long)(s)<<31)|((unsigned long)(f)<<16)|((unsigned long)(c))))
+#define MAKE_SCODE(s,f,c) ((SCODE)(((unsigned long)(s)<<31)|((unsigned long)(f)<<16)|((unsigned long)(c))) )
+#define FACILITY_NT_BIT 0x10000000
+#define HRESULT_FROM_WIN32(x) (x?((HRESULT)(((x)&0x0000FFFF)|(FACILITY_WIN32<<16)|0x80000000)):0)
+#define HRESULT_FROM_NT(x) ((HRESULT)((x)|FACILITY_NT_BIT))
+#define GetScode(hr) ((SCODE) (hr))
+#define ResultFromScode(sc) ((HRESULT) (sc))
+#define PropagateResult(hrPrevious, scBase) ((HRESULT) scBase)
+#define NOERROR S_OK
+#define E_UNEXPECTED 0x8000FFFFL
+#define E_NOTIMPL 0x80004001L
+#define E_OUTOFMEMORY 0x8007000EL
+#define E_INVALIDARG 0x80070057L
+#define E_NOINTERFACE 0x80004002L
+#define E_POINTER 0x80004003L
+#define E_HANDLE 0x80070006L
+#define E_ABORT 0x80004004L
+#define E_FAIL 0x80004005L
+#define E_ACCESSDENIED 0x80070005L
+#define CO_E_INIT_TLS 0x80004006L
+#define CO_E_INIT_SHARED_ALLOCATOR 0x80004007L
+#define CO_E_INIT_MEMORY_ALLOCATOR 0x80004008L
+#define CO_E_INIT_CLASS_CACHE 0x80004009L
+#define CO_E_INIT_RPC_CHANNEL 0x8000400AL
+#define CO_E_INIT_TLS_SET_CHANNEL_CONTROL 0x8000400BL
+#define CO_E_INIT_TLS_CHANNEL_CONTROL 0x8000400CL
+#define CO_E_INIT_UNACCEPTED_USER_ALLOCATOR 0x8000400DL
+#define CO_E_INIT_SCM_MUTEX_EXISTS 0x8000400EL
+#define CO_E_INIT_SCM_FILE_MAPPING_EXISTS 0x8000400FL
+#define CO_E_INIT_SCM_MAP_VIEW_OF_FILE 0x80004010L
+#define CO_E_INIT_SCM_EXEC_FAILURE 0x80004011L
+#define CO_E_INIT_ONLY_SINGLE_THREADED 0x80004012L
+#define S_OK (0x00000000L)
+#define S_FALSE (0x00000001L)
+#define OLE_E_FIRST 0x80040000L
+#define OLE_E_LAST 0x800400FFL
+#define OLE_S_FIRST 0x00040000L
+#define OLE_S_LAST 0x000400FFL
+#define OLE_E_OLEVERB 0x80040000L
+#define OLE_E_ADVF 0x80040001L
+#define OLE_E_ENUM_NOMORE 0x80040002L
+#define OLE_E_ADVISENOTSUPPORTED 0x80040003L
+#define OLE_E_NOCONNECTION 0x80040004L
+#define OLE_E_NOTRUNNING 0x80040005L
+#define OLE_E_NOCACHE 0x80040006L
+#define OLE_E_BLANK 0x80040007L
+#define OLE_E_CLASSDIFF 0x80040008L
+#define OLE_E_CANT_GETMONIKER 0x80040009L
+#define OLE_E_CANT_BINDTOSOURCE 0x8004000AL
+#define OLE_E_STATIC 0x8004000BL
+#define OLE_E_PROMPTSAVECANCELLED 0x8004000CL
+#define OLE_E_INVALIDRECT 0x8004000DL
+#define OLE_E_WRONGCOMPOBJ 0x8004000EL
+#define OLE_E_INVALIDHWND 0x8004000FL
+#define OLE_E_NOT_INPLACEACTIVE 0x80040010L
+#define OLE_E_CANTCONVERT 0x80040011L
+#define OLE_E_NOSTORAGE 0x80040012L
+#define DV_E_FORMATETC 0x80040064L
+#define DV_E_DVTARGETDEVICE 0x80040065L
+#define DV_E_STGMEDIUM 0x80040066L
+#define DV_E_STATDATA 0x80040067L
+#define DV_E_LINDEX 0x80040068L
+#define DV_E_TYMED 0x80040069L
+#define DV_E_CLIPFORMAT 0x8004006AL
+#define DV_E_DVASPECT 0x8004006BL
+#define DV_E_DVTARGETDEVICE_SIZE 0x8004006CL
+#define DV_E_NOIVIEWOBJECT 0x8004006DL
+#define DRAGDROP_E_FIRST 0x80040100L
+#define DRAGDROP_E_LAST 0x8004010FL
+#define DRAGDROP_S_FIRST 0x00040100L
+#define DRAGDROP_S_LAST 0x0004010FL
+#define DRAGDROP_E_NOTREGISTERED 0x80040100L
+#define DRAGDROP_E_ALREADYREGISTERED 0x80040101L
+#define DRAGDROP_E_INVALIDHWND 0x80040102L
+#define CLASSFACTORY_E_FIRST 0x80040110L
+#define CLASSFACTORY_E_LAST 0x8004011FL
+#define CLASSFACTORY_S_FIRST 0x00040110L
+#define CLASSFACTORY_S_LAST 0x0004011FL
+#define CLASS_E_NOAGGREGATION 0x80040110L
+#define CLASS_E_CLASSNOTAVAILABLE 0x80040111L
+#define MARSHAL_E_FIRST 0x80040120L
+#define MARSHAL_E_LAST 0x8004012FL
+#define MARSHAL_S_FIRST 0x00040120L
+#define MARSHAL_S_LAST 0x0004012FL
+#define DATA_E_FIRST 0x80040130L
+#define DATA_E_LAST 0x8004013FL
+#define DATA_S_FIRST 0x00040130L
+#define DATA_S_LAST 0x0004013FL
+#define VIEW_E_FIRST 0x80040140L
+#define VIEW_E_LAST 0x8004014FL
+#define VIEW_S_FIRST 0x00040140L
+#define VIEW_S_LAST 0x0004014FL
+#define VIEW_E_DRAW 0x80040140L
+#define REGDB_E_FIRST 0x80040150L
+#define REGDB_E_LAST 0x8004015FL
+#define REGDB_S_FIRST 0x00040150L
+#define REGDB_S_LAST 0x0004015FL
+#define REGDB_E_READREGDB 0x80040150L
+#define REGDB_E_WRITEREGDB 0x80040151L
+#define REGDB_E_KEYMISSING 0x80040152L
+#define REGDB_E_INVALIDVALUE 0x80040153L
+#define REGDB_E_CLASSNOTREG 0x80040154L
+#define REGDB_E_IIDNOTREG 0x80040155L
+#define CACHE_E_FIRST 0x80040170L
+#define CACHE_E_LAST 0x8004017FL
+#define CACHE_S_FIRST 0x00040170L
+#define CACHE_S_LAST 0x0004017FL
+#define CACHE_E_NOCACHE_UPDATED 0x80040170L
+#define OLEOBJ_E_FIRST 0x80040180L
+#define OLEOBJ_E_LAST 0x8004018FL
+#define OLEOBJ_S_FIRST 0x00040180L
+#define OLEOBJ_S_LAST 0x0004018FL
+#define OLEOBJ_E_NOVERBS 0x80040180L
+#define OLEOBJ_E_INVALIDVERB 0x80040181L
+#define CLIENTSITE_E_FIRST 0x80040190L
+#define CLIENTSITE_E_LAST 0x8004019FL
+#define CLIENTSITE_S_FIRST 0x00040190L
+#define CLIENTSITE_S_LAST 0x0004019FL
+#define INPLACE_E_NOTUNDOABLE 0x800401A0L
+#define INPLACE_E_NOTOOLSPACE 0x800401A1L
+#define INPLACE_E_FIRST 0x800401A0L
+#define INPLACE_E_LAST 0x800401AFL
+#define INPLACE_S_FIRST 0x000401A0L
+#define INPLACE_S_LAST 0x000401AFL
+#define ENUM_E_FIRST 0x800401B0L
+#define ENUM_E_LAST 0x800401BFL
+#define ENUM_S_FIRST 0x000401B0L
+#define ENUM_S_LAST 0x000401BFL
+#define CONVERT10_E_FIRST 0x800401C0L
+#define CONVERT10_E_LAST 0x800401CFL
+#define CONVERT10_S_FIRST 0x000401C0L
+#define CONVERT10_S_LAST 0x000401CFL
+#define CONVERT10_E_OLESTREAM_GET 0x800401C0L
+#define CONVERT10_E_OLESTREAM_PUT 0x800401C1L
+#define CONVERT10_E_OLESTREAM_FMT 0x800401C2L
+#define CONVERT10_E_OLESTREAM_BITMAP_TO_DIB 0x800401C3L
+#define CONVERT10_E_STG_FMT 0x800401C4L
+#define CONVERT10_E_STG_NO_STD_STREAM 0x800401C5L
+#define CONVERT10_E_STG_DIB_TO_BITMAP 0x800401C6L
+#define CLIPBRD_E_FIRST 0x800401D0L
+#define CLIPBRD_E_LAST 0x800401DFL
+#define CLIPBRD_S_FIRST 0x000401D0L
+#define CLIPBRD_S_LAST 0x000401DFL
+#define CLIPBRD_E_CANT_OPEN 0x800401D0L
+#define CLIPBRD_E_CANT_EMPTY 0x800401D1L
+#define CLIPBRD_E_CANT_SET 0x800401D2L
+#define CLIPBRD_E_BAD_DATA 0x800401D3L
+#define CLIPBRD_E_CANT_CLOSE 0x800401D4L
+#define MK_E_FIRST 0x800401E0L
+#define MK_E_LAST 0x800401EFL
+#define MK_S_FIRST 0x000401E0L
+#define MK_S_LAST 0x000401EFL
+#define MK_E_CONNECTMANUALLY 0x800401E0L
+#define MK_E_EXCEEDEDDEADLINE 0x800401E1L
+#define MK_E_NEEDGENERIC 0x800401E2L
+#define MK_E_UNAVAILABLE 0x800401E3L
+#define MK_E_SYNTAX 0x800401E4L
+#define MK_E_NOOBJECT 0x800401E5L
+#define MK_E_INVALIDEXTENSION 0x800401E6L
+#define MK_E_INTERMEDIATEINTERFACENOTSUPPORTED 0x800401E7L
+#define MK_E_NOTBINDABLE 0x800401E8L
+#define MK_E_NOTBOUND 0x800401E9L
+#define MK_E_CANTOPENFILE 0x800401EAL
+#define MK_E_MUSTBOTHERUSER 0x800401EBL
+#define MK_E_NOINVERSE 0x800401ECL
+#define MK_E_NOSTORAGE 0x800401EDL
+#define MK_E_NOPREFIX 0x800401EEL
+#define MK_E_ENUMERATION_FAILED 0x800401EFL
+#define CO_E_FIRST 0x800401F0L
+#define CO_E_LAST 0x800401FFL
+#define CO_S_FIRST 0x000401F0L
+#define CO_S_LAST 0x000401FFL
+#define CO_E_NOTINITIALIZED 0x800401F0L
+#define CO_E_ALREADYINITIALIZED 0x800401F1L
+#define CO_E_CANTDETERMINECLASS 0x800401F2L
+#define CO_E_CLASSSTRING 0x800401F3L
+#define CO_E_IIDSTRING 0x800401F4L
+#define CO_E_APPNOTFOUND 0x800401F5L
+#define CO_E_APPSINGLEUSE 0x800401F6L
+#define CO_E_ERRORINAPP 0x800401F7L
+#define CO_E_DLLNOTFOUND 0x800401F8L
+#define CO_E_ERRORINDLL 0x800401F9L
+#define CO_E_WRONGOSFORAPP 0x800401FAL
+#define CO_E_OBJNOTREG 0x800401FBL
+#define CO_E_OBJISREG 0x800401FCL
+#define CO_E_OBJNOTCONNECTED 0x800401FDL
+#define CO_E_APPDIDNTREG 0x800401FEL
+#define CO_E_RELEASED 0x800401FFL
+#define OLE_S_USEREG 0x00040000L
+#define OLE_S_STATIC 0x00040001L
+#define OLE_S_MAC_CLIPFORMAT 0x00040002L
+#define DRAGDROP_S_DROP 0x00040100L
+#define DRAGDROP_S_CANCEL 0x00040101L
+#define DRAGDROP_S_USEDEFAULTCURSORS 0x00040102L
+#define DATA_S_SAMEFORMATETC 0x00040130L
+#define VIEW_S_ALREADY_FROZEN 0x00040140L
+#define CACHE_S_FORMATETC_NOTSUPPORTED 0x00040170L
+#define CACHE_S_SAMECACHE 0x00040171L
+#define CACHE_S_SOMECACHES_NOTUPDATED 0x00040172L
+#define OLEOBJ_S_INVALIDVERB 0x00040180L
+#define OLEOBJ_S_CANNOT_DOVERB_NOW 0x00040181L
+#define OLEOBJ_S_INVALIDHWND 0x00040182L
+#define INPLACE_S_TRUNCATED 0x000401A0L
+#define CONVERT10_S_NO_PRESENTATION 0x000401C0L
+#define MK_S_REDUCED_TO_SELF 0x000401E2L
+#define MK_S_ME 0x000401E4L
+#define MK_S_HIM 0x000401E5L
+#define MK_S_US 0x000401E6L
+#define MK_S_MONIKERALREADYREGISTERED 0x000401E7L
+#define CO_E_CLASS_CREATE_FAILED 0x80080001L
+#define CO_E_SCM_ERROR 0x80080002L
+#define CO_E_SCM_RPC_FAILURE 0x80080003L
+#define CO_E_BAD_PATH 0x80080004L
+#define CO_E_SERVER_EXEC_FAILURE 0x80080005L
+#define CO_E_OBJSRV_RPC_FAILURE 0x80080006L
+#define MK_E_NO_NORMALIZED 0x80080007L
+#define CO_E_SERVER_STOPPING 0x80080008L
+#define MEM_E_INVALID_ROOT 0x80080009L
+#define MEM_E_INVALID_LINK 0x80080010L
+#define MEM_E_INVALID_SIZE 0x80080011L
+#define DISP_E_UNKNOWNINTERFACE 0x80020001L
+#define DISP_E_MEMBERNOTFOUND 0x80020003L
+#define DISP_E_PARAMNOTFOUND 0x80020004L
+#define DISP_E_TYPEMISMATCH 0x80020005L
+#define DISP_E_UNKNOWNNAME 0x80020006L
+#define DISP_E_NONAMEDARGS 0x80020007L
+#define DISP_E_BADVARTYPE 0x80020008L
+#define DISP_E_EXCEPTION 0x80020009L
+#define DISP_E_OVERFLOW 0x8002000AL
+#define DISP_E_BADINDEX 0x8002000BL
+#define DISP_E_UNKNOWNLCID 0x8002000CL
+#define DISP_E_ARRAYISLOCKED 0x8002000DL
+#define DISP_E_BADPARAMCOUNT 0x8002000EL
+#define DISP_E_PARAMNOTOPTIONAL 0x8002000FL
+#define DISP_E_BADCALLEE 0x80020010L
+#define DISP_E_NOTACOLLECTION 0x80020011L
+#define TYPE_E_BUFFERTOOSMALL 0x80028016L
+#define TYPE_E_INVDATAREAD 0x80028018L
+#define TYPE_E_UNSUPFORMAT 0x80028019L
+#define TYPE_E_REGISTRYACCESS 0x8002801CL
+#define TYPE_E_LIBNOTREGISTERED 0x8002801DL
+#define TYPE_E_UNDEFINEDTYPE 0x80028027L
+#define TYPE_E_QUALIFIEDNAMEDISALLOWED 0x80028028L
+#define TYPE_E_INVALIDSTATE 0x80028029L
+#define TYPE_E_WRONGTYPEKIND 0x8002802AL
+#define TYPE_E_ELEMENTNOTFOUND 0x8002802BL
+#define TYPE_E_AMBIGUOUSNAME 0x8002802CL
+#define TYPE_E_NAMECONFLICT 0x8002802DL
+#define TYPE_E_UNKNOWNLCID 0x8002802EL
+#define TYPE_E_DLLFUNCTIONNOTFOUND 0x8002802FL
+#define TYPE_E_BADMODULEKIND 0x800288BDL
+#define TYPE_E_SIZETOOBIG 0x800288C5L
+#define TYPE_E_DUPLICATEID 0x800288C6L
+#define TYPE_E_INVALIDID 0x800288CFL
+#define TYPE_E_TYPEMISMATCH 0x80028CA0L
+#define TYPE_E_OUTOFBOUNDS 0x80028CA1L
+#define TYPE_E_IOERROR 0x80028CA2L
+#define TYPE_E_CANTCREATETMPFILE 0x80028CA3L
+#define TYPE_E_CANTLOADLIBRARY 0x80029C4AL
+#define TYPE_E_INCONSISTENTPROPFUNCS 0x80029C83L
+#define TYPE_E_CIRCULARTYPE 0x80029C84L
+#define STG_E_INVALIDFUNCTION 0x80030001L
+#define STG_E_FILENOTFOUND 0x80030002L
+#define STG_E_PATHNOTFOUND 0x80030003L
+#define STG_E_TOOMANYOPENFILES 0x80030004L
+#define STG_E_ACCESSDENIED 0x80030005L
+#define STG_E_INVALIDHANDLE 0x80030006L
+#define STG_E_INSUFFICIENTMEMORY 0x80030008L
+#define STG_E_INVALIDPOINTER 0x80030009L
+#define STG_E_NOMOREFILES 0x80030012L
+#define STG_E_DISKISWRITEPROTECTED 0x80030013L
+#define STG_E_SEEKERROR 0x80030019L
+#define STG_E_WRITEFAULT 0x8003001DL
+#define STG_E_READFAULT 0x8003001EL
+#define STG_E_SHAREVIOLATION 0x80030020L
+#define STG_E_LOCKVIOLATION 0x80030021L
+#define STG_E_FILEALREADYEXISTS 0x80030050L
+#define STG_E_INVALIDPARAMETER 0x80030057L
+#define STG_E_MEDIUMFULL 0x80030070L
+#define STG_E_ABNORMALAPIEXIT 0x800300FAL
+#define STG_E_INVALIDHEADER 0x800300FBL
+#define STG_E_INVALIDNAME 0x800300FCL
+#define STG_E_UNKNOWN 0x800300FDL
+#define STG_E_UNIMPLEMENTEDFUNCTION 0x800300FEL
+#define STG_E_INVALIDFLAG 0x800300FFL
+#define STG_E_INUSE 0x80030100L
+#define STG_E_NOTCURRENT 0x80030101L
+#define STG_E_REVERTED 0x80030102L
+#define STG_E_CANTSAVE 0x80030103L
+#define STG_E_OLDFORMAT 0x80030104L
+#define STG_E_OLDDLL 0x80030105L
+#define STG_E_SHAREREQUIRED 0x80030106L
+#define STG_E_NOTFILEBASEDSTORAGE 0x80030107L
+#define STG_E_EXTANTMARSHALLINGS 0x80030108L
+#define STG_S_CONVERTED 0x00030200L
+#define RPC_E_CALL_REJECTED 0x80010001L
+#define RPC_E_CALL_CANCELED 0x80010002L
+#define RPC_E_CANTPOST_INSENDCALL 0x80010003L
+#define RPC_E_CANTCALLOUT_INASYNCCALL 0x80010004L
+#define RPC_E_CANTCALLOUT_INEXTERNALCALL 0x80010005L
+#define RPC_E_CONNECTION_TERMINATED 0x80010006L
+#define RPC_E_SERVER_DIED 0x80010007L
+#define RPC_E_CLIENT_DIED 0x80010008L
+#define RPC_E_INVALID_DATAPACKET 0x80010009L
+#define RPC_E_CANTTRANSMIT_CALL 0x8001000AL
+#define RPC_E_CLIENT_CANTMARSHAL_DATA 0x8001000BL
+#define RPC_E_CLIENT_CANTUNMARSHAL_DATA 0x8001000CL
+#define RPC_E_SERVER_CANTMARSHAL_DATA 0x8001000DL
+#define RPC_E_SERVER_CANTUNMARSHAL_DATA 0x8001000EL
+#define RPC_E_INVALID_DATA 0x8001000FL
+#define RPC_E_INVALID_PARAMETER 0x80010010L
+#define RPC_E_CANTCALLOUT_AGAIN 0x80010011L
+#define RPC_E_SERVER_DIED_DNE 0x80010012L
+#define RPC_E_SYS_CALL_FAILED 0x80010100L
+#define RPC_E_OUT_OF_RESOURCES 0x80010101L
+#define RPC_E_ATTEMPTED_MULTITHREAD 0x80010102L
+#define RPC_E_NOT_REGISTERED 0x80010103L
+#define RPC_E_FAULT 0x80010104L
+#define RPC_E_SERVERFAULT 0x80010105L
+#define RPC_E_CHANGED_MODE 0x80010106L
+#define RPC_E_INVALIDMETHOD 0x80010107L
+#define RPC_E_DISCONNECTED 0x80010108L
+#define RPC_E_RETRY 0x80010109L
+#define RPC_E_SERVERCALL_RETRYLATER 0x8001010AL
+#define RPC_E_SERVERCALL_REJECTED 0x8001010BL
+#define RPC_E_INVALID_CALLDATA 0x8001010CL
+#define RPC_E_CANTCALLOUT_ININPUTSYNCCALL 0x8001010DL
+#define RPC_E_WRONG_THREAD 0x8001010EL
+#define RPC_E_THREAD_NOT_INIT 0x8001010FL
+#define RPC_E_UNEXPECTED 0x8001FFFFL
+#endif
diff --git a/winsup/w32api/include/wingdi.h b/winsup/w32api/include/wingdi.h
new file mode 100644
index 000000000..aeb6cc82a
--- /dev/null
+++ b/winsup/w32api/include/wingdi.h
@@ -0,0 +1,2808 @@
+#ifndef _WINGDI_H
+#define _WINGDI_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define WINGDIAPI
+#define BI_RGB 0
+#define BI_RLE8 1
+#define BI_RLE4 2
+#define BI_BITFIELDS 3
+#define LF_FACESIZE 32
+#define LF_FULLFACESIZE 64
+#define CA_NEGATIVE 1
+#define CA_LOG_FILTER 2
+#define ILLUMINANT_DEVICE_DEFAULT 0
+#define ILLUMINANT_A 1
+#define ILLUMINANT_B 2
+#define ILLUMINANT_C 3
+#define ILLUMINANT_D50 4
+#define ILLUMINANT_D55 5
+#define ILLUMINANT_D65 6
+#define ILLUMINANT_D75 7
+#define ILLUMINANT_F2 8
+#define ILLUMINANT_MAX_INDEX ILLUMINANT_F2
+#define ILLUMINANT_TUNGSTEN ILLUMINANT_A
+#define ILLUMINANT_DAYLIGHT ILLUMINANT_C
+#define ILLUMINANT_FLUORESCENT ILLUMINANT_F2
+#define ILLUMINANT_NTSC ILLUMINANT_C
+#define RGB_GAMMA_MIN 2500
+#define RGB_GAMMA_MAX 65000
+#define REFERENCE_WHITE_MIN 6000
+#define REFERENCE_WHITE_MAX 10000
+#define REFERENCE_BLACK_MIN 0
+#define REFERENCE_BLACK_MAX 4000
+#define COLOR_ADJ_MIN (-100)
+#define COLOR_ADJ_MAX 100
+#define CCHDEVICENAME 32
+#define CCHFORMNAME 32
+#define DI_COMPAT 4
+#define DI_DEFAULTSIZE 8
+#define DI_IMAGE 2
+#define DI_MASK 1
+#define DI_NORMAL 3
+#define DI_APPBANDING 1
+#define EMR_HEADER 1
+#define EMR_POLYBEZIER 2
+#define EMR_POLYGON 3
+#define EMR_POLYLINE 4
+#define EMR_POLYBEZIERTO 5
+#define EMR_POLYLINETO 6
+#define EMR_POLYPOLYLINE 7
+#define EMR_POLYPOLYGON 8
+#define EMR_SETWINDOWEXTEX 9
+#define EMR_SETWINDOWORGEX 10
+#define EMR_SETVIEWPORTEXTEX 11
+#define EMR_SETVIEWPORTORGEX 12
+#define EMR_SETBRUSHORGEX 13
+#define EMR_EOF 14
+#define EMR_SETPIXELV 15
+#define EMR_SETMAPPERFLAGS 16
+#define EMR_SETMAPMODE 17
+#define EMR_SETBKMODE 18
+#define EMR_SETPOLYFILLMODE 19
+#define EMR_SETROP2 20
+#define EMR_SETSTRETCHBLTMODE 21
+#define EMR_SETTEXTALIGN 22
+#define EMR_SETCOLORADJUSTMENT 23
+#define EMR_SETTEXTCOLOR 24
+#define EMR_SETBKCOLOR 25
+#define EMR_OFFSETCLIPRGN 26
+#define EMR_MOVETOEX 27
+#define EMR_SETMETARGN 28
+#define EMR_EXCLUDECLIPRECT 29
+#define EMR_INTERSECTCLIPRECT 30
+#define EMR_SCALEVIEWPORTEXTEX 31
+#define EMR_SCALEWINDOWEXTEX 32
+#define EMR_SAVEDC 33
+#define EMR_RESTOREDC 34
+#define EMR_SETWORLDTRANSFORM 35
+#define EMR_MODIFYWORLDTRANSFORM 36
+#define EMR_SELECTOBJECT 37
+#define EMR_CREATEPEN 38
+#define EMR_CREATEBRUSHINDIRECT 39
+#define EMR_DELETEOBJECT 40
+#define EMR_ANGLEARC 41
+#define EMR_ELLIPSE 42
+#define EMR_RECTANGLE 43
+#define EMR_ROUNDRECT 44
+#define EMR_ARC 45
+#define EMR_CHORD 46
+#define EMR_PIE 47
+#define EMR_SELECTPALETTE 48
+#define EMR_CREATEPALETTE 49
+#define EMR_SETPALETTEENTRIES 50
+#define EMR_RESIZEPALETTE 51
+#define EMR_REALIZEPALETTE 52
+#define EMR_EXTFLOODFILL 53
+#define EMR_LINETO 54
+#define EMR_ARCTO 55
+#define EMR_POLYDRAW 56
+#define EMR_SETARCDIRECTION 57
+#define EMR_SETMITERLIMIT 58
+#define EMR_BEGINPATH 59
+#define EMR_ENDPATH 60
+#define EMR_CLOSEFIGURE 61
+#define EMR_FILLPATH 62
+#define EMR_STROKEANDFILLPATH 63
+#define EMR_STROKEPATH 64
+#define EMR_FLATTENPATH 65
+#define EMR_WIDENPATH 66
+#define EMR_SELECTCLIPPATH 67
+#define EMR_ABORTPATH 68
+#define EMR_GDICOMMENT 70
+#define EMR_FILLRGN 71
+#define EMR_FRAMERGN 72
+#define EMR_INVERTRGN 73
+#define EMR_PAINTRGN 74
+#define EMR_EXTSELECTCLIPRGN 75
+#define EMR_BITBLT 76
+#define EMR_STRETCHBLT 77
+#define EMR_MASKBLT 78
+#define EMR_PLGBLT 79
+#define EMR_SETDIBITSTODEVICE 80
+#define EMR_STRETCHDIBITS 81
+#define EMR_EXTCREATEFONTINDIRECTW 82
+#define EMR_EXTTEXTOUTA 83
+#define EMR_EXTTEXTOUTW 84
+#define EMR_POLYBEZIER16 85
+#define EMR_POLYGON16 86
+#define EMR_POLYLINE16 87
+#define EMR_POLYBEZIERTO16 88
+#define EMR_POLYLINETO16 89
+#define EMR_POLYPOLYLINE16 90
+#define EMR_POLYPOLYGON16 91
+#define EMR_POLYDRAW16 92
+#define EMR_CREATEMONOBRUSH 93
+#define EMR_CREATEDIBPATTERNBRUSHPT 94
+#define EMR_EXTCREATEPEN 95
+#define EMR_POLYTEXTOUTA 96
+#define EMR_POLYTEXTOUTW 97
+#define EMR_SETICMMODE 98
+#define EMR_CREATECOLORSPACE 99
+#define EMR_SETCOLORSPACE 100
+#define EMR_DELETECOLORSPACE 101
+#define EMR_GLSRECORD 102
+#define EMR_GLSBOUNDEDRECORD 103
+#define EMR_PIXELFORMAT 104
+#define ENHMETA_SIGNATURE 1179469088
+#define EPS_SIGNATURE 0x46535045
+#define META_SETBKCOLOR 0x201
+#define META_SETBKMODE 0x102
+#define META_SETMAPMODE 0x103
+#define META_SETROP2 0x104
+#define META_SETRELABS 0x105
+#define META_SETPOLYFILLMODE 0x106
+#define META_SETSTRETCHBLTMODE 0x107
+#define META_SETTEXTCHAREXTRA 0x108
+#define META_SETTEXTCOLOR 0x209
+#define META_SETTEXTJUSTIFICATION 0x20A
+#define META_SETWINDOWORG 0x20B
+#define META_SETWINDOWEXT 0x20C
+#define META_SETVIEWPORTORG 0x20D
+#define META_SETVIEWPORTEXT 0x20E
+#define META_OFFSETWINDOWORG 0x20F
+#define META_SCALEWINDOWEXT 0x410
+#define META_OFFSETVIEWPORTORG 0x211
+#define META_SCALEVIEWPORTEXT 0x412
+#define META_LINETO 0x213
+#define META_MOVETO 0x214
+#define META_EXCLUDECLIPRECT 0x415
+#define META_INTERSECTCLIPRECT 0x416
+#define META_ARC 0x817
+#define META_ELLIPSE 0x418
+#define META_FLOODFILL 0x419
+#define META_PIE 0x81A
+#define META_RECTANGLE 0x41B
+#define META_ROUNDRECT 0x61C
+#define META_PATBLT 0x61D
+#define META_SAVEDC 0x1E
+#define META_SETPIXEL 0x41F
+#define META_OFFSETCLIPRGN 0x220
+#define META_TEXTOUT 0x521
+#define META_BITBLT 0x922
+#define META_STRETCHBLT 0xB23
+#define META_POLYGON 0x324
+#define META_POLYLINE 0x325
+#define META_ESCAPE 0x626
+#define META_RESTOREDC 0x127
+#define META_FILLREGION 0x228
+#define META_FRAMEREGION 0x429
+#define META_INVERTREGION 0x12A
+#define META_PAINTREGION 0x12B
+#define META_SELECTCLIPREGION 0x12C
+#define META_SELECTOBJECT 0x12D
+#define META_SETTEXTALIGN 0x12E
+#define META_CHORD 0x830
+#define META_SETMAPPERFLAGS 0x231
+#define META_EXTTEXTOUT 0xa32
+#define META_SETDIBTODEV 0xd33
+#define META_SELECTPALETTE 0x234
+#define META_REALIZEPALETTE 0x35
+#define META_ANIMATEPALETTE 0x436
+#define META_SETPALENTRIES 0x37
+#define META_POLYPOLYGON 0x538
+#define META_RESIZEPALETTE 0x139
+#define META_DIBBITBLT 0x940
+#define META_DIBSTRETCHBLT 0xb41
+#define META_DIBCREATEPATTERNBRUSH 0x142
+#define META_STRETCHDIB 0xf43
+#define META_EXTFLOODFILL 0x548
+#define META_DELETEOBJECT 0x1f0
+#define META_CREATEPALETTE 0xf7
+#define META_CREATEPATTERNBRUSH 0x1F9
+#define META_CREATEPENINDIRECT 0x2FA
+#define META_CREATEFONTINDIRECT 0x2FB
+#define META_CREATEBRUSHINDIRECT 0x2FC
+#define META_CREATEREGION 0x6FF
+#define PT_MOVETO 6
+#define PT_LINETO 2
+#define PT_BEZIERTO 4
+#define PT_CLOSEFIGURE 1
+#define ELF_VENDOR_SIZE 4
+#define ELF_VERSION 0
+#define ELF_CULTURE_LATIN 0
+#define PFD_TYPE_RGBA 0
+#define PFD_TYPE_COLORINDEX 1
+#define PFD_MAIN_PLANE 0
+#define PFD_OVERLAY_PLANE 1
+#define PFD_UNDERLAY_PLANE (-1)
+#define PFD_DOUBLEBUFFER 1
+#define PFD_STEREO 2
+#define PFD_DRAW_TO_WINDOW 4
+#define PFD_DRAW_TO_BITMAP 8
+#define PFD_SUPPORT_GDI 16
+#define PFD_SUPPORT_OPENGL 32
+#define PFD_GENERIC_FORMAT 64
+#define PFD_NEED_PALETTE 128
+#define PFD_NEED_SYSTEM_PALETTE 0x00000100
+#define PFD_SWAP_EXCHANGE 0x00000200
+#define PFD_SWAP_COPY 0x00000400
+#define PFD_DOUBLEBUFFER_DONTCARE 0x40000000
+#define PFD_STEREO_DONTCARE 0x80000000
+#define SP_ERROR (-1)
+#define SP_OUTOFDISK (-4)
+#define SP_OUTOFMEMORY (-5)
+#define SP_USERABORT (-3)
+#define SP_APPABORT (-2)
+#define BLACKNESS 0x42
+#define NOTSRCERASE 0x1100A6
+#define NOTSRCCOPY 0x330008
+#define SRCERASE 0x440328
+#define DSTINVERT 0x550009
+#define PATINVERT 0x5A0049
+#define SRCINVERT 0x660046
+#define SRCAND 0x8800C6
+#define MERGEPAINT 0xBB0226
+#define MERGECOPY 0xC000CA
+#define SRCCOPY 0xCC0020
+#define SRCPAINT 0xEE0086
+#define PATCOPY 0xF00021
+#define PATPAINT 0xFB0A09
+#define WHITENESS 0xFF0062
+#define R2_BLACK 1
+#define R2_COPYPEN 13
+#define R2_MASKNOTPEN 3
+#define R2_MASKPEN 9
+#define R2_MASKPENNOT 5
+#define R2_MERGENOTPEN 12
+#define R2_MERGEPEN 15
+#define R2_MERGEPENNOT 14
+#define R2_NOP 11
+#define R2_NOT 6
+#define R2_NOTCOPYPEN 4
+#define R2_NOTMASKPEN 8
+#define R2_NOTMERGEPEN 2
+#define R2_NOTXORPEN 10
+#define R2_WHITE 16
+#define R2_XORPEN 7
+#define CM_OUT_OF_GAMUT 255
+#define CM_IN_GAMUT 0
+#define RGN_AND 1
+#define RGN_COPY 5
+#define RGN_DIFF 4
+#define RGN_OR 2
+#define RGN_XOR 3
+#define NULLREGION 1
+#define SIMPLEREGION 2
+#define COMPLEXREGION 3
+#define ERROR 0
+#define CBM_INIT 4
+#define DIB_PAL_COLORS 1
+#define DIB_RGB_COLORS 0
+#define FW_DONTCARE 0
+#define FW_THIN 100
+#define FW_EXTRALIGHT 200
+#define FW_ULTRALIGHT FW_EXTRALIGHT
+#define FW_LIGHT 300
+#define FW_NORMAL 400
+#define FW_REGULAR 400
+#define FW_MEDIUM 500
+#define FW_SEMIBOLD 600
+#define FW_DEMIBOLD FW_SEMIBOLD
+#define FW_BOLD 700
+#define FW_EXTRABOLD 800
+#define FW_ULTRABOLD FW_EXTRABOLD
+#define FW_HEAVY 900
+#define FW_BLACK FW_HEAVY
+#define ANSI_CHARSET 0
+#define DEFAULT_CHARSET 1
+#define SYMBOL_CHARSET 2
+#define SHIFTJIS_CHARSET 128
+#define HANGEUL_CHARSET 129
+#define GB2312_CHARSET 134
+#define CHINESEBIG5_CHARSET 136
+#define GREEK_CHARSET 161
+#define TURKISH_CHARSET 162
+#define HEBREW_CHARSET 177
+#define ARABIC_CHARSET 178
+#define BALTIC_CHARSET 186
+#define RUSSIAN_CHARSET 204
+#define THAI_CHARSET 222
+#define EASTEUROPE_CHARSET 238
+#define OEM_CHARSET 255
+#define JOHAB_CHARSET 130
+#define VIETNAMESE_CHARSET 163
+#define MAC_CHARSET 77
+#define BALTIC_CHARSET 186
+#define JOHAB_CHARSET 130
+#define VIETNAMESE_CHARSET 163
+#define OUT_DEFAULT_PRECIS 0
+#define OUT_STRING_PRECIS 1
+#define OUT_CHARACTER_PRECIS 2
+#define OUT_STROKE_PRECIS 3
+#define OUT_TT_PRECIS 4
+#define OUT_DEVICE_PRECIS 5
+#define OUT_RASTER_PRECIS 6
+#define OUT_TT_ONLY_PRECIS 7
+#define OUT_OUTLINE_PRECIS 8
+#define CLIP_DEFAULT_PRECIS 0
+#define CLIP_CHARACTER_PRECIS 1
+#define CLIP_STROKE_PRECIS 2
+#define CLIP_MASK 15
+#define CLIP_LH_ANGLES 16
+#define CLIP_TT_ALWAYS 32
+#define CLIP_EMBEDDED 128
+#define DEFAULT_QUALITY 0
+#define DRAFT_QUALITY 1
+#define PROOF_QUALITY 2
+#define NONANTIALIASED_QUALITY 3
+#define ANTIALIASED_QUALITY 4
+#define DEFAULT_PITCH 0
+#define FIXED_PITCH 1
+#define VARIABLE_PITCH 2
+#define MONO_FONT 8
+#define FF_DECORATIVE 80
+#define FF_DONTCARE 0
+#define FF_MODERN 48
+#define FF_ROMAN 16
+#define FF_SCRIPT 64
+#define FF_SWISS 32
+#define PANOSE_COUNT 10
+#define PAN_FAMILYTYPE_INDEX 0
+#define PAN_SERIFSTYLE_INDEX 1
+#define PAN_WEIGHT_INDEX 2
+#define PAN_PROPORTION_INDEX 3
+#define PAN_CONTRAST_INDEX 4
+#define PAN_STROKEVARIATION_INDEX 5
+#define PAN_ARMSTYLE_INDEX 6
+#define PAN_LETTERFORM_INDEX 7
+#define PAN_MIDLINE_INDEX 8
+#define PAN_XHEIGHT_INDEX 9
+#define PAN_CULTURE_LATIN 0
+#define PAN_ANY 0
+#define PAN_NO_FIT 1
+#define PAN_FAMILY_TEXT_DISPLAY 2
+#define PAN_FAMILY_SCRIPT 3
+#define PAN_FAMILY_DECORATIVE 4
+#define PAN_FAMILY_PICTORIAL 5
+#define PAN_SERIF_COVE 2
+#define PAN_SERIF_OBTUSE_COVE 3
+#define PAN_SERIF_SQUARE_COVE 4
+#define PAN_SERIF_OBTUSE_SQUARE_COVE 5
+#define PAN_SERIF_SQUARE 6
+#define PAN_SERIF_THIN 7
+#define PAN_SERIF_BONE 8
+#define PAN_SERIF_EXAGGERATED 9
+#define PAN_SERIF_TRIANGLE 10
+#define PAN_SERIF_NORMAL_SANS 11
+#define PAN_SERIF_OBTUSE_SANS 12
+#define PAN_SERIF_PERP_SANS 13
+#define PAN_SERIF_FLARED 14
+#define PAN_SERIF_ROUNDED 15
+#define PAN_WEIGHT_VERY_LIGHT 2
+#define PAN_WEIGHT_LIGHT 3
+#define PAN_WEIGHT_THIN 4
+#define PAN_WEIGHT_BOOK 5
+#define PAN_WEIGHT_MEDIUM 6
+#define PAN_WEIGHT_DEMI 7
+#define PAN_WEIGHT_BOLD 8
+#define PAN_WEIGHT_HEAVY 9
+#define PAN_WEIGHT_BLACK 10
+#define PAN_WEIGHT_NORD 11
+#define PAN_PROP_OLD_STYLE 2
+#define PAN_PROP_MODERN 3
+#define PAN_PROP_EVEN_WIDTH 4
+#define PAN_PROP_EXPANDED 5
+#define PAN_PROP_CONDENSED 6
+#define PAN_PROP_VERY_EXPANDED 7
+#define PAN_PROP_VERY_CONDENSED 8
+#define PAN_PROP_MONOSPACED 9
+#define PAN_CONTRAST_NONE 2
+#define PAN_CONTRAST_VERY_LOW 3
+#define PAN_CONTRAST_LOW 4
+#define PAN_CONTRAST_MEDIUM_LOW 5
+#define PAN_CONTRAST_MEDIUM 6
+#define PAN_CONTRAST_MEDIUM_HIGH 7
+#define PAN_CONTRAST_HIGH 8
+#define PAN_CONTRAST_VERY_HIGH 9
+#define PAN_STROKE_GRADUAL_DIAG 2
+#define PAN_STROKE_GRADUAL_TRAN 3
+#define PAN_STROKE_GRADUAL_VERT 4
+#define PAN_STROKE_GRADUAL_HORZ 5
+#define PAN_STROKE_RAPID_VERT 6
+#define PAN_STROKE_RAPID_HORZ 7
+#define PAN_STROKE_INSTANT_VERT 8
+#define PAN_STRAIGHT_ARMS_HORZ 2
+#define PAN_STRAIGHT_ARMS_WEDGE 3
+#define PAN_STRAIGHT_ARMS_VERT 4
+#define PAN_STRAIGHT_ARMS_SINGLE_SERIF 5
+#define PAN_STRAIGHT_ARMS_DOUBLE_SERIF 6
+#define PAN_BENT_ARMS_HORZ 7
+#define PAN_BENT_ARMS_WEDGE 8
+#define PAN_BENT_ARMS_VERT 9
+#define PAN_BENT_ARMS_SINGLE_SERIF 10
+#define PAN_BENT_ARMS_DOUBLE_SERIF 11
+#define PAN_LETT_NORMAL_CONTACT 2
+#define PAN_LETT_NORMAL_WEIGHTED 3
+#define PAN_LETT_NORMAL_BOXED 4
+#define PAN_LETT_NORMAL_FLATTENED 5
+#define PAN_LETT_NORMAL_ROUNDED 6
+#define PAN_LETT_NORMAL_OFF_CENTER 7
+#define PAN_LETT_NORMAL_SQUARE 8
+#define PAN_LETT_OBLIQUE_CONTACT 9
+#define PAN_LETT_OBLIQUE_WEIGHTED 10
+#define PAN_LETT_OBLIQUE_BOXED 11
+#define PAN_LETT_OBLIQUE_FLATTENED 12
+#define PAN_LETT_OBLIQUE_ROUNDED 13
+#define PAN_LETT_OBLIQUE_OFF_CENTER 14
+#define PAN_LETT_OBLIQUE_SQUARE 15
+#define PAN_MIDLINE_STANDARD_TRIMMED 2
+#define PAN_MIDLINE_STANDARD_POINTED 3
+#define PAN_MIDLINE_STANDARD_SERIFED 4
+#define PAN_MIDLINE_HIGH_TRIMMED 5
+#define PAN_MIDLINE_HIGH_POINTED 6
+#define PAN_MIDLINE_HIGH_SERIFED 7
+#define PAN_MIDLINE_CONSTANT_TRIMMED 8
+#define PAN_MIDLINE_CONSTANT_POINTED 9
+#define PAN_MIDLINE_CONSTANT_SERIFED 10
+#define PAN_MIDLINE_LOW_TRIMMED 11
+#define PAN_MIDLINE_LOW_POINTED 12
+#define PAN_MIDLINE_LOW_SERIFED 13
+#define PAN_XHEIGHT_CONSTANT_SMALL 2
+#define PAN_XHEIGHT_CONSTANT_STD 3
+#define PAN_XHEIGHT_CONSTANT_LARGE 4
+#define PAN_XHEIGHT_DUCKING_SMALL 5
+#define PAN_XHEIGHT_DUCKING_STD 6
+#define PAN_XHEIGHT_DUCKING_LARGE 7
+#define FS_LATIN1 1
+#define FS_LATIN2 2
+#define FS_CYRILLIC 4
+#define FS_GREEK 8
+#define FS_TURKISH 16
+#define FS_HEBREW 32
+#define FS_ARABIC 64
+#define FS_BALTIC 128
+#define FS_THAI 0x10000
+#define FS_JISJAPAN 0x20000
+#define FS_CHINESESIMP 0x40000
+#define FS_WANSUNG 0x80000
+#define FS_CHINESETRAD 0x100000
+#define FS_JOHAB 0x200000
+#define FS_SYMBOL 0x80000000
+#define HS_BDIAGONAL 3
+#define HS_CROSS 4
+#define HS_DIAGCROSS 5
+#define HS_FDIAGONAL 2
+#define HS_HORIZONTAL 0
+#define HS_VERTICAL 1
+#define PS_GEOMETRIC 65536
+#define PS_COSMETIC 0
+#define PS_ALTERNATE 8
+#define PS_SOLID 0
+#define PS_DASH 1
+#define PS_DOT 2
+#define PS_DASHDOT 3
+#define PS_DASHDOTDOT 4
+#define PS_NULL 5
+#define PS_USERSTYLE 7
+#define PS_INSIDEFRAME 6
+#define PS_ENDCAP_ROUND 0
+#define PS_ENDCAP_SQUARE 256
+#define PS_ENDCAP_FLAT 512
+#define PS_JOIN_BEVEL 4096
+#define PS_JOIN_MITER 8192
+#define PS_JOIN_ROUND 0
+#define PS_STYLE_MASK 15
+#define PS_ENDCAP_MASK 3840
+#define PS_TYPE_MASK 983040
+#define ALTERNATE 1
+#define WINDING 2
+#define DC_BINNAMES 12
+#define DC_BINS 6
+#define DC_COPIES 18
+#define DC_DRIVER 11
+#define DC_DATATYPE_PRODUCED 21
+#define DC_DUPLEX 7
+#define DC_EMF_COMPLIANT 20
+#define DC_ENUMRESOLUTIONS 13
+#define DC_EXTRA 9
+#define DC_FIELDS 1
+#define DC_FILEDEPENDENCIES 14
+#define DC_MAXEXTENT 5
+#define DC_MINEXTENT 4
+#define DC_ORIENTATION 17
+#define DC_PAPERNAMES 16
+#define DC_PAPERS 2
+#define DC_PAPERSIZE 3
+#define DC_SIZE 8
+#define DC_TRUETYPE 15
+#define DCTT_BITMAP 1
+#define DCTT_DOWNLOAD 2
+#define DCTT_SUBDEV 4
+#define DCTT_DOWNLOAD_OUTLINE 8
+#define DC_VERSION 10
+#define DC_BINADJUST 19
+#define DC_EMF_COMPLIANT 20
+#define DC_DATATYPE_PRODUCED 21
+#define DC_MANUFACTURER 23
+#define DC_MODEL 24
+#define DCBA_FACEUPNONE 0
+#define DCBA_FACEUPCENTER 1
+#define DCBA_FACEUPLEFT 2
+#define DCBA_FACEUPRIGHT 3
+#define DCBA_FACEDOWNNONE 256
+#define DCBA_FACEDOWNCENTER 257
+#define DCBA_FACEDOWNLEFT 258
+#define DCBA_FACEDOWNRIGHT 259
+#define FLOODFILLBORDER 0
+#define FLOODFILLSURFACE 1
+#define ETO_CLIPPED 4
+#define ETO_GLYPH_INDEX 16
+#define ETO_OPAQUE 2
+#define ETO_RTLREADING 128
+#define GDICOMMENT_WINDOWS_METAFILE (-2147483647)
+#define GDICOMMENT_BEGINGROUP 2
+#define GDICOMMENT_ENDGROUP 3
+#define GDICOMMENT_MULTIFORMATS 1073741828
+#define GDICOMMENT_IDENTIFIER 1128875079
+#define AD_COUNTERCLOCKWISE 1
+#define AD_CLOCKWISE 2
+#define RDH_RECTANGLES 1
+#define GCPCLASS_LATIN 1
+#define GCPCLASS_HEBREW 2
+#define GCPCLASS_ARABIC 2
+#define GCPCLASS_NEUTRAL 3
+#define GCPCLASS_LOCALNUMBER 4
+#define GCPCLASS_LATINNUMBER 5
+#define GCPCLASS_LATINNUMERICTERMINATOR 6
+#define GCPCLASS_LATINNUMERICSEPARATOR 7
+#define GCPCLASS_NUMERICSEPARATOR 8
+#define GCPCLASS_PREBOUNDLTR 128
+#define GCPCLASS_PREBOUNDRTL 64
+#define GCPCLASS_POSTBOUNDLTR 32
+#define GCPCLASS_POSTBOUNDRTL 16
+#define GCPGLYPH_LINKBEFORE 0x8000
+#define GCPGLYPH_LINKAFTER 0x4000
+#define DCB_DISABLE 8
+#define DCB_ENABLE 4
+#define DCB_RESET 1
+#define DCB_SET 3
+#define DCB_ACCUMULATE 2
+#define DCB_DIRTY 2
+#define OBJ_BRUSH 2
+#define OBJ_PEN 1
+#define OBJ_PAL 5
+#define OBJ_FONT 6
+#define OBJ_BITMAP 7
+#define OBJ_EXTPEN 11
+#define OBJ_REGION 8
+#define OBJ_DC 3
+#define OBJ_MEMDC 10
+#define OBJ_METAFILE 9
+#define OBJ_METADC 4
+#define OBJ_ENHMETAFILE 13
+#define OBJ_ENHMETADC 12
+#define DRIVERVERSION 0
+#define TECHNOLOGY 2
+#define DT_PLOTTER 0
+#define DT_RASDISPLAY 1
+#define DT_RASPRINTER 2
+#define DT_RASCAMERA 3
+#define DT_CHARSTREAM 4
+#define DT_METAFILE 5
+#define DT_DISPFILE 6
+#define HORZSIZE 4
+#define VERTSIZE 6
+#define HORZRES 8
+#define VERTRES 10
+#define LOGPIXELSX 88
+#define LOGPIXELSY 90
+#define BITSPIXEL 12
+#define PLANES 14
+#define NUMBRUSHES 16
+#define NUMPENS 18
+#define NUMFONTS 22
+#define NUMCOLORS 24
+#define NUMMARKERS 20
+#define ASPECTX 40
+#define ASPECTY 42
+#define ASPECTXY 44
+#define PDEVICESIZE 26
+#define CLIPCAPS 36
+#define SIZEPALETTE 104
+#define NUMRESERVED 106
+#define COLORRES 108
+#define PHYSICALWIDTH 110
+#define PHYSICALHEIGHT 111
+#define PHYSICALOFFSETX 112
+#define PHYSICALOFFSETY 113
+#define SCALINGFACTORX 114
+#define SCALINGFACTORY 115
+#define VREFRESH 116
+#define DESKTOPHORZRES 118
+#define DESKTOPVERTRES 117
+#define BLTALIGNMENT 119
+#define RASTERCAPS 38
+#define RC_BANDING 2
+#define RC_BITBLT 1
+#define RC_BITMAP64 8
+#define RC_DI_BITMAP 128
+#define RC_DIBTODEV 512
+#define RC_FLOODFILL 4096
+#define RC_GDI20_OUTPUT 16
+#define RC_PALETTE 256
+#define RC_SCALING 4
+#define RC_STRETCHBLT 2048
+#define RC_STRETCHDIB 8192
+#define RC_DEVBITS 0x8000
+#define RC_OP_DX_OUTPUT 0x4000
+#define CURVECAPS 28
+#define CC_NONE 0
+#define CC_CIRCLES 1
+#define CC_PIE 2
+#define CC_CHORD 4
+#define CC_ELLIPSES 8
+#define CC_WIDE 16
+#define CC_STYLED 32
+#define CC_WIDESTYLED 64
+#define CC_INTERIORS 128
+#define CC_ROUNDRECT 256
+#define LINECAPS 30
+#define LC_NONE 0
+#define LC_POLYLINE 2
+#define LC_MARKER 4
+#define LC_POLYMARKER 8
+#define LC_WIDE 16
+#define LC_STYLED 32
+#define LC_WIDESTYLED 64
+#define LC_INTERIORS 128
+#define POLYGONALCAPS 32
+#define RC_BANDING 2
+#define RC_BIGFONT 1024
+#define RC_BITBLT 1
+#define RC_BITMAP64 8
+#define RC_DEVBITS 0x8000
+#define RC_DI_BITMAP 128
+#define RC_GDI20_OUTPUT 16
+#define RC_GDI20_STATE 32
+#define RC_NONE 0
+#define RC_OP_DX_OUTPUT 0x4000
+#define RC_PALETTE 256
+#define RC_SAVEBITMAP 64
+#define RC_SCALING 4
+#define PC_NONE 0
+#define PC_POLYGON 1
+#define PC_POLYPOLYGON 256
+#define PC_PATHS 512
+#define PC_RECTANGLE 2
+#define PC_WINDPOLYGON 4
+#define PC_SCANLINE 8
+#define PC_TRAPEZOID 4
+#define PC_WIDE 16
+#define PC_STYLED 32
+#define PC_WIDESTYLED 64
+#define PC_INTERIORS 128
+#define PC_PATHS 512
+#define TEXTCAPS 34
+#define TC_OP_CHARACTER 1
+#define TC_OP_STROKE 2
+#define TC_CP_STROKE 4
+#define TC_CR_90 8
+#define TC_CR_ANY 16
+#define TC_SF_X_YINDEP 32
+#define TC_SA_DOUBLE 64
+#define TC_SA_INTEGER 128
+#define TC_SA_CONTIN 256
+#define TC_EA_DOUBLE 512
+#define TC_IA_ABLE 1024
+#define TC_UA_ABLE 2048
+#define TC_SO_ABLE 4096
+#define TC_RA_ABLE 8192
+#define TC_VA_ABLE 16384
+#define TC_RESERVED 32768
+#define TC_SCROLLBLT 65536
+#define GCP_DBCS 1
+#define GCP_ERROR 0x8000
+#define GCP_CLASSIN 0x80000
+#define GCP_DIACRITIC 256
+#define GCP_DISPLAYZWG 0x400000
+#define GCP_GLYPHSHAPE 16
+#define GCP_JUSTIFY 0x10000
+#define GCP_JUSTIFYIN 0x200000
+#define GCP_KASHIDA 1024
+#define GCP_LIGATE 32
+#define GCP_MAXEXTENT 0x100000
+#define GCP_NEUTRALOVERRIDE 0x2000000
+#define GCP_NUMERICOVERRIDE 0x1000000
+#define GCP_NUMERICSLATIN 0x4000000
+#define GCP_NUMERICSLOCAL 0x8000000
+#define GCP_REORDER 2
+#define GCP_SYMSWAPOFF 0x800000
+#define GCP_USEKERNING 8
+#define FLI_GLYPHS 0x40000
+#define FLI_MASK 0x103b
+#define GGO_BITMAP 1
+#define GGO_NATIVE 2
+#define GGO_METRICS 0
+#define GGO_GRAY2_BITMAP 4
+#define GGO_GRAY4_BITMAP 5
+#define GGO_GRAY8_BITMAP 6
+#define GGO_GLYPH_INDEX 128
+#define GM_COMPATIBLE 1
+#define GM_ADVANCED 2
+#define MM_ANISOTROPIC 8
+#define MM_HIENGLISH 5
+#define MM_HIMETRIC 3
+#define MM_ISOTROPIC 7
+#define MM_LOENGLISH 4
+#define MM_LOMETRIC 2
+#define MM_TEXT 1
+#define MM_TWIPS 6
+#define MM_MAX_FIXEDSCALE MM_TWIPS
+#define ABSOLUTE 1
+#define RELATIVE 2
+#define PC_EXPLICIT 2
+#define PC_NOCOLLAPSE 4
+#define PC_RESERVED 1
+#define CLR_NONE 0xffffffff
+#define CLR_INVALID CLR_NONE
+#define CLR_DEFAULT 0xff000000
+#define PT_MOVETO 6
+#define PT_LINETO 2
+#define PT_BEZIERTO 4
+#define PT_CLOSEFIGURE 1
+#define TT_AVAILABLE 1
+#define TT_ENABLED 2
+#define BLACK_BRUSH 4
+#define DKGRAY_BRUSH 3
+#define GRAY_BRUSH 2
+#define HOLLOW_BRUSH 5
+#define LTGRAY_BRUSH 1
+#define NULL_BRUSH 5
+#define WHITE_BRUSH 0
+#define BLACK_PEN 7
+#define NULL_PEN 8
+#define WHITE_PEN 6
+#define ANSI_FIXED_FONT 11
+#define ANSI_VAR_FONT 12
+#define DEVICE_DEFAULT_FONT 14
+#define DEFAULT_GUI_FONT 17
+#define OEM_FIXED_FONT 10
+#define SYSTEM_FONT 13
+#define SYSTEM_FIXED_FONT 16
+#define DEFAULT_PALETTE 15
+#define SYSPAL_NOSTATIC 2
+#define SYSPAL_STATIC 1
+#define SYSPAL_ERROR 0
+#define TA_BASELINE 24
+#define TA_BOTTOM 8
+#define TA_TOP 0
+#define TA_CENTER 6
+#define TA_LEFT 0
+#define TA_RIGHT 2
+#define TA_RTLREADING 256
+#define TA_NOUPDATECP 0
+#define TA_UPDATECP 1
+#define TA_MASK (TA_BASELINE+TA_CENTER+TA_UPDATECP+TA_RTLREADING)
+#define VTA_BASELINE 24
+#define VTA_CENTER 6
+#define VTA_LEFT TA_BOTTOM
+#define VTA_RIGHT TA_TOP
+#define VTA_BOTTOM TA_RIGHT
+#define VTA_TOP TA_LEFT
+#define MWT_IDENTITY 1
+#define MWT_LEFTMULTIPLY 2
+#define MWT_RIGHTMULTIPLY 3
+#define OPAQUE 2
+#define TRANSPARENT 1
+#define BLACKONWHITE 1
+#define WHITEONBLACK 2
+#define COLORONCOLOR 3
+#define HALFTONE 4
+#define MAXSTRETCHBLTMODE 4
+#define STRETCH_ANDSCANS 1
+#define STRETCH_DELETESCANS 3
+#define STRETCH_HALFTONE 4
+#define STRETCH_ORSCANS 2
+#define TCI_SRCCHARSET 1
+#define TCI_SRCCODEPAGE 2
+#define TCI_SRCFONTSIG 3
+#define ICM_ON 2
+#define ICM_OFF 1
+#define ICM_QUERY 3
+#define NEWFRAME 1
+#define ABORTDOC 2
+#define NEXTBAND 3
+#define SETCOLORTABLE 4
+#define GETCOLORTABLE 5
+#define FLUSHOUTPUT 6
+#define DRAFTMODE 7
+#define QUERYESCSUPPORT 8
+#define SETABORTPROC 9
+#define STARTDOC 10
+#define ENDDOC 11
+#define GETPHYSPAGESIZE 12
+#define GETPRINTINGOFFSET 13
+#define GETSCALINGFACTOR 14
+#define MFCOMMENT 15
+#define GETPENWIDTH 16
+#define SETCOPYCOUNT 17
+#define SELECTPAPERSOURCE 18
+#define DEVICEDATA 19
+#define PASSTHROUGH 19
+#define GETTECHNOLGY 20
+#define GETTECHNOLOGY 20
+#define SETLINECAP 21
+#define SETLINEJOIN 22
+#define SETMITERLIMIT 23
+#define BANDINFO 24
+#define DRAWPATTERNRECT 25
+#define GETVECTORPENSIZE 26
+#define GETVECTORBRUSHSIZE 27
+#define ENABLEDUPLEX 28
+#define GETSETPAPERBINS 29
+#define GETSETPRINTORIENT 30
+#define ENUMPAPERBINS 31
+#define SETDIBSCALING 32
+#define EPSPRINTING 33
+#define ENUMPAPERMETRICS 34
+#define GETSETPAPERMETRICS 35
+#define POSTSCRIPT_DATA 37
+#define POSTSCRIPT_IGNORE 38
+#define MOUSETRAILS 39
+#define GETDEVICEUNITS 42
+#define GETEXTENDEDTEXTMETRICS 256
+#define GETEXTENTTABLE 257
+#define GETPAIRKERNTABLE 258
+#define GETTRACKKERNTABLE 259
+#define EXTTEXTOUT 512
+#define GETFACENAME 513
+#define DOWNLOADFACE 514
+#define ENABLERELATIVEWIDTHS 768
+#define ENABLEPAIRKERNING 769
+#define SETKERNTRACK 770
+#define SETALLJUSTVALUES 771
+#define SETCHARSET 772
+#define STRETCHBLT 2048
+#define GETSETSCREENPARAMS 3072
+#define QUERYDIBSUPPORT 3073
+#define BEGIN_PATH 4096
+#define CLIP_TO_PATH 4097
+#define END_PATH 4098
+#define EXT_DEVICE_CAPS 4099
+#define RESTORE_CTM 4100
+#define SAVE_CTM 4101
+#define SET_ARC_DIRECTION 4102
+#define SET_BACKGROUND_COLOR 4103
+#define SET_POLY_MODE 4104
+#define SET_SCREEN_ANGLE 4105
+#define SET_SPREAD 4106
+#define TRANSFORM_CTM 4107
+#define SET_CLIP_BOX 4108
+#define SET_BOUNDS 4109
+#define SET_MIRROR_MODE 4110
+#define OPENCHANNEL 4110
+#define DOWNLOADHEADER 4111
+#define CLOSECHANNEL 4112
+#define POSTSCRIPT_PASSTHROUGH 4115
+#define ENCAPSULATED_POSTSCRIPT 4116
+#define QDI_SETDIBITS 1
+#define QDI_GETDIBITS 2
+#define QDI_DIBTOSCREEN 4
+#define QDI_STRETCHDIB 8
+#define SP_NOTREPORTED 0x4000
+#define PR_JOBSTATUS 0
+#define ASPECT_FILTERING 1
+#define BS_SOLID 0
+#define BS_NULL 1
+#define BS_HOLLOW 1
+#define BS_HATCHED 2
+#define BS_PATTERN 3
+#define BS_INDEXED 4
+#define BS_DIBPATTERN 5
+#define BS_DIBPATTERNPT 6
+#define BS_PATTERN8X8 7
+#define BS_DIBPATTERN8X8 8
+#define LCS_CALIBRATED_RGB 0
+#define LCS_DEVICE_RGB 1
+#define LCS_DEVICE_CMYK 2
+#define LCS_GM_BUSINESS 1
+#define LCS_GM_GRAPHICS 2
+#define LCS_GM_IMAGES 4
+#define RASTER_FONTTYPE 1
+#define DEVICE_FONTTYPE 2
+#define TRUETYPE_FONTTYPE 4
+#define DMORIENT_PORTRAIT 1
+#define DMORIENT_LANDSCAPE 2
+#define DMPAPER_FIRST 1
+#define DMPAPER_LETTER 1
+#define DMPAPER_LETTERSMALL 2
+#define DMPAPER_TABLOID 3
+#define DMPAPER_LEDGER 4
+#define DMPAPER_LEGAL 5
+#define DMPAPER_STATEMENT 6
+#define DMPAPER_EXECUTIVE 7
+#define DMPAPER_A3 8
+#define DMPAPER_A4 9
+#define DMPAPER_A4SMALL 10
+#define DMPAPER_A5 11
+#define DMPAPER_B4 12
+#define DMPAPER_B5 13
+#define DMPAPER_FOLIO 14
+#define DMPAPER_QUARTO 15
+#define DMPAPER_10X14 16
+#define DMPAPER_11X17 17
+#define DMPAPER_NOTE 18
+#define DMPAPER_ENV_9 19
+#define DMPAPER_ENV_10 20
+#define DMPAPER_ENV_11 21
+#define DMPAPER_ENV_12 22
+#define DMPAPER_ENV_14 23
+#define DMPAPER_CSHEET 24
+#define DMPAPER_DSHEET 25
+#define DMPAPER_ESHEET 26
+#define DMPAPER_ENV_DL 27
+#define DMPAPER_ENV_C5 28
+#define DMPAPER_ENV_C3 29
+#define DMPAPER_ENV_C4 30
+#define DMPAPER_ENV_C6 31
+#define DMPAPER_ENV_C65 32
+#define DMPAPER_ENV_B4 33
+#define DMPAPER_ENV_B5 34
+#define DMPAPER_ENV_B6 35
+#define DMPAPER_ENV_ITALY 36
+#define DMPAPER_ENV_MONARCH 37
+#define DMPAPER_ENV_PERSONAL 38
+#define DMPAPER_FANFOLD_US 39
+#define DMPAPER_FANFOLD_STD_GERMAN 40
+#define DMPAPER_FANFOLD_LGL_GERMAN 41
+#define DMPAPER_ISO_B4 42
+#define DMPAPER_JAPANESE_POSTCARD 43
+#define DMPAPER_9X11 44
+#define DMPAPER_10X11 45
+#define DMPAPER_15X11 46
+#define DMPAPER_ENV_INVITE 47
+#define DMPAPER_RESERVED_48 48
+#define DMPAPER_RESERVED_49 49
+#define DMPAPER_LETTER_EXTRA 50
+#define DMPAPER_LEGAL_EXTRA 51
+#define DMPAPER_TABLOID_EXTRA 52
+#define DMPAPER_A4_EXTRA 53
+#define DMPAPER_LETTER_TRANSVERSE 54
+#define DMPAPER_A4_TRANSVERSE 55
+#define DMPAPER_LETTER_EXTRA_TRANSVERSE 56
+#define DMPAPER_A_PLUS 57
+#define DMPAPER_B_PLUS 58
+#define DMPAPER_LETTER_PLUS 59
+#define DMPAPER_A4_PLUS 60
+#define DMPAPER_A5_TRANSVERSE 61
+#define DMPAPER_B5_TRANSVERSE 62
+#define DMPAPER_A3_EXTRA 63
+#define DMPAPER_A5_EXTRA 64
+#define DMPAPER_B5_EXTRA 65
+#define DMPAPER_A2 66
+#define DMPAPER_A3_TRANSVERSE 67
+#define DMPAPER_A3_EXTRA_TRANSVERSE 68
+#define DMPAPER_LAST 68
+#define DMPAPER_USER 256
+#define DMBIN_FIRST 1
+#define DMBIN_UPPER 1
+#define DMBIN_ONLYONE 1
+#define DMBIN_LOWER 2
+#define DMBIN_MIDDLE 3
+#define DMBIN_MANUAL 4
+#define DMBIN_ENVELOPE 5
+#define DMBIN_ENVMANUAL 6
+#define DMBIN_AUTO 7
+#define DMBIN_TRACTOR 8
+#define DMBIN_SMALLFMT 9
+#define DMBIN_LARGEFMT 10
+#define DMBIN_LARGECAPACITY 11
+#define DMBIN_CASSETTE 14
+#define DMBIN_FORMSOURCE 15
+#define DMBIN_LAST 15
+#define DMBIN_USER 256
+#define DMRES_DRAFT (-1)
+#define DMRES_LOW (-2)
+#define DMRES_MEDIUM (-3)
+#define DMRES_HIGH (-4)
+#define DMCOLOR_MONOCHROME 1
+#define DMCOLOR_COLOR 2
+#define DMDUP_SIMPLEX 1
+#define DMDUP_VERTICAL 2
+#define DMDUP_HORIZONTAL 3
+#define DMTT_BITMAP 1
+#define DMTT_DOWNLOAD 2
+#define DMTT_SUBDEV 3
+#define DMTT_DOWNLOAD_OUTLINE 4
+#define DMCOLLATE_FALSE 0
+#define DMCOLLATE_TRUE 1
+#define DM_GRAYSCALE 1
+#define DM_INTERLACED 2
+#define DM_UPDATE 1
+#define DM_COPY 2
+#define DM_PROMPT 4
+#define DM_MODIFY 8
+#define DM_IN_BUFFER DM_MODIFY
+#define DM_IN_PROMPT DM_PROMPT
+#define DM_OUT_BUFFER DM_COPY
+#define DM_OUT_DEFAULT DM_UPDATE
+#define DM_ORIENTATION 1
+#define DM_PAPERSIZE 2
+#define DM_PAPERLENGTH 4
+#define DM_PAPERWIDTH 8
+#define DM_SCALE 16
+#define DM_COPIES 256
+#define DM_DEFAULTSOURCE 512
+#define DM_PRINTQUALITY 1024
+#define DM_COLOR 2048
+#define DM_DUPLEX 4096
+#define DM_YRESOLUTION 8192
+#define DM_TTOPTION 16384
+#define DM_COLLATE 32768
+#define DM_FORMNAME 65536
+#define DM_LOGPIXELS 0x20000
+#define DM_BITSPERPEL 0x40000
+#define DM_PELSWIDTH 0x80000
+#define DM_PELSHEIGHT 0x100000
+#define DM_DISPLAYFLAGS 0x200000
+#define DM_DISPLAYFREQUENCY 0x400000
+#define DM_ICMMETHOD 0x800000
+#define DM_ICMINTENT 0x1000000
+#define DM_MEDIATYPE 0x2000000
+#define DM_DITHERTYPE 0x4000000
+#define DMICMMETHOD_NONE 1
+#define DMICMMETHOD_SYSTEM 2
+#define DMICMMETHOD_DRIVER 3
+#define DMICMMETHOD_DEVICE 4
+#define DMICMMETHOD_USER 256
+#define DMICM_SATURATE 1
+#define DMICM_CONTRAST 2
+#define DMICM_COLORMETRIC 3
+#define DMICM_USER 256
+#define DMMEDIA_STANDARD 1
+#define DMMEDIA_TRANSPARENCY 2
+#define DMMEDIA_GLOSSY 3
+#define DMMEDIA_USER 256
+#define DMDITHER_NONE 1
+#define DMDITHER_COARSE 2
+#define DMDITHER_FINE 3
+#define DMDITHER_LINEART 4
+#define DMDITHER_ERRORDIFFUSION 5
+#define DMDITHER_RESERVED6 6
+#define DMDITHER_RESERVED7 7
+#define DMDITHER_RESERVED8 8
+#define DMDITHER_RESERVED9 9
+#define DMDITHER_GRAYSCALE 10
+#define DMDITHER_USER 256
+#define GDI_ERROR 0xFFFFFFFF
+#define HGDI_ERROR ((HANDLE)GDI_ERROR)
+#define TMPF_FIXED_PITCH 1
+#define TMPF_VECTOR 2
+#define TMPF_TRUETYPE 4
+#define TMPF_DEVICE 8
+#define NTM_ITALIC 1
+#define NTM_BOLD 32
+#define NTM_REGULAR 64
+#define TT_POLYGON_TYPE 24
+#define TT_PRIM_LINE 1
+#define TT_PRIM_QSPLINE 2
+#define FONTMAPPER_MAX 10
+#define ENHMETA_STOCK_OBJECT 0x80000000
+#define WGL_FONT_LINES 0
+#define WGL_FONT_POLYGONS 1
+#define LPD_DOUBLEBUFFER 1
+#define LPD_STEREO 2
+#define LPD_SUPPORT_GDI 16
+#define LPD_SUPPORT_OPENGL 32
+#define LPD_SHARE_DEPTH 64
+#define LPD_SHARE_STENCIL 128
+#define LPD_SHARE_ACCUM 256
+#define LPD_SWAP_EXCHANGE 512
+#define LPD_SWAP_COPY 1024
+#define LPD_TRANSPARENT 4096
+#define LPD_TYPE_RGBA 0
+#define LPD_TYPE_COLORINDEX 1
+#define WGL_SWAP_MAIN_PLANE 1
+#define WGL_SWAP_OVERLAY1 2
+#define WGL_SWAP_OVERLAY2 4
+#define WGL_SWAP_OVERLAY3 8
+#define WGL_SWAP_OVERLAY4 16
+#define WGL_SWAP_OVERLAY5 32
+#define WGL_SWAP_OVERLAY6 64
+#define WGL_SWAP_OVERLAY7 128
+#define WGL_SWAP_OVERLAY8 256
+#define WGL_SWAP_OVERLAY9 512
+#define WGL_SWAP_OVERLAY10 1024
+#define WGL_SWAP_OVERLAY11 2048
+#define WGL_SWAP_OVERLAY12 4096
+#define WGL_SWAP_OVERLAY13 8192
+#define WGL_SWAP_OVERLAY14 16384
+#define WGL_SWAP_OVERLAY15 32768
+#define WGL_SWAP_UNDERLAY1 65536
+#define WGL_SWAP_UNDERLAY2 0x20000
+#define WGL_SWAP_UNDERLAY3 0x40000
+#define WGL_SWAP_UNDERLAY4 0x80000
+#define WGL_SWAP_UNDERLAY5 0x100000
+#define WGL_SWAP_UNDERLAY6 0x200000
+#define WGL_SWAP_UNDERLAY7 0x400000
+#define WGL_SWAP_UNDERLAY8 0x800000
+#define WGL_SWAP_UNDERLAY9 0x1000000
+#define WGL_SWAP_UNDERLAY10 0x2000000
+#define WGL_SWAP_UNDERLAY11 0x4000000
+#define WGL_SWAP_UNDERLAY12 0x8000000
+#define WGL_SWAP_UNDERLAY13 0x10000000
+#define WGL_SWAP_UNDERLAY14 0x20000000
+#define WGL_SWAP_UNDERLAY15 0x40000000
+
+#ifndef RC_INVOKED
+typedef struct _ABC {
+ int abcA;
+ UINT abcB;
+ int abcC;
+} ABC,*LPABC;
+typedef struct _ABCFLOAT {
+ FLOAT abcfA;
+ FLOAT abcfB;
+ FLOAT abcfC;
+} ABCFLOAT,*LPABCFLOAT;
+typedef struct tagBITMAP {
+ LONG bmType;
+ LONG bmWidth;
+ LONG bmHeight;
+ LONG bmWidthBytes;
+ WORD bmPlanes;
+ WORD bmBitsPixel;
+ LPVOID bmBits;
+} BITMAP,*PBITMAP,*LPBITMAP;
+typedef struct tagBITMAPCOREHEADER {
+ DWORD bcSize;
+ WORD bcWidth;
+ WORD bcHeight;
+ WORD bcPlanes;
+ WORD bcBitCount;
+} BITMAPCOREHEADER,*LPBITMAPCOREHEADER,*PBITMAPCOREHEADER;
+#pragma pack(push,1)
+typedef struct tagRGBTRIPLE {
+ BYTE rgbtBlue;
+ BYTE rgbtGreen;
+ BYTE rgbtRed;
+} RGBTRIPLE;
+#pragma pack(pop)
+#pragma pack(push,2)
+typedef struct tagBITMAPFILEHEADER {
+ WORD bfType;
+ DWORD bfSize;
+ WORD bfReserved1;
+ WORD bfReserved2;
+ DWORD bfOffBits;
+} BITMAPFILEHEADER,*LPBITMAPFILEHEADER,*PBITMAPFILEHEADER;
+#pragma pack(pop)
+typedef struct _BITMAPCOREINFO {
+ BITMAPCOREHEADER bmciHeader;
+ RGBTRIPLE bmciColors[1];
+} BITMAPCOREINFO,*LPBITMAPCOREINFO,*PBITMAPCOREINFO;
+typedef struct tagBITMAPINFOHEADER{
+ DWORD biSize;
+ LONG biWidth;
+ LONG biHeight;
+ WORD biPlanes;
+ WORD biBitCount;
+ DWORD biCompression;
+ DWORD biSizeImage;
+ LONG biXPelsPerMeter;
+ LONG biYPelsPerMeter;
+ DWORD biClrUsed;
+ DWORD biClrImportant;
+} BITMAPINFOHEADER,*LPBITMAPINFOHEADER,*PBITMAPINFOHEADER;
+typedef struct tagRGBQUAD {
+ BYTE rgbBlue;
+ BYTE rgbGreen;
+ BYTE rgbRed;
+ BYTE rgbReserved;
+} RGBQUAD;
+typedef struct tagBITMAPINFO {
+ BITMAPINFOHEADER bmiHeader;
+ RGBQUAD bmiColors[1];
+} BITMAPINFO,*LPBITMAPINFO,*PBITMAPINFO;
+typedef long FXPT16DOT16,*LPFXPT16DOT16;
+typedef long FXPT2DOT30,*LPFXPT2DOT30;
+typedef struct tagCIEXYZ {
+ FXPT2DOT30 ciexyzX;
+ FXPT2DOT30 ciexyzY;
+ FXPT2DOT30 ciexyzZ;
+} CIEXYZ,*LPCIEXYZ;
+typedef struct tagCIEXYZTRIPLE {
+ CIEXYZ ciexyzRed;
+ CIEXYZ ciexyzGreen;
+ CIEXYZ ciexyzBlue;
+} CIEXYZTRIPLE,*LPCIEXYZTRIPLE;
+typedef struct {
+ DWORD bV4Size;
+ LONG bV4Width;
+ LONG bV4Height;
+ WORD bV4Planes;
+ WORD bV4BitCount;
+ DWORD bV4V4Compression;
+ DWORD bV4SizeImage;
+ LONG bV4XPelsPerMeter;
+ LONG bV4YPelsPerMeter;
+ DWORD bV4ClrUsed;
+ DWORD bV4ClrImportant;
+ DWORD bV4RedMask;
+ DWORD bV4GreenMask;
+ DWORD bV4BlueMask;
+ DWORD bV4AlphaMask;
+ DWORD bV4CSType;
+ CIEXYZTRIPLE bV4Endpoints;
+ DWORD bV4GammaRed;
+ DWORD bV4GammaGreen;
+ DWORD bV4GammaBlue;
+} BITMAPV4HEADER,*LPBITMAPV4HEADER,*PBITMAPV4HEADER;
+typedef struct tagFONTSIGNATURE {
+ DWORD fsUsb[4];
+ DWORD fsCsb[2];
+} FONTSIGNATURE,*LPFONTSIGNATURE;
+typedef struct {
+ UINT ciCharset;
+ UINT ciACP;
+ FONTSIGNATURE fs;
+} CHARSETINFO,*LPCHARSETINFO;
+typedef struct tagCOLORADJUSTMENT {
+ WORD caSize;
+ WORD caFlags;
+ WORD caIlluminantIndex;
+ WORD caRedGamma;
+ WORD caGreenGamma;
+ WORD caBlueGamma;
+ WORD caReferenceBlack;
+ WORD caReferenceWhite;
+ SHORT caContrast;
+ SHORT caBrightness;
+ SHORT caColorfulness;
+ SHORT caRedGreenTint;
+} COLORADJUSTMENT,*LPCOLORADJUSTMENT;
+typedef struct _devicemodeA {
+ BYTE dmDeviceName[CCHDEVICENAME];
+ WORD dmSpecVersion;
+ WORD dmDriverVersion;
+ WORD dmSize;
+ WORD dmDriverExtra;
+ DWORD dmFields;
+ short dmOrientation;
+ short dmPaperSize;
+ short dmPaperLength;
+ short dmPaperWidth;
+ short dmScale;
+ short dmCopies;
+ short dmDefaultSource;
+ short dmPrintQuality;
+ short dmColor;
+ short dmDuplex;
+ short dmYResolution;
+ short dmTTOption;
+ short dmCollate;
+ BYTE dmFormName[CCHFORMNAME];
+ WORD dmLogPixels;
+ DWORD dmBitsPerPel;
+ DWORD dmPelsWidth;
+ DWORD dmPelsHeight;
+ DWORD dmDisplayFlags;
+ DWORD dmDisplayFrequency;
+ DWORD dmICMMethod;
+ DWORD dmICMIntent;
+ DWORD dmMediaType;
+ DWORD dmDitherType;
+ DWORD dmICCManufacturer;
+ DWORD dmICCModel;
+} DEVMODEA,*LPDEVMODEA,*PDEVMODEA;
+typedef struct _devicemodeW {
+ WCHAR dmDeviceName[CCHDEVICENAME];
+ WORD dmSpecVersion;
+ WORD dmDriverVersion;
+ WORD dmSize;
+ WORD dmDriverExtra;
+ DWORD dmFields;
+ short dmOrientation;
+ short dmPaperSize;
+ short dmPaperLength;
+ short dmPaperWidth;
+ short dmScale;
+ short dmCopies;
+ short dmDefaultSource;
+ short dmPrintQuality;
+ short dmColor;
+ short dmDuplex;
+ short dmYResolution;
+ short dmTTOption;
+ short dmCollate;
+ WCHAR dmFormName[CCHFORMNAME];
+ WORD dmLogPixels;
+ DWORD dmBitsPerPel;
+ DWORD dmPelsWidth;
+ DWORD dmPelsHeight;
+ DWORD dmDisplayFlags;
+ DWORD dmDisplayFrequency;
+ DWORD dmICMMethod;
+ DWORD dmICMIntent;
+ DWORD dmMediaType;
+ DWORD dmDitherType;
+ DWORD dmICCManufacturer;
+ DWORD dmICCModel;
+} DEVMODEW,*LPDEVMODEW,*PDEVMODEW;
+typedef struct tagDIBSECTION {
+ BITMAP dsBm;
+ BITMAPINFOHEADER dsBmih;
+ DWORD dsBitfields[3];
+ HANDLE dshSection;
+ DWORD dsOffset;
+} DIBSECTION;
+typedef struct {
+ int cbSize;
+ LPCTSTR lpszDocName;
+ LPCTSTR lpszOutput;
+ LPCTSTR lpszDatatype;
+ DWORD fwType;
+} DOCINFO,*LPDOCINFO;
+typedef struct tagEMR {
+ DWORD iType;
+ DWORD nSize;
+} EMR,*PEMR;
+typedef struct tagEMRANGLEARC {
+ EMR emr;
+ POINTL ptlCenter;
+ DWORD nRadius;
+ FLOAT eStartAngle;
+ FLOAT eSweepAngle;
+} EMRANGLEARC,*PEMRANGLEARC;
+typedef struct tagEMRARC {
+ EMR emr;
+ RECTL rclBox;
+ POINTL ptlStart;
+ POINTL ptlEnd;
+} EMRARC,*PEMRARC,EMRARCTO,*PEMRARCTO,EMRCHORD,*PEMRCHORD,EMRPIE,*PEMRPIE;
+typedef struct _XFORM {
+ FLOAT eM11;
+ FLOAT eM12;
+ FLOAT eM21;
+ FLOAT eM22;
+ FLOAT eDx;
+ FLOAT eDy;
+} XFORM,*LPXFORM;
+typedef struct tagEMRBITBLT {
+ EMR emr;
+ RECTL rclBounds;
+ LONG xDest;
+ LONG yDest;
+ LONG cxDest;
+ LONG cyDest;
+ DWORD dwRop;
+ LONG xSrc;
+ LONG ySrc;
+ XFORM xformSrc;
+ COLORREF crBkColorSrc;
+ DWORD iUsageSrc;
+ DWORD offBmiSrc;
+ DWORD offBitsSrc;
+ DWORD cbBitsSrc;
+} EMRBITBLT,*PEMRBITBLT;
+typedef struct tagLOGBRUSH {
+ UINT lbStyle;
+ COLORREF lbColor;
+ LONG lbHatch;
+} LOGBRUSH,*LPLOGBRUSH;
+typedef LOGBRUSH PATTERN,*PPATTERN,*LPPATTERN;
+typedef struct tagEMRCREATEBRUSHINDIRECT {
+ EMR emr;
+ DWORD ihBrush;
+ LOGBRUSH lb;
+} EMRCREATEBRUSHINDIRECT,*PEMRCREATEBRUSHINDIRECT;
+typedef LONG LCSCSTYPE;
+typedef LONG LCSGAMUTMATCH;
+typedef struct tagLOGCOLORSPACEA {
+ DWORD lcsSignature;
+ DWORD lcsVersion;
+ DWORD lcsSize;
+ LCSCSTYPE lcsCSType;
+ LCSGAMUTMATCH lcsIntent;
+ CIEXYZTRIPLE lcsEndpoints;
+ DWORD lcsGammaRed;
+ DWORD lcsGammaGreen;
+ DWORD lcsGammaBlue;
+ CHAR lcsFilename[MAX_PATH];
+} LOGCOLORSPACEA,*LPLOGCOLORSPACEA;
+typedef struct tagLOGCOLORSPACEW {
+ DWORD lcsSignature;
+ DWORD lcsVersion;
+ DWORD lcsSize;
+ LCSCSTYPE lcsCSType;
+ LCSGAMUTMATCH lcsIntent;
+ CIEXYZTRIPLE lcsEndpoints;
+ DWORD lcsGammaRed;
+ DWORD lcsGammaGreen;
+ DWORD lcsGammaBlue;
+ WCHAR lcsFilename[MAX_PATH];
+} LOGCOLORSPACEW,*LPLOGCOLORSPACEW;
+typedef struct tagEMRCREATECOLORSPACE {
+ EMR emr;
+ DWORD ihCS;
+ LOGCOLORSPACEW lcs;
+} EMRCREATECOLORSPACE,*PEMRCREATECOLORSPACE;
+typedef struct tagEMRCREATEDIBPATTERNBRUSHPT {
+ EMR emr;
+ DWORD ihBrush;
+ DWORD iUsage;
+ DWORD offBmi;
+ DWORD cbBmi;
+ DWORD offBits;
+ DWORD cbBits;
+} EMRCREATEDIBPATTERNBRUSHPT,*PEMRCREATEDIBPATTERNBRUSHPT;
+typedef struct tagEMRCREATEMONOBRUSH {
+ EMR emr;
+ DWORD ihBrush;
+ DWORD iUsage;
+ DWORD offBmi;
+ DWORD cbBmi;
+ DWORD offBits;
+ DWORD cbBits;
+} EMRCREATEMONOBRUSH,*PEMRCREATEMONOBRUSH;
+typedef struct tagPALETTEENTRY {
+ BYTE peRed;
+ BYTE peGreen;
+ BYTE peBlue;
+ BYTE peFlags;
+} PALETTEENTRY,*LPPALETTEENTRY,*PPALETTEENTRY;
+typedef struct tagLOGPALETTE {
+ WORD palVersion;
+ WORD palNumEntries;
+ PALETTEENTRY palPalEntry[1];
+} LOGPALETTE,*NPLOGPALETTE,*PLOGPALETTE,*LPLOGPALETTE;
+typedef struct tagEMRCREATEPALETTE {
+ EMR emr;
+ DWORD ihPal;
+ LOGPALETTE lgpl;
+} EMRCREATEPALETTE,*PEMRCREATEPALETTE;
+typedef struct tagLOGPEN {
+ UINT lopnStyle;
+ POINT lopnWidth;
+ COLORREF lopnColor;
+} LOGPEN,*LPLOGPEN;
+typedef struct tagEMRCREATEPEN {
+ EMR emr;
+ DWORD ihPen;
+ LOGPEN lopn;
+} EMRCREATEPEN,*PEMRCREATEPEN;
+typedef struct tagEMRELLIPSE {
+ EMR emr;
+ RECTL rclBox;
+} EMRELLIPSE,*PEMRELLIPSE,EMRRECTANGLE,*PEMRRECTANGLE;
+typedef struct tagEMREOF {
+ EMR emr;
+ DWORD nPalEntries;
+ DWORD offPalEntries;
+ DWORD nSizeLast;
+} EMREOF,*PEMREOF;
+typedef struct tagEMREXCLUDECLIPRECT {
+ EMR emr;
+ RECTL rclClip;
+} EMREXCLUDECLIPRECT,*PEMREXCLUDECLIPRECT,EMRINTERSECTCLIPRECT,*PEMRINTERSECTCLIPRECT;
+typedef struct tagPANOSE {
+ BYTE bFamilyType;
+ BYTE bSerifStyle;
+ BYTE bWeight;
+ BYTE bProportion;
+ BYTE bContrast;
+ BYTE bStrokeVariation;
+ BYTE bArmStyle;
+ BYTE bLetterform;
+ BYTE bMidline;
+ BYTE bXHeight;
+} PANOSE;
+typedef struct tagLOGFONTA {
+ LONG lfHeight;
+ LONG lfWidth;
+ LONG lfEscapement;
+ LONG lfOrientation;
+ LONG lfWeight;
+ BYTE lfItalic;
+ BYTE lfUnderline;
+ BYTE lfStrikeOut;
+ BYTE lfCharSet;
+ BYTE lfOutPrecision;
+ BYTE lfClipPrecision;
+ BYTE lfQuality;
+ BYTE lfPitchAndFamily;
+ CHAR lfFaceName[LF_FACESIZE];
+} LOGFONTA,*PLOGFONTA,*LPLOGFONTA;
+typedef struct tagLOGFONTW {
+ LONG lfHeight;
+ LONG lfWidth;
+ LONG lfEscapement;
+ LONG lfOrientation;
+ LONG lfWeight;
+ BYTE lfItalic;
+ BYTE lfUnderline;
+ BYTE lfStrikeOut;
+ BYTE lfCharSet;
+ BYTE lfOutPrecision;
+ BYTE lfClipPrecision;
+ BYTE lfQuality;
+ BYTE lfPitchAndFamily;
+ WCHAR lfFaceName[LF_FACESIZE];
+} LOGFONTW,*PLOGFONTW,*LPLOGFONTW;
+typedef struct tagEXTLOGFONTA {
+ LOGFONTA elfLogFont;
+ BYTE elfFullName[LF_FULLFACESIZE];
+ BYTE elfStyle[LF_FACESIZE];
+ DWORD elfVersion;
+ DWORD elfStyleSize;
+ DWORD elfMatch;
+ DWORD elfReserved;
+ BYTE elfVendorId[ELF_VENDOR_SIZE];
+ DWORD elfCulture;
+ PANOSE elfPanose;
+} EXTLOGFONTA,*PEXTLOGFONTA,*LPEXTLOGFONTA;
+typedef struct tagEXTLOGFONTW {
+ LOGFONTW elfLogFont;
+ WCHAR elfFullName[LF_FULLFACESIZE];
+ WCHAR elfStyle[LF_FACESIZE];
+ DWORD elfVersion;
+ DWORD elfStyleSize;
+ DWORD elfMatch;
+ DWORD elfReserved;
+ BYTE elfVendorId[ELF_VENDOR_SIZE];
+ DWORD elfCulture;
+ PANOSE elfPanose;
+} EXTLOGFONTW,*PEXTLOGFONTW,*LPEXTLOGFONTW;
+typedef struct tagEMREXTCREATEFONTINDIRECTW {
+ EMR emr;
+ DWORD ihFont;
+ EXTLOGFONTW elfw;
+} EMREXTCREATEFONTINDIRECTW,*PEMREXTCREATEFONTINDIRECTW;
+typedef struct tagEXTLOGPEN {
+ UINT elpPenStyle;
+ UINT elpWidth;
+ UINT elpBrushStyle;
+ COLORREF elpColor;
+ LONG elpHatch;
+ DWORD elpNumEntries;
+ DWORD elpStyleEntry[1];
+} EXTLOGPEN,*PEXTLOGPEN,*LPEXTLOGPEN;
+typedef struct tagEMREXTCREATEPEN {
+ EMR emr;
+ DWORD ihPen;
+ DWORD offBmi;
+ DWORD cbBmi;
+ DWORD offBits;
+ DWORD cbBits;
+ EXTLOGPEN elp;
+} EMREXTCREATEPEN,*PEMREXTCREATEPEN;
+typedef struct tagEMREXTFLOODFILL {
+ EMR emr;
+ POINTL ptlStart;
+ COLORREF crColor;
+ DWORD iMode;
+} EMREXTFLOODFILL,*PEMREXTFLOODFILL;
+typedef struct tagEMREXTSELECTCLIPRGN {
+ EMR emr;
+ DWORD cbRgnData;
+ DWORD iMode;
+ BYTE RgnData[1];
+} EMREXTSELECTCLIPRGN,*PEMREXTSELECTCLIPRGN;
+typedef struct tagEMRTEXT {
+ POINTL ptlReference;
+ DWORD nChars;
+ DWORD offString;
+ DWORD fOptions;
+ RECTL rcl;
+ DWORD offDx;
+} EMRTEXT,*PEMRTEXT;
+typedef struct tagEMREXTTEXTOUTA {
+ EMR emr;
+ RECTL rclBounds;
+ DWORD iGraphicsMode;
+ FLOAT exScale;
+ FLOAT eyScale;
+ EMRTEXT emrtext;
+} EMREXTTEXTOUTA,*PEMREXTTEXTOUTA,EMREXTTEXTOUTW,*PEMREXTTEXTOUTW;
+typedef struct tagEMRFILLPATH {
+ EMR emr;
+ RECTL rclBounds;
+} EMRFILLPATH,*PEMRFILLPATH,EMRSTROKEANDFILLPATH,*PEMRSTROKEANDFILLPATH,EMRSTROKEPATH,*PEMRSTROKEPATH;
+typedef struct tagEMRFILLRGN {
+ EMR emr;
+ RECTL rclBounds;
+ DWORD cbRgnData;
+ DWORD ihBrush;
+ BYTE RgnData[1];
+} EMRFILLRGN,*PEMRFILLRGN;
+typedef struct tagEMRFORMAT {
+ DWORD dSignature;
+ DWORD nVersion;
+ DWORD cbData;
+ DWORD offData;
+} EMRFORMAT;
+typedef struct tagEMRFRAMERGN {
+ EMR emr;
+ RECTL rclBounds;
+ DWORD cbRgnData;
+ DWORD ihBrush;
+ SIZEL szlStroke;
+ BYTE RgnData[1];
+} EMRFRAMERGN,*PEMRFRAMERGN;
+typedef struct tagEMRGDICOMMENT {
+ EMR emr;
+ DWORD cbData;
+ BYTE Data[1];
+} EMRGDICOMMENT,*PEMRGDICOMMENT;
+typedef struct tagEMRINVERTRGN {
+ EMR emr;
+ RECTL rclBounds;
+ DWORD cbRgnData;
+ BYTE RgnData[1];
+} EMRINVERTRGN,*PEMRINVERTRGN,EMRPAINTRGN,*PEMRPAINTRGN;
+typedef struct tagEMRLINETO {
+ EMR emr;
+ POINTL ptl;
+} EMRLINETO,*PEMRLINETO,EMRMOVETOEX,*PEMRMOVETOEX;
+typedef struct tagEMRMASKBLT {
+ EMR emr;
+ RECTL rclBounds;
+ LONG xDest;
+ LONG yDest;
+ LONG cxDest;
+ LONG cyDest;
+ DWORD dwRop;
+ LONG xSrc;
+ LONG ySrc;
+ XFORM xformSrc;
+ COLORREF crBkColorSrc;
+ DWORD iUsageSrc;
+ DWORD offBmiSrc;
+ DWORD cbBmiSrc;
+ DWORD offBitsSrc;
+ DWORD cbBitsSrc;
+ LONG xMask;
+ LONG yMask;
+ DWORD iUsageMask;
+ DWORD offBmiMask;
+ DWORD cbBmiMask;
+ DWORD offBitsMask;
+ DWORD cbBitsMask;
+} EMRMASKBLT,*PEMRMASKBLT;
+typedef struct tagEMRMODIFYWORLDTRANSFORM {
+ EMR emr;
+ XFORM xform;
+ DWORD iMode;
+} EMRMODIFYWORLDTRANSFORM,*PEMRMODIFYWORLDTRANSFORM;
+typedef struct tagEMROFFSETCLIPRGN {
+ EMR emr;
+ POINTL ptlOffset;
+} EMROFFSETCLIPRGN,*PEMROFFSETCLIPRGN;
+typedef struct tagEMRPLGBLT {
+ EMR emr;
+ RECTL rclBounds;
+ POINTL aptlDest[3];
+ LONG xSrc;
+ LONG ySrc;
+ LONG cxSrc;
+ LONG cySrc;
+ XFORM xformSrc;
+ COLORREF crBkColorSrc;
+ DWORD iUsageSrc;
+ DWORD offBmiSrc;
+ DWORD cbBmiSrc;
+ DWORD offBitsSrc;
+ DWORD cbBitsSrc;
+ LONG xMask;
+ LONG yMask;
+ DWORD iUsageMask;
+ DWORD offBmiMask;
+ DWORD cbBmiMask;
+ DWORD offBitsMask;
+ DWORD cbBitsMask;
+} EMRPLGBLT,*PEMRPLGBLT;
+typedef struct tagEMRPOLYDRAW {
+ EMR emr;
+ RECTL rclBounds;
+ DWORD cptl;
+ POINTL aptl[1];
+ BYTE abTypes[1];
+} EMRPOLYDRAW,*PEMRPOLYDRAW;
+typedef struct tagEMRPOLYDRAW16 {
+ EMR emr;
+ RECTL rclBounds;
+ DWORD cpts;
+ POINTS apts[1];
+ BYTE abTypes[1];
+} EMRPOLYDRAW16,*PEMRPOLYDRAW16;
+typedef struct tagEMRPOLYLINE {
+ EMR emr;
+ RECTL rclBounds;
+ DWORD cptl;
+ POINTL aptl[1];
+} EMRPOLYLINE,*PEMRPOLYLINE,EMRPOLYBEZIER,*PEMRPOLYBEZIER,EMRPOLYGON,*PEMRPOLYGON,EMRPOLYBEZIERTO,*PEMRPOLYBEZIERTO,EMRPOLYLINETO,*PEMRPOLYLINETO;
+typedef struct tagEMRPOLYLINE16 {
+ EMR emr;
+ RECTL rclBounds;
+ DWORD cpts;
+ POINTL apts[1];
+} EMRPOLYLINE16,*PEMRPOLYLINE16,EMRPOLYBEZIER16,*PEMRPOLYBEZIER16,EMRPOLYGON16,*PEMRPOLYGON16,EMRPOLYBEZIERTO16,*PEMRPOLYBEZIERTO16,EMRPOLYLINETO16,*PEMRPOLYLINETO16;
+typedef struct tagEMRPOLYPOLYLINE {
+ EMR emr;
+ RECTL rclBounds;
+ DWORD nPolys;
+ DWORD cptl;
+ DWORD aPolyCounts[1];
+ POINTL aptl[1];
+} EMRPOLYPOLYLINE,*PEMRPOLYPOLYLINE,EMRPOLYPOLYGON,*PEMRPOLYPOLYGON;
+typedef struct tagEMRPOLYPOLYLINE16 {
+ EMR emr;
+ RECTL rclBounds;
+ DWORD nPolys;
+ DWORD cpts;
+ DWORD aPolyCounts[1];
+ POINTS apts[1];
+} EMRPOLYPOLYLINE16,*PEMRPOLYPOLYLINE16,EMRPOLYPOLYGON16,*PEMRPOLYPOLYGON16;
+typedef struct tagEMRPOLYTEXTOUTA {
+ EMR emr;
+ RECTL rclBounds;
+ DWORD iGraphicsMode;
+ FLOAT exScale;
+ FLOAT eyScale;
+ LONG cStrings;
+ EMRTEXT aemrtext[1];
+} EMRPOLYTEXTOUTA,*PEMRPOLYTEXTOUTA,EMRPOLYTEXTOUTW,*PEMRPOLYTEXTOUTW;
+typedef struct tagEMRRESIZEPALETTE {
+ EMR emr;
+ DWORD ihPal;
+ DWORD cEntries;
+} EMRRESIZEPALETTE,*PEMRRESIZEPALETTE;
+typedef struct tagEMRRESTOREDC {
+ EMR emr;
+ LONG iRelative;
+} EMRRESTOREDC,*PEMRRESTOREDC;
+typedef struct tagEMRROUNDRECT {
+ EMR emr;
+ RECTL rclBox;
+ SIZEL szlCorner;
+} EMRROUNDRECT,*PEMRROUNDRECT;
+typedef struct tagEMRSCALEVIEWPORTEXTEX {
+ EMR emr;
+ LONG xNum;
+ LONG xDenom;
+ LONG yNum;
+ LONG yDenom;
+} EMRSCALEVIEWPORTEXTEX,*PEMRSCALEVIEWPORTEXTEX,EMRSCALEWINDOWEXTEX,*PEMRSCALEWINDOWEXTEX;
+typedef struct tagEMRSELECTCOLORSPACE {
+ EMR emr;
+ DWORD ihCS;
+} EMRSELECTCOLORSPACE,*PEMRSELECTCOLORSPACE,EMRDELETECOLORSPACE,*PEMRDELETECOLORSPACE;
+typedef struct tagEMRSELECTOBJECT {
+ EMR emr;
+ DWORD ihObject;
+} EMRSELECTOBJECT,*PEMRSELECTOBJECT,EMRDELETEOBJECT,*PEMRDELETEOBJECT;
+typedef struct tagEMRSELECTPALETTE {
+ EMR emr;
+ DWORD ihPal;
+} EMRSELECTPALETTE,*PEMRSELECTPALETTE;
+typedef struct tagEMRSETARCDIRECTION {
+ EMR emr;
+ DWORD iArcDirection;
+} EMRSETARCDIRECTION,*PEMRSETARCDIRECTION;
+typedef struct tagEMRSETTEXTCOLOR {
+ EMR emr;
+ COLORREF crColor;
+} EMRSETBKCOLOR,*PEMRSETBKCOLOR,EMRSETTEXTCOLOR,*PEMRSETTEXTCOLOR;
+typedef struct tagEMRSETCOLORADJUSTMENT {
+ EMR emr;
+ COLORADJUSTMENT ColorAdjustment;
+} EMRSETCOLORADJUSTMENT,*PEMRSETCOLORADJUSTMENT;
+typedef struct tagEMRSETDIBITSTODEVICE {
+ EMR emr;
+ RECTL rclBounds;
+ LONG xDest;
+ LONG yDest;
+ LONG xSrc;
+ LONG ySrc;
+ LONG cxSrc;
+ LONG cySrc;
+ DWORD offBmiSrc;
+ DWORD cbBmiSrc;
+ DWORD offBitsSrc;
+ DWORD cbBitsSrc;
+ DWORD iUsageSrc;
+ DWORD iStartScan;
+ DWORD cScans;
+} EMRSETDIBITSTODEVICE,*PEMRSETDIBITSTODEVICE;
+typedef struct tagEMRSETMAPPERFLAGS {
+ EMR emr;
+ DWORD dwFlags;
+} EMRSETMAPPERFLAGS,*PEMRSETMAPPERFLAGS;
+typedef struct tagEMRSETMITERLIMIT {
+ EMR emr;
+ FLOAT eMiterLimit;
+} EMRSETMITERLIMIT,*PEMRSETMITERLIMIT;
+typedef struct tagEMRSETPALETTEENTRIES {
+ EMR emr;
+ DWORD ihPal;
+ DWORD iStart;
+ DWORD cEntries;
+ PALETTEENTRY aPalEntries[1];
+} EMRSETPALETTEENTRIES,*PEMRSETPALETTEENTRIES;
+typedef struct tagEMRSETPIXELV {
+ EMR emr;
+ POINTL ptlPixel;
+ COLORREF crColor;
+} EMRSETPIXELV,*PEMRSETPIXELV;
+typedef struct tagEMRSETVIEWPORTEXTEX {
+ EMR emr;
+ SIZEL szlExtent;
+} EMRSETVIEWPORTEXTEX,*PEMRSETVIEWPORTEXTEX,EMRSETWINDOWEXTEX,*PEMRSETWINDOWEXTEX;
+typedef struct tagEMRSETVIEWPORTORGEX {
+ EMR emr;
+ POINTL ptlOrigin;
+} EMRSETVIEWPORTORGEX,*PEMRSETVIEWPORTORGEX,EMRSETWINDOWORGEX,*PEMRSETWINDOWORGEX,EMRSETBRUSHORGEX,*PEMRSETBRUSHORGEX;
+typedef struct tagEMRSETWORLDTRANSFORM {
+ EMR emr;
+ XFORM xform;
+} EMRSETWORLDTRANSFORM,*PEMRSETWORLDTRANSFORM;
+typedef struct tagEMRSTRETCHBLT {
+ EMR emr;
+ RECTL rclBounds;
+ LONG xDest;
+ LONG yDest;
+ LONG cxDest;
+ LONG cyDest;
+ DWORD dwRop;
+ LONG xSrc;
+ LONG ySrc;
+ XFORM xformSrc;
+ COLORREF crBkColorSrc;
+ DWORD iUsageSrc;
+ DWORD offBmiSrc;
+ DWORD cbBmiSrc;
+ DWORD offBitsSrc;
+ DWORD cbBitsSrc;
+ LONG cxSrc;
+ LONG cySrc;
+} EMRSTRETCHBLT,*PEMRSTRETCHBLT;
+typedef struct tagEMRSTRETCHDIBITS {
+ EMR emr;
+ RECTL rclBounds;
+ LONG xDest;
+ LONG yDest;
+ LONG xSrc;
+ LONG ySrc;
+ LONG cxSrc;
+ LONG cySrc;
+ DWORD offBmiSrc;
+ DWORD cbBmiSrc;
+ DWORD offBitsSrc;
+ DWORD cbBitsSrc;
+ DWORD iUsageSrc;
+ DWORD dwRop;
+ LONG cxDest;
+ LONG cyDest;
+} EMRSTRETCHDIBITS,*PEMRSTRETCHDIBITS;
+typedef struct tagABORTPATH {
+ EMR emr;
+} EMRABORTPATH,*PEMRABORTPATH,EMRBEGINPATH,*PEMRBEGINPATH,EMRENDPATH,*PEMRENDPATH,EMRCLOSEFIGURE,*PEMRCLOSEFIGURE,EMRFLATTENPATH,*PEMRFLATTENPATH,EMRWIDENPATH,*PEMRWIDENPATH,EMRSETMETARGN,*PEMRSETMETARGN,EMRSAVEDC,*PEMRSAVEDC,EMRREALIZEPALETTE,*PEMRREALIZEPALETTE;
+typedef struct tagEMRSELECTCLIPPATH {
+ EMR emr;
+ DWORD iMode;
+} EMRSELECTCLIPPATH,*PEMRSELECTCLIPPATH,EMRSETBKMODE,*PEMRSETBKMODE,EMRSETMAPMODE,*PEMRSETMAPMODE,EMRSETPOLYFILLMODE,*PEMRSETPOLYFILLMODE,EMRSETROP2,*PEMRSETROP2,EMRSETSTRETCHBLTMODE,*PEMRSETSTRETCHBLTMODE,EMRSETTEXTALIGN,*PEMRSETTEXTALIGN,EMRENABLEICM,*PEMRENABLEICM;
+#pragma pack(push,2)
+typedef struct tagMETAHEADER {
+ WORD mtType;
+ WORD mtHeaderSize;
+ WORD mtVersion;
+ DWORD mtSize;
+ WORD mtNoObjects;
+ DWORD mtMaxRecord;
+ WORD mtNoParameters;
+} METAHEADER,*PMETAHEADER,*LPMETAHEADER;
+#pragma pack(pop)
+typedef struct tagENHMETAHEADER {
+ DWORD iType;
+ DWORD nSize;
+ RECTL rclBounds;
+ RECTL rclFrame;
+ DWORD dSignature;
+ DWORD nVersion;
+ DWORD nBytes;
+ DWORD nRecords;
+ WORD nHandles;
+ WORD sReserved;
+ DWORD nDescription;
+ DWORD offDescription;
+ DWORD nPalEntries;
+ SIZEL szlDevice;
+ SIZEL szlMillimeters;
+} ENHMETAHEADER,*LPENHMETAHEADER;
+typedef struct tagMETARECORD {
+ DWORD rdSize;
+ WORD rdFunction;
+ WORD rdParm[1];
+} METARECORD,*PMETARECORD,*LPMETARECORD;
+typedef struct tagENHMETARECORD {
+ DWORD iType;
+ DWORD nSize;
+ DWORD dParm[1];
+} ENHMETARECORD,*LPENHMETARECORD;
+typedef struct tagHANDLETABLE {
+ HGDIOBJ objectHandle[1];
+} HANDLETABLE,*LPHANDLETABLE;
+typedef struct tagTEXTMETRICA {
+ LONG tmHeight;
+ LONG tmAscent;
+ LONG tmDescent;
+ LONG tmInternalLeading;
+ LONG tmExternalLeading;
+ LONG tmAveCharWidth;
+ LONG tmMaxCharWidth;
+ LONG tmWeight;
+ LONG tmOverhang;
+ LONG tmDigitizedAspectX;
+ LONG tmDigitizedAspectY;
+ BYTE tmFirstChar;
+ BYTE tmLastChar;
+ BYTE tmDefaultChar;
+ BYTE tmBreakChar;
+ BYTE tmItalic;
+ BYTE tmUnderlined;
+ BYTE tmStruckOut;
+ BYTE tmPitchAndFamily;
+ BYTE tmCharSet;
+} TEXTMETRICA,*PTEXTMETRICA,*LPTEXTMETRICA;
+typedef struct tagTEXTMETRICW {
+ LONG tmHeight;
+ LONG tmAscent;
+ LONG tmDescent;
+ LONG tmInternalLeading;
+ LONG tmExternalLeading;
+ LONG tmAveCharWidth;
+ LONG tmMaxCharWidth;
+ LONG tmWeight;
+ LONG tmOverhang;
+ LONG tmDigitizedAspectX;
+ LONG tmDigitizedAspectY;
+ WCHAR tmFirstChar;
+ WCHAR tmLastChar;
+ WCHAR tmDefaultChar;
+ WCHAR tmBreakChar;
+ BYTE tmItalic;
+ BYTE tmUnderlined;
+ BYTE tmStruckOut;
+ BYTE tmPitchAndFamily;
+ BYTE tmCharSet;
+} TEXTMETRICW,*PTEXTMETRICW,*LPTEXTMETRICW;
+typedef struct _RGNDATAHEADER {
+ DWORD dwSize;
+ DWORD iType;
+ DWORD nCount;
+ DWORD nRgnSize;
+ RECT rcBound;
+} RGNDATAHEADER;
+typedef struct _RGNDATA {
+ RGNDATAHEADER rdh;
+ char Buffer[1];
+} RGNDATA,*LPRGNDATA;
+typedef struct tagGCP_RESULTSA {
+ DWORD lStructSize;
+ LPSTR lpOutString;
+ UINT *lpOrder;
+ INT *lpDx;
+ INT *lpCaretPos;
+ LPSTR lpClass;
+ UINT *lpGlyphs;
+ UINT nGlyphs;
+ UINT nMaxFit;
+} GCP_RESULTSA,*LPGCP_RESULTSA;
+typedef struct tagGCP_RESULTSW {
+ DWORD lStructSize;
+ LPWSTR lpOutString;
+ UINT *lpOrder;
+ INT *lpDx;
+ INT *lpCaretPos;
+ LPWSTR lpClass;
+ UINT *lpGlyphs;
+ UINT nGlyphs;
+ UINT nMaxFit;
+} GCP_RESULTSW,*LPGCP_RESULTSW;
+typedef struct _GLYPHMETRICS {
+ UINT gmBlackBoxX;
+ UINT gmBlackBoxY;
+ POINT gmptGlyphOrigin;
+ short gmCellIncX;
+ short gmCellIncY;
+} GLYPHMETRICS,*LPGLYPHMETRICS;
+typedef struct tagKERNINGPAIR {
+ WORD wFirst;
+ WORD wSecond;
+ int iKernAmount;
+} KERNINGPAIR,*LPKERNINGPAIR;
+typedef struct _FIXED {
+ WORD fract;
+ short value;
+} FIXED;
+typedef struct _MAT2 {
+ FIXED eM11;
+ FIXED eM12;
+ FIXED eM21;
+ FIXED eM22;
+} MAT2,*LPMAT2;
+typedef struct _OUTLINETEXTMETRICA {
+ UINT otmSize;
+ TEXTMETRICA otmTextMetrics;
+ BYTE otmFiller;
+ PANOSE otmPanoseNumber;
+ UINT otmfsSelection;
+ UINT otmfsType;
+ int otmsCharSlopeRise;
+ int otmsCharSlopeRun;
+ int otmItalicAngle;
+ UINT otmEMSquare;
+ int otmAscent;
+ int otmDescent;
+ UINT otmLineGap;
+ UINT otmsCapEmHeight;
+ UINT otmsXHeight;
+ RECT otmrcFontBox;
+ int otmMacAscent;
+ int otmMacDescent;
+ UINT otmMacLineGap;
+ UINT otmusMinimumPPEM;
+ POINT otmptSubscriptSize;
+ POINT otmptSubscriptOffset;
+ POINT otmptSuperscriptSize;
+ POINT otmptSuperscriptOffset;
+ UINT otmsStrikeoutSize;
+ int otmsStrikeoutPosition;
+ int otmsUnderscoreSize;
+ int otmsUnderscorePosition;
+ PSTR otmpFamilyName;
+ PSTR otmpFaceName;
+ PSTR otmpStyleName;
+ PSTR otmpFullName;
+} OUTLINETEXTMETRICA,*POUTLINETEXTMETRICA,*LPOUTLINETEXTMETRICA;
+typedef struct _OUTLINETEXTMETRICW {
+ UINT otmSize;
+ TEXTMETRICW otmTextMetrics;
+ BYTE otmFiller;
+ PANOSE otmPanoseNumber;
+ UINT otmfsSelection;
+ UINT otmfsType;
+ int otmsCharSlopeRise;
+ int otmsCharSlopeRun;
+ int otmItalicAngle;
+ UINT otmEMSquare;
+ int otmAscent;
+ int otmDescent;
+ UINT otmLineGap;
+ UINT otmsCapEmHeight;
+ UINT otmsXHeight;
+ RECT otmrcFontBox;
+ int otmMacAscent;
+ int otmMacDescent;
+ UINT otmMacLineGap;
+ UINT otmusMinimumPPEM;
+ POINT otmptSubscriptSize;
+ POINT otmptSubscriptOffset;
+ POINT otmptSuperscriptSize;
+ POINT otmptSuperscriptOffset;
+ UINT otmsStrikeoutSize;
+ int otmsStrikeoutPosition;
+ int otmsUnderscoreSize;
+ int otmsUnderscorePosition;
+ PSTR otmpFamilyName;
+ PSTR otmpFaceName;
+ PSTR otmpStyleName;
+ PSTR otmpFullName;
+} OUTLINETEXTMETRICW,*POUTLINETEXTMETRICW,*LPOUTLINETEXTMETRICW;
+typedef struct _RASTERIZER_STATUS {
+ short nSize;
+ short wFlags;
+ short nLanguageID;
+} RASTERIZER_STATUS,*LPRASTERIZER_STATUS;
+typedef struct _POLYTEXTA {
+ int x;
+ int y;
+ UINT n;
+ LPCSTR lpstr;
+ UINT uiFlags;
+ RECT rcl;
+ int *pdx;
+} POLYTEXTA;
+typedef struct _POLYTEXTW {
+ int x;
+ int y;
+ UINT n;
+ LPCWSTR lpstr;
+ UINT uiFlags;
+ RECT rcl;
+ int *pdx;
+} POLYTEXTW;
+typedef struct tagPIXELFORMATDESCRIPTOR {
+ WORD nSize;
+ WORD nVersion;
+ DWORD dwFlags;
+ BYTE iPixelType;
+ BYTE cColorBits;
+ BYTE cRedBits;
+ BYTE cRedShift;
+ BYTE cGreenBits;
+ BYTE cGreenShift;
+ BYTE cBlueBits;
+ BYTE cBlueShift;
+ BYTE cAlphaBits;
+ BYTE cAlphaShift;
+ BYTE cAccumBits;
+ BYTE cAccumRedBits;
+ BYTE cAccumGreenBits;
+ BYTE cAccumBlueBits;
+ BYTE cAccumAlphaBits;
+ BYTE cDepthBits;
+ BYTE cStencilBits;
+ BYTE cAuxBuffers;
+ BYTE iLayerType;
+ BYTE bReserved;
+ DWORD dwLayerMask;
+ DWORD dwVisibleMask;
+ DWORD dwDamageMask;
+} PIXELFORMATDESCRIPTOR,*PPIXELFORMATDESCRIPTOR,*LPPIXELFORMATDESCRIPTOR;
+typedef struct tagMETAFILEPICT {
+ LONG mm;
+ LONG xExt;
+ LONG yExt;
+ HMETAFILE hMF;
+} METAFILEPICT,*LPMETAFILEPICT;
+typedef struct tagLOCALESIGNATURE {
+ DWORD lsUsb[4];
+ DWORD lsCsbDefault[2];
+ DWORD lsCsbSupported[2];
+} LOCALESIGNATURE,*PLOCALESIGNATURE,*LPLOCALESIGNATURE;
+typedef LONG LCSTYPE;
+#pragma pack(push,4)
+typedef struct tagNEWTEXTMETRICA {
+ LONG tmHeight;
+ LONG tmAscent;
+ LONG tmDescent;
+ LONG tmInternalLeading;
+ LONG tmExternalLeading;
+ LONG tmAveCharWidth;
+ LONG tmMaxCharWidth;
+ LONG tmWeight;
+ LONG tmOverhang;
+ LONG tmDigitizedAspectX;
+ LONG tmDigitizedAspectY;
+ BYTE tmFirstChar;
+ BYTE tmLastChar;
+ BYTE tmDefaultChar;
+ BYTE tmBreakChar;
+ BYTE tmItalic;
+ BYTE tmUnderlined;
+ BYTE tmStruckOut;
+ BYTE tmPitchAndFamily;
+ BYTE tmCharSet;
+ DWORD ntmFlags;
+ UINT ntmSizeEM;
+ UINT ntmCellHeight;
+ UINT ntmAvgWidth;
+} NEWTEXTMETRICA,*PNEWTEXTMETRICA,*LPNEWTEXTMETRICA;
+typedef struct tagNEWTEXTMETRICW {
+ LONG tmHeight;
+ LONG tmAscent;
+ LONG tmDescent;
+ LONG tmInternalLeading;
+ LONG tmExternalLeading;
+ LONG tmAveCharWidth;
+ LONG tmMaxCharWidth;
+ LONG tmWeight;
+ LONG tmOverhang;
+ LONG tmDigitizedAspectX;
+ LONG tmDigitizedAspectY;
+ WCHAR tmFirstChar;
+ WCHAR tmLastChar;
+ WCHAR tmDefaultChar;
+ WCHAR tmBreakChar;
+ BYTE tmItalic;
+ BYTE tmUnderlined;
+ BYTE tmStruckOut;
+ BYTE tmPitchAndFamily;
+ BYTE tmCharSet;
+ DWORD ntmFlags;
+ UINT ntmSizeEM;
+ UINT ntmCellHeight;
+ UINT ntmAvgWidth;
+} NEWTEXTMETRICW,*PNEWTEXTMETRICW,*LPNEWTEXTMETRICW;
+#pragma pack(pop)
+typedef struct tagNEWTEXTMETRICEXA {
+ NEWTEXTMETRICA ntmTm;
+ FONTSIGNATURE ntmFontSig;
+} NEWTEXTMETRICEXA;
+typedef struct tagNEWTEXTMETRICEXW {
+ NEWTEXTMETRICW ntmTm;
+ FONTSIGNATURE ntmFontSig;
+} NEWTEXTMETRICEXW;
+typedef struct tagPELARRAY {
+ LONG paXCount;
+ LONG paYCount;
+ LONG paXExt;
+ LONG paYExt;
+ BYTE paRGBs;
+} PELARRAY,*PPELARRAY,*LPPELARRAY;
+typedef struct tagENUMLOGFONTA {
+ LOGFONTA elfLogFont;
+ BYTE elfFullName[LF_FULLFACESIZE];
+ BYTE elfStyle[LF_FACESIZE];
+} ENUMLOGFONTA,*LPENUMLOGFONTA;
+typedef struct tagENUMLOGFONTW {
+ LOGFONTW elfLogFont;
+ WCHAR elfFullName[LF_FULLFACESIZE];
+ WCHAR elfStyle[LF_FACESIZE];
+} ENUMLOGFONTW,*LPENUMLOGFONTW;
+typedef struct tagENUMLOGFONTEXA {
+ LOGFONTA elfLogFont;
+ BYTE elfFullName[LF_FULLFACESIZE];
+ BYTE elfStyle[LF_FACESIZE];
+ BYTE elfScript[LF_FACESIZE];
+} ENUMLOGFONTEXA,*LPENUMLOGFONTEXA;
+typedef struct tagENUMLOGFONTEXW {
+ LOGFONTW elfLogFont;
+ WCHAR elfFullName[LF_FULLFACESIZE];
+ BYTE elfStyle[LF_FACESIZE];
+ BYTE elfScript[LF_FACESIZE];
+} ENUMLOGFONTEXW,*LPENUMLOGFONTEXW;
+typedef struct tagPOINTFX {
+ FIXED x;
+ FIXED y;
+} POINTFX,*LPPOINTFX;
+typedef struct tagTTPOLYCURVE {
+ WORD wType;
+ WORD cpfx;
+ POINTFX apfx[1];
+} TTPOLYCURVE,*LPTTPOLYCURVE;
+typedef struct tagTTPOLYGONHEADER {
+ DWORD cb;
+ DWORD dwType;
+ POINTFX pfxStart;
+} TTPOLYGONHEADER,*LPTTPOLYGONHEADER;
+typedef struct _POINTFLOAT {
+ FLOAT x;
+ FLOAT y;
+} POINTFLOAT,*PPOINTFLOAT;
+typedef struct _GLYPHMETRICSFLOAT {
+ FLOAT gmfBlackBoxX;
+ FLOAT gmfBlackBoxY;
+ POINTFLOAT gmfptGlyphOrigin;
+ FLOAT gmfCellIncX;
+ FLOAT gmfCellIncY;
+} GLYPHMETRICSFLOAT,*PGLYPHMETRICSFLOAT,*LPGLYPHMETRICSFLOAT;
+typedef struct tagLAYERPLANEDESCRIPTOR {
+ WORD nSize;
+ WORD nVersion;
+ DWORD dwFlags;
+ BYTE iPixelType;
+ BYTE cColorBits;
+ BYTE cRedBits;
+ BYTE cRedShift;
+ BYTE cGreenBits;
+ BYTE cGreenShift;
+ BYTE cBlueBits;
+ BYTE cBlueShift;
+ BYTE cAlphaBits;
+ BYTE cAlphaShift;
+ BYTE cAccumBits;
+ BYTE cAccumRedBits;
+ BYTE cAccumGreenBits;
+ BYTE cAccumBlueBits;
+ BYTE cAccumAlphaBits;
+ BYTE cDepthBits;
+ BYTE cStencilBits;
+ BYTE cAuxBuffers;
+ BYTE iLayerPlane;
+ BYTE bReserved;
+ COLORREF crTransparent;
+} LAYERPLANEDESCRIPTOR,*PLAYERPLANEDESCRIPTOR,*LPLAYERPLANEDESCRIPTOR;
+typedef BOOL (CALLBACK *ABORTPROC)(HDC,int);
+typedef int (CALLBACK *MFENUMPROC)(HDC,HANDLETABLE*,METARECORD*,int,LPARAM);
+typedef int (CALLBACK *ENHMFENUMPROC)(HDC,HANDLETABLE*,ENHMETARECORD*,int,LPARAM);
+typedef int (CALLBACK *OLDFONTENUMPROCA)(const LOGFONTA*,const TEXTMETRICA*,DWORD,LPARAM);
+typedef int (CALLBACK *OLDFONTENUMPROCW)(const LOGFONTW*,const TEXTMETRICW*,DWORD,LPARAM);
+typedef OLDFONTENUMPROCA FONTENUMPROCA;
+typedef OLDFONTENUMPROCW FONTENUMPROCW;
+typedef int (CALLBACK *ICMENUMPROCA)(LPSTR,LPARAM);
+typedef int (CALLBACK *ICMENUMPROCW)(LPWSTR,LPARAM);
+typedef void (CALLBACK *GOBJENUMPROC)(LPVOID,LPARAM);
+typedef void (CALLBACK *LINEDDAPROC)(int,int,LPARAM);
+
+#define RGB(r,g,b) ((DWORD)(((BYTE)(r)|((WORD)(g)<<8))|(((DWORD)(BYTE)(b))<<16)))
+#define MAKEPOINTS(l) (*((POINTS*)&(l)))
+#define MAKEROP4(f,b) (DWORD)((((b)<<8)&0xFF000000)|(f))
+#define PALETTEINDEX(i) ((0x01000000|(COLORREF)(WORD)(i)))
+#define PALETTERGB(r,g,b) (0x02000000|RGB(r,g,b))
+int WINAPI AbortDoc(HDC);
+BOOL WINAPI AbortPath(HDC);
+int WINAPI AddFontResourceA(LPCSTR);
+int WINAPI AddFontResourceW(LPCWSTR);
+BOOL WINAPI AngleArc(HDC,int,int,DWORD,FLOAT,FLOAT);
+BOOL WINAPI AnimatePalette(HPALETTE,UINT,UINT,const PALETTEENTRY*);
+BOOL WINAPI Arc(HDC,int,int,int,int,int,int,int,int);
+BOOL WINAPI ArcTo(HDC,int,int,int,int,int,int,int,int);
+BOOL WINAPI BeginPath(HDC);
+BOOL WINAPI BitBlt(HDC,int,int,int,int,HDC,int,int,DWORD);
+BOOL WINAPI CancelDC(HDC);
+BOOL WINAPI CheckColorsInGamut(HDC,PVOID,PVOID,DWORD);
+BOOL WINAPI Chord(HDC,int,int,int,int,int,int,int,int);
+int WINAPI ChoosePixelFormat(HDC,CONST PIXELFORMATDESCRIPTOR*);
+HENHMETAFILE WINAPI CloseEnhMetaFile(HDC);
+BOOL WINAPI CloseFigure(HDC);
+HMETAFILE WINAPI CloseMetaFile(HDC);
+BOOL WINAPI ColorMatchToTarget(HDC,HDC,DWORD);
+int WINAPI CombineRgn(HRGN,HRGN,HRGN,int);
+BOOL WINAPI CombineTransform(LPXFORM,const XFORM*,const XFORM*);
+HENHMETAFILE WINAPI CopyEnhMetaFileA(HENHMETAFILE,LPCSTR);
+HENHMETAFILE WINAPI CopyEnhMetaFileW(HENHMETAFILE,LPCWSTR);
+HMETAFILE WINAPI CopyMetaFileA(HMETAFILE,LPCSTR);
+HMETAFILE WINAPI CopyMetaFileW(HMETAFILE,LPCWSTR);
+HBITMAP WINAPI CreateBitmap(int,int,UINT,UINT,PCVOID);
+HBITMAP WINAPI CreateBitmapIndirect(const BITMAP*);
+HBRUSH WINAPI CreateBrushIndirect(const LOGBRUSH*);
+HCOLORSPACE WINAPI CreateColorSpaceA(LPLOGCOLORSPACEA);
+HCOLORSPACE WINAPI CreateColorSpaceW(LPLOGCOLORSPACEW);
+HBITMAP WINAPI CreateCompatibleBitmap(HDC,int,int);
+HDC WINAPI CreateCompatibleDC(HDC);
+HDC WINAPI CreateDCA(LPCSTR,LPCSTR,LPCSTR,const DEVMODEA*);
+HDC WINAPI CreateDCW(LPCWSTR,LPCWSTR,LPCWSTR,const DEVMODEW*);
+HBITMAP WINAPI CreateDIBitmap(HDC,const BITMAPINFOHEADER*,DWORD,PCVOID,const BITMAPINFO*,UINT);
+HBRUSH WINAPI CreateDIBPatternBrush(HGLOBAL,UINT);
+HBRUSH WINAPI CreateDIBPatternBrushPt(PCVOID,UINT);
+HBITMAP WINAPI CreateDIBSection(HDC,const BITMAPINFO*,UINT,void**,HANDLE,DWORD);
+HBITMAP WINAPI CreateDiscardableBitmap(HDC,int,int);
+HRGN WINAPI CreateEllipticRgn(int,int,int,int);
+HRGN WINAPI CreateEllipticRgnIndirect(LPCRECT);
+HDC WINAPI CreateEnhMetaFileA(HDC,LPCSTR,LPCRECT,LPCSTR);
+HDC WINAPI CreateEnhMetaFileW(HDC,LPCWSTR,LPCRECT,LPCWSTR);
+HFONT WINAPI CreateFontA(int,int,int,int,int,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,LPCSTR);
+HFONT WINAPI CreateFontW(int,int,int,int,int,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,LPCWSTR);
+HFONT WINAPI CreateFontIndirectA(const LOGFONTA*);
+HFONT WINAPI CreateFontIndirectW(const LOGFONTW*);
+HPALETTE WINAPI CreateHalftonePalette(HDC);
+HBRUSH WINAPI CreateHatchBrush(int,COLORREF);
+HDC WINAPI CreateICA(LPCSTR,LPCSTR,LPCSTR,const DEVMODEA*);
+HDC WINAPI CreateICW(LPCWSTR,LPCWSTR,LPCWSTR,const DEVMODEW*);
+HDC WINAPI CreateMetaFileA(LPCSTR);
+HDC WINAPI CreateMetaFileW(LPCWSTR);
+HPALETTE WINAPI CreatePalette(const LOGPALETTE*);
+HBRUSH WINAPI CreatePatternBrush(HBITMAP);
+HPEN WINAPI CreatePen(int,int,COLORREF);
+HPEN WINAPI CreatePenIndirect(const LOGPEN*);
+HRGN WINAPI CreatePolygonRgn(const POINT*,int,int);
+HRGN WINAPI CreatePolyPolygonRgn(const POINT*,const INT*,int,int);
+HRGN WINAPI CreateRectRgn(int,int,int,int);
+HRGN WINAPI CreateRectRgnIndirect(LPCRECT);
+HRGN WINAPI CreateRoundRectRgn(int,int,int,int,int,int);
+BOOL WINAPI CreateScalableFontResourceA(DWORD,LPCSTR,LPCSTR,LPCSTR);
+BOOL WINAPI CreateScalableFontResourceW(DWORD,LPCWSTR,LPCWSTR,LPCWSTR);
+HBRUSH WINAPI CreateSolidBrush(COLORREF);
+BOOL WINAPI DeleteColorSpace(HCOLORSPACE);
+BOOL WINAPI DeleteDC(HDC);
+BOOL WINAPI DeleteEnhMetaFile(HENHMETAFILE);
+BOOL WINAPI DeleteMetaFile(HMETAFILE);
+BOOL WINAPI DeleteObject(HGDIOBJ);
+int WINAPI DescribePixelFormat(HDC,int,UINT,LPPIXELFORMATDESCRIPTOR);
+DWORD WINAPI DeviceCapabilitiesA(LPCSTR,LPCSTR,WORD,LPSTR,const DEVMODEA*);
+DWORD WINAPI DeviceCapabilitiesW(LPCWSTR,LPCWSTR,WORD,LPWSTR,const DEVMODEW*);
+BOOL WINAPI DPtoLP(HDC,LPPOINT,int);
+int WINAPI DrawEscape(HDC,int,int,LPCSTR);
+BOOL WINAPI Ellipse(HDC,int,int,int,int);
+int WINAPI EndDoc(HDC);
+int WINAPI EndPage(HDC);
+BOOL WINAPI EndPath(HDC);
+BOOL WINAPI EnumEnhMetaFile(HDC,HENHMETAFILE,ENHMFENUMPROC,PVOID,LPCRECT);
+int WINAPI EnumFontFamiliesA(HDC,LPCSTR,FONTENUMPROCA,LPARAM);
+int WINAPI EnumFontFamiliesW(HDC,LPCWSTR,FONTENUMPROCW,LPARAM);
+int WINAPI EnumFontFamiliesExA(HDC,PLOGFONTA,FONTENUMPROCA,LPARAM,DWORD);
+int WINAPI EnumFontFamiliesExW(HDC,PLOGFONTW,FONTENUMPROCW,LPARAM,DWORD);
+int WINAPI EnumFontsA(HDC,LPCSTR,FONTENUMPROCA,LPARAM);
+int WINAPI EnumFontsW(HDC,LPCWSTR,FONTENUMPROCA,LPARAM);
+int WINAPI EnumICMProfilesA(HDC,ICMENUMPROCA,LPARAM);
+int WINAPI EnumICMProfilesW(HDC,ICMENUMPROCW,LPARAM);
+BOOL WINAPI EnumMetaFile(HDC,HMETAFILE,MFENUMPROC,LPARAM);
+int WINAPI EnumObjects(HDC,int,GOBJENUMPROC,LPARAM);
+BOOL WINAPI EqualRgn(HRGN,HRGN);
+int WINAPI Escape(HDC,int,int,LPCSTR,PVOID);
+int WINAPI ExcludeClipRect(HDC,int,int,int,int);
+int WINAPI ExcludeUpdateRgn(HDC,HWND);
+HPEN WINAPI ExtCreatePen(DWORD,DWORD,const LOGBRUSH*,DWORD,const DWORD*);
+HRGN WINAPI ExtCreateRegion(const XFORM*,DWORD,const RGNDATA*);
+int WINAPI ExtEscape(HDC,int,int,LPCSTR,int,LPSTR);
+BOOL WINAPI ExtFloodFill(HDC,int,int,COLORREF,UINT);
+int WINAPI ExtSelectClipRgn(HDC,HRGN,int);
+BOOL WINAPI ExtTextOutA(HDC,int,int,UINT,LPCRECT,LPCSTR,UINT,const INT*);
+BOOL WINAPI ExtTextOutW(HDC,int,int,UINT,LPCRECT,LPCWSTR,UINT,const INT*);
+BOOL WINAPI FillPath(HDC);
+int WINAPI FillRect(HDC,LPCRECT,HBRUSH);
+int WINAPI FillRgn(HDC,HRGN,HBRUSH);
+BOOL WINAPI FixBrushOrgEx(HDC,int,int,LPPOINT);
+BOOL WINAPI FlattenPath(HDC);
+BOOL WINAPI FloodFill(HDC,int,int,COLORREF);
+BOOL WINAPI GdiComment(HDC,UINT,const BYTE*);
+BOOL WINAPI GdiFlush(void);
+DWORD WINAPI GdiGetBatchLimit(void);
+DWORD WINAPI GdiSetBatchLimit(DWORD);
+#define GetCValue(cmyk) ((BYTE)(cmyk))
+#define GetMValue(cmyk) ((BYTE)((cmyk)>> 8))
+#define GetYValue(cmyk) ((BYTE)((cmyk)>>16))
+#define GetKValue(cmyk) ((BYTE)((cmyk)>>24))
+#define CMYK(c,m,y,k) ((COLORREF)((((BYTE)(c)|((WORD)((BYTE)(m))<<8))|(((DWORD)(BYTE)(y))<<16))|(((DWORD)(BYTE)(k))<<24)))
+#define GetRValue(c) ((BYTE)(c))
+#define GetGValue(c) ((BYTE)(((WORD)(c))>>8))
+#define GetBValue(c) ((BYTE)((c)>>16))
+int WINAPI GetArcDirection(HDC);
+BOOL WINAPI GetAspectRatioFilterEx(HDC,LPSIZE);
+LONG WINAPI GetBitmapBits(HBITMAP,LONG,PVOID);
+BOOL WINAPI GetBitmapDimensionEx(HBITMAP,LPSIZE);
+COLORREF WINAPI GetBkColor(HDC);
+int WINAPI GetBkMode(HDC);
+UINT WINAPI GetBoundsRect(HDC,LPRECT,UINT);
+BOOL WINAPI GetBrushOrgEx(HDC,LPPOINT);
+BOOL WINAPI GetCharABCWidthsA(HDC,UINT,UINT,LPABC);
+BOOL WINAPI GetCharABCWidthsW(HDC,UINT,UINT,LPABC);
+BOOL WINAPI GetCharABCWidthsFloatA(HDC,UINT,UINT,LPABCFLOAT);
+BOOL WINAPI GetCharABCWidthsFloatW(HDC,UINT,UINT,LPABCFLOAT);
+DWORD WINAPI GetCharacterPlacementA(HDC,LPCSTR,int,int,LPGCP_RESULTSA,DWORD);
+DWORD WINAPI GetCharacterPlacementW(HDC,LPCWSTR,int,int,LPGCP_RESULTSW,DWORD);
+BOOL WINAPI GetCharWidth32A(HDC,UINT,UINT,LPINT);
+BOOL WINAPI GetCharWidth32W(HDC,UINT,UINT,LPINT);
+BOOL WINAPI GetCharWidthA(HDC,UINT,UINT,LPINT);
+BOOL WINAPI GetCharWidthW(HDC,UINT,UINT,LPINT);
+BOOL WINAPI GetCharWidthFloatA(HDC,UINT,UINT,PFLOAT);
+BOOL WINAPI GetCharWidthFloatW(HDC,UINT,UINT,PFLOAT);
+int WINAPI GetClipBox(HDC,LPRECT);
+int WINAPI GetClipRgn(HDC,HRGN);
+BOOL WINAPI GetColorAdjustment(HDC,LPCOLORADJUSTMENT);
+HANDLE WINAPI GetColorSpace(HDC);
+HGDIOBJ WINAPI GetCurrentObject(HDC,UINT);
+BOOL WINAPI GetCurrentPositionEx(HDC,LPPOINT);
+HCURSOR WINAPI GetCursor(void);
+BOOL WINAPI GetDCOrgEx(HDC,LPPOINT);
+int WINAPI GetDeviceCaps(HDC,int);
+BOOL WINAPI GetDeviceGammaRamp(HDC,PVOID);
+UINT WINAPI GetDIBColorTable(HDC,UINT,UINT,RGBQUAD*);
+int WINAPI GetDIBits(HDC,HBITMAP,UINT,UINT,PVOID,LPBITMAPINFO,UINT);
+HENHMETAFILE WINAPI GetEnhMetaFileA(LPCSTR);
+HENHMETAFILE WINAPI GetEnhMetaFileW(LPCWSTR);
+UINT WINAPI GetEnhMetaFileDescriptionA(HENHMETAFILE,UINT,LPSTR);
+UINT WINAPI GetEnhMetaFileDescriptionW(HENHMETAFILE,UINT,LPWSTR);
+UINT WINAPI GetEnhMetaFileHeader(HENHMETAFILE,UINT,LPENHMETAHEADER);
+UINT WINAPI GetEnhMetaFilePaletteEntries(HENHMETAFILE,UINT,LPPALETTEENTRY);
+UINT WINAPI GetEnhMetaFilePixelFormat(HENHMETAFILE,DWORD,PIXELFORMATDESCRIPTOR*);
+DWORD WINAPI GetFontData(HDC,DWORD,DWORD,PVOID,DWORD);
+DWORD WINAPI GetFontLanguageInfo(HDC);
+DWORD WINAPI GetGlyphOutlineA(HDC,UINT,UINT,LPGLYPHMETRICS,DWORD,PVOID,const MAT2*);
+DWORD WINAPI GetGlyphOutlineW(HDC,UINT,UINT,LPGLYPHMETRICS,DWORD,PVOID,const MAT2*);
+int WINAPI GetGraphicsMode(HDC);
+BOOL WINAPI GetICMProfileA(HDC,DWORD,LPSTR);
+BOOL WINAPI GetICMProfileW(HDC,DWORD,LPWSTR);
+DWORD WINAPI GetKerningPairsA(HDC,DWORD,LPKERNINGPAIR);
+DWORD WINAPI GetKerningPairsW(HDC,DWORD,LPKERNINGPAIR);
+BOOL WINAPI GetLogColorSpaceA(HCOLORSPACE,LPLOGCOLORSPACEA,DWORD);
+BOOL WINAPI GetLogColorSpaceW(HCOLORSPACE,LPLOGCOLORSPACEW,DWORD);
+int WINAPI GetMapMode(HDC);
+HMETAFILE WINAPI GetMetaFileA(LPCSTR);
+HMETAFILE WINAPI GetMetaFileW(LPCWSTR);
+UINT WINAPI GetMetaFileBitsEx(HMETAFILE,UINT,PVOID);
+int WINAPI GetMetaRgn(HDC,HRGN);
+BOOL WINAPI GetMiterLimit(HDC,PFLOAT);
+COLORREF WINAPI GetNearestColor(HDC,COLORREF);
+UINT WINAPI GetNearestPaletteIndex(HPALETTE,COLORREF);
+int WINAPI GetObjectA(HGDIOBJ,int,PVOID);
+int WINAPI GetObjectW(HGDIOBJ,int,PVOID);
+DWORD WINAPI GetObjectType(HGDIOBJ);
+UINT WINAPI GetOutlineTextMetricsA(HDC,UINT,LPOUTLINETEXTMETRICA);
+UINT WINAPI GetOutlineTextMetricsW(HDC,UINT,LPOUTLINETEXTMETRICW);
+UINT WINAPI GetPaletteEntries(HPALETTE,UINT,UINT,LPPALETTEENTRY);
+int WINAPI GetPath(HDC,LPPOINT,PBYTE,int);
+COLORREF WINAPI GetPixel(HDC,int,int);
+int WINAPI GetPixelFormat(HDC);
+int WINAPI GetPolyFillMode(HDC);
+BOOL WINAPI GetRasterizerCaps(LPRASTERIZER_STATUS,UINT);
+DWORD WINAPI GetRegionData(HRGN,DWORD,LPRGNDATA);
+int WINAPI GetRgnBox(HRGN,LPRECT);
+int WINAPI GetROP2(HDC);
+HGDIOBJ WINAPI GetStockObject(int);
+int WINAPI GetStretchBltMode(HDC);
+UINT WINAPI GetSystemPaletteEntries(HDC,UINT,UINT,LPPALETTEENTRY);
+UINT WINAPI GetSystemPaletteUse(HDC);
+UINT WINAPI GetTextAlign(HDC);
+int WINAPI GetTextCharacterExtra(HDC);
+int WINAPI GetTextCharset(HDC);
+int WINAPI GetTextCharsetInfo(HDC,LPFONTSIGNATURE,DWORD);
+COLORREF WINAPI GetTextColor(HDC);
+BOOL WINAPI GetTextExtentExPointA(HDC,LPCSTR,int,int,LPINT,LPINT,LPSIZE);
+BOOL WINAPI GetTextExtentExPointW( HDC,LPCWSTR,int,int,LPINT,LPINT,LPSIZE );
+BOOL WINAPI GetTextExtentPointA(HDC,LPCSTR,int,LPSIZE);
+BOOL WINAPI GetTextExtentPointW(HDC,LPCWSTR,int,LPSIZE);
+BOOL WINAPI GetTextExtentPoint32A(HDC,LPCSTR,int,LPSIZE);
+BOOL WINAPI GetTextExtentPoint32W( HDC,LPCWSTR,int,LPSIZE);
+int WINAPI GetTextFaceA(HDC,int,LPSTR);
+int WINAPI GetTextFaceW(HDC,int,LPWSTR);
+BOOL WINAPI GetTextMetricsA(HDC,LPTEXTMETRICA);
+BOOL WINAPI GetTextMetricsW(HDC,LPTEXTMETRICW);
+BOOL WINAPI GetViewportExtEx(HDC,LPSIZE);
+BOOL WINAPI GetViewportOrgEx(HDC,LPPOINT);
+BOOL WINAPI GetWindowExtEx(HDC,LPSIZE);
+BOOL WINAPI GetWindowOrgEx(HDC,LPPOINT);
+UINT WINAPI GetWinMetaFileBits(HENHMETAFILE,UINT,LPBYTE,INT,HDC);
+BOOL WINAPI GetWorldTransform(HDC,LPXFORM);
+int WINAPI IntersectClipRect(HDC,int,int,int,int);
+BOOL WINAPI InvertRgn(HDC,HRGN);
+BOOL WINAPI LineDDA(int,int,int,int,LINEDDAPROC,LPARAM);
+BOOL WINAPI LineTo(HDC,int,int);
+BOOL WINAPI LPtoDP(HDC,LPPOINT,int);
+BOOL WINAPI MaskBlt(HDC,int,int,int,int,HDC,int,int,HBITMAP,int,int,DWORD);
+BOOL WINAPI ModifyWorldTransform(HDC,const XFORM*,DWORD);
+BOOL WINAPI MoveToEx(HDC,int,int,LPPOINT);
+int WINAPI OffsetClipRgn(HDC,int,int);
+int WINAPI OffsetRgn(HRGN,int,int);
+BOOL WINAPI OffsetViewportOrgEx(HDC,int,int,LPPOINT);
+BOOL WINAPI OffsetWindowOrgEx(HDC,int,int,LPPOINT);
+BOOL WINAPI PaintRgn(HDC,HRGN);
+BOOL WINAPI PatBlt(HDC,int,int,int,int,DWORD);
+HRGN WINAPI PathToRegion(HDC);
+BOOL WINAPI Pie(HDC,int,int,int,int,int,int,int,int);
+BOOL WINAPI PlayEnhMetaFile(HDC,HENHMETAFILE,LPCRECT);
+BOOL WINAPI PlayEnhMetaFileRecord(HDC,LPHANDLETABLE,const ENHMETARECORD*,UINT);
+BOOL WINAPI PlayMetaFile(HDC,HMETAFILE);
+BOOL WINAPI PlayMetaFileRecord(HDC,LPHANDLETABLE,LPMETARECORD,UINT);
+BOOL WINAPI PlgBlt(HDC,const POINT*,HDC,int,int,int,int,HBITMAP,int,int);
+BOOL WINAPI PolyBezier(HDC,const POINT*,DWORD);
+BOOL WINAPI PolyBezierTo(HDC,const POINT*,DWORD);
+BOOL WINAPI PolyDraw(HDC,const POINT*,const BYTE*,int);
+BOOL WINAPI Polygon(HDC,const POINT*,int);
+BOOL WINAPI Polyline(HDC,const POINT*,int);
+BOOL WINAPI PolylineTo(HDC,const POINT*,DWORD);
+BOOL WINAPI PolyPolygon(HDC,const POINT*,const INT*,int);
+BOOL WINAPI PolyPolyline(HDC,const POINT*,const DWORD*,DWORD);
+BOOL WINAPI PolyTextOutA(HDC,const POLYTEXTA*,int);
+BOOL WINAPI PolyTextOutW(HDC,const POLYTEXTW*,int);
+BOOL WINAPI PtInRegion(HRGN,int,int);
+BOOL WINAPI PtVisible(HDC,int,int);
+UINT WINAPI RealizePalette(HDC);
+BOOL WINAPI Rectangle(HDC,int,int,int,int);
+BOOL WINAPI RectInRegion(HRGN,LPCRECT);
+BOOL WINAPI RectVisible(HDC,LPCRECT);
+BOOL WINAPI RemoveFontResourceA(LPCSTR);
+BOOL WINAPI RemoveFontResourceW(LPCWSTR);
+HDC WINAPI ResetDCA(HDC,const DEVMODEA*);
+HDC WINAPI ResetDCW(HDC,const DEVMODEW*);
+BOOL WINAPI ResizePalette(HPALETTE,UINT);
+BOOL WINAPI RestoreDC(HDC,int);
+BOOL WINAPI RoundRect(HDC,int,int,int,int,int,int);
+int WINAPI SaveDC(HDC);
+BOOL WINAPI ScaleViewportExtEx(HDC,int,int,int,int,LPSIZE);
+BOOL WINAPI ScaleWindowExtEx(HDC,int,int,int,int,LPSIZE);
+BOOL WINAPI SelectClipPath(HDC,int);
+int WINAPI SelectClipRgn(HDC,HRGN);
+HGDIOBJ WINAPI SelectObject(HDC,HGDIOBJ);
+HPALETTE WINAPI SelectPalette(HDC,HPALETTE,BOOL);
+int WINAPI SetAbortProc(HDC,ABORTPROC);
+int WINAPI SetArcDirection(HDC,int);
+LONG WINAPI SetBitmapBits(HBITMAP,DWORD,PCVOID);
+BOOL WINAPI SetBitmapDimensionEx(HBITMAP,int,int,LPSIZE);
+COLORREF WINAPI SetBkColor(HDC,COLORREF);
+int WINAPI SetBkMode(HDC,int);
+UINT WINAPI SetBoundsRect(HDC,LPCRECT,UINT);
+BOOL WINAPI SetBrushOrgEx(HDC,int,int,LPPOINT);
+BOOL WINAPI SetColorAdjustment(HDC,const COLORADJUSTMENT*);
+BOOL WINAPI SetColorSpace(HDC,HCOLORSPACE);
+BOOL WINAPI SetDeviceGammaRamp(HDC,PVOID);
+UINT WINAPI SetDIBColorTable(HDC,UINT,UINT,const RGBQUAD*);
+int WINAPI SetDIBits(HDC,HBITMAP,UINT,UINT,PCVOID,const BITMAPINFO*,UINT);
+int WINAPI SetDIBitsToDevice(HDC,int,int,DWORD,DWORD,int,int,UINT,UINT,PCVOID,const BITMAPINFO*,UINT);
+HENHMETAFILE WINAPI SetEnhMetaFileBits(UINT,const BYTE*);
+int WINAPI SetGraphicsMode(HDC,int);
+int WINAPI SetICMMode(HDC,int);
+BOOL WINAPI SetICMProfileA(HDC,LPSTR);
+BOOL WINAPI SetICMProfileW(HDC,LPWSTR);
+int WINAPI SetMapMode(HDC,int);
+DWORD WINAPI SetMapperFlags(HDC,DWORD);
+HMETAFILE WINAPI SetMetaFileBitsEx(UINT,const BYTE *);
+int WINAPI SetMetaRgn(HDC);
+BOOL WINAPI SetMiterLimit(HDC,FLOAT,PFLOAT);
+UINT WINAPI SetPaletteEntries(HPALETTE,UINT,UINT,const PALETTEENTRY*);
+COLORREF WINAPI SetPixel(HDC,int,int,COLORREF);
+BOOL WINAPI SetPixelFormat(HDC,int,PIXELFORMATDESCRIPTOR*);
+BOOL WINAPI SetPixelV(HDC,int,int,COLORREF);
+int WINAPI SetPolyFillMode(HDC,int);
+BOOL WINAPI SetRectRgn(HRGN,int,int,int,int);
+int WINAPI SetROP2(HDC,int);
+int WINAPI SetStretchBltMode(HDC,int);
+UINT WINAPI SetSystemPaletteUse(HDC,UINT);
+UINT WINAPI SetTextAlign(HDC,UINT);
+int WINAPI SetTextCharacterExtra(HDC,int);
+COLORREF WINAPI SetTextColor(HDC,COLORREF);
+BOOL WINAPI SetTextJustification(HDC,int,int);
+BOOL WINAPI SetViewportExtEx(HDC,int,int,LPSIZE);
+BOOL WINAPI SetViewportOrgEx(HDC,int,int,LPPOINT);
+BOOL WINAPI SetWindowExtEx(HDC,int,int,LPSIZE);
+BOOL WINAPI SetWindowOrgEx(HDC,int,int,LPPOINT);
+HENHMETAFILE WINAPI SetWinMetaFileBits(UINT,const BYTE*,HDC,const METAFILEPICT*);
+BOOL WINAPI SetWorldTransform(HDC,const XFORM *);
+int WINAPI StartDocA(HDC,const DOCINFO*);
+int WINAPI StartDocW(HDC,const DOCINFO*);
+int WINAPI StartPage(HDC);
+BOOL WINAPI StretchBlt(HDC,int,int,int,int,HDC,int,int,int,int,DWORD);
+int WINAPI StretchDIBits(HDC,int,int,int,int,int,int,int,int,const VOID *,const BITMAPINFO *,UINT,DWORD);
+BOOL WINAPI StrokeAndFillPath(HDC);
+BOOL WINAPI StrokePath(HDC);
+BOOL WINAPI SwapBuffers(HDC);
+BOOL WINAPI TextOutA(HDC,int,int,LPCSTR,int);
+BOOL WINAPI TextOutW(HDC,int,int,LPCWSTR,int);
+BOOL WINAPI TranslateCharsetInfo(PDWORD,LPCHARSETINFO,DWORD);
+BOOL WINAPI UnrealizeObject(HGDIOBJ);
+BOOL WINAPI UpdateColors(HDC);
+BOOL WINAPI UpdateICMRegKeyA(DWORD,DWORD,LPSTR,UINT);
+BOOL WINAPI UpdateICMRegKeyW(DWORD,DWORD,LPWSTR,UINT);
+BOOL WINAPI WidenPath(HDC);
+BOOL WINAPI wglCopyContext(HGLRC,HGLRC,UINT);
+HGLRC WINAPI wglCreateContext(HDC);
+HGLRC WINAPI wglCreateLayerContext(HDC,int);
+BOOL WINAPI wglDeleteContext(HGLRC);
+BOOL WINAPI wglDescribeLayerPlane(HDC,int,int,UINT,LPLAYERPLANEDESCRIPTOR);
+HGLRC WINAPI wglGetCurrentContext(void);
+HDC WINAPI wglGetCurrentDC(void);
+int WINAPI wglGetLayerPaletteEntries(HDC,int,int,int,COLORREF*);
+PROC WINAPI wglGetProcAddress(LPCSTR);
+BOOL WINAPI wglMakeCurrent(HDC,HGLRC);
+BOOL WINAPI wglRealizeLayerPalette(HDC,int,BOOL);
+int WINAPI wglSetLayerPaletteEntries(HDC,int,int,int,const COLORREF*);
+BOOL WINAPI wglShareLists(HGLRC,HGLRC);
+BOOL WINAPI wglSwapLayerBuffers(HDC,UINT);
+BOOL WINAPI wglUseFontBitmapsA(HDC,DWORD,DWORD,DWORD);
+BOOL WINAPI wglUseFontBitmapsW(HDC,DWORD,DWORD,DWORD);
+BOOL WINAPI wglUseFontOutlinesA(HDC,DWORD,DWORD,DWORD,FLOAT,FLOAT,int,LPGLYPHMETRICSFLOAT);
+BOOL WINAPI wglUseFontOutlinesW(HDC,DWORD,DWORD,DWORD,FLOAT,FLOAT,int,LPGLYPHMETRICSFLOAT);
+
+#ifdef UNICODE
+typedef WCHAR BCHAR;
+typedef LOGFONTW LOGFONT,*PLOGFONT,*LPLOGFONT;
+typedef TEXTMETRICW TEXTMETRIC,*PTEXTMETRIC,*LPTEXTMETRIC;
+#define ICMENUMPROC ICMENUMPROCW
+#define FONTENUMPROC FONTENUMPROCW
+typedef DEVMODEW DEVMODE,*PDEVMODE,*LPDEVMODE;
+typedef EXTLOGFONTW EXTLOGFONT,*PEXTLOGFONT,*LPEXTLOGFONT;
+typedef GCP_RESULTSW GCP_RESULTS,*LPGCP_RESULTS;
+typedef OUTLINETEXTMETRICW OUTLINETEXTMETRIC,*POUTLINETEXTMETRIC,*LPOUTLINETEXTMETRIC;
+typedef POLYTEXTW POLYTEXT;
+typedef LOGCOLORSPACEW LOGCOLORSPACE,*LPLOGCOLORSPACE;
+typedef NEWTEXTMETRICW NEWTEXTMETRIC,*PNEWTEXTMETRIC,*LPNEWTEXTMETRIC;
+typedef NEWTEXTMETRICEXW NEWTEXTMETRICEX;
+typedef ENUMLOGFONTW ENUMLOGFONT,*LPENUMLOGFONT;
+typedef ENUMLOGFONTEXW ENUMLOGFONTEX,*LPENUMLOGFONTEX;
+#define AddFontResource AddFontResourceW
+#define CopyEnhMetaFile CopyEnhMetaFileW
+#define CopyMetaFile CopyMetaFileW
+#define CreateDC CreateDCW
+#define CreateEnhMetaFile CreateEnhMetaFileW
+#define CreateFont CreateFontW
+#define CreateFontIndirect CreateFontIndirectW
+#define CreateIC CreateICW
+#define CreateMetaFile CreateMetaFileW
+#define CreateScalableFontResource CreateScalableFontResourceW
+#define DeviceCapabilities DeviceCapabilitiesW
+#define EnumFontFamilies EnumFontFamiliesW
+#define EnumFontFamiliesEx EnumFontFamiliesExW
+#define EnumFonts EnumFontsW
+#define EnumICMProfiles EnumICMProfilesW
+#define ExtTextOut ExtTextOutW
+#define GetCharABCWidthsFloat GetCharABCWidthsFloatW
+#define GetCharABCWidths GetCharABCWidthsW
+#define GetCharacterPlacement GetCharacterPlacementW
+#define GetCharWidth32 GetCharWidth32W
+#define GetCharWidthFloat GetCharWidthFloatW
+#define GetCharWidth GetCharWidthW
+#define GetEnhMetaFile GetEnhMetaFileW
+#define GetEnhMetaFileDescription GetEnhMetaFileDescriptionW
+#define GetGlyphOutline GetGlyphOutlineW
+#define GetICMProfile GetICMProfileW
+#define GetKerningPairs GetKerningPairsW
+#define GetLogColorSpace GetLogColorSpaceW
+#define GetMetaFile GetMetaFileW
+#define GetObject GetObjectW
+#define GetOutlineTextMetrics GetOutlineTextMetricsW
+#define GetTextExtentPoint GetTextExtentPointW
+#define GetTextExtentExPoint GetTextExtentExPointW
+#define GetTextExtentPoint32 GetTextExtentPoint32W
+#define GetTextFace GetTextFaceW
+#define GetTextMetrics GetTextMetricsW
+#define PolyTextOut PolyTextOutW
+#define RemoveFontResource RemoveFontResourceW
+#define ResetDC ResetDCW
+#define SetICMProfile SetICMProfileW
+#define StartDoc StartDocW
+#define TextOut TextOutW
+#define UpdateICMRegKey UpdateICMRegKeyW
+#define wglUseFontBitmaps wglUseFontBitmapsW
+#define wglUseFontOutlines wglUseFontOutlinesW
+#else
+typedef BYTE BCHAR;
+typedef LOGFONTA LOGFONT,*PLOGFONT,*LPLOGFONT;
+typedef TEXTMETRICA TEXTMETRIC,*PTEXTMETRIC,*LPTEXTMETRIC;
+#define ICMENUMPROC ICMENUMPROCA
+#define FONTENUMPROC FONTENUMPROCA
+typedef DEVMODEA DEVMODE,*PDEVMODE,*LPDEVMODE;
+typedef EXTLOGFONTA EXTLOGFONT,*PEXTLOGFONT,*LPEXTLOGFONT;
+typedef GCP_RESULTSA GCP_RESULTS,*LPGCP_RESULTS;
+typedef OUTLINETEXTMETRICA OUTLINETEXTMETRIC,*POUTLINETEXTMETRIC,*LPOUTLINETEXTMETRIC;
+typedef POLYTEXTA POLYTEXT;
+typedef LOGCOLORSPACEA LOGCOLORSPACE,*LPLOGCOLORSPACE;
+typedef NEWTEXTMETRICA NEWTEXTMETRIC,*PNEWTEXTMETRIC,*LPNEWTEXTMETRIC;
+typedef NEWTEXTMETRICEXA NEWTEXTMETRICEX;
+typedef ENUMLOGFONTA ENUMLOGFONT,*LPENUMLOGFONT;
+typedef ENUMLOGFONTEXA ENUMLOGFONTEX,*LPENUMLOGFONTEX;
+#define AddFontResource AddFontResourceA
+#define CopyEnhMetaFile CopyEnhMetaFileA
+#define CopyMetaFile CopyMetaFileA
+#define CreateDC CreateDCA
+#define CreateEnhMetaFile CreateEnhMetaFileA
+#define CreateFont CreateFontA
+#define CreateFontIndirect CreateFontIndirectA
+#define CreateIC CreateICA
+#define CreateMetaFile CreateMetaFileA
+#define CreateScalableFontResource CreateScalableFontResourceA
+#define DeviceCapabilities DeviceCapabilitiesA
+#define EnumFontFamilies EnumFontFamiliesA
+#define EnumFontFamiliesEx EnumFontFamiliesExA
+#define EnumFonts EnumFontsA
+#define EnumICMProfiles EnumICMProfilesA
+#define ExtTextOut ExtTextOutA
+#define GetCharWidthFloat GetCharWidthFloatA
+#define GetCharWidth GetCharWidthA
+#define GetCharacterPlacement GetCharacterPlacementA
+#define GetCharABCWidths GetCharABCWidthsA
+#define GetCharABCWidthsFloat GetCharABCWidthsFloatA
+#define GetCharWidth32 GetCharWidth32A
+#define GetEnhMetaFile GetEnhMetaFileA
+#define GetEnhMetaFileDescription GetEnhMetaFileDescriptionA
+#define GetGlyphOutline GetGlyphOutlineA
+#define GetICMProfile GetICMProfileA
+#define GetKerningPairs GetKerningPairsA
+#define GetLogColorSpace GetLogColorSpaceA
+#define GetMetaFile GetMetaFileA
+#define GetObject GetObjectA
+#define GetOutlineTextMetrics GetOutlineTextMetricsA
+#define GetTextExtentPoint GetTextExtentPointA
+#define GetTextExtentExPoint GetTextExtentExPointA
+#define GetTextExtentPoint32 GetTextExtentPoint32A
+#define GetTextFace GetTextFaceA
+#define GetTextMetrics GetTextMetricsA
+#define PolyTextOut PolyTextOutA
+#define RemoveFontResource RemoveFontResourceA
+#define ResetDC ResetDCA
+#define SetICMProfile SetICMProfileA
+#define StartDoc StartDocA
+#define TextOut TextOutA
+#define UpdateICMRegKey UpdateICMRegKeyA
+#define wglUseFontBitmaps wglUseFontBitmapsA
+#define wglUseFontOutlines wglUseFontOutlinesA
+#endif
+#endif
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/winsup/w32api/include/wininet.h b/winsup/w32api/include/wininet.h
new file mode 100644
index 000000000..007d8a0de
--- /dev/null
+++ b/winsup/w32api/include/wininet.h
@@ -0,0 +1,881 @@
+#ifndef _WININET_H
+#define _WININET_H
+#include <windows.h>
+#ifdef __cplusplus
+extern "C" {
+#endif
+#define INTERNET_INVALID_PORT_NUMBER 0
+#define INTERNET_DEFAULT_FTP_PORT 21
+#define INTERNET_DEFAULT_GOPHER_PORT 70
+#define INTERNET_DEFAULT_HTTP_PORT 80
+#define INTERNET_DEFAULT_HTTPS_PORT 443
+#define INTERNET_DEFAULT_SOCKS_PORT 1080
+#define MAX_CACHE_ENTRY_INFO_SIZE 4096
+#define INTERNET_MAX_HOST_NAME_LENGTH 256
+#define INTERNET_MAX_USER_NAME_LENGTH 128
+#define INTERNET_MAX_PASSWORD_LENGTH 128
+#define INTERNET_MAX_PORT_NUMBER_LENGTH 5
+#define INTERNET_MAX_PORT_NUMBER_VALUE 65535
+#define INTERNET_MAX_PATH_LENGTH 2048
+#define INTERNET_MAX_SCHEME_LENGTH 32
+#define INTERNET_MAX_URL_LENGTH (INTERNET_MAX_SCHEME_LENGTH+sizeof("://")+INTERNET_MAX_PATH_LENGTH)
+#define INTERNET_KEEP_ALIVE_UNKNOWN ((DWORD)-1)
+#define INTERNET_KEEP_ALIVE_ENABLED 1
+#define INTERNET_KEEP_ALIVE_DISABLED 0
+#define INTERNET_REQFLAG_FROM_CACHE 1
+#define INTERNET_REQFLAG_ASYNC 2
+#define INTERNET_FLAG_RELOAD 0x80000000
+#define INTERNET_FLAG_RAW_DATA 0x40000000
+#define INTERNET_FLAG_EXISTING_CONNECT 0x20000000
+#define INTERNET_FLAG_ASYNC 0x10000000
+#define INTERNET_FLAG_PASSIVE 0x08000000
+#define INTERNET_FLAG_NO_CACHE_WRITE 0x04000000
+#define INTERNET_FLAG_DONT_CACHE INTERNET_FLAG_NO_CACHE_WRITE
+#define INTERNET_FLAG_MAKE_PERSISTENT 0x02000000
+#define INTERNET_FLAG_OFFLINE 0x1000000
+#define INTERNET_FLAG_SECURE 0x800000
+#define INTERNET_FLAG_KEEP_CONNECTION 0x400000
+#define INTERNET_FLAG_NO_AUTO_REDIRECT 0x200000
+#define INTERNET_FLAG_READ_PREFETCH 0x100000
+#define INTERNET_FLAG_NO_COOKIES 0x80000
+#define INTERNET_FLAG_NO_AUTH 0x40000
+#define INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTP 0x8000
+#define INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTPS 0x4000
+#define INTERNET_FLAG_IGNORE_CERT_DATE_INVALID 0x2000
+#define INTERNET_FLAG_IGNORE_CERT_CN_INVALID 0x1000
+#define INTERNET_FLAG_MUST_CACHE_REQUEST 16
+#define INTERNET_FLAG_RESYNCHRONIZE 0x800
+#define INTERNET_FLAG_HYPERLINK 0x400
+#define INTERNET_FLAG_NO_UI 0x200
+#define INTERNET_FLAG_TRANSFER_ASCII FTP_TRANSFER_TYPE_ASCII
+#define INTERNET_FLAG_TRANSFER_BINARY FTP_TRANSFER_TYPE_BINARY
+#define SECURITY_INTERNET_MASK (INTERNET_FLAG_IGNORE_CERT_CN_INVALID|INTERNET_FLAG_IGNORE_CERT_DATE_INVALID|INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTPS|INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTP)
+#define SECURITY_SET_MASK SECURITY_INTERNET_MASK
+#define INTERNET_FLAGS_MASK (INTERNET_FLAG_RELOAD|INTERNET_FLAG_RAW_DATA|INTERNET_FLAG_EXISTING_CONNECT|\
+INTERNET_FLAG_ASYNC|INTERNET_FLAG_PASSIVE|INTERNET_FLAG_NO_CACHE_WRITE|INTERNET_FLAG_MAKE_PERSISTENT|INTERNET_FLAG_OFFLINE|\
+INTERNET_FLAG_SECURE|INTERNET_FLAG_KEEP_CONNECTION|INTERNET_FLAG_NO_AUTO_REDIRECT|INTERNET_FLAG_READ_PREFETCH |\
+INTERNET_FLAG_NO_COOKIES|INTERNET_FLAG_NO_AUTH|SECURITY_INTERNET_MASK|INTERNET_FLAG_TRANSFER_ASCII|INTERNET_FLAG_TRANSFER_BINARY\
+|INTERNET_FLAG_RESYNCHRONIZE|INTERNET_FLAG_MUST_CACHE_REQUEST|INTERNET_FLAG_HYPERLINK|INTERNET_FLAG_NO_UI)
+#define INTERNET_OPTIONS_MASK (~INTERNET_FLAGS_MASK)
+#define INTERNET_NO_CALLBACK 0
+#define INTERNET_RFC1123_FORMAT 0
+#define INTERNET_RFC1123_BUFSIZE 30
+#define ICU_ESCAPE 0x80000000
+#define ICU_USERNAME 0x40000000
+#define ICU_NO_ENCODE 0x20000000
+#define ICU_DECODE 0x10000000
+#define ICU_NO_META 0x08000000
+#define ICU_ENCODE_SPACES_ONLY 0x04000000
+#define ICU_BROWSER_MODE 0x02000000
+#define INTERNET_OPEN_TYPE_PRECONFIG 0
+#define INTERNET_OPEN_TYPE_DIRECT 1
+#define INTERNET_OPEN_TYPE_PROXY 3
+#define PRE_CONFIG_INTERNET_ACCESS INTERNET_OPEN_TYPE_PRECONFIG
+#define LOCAL_INTERNET_ACCESS INTERNET_OPEN_TYPE_DIRECT
+#define GATEWAY_INTERNET_ACCESS 2
+#define CERN_PROXY_INTERNET_ACCESS INTERNET_OPEN_TYPE_PROXY
+#define ISO_GLOBAL 1
+#define ISO_REGISTRY 2
+#define ISO_VALID_FLAGS (ISO_GLOBAL | ISO_REGISTRY)
+#define INTERNET_OPTION_CALLBACK 1
+#define INTERNET_OPTION_CONNECT_TIMEOUT 2
+#define INTERNET_OPTION_CONNECT_RETRIES 3
+#define INTERNET_OPTION_CONNECT_BACKOFF 4
+#define INTERNET_OPTION_SEND_TIMEOUT 5
+#define INTERNET_OPTION_CONTROL_SEND_TIMEOUT INTERNET_OPTION_SEND_TIMEOUT
+#define INTERNET_OPTION_RECEIVE_TIMEOUT 6
+#define INTERNET_OPTION_CONTROL_RECEIVE_TIMEOUT INTERNET_OPTION_RECEIVE_TIMEOUT
+#define INTERNET_OPTION_DATA_SEND_TIMEOUT 7
+#define INTERNET_OPTION_DATA_RECEIVE_TIMEOUT 8
+#define INTERNET_OPTION_HANDLE_TYPE 9
+#define INTERNET_OPTION_CONTEXT_VALUE 10
+#define INTERNET_OPTION_LISTEN_TIMEOUT 11
+#define INTERNET_OPTION_READ_BUFFER_SIZE 12
+#define INTERNET_OPTION_WRITE_BUFFER_SIZE 13
+#define INTERNET_OPTION_ASYNC_ID 15
+#define INTERNET_OPTION_ASYNC_PRIORITY 16
+#define INTERNET_OPTION_PARENT_HANDLE 21
+#define INTERNET_OPTION_KEEP_CONNECTION 22
+#define INTERNET_OPTION_REQUEST_FLAGS 23
+#define INTERNET_OPTION_EXTENDED_ERROR 24
+#define INTERNET_OPTION_OFFLINE_MODE 26
+#define INTERNET_OPTION_CACHE_STREAM_HANDLE 27
+#define INTERNET_OPTION_USERNAME 28
+#define INTERNET_OPTION_PASSWORD 29
+#define INTERNET_OPTION_ASYNC 30
+#define INTERNET_OPTION_SECURITY_FLAGS 31
+#define INTERNET_OPTION_SECURITY_CERTIFICATE_STRUCT 32
+#define INTERNET_OPTION_DATAFILE_NAME 33
+#define INTERNET_OPTION_URL 34
+#define INTERNET_OPTION_SECURITY_CERTIFICATE 35
+#define INTERNET_OPTION_SECURITY_KEY_BITNESS 36
+#define INTERNET_OPTION_REFRESH 37
+#define INTERNET_OPTION_PROXY 38
+#define INTERNET_OPTION_SETTINGS_CHANGED 39
+#define INTERNET_OPTION_VERSION 40
+#define INTERNET_OPTION_USER_AGENT 41
+#define INTERNET_FIRST_OPTION INTERNET_OPTION_CALLBACK
+#define INTERNET_LAST_OPTION INTERNET_OPTION_USER_AGENT
+#define INTERNET_PRIORITY_FOREGROUND 1000
+#define INTERNET_HANDLE_TYPE_INTERNET 1
+#define INTERNET_HANDLE_TYPE_CONNECT_FTP 2
+#define INTERNET_HANDLE_TYPE_CONNECT_GOPHER 3
+#define INTERNET_HANDLE_TYPE_CONNECT_HTTP 4
+#define INTERNET_HANDLE_TYPE_FTP_FIND 5
+#define INTERNET_HANDLE_TYPE_FTP_FIND_HTML 6
+#define INTERNET_HANDLE_TYPE_FTP_FILE 7
+#define INTERNET_HANDLE_TYPE_FTP_FILE_HTML 8
+#define INTERNET_HANDLE_TYPE_GOPHER_FIND 9
+#define INTERNET_HANDLE_TYPE_GOPHER_FIND_HTML 10
+#define INTERNET_HANDLE_TYPE_GOPHER_FILE 11
+#define INTERNET_HANDLE_TYPE_GOPHER_FILE_HTML 12
+#define INTERNET_HANDLE_TYPE_HTTP_REQUEST 13
+#define SECURITY_FLAG_SECURE 1
+#define SECURITY_FLAG_SSL 2
+#define SECURITY_FLAG_SSL3 4
+#define SECURITY_FLAG_PCT 8
+#define SECURITY_FLAG_PCT4 16
+#define SECURITY_FLAG_IETFSSL4 0x20
+#define SECURITY_FLAG_40BIT 0x10000000
+#define SECURITY_FLAG_128BIT 0x20000000
+#define SECURITY_FLAG_56BIT 0x40000000
+#define SECURITY_FLAG_UNKNOWNBIT 0x80000000
+#define SECURITY_FLAG_NORMALBITNESS SECURITY_FLAG_40BIT
+#define SECURITY_FLAG_IGNORE_CERT_CN_INVALID INTERNET_FLAG_IGNORE_CERT_CN_INVALID
+#define SECURITY_FLAG_IGNORE_CERT_DATE_INVALID INTERNET_FLAG_IGNORE_CERT_DATE_INVALID
+#define SECURITY_FLAG_IGNORE_REDIRECT_TO_HTTPS INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTPS
+#define SECURITY_FLAG_IGNORE_REDIRECT_TO_HTTP INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTP
+#define INTERNET_SERVICE_FTP 1
+#define INTERNET_SERVICE_GOPHER 2
+#define INTERNET_SERVICE_HTTP 3
+#define INTERNET_STATUS_RESOLVING_NAME 10
+#define INTERNET_STATUS_NAME_RESOLVED 11
+#define INTERNET_STATUS_CONNECTING_TO_SERVER 20
+#define INTERNET_STATUS_CONNECTED_TO_SERVER 21
+#define INTERNET_STATUS_SENDING_REQUEST 30
+#define INTERNET_STATUS_REQUEST_SENT 31
+#define INTERNET_STATUS_RECEIVING_RESPONSE 40
+#define INTERNET_STATUS_RESPONSE_RECEIVED 41
+#define INTERNET_STATUS_CTL_RESPONSE_RECEIVED 42
+#define INTERNET_STATUS_PREFETCH 43
+#define INTERNET_STATUS_CLOSING_CONNECTION 50
+#define INTERNET_STATUS_CONNECTION_CLOSED 51
+#define INTERNET_STATUS_HANDLE_CREATED 60
+#define INTERNET_STATUS_HANDLE_CLOSING 70
+#define INTERNET_STATUS_REQUEST_COMPLETE 100
+#define INTERNET_STATUS_REDIRECT 110
+#define INTERNET_INVALID_STATUS_CALLBACK ((INTERNET_STATUS_CALLBACK)(-1L))
+#define FTP_TRANSFER_TYPE_UNKNOWN 0
+#define FTP_TRANSFER_TYPE_ASCII 1
+#define FTP_TRANSFER_TYPE_BINARY 2
+#define FTP_TRANSFER_TYPE_MASK (FTP_TRANSFER_TYPE_ASCII | FTP_TRANSFER_TYPE_BINARY)
+#define MAX_GOPHER_DISPLAY_TEXT 128
+#define MAX_GOPHER_SELECTOR_TEXT 256
+#define MAX_GOPHER_HOST_NAME INTERNET_MAX_HOST_NAME_LENGTH
+#define MAX_GOPHER_LOCATOR_LENGTH (1+MAX_GOPHER_DISPLAY_TEXT+1+MAX_GOPHER_SELECTOR_TEXT+1+MAX_GOPHER_HOST_NAME+1+INTERNET_MAX_PORT_NUMBER_LENGTH+1+1+2)
+#define GOPHER_TYPE_TEXT_FILE 1
+#define GOPHER_TYPE_DIRECTORY 2
+#define GOPHER_TYPE_CSO 4
+#define GOPHER_TYPE_ERROR 8
+#define GOPHER_TYPE_MAC_BINHEX 16
+#define GOPHER_TYPE_DOS_ARCHIVE 32
+#define GOPHER_TYPE_UNIX_UUENCODED 64
+#define GOPHER_TYPE_INDEX_SERVER 128
+#define GOPHER_TYPE_TELNET 256
+#define GOPHER_TYPE_BINARY 512
+#define GOPHER_TYPE_REDUNDANT 1024
+#define GOPHER_TYPE_TN3270 0x800
+#define GOPHER_TYPE_GIF 0x1000
+#define GOPHER_TYPE_IMAGE 0x2000
+#define GOPHER_TYPE_BITMAP 0x4000
+#define GOPHER_TYPE_MOVIE 0x8000
+#define GOPHER_TYPE_SOUND 0x10000
+#define GOPHER_TYPE_HTML 0x20000
+#define GOPHER_TYPE_PDF 0x40000
+#define GOPHER_TYPE_CALENDAR 0x80000
+#define GOPHER_TYPE_INLINE 0x100000
+#define GOPHER_TYPE_UNKNOWN 0x20000000
+#define GOPHER_TYPE_ASK 0x40000000
+#define GOPHER_TYPE_GOPHER_PLUS 0x80000000
+#define IS_GOPHER_FILE(t) (BOOL)(((t)&GOPHER_TYPE_FILE_MASK)?TRUE:FALSE)
+#define IS_GOPHER_DIRECTORY(t) (BOOL)(((t)&GOPHER_TYPE_DIRECTORY)?TRUE:FALSE)
+#define IS_GOPHER_PHONE_SERVER(t) (BOOL)(((t)&GOPHER_TYPE_CSO)?TRUE:FALSE)
+#define IS_GOPHER_ERROR(t) (BOOL)(((t)&GOPHER_TYPE_ERROR)?TRUE:FALSE)
+#define IS_GOPHER_INDEX_SERVER(t) (BOOL)(((t)&GOPHER_TYPE_INDEX_SERVER)?TRUE:FALSE)
+#define IS_GOPHER_TELNET_SESSION(t) (BOOL)(((t)&GOPHER_TYPE_TELNET)?TRUE:FALSE)
+#define IS_GOPHER_BACKUP_SERVER(t) (BOOL)(((t)&GOPHER_TYPE_REDUNDANT)?TRUE:FALSE)
+#define IS_GOPHER_TN3270_SESSION(t) (BOOL)(((t)&GOPHER_TYPE_TN3270)?TRUE:FALSE)
+#define IS_GOPHER_ASK(t) (BOOL)(((t)&GOPHER_TYPE_ASK)?TRUE:FALSE)
+#define IS_GOPHER_PLUS(t) (BOOL)(((t)&GOPHER_TYPE_GOPHER_PLUS)?TRUE:FALSE)
+#define IS_GOPHER_TYPE_KNOWN(t) (BOOL)(((t)&GOPHER_TYPE_UNKNOWN)?FALSE:TRUE)
+#define GOPHER_TYPE_FILE_MASK (GOPHER_TYPE_TEXT_FILE|GOPHER_TYPE_MAC_BINHEX|GOPHER_TYPE_DOS_ARCHIVE|\
+GOPHER_TYPE_UNIX_UUENCODED|GOPHER_TYPE_BINARY|GOPHER_TYPE_GIF|GOPHER_TYPE_IMAGE|GOPHER_TYPE_BITMAP\
+|GOPHER_TYPE_MOVIE|GOPHER_TYPE_SOUND|GOPHER_TYPE_HTML|GOPHER_TYPE_PDF|GOPHER_TYPE_CALENDAR|GOPHER_TYPE_INLINE)
+#define MAX_GOPHER_CATEGORY_NAME 128
+#define MAX_GOPHER_ATTRIBUTE_NAME 128
+#define MIN_GOPHER_ATTRIBUTE_LENGTH 256
+#define GOPHER_INFO_CATEGORY TEXT("+INFO")
+#define GOPHER_ADMIN_CATEGORY TEXT("+ADMIN")
+#define GOPHER_VIEWS_CATEGORY TEXT("+VIEWS")
+#define GOPHER_ABSTRACT_CATEGORY TEXT("+ABSTRACT")
+#define GOPHER_VERONICA_CATEGORY TEXT("+VERONICA")
+#define GOPHER_ADMIN_ATTRIBUTE TEXT("Admin")
+#define GOPHER_MOD_DATE_ATTRIBUTE TEXT("Mod-Date")
+#define GOPHER_TTL_ATTRIBUTE TEXT("TTL")
+#define GOPHER_SCORE_ATTRIBUTE TEXT("Score")
+#define GOPHER_RANGE_ATTRIBUTE TEXT("Score-range")
+#define GOPHER_SITE_ATTRIBUTE TEXT("Site")
+#define GOPHER_ORG_ATTRIBUTE TEXT("Org")
+#define GOPHER_LOCATION_ATTRIBUTE TEXT("Loc")
+#define GOPHER_GEOG_ATTRIBUTE TEXT("Geog")
+#define GOPHER_TIMEZONE_ATTRIBUTE TEXT("TZ")
+#define GOPHER_PROVIDER_ATTRIBUTE TEXT("Provider")
+#define GOPHER_VERSION_ATTRIBUTE TEXT("Version")
+#define GOPHER_ABSTRACT_ATTRIBUTE TEXT("Abstract")
+#define GOPHER_VIEW_ATTRIBUTE TEXT("View")
+#define GOPHER_TREEWALK_ATTRIBUTE TEXT("treewalk")
+#define GOPHER_ATTRIBUTE_ID_BASE 0xabcccc00
+#define GOPHER_CATEGORY_ID_ALL (GOPHER_ATTRIBUTE_ID_BASE+1)
+#define GOPHER_CATEGORY_ID_INFO (GOPHER_ATTRIBUTE_ID_BASE+2)
+#define GOPHER_CATEGORY_ID_ADMIN (GOPHER_ATTRIBUTE_ID_BASE+3)
+#define GOPHER_CATEGORY_ID_VIEWS (GOPHER_ATTRIBUTE_ID_BASE+4)
+#define GOPHER_CATEGORY_ID_ABSTRACT (GOPHER_ATTRIBUTE_ID_BASE+5)
+#define GOPHER_CATEGORY_ID_VERONICA (GOPHER_ATTRIBUTE_ID_BASE+6)
+#define GOPHER_CATEGORY_ID_ASK (GOPHER_ATTRIBUTE_ID_BASE+7)
+#define GOPHER_CATEGORY_ID_UNKNOWN (GOPHER_ATTRIBUTE_ID_BASE+8)
+#define GOPHER_ATTRIBUTE_ID_ALL (GOPHER_ATTRIBUTE_ID_BASE+9)
+#define GOPHER_ATTRIBUTE_ID_ADMIN (GOPHER_ATTRIBUTE_ID_BASE+10)
+#define GOPHER_ATTRIBUTE_ID_MOD_DATE (GOPHER_ATTRIBUTE_ID_BASE+11)
+#define GOPHER_ATTRIBUTE_ID_TTL (GOPHER_ATTRIBUTE_ID_BASE+12)
+#define GOPHER_ATTRIBUTE_ID_SCORE (GOPHER_ATTRIBUTE_ID_BASE+13)
+#define GOPHER_ATTRIBUTE_ID_RANGE (GOPHER_ATTRIBUTE_ID_BASE+14)
+#define GOPHER_ATTRIBUTE_ID_SITE (GOPHER_ATTRIBUTE_ID_BASE+15)
+#define GOPHER_ATTRIBUTE_ID_ORG (GOPHER_ATTRIBUTE_ID_BASE+16)
+#define GOPHER_ATTRIBUTE_ID_LOCATION (GOPHER_ATTRIBUTE_ID_BASE+17)
+#define GOPHER_ATTRIBUTE_ID_GEOG (GOPHER_ATTRIBUTE_ID_BASE+18)
+#define GOPHER_ATTRIBUTE_ID_TIMEZONE (GOPHER_ATTRIBUTE_ID_BASE+19)
+#define GOPHER_ATTRIBUTE_ID_PROVIDER (GOPHER_ATTRIBUTE_ID_BASE+20)
+#define GOPHER_ATTRIBUTE_ID_VERSION (GOPHER_ATTRIBUTE_ID_BASE+21)
+#define GOPHER_ATTRIBUTE_ID_ABSTRACT (GOPHER_ATTRIBUTE_ID_BASE+22)
+#define GOPHER_ATTRIBUTE_ID_VIEW (GOPHER_ATTRIBUTE_ID_BASE+23)
+#define GOPHER_ATTRIBUTE_ID_TREEWALK (GOPHER_ATTRIBUTE_ID_BASE+24)
+#define GOPHER_ATTRIBUTE_ID_UNKNOWN (GOPHER_ATTRIBUTE_ID_BASE+25)
+#define HTTP_MAJOR_VERSION 1
+#define HTTP_MINOR_VERSION 0
+#define HTTP_VERSION TEXT("HTTP/1.0")
+#define HTTP_QUERY_MIME_VERSION 0
+#define HTTP_QUERY_CONTENT_TYPE 1
+#define HTTP_QUERY_CONTENT_TRANSFER_ENCODING 2
+#define HTTP_QUERY_CONTENT_ID 3
+#define HTTP_QUERY_CONTENT_DESCRIPTION 4
+#define HTTP_QUERY_CONTENT_LENGTH 5
+#define HTTP_QUERY_CONTENT_LANGUAGE 6
+#define HTTP_QUERY_ALLOW 7
+#define HTTP_QUERY_PUBLIC 8
+#define HTTP_QUERY_DATE 9
+#define HTTP_QUERY_EXPIRES 10
+#define HTTP_QUERY_LAST_MODIFIED 11
+#define HTTP_QUERY_MESSAGE_ID 12
+#define HTTP_QUERY_URI 13
+#define HTTP_QUERY_DERIVED_FROM 14
+#define HTTP_QUERY_COST 15
+#define HTTP_QUERY_LINK 16
+#define HTTP_QUERY_PRAGMA 17
+#define HTTP_QUERY_VERSION 18
+#define HTTP_QUERY_STATUS_CODE 19
+#define HTTP_QUERY_STATUS_TEXT 20
+#define HTTP_QUERY_RAW_HEADERS 21
+#define HTTP_QUERY_RAW_HEADERS_CRLF 22
+#define HTTP_QUERY_CONNECTION 23
+#define HTTP_QUERY_ACCEPT 24
+#define HTTP_QUERY_ACCEPT_CHARSET 25
+#define HTTP_QUERY_ACCEPT_ENCODING 26
+#define HTTP_QUERY_ACCEPT_LANGUAGE 27
+#define HTTP_QUERY_AUTHORIZATION 28
+#define HTTP_QUERY_CONTENT_ENCODING 29
+#define HTTP_QUERY_FORWARDED 30
+#define HTTP_QUERY_FROM 31
+#define HTTP_QUERY_IF_MODIFIED_SINCE 32
+#define HTTP_QUERY_LOCATION 33
+#define HTTP_QUERY_ORIG_URI 34
+#define HTTP_QUERY_REFERER 35
+#define HTTP_QUERY_RETRY_AFTER 36
+#define HTTP_QUERY_SERVER 37
+#define HTTP_QUERY_TITLE 38
+#define HTTP_QUERY_USER_AGENT 39
+#define HTTP_QUERY_WWW_AUTHENTICATE 40
+#define HTTP_QUERY_PROXY_AUTHENTICATE 41
+#define HTTP_QUERY_ACCEPT_RANGES 42
+#define HTTP_QUERY_SET_COOKIE 43
+#define HTTP_QUERY_COOKIE 44
+#define HTTP_QUERY_REQUEST_METHOD 45
+#define HTTP_QUERY_MAX 45
+#define HTTP_QUERY_CUSTOM 65535
+#define HTTP_QUERY_FLAG_REQUEST_HEADERS 0x80000000
+#define HTTP_QUERY_FLAG_SYSTEMTIME 0x40000000
+#define HTTP_QUERY_FLAG_NUMBER 0x20000000
+#define HTTP_QUERY_FLAG_COALESCE 0x10000000
+#define HTTP_QUERY_MODIFIER_FLAGS_MASK (HTTP_QUERY_FLAG_REQUEST_HEADERS|HTTP_QUERY_FLAG_SYSTEMTIME|HTTP_QUERY_FLAG_NUMBER|HTTP_QUERY_FLAG_COALESCE)
+#define HTTP_QUERY_HEADER_MASK (~HTTP_QUERY_MODIFIER_FLAGS_MASK)
+#define HTTP_STATUS_OK 200
+#define HTTP_STATUS_CREATED 201
+#define HTTP_STATUS_ACCEPTED 202
+#define HTTP_STATUS_PARTIAL 203
+#define HTTP_STATUS_NO_CONTENT 204
+#define HTTP_STATUS_AMBIGUOUS 300
+#define HTTP_STATUS_MOVED 301
+#define HTTP_STATUS_REDIRECT 302
+#define HTTP_STATUS_REDIRECT_METHOD 303
+#define HTTP_STATUS_NOT_MODIFIED 304
+#define HTTP_STATUS_BAD_REQUEST 400
+#define HTTP_STATUS_DENIED 401
+#define HTTP_STATUS_PAYMENT_REQ 402
+#define HTTP_STATUS_FORBIDDEN 403
+#define HTTP_STATUS_NOT_FOUND 404
+#define HTTP_STATUS_BAD_METHOD 405
+#define HTTP_STATUS_NONE_ACCEPTABLE 406
+#define HTTP_STATUS_PROXY_AUTH_REQ 407
+#define HTTP_STATUS_REQUEST_TIMEOUT 408
+#define HTTP_STATUS_CONFLICT 409
+#define HTTP_STATUS_GONE 410
+#define HTTP_STATUS_AUTH_REFUSED 411
+#define HTTP_STATUS_SERVER_ERROR 500
+#define HTTP_STATUS_NOT_SUPPORTED 501
+#define HTTP_STATUS_BAD_GATEWAY 502
+#define HTTP_STATUS_SERVICE_UNAVAIL 503
+#define HTTP_STATUS_GATEWAY_TIMEOUT 504
+#define INTERNET_PREFETCH_PROGRESS 0
+#define INTERNET_PREFETCH_COMPLETE 1
+#define INTERNET_PREFETCH_ABORTED 2
+#define FLAGS_ERROR_UI_FILTER_FOR_ERRORS 0x01
+#define FLAGS_ERROR_UI_FLAGS_CHANGE_OPTIONS 0x02
+#define FLAGS_ERROR_UI_FLAGS_GENERATE_DATA 0x04
+#define FLAGS_ERROR_UI_FLAGS_NO_UI 0x08
+#define HTTP_ADDREQ_INDEX_MASK 0x0000FFFF
+#define HTTP_ADDREQ_FLAGS_MASK 0xFFFF0000
+#define HTTP_ADDREQ_FLAG_ADD_IF_NEW 0x10000000
+#define HTTP_ADDREQ_FLAG_ADD 0x20000000
+#define HTTP_ADDREQ_FLAG_COALESCE_WITH_COMMA 0x40000000
+#define HTTP_ADDREQ_FLAG_COALESCE_WITH_SEMICOLON 0x01000000
+#define HTTP_ADDREQ_FLAG_COALESCE HTTP_ADDREQ_FLAG_COALESCE_WITH_COMMA
+#define HTTP_ADDREQ_FLAG_REPLACE 0x80000000
+#define INTERNET_ERROR_BASE 12000
+#define ERROR_INTERNET_OUT_OF_HANDLES (INTERNET_ERROR_BASE+1)
+#define ERROR_INTERNET_TIMEOUT (INTERNET_ERROR_BASE+2)
+#define ERROR_INTERNET_EXTENDED_ERROR (INTERNET_ERROR_BASE+3)
+#define ERROR_INTERNET_INTERNAL_ERROR (INTERNET_ERROR_BASE+4)
+#define ERROR_INTERNET_INVALID_URL (INTERNET_ERROR_BASE+5)
+#define ERROR_INTERNET_UNRECOGNIZED_SCHEME (INTERNET_ERROR_BASE+6)
+#define ERROR_INTERNET_NAME_NOT_RESOLVED (INTERNET_ERROR_BASE+7)
+#define ERROR_INTERNET_PROTOCOL_NOT_FOUND (INTERNET_ERROR_BASE+8)
+#define ERROR_INTERNET_INVALID_OPTION (INTERNET_ERROR_BASE+9)
+#define ERROR_INTERNET_BAD_OPTION_LENGTH (INTERNET_ERROR_BASE+10)
+#define ERROR_INTERNET_OPTION_NOT_SETTABLE (INTERNET_ERROR_BASE+11)
+#define ERROR_INTERNET_SHUTDOWN (INTERNET_ERROR_BASE+12)
+#define ERROR_INTERNET_INCORRECT_USER_NAME (INTERNET_ERROR_BASE+13)
+#define ERROR_INTERNET_INCORRECT_PASSWORD (INTERNET_ERROR_BASE+14)
+#define ERROR_INTERNET_LOGIN_FAILURE (INTERNET_ERROR_BASE+15)
+#define ERROR_INTERNET_INVALID_OPERATION (INTERNET_ERROR_BASE+16)
+#define ERROR_INTERNET_OPERATION_CANCELLED (INTERNET_ERROR_BASE+17)
+#define ERROR_INTERNET_INCORRECT_HANDLE_TYPE (INTERNET_ERROR_BASE+18)
+#define ERROR_INTERNET_INCORRECT_HANDLE_STATE (INTERNET_ERROR_BASE+19)
+#define ERROR_INTERNET_NOT_PROXY_REQUEST (INTERNET_ERROR_BASE+20)
+#define ERROR_INTERNET_REGISTRY_VALUE_NOT_FOUND (INTERNET_ERROR_BASE+21)
+#define ERROR_INTERNET_BAD_REGISTRY_PARAMETER (INTERNET_ERROR_BASE+22)
+#define ERROR_INTERNET_NO_DIRECT_ACCESS (INTERNET_ERROR_BASE+23)
+#define ERROR_INTERNET_NO_CONTEXT (INTERNET_ERROR_BASE+24)
+#define ERROR_INTERNET_NO_CALLBACK (INTERNET_ERROR_BASE+25)
+#define ERROR_INTERNET_REQUEST_PENDING (INTERNET_ERROR_BASE+26)
+#define ERROR_INTERNET_INCORRECT_FORMAT (INTERNET_ERROR_BASE+27)
+#define ERROR_INTERNET_ITEM_NOT_FOUND (INTERNET_ERROR_BASE+28)
+#define ERROR_INTERNET_CANNOT_CONNECT (INTERNET_ERROR_BASE+29)
+#define ERROR_INTERNET_CONNECTION_ABORTED (INTERNET_ERROR_BASE+30)
+#define ERROR_INTERNET_CONNECTION_RESET (INTERNET_ERROR_BASE+31)
+#define ERROR_INTERNET_FORCE_RETRY (INTERNET_ERROR_BASE+32)
+#define ERROR_INTERNET_INVALID_PROXY_REQUEST (INTERNET_ERROR_BASE+33)
+#define ERROR_INTERNET_NEED_UI (INTERNET_ERROR_BASE+34)
+#define ERROR_INTERNET_HANDLE_EXISTS (INTERNET_ERROR_BASE+36)
+#define ERROR_INTERNET_SEC_CERT_DATE_INVALID (INTERNET_ERROR_BASE+37)
+#define ERROR_INTERNET_SEC_CERT_CN_INVALID (INTERNET_ERROR_BASE+38)
+#define ERROR_INTERNET_HTTP_TO_HTTPS_ON_REDIR (INTERNET_ERROR_BASE+39)
+#define ERROR_INTERNET_HTTPS_TO_HTTP_ON_REDIR (INTERNET_ERROR_BASE+40)
+#define ERROR_INTERNET_MIXED_SECURITY (INTERNET_ERROR_BASE+41)
+#define ERROR_INTERNET_CHG_POST_IS_NON_SECURE (INTERNET_ERROR_BASE+42)
+#define ERROR_INTERNET_POST_IS_NON_SECURE (INTERNET_ERROR_BASE+43)
+#define ERROR_INTERNET_CLIENT_AUTH_CERT_NEEDED (INTERNET_ERROR_BASE+44)
+#define ERROR_INTERNET_INVALID_CA (INTERNET_ERROR_BASE+45)
+#define ERROR_INTERNET_CLIENT_AUTH_NOT_SETUP (INTERNET_ERROR_BASE+46)
+#define ERROR_INTERNET_ASYNC_THREAD_FAILED (INTERNET_ERROR_BASE+47)
+#define ERROR_INTERNET_REDIRECT_SCHEME_CHANGE (INTERNET_ERROR_BASE+48)
+#define ERROR_FTP_TRANSFER_IN_PROGRESS (INTERNET_ERROR_BASE+110)
+#define ERROR_FTP_DROPPED (INTERNET_ERROR_BASE+111)
+#define ERROR_GOPHER_PROTOCOL_ERROR (INTERNET_ERROR_BASE+130)
+#define ERROR_GOPHER_NOT_FILE (INTERNET_ERROR_BASE+131)
+#define ERROR_GOPHER_DATA_ERROR (INTERNET_ERROR_BASE+132)
+#define ERROR_GOPHER_END_OF_DATA (INTERNET_ERROR_BASE+133)
+#define ERROR_GOPHER_INVALID_LOCATOR (INTERNET_ERROR_BASE+134)
+#define ERROR_GOPHER_INCORRECT_LOCATOR_TYPE (INTERNET_ERROR_BASE+135)
+#define ERROR_GOPHER_NOT_GOPHER_PLUS (INTERNET_ERROR_BASE+136)
+#define ERROR_GOPHER_ATTRIBUTE_NOT_FOUND (INTERNET_ERROR_BASE+137)
+#define ERROR_GOPHER_UNKNOWN_LOCATOR (INTERNET_ERROR_BASE+138)
+#define ERROR_HTTP_HEADER_NOT_FOUND (INTERNET_ERROR_BASE+150)
+#define ERROR_HTTP_DOWNLEVEL_SERVER (INTERNET_ERROR_BASE+151)
+#define ERROR_HTTP_INVALID_SERVER_RESPONSE (INTERNET_ERROR_BASE+152)
+#define ERROR_HTTP_INVALID_HEADER (INTERNET_ERROR_BASE+153)
+#define ERROR_HTTP_INVALID_QUERY_REQUEST (INTERNET_ERROR_BASE+154)
+#define ERROR_HTTP_HEADER_ALREADY_EXISTS (INTERNET_ERROR_BASE+155)
+#define ERROR_HTTP_REDIRECT_FAILED (INTERNET_ERROR_BASE+156)
+#define ERROR_HTTP_NOT_REDIRECTED (INTERNET_ERROR_BASE+160)
+#define ERROR_INTERNET_SECURITY_CHANNEL_ERROR (INTERNET_ERROR_BASE+157)
+#define ERROR_INTERNET_UNABLE_TO_CACHE_FILE (INTERNET_ERROR_BASE+158)
+#define ERROR_INTERNET_TCPIP_NOT_INSTALLED (INTERNET_ERROR_BASE+159)
+#define INTERNET_ERROR_LAST ERROR_INTERNET_TCPIP_NOT_INSTALLED
+#define URLCACHEAPI DECLSPEC_IMPORT
+#define NORMAL_CACHE_ENTRY 1
+#define STABLE_CACHE_ENTRY 2
+#define STICKY_CACHE_ENTRY 4
+#define SPARSE_CACHE_ENTRY 0x10000
+#define OCX_CACHE_ENTRY 0x20000
+#define COOKIE_CACHE_ENTRY 0x100000
+#define URLHISTORY_CACHE_ENTRY 0x200000
+#define CACHE_ENTRY_ATTRIBUTE_FC 4
+#define CACHE_ENTRY_HITRATE_FC 0x10
+#define CACHE_ENTRY_MODTIME_FC 0x40
+#define CACHE_ENTRY_EXPTIME_FC 0x80
+#define CACHE_ENTRY_ACCTIME_FC 0x100
+#define CACHE_ENTRY_SYNCTIME_FC 0x200
+#define CACHE_ENTRY_HEADERINFO_FC 0x400
+#define HSR_ASYNC WININET_API_FLAG_ASYNC
+#define HSR_SYNC WININET_API_FLAG_SYNC
+#define HSR_USE_CONTEXT WININET_API_FLAG_USE_CONTEXT
+#define HSR_INITIATE 8
+#define HSR_DOWNLOAD 16
+#define HSR_CHUNKED 32
+
+typedef PVOID HINTERNET;
+typedef HINTERNET *LPHINTERNET;
+typedef WORD INTERNET_PORT,*LPINTERNET_PORT;
+typedef enum {
+ INTERNET_SCHEME_PARTIAL = -2, INTERNET_SCHEME_UNKNOWN = -1,
+ INTERNET_SCHEME_DEFAULT = 0, INTERNET_SCHEME_FTP, INTERNET_SCHEME_GOPHER,
+ INTERNET_SCHEME_HTTP, INTERNET_SCHEME_HTTPS, INTERNET_SCHEME_FILE,
+ INTERNET_SCHEME_NEWS, INTERNET_SCHEME_MAILTO, INTERNET_SCHEME_SOCKS,
+ INTERNET_SCHEME_FIRST = INTERNET_SCHEME_FTP, INTERNET_SCHEME_LAST = INTERNET_SCHEME_SOCKS
+} INTERNET_SCHEME,*LPINTERNET_SCHEME;
+typedef struct { DWORD dwResult; DWORD dwError; } INTERNET_ASYNC_RESULT,*LPINTERNET_ASYNC_RESULT;
+typedef struct { DWORD dwStatus; DWORD dwSize; } INTERNET_PREFETCH_STATUS,*LPINTERNET_PREFETCH_STATUS;
+typedef struct {
+ DWORD dwAccessType;
+ LPCTSTR lpszProxy;
+ LPCTSTR lpszProxyBypass;
+} INTERNET_PROXY_INFO,*LPINTERNET_PROXY_INFO;
+typedef struct {
+ DWORD dwMajorVersion;
+ DWORD dwMinorVersion;
+} INTERNET_VERSION_INFO,*LPINTERNET_VERSION_INFO;
+typedef struct {
+ DWORD dwStructSize;
+ LPSTR lpszScheme;
+ DWORD dwSchemeLength;
+ INTERNET_SCHEME nScheme;
+ LPSTR lpszHostName;
+ DWORD dwHostNameLength;
+ INTERNET_PORT nPort;
+ LPSTR lpszUserName;
+ DWORD dwUserNameLength;
+ LPSTR lpszPassword;
+ DWORD dwPasswordLength;
+ LPSTR lpszUrlPath;
+ DWORD dwUrlPathLength;
+ LPSTR lpszExtraInfo;
+ DWORD dwExtraInfoLength;
+} URL_COMPONENTSA,*LPURL_COMPONENTSA;
+typedef struct {
+ DWORD dwStructSize;
+ LPWSTR lpszScheme;
+ DWORD dwSchemeLength;
+ INTERNET_SCHEME nScheme;
+ LPWSTR lpszHostName;
+ DWORD dwHostNameLength;
+ INTERNET_PORT nPort;
+ LPWSTR lpszUserName;
+ DWORD dwUserNameLength;
+ LPWSTR lpszPassword;
+ DWORD dwPasswordLength;
+ LPWSTR lpszUrlPath;
+ DWORD dwUrlPathLength;
+ LPWSTR lpszExtraInfo;
+ DWORD dwExtraInfoLength;
+} URL_COMPONENTSW,*LPURL_COMPONENTSW;
+typedef struct {
+ FILETIME ftExpiry;
+ FILETIME ftStart;
+ LPTSTR lpszSubjectInfo;
+ LPTSTR lpszIssuerInfo;
+ LPTSTR lpszProtocolName;
+ LPTSTR lpszSignatureAlgName;
+ LPTSTR lpszEncryptionAlgName;
+ DWORD dwKeySize;
+} INTERNET_CERTIFICATE_INFO,*LPINTERNET_CERTIFICATE_INFO;
+typedef VOID (CALLBACK * INTERNET_STATUS_CALLBACK)(HINTERNET,DWORD,DWORD,PVOID,DWORD);
+typedef INTERNET_STATUS_CALLBACK * LPINTERNET_STATUS_CALLBACK;
+typedef struct {
+ CHAR DisplayString[MAX_GOPHER_DISPLAY_TEXT+1];
+ DWORD GopherType;
+ DWORD SizeLow;
+ DWORD SizeHigh;
+ FILETIME LastModificationTime;
+ CHAR Locator[MAX_GOPHER_LOCATOR_LENGTH+1];
+} GOPHER_FIND_DATAA,*LPGOPHER_FIND_DATAA;
+typedef struct {
+ WCHAR DisplayString[MAX_GOPHER_DISPLAY_TEXT+1];
+ DWORD GopherType;
+ DWORD SizeLow;
+ DWORD SizeHigh;
+ FILETIME LastModificationTime;
+ WCHAR Locator[MAX_GOPHER_LOCATOR_LENGTH+1];
+} GOPHER_FIND_DATAW,*LPGOPHER_FIND_DATAW;
+typedef struct {
+ LPCTSTR Comment;
+ LPCTSTR EmailAddress;
+} GOPHER_ADMIN_ATTRIBUTE_TYPE,*LPGOPHER_ADMIN_ATTRIBUTE_TYPE;
+typedef struct {FILETIME DateAndTime;} GOPHER_MOD_DATE_ATTRIBUTE_TYPE,*LPGOPHER_MOD_DATE_ATTRIBUTE_TYPE;
+typedef struct {DWORD Ttl;} GOPHER_TTL_ATTRIBUTE_TYPE,*LPGOPHER_TTL_ATTRIBUTE_TYPE;
+typedef struct {INT Score;} GOPHER_SCORE_ATTRIBUTE_TYPE,*LPGOPHER_SCORE_ATTRIBUTE_TYPE;
+typedef struct {
+ INT LowerBound;
+ INT UpperBound;
+} GOPHER_SCORE_RANGE_ATTRIBUTE_TYPE,*LPGOPHER_SCORE_RANGE_ATTRIBUTE_TYPE;
+typedef struct {LPCTSTR Site;} GOPHER_SITE_ATTRIBUTE_TYPE,*LPGOPHER_SITE_ATTRIBUTE_TYPE;
+typedef struct {LPCTSTR Organization;} GOPHER_ORGANIZATION_ATTRIBUTE_TYPE,*LPGOPHER_ORGANIZATION_ATTRIBUTE_TYPE;
+typedef struct {LPCTSTR Location;} GOPHER_LOCATION_ATTRIBUTE_TYPE,*LPGOPHER_LOCATION_ATTRIBUTE_TYPE;
+typedef struct {
+ INT DegreesNorth;
+ INT MinutesNorth;
+ INT SecondsNorth;
+ INT DegreesEast;
+ INT MinutesEast;
+ INT SecondsEast;
+} GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE,*LPGOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE;
+typedef struct {INT Zone;} GOPHER_TIMEZONE_ATTRIBUTE_TYPE,*LPGOPHER_TIMEZONE_ATTRIBUTE_TYPE;
+typedef struct {LPCTSTR Provider;} GOPHER_PROVIDER_ATTRIBUTE_TYPE,*LPGOPHER_PROVIDER_ATTRIBUTE_TYPE;
+typedef struct {LPCTSTR Version;} GOPHER_VERSION_ATTRIBUTE_TYPE,*LPGOPHER_VERSION_ATTRIBUTE_TYPE;
+typedef struct {
+ LPCTSTR ShortAbstract;
+ LPCTSTR AbstractFile;
+} GOPHER_ABSTRACT_ATTRIBUTE_TYPE,*LPGOPHER_ABSTRACT_ATTRIBUTE_TYPE;
+typedef struct {
+ LPCTSTR ContentType;
+ LPCTSTR Language;
+ DWORD Size;
+} GOPHER_VIEW_ATTRIBUTE_TYPE,*LPGOPHER_VIEW_ATTRIBUTE_TYPE;
+typedef struct {BOOL TreeWalk;} GOPHER_VERONICA_ATTRIBUTE_TYPE,*LPGOPHER_VERONICA_ATTRIBUTE_TYPE;
+typedef struct {
+ LPCTSTR QuestionType;
+ LPCTSTR QuestionText;
+} GOPHER_ASK_ATTRIBUTE_TYPE,*LPGOPHER_ASK_ATTRIBUTE_TYPE;
+typedef struct {LPCTSTR Text;} GOPHER_UNKNOWN_ATTRIBUTE_TYPE,*LPGOPHER_UNKNOWN_ATTRIBUTE_TYPE;
+typedef struct {
+ DWORD CategoryId;
+ DWORD AttributeId;
+ union {
+ GOPHER_ADMIN_ATTRIBUTE_TYPE Admin;
+ GOPHER_MOD_DATE_ATTRIBUTE_TYPE ModDate;
+ GOPHER_TTL_ATTRIBUTE_TYPE Ttl;
+ GOPHER_SCORE_ATTRIBUTE_TYPE Score;
+ GOPHER_SCORE_RANGE_ATTRIBUTE_TYPE ScoreRange;
+ GOPHER_SITE_ATTRIBUTE_TYPE Site;
+ GOPHER_ORGANIZATION_ATTRIBUTE_TYPE Organization;
+ GOPHER_LOCATION_ATTRIBUTE_TYPE Location;
+ GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE GeographicalLocation;
+ GOPHER_TIMEZONE_ATTRIBUTE_TYPE TimeZone;
+ GOPHER_PROVIDER_ATTRIBUTE_TYPE Provider;
+ GOPHER_VERSION_ATTRIBUTE_TYPE Version;
+ GOPHER_ABSTRACT_ATTRIBUTE_TYPE Abstract;
+ GOPHER_VIEW_ATTRIBUTE_TYPE View;
+ GOPHER_VERONICA_ATTRIBUTE_TYPE Veronica;
+ GOPHER_ASK_ATTRIBUTE_TYPE Ask;
+ GOPHER_UNKNOWN_ATTRIBUTE_TYPE Unknown;
+ } AttributeType;
+} GOPHER_ATTRIBUTE_TYPE,*LPGOPHER_ATTRIBUTE_TYPE;
+typedef BOOL(CALLBACK *GOPHER_ATTRIBUTE_ENUMERATOR)(LPGOPHER_ATTRIBUTE_TYPE,DWORD);
+typedef struct _INTERNET_CACHE_ENTRY_INFOA {
+ DWORD dwStructSize;
+ LPSTR lpszSourceUrlName;
+ LPSTR lpszLocalFileName;
+ DWORD CacheEntryType;
+ DWORD dwUseCount;
+ DWORD dwHitRate;
+ DWORD dwSizeLow;
+ DWORD dwSizeHigh;
+ FILETIME LastModifiedTime;
+ FILETIME ExpireTime;
+ FILETIME LastAccessTime;
+ FILETIME LastSyncTime;
+ PBYTE lpHeaderInfo;
+ DWORD dwHeaderInfoSize;
+ LPSTR lpszFileExtension;
+ DWORD dwReserved;
+} INTERNET_CACHE_ENTRY_INFOA,*LPINTERNET_CACHE_ENTRY_INFOA;
+typedef struct _INTERNET_CACHE_ENTRY_INFOW {
+ DWORD dwStructSize;
+ LPSTR lpszSourceUrlName;
+ LPWSTR lpszLocalFileName;
+ DWORD CacheEntryType;
+ DWORD dwUseCount;
+ DWORD dwHitRate;
+ DWORD dwSizeLow;
+ DWORD dwSizeHigh;
+ FILETIME LastModifiedTime;
+ FILETIME ExpireTime;
+ FILETIME LastAccessTime;
+ FILETIME LastSyncTime;
+ PBYTE lpHeaderInfo;
+ DWORD dwHeaderInfoSize;
+ LPWSTR lpszFileExtension;
+ DWORD dwReserved;
+} INTERNET_CACHE_ENTRY_INFOW,*LPINTERNET_CACHE_ENTRY_INFOW;
+typedef struct _INTERNET_BUFFERSA {
+ DWORD dwStructSize;
+ struct _INTERNET_BUFFERSA *Next;
+ LPCSTR lpcszHeader;
+ DWORD dwHeadersLength;
+ DWORD dwHeadersTotal;
+ LPVOID lpvBuffer;
+ DWORD dwBufferLength;
+ DWORD dwBufferTotal;
+ DWORD dwOffsetLow;
+ DWORD dwOffsetHigh;
+} INTERNET_BUFFERSA,*LPINTERNET_BUFFERSA;
+typedef struct _INTERNET_BUFFERSW {
+ DWORD dwStructSize;
+ struct _INTERNET_BUFFERS *Next;
+ LPCWSTR lpcszHeader;
+ DWORD dwHeadersLength;
+ DWORD dwHeadersTotal;
+ LPVOID lpvBuffer;
+ DWORD dwBufferLength;
+ DWORD dwBufferTotal;
+ DWORD dwOffsetLow;
+ DWORD dwOffsetHigh;
+} INTERNET_BUFFERSW,*LPINTERNET_BUFFERSW;
+
+#ifdef UNICODE
+typedef URL_COMPONENTSW URL_COMPONENTS;
+typedef LPURL_COMPONENTSW LPURL_COMPONENTS;
+typedef GOPHER_FIND_DATAW GOPHER_FIND_DATA;
+typedef LPGOPHER_FIND_DATAW LPGOPHER_FIND_DATA;
+typedef INTERNET_CACHE_ENTRY_INFOW INTERNET_CACHE_ENTRY_INFO;
+typedef LPINTERNET_CACHE_ENTRY_INFOW LPINTERNET_CACHE_ENTRY_INFO;
+typedef INTERNET_BUFFERSW INTERNET_BUFFERS,*LPINTERNET_BUFFERS;
+#else
+typedef URL_COMPONENTSA URL_COMPONENTS;
+typedef LPURL_COMPONENTSA LPURL_COMPONENTS;
+typedef GOPHER_FIND_DATAA GOPHER_FIND_DATA;
+typedef LPGOPHER_FIND_DATAA LPGOPHER_FIND_DATA;
+typedef INTERNET_CACHE_ENTRY_INFOA INTERNET_CACHE_ENTRY_INFO;
+typedef LPINTERNET_CACHE_ENTRY_INFOA LPINTERNET_CACHE_ENTRY_INFO;
+typedef INTERNET_BUFFERSA INTERNET_BUFFERS,*LPINTERNET_BUFFERS;
+#endif
+BOOL WINAPI InternetTimeFromSystemTime(SYSTEMTIME*,DWORD,LPSTR,DWORD);
+BOOL WINAPI InternetTimeToSystemTime(LPCSTR,SYSTEMTIME*,DWORD);
+BOOL WINAPI InternetDebugGetLocalTime(SYSTEMTIME*,PDWORD);
+BOOL WINAPI InternetCrackUrlA(LPCSTR,DWORD,DWORD,LPURL_COMPONENTSA);
+BOOL WINAPI InternetCrackUrlW(LPCWSTR,DWORD,DWORD,LPURL_COMPONENTSW);
+BOOL WINAPI InternetCreateUrlA(LPURL_COMPONENTSA,DWORD,LPSTR,PDWORD);
+BOOL WINAPI InternetCreateUrlW(LPURL_COMPONENTSW,DWORD,LPWSTR,PDWORD);
+BOOL WINAPI InternetCanonicalizeUrlA(LPCSTR,LPSTR,PDWORD,DWORD);
+BOOL WINAPI InternetCanonicalizeUrlW(LPCWSTR,LPWSTR,PDWORD,DWORD);
+BOOL WINAPI InternetCombineUrlA(LPCSTR,LPCSTR,LPSTR,PDWORD,DWORD);
+BOOL WINAPI InternetCombineUrlW(LPCWSTR,LPCWSTR,LPWSTR,PDWORD,DWORD);
+HINTERNET WINAPI InternetOpenA(LPCSTR,DWORD,LPCSTR,LPCSTR,DWORD);
+HINTERNET WINAPI InternetOpenW(LPCWSTR,DWORD,LPCWSTR,LPCWSTR,DWORD);
+BOOL WINAPI InternetCloseHandle(HINTERNET);
+HINTERNET WINAPI InternetConnectA(HINTERNET,LPCSTR,INTERNET_PORT,LPCSTR,LPCSTR,DWORD,DWORD,DWORD);
+HINTERNET WINAPI InternetConnectW(HINTERNET,LPCWSTR,INTERNET_PORT,LPCWSTR,LPCWSTR,DWORD,DWORD,DWORD);
+HINTERNET WINAPI InternetOpenUrlA(HINTERNET,LPCSTR,LPCSTR,DWORD,DWORD,DWORD);
+HINTERNET WINAPI InternetOpenUrlW(HINTERNET,LPCWSTR,LPCWSTR,DWORD,DWORD,DWORD);
+BOOL WINAPI InternetReadFile(HINTERNET,PVOID,DWORD,PDWORD);
+DWORD WINAPI InternetSetFilePointer( HINTERNET,LONG,PVOID,DWORD,DWORD);
+BOOL WINAPI InternetWriteFile(HINTERNET,LPCVOID,DWORD,PDWORD);
+BOOL WINAPI InternetQueryDataAvailable( HINTERNET,PDWORD,DWORD,DWORD);
+BOOL WINAPI InternetFindNextFileA(HINTERNET,PVOID);
+BOOL WINAPI InternetFindNextFileW(HINTERNET,PVOID);
+BOOL WINAPI InternetQueryOptionA(HINTERNET,DWORD,PVOID,PDWORD);
+BOOL WINAPI InternetQueryOptionW(HINTERNET,DWORD,PVOID,PDWORD);
+BOOL WINAPI InternetSetOptionA(HINTERNET,DWORD,PVOID,DWORD);
+BOOL WINAPI InternetSetOptionW(HINTERNET,DWORD,PVOID,DWORD);
+BOOL WINAPI InternetSetOptionExA(HINTERNET,DWORD,PVOID,DWORD,DWORD);
+BOOL WINAPI InternetSetOptionExW(HINTERNET,DWORD,PVOID,DWORD,DWORD);
+BOOL WINAPI InternetGetLastResponseInfoA(PDWORD,LPSTR,PDWORD);
+BOOL WINAPI InternetGetLastResponseInfoW(PDWORD,LPWSTR,PDWORD);
+INTERNET_STATUS_CALLBACK WINAPI InternetSetStatusCallback(HINTERNET,INTERNET_STATUS_CALLBACK);
+HINTERNET WINAPI FtpFindFirstFileA(HINTERNET,LPCSTR,LPWIN32_FIND_DATA,DWORD,DWORD);
+HINTERNET WINAPI FtpFindFirstFileW(HINTERNET,LPCWSTR,LPWIN32_FIND_DATA,DWORD,DWORD);
+BOOL WINAPI FtpGetFileA(HINTERNET,LPCSTR,LPCSTR,BOOL,DWORD,DWORD,DWORD);
+BOOL WINAPI FtpGetFileW( HINTERNET,LPCWSTR,LPCWSTR,BOOL,DWORD,DWORD,DWORD);
+BOOL WINAPI FtpPutFileA(HINTERNET,LPCSTR,LPCSTR,DWORD,DWORD);
+BOOL WINAPI FtpPutFileW(HINTERNET,LPCWSTR,LPCWSTR,DWORD,DWORD);
+BOOL WINAPI FtpDeleteFileA(HINTERNET,LPCSTR);
+BOOL WINAPI FtpDeleteFileW(HINTERNET,LPCWSTR);
+BOOL WINAPI FtpRenameFileA(HINTERNET, LPCSTR,LPCSTR);
+BOOL WINAPI FtpRenameFileW(HINTERNET,LPCWSTR,LPCWSTR);
+HINTERNET WINAPI FtpOpenFileA(HINTERNET,LPCSTR,DWORD,DWORD,DWORD);
+HINTERNET WINAPI FtpOpenFileW(HINTERNET,LPCWSTR,DWORD,DWORD,DWORD);
+BOOL WINAPI FtpCreateDirectoryA(HINTERNET,LPCSTR);
+BOOL WINAPI FtpCreateDirectoryW(HINTERNET,LPCWSTR);
+BOOL WINAPI FtpRemoveDirectoryA(HINTERNET,LPCSTR);
+BOOL WINAPI FtpRemoveDirectoryW(HINTERNET,LPCWSTR);
+BOOL WINAPI FtpSetCurrentDirectoryA(HINTERNET,LPCSTR);
+BOOL WINAPI FtpSetCurrentDirectoryW(HINTERNET,LPCWSTR);
+BOOL WINAPI FtpGetCurrentDirectoryA(HINTERNET,LPSTR,PDWORD);
+BOOL WINAPI FtpGetCurrentDirectoryW(HINTERNET,LPWSTR,PDWORD);
+BOOL WINAPI FtpCommandA(HINTERNET,BOOL,DWORD,LPCSTR,DWORD);
+BOOL WINAPI FtpCommandW( HINTERNET,BOOL,DWORD,LPCWSTR,DWORD);
+BOOL WINAPI GopherCreateLocatorA(LPCSTR,INTERNET_PORT,LPCSTR,LPCSTR,DWORD,LPSTR,PDWORD);
+BOOL WINAPI GopherCreateLocatorW(LPCWSTR,INTERNET_PORT,LPCWSTR,LPCWSTR,DWORD,LPWSTR,PDWORD);
+BOOL WINAPI GopherGetLocatorTypeA(LPCSTR,PDWORD);
+BOOL WINAPI GopherGetLocatorTypeW(LPCWSTR,PDWORD);
+HINTERNET WINAPI GopherFindFirstFileA(HINTERNET,LPCSTR,LPCSTR,LPGOPHER_FIND_DATAA,DWORD,DWORD);
+HINTERNET WINAPI GopherFindFirstFileW(HINTERNET,LPCWSTR,LPCWSTR,LPGOPHER_FIND_DATAW,DWORD,DWORD);
+HINTERNET WINAPI GopherOpenFileA(HINTERNET,LPCSTR,LPCSTR,DWORD,DWORD);
+HINTERNET WINAPI GopherOpenFileW(HINTERNET,LPCWSTR,LPCWSTR,DWORD,DWORD);
+BOOL WINAPI GopherGetAttributeA(HINTERNET,LPCSTR,LPCSTR,LPBYTE,DWORD,PDWORD,GOPHER_ATTRIBUTE_ENUMERATOR,DWORD);
+BOOL WINAPI GopherGetAttributeW(HINTERNET,LPCWSTR,
+LPCWSTR, LPBYTE, DWORD, PDWORD, GOPHER_ATTRIBUTE_ENUMERATOR, DWORD);
+HINTERNET WINAPI HttpOpenRequestA(HINTERNET,LPCSTR,LPCSTR,LPCSTR,LPCSTR,LPCSTR *,DWORD,DWORD);
+HINTERNET WINAPI HttpOpenRequestW(HINTERNET,LPCWSTR,LPCWSTR,LPCWSTR,LPCWSTR,LPCWSTR FAR * lplpszAcceptTypes , DWORD dwFlags, DWORD dwContext);
+BOOL WINAPI HttpAddRequestHeadersA(HINTERNET,LPCSTR,DWORD,DWORD);
+BOOL WINAPI HttpAddRequestHeadersW(HINTERNET,LPCWSTR,DWORD,DWORD);
+BOOL WINAPI HttpSendRequestA(HINTERNET,LPCSTR,DWORD,PVOID,DWORD);
+BOOL WINAPI HttpSendRequestW(HINTERNET,LPCWSTR,DWORD,PVOID,DWORD);
+BOOL WINAPI HttpQueryInfoA(HINTERNET,DWORD,PVOID,PDWORD,PDWORD);
+BOOL WINAPI HttpQueryInfoW(HINTERNET,DWORD,PVOID,PDWORD,PDWORD);
+BOOL WINAPI InternetSetCookieA(LPCSTR,LPCSTR,LPCSTR);
+BOOL WINAPI InternetSetCookieW(LPCSTR,LPCWSTR,LPCWSTR);
+BOOL WINAPI InternetGetCookieA(LPCSTR,LPCSTR,LPSTR,PDWORD);
+BOOL WINAPI InternetGetCookieW(LPCSTR,LPCWSTR,LPWSTR,PDWORD);
+DWORD WINAPI InternetAttemptConnect(DWORD);
+DWORD WINAPI InternetErrorDlg(HWND,HINTERNET,DWORD,DWORD,PVOID *);
+DWORD WINAPI InternetConfirmZoneCrossing(HWND,LPSTR,LPSTR,BOOL);
+BOOL WINAPI CreateUrlCacheEntryA(LPCSTR,DWORD,LPCSTR,LPSTR,DWORD);
+BOOL WINAPI CreateUrlCacheEntryW(LPCSTR,DWORD,LPCSTR,LPWSTR,DWORD);
+BOOL WINAPI CommitUrlCacheEntryA(LPCSTR,LPCSTR,FILETIME,FILETIME,DWORD,LPBYTE,DWORD,LPCSTR,DWORD);
+BOOL WINAPI CommitUrlCacheEntryW(LPCSTR,LPCWSTR,FILETIME,FILETIME,DWORD,LPBYTE,DWORD,LPCWSTR,DWORD);
+BOOL WINAPI RetrieveUrlCacheEntryFileA(LPCSTR,LPINTERNET_CACHE_ENTRY_INFOA,PDWORD,DWORD);
+BOOL WINAPI RetrieveUrlCacheEntryFileW(LPCSTR,LPINTERNET_CACHE_ENTRY_INFOW,PDWORD,DWORD);
+BOOL WINAPI UnlockUrlCacheEntryFile(LPCSTR,DWORD);
+HANDLE WINAPI RetrieveUrlCacheEntryStreamA(LPCSTR,LPINTERNET_CACHE_ENTRY_INFOA,PDWORD,BOOL,DWORD);
+HANDLE WINAPI RetrieveUrlCacheEntryStreamW( LPCSTR,LPINTERNET_CACHE_ENTRY_INFOW,PDWORD,BOOL,DWORD);
+BOOL WINAPI ReadUrlCacheEntryStream(HANDLE,DWORD,PVOID,PDWORD,DWORD);
+BOOL WINAPI UnlockUrlCacheEntryStream( HANDLE,DWORD);
+BOOL WINAPI GetUrlCacheEntryInfoA(LPCSTR,LPINTERNET_CACHE_ENTRY_INFOA,PDWORD);
+BOOL WINAPI GetUrlCacheEntryInfoW(LPCSTR,LPINTERNET_CACHE_ENTRY_INFOW,PDWORD);
+BOOL WINAPI SetUrlCacheEntryInfoA(LPCSTR,LPINTERNET_CACHE_ENTRY_INFOA,DWORD);
+BOOL WINAPI SetUrlCacheEntryInfoW(LPCSTR,LPINTERNET_CACHE_ENTRY_INFOW,DWORD);
+HANDLE WINAPI FindFirstUrlCacheEntryA(LPCSTR,LPINTERNET_CACHE_ENTRY_INFOA,PDWORD);
+HANDLE WINAPI FindFirstUrlCacheEntryW(LPCSTR,LPINTERNET_CACHE_ENTRY_INFOW,PDWORD);
+BOOL WINAPI FindNextUrlCacheEntryA(HANDLE,LPINTERNET_CACHE_ENTRY_INFOA,PDWORD);
+BOOL WINAPI FindNextUrlCacheEntryW(HANDLE,LPINTERNET_CACHE_ENTRY_INFOW,PDWORD);
+BOOL WINAPI FindCloseUrlCache(HANDLE);
+BOOL WINAPI DeleteUrlCacheEntry(LPCSTR);
+DWORD AuthenticateUser(PVOID*,LPSTR,LPSTR,DWORD,LPSTR,DWORD,LPSTR,LPSTR);
+BOOL WINAPI HttpSendRequestExA(HINTERNET,LPINTERNET_BUFFERSA,LPINTERNET_BUFFERSA,DWORD,DWORD);
+BOOL WINAPI HttpSendRequestExW(HINTERNET,LPINTERNET_BUFFERSW,LPINTERNET_BUFFERSW,DWORD,DWORD);
+BOOL WINAPI HttpEndRequestA(HINTERNET,LPINTERNET_BUFFERSA,DWORD,DWORD);
+BOOL WINAPI HttpEndRequestW(HINTERNET,LPINTERNET_BUFFERSW,DWORD,DWORD);
+#ifdef UNICODE
+#define InternetCrackUrl InternetCrackUrlW
+#define InternetCreateUrl InternetCreateUrlW
+#define InternetCanonicalizeUrl InternetCanonicalizeUrlW
+#define InternetCombineUrl InternetCombineUrlW
+#define InternetOpen InternetOpenW
+#define InternetConnect InternetConnectW
+#define InternetOpenUrl InternetOpenUrlW
+#define InternetFindNextFile InternetFindNextFileW
+#define InternetQueryOption InternetQueryOptionW
+#define InternetSetOption InternetSetOptionW
+#define InternetSetOptionEx InternetSetOptionExW
+#define InternetGetLastResponseInfo InternetGetLastResponseInfoW
+#define FtpFindFirstFile FtpFindFirstFileW
+#define FtpGetFile FtpGetFileW
+#define FtpPutFile FtpPutFileW
+#define FtpDeleteFile FtpDeleteFileW
+#define FtpRenameFile FtpRenameFileW
+#define FtpOpenFile FtpOpenFileW
+#define FtpCreateDirectory FtpCreateDirectoryW
+#define FtpRemoveDirectory FtpRemoveDirectoryW
+#define FtpSetCurrentDirectory FtpSetCurrentDirectoryW
+#define FtpGetCurrentDirectory FtpGetCurrentDirectoryW
+#define FtpCommand FtpCommandW
+#define GopherGetLocatorType GopherGetLocatorTypeW
+#define GopherCreateLocator GopherCreateLocatorW
+#define GopherFindFirstFile GopherFindFirstFileW
+#define GopherOpenFile GopherOpenFileW
+#define GopherGetAttribute GopherGetAttributeW
+#define HttpSendRequest HttpSendRequestW
+#define HttpOpenRequest HttpOpenRequestW
+#define HttpAddRequestHeaders HttpAddRequestHeadersW
+#define HttpQueryInfo HttpQueryInfoW
+#define InternetSetCookie InternetSetCookieW
+#define InternetGetCookie InternetGetCookieW
+#define CreateUrlCacheEntry CreateUrlCacheEntryW
+#define RetrieveUrlCacheEntryStream RetrieveUrlCacheEntryStreamW
+#define FindNextUrlCacheEntry FindNextUrlCacheEntryW
+#define CommitUrlCacheEntry CommitUrlCacheEntryW
+#define GetUrlCacheEntryInfo GetUrlCacheEntryInfoW
+#define SetUrlCacheEntryInfo SetUrlCacheEntryInfoW
+#define FindFirstUrlCacheEntry FindFirstUrlCacheEntryW
+#define RetrieveUrlCacheEntryFile RetrieveUrlCacheEntryFileW
+#define HttpSendRequestEx HttpSendRequestExW
+#define HttpEndRequest HttpEndRequestW
+#else
+#define GopherGetAttribute GopherGetAttributeA
+#define InternetCrackUrl InternetCrackUrlA
+#define InternetCreateUrl InternetCreateUrlA
+#define InternetCanonicalizeUrl InternetCanonicalizeUrlA
+#define InternetCombineUrl InternetCombineUrlA
+#define InternetOpen InternetOpenA
+#define InternetConnect InternetConnectA
+#define InternetOpenUrl InternetOpenUrlA
+#define InternetFindNextFile InternetFindNextFileA
+#define InternetQueryOption InternetQueryOptionA
+#define InternetSetOption InternetSetOptionA
+#define InternetSetOptionEx InternetSetOptionExA
+#define InternetGetLastResponseInfo InternetGetLastResponseInfoA
+#define FtpFindFirstFile FtpFindFirstFileA
+#define FtpGetFile FtpGetFileA
+#define FtpPutFile FtpPutFileA
+#define FtpDeleteFile FtpDeleteFileA
+#define FtpRenameFile FtpRenameFileA
+#define FtpOpenFile FtpOpenFileA
+#define FtpCreateDirectory FtpCreateDirectoryA
+#define FtpRemoveDirectory FtpRemoveDirectoryA
+#define FtpSetCurrentDirectory FtpSetCurrentDirectoryA
+#define FtpGetCurrentDirectory FtpGetCurrentDirectoryA
+#define FtpCommand FtpCommandA
+#define GopherGetLocatorType GopherGetLocatorTypeA
+#define GopherCreateLocator GopherCreateLocatorA
+#define GopherFindFirstFile GopherFindFirstFileA
+#define GopherOpenFile GopherOpenFileA
+#define HttpSendRequest HttpSendRequestA
+#define HttpOpenRequest HttpOpenRequestA
+#define HttpAddRequestHeaders HttpAddRequestHeadersA
+#define HttpQueryInfo HttpQueryInfoA
+#define InternetSetCookie InternetSetCookieA
+#define InternetGetCookie InternetGetCookieA
+#define CreateUrlCacheEntry CreateUrlCacheEntryA
+#define RetrieveUrlCacheEntryStream RetrieveUrlCacheEntryStreamA
+#define FindNextUrlCacheEntry FindNextUrlCacheEntryA
+#define CommitUrlCacheEntry CommitUrlCacheEntryA
+#define GetUrlCacheEntryInfo GetUrlCacheEntryInfoA
+#define SetUrlCacheEntryInfo SetUrlCacheEntryInfoA
+#define FindFirstUrlCacheEntry FindFirstUrlCacheEntryA
+#define RetrieveUrlCacheEntryFile RetrieveUrlCacheEntryFileA
+#define HttpSendRequestEx HttpSendRequestExA
+#define HttpEndRequest HttpEndRequestA
+#endif
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/winsup/w32api/include/winioctl.h b/winsup/w32api/include/winioctl.h
new file mode 100644
index 000000000..b9ac29f22
--- /dev/null
+++ b/winsup/w32api/include/winioctl.h
@@ -0,0 +1,255 @@
+#ifndef _WINIOCTL_H
+#define _WINIOCTL_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+#define HIST_NO_OF_BUCKETS 24
+#define HISTOGRAM_BUCKET_SIZE sizeof(HISTOGRAM_BUCKET)
+#define DISK_HISTOGRAM_SIZE sizeof(DISK_HISTOGRAM)
+#define CTL_CODE(t,f,m,a) (((t)<<16)|((a)<<14)|((f)<<2)|(m))
+#define IOCTL_DISK_BASE FILE_DEVICE_DISK
+#define IOCTL_DISK_GET_DRIVE_GEOMETRY CTL_CODE(IOCTL_DISK_BASE,0,METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_DISK_GET_PARTITION_INFO CTL_CODE(IOCTL_DISK_BASE,1,METHOD_BUFFERED,FILE_READ_ACCESS)
+#define IOCTL_DISK_SET_PARTITION_INFO CTL_CODE(IOCTL_DISK_BASE,2,METHOD_BUFFERED,FILE_READ_ACCESS|FILE_WRITE_ACCESS)
+#define IOCTL_DISK_GET_DRIVE_LAYOUT CTL_CODE(IOCTL_DISK_BASE,3,METHOD_BUFFERED,FILE_READ_ACCESS)
+#define IOCTL_DISK_SET_DRIVE_LAYOUT CTL_CODE(IOCTL_DISK_BASE,4,METHOD_BUFFERED,FILE_READ_ACCESS|FILE_WRITE_ACCESS)
+#define IOCTL_DISK_VERIFY CTL_CODE(IOCTL_DISK_BASE,5,METHOD_BUFFERED,FILE_ANY_ACCESS)
+#define IOCTL_DISK_FORMAT_TRACKS CTL_CODE(IOCTL_DISK_BASE,6,METHOD_BUFFERED,FILE_READ_ACCESS|FILE_WRITE_ACCESS)
+#define IOCTL_DISK_REASSIGN_BLOCKS CTL_CODE(IOCTL_DISK_BASE,7,METHOD_BUFFERED,FILE_READ_ACCESS|FILE_WRITE_ACCESS)
+#define IOCTL_DISK_PERFORMANCE CTL_CODE(IOCTL_DISK_BASE,8,METHOD_BUFFERED,FILE_ANY_ACCESS)
+#define IOCTL_DISK_IS_WRITABLE CTL_CODE(IOCTL_DISK_BASE,9,METHOD_BUFFERED,FILE_ANY_ACCESS)
+#define IOCTL_DISK_LOGGING CTL_CODE(IOCTL_DISK_BASE,10,METHOD_BUFFERED,FILE_ANY_ACCESS)
+#define IOCTL_DISK_FORMAT_TRACKS_EX CTL_CODE(IOCTL_DISK_BASE,11,METHOD_BUFFERED,FILE_READ_ACCESS|FILE_WRITE_ACCESS)
+#define IOCTL_DISK_HISTOGRAM_STRUCTURE CTL_CODE(IOCTL_DISK_BASE,12,METHOD_BUFFERED,FILE_ANY_ACCESS)
+#define IOCTL_DISK_HISTOGRAM_DATA CTL_CODE(IOCTL_DISK_BASE,13,METHOD_BUFFERED,FILE_ANY_ACCESS)
+#define IOCTL_DISK_HISTOGRAM_RESET CTL_CODE(IOCTL_DISK_BASE,14,METHOD_BUFFERED,FILE_ANY_ACCESS)
+#define IOCTL_DISK_REQUEST_STRUCTURE CTL_CODE(IOCTL_DISK_BASE,15,METHOD_BUFFERED,FILE_ANY_ACCESS)
+#define IOCTL_DISK_REQUEST_DATA CTL_CODE(IOCTL_DISK_BASE,16,METHOD_BUFFERED,FILE_ANY_ACCESS)
+#define IOCTL_DISK_CHECK_VERIFY CTL_CODE(IOCTL_DISK_BASE,0x200,METHOD_BUFFERED,FILE_READ_ACCESS)
+#define IOCTL_DISK_MEDIA_REMOVAL CTL_CODE(IOCTL_DISK_BASE,0x201,METHOD_BUFFERED,FILE_READ_ACCESS)
+#define IOCTL_DISK_EJECT_MEDIA CTL_CODE(IOCTL_DISK_BASE,0x202,METHOD_BUFFERED,FILE_READ_ACCESS)
+#define IOCTL_DISK_LOAD_MEDIA CTL_CODE(IOCTL_DISK_BASE,0x203,METHOD_BUFFERED,FILE_READ_ACCESS)
+#define IOCTL_DISK_RESERVE CTL_CODE(IOCTL_DISK_BASE,0x204,METHOD_BUFFERED,FILE_READ_ACCESS)
+#define IOCTL_DISK_RELEASE CTL_CODE(IOCTL_DISK_BASE,0x205,METHOD_BUFFERED,FILE_READ_ACCESS)
+#define IOCTL_DISK_FIND_NEW_DEVICES CTL_CODE(IOCTL_DISK_BASE,0x206,METHOD_BUFFERED,FILE_READ_ACCESS)
+#define IOCTL_DISK_REMOVE_DEVICE CTL_CODE(IOCTL_DISK_BASE,0x207,METHOD_BUFFERED,FILE_READ_ACCESS)
+#define IOCTL_DISK_GET_MEDIA_TYPES CTL_CODE(IOCTL_DISK_BASE,0x300,METHOD_BUFFERED,FILE_ANY_ACCESS)
+#define DEVICE_TYPE DWORD
+#define FILE_DEVICE_BEEP 1
+#define FILE_DEVICE_CD_ROM 2
+#define FILE_DEVICE_CD_ROM_FILE_SYSTEM 3
+#define FILE_DEVICE_CONTROLLER 4
+#define FILE_DEVICE_DATALINK 5
+#define FILE_DEVICE_DFS 6
+#define FILE_DEVICE_DISK 7
+#define FILE_DEVICE_DISK_FILE_SYSTEM 8
+#define FILE_DEVICE_FILE_SYSTEM 9
+#define FILE_DEVICE_INPORT_PORT 10
+#define FILE_DEVICE_KEYBOARD 11
+#define FILE_DEVICE_MAILSLOT 12
+#define FILE_DEVICE_MIDI_IN 13
+#define FILE_DEVICE_MIDI_OUT 14
+#define FILE_DEVICE_MOUSE 15
+#define FILE_DEVICE_MULTI_UNC_PROVIDER 16
+#define FILE_DEVICE_NAMED_PIPE 17
+#define FILE_DEVICE_NETWORK 18
+#define FILE_DEVICE_NETWORK_BROWSER 19
+#define FILE_DEVICE_NETWORK_FILE_SYSTEM 20
+#define FILE_DEVICE_NULL 21
+#define FILE_DEVICE_PARALLEL_PORT 22
+#define FILE_DEVICE_PHYSICAL_NETCARD 23
+#define FILE_DEVICE_PRINTER 24
+#define FILE_DEVICE_SCANNER 25
+#define FILE_DEVICE_SERIAL_MOUSE_PORT 26
+#define FILE_DEVICE_SERIAL_PORT 27
+#define FILE_DEVICE_SCREEN 28
+#define FILE_DEVICE_SOUND 29
+#define FILE_DEVICE_STREAMS 30
+#define FILE_DEVICE_TAPE 31
+#define FILE_DEVICE_TAPE_FILE_SYSTEM 32
+#define FILE_DEVICE_TRANSPORT 33
+#define FILE_DEVICE_UNKNOWN 34
+#define FILE_DEVICE_VIDEO 35
+#define FILE_DEVICE_VIRTUAL_DISK 36
+#define FILE_DEVICE_WAVE_IN 37
+#define FILE_DEVICE_WAVE_OUT 38
+#define FILE_DEVICE_8042_PORT 39
+#define FILE_DEVICE_NETWORK_REDIRECTOR 40
+#define FILE_DEVICE_BATTERY 41
+#define FILE_DEVICE_BUS_EXTENDER 41
+#define PARTITION_ENTRY_UNUSED 0
+#define PARTITION_FAT_12 1
+#define PARTITION_XENIX_1 2
+#define PARTITION_XENIX_2 3
+#define PARTITION_FAT_16 4
+#define PARTITION_EXTENDED 5
+#define PARTITION_HUGE 6
+#define PARTITION_IFS 7
+#define PARTITION_PREP 0x41
+#define PARTITION_UNIX 0x63
+#define PARTITION_NTFT 128
+#define VALID_NTFT 0xC0
+#define METHOD_BUFFERED 0
+#define METHOD_IN_DIRECT 1
+#define METHOD_OUT_DIRECT 2
+#define METHOD_NEITHER 3
+#define IOCTL_SERIAL_LSRMST_INSERT CTL_CODE(FILE_DEVICE_SERIAL_PORT,31,METHOD_BUFFERED,FILE_ANY_ACCESS)
+#define SERIAL_LSRMST_ESCAPE 0
+#define SERIAL_LSRMST_LSR_DATA 1
+#define SERIAL_LSRMST_LSR_NODATA 2
+#define SERIAL_LSRMST_MST 3
+#define FILE_ANY_ACCESS 0
+#define FILE_READ_ACCESS 1
+#define FILE_WRITE_ACCESS 2
+#define DISK_LOGGING_START 0
+#define DISK_LOGGING_STOP 1
+#define DISK_LOGGING_DUMP 2
+#define DISK_BINNING 3
+#define FSCTL_LOCK_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM,6,METHOD_BUFFERED,FILE_ANY_ACCESS)
+#define FSCTL_UNLOCK_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM,7,METHOD_BUFFERED,FILE_ANY_ACCESS)
+#define FSCTL_DISMOUNT_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM,8,METHOD_BUFFERED,FILE_ANY_ACCESS)
+#define FSCTL_MOUNT_DBLS_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM,13,METHOD_BUFFERED,FILE_ANY_ACCESS)
+#define FSCTL_GET_COMPRESSION CTL_CODE(FILE_DEVICE_FILE_SYSTEM,15,METHOD_BUFFERED,FILE_ANY_ACCESS)
+#define FSCTL_SET_COMPRESSION CTL_CODE(FILE_DEVICE_FILE_SYSTEM,16,METHOD_BUFFERED,FILE_READ_DATA|FILE_WRITE_DATA)
+#define FSCTL_READ_COMPRESSION CTL_CODE(FILE_DEVICE_FILE_SYSTEM,17,METHOD_NEITHER,FILE_READ_DATA)
+#define FSCTL_WRITE_COMPRESSION CTL_CODE(FILE_DEVICE_FILE_SYSTEM,18,METHOD_NEITHER,FILE_WRITE_DATA)
+typedef WORD BAD_TRACK_NUMBER,*PBAD_TRACK_NUMBER;
+typedef enum _BIN_TYPES {RequestSize,RequestLocation} BIN_TYPES;
+typedef struct _BIN_RANGE {
+ LARGE_INTEGER StartValue;
+ LARGE_INTEGER Length;
+} BIN_RANGE,*PBIN_RANGE;
+typedef struct _BIN_COUNT {
+ BIN_RANGE BinRange;
+ DWORD BinCount;
+} BIN_COUNT,*PBIN_COUNT;
+typedef struct _BIN_RESULTS {
+ DWORD NumberOfBins;
+ BIN_COUNT BinCounts[1];
+} BIN_RESULTS,*PBIN_RESULTS;
+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;
+typedef struct _DISK_GEOMETRY {
+ LARGE_INTEGER Cylinders;
+ MEDIA_TYPE MediaType;
+ DWORD TracksPerCylinder;
+ DWORD SectorsPerTrack;
+ DWORD BytesPerSector;
+} DISK_GEOMETRY;
+typedef struct _DISK_PERFORMANCE {
+ LARGE_INTEGER BytesRead;
+ LARGE_INTEGER BytesWritten;
+ LARGE_INTEGER ReadTime;
+ LARGE_INTEGER WriteTime;
+ DWORD ReadCount;
+ DWORD WriteCount;
+ DWORD QueueDepth;
+} DISK_PERFORMANCE;
+typedef struct _DISK_RECORD {
+ LARGE_INTEGER ByteOffset;
+ LARGE_INTEGER StartTime;
+ LARGE_INTEGER EndTime;
+ PVOID VirtualAddress;
+ DWORD NumberOfBytes;
+ BYTE DeviceNumber;
+ BOOLEAN ReadRequest;
+} DISK_RECORD,*PDISK_RECORD;
+typedef struct _DISK_LOGGING {
+ BYTE Function;
+ PVOID BufferAddress;
+ DWORD BufferSize;
+} DISK_LOGGING,*PDISK_LOGGING;
+typedef struct _FORMAT_PARAMETERS {
+ MEDIA_TYPE MediaType;
+ DWORD StartCylinderNumber;
+ DWORD EndCylinderNumber;
+ DWORD StartHeadNumber;
+ DWORD EndHeadNumber;
+} FORMAT_PARAMETERS,*PFORMAT_PARAMETERS;
+typedef struct _FORMAT_EX_PARAMETERS {
+ MEDIA_TYPE MediaType;
+ DWORD StartCylinderNumber;
+ DWORD EndCylinderNumber;
+ DWORD StartHeadNumber;
+ DWORD EndHeadNumber;
+ WORD FormatGapLength;
+ WORD SectorsPerTrack;
+ WORD SectorNumber[1];
+} FORMAT_EX_PARAMETERS,*PFORMAT_EX_PARAMETERS;
+typedef struct _HISTOGRAM_BUCKET {
+ DWORD Reads;
+ DWORD Writes;
+} HISTOGRAM_BUCKET,*PHISTOGRAM_BUCKET;
+typedef struct _DISK_HISTOGRAM {
+ LARGE_INTEGER DiskSize;
+ LARGE_INTEGER Start;
+ LARGE_INTEGER End;
+ LARGE_INTEGER Average;
+ LARGE_INTEGER AverageRead;
+ LARGE_INTEGER AverageWrite;
+ DWORD Granularity;
+ DWORD Size;
+ DWORD ReadCount;
+ DWORD WriteCount;
+ PHISTOGRAM_BUCKET Histogram;
+} DISK_HISTOGRAM,*PDISK_HISTOGRAM;
+typedef struct _PARTITION_INFORMATION {
+ LARGE_INTEGER StartingOffset;
+ LARGE_INTEGER PartitionLength;
+ DWORD HiddenSectors;
+ DWORD PartitionNumber;
+ BYTE PartitionType;
+ BOOLEAN BootIndicator;
+ BOOLEAN RecognizedPartition;
+ BOOLEAN RewritePartition;
+} PARTITION_INFORMATION,*PPARTITION_INFORMATION;
+typedef struct _DRIVE_LAYOUT_INFORMATION {
+ DWORD PartitionCount;
+ DWORD Signature;
+ PARTITION_INFORMATION PartitionEntry[1];
+} DRIVE_LAYOUT_INFORMATION;
+typedef struct _PERF_BIN {
+ DWORD NumberOfBins;
+ DWORD TypeOfBin;
+ BIN_RANGE BinsRanges[1];
+} PERF_BIN,*PPERF_BIN;
+typedef struct _PREVENT_MEDIA_REMOVAL {
+ BOOLEAN PreventMediaRemoval;
+} PREVENT_MEDIA_REMOVAL,*PPREVENT_MEDIA_REMOVAL;
+typedef struct _REASSIGN_BLOCKS {
+ WORD Reserved;
+ WORD Count;
+ DWORD BlockNumber[1];
+} REASSIGN_BLOCKS,*PREASSIGN_BLOCKS;
+typedef struct _SET_PARTITION_INFORMATION {
+ BYTE PartitionType;
+} SET_PARTITION_INFORMATION,*PSET_PARTITION_INFORMATION;
+typedef struct _VERIFY_INFORMATION {
+ LARGE_INTEGER StartingOffset;
+ DWORD Length;
+} VERIFY_INFORMATION,*PVERIFY_INFORMATION;
+#define IsRecognizedPartition(t) (((t&PARTITION_NTFT)&&((t&~0xC0)==PARTITION_FAT_12))||\
+ ((t&PARTITION_NTFT)&&((t&~0xC0)==PARTITION_FAT_16))||\
+ ((t&PARTITION_NTFT)&&((t&~0xC0)==PARTITION_IFS))||\
+ ((t&PARTITION_NTFT)&&((t&~0xC0)==PARTITION_HUGE))||\
+ ((t&~PARTITION_NTFT)==PARTITION_FAT_12)||\
+ ((t&~PARTITION_NTFT)==PARTITION_FAT_16)||\
+ ((t&~PARTITION_NTFT)==PARTITION_IFS)||\
+ ((t&~PARTITION_NTFT)==PARTITION_HUGE))
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/winsup/w32api/include/winnetwk.h b/winsup/w32api/include/winnetwk.h
new file mode 100644
index 000000000..538487cb0
--- /dev/null
+++ b/winsup/w32api/include/winnetwk.h
@@ -0,0 +1,312 @@
+#ifndef _WINNETWK_H
+#define _WINNETWK_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+#define WNNC_NET_MSNET 0x10000
+#define WNNC_NET_LANMAN 0x20000
+#define WNNC_NET_NETWARE 0x30000
+#define WNNC_NET_VINES 0x40000
+#define WNNC_NET_10NET 0x50000
+#define WNNC_NET_LOCUS 0x60000
+#define WNNC_NET_SUN_PC_NFS 0x70000
+#define WNNC_NET_LANSTEP 0x80000
+#define WNNC_NET_9TILES 0x90000
+#define WNNC_NET_LANTASTIC 0xA0000
+#define WNNC_NET_AS400 0xB0000
+#define WNNC_NET_FTP_NFS 0xC0000
+#define WNNC_NET_PATHWORKS 0xD0000
+#define WNNC_NET_LIFENET 0xE0000
+#define WNNC_NET_POWERLAN 0xF0000
+#define WNNC_NET_BWNFS 0x100000
+#define WNNC_NET_COGENT 0x110000
+#define WNNC_NET_FARALLON 0x120000
+#define WNNC_NET_APPLETALK 0x130000
+#define WNNC_NET_INTERGRAPH 0x140000
+#define RESOURCE_CONNECTED 1
+#define RESOURCE_GLOBALNET 2
+#define RESOURCE_REMEMBERED 3
+#define RESOURCE_RECENT 4
+#define RESOURCE_CONTEXT 5
+#define RESOURCETYPE_ANY 0
+#define RESOURCETYPE_DISK 1
+#define RESOURCETYPE_PRINT 2
+#define RESOURCETYPE_RESERVED 8
+#define RESOURCETYPE_UNKNOWN 0xFFFFFFFF
+#define RESOURCEUSAGE_CONNECTABLE 1
+#define RESOURCEUSAGE_CONTAINER 2
+#define RESOURCEUSAGE_NOLOCALDEVICE 4
+#define RESOURCEUSAGE_SIBLING 8
+#define RESOURCEUSAGE_ALL (RESOURCEUSAGE_CONNECTABLE|RESOURCEUSAGE_CONTAINER)
+#define RESOURCEUSAGE_RESERVED 0x80000000
+#define RESOURCEDISPLAYTYPE_GENERIC 0
+#define RESOURCEDISPLAYTYPE_DOMAIN 1
+#define RESOURCEDISPLAYTYPE_SERVER 2
+#define RESOURCEDISPLAYTYPE_SHARE 3
+#define RESOURCEDISPLAYTYPE_FILE 4
+#define RESOURCEDISPLAYTYPE_GROUP 5
+#define RESOURCEDISPLAYTYPE_NETWORK 6
+#define RESOURCEDISPLAYTYPE_ROOT 7
+#define RESOURCEDISPLAYTYPE_SHAREADMIN 8
+#define RESOURCEDISPLAYTYPE_DIRECTORY 9
+#define RESOURCEDISPLAYTYPE_TREE 10
+#define NETPROPERTY_PERSISTENT 1
+#define CONNECT_UPDATE_PROFILE 1
+#define CONNECT_UPDATE_RECENT 2
+#define CONNECT_TEMPORARY 4
+#define CONNECT_INTERACTIVE 8
+#define CONNECT_PROMPT 16
+#define CONNECT_NEED_DRIVE 32
+#define CONNECT_REFCOUNT 64
+#define CONNECT_REDIRECT 128
+#define CONNECT_LOCALDRIVE 256
+#define CONNECT_CURRENT_MEDIA 512
+#define CONNDLG_RO_PATH 1
+#define CONNDLG_CONN_POINT 2
+#define CONNDLG_USE_MRU 4
+#define CONNDLG_HIDE_BOX 8
+#define CONNDLG_PERSIST 16
+#define CONNDLG_NOT_PERSIST 32
+#define DISC_UPDATE_PROFILE 1
+#define DISC_NO_FORCE 64
+#define WNFMT_MULTILINE 1
+#define WNFMT_ABBREVIATED 2
+#define WNFMT_INENUM 16
+#define WNFMT_CONNECTION 32
+#define WN_SUCCESS NO_ERROR
+#define WN_NO_ERROR NO_ERROR
+#define WN_NOT_SUPPORTED ERROR_NOT_SUPPORTED
+#define WN_CANCEL ERROR_CANCELLED
+#define WN_RETRY ERROR_RETRY
+#define WN_NET_ERROR ERROR_UNEXP_NET_ERR
+#define WN_MORE_DATA ERROR_MORE_DATA
+#define WN_BAD_POINTER ERROR_INVALID_ADDRESS
+#define WN_BAD_VALUE ERROR_INVALID_PARAMETER
+#define WN_BAD_USER ERROR_BAD_USERNAME
+#define WN_BAD_PASSWORD ERROR_INVALID_PASSWORD
+#define WN_ACCESS_DENIED ERROR_ACCESS_DENIED
+#define WN_FUNCTION_BUSY ERROR_BUSY
+#define WN_WINDOWS_ERROR ERROR_UNEXP_NET_ERR
+#define WN_OUT_OF_MEMORY ERROR_NOT_ENOUGH_MEMORY
+#define WN_NO_NETWORK ERROR_NO_NETWORK
+#define WN_EXTENDED_ERROR ERROR_EXTENDED_ERROR
+#define WN_BAD_LEVEL ERROR_INVALID_LEVEL
+#define WN_BAD_HANDLE ERROR_INVALID_HANDLE
+#define WN_NOT_INITIALIZING ERROR_ALREADY_INITIALIZED
+#define WN_NO_MORE_DEVICES ERROR_NO_MORE_DEVICES
+#define WN_NOT_CONNECTED ERROR_NOT_CONNECTED
+#define WN_OPEN_FILES ERROR_OPEN_FILES
+#define WN_DEVICE_IN_USE ERROR_DEVICE_IN_USE
+#define WN_BAD_NETNAME ERROR_BAD_NET_NAME
+#define WN_BAD_LOCALNAME ERROR_BAD_DEVICE
+#define WN_ALREADY_CONNECTED ERROR_ALREADY_ASSIGNED
+#define WN_DEVICE_ERROR ERROR_GEN_FAILURE
+#define WN_CONNECTION_CLOSED ERROR_CONNECTION_UNAVAIL
+#define WN_NO_NET_OR_BAD_PATH ERROR_NO_NET_OR_BAD_PATH
+#define WN_BAD_PROVIDER ERROR_BAD_PROVIDER
+#define WN_CANNOT_OPEN_PROFILE ERROR_CANNOT_OPEN_PROFILE
+#define WN_BAD_PROFILE ERROR_BAD_PROFILE
+#define WN_BAD_DEV_TYPE ERROR_BAD_DEV_TYPE
+#define WN_DEVICE_ALREADY_REMEMBERED ERROR_DEVICE_ALREADY_REMEMBERED
+#define WN_NO_MORE_ENTRIES ERROR_NO_MORE_ITEMS
+#define WN_NOT_CONTAINER ERROR_NOT_CONTAINER
+#define WN_NOT_AUTHENTICATED ERROR_NOT_AUTHENTICATED
+#define WN_NOT_LOGGED_ON ERROR_NOT_LOGGED_ON
+#define WN_NOT_VALIDATED ERROR_NO_LOGON_SERVERS
+#define UNIVERSAL_NAME_INFO_LEVEL 1
+#define REMOTE_NAME_INFO_LEVEL 2
+#define NETINFO_DLL16 1
+#define NETINFO_DISKRED 4
+#define NETINFO_PRINTERRED 8
+#define RP_LOGON 1
+#define RP_INIFILE 2
+#define PP_DISPLAYERRORS 1
+#define WNCON_FORNETCARD 1
+#define WNCON_NOTROUTED 2
+#define WNCON_SLOWLINK 4
+#define WNCON_DYNAMIC 8
+
+#ifndef RC_INVOKED
+typedef struct _NETRESOURCEA {
+ DWORD dwScope;
+ DWORD dwType;
+ DWORD dwDisplayType;
+ DWORD dwUsage;
+ LPSTR lpLocalName;
+ LPSTR lpRemoteName;
+ LPSTR lpComment ;
+ LPSTR lpProvider;
+}NETRESOURCEA,*LPNETRESOURCEA;
+typedef struct _NETRESOURCEW {
+ DWORD dwScope;
+ DWORD dwType;
+ DWORD dwDisplayType;
+ DWORD dwUsage;
+ LPWSTR lpLocalName;
+ LPWSTR lpRemoteName;
+ LPWSTR lpComment ;
+ LPWSTR lpProvider;
+}NETRESOURCEW,*LPNETRESOURCEW;
+typedef struct _CONNECTDLGSTRUCTA{
+ DWORD cbStructure;
+ HWND hwndOwner;
+ LPNETRESOURCEA lpConnRes;
+ DWORD dwFlags;
+ DWORD dwDevNum;
+} CONNECTDLGSTRUCTA,*LPCONNECTDLGSTRUCTA;
+typedef struct _CONNECTDLGSTRUCTW{
+ DWORD cbStructure;
+ HWND hwndOwner;
+ LPNETRESOURCEW lpConnRes;
+ DWORD dwFlags;
+ DWORD dwDevNum;
+} CONNECTDLGSTRUCTW,*LPCONNECTDLGSTRUCTW;
+typedef struct _DISCDLGSTRUCTA{
+ DWORD cbStructure;
+ HWND hwndOwner;
+ LPSTR lpLocalName;
+ LPSTR lpRemoteName;
+ DWORD dwFlags;
+} DISCDLGSTRUCTA,*LPDISCDLGSTRUCTA;
+typedef struct _DISCDLGSTRUCTW{
+ DWORD cbStructure;
+ HWND hwndOwner;
+ LPWSTR lpLocalName;
+ LPWSTR lpRemoteName;
+ DWORD dwFlags;
+} DISCDLGSTRUCTW,*LPDISCDLGSTRUCTW;
+typedef struct _UNIVERSAL_NAME_INFOA { LPSTR lpUniversalName; }UNIVERSAL_NAME_INFOA,*LPUNIVERSAL_NAME_INFOA;
+typedef struct _UNIVERSAL_NAME_INFOW { LPWSTR lpUniversalName; }UNIVERSAL_NAME_INFOW,*LPUNIVERSAL_NAME_INFOW;
+typedef struct _REMOTE_NAME_INFOA {
+ LPSTR lpUniversalName;
+ LPSTR lpConnectionName;
+ LPSTR lpRemainingPath;
+}REMOTE_NAME_INFOA,*LPREMOTE_NAME_INFOA;
+typedef struct _REMOTE_NAME_INFOW {
+ LPWSTR lpUniversalName;
+ LPWSTR lpConnectionName;
+ LPWSTR lpRemainingPath;
+}REMOTE_NAME_INFOW,*LPREMOTE_NAME_INFOW;
+typedef struct _NETINFOSTRUCT{
+ DWORD cbStructure;
+ DWORD dwProviderVersion;
+ DWORD dwStatus;
+ DWORD dwCharacteristics;
+ DWORD dwHandle;
+ WORD wNetType;
+ DWORD dwPrinters;
+ DWORD dwDrives;
+} NETINFOSTRUCT,*LPNETINFOSTRUCT;
+typedef UINT(PASCAL *PFNGETPROFILEPATHA)(LPCSTR,LPSTR,UINT);
+typedef UINT(PASCAL *PFNGETPROFILEPATHW)(LPCWSTR,LPWSTR,UINT);
+typedef UINT(PASCAL *PFNRECONCILEPROFILEA)(LPCSTR,LPCSTR,DWORD);
+typedef UINT(PASCAL *PFNRECONCILEPROFILEW)(LPCWSTR,LPCWSTR,DWORD);
+typedef BOOL(PASCAL *PFNPROCESSPOLICIESA)(HWND,LPCSTR,LPCSTR,LPCSTR,DWORD);
+typedef BOOL(PASCAL *PFNPROCESSPOLICIESW)(HWND,LPCWSTR,LPCWSTR,LPCWSTR,DWORD);
+typedef struct _NETCONNECTINFOSTRUCT{
+ DWORD cbStructure;
+ DWORD dwFlags;
+ DWORD dwSpeed;
+ DWORD dwDelay;
+ DWORD dwOptDataSize;
+} NETCONNECTINFOSTRUCT,*LPNETCONNECTINFOSTRUCT;
+
+DWORD APIENTRY WNetAddConnectionA(LPCSTR,LPCSTR,LPCSTR);
+DWORD APIENTRY WNetAddConnectionW(LPCWSTR,LPCWSTR,LPCWSTR);
+DWORD APIENTRY WNetAddConnection2A(LPNETRESOURCEA,LPCSTR,LPCSTR,DWORD);
+DWORD APIENTRY WNetAddConnection2W(LPNETRESOURCEW,LPCWSTR,LPCWSTR,DWORD);
+DWORD APIENTRY WNetAddConnection3A(HWND,LPNETRESOURCEA,LPCSTR,LPCSTR,DWORD);
+DWORD APIENTRY WNetAddConnection3W(HWND,LPNETRESOURCEW,LPCWSTR,LPCWSTR,DWORD);
+DWORD APIENTRY WNetCancelConnectionA(LPCSTR,BOOL);
+DWORD APIENTRY WNetCancelConnectionW(LPCWSTR,BOOL);
+DWORD APIENTRY WNetCancelConnection2A(LPCSTR,DWORD,BOOL);
+DWORD APIENTRY WNetCancelConnection2W(LPCWSTR,DWORD,BOOL);
+DWORD APIENTRY WNetGetConnectionA(LPCSTR,LPSTR,PDWORD);
+DWORD APIENTRY WNetGetConnectionW(LPCWSTR,LPWSTR,PDWORD);
+DWORD APIENTRY WNetUseConnectionA(HWND,LPNETRESOURCEA,LPCSTR,LPCSTR,DWORD,LPSTR,PDWORD,PDWORD);
+DWORD APIENTRY WNetUseConnectionW(HWND,LPNETRESOURCEW,LPCWSTR,LPCWSTR,DWORD,LPWSTR,PDWORD,PDWORD);
+DWORD APIENTRY WNetSetConnectionA(LPCSTR,DWORD,PVOID);
+DWORD APIENTRY WNetSetConnectionW(LPCWSTR,DWORD,PVOID);
+DWORD APIENTRY WNetConnectionDialog(HWND,DWORD);
+DWORD APIENTRY WNetDisconnectDialog(HWND,DWORD);
+DWORD APIENTRY WNetConnectionDialog1A(LPCONNECTDLGSTRUCTA);
+DWORD APIENTRY WNetConnectionDialog1W(LPCONNECTDLGSTRUCTW);
+DWORD APIENTRY WNetDisconnectDialog1A(LPDISCDLGSTRUCTA);
+DWORD APIENTRY WNetDisconnectDialog1W(LPDISCDLGSTRUCTW);
+DWORD APIENTRY WNetOpenEnumA(DWORD,DWORD,DWORD,LPNETRESOURCEA,LPHANDLE);
+DWORD APIENTRY WNetOpenEnumW(DWORD,DWORD,DWORD,LPNETRESOURCEW,LPHANDLE);
+DWORD APIENTRY WNetEnumResourceA(HANDLE,PDWORD,PVOID,PDWORD);
+DWORD APIENTRY WNetEnumResourceW(HANDLE,PDWORD,PVOID,PDWORD);
+DWORD APIENTRY WNetCloseEnum(HANDLE);
+DWORD APIENTRY WNetGetUniversalNameA(LPCSTR,DWORD,PVOID,PDWORD);
+DWORD APIENTRY WNetGetUniversalNameW(LPCWSTR,DWORD,PVOID,PDWORD);
+DWORD APIENTRY WNetGetUserA(LPCSTR,LPSTR,PDWORD);
+DWORD APIENTRY WNetGetUserW(LPCWSTR,LPWSTR,PDWORD);
+DWORD APIENTRY WNetGetProviderNameA(DWORD,LPSTR,PDWORD);
+DWORD APIENTRY WNetGetProviderNameW(DWORD,LPWSTR,PDWORD);
+DWORD APIENTRY WNetGetNetworkInformationA(LPCSTR,LPNETINFOSTRUCT);
+DWORD APIENTRY WNetGetNetworkInformationW(LPCWSTR,LPNETINFOSTRUCT);
+DWORD APIENTRY WNetGetLastErrorA(PDWORD,LPSTR,DWORD,LPSTR,DWORD);
+DWORD APIENTRY WNetGetLastErrorW(PDWORD,LPWSTR,DWORD,LPWSTR,DWORD);
+DWORD APIENTRY MultinetGetConnectionPerformanceA(LPNETRESOURCEA,LPNETCONNECTINFOSTRUCT);
+DWORD APIENTRY MultinetGetConnectionPerformanceW(LPNETRESOURCEW,LPNETCONNECTINFOSTRUCT);
+#ifdef UNICODE
+#define PFNPROCESSPOLICIES PFNPROCESSPOLICIESW
+#define PFNRECONCILEPROFILE PFNRECONCILEPROFILEW
+#define PFNGETPROFILEPATH PFNGETPROFILEPATHW
+typedef NETRESOURCEW NETRESOURCE,*LPNETRESOURCE;
+typedef CONNECTDLGSTRUCTW CONNECTDLGSTRUCT,*LPCONNECTDLGSTRUCT;
+typedef DISCDLGSTRUCTW DISCDLGSTRUCT,*LPDISCDLGSTRUCT;
+typedef REMOTE_NAME_INFOW REMOTE_NAME_INFO,*LPREMOTE_NAME_INFO;
+typedef UNIVERSAL_NAME_INFOW UNIVERSAL_NAME_INFO,*LPUNIVERSAL_NAME_INFO;
+#define WNetEnumResource WNetEnumResourceW
+#define WNetOpenEnum WNetOpenEnumW
+#define WNetGetUniversalName WNetGetUniversalNameW
+#define WNetSetConnection WNetSetConnectionW
+#define WNetUseConnection WNetUseConnectionW
+#define WNetGetConnection WNetGetConnectionW
+#define WNetCancelConnection2 WNetCancelConnection2W
+#define WNetCancelConnection WNetCancelConnectionW
+#define WNetAddConnection3 WNetAddConnection3W
+#define WNetAddConnection2 WNetAddConnection2W
+#define WNetAddConnection WNetAddConnectionW
+#define WNetConnectionDialog1 WNetConnectionDialog1W
+#define WNetDisconnectDialog1 WNetDisconnectDialog1W
+#define WNetGetNetworkInformation WNetGetNetworkInformationW
+#define WNetGetProviderName WNetGetProviderNameW
+#define WNetGetUser WNetGetUserW
+#define MultinetGetConnectionPerformance MultinetGetConnectionPerformanceW
+#define WNetGetLastError WNetGetLastErrorW
+#else
+#define PFNGETPROFILEPATH PFNGETPROFILEPATHA
+#define PFNRECONCILEPROFILE PFNRECONCILEPROFILEA
+#define PFNPROCESSPOLICIES PFNPROCESSPOLICIESA
+typedef NETRESOURCEA NETRESOURCE,*LPNETRESOURCE;
+typedef CONNECTDLGSTRUCTA CONNECTDLGSTRUCT,*LPCONNECTDLGSTRUCT;
+typedef DISCDLGSTRUCTA DISCDLGSTRUCT,*LPDISCDLGSTRUCT;
+typedef UNIVERSAL_NAME_INFOA UNIVERSAL_NAME_INFO,*LPUNIVERSAL_NAME_INFO;
+typedef REMOTE_NAME_INFOA REMOTE_NAME_INFO,*LPREMOTE_NAME_INFO;
+#define WNetOpenEnum WNetOpenEnumA
+#define WNetEnumResource WNetEnumResourceA
+#define WNetGetUniversalName WNetGetUniversalNameA
+#define WNetConnectionDialog1 WNetConnectionDialog1A
+#define WNetDisconnectDialog1 WNetDisconnectDialog1A
+#define WNetAddConnection2 WNetAddConnection2A
+#define WNetAddConnection3 WNetAddConnection3A
+#define WNetCancelConnection WNetCancelConnectionA
+#define WNetCancelConnection2 WNetCancelConnection2A
+#define WNetGetConnection WNetGetConnectionA
+#define WNetUseConnection WNetUseConnectionA
+#define WNetSetConnection WNetSetConnectionA
+#define WNetAddConnection WNetAddConnectionA
+#define WNetGetUser WNetGetUserA
+#define WNetGetProviderName WNetGetProviderNameA
+#define WNetGetNetworkInformation WNetGetNetworkInformationA
+#define WNetGetLastError WNetGetLastErrorA
+#define MultinetGetConnectionPerformance MultinetGetConnectionPerformanceA
+#endif
+#endif
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/winsup/w32api/include/winnls.h b/winsup/w32api/include/winnls.h
new file mode 100644
index 000000000..851edafc9
--- /dev/null
+++ b/winsup/w32api/include/winnls.h
@@ -0,0 +1,454 @@
+#ifndef _WINNLS_H
+#define _WINNLS_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define MAX_LEADBYTES 12
+#define MAX_DEFAULTCHAR 2
+#define LOCALE_NOUSEROVERRIDE 0x80000000
+#define LOCALE_USE_CP_ACP 0x40000000
+#define LOCALE_ILANGUAGE 1
+#define LOCALE_SLANGUAGE 2
+#define LOCALE_SENGLANGUAGE 0x1001
+#define LOCALE_SABBREVLANGNAME 3
+#define LOCALE_SNATIVELANGNAME 4
+#define LOCALE_ICOUNTRY 5
+#define LOCALE_SCOUNTRY 6
+#define LOCALE_SENGCOUNTRY 0x1002
+#define LOCALE_SABBREVCTRYNAME 7
+#define LOCALE_SNATIVECTRYNAME 8
+#define LOCALE_IDEFAULTLANGUAGE 9
+#define LOCALE_IDEFAULTCOUNTRY 10
+#define LOCALE_IDEFAULTCODEPAGE 11
+#define LOCALE_IDEFAULTANSICODEPAGE 0x1004
+#define LOCALE_SLIST 12
+#define LOCALE_IMEASURE 13
+#define LOCALE_SDECIMAL 14
+#define LOCALE_STHOUSAND 15
+#define LOCALE_SGROUPING 16
+#define LOCALE_IDIGITS 17
+#define LOCALE_ILZERO 18
+#define LOCALE_INEGNUMBER 0x1010
+#define LOCALE_SNATIVEDIGITS 19
+#define LOCALE_SCURRENCY 20
+#define LOCALE_SINTLSYMBOL 21
+#define LOCALE_SMONDECIMALSEP 22
+#define LOCALE_SMONTHOUSANDSEP 23
+#define LOCALE_SMONGROUPING 24
+#define LOCALE_ICURRDIGITS 25
+#define LOCALE_IINTLCURRDIGITS 26
+#define LOCALE_ICURRENCY 27
+#define LOCALE_INEGCURR 28
+#define LOCALE_SDATE 29
+#define LOCALE_STIME 30
+#define LOCALE_SSHORTDATE 31
+#define LOCALE_SLONGDATE 32
+#define LOCALE_STIMEFORMAT 0x1003
+#define LOCALE_IDATE 33
+#define LOCALE_ILDATE 34
+#define LOCALE_ITIME 35
+#define LOCALE_ITIMEMARKPOSN 0x1005
+#define LOCALE_ICENTURY 36
+#define LOCALE_ITLZERO 37
+#define LOCALE_IDAYLZERO 38
+#define LOCALE_IMONLZERO 39
+#define LOCALE_S1159 40
+#define LOCALE_S2359 41
+#define LOCALE_ICALENDARTYPE 0x1009
+#define LOCALE_IOPTIONALCALENDAR 0x100B
+#define LOCALE_IFIRSTDAYOFWEEK 0x100C
+#define LOCALE_IFIRSTWEEKOFYEAR 0x100D
+#define LOCALE_SDAYNAME1 42
+#define LOCALE_SDAYNAME2 43
+#define LOCALE_SDAYNAME3 44
+#define LOCALE_SDAYNAME4 45
+#define LOCALE_SDAYNAME5 46
+#define LOCALE_SDAYNAME6 47
+#define LOCALE_SDAYNAME7 48
+#define LOCALE_SABBREVDAYNAME1 49
+#define LOCALE_SABBREVDAYNAME2 50
+#define LOCALE_SABBREVDAYNAME3 51
+#define LOCALE_SABBREVDAYNAME4 52
+#define LOCALE_SABBREVDAYNAME5 53
+#define LOCALE_SABBREVDAYNAME6 54
+#define LOCALE_SABBREVDAYNAME7 55
+#define LOCALE_SMONTHNAME1 56
+#define LOCALE_SMONTHNAME2 57
+#define LOCALE_SMONTHNAME3 58
+#define LOCALE_SMONTHNAME4 59
+#define LOCALE_SMONTHNAME5 60
+#define LOCALE_SMONTHNAME6 61
+#define LOCALE_SMONTHNAME7 62
+#define LOCALE_SMONTHNAME8 63
+#define LOCALE_SMONTHNAME9 64
+#define LOCALE_SMONTHNAME10 65
+#define LOCALE_SMONTHNAME11 66
+#define LOCALE_SMONTHNAME12 67
+#define LOCALE_SMONTHNAME13 0x100E
+#define LOCALE_SABBREVMONTHNAME1 68
+#define LOCALE_SABBREVMONTHNAME2 69
+#define LOCALE_SABBREVMONTHNAME3 70
+#define LOCALE_SABBREVMONTHNAME4 71
+#define LOCALE_SABBREVMONTHNAME5 72
+#define LOCALE_SABBREVMONTHNAME6 73
+#define LOCALE_SABBREVMONTHNAME7 74
+#define LOCALE_SABBREVMONTHNAME8 75
+#define LOCALE_SABBREVMONTHNAME9 76
+#define LOCALE_SABBREVMONTHNAME10 77
+#define LOCALE_SABBREVMONTHNAME11 78
+#define LOCALE_SABBREVMONTHNAME12 79
+#define LOCALE_SABBREVMONTHNAME13 0x100F
+#define LOCALE_SPOSITIVESIGN 80
+#define LOCALE_SNEGATIVESIGN 81
+#define LOCALE_IPOSSIGNPOSN 82
+#define LOCALE_INEGSIGNPOSN 83
+#define LOCALE_IPOSSYMPRECEDES 84
+#define LOCALE_IPOSSEPBYSPACE 85
+#define LOCALE_INEGSYMPRECEDES 86
+#define LOCALE_INEGSEPBYSPACE 87
+#define LOCALE_FONTSIGNATURE 88
+#define LOCALE_SYSTEM_DEFAULT 0x800
+#define LOCALE_USER_DEFAULT 0x400
+#define NORM_IGNORECASE 1
+#define NORM_IGNOREKANATYPE 65536
+#define NORM_IGNORENONSPACE 2
+#define NORM_IGNORESYMBOLS 4
+#define NORM_IGNOREWIDTH 131072
+#define SORT_STRINGSORT 4096
+#define LCMAP_BYTEREV 2048
+#define LCMAP_FULLWIDTH 8388608
+#define LCMAP_HALFWIDTH 4194304
+#define LCMAP_HIRAGANA 1048576
+#define LCMAP_KATAKANA 2097152
+#define LCMAP_LOWERCASE 256
+#define LCMAP_SORTKEY 1024
+#define LCMAP_UPPERCASE 512
+#define ENUM_ALL_CALENDARS (-1)
+#define DATE_SHORTDATE 1
+#define DATE_LONGDATE 2
+#define DATE_USE_ALT_CALENDAR 4
+#define CP_INSTALLED 1
+#define CP_SUPPORTED 2
+#define LCID_INSTALLED 1
+#define LCID_SUPPORTED 2
+#define MAP_FOLDCZONE 16
+#define MAP_FOLDDIGITS 128
+#define MAP_PRECOMPOSED 32
+#define MAP_COMPOSITE 64
+#define CP_ACP 0
+#define CP_OEMCP 1
+#define CP_MACCP 2
+#define CP_THREAD_ACP 3
+#define CP_SYMBOL 42
+#define CP_UTF7 65000
+#define CP_UTF8 65001
+#define CT_CTYPE1 1
+#define CT_CTYPE2 2
+#define CT_CTYPE3 4
+#define C1_UPPER 1
+#define C1_LOWER 2
+#define C1_DIGIT 4
+#define C1_SPACE 8
+#define C1_PUNCT 16
+#define C1_CNTRL 32
+#define C1_BLANK 64
+#define C1_XDIGIT 128
+#define C1_ALPHA 256
+#define C2_LEFTTORIGHT 1
+#define C2_RIGHTTOLEFT 2
+#define C2_EUROPENUMBER 3
+#define C2_EUROPESEPARATOR 4
+#define C2_EUROPETERMINATOR 5
+#define C2_ARABICNUMBER 6
+#define C2_COMMONSEPARATOR 7
+#define C2_BLOCKSEPARATOR 8
+#define C2_SEGMENTSEPARATOR 9
+#define C2_WHITESPACE 10
+#define C2_OTHERNEUTRAL 11
+#define C2_NOTAPPLICABLE 0
+#define C3_NONSPACING 1
+#define C3_DIACRITIC 2
+#define C3_VOWELMARK 4
+#define C3_SYMBOL 8
+#define C3_KATAKANA 16
+#define C3_HIRAGANA 32
+#define C3_HALFWIDTH 64
+#define C3_FULLWIDTH 128
+#define C3_IDEOGRAPH 256
+#define C3_KASHIDA 512
+#define C3_ALPHA 32768
+#define C3_NOTAPPLICABLE 0
+#define TIME_NOMINUTESORSECONDS 1
+#define TIME_NOSECONDS 2
+#define TIME_NOTIMEMARKER 4
+#define TIME_FORCE24HOURFORMAT 8
+#define LCMAP_BYTEREV 2048
+#define LCMAP_FULLWIDTH 8388608
+#define LCMAP_HALFWIDTH 4194304
+#define LCMAP_HIRAGANA 1048576
+#define LCMAP_KATAKANA 2097152
+#define LCMAP_LOWERCASE 256
+#define LCMAP_SORTKEY 1024
+#define LCMAP_UPPERCASE 512
+#define SORT_STRINGSORT 4096
+#define NORM_IGNORECASE 1
+#define NORM_IGNORENONSPACE 2
+#define NORM_IGNORESYMBOLS 4
+#define NORM_IGNOREKANATYPE 65536
+#define NORM_IGNOREWIDTH 131072
+#define MB_PRECOMPOSED 1
+#define MB_COMPOSITE 2
+#define MB_ERR_INVALID_CHARS 8
+#define MB_USEGLYPHCHARS 4
+#define WC_COMPOSITECHECK 512
+#define WC_DISCARDNS 16
+#define WC_SEPCHARS 32
+#define WC_DEFAULTCHAR 64
+#define CTRY_DEFAULT 0
+#define CTRY_AUSTRALIA 61
+#define CTRY_AUSTRIA 43
+#define CTRY_BELGIUM 32
+#define CTRY_BRAZIL 55
+#define CTRY_BULGARIA 359
+#define CTRY_CANADA 2
+#define CTRY_CROATIA 385
+#define CTRY_CZECH 42
+#define CTRY_DENMARK 45
+#define CTRY_FINLAND 358
+#define CTRY_FRANCE 33
+#define CTRY_GERMANY 49
+#define CTRY_GREECE 30
+#define CTRY_HONG_KONG 852
+#define CTRY_HUNGARY 36
+#define CTRY_ICELAND 354
+#define CTRY_IRELAND 353
+#define CTRY_ITALY 39
+#define CTRY_JAPAN 81
+#define CTRY_MEXICO 52
+#define CTRY_NETHERLANDS 31
+#define CTRY_NEW_ZEALAND 64
+#define CTRY_NORWAY 47
+#define CTRY_POLAND 48
+#define CTRY_PORTUGAL 351
+#define CTRY_PRCHINA 86
+#define CTRY_ROMANIA 40
+#define CTRY_RUSSIA 7
+#define CTRY_SINGAPORE 65
+#define CTRY_SLOVAK 42
+#define CTRY_SLOVENIA 386
+#define CTRY_SOUTH_KOREA 82
+#define CTRY_SPAIN 34
+#define CTRY_SWEDEN 46
+#define CTRY_SWITZERLAND 41
+#define CTRY_TAIWAN 886
+#define CTRY_TURKEY 90
+#define CTRY_UNITED_KINGDOM 44
+#define CTRY_UNITED_STATES 1
+#define CAL_ICALINTVALUE 1
+#define CAL_SCALNAME 2
+#define CAL_IYEAROFFSETRANGE 3
+#define CAL_SERASTRING 4
+#define CAL_SSHORTDATE 5
+#define CAL_SLONGDATE 6
+#define CAL_SDAYNAME1 7
+#define CAL_SDAYNAME2 8
+#define CAL_SDAYNAME3 9
+#define CAL_SDAYNAME4 10
+#define CAL_SDAYNAME5 11
+#define CAL_SDAYNAME6 12
+#define CAL_SDAYNAME7 13
+#define CAL_SABBREVDAYNAME1 14
+#define CAL_SABBREVDAYNAME2 15
+#define CAL_SABBREVDAYNAME3 16
+#define CAL_SABBREVDAYNAME4 17
+#define CAL_SABBREVDAYNAME5 18
+#define CAL_SABBREVDAYNAME6 19
+#define CAL_SABBREVDAYNAME7 20
+#define CAL_SMONTHNAME1 21
+#define CAL_SMONTHNAME2 22
+#define CAL_SMONTHNAME3 23
+#define CAL_SMONTHNAME4 24
+#define CAL_SMONTHNAME5 25
+#define CAL_SMONTHNAME6 26
+#define CAL_SMONTHNAME7 27
+#define CAL_SMONTHNAME8 28
+#define CAL_SMONTHNAME9 29
+#define CAL_SMONTHNAME10 30
+#define CAL_SMONTHNAME11 31
+#define CAL_SMONTHNAME12 32
+#define CAL_SMONTHNAME13 33
+#define CAL_SABBREVMONTHNAME1 34
+#define CAL_SABBREVMONTHNAME2 35
+#define CAL_SABBREVMONTHNAME3 36
+#define CAL_SABBREVMONTHNAME4 37
+#define CAL_SABBREVMONTHNAME5 38
+#define CAL_SABBREVMONTHNAME6 39
+#define CAL_SABBREVMONTHNAME7 40
+#define CAL_SABBREVMONTHNAME8 41
+#define CAL_SABBREVMONTHNAME9 42
+#define CAL_SABBREVMONTHNAME10 43
+#define CAL_SABBREVMONTHNAME11 44
+#define CAL_SABBREVMONTHNAME12 45
+#define CAL_SABBREVMONTHNAME13 46
+#define CAL_GREGORIAN 1
+#define CAL_GREGORIAN_US 2
+#define CAL_JAPAN 3
+#define CAL_TAIWAN 4
+#define CAL_KOREA 5
+
+#ifndef RC_INVOKED
+typedef DWORD LCTYPE;
+typedef ULONG CALTYPE;
+typedef ULONG CALID;
+typedef BOOL (CALLBACK *CALINFO_ENUMPROCA)(LPSTR);
+typedef BOOL (CALLBACK *CALINFO_ENUMPROCW)(LPWSTR);
+typedef BOOL (CALLBACK *LOCALE_ENUMPROCA)(LPSTR);
+typedef BOOL (CALLBACK *LOCALE_ENUMPROCW)(LPWSTR);
+typedef BOOL (CALLBACK *CODEPAGE_ENUMPROCA)(LPSTR);
+typedef BOOL (CALLBACK *CODEPAGE_ENUMPROCW)(LPWSTR);
+typedef BOOL (CALLBACK *DATEFMT_ENUMPROCA)(LPSTR);
+typedef BOOL (CALLBACK *DATEFMT_ENUMPROCW)(LPWSTR);
+typedef BOOL (CALLBACK *TIMEFMT_ENUMPROCA)(LPSTR);
+typedef BOOL (CALLBACK *TIMEFMT_ENUMPROCW)(LPWSTR);
+typedef struct _cpinfo {
+ UINT MaxCharSize;
+ BYTE DefaultChar[MAX_DEFAULTCHAR];
+ BYTE LeadByte[MAX_LEADBYTES];
+} CPINFO,*LPCPINFO;
+typedef struct _currencyfmtA {
+ UINT NumDigits;
+ UINT LeadingZero;
+ UINT Grouping;
+ LPSTR lpDecimalSep;
+ LPSTR lpThousandSep;
+ UINT NegativeOrder;
+ UINT PositiveOrder;
+ LPSTR lpCurrencySymbol;
+} CURRENCYFMTA;
+typedef struct _currencyfmtW {
+ UINT NumDigits;
+ UINT LeadingZero;
+ UINT Grouping;
+ LPWSTR lpDecimalSep;
+ LPWSTR lpThousandSep;
+ UINT NegativeOrder;
+ UINT PositiveOrder;
+ LPWSTR lpCurrencySymbol;
+} CURRENCYFMTW;
+typedef struct _numberfmtA {
+ UINT NumDigits;
+ UINT LeadingZero;
+ UINT Grouping;
+ LPSTR lpDecimalSep;
+ LPSTR lpThousandSep;
+ UINT NegativeOrder;
+} NUMBERFMTA;
+typedef struct _numberfmtW {
+ UINT NumDigits;
+ UINT LeadingZero;
+ UINT Grouping;
+ LPWSTR lpDecimalSep;
+ LPWSTR lpThousandSep;
+ UINT NegativeOrder;
+} NUMBERFMTW;
+
+int WINAPI CompareStringA(LCID,DWORD,LPCSTR,int,LPCSTR,int);
+int WINAPI CompareStringW(LCID,DWORD,LPCWSTR,int,LPCWSTR,int);
+LCID WINAPI ConvertDefaultLocale(LCID);
+BOOL WINAPI EnumCalendarInfoA(CALINFO_ENUMPROCA,LCID,CALID,CALTYPE);
+BOOL WINAPI EnumCalendarInfoW(CALINFO_ENUMPROCW,LCID,CALID,CALTYPE);
+BOOL WINAPI EnumDateFormatsA(DATEFMT_ENUMPROCA,LCID,DWORD);
+BOOL WINAPI EnumDateFormatsW(DATEFMT_ENUMPROCW,LCID,DWORD);
+BOOL WINAPI EnumSystemCodePagesA(CODEPAGE_ENUMPROCA,DWORD);
+BOOL WINAPI EnumSystemCodePagesW(CODEPAGE_ENUMPROCW,DWORD);
+BOOL WINAPI EnumSystemLocalesA(LOCALE_ENUMPROCA,DWORD);
+BOOL WINAPI EnumSystemLocalesW(LOCALE_ENUMPROCW,DWORD);
+BOOL WINAPI EnumTimeFormatsA(TIMEFMT_ENUMPROCA,LCID,DWORD);
+BOOL WINAPI EnumTimeFormatsW(TIMEFMT_ENUMPROCW,LCID,DWORD);
+int WINAPI FoldStringA(DWORD,LPCSTR,int,LPSTR,int);
+int WINAPI FoldStringW(DWORD,LPCWSTR,int,LPWSTR,int);
+UINT WINAPI GetACP(void);
+BOOL WINAPI GetCPInfo(UINT,LPCPINFO);
+int WINAPI GetCurrencyFormatA(LCID,DWORD,LPCSTR,const CURRENCYFMTA*,LPSTR,int);
+int WINAPI GetCurrencyFormatW(LCID,DWORD,LPCWSTR,const CURRENCYFMTW*,LPWSTR,int);
+int WINAPI GetDateFormatA(LCID,DWORD,const SYSTEMTIME*,LPCSTR,LPSTR,int);
+int WINAPI GetDateFormatW(LCID,DWORD,const SYSTEMTIME*,LPCWSTR,LPWSTR,int);
+int WINAPI GetLocaleInfoA(LCID,LCTYPE,LPSTR,int);
+int WINAPI GetLocaleInfoW(LCID,LCTYPE,LPWSTR,int);
+int WINAPI GetNumberFormatA(LCID,DWORD,LPCSTR,const NUMBERFMTA*,LPSTR,int);
+int WINAPI GetNumberFormatW(LCID,DWORD,LPCWSTR,const NUMBERFMTW*,LPWSTR,int);
+UINT WINAPI GetOEMCP(void);
+BOOL WINAPI GetStringTypeA(LCID,DWORD,LPCSTR,int,LPWORD);
+BOOL WINAPI GetStringTypeW(DWORD,LPCWSTR,int,LPWORD);
+BOOL WINAPI GetStringTypeExA(LCID,DWORD,LPCSTR,int,LPWORD);
+BOOL WINAPI GetStringTypeExW(LCID,DWORD,LPCWSTR,int,LPWORD);
+LANGID WINAPI GetSystemDefaultLangID(void);
+LCID WINAPI GetSystemDefaultLCID(void);
+LCID WINAPI GetThreadLocale(void);
+int WINAPI GetTimeFormatA(LCID,DWORD,const SYSTEMTIME*,LPCSTR,LPSTR,int);
+int WINAPI GetTimeFormatW(LCID,DWORD,const SYSTEMTIME*,LPCWSTR,LPWSTR,int);
+LANGID WINAPI GetUserDefaultLangID(void);
+LCID WINAPI GetUserDefaultLCID(void);
+BOOL WINAPI IsDBCSLeadByte(BYTE);
+BOOL WINAPI IsDBCSLeadByteEx(UINT,BYTE);
+BOOL WINAPI IsValidCodePage(UINT);
+BOOL WINAPI IsValidLocale(LCID,DWORD);
+int WINAPI LCMapStringA(LCID,DWORD,LPCSTR,int,LPSTR,int);
+int WINAPI LCMapStringW(LCID,DWORD,LPCWSTR,int,LPWSTR,int);
+int WINAPI MultiByteToWideChar(UINT,DWORD,LPCSTR,int,LPWSTR,int);
+BOOL WINAPI SetLocaleInfoA(LCID,LCTYPE,LPCSTR);
+BOOL WINAPI SetLocaleInfoW(LCID,LCTYPE,LPCWSTR);
+BOOL WINAPI SetThreadLocale(LCID);
+int WINAPI WideCharToMultiByte(UINT,DWORD,LPCWSTR,int,LPSTR,int,LPCSTR,LPBOOL);
+
+#ifdef UNICODE
+#define CALINFO_ENUMPROC CALINFO_ENUMPROCW
+#define LOCALE_ENUMPROC LOCALE_ENUMPROCW
+#define CODEPAGE_ENUMPROC CODEPAGE_ENUMPROCW
+#define DATEFMT_ENUMPROC DATEFMT_ENUMPROCW
+#define TIMEFMT_ENUMPROC TIMEFMT_ENUMPROCW
+typedef CURRENCYFMTW CURRENCYFMT;
+typedef NUMBERFMTW NUMBERFMT;
+#define CompareString CompareStringW
+#define EnumCalendarInfo EnumCalendarInfoW
+#define EnumSystemCodePages EnumSystemCodePagesW
+#define EnumSystemLocales EnumSystemLocalesW
+#define EnumTimeFormats EnumTimeFormatsW
+#define FoldString FoldStringA
+#define GetCurrencyFormat GetCurrencyFormatW
+#define GetDateFormat GetDateFormatW
+#define GetLocaleInfo GetLocaleInfoW
+#define GetNumberFormat GetNumberFormatW
+#define GetStringTypeEx GetStringTypeExW
+#define GetTimeFormat GetTimeFormatW
+#define LCMapString LCMapStringW
+#define SetLocaleInfo SetLocaleInfoW
+#else
+#define CALINFO_ENUMPROC CALINFO_ENUMPROCA
+#define LOCALE_ENUMPROC LOCALE_ENUMPROCA
+#define CODEPAGE_ENUMPROC CODEPAGE_ENUMPROCA
+#define DATEFMT_ENUMPROC DATEFMT_ENUMPROCA
+#define TIMEFMT_ENUMPROC TIMEFMT_ENUMPROCA
+typedef CURRENCYFMTA CURRENCYFMT;
+typedef NUMBERFMTA NUMBERFMT;
+#define CompareString CompareStringA
+#define EnumCalendarInfo EnumCalendarInfoA
+#define EnumSystemCodePages EnumSystemCodePagesA
+#define EnumSystemLocales EnumSystemLocalesA
+#define EnumTimeFormats EnumTimeFormatsA
+#define FoldString FoldStringW
+#define GetCurrencyFormat GetCurrencyFormatA
+#define GetDateFormat GetDateFormatA
+#define GetLocaleInfo GetLocaleInfoA
+#define GetNumberFormat GetNumberFormatA
+#define GetStringTypeEx GetStringTypeExA
+#define GetTimeFormat GetTimeFormatA
+#define LCMapString LCMapStringA
+#define SetLocaleInfo SetLocaleInfoA
+#endif
+#endif
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/winsup/w32api/include/winnt.h b/winsup/w32api/include/winnt.h
new file mode 100644
index 000000000..71c0e353a
--- /dev/null
+++ b/winsup/w32api/include/winnt.h
@@ -0,0 +1,2231 @@
+#ifndef _WINNT_H
+#define _WINNT_H
+/* translate GCC target defines to MS equivalents. Keep this synchronized
+ with windows.h. */
+#if defined(__i686__) && !defined(_M_IX86)
+#define _M_IX86 600
+#elif defined(__i586__) && !defined(_M_IX86)
+#define _M_IX86 500
+#elif defined(__i486__) && !defined(_M_IX86)
+#define _M_IX86 400
+#elif defined(__i386__) && !defined(_M_IX86)
+#define _M_IX86 300
+#endif
+#if defined(_M_IX86) && !defined(_X86_)
+#define _X86_
+#elif defined(_M_ALPHA) && !defined(_ALPHA_)
+#define _ALPHA_
+#elif defined(_M_PPC) && !defined(_PPC_)
+#define _PPC_
+#elif defined(_M_MRX000) && !defined(_MIPS_)
+#define _MIPS_
+#elif defined(_M_M68K) && !defined(_68K_)
+#define _68K_
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <winerror.h>
+
+#ifndef RC_INVOKED
+#include <string.h>
+
+/* FIXME: add more architectures. Is there a way to specify this in GCC? */
+#ifdef _X86_
+#define UNALIGNED
+#else
+#define UNALIGNED
+#endif
+
+#ifndef VOID
+#define VOID void
+typedef char CHAR;
+typedef short SHORT;
+typedef long LONG;
+#endif
+typedef CHAR CCHAR;
+typedef unsigned char UCHAR,*PUCHAR;
+typedef unsigned short USHORT,*PUSHORT;
+typedef unsigned long ULONG,*PULONG;
+typedef char *PSZ;
+
+#ifndef _WCHAR_T_DEFINED
+#define _WCHAR_T_DEFINED
+#ifndef _WCHAR_T_
+#define _WCHAR_T_
+#undef __need_wchar_t
+#ifndef __cplusplus
+typedef unsigned short wchar_t;
+#endif
+#endif
+#endif
+
+typedef wchar_t WCHAR;
+typedef WCHAR *PWCHAR,*LPWCH,*PWCH,*NWPSTR,*LPWSTR,*PWSTR;
+typedef CONST WCHAR *LPCWCH,*PCWCH,*LPCWSTR,*PCWSTR;
+typedef CHAR *PCHAR,*LPCH,*PCH,*NPSTR,*LPSTR,*PSTR;
+typedef CONST CHAR *LPCCH,*PCSTR,*LPCSTR;
+#ifndef _TCHAR_DEFINED
+#define _TCHAR_DEFINED
+#ifdef UNICODE
+typedef WCHAR TCHAR;
+#else
+typedef CHAR TCHAR;
+#endif
+#endif
+typedef TCHAR TBYTE,*PTCH,*PTBYTE;
+typedef TCHAR *LPTCH,*PTSTR,*LPTSTR,*LP,*PTCHAR;
+typedef const TCHAR *LPCTSTR;
+#ifdef UNICODE
+#define TEXT(q) L##q
+#else
+#define TEXT(q) q
+#endif
+#ifndef _T
+#define _T TEXT
+#endif
+typedef SHORT *PSHORT;
+typedef LONG *PLONG;
+typedef void *HANDLE;
+typedef HANDLE *PHANDLE,*LPHANDLE;
+#ifdef STRICT
+#define DECLARE_HANDLE(n) typedef struct n##__{int i;}*n
+#else
+#define DECLARE_HANDLE(n) typedef HANDLE n
+#endif
+typedef DWORD LCID;
+typedef PDWORD PLCID;
+typedef WORD LANGID;
+#ifdef __GNUC__
+#define HAVE_INT64
+#define _INTEGRAL_MAX_BITS 64
+#undef __int64
+#define __int64 long long
+#endif
+#if defined(HAVE_INT64) || (defined(_INTEGRAL_MAX_BITS) && _INTEGRAL_MAX_BITS >= 64)
+typedef __int64 LONGLONG;
+typedef unsigned __int64 DWORDLONG;
+#else
+typedef double LONGLONG,DWORDLONG;
+#endif
+typedef LONGLONG *PLONGLONG;
+typedef DWORDLONG *PDWORDLONG;
+typedef DWORDLONG ULONGLONG,*PULONGLONG;
+typedef LONGLONG USN;
+#ifdef HAVE_INT64
+#define Int32x32To64(a,b) ((LONGLONG)(a)*(LONGLONG)(b))
+#define UInt32x32To64(a,b) ((DWORDLONG)(a)*(DWORDLONG)(b))
+#define Int64ShllMod32(a,b) ((DWORDLONG)(a)<<(b))
+#define Int64ShraMod32(a,b) ((LONGLONG)(a)>>(b))
+#define Int64ShrlMod32(a,b) ((DWORDLONG)(a)>>(b))
+#endif
+#define ANSI_NULL '\0'
+#define UNICODE_NULL L'\0'
+typedef BYTE BOOLEAN,*PBOOLEAN;
+#endif
+
+#define NTAPI __stdcall
+#define APPLICATION_ERROR_MASK 0x20000000
+#define ERROR_SEVERITY_SUCCESS 0x00000000
+#define ERROR_SEVERITY_INFORMATIONAL 0x40000000
+#define ERROR_SEVERITY_WARNING 0x80000000
+#define ERROR_SEVERITY_ERROR 0xC0000000
+#define COMPRESSION_FORMAT_NONE 0
+#define COMPRESSION_FORMAT_DEFAULT 1
+#define COMPRESSION_FORMAT_LZNT1 2
+#define COMPRESSION_ENGINE_STANDARD 0
+#define COMPRESSION_ENGINE_MAXIMUM 256
+#define ACCESS_ALLOWED_ACE_TYPE 0
+#define ACCESS_DENIED_ACE_TYPE 1
+#define ANYSIZE_ARRAY 1
+#define SYSTEM_AUDIT_ACE_TYPE 2
+#define SYSTEM_ALARM_ACE_TYPE 3
+#define OBJECT_INHERIT_ACE 1
+#define CONTAINER_INHERIT_ACE 2
+#define NO_PROPAGATE_INHERIT_ACE 4
+#define INHERIT_ONLY_ACE 8
+#define VALID_INHERIT_FLAGS 16
+#define SUCCESSFUL_ACCESS_ACE_FLAG 64
+#define FAILED_ACCESS_ACE_FLAG 128
+#define DELETE 0x00010000L
+#define READ_CONTROL 0x20000L
+#define WRITE_DAC 0x40000L
+#define WRITE_OWNER 0x80000L
+#define SYNCHRONIZE 0x100000L
+#define STANDARD_RIGHTS_REQUIRED 0xF0000
+#define STANDARD_RIGHTS_READ 0x20000
+#define STANDARD_RIGHTS_WRITE 0x20000
+#define STANDARD_RIGHTS_EXECUTE 0x20000
+#define STANDARD_RIGHTS_ALL 0x1F0000
+#define SPECIFIC_RIGHTS_ALL 0xFFFF
+#define ACCESS_SYSTEM_SECURITY 0x1000000
+#define MAXIMUM_ALLOWED 0x2000000
+#define GENERIC_READ 0x80000000
+#define GENERIC_WRITE 0x40000000
+#define GENERIC_EXECUTE 0x20000000
+#define GENERIC_ALL 0x10000000
+#define FILE_READ_DATA 1
+#define FILE_LIST_DIRECTORY 1
+#define FILE_WRITE_DATA 2
+#define FILE_ADD_FILE 2
+#define FILE_APPEND_DATA 4
+#define FILE_ADD_SUBDIRECTORY 4
+#define FILE_CREATE_PIPE_INSTANCE 4
+#define FILE_READ_EA 8
+#define FILE_READ_PROPERTIES 8
+#define FILE_WRITE_EA 16
+#define FILE_WRITE_PROPERTIES 16
+#define FILE_EXECUTE 32
+#define FILE_TRAVERSE 32
+#define FILE_DELETE_CHILD 64
+#define FILE_READ_ATTRIBUTES 128
+#define FILE_WRITE_ATTRIBUTES 256
+#define FILE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0x1FF)
+#define FILE_GENERIC_READ (STANDARD_RIGHTS_READ|FILE_READ_DATA|FILE_READ_ATTRIBUTES|FILE_READ_EA|SYNCHRONIZE)
+#define FILE_GENERIC_WRITE (STANDARD_RIGHTS_WRITE|FILE_WRITE_DATA|FILE_WRITE_ATTRIBUTES|FILE_WRITE_EA|FILE_APPEND_DATA|SYNCHRONIZE)
+#define FILE_GENERIC_EXECUTE (STANDARD_RIGHTS_EXECUTE|FILE_READ_ATTRIBUTES|FILE_EXECUTE|SYNCHRONIZE)
+#define FILE_SHARE_READ 1
+#define FILE_SHARE_WRITE 2
+#define FILE_SHARE_DELETE 4
+#define FILE_ATTRIBUTE_READONLY 1
+#define FILE_ATTRIBUTE_HIDDEN 2
+#define FILE_ATTRIBUTE_SYSTEM 4
+#define FILE_ATTRIBUTE_DIRECTORY 16
+#define FILE_ATTRIBUTE_ARCHIVE 32
+#define FILE_ATTRIBUTE_NORMAL 128
+#define FILE_ATTRIBUTE_TEMPORARY 256
+#define FILE_ATTRIBUTE_COMPRESSED 2048
+#define FILE_ATTRIBUTE_OFFLINE 0x1000
+#define FILE_NOTIFY_CHANGE_FILE_NAME 1
+#define FILE_NOTIFY_CHANGE_DIR_NAME 2
+#define FILE_NOTIFY_CHANGE_ATTRIBUTES 4
+#define FILE_NOTIFY_CHANGE_SIZE 8
+#define FILE_NOTIFY_CHANGE_LAST_WRITE 16
+#define FILE_NOTIFY_CHANGE_LAST_ACCESS 32
+#define FILE_NOTIFY_CHANGE_CREATION 64
+#define FILE_NOTIFY_CHANGE_SECURITY 256
+#define MAILSLOT_NO_MESSAGE ((DWORD)-1)
+#define MAILSLOT_WAIT_FOREVER ((DWORD)-1)
+#define FILE_CASE_SENSITIVE_SEARCH 1
+#define FILE_CASE_PRESERVED_NAMES 2
+#define FILE_UNICODE_ON_DISK 4
+#define FILE_PERSISTENT_ACLS 8
+#define FILE_FILE_COMPRESSION 16
+#define FILE_VOLUME_IS_COMPRESSED 0x8000
+#define IO_COMPLETION_MODIFY_STATE 2
+#define IO_COMPLETION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|3)
+#define DUPLICATE_CLOSE_SOURCE 1
+#define DUPLICATE_SAME_ACCESS 2
+#define PROCESS_TERMINATE 1
+#define PROCESS_CREATE_THREAD 2
+#define PROCESS_VM_OPERATION 8
+#define PROCESS_VM_READ 16
+#define PROCESS_VM_WRITE 32
+#define PROCESS_DUP_HANDLE 64
+#define PROCESS_CREATE_PROCESS 128
+#define PROCESS_SET_QUOTA 256
+#define PROCESS_SET_INFORMATION 512
+#define PROCESS_QUERY_INFORMATION 1024
+#define PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0xFFF)
+#define THREAD_TERMINATE 1
+#define THREAD_SUSPEND_RESUME 2
+#define THREAD_GET_CONTEXT 8
+#define THREAD_SET_CONTEXT 16
+#define THREAD_SET_INFORMATION 32
+#define THREAD_QUERY_INFORMATION 64
+#define THREAD_SET_THREAD_TOKEN 128
+#define THREAD_IMPERSONATE 256
+#define THREAD_DIRECT_IMPERSONATION 0x200
+#define THREAD_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0x3FF)
+#define EXCEPTION_NONCONTINUABLE 1
+#define EXCEPTION_MAXIMUM_PARAMETERS 15
+#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 SECURITY_NULL_RID 0
+#define SECURITY_WORLD_RID 0
+#define SECURITY_LOCAL_RID 0
+#define SECURITY_CREATOR_OWNER_RID 0
+#define SECURITY_CREATOR_GROUP_RID 1
+#define SECURITY_DIALUP_RID 1
+#define SECURITY_NETWORK_RID 2
+#define SECURITY_BATCH_RID 3
+#define SECURITY_INTERACTIVE_RID 4
+#define SECURITY_LOGON_IDS_RID 5
+#define SECURITY_SERVICE_RID 6
+#define SECURITY_LOCAL_SYSTEM_RID 18
+#define SECURITY_BUILTIN_DOMAIN_RID 32
+#define SECURITY_PRINCIPAL_SELF_RID 10
+#define DOMAIN_USER_RID_ADMIN 0x1F4L
+#define DOMAIN_USER_RID_GUEST 0x1F5L
+#define DOMAIN_GROUP_RID_ADMINS 0x200L
+#define DOMAIN_GROUP_RID_USERS 0x201L
+#define DOMAIN_ALIAS_RID_ADMINS 0x220L
+#define DOMAIN_ALIAS_RID_USERS 0x221L
+#define DOMAIN_ALIAS_RID_GUESTS 0x222L
+#define DOMAIN_ALIAS_RID_POWER_USERS 0x223L
+#define DOMAIN_ALIAS_RID_ACCOUNT_OPS 0x224L
+#define DOMAIN_ALIAS_RID_SYSTEM_OPS 0x225L
+#define DOMAIN_ALIAS_RID_PRINT_OPS 0x226L
+#define DOMAIN_ALIAS_RID_BACKUP_OPS 0x227L
+#define DOMAIN_ALIAS_RID_REPLICATOR 0x228L
+#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 LANG_BULGARIAN 2
+#define LANG_CHINESE 4
+#define LANG_CROATIAN 26
+#define LANG_CZECH 5
+#define LANG_DANISH 6
+#define LANG_DUTCH 19
+#define LANG_ENGLISH 9
+#define LANG_FINNISH 11
+#define LANG_FRENCH 12
+#define LANG_GERMAN 7
+#define LANG_GREEK 8
+#define LANG_HUNGARIAN 14
+#define LANG_ICELANDIC 15
+#define LANG_ITALIAN 16
+#define LANG_JAPANESE 17
+#define LANG_KOREAN 18
+#define LANG_NEUTRAL 0
+#define LANG_NORWEGIAN 20
+#define LANG_POLISH 21
+#define LANG_PORTUGUESE 22
+#define LANG_ROMANIAN 24
+#define LANG_RUSSIAN 25
+#define LANG_SLOVAK 27
+#define LANG_SLOVENIAN 36
+#define LANG_SPANISH 10
+#define LANG_SWEDISH 29
+#define LANG_TURKISH 31
+#define SUBLANG_CHINESE_SIMPLIFIED 2
+#define SUBLANG_CHINESE_TRADITIONAL 1
+#define SUBLANG_CHINESE_HONGKONG 3
+#define SUBLANG_CHINESE_SINGAPORE 4
+#define SUBLANG_DEFAULT 1
+#define SUBLANG_DUTCH 1
+#define SUBLANG_DUTCH_BELGIAN 2
+#define SUBLANG_ENGLISH_AUS 3
+#define SUBLANG_ENGLISH_CAN 4
+#define SUBLANG_ENGLISH_EIRE 6
+#define SUBLANG_ENGLISH_NZ 5
+#define SUBLANG_ENGLISH_UK 2
+#define SUBLANG_ENGLISH_US 1
+#define SUBLANG_FRENCH 1
+#define SUBLANG_FRENCH_BELGIAN 2
+#define SUBLANG_FRENCH_CANADIAN 3
+#define SUBLANG_FRENCH_SWISS 4
+#define SUBLANG_GERMAN 1
+#define SUBLANG_GERMAN_AUSTRIAN 3
+#define SUBLANG_GERMAN_SWISS 2
+#define SUBLANG_ITALIAN 1
+#define SUBLANG_ITALIAN_SWISS 2
+#define SUBLANG_NEUTRAL 0
+#define SUBLANG_NORWEGIAN_BOKMAL 1
+#define SUBLANG_NORWEGIAN_NYNORSK 2
+#define SUBLANG_PORTUGUESE 2
+#define SUBLANG_PORTUGUESE_BRAZILIAN 1
+#define SUBLANG_SPANISH 1
+#define SUBLANG_SPANISH_MEXICAN 2
+#define SUBLANG_SPANISH_MODERN 3
+#define SUBLANG_SYS_DEFAULT 2
+#define NLS_VALID_LOCALE_MASK 1048575
+#define SORT_DEFAULT 0
+#define SORT_JAPANESE_XJIS 0
+#define SORT_JAPANESE_UNICODE 1
+#define SORT_CHINESE_BIG5 0
+#define SORT_CHINESE_UNICODE 1
+#define SORT_KOREAN_KSC 0
+#define SORT_KOREAN_UNICODE 1
+#define MAKELANGID(p,s) ((((WORD)(s))<<10)|(WORD)(p))
+#define MAKELCID(l,s) ((DWORD)((((DWORD)((WORD)(s)))<<16)|((DWORD)((WORD)(l)))))
+#define PRIMARYLANGID(l) ((WORD)(l)&0x3ff)
+#define SORTIDFROMLCID(l) ((WORD)((((DWORD)(l))&NLS_VALID_LOCALE_MASK)>>16))
+#define SORTVERSIONFROMLCID(l) ((WORD)((((DWORD)(l))>>20)&0xf))
+#define SUBLANGID(l) ((WORD)(l)>>10)
+#define LANGIDFROMLCID(l) ((WORD)(l))
+#define LANG_SYSTEM_DEFAULT MAKELANGID(LANG_NEUTRAL,SUBLANG_SYS_DEFAULT)
+#define LANG_USER_DEFAULT MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT)
+#define LOCALE_NEUTRAL MAKELCID(MAKELANGID(LANG_NEUTRAL,SUBLANG_NEUTRAL),SORT_DEFAULT)
+#define ACL_REVISION 2
+#define ACL_REVISION_DS 4
+#define ACL_REVISION1 1
+#define ACL_REVISION2 2
+#define ACL_REVISION3 3
+#define ACL_REVISION4 4
+#define MIN_ACL_REVISION 2
+#define MAX_ACL_REVISION 4
+#define MINCHAR 0x80
+#define MAXCHAR 0x7f
+#define MINSHORT 0x8000
+#define MAXSHORT 0x7fff
+#define MINLONG 0x80000000
+#define MAXLONG 0x7fffffff
+#define MAXBYTE 0xff
+#define MAXWORD 0xffff
+#define MAXDWORD 0xffffffff
+#define PROCESSOR_INTEL_386 386
+#define PROCESSOR_INTEL_486 486
+#define PROCESSOR_INTEL_PENTIUM 586
+#define PROCESSOR_MIPS_R4000 4000
+#define PROCESSOR_ALPHA_21064 21064
+#define PROCESSOR_ARCHITECTURE_INTEL 0
+#define PROCESSOR_ARCHITECTURE_MIPS 1
+#define PROCESSOR_ARCHITECTURE_ALPHA 2
+#define PROCESSOR_ARCHITECTURE_PPC 3
+#define PROCESSOR_ARCHITECTURE_UNKNOWN 0xFFFF
+#define PAGE_READONLY 2
+#define PAGE_READWRITE 4
+#define PAGE_WRITECOPY 8
+#define FILE_ACTION_ADDED 1
+#define FILE_ACTION_REMOVED 2
+#define FILE_ACTION_MODIFIED 3
+#define FILE_ACTION_RENAMED_OLD_NAME 4
+#define FILE_ACTION_RENAMED_NEW_NAME 5
+#define HEAP_NO_SERIALIZE 1
+#define HEAP_GROWABLE 2
+#define HEAP_GENERATE_EXCEPTIONS 4
+#define HEAP_ZERO_MEMORY 8
+#define HEAP_REALLOC_IN_PLACE_ONLY 16
+#define HEAP_TAIL_CHECKING_ENABLED 32
+#define HEAP_FREE_CHECKING_ENABLED 64
+#define HEAP_DISABLE_COALESCE_ON_FREE 128
+#define HEAP_CREATE_ALIGN_16 0x0000
+#define HEAP_CREATE_ENABLE_TRACING 0x20000
+#define HEAP_MAXIMUM_TAG 0xFFF
+#define HEAP_PSEUDO_TAG_FLAG 0x8000
+#define HEAP_TAG_SHIFT 16
+#define HEAP_MAKE_TAG_FLAGS(b,o) ((DWORD)((b)+(o)<<16)))
+#define KEY_QUERY_VALUE 1
+#define KEY_SET_VALUE 2
+#define KEY_CREATE_SUB_KEY 4
+#define KEY_ENUMERATE_SUB_KEYS 8
+#define KEY_NOTIFY 16
+#define KEY_CREATE_LINK 32
+#define KEY_WRITE 0x20006
+#define KEY_EXECUTE 0x20019
+#define KEY_READ 0x20019
+#define KEY_ALL_ACCESS 0xf003f
+#define REG_WHOLE_HIVE_VOLATILE 1
+#define REG_REFRESH_HIVE 2
+#define REG_NO_LAZY_FLUSH 4
+#define REG_OPTION_RESERVED 0
+#define REG_OPTION_NON_VOLATILE 0
+#define REG_OPTION_VOLATILE 1
+#define REG_OPTION_CREATE_LINK 2
+#define REG_OPTION_BACKUP_RESTORE 4
+#define REG_OPTION_OPEN_LINK 8
+#define REG_LEGAL_OPTION 15
+#define OWNER_SECURITY_INFORMATION 1
+#define GROUP_SECURITY_INFORMATION 2
+#define DACL_SECURITY_INFORMATION 4
+#define SACL_SECURITY_INFORMATION 8
+#define MAXIMUM_PROCESSORS 32
+#define PAGE_EXECUTE 16
+#define PAGE_EXECUTE_READ 32
+#define PAGE_EXECUTE_READWRITE 64
+#define PAGE_GUARD 256
+#define PAGE_NOACCESS 1
+#define PAGE_NOCACHE 512
+#define MEM_COMMIT 4096
+#define MEM_FREE 65536
+#define MEM_RESERVE 8192
+#define MEM_IMAGE 16777216
+#define MEM_MAPPED 262144
+#define MEM_PRIVATE 131072
+#define MEM_DECOMMIT 16384
+#define MEM_RELEASE 32768
+#define PAGE_EXECUTE_WRITECOPY 128
+#define SECTION_EXTEND_SIZE 16
+#define SECTION_MAP_READ 4
+#define SECTION_MAP_WRITE 2
+#define SECTION_QUERY 1
+#define SECTION_ALL_ACCESS 0xf001f
+#define MESSAGE_RESOURCE_UNICODE 1
+#define RTL_CRITSECT_TYPE 0
+#define RTL_RESOURCE_TYPE 1
+#define FIELD_OFFSET(t,f) ((LONG)&(((t*)0)->f))
+#define IMAGE_SIZEOF_FILE_HEADER 20
+#define IMAGE_FILE_RELOCS_STRIPPED 1
+#define IMAGE_FILE_EXECUTABLE_IMAGE 2
+#define IMAGE_FILE_LINE_NUMS_STRIPPED 4
+#define IMAGE_FILE_LOCAL_SYMS_STRIPPED 8
+#define IMAGE_FILE_BYTES_REVERSED_LO 128
+#define IMAGE_FILE_32BIT_MACHINE 256
+#define IMAGE_FILE_DEBUG_STRIPPED 512
+#define IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP 1024
+#define IMAGE_FILE_NET_RUN_FROM_SWAP 2048
+#define IMAGE_FILE_SYSTEM 4096
+#define IMAGE_FILE_DLL 8192
+#define IMAGE_FILE_UP_SYSTEM_ONLY 16384
+#define IMAGE_FILE_BYTES_REVERSED_HI 32768
+#define IMAGE_FILE_MACHINE_UNKNOWN 0
+#define IMAGE_FILE_MACHINE_I386 332
+#define IMAGE_FILE_MACHINE_R3000 354
+#define IMAGE_FILE_MACHINE_R4000 358
+#define IMAGE_FILE_MACHINE_R10000 360
+#define IMAGE_FILE_MACHINE_ALPHA 388
+#define IMAGE_FILE_MACHINE_POWERPC 496
+#define IMAGE_DOS_SIGNATURE 0x5A4D
+#define IMAGE_OS2_SIGNATURE 0x454E
+#define IMAGE_OS2_SIGNATURE_LE 0x454C
+#define IMAGE_VXD_SIGNATURE 0x454C
+#define IMAGE_NT_SIGNATURE 0x00004550
+#define IMAGE_NT_OPTIONAL_HDR_MAGIC 0x10b
+#define IMAGE_ROM_OPTIONAL_HDR_MAGIC 0x107
+#define IMAGE_SEPARATE_DEBUG_SIGNATURE 0x4944
+#define IMAGE_NUMBEROF_DIRECTORY_ENTRIES 16
+#define IMAGE_SIZEOF_ROM_OPTIONAL_HEADER 56
+#define IMAGE_SIZEOF_STD_OPTIONAL_HEADER 28
+#define IMAGE_SIZEOF_NT_OPTIONAL_HEADER 224
+#define IMAGE_SIZEOF_SHORT_NAME 8
+#define IMAGE_SIZEOF_SECTION_HEADER 40
+#define IMAGE_SIZEOF_SYMBOL 18
+#define IMAGE_SIZEOF_AUX_SYMBOL 18
+#define IMAGE_SIZEOF_RELOCATION 10
+#define IMAGE_SIZEOF_BASE_RELOCATION 8
+#define IMAGE_SIZEOF_LINENUMBER 6
+#define IMAGE_SIZEOF_ARCHIVE_MEMBER_HDR 60
+#define SIZEOF_RFPO_DATA 16
+#define IMAGE_SUBSYSTEM_UNKNOWN 0
+#define IMAGE_SUBSYSTEM_NATIVE 1
+#define IMAGE_SUBSYSTEM_WINDOWS_GUI 2
+#define IMAGE_SUBSYSTEM_WINDOWS_CUI 3
+#define IMAGE_SUBSYSTEM_OS2_CUI 5
+#define IMAGE_SUBSYSTEM_POSIX_CUI 7
+#define IMAGE_FIRST_SECTION(h) ((PIMAGE_SECTION_HEADER) ((DWORD)h+FIELD_OFFSET(IMAGE_NT_HEADERS,OptionalHeader)+((PIMAGE_NT_HEADERS)(h))->FileHeader.SizeOfOptionalHeader))
+#define IMAGE_DIRECTORY_ENTRY_EXPORT 0
+#define IMAGE_DIRECTORY_ENTRY_IMPORT 1
+#define IMAGE_DIRECTORY_ENTRY_RESOURCE 2
+#define IMAGE_DIRECTORY_ENTRY_EXCEPTION 3
+#define IMAGE_DIRECTORY_ENTRY_SECURITY 4
+#define IMAGE_DIRECTORY_ENTRY_BASERELOC 5
+#define IMAGE_DIRECTORY_ENTRY_DEBUG 6
+#define IMAGE_DIRECTORY_ENTRY_COPYRIGHT 7
+#define IMAGE_DIRECTORY_ENTRY_GLOBALPTR 8
+#define IMAGE_DIRECTORY_ENTRY_TLS 9
+#define IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG 10
+#define IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT 11
+#define IMAGE_DIRECTORY_ENTRY_IAT 12
+#define IMAGE_SCN_TYPE_NO_PAD 8
+#define IMAGE_SCN_CNT_CODE 32
+#define IMAGE_SCN_CNT_INITIALIZED_DATA 64
+#define IMAGE_SCN_CNT_UNINITIALIZED_DATA 128
+#define IMAGE_SCN_LNK_OTHER 256
+#define IMAGE_SCN_LNK_INFO 512
+#define IMAGE_SCN_LNK_REMOVE 2048
+#define IMAGE_SCN_LNK_COMDAT 4096
+#define IMAGE_SCN_MEM_FARDATA 0x8000
+#define IMAGE_SCN_MEM_PURGEABLE 0x20000
+#define IMAGE_SCN_MEM_16BIT 0x20000
+#define IMAGE_SCN_MEM_LOCKED 0x40000
+#define IMAGE_SCN_MEM_PRELOAD 0x80000
+#define IMAGE_SCN_ALIGN_1BYTES 0x100000
+#define IMAGE_SCN_ALIGN_2BYTES 0x200000
+#define IMAGE_SCN_ALIGN_4BYTES 0x300000
+#define IMAGE_SCN_ALIGN_8BYTES 0x400000
+#define IMAGE_SCN_ALIGN_16BYTES 0x500000
+#define IMAGE_SCN_ALIGN_32BYTES 0x600000
+#define IMAGE_SCN_ALIGN_64BYTES 0x700000
+#define IMAGE_SCN_LNK_NRELOC_OVFL 0x1000000
+#define IMAGE_SCN_MEM_DISCARDABLE 0x2000000
+#define IMAGE_SCN_MEM_NOT_CACHED 0x4000000
+#define IMAGE_SCN_MEM_NOT_PAGED 0x8000000
+#define IMAGE_SCN_MEM_SHARED 0x10000000
+#define IMAGE_SCN_MEM_EXECUTE 0x20000000
+#define IMAGE_SCN_MEM_READ 0x40000000
+#define IMAGE_SCN_MEM_WRITE 0x80000000
+#define IMAGE_SYM_UNDEFINED 0
+#define IMAGE_SYM_ABSOLUTE (-1)
+#define IMAGE_SYM_DEBUG (-2)
+#define IMAGE_SYM_TYPE_NULL 0
+#define IMAGE_SYM_TYPE_VOID 1
+#define IMAGE_SYM_TYPE_CHAR 2
+#define IMAGE_SYM_TYPE_SHORT 3
+#define IMAGE_SYM_TYPE_INT 4
+#define IMAGE_SYM_TYPE_LONG 5
+#define IMAGE_SYM_TYPE_FLOAT 6
+#define IMAGE_SYM_TYPE_DOUBLE 7
+#define IMAGE_SYM_TYPE_STRUCT 8
+#define IMAGE_SYM_TYPE_UNION 9
+#define IMAGE_SYM_TYPE_ENUM 10
+#define IMAGE_SYM_TYPE_MOE 11
+#define IMAGE_SYM_TYPE_BYTE 12
+#define IMAGE_SYM_TYPE_WORD 13
+#define IMAGE_SYM_TYPE_UINT 14
+#define IMAGE_SYM_TYPE_DWORD 15
+#define IMAGE_SYM_TYPE_PCODE 32768
+#define IMAGE_SYM_DTYPE_NULL 0
+#define IMAGE_SYM_DTYPE_POINTER 1
+#define IMAGE_SYM_DTYPE_FUNCTION 2
+#define IMAGE_SYM_DTYPE_ARRAY 3
+#define IMAGE_SYM_CLASS_END_OF_FUNCTION (-1)
+#define IMAGE_SYM_CLASS_NULL 0
+#define IMAGE_SYM_CLASS_AUTOMATIC 1
+#define IMAGE_SYM_CLASS_EXTERNAL 2
+#define IMAGE_SYM_CLASS_STATIC 3
+#define IMAGE_SYM_CLASS_REGISTER 4
+#define IMAGE_SYM_CLASS_EXTERNAL_DEF 5
+#define IMAGE_SYM_CLASS_LABEL 6
+#define IMAGE_SYM_CLASS_UNDEFINED_LABEL 7
+#define IMAGE_SYM_CLASS_MEMBER_OF_STRUCT 8
+#define IMAGE_SYM_CLASS_ARGUMENT 9
+#define IMAGE_SYM_CLASS_STRUCT_TAG 10
+#define IMAGE_SYM_CLASS_MEMBER_OF_UNION 11
+#define IMAGE_SYM_CLASS_UNION_TAG 12
+#define IMAGE_SYM_CLASS_TYPE_DEFINITION 13
+#define IMAGE_SYM_CLASS_UNDEFINED_STATIC 14
+#define IMAGE_SYM_CLASS_ENUM_TAG 15
+#define IMAGE_SYM_CLASS_MEMBER_OF_ENUM 16
+#define IMAGE_SYM_CLASS_REGISTER_PARAM 17
+#define IMAGE_SYM_CLASS_BIT_FIELD 18
+#define IMAGE_SYM_CLASS_FAR_EXTERNAL 68
+#define IMAGE_SYM_CLASS_BLOCK 100
+#define IMAGE_SYM_CLASS_FUNCTION 101
+#define IMAGE_SYM_CLASS_END_OF_STRUCT 102
+#define IMAGE_SYM_CLASS_FILE 103
+#define IMAGE_SYM_CLASS_SECTION 104
+#define IMAGE_SYM_CLASS_WEAK_EXTERNAL 105
+#define IMAGE_COMDAT_SELECT_NODUPLICATES 1
+#define IMAGE_COMDAT_SELECT_ANY 2
+#define IMAGE_COMDAT_SELECT_SAME_SIZE 3
+#define IMAGE_COMDAT_SELECT_EXACT_MATCH 4
+#define IMAGE_COMDAT_SELECT_ASSOCIATIVE 5
+#define IMAGE_COMDAT_SELECT_LARGEST 6
+#define IMAGE_COMDAT_SELECT_NEWEST 7
+#define IMAGE_WEAK_EXTERN_SEARCH_NOLIBRARY 1
+#define IMAGE_WEAK_EXTERN_SEARCH_LIBRARY 2
+#define IMAGE_WEAK_EXTERN_SEARCH_ALIAS 3
+#define IMAGE_REL_I386_ABSOLUTE 0
+#define IMAGE_REL_I386_DIR16 1
+#define IMAGE_REL_I386_REL16 2
+#define IMAGE_REL_I386_DIR32 6
+#define IMAGE_REL_I386_DIR32NB 7
+#define IMAGE_REL_I386_SEG12 9
+#define IMAGE_REL_I386_SECTION 10
+#define IMAGE_REL_I386_SECREL 11
+#define IMAGE_REL_I386_REL32 20
+#define IMAGE_REL_MIPS_ABSOLUTE 0
+#define IMAGE_REL_MIPS_REFHALF 1
+#define IMAGE_REL_MIPS_REFWORD 2
+#define IMAGE_REL_MIPS_JMPADDR 3
+#define IMAGE_REL_MIPS_REFHI 4
+#define IMAGE_REL_MIPS_REFLO 5
+#define IMAGE_REL_MIPS_GPREL 6
+#define IMAGE_REL_MIPS_LITERAL 7
+#define IMAGE_REL_MIPS_SECTION 10
+#define IMAGE_REL_MIPS_SECREL 11
+#define IMAGE_REL_MIPS_SECRELLO 12
+#define IMAGE_REL_MIPS_SECRELHI 13
+#define IMAGE_REL_MIPS_REFWORDNB 34
+#define IMAGE_REL_MIPS_PAIR 35
+#define IMAGE_REL_ALPHA_ABSOLUTE 0
+#define IMAGE_REL_ALPHA_REFLONG 1
+#define IMAGE_REL_ALPHA_REFQUAD 2
+#define IMAGE_REL_ALPHA_GPREL32 3
+#define IMAGE_REL_ALPHA_LITERAL 4
+#define IMAGE_REL_ALPHA_LITUSE 5
+#define IMAGE_REL_ALPHA_GPDISP 6
+#define IMAGE_REL_ALPHA_BRADDR 7
+#define IMAGE_REL_ALPHA_HINT 8
+#define IMAGE_REL_ALPHA_INLINE_REFLONG 9
+#define IMAGE_REL_ALPHA_REFHI 10
+#define IMAGE_REL_ALPHA_REFLO 11
+#define IMAGE_REL_ALPHA_PAIR 12
+#define IMAGE_REL_ALPHA_MATCH 13
+#define IMAGE_REL_ALPHA_SECTION 14
+#define IMAGE_REL_ALPHA_SECREL 15
+#define IMAGE_REL_ALPHA_REFLONGNB 16
+#define IMAGE_REL_ALPHA_SECRELLO 17
+#define IMAGE_REL_ALPHA_SECRELHI 18
+#define IMAGE_REL_PPC_ABSOLUTE 0
+#define IMAGE_REL_PPC_ADDR64 1
+#define IMAGE_REL_PPC_ADDR32 2
+#define IMAGE_REL_PPC_ADDR24 3
+#define IMAGE_REL_PPC_ADDR16 4
+#define IMAGE_REL_PPC_ADDR14 5
+#define IMAGE_REL_PPC_REL24 6
+#define IMAGE_REL_PPC_REL14 7
+#define IMAGE_REL_PPC_TOCREL16 8
+#define IMAGE_REL_PPC_TOCREL14 9
+#define IMAGE_REL_PPC_ADDR32NB 10
+#define IMAGE_REL_PPC_SECREL 11
+#define IMAGE_REL_PPC_SECTION 12
+#define IMAGE_REL_PPC_IFGLUE 13
+#define IMAGE_REL_PPC_IMGLUE 14
+#define IMAGE_REL_PPC_SECREL16 15
+#define IMAGE_REL_PPC_REFHI 16
+#define IMAGE_REL_PPC_REFLO 17
+#define IMAGE_REL_PPC_PAIR 18
+#define IMAGE_REL_PPC_TYPEMASK 255
+#define IMAGE_REL_PPC_NEG 256
+#define IMAGE_REL_PPC_BRTAKEN 512
+#define IMAGE_REL_PPC_BRNTAKEN 1024
+#define IMAGE_REL_PPC_TOCDEFN 2048
+#define IMAGE_REL_BASED_ABSOLUTE 0
+#define IMAGE_REL_BASED_HIGH 1
+#define IMAGE_REL_BASED_LOW 2
+#define IMAGE_REL_BASED_HIGHLOW 3
+#define IMAGE_REL_BASED_HIGHADJ 4
+#define IMAGE_REL_BASED_MIPS_JMPADDR 5
+#define IMAGE_ARCHIVE_START_SIZE 8
+#define IMAGE_ARCHIVE_START "!<arch>\n"
+#define IMAGE_ARCHIVE_END "`\n"
+#define IMAGE_ARCHIVE_PAD "\n"
+#define IMAGE_ARCHIVE_LINKER_MEMBER "/ "
+#define IMAGE_ARCHIVE_LONGNAMES_MEMBER "// "
+#define IMAGE_ORDINAL_FLAG 0x80000000
+#define IMAGE_SNAP_BY_ORDINAL(o) ((o&IMAGE_ORDINAL_FLAG)!=0)
+#define IMAGE_ORDINAL(o) (o&0xffff)
+#define IMAGE_RESOURCE_NAME_IS_STRING 0x80000000
+#define IMAGE_RESOURCE_DATA_IS_DIRECTORY 0x80000000
+#define IMAGE_DEBUG_TYPE_UNKNOWN 0
+#define IMAGE_DEBUG_TYPE_COFF 1
+#define IMAGE_DEBUG_TYPE_CODEVIEW 2
+#define IMAGE_DEBUG_TYPE_FPO 3
+#define IMAGE_DEBUG_TYPE_MISC 4
+#define IMAGE_DEBUG_TYPE_EXCEPTION 5
+#define IMAGE_DEBUG_TYPE_FIXUP 6
+#define IMAGE_DEBUG_TYPE_OMAP_TO_SRC 7
+#define IMAGE_DEBUG_TYPE_OMAP_FROM_SRC 8
+#define FRAME_FPO 0
+#define FRAME_TRAP 1
+#define FRAME_TSS 2
+#define FRAME_NONFPO 3
+#define IMAGE_DEBUG_MISC_EXENAME 1
+#define N_BTMASK 0x000F
+#define N_TMASK 0x0030
+#define N_TMASK1 0x00C0
+#define N_TMASK2 0x00F0
+#define N_BTSHFT 4
+#define N_TSHIFT 2
+#define IS_TEXT_UNICODE_ASCII16 1
+#define IS_TEXT_UNICODE_REVERSE_ASCII16 16
+#define IS_TEXT_UNICODE_STATISTICS 2
+#define IS_TEXT_UNICODE_REVERSE_STATISTICS 32
+#define IS_TEXT_UNICODE_CONTROLS 4
+#define IS_TEXT_UNICODE_REVERSE_CONTROLS 64
+#define IS_TEXT_UNICODE_SIGNATURE 8
+#define IS_TEXT_UNICODE_REVERSE_SIGNATURE 128
+#define IS_TEXT_UNICODE_ILLEGAL_CHARS 256
+#define IS_TEXT_UNICODE_ODD_LENGTH 512
+#define IS_TEXT_UNICODE_NULL_BYTES 4096
+#define IS_TEXT_UNICODE_UNICODE_MASK 15
+#define IS_TEXT_UNICODE_REVERSE_MASK 240
+#define IS_TEXT_UNICODE_NOT_UNICODE_MASK 3840
+#define IS_TEXT_UNICODE_NOT_ASCII_MASK 61440
+#define SERVICE_KERNEL_DRIVER 1
+#define SERVICE_FILE_SYSTEM_DRIVER 2
+#define SERVICE_ADAPTER 4
+#define SERVICE_RECOGNIZER_DRIVER 8
+#define SERVICE_DRIVER (SERVICE_KERNEL_DRIVER|SERVICE_FILE_SYSTEM_DRIVER|SERVICE_RECOGNIZER_DRIVER)
+#define SERVICE_WIN32_OWN_PROCESS 16
+#define SERVICE_WIN32_SHARE_PROCESS 32
+#define SERVICE_WIN32 (SERVICE_WIN32_OWN_PROCESS|SERVICE_WIN32_SHARE_PROCESS)
+#define SERVICE_INTERACTIVE_PROCESS 256
+#define SERVICE_TYPE_ALL (SERVICE_WIN32|SERVICE_ADAPTER|SERVICE_DRIVER|SERVICE_INTERACTIVE_PROCESS)
+#define SERVICE_BOOT_START 0
+#define SERVICE_SYSTEM_START 1
+#define SERVICE_AUTO_START 2
+#define SERVICE_DEMAND_START 3
+#define SERVICE_DISABLED 4
+#define SERVICE_ERROR_IGNORE 0
+#define SERVICE_ERROR_NORMAL 1
+#define SERVICE_ERROR_SEVERE 2
+#define SERVICE_ERROR_CRITICAL 3
+#define SE_OWNER_DEFAULTED 1
+#define SE_GROUP_DEFAULTED 2
+#define SE_DACL_PRESENT 4
+#define SE_DACL_DEFAULTED 8
+#define SE_SACL_PRESENT 16
+#define SE_SACL_DEFAULTED 32
+#define SE_DACL_AUTO_INHERIT_REQ 256
+#define SE_SACL_AUTO_INHERIT_REQ 512
+#define SE_DACL_AUTO_INHERITED 1024
+#define SE_SACL_AUTO_INHERITED 2048
+#define SE_DACL_PROTECTED 4096
+#define SE_SACL_PROTECTED 8192
+#define SE_SELF_RELATIVE 0x8000
+#define SECURITY_DESCRIPTOR_MIN_LENGTH 20
+#define SECURITY_DESCRIPTOR_REVISION 1
+#define SECURITY_DESCRIPTOR_REVISION1 1
+#define SE_PRIVILEGE_ENABLED_BY_DEFAULT 1
+#define SE_PRIVILEGE_ENABLED 2
+#define SE_PRIVILEGE_USED_FOR_ACCESS 0x80000000
+#define PRIVILEGE_SET_ALL_NECESSARY 1
+#define SECURITY_MAX_IMPERSONATION_LEVEL SecurityDelegation
+#define DEFAULT_IMPERSONATION_LEVEL SecurityImpersonation
+#define SECURITY_DYNAMIC_TRACKING TRUE
+#define SECURITY_STATIC_TRACKING FALSE
+#define TOKEN_SOURCE_LENGTH 8
+#define TOKEN_ADJUST_DEFAULT 128
+#define TOKEN_ADJUST_GROUPS 64
+#define TOKEN_ADJUST_PRIVILEGES 32
+#define TOKEN_ALL_ACCESS 0xf00ff
+#define TOKEN_ASSIGN_PRIMARY 1
+#define TOKEN_DUPLICATE 2
+#define TOKEN_EXECUTE 0x20000
+#define TOKEN_IMPERSONATE 4
+#define TOKEN_QUERY 8
+#define TOKEN_QUERY_SOURCE 16
+#define TOKEN_READ 0x20008
+#define TOKEN_WRITE 0x200e0
+#define DLL_PROCESS_DETACH 0
+#define DLL_PROCESS_ATTACH 1
+#define DLL_THREAD_ATTACH 2
+#define DLL_THREAD_DETACH 3
+#define DBG_CONTINUE 0x10002
+#define DBG_TERMINATE_THREAD 0x40010003
+#define DBG_TERMINATE_PROCESS 0x40010004
+#define DBG_CONTROL_C 0x40010005
+#define DBG_CONTROL_BREAK 0x40010008
+#define DBG_EXCEPTION_NOT_HANDLED 0x80010001
+#define TAPE_ABSOLUTE_POSITION 0
+#define TAPE_LOGICAL_POSITION 1
+#define TAPE_PSEUDO_LOGICAL_POSITION 2
+#define TAPE_REWIND 0
+#define TAPE_ABSOLUTE_BLOCK 1
+#define TAPE_LOGICAL_BLOCK 2
+#define TAPE_PSEUDO_LOGICAL_BLOCK 3
+#define TAPE_SPACE_END_OF_DATA 4
+#define TAPE_SPACE_RELATIVE_BLOCKS 5
+#define TAPE_SPACE_FILEMARKS 6
+#define TAPE_SPACE_SEQUENTIAL_FMKS 7
+#define TAPE_SPACE_SETMARKS 8
+#define TAPE_SPACE_SEQUENTIAL_SMKS 9
+#define TAPE_DRIVE_FIXED 1
+#define TAPE_DRIVE_SELECT 2
+#define TAPE_DRIVE_INITIATOR 4
+#define TAPE_DRIVE_ERASE_SHORT 16
+#define TAPE_DRIVE_ERASE_LONG 32
+#define TAPE_DRIVE_ERASE_BOP_ONLY 64
+#define TAPE_DRIVE_ERASE_IMMEDIATE 128
+#define TAPE_DRIVE_TAPE_CAPACITY 256
+#define TAPE_DRIVE_TAPE_REMAINING 512
+#define TAPE_DRIVE_FIXED_BLOCK 1024
+#define TAPE_DRIVE_VARIABLE_BLOCK 2048
+#define TAPE_DRIVE_WRITE_PROTECT 4096
+#define TAPE_DRIVE_EOT_WZ_SIZE 8192
+#define TAPE_DRIVE_ECC 0x10000
+#define TAPE_DRIVE_COMPRESSION 0x20000
+#define TAPE_DRIVE_PADDING 0x40000
+#define TAPE_DRIVE_REPORT_SMKS 0x80000
+#define TAPE_DRIVE_GET_ABSOLUTE_BLK 0x100000
+#define TAPE_DRIVE_GET_LOGICAL_BLK 0x200000
+#define TAPE_DRIVE_SET_EOT_WZ_SIZE 0x400000
+#define TAPE_DRIVE_RESERVED_BIT 0x80000000
+#define TAPE_DRIVE_LOAD_UNLOAD 0x80000001
+#define TAPE_DRIVE_TENSION 0x80000002
+#define TAPE_DRIVE_LOCK_UNLOCK 0x80000004
+#define TAPE_DRIVE_REWIND_IMMEDIATE 0x80000008
+#define TAPE_DRIVE_SET_BLOCK_SIZE 0x80000010
+#define TAPE_DRIVE_LOAD_UNLD_IMMED 0x80000020
+#define TAPE_DRIVE_TENSION_IMMED 0x80000040
+#define TAPE_DRIVE_LOCK_UNLK_IMMED 0x80000080
+#define TAPE_DRIVE_SET_ECC 0x80000100
+#define TAPE_DRIVE_SET_COMPRESSION 0x80000200
+#define TAPE_DRIVE_SET_PADDING 0x80000400
+#define TAPE_DRIVE_SET_REPORT_SMKS 0x80000800
+#define TAPE_DRIVE_ABSOLUTE_BLK 0x80001000
+#define TAPE_DRIVE_ABS_BLK_IMMED 0x80002000
+#define TAPE_DRIVE_LOGICAL_BLK 0x80004000
+#define TAPE_DRIVE_LOG_BLK_IMMED 0x80008000
+#define TAPE_DRIVE_END_OF_DATA 0x80010000
+#define TAPE_DRIVE_RELATIVE_BLKS 0x80020000
+#define TAPE_DRIVE_FILEMARKS 0x80040000
+#define TAPE_DRIVE_SEQUENTIAL_FMKS 0x80080000
+#define TAPE_DRIVE_SETMARKS 0x80100000
+#define TAPE_DRIVE_SEQUENTIAL_SMKS 0x80200000
+#define TAPE_DRIVE_REVERSE_POSITION 0x80400000
+#define TAPE_DRIVE_SPACE_IMMEDIATE 0x80800000
+#define TAPE_DRIVE_WRITE_SETMARKS 0x81000000
+#define TAPE_DRIVE_WRITE_FILEMARKS 0x82000000
+#define TAPE_DRIVE_WRITE_SHORT_FMKS 0x84000000
+#define TAPE_DRIVE_WRITE_LONG_FMKS 0x88000000
+#define TAPE_DRIVE_WRITE_MARK_IMMED 0x90000000
+#define TAPE_DRIVE_FORMAT 0xA0000000
+#define TAPE_DRIVE_FORMAT_IMMEDIATE 0xC0000000
+#define TAPE_DRIVE_HIGH_FEATURES 0x80000000
+#define TAPE_FIXED_PARTITIONS 0
+#define TAPE_INITIATOR_PARTITIONS 2
+#define TAPE_SELECT_PARTITIONS 1
+#define TAPE_FILEMARKS 1
+#define TAPE_LONG_FILEMARKS 3
+#define TAPE_SETMARKS 0
+#define TAPE_SHORT_FILEMARKS 2
+#define TAPE_ERASE_LONG 1
+#define TAPE_ERASE_SHORT 0
+#define TAPE_LOAD 0
+#define TAPE_UNLOAD 1
+#define TAPE_TENSION 2
+#define TAPE_LOCK 3
+#define TAPE_UNLOCK 4
+#define TAPE_FORMAT 5
+#define BTYPE(x) ((x)&N_BTMASK)
+#define ISPTR(x) (((x)&N_TMASK)==(IMAGE_SYM_DTYPE_POINTER<<N_BTSHFT))
+#define ISFCN(x) (((x)&N_TMASK)==(IMAGE_SYM_DTYPE_FUNCTION<<N_BTSHFT))
+#define ISARY(x) (((x)&N_TMASK)==(IMAGE_SYM_DTYPE_ARRAY<<N_BTSHFT))
+#define ISTAG(x) ((x)==IMAGE_SYM_CLASS_STRUCT_TAG||(x)==IMAGE_SYM_CLASS_UNION_TAG||(x)==IMAGE_SYM_CLASS_ENUM_TAG)
+#define INCREF(x) ((((x)&~N_BTMASK)<<N_TSHIFT)|(IMAGE_SYM_DTYPE_POINTER<<N_BTSHFT)|((x)&N_BTMASK))
+#define DECREF(x) ((((x)>>N_TSHIFT)&~N_BTMASK)|((x)&N_BTMASK))
+
+#ifndef RC_INVOKED
+typedef DWORD ACCESS_MASK;
+typedef struct _GENERIC_MAPPING {
+ ACCESS_MASK GenericRead;
+ ACCESS_MASK GenericWrite;
+ ACCESS_MASK GenericExecute;
+ ACCESS_MASK GenericAll;
+} GENERIC_MAPPING, *PGENERIC_MAPPING;
+typedef struct _ACE_HEADER {
+ BYTE AceType;
+ BYTE AceFlags;
+ WORD AceSize;
+} ACE_HEADER;
+typedef struct _ACCESS_ALLOWED_ACE {
+ ACE_HEADER Header;
+ ACCESS_MASK Mask;
+ DWORD SidStart;
+} ACCESS_ALLOWED_ACE;
+typedef struct _ACCESS_DENIED_ACE {
+ ACE_HEADER Header;
+ ACCESS_MASK Mask;
+ DWORD SidStart;
+} ACCESS_DENIED_ACE;
+typedef struct _ACL {
+ BYTE AclRevision;
+ BYTE Sbz1;
+ WORD AclSize;
+ WORD AceCount;
+ WORD Sbz2;
+} ACL,*PACL;
+typedef struct _ACL_REVISION_INFORMATION {
+ DWORD AclRevision;
+} ACL_REVISION_INFORMATION;
+typedef struct _ACL_SIZE_INFORMATION {
+ DWORD AceCount;
+ DWORD AclBytesInUse;
+ DWORD AclBytesFree;
+} ACL_SIZE_INFORMATION;
+
+/* FIXME: add more machines */
+#ifdef _X86_
+#define SIZE_OF_80387_REGISTERS 80
+#define CONTEXT_i386 0x10000
+#define CONTEXT_i486 0x10000
+#define CONTEXT_CONTROL (CONTEXT_i386|0x00000001L)
+#define CONTEXT_INTEGER (CONTEXT_i386|0x00000002L)
+#define CONTEXT_SEGMENTS (CONTEXT_i386|0x00000004L)
+#define CONTEXT_FLOATING_POINT (CONTEXT_i386|0x00000008L)
+#define CONTEXT_DEBUG_REGISTERS (CONTEXT_i386|0x00000010L)
+#define CONTEXT_FULL (CONTEXT_CONTROL|CONTEXT_INTEGER|CONTEXT_SEGMENTS)
+typedef struct _FLOATING_SAVE_AREA {
+ DWORD ControlWord;
+ DWORD StatusWord;
+ DWORD TagWord;
+ DWORD ErrorOffset;
+ DWORD ErrorSelector;
+ DWORD DataOffset;
+ DWORD DataSelector;
+ BYTE RegisterArea[80];
+ DWORD Cr0NpxState;
+} FLOATING_SAVE_AREA;
+typedef struct _CONTEXT {
+ DWORD ContextFlags;
+ DWORD Dr0;
+ DWORD Dr1;
+ DWORD Dr2;
+ DWORD Dr3;
+ DWORD Dr6;
+ DWORD Dr7;
+ FLOATING_SAVE_AREA FloatSave;
+ DWORD SegGs;
+ DWORD SegFs;
+ DWORD SegEs;
+ DWORD SegDs;
+ DWORD Edi;
+ DWORD Esi;
+ DWORD Ebx;
+ DWORD Edx;
+ DWORD Ecx;
+ DWORD Eax;
+ DWORD Ebp;
+ DWORD Eip;
+ DWORD SegCs;
+ DWORD EFlags;
+ DWORD Esp;
+ DWORD SegSs;
+} CONTEXT;
+#elif defined(_PPC_)
+#define CONTEXT_CONTROL 1L
+#define CONTEXT_FLOATING_POINT 2L
+#define CONTEXT_INTEGER 4L
+#define CONTEXT_DEBUG_REGISTERS 8L
+#define CONTEXT_FULL (CONTEXT_CONTROL|CONTEXT_FLOATING_POINT|CONTEXT_INTEGER)
+typedef struct {
+ double Fpr0;
+ double Fpr1;
+ double Fpr2;
+ double Fpr3;
+ double Fpr4;
+ double Fpr5;
+ double Fpr6;
+ double Fpr7;
+ double Fpr8;
+ double Fpr9;
+ double Fpr10;
+ double Fpr11;
+ double Fpr12;
+ double Fpr13;
+ double Fpr14;
+ double Fpr15;
+ double Fpr16;
+ double Fpr17;
+ double Fpr18;
+ double Fpr19;
+ double Fpr20;
+ double Fpr21;
+ double Fpr22;
+ double Fpr23;
+ double Fpr24;
+ double Fpr25;
+ double Fpr26;
+ double Fpr27;
+ double Fpr28;
+ double Fpr29;
+ double Fpr30;
+ double Fpr31;
+ double Fpscr;
+ DWORD Gpr0;
+ DWORD Gpr1;
+ DWORD Gpr2;
+ DWORD Gpr3;
+ DWORD Gpr4;
+ DWORD Gpr5;
+ DWORD Gpr6;
+ DWORD Gpr7;
+ DWORD Gpr8;
+ DWORD Gpr9;
+ DWORD Gpr10;
+ DWORD Gpr11;
+ DWORD Gpr12;
+ DWORD Gpr13;
+ DWORD Gpr14;
+ DWORD Gpr15;
+ DWORD Gpr16;
+ DWORD Gpr17;
+ DWORD Gpr18;
+ DWORD Gpr19;
+ DWORD Gpr20;
+ DWORD Gpr21;
+ DWORD Gpr22;
+ DWORD Gpr23;
+ DWORD Gpr24;
+ DWORD Gpr25;
+ DWORD Gpr26;
+ DWORD Gpr27;
+ DWORD Gpr28;
+ DWORD Gpr29;
+ DWORD Gpr30;
+ DWORD Gpr31;
+ DWORD Cr;
+ DWORD Xer;
+ DWORD Msr;
+ DWORD Iar;
+ DWORD Lr;
+ DWORD Ctr;
+ DWORD ContextFlags;
+ DWORD Fill[3];
+ DWORD Dr0;
+ DWORD Dr1;
+ DWORD Dr2;
+ DWORD Dr3;
+ DWORD Dr4;
+ DWORD Dr5;
+ DWORD Dr6;
+ DWORD Dr7;
+} CONTEXT;
+#elif defined(_ALPHA_)
+#define CONTEXT_ALPHA 0x20000
+#define CONTEXT_CONTROL (CONTEXT_ALPHA|1L)
+#define CONTEXT_FLOATING_POINT (CONTEXT_ALPHA|2L)
+#define CONTEXT_INTEGER (CONTEXT_ALPHA|4L)
+#define CONTEXT_FULL (CONTEXT_CONTROL|CONTEXT_FLOATING_POINT|CONTEXT_INTEGER)
+typedef struct _CONTEXT {
+ ULONGLONG FltF0;
+ ULONGLONG FltF1;
+ ULONGLONG FltF2;
+ ULONGLONG FltF3;
+ ULONGLONG FltF4;
+ ULONGLONG FltF5;
+ ULONGLONG FltF6;
+ ULONGLONG FltF7;
+ ULONGLONG FltF8;
+ ULONGLONG FltF9;
+ ULONGLONG FltF10;
+ ULONGLONG FltF11;
+ ULONGLONG FltF12;
+ ULONGLONG FltF13;
+ ULONGLONG FltF14;
+ ULONGLONG FltF15;
+ ULONGLONG FltF16;
+ ULONGLONG FltF17;
+ ULONGLONG FltF18;
+ ULONGLONG FltF19;
+ ULONGLONG FltF20;
+ ULONGLONG FltF21;
+ ULONGLONG FltF22;
+ ULONGLONG FltF23;
+ ULONGLONG FltF24;
+ ULONGLONG FltF25;
+ ULONGLONG FltF26;
+ ULONGLONG FltF27;
+ ULONGLONG FltF28;
+ ULONGLONG FltF29;
+ ULONGLONG FltF30;
+ ULONGLONG FltF31;
+ ULONGLONG IntV0;
+ ULONGLONG IntT0;
+ ULONGLONG IntT1;
+ ULONGLONG IntT2;
+ ULONGLONG IntT3;
+ ULONGLONG IntT4;
+ ULONGLONG IntT5;
+ ULONGLONG IntT6;
+ ULONGLONG IntT7;
+ ULONGLONG IntS0;
+ ULONGLONG IntS1;
+ ULONGLONG IntS2;
+ ULONGLONG IntS3;
+ ULONGLONG IntS4;
+ ULONGLONG IntS5;
+ ULONGLONG IntFp;
+ ULONGLONG IntA0;
+ ULONGLONG IntA1;
+ ULONGLONG IntA2;
+ ULONGLONG IntA3;
+ ULONGLONG IntA4;
+ ULONGLONG IntA5;
+ ULONGLONG IntT8;
+ ULONGLONG IntT9;
+ ULONGLONG IntT10;
+ ULONGLONG IntT11;
+ ULONGLONG IntRa;
+ ULONGLONG IntT12;
+ ULONGLONG IntAt;
+ ULONGLONG IntGp;
+ ULONGLONG IntSp;
+ ULONGLONG IntZero;
+ ULONGLONG Fpcr;
+ ULONGLONG SoftFpcr;
+ ULONGLONG Fir;
+ DWORD Psr;
+ DWORD ContextFlags;
+ DWORD Fill[4];
+} CONTEXT, *PCONTEXT;
+#elif defined(SHx)
+
+/* These are the debug or break registers on the SH3 */
+typedef struct _DEBUG_REGISTERS {
+ ULONG BarA;
+ UCHAR BasrA;
+ UCHAR BamrA;
+ USHORT BbrA;
+ ULONG BarB;
+ UCHAR BasrB;
+ UCHAR BamrB;
+ USHORT BbrB;
+ ULONG BdrB;
+ ULONG BdmrB;
+ USHORT Brcr;
+ USHORT Align;
+} DEBUG_REGISTERS, *PDEBUG_REGISTERS;
+
+/* The following flags control the contents of the CONTEXT structure. */
+
+#define CONTEXT_SH3 0x00000040
+#define CONTEXT_SH4 0x000000c0 /* CONTEXT_SH3 | 0x80 - must contain the SH3 bits */
+
+#ifdef SH3
+#define CONTEXT_CONTROL (CONTEXT_SH3 | 0x00000001L)
+#define CONTEXT_INTEGER (CONTEXT_SH3 | 0x00000002L)
+#define CONTEXT_DEBUG_REGISTERS (CONTEXT_SH3 | 0x00000008L)
+#define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_DEBUG_REGISTERS)
+#else /* SH4 */
+#define CONTEXT_CONTROL (CONTEXT_SH4 | 0x00000001L)
+#define CONTEXT_INTEGER (CONTEXT_SH4 | 0x00000002L)
+#define CONTEXT_DEBUG_REGISTERS (CONTEXT_SH4 | 0x00000008L)
+#define CONTEXT_FLOATING_POINT (CONTEXT_SH4 | 0x00000004L)
+#define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_DEBUG_REGISTERS | CONTEXT_FLOATING_POINT)
+#endif
+
+/* Context Frame */
+
+/* This frame is used to store a limited processor context into the */
+/* Thread structure for CPUs which have no floating point support. */
+
+typedef struct _CONTEXT {
+ /* The flags values within this flag control the contents of */
+ /* a CONTEXT record. */
+
+ /* If the context record is used as an input parameter, then */
+ /* for each portion of the context record controlled by a flag */
+ /* whose value is set, it is assumed that that portion of the */
+ /* context record contains valid context. If the context record */
+ /* is being used to modify a thread's context, then only that */
+ /* portion of the threads context will be modified. */
+
+ /* If the context record is used as an IN OUT parameter to capture */
+ /* the context of a thread, then only those portions of the thread's */
+ /* context corresponding to set flags will be returned. */
+
+ /* The context record is never used as an OUT only parameter. */
+
+
+ ULONG ContextFlags;
+
+ /* This section is specified/returned if the ContextFlags word contains */
+ /* the flag CONTEXT_INTEGER. */
+
+ /* N.B. The registers RA and R15 are defined in this section, but are */
+ /* considered part of the control context rather than part of the integer */
+ /* context. */
+
+ ULONG PR;
+ ULONG MACH;
+ ULONG MACL;
+ ULONG GBR;
+ ULONG R0;
+ ULONG R1;
+ ULONG R2;
+ ULONG R3;
+ ULONG R4;
+ ULONG R5;
+ ULONG R6;
+ ULONG R7;
+ ULONG R8;
+ ULONG R9;
+ ULONG R10;
+ ULONG R11;
+ ULONG R12;
+ ULONG R13;
+ ULONG R14;
+ ULONG R15;
+
+ /* This section is specified/returned if the ContextFlags word contains */
+ /* the flag CONTEXT_CONTROL. */
+
+ /* N.B. The registers r15 and ra are defined in the integer section, */
+ /* but are considered part of the control context rather than part of */
+ /* the integer context. */
+
+ ULONG Fir;
+ ULONG Psr;
+
+#if !defined(SH3e) && !defined(SH4)
+ ULONG OldStuff[2];
+ DEBUG_REGISTERS DebugRegisters;
+#else
+ ULONG Fpscr;
+ ULONG Fpul;
+ ULONG FRegs[16];
+#if defined(SH4)
+ ULONG xFRegs[16];
+#endif
+#endif
+} CONTEXT,*PCONTEXT,*LPCONTEXT;
+
+#elif defined(MIPS)
+
+/* The following flags control the contents of the CONTEXT structure. */
+
+#define CONTEXT_R4000 0x00010000 /* r4000 context */
+
+#define CONTEXT_CONTROL (CONTEXT_R4000 | 0x00000001L)
+#define CONTEXT_FLOATING_POINT (CONTEXT_R4000 | 0x00000002L)
+#define CONTEXT_INTEGER (CONTEXT_R4000 | 0x00000004L)
+
+#define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_FLOATING_POINT | CONTEXT_INTEGER)
+
+/* Context Frame */
+
+/* N.B. This frame must be exactly a multiple of 16 bytes in length. */
+
+/* This frame has a several purposes: 1) it is used as an argument to */
+/* NtContinue, 2) it is used to constuct a call frame for APC delivery, */
+/* 3) it is used to construct a call frame for exception dispatching */
+/* in user mode, and 4) it is used in the user level thread creation */
+/* routines. */
+
+/* The layout of the record conforms to a standard call frame. */
+
+
+typedef struct _CONTEXT {
+
+ /* This section is always present and is used as an argument build */
+ /* area. */
+
+ DWORD Argument[4];
+
+ /* This section is specified/returned if the ContextFlags word contains */
+ /* the flag CONTEXT_FLOATING_POINT. */
+
+ DWORD FltF0;
+ DWORD FltF1;
+ DWORD FltF2;
+ DWORD FltF3;
+ DWORD FltF4;
+ DWORD FltF5;
+ DWORD FltF6;
+ DWORD FltF7;
+ DWORD FltF8;
+ DWORD FltF9;
+ DWORD FltF10;
+ DWORD FltF11;
+ DWORD FltF12;
+ DWORD FltF13;
+ DWORD FltF14;
+ DWORD FltF15;
+ DWORD FltF16;
+ DWORD FltF17;
+ DWORD FltF18;
+ DWORD FltF19;
+ DWORD FltF20;
+ DWORD FltF21;
+ DWORD FltF22;
+ DWORD FltF23;
+ DWORD FltF24;
+ DWORD FltF25;
+ DWORD FltF26;
+ DWORD FltF27;
+ DWORD FltF28;
+ DWORD FltF29;
+ DWORD FltF30;
+ DWORD FltF31;
+
+ /* This section is specified/returned if the ContextFlags word contains */
+ /* the flag CONTEXT_INTEGER. */
+
+ /* N.B. The registers gp, sp, and ra are defined in this section, but are */
+ /* considered part of the control context rather than part of the integer */
+ /* context. */
+
+ /* N.B. Register zero is not stored in the frame. */
+
+ DWORD IntZero;
+ DWORD IntAt;
+ DWORD IntV0;
+ DWORD IntV1;
+ DWORD IntA0;
+ DWORD IntA1;
+ DWORD IntA2;
+ DWORD IntA3;
+ DWORD IntT0;
+ DWORD IntT1;
+ DWORD IntT2;
+ DWORD IntT3;
+ DWORD IntT4;
+ DWORD IntT5;
+ DWORD IntT6;
+ DWORD IntT7;
+ DWORD IntS0;
+ DWORD IntS1;
+ DWORD IntS2;
+ DWORD IntS3;
+ DWORD IntS4;
+ DWORD IntS5;
+ DWORD IntS6;
+ DWORD IntS7;
+ DWORD IntT8;
+ DWORD IntT9;
+ DWORD IntK0;
+ DWORD IntK1;
+ DWORD IntGp;
+ DWORD IntSp;
+ DWORD IntS8;
+ DWORD IntRa;
+ DWORD IntLo;
+ DWORD IntHi;
+
+ /* This section is specified/returned if the ContextFlags word contains */
+ /* the flag CONTEXT_FLOATING_POINT. */
+
+ DWORD Fsr;
+
+ /* This section is specified/returned if the ContextFlags word contains */
+ /* the flag CONTEXT_CONTROL. */
+
+ /* N.B. The registers gp, sp, and ra are defined in the integer section, */
+ /* but are considered part of the control context rather than part of */
+ /* the integer context. */
+
+ DWORD Fir;
+ DWORD Psr;
+
+ /* The flags values within this flag control the contents of */
+ /* a CONTEXT record. */
+
+ /* If the context record is used as an input parameter, then */
+ /* for each portion of the context record controlled by a flag */
+ /* whose value is set, it is assumed that that portion of the */
+ /* context record contains valid context. If the context record */
+ /* is being used to modify a thread's context, then only that */
+ /* portion of the threads context will be modified. */
+
+ /* If the context record is used as an IN OUT parameter to capture */
+ /* the context of a thread, then only those portions of the thread's */
+ /* context corresponding to set flags will be returned. */
+
+ /* The context record is never used as an OUT only parameter. */
+
+ DWORD ContextFlags;
+
+ DWORD Fill[2];
+
+} CONTEXT,*PCONTEXT,*LPCONTEXT;
+#elif defined(ARM)
+//
+// The following flags control the contents of the CONTEXT structure.
+//
+
+#define CONTEXT_ARM 0x0000040
+#define CONTEXT_CONTROL (CONTEXT_ARM | 0x00000001L)
+#define CONTEXT_INTEGER (CONTEXT_ARM | 0x00000002L)
+
+#define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER)
+
+typedef struct _CONTEXT {
+ /* The flags values within this flag control the contents of
+ a CONTEXT record.
+
+ If the context record is used as an input parameter, then
+ for each portion of the context record controlled by a flag
+ whose value is set, it is assumed that that portion of the
+ context record contains valid context. If the context record
+ is being used to modify a thread's context, then only that
+ portion of the threads context will be modified.
+
+ If the context record is used as an IN OUT parameter to capture
+ the context of a thread, then only those portions of the thread's
+ context corresponding to set flags will be returned.
+
+ The context record is never used as an OUT only parameter. */
+
+ ULONG ContextFlags;
+
+ /* This section is specified/returned if the ContextFlags word contains
+ the flag CONTEXT_INTEGER. */
+ ULONG R0;
+ ULONG R1;
+ ULONG R2;
+ ULONG R3;
+ ULONG R4;
+ ULONG R5;
+ ULONG R6;
+ ULONG R7;
+ ULONG R8;
+ ULONG R9;
+ ULONG R10;
+ ULONG R11;
+ ULONG R12;
+
+ ULONG Sp;
+ ULONG Lr;
+ ULONG Pc;
+ ULONG Psr;
+} CONTEXT, *PCONTEXT;
+
+#else
+#error "undefined processor type"
+#endif
+typedef CONTEXT *PCONTEXT,*LPCONTEXT;
+typedef struct _EXCEPTION_RECORD {
+ DWORD ExceptionCode;
+ DWORD ExceptionFlags;
+ struct _EXCEPTION_RECORD *ExceptionRecord;
+ PVOID ExceptionAddress;
+ DWORD NumberParameters;
+ DWORD ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
+} EXCEPTION_RECORD,*PEXCEPTION_RECORD;
+typedef struct _EXCEPTION_POINTERS {
+ PEXCEPTION_RECORD ExceptionRecord;
+ PCONTEXT ContextRecord;
+} EXCEPTION_POINTERS,*PEXCEPTION_POINTERS,*LPEXCEPTION_POINTERS;
+typedef union _LARGE_INTEGER {
+ struct {
+ DWORD LowPart;
+ LONG HighPart;
+ }_STRUCT_NAME(u);
+ LONGLONG QuadPart;
+} LARGE_INTEGER;
+typedef LARGE_INTEGER *PLARGE_INTEGER;
+typedef union _ULARGE_INTEGER {
+ struct {
+ DWORD LowPart;
+ DWORD HighPart;
+ }_STRUCT_NAME(u);
+ DWORDLONG QuadPart;
+} ULARGE_INTEGER;
+typedef ULARGE_INTEGER *PULARGE_INTEGER;
+typedef LARGE_INTEGER LUID,*PLUID;
+#pragma pack(push,4)
+typedef struct _LUID_AND_ATTRIBUTES {
+ LUID Luid;
+ DWORD Attributes;
+} LUID_AND_ATTRIBUTES;
+#pragma pack(pop)
+typedef LUID_AND_ATTRIBUTES LUID_AND_ATTRIBUTES_ARRAY[ANYSIZE_ARRAY];
+typedef LUID_AND_ATTRIBUTES_ARRAY *PLUID_AND_ATTRIBUTES_ARRAY;
+typedef struct _PRIVILEGE_SET {
+ DWORD PrivilegeCount;
+ DWORD Control;
+ LUID_AND_ATTRIBUTES Privilege[ANYSIZE_ARRAY];
+} PRIVILEGE_SET,*PPRIVILEGE_SET;
+typedef struct _SECURITY_ATTRIBUTES {
+ DWORD nLength;
+ LPVOID lpSecurityDescriptor;
+ BOOL bInheritHandle;
+} SECURITY_ATTRIBUTES,*PSECURITY_ATTRIBUTES,*LPSECURITY_ATTRIBUTES;
+typedef enum _SECURITY_IMPERSONATION_LEVEL {
+ SecurityAnonymous,
+ SecurityIdentification,
+ SecurityImpersonation,
+ SecurityDelegation
+} SECURITY_IMPERSONATION_LEVEL;
+typedef BOOLEAN SECURITY_CONTEXT_TRACKING_MODE,*PSECURITY_CONTEXT_TRACKING_MODE;
+typedef struct _SECURITY_QUALITY_OF_SERVICE {
+ DWORD Length;
+ SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
+ SECURITY_CONTEXT_TRACKING_MODE ContextTrackingMode;
+ BOOLEAN EffectiveOnly;
+} SECURITY_QUALITY_OF_SERVICE,*PSECURITY_QUALITY_OF_SERVICE;
+typedef PVOID PACCESS_TOKEN;
+typedef struct _SE_IMPERSONATION_STATE {
+ PACCESS_TOKEN Token;
+ BOOLEAN CopyOnOpen;
+ BOOLEAN EffectiveOnly;
+ SECURITY_IMPERSONATION_LEVEL Level;
+} SE_IMPERSONATION_STATE,*PSE_IMPERSONATION_STATE;
+
+typedef struct _SID_IDENTIFIER_AUTHORITY {
+ BYTE Value[6];
+} SID_IDENTIFIER_AUTHORITY,*PSID_IDENTIFIER_AUTHORITY,*LPSID_IDENTIFIER_AUTHORITY;
+
+typedef PVOID PSID;
+typedef struct _SID {
+ BYTE Revision;
+ BYTE SubAuthorityCount;
+ SID_IDENTIFIER_AUTHORITY IdentifierAuthority;
+ DWORD SubAuthority[ANYSIZE_ARRAY];
+} SID, *PISID;
+
+typedef struct _SID_AND_ATTRIBUTES {
+ PSID Sid;
+ DWORD Attributes;
+} SID_AND_ATTRIBUTES;
+typedef SID_AND_ATTRIBUTES SID_AND_ATTRIBUTES_ARRAY[ANYSIZE_ARRAY];
+typedef SID_AND_ATTRIBUTES_ARRAY *PSID_AND_ATTRIBUTES_ARRAY;
+typedef struct _TOKEN_SOURCE {
+ CHAR SourceName[8];
+ LUID SourceIdentifier;
+} TOKEN_SOURCE;
+typedef struct _TOKEN_CONTROL {
+ LUID TokenId;
+ LUID AuthenticationId;
+ LUID ModifiedId;
+ TOKEN_SOURCE TokenSource;
+} TOKEN_CONTROL;
+typedef struct _TOKEN_DEFAULT_DACL {
+ PACL DefaultDacl;
+} TOKEN_DEFAULT_DACL;
+typedef struct _TOKEN_GROUPS {
+ DWORD GroupCount;
+ SID_AND_ATTRIBUTES Groups[ANYSIZE_ARRAY];
+} TOKEN_GROUPS,*PTOKEN_GROUPS,*LPTOKEN_GROUPS;
+typedef struct _TOKEN_OWNER {
+ PSID Owner;
+} TOKEN_OWNER;
+typedef struct _TOKEN_PRIMARY_GROUP {
+ PSID PrimaryGroup;
+} TOKEN_PRIMARY_GROUP;
+typedef struct _TOKEN_PRIVILEGES {
+ DWORD PrivilegeCount;
+ LUID_AND_ATTRIBUTES Privileges[ANYSIZE_ARRAY];
+} TOKEN_PRIVILEGES,*PTOKEN_PRIVILEGES,*LPTOKEN_PRIVILEGES;
+typedef enum tagTOKEN_TYPE { TokenPrimary=1,TokenImpersonation }TOKEN_TYPE;
+typedef struct _TOKEN_STATISTICS {
+ LUID TokenId;
+ LUID AuthenticationId;
+ LARGE_INTEGER ExpirationTime;
+ TOKEN_TYPE TokenType;
+ SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
+ DWORD DynamicCharged;
+ DWORD DynamicAvailable;
+ DWORD GroupCount;
+ DWORD PrivilegeCount;
+ LUID ModifiedId;
+} TOKEN_STATISTICS;
+typedef struct _TOKEN_USER {
+ SID_AND_ATTRIBUTES User;
+} TOKEN_USER;
+typedef DWORD SECURITY_INFORMATION,*PSECURITY_INFORMATION;
+typedef WORD SECURITY_DESCRIPTOR_CONTROL,*PSECURITY_DESCRIPTOR_CONTROL;
+typedef struct _SECURITY_DESCRIPTOR {
+ BYTE Revision;
+ BYTE Sbz1;
+ SECURITY_DESCRIPTOR_CONTROL Control;
+ PSID Owner;
+ PSID Group;
+ PACL Sacl;
+ PACL Dacl;
+} SECURITY_DESCRIPTOR, *PSECURITY_DESCRIPTOR, *PISECURITY_DESCRIPTOR;
+typedef enum _TOKEN_INFORMATION_CLASS {
+ TokenUser=1,TokenGroups,TokenPrivileges,TokenOwner,
+ TokenPrimaryGroup,TokenDefaultDacl,TokenSource,TokenType,
+ TokenImpersonationLevel,TokenStatistics
+} TOKEN_INFORMATION_CLASS;
+typedef enum _SID_NAME_USE {
+ SidTypeUser=1,SidTypeGroup,SidTypeDomain,SidTypeAlias,SidTypeWellKnownGroup,
+ SidTypeDeletedAccount,SidTypeInvalid,SidTypeUnknown
+} SID_NAME_USE,*PSID_NAME_USE;
+typedef struct _FILE_NOTIFY_INFORMATION {
+ DWORD NextEntryOffset;
+ DWORD Action;
+ DWORD FileNameLength;
+ WCHAR FileName[1];
+} FILE_NOTIFY_INFORMATION,*PFILE_NOTIFY_INFORMATION;
+typedef struct _TAPE_ERASE {
+ DWORD Type;
+ BOOLEAN Immediate;
+} TAPE_ERASE,*PTAPE_ERASE;
+typedef struct _TAPE_GET_DRIVE_PARAMETERS {
+ BOOLEAN ECC;
+ BOOLEAN Compression;
+ BOOLEAN DataPadding;
+ BOOLEAN ReportSetmarks;
+ DWORD DefaultBlockSize;
+ DWORD MaximumBlockSize;
+ DWORD MinimumBlockSize;
+ DWORD MaximumPartitionCount;
+ DWORD FeaturesLow;
+ DWORD FeaturesHigh;
+ DWORD EOTWarningZoneSize;
+} TAPE_GET_DRIVE_PARAMETERS,*PTAPE_GET_DRIVE_PARAMETERS;
+typedef struct _TAPE_GET_MEDIA_PARAMETERS {
+ LARGE_INTEGER Capacity;
+ LARGE_INTEGER Remaining;
+ DWORD BlockSize;
+ DWORD PartitionCount;
+ BOOLEAN WriteProtected;
+} TAPE_GET_MEDIA_PARAMETERS,*PTAPE_GET_MEDIA_PARAMETERS;
+typedef struct _TAPE_GET_POSITION {
+ ULONG Type;
+ ULONG Partition;
+ ULONG OffsetLow;
+ ULONG OffsetHigh;
+} TAPE_GET_POSITION,*PTAPE_GET_POSITION;
+typedef struct _TAPE_PREPARE {
+ DWORD Operation;
+ BOOLEAN Immediate;
+} TAPE_PREPARE,*PTAPE_PREPARE;
+typedef struct _TAPE_SET_DRIVE_PARAMETERS {
+ BOOLEAN ECC;
+ BOOLEAN Compression;
+ BOOLEAN DataPadding;
+ BOOLEAN ReportSetmarks;
+ ULONG EOTWarningZoneSize;
+} TAPE_SET_DRIVE_PARAMETERS,*PTAPE_SET_DRIVE_PARAMETERS;
+typedef struct _TAPE_SET_MEDIA_PARAMETERS {
+ ULONG BlockSize;
+} TAPE_SET_MEDIA_PARAMETERS,*PTAPE_SET_MEDIA_PARAMETERS;
+typedef struct _TAPE_SET_POSITION {
+ DWORD Method;
+ DWORD Partition;
+ LARGE_INTEGER Offset;
+ BOOLEAN Immediate;
+} TAPE_SET_POSITION,*PTAPE_SET_POSITION;
+typedef struct _TAPE_WRITE_MARKS {
+ DWORD Type;
+ DWORD Count;
+ BOOLEAN Immediate;
+} TAPE_WRITE_MARKS,*PTAPE_WRITE_MARKS;
+typedef struct _TAPE_CREATE_PARTITION {
+ DWORD Method;
+ DWORD Count;
+ DWORD Size;
+} TAPE_CREATE_PARTITION,*PTAPE_CREATE_PARTITION;
+typedef struct _MEMORY_BASIC_INFORMATION {
+ PVOID BaseAddress;
+ PVOID AllocationBase;
+ DWORD AllocationProtect;
+ DWORD RegionSize;
+ DWORD State;
+ DWORD Protect;
+ DWORD Type;
+} MEMORY_BASIC_INFORMATION,*PMEMORY_BASIC_INFORMATION;
+typedef struct _MESSAGE_RESOURCE_ENTRY {
+ WORD Length;
+ WORD Flags;
+ BYTE Text[1];
+} MESSAGE_RESOURCE_ENTRY,*PMESSAGE_RESOURCE_ENTRY;
+typedef struct _MESSAGE_RESOURCE_BLOCK {
+ DWORD LowId;
+ DWORD HighId;
+ DWORD OffsetToEntries;
+} MESSAGE_RESOURCE_BLOCK,*PMESSAGE_RESOURCE_BLOCK;
+typedef struct _MESSAGE_RESOURCE_DATA {
+ DWORD NumberOfBlocks;
+ MESSAGE_RESOURCE_BLOCK Blocks[1];
+} MESSAGE_RESOURCE_DATA,*PMESSAGE_RESOURCE_DATA;
+typedef struct _LIST_ENTRY {
+ struct _LIST_ENTRY *Flink;
+ struct _LIST_ENTRY *Blink;
+} LIST_ENTRY,*PLIST_ENTRY;
+typedef struct _RTL_CRITICAL_SECTION_DEBUG {
+ WORD Type;
+ WORD CreatorBackTraceIndex;
+ struct _RTL_CRITICAL_SECTION *CriticalSection;
+ LIST_ENTRY ProcessLocksList;
+ DWORD EntryCount;
+ DWORD ContentionCount;
+ DWORD Spare[2];
+} RTL_CRITICAL_SECTION_DEBUG,*PRTL_CRITICAL_SECTION_DEBUG;
+typedef struct _RTL_CRITICAL_SECTION {
+ PRTL_CRITICAL_SECTION_DEBUG DebugInfo;
+ LONG LockCount;
+ LONG RecursionCount;
+ HANDLE OwningThread;
+ HANDLE LockSemaphore;
+ DWORD Reserved;
+} RTL_CRITICAL_SECTION,*PRTL_CRITICAL_SECTION;
+typedef struct _EVENTLOGRECORD {
+ DWORD Length;
+ DWORD Reserved;
+ DWORD RecordNumber;
+ DWORD TimeGenerated;
+ DWORD TimeWritten;
+ DWORD EventID;
+ WORD EventType;
+ WORD NumStrings;
+ WORD EventCategory;
+ WORD ReservedFlags;
+ DWORD ClosingRecordNumber;
+ DWORD StringOffset;
+ DWORD UserSidLength;
+ DWORD UserSidOffset;
+ DWORD DataLength;
+ DWORD DataOffset;
+} EVENTLOGRECORD,*PEVENTLOGRECORD;
+#pragma pack(push,2)
+typedef struct _IMAGE_VXD_HEADER {
+ WORD e32_magic;
+ BYTE e32_border;
+ BYTE e32_worder;
+ DWORD e32_level;
+ WORD e32_cpu;
+ WORD e32_os;
+ DWORD e32_ver;
+ DWORD e32_mflags;
+ DWORD e32_mpages;
+ DWORD e32_startobj;
+ DWORD e32_eip;
+ DWORD e32_stackobj;
+ DWORD e32_esp;
+ DWORD e32_pagesize;
+ DWORD e32_lastpagesize;
+ DWORD e32_fixupsize;
+ DWORD e32_fixupsum;
+ DWORD e32_ldrsize;
+ DWORD e32_ldrsum;
+ DWORD e32_objtab;
+ DWORD e32_objcnt;
+ DWORD e32_objmap;
+ DWORD e32_itermap;
+ DWORD e32_rsrctab;
+ DWORD e32_rsrccnt;
+ DWORD e32_restab;
+ DWORD e32_enttab;
+ DWORD e32_dirtab;
+ DWORD e32_dircnt;
+ DWORD e32_fpagetab;
+ DWORD e32_frectab;
+ DWORD e32_impmod;
+ DWORD e32_impmodcnt;
+ DWORD e32_impproc;
+ DWORD e32_pagesum;
+ DWORD e32_datapage;
+ DWORD e32_preload;
+ DWORD e32_nrestab;
+ DWORD e32_cbnrestab;
+ DWORD e32_nressum;
+ DWORD e32_autodata;
+ DWORD e32_debuginfo;
+ DWORD e32_debuglen;
+ DWORD e32_instpreload;
+ DWORD e32_instdemand;
+ DWORD e32_heapsize;
+ BYTE e32_res3[12];
+ DWORD e32_winresoff;
+ DWORD e32_winreslen;
+ WORD e32_devid;
+ WORD e32_ddkver;
+} IMAGE_VXD_HEADER,*PIMAGE_VXD_HEADER;
+#pragma pack(pop)
+#pragma pack(push,4)
+typedef struct _IMAGE_FILE_HEADER {
+ WORD Machine;
+ WORD NumberOfSections;
+ DWORD TimeDateStamp;
+ DWORD PointerToSymbolTable;
+ DWORD NumberOfSymbols;
+ WORD SizeOfOptionalHeader;
+ WORD Characteristics;
+} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;
+typedef struct _IMAGE_DATA_DIRECTORY {
+ DWORD VirtualAddress;
+ DWORD Size;
+} IMAGE_DATA_DIRECTORY,*PIMAGE_DATA_DIRECTORY;
+typedef struct _IMAGE_OPTIONAL_HEADER {
+ WORD Magic;
+ BYTE MajorLinkerVersion;
+ BYTE MinorLinkerVersion;
+ DWORD SizeOfCode;
+ DWORD SizeOfInitializedData;
+ DWORD SizeOfUninitializedData;
+ DWORD AddressOfEntryPoint;
+ DWORD BaseOfCode;
+ DWORD BaseOfData;
+ DWORD ImageBase;
+ DWORD SectionAlignment;
+ DWORD FileAlignment;
+ WORD MajorOperatingSystemVersion;
+ WORD MinorOperatingSystemVersion;
+ WORD MajorImageVersion;
+ WORD MinorImageVersion;
+ WORD MajorSubsystemVersion;
+ WORD MinorSubsystemVersion;
+ DWORD Reserved1;
+ DWORD SizeOfImage;
+ DWORD SizeOfHeaders;
+ DWORD CheckSum;
+ WORD Subsystem;
+ WORD DllCharacteristics;
+ DWORD SizeOfStackReserve;
+ DWORD SizeOfStackCommit;
+ DWORD SizeOfHeapReserve;
+ DWORD SizeOfHeapCommit;
+ DWORD LoaderFlags;
+ DWORD NumberOfRvaAndSizes;
+ IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
+} IMAGE_OPTIONAL_HEADER,*PIMAGE_OPTIONAL_HEADER;
+typedef struct _IMAGE_ROM_OPTIONAL_HEADER {
+ WORD Magic;
+ BYTE MajorLinkerVersion;
+ BYTE MinorLinkerVersion;
+ DWORD SizeOfCode;
+ DWORD SizeOfInitializedData;
+ DWORD SizeOfUninitializedData;
+ DWORD AddressOfEntryPoint;
+ DWORD BaseOfCode;
+ DWORD BaseOfData;
+ DWORD BaseOfBss;
+ DWORD GprMask;
+ DWORD CprMask[4];
+ DWORD GpValue;
+} IMAGE_ROM_OPTIONAL_HEADER,*PIMAGE_ROM_OPTIONAL_HEADER;
+#pragma pack(pop)
+#pragma pack(push,2)
+typedef struct _IMAGE_DOS_HEADER {
+ WORD e_magic;
+ WORD e_cblp;
+ WORD e_cp;
+ WORD e_crlc;
+ WORD e_cparhdr;
+ WORD e_minalloc;
+ WORD e_maxalloc;
+ WORD e_ss;
+ WORD e_sp;
+ WORD e_csum;
+ WORD e_ip;
+ WORD e_cs;
+ WORD e_lfarlc;
+ WORD e_ovno;
+ WORD e_res[4];
+ WORD e_oemid;
+ WORD e_oeminfo;
+ WORD e_res2[10];
+ LONG e_lfanew;
+} IMAGE_DOS_HEADER,*PIMAGE_DOS_HEADER;
+typedef struct _IMAGE_OS2_HEADER {
+ WORD ne_magic;
+ CHAR ne_ver;
+ CHAR ne_rev;
+ WORD ne_enttab;
+ WORD ne_cbenttab;
+ LONG ne_crc;
+ WORD ne_flags;
+ WORD ne_autodata;
+ WORD ne_heap;
+ WORD ne_stack;
+ LONG ne_csip;
+ LONG ne_sssp;
+ WORD ne_cseg;
+ WORD ne_cmod;
+ WORD ne_cbnrestab;
+ WORD ne_segtab;
+ WORD ne_rsrctab;
+ WORD ne_restab;
+ WORD ne_modtab;
+ WORD ne_imptab;
+ LONG ne_nrestab;
+ WORD ne_cmovent;
+ WORD ne_align;
+ WORD ne_cres;
+ BYTE ne_exetyp;
+ BYTE ne_flagsothers;
+ WORD ne_pretthunks;
+ WORD ne_psegrefbytes;
+ WORD ne_swaparea;
+ WORD ne_expver;
+} IMAGE_OS2_HEADER,*PIMAGE_OS2_HEADER;
+#pragma pack(pop)
+#pragma pack(push,4)
+typedef struct _IMAGE_NT_HEADERS {
+ DWORD Signature;
+ IMAGE_FILE_HEADER FileHeader;
+ IMAGE_OPTIONAL_HEADER OptionalHeader;
+} IMAGE_NT_HEADERS,*PIMAGE_NT_HEADERS;
+typedef struct _IMAGE_ROM_HEADERS {
+ IMAGE_FILE_HEADER FileHeader;
+ IMAGE_ROM_OPTIONAL_HEADER OptionalHeader;
+} IMAGE_ROM_HEADERS,*PIMAGE_ROM_HEADERS;
+typedef struct _IMAGE_SECTION_HEADER {
+ BYTE Name[IMAGE_SIZEOF_SHORT_NAME];
+ union {
+ DWORD PhysicalAddress;
+ DWORD VirtualSize;
+ } Misc;
+ DWORD VirtualAddress;
+ DWORD SizeOfRawData;
+ DWORD PointerToRawData;
+ DWORD PointerToRelocations;
+ DWORD PointerToLinenumbers;
+ WORD NumberOfRelocations;
+ WORD NumberOfLinenumbers;
+ DWORD Characteristics;
+} IMAGE_SECTION_HEADER,*PIMAGE_SECTION_HEADER;
+#pragma pack(pop)
+#pragma pack(push,2)
+typedef struct _IMAGE_SYMBOL {
+ union {
+ BYTE ShortName[8];
+ struct {
+ DWORD Short;
+ DWORD Long;
+ } Name;
+ PBYTE LongName[2];
+ } N;
+ DWORD Value;
+ SHORT SectionNumber;
+ WORD Type;
+ BYTE StorageClass;
+ BYTE NumberOfAuxSymbols;
+} IMAGE_SYMBOL,*PIMAGE_SYMBOL;
+typedef union _IMAGE_AUX_SYMBOL {
+ struct {
+ DWORD TagIndex;
+ union {
+ struct {
+ WORD Linenumber;
+ WORD Size;
+ } LnSz;
+ DWORD TotalSize;
+ } Misc;
+ union {
+ struct {
+ DWORD PointerToLinenumber;
+ DWORD PointerToNextFunction;
+ } Function;
+ struct {
+ WORD Dimension[4];
+ } Array;
+ } FcnAry;
+ WORD TvIndex;
+ } Sym;
+ struct {
+ BYTE Name[IMAGE_SIZEOF_SYMBOL];
+ } File;
+ struct {
+ DWORD Length;
+ WORD NumberOfRelocations;
+ WORD NumberOfLinenumbers;
+ DWORD CheckSum;
+ SHORT Number;
+ BYTE Selection;
+ } Section;
+} IMAGE_AUX_SYMBOL,*PIMAGE_AUX_SYMBOL;
+typedef struct _IMAGE_COFF_SYMBOLS_HEADER {
+ DWORD NumberOfSymbols;
+ DWORD LvaToFirstSymbol;
+ DWORD NumberOfLinenumbers;
+ DWORD LvaToFirstLinenumber;
+ DWORD RvaToFirstByteOfCode;
+ DWORD RvaToLastByteOfCode;
+ DWORD RvaToFirstByteOfData;
+ DWORD RvaToLastByteOfData;
+} IMAGE_COFF_SYMBOLS_HEADER,*PIMAGE_COFF_SYMBOLS_HEADER;
+typedef struct _IMAGE_RELOCATION {
+ union {
+ DWORD VirtualAddress;
+ DWORD RelocCount;
+ } DUMMYUNIONNAME;
+ DWORD SymbolTableIndex;
+ WORD Type;
+} IMAGE_RELOCATION,*PIMAGE_RELOCATION;
+#pragma pack(pop)
+#pragma pack(push,4)
+typedef struct _IMAGE_BASE_RELOCATION {
+ DWORD VirtualAddress;
+ DWORD SizeOfBlock;
+} IMAGE_BASE_RELOCATION,*PIMAGE_BASE_RELOCATION;
+#pragma pack(pop)
+#pragma pack(push,2)
+typedef struct _IMAGE_LINENUMBER {
+ union {
+ DWORD SymbolTableIndex;
+ DWORD VirtualAddress;
+ } Type;
+ WORD Linenumber;
+} IMAGE_LINENUMBER,*PIMAGE_LINENUMBER;
+#pragma pack(pop)
+#pragma pack(push,4)
+typedef struct _IMAGE_ARCHIVE_MEMBER_HEADER {
+ BYTE Name[16];
+ BYTE Date[12];
+ BYTE UserID[6];
+ BYTE GroupID[6];
+ BYTE Mode[8];
+ BYTE Size[10];
+ BYTE EndHeader[2];
+} IMAGE_ARCHIVE_MEMBER_HEADER,*PIMAGE_ARCHIVE_MEMBER_HEADER;
+typedef struct _IMAGE_EXPORT_DIRECTORY {
+ DWORD Characteristics;
+ DWORD TimeDateStamp;
+ WORD MajorVersion;
+ WORD MinorVersion;
+ DWORD Name;
+ DWORD Base;
+ DWORD NumberOfFunctions;
+ DWORD NumberOfNames;
+ PDWORD *AddressOfFunctions;
+ PDWORD *AddressOfNames;
+ PWORD *AddressOfNameOrdinals;
+} IMAGE_EXPORT_DIRECTORY,*PIMAGE_EXPORT_DIRECTORY;
+typedef struct _IMAGE_IMPORT_BY_NAME {
+ WORD Hint;
+ BYTE Name[1];
+} IMAGE_IMPORT_BY_NAME,*PIMAGE_IMPORT_BY_NAME;
+typedef struct _IMAGE_THUNK_DATA {
+ union {
+ PBYTE ForwarderString;
+ PDWORD Function;
+ DWORD Ordinal;
+ PIMAGE_IMPORT_BY_NAME AddressOfData;
+ } u1;
+} IMAGE_THUNK_DATA,*PIMAGE_THUNK_DATA;
+typedef struct _IMAGE_IMPORT_DESCRIPTOR {
+ union {
+ DWORD Characteristics;
+ PIMAGE_THUNK_DATA OriginalFirstThunk;
+ } DUMMYUNIONNAME;
+ DWORD TimeDateStamp;
+ DWORD ForwarderChain;
+ DWORD Name;
+ PIMAGE_THUNK_DATA FirstThunk;
+} IMAGE_IMPORT_DESCRIPTOR,*PIMAGE_IMPORT_DESCRIPTOR;
+typedef struct _IMAGE_BOUND_IMPORT_DESCRIPTOR {
+ DWORD TimeDateStamp;
+ WORD OffsetModuleName;
+ WORD NumberOfModuleForwarderRefs;
+} IMAGE_BOUND_IMPORT_DESCRIPTOR,*PIMAGE_BOUND_IMPORT_DESCRIPTOR;
+typedef struct _IMAGE_BOUND_FORWARDER_REF {
+ DWORD TimeDateStamp;
+ WORD OffsetModuleName;
+ WORD Reserved;
+} IMAGE_BOUND_FORWARDER_REF,*PIMAGE_BOUND_FORWARDER_REF;
+typedef void(NTAPI *PIMAGE_TLS_CALLBACK)(PVOID,DWORD,PVOID);
+typedef struct _IMAGE_TLS_DIRECTORY {
+ DWORD StartAddressOfRawData;
+ DWORD EndAddressOfRawData;
+ PDWORD AddressOfIndex;
+ PIMAGE_TLS_CALLBACK *AddressOfCallBacks;
+ DWORD SizeOfZeroFill;
+ DWORD Characteristics;
+} IMAGE_TLS_DIRECTORY,*PIMAGE_TLS_DIRECTORY;
+typedef struct _IMAGE_RESOURCE_DIRECTORY {
+ DWORD Characteristics;
+ DWORD TimeDateStamp;
+ WORD MajorVersion;
+ WORD MinorVersion;
+ WORD NumberOfNamedEntries;
+ WORD NumberOfIdEntries;
+} IMAGE_RESOURCE_DIRECTORY,*PIMAGE_RESOURCE_DIRECTORY;
+typedef struct _IMAGE_RESOURCE_DIRECTORY_ENTRY {
+ union {
+ struct {
+ DWORD NameOffset:31;
+ DWORD NameIsString:1;
+ }DUMMYSTRUCTNAME;
+ DWORD Name;
+ WORD Id;
+ } DUMMYUNIONNAME;
+ union {
+ DWORD OffsetToData;
+ struct {
+ DWORD OffsetToDirectory:31;
+ DWORD DataIsDirectory:1;
+ } DUMMYSTRUCTNAME2;
+ } DUMMYUNIONNAME2;
+} IMAGE_RESOURCE_DIRECTORY_ENTRY,*PIMAGE_RESOURCE_DIRECTORY_ENTRY;
+typedef struct _IMAGE_RESOURCE_DIRECTORY_STRING {
+ WORD Length;
+ CHAR NameString[1];
+} IMAGE_RESOURCE_DIRECTORY_STRING,*PIMAGE_RESOURCE_DIRECTORY_STRING;
+typedef struct _IMAGE_RESOURCE_DIR_STRING_U {
+ WORD Length;
+ WCHAR NameString[1];
+} IMAGE_RESOURCE_DIR_STRING_U,*PIMAGE_RESOURCE_DIR_STRING_U;
+typedef struct _IMAGE_RESOURCE_DATA_ENTRY {
+ DWORD OffsetToData;
+ DWORD Size;
+ DWORD CodePage;
+ DWORD Reserved;
+} IMAGE_RESOURCE_DATA_ENTRY,*PIMAGE_RESOURCE_DATA_ENTRY;
+typedef struct _IMAGE_LOAD_CONFIG_DIRECTORY {
+ DWORD Characteristics;
+ DWORD TimeDateStamp;
+ WORD MajorVersion;
+ WORD MinorVersion;
+ DWORD GlobalFlagsClear;
+ DWORD GlobalFlagsSet;
+ DWORD CriticalSectionDefaultTimeout;
+ DWORD DeCommitFreeBlockThreshold;
+ DWORD DeCommitTotalFreeThreshold;
+ PVOID LockPrefixTable;
+ DWORD MaximumAllocationSize;
+ DWORD VirtualMemoryThreshold;
+ DWORD ProcessHeapFlags;
+ DWORD Reserved[4];
+} IMAGE_LOAD_CONFIG_DIRECTORY,*PIMAGE_LOAD_CONFIG_DIRECTORY;
+typedef struct _IMAGE_RUNTIME_FUNCTION_ENTRY {
+ DWORD BeginAddress;
+ DWORD EndAddress;
+ PVOID ExceptionHandler;
+ PVOID HandlerData;
+ DWORD PrologEndAddress;
+} IMAGE_RUNTIME_FUNCTION_ENTRY,*PIMAGE_RUNTIME_FUNCTION_ENTRY;
+typedef struct _IMAGE_DEBUG_DIRECTORY {
+ DWORD Characteristics;
+ DWORD TimeDateStamp;
+ WORD MajorVersion;
+ WORD MinorVersion;
+ DWORD Type;
+ DWORD SizeOfData;
+ DWORD AddressOfRawData;
+ DWORD PointerToRawData;
+} IMAGE_DEBUG_DIRECTORY,*PIMAGE_DEBUG_DIRECTORY;
+typedef struct _FPO_DATA {
+ DWORD ulOffStart;
+ DWORD cbProcSize;
+ DWORD cdwLocals;
+ WORD cdwParams;
+ WORD cbProlog:8;
+ WORD cbRegs:3;
+ WORD fHasSEH:1;
+ WORD fUseBP:1;
+ WORD reserved:1;
+ WORD cbFrame:2;
+} FPO_DATA,*PFPO_DATA;
+typedef struct _IMAGE_DEBUG_MISC {
+ DWORD DataType;
+ DWORD Length;
+ BOOLEAN Unicode;
+ BYTE Reserved[3];
+ BYTE Data[1];
+} IMAGE_DEBUG_MISC,*PIMAGE_DEBUG_MISC;
+typedef struct _IMAGE_FUNCTION_ENTRY {
+ DWORD StartingAddress;
+ DWORD EndingAddress;
+ DWORD EndOfPrologue;
+} IMAGE_FUNCTION_ENTRY,*PIMAGE_FUNCTION_ENTRY;
+typedef struct _IMAGE_SEPARATE_DEBUG_HEADER {
+ WORD Signature;
+ WORD Flags;
+ WORD Machine;
+ WORD Characteristics;
+ DWORD TimeDateStamp;
+ DWORD CheckSum;
+ DWORD ImageBase;
+ DWORD SizeOfImage;
+ DWORD NumberOfSections;
+ DWORD ExportedNamesSize;
+ DWORD DebugDirectorySize;
+ DWORD Reserved[3];
+} IMAGE_SEPARATE_DEBUG_HEADER,*PIMAGE_SEPARATE_DEBUG_HEADER;
+#pragma pack(pop)
+typedef enum _CM_SERVICE_NODE_TYPE {
+ DriverType=SERVICE_KERNEL_DRIVER,
+ FileSystemType=SERVICE_FILE_SYSTEM_DRIVER,
+ Win32ServiceOwnProcess=SERVICE_WIN32_OWN_PROCESS,
+ Win32ServiceShareProcess=SERVICE_WIN32_SHARE_PROCESS,
+ AdapterType=SERVICE_ADAPTER,
+ RecognizerType=SERVICE_RECOGNIZER_DRIVER
+} SERVICE_NODE_TYPE;
+typedef enum _CM_SERVICE_LOAD_TYPE {
+ BootLoad=SERVICE_BOOT_START,
+ SystemLoad=SERVICE_SYSTEM_START,
+ AutoLoad=SERVICE_AUTO_START,
+ DemandLoad=SERVICE_DEMAND_START,
+ DisableLoad=SERVICE_DISABLED
+} SERVICE_LOAD_TYPE;
+typedef enum _CM_ERROR_CONTROL_TYPE {
+ IgnoreError=SERVICE_ERROR_IGNORE,
+ NormalError=SERVICE_ERROR_NORMAL,
+ SevereError=SERVICE_ERROR_SEVERE,
+ CriticalError=SERVICE_ERROR_CRITICAL
+} SERVICE_ERROR_TYPE;
+
+PVOID GetCurrentFiber(void);
+PVOID GetFiberData(void);
+#endif
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/winsup/w32api/include/winperf.h b/winsup/w32api/include/winperf.h
new file mode 100644
index 000000000..99620e47e
--- /dev/null
+++ b/winsup/w32api/include/winperf.h
@@ -0,0 +1,135 @@
+#ifndef _WINPERF_H
+#define _WINPERF_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+#define PERF_DATA_VERSION 1
+#define PERF_DATA_REVISION 1
+#define PERF_NO_INSTANCES -1
+#define PERF_SIZE_DWORD 0
+#define PERF_SIZE_LARGE 256
+#define PERF_SIZE_ZERO 512
+#define PERF_SIZE_VARIABLE_LEN 768
+#define PERF_TYPE_NUMBER 0
+#define PERF_TYPE_COUNTER 1024
+#define PERF_TYPE_TEXT 2048
+#define PERF_TYPE_ZERO 0xC00
+#define PERF_NUMBER_HEX 0
+#define PERF_NUMBER_DECIMAL 0x10000
+#define PERF_NUMBER_DEC_1000 0x20000
+#define PERF_COUNTER_VALUE 0
+#define PERF_COUNTER_RATE 0x10000
+#define PERF_COUNTER_FRACTION 0x20000
+#define PERF_COUNTER_BASE 0x30000
+#define PERF_COUNTER_ELAPSED 0x40000
+#define PERF_COUNTER_QUEUELEN 0x50000
+#define PERF_COUNTER_HISTOGRAM 0x60000
+#define PERF_TEXT_UNICODE 0
+#define PERF_TEXT_ASCII 0x10000
+#define PERF_TIMER_TICK 0
+#define PERF_TIMER_100NS 0x100000
+#define PERF_OBJECT_TIMER 0x200000
+#define PERF_DELTA_COUNTER 0x400000
+#define PERF_DELTA_BASE 0x800000
+#define PERF_INVERSE_COUNTER 0x1000000
+#define PERF_MULTI_COUNTER 0x2000000
+#define PERF_DISPLAY_NO_SUFFIX 0
+#define PERF_DISPLAY_PER_SEC 0x10000000
+#define PERF_DISPLAY_PERCENT 0x20000000
+#define PERF_DISPLAY_SECONDS 0x30000000
+#define PERF_DISPLAY_NOSHOW 0x40000000
+#define PERF_COUNTER_HISTOGRAM_TYPE 0x80000000
+#define PERF_NO_UNIQUE_ID (-1)
+#define PERF_DETAIL_NOVICE 100
+#define PERF_DETAIL_ADVANCED 200
+#define PERF_DETAIL_EXPERT 300
+#define PERF_DETAIL_WIZARD 400
+#define PERF_COUNTER_COUNTER (PERF_SIZE_DWORD|PERF_TYPE_COUNTER|PERF_COUNTER_RATE|PERF_TIMER_TICK|PERF_DELTA_COUNTER|PERF_DISPLAY_PER_SEC)
+#define PERF_COUNTER_TIMER (PERF_SIZE_LARGE|PERF_TYPE_COUNTER|PERF_COUNTER_RATE|PERF_TIMER_TICK|PERF_DELTA_COUNTER|PERF_DISPLAY_PERCENT)
+#define PERF_COUNTER_QUEUELEN_TYPE (PERF_SIZE_DWORD|PERF_TYPE_COUNTER|PERF_COUNTER_QUEUELEN|PERF_TIMER_TICK|PERF_DELTA_COUNTER|PERF_DISPLAY_NO_SUFFIX)
+#define PERF_COUNTER_BULK_COUNT (PERF_SIZE_LARGE|PERF_TYPE_COUNTER|PERF_COUNTER_RATE|PERF_TIMER_TICK|PERF_DELTA_COUNTER|PERF_DISPLAY_PER_SEC)
+#define PERF_COUNTER_TEXT (PERF_SIZE_VARIABLE_LEN|PERF_TYPE_TEXT|PERF_TEXT_UNICODE|PERF_DISPLAY_NO_SUFFIX)
+#define PERF_COUNTER_RAWCOUNT (PERF_SIZE_DWORD|PERF_TYPE_NUMBER|PERF_NUMBER_DECIMAL|PERF_DISPLAY_NO_SUFFIX)
+#define PERF_COUNTER_LARGE_RAWCOUNT (PERF_SIZE_LARGE|PERF_TYPE_NUMBER|PERF_NUMBER_DECIMAL|PERF_DISPLAY_NO_SUFFIX)
+#define PERF_COUNTER_RAWCOUNT_HEX (PERF_SIZE_DWORD|PERF_TYPE_NUMBER|PERF_NUMBER_HEX|PERF_DISPLAY_NO_SUFFIX)
+#define PERF_COUNTER_LARGE_RAWCOUNT_HEX (PERF_SIZE_LARGE|PERF_TYPE_NUMBER|PERF_NUMBER_HEX|PERF_DISPLAY_NO_SUFFIX)
+#define PERF_SAMPLE_FRACTION (PERF_SIZE_DWORD|PERF_TYPE_COUNTER|PERF_COUNTER_FRACTION|PERF_DELTA_COUNTER|PERF_DELTA_BASE|PERF_DISPLAY_PERCENT)
+#define PERF_SAMPLE_COUNTER (PERF_SIZE_DWORD|PERF_TYPE_COUNTER|PERF_COUNTER_RATE|PERF_TIMER_TICK|PERF_DELTA_COUNTER|PERF_DISPLAY_NO_SUFFIX)
+#define PERF_COUNTER_NODATA (PERF_SIZE_ZERO|PERF_DISPLAY_NOSHOW)
+#define PERF_COUNTER_TIMER_INV (PERF_SIZE_LARGE|PERF_TYPE_COUNTER|PERF_COUNTER_RATE|PERF_TIMER_TICK|PERF_DELTA_COUNTER|PERF_INVERSE_COUNTER|PERF_DISPLAY_PERCENT)
+#define PERF_SAMPLE_BASE (PERF_SIZE_DWORD|PERF_TYPE_COUNTER|PERF_COUNTER_BASE|PERF_DISPLAY_NOSHOW|1)
+#define PERF_AVERAGE_TIMER (PERF_SIZE_DWORD|PERF_TYPE_COUNTER|PERF_COUNTER_FRACTION|PERF_DISPLAY_SECONDS)
+#define PERF_AVERAGE_BASE (PERF_SIZE_DWORD|PERF_TYPE_COUNTER|PERF_COUNTER_BASE|PERF_DISPLAY_NOSHOW|2)
+#define PERF_AVERAGE_BULK (PERF_SIZE_LARGE|PERF_TYPE_COUNTER|PERF_COUNTER_FRACTION|PERF_DISPLAY_NOSHOW)
+#define PERF_100NSEC_TIMER (PERF_SIZE_LARGE|PERF_TYPE_COUNTER|PERF_COUNTER_RATE|PERF_TIMER_100NS|PERF_DELTA_COUNTER|PERF_DISPLAY_PERCENT)
+#define PERF_100NSEC_TIMER_INV (PERF_SIZE_LARGE|PERF_TYPE_COUNTER|PERF_COUNTER_RATE|PERF_TIMER_100NS|PERF_DELTA_COUNTER|PERF_INVERSE_COUNTER|PERF_DISPLAY_PERCENT)
+#define PERF_COUNTER_MULTI_TIMER (PERF_SIZE_LARGE|PERF_TYPE_COUNTER|PERF_COUNTER_RATE|PERF_DELTA_COUNTER|PERF_TIMER_TICK|PERF_MULTI_COUNTER|PERF_DISPLAY_PERCENT)
+#define PERF_COUNTER_MULTI_TIMER_INV (PERF_SIZE_LARGE|PERF_TYPE_COUNTER|PERF_COUNTER_RATE|PERF_DELTA_COUNTER|PERF_MULTI_COUNTER|PERF_TIMER_TICK|PERF_INVERSE_COUNTER|PERF_DISPLAY_PERCENT)
+#define PERF_COUNTER_MULTI_BASE (PERF_SIZE_LARGE|PERF_TYPE_COUNTER|PERF_COUNTER_BASE|PERF_MULTI_COUNTER|PERF_DISPLAY_NOSHOW)
+#define PERF_100NSEC_MULTI_TIMER (PERF_SIZE_LARGE|PERF_TYPE_COUNTER|PERF_DELTA_COUNTER|PERF_COUNTER_RATE|PERF_TIMER_100NS|PERF_MULTI_COUNTER|PERF_DISPLAY_PERCENT)
+#define PERF_100NSEC_MULTI_TIMER_INV (PERF_SIZE_LARGE|PERF_TYPE_COUNTER|PERF_DELTA_COUNTER|PERF_COUNTER_RATE|PERF_TIMER_100NS|PERF_MULTI_COUNTER|PERF_INVERSE_COUNTER|PERF_DISPLAY_PERCENT)
+#define PERF_RAW_FRACTION (PERF_SIZE_DWORD|PERF_TYPE_COUNTER|PERF_COUNTER_FRACTION|PERF_DISPLAY_PERCENT)
+#define PERF_RAW_BASE (PERF_SIZE_DWORD|PERF_TYPE_COUNTER|PERF_COUNTER_BASE|PERF_DISPLAY_NOSHOW|3)
+#define PERF_ELAPSED_TIME (PERF_SIZE_LARGE|PERF_TYPE_COUNTER|PERF_COUNTER_ELAPSED|PERF_OBJECT_TIMER|PERF_DISPLAY_SECONDS)
+typedef struct _PERF_DATA_BLOCK {
+ WCHAR Signature[4];
+ DWORD LittleEndian;
+ DWORD Version;
+ DWORD Revision;
+ DWORD TotalByteLength;
+ DWORD HeaderLength;
+ DWORD NumObjectTypes;
+ LONG DefaultObject;
+ SYSTEMTIME SystemTime;
+ LARGE_INTEGER PerfTime;
+ LARGE_INTEGER PerfFreq;
+ LARGE_INTEGER PerfTime100nSec;
+ DWORD SystemNameLength;
+ DWORD SystemNameOffset;
+} PERF_DATA_BLOCK, *PPERF_DATA_BLOCK;
+typedef struct _PERF_OBJECT_TYPE {
+ DWORD TotalByteLength;
+ DWORD DefinitionLength;
+ DWORD HeaderLength;
+ DWORD ObjectNameTitleIndex;
+ LPWSTR ObjectNameTitle;
+ DWORD ObjectHelpTitleIndex;
+ LPWSTR ObjectHelpTitle;
+ DWORD DetailLevel;
+ DWORD NumCounters;
+ LONG DefaultCounter;
+ LONG NumInstances;
+ DWORD CodePage;
+ LARGE_INTEGER PerfTime;
+ LARGE_INTEGER PerfFreq;
+} PERF_OBJECT_TYPE, *PPERF_OBJECT_TYPE;
+typedef struct _PERF_COUNTER_DEFINITION {
+ DWORD ByteLength;
+ DWORD CounterNameTitleIndex;
+ LPWSTR CounterNameTitle;
+ DWORD CounterHelpTitleIndex;
+ LPWSTR CounterHelpTitle;
+ LONG DefaultScale;
+ DWORD DetailLevel;
+ DWORD CounterType;
+ DWORD CounterSize;
+ DWORD CounterOffset;
+} PERF_COUNTER_DEFINITION,*PPERF_COUNTER_DEFINITION;
+typedef struct _PERF_INSTANCE_DEFINITION {
+ DWORD ByteLength;
+ DWORD ParentObjectTitleIndex;
+ DWORD ParentObjectInstance;
+ LONG UniqueID;
+ DWORD NameOffset;
+ DWORD NameLength;
+} PERF_INSTANCE_DEFINITION,*PPERF_INSTANCE_DEFINITION;
+typedef struct _PERF_COUNTER_BLOCK {
+ DWORD ByteLength;
+} PERF_COUNTER_BLOCK, *PPERF_COUNTER_BLOCK;
+typedef DWORD(CALLBACK PM_OPEN_PROC)(LPWSTR);
+typedef DWORD(CALLBACK PM_COLLECT_PROC)(LPWSTR,PVOID*,PDWORD,PDWORD);
+typedef DWORD(CALLBACK PM_CLOSE_PROC)(void);
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/winsup/w32api/include/winreg.h b/winsup/w32api/include/winreg.h
new file mode 100644
index 000000000..aae020a39
--- /dev/null
+++ b/winsup/w32api/include/winreg.h
@@ -0,0 +1,155 @@
+#ifndef _WINREG_H
+#define _WINREG_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+#define HKEY_CLASSES_ROOT ((HKEY)0x80000000)
+#define HKEY_CURRENT_USER ((HKEY)0x80000001)
+#define HKEY_LOCAL_MACHINE ((HKEY)0x80000002)
+#define HKEY_USERS ((HKEY)0x80000003)
+#define HKEY_PERFORMANCE_DATA ((HKEY)0x80000004)
+#define HKEY_CURRENT_CONFIG ((HKEY)0x80000005)
+#define HKEY_DYN_DATA ((HKEY)0x80000006)
+#define REG_OPTION_VOLATILE 1
+#define REG_OPTION_NON_VOLATILE 0
+#define REG_CREATED_NEW_KEY 1
+#define REG_OPENED_EXISTING_KEY 2
+#define REG_NONE 0
+#define REG_SZ 1
+#define REG_EXPAND_SZ 2
+#define REG_BINARY 3
+#define REG_DWORD 4
+#define REG_DWORD_BIG_ENDIAN 5
+#define REG_DWORD_LITTLE_ENDIAN 4
+#define REG_LINK 6
+#define REG_MULTI_SZ 7
+#define REG_RESOURCE_LIST 8
+#define REG_FULL_RESOURCE_DESCRIPTOR 9
+#define REG_RESOURCE_REQUIREMENTS_LIST 10
+#define REG_NOTIFY_CHANGE_NAME 1
+#define REG_NOTIFY_CHANGE_ATTRIBUTES 2
+#define REG_NOTIFY_CHANGE_LAST_SET 4
+#define REG_NOTIFY_CHANGE_SECURITY 8
+
+#ifndef RC_INVOKED
+typedef ACCESS_MASK REGSAM;
+typedef struct value_entA {
+ LPSTR ve_valuename;
+ DWORD ve_valuelen;
+ DWORD ve_valueptr;
+ DWORD ve_type;
+} VALENTA,*PVALENTA;
+typedef struct value_entW {
+ LPWSTR ve_valuename;
+ DWORD ve_valuelen;
+ DWORD ve_valueptr;
+ DWORD ve_type;
+} VALENTW,*PVALENTW;
+BOOL WINAPI AbortSystemShutdownA(LPCSTR);
+BOOL WINAPI AbortSystemShutdownW(LPCWSTR);
+BOOL WINAPI InitiateSystemShutdownA(LPSTR,LPSTR,DWORD,BOOL,BOOL);
+BOOL WINAPI InitiateSystemShutdownW(LPWSTR,LPWSTR,DWORD,BOOL,BOOL);
+LONG WINAPI RegCloseKey(HKEY);
+LONG WINAPI RegConnectRegistryA(LPSTR,HKEY,PHKEY);
+LONG WINAPI RegConnectRegistryW(LPWSTR,HKEY,PHKEY);
+LONG WINAPI RegCreateKeyA(HKEY,LPCSTR,PHKEY);
+LONG WINAPI RegCreateKeyExA(HKEY,LPCSTR,DWORD,LPSTR,DWORD,REGSAM,LPSECURITY_ATTRIBUTES,PHKEY,PDWORD);
+LONG WINAPI RegCreateKeyExW(HKEY,LPCWSTR,DWORD,LPWSTR,DWORD,REGSAM,LPSECURITY_ATTRIBUTES,PHKEY,PDWORD);
+LONG WINAPI RegCreateKeyW(HKEY,LPCWSTR,PHKEY);
+LONG WINAPI RegDeleteKeyA(HKEY,LPCSTR);
+LONG WINAPI RegDeleteKeyW(HKEY,LPCWSTR);
+LONG WINAPI RegDeleteValueA (HKEY,LPCSTR);
+LONG WINAPI RegDeleteValueW(HKEY,LPCWSTR);
+LONG WINAPI RegEnumKeyA (HKEY,DWORD,LPSTR,DWORD);
+LONG WINAPI RegEnumKeyW(HKEY,DWORD,LPWSTR,DWORD);
+LONG WINAPI RegEnumKeyExA(HKEY,DWORD,LPSTR,PDWORD,PDWORD,LPSTR,PDWORD,PFILETIME);
+LONG WINAPI RegEnumKeyExW(HKEY,DWORD,LPWSTR,PDWORD,PDWORD,LPWSTR,PDWORD,PFILETIME);
+LONG WINAPI RegEnumValueA(HKEY,DWORD,LPSTR,PDWORD,PDWORD,PDWORD,LPBYTE,PDWORD);
+LONG WINAPI RegEnumValueW(HKEY,DWORD,LPWSTR,PDWORD,PDWORD,PDWORD,LPBYTE,PDWORD);
+LONG WINAPI RegFlushKey(HKEY);
+LONG WINAPI RegGetKeySecurity(HKEY,SECURITY_INFORMATION,PSECURITY_DESCRIPTOR,PDWORD);
+LONG WINAPI RegLoadKeyA(HKEY,LPCSTR,LPCSTR);
+LONG WINAPI RegLoadKeyW(HKEY,LPCWSTR,LPCWSTR);
+LONG WINAPI RegNotifyChangeKeyValue(HKEY,BOOL,DWORD,HANDLE,BOOL);
+LONG WINAPI RegOpenKeyA(HKEY,LPCSTR,PHKEY);
+LONG WINAPI RegOpenKeyExA(HKEY,LPCSTR,DWORD,REGSAM,PHKEY);
+LONG WINAPI RegOpenKeyExW(HKEY,LPCWSTR,DWORD,REGSAM,PHKEY);
+LONG WINAPI RegOpenKeyW(HKEY,LPCWSTR,PHKEY);
+LONG WINAPI RegQueryInfoKeyA(HKEY,LPSTR,PDWORD,PDWORD,PDWORD,PDWORD,PDWORD,PDWORD,PDWORD,PDWORD,PDWORD,PFILETIME);
+LONG WINAPI RegQueryInfoKeyW(HKEY,LPWSTR,PDWORD,PDWORD,PDWORD,PDWORD,PDWORD,PDWORD,PDWORD,PDWORD,PDWORD,PFILETIME);
+LONG WINAPI RegQueryMultipleValuesA(HKEY,PVALENTA,DWORD,LPSTR,PDWORD);
+LONG WINAPI RegQueryMultipleValuesW(HKEY,PVALENTW,DWORD,LPWSTR,PDWORD);
+LONG WINAPI RegQueryValueA(HKEY,LPCSTR,LPSTR,PLONG);
+LONG WINAPI RegQueryValueExA (HKEY,LPCSTR,PDWORD,PDWORD,LPBYTE,PDWORD);
+LONG WINAPI RegQueryValueExW(HKEY,LPCWSTR,PDWORD,PDWORD,LPBYTE,PDWORD);
+LONG WINAPI RegQueryValueW(HKEY,LPCWSTR,LPWSTR,PLONG);
+LONG WINAPI RegReplaceKeyA(HKEY,LPCSTR,LPCSTR,LPCSTR);
+LONG WINAPI RegReplaceKeyW(HKEY,LPCWSTR,LPCWSTR,LPCWSTR);
+LONG WINAPI RegRestoreKeyA (HKEY,LPCSTR,DWORD);
+LONG WINAPI RegRestoreKeyW(HKEY,LPCWSTR,DWORD);
+LONG WINAPI RegSaveKeyA(HKEY,LPCSTR,LPSECURITY_ATTRIBUTES);
+LONG WINAPI RegSaveKeyW(HKEY,LPCWSTR,LPSECURITY_ATTRIBUTES);
+LONG WINAPI RegSetKeySecurity(HKEY,SECURITY_INFORMATION,PSECURITY_DESCRIPTOR);
+LONG WINAPI RegSetValueA(HKEY,LPCSTR,DWORD,LPCSTR,DWORD);
+LONG WINAPI RegSetValueExA(HKEY,LPCSTR,DWORD,DWORD,const BYTE*,DWORD);
+LONG WINAPI RegSetValueExW(HKEY,LPCWSTR,DWORD,DWORD,const BYTE*,DWORD);
+LONG WINAPI RegSetValueW(HKEY,LPCWSTR,DWORD,LPCWSTR,DWORD);
+LONG WINAPI RegUnLoadKeyA(HKEY,LPCSTR);
+LONG WINAPI RegUnLoadKeyW(HKEY,LPCWSTR);
+
+#ifdef UNICODE
+typedef VALENTW VALENT,*PVALENT;
+#define AbortSystemShutdown AbortSystemShutdownW
+#define InitiateSystemShutdown InitiateSystemShutdownW
+#define RegConnectRegistry RegConnectRegistryW
+#define RegCreateKey RegCreateKeyW
+#define RegCreateKeyEx RegCreateKeyExW
+#define RegDeleteKey RegDeleteKeyW
+#define RegDeleteValue RegDeleteValueW
+#define RegEnumKey RegEnumKeyW
+#define RegEnumKeyEx RegEnumKeyExW
+#define RegEnumValue RegEnumValueW
+#define RegLoadKey RegLoadKeyW
+#define RegOpenKey RegOpenKeyW
+#define RegOpenKeyEx RegOpenKeyExW
+#define RegQueryInfoKey RegQueryInfoKeyW
+#define RegQueryMultipleValues RegQueryMultipleValuesW
+#define RegQueryValue RegQueryValueW
+#define RegQueryValueEx RegQueryValueExW
+#define RegReplaceKey RegReplaceKeyW
+#define RegRestoreKey RegRestoreKeyW
+#define RegSaveKey RegSaveKeyW
+#define RegSetValue RegSetValueW
+#define RegSetValueEx RegSetValueExW
+#define RegUnLoadKey RegUnLoadKeyW
+#else
+typedef VALENTA VALENT,*PVALENT;
+#define AbortSystemShutdown AbortSystemShutdownA
+#define InitiateSystemShutdown InitiateSystemShutdownA
+#define RegConnectRegistry RegConnectRegistryA
+#define RegCreateKey RegCreateKeyA
+#define RegCreateKeyEx RegCreateKeyExA
+#define RegDeleteKey RegDeleteKeyA
+#define RegDeleteValue RegDeleteValueA
+#define RegEnumKey RegEnumKeyA
+#define RegEnumKeyEx RegEnumKeyExA
+#define RegEnumValue RegEnumValueA
+#define RegLoadKey RegLoadKeyA
+#define RegOpenKey RegOpenKeyA
+#define RegOpenKeyEx RegOpenKeyExA
+#define RegQueryInfoKey RegQueryInfoKeyA
+#define RegQueryMultipleValues RegQueryMultipleValuesA
+#define RegQueryValue RegQueryValueA
+#define RegQueryValueEx RegQueryValueExA
+#define RegReplaceKey RegReplaceKeyA
+#define RegRestoreKey RegRestoreKeyA
+#define RegSaveKey RegSaveKeyA
+#define RegSetValue RegSetValueA
+#define RegSetValueEx RegSetValueExA
+#define RegUnLoadKey RegUnLoadKeyA
+#endif
+#endif
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/winsup/w32api/include/winresrc.h b/winsup/w32api/include/winresrc.h
new file mode 100644
index 000000000..59e0cd062
--- /dev/null
+++ b/winsup/w32api/include/winresrc.h
@@ -0,0 +1,10 @@
+#ifndef _WINRESRC_H
+#define _WINRESRC_H
+#define WIN32_LEAN_AND_MEAN
+#include <winuser.h>
+#include <winnt.h>
+#include <winver.h>
+#include <dde.h>
+#include <dlgs.h>
+#include <commctrl.h>
+#endif
diff --git a/winsup/w32api/include/winsock.h b/winsup/w32api/include/winsock.h
new file mode 100644
index 000000000..93986d02e
--- /dev/null
+++ b/winsup/w32api/include/winsock.h
@@ -0,0 +1,510 @@
+/*
+
+ Definitions for winsock 1.1
+
+ Portions Copyright (c) 1980, 1983, 1988, 1993
+ The Regents of the University of California. All rights reserved.
+
+ Portions Copyright (c) 1993 by Digital Equipment Corporation.
+ */
+
+#ifndef _WINSOCK_H
+#define _WINSOCK_H
+#define _GNU_H_WINDOWS32_SOCKETS
+#include <windows.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef _SYS_TYPES_H
+typedef unsigned char u_char;
+typedef unsigned short u_short;
+typedef unsigned int u_int;
+typedef unsigned long u_long;
+#endif /* ndef _SYS_TYPES_H */
+typedef u_int SOCKET;
+#ifndef FD_SETSIZE
+#define FD_SETSIZE 64
+#endif
+
+/* shutdown() how types */
+#define SD_RECEIVE 0x00
+#define SD_SEND 0x01
+#define SD_BOTH 0x02
+
+#ifndef _SYS_TYPES_H
+/* fd_set may have been defined by the newlib <sys/types.h>. */
+#ifdef fd_set
+#undef fd_set
+#endif
+typedef struct fd_set {
+ u_int fd_count;
+ SOCKET fd_array[FD_SETSIZE];
+} fd_set;
+int PASCAL __WSAFDIsSet(SOCKET,fd_set*);
+#ifndef FD_CLR
+#define FD_CLR(fd,set) do { u_int __i;\
+for (__i = 0; __i < ((fd_set *)(set))->fd_count ; __i++) {\
+ if (((fd_set *)(set))->fd_array[__i] == fd) {\
+ while (__i < ((fd_set *)(set))->fd_count-1) {\
+ ((fd_set*)(set))->fd_array[__i] = ((fd_set*)(set))->fd_array[__i+1];\
+ __i++;\
+ }\
+ ((fd_set*)(set))->fd_count--;\
+ break;\
+ }\
+}\
+} while (0)
+#endif
+#ifndef FD_SET
+#define FD_SET(fd, set) do { \
+ if (((fd_set *)(set))->fd_count < FD_SETSIZE) \
+ ((fd_set *)(set))->fd_array[((fd_set *)(set))->fd_count++]=(fd);\
+}while (0)
+#endif
+#ifndef FD_ZERO
+#define FD_ZERO(set) (((fd_set *)(set))->fd_count=0)
+#endif
+#ifndef FD_ISSET
+#define FD_ISSET(fd, set) __WSAFDIsSet((SOCKET)(fd), (fd_set *)(set))
+#endif
+#endif /* ndef _SYS_TYPES_H */
+#ifndef __INSIDE_CYGWIN__
+struct timeval {
+ long tv_sec;
+ long tv_usec;
+};
+struct hostent {
+ char *h_name;
+ char **h_aliases;
+ short h_addrtype;
+ short h_length;
+ char **h_addr_list;
+#define h_addr h_addr_list[0]
+};
+struct linger {
+ u_short l_onoff;
+ u_short l_linger;
+};
+#endif /* ndef __INSIDE_CYGWIN__ */
+#define timerisset(tvp) ((tvp)->tv_sec || (tvp)->tv_usec)
+#define timercmp(tvp, uvp, cmp) \
+ ((tvp)->tv_sec cmp (uvp)->tv_sec || \
+ (tvp)->tv_sec == (uvp)->tv_sec && (tvp)->tv_usec cmp (uvp)->tv_usec)
+#define timerclear(tvp) (tvp)->tv_sec = (tvp)->tv_usec = 0
+#define IOCPARM_MASK 0x7f
+#define IOC_VOID 0x20000000
+#define IOC_OUT 0x40000000
+#define IOC_IN 0x80000000
+#define IOC_INOUT (IOC_IN|IOC_OUT)
+
+#ifndef __INSIDE_CYGWIN__
+#define _IO(x,y) (IOC_VOID|((x)<<8)|(y))
+#define _IOR(x,y,t) (IOC_OUT|(((long)sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|(y))
+#define _IOW(x,y,t) (IOC_IN|(((long)sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|(y))
+#define FIONBIO _IOW('f', 126, u_long)
+#endif /* ndef __INSIDE_CYGWIN__ */
+
+#define FIONREAD _IOR('f', 127, u_long)
+#define FIOASYNC _IOW('f', 125, u_long)
+#define SIOCSHIWAT _IOW('s', 0, u_long)
+#define SIOCGHIWAT _IOR('s', 1, u_long)
+#define SIOCSLOWAT _IOW('s', 2, u_long)
+#define SIOCGLOWAT _IOR('s', 3, u_long)
+#define SIOCATMARK _IOR('s', 7, u_long)
+
+#ifndef __INSIDE_CYGWIN__
+struct netent {
+ char * n_name;
+ char **n_aliases;
+ short n_addrtype;
+ u_long n_net;
+};
+struct servent {
+ char *s_name;
+ char **s_aliases;
+ short s_port;
+ char *s_proto;
+};
+struct protoent {
+ char *p_name;
+ char **p_aliases;
+ short p_proto;
+};
+#endif /* __INSIDE_CYGWIN__ */
+
+#define IPPROTO_IP 0
+#define IPPROTO_ICMP 1
+#define IPPROTO_GGP 2
+#define IPPROTO_TCP 6
+#define IPPROTO_PUP 12
+#define IPPROTO_UDP 17
+#define IPPROTO_IDP 22
+#define IPPROTO_ND 77
+#define IPPROTO_RAW 255
+#define IPPROTO_MAX 256
+#define IPPORT_ECHO 7
+#define IPPORT_DISCARD 9
+#define IPPORT_SYSTAT 11
+#define IPPORT_DAYTIME 13
+#define IPPORT_NETSTAT 15
+#define IPPORT_FTP 21
+#define IPPORT_TELNET 23
+#define IPPORT_SMTP 25
+#define IPPORT_TIMESERVER 37
+#define IPPORT_NAMESERVER 42
+#define IPPORT_WHOIS 43
+#define IPPORT_MTP 57
+#define IPPORT_TFTP 69
+#define IPPORT_RJE 77
+#define IPPORT_FINGER 79
+#define IPPORT_TTYLINK 87
+#define IPPORT_SUPDUP 95
+#define IPPORT_EXECSERVER 512
+#define IPPORT_LOGINSERVER 513
+#define IPPORT_CMDSERVER 514
+#define IPPORT_EFSSERVER 520
+#define IPPORT_BIFFUDP 512
+#define IPPORT_WHOSERVER 513
+#define IPPORT_ROUTESERVER 520
+#define IPPORT_RESERVED 1024
+#define IMPLINK_IP 155
+#define IMPLINK_LOWEXPER 156
+#define IMPLINK_HIGHEXPER 158
+struct in_addr {
+ union {
+ struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b;
+ struct { u_short s_w1,s_w2; } S_un_w;
+ u_long S_addr;
+ } S_un;
+#define s_addr S_un.S_addr
+#define s_host S_un.S_un_b.s_b2
+#define s_net S_un.S_un_b.s_b1
+#define s_imp S_un.S_un_w.s_w2
+#define s_impno S_un.S_un_b.s_b4
+#define s_lh S_un.S_un_b.s_b3
+};
+#define IN_CLASSA(i) ((long)(i)&0x80000000)
+#define IN_CLASSA_NET 0xff000000
+#define IN_CLASSA_NSHIFT 24
+#define IN_CLASSA_HOST 0x00ffffff
+#define IN_CLASSA_MAX 128
+#define IN_CLASSB(i) (((long)(i)&0xc0000000)==0x80000000)
+#define IN_CLASSB_NET 0xffff0000
+#define IN_CLASSB_NSHIFT 16
+#define IN_CLASSB_HOST 0x0000ffff
+#define IN_CLASSB_MAX 65536
+#define IN_CLASSC(i) (((long)(i)&0xe0000000)==0xc0000000)
+#define IN_CLASSC_NET 0xffffff00
+#define IN_CLASSC_NSHIFT 8
+#define IN_CLASSC_HOST 0xff
+#define INADDR_ANY (u_long)0
+#define INADDR_LOOPBACK 0x7f000001
+#define INADDR_BROADCAST (u_long)0xffffffff
+#define INADDR_NONE 0xffffffff
+struct sockaddr_in {
+ short sin_family;
+ u_short sin_port;
+ struct in_addr sin_addr;
+ char sin_zero[8];
+};
+#define WSADESCRIPTION_LEN 256
+#define WSASYS_STATUS_LEN 128
+typedef struct WSAData {
+ WORD wVersion;
+ WORD wHighVersion;
+ char szDescription[WSADESCRIPTION_LEN+1];
+ char szSystemStatus[WSASYS_STATUS_LEN+1];
+ unsigned short iMaxSockets;
+ unsigned short iMaxUdpDg;
+ char * lpVendorInfo;
+} WSADATA;
+typedef WSADATA *LPWSADATA;
+
+#ifndef __INSIDE_CYGWIN__
+#define IP_OPTIONS 1
+#define SO_DEBUG 1
+#define SO_ACCEPTCONN 2
+#define SO_REUSEADDR 4
+#define SO_KEEPALIVE 8
+#define SO_DONTROUTE 16
+#define SO_BROADCAST 32
+#define SO_USELOOPBACK 64
+#define SO_LINGER 128
+#define SO_OOBINLINE 256
+#define SO_DONTLINGER (u_int)(~SO_LINGER)
+#define SO_SNDBUF 0x1001
+#define SO_RCVBUF 0x1002
+#define SO_SNDLOWAT 0x1003
+#define SO_RCVLOWAT 0x1004
+#define SO_SNDTIMEO 0x1005
+#define SO_RCVTIMEO 0x1006
+#define SO_ERROR 0x1007
+#define SO_TYPE 0x1008
+#define SO_CONNDATA 0x7000
+#define SO_CONNOPT 0x7001
+#define SO_DISCDATA 0x7002
+#define SO_DISCOPT 0x7003
+#define SO_CONNDATALEN 0x7004
+#define SO_CONNOPTLEN 0x7005
+#define SO_DISCDATALEN 0x7006
+#define SO_DISCOPTLEN 0x7007
+#define SO_OPENTYPE 0x7008
+#define SO_SYNCHRONOUS_ALERT 0x10
+#define SO_SYNCHRONOUS_NONALERT 0x20
+#define SO_MAXDG 0x7009
+#define SO_MAXPATHDG 0x700A
+#define SO_UPDATE_ACCEPT_CONTEXT 0x700B
+#define SO_CONNECT_TIME 0x700C
+#endif
+#define IP_MULTICAST_IF 2
+#define IP_MULTICAST_TTL 3
+#define IP_MULTICAST_LOOP 4
+#define IP_ADD_MEMBERSHIP 5
+#define IP_DROP_MEMBERSHIP 6
+#define IP_DEFAULT_MULTICAST_TTL 1
+#define IP_DEFAULT_MULTICAST_LOOP 1
+#define IP_MAX_MEMBERSHIPS 20
+struct ip_mreq {
+ struct in_addr imr_multiaddr;
+ struct in_addr imr_interface;
+};
+#define INVALID_SOCKET (SOCKET)(~0)
+#define SOCKET_ERROR (-1)
+#define SOCK_STREAM 1
+#define SOCK_DGRAM 2
+#define SOCK_RAW 3
+#define SOCK_RDM 4
+#define SOCK_SEQPACKET 5
+#define TCP_NODELAY 0x0001
+#define TCP_BSDURGENT 0x7000
+#define AF_UNSPEC 0
+#define AF_UNIX 1
+#define AF_INET 2
+#define AF_IMPLINK 3
+#define AF_PUP 4
+#define AF_CHAOS 5
+#define AF_IPX 6
+#define AF_NS 6
+#define AF_ISO 7
+#define AF_OSI AF_ISO
+#define AF_ECMA 8
+#define AF_DATAKIT 9
+#define AF_CCITT 10
+#define AF_SNA 11
+#define AF_DECnet 12
+#define AF_DLI 13
+#define AF_LAT 14
+#define AF_HYLINK 15
+#define AF_APPLETALK 16
+#define AF_NETBIOS 17
+#define AF_VOICEVIEW 18
+#ifndef __INSIDE_CYGWIN__
+#define AF_MAX 19
+struct sockaddr {
+ u_short sa_family;
+ char sa_data[14];
+};
+#endif /* ndef __INSIDE_CYGWIN__ */
+
+struct sockproto {
+ u_short sp_family;
+ u_short sp_protocol;
+};
+#define PF_UNSPEC AF_UNSPEC
+#define PF_UNIX AF_UNIX
+#define PF_INET AF_INET
+#define PF_IMPLINK AF_IMPLINK
+#define PF_PUP AF_PUP
+#define PF_CHAOS AF_CHAOS
+#define PF_NS AF_NS
+#define PF_IPX AF_IPX
+#define PF_ISO AF_ISO
+#define PF_OSI AF_OSI
+#define PF_ECMA AF_ECMA
+#define PF_DATAKIT AF_DATAKIT
+#define PF_CCITT AF_CCITT
+#define PF_SNA AF_SNA
+#define PF_DECnet AF_DECnet
+#define PF_DLI AF_DLI
+#define PF_LAT AF_LAT
+#define PF_HYLINK AF_HYLINK
+#define PF_APPLETALK AF_APPLETALK
+#define PF_VOICEVIEW AF_VOICEVIEW
+#define PF_MAX AF_MAX
+#define SOL_SOCKET 0xffff
+#define SOMAXCONN 5
+#ifndef __INSIDE_CYGWIN__
+#define MSG_OOB 1
+#define MSG_PEEK 2
+#define MSG_DONTROUTE 4
+#endif /* ndef __INSIDE_CYGWIN__ */
+#define MSG_MAXIOVLEN 16
+#define MSG_PARTIAL 0x8000
+#define MAXGETHOSTSTRUCT 1024
+#define FD_READ 1
+#define FD_WRITE 2
+#define FD_OOB 4
+#define FD_ACCEPT 8
+#define FD_CONNECT 16
+#define FD_CLOSE 32
+#define WSABASEERR 10000
+#define WSAEINTR (WSABASEERR+4)
+#define WSAEBADF (WSABASEERR+9)
+#define WSAEACCES (WSABASEERR+13)
+#define WSAEFAULT (WSABASEERR+14)
+#define WSAEINVAL (WSABASEERR+22)
+#define WSAEMFILE (WSABASEERR+24)
+#define WSAEWOULDBLOCK (WSABASEERR+35)
+#define WSAEINPROGRESS (WSABASEERR+36)
+#define WSAEALREADY (WSABASEERR+37)
+#define WSAENOTSOCK (WSABASEERR+38)
+#define WSAEDESTADDRREQ (WSABASEERR+39)
+#define WSAEMSGSIZE (WSABASEERR+40)
+#define WSAEPROTOTYPE (WSABASEERR+41)
+#define WSAENOPROTOOPT (WSABASEERR+42)
+#define WSAEPROTONOSUPPORT (WSABASEERR+43)
+#define WSAESOCKTNOSUPPORT (WSABASEERR+44)
+#define WSAEOPNOTSUPP (WSABASEERR+45)
+#define WSAEPFNOSUPPORT (WSABASEERR+46)
+#define WSAEAFNOSUPPORT (WSABASEERR+47)
+#define WSAEADDRINUSE (WSABASEERR+48)
+#define WSAEADDRNOTAVAIL (WSABASEERR+49)
+#define WSAENETDOWN (WSABASEERR+50)
+#define WSAENETUNREACH (WSABASEERR+51)
+#define WSAENETRESET (WSABASEERR+52)
+#define WSAECONNABORTED (WSABASEERR+53)
+#define WSAECONNRESET (WSABASEERR+54)
+#define WSAENOBUFS (WSABASEERR+55)
+#define WSAEISCONN (WSABASEERR+56)
+#define WSAENOTCONN (WSABASEERR+57)
+#define WSAESHUTDOWN (WSABASEERR+58)
+#define WSAETOOMANYREFS (WSABASEERR+59)
+#define WSAETIMEDOUT (WSABASEERR+60)
+#define WSAECONNREFUSED (WSABASEERR+61)
+#define WSAELOOP (WSABASEERR+62)
+#define WSAENAMETOOLONG (WSABASEERR+63)
+#define WSAEHOSTDOWN (WSABASEERR+64)
+#define WSAEHOSTUNREACH (WSABASEERR+65)
+#define WSAENOTEMPTY (WSABASEERR+66)
+#define WSAEPROCLIM (WSABASEERR+67)
+#define WSAEUSERS (WSABASEERR+68)
+#define WSAEDQUOT (WSABASEERR+69)
+#define WSAESTALE (WSABASEERR+70)
+#define WSAEREMOTE (WSABASEERR+71)
+#define WSAEDISCON (WSABASEERR+101)
+#define WSASYSNOTREADY (WSABASEERR+91)
+#define WSAVERNOTSUPPORTED (WSABASEERR+92)
+#define WSANOTINITIALISED (WSABASEERR+93)
+#define WSAHOST_NOT_FOUND (WSABASEERR+1001)
+#define WSATRY_AGAIN (WSABASEERR+1002)
+#define WSANO_RECOVERY (WSABASEERR+1003)
+#define WSANO_DATA (WSABASEERR+1004)
+#define WSANO_ADDRESS WSANO_DATA
+#ifndef __INSIDE_CYGWIN__
+#define h_errno WSAGetLastError()
+#define HOST_NOT_FOUND WSAHOST_NOT_FOUND
+#define TRY_AGAIN WSATRY_AGAIN
+#define NO_RECOVERY WSANO_RECOVERY
+#define NO_DATA WSANO_DATA
+#define NO_ADDRESS WSANO_ADDRESS
+#endif
+SOCKET PASCAL accept(SOCKET,struct sockaddr*,int*);
+int PASCAL bind(SOCKET,const struct sockaddr*,int);
+int PASCAL closesocket(SOCKET);
+int PASCAL connect(SOCKET,const struct sockaddr*,int);
+int PASCAL ioctlsocket(SOCKET,long,u_long *);
+int PASCAL getpeername(SOCKET,struct sockaddr*,int*);
+int PASCAL getsockname(SOCKET,struct sockaddr*,int*);
+int PASCAL getsockopt(SOCKET,int,int,char*,int*);
+unsigned long PASCAL inet_addr(const char*);
+char * PASCAL inet_ntoa(struct in_addr);
+int PASCAL listen(SOCKET,int);
+int PASCAL recv(SOCKET,char*,int,int);
+int PASCAL recvfrom(SOCKET,char*,int,int,struct sockaddr*,int*);
+int PASCAL send(SOCKET,const char*,int,int);
+int PASCAL sendto(SOCKET,const char*,int,int,const struct sockaddr*,int);
+int PASCAL setsockopt(SOCKET,int,int,const char*,int);
+int PASCAL shutdown(SOCKET,int);
+SOCKET PASCAL socket(int,int,int);
+struct hostent* PASCAL gethostbyaddr(const char*,int,int);
+struct hostent* PASCAL gethostbyname(const char*);
+struct servent* PASCAL getservbyport(int,const char*);
+struct servent* PASCAL getservbyname(const char*,const char*);
+struct protoent* PASCAL getprotobynumber(int);
+struct protoent* PASCAL getprotobyname(const char*);
+int PASCAL WSAStartup(WORD,LPWSADATA);
+int PASCAL WSACleanup(void);
+void PASCAL WSASetLastError(int);
+int PASCAL WSAGetLastError(void);
+BOOL PASCAL WSAIsBlocking(void);
+int PASCAL WSAUnhookBlockingHook(void);
+FARPROC PASCAL WSASetBlockingHook(FARPROC);
+int PASCAL WSACancelBlockingCall(void);
+HANDLE PASCAL WSAAsyncGetServByName(HWND,u_int,const char*,const char*,char*,int);
+HANDLE PASCAL WSAAsyncGetServByPort(HWND,u_int,int,const char*,char*,int);
+HANDLE PASCAL WSAAsyncGetProtoByName(HWND,u_int,const char*,char*,int);
+HANDLE PASCAL WSAAsyncGetProtoByNumber(HWND,u_int,int,char*,int);
+HANDLE PASCAL WSAAsyncGetHostByName(HWND,u_int,const char*,char*,int);
+HANDLE PASCAL WSAAsyncGetHostByAddr(HWND,u_int,const char*,int,int,char*,int);
+int PASCAL WSACancelAsyncRequest(HANDLE);
+int PASCAL WSAAsyncSelect(SOCKET,HWND,u_int,long);
+int PASCAL WSARecvEx(SOCKET,char*,int,int*);
+typedef struct _TRANSMIT_FILE_BUFFERS {
+ PVOID Head;
+ DWORD HeadLength;
+ PVOID Tail;
+ DWORD TailLength;
+} TRANSMIT_FILE_BUFFERS, *PTRANSMIT_FILE_BUFFERS, *LPTRANSMIT_FILE_BUFFERS;
+BOOL PASCAL TransmitFile(SOCKET,HANDLE,DWORD,DWORD,LPOVERLAPPED,LPTRANSMIT_FILE_BUFFERS,DWORD);
+BOOL PASCAL AcceptEx(SOCKET,SOCKET,PVOID,DWORD,DWORD,DWORD,LPDWORD,LPOVERLAPPED);
+VOID PASCAL GetAcceptExSockaddrs(PVOID,DWORD,DWORD,DWORD,struct sockaddr**, LPINT, struct sockaddr**, LPINT);
+#ifndef __INSIDE_CYGWIN__
+u_long PASCAL htonl(u_long);
+u_long PASCAL ntohl(u_long);
+u_short PASCAL htons(u_short);
+u_short PASCAL ntohs(u_short);
+int PASCAL select(int nfds,fd_set*,fd_set*,fd_set*,const struct timeval*);
+int PASCAL gethostname(char*,int);
+#endif /* ndef __INSIDE_CYGWIN__ */
+
+#define WSAMAKEASYNCREPLY(b,e) MAKELONG(b,e)
+#define WSAMAKESELECTREPLY(e,error) MAKELONG(e,error)
+#define WSAGETASYNCBUFLEN(l) LOWORD(l)
+#define WSAGETASYNCERROR(l) HIWORD(l)
+#define WSAGETSELECTEVENT(l) LOWORD(l)
+#define WSAGETSELECTERROR(l) HIWORD(l)
+
+typedef struct sockaddr SOCKADDR;
+typedef struct sockaddr *PSOCKADDR;
+typedef struct sockaddr *LPSOCKADDR;
+typedef struct sockaddr_in SOCKADDR_IN;
+typedef struct sockaddr_in *PSOCKADDR_IN;
+typedef struct sockaddr_in *LPSOCKADDR_IN;
+typedef struct linger LINGER;
+typedef struct linger *PLINGER;
+typedef struct linger *LPLINGER;
+typedef struct in_addr IN_ADDR;
+typedef struct in_addr *PIN_ADDR;
+typedef struct in_addr *LPIN_ADDR;
+typedef struct fd_set FD_SET;
+typedef struct fd_set *PFD_SET;
+typedef struct fd_set *LPFD_SET;
+typedef struct hostent HOSTENT;
+typedef struct hostent *PHOSTENT;
+typedef struct hostent *LPHOSTENT;
+typedef struct servent SERVENT;
+typedef struct servent *PSERVENT;
+typedef struct servent *LPSERVENT;
+typedef struct protoent PROTOENT;
+typedef struct protoent *PPROTOENT;
+typedef struct protoent *LPPROTOENT;
+typedef struct timeval TIMEVAL;
+typedef struct timeval *PTIMEVAL;
+typedef struct timeval *LPTIMEVAL;
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/winsup/w32api/include/winsock2.h b/winsup/w32api/include/winsock2.h
new file mode 100644
index 000000000..ea748f0dc
--- /dev/null
+++ b/winsup/w32api/include/winsock2.h
@@ -0,0 +1,129 @@
+/*
+
+ Definitions for winsock 2
+
+ FIXME: This is mostly a stub for now. Taken from the Wine project.
+
+ Portions Copyright (c) 1980, 1983, 1988, 1993
+ The Regents of the University of California. All rights reserved.
+
+ Portions Copyright (c) 1993 by Digital Equipment Corporation.
+ */
+
+#ifndef _WINSOCK2_H
+#define _WINSOCK2_H
+#define _GNU_H_WINDOWS32_SOCKETS
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <winsock.h>
+
+#define FD_MAX_EVENTS 10
+#define FD_READ_BIT 0
+#define FD_WRITE_BIT 1
+#define FD_OOB_BIT 2
+#define FD_ACCEPT_BIT 3
+#define FD_CONNECT_BIT 4
+#define FD_CLOSE_BIT 5
+#define FROM_PROTOCOL_INFO -1
+#define SO_GROUP_ID 0x2001
+#define SO_GROUP_PRIORITY 0x2002
+#define SO_MAX_MSG_SIZE 0x2003
+#define SO_PROTOCOL_INFOA 0x2004
+#define SO_PROTOCOL_INFOW 0x2005
+#define MAX_PROTOCOL_CHAIN 7
+#define BASE_PROTOCOL 1
+#define LAYERED_PROTOCOL 0
+#define WSAPROTOCOL_LEN 255
+#define WSA_FLAG_OVERLAPPED 0x01
+#define WSA_FLAG_MULTIPOINT_C_ROOT 0x02
+#define WSA_FLAG_MULTIPOINT_C_LEAF 0x04
+#define WSA_FLAG_MULTIPOINT_D_ROOT 0x08
+#define WSA_FLAG_MULTIPOINT_D_LEAF 0x10
+typedef HANDLE WSAEVENT;
+typedef unsigned int GROUP;
+#ifndef GUID_DEFINED
+#define GUID_DEFINED
+typedef struct _GUID {
+ unsigned long Data1;
+ unsigned short Data2;
+ unsigned short Data3;
+ unsigned char Data4[8];
+} GUID,*REFGUID,*LPGUID;
+#endif /* GUID_DEFINED */
+typedef struct _WSANETWORKEVENTS {
+ long lNetworkEvents;
+ int iErrorCode[FD_MAX_EVENTS];
+} WSANETWORKEVENTS, *LPWSANETWORKEVENTS;
+typedef struct _WSAPROTOCOLCHAIN {
+ int ChainLen;
+ DWORD ChainEntries[MAX_PROTOCOL_CHAIN];
+} WSAPROTOCOLCHAIN,*LPWSAPROTOCOLCHAIN;
+typedef struct _WSAPROTOCOL_INFOA {
+ DWORD dwServiceFlags1;
+ DWORD dwServiceFlags2;
+ DWORD dwServiceFlags3;
+ DWORD dwServiceFlags4;
+ DWORD dwProviderFlags;
+ GUID ProviderId;
+ DWORD dwCatalogEntryId;
+ WSAPROTOCOLCHAIN ProtocolChain;
+ int iVersion;
+ int iAddressFamily;
+ int iMaxSockAddr;
+ int iMinSockAddr;
+ int iSocketType;
+ int iProtocol;
+ int iProtocolMaxOffset;
+ int iNetworkByteOrder;
+ int iSecurityScheme;
+ DWORD dwMessageSize;
+ DWORD dwProviderReserved;
+ CHAR szProtocol[WSAPROTOCOL_LEN+1];
+} WSAPROTOCOL_INFOA,*LPWSAPROTOCOL_INFOA;
+typedef struct _WSAPROTOCOL_INFOW {
+ DWORD dwServiceFlags1;
+ DWORD dwServiceFlags2;
+ DWORD dwServiceFlags3;
+ DWORD dwServiceFlags4;
+ DWORD dwProviderFlags;
+ GUID ProviderId;
+ DWORD dwCatalogEntryId;
+ WSAPROTOCOLCHAIN ProtocolChain;
+ int iVersion;
+ int iAddressFamily;
+ int iMaxSockAddr;
+ int iMinSockAddr;
+ int iSocketType;
+ int iProtocol;
+ int iProtocolMaxOffset;
+ int iNetworkByteOrder;
+ int iSecurityScheme;
+ DWORD dwMessageSize;
+ DWORD dwProviderReserved;
+ WCHAR szProtocol[WSAPROTOCOL_LEN+1];
+} WSAPROTOCOL_INFOW,*LPWSAPROTOCOL_INFOW;
+SOCKET PASCAL WSASocketA(int,int,int,LPWSAPROTOCOL_INFOA,GROUP,DWORD);
+SOCKET PASCAL WSASocketW(int,int,int,LPWSAPROTOCOL_INFOW,GROUP,DWORD);
+#define WSACreateEvent() CreateEvent(NULL, TRUE, FALSE, NULL)
+int PASCAL WSAEnumNetworkEvents(SOCKET s, WSAEVENT hEventObject, LPWSANETWORKEVENTS lpNetworkEvents);
+int PASCAL WSAEventSelect(SOCKET s, WSAEVENT hEventObject, long lNetworkEvents);
+
+#ifdef UNICODE
+#define SO_PROTOCOL_INFO SO_PROTOCOL_INFOW
+#define WSAPROTOCOL_INFO WSAPROTOCOL_INFOW
+#define LPWSAPROTOCOL_INFO LPWSAPROTOCOL_INFOW
+#define WSASocket WSASocketW
+#else
+#define SO_PROTOCOL_INFO SO_PROTOCOL_INFOA
+#define WSAPROTOCOL_INFO WSAPROTOCOL_INFOA
+#define LPWSAPROTOCOL_INFO LPWSAPROTOCOL_INFOA
+#define WSASocket WSASocketA
+#endif /* UNICODE */
+
+#ifdef __cplusplus
+}
+#endif
+#endif
+
diff --git a/winsup/w32api/include/winspool.h b/winsup/w32api/include/winspool.h
new file mode 100644
index 000000000..7d9f280e1
--- /dev/null
+++ b/winsup/w32api/include/winspool.h
@@ -0,0 +1,776 @@
+#ifndef _WINSPOOL_H
+#define _WINSPOOL_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+#define DI_CHANNEL 1
+#define DI_CHANNEL_WRITE 2
+#define DI_READ_SPOOL_JOB 3
+#define FORM_BUILTIN 1
+#define JOB_CONTROL_PAUSE 1
+#define JOB_CONTROL_RESUME 2
+#define JOB_CONTROL_CANCEL 3
+#define JOB_CONTROL_RESTART 4
+#define JOB_CONTROL_DELETE 5
+#define JOB_STATUS_PAUSED 1
+#define JOB_STATUS_ERROR 2
+#define JOB_STATUS_DELETING 4
+#define JOB_STATUS_SPOOLING 8
+#define JOB_STATUS_PRINTING 16
+#define JOB_STATUS_OFFLINE 32
+#define JOB_STATUS_PAPEROUT 0x40
+#define JOB_STATUS_PRINTED 0x80
+#define JOB_STATUS_DELETED 0x100
+#define JOB_STATUS_BLOCKED_DEVQ 0x200
+#define JOB_STATUS_USER_INTERVENTION 0x400
+#define JOB_POSITION_UNSPECIFIED 0
+#define JOB_NOTIFY_TYPE 1
+#define JOB_NOTIFY_FIELD_PRINTER_NAME 0
+#define JOB_NOTIFY_FIELD_MACHINE_NAME 1
+#define JOB_NOTIFY_FIELD_PORT_NAME 2
+#define JOB_NOTIFY_FIELD_USER_NAME 3
+#define JOB_NOTIFY_FIELD_NOTIFY_NAME 4
+#define JOB_NOTIFY_FIELD_DATATYPE 5
+#define JOB_NOTIFY_FIELD_PRINT_PROCESSOR 6
+#define JOB_NOTIFY_FIELD_PARAMETERS 7
+#define JOB_NOTIFY_FIELD_DRIVER_NAME 8
+#define JOB_NOTIFY_FIELD_DEVMODE 9
+#define JOB_NOTIFY_FIELD_STATUS 10
+#define JOB_NOTIFY_FIELD_STATUS_STRING 11
+#define JOB_NOTIFY_FIELD_SECURITY_DESCRIPTOR 12
+#define JOB_NOTIFY_FIELD_DOCUMENT 13
+#define JOB_NOTIFY_FIELD_PRIORITY 14
+#define JOB_NOTIFY_FIELD_POSITION 15
+#define JOB_NOTIFY_FIELD_SUBMITTED 16
+#define JOB_NOTIFY_FIELD_START_TIME 17
+#define JOB_NOTIFY_FIELD_UNTIL_TIME 18
+#define JOB_NOTIFY_FIELD_TIME 19
+#define JOB_NOTIFY_FIELD_TOTAL_PAGES 20
+#define JOB_NOTIFY_FIELD_PAGES_PRINTED 21
+#define JOB_NOTIFY_FIELD_TOTAL_BYTES 22
+#define JOB_NOTIFY_FIELD_BYTES_PRINTED 23
+#define JOB_ACCESS_ADMINISTER 16
+#define JOB_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|JOB_ACCESS_ADMINISTER)
+#define JOB_READ (STANDARD_RIGHTS_READ| JOB_ACCESS_ADMINISTER)
+#define JOB_WRITE (STANDARD_RIGHTS_WRITE|JOB_ACCESS_ADMINISTER)
+#define JOB_EXECUTE (STANDARD_RIGHTS_EXECUTE|JOB_ACCESS_ADMINISTER)
+#define PRINTER_NOTIFY_OPTIONS_REFRESH 1
+#define PRINTER_ACCESS_ADMINISTER 4
+#define PRINTER_ACCESS_USE 8
+#define PRINTER_ERROR_INFORMATION 0x80000000
+#define PRINTER_ERROR_WARNING 0x40000000
+#define PRINTER_ERROR_SEVERE 0x20000000
+#define PRINTER_ERROR_OUTOFPAPER 1
+#define PRINTER_ERROR_JAM 2
+#define PRINTER_ERROR_OUTOFTONER 4
+#define PRINTER_CONTROL_PAUSE 1
+#define PRINTER_CONTROL_RESUME 2
+#define PRINTER_CONTROL_PURGE 3
+#define PRINTER_CONTROL_SET_STATUS 4
+#define PRINTER_STATUS_PAUSED 1
+#define PRINTER_STATUS_ERROR 2
+#define PRINTER_STATUS_PENDING_DELETION 4
+#define PRINTER_STATUS_PAPER_JAM 8
+#define PRINTER_STATUS_PAPER_OUT 0x10
+#define PRINTER_STATUS_MANUAL_FEED 0x20
+#define PRINTER_STATUS_PAPER_PROBLEM 0x40
+#define PRINTER_STATUS_OFFLINE 0x80
+#define PRINTER_STATUS_IO_ACTIVE 0x100
+#define PRINTER_STATUS_BUSY 0x200
+#define PRINTER_STATUS_PRINTING 0x400
+#define PRINTER_STATUS_OUTPUT_BIN_FULL 0x800
+#define PRINTER_STATUS_NOT_AVAILABLE 0x1000
+#define PRINTER_STATUS_WAITING 0x2000
+#define PRINTER_STATUS_PROCESSING 0x4000
+#define PRINTER_STATUS_INITIALIZING 0x8000
+#define PRINTER_STATUS_WARMING_UP 0x10000
+#define PRINTER_STATUS_TONER_LOW 0x20000
+#define PRINTER_STATUS_NO_TONER 0x40000
+#define PRINTER_STATUS_PAGE_PUNT 0x80000
+#define PRINTER_STATUS_USER_INTERVENTION 0x100000
+#define PRINTER_STATUS_OUT_OF_MEMORY 0x200000
+#define PRINTER_STATUS_DOOR_OPEN 0x400000
+#define PRINTER_STATUS_SERVER_UNKNOWN 0x800000
+#define PRINTER_STATUS_POWER_SAVE 0x1000000
+#define PRINTER_ATTRIBUTE_QUEUED 1
+#define PRINTER_ATTRIBUTE_DIRECT 2
+#define PRINTER_ATTRIBUTE_DEFAULT 4
+#define PRINTER_ATTRIBUTE_SHARED 8
+#define PRINTER_ATTRIBUTE_NETWORK 0x10
+#define PRINTER_ATTRIBUTE_HIDDEN 0x20
+#define PRINTER_ATTRIBUTE_LOCAL 0x40
+#define PRINTER_ATTRIBUTE_ENABLE_DEVQ 0x80
+#define PRINTER_ATTRIBUTE_KEEPPRINTEDJOBS 0x100
+#define PRINTER_ATTRIBUTE_DO_COMPLETE_FIRST 0x200
+#define PRINTER_ATTRIBUTE_WORK_OFFLINE 0x400
+#define PRINTER_ATTRIBUTE_ENABLE_BIDI 0x800
+#define PRINTER_ENUM_DEFAULT 1
+#define PRINTER_ENUM_LOCAL 2
+#define PRINTER_ENUM_CONNECTIONS 4
+#define PRINTER_ENUM_FAVORITE 4
+#define PRINTER_ENUM_NAME 8
+#define PRINTER_ENUM_REMOTE 16
+#define PRINTER_ENUM_SHARED 32
+#define PRINTER_ENUM_NETWORK 0x40
+#define PRINTER_ENUM_EXPAND 0x4000
+#define PRINTER_ENUM_CONTAINER 0x8000
+#define PRINTER_ENUM_ICONMASK 0xff0000
+#define PRINTER_ENUM_ICON1 0x10000
+#define PRINTER_ENUM_ICON2 0x20000
+#define PRINTER_ENUM_ICON3 0x40000
+#define PRINTER_ENUM_ICON4 0x80000
+#define PRINTER_ENUM_ICON5 0x100000
+#define PRINTER_ENUM_ICON6 0x200000
+#define PRINTER_ENUM_ICON7 0x400000
+#define PRINTER_ENUM_ICON8 0x800000
+#define PRINTER_NOTIFY_TYPE 0
+#define PRINTER_NOTIFY_FIELD_SERVER_NAME 0
+#define PRINTER_NOTIFY_FIELD_PRINTER_NAME 1
+#define PRINTER_NOTIFY_FIELD_SHARE_NAME 2
+#define PRINTER_NOTIFY_FIELD_PORT_NAME 3
+#define PRINTER_NOTIFY_FIELD_DRIVER_NAME 4
+#define PRINTER_NOTIFY_FIELD_COMMENT 5
+#define PRINTER_NOTIFY_FIELD_LOCATION 6
+#define PRINTER_NOTIFY_FIELD_DEVMODE 7
+#define PRINTER_NOTIFY_FIELD_SEPFILE 8
+#define PRINTER_NOTIFY_FIELD_PRINT_PROCESSOR 9
+#define PRINTER_NOTIFY_FIELD_PARAMETERS 10
+#define PRINTER_NOTIFY_FIELD_DATATYPE 11
+#define PRINTER_NOTIFY_FIELD_SECURITY_DESCRIPTOR 12
+#define PRINTER_NOTIFY_FIELD_ATTRIBUTES 13
+#define PRINTER_NOTIFY_FIELD_PRIORITY 14
+#define PRINTER_NOTIFY_FIELD_DEFAULT_PRIORITY 15
+#define PRINTER_NOTIFY_FIELD_START_TIME 16
+#define PRINTER_NOTIFY_FIELD_UNTIL_TIME 17
+#define PRINTER_NOTIFY_FIELD_STATUS 18
+#define PRINTER_NOTIFY_FIELD_STATUS_STRING 19
+#define PRINTER_NOTIFY_FIELD_CJOBS 20
+#define PRINTER_NOTIFY_FIELD_AVERAGE_PPM 21
+#define PRINTER_NOTIFY_FIELD_TOTAL_PAGES 22
+#define PRINTER_NOTIFY_FIELD_PAGES_PRINTED 23
+#define PRINTER_NOTIFY_FIELD_TOTAL_BYTES 24
+#define PRINTER_NOTIFY_FIELD_BYTES_PRINTED 25
+#define PRINTER_CHANGE_ADD_PRINTER 1
+#define PRINTER_CHANGE_SET_PRINTER 2
+#define PRINTER_CHANGE_DELETE_PRINTER 4
+#define PRINTER_CHANGE_FAILED_CONNECTION_PRINTER 8
+#define PRINTER_CHANGE_PRINTER 0xFF
+#define PRINTER_CHANGE_ADD_JOB 0x100
+#define PRINTER_CHANGE_SET_JOB 0x200
+#define PRINTER_CHANGE_DELETE_JOB 0x400
+#define PRINTER_CHANGE_WRITE_JOB 0x800
+#define PRINTER_CHANGE_JOB 0xFF00
+#define PRINTER_CHANGE_ADD_FORM 0x10000
+#define PRINTER_CHANGE_SET_FORM 0x20000
+#define PRINTER_CHANGE_DELETE_FORM 0x40000
+#define PRINTER_CHANGE_FORM 0x70000
+#define PRINTER_CHANGE_ADD_PORT 0x100000
+#define PRINTER_CHANGE_CONFIGURE_PORT 0x200000
+#define PRINTER_CHANGE_DELETE_PORT 0x400000
+#define PRINTER_CHANGE_PORT 0x700000
+#define PRINTER_CHANGE_ADD_PRINT_PROCESSOR 0x1000000
+#define PRINTER_CHANGE_DELETE_PRINT_PROCESSOR 0x4000000
+#define PRINTER_CHANGE_PRINT_PROCESSOR 0x7000000
+#define PRINTER_CHANGE_ADD_PRINTER_DRIVER 0x10000000
+#define PRINTER_CHANGE_SET_PRINTER_DRIVER 0x20000000
+#define PRINTER_CHANGE_DELETE_PRINTER_DRIVER 0x40000000
+#define PRINTER_CHANGE_PRINTER_DRIVER 0x70000000
+#define PRINTER_CHANGE_TIMEOUT 0x80000000
+#define PRINTER_CHANGE_ALL 0x7777FFFF
+#define PRINTER_NOTIFY_INFO_DISCARDED 1
+#define PRINTER_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|PRINTER_ACCESS_ADMINISTER|PRINTER_ACCESS_USE)
+#define PRINTER_READ (STANDARD_RIGHTS_READ|PRINTER_ACCESS_USE)
+#define PRINTER_WRITE (STANDARD_RIGHTS_WRITE|PRINTER_ACCESS_USE)
+#define PRINTER_EXECUTE (STANDARD_RIGHTS_EXECUTE|PRINTER_ACCESS_USE)
+#define NO_PRIORITY 0
+#define MAX_PRIORITY 99
+#define MIN_PRIORITY 1
+#define DEF_PRIORITY 1
+#define PORT_TYPE_WRITE 1
+#define PORT_TYPE_READ 2
+#define PORT_TYPE_REDIRECTED 4
+#define PORT_TYPE_NET_ATTACHED 8
+#define SERVER_ACCESS_ADMINISTER 1
+#define SERVER_ACCESS_ENUMERATE 2
+#define SERVER_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SERVER_ACCESS_ADMINISTER|SERVER_ACCESS_ENUMERATE)
+#define SERVER_READ (STANDARD_RIGHTS_READ|SERVER_ACCESS_ENUMERATE)
+#define SERVER_WRITE (STANDARD_RIGHTS_WRITE|SERVER_ACCESS_ADMINISTER|SERVER_ACCESS_ENUMERATE)
+#define SERVER_EXECUTE (STANDARD_RIGHTS_EXECUTE|SERVER_ACCESS_ENUMERATE)
+#define PORT_STATUS_TYPE_ERROR 1
+#define PORT_STATUS_TYPE_WARNING 2
+#define PORT_STATUS_TYPE_INFO 3
+#define PORT_STATUS_OFFLINE 1
+#define PORT_STATUS_PAPER_JAM 2
+#define PORT_STATUS_PAPER_OUT 3
+#define PORT_STATUS_OUTPUT_BIN_FULL 4
+#define PORT_STATUS_PAPER_PROBLEM 5
+#define PORT_STATUS_NO_TONER 6
+#define PORT_STATUS_DOOR_OPEN 7
+#define PORT_STATUS_USER_INTERVENTION 8
+#define PORT_STATUS_OUT_OF_MEMORY 9
+#define PORT_STATUS_TONER_LOW 10
+#define PORT_STATUS_WARMING_UP 11
+#define PORT_STATUS_POWER_SAVE 12
+#ifndef RC_INVOKED
+typedef struct _ADDJOB_INFO_1A {
+ LPSTR Path;
+ DWORD JobId;
+} ADDJOB_INFO_1A,*PADDJOB_INFO_1A,*LPADDJOB_INFO_1A;
+typedef struct _ADDJOB_INFO_1W {
+ LPWSTR Path;
+ DWORD JobId;
+} ADDJOB_INFO_1W,*PADDJOB_INFO_1W,*LPADDJOB_INFO_1W;
+typedef struct _DATATYPES_INFO_1A{LPSTR pName;} DATATYPES_INFO_1A,*PDATATYPES_INFO_1A,*LPDATATYPES_INFO_1A;
+typedef struct _DATATYPES_INFO_1W{LPWSTR pName;} DATATYPES_INFO_1W,*PDATATYPES_INFO_1W,*LPDATATYPES_INFO_1W;
+typedef struct _JOB_INFO_1A {
+ DWORD JobId;
+ LPSTR pPrinterName;
+ LPSTR pMachineName;
+ LPSTR pUserName;
+ LPSTR pDocument;
+ LPSTR pDatatype;
+ LPSTR pStatus;
+ DWORD Status;
+ DWORD Priority;
+ DWORD Position;
+ DWORD TotalPages;
+ DWORD PagesPrinted;
+ SYSTEMTIME Submitted;
+} JOB_INFO_1A,*PJOB_INFO_1A,*LPJOB_INFO_1A;
+typedef struct _JOB_INFO_1W {
+ DWORD JobId;
+ LPWSTR pPrinterName;
+ LPWSTR pMachineName;
+ LPWSTR pUserName;
+ LPWSTR pDocument;
+ LPWSTR pDatatype;
+ LPWSTR pStatus;
+ DWORD Status;
+ DWORD Priority;
+ DWORD Position;
+ DWORD TotalPages;
+ DWORD PagesPrinted;
+ SYSTEMTIME Submitted;
+} JOB_INFO_1W,*PJOB_INFO_1W,*LPJOB_INFO_1W;
+typedef struct _JOB_INFO_2A {
+ DWORD JobId;
+ LPSTR pPrinterName;
+ LPSTR pMachineName;
+ LPSTR pUserName;
+ LPSTR pDocument;
+ LPSTR pNotifyName;
+ LPSTR pDatatype;
+ LPSTR pPrintProcessor;
+ LPSTR pParameters;
+ LPSTR pDriverName;
+ LPDEVMODEA pDevMode;
+ LPSTR pStatus;
+ PSECURITY_DESCRIPTOR pSecurityDescriptor;
+ DWORD Status;
+ DWORD Priority;
+ DWORD Position;
+ DWORD StartTime;
+ DWORD UntilTime;
+ DWORD TotalPages;
+ DWORD Size;
+ SYSTEMTIME Submitted;
+ DWORD Time;
+ DWORD PagesPrinted;
+} JOB_INFO_2A,*PJOB_INFO_2A,*LPJOB_INFO_2A;
+typedef struct _JOB_INFO_2W {
+ DWORD JobId;
+ LPWSTR pPrinterName;
+ LPWSTR pMachineName;
+ LPWSTR pUserName;
+ LPWSTR pDocument;
+ LPWSTR pNotifyName;
+ LPWSTR pDatatype;
+ LPWSTR pPrintProcessor;
+ LPWSTR pParameters;
+ LPWSTR pDriverName;
+ LPDEVMODEW pDevMode;
+ LPWSTR pStatus;
+ PSECURITY_DESCRIPTOR pSecurityDescriptor;
+ DWORD Status;
+ DWORD Priority;
+ DWORD Position;
+ DWORD StartTime;
+ DWORD UntilTime;
+ DWORD TotalPages;
+ DWORD Size;
+ SYSTEMTIME Submitted;
+ DWORD Time;
+ DWORD PagesPrinted;
+} JOB_INFO_2W,*PJOB_INFO_2W,*LPJOB_INFO_2W;
+typedef struct _DOC_INFO_1A {
+ LPSTR pDocName;
+ LPSTR pOutputFile;
+ LPSTR pDatatype;
+} DOC_INFO_1A,*PDOC_INFO_1A,*LPDOC_INFO_1A;
+typedef struct _DOC_INFO_1W {
+ LPWSTR pDocName;
+ LPWSTR pOutputFile;
+ LPWSTR pDatatype;
+} DOC_INFO_1W,*PDOC_INFO_1W,*LPDOC_INFO_1W;
+typedef struct _DOC_INFO_2A {
+ LPSTR pDocName;
+ LPSTR pOutputFile;
+ LPSTR pDatatype;
+ DWORD dwMode;
+ DWORD JobId;
+} DOC_INFO_2A,*PDOC_INFO_2A,*LPDOC_INFO_2A;
+typedef struct _DOC_INFO_2W {
+ LPWSTR pDocName;
+ LPWSTR pOutputFile;
+ LPWSTR pDatatype;
+ DWORD dwMode;
+ DWORD JobId;
+} DOC_INFO_2W,*PDOC_INFO_2W,*LPDOC_INFO_2W;
+typedef struct _DRIVER_INFO_1A {LPSTR pName;} DRIVER_INFO_1A,*PDRIVER_INFO_1A,*LPDRIVER_INFO_1A;
+typedef struct _DRIVER_INFO_1W {LPWSTR pName;} DRIVER_INFO_1W,*PDRIVER_INFO_1W,*LPDRIVER_INFO_1W;
+typedef struct _DRIVER_INFO_2A {
+ DWORD cVersion;
+ LPSTR pName;
+ LPSTR pEnvironment;
+ LPSTR pDriverPath;
+ LPSTR pDataFile;
+ LPSTR pConfigFile;
+} DRIVER_INFO_2A,*PDRIVER_INFO_2A,*LPDRIVER_INFO_2A;
+typedef struct _DRIVER_INFO_2W {
+ DWORD cVersion;
+ LPWSTR pName;
+ LPWSTR pEnvironment;
+ LPWSTR pDriverPath;
+ LPWSTR pDataFile;
+ LPWSTR pConfigFile;
+} DRIVER_INFO_2W,*PDRIVER_INFO_2W,*LPDRIVER_INFO_2W;
+typedef struct _DRIVER_INFO_3A {
+ DWORD cVersion;
+ LPSTR pName;
+ LPSTR pEnvironment;
+ LPSTR pDriverPath;
+ LPSTR pDataFile;
+ LPSTR pConfigFile;
+ LPSTR pHelpFile;
+ LPSTR pDependentFiles;
+ LPSTR pMonitorName;
+ LPSTR pDefaultDataType;
+} DRIVER_INFO_3A,*PDRIVER_INFO_3A,*LPDRIVER_INFO_3A;
+typedef struct _DRIVER_INFO_3W {
+ DWORD cVersion;
+ LPWSTR pName;
+ LPWSTR pEnvironment;
+ LPWSTR pDriverPath;
+ LPWSTR pDataFile;
+ LPWSTR pConfigFile;
+ LPWSTR pHelpFile;
+ LPWSTR pDependentFiles;
+ LPWSTR pMonitorName;
+ LPWSTR pDefaultDataType;
+} DRIVER_INFO_3W,*PDRIVER_INFO_3W,*LPDRIVER_INFO_3W;
+typedef struct _MONITOR_INFO_1A{LPSTR pName;} MONITOR_INFO_1A,*PMONITOR_INFO_1A,*LPMONITOR_INFO_1A;
+typedef struct _MONITOR_INFO_1W{LPWSTR pName;} MONITOR_INFO_1W,*PMONITOR_INFO_1W,*LPMONITOR_INFO_1W;
+typedef struct _PORT_INFO_1A {LPSTR pName;} PORT_INFO_1A,*PPORT_INFO_1A,*LPPORT_INFO_1A;
+typedef struct _PORT_INFO_1W {LPWSTR pName;} PORT_INFO_1W,*PPORT_INFO_1W,*LPPORT_INFO_1W;
+typedef struct _MONITOR_INFO_2A{
+ LPSTR pName;
+ LPSTR pEnvironment;
+ LPSTR pDLLName;
+} MONITOR_INFO_2A,*PMONITOR_INFO_2A,*LPMONITOR_INFO_2A;
+typedef struct _MONITOR_INFO_2W{
+ LPWSTR pName;
+ LPWSTR pEnvironment;
+ LPWSTR pDLLName;
+} MONITOR_INFO_2W,*PMONITOR_INFO_2W,*LPMONITOR_INFO_2W;
+typedef struct _PORT_INFO_2A {
+ LPSTR pPortName;
+ LPSTR pMonitorName;
+ LPSTR pDescription;
+ DWORD fPortType;
+ DWORD Reserved;
+} PORT_INFO_2A,*PPORT_INFO_2A,*LPPORT_INFO_2A;
+typedef struct _PORT_INFO_2W {
+ LPWSTR pPortName;
+ LPWSTR pMonitorName;
+ LPWSTR pDescription;
+ DWORD fPortType;
+ DWORD Reserved;
+} PORT_INFO_2W,*PPORT_INFO_2W,*LPPORT_INFO_2W;
+typedef struct _PORT_INFO_3A {
+ DWORD dwStatus;
+ LPSTR pszStatus;
+ DWORD dwSeverity;
+} PORT_INFO_3A,*PPORT_INFO_3A,*LPPORT_INFO_3A;
+typedef struct _PORT_INFO_3W {
+ DWORD dwStatus;
+ LPWSTR pszStatus;
+ DWORD dwSeverity;
+} PORT_INFO_3W,*PPORT_INFO_3W,*LPPORT_INFO_3W;
+typedef struct _PRINTER_INFO_1A {
+ DWORD Flags;
+ LPSTR pDescription;
+ LPSTR pName;
+ LPSTR pComment;
+} PRINTER_INFO_1A,*PPRINTER_INFO_1A,*LPPRINTER_INFO_1A;
+typedef struct _PRINTER_INFO_1W {
+ DWORD Flags;
+ LPWSTR pDescription;
+ LPWSTR pName;
+ LPWSTR pComment;
+} PRINTER_INFO_1W,*PPRINTER_INFO_1W,*LPPRINTER_INFO_1W;
+typedef struct _PRINTER_INFO_2A {
+ LPSTR pServerName;
+ LPSTR pPrinterName;
+ LPSTR pShareName;
+ LPSTR pPortName;
+ LPSTR pDriverName;
+ LPSTR pComment;
+ LPSTR pLocation;
+ LPDEVMODEA pDevMode;
+ LPSTR pSepFile;
+ LPSTR pPrintProcessor;
+ LPSTR pDatatype;
+ LPSTR pParameters;
+ PSECURITY_DESCRIPTOR pSecurityDescriptor;
+ DWORD Attributes;
+ DWORD Priority;
+ DWORD DefaultPriority;
+ DWORD StartTime;
+ DWORD UntilTime;
+ DWORD Status;
+ DWORD cJobs;
+ DWORD AveragePPM;
+} PRINTER_INFO_2A,*PPRINTER_INFO_2A,*LPPRINTER_INFO_2A;
+typedef struct _PRINTER_INFO_2W {
+ LPWSTR pServerName;
+ LPWSTR pPrinterName;
+ LPWSTR pShareName;
+ LPWSTR pPortName;
+ LPWSTR pDriverName;
+ LPWSTR pComment;
+ LPWSTR pLocation;
+ LPDEVMODEW pDevMode;
+ LPWSTR pSepFile;
+ LPWSTR pPrintProcessor;
+ LPWSTR pDatatype;
+ LPWSTR pParameters;
+ PSECURITY_DESCRIPTOR pSecurityDescriptor;
+ DWORD Attributes;
+ DWORD Priority;
+ DWORD DefaultPriority;
+ DWORD StartTime;
+ DWORD UntilTime;
+ DWORD Status;
+ DWORD cJobs;
+ DWORD AveragePPM;
+} PRINTER_INFO_2W,*PPRINTER_INFO_2W,*LPPRINTER_INFO_2W;
+typedef struct _PRINTER_INFO_3 {
+ PSECURITY_DESCRIPTOR pSecurityDescriptor;
+} PRINTER_INFO_3,*PPRINTER_INFO_3,*LPPRINTER_INFO_3;
+typedef struct _PRINTER_INFO_4A {
+ LPSTR pPrinterName;
+ LPSTR pServerName;
+ DWORD Attributes;
+} PRINTER_INFO_4A,*PPRINTER_INFO_4A,*LPPRINTER_INFO_4A;
+typedef struct _PRINTER_INFO_4W {
+ LPWSTR pPrinterName;
+ LPWSTR pServerName;
+ DWORD Attributes;
+} PRINTER_INFO_4W,*PPRINTER_INFO_4W,*LPPRINTER_INFO_4W;
+typedef struct _PRINTER_INFO_5A {
+ LPSTR pPrinterName;
+ LPSTR pPortName;
+ DWORD Attributes;
+ DWORD DeviceNotSelectedTimeout;
+ DWORD TransmissionRetryTimeout;
+} PRINTER_INFO_5A,*PPRINTER_INFO_5A,*LPPRINTER_INFO_5A;
+typedef struct _PRINTER_INFO_5W {
+ LPWSTR pPrinterName;
+ LPWSTR pPortName;
+ DWORD Attributes;
+ DWORD DeviceNotSelectedTimeout;
+ DWORD TransmissionRetryTimeout;
+} PRINTER_INFO_5W,*PPRINTER_INFO_5W,*LPPRINTER_INFO_5W;
+typedef struct _PRINTPROCESSOR_INFO_1A {LPSTR pName;} PRINTPROCESSOR_INFO_1A,*PPRINTPROCESSOR_INFO_1A,*LPPRINTPROCESSOR_INFO_1A;
+typedef struct _PRINTPROCESSOR_INFO_1W {LPWSTR pName;} PRINTPROCESSOR_INFO_1W,*PPRINTPROCESSOR_INFO_1W,*LPPRINTPROCESSOR_INFO_1W;
+typedef struct _PRINTER_NOTIFY_INFO_DATA {
+ WORD Type;
+ WORD Field;
+ DWORD Reserved;
+ DWORD Id;
+ union {
+ DWORD adwData[2];
+ struct {
+ DWORD cbBuf;
+ PVOID pBuf;
+ } Data;
+ } NotifyData;
+} PRINTER_NOTIFY_INFO_DATA,*PPRINTER_NOTIFY_INFO_DATA,*LPPRINTER_NOTIFY_INFO_DATA;
+typedef struct _PRINTER_NOTIFY_INFO {
+ DWORD Version;
+ DWORD Flags;
+ DWORD Count;
+ PRINTER_NOTIFY_INFO_DATA aData[1];
+} PRINTER_NOTIFY_INFO,*PPRINTER_NOTIFY_INFO,*LPPRINTER_NOTIFY_INFO;
+typedef struct _FORM_INFO_1A {
+ DWORD Flags;
+ LPSTR pName;
+ SIZEL Size;
+ RECTL ImageableArea;
+} FORM_INFO_1A,*PFORM_INFO_1A,*LPFORM_INFO_1A;
+typedef struct _FORM_INFO_1W {
+ DWORD Flags;
+ LPWSTR pName;
+ SIZEL Size;
+ RECTL ImageableArea;
+} FORM_INFO_1W,*PFORM_INFO_1W,*LPFORM_INFO_1W;
+typedef struct _PRINTER_DEFAULTSA {
+ LPSTR pDatatype;
+ LPDEVMODE pDevMode;
+ ACCESS_MASK DesiredAccess;
+} PRINTER_DEFAULTSA,*PPRINTER_DEFAULTSA,*LPPRINTER_DEFAULTSA;
+typedef struct _PRINTER_DEFAULTSW {
+ LPWSTR pDatatype;
+ LPDEVMODE pDevMode;
+ ACCESS_MASK DesiredAccess;
+} PRINTER_DEFAULTSW,*PPRINTER_DEFAULTSW,*LPPRINTER_DEFAULTSW;
+
+BOOL WINAPI AbortPrinter(HANDLE);
+BOOL WINAPI AddFormA(HANDLE,DWORD,PBYTE);
+BOOL WINAPI AddFormW(HANDLE,DWORD,PBYTE);
+BOOL WINAPI AddJobA(HANDLE,DWORD,PBYTE,DWORD,PDWORD);
+BOOL WINAPI AddJobW(HANDLE,DWORD,PBYTE,DWORD,PDWORD);
+BOOL WINAPI AddMonitorA(LPSTR,DWORD,PBYTE);
+BOOL WINAPI AddMonitorW(LPWSTR,DWORD,PBYTE);
+BOOL WINAPI AddPortA(LPSTR,HWND,LPSTR);
+BOOL WINAPI AddPortW(LPWSTR,HWND,LPWSTR);
+HANDLE WINAPI AddPrinterA(LPSTR,DWORD,PBYTE);
+HANDLE WINAPI AddPrinterW(LPWSTR,DWORD,PBYTE);
+BOOL WINAPI AddPrinterConnectionA(LPSTR);
+BOOL WINAPI AddPrinterConnectionW(LPWSTR);
+BOOL WINAPI AddPrinterDriverA(LPSTR,DWORD,PBYTE);
+BOOL WINAPI AddPrinterDriverW(LPWSTR,DWORD,PBYTE);
+BOOL WINAPI AddPrintProcessorA(LPSTR,LPSTR,LPSTR,LPSTR);
+BOOL WINAPI AddPrintProcessorW(LPWSTR,LPWSTR,LPWSTR,LPWSTR);
+BOOL WINAPI AddPrintProvidorA(LPSTR,DWORD,PBYTE);
+BOOL WINAPI AddPrintProvidorW(LPWSTR,DWORD,PBYTE);
+LONG WINAPI AdvancedDocumentPropertiesA(HWND,HANDLE,LPSTR,PDEVMODE,PDEVMODEA);
+LONG WINAPI AdvancedDocumentPropertiesW(HWND,HANDLE,LPWSTR,PDEVMODE,PDEVMODEW);
+BOOL WINAPI ClosePrinter(HANDLE);
+BOOL WINAPI ConfigurePortA(LPSTR,HWND,LPSTR);
+BOOL WINAPI ConfigurePortW(LPWSTR,HWND,LPWSTR);
+HANDLE WINAPI ConnectToPrinterDlg(HWND,DWORD);
+BOOL WINAPI DeleteFormA(HANDLE,LPSTR);
+BOOL WINAPI DeleteFormW(HANDLE,LPWSTR);
+BOOL WINAPI DeleteMonitorA(LPSTR,LPSTR,LPSTR);
+BOOL WINAPI DeleteMonitorW(LPWSTR,LPWSTR,LPWSTR);
+BOOL WINAPI DeletePortA(LPSTR,HWND,LPSTR);
+BOOL WINAPI DeletePortW(LPWSTR,HWND,LPWSTR);
+BOOL WINAPI DeletePrinter(HANDLE);
+BOOL WINAPI DeletePrinterConnectionA(LPSTR);
+BOOL WINAPI DeletePrinterConnectionW(LPWSTR);
+DWORD WINAPI DeletePrinterDataA(HANDLE,LPSTR);
+DWORD WINAPI DeletePrinterDataW(HANDLE,LPWSTR);
+BOOL WINAPI DeletePrinterDriverA(LPSTR,LPSTR,LPSTR);
+BOOL WINAPI DeletePrinterDriverW(LPWSTR,LPWSTR,LPWSTR);
+BOOL WINAPI DeletePrintProcessorA(LPSTR,LPSTR,LPSTR);
+BOOL WINAPI DeletePrintProcessorW(LPWSTR,LPWSTR,LPWSTR);
+BOOL WINAPI DeletePrintProvidorA(LPSTR,LPSTR,LPSTR);
+BOOL WINAPI DeletePrintProvidorW(LPWSTR,LPWSTR,LPWSTR);
+LONG WINAPI DocumentPropertiesA(HWND,HANDLE,LPSTR,PDEVMODEA,PDEVMODEA,DWORD);
+LONG WINAPI DocumentPropertiesW(HWND,HANDLE,LPWSTR,PDEVMODEA,PDEVMODEA,DWORD);
+BOOL WINAPI EndDocPrinter(HANDLE);
+BOOL WINAPI EndPagePrinter(HANDLE);
+BOOL WINAPI EnumFormsA(HANDLE,DWORD,PBYTE,DWORD,PDWORD,PDWORD);
+BOOL WINAPI EnumFormsW(HANDLE,DWORD,PBYTE,DWORD,PDWORD,PDWORD);
+BOOL WINAPI EnumJobsA(HANDLE,DWORD,DWORD,DWORD,PBYTE,DWORD,PDWORD,PDWORD);
+BOOL WINAPI EnumJobsW(HANDLE,DWORD,DWORD,DWORD,PBYTE,DWORD,PDWORD,PDWORD);
+BOOL WINAPI EnumMonitorsA(LPSTR,DWORD,PBYTE,DWORD,PDWORD,PDWORD);
+BOOL WINAPI EnumMonitorsW(LPWSTR,DWORD,PBYTE,DWORD,PDWORD,PDWORD);
+BOOL WINAPI EnumPortsA(LPSTR,DWORD,PBYTE,DWORD,PDWORD,PDWORD);
+BOOL WINAPI EnumPortsW(LPWSTR,DWORD,PBYTE,DWORD,PDWORD,PDWORD);
+DWORD WINAPI EnumPrinterDataA(HANDLE,DWORD,LPSTR,DWORD,PDWORD,PDWORD,PBYTE,DWORD,PDWORD);
+DWORD WINAPI EnumPrinterDataW(HANDLE,DWORD,LPWSTR,DWORD,PDWORD,PDWORD,PBYTE,DWORD,PDWORD);
+BOOL WINAPI EnumPrinterDriversA(LPSTR,LPSTR,DWORD,PBYTE,DWORD,PDWORD,PDWORD);
+BOOL WINAPI EnumPrinterDriversW(LPWSTR,LPWSTR,DWORD,PBYTE,DWORD,PDWORD,PDWORD);
+BOOL WINAPI EnumPrintersA(DWORD,LPSTR,DWORD,PBYTE,DWORD,PDWORD,PDWORD);
+BOOL WINAPI EnumPrintersW(DWORD,LPWSTR,DWORD,PBYTE,DWORD,PDWORD,PDWORD);
+BOOL WINAPI EnumPrintProcessorDatatypesA(LPSTR,LPSTR,DWORD,PBYTE,DWORD,PDWORD,PDWORD);
+BOOL WINAPI EnumPrintProcessorDatatypesW(LPWSTR,LPWSTR,DWORD,PBYTE,DWORD,PDWORD,PDWORD);
+BOOL WINAPI EnumPrintProcessorsA(LPSTR,LPSTR,DWORD,PBYTE,DWORD,PDWORD,PDWORD);
+BOOL WINAPI EnumPrintProcessorsW(LPWSTR,LPWSTR,DWORD,PBYTE,DWORD,PDWORD,PDWORD);
+BOOL WINAPI FindClosePrinterChangeNotification(HANDLE);
+HANDLE WINAPI FindFirstPrinterChangeNotification(HANDLE,DWORD,DWORD,PVOID);
+HANDLE WINAPI FindNextPrinterChangeNotification(HANDLE,PDWORD,PVOID,PVOID*);
+BOOL WINAPI FreePrinterNotifyInfo(PPRINTER_NOTIFY_INFO);
+BOOL WINAPI GetFormA(HANDLE,LPSTR,DWORD,PBYTE,DWORD,PDWORD);
+BOOL WINAPI GetFormW(HANDLE,LPWSTR,DWORD,PBYTE,DWORD,PDWORD);
+BOOL WINAPI GetJobA(HANDLE,DWORD,DWORD,PBYTE,DWORD,PDWORD);
+BOOL WINAPI GetJobW(HANDLE,DWORD,DWORD,PBYTE,DWORD,PDWORD);
+BOOL WINAPI GetPrinterA(HANDLE,DWORD,PBYTE,DWORD,PDWORD);
+BOOL WINAPI GetPrinterW(HANDLE,DWORD,PBYTE,DWORD,PDWORD);
+DWORD WINAPI GetPrinterDataA(HANDLE,LPSTR,PDWORD,PBYTE,DWORD,PDWORD);
+DWORD WINAPI GetPrinterDataW(HANDLE,LPWSTR,PDWORD,PBYTE,DWORD,PDWORD);
+DWORD WINAPI GetPrinterDriverA(HANDLE,LPSTR,DWORD,PBYTE,DWORD,PDWORD);
+DWORD WINAPI GetPrinterDriverW(HANDLE,LPWSTR,DWORD,PBYTE,DWORD,PDWORD);
+DWORD WINAPI GetPrinterDriverDirectoryA(LPSTR,LPSTR,DWORD,PBYTE,DWORD,PDWORD);
+DWORD WINAPI GetPrinterDriverDirectoryW(LPWSTR,LPWSTR,DWORD,PBYTE,DWORD,PDWORD);
+DWORD WINAPI GetPrintProcessorDirectoryA(LPSTR,LPSTR,DWORD,PBYTE,DWORD,PDWORD);
+DWORD WINAPI GetPrintProcessorDirectoryW(LPWSTR,LPWSTR,DWORD,PBYTE,DWORD,PDWORD);
+BOOL WINAPI OpenPrinterA(LPSTR,PHANDLE,LPPRINTER_DEFAULTSA);
+BOOL WINAPI OpenPrinterW(LPWSTR,PHANDLE,LPPRINTER_DEFAULTSW);
+DWORD WINAPI PrinterMessageBoxA(HANDLE,DWORD,HWND,LPSTR,LPSTR,DWORD);
+DWORD WINAPI PrinterMessageBoxW(HANDLE,DWORD,HWND,LPWSTR,LPWSTR,DWORD);
+BOOL WINAPI PrinterProperties(HWND,HANDLE);
+BOOL WINAPI ReadPrinter(HANDLE,PVOID,DWORD,PDWORD);
+BOOL WINAPI ResetPrinterA(HANDLE,LPPRINTER_DEFAULTSA);
+BOOL WINAPI ResetPrinterW(HANDLE,LPPRINTER_DEFAULTSW);
+BOOL WINAPI ScheduleJob(HANDLE,DWORD);
+BOOL WINAPI SetFormA(HANDLE,LPSTR,DWORD,PBYTE);
+BOOL WINAPI SetFormW(HANDLE,LPWSTR,DWORD,PBYTE);
+BOOL WINAPI SetJobA(HANDLE,DWORD,DWORD,PBYTE,DWORD);
+BOOL WINAPI SetJobW(HANDLE,DWORD,DWORD,PBYTE,DWORD);
+BOOL WINAPI SetPrinterA(HANDLE,DWORD,PBYTE,DWORD);
+BOOL WINAPI SetPrinterW(HANDLE,DWORD,PBYTE,DWORD);
+BOOL WINAPI SetPrinterDataA(HANDLE,LPSTR,DWORD,PBYTE,DWORD);
+BOOL WINAPI SetPrinterDataW(HANDLE,LPWSTR,DWORD,PBYTE,DWORD);
+DWORD WINAPI StartDocPrinterA(HANDLE,DWORD,PBYTE);
+DWORD WINAPI StartDocPrinterW(HANDLE,DWORD,PBYTE);
+BOOL WINAPI StartPagePrinter(HANDLE);
+DWORD WINAPI WaitForPrinterChange(HANDLE,DWORD);
+BOOL WINAPI WritePrinter(HANDLE,PVOID,DWORD,PDWORD);
+
+#ifdef UNICODE
+typedef JOB_INFO_1W JOB_INFO_1,*PJOB_INFO_1,*LPJOB_INFO_1;
+typedef JOB_INFO_2W JOB_INFO_2,*PJOB_INFO_2,*LPJOB_INFO_2;
+typedef ADDJOB_INFO_1W ADDJOB_INFO_1,*PADDJOB_INFO_1,*LPADDJOB_INFO_1;
+typedef DATATYPES_INFO_1W DATATYPES_INFO_1,*PDATATYPES_INFO_1,*LPDATATYPES_INFO_1;
+typedef MONITOR_INFO_1W MONITOR_INFO_1,*PMONITOR_INFO_1,*LPMONITOR_INFO_1;
+typedef MONITOR_INFO_2W MONITOR_INFO_2,*PMONITOR_INFO_2,*LPMONITOR_INFO_2;
+typedef DOC_INFO_1W DOC_INFO_1,*PDOC_INFO_1,*LPDOC_INFO_1;
+typedef DOC_INFO_2W DOC_INFO_2,*PDOC_INFO_2,*LPDOC_INFO_2;
+typedef PORT_INFO_1W PORT_INFO_1,*PPORT_INFO_1,*LPPORT_INFO_1;
+typedef PORT_INFO_2W PORT_INFO_2,*PPORT_INFO_2,*LPPORT_INFO_2;
+typedef PORT_INFO_3W PORT_INFO_3,*PPORT_INFO_3,*LPPORT_INFO_3;
+typedef DRIVER_INFO_2W DRIVER_INFO_2,*PDRIVER_INFO_2,*LPDRIVER_INFO_2;
+typedef PRINTER_INFO_1W PRINTER_INFO_1,*PPRINTER_INFO_1,*LPPRINTER_INFO_1;
+typedef PRINTER_INFO_2W PRINTER_INFO_2,*PPRINTER_INFO_2,*LPPRINTER_INFO_2;
+typedef PRINTER_INFO_4W PRINTER_INFO_4,*PPRINTER_INFO_4,*LPPRINTER_INFO_4;
+typedef PRINTER_INFO_5W PRINTER_INFO_5,*PPRINTER_INFO_5,*LPPRINTER_INFO_5;
+typedef PRINTPROCESSOR_INFO_1W PRINTPROCESSOR_INFO_1,*PPRINTPROCESSOR_INFO_1,*LPPRINTPROCESSOR_INFO_1;
+typedef FORM_INFO_1W FORM_INFO_1,*PFORM_INFO_1,*LPFORM_INFO_1;
+typedef PRINTER_DEFAULTSW PRINTER_DEFAULTS,*PPRINTER_DEFAULTS,*LPPRINTER_DEFAULTS;
+#define AddForm AddFormW
+#define AddJob AddJobW
+#define AddMonitor AddMonitorW
+#define AddPort AddPortW
+#define AddPrinter AddPrinterW
+#define AddPrinterConnection AddPrinterConnectionW
+#define AddPrinterDriver AddPrinterDriverW
+#define AddPrintProcessor AddPrintProcessorW
+#define AddPrintProvidor AddPrintProvidorW
+#define AdvancedDocumentProperties AdvancedDocumentPropertiesW
+#define ConfigurePort ConfigurePortW
+#define DeleteForm DeleteFormW
+#define DeleteMonitor DeleteMonitorW
+#define DeletePort DeletePortW
+#define DeletePrinterConnection DeletePrinterConnectionW
+#define DeletePrinterData DeletePrinterDataW
+#define DeletePrinterDriver DeletePrinterDriverW
+#define DeletePrintProcessor DeletePrinterProcessorW
+#define DeletePrintProvidor DeletePrinterProvidorW
+#define DocumentProperties DocumentPropertiesW
+#define EnumForms EnumFormsW
+#define EnumJobs EnumJobsW
+#define EnumMonitors EnumMonitorsW
+#define EnumPorts EnumPortsW
+#define EnumPrinterData EnumPrinterDataW
+#define EnumPrinterDrivers EnumPrinterDriversW
+#define EnumPrinters EnumPrintersW
+#define EnumPrintProcessorDatatypes EnumPrintProcessorDatatypesW
+#define EnumPrintProcessors EnumPrintProcessorsW
+#define GetForm GetFormW
+#define GetJob GetJobW
+#define GetPrinter GetPrinterW
+#define GetPrinterData GetPrinterDataW
+#define GetPrinterDriver GetPrinterDriverW
+#define GetPrinterDriverDirectory GetPrinterDriverDirectoryW
+#define GetPrintProcessorDirectory GetPrintProcessorDirectoryW
+#define OpenPrinter OpenPrinterW
+#define PrinterMessageBox PrinterMessageBoxW
+#define ResetPrinter ResetPrinterW
+#define SetForm SetFormW
+#define SetJob SetJobW
+#define SetPrinter SetPrinterW
+#define SetPrinterData SetPrinterDataW
+#define StartDocPrinter StartDocPrinterW
+#else
+typedef JOB_INFO_1A JOB_INFO_1,*PJOB_INFO_1,*LPJOB_INFO_1;
+typedef JOB_INFO_2A JOB_INFO_2,*PJOB_INFO_2,*LPJOB_INFO_2;
+typedef ADDJOB_INFO_1A ADDJOB_INFO_1,*PADDJOB_INFO_1,*LPADDJOB_INFO_1;
+typedef DATATYPES_INFO_1A DATATYPES_INFO_1,*PDATATYPES_INFO_1,*LPDATATYPES_INFO_1;
+typedef MONITOR_INFO_1A MONITOR_INFO_1,*PMONITOR_INFO_1,*LPMONITOR_INFO_1;
+typedef MONITOR_INFO_2A MONITOR_INFO_2,*PMONITOR_INFO_2,*LPMONITOR_INFO_2;
+typedef DOC_INFO_1A DOC_INFO_1,*PDOC_INFO_1,*LPDOC_INFO_1;
+typedef DOC_INFO_2A DOC_INFO_2,*PDOC_INFO_2,*LPDOC_INFO_2;
+typedef PORT_INFO_1A PORT_INFO_1,*PPORT_INFO_1,*LPPORT_INFO_1;
+typedef PORT_INFO_2A PORT_INFO_2,*PPORT_INFO_2,*LPPORT_INFO_2;
+typedef PORT_INFO_3A PORT_INFO_3,*PPORT_INFO_3,*LPPORT_INFO_3;
+typedef DRIVER_INFO_2A DRIVER_INFO_2,*PDRIVER_INFO_2,*LPDRIVER_INFO_2;
+typedef PRINTER_INFO_1A PRINTER_INFO_1,*PPRINTER_INFO_1,*LPPRINTER_INFO_1;
+typedef PRINTER_INFO_2A PRINTER_INFO_2,*PPRINTER_INFO_2,*LPPRINTER_INFO_2;
+typedef PRINTER_INFO_4A PRINTER_INFO_4,*PPRINTER_INFO_4,*LPPRINTER_INFO_4;
+typedef PRINTER_INFO_5A PRINTER_INFO_5,*PPRINTER_INFO_5,*LPPRINTER_INFO_5;
+typedef PRINTPROCESSOR_INFO_1A PRINTPROCESSOR_INFO_1,*PPRINTPROCESSOR_INFO_1,*LPPRINTPROCESSOR_INFO_1;
+typedef FORM_INFO_1A FORM_INFO_1,*PFORM_INFO_1,*LPFORM_INFO_1;
+typedef PRINTER_DEFAULTSA PRINTER_DEFAULTS,*PPRINTER_DEFAULTS,*LPPRINTER_DEFAULTS;
+#define AddForm AddFormA
+#define AddJob AddJobA
+#define AddMonitor AddMonitorA
+#define AddPort AddPortA
+#define AddPrinter AddPrinterA
+#define AddPrinterConnection AddPrinterConnectionA
+#define AddPrinterDriver AddPrinterDriverA
+#define AddPrintProcessor AddPrintProcessorA
+#define AddPrintProvidor AddPrintProvidorA
+#define AdvancedDocumentProperties AdvancedDocumentPropertiesA
+#define ConfigurePort ConfigurePortA
+#define DeleteForm DeleteFormA
+#define DeleteMonitor DeleteMonitorA
+#define DeletePort DeletePortA
+#define DeletePrinterConnection DeletePrinterConnectionA
+#define DeletePrinterData DeletePrinterDataA
+#define DeletePrinterDriver DeletePrinterDriverA
+#define DeletePrintProcessor DeletePrinterProcessorA
+#define DeletePrintProvidor DeletePrinterProvidorA
+#define DocumentProperties DocumentPropertiesA
+#define EnumForms EnumFormsA
+#define EnumJobs EnumJobsA
+#define EnumMonitors EnumMonitorsA
+#define EnumPorts EnumPortsA
+#define EnumPrinterData EnumPrinterDataA
+#define EnumPrinterDrivers EnumPrinterDriversA
+#define EnumPrinters EnumPrintersA
+#define EnumPrintProcessorDatatypes EnumPrintProcessorDatatypesA
+#define EnumPrintProcessors EnumPrintProcessorsA
+#define GetForm GetFormA
+#define GetJob GetJobA
+#define GetPrinter GetPrinterA
+#define GetPrinterData GetPrinterDataA
+#define GetPrinterDriver GetPrinterDriverA
+#define GetPrinterDriverDirectory GetPrinterDriverDirectoryA
+#define GetPrintProcessorDirectory GetPrintProcessorDirectoryA
+#define OpenPrinter OpenPrinterA
+#define PrinterMessageBox PrinterMessageBoxA
+#define ResetPrinter ResetPrinterA
+#define SetForm SetFormA
+#define SetJob SetJobA
+#define SetPrinter SetPrinterA
+#define SetPrinterData SetPrinterDataA
+#define StartDocPrinter StartDocPrinterA
+#endif
+#endif /* RC_INVOKED */
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/winsup/w32api/include/winsvc.h b/winsup/w32api/include/winsvc.h
new file mode 100644
index 000000000..11b136145
--- /dev/null
+++ b/winsup/w32api/include/winsvc.h
@@ -0,0 +1,202 @@
+#ifndef _WINSVC_H
+#define _WINSVC_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+#define SERVICES_ACTIVE_DATABASEA "ServicesActive"
+#define SERVICES_ACTIVE_DATABASEW L"ServicesActive"
+#define SERVICES_FAILED_DATABASEA "ServicesFailed"
+#define SERVICES_FAILED_DATABASEW L"ServicesFailed"
+#define SC_GROUP_IDENTIFIERA '+'
+#define SC_GROUP_IDENTIFIERW L'+'
+#define SC_MANAGER_ALL_ACCESS 0xf003f
+#define SC_MANAGER_CONNECT 1
+#define SC_MANAGER_CREATE_SERVICE 2
+#define SC_MANAGER_ENUMERATE_SERVICE 4
+#define SC_MANAGER_LOCK 8
+#define SC_MANAGER_QUERY_LOCK_STATUS 16
+#define SC_MANAGER_MODIFY_BOOT_CONFIG 32
+#define SERVICE_NO_CHANGE (-1)
+#define SERVICE_STOPPED 1
+#define SERVICE_START_PENDING 2
+#define SERVICE_STOP_PENDING 3
+#define SERVICE_RUNNING 4
+#define SERVICE_CONTINUE_PENDING 5
+#define SERVICE_PAUSE_PENDING 6
+#define SERVICE_PAUSED 7
+#define SERVICE_ACCEPT_STOP 1
+#define SERVICE_ACCEPT_PAUSE_CONTINUE 2
+#define SERVICE_ACCEPT_SHUTDOWN 4
+#define SERVICE_CONTROL_STOP 1
+#define SERVICE_CONTROL_PAUSE 2
+#define SERVICE_CONTROL_CONTINUE 3
+#define SERVICE_CONTROL_INTERROGATE 4
+#define SERVICE_CONTROL_SHUTDOWN 5
+#define SERVICE_ACTIVE 1
+#define SERVICE_INACTIVE 2
+#define SERVICE_STATE_ALL 3
+#define SERVICE_QUERY_CONFIG 1
+#define SERVICE_CHANGE_CONFIG 2
+#define SERVICE_QUERY_STATUS 4
+#define SERVICE_ENUMERATE_DEPENDENTS 8
+#define SERVICE_START 16
+#define SERVICE_STOP 32
+#define SERVICE_PAUSE_CONTINUE 64
+#define SERVICE_INTERROGATE 128
+#define SERVICE_USER_DEFINED_CONTROL 256
+#define SERVICE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SERVICE_QUERY_CONFIG|SERVICE_CHANGE_CONFIG|SERVICE_QUERY_STATUS|SERVICE_ENUMERATE_DEPENDENTS|SERVICE_START|SERVICE_STOP|SERVICE_PAUSE_CONTINUE|SERVICE_INTERROGATE|SERVICE_USER_DEFINED_CONTROL)
+
+
+typedef struct _SERVICE_STATUS {
+ DWORD dwServiceType;
+ DWORD dwCurrentState;
+ DWORD dwControlsAccepted;
+ DWORD dwWin32ExitCode;
+ DWORD dwServiceSpecificExitCode;
+ DWORD dwCheckPoint;
+ DWORD dwWaitHint;
+} SERVICE_STATUS,*LPSERVICE_STATUS;
+typedef struct _ENUM_SERVICE_STATUSA {
+ LPSTR lpServiceName;
+ LPSTR lpDisplayName;
+ SERVICE_STATUS ServiceStatus;
+} ENUM_SERVICE_STATUSA,*LPENUM_SERVICE_STATUSA;
+typedef struct _ENUM_SERVICE_STATUSW {
+ LPWSTR lpServiceName;
+ LPWSTR lpDisplayName;
+ SERVICE_STATUS ServiceStatus;
+} ENUM_SERVICE_STATUSW,*LPENUM_SERVICE_STATUSW;
+typedef struct _QUERY_SERVICE_CONFIGA {
+ DWORD dwServiceType;
+ DWORD dwStartType;
+ DWORD dwErrorControl;
+ LPSTR lpBinaryPathName;
+ LPSTR lpLoadOrderGroup;
+ DWORD dwTagId;
+ LPSTR lpDependencies;
+ LPSTR lpServiceStartName;
+ LPSTR lpDisplayName;
+} QUERY_SERVICE_CONFIGA,*LPQUERY_SERVICE_CONFIGA;
+typedef struct _QUERY_SERVICE_CONFIGW {
+ DWORD dwServiceType;
+ DWORD dwStartType;
+ DWORD dwErrorControl;
+ LPWSTR lpBinaryPathName;
+ LPWSTR lpLoadOrderGroup;
+ DWORD dwTagId;
+ LPWSTR lpDependencies;
+ LPWSTR lpServiceStartName;
+ LPWSTR lpDisplayName;
+} QUERY_SERVICE_CONFIGW,*LPQUERY_SERVICE_CONFIGW;
+typedef struct _QUERY_SERVICE_LOCK_STATUSA {
+ DWORD fIsLocked;
+ LPSTR lpLockOwner;
+ DWORD dwLockDuration;
+} QUERY_SERVICE_LOCK_STATUSA,*LPQUERY_SERVICE_LOCK_STATUSA;
+typedef struct _QUERY_SERVICE_LOCK_STATUSW {
+ DWORD fIsLocked;
+ LPWSTR lpLockOwner;
+ DWORD dwLockDuration;
+} QUERY_SERVICE_LOCK_STATUSW,*LPQUERY_SERVICE_LOCK_STATUSW;
+typedef void (WINAPI *LPSERVICE_MAIN_FUNCTIONA)(DWORD,LPSTR*);
+typedef void (WINAPI *LPSERVICE_MAIN_FUNCTIONW)(DWORD,LPWSTR*);
+typedef struct _SERVICE_TABLE_ENTRYA {
+ LPSTR lpServiceName;
+ LPSERVICE_MAIN_FUNCTIONA lpServiceProc;
+} SERVICE_TABLE_ENTRYA,*LPSERVICE_TABLE_ENTRYA;
+typedef struct _SERVICE_TABLE_ENTRYW {
+ LPWSTR lpServiceName;
+ LPSERVICE_MAIN_FUNCTIONW lpServiceProc;
+} SERVICE_TABLE_ENTRYW,*LPSERVICE_TABLE_ENTRYW;
+DECLARE_HANDLE(SC_HANDLE);
+typedef SC_HANDLE *LPSC_HANDLE;
+typedef PVOID SC_LOCK;
+typedef DWORD SERVICE_STATUS_HANDLE;
+typedef VOID(WINAPI *LPHANDLER_FUNCTION)(DWORD);
+
+BOOL WINAPI ChangeServiceConfigA(SC_HANDLE,DWORD,DWORD,DWORD,LPCSTR,LPCSTR,LPDWORD,LPCSTR,LPCSTR,LPCSTR,LPCSTR);
+BOOL WINAPI ChangeServiceConfigW(SC_HANDLE,DWORD,DWORD,DWORD,LPCWSTR,LPCWSTR,LPDWORD,LPCWSTR,LPCWSTR,LPCWSTR,LPCWSTR);
+BOOL WINAPI CloseServiceHandle(SC_HANDLE);
+BOOL WINAPI ControlService(SC_HANDLE,DWORD,LPSERVICE_STATUS);
+SC_HANDLE WINAPI CreateServiceA(SC_HANDLE,LPCSTR,LPCSTR,DWORD,DWORD,DWORD,DWORD,LPCSTR,LPCSTR,PDWORD,LPCSTR,LPCSTR,LPCSTR);
+SC_HANDLE WINAPI CreateServiceW(SC_HANDLE,LPCWSTR,LPCWSTR,DWORD,DWORD,DWORD,DWORD,LPCWSTR,LPCWSTR,PDWORD,LPCWSTR,LPCWSTR,LPCWSTR);
+BOOL WINAPI DeleteService(SC_HANDLE);
+BOOL WINAPI EnumDependentServicesA(SC_HANDLE,DWORD,LPENUM_SERVICE_STATUSA,DWORD,PDWORD,PDWORD);
+BOOL WINAPI EnumDependentServicesW(SC_HANDLE,DWORD,LPENUM_SERVICE_STATUSW,DWORD,PDWORD,PDWORD);
+BOOL WINAPI EnumServicesStatusA(SC_HANDLE,DWORD,DWORD,LPENUM_SERVICE_STATUSA,DWORD,PDWORD,PDWORD,PDWORD);
+BOOL WINAPI EnumServicesStatusW(SC_HANDLE,DWORD,DWORD,LPENUM_SERVICE_STATUSW,DWORD,PDWORD,PDWORD,PDWORD);
+BOOL WINAPI GetServiceDisplayNameA(SC_HANDLE,LPCSTR,LPSTR,PDWORD);
+BOOL WINAPI GetServiceDisplayNameW(SC_HANDLE,LPCWSTR,LPWSTR,PDWORD);
+BOOL WINAPI GetServiceKeyNameA(SC_HANDLE,LPCSTR,LPSTR,PDWORD);
+BOOL WINAPI GetServiceKeyNameW(SC_HANDLE,LPCWSTR,LPWSTR,PDWORD);
+SC_LOCK WINAPI LockServiceDatabase(SC_HANDLE);
+BOOL WINAPI NotifyBootConfigStatus(BOOL);
+SC_HANDLE WINAPI OpenSCManagerA(LPCSTR,LPCSTR,DWORD);
+SC_HANDLE WINAPI OpenSCManagerW(LPCWSTR,LPCWSTR,DWORD);
+SC_HANDLE WINAPI OpenServiceA(SC_HANDLE,LPCSTR,DWORD);
+SC_HANDLE WINAPI OpenServiceW(SC_HANDLE,LPCWSTR,DWORD);
+BOOL WINAPI QueryServiceConfigA(SC_HANDLE,LPQUERY_SERVICE_CONFIGA,DWORD,PDWORD);
+BOOL WINAPI QueryServiceConfigW(SC_HANDLE,LPQUERY_SERVICE_CONFIGW,DWORD,PDWORD);
+BOOL WINAPI QueryServiceLockStatusA(SC_HANDLE,LPQUERY_SERVICE_LOCK_STATUSA,DWORD,PDWORD);
+BOOL WINAPI QueryServiceLockStatusW(SC_HANDLE,LPQUERY_SERVICE_LOCK_STATUSW,DWORD,PDWORD);
+BOOL WINAPI QueryServiceObjectSecurity(SC_HANDLE,SECURITY_INFORMATION,PSECURITY_DESCRIPTOR,DWORD,LPDWORD);
+BOOL WINAPI QueryServiceStatus(SC_HANDLE,LPSERVICE_STATUS);
+SERVICE_STATUS_HANDLE WINAPI RegisterServiceCtrlHandlerA(LPCSTR,LPHANDLER_FUNCTION);
+SERVICE_STATUS_HANDLE WINAPI RegisterServiceCtrlHandlerW(LPCWSTR,LPHANDLER_FUNCTION);
+BOOL WINAPI SetServiceObjectSecurity(SC_HANDLE,SECURITY_INFORMATION,PSECURITY_DESCRIPTOR);
+BOOL WINAPI SetServiceStatus(SERVICE_STATUS_HANDLE,LPSERVICE_STATUS);
+BOOL WINAPI StartServiceA(SC_HANDLE,DWORD,LPCSTR*);
+BOOL WINAPI StartServiceCtrlDispatcherA(LPSERVICE_TABLE_ENTRYA);
+BOOL WINAPI StartServiceCtrlDispatcherW(LPSERVICE_TABLE_ENTRYW);
+BOOL WINAPI StartServiceW(SC_HANDLE,DWORD,LPCWSTR);
+BOOL WINAPI UnlockServiceDatabase(SC_LOCK);
+
+#ifdef UNICODE
+typedef ENUM_SERVICE_STATUSW ENUM_SERVICE_STATUS,*LPENUM_SERVICE_STATUS;
+typedef QUERY_SERVICE_CONFIGW QUERY_SERVICE_CONFIG,*LPQUERY_SERVICE_CONFIG;
+typedef QUERY_SERVICE_LOCK_STATUSW QUERY_SERVICE_LOCK_STATUS,*LPQUERY_SERVICE_LOCK_STATUS;
+typedef SERVICE_TABLE_ENTRYW SERVICE_TABLE_ENTRY,*LPSERVICE_TABLE_ENTRY;
+typedef LPSERVICE_MAIN_FUNCTIONW LPSERVICE_MAIN_FUNCTION;
+#define SERVICES_ACTIVE_DATABASE SERVICES_ACTIVE_DATABASEW
+#define SERVICES_FAILED_DATABASE SERVICES_FAILED_DATABASEW
+#define SC_GROUP_IDENTIFIER SC_GROUP_IDENTIFIERW
+#define ChangeServiceConfig ChangeServiceConfigW
+#define CreateService CreateServiceW
+#define EnumDependentServices EnumDependentServicesW
+#define EnumServicesStatus EnumServicesStatusW
+#define GetServiceDisplayName GetServiceDisplayNameW
+#define GetServiceKeyName GetServiceKeyNameW
+#define OpenSCManager OpenSCManagerW
+#define OpenService OpenServiceW
+#define QueryServiceConfig QueryServiceConfigW
+#define QueryServiceLockStatus QueryServiceLockStatusW
+#define RegisterServiceCtrlHandler RegisterServiceCtrlHandlerW
+#define StartService StartServiceW
+#define StartServiceCtrlDispatcher StartServiceCtrlDispatcherW
+#else
+typedef ENUM_SERVICE_STATUSA ENUM_SERVICE_STATUS,*LPENUM_SERVICE_STATUS;
+typedef QUERY_SERVICE_CONFIGA QUERY_SERVICE_CONFIG,*LPQUERY_SERVICE_CONFIG;
+typedef QUERY_SERVICE_LOCK_STATUSA QUERY_SERVICE_LOCK_STATUS,*LPQUERY_SERVICE_LOCK_STATUS;
+typedef SERVICE_TABLE_ENTRYA SERVICE_TABLE_ENTRY,*LPSERVICE_TABLE_ENTRY;
+typedef LPSERVICE_MAIN_FUNCTIONA LPSERVICE_MAIN_FUNCTION;
+#define SERVICES_ACTIVE_DATABASE SERVICES_ACTIVE_DATABASEA
+#define SERVICES_FAILED_DATABASE SERVICES_FAILED_DATABASEA
+#define SC_GROUP_IDENTIFIER SC_GROUP_IDENTIFIERA
+#define ChangeServiceConfig ChangeServiceConfigA
+#define CreateService CreateServiceA
+#define EnumDependentServices EnumDependentServicesA
+#define EnumServicesStatus EnumServicesStatusA
+#define GetServiceDisplayName GetServiceDisplayNameA
+#define GetServiceKeyName GetServiceKeyNameA
+#define OpenSCManager OpenSCManagerA
+#define OpenService OpenServiceA
+#define QueryServiceConfig QueryServiceConfigA
+#define QueryServiceLockStatus QueryServiceLockStatusA
+#define RegisterServiceCtrlHandler RegisterServiceCtrlHandlerA
+#define StartService StartServiceA
+#define StartServiceCtrlDispatcher StartServiceCtrlDispatcherA
+#endif
+#ifdef __cplusplus
+}
+#endif
+#endif /* _WINSVC_H */
diff --git a/winsup/w32api/include/winuser.h b/winsup/w32api/include/winuser.h
new file mode 100644
index 000000000..8c2fe7d41
--- /dev/null
+++ b/winsup/w32api/include/winuser.h
@@ -0,0 +1,3236 @@
+#ifndef _WINUSER_H
+#define _WINUSER_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+#define WC_DIALOG MAKEINTATOM(0x8002)
+#define FALT 16
+#define FCONTROL 8
+#define FNOINVERT 2
+#define FSHIFT 4
+#define FVIRTKEY 1
+#define ATF_TIMEOUTON 1
+#define ATF_ONOFFFEEDBACK 2
+#define WH_MIN (-1)
+#define WH_MSGFILTER (-1)
+#define WH_JOURNALRECORD 0
+#define WH_JOURNALPLAYBACK 1
+#define WH_KEYBOARD 2
+#define WH_GETMESSAGE 3
+#define WH_CALLWNDPROC 4
+#define WH_CBT 5
+#define WH_SYSMSGFILTER 6
+#define WH_MOUSE 7
+#define WH_HARDWARE 8
+#define WH_DEBUG 9
+#define WH_SHELL 10
+#define WH_FOREGROUNDIDLE 11
+#define WH_CALLWNDPROCRET 12
+#define WH_KEYBOARD_LL 13
+#define WH_MOUSE_LL 14
+#define WH_MAX 14
+#define WH_MINHOOK WH_MIN
+#define WH_MAXHOOK WH_MAX
+#define HC_ACTION 0
+#define HC_GETNEXT 1
+#define HC_SKIP 2
+#define HC_NOREMOVE 3
+#define HC_NOREM 3
+#define HC_SYSMODALON 4
+#define HC_SYSMODALOFF 5
+#define HCBT_MOVESIZE 0
+#define HCBT_MINMAX 1
+#define HCBT_QS 2
+#define HCBT_CREATEWND 3
+#define HCBT_DESTROYWND 4
+#define HCBT_ACTIVATE 5
+#define HCBT_CLICKSKIPPED 6
+#define HCBT_KEYSKIPPED 7
+#define HCBT_SYSCOMMAND 8
+#define HCBT_SETFOCUS 9
+#define CF_TEXT 1
+#define CF_BITMAP 2
+#define CF_METAFILEPICT 3
+#define CF_SYLK 4
+#define CF_DIF 5
+#define CF_TIFF 6
+#define CF_OEMTEXT 7
+#define CF_DIB 8
+#define CF_PALETTE 9
+#define CF_PENDATA 10
+#define CF_RIFF 11
+#define CF_WAVE 12
+#define CF_UNICODETEXT 13
+#define CF_ENHMETAFILE 14
+#define CF_HDROP 15
+#define CF_LOCALE 16
+#define CF_MAX 17
+#define CF_OWNERDISPLAY 128
+#define CF_DSPTEXT 129
+#define CF_DSPBITMAP 130
+#define CF_DSPMETAFILEPICT 131
+#define CF_DSPENHMETAFILE 142
+#define CF_PRIVATEFIRST 512
+#define CF_PRIVATELAST 767
+#define CF_GDIOBJFIRST 768
+#define CF_GDIOBJLAST 1023
+#define HKL_NEXT 1
+#define HKL_PREV 0
+#define KLF_ACTIVATE 1
+#define KLF_SUBSTITUTE_OK 2
+#define KLF_UNLOADPREVIOUS 4
+#define KLF_REORDER 8
+#define KLF_REPLACELANG 16
+#define KLF_NOTELLSHELL 128
+#define KLF_SETFORPROCESS 256
+#define KL_NAMELENGTH 9
+#define MF_ENABLED 0
+#define MF_GRAYED 1
+#define MF_DISABLED 2
+#define MF_BITMAP 4
+#define MF_CHECKED 8
+#define MF_MENUBARBREAK 32
+#define MF_MENUBREAK 64
+#define MF_OWNERDRAW 256
+#define MF_POPUP 16
+#define MF_SEPARATOR 0x800
+#define MF_STRING 0
+#define MF_UNCHECKED 0
+#define MF_DEFAULT 4096
+#define MF_SYSMENU 0x2000
+#define MF_HELP 0x4000
+#define MF_END 128
+#define MF_RIGHTJUSTIFY 0x4000
+#define MF_MOUSESELECT 0x8000
+#define MF_INSERT 0
+#define MF_CHANGE 128
+#define MF_APPEND 256
+#define MF_DELETE 512
+#define MF_REMOVE 4096
+#define MF_USECHECKBITMAPS 512
+#define MF_UNHILITE 0
+#define MF_HILITE 128
+#define BSF_IGNORECURRENTTASK 2
+#define BSF_QUERY 1
+#define BSF_FLUSHDISK 4
+#define BSF_NOHANG 8
+#define BSF_POSTMESSAGE 16
+#define BSF_FORCEIFHUNG 32
+#define BSF_NOTIMEOUTIFNOTHUNG 64
+#define BSM_ALLCOMPONENTS 0
+#define BSM_APPLICATIONS 8
+#define BSM_ALLDESKTOPS 16
+#define BSM_INSTALLABLEDRIVERS 4
+#define BSM_NETDRIVER 2
+#define BSM_VXDS 1
+#define BROADCAST_QUERY_DENY 1112363332
+#define DM_BITSPERPEL 0x40000
+#define DM_PELSWIDTH 0x80000
+#define DM_PELSHEIGHT 0x100000
+#define DM_DISPLAYFLAGS 0x200000
+#define DM_DISPLAYFREQUENCY 0x400000
+#define CDS_UPDATEREGISTRY 1
+#define CDS_TEST 2
+#define CDS_FULLSCREEN 4
+#define CDS_GLOBAL 8
+#define CDS_SET_PRIMARY 16
+#define CDS_RESET 0x40000000
+#define CDS_SETRECT 0x20000000
+#define CDS_NORESET 0x10000000
+#define DISP_CHANGE_SUCCESSFUL 0
+#define DISP_CHANGE_RESTART 1
+#define DISP_CHANGE_BADFLAGS (-4)
+#define DISP_CHANGE_BADPARAM (-5)
+#define DISP_CHANGE_FAILED (-1)
+#define DISP_CHANGE_BADMODE (-2)
+#define DISP_CHANGE_NOTUPDATED (-3)
+#define BST_CHECKED 1
+#define BST_INDETERMINATE 2
+#define BST_UNCHECKED 0
+#define BST_FOCUS 8
+#define BST_PUSHED 4
+#define MF_BYCOMMAND 0
+#define MF_BYPOSITION 1024
+#define MF_UNCHECKED 0
+#define MF_HILITE 128
+#define MF_UNHILITE 0
+#define CWP_ALL 0
+#define CWP_SKIPINVISIBLE 1
+#define CWP_SKIPDISABLED 2
+#define CWP_SKIPTRANSPARENT 4
+#define IMAGE_BITMAP 0
+#define IMAGE_ICON 1
+#define IMAGE_CURSOR 2
+#define IMAGE_ENHMETAFILE 3
+#define DF_ALLOWOTHERACCOUNTHOOK 1
+#define DESKTOP_CREATEMENU 4
+#define DESKTOP_CREATEWINDOW 2
+#define DESKTOP_ENUMERATE 64
+#define DESKTOP_HOOKCONTROL 8
+#define DESKTOP_JOURNALPLAYBACK 32
+#define DESKTOP_JOURNALRECORD 16
+#define DESKTOP_READOBJECTS 1
+#define DESKTOP_SWITCHDESKTOP 256
+#define DESKTOP_WRITEOBJECTS 128
+#define CW_USEDEFAULT 0x80000000
+#define WS_BORDER 0x800000
+#define WS_CAPTION 0xc00000
+#define WS_CHILD 0x40000000
+#define WS_CHILDWINDOW 0x40000000
+#define WS_CLIPCHILDREN 0x2000000
+#define WS_CLIPSIBLINGS 0x4000000
+#define WS_DISABLED 0x8000000
+#define WS_DLGFRAME 0x400000
+#define WS_GROUP 0x20000
+#define WS_HSCROLL 0x100000
+#define WS_ICONIC 0x20000000
+#define WS_MAXIMIZE 0x1000000
+#define WS_MAXIMIZEBOX 0x10000
+#define WS_MINIMIZE 0x20000000
+#define WS_MINIMIZEBOX 0x20000
+#define WS_OVERLAPPED 0
+#define WS_OVERLAPPEDWINDOW 0xcf0000
+#define WS_POPUP 0x80000000
+#define WS_POPUPWINDOW 0x80880000
+#define WS_SIZEBOX 0x40000
+#define WS_SYSMENU 0x80000
+#define WS_TABSTOP 0x10000
+#define WS_THICKFRAME 0x40000
+#define WS_TILED 0
+#define WS_TILEDWINDOW 0xcf0000
+#define WS_VISIBLE 0x10000000
+#define WS_VSCROLL 0x200000
+#define MDIS_ALLCHILDSTYLES 1
+#define BS_3STATE 5
+#define BS_AUTO3STATE 6
+#define BS_AUTOCHECKBOX 3
+#define BS_AUTORADIOBUTTON 9
+#define BS_BITMAP 128
+#define BS_BOTTOM 0x800
+#define BS_CENTER 0x300
+#define BS_CHECKBOX 2
+#define BS_DEFPUSHBUTTON 1
+#define BS_GROUPBOX 7
+#define BS_ICON 64
+#define BS_LEFT 256
+#define BS_LEFTTEXT 32
+#define BS_MULTILINE 0x2000
+#define BS_NOTIFY 0x4000
+#define BS_OWNERDRAW 0xb
+#define BS_PUSHBUTTON 0
+#define BS_PUSHLIKE 4096
+#define BS_RADIOBUTTON 4
+#define BS_RIGHT 512
+#define BS_RIGHTBUTTON 32
+#define BS_TEXT 0
+#define BS_TOP 0x400
+#define BS_USERBUTTON 8
+#define BS_VCENTER 0xc00
+#define BS_FLAT 0x8000
+#define CBS_AUTOHSCROLL 64
+#define CBS_DISABLENOSCROLL 0x800
+#define CBS_DROPDOWN 2
+#define CBS_DROPDOWNLIST 3
+#define CBS_HASSTRINGS 512
+#define CBS_LOWERCASE 0x4000
+#define CBS_NOINTEGRALHEIGHT 0x400
+#define CBS_OEMCONVERT 128
+#define CBS_OWNERDRAWFIXED 16
+#define CBS_OWNERDRAWVARIABLE 32
+#define CBS_SIMPLE 1
+#define CBS_SORT 256
+#define CBS_UPPERCASE 0x2000
+#define ES_AUTOHSCROLL 128
+#define ES_AUTOVSCROLL 64
+#define ES_CENTER 1
+#define ES_LEFT 0
+#define ES_LOWERCASE 16
+#define ES_MULTILINE 4
+#define ES_NOHIDESEL 256
+#define ES_NUMBER 0x2000
+#define ES_OEMCONVERT 0x400
+#define ES_PASSWORD 32
+#define ES_READONLY 0x800
+#define ES_RIGHT 2
+#define ES_UPPERCASE 8
+#define ES_WANTRETURN 4096
+#define LBS_DISABLENOSCROLL 4096
+#define LBS_EXTENDEDSEL 0x800
+#define LBS_HASSTRINGS 64
+#define LBS_MULTICOLUMN 512
+#define LBS_MULTIPLESEL 8
+#define LBS_NODATA 0x2000
+#define LBS_NOINTEGRALHEIGHT 256
+#define LBS_NOREDRAW 4
+#define LBS_NOSEL 0x4000
+#define LBS_NOTIFY 1
+#define LBS_OWNERDRAWFIXED 16
+#define LBS_OWNERDRAWVARIABLE 32
+#define LBS_SORT 2
+#define LBS_STANDARD 0xa00003
+#define LBS_USETABSTOPS 128
+#define LBS_WANTKEYBOARDINPUT 0x400
+#define SBS_BOTTOMALIGN 4
+#define SBS_HORZ 0
+#define SBS_LEFTALIGN 2
+#define SBS_RIGHTALIGN 4
+#define SBS_SIZEBOX 8
+#define SBS_SIZEBOXBOTTOMRIGHTALIGN 4
+#define SBS_SIZEBOXTOPLEFTALIGN 2
+#define SBS_SIZEGRIP 16
+#define SBS_TOPALIGN 2
+#define SBS_VERT 1
+#define SS_BITMAP 14
+#define SS_BLACKFRAME 7
+#define SS_BLACKRECT 4
+#define SS_CENTER 1
+#define SS_CENTERIMAGE 512
+#define SS_ENHMETAFILE 15
+#define SS_ETCHEDFRAME 18
+#define SS_ETCHEDHORZ 16
+#define SS_ETCHEDVERT 17
+#define SS_GRAYFRAME 8
+#define SS_GRAYRECT 5
+#define SS_ICON 3
+#define SS_LEFT 0
+#define SS_LEFTNOWORDWRAP 0xc
+#define SS_NOPREFIX 128
+#define SS_NOTIFY 256
+#define SS_OWNERDRAW 0xd
+#define SS_REALSIZEIMAGE 0x800
+#define SS_RIGHT 2
+#define SS_RIGHTJUST 0x400
+#define SS_SIMPLE 11
+#define SS_SUNKEN 4096
+#define SS_WHITEFRAME 9
+#define SS_WHITERECT 6
+#define SS_USERITEM 10
+#define DS_3DLOOK 4
+#define DS_ABSALIGN 1
+#define DS_CENTER 0x800
+#define DS_CENTERMOUSE 4096
+#define DS_CONTEXTHELP 0x2000
+#define DS_CONTROL 0x400
+#define DS_FIXEDSYS 8
+#define DS_LOCALEDIT 32
+#define DS_MODALFRAME 128
+#define DS_NOFAILCREATE 16
+#define DS_NOIDLEMSG 256
+#define DS_SETFONT 64
+#define DS_SETFOREGROUND 512
+#define DS_SYSMODAL 2
+#define WS_EX_ACCEPTFILES 16
+#define WS_EX_APPWINDOW 0x40000
+#define WS_EX_CLIENTEDGE 512
+#define WS_EX_CONTEXTHELP 0x400
+#define WS_EX_CONTROLPARENT 0x10000
+#define WS_EX_DLGMODALFRAME 1
+#define WS_EX_LEFT 0
+#define WS_EX_LEFTSCROLLBAR 0x4000
+#define WS_EX_LTRREADING 0
+#define WS_EX_MDICHILD 64
+#define WS_EX_NOPARENTNOTIFY 4
+#define WS_EX_OVERLAPPEDWINDOW 0x300
+#define WS_EX_PALETTEWINDOW 0x188
+#define WS_EX_RIGHT 0x1000
+#define WS_EX_RIGHTSCROLLBAR 0
+#define WS_EX_RTLREADING 0x2000
+#define WS_EX_STATICEDGE 0x20000
+#define WS_EX_TOOLWINDOW 128
+#define WS_EX_TOPMOST 8
+#define WS_EX_TRANSPARENT 32
+#define WS_EX_WINDOWEDGE 256
+#define WINSTA_ACCESSCLIPBOARD 4
+#define WINSTA_ACCESSGLOBALATOMS 32
+#define WINSTA_CREATEDESKTOP 8
+#define WINSTA_ENUMDESKTOPS 1
+#define WINSTA_ENUMERATE 256
+#define WINSTA_EXITWINDOWS 64
+#define WINSTA_READATTRIBUTES 2
+#define WINSTA_READSCREEN 512
+#define WINSTA_WRITEATTRIBUTES 16
+#define DDL_READWRITE 0
+#define DDL_READONLY 1
+#define DDL_HIDDEN 2
+#define DDL_SYSTEM 4
+#define DDL_DIRECTORY 16
+#define DDL_ARCHIVE 32
+#define DDL_POSTMSGS 8192
+#define DDL_DRIVES 16384
+#define DDL_EXCLUSIVE 32768
+#define DC_ACTIVE 1
+#define DC_SMALLCAP 2
+#define DC_ICON 4
+#define DC_TEXT 8
+#define DC_INBUTTON 16
+#define DC_CAPTION (DC_ICON|DC_TEXT|DC_BUTTONS)
+#define DC_NC (DC_CAPTION|DC_FRAME)
+#define BDR_RAISEDOUTER 1
+#define BDR_SUNKENOUTER 2
+#define BDR_RAISEDINNER 4
+#define BDR_SUNKENINNER 8
+#define BDR_OUTER 3
+#define BDR_INNER 0xc
+#define BDR_RAISED 5
+#define BDR_SUNKEN 10
+#define EDGE_RAISED (BDR_RAISEDOUTER|BDR_RAISEDINNER)
+#define EDGE_SUNKEN (BDR_SUNKENOUTER|BDR_SUNKENINNER)
+#define EDGE_ETCHED (BDR_SUNKENOUTER|BDR_RAISEDINNER)
+#define EDGE_BUMP (BDR_RAISEDOUTER|BDR_SUNKENINNER)
+#define BF_LEFT 1
+#define BF_TOP 2
+#define BF_RIGHT 4
+#define BF_BOTTOM 8
+#define BF_TOPLEFT (BF_TOP|BF_LEFT)
+#define BF_TOPRIGHT (BF_TOP|BF_RIGHT)
+#define BF_BOTTOMLEFT (BF_BOTTOM|BF_LEFT)
+#define BF_BOTTOMRIGHT (BF_BOTTOM|BF_RIGHT)
+#define BF_RECT (BF_LEFT|BF_TOP|BF_RIGHT|BF_BOTTOM)
+#define BF_DIAGONAL 16
+#define BF_DIAGONAL_ENDTOPRIGHT (BF_DIAGONAL|BF_TOP|BF_RIGHT)
+#define BF_DIAGONAL_ENDTOPLEFT (BF_DIAGONAL|BF_TOP|BF_LEFT)
+#define BF_DIAGONAL_ENDBOTTOMLEFT (BF_DIAGONAL|BF_BOTTOM|BF_LEFT)
+#define BF_DIAGONAL_ENDBOTTOMRIGHT (BF_DIAGONAL|BF_BOTTOM|BF_RIGHT)
+#define BF_MIDDLE 0x800
+#define BF_SOFT 0x1000
+#define BF_ADJUST 0x2000
+#define BF_FLAT 0x4000
+#define BF_MONO 0x8000
+#define DFC_CAPTION 1
+#define DFC_MENU 2
+#define DFC_SCROLL 3
+#define DFC_BUTTON 4
+#define DFCS_CAPTIONCLOSE 0
+#define DFCS_CAPTIONMIN 1
+#define DFCS_CAPTIONMAX 2
+#define DFCS_CAPTIONRESTORE 3
+#define DFCS_CAPTIONHELP 4
+#define DFCS_MENUARROW 0
+#define DFCS_MENUCHECK 1
+#define DFCS_MENUBULLET 2
+#define DFCS_MENUARROWRIGHT 4
+#define DFCS_SCROLLUP 0
+#define DFCS_SCROLLDOWN 1
+#define DFCS_SCROLLLEFT 2
+#define DFCS_SCROLLRIGHT 3
+#define DFCS_SCROLLCOMBOBOX 5
+#define DFCS_SCROLLSIZEGRIP 8
+#define DFCS_SCROLLSIZEGRIPRIGHT 16
+#define DFCS_BUTTONCHECK 0
+#define DFCS_BUTTONRADIOIMAGE 1
+#define DFCS_BUTTONRADIOMASK 2
+#define DFCS_BUTTONRADIO 4
+#define DFCS_BUTTON3STATE 8
+#define DFCS_BUTTONPUSH 16
+#define DFCS_INACTIVE 256
+#define DFCS_PUSHED 512
+#define DFCS_CHECKED 1024
+#define DFCS_ADJUSTRECT 0x2000
+#define DFCS_FLAT 0x4000
+#define DFCS_MONO 0x8000
+#define DST_COMPLEX 0
+#define DST_TEXT 1
+#define DST_PREFIXTEXT 2
+#define DST_ICON 3
+#define DST_BITMAP 4
+#define DSS_NORMAL 0
+#define DSS_UNION 16
+#define DSS_DISABLED 32
+#define DSS_MONO 128
+#define DSS_RIGHT 0x8000
+#define DT_BOTTOM 8
+#define DT_CALCRECT 1024
+#define DT_CENTER 1
+#define DT_EDITCONTROL 8192
+#define DT_END_ELLIPSIS 32768
+#define DT_PATH_ELLIPSIS 16384
+#define DT_WORD_ELLIPSIS 0x40000
+#define DT_EXPANDTABS 64
+#define DT_EXTERNALLEADING 512
+#define DT_LEFT 0
+#define DT_MODIFYSTRING 65536
+#define DT_NOCLIP 256
+#define DT_NOPREFIX 2048
+#define DT_RIGHT 2
+#define DT_RTLREADING 131072
+#define DT_SINGLELINE 32
+#define DT_TABSTOP 128
+#define DT_TOP 0
+#define DT_VCENTER 4
+#define DT_WORDBREAK 16
+#define DT_INTERNAL 4096
+#define WB_ISDELIMITER 2
+#define WB_LEFT 0
+#define WB_RIGHT 1
+#define SB_HORZ 0
+#define SB_VERT 1
+#define SB_CTL 2
+#define SB_BOTH 3
+#define ESB_DISABLE_BOTH 3
+#define ESB_DISABLE_DOWN 2
+#define ESB_DISABLE_LEFT 1
+#define ESB_DISABLE_LTUP 1
+#define ESB_DISABLE_RIGHT 2
+#define ESB_DISABLE_RTDN 2
+#define ESB_DISABLE_UP 1
+#define ESB_ENABLE_BOTH 0
+#define SB_LINEUP 0
+#define SB_LINEDOWN 1
+#define SB_LINELEFT 0
+#define SB_LINERIGHT 1
+#define SB_PAGEUP 2
+#define SB_PAGEDOWN 3
+#define SB_PAGELEFT 2
+#define SB_PAGERIGHT 3
+#define SB_THUMBPOSITION 4
+#define SB_THUMBTRACK 5
+#define SB_ENDSCROLL 8
+#define SB_LEFT 6
+#define SB_RIGHT 7
+#define SB_BOTTOM 7
+#define SB_TOP 6
+#define MAKEINTRESOURCEA(i) (LPSTR)((DWORD)((WORD)(i)))
+#define MAKEINTRESOURCEW(i) (LPWSTR)((DWORD)((WORD)(i)))
+#define RT_CURSOR MAKEINTRESOURCE(1)
+#define RT_BITMAP MAKEINTRESOURCE(2)
+#define RT_ICON MAKEINTRESOURCE(3)
+#define RT_MENU MAKEINTRESOURCE(4)
+#define RT_DIALOG MAKEINTRESOURCE(5)
+#define RT_STRING MAKEINTRESOURCE(6)
+#define RT_FONTDIR MAKEINTRESOURCE(7)
+#define RT_FONT MAKEINTRESOURCE(8)
+#define RT_ACCELERATOR MAKEINTRESOURCE(9)
+#define RT_RCDATA MAKEINTRESOURCE(10)
+#define RT_MESSAGETABLE MAKEINTRESOURCE(11)
+#define DIFFERENCE 11
+#define RT_GROUP_CURSOR MAKEINTRESOURCE((DWORD)RT_CURSOR+DIFFERENCE)
+#define RT_GROUP_ICON MAKEINTRESOURCE((DWORD)RT_ICON+DIFFERENCE)
+#define RT_VERSION MAKEINTRESOURCE(16)
+#define RT_DLGINCLUDE MAKEINTRESOURCE(17)
+#define RT_PLUGPLAY MAKEINTRESOURCE(19)
+#define RT_VXD MAKEINTRESOURCE(20)
+#define RT_ANICURSOR MAKEINTRESOURCE(21)
+#define RT_ANIICON MAKEINTRESOURCE(22)
+#define RT_HTML MAKEINTRESOURCE(23)
+#define EWX_FORCE 4
+#define EWX_LOGOFF 0
+#define EWX_POWEROFF 8
+#define EWX_REBOOT 2
+#define EWX_SHUTDOWN 1
+#define CS_BYTEALIGNCLIENT 4096
+#define CS_BYTEALIGNWINDOW 8192
+#define CS_KEYCVTWINDOW 4
+#define CS_NOKEYCVT 256
+#define CS_CLASSDC 64
+#define CS_DBLCLKS 8
+#define CS_GLOBALCLASS 16384
+#define CS_HREDRAW 2
+#define CS_NOCLOSE 512
+#define CS_OWNDC 32
+#define CS_PARENTDC 128
+#define CS_SAVEBITS 2048
+#define CS_VREDRAW 1
+#define CS_IME 0x10000
+#define GCW_ATOM (-32)
+#define GCL_CBCLSEXTRA (-20)
+#define GCL_CBWNDEXTRA (-18)
+#define GCL_HBRBACKGROUND (-10)
+#define GCL_HCURSOR (-12)
+#define GCL_HICON (-14)
+#define GCL_HICONSM (-34)
+#define GCL_HMODULE (-16)
+#define GCL_MENUNAME (-8)
+#define GCL_STYLE (-26)
+#define GCL_WNDPROC (-24)
+#define IDC_ARROW MAKEINTRESOURCE(32512)
+#define IDC_IBEAM MAKEINTRESOURCE(32513)
+#define IDC_WAIT MAKEINTRESOURCE(32514)
+#define IDC_CROSS MAKEINTRESOURCE(32515)
+#define IDC_UPARROW MAKEINTRESOURCE(32516)
+#define IDC_SIZENWSE MAKEINTRESOURCE(32642)
+#define IDC_SIZENESW MAKEINTRESOURCE(32643)
+#define IDC_SIZEWE MAKEINTRESOURCE(32644)
+#define IDC_SIZENS MAKEINTRESOURCE(32645)
+#define IDC_SIZEALL MAKEINTRESOURCE(32646)
+#define IDC_NO MAKEINTRESOURCE(32648)
+#define IDC_APPSTARTING MAKEINTRESOURCE(32650)
+#define IDC_HELP MAKEINTRESOURCE(32651)
+#define IDC_ICON MAKEINTRESOURCE(32641)
+#define IDC_SIZE MAKEINTRESOURCE(32640)
+#ifndef RC_INVOKED
+#define IDI_APPLICATION MAKEINTRESOURCE(32512)
+#define IDI_HAND MAKEINTRESOURCE(32513)
+#define IDI_QUESTION MAKEINTRESOURCE(32514)
+#define IDI_EXCLAMATION MAKEINTRESOURCE(32515)
+#define IDI_ASTERISK MAKEINTRESOURCE(32516)
+#define IDI_WINLOGO MAKEINTRESOURCE(32517)
+#else
+#define IDI_APPLICATION 32512
+#define IDI_HAND 32513
+#define IDI_QUESTION 32514
+#define IDI_EXCLAMATION 32515
+#define IDI_ASTERISK 32516
+#define IDI_WINLOGO 32517
+#endif
+#define IDI_WARNING IDI_EXCLAMATION
+#define IDI_ERROR IDI_HAND
+#define IDI_INFORMATION IDI_ASTERISK
+#define MIIM_STATE 1
+#define MIIM_ID 2
+#define MIIM_SUBMENU 4
+#define MIIM_CHECKMARKS 8
+#define MIIM_TYPE 16
+#define MIIM_DATA 32
+#define MIIM_STRING 64
+#define MIIM_BITMAP 128
+#define MIIM_FTYPE 256
+#define MFT_BITMAP 4
+#define MFT_MENUBARBREAK 32
+#define MFT_MENUBREAK 64
+#define MFT_OWNERDRAW 256
+#define MFT_RADIOCHECK 512
+#define MFT_RIGHTJUSTIFY 0x4000
+#define MFT_SEPARATOR 0x800
+#define MFT_RIGHTORDER 0x2000L
+#define MFT_STRING 0
+#define MFS_CHECKED 8
+#define MFS_DEFAULT 4096
+#define MFS_DISABLED 3
+#define MFS_ENABLED 0
+#define MFS_GRAYED 3
+#define MFS_HILITE 128
+#define MFS_UNCHECKED 0
+#define MFS_UNHILITE 0
+#define GW_HWNDNEXT 2
+#define GW_HWNDPREV 3
+#define GW_CHILD 5
+#define GW_HWNDFIRST 0
+#define GW_HWNDLAST 1
+#define GW_OWNER 4
+#define SW_HIDE 0
+#define SW_NORMAL 1
+#define SW_SHOWNORMAL 1
+#define SW_SHOWMINIMIZED 2
+#define SW_MAXIMIZE 3
+#define SW_SHOWMAXIMIZED 3
+#define SW_SHOWNOACTIVATE 4
+#define SW_SHOW 5
+#define SW_MINIMIZE 6
+#define SW_SHOWMINNOACTIVE 7
+#define SW_SHOWNA 8
+#define SW_RESTORE 9
+#define SW_SHOWDEFAULT 10
+#define SW_FORCEMINIMIZE 11
+#define SW_MAX 11
+#define MB_USERICON 128
+#define MB_ICONASTERISK 64
+#define MB_ICONEXCLAMATION 0x30
+#define MB_ICONWARNING 0x30
+#define MB_ICONERROR 16
+#define MB_ICONHAND 16
+#define MB_ICONQUESTION 32
+#define MB_OK 0
+#define MB_ABORTRETRYIGNORE 2
+#define MB_APPLMODAL 0
+#define MB_DEFAULT_DESKTOP_ONLY 0x20000
+#define MB_HELP 0x4000
+#define MB_RIGHT 0x80000
+#define MB_RTLREADING 0x100000
+#define MB_TOPMOST 0x40000
+#define MB_DEFBUTTON1 0
+#define MB_DEFBUTTON2 256
+#define MB_DEFBUTTON3 512
+#define MB_DEFBUTTON4 0x300
+#define MB_ICONINFORMATION 64
+#define MB_ICONSTOP 16
+#define MB_OKCANCEL 1
+#define MB_RETRYCANCEL 5
+#define MB_SERVICE_NOTIFICATION 0x40000
+#define MB_SETFOREGROUND 0x10000
+#define MB_SYSTEMMODAL 4096
+#define MB_TASKMODAL 0x2000
+#define MB_YESNO 4
+#define MB_YESNOCANCEL 3
+#define MB_ICONMASK 240
+#define MB_DEFMASK 3840
+#define MB_MODEMASK 0x00003000
+#define MB_MISCMASK 0x0000C000
+#define MB_NOFOCUS 0x00008000
+#define MB_TYPEMASK 15
+#define MB_TOPMOST 0x40000
+#define IDABORT 3
+#define IDCANCEL 2
+#define IDCLOSE 8
+#define IDHELP 9
+#define IDIGNORE 5
+#define IDNO 7
+#define IDOK 1
+#define IDRETRY 4
+#define IDYES 6
+#define GWL_EXSTYLE (-20)
+#define GWL_STYLE (-16)
+#define GWL_WNDPROC (-4)
+#define GWL_HINSTANCE (-6)
+#define GWL_HWNDPARENT (-8)
+#define GWL_ID (-12)
+#define GWL_USERDATA (-21)
+#define DWL_DLGPROC 4
+#define DWL_MSGRESULT 0
+#define DWL_USER 8
+#define QS_ALLEVENTS 191
+#define QS_ALLINPUT 255
+#define QS_HOTKEY 128
+#define QS_INPUT 7
+#define QS_KEY 1
+#define QS_MOUSE 6
+#define QS_MOUSEBUTTON 4
+#define QS_MOUSEMOVE 2
+#define QS_PAINT 32
+#define QS_POSTMESSAGE 8
+#define QS_SENDMESSAGE 64
+#define QS_TIMER 16
+#define COLOR_3DDKSHADOW 21
+#define COLOR_3DFACE 15
+#define COLOR_3DHILIGHT 20
+#define COLOR_3DHIGHLIGHT 20
+#define COLOR_3DLIGHT 22
+#define COLOR_BTNHILIGHT 20
+#define COLOR_3DSHADOW 16
+#define COLOR_ACTIVEBORDER 10
+#define COLOR_ACTIVECAPTION 2
+#define COLOR_APPWORKSPACE 12
+#define COLOR_BACKGROUND 1
+#define COLOR_DESKTOP 1
+#define COLOR_BTNFACE 15
+#define COLOR_BTNHIGHLIGHT 20
+#define COLOR_BTNSHADOW 16
+#define COLOR_BTNTEXT 18
+#define COLOR_CAPTIONTEXT 9
+#define COLOR_GRAYTEXT 17
+#define COLOR_HIGHLIGHT 13
+#define COLOR_HIGHLIGHTTEXT 14
+#define COLOR_INACTIVEBORDER 11
+#define COLOR_INACTIVECAPTION 3
+#define COLOR_INACTIVECAPTIONTEXT 19
+#define COLOR_INFOBK 24
+#define COLOR_INFOTEXT 23
+#define COLOR_MENU 4
+#define COLOR_MENUTEXT 7
+#define COLOR_SCROLLBAR 0
+#define COLOR_WINDOW 5
+#define COLOR_WINDOWFRAME 6
+#define COLOR_WINDOWTEXT 8
+#define CTLCOLOR_MSGBOX 0
+#define CTLCOLOR_EDIT 1
+#define CTLCOLOR_LISTBOX 2
+#define CTLCOLOR_BTN 3
+#define CTLCOLOR_DLG 4
+#define CTLCOLOR_SCROLLBAR 5
+#define CTLCOLOR_STATIC 6
+#define CTLCOLOR_MAX 7
+#define SM_CXSCREEN 0
+#define SM_CYSCREEN 1
+#define SM_CXVSCROLL 2
+#define SM_CYHSCROLL 3
+#define SM_CYCAPTION 4
+#define SM_CXBORDER 5
+#define SM_CYBORDER 6
+#define SM_CXDLGFRAME 7
+#define SM_CXFIXEDFRAME 7
+#define SM_CYDLGFRAME 8
+#define SM_CYFIXEDFRAME 8
+#define SM_CYVTHUMB 9
+#define SM_CXHTHUMB 10
+#define SM_CXICON 11
+#define SM_CYICON 12
+#define SM_CXCURSOR 13
+#define SM_CYCURSOR 14
+#define SM_CYMENU 15
+#define SM_CXFULLSCREEN 16
+#define SM_CYFULLSCREEN 17
+#define SM_CYKANJIWINDOW 18
+#define SM_MOUSEPRESENT 19
+#define SM_CYVSCROLL 20
+#define SM_CXHSCROLL 21
+#define SM_DEBUG 22
+#define SM_SWAPBUTTON 23
+#define SM_RESERVED1 24
+#define SM_RESERVED2 25
+#define SM_RESERVED3 26
+#define SM_RESERVED4 27
+#define SM_CXMIN 28
+#define SM_CYMIN 29
+#define SM_CXSIZE 30
+#define SM_CYSIZE 31
+#define SM_CXSIZEFRAME 32
+#define SM_CXFRAME 32
+#define SM_CYSIZEFRAME 33
+#define SM_CYFRAME 33
+#define SM_CXMINTRACK 34
+#define SM_CYMINTRACK 35
+#define SM_CXDOUBLECLK 36
+#define SM_CYDOUBLECLK 37
+#define SM_CXICONSPACING 38
+#define SM_CYICONSPACING 39
+#define SM_MENUDROPALIGNMENT 40
+#define SM_PENWINDOWS 41
+#define SM_DBCSENABLED 42
+#define SM_CMOUSEBUTTONS 43
+#define SM_SECURE 44
+#define SM_CXEDGE 45
+#define SM_CYEDGE 46
+#define SM_CXMINSPACING 47
+#define SM_CYMINSPACING 48
+#define SM_CXSMICON 49
+#define SM_CYSMICON 50
+#define SM_CYSMCAPTION 51
+#define SM_CXSMSIZE 52
+#define SM_CYSMSIZE 53
+#define SM_CXMENUSIZE 54
+#define SM_CYMENUSIZE 55
+#define SM_ARRANGE 56
+#define SM_CXMINIMIZED 57
+#define SM_CYMINIMIZED 58
+#define SM_CXMAXTRACK 59
+#define SM_CYMAXTRACK 60
+#define SM_CXMAXIMIZED 61
+#define SM_CYMAXIMIZED 62
+#define SM_NETWORK 63
+#define LR_DEFAULTSIZE 64
+#define SM_CLEANBOOT 67
+#define SM_CXDRAG 68
+#define SM_CYDRAG 69
+#define SM_SHOWSOUNDS 70
+#define SM_CXMENUCHECK 71
+#define SM_CYMENUCHECK 72
+#define SM_SLOWMACHINE 73
+#define SM_MIDEASTENABLED 74
+#define SM_MOUSEWHEELPRESENT 75
+#define SM_XVIRTUALSCREEN 76
+#define SM_YVIRTUALSCREEN 77
+#define SM_CXVIRTUALSCREEN 78
+#define SM_CYVIRTUALSCREEN 79
+#define SM_CMONITORS 80
+#define SM_SAMEDISPLAYFORMAT 81
+#if (_WIN32_WINNT < 0x0400)
+#define SM_CMETRICS 76
+#else
+#define SM_CMETRICS 83
+#endif
+#define ARW_BOTTOMLEFT 0
+#define ARW_BOTTOMRIGHT 1
+#define ARW_HIDE 8
+#define ARW_TOPLEFT 2
+#define ARW_TOPRIGHT 3
+#define ARW_DOWN 4
+#define ARW_LEFT 0
+#define ARW_RIGHT 0
+#define ARW_UP 4
+#define UOI_FLAGS 1
+#define UOI_NAME 2
+#define UOI_TYPE 3
+#define UOI_USER_SID 4
+#define LR_DEFAULTCOLOR 0
+#define LR_MONOCHROME 1
+#define LR_COLOR 2
+#define LR_COPYRETURNORG 4
+#define LR_COPYDELETEORG 8
+#define LR_LOADFROMFILE 16
+#define LR_LOADTRANSPARENT 32
+#define LR_LOADREALSIZE 128
+#define LR_LOADMAP3DCOLORS 4096
+#define LR_CREATEDIBSECTION 8192
+#define LR_COPYFROMRESOURCE 0x4000
+#define LR_SHARED 32768
+#define KEYEVENTF_EXTENDEDKEY 1
+#define KEYEVENTF_KEYUP 2
+#define OBM_BTNCORNERS 32758
+#define OBM_BTSIZE 32761
+#define OBM_CHECK 32760
+#define OBM_CHECKBOXES 32759
+#define OBM_CLOSE 32754
+#define OBM_COMBO 32738
+#define OBM_DNARROW 32752
+#define OBM_DNARROWD 32742
+#define OBM_DNARROWI 32736
+#define OBM_LFARROW 32750
+#define OBM_LFARROWI 32734
+#define OBM_LFARROWD 32740
+#define OBM_MNARROW 32739
+#define OBM_OLD_CLOSE 32767
+#define OBM_OLD_DNARROW 32764
+#define OBM_OLD_LFARROW 32762
+#define OBM_OLD_REDUCE 32757
+#define OBM_OLD_RESTORE 32755
+#define OBM_OLD_RGARROW 32763
+#define OBM_OLD_UPARROW 32765
+#define OBM_OLD_ZOOM 32756
+#define OBM_REDUCE 32749
+#define OBM_REDUCED 32746
+#define OBM_RESTORE 32747
+#define OBM_RESTORED 32744
+#define OBM_RGARROW 32751
+#define OBM_RGARROWD 32741
+#define OBM_RGARROWI 32735
+#define OBM_SIZE 32766
+#define OBM_UPARROW 32753
+#define OBM_UPARROWD 32743
+#define OBM_UPARROWI 32737
+#define OBM_ZOOM 32748
+#define OBM_ZOOMD 32745
+#define OCR_NORMAL 32512
+#define OCR_IBEAM 32513
+#define OCR_WAIT 32514
+#define OCR_CROSS 32515
+#define OCR_UP 32516
+#define OCR_SIZE 32640
+#define OCR_ICON 32641
+#define OCR_SIZENWSE 32642
+#define OCR_SIZENESW 32643
+#define OCR_SIZEWE 32644
+#define OCR_SIZENS 32645
+#define OCR_SIZEALL 32646
+#define OCR_NO 32648
+#define OCR_APPSTARTING 32650
+#define HELPINFO_MENUITEM 2
+#define HELPINFO_WINDOW 1
+#define MSGF_DIALOGBOX 0
+#define MSGF_MESSAGEBOX 1
+#define MSGF_MENU 2
+#define MSGF_MOVE 3
+#define MSGF_SIZE 4
+#define MSGF_SCROLLBAR 5
+#define MSGF_NEXTWINDOW 6
+#define MSGF_MAINLOOP 8
+#define MSGF_USER 4096
+#define MOUSEEVENTF_MOVE 1
+#define MOUSEEVENTF_LEFTDOWN 2
+#define MOUSEEVENTF_LEFTUP 4
+#define MOUSEEVENTF_RIGHTDOWN 8
+#define MOUSEEVENTF_RIGHTUP 16
+#define MOUSEEVENTF_MIDDLEDOWN 32
+#define MOUSEEVENTF_MIDDLEUP 64
+#define MOUSEEVENTF_ABSOLUTE 32768
+#define PM_NOREMOVE 0
+#define PM_REMOVE 1
+#define PM_NOYIELD 2
+#define HWND_BROADCAST ((HWND)0xffff)
+#define HWND_BOTTOM ((HWND)1)
+#define HWND_NOTOPMOST ((HWND)(-2))
+#define HWND_TOP ((HWND)0)
+#define HWND_TOPMOST ((HWND)(-1))
+#define HWND_DESKTOP (HWND)0
+#define RDW_ERASE 4
+#define RDW_FRAME 1024
+#define RDW_INTERNALPAINT 2
+#define RDW_INVALIDATE 1
+#define RDW_NOERASE 32
+#define RDW_NOFRAME 2048
+#define RDW_NOINTERNALPAINT 16
+#define RDW_VALIDATE 8
+#define RDW_ERASENOW 512
+#define RDW_UPDATENOW 256
+#define RDW_ALLCHILDREN 128
+#define RDW_NOCHILDREN 64
+#define SMTO_ABORTIFHUNG 2
+#define SMTO_BLOCK 1
+#define SMTO_NORMAL 0
+#define SIF_ALL 23
+#define SIF_PAGE 2
+#define SIF_POS 4
+#define SIF_RANGE 1
+#define SIF_DISABLENOSCROLL 8
+#define SIF_TRACKPOS 16
+#define SWP_DRAWFRAME 32
+#define SWP_FRAMECHANGED 32
+#define SWP_HIDEWINDOW 128
+#define SWP_NOACTIVATE 16
+#define SWP_NOCOPYBITS 256
+#define SWP_NOMOVE 2
+#define SWP_NOSIZE 1
+#define SWP_NOREDRAW 8
+#define SWP_NOZORDER 4
+#define SWP_SHOWWINDOW 64
+#define SWP_NOOWNERZORDER 512
+#define SWP_NOREPOSITION 512
+#define SWP_NOSENDCHANGING 1024
+#define SWP_DEFERERASE 8192
+#define SWP_ASYNCWINDOWPOS 16384
+#define HSHELL_ACTIVATESHELLWINDOW 3
+#define HSHELL_GETMINRECT 5
+#define HSHELL_LANGUAGE 8
+#define HSHELL_REDRAW 6
+#define HSHELL_TASKMAN 7
+#define HSHELL_WINDOWACTIVATED 4
+#define HSHELL_WINDOWCREATED 1
+#define HSHELL_WINDOWDESTROYED 2
+#define SPI_GETACCESSTIMEOUT 60
+#define SPI_GETANIMATION 72
+#define SPI_GETBEEP 1
+#define SPI_GETBORDER 5
+#define SPI_GETDEFAULTINPUTLANG 89
+#define SPI_GETDRAGFULLWINDOWS 38
+#define SPI_GETFASTTASKSWITCH 35
+#define SPI_GETFILTERKEYS 50
+#define SPI_GETFONTSMOOTHING 74
+#define SPI_GETGRIDGRANULARITY 18
+#define SPI_GETHIGHCONTRAST 66
+#define SPI_GETICONMETRICS 45
+#define SPI_GETICONTITLELOGFONT 31
+#define SPI_GETICONTITLEWRAP 25
+#define SPI_GETKEYBOARDDELAY 22
+#define SPI_GETKEYBOARDPREF 68
+#define SPI_GETKEYBOARDSPEED 10
+#define SPI_GETLOWPOWERACTIVE 83
+#define SPI_GETLOWPOWERTIMEOUT 79
+#define SPI_GETMENUDROPALIGNMENT 27
+#define SPI_GETMINIMIZEDMETRICS 43
+#define SPI_GETMOUSE 3
+#define SPI_GETMOUSEKEYS 54
+#define SPI_GETMOUSETRAILS 94
+#define SPI_GETNONCLIENTMETRICS 41
+#define SPI_GETPOWEROFFACTIVE 84
+#define SPI_GETPOWEROFFTIMEOUT 80
+#define SPI_GETSCREENREADER 70
+#define SPI_GETSCREENSAVEACTIVE 16
+#define SPI_GETSCREENSAVETIMEOUT 14
+#define SPI_GETSERIALKEYS 62
+#define SPI_GETSHOWSOUNDS 56
+#define SPI_GETSOUNDSENTRY 64
+#define SPI_GETSTICKYKEYS 58
+#define SPI_GETTOGGLEKEYS 52
+#define SPI_GETWINDOWSEXTENSION 92
+#define SPI_GETWORKAREA 48
+#define SPI_ICONHORIZONTALSPACING 13
+#define SPI_ICONVERTICALSPACING 24
+#define SPI_LANGDRIVER 12
+#define SPI_SCREENSAVERRUNNING 97
+#define SPI_SETACCESSTIMEOUT 61
+#define SPI_SETANIMATION 73
+#define SPI_SETBEEP 2
+#define SPI_SETBORDER 6
+#define SPI_SETDEFAULTINPUTLANG 90
+#define SPI_SETDESKPATTERN 21
+#define SPI_SETDESKWALLPAPER 20
+#define SPI_SETDOUBLECLICKTIME 32
+#define SPI_SETDOUBLECLKHEIGHT 30
+#define SPI_SETDOUBLECLKWIDTH 29
+#define SPI_SETDRAGFULLWINDOWS 37
+#define SPI_SETDRAGHEIGHT 77
+#define SPI_SETDRAGWIDTH 76
+#define SPI_SETFASTTASKSWITCH 36
+#define SPI_SETFILTERKEYS 51
+#define SPI_SETFONTSMOOTHING 75
+#define SPI_SETGRIDGRANULARITY 19
+#define SPI_SETHANDHELD 78
+#define SPI_SETHIGHCONTRAST 67
+#define SPI_SETICONMETRICS 46
+#define SPI_SETICONTITLELOGFONT 34
+#define SPI_SETICONTITLEWRAP 26
+#define SPI_SETKEYBOARDDELAY 23
+#define SPI_SETKEYBOARDPREF 69
+#define SPI_SETKEYBOARDSPEED 11
+#define SPI_SETLANGTOGGLE 91
+#define SPI_SETLOWPOWERACTIVE 85
+#define SPI_SETLOWPOWERTIMEOUT 81
+#define SPI_SETMENUDROPALIGNMENT 28
+#define SPI_SETMINIMIZEDMETRICS 44
+#define SPI_SETMOUSE 4
+#define SPI_SETMOUSEBUTTONSWAP 33
+#define SPI_SETMOUSEKEYS 55
+#define SPI_SETMOUSETRAILS 93
+#define SPI_SETNONCLIENTMETRICS 42
+#define SPI_SETPENWINDOWS 49
+#define SPI_SETPOWEROFFACTIVE 86
+#define SPI_SETPOWEROFFTIMEOUT 82
+#define SPI_SETSCREENREADER 71
+#define SPI_SETSCREENSAVEACTIVE 17
+#define SPI_SETSCREENSAVETIMEOUT 15
+#define SPI_SETSERIALKEYS 63
+#define SPI_SETSHOWSOUNDS 57
+#define SPI_SETSOUNDSENTRY 65
+#define SPI_SETSTICKYKEYS 59
+#define SPI_SETTOGGLEKEYS 53
+#define SPI_SETWORKAREA 47
+#define SPIF_UPDATEINIFILE 1
+#define SPIF_SENDWININICHANGE 2
+#define SPIF_SENDCHANGE 2
+#define ATF_ONOFFFEEDBACK 2
+#define ATF_TIMEOUTON 1
+#define WM_APP 32768
+#define WM_ACTIVATE 6
+#define WM_ACTIVATEAPP 28
+#define WM_ASKCBFORMATNAME 780
+#define WM_CANCELJOURNAL 75
+#define WM_CANCELMODE 31
+#define WM_CAPTURECHANGED 533
+#define WM_CHANGECBCHAIN 781
+#define WM_CHAR 258
+#define WM_CHARTOITEM 47
+#define WM_CHILDACTIVATE 34
+#define WM_CLEAR 771
+#define WM_CLOSE 16
+#define WM_COMMAND 273
+#define WM_COMPACTING 65
+#define WM_COMPAREITEM 57
+#define WM_CONTEXTMENU 123
+#define WM_COPY 769
+#define WM_COPYDATA 74
+#define WM_CREATE 1
+#define WM_CTLCOLORBTN 309
+#define WM_CTLCOLORDLG 310
+#define WM_CTLCOLOREDIT 307
+#define WM_CTLCOLORLISTBOX 308
+#define WM_CTLCOLORMSGBOX 306
+#define WM_CTLCOLORSCROLLBAR 311
+#define WM_CTLCOLORSTATIC 312
+#define WM_CUT 768
+#define WM_DEADCHAR 259
+#define WM_DELETEITEM 45
+#define WM_DESTROY 2
+#define WM_DESTROYCLIPBOARD 775
+#define WM_DEVICECHANGE 537
+#define WM_DEVMODECHANGE 27
+#define WM_DISPLAYCHANGE 126
+#define WM_DRAWCLIPBOARD 776
+#define WM_DRAWITEM 43
+#define WM_DROPFILES 563
+#define WM_ENABLE 10
+#define WM_ENDSESSION 22
+#define WM_ENTERIDLE 289
+#define WM_ENTERMENULOOP 529
+#define WM_ENTERSIZEMOVE 561
+#define WM_ERASEBKGND 20
+#define WM_EXITMENULOOP 530
+#define WM_EXITSIZEMOVE 562
+#define WM_FONTCHANGE 29
+#define WM_GETDLGCODE 135
+#define WM_GETFONT 49
+#define WM_GETHOTKEY 51
+#define WM_GETICON 127
+#define WM_GETMINMAXINFO 36
+#define WM_GETTEXT 13
+#define WM_GETTEXTLENGTH 14
+#define WM_HELP 83
+#define WM_HOTKEY 786
+#define WM_HSCROLL 276
+#define WM_HSCROLLCLIPBOARD 782
+#define WM_ICONERASEBKGND 39
+#define WM_INITDIALOG 272
+#define WM_INITMENU 278
+#define WM_INITMENUPOPUP 279
+#define WM_INPUTLANGCHANGE 81
+#define WM_INPUTLANGCHANGEREQUEST 80
+#define WM_KEYDOWN 256
+#define WM_KEYUP 257
+#define WM_KILLFOCUS 8
+#define WM_MDIACTIVATE 546
+#define WM_MDICASCADE 551
+#define WM_MDICREATE 544
+#define WM_MDIDESTROY 545
+#define WM_MDIGETACTIVE 553
+#define WM_MDIICONARRANGE 552
+#define WM_MDIMAXIMIZE 549
+#define WM_MDINEXT 548
+#define WM_MDIREFRESHMENU 564
+#define WM_MDIRESTORE 547
+#define WM_MDISETMENU 560
+#define WM_MDITILE 550
+#define WM_MEASUREITEM 44
+#define WM_MENUCHAR 288
+#define WM_MENUSELECT 287
+#define WM_NEXTMENU 531
+#define WM_MOVE 3
+#define WM_MOVING 534
+#define WM_NCACTIVATE 134
+#define WM_NCCALCSIZE 131
+#define WM_NCCREATE 129
+#define WM_NCDESTROY 130
+#define WM_NCHITTEST 132
+#define WM_NCLBUTTONDBLCLK 163
+#define WM_NCLBUTTONDOWN 161
+#define WM_NCLBUTTONUP 162
+#define WM_NCMBUTTONDBLCLK 169
+#define WM_NCMBUTTONDOWN 167
+#define WM_NCMBUTTONUP 168
+#define WM_NCMOUSEMOVE 160
+#define WM_NCPAINT 133
+#define WM_NCRBUTTONDBLCLK 166
+#define WM_NCRBUTTONDOWN 164
+#define WM_NCRBUTTONUP 165
+#define WM_NEXTDLGCTL 40
+#define WM_NEXTMENU 531
+#define WM_NOTIFY 78
+#define WM_NOTIFYFORMAT 85
+#define WM_NULL 0
+#define WM_PAINT 15
+#define WM_PAINTCLIPBOARD 777
+#define WM_PAINTICON 38
+#define WM_PALETTECHANGED 785
+#define WM_PALETTEISCHANGING 784
+#define WM_PARENTNOTIFY 528
+#define WM_PASTE 770
+#define WM_PENWINFIRST 896
+#define WM_PENWINLAST 911
+#define WM_POWER 72
+#define WM_POWERBROADCAST 536
+#define WM_PRINT 791
+#define WM_PRINTCLIENT 792
+#define WM_QUERYDRAGICON 55
+#define WM_QUERYENDSESSION 17
+#define WM_QUERYNEWPALETTE 783
+#define WM_QUERYOPEN 19
+#define WM_QUEUESYNC 35
+#define WM_QUIT 18
+#define WM_RENDERALLFORMATS 774
+#define WM_RENDERFORMAT 773
+#define WM_SETCURSOR 32
+#define WM_SETFOCUS 7
+#define WM_SETFONT 48
+#define WM_SETHOTKEY 50
+#define WM_SETICON 128
+#define WM_SETREDRAW 11
+#define WM_SETTEXT 12
+#define WM_SETTINGCHANGE 26
+#define WM_SHOWWINDOW 24
+#define WM_SIZE 5
+#define WM_SIZECLIPBOARD 779
+#define WM_SIZING 532
+#define WM_SPOOLERSTATUS 42
+#define WM_STYLECHANGED 125
+#define WM_STYLECHANGING 124
+#define WM_SYSCHAR 262
+#define WM_SYSCOLORCHANGE 21
+#define WM_SYSCOMMAND 274
+#define WM_SYSDEADCHAR 263
+#define WM_SYSKEYDOWN 260
+#define WM_SYSKEYUP 261
+#define WM_TCARD 82
+#define WM_TIMECHANGE 30
+#define WM_TIMER 275
+#define WM_UNDO 772
+#define WM_USER 1024
+#define WM_USERCHANGED 84
+#define WM_VKEYTOITEM 46
+#define WM_VSCROLL 277
+#define WM_VSCROLLCLIPBOARD 778
+#define WM_WINDOWPOSCHANGED 71
+#define WM_WINDOWPOSCHANGING 70
+#define WM_WININICHANGE 26
+#define WM_KEYFIRST 256
+#define WM_KEYLAST 264
+#define WM_SYNCPAINT 136
+#define WM_MOUSEACTIVATE 33
+#define WM_MOUSEMOVE 512
+#define WM_LBUTTONDOWN 513
+#define WM_LBUTTONUP 514
+#define WM_LBUTTONDBLCLK 515
+#define WM_RBUTTONDOWN 516
+#define WM_RBUTTONUP 517
+#define WM_RBUTTONDBLCLK 518
+#define WM_MBUTTONDOWN 519
+#define WM_MBUTTONUP 520
+#define WM_MBUTTONDBLCLK 521
+#define WM_MOUSEWHEEL 522
+#define WM_MOUSEFIRST 512
+#define WM_MOUSELAST 522
+#define WM_MOUSEHOVER 0x2A1
+#define WM_MOUSELEAVE 0x2A3
+#define WHEEL_DELTA 120
+#define BM_CLICK 245
+#define BM_GETCHECK 240
+#define BM_GETIMAGE 246
+#define BM_GETSTATE 242
+#define BM_SETCHECK 241
+#define BM_SETIMAGE 247
+#define BM_SETSTATE 243
+#define BM_SETSTYLE 244
+#define BN_CLICKED 0
+#define BN_DBLCLK 5
+#define BN_DISABLE 4
+#define BN_DOUBLECLICKED 5
+#define BN_HILITE 2
+#define BN_KILLFOCUS 7
+#define BN_PAINT 1
+#define BN_PUSHED 2
+#define BN_SETFOCUS 6
+#define BN_UNHILITE 3
+#define BN_UNPUSHED 3
+#define CB_ADDSTRING 323
+#define CB_DELETESTRING 324
+#define CB_DIR 325
+#define CB_FINDSTRING 332
+#define CB_FINDSTRINGEXACT 344
+#define CB_GETCOUNT 326
+#define CB_GETCURSEL 327
+#define CB_GETDROPPEDCONTROLRECT 338
+#define CB_GETDROPPEDSTATE 343
+#define CB_GETDROPPEDWIDTH 351
+#define CB_GETEDITSEL 320
+#define CB_GETEXTENDEDUI 342
+#define CB_GETHORIZONTALEXTENT 349
+#define CB_GETITEMDATA 336
+#define CB_GETITEMHEIGHT 340
+#define CB_GETLBTEXT 328
+#define CB_GETLBTEXTLEN 329
+#define CB_GETLOCALE 346
+#define CB_GETTOPINDEX 347
+#define CB_INITSTORAGE 353
+#define CB_INSERTSTRING 330
+#define CB_LIMITTEXT 321
+#define CB_RESETCONTENT 331
+#define CB_SELECTSTRING 333
+#define CB_SETCURSEL 334
+#define CB_SETDROPPEDWIDTH 352
+#define CB_SETEDITSEL 322
+#define CB_SETEXTENDEDUI 341
+#define CB_SETHORIZONTALEXTENT 350
+#define CB_SETITEMDATA 337
+#define CB_SETITEMHEIGHT 339
+#define CB_SETLOCALE 345
+#define CB_SETTOPINDEX 348
+#define CB_SHOWDROPDOWN 335
+#define CBN_CLOSEUP 8
+#define CBN_DBLCLK 2
+#define CBN_DROPDOWN 7
+#define CBN_EDITCHANGE 5
+#define CBN_EDITUPDATE 6
+#define CBN_ERRSPACE (-1)
+#define CBN_KILLFOCUS 4
+#define CBN_SELCHANGE 1
+#define CBN_SELENDCANCEL 10
+#define CBN_SELENDOK 9
+#define CBN_SETFOCUS 3
+#define EM_CANUNDO 198
+#define EM_CHARFROMPOS 215
+#define EM_EMPTYUNDOBUFFER 205
+#define EM_FMTLINES 200
+#define EM_GETFIRSTVISIBLELINE 206
+#define EM_GETHANDLE 189
+#define EM_GETLIMITTEXT 213
+#define EM_GETLINE 196
+#define EM_GETLINECOUNT 186
+#define EM_GETMARGINS 212
+#define EM_GETMODIFY 184
+#define EM_GETPASSWORDCHAR 210
+#define EM_GETRECT 178
+#define EM_GETSEL 176
+#define EM_GETTHUMB 190
+#define EM_GETWORDBREAKPROC 209
+#define EM_LIMITTEXT 197
+#define EM_LINEFROMCHAR 201
+#define EM_LINEINDEX 187
+#define EM_LINELENGTH 193
+#define EM_LINESCROLL 182
+#define EM_POSFROMCHAR 214
+#define EM_REPLACESEL 194
+#define EM_SCROLL 181
+#define EM_SCROLLCARET 183
+#define EM_SETHANDLE 188
+#define EM_SETLIMITTEXT 197
+#define EM_SETMARGINS 211
+#define EM_SETMODIFY 185
+#define EM_SETPASSWORDCHAR 204
+#define EM_SETREADONLY 207
+#define EM_SETRECT 179
+#define EM_SETRECTNP 180
+#define EM_SETSEL 177
+#define EM_SETTABSTOPS 203
+#define EM_SETWORDBREAKPROC 208
+#define EM_UNDO 199
+#define EN_CHANGE 768
+#define EN_ERRSPACE 1280
+#define EN_HSCROLL 1537
+#define EN_KILLFOCUS 512
+#define EN_MAXTEXT 1281
+#define EN_SETFOCUS 256
+#define EN_UPDATE 1024
+#define EN_VSCROLL 1538
+#define LB_ADDFILE 406
+#define LB_ADDSTRING 384
+#define LB_DELETESTRING 386
+#define LB_DIR 397
+#define LB_FINDSTRING 399
+#define LB_FINDSTRINGEXACT 418
+#define LB_GETANCHORINDEX 413
+#define LB_GETCARETINDEX 415
+#define LB_GETCOUNT 395
+#define LB_GETCURSEL 392
+#define LB_GETHORIZONTALEXTENT 403
+#define LB_GETITEMDATA 409
+#define LB_GETITEMHEIGHT 417
+#define LB_GETITEMRECT 408
+#define LB_GETLOCALE 422
+#define LB_GETSEL 391
+#define LB_GETSELCOUNT 400
+#define LB_GETSELITEMS 401
+#define LB_GETTEXT 393
+#define LB_GETTEXTLEN 394
+#define LB_GETTOPINDEX 398
+#define LB_INITSTORAGE 424
+#define LB_INSERTSTRING 385
+#define LB_ITEMFROMPOINT 425
+#define LB_RESETCONTENT 388
+#define LB_SELECTSTRING 396
+#define LB_SELITEMRANGE 411
+#define LB_SELITEMRANGEEX 387
+#define LB_SETANCHORINDEX 412
+#define LB_SETCARETINDEX 414
+#define LB_SETCOLUMNWIDTH 405
+#define LB_SETCOUNT 423
+#define LB_SETCURSEL 390
+#define LB_SETHORIZONTALEXTENT 404
+#define LB_SETITEMDATA 410
+#define LB_SETITEMHEIGHT 416
+#define LB_SETLOCALE 421
+#define LB_SETSEL 389
+#define LB_SETTABSTOPS 402
+#define LB_SETTOPINDEX 407
+#define LBN_DBLCLK 2
+#define LBN_ERRSPACE (-2)
+#define LBN_KILLFOCUS 5
+#define LBN_SELCANCEL 3
+#define LBN_SELCHANGE 1
+#define LBN_SETFOCUS 4
+#define SBM_ENABLE_ARROWS 228
+#define SBM_GETPOS 225
+#define SBM_GETRANGE 227
+#define SBM_GETSCROLLINFO 234
+#define SBM_SETPOS 224
+#define SBM_SETRANGE 226
+#define SBM_SETRANGEREDRAW 230
+#define SBM_SETSCROLLINFO 233
+#define STM_GETICON 369
+#define STM_GETIMAGE 371
+#define STM_SETICON 368
+#define STM_SETIMAGE 370
+#define STN_CLICKED 0
+#define STN_DBLCLK 1
+#define STN_DISABLE 3
+#define STN_ENABLE 2
+#define DM_GETDEFID WM_USER
+#define DM_SETDEFID (WM_USER+1)
+#define DM_REPOSITION (WM_USER+2)
+#define PSM_PAGEINFO (WM_USER+100)
+#define PSM_SHEETINFO (WM_USER+101)
+#define PSI_SETACTIVE 1
+#define PSI_KILLACTIVE 2
+#define PSI_APPLY 3
+#define PSI_RESET 4
+#define PSI_HASHELP 5
+#define PSI_HELP 6
+#define PSI_CHANGED 1
+#define PSI_GUISTART 2
+#define PSI_REBOOT 3
+#define PSI_GETSIBLINGS 4
+#define DCX_WINDOW 1
+#define DCX_CACHE 2
+#define DCX_PARENTCLIP 32
+#define DCX_CLIPSIBLINGS 16
+#define DCX_CLIPCHILDREN 8
+#define DCX_NORESETATTRS 4
+#define DCX_LOCKWINDOWUPDATE 0x400
+#define DCX_EXCLUDERGN 64
+#define DCX_INTERSECTRGN 128
+#define DCX_VALIDATE 0x200000
+#define GMDI_GOINTOPOPUPS 2
+#define GMDI_USEDISABLED 1
+#define FKF_AVAILABLE 2
+#define FKF_CLICKON 64
+#define FKF_FILTERKEYSON 1
+#define FKF_HOTKEYACTIVE 4
+#define FKF_HOTKEYSOUND 16
+#define FKF_CONFIRMHOTKEY 8
+#define FKF_INDICATOR 32
+#define HCF_HIGHCONTRASTON 1
+#define HCF_AVAILABLE 2
+#define HCF_HOTKEYACTIVE 4
+#define HCF_CONFIRMHOTKEY 8
+#define HCF_HOTKEYSOUND 16
+#define HCF_INDICATOR 32
+#define HCF_HOTKEYAVAILABLE 64
+#define MKF_AVAILABLE 2
+#define MKF_CONFIRMHOTKEY 8
+#define MKF_HOTKEYACTIVE 4
+#define MKF_HOTKEYSOUND 16
+#define MKF_INDICATOR 32
+#define MKF_MOUSEKEYSON 1
+#define MKF_MODIFIERS 64
+#define MKF_REPLACENUMBERS 128
+#define SERKF_AVAILABLE 2
+#define SERKF_INDICATOR 4
+#define SERKF_SERIALKEYSON 1
+#define SSF_AVAILABLE 2
+#define SSF_SOUNDSENTRYON 1
+#define SSTF_BORDER 2
+#define SSTF_CHARS 1
+#define SSTF_DISPLAY 3
+#define SSTF_NONE 0
+#define SSGF_DISPLAY 3
+#define SSGF_NONE 0
+#define SSWF_CUSTOM 4
+#define SSWF_DISPLAY 3
+#define SSWF_NONE 0
+#define SSWF_TITLE 1
+#define SSWF_WINDOW 2
+#define SKF_AUDIBLEFEEDBACK 64
+#define SKF_AVAILABLE 2
+#define SKF_CONFIRMHOTKEY 8
+#define SKF_HOTKEYACTIVE 4
+#define SKF_HOTKEYSOUND 16
+#define SKF_INDICATOR 32
+#define SKF_STICKYKEYSON 1
+#define SKF_TRISTATE 128
+#define SKF_TWOKEYSOFF 256
+#define TKF_AVAILABLE 2
+#define TKF_CONFIRMHOTKEY 8
+#define TKF_HOTKEYACTIVE 4
+#define TKF_HOTKEYSOUND 16
+#define TKF_TOGGLEKEYSON 1
+#define MDITILE_SKIPDISABLED 2
+#define MDITILE_HORIZONTAL 1
+#define MDITILE_VERTICAL 0
+#define VK_LBUTTON 1
+#define VK_RBUTTON 2
+#define VK_CANCEL 3
+#define VK_MBUTTON 4
+#define VK_BACK 8
+#define VK_TAB 9
+#define VK_CLEAR 12
+#define VK_RETURN 13
+#define VK_SHIFT 16
+#define VK_CONTROL 17
+#define VK_MENU 18
+#define VK_PAUSE 19
+#define VK_CAPITAL 20
+#define VK_ESCAPE 0x1B
+#define VK_SPACE 32
+#define VK_PRIOR 33
+#define VK_NEXT 34
+#define VK_END 35
+#define VK_HOME 36
+#define VK_LEFT 37
+#define VK_UP 38
+#define VK_RIGHT 39
+#define VK_DOWN 40
+#define VK_SELECT 41
+#define VK_PRINT 42
+#define VK_EXECUTE 43
+#define VK_SNAPSHOT 44
+#define VK_INSERT 45
+#define VK_DELETE 46
+#define VK_HELP 47
+#define VK_LWIN 0x5B
+#define VK_RWIN 0x5C
+#define VK_APPS 0x5D
+#define VK_NUMPAD0 0x60
+#define VK_NUMPAD1 0x61
+#define VK_NUMPAD2 0x62
+#define VK_NUMPAD3 0x63
+#define VK_NUMPAD4 0x64
+#define VK_NUMPAD5 0x65
+#define VK_NUMPAD6 0x66
+#define VK_NUMPAD7 0x67
+#define VK_NUMPAD8 0x68
+#define VK_NUMPAD9 0x69
+#define VK_MULTIPLY 0x6A
+#define VK_ADD 0x6B
+#define VK_SEPARATOR 0x6C
+#define VK_SUBTRACT 0x6D
+#define VK_DECIMAL 0x6E
+#define VK_DIVIDE 0x6F
+#define VK_F1 0x70
+#define VK_F2 0x71
+#define VK_F3 0x72
+#define VK_F4 0x73
+#define VK_F5 0x74
+#define VK_F6 0x75
+#define VK_F7 0x76
+#define VK_F8 0x77
+#define VK_F9 0x78
+#define VK_F10 0x79
+#define VK_F11 0x7A
+#define VK_F12 0x7B
+#define VK_F13 0x7C
+#define VK_F14 0x7D
+#define VK_F15 0x7E
+#define VK_F16 0x7F
+#define VK_F17 0x80
+#define VK_F18 0x81
+#define VK_F19 0x82
+#define VK_F20 0x83
+#define VK_F21 0x84
+#define VK_F22 0x85
+#define VK_F23 0x86
+#define VK_F24 0x87
+#define VK_NUMLOCK 0x90
+#define VK_SCROLL 0x91
+#define VK_LSHIFT 0xA0
+#define VK_RSHIFT 0xA1
+#define VK_LCONTROL 0xA2
+#define VK_RCONTROL 0xA3
+#define VK_LMENU 0xA4
+#define VK_RMENU 0xA5
+#define VK_PROCESSKEY 0xE5
+#define VK_ATTN 0xF6
+#define VK_CRSEL 0xF7
+#define VK_EXSEL 0xF8
+#define VK_EREOF 0xF9
+#define VK_PLAY 0xFA
+#define VK_ZOOM 0xFB
+#define VK_NONAME 0xFC
+#define VK_PA1 0xFD
+#define VK_OEM_CLEAR 0xFE
+#define TME_HOVER 1
+#define TME_LEAVE 2
+#define TME_QUERY 0x40000000
+#define TME_CANCEL 0x80000000
+#define HOVER_DEFAULT 0xFFFFFFFF
+#define MK_LBUTTON 1
+#define MK_RBUTTON 2
+#define MK_SHIFT 4
+#define MK_CONTROL 8
+#define MK_MBUTTON 16
+#define TPM_CENTERALIGN 4
+#define TPM_LEFTALIGN 0
+#define TPM_RIGHTALIGN 8
+#define TPM_LEFTBUTTON 0
+#define TPM_RIGHTBUTTON 2
+#define TPM_HORIZONTAL 0
+#define TPM_VERTICAL 64
+#define TPM_TOPALIGN 0
+#define TPM_VCENTERALIGN 16
+#define TPM_BOTTOMALIGN 32
+#define TPM_NONOTIFY 128
+#define TPM_RETURNCMD 256
+#define HELP_COMMAND 0x102
+#define HELP_CONTENTS 3
+#define HELP_CONTEXT 1
+#define HELP_CONTEXTPOPUP 8
+#define HELP_FORCEFILE 9
+#define HELP_HELPONHELP 4
+#define HELP_INDEX 3
+#define HELP_KEY 0x101
+#define HELP_MULTIKEY 0x201
+#define HELP_PARTIALKEY 0x105
+#define HELP_QUIT 2
+#define HELP_SETCONTENTS 5
+#define HELP_SETINDEX 5
+#define HELP_CONTEXTMENU 0xa
+#define HELP_FINDER 0xb
+#define HELP_WM_HELP 0xc
+#define HELP_TCARD 0x8000
+#define HELP_TCARD_DATA 16
+#define HELP_TCARD_OTHER_CALLER 0x11
+#define IDH_NO_HELP 28440
+#define IDH_MISSING_CONTEXT 28441
+#define IDH_GENERIC_HELP_BUTTON 28442
+#define IDH_OK 28443
+#define IDH_CANCEL 28444
+#define IDH_HELP 28445
+#define LB_CTLCODE 0
+#define LB_OKAY 0
+#define LB_ERR (-1)
+#define LB_ERRSPACE (-2)
+#define CB_OKAY 0
+#define CB_ERR (-1)
+#define CB_ERRSPACE (-2)
+#define HIDE_WINDOW 0
+#define SHOW_OPENWINDOW 1
+#define SHOW_ICONWINDOW 2
+#define SHOW_FULLSCREEN 3
+#define SHOW_OPENNOACTIVATE 4
+#define SW_PARENTCLOSING 1
+#define SW_OTHERZOOM 2
+#define SW_PARENTOPENING 3
+#define SW_OTHERUNZOOM 4
+#define KF_EXTENDED 256
+#define KF_DLGMODE 2048
+#define KF_MENUMODE 4096
+#define KF_ALTDOWN 8192
+#define KF_REPEAT 16384
+#define KF_UP 32768
+#define WSF_VISIBLE 1
+#define PWR_OK 1
+#define PWR_FAIL (-1)
+#define PWR_SUSPENDREQUEST 1
+#define PWR_SUSPENDRESUME 2
+#define PWR_CRITICALRESUME 3
+#define NFR_ANSI 1
+#define NFR_UNICODE 2
+#define NF_QUERY 3
+#define NF_REQUERY 4
+#define MENULOOP_WINDOW 0
+#define MENULOOP_POPUP 1
+#define WMSZ_LEFT 1
+#define WMSZ_RIGHT 2
+#define WMSZ_TOP 3
+#define WMSZ_TOPLEFT 4
+#define WMSZ_TOPRIGHT 5
+#define WMSZ_BOTTOM 6
+#define WMSZ_BOTTOMLEFT 7
+#define WMSZ_BOTTOMRIGHT 8
+#define HTERROR (-2)
+#define HTTRANSPARENT (-1)
+#define HTNOWHERE 0
+#define HTCLIENT 1
+#define HTCAPTION 2
+#define HTSYSMENU 3
+#define HTGROWBOX 4
+#define HTSIZE 4
+#define HTMENU 5
+#define HTHSCROLL 6
+#define HTVSCROLL 7
+#define HTMINBUTTON 8
+#define HTMAXBUTTON 9
+#define HTREDUCE 8
+#define HTZOOM 9
+#define HTLEFT 10
+#define HTSIZEFIRST 10
+#define HTRIGHT 11
+#define HTTOP 12
+#define HTTOPLEFT 13
+#define HTTOPRIGHT 14
+#define HTBOTTOM 15
+#define HTBOTTOMLEFT 16
+#define HTBOTTOMRIGHT 17
+#define HTSIZELAST 17
+#define HTBORDER 18
+#define HTOBJECT 19
+#define HTCLOSE 20
+#define HTHELP 21
+#define MA_ACTIVATE 1
+#define MA_ACTIVATEANDEAT 2
+#define MA_NOACTIVATE 3
+#define MA_NOACTIVATEANDEAT 4
+#define SIZE_RESTORED 0
+#define SIZE_MINIMIZED 1
+#define SIZE_MAXIMIZED 2
+#define SIZE_MAXSHOW 3
+#define SIZE_MAXHIDE 4
+#define SIZENORMAL 0
+#define SIZEICONIC 1
+#define SIZEFULLSCREEN 2
+#define SIZEZOOMSHOW 3
+#define SIZEZOOMHIDE 4
+#define WVR_ALIGNTOP 16
+#define WVR_ALIGNLEFT 32
+#define WVR_ALIGNBOTTOM 64
+#define WVR_ALIGNRIGHT 128
+#define WVR_HREDRAW 256
+#define WVR_VREDRAW 512
+#define WVR_REDRAW (WVR_HREDRAW|WVR_VREDRAW)
+#define WVR_VALIDRECTS 1024
+#define PRF_CHECKVISIBLE 1
+#define PRF_NONCLIENT 2
+#define PRF_CLIENT 4
+#define PRF_ERASEBKGND 8
+#define PRF_CHILDREN 16
+#define PRF_OWNED 32
+#define IDANI_OPEN 1
+#define IDANI_CLOSE 2
+#define IDANI_CAPTION 3
+#define WPF_RESTORETOMAXIMIZED 2
+#define WPF_SETMINPOSITION 1
+#define ODT_MENU 1
+#define ODT_LISTBOX 2
+#define ODT_COMBOBOX 3
+#define ODT_BUTTON 4
+#define ODT_STATIC 5
+#define ODA_DRAWENTIRE 1
+#define ODA_SELECT 2
+#define ODA_FOCUS 4
+#define ODS_SELECTED 1
+#define ODS_GRAYED 2
+#define ODS_DISABLED 4
+#define ODS_CHECKED 8
+#define ODS_FOCUS 16
+#define ODS_DEFAULT 32
+#define ODS_COMBOBOXEDIT 4096
+#define IDHOT_SNAPWINDOW (-1)
+#define IDHOT_SNAPDESKTOP (-2)
+#define DBWF_LPARAMPOINTER 0x8000
+#define DLGWINDOWEXTRA 30
+#define MNC_IGNORE 0
+#define MNC_CLOSE 1
+#define MNC_EXECUTE 2
+#define MNC_SELECT 3
+#define DOF_EXECUTABLE 0x8001
+#define DOF_DOCUMENT 0x8002
+#define DOF_DIRECTORY 0x8003
+#define DOF_MULTIPLE 0x8004
+#define DOF_PROGMAN 1
+#define DOF_SHELLDATA 2
+#define DO_DROPFILE 0x454C4946
+#define DO_PRINTFILE 0x544E5250
+#define SW_SCROLLCHILDREN 1
+#define SW_INVALIDATE 2
+#define SW_ERASE 4
+#define SC_SIZE 0xF000
+#define SC_MOVE 0xF010
+#define SC_MINIMIZE 0xF020
+#define SC_ICON 0xf020
+#define SC_MAXIMIZE 0xF030
+#define SC_ZOOM 0xF030
+#define SC_NEXTWINDOW 0xF040
+#define SC_PREVWINDOW 0xF050
+#define SC_CLOSE 0xF060
+#define SC_VSCROLL 0xF070
+#define SC_HSCROLL 0xF080
+#define SC_MOUSEMENU 0xF090
+#define SC_KEYMENU 0xF100
+#define SC_ARRANGE 0xF110
+#define SC_RESTORE 0xF120
+#define SC_TASKLIST 0xF130
+#define SC_SCREENSAVE 0xF140
+#define SC_HOTKEY 0xF150
+#define SC_DEFAULT 0xF160
+#define SC_MONITORPOWER 0xF170
+#define SC_CONTEXTHELP 0xF180
+#define SC_SEPARATOR 0xF00F
+#define EC_LEFTMARGIN 1
+#define EC_RIGHTMARGIN 2
+#define EC_USEFONTINFO 0xffff
+#define DC_HASDEFID 0x534B
+#define DLGC_WANTARROWS 1
+#define DLGC_WANTTAB 2
+#define DLGC_WANTALLKEYS 4
+#define DLGC_WANTMESSAGE 4
+#define DLGC_HASSETSEL 8
+#define DLGC_DEFPUSHBUTTON 16
+#define DLGC_UNDEFPUSHBUTTON 32
+#define DLGC_RADIOBUTTON 64
+#define DLGC_WANTCHARS 128
+#define DLGC_STATIC 256
+#define DLGC_BUTTON 0x2000
+#define LB_CTLCODE 0
+#define WA_INACTIVE 0
+#define WA_ACTIVE 1
+#define WA_CLICKACTIVE 2
+#define ICON_SMALL 0
+#define ICON_BIG 1
+#define HBMMENU_CALLBACK ((HBITMAP) -1)
+#define HBMMENU_SYSTEM ((HBITMAP)1)
+#define HBMMENU_MBAR_RESTORE ((HBITMAP)2)
+#define HBMMENU_MBAR_MINIMIZE ((HBITMAP)3)
+#define HBMMENU_MBAR_CLOSE ((HBITMAP)5)
+#define HBMMENU_MBAR_CLOSE_D ((HBITMAP)6)
+#define HBMMENU_MBAR_MINIMIZE_D ((HBITMAP)7)
+#define HBMMENU_POPUP_CLOSE ((HBITMAP)8)
+#define HBMMENU_POPUP_RESTORE ((HBITMAP)9)
+#define HBMMENU_POPUP_MAXIMIZE ((HBITMAP)10)
+#define HBMMENU_POPUP_MINIMIZE ((HBITMAP)11)
+#define MOD_ALT 1
+#define MOD_CONTROL 2
+#define MOD_SHIFT 4
+#define MOD_WIN 8
+#define MOD_IGNORE_ALL_MODIFIER 1024
+#define MOD_ON_KEYUP 2048
+#define MOD_RIGHT 16384
+#define MOD_LEFT 32768
+#ifndef RC_INVOKED
+typedef BOOL(CALLBACK *DLGPROC)(HWND,UINT,WPARAM,LPARAM);
+typedef VOID(CALLBACK *TIMERPROC)(HWND,UINT,UINT,DWORD);
+typedef BOOL(CALLBACK *GRAYSTRINGPROC)(HDC,LPARAM,int);
+typedef LRESULT(CALLBACK *HOOKPROC)(int,WPARAM,LPARAM);
+typedef BOOL(CALLBACK *PROPENUMPROCA)(HWND,LPCSTR,HANDLE);
+typedef BOOL(CALLBACK *PROPENUMPROCW)(HWND,LPCWSTR,HANDLE);
+typedef BOOL(CALLBACK *PROPENUMPROCEXA)(HWND,LPSTR,HANDLE,DWORD);
+typedef BOOL(CALLBACK *PROPENUMPROCEXW)(HWND,LPWSTR,HANDLE,DWORD);
+typedef int(CALLBACK *EDITWORDBREAKPROCA)(LPSTR,int,int,int);
+typedef int(CALLBACK *EDITWORDBREAKPROCW)(LPWSTR,int,int,int);
+typedef LRESULT(CALLBACK *WNDPROC)(HWND,UINT,WPARAM,LPARAM);
+typedef BOOL(CALLBACK *DRAWSTATEPROC)(HDC,LPARAM,WPARAM,int,int);
+typedef BOOL(CALLBACK *WNDENUMPROC)(HWND,LPARAM);
+typedef BOOL(CALLBACK *ENUMWINDOWSPROC)(HWND,LPARAM);
+typedef BOOL(CALLBACK *NAMEENUMPROCA)(LPSTR,LPARAM);
+typedef BOOL(CALLBACK *NAMEENUMPROCW)(LPWSTR,LPARAM);
+typedef NAMEENUMPROCA DESKTOPENUMPROCA;
+typedef NAMEENUMPROCW DESKTOPENUMPROCW;
+typedef NAMEENUMPROCA WINSTAENUMPROCA;
+typedef NAMEENUMPROCW WINSTAENUMPROCW;
+typedef void(CALLBACK *SENDASYNCPROC)(HWND,UINT,DWORD,LRESULT);
+DECLARE_HANDLE(HHOOK);
+DECLARE_HANDLE(HDWP);
+typedef struct tagACCEL {
+ BYTE fVirt;
+ WORD key;
+ WORD cmd;
+} ACCEL,*LPACCEL;
+typedef struct tagACCESSTIMEOUT {
+ UINT cbSize;
+ DWORD dwFlags;
+ DWORD iTimeOutMSec;
+} ACCESSTIMEOUT;
+typedef struct tagANIMATIONINFO {
+ UINT cbSize;
+ int iMinAnimate;
+} ANIMATIONINFO,*LPANIMATIONINFO;
+typedef struct tagCREATESTRUCT {
+ LPVOID lpCreateParams;
+ HINSTANCE hInstance;
+ HMENU hMenu;
+ HWND hwndParent;
+ int cy;
+ int cx;
+ int y;
+ int x;
+ LONG style;
+ LPCTSTR lpszName;
+ LPCTSTR lpszClass;
+ DWORD dwExStyle;
+} CREATESTRUCT,*LPCREATESTRUCT;
+typedef struct tagCBT_CREATEWND {
+ LPCREATESTRUCT lpcs;
+ HWND hwndInsertAfter;
+} CBT_CREATEWND;
+typedef struct tagCBTACTIVATESTRUCT {
+ BOOL fMouse;
+ HWND hWndActive;
+} CBTACTIVATESTRUCT,*LPCBTACTIVATESTRUCT;
+typedef struct tagCLIENTCREATESTRUCT {
+ HANDLE hWindowMenu;
+ UINT idFirstChild;
+} CLIENTCREATESTRUCT,*LPCLIENTCREATESTRUCT;
+typedef struct tagCOMPAREITEMSTRUCT {
+ UINT CtlType;
+ UINT CtlID;
+ HWND hwndItem;
+ UINT itemID1;
+ DWORD itemData1;
+ UINT itemID2;
+ DWORD itemData2;
+ DWORD dwLocaleId;
+} COMPAREITEMSTRUCT,*LPCOMPAREITEMSTRUCT;
+typedef struct tagCOPYDATASTRUCT {
+ DWORD dwData;
+ DWORD cbData;
+ PVOID lpData;
+} COPYDATASTRUCT;
+typedef struct tagCURSORSHAPE {
+ int xHotSpot;
+ int yHotSpot;
+ int cx;
+ int cy;
+ int cbWidth;
+ BYTE Planes;
+ BYTE BitsPixel;
+} CURSORSHAPE,*LPCURSORSHAPE;
+typedef struct tagCWPRETSTRUCT {
+ LRESULT lResult;
+ LPARAM lParam;
+ WPARAM wParam;
+ DWORD message;
+ HWND hwnd;
+} CWPRETSTRUCT;
+typedef struct tagCWPSTRUCT {
+ LPARAM lParam;
+ WPARAM wParam;
+ UINT message;
+ HWND hwnd;
+} CWPSTRUCT,*PWCWPSTRUCT;
+typedef struct tagDEBUGHOOKINFO {
+ DWORD idThread;
+ DWORD idThreadInstaller;
+ LPARAM lParam;
+ WPARAM wParam;
+ int code;
+} DEBUGHOOKINFO,*PDEBUGHOOKINFO,*LPDEBUGHOOKINFO;
+typedef struct tagDELETEITEMSTRUCT {
+ UINT CtlType;
+ UINT CtlID;
+ UINT itemID;
+ HWND hwndItem;
+ UINT itemData;
+} DELETEITEMSTRUCT,*PDELETEITEMSTRUCT,*LPDELETEITEMSTRUCT;
+#pragma pack(push,2)
+typedef struct {
+ DWORD style;
+ DWORD dwExtendedStyle;
+ short x;
+ short y;
+ short cx;
+ short cy;
+ WORD id;
+} DLGITEMTEMPLATE,*LPDLGITEMTEMPLATE;
+typedef struct {
+ DWORD style;
+ DWORD dwExtendedStyle;
+ WORD cdit;
+ short x;
+ short y;
+ short cx;
+ short cy;
+} DLGTEMPLATE,*LPDLGTEMPLATE;
+typedef const DLGTEMPLATE *LPCDLGTEMPLATE;
+#pragma pack(pop)
+typedef struct tagDRAWITEMSTRUCT {
+ UINT CtlType;
+ UINT CtlID;
+ UINT itemID;
+ UINT itemAction;
+ UINT itemState;
+ HWND hwndItem;
+ HDC hDC;
+ RECT rcItem;
+ DWORD itemData;
+} DRAWITEMSTRUCT,*LPDRAWITEMSTRUCT,*PDRAWITEMSTRUCT;
+typedef struct {
+ UINT cbSize;
+ int iTabLength;
+ int iLeftMargin;
+ int iRightMargin;
+ UINT uiLengthDrawn;
+} DRAWTEXTPARAMS,*LPDRAWTEXTPARAMS;
+typedef struct tagPAINTSTRUCT {
+ HDC hdc;
+ BOOL fErase;
+ RECT rcPaint;
+ BOOL fRestore;
+ BOOL fIncUpdate;
+ BYTE rgbReserved[32];
+} PAINTSTRUCT,*LPPAINTSTRUCT;
+typedef struct tagMSG {
+ HWND hwnd;
+ UINT message;
+ WPARAM wParam;
+ LPARAM lParam;
+ DWORD time;
+ POINT pt;
+} MSG,*LPMSG,*PMSG;
+typedef struct _ICONINFO {
+ BOOL fIcon;
+ DWORD xHotspot;
+ DWORD yHotspot;
+ HBITMAP hbmMask;
+ HBITMAP hbmColor;
+} ICONINFO,*PICONINFO;
+typedef struct tagNMHDR {
+ HWND hwndFrom;
+ UINT idFrom;
+ UINT code;
+} NMHDR,*LPNMHDR;
+typedef struct _WNDCLASSA {
+ UINT style;
+ WNDPROC lpfnWndProc;
+ int cbClsExtra;
+ int cbWndExtra;
+ HANDLE hInstance;
+ HICON hIcon;
+ HCURSOR hCursor;
+ HBRUSH hbrBackground;
+ LPCSTR lpszMenuName;
+ LPCSTR lpszClassName;
+} WNDCLASSA,*LPWNDCLASSA,*PWNDCLASSA;
+typedef struct _WNDCLASSW {
+ UINT style;
+ WNDPROC lpfnWndProc;
+ int cbClsExtra;
+ int cbWndExtra;
+ HANDLE hInstance;
+ HICON hIcon;
+ HCURSOR hCursor;
+ HBRUSH hbrBackground;
+ LPCWSTR lpszMenuName;
+ LPCWSTR lpszClassName;
+} WNDCLASSW,*LPWNDCLASSW,*PWNDCLASSW;
+typedef struct _WNDCLASSEXA {
+ UINT cbSize;
+ UINT style;
+ WNDPROC lpfnWndProc;
+ int cbClsExtra;
+ int cbWndExtra;
+ HANDLE hInstance;
+ HICON hIcon;
+ HCURSOR hCursor;
+ HBRUSH hbrBackground;
+ LPCSTR lpszMenuName;
+ LPCSTR lpszClassName;
+ HICON hIconSm;
+} WNDCLASSEXA,*LPWNDCLASSEXA,*PWNDCLASSEXA;
+typedef struct _WNDCLASSEXW {
+ UINT cbSize;
+ UINT style;
+ WNDPROC lpfnWndProc;
+ int cbClsExtra;
+ int cbWndExtra;
+ HANDLE hInstance;
+ HICON hIcon;
+ HCURSOR hCursor;
+ HBRUSH hbrBackground;
+ LPCWSTR lpszMenuName;
+ LPCWSTR lpszClassName;
+ HICON hIconSm;
+} WNDCLASSEXW,*LPWNDCLASSEXW,*PWNDCLASSEXW;
+typedef struct tagMENUITEMINFOA {
+ UINT cbSize;
+ UINT fMask;
+ UINT fType;
+ UINT fState;
+ UINT wID;
+ HMENU hSubMenu;
+ HBITMAP hbmpChecked;
+ HBITMAP hbmpUnchecked;
+ DWORD dwItemData;
+ LPSTR dwTypeData;
+ UINT cch;
+#if (_WIN32_WINNT >= 0x0500)
+ HBITMAP hbmpItem;
+#endif
+} MENUITEMINFOA,*LPMENUITEMINFOA;
+typedef const MENUITEMINFOA *LPCMENUITEMINFOA;
+typedef struct tagMENUITEMINFOW {
+ UINT cbSize;
+ UINT fMask;
+ UINT fType;
+ UINT fState;
+ UINT wID;
+ HMENU hSubMenu;
+ HBITMAP hbmpChecked;
+ HBITMAP hbmpUnchecked;
+ DWORD dwItemData;
+ LPWSTR dwTypeData;
+ UINT cch;
+#if (_WIN32_WINNT >= 0x0500)
+ HBITMAP hbmpItem;
+#endif
+} MENUITEMINFOW,*LPMENUITEMINFOW;
+typedef const MENUITEMINFOW *LPCMENUITEMINFOW;
+typedef struct tagSCROLLINFO {
+ UINT cbSize;
+ UINT fMask;
+ int nMin;
+ int nMax;
+ UINT nPage;
+ int nPos;
+ int nTrackPos;
+} SCROLLINFO,*LPSCROLLINFO;
+typedef const SCROLLINFO *LPCSCROLLINFO;
+typedef struct _WINDOWPLACEMENT {
+ UINT length;
+ UINT flags;
+ UINT showCmd;
+ POINT ptMinPosition;
+ POINT ptMaxPosition;
+ RECT rcNormalPosition;
+} WINDOWPLACEMENT,*LPWINDOWPLACEMENT,*PWINDOWPLACEMENT;
+typedef struct {
+ WORD versionNumber;
+ WORD offset;
+} MENUITEMTEMPLATEHEADER;
+typedef struct {
+ WORD mtOption;
+ WORD mtID;
+ WCHAR mtString[1];
+} MENUITEMTEMPLATE;
+typedef void MENUTEMPLATE,MENUTEMPLATEA,MENUTEMPLATEW,*LPMENUTEMPLATEA,*LPMENUTEMPLATEW,*LPMENUTEMPLATE;
+typedef struct tagHELPINFO {
+ UINT cbSize;
+ int iContextType;
+ int iCtrlId;
+ HANDLE hItemHandle;
+ DWORD dwContextId;
+ POINT MousePos;
+} HELPINFO,*LPHELPINFO;
+typedef void(CALLBACK *MSGBOXCALLBACK)(LPHELPINFO);
+typedef struct {
+ UINT cbSize;
+ HWND hwndOwner;
+ HINSTANCE hInstance;
+ LPCSTR lpszText;
+ LPCSTR lpszCaption;
+ DWORD dwStyle;
+ LPCSTR lpszIcon;
+ DWORD dwContextHelpId;
+ MSGBOXCALLBACK lpfnMsgBoxCallback;
+ DWORD dwLanguageId;
+} MSGBOXPARAMSA,*PMSGBOXPARAMSA,*LPMSGBOXPARAMSA;
+typedef struct {
+ UINT cbSize;
+ HWND hwndOwner;
+ HINSTANCE hInstance;
+ LPCWSTR lpszText;
+ LPCWSTR lpszCaption;
+ DWORD dwStyle;
+ LPCWSTR lpszIcon;
+ DWORD dwContextHelpId;
+ MSGBOXCALLBACK lpfnMsgBoxCallback;
+ DWORD dwLanguageId;
+} MSGBOXPARAMSW,*PMSGBOXPARAMSW,*LPMSGBOXPARAMSW;
+typedef struct tagUSEROBJECTFLAGS {
+ BOOL fInherit;
+ BOOL fReserved;
+ DWORD dwFlags;
+} USEROBJECTFLAGS;
+typedef struct tagFILTERKEYS {
+ UINT cbSize;
+ DWORD dwFlags;
+ DWORD iWaitMSec;
+ DWORD iDelayMSec;
+ DWORD iRepeatMSec;
+ DWORD iBounceMSec;
+} FILTERKEYS;
+typedef struct tagHIGHCONTRASTA {
+ UINT cbSize;
+ DWORD dwFlags;
+ LPSTR lpszDefaultScheme;
+} HIGHCONTRASTA,*LPHIGHCONTRASTA;
+typedef struct tagHIGHCONTRASTW {
+ UINT cbSize;
+ DWORD dwFlags;
+ LPWSTR lpszDefaultScheme;
+} HIGHCONTRASTW,*LPHIGHCONTRASTW;
+typedef struct tagICONMETRICSA {
+ UINT cbSize;
+ int iHorzSpacing;
+ int iVertSpacing;
+ int iTitleWrap;
+ LOGFONTA lfFont;
+} ICONMETRICSA,*LPICONMETRICSA;
+typedef struct tagICONMETRICSW {
+ UINT cbSize;
+ int iHorzSpacing;
+ int iVertSpacing;
+ int iTitleWrap;
+ LOGFONTW lfFont;
+} ICONMETRICSW,*LPICONMETRICSW;
+typedef struct tagMINIMIZEDMETRICS {
+ UINT cbSize;
+ int iWidth;
+ int iHorzGap;
+ int iVertGap;
+ int iArrange;
+} MINIMIZEDMETRICS,*LPMINIMIZEDMETRICS;
+typedef struct tagNONCLIENTMETRICSA {
+ UINT cbSize;
+ int iBorderWidth;
+ int iScrollWidth;
+ int iScrollHeight;
+ int iCaptionWidth;
+ int iCaptionHeight;
+ LOGFONTA lfCaptionFont;
+ int iSmCaptionWidth;
+ int iSmCaptionHeight;
+ LOGFONTA lfSmCaptionFont;
+ int iMenuWidth;
+ int iMenuHeight;
+ LOGFONTA lfMenuFont;
+ LOGFONTA lfStatusFont;
+ LOGFONTA lfMessageFont;
+} NONCLIENTMETRICSA,*LPNONCLIENTMETRICSA;
+typedef struct tagNONCLIENTMETRICSW {
+ UINT cbSize;
+ int iBorderWidth;
+ int iScrollWidth;
+ int iScrollHeight;
+ int iCaptionWidth;
+ int iCaptionHeight;
+ LOGFONTW lfCaptionFont;
+ int iSmCaptionWidth;
+ int iSmCaptionHeight;
+ LOGFONTW lfSmCaptionFont;
+ int iMenuWidth;
+ int iMenuHeight;
+ LOGFONTW lfMenuFont;
+ LOGFONTW lfStatusFont;
+ LOGFONTW lfMessageFont;
+} NONCLIENTMETRICSW,*LPNONCLIENTMETRICSW;
+typedef struct tagSERIALKEYSA {
+ UINT cbSize;
+ DWORD dwFlags;
+ LPSTR lpszActivePort;
+ LPSTR lpszPort;
+ UINT iBaudRate;
+ UINT iPortState;
+ UINT iActive;
+} SERIALKEYSA,*LPSERIALKEYSA;
+typedef struct tagSERIALKEYSW {
+ UINT cbSize;
+ DWORD dwFlags;
+ LPWSTR lpszActivePort;
+ LPWSTR lpszPort;
+ UINT iBaudRate;
+ UINT iPortState;
+ UINT iActive;
+} SERIALKEYSW,*LPSERIALKEYSW;
+typedef struct tagSOUNDSENTRYA {
+ UINT cbSize;
+ DWORD dwFlags;
+ DWORD iFSTextEffect;
+ DWORD iFSTextEffectMSec;
+ DWORD iFSTextEffectColorBits;
+ DWORD iFSGrafEffect;
+ DWORD iFSGrafEffectMSec;
+ DWORD iFSGrafEffectColor;
+ DWORD iWindowsEffect;
+ DWORD iWindowsEffectMSec;
+ LPSTR lpszWindowsEffectDLL;
+ DWORD iWindowsEffectOrdinal;
+} SOUNDSENTRYA,*LPSOUNDSENTRYA;
+typedef struct tagSOUNDSENTRYW {
+ UINT cbSize;
+ DWORD dwFlags;
+ DWORD iFSTextEffect;
+ DWORD iFSTextEffectMSec;
+ DWORD iFSTextEffectColorBits;
+ DWORD iFSGrafEffect;
+ DWORD iFSGrafEffectMSec;
+ DWORD iFSGrafEffectColor;
+ DWORD iWindowsEffect;
+ DWORD iWindowsEffectMSec;
+ LPWSTR lpszWindowsEffectDLL;
+ DWORD iWindowsEffectOrdinal;
+} SOUNDSENTRYW,*LPSOUNDSENTRYW;
+typedef struct tagSTICKYKEYS {
+ DWORD cbSize;
+ DWORD dwFlags;
+} STICKYKEYS,*LPSTICKYKEYS;
+typedef struct tagTOGGLEKEYS {
+ DWORD cbSize;
+ DWORD dwFlags;
+} TOGGLEKEYS;
+typedef struct tagTRACKMOUSEEVENT {
+ DWORD cbSize;
+ DWORD dwFlags;
+ HWND hwndTrack;
+ DWORD dwHoverTime;
+} TRACKMOUSEEVENT,*LPTRACKMOUSEEVENT;
+typedef struct tagTPMPARAMS {
+ UINT cbSize;
+ RECT rcExclude;
+} TPMPARAMS,*LPTPMPARAMS;
+typedef struct tagEVENTMSG {
+ UINT message;
+ UINT paramL;
+ UINT paramH;
+ DWORD time;
+ HWND hwnd;
+} EVENTMSG,*PEVENTMSGMSG,*LPEVENTMSGMSG, *PEVENTMSG, *LPEVENTMSG;
+typedef struct _WINDOWPOS {
+ HWND hwnd;
+ HWND hwndInsertAfter;
+ int x;
+ int y;
+ int cx;
+ int cy;
+ UINT flags;
+} WINDOWPOS,*PWINDOWPOS,*LPWINDOWPOS;
+typedef struct tagMDICREATESTRUCTA {
+ LPCSTR szClass;
+ LPCSTR szTitle;
+ HANDLE hOwner;
+ int x;
+ int y;
+ int cx;
+ int cy;
+ DWORD style;
+ LPARAM lParam;
+} MDICREATESTRUCTA,*LPMDICREATESTRUCTA;
+typedef struct tagMDICREATESTRUCTW {
+ LPCWSTR szClass;
+ LPCWSTR szTitle;
+ HANDLE hOwner;
+ int x;
+ int y;
+ int cx;
+ int cy;
+ DWORD style;
+ LPARAM lParam;
+} MDICREATESTRUCTW,*LPMDICREATESTRUCTW;
+typedef struct tagMINMAXINFO {
+ POINT ptReserved;
+ POINT ptMaxSize;
+ POINT ptMaxPosition;
+ POINT ptMinTrackSize;
+ POINT ptMaxTrackSize;
+} MINMAXINFO,*PMINMAXINFO,*LPMINMAXINFO;
+typedef struct tagMDINEXTMENU {
+ HMENU hmenuIn;
+ HMENU hmenuNext;
+ HWND hwndNext;
+} MDINEXTMENU,*PMDINEXTMENU,*LPMDINEXTMENU;
+typedef struct tagMEASUREITEMSTRUCT {
+ UINT CtlType;
+ UINT CtlID;
+ UINT itemID;
+ UINT itemWidth;
+ UINT itemHeight;
+ DWORD itemData;
+} MEASUREITEMSTRUCT,*PMEASUREITEMSTRUCT,*LPMEASUREITEMSTRUCT;
+typedef struct tagDROPSTRUCT {
+ HWND hwndSource;
+ HWND hwndSink;
+ DWORD wFmt;
+ DWORD dwData;
+ POINT ptDrop;
+ DWORD dwControlData;
+} DROPSTRUCT,*PDROPSTRUCT,*LPDROPSTRUCT;
+typedef DWORD HELPPOLY;
+typedef struct tagMULTIKEYHELPA {
+ DWORD mkSize;
+ CHAR mkKeylist;
+ CHAR szKeyphrase[1];
+} MULTIKEYHELPA,*PMULTIKEYHELPA,*LPMULTIKEYHELPA;
+typedef struct tagMULTIKEYHELPW {
+ DWORD mkSize;
+ WCHAR mkKeylist;
+ WCHAR szKeyphrase[1];
+} MULTIKEYHELPW,*PMULTIKEYHELPW,*LPMULTIKEYHELPW;
+typedef struct tagHELPWININFOA {
+ int wStructSize;
+ int x;
+ int y;
+ int dx;
+ int dy;
+ int wMax;
+ CHAR rgchMember[2];
+} HELPWININFOA,*PHELPWININFOA,*LPHELPWININFOA;
+typedef struct tagHELPWININFOW {
+ int wStructSize;
+ int x;
+ int y;
+ int dx;
+ int dy;
+ int wMax;
+ WCHAR rgchMember[2];
+} HELPWININFOW,*PHELPWININFOW,*LPHELPWININFOW;
+typedef struct tagSTYLESTRUCT {
+ DWORD styleOld;
+ DWORD styleNew;
+} STYLESTRUCT,*LPSTYLESTRUCT;
+
+#define AnsiToOem CharToOemA
+#define OemToAnsi OemToCharA
+#define AnsiToOemBuff CharToOemBuffA
+#define OemToAnsiBuff OemToCharBuffA
+#define AnsiUpper CharUpperA
+#define AnsiUpperBuff CharUpperBuffA
+#define AnsiLower CharLowerA
+#define AnsiLowerBuff CharLowerBuffA
+#define AnsiNext CharNextA
+#define AnsiPrev CharPrevA
+#define MAKELPARAM(l,h) ((LPARAM)MAKELONG(l,h))
+#define MAKEWPARAM(l,h) ((WPARAM)MAKELONG(l,h))
+#define MAKELRESULT(l,h) ((LRESULT)MAKELONG(l,h))
+#define POINTSTOPOINT(p,ps) {(p).x=LOWORD(pts);(ps).y=HIWORD(ps);}
+#define POINTTOPOINTS(p) ((POINTS)MAKELONG((p).x,(p).y))
+
+HKL WINAPI ActivateKeyboardLayout(HKL,UINT);
+BOOL WINAPI AdjustWindowRect(LPRECT,DWORD,BOOL);
+BOOL WINAPI AdjustWindowRectEx(LPRECT,DWORD,BOOL,DWORD);
+BOOL WINAPI AnyPopup(void);
+BOOL WINAPI AppendMenuA(HMENU,UINT,UINT,LPCSTR);
+BOOL WINAPI AppendMenuW(HMENU,UINT,UINT,LPCWSTR);
+UINT WINAPI ArrangeIconicWindows(HWND);
+BOOL WINAPI AttachThreadInput(DWORD,DWORD,BOOL);
+HDWP WINAPI BeginDeferWindowPos(int);
+HDC WINAPI BeginPaint(HWND,LPPAINTSTRUCT);
+BOOL WINAPI BringWindowToTop(HWND);
+long WINAPI BroadcastSystemMessage(DWORD,LPDWORD,UINT,WPARAM,LPARAM);
+BOOL WINAPI CallMsgFilter(PMSG,int);
+LRESULT WINAPI CallNextHookEx(HHOOK,int,WPARAM,LPARAM);
+LRESULT WINAPI CallWindowProcA(WNDPROC,HWND,UINT,WPARAM,LPARAM);
+LRESULT WINAPI CallWindowProcW(WNDPROC,HWND,UINT,WPARAM,LPARAM);
+WORD WINAPI CascadeWindows(HWND,UINT,LPCRECT,UINT,const HWND*);
+BOOL WINAPI ChangeClipboardChain(HWND,HWND);
+LONG WINAPI ChangeDisplaySettingsA(PDEVMODEA,DWORD);
+LONG WINAPI ChangeDisplaySettingsW(PDEVMODEW,DWORD);
+BOOL WINAPI ChangeMenuA(HMENU,UINT,LPCSTR,UINT,UINT);
+BOOL WINAPI ChangeMenuW(HMENU,UINT,LPCWSTR,UINT,UINT);
+LPSTR WINAPI CharLowerA(LPSTR);
+LPWSTR WINAPI CharLowerW(LPWSTR);
+DWORD WINAPI CharLowerBuffA(LPSTR,DWORD);
+DWORD WINAPI CharLowerBuffW(LPWSTR,DWORD);
+LPSTR WINAPI CharNextA(LPCSTR);
+LPWSTR WINAPI CharNextW(LPCWSTR);
+LPSTR WINAPI CharNextExA(WORD,LPCSTR,DWORD);
+LPWSTR WINAPI CharNextExW(WORD,LPCWSTR,DWORD);
+LPSTR WINAPI CharPrevA(LPCSTR,LPCSTR);
+LPWSTR WINAPI CharPrevW(LPCWSTR,LPCWSTR);
+LPSTR WINAPI CharPrevExA(WORD,LPCSTR,LPCSTR,DWORD);
+LPWSTR WINAPI CharPrevExW(WORD,LPCWSTR,LPCWSTR,DWORD);
+BOOL WINAPI CharToOemA(LPCSTR,LPSTR);
+BOOL WINAPI CharToOemW(LPCWSTR,LPSTR);
+BOOL WINAPI CharToOemBuffA(LPCSTR,LPSTR,DWORD);
+BOOL WINAPI CharToOemBuffW(LPCWSTR,LPSTR,DWORD);
+LPSTR WINAPI CharUpperA(LPSTR);
+LPWSTR WINAPI CharUpperW(LPWSTR);
+DWORD WINAPI CharUpperBuffA(LPSTR,DWORD);
+DWORD WINAPI CharUpperBuffW(LPWSTR,DWORD);
+BOOL WINAPI CheckDlgButton(HWND,int,UINT);
+DWORD WINAPI CheckMenuItem(HMENU,UINT,UINT);
+BOOL WINAPI CheckMenuRadioItem(HMENU,UINT,UINT,UINT,UINT);
+BOOL WINAPI CheckRadioButton(HWND,int,int,int);
+HWND WINAPI ChildWindowFromPoint(HWND,POINT);
+HWND WINAPI ChildWindowFromPointEx(HWND,POINT,UINT);
+BOOL WINAPI ClientToScreen(HWND,LPPOINT);
+BOOL WINAPI ClipCursor(LPCRECT);
+BOOL WINAPI CloseClipboard(void);
+BOOL WINAPI CloseDesktop(HDESK);
+BOOL WINAPI CloseWindow(HWND);
+BOOL WINAPI CloseWindowStation(HWINSTA);
+int WINAPI CopyAcceleratorTableA(HACCEL,LPACCEL,int);
+int WINAPI CopyAcceleratorTableW(HACCEL,LPACCEL,int);
+HCURSOR WINAPI CopyCursor(HCURSOR);
+HICON WINAPI CopyIcon(HICON);
+HANDLE WINAPI CopyImage(HANDLE,UINT,int,int,UINT);
+BOOL WINAPI CopyRect(LPRECT,LPCRECT);
+int WINAPI CountClipboardFormats(void);
+HACCEL WINAPI CreateAcceleratorTableA(LPACCEL,int);
+HACCEL WINAPI CreateAcceleratorTableW(LPACCEL,int);
+BOOL WINAPI CreateCaret(HWND,HBITMAP,int,int);
+HCURSOR WINAPI CreateCursor(HINSTANCE,int,int,int,int,PCVOID,PCVOID);
+HDESK WINAPI CreateDesktopA(LPSTR,LPSTR,LPDEVMODEA,DWORD,DWORD,LPSECURITY_ATTRIBUTES);
+HDESK WINAPI CreateDesktopW(LPWSTR,LPWSTR,LPDEVMODEW,DWORD,DWORD,LPSECURITY_ATTRIBUTES);
+#define CreateDialogA(h,n,w,f) CreateDialogParamA(h,n,w,f,0)
+#define CreateDialogW(h,n,w,f) CreateDialogParamW(h,n,w,f,0)
+#define CreateDialogIndirectA(h,t,w,f) CreateDialogIndirectParamA(h,t,w,f,0)
+#define CreateDialogIndirectW(h,t,w,f) CreateDialogIndirectParamW(h,t,w,f,0)
+HWND WINAPI CreateDialogIndirectParamA(HINSTANCE,LPCDLGTEMPLATE,HWND,DLGPROC,LPARAM);
+HWND WINAPI CreateDialogIndirectParamW(HINSTANCE,LPCDLGTEMPLATE,HWND,DLGPROC,LPARAM);
+HWND WINAPI CreateDialogParamA(HINSTANCE,LPCSTR,HWND,DLGPROC,LPARAM);
+HWND WINAPI CreateDialogParamW(HINSTANCE,LPCWSTR,HWND,DLGPROC,LPARAM);
+HICON WINAPI CreateIcon(HINSTANCE,int,int,BYTE,BYTE,const BYTE*,const BYTE*);
+HICON WINAPI CreateIconFromResource(PBYTE,DWORD,BOOL,DWORD);
+HICON WINAPI CreateIconFromResourceEx(PBYTE,DWORD,BOOL,DWORD,int,int,UINT);
+HICON WINAPI CreateIconIndirect(PICONINFO);
+HWND WINAPI CreateMDIWindowA(LPSTR,LPSTR,DWORD,int,int,int,int,HWND,HINSTANCE,LPARAM);
+HWND WINAPI CreateMDIWindowW(LPWSTR,LPWSTR,DWORD,int,int,int,int,HWND,HINSTANCE,LPARAM);
+HMENU WINAPI CreateMenu(void);
+HMENU WINAPI CreatePopupMenu(void);
+#define CreateWindowA(a,b,c,d,e,f,g,h,i,j,k) CreateWindowExA(0,a,b,c,d,e,f,g,h,i,j,k)
+#define CreateWindowW(a,b,c,d,e,f,g,h,i,j,k) CreateWindowExW(0,a,b,c,d,e,f,g,h,i,j,k)
+HWND WINAPI CreateWindowExA(DWORD,LPCSTR,LPCSTR,DWORD,int,int,int,int,HWND,HMENU,HINSTANCE,LPVOID);
+HWND WINAPI CreateWindowExW(DWORD,LPCWSTR,LPCWSTR,DWORD,int,int,int,int,HWND,HMENU,HINSTANCE,LPVOID);
+HWINSTA WINAPI CreateWindowStationA(LPSTR,DWORD,DWORD,LPSECURITY_ATTRIBUTES);
+HWINSTA WINAPI CreateWindowStationW(LPWSTR,DWORD,DWORD,LPSECURITY_ATTRIBUTES);
+LRESULT WINAPI DefDlgProcA(HWND,UINT,WPARAM,LPARAM);
+LRESULT WINAPI DefDlgProcW(HWND,UINT,WPARAM,LPARAM);
+HDWP WINAPI DeferWindowPos(HDWP,HWND,HWND,int,int,int,int,UINT);
+LRESULT WINAPI DefFrameProcA(HWND,HWND,UINT,WPARAM,LPARAM);
+LRESULT WINAPI DefFrameProcW(HWND,HWND,UINT,WPARAM,LPARAM);
+#define DefHookProc(c,p,lp,h) CallNextHookEx((HHOOK)*h,c,p,lp)
+LRESULT WINAPI DefMDIChildProcA(HWND,UINT,WPARAM,LPARAM);
+LRESULT WINAPI DefMDIChildProcW(HWND,UINT,WPARAM,LPARAM);
+LRESULT WINAPI DefWindowProcA(HWND,UINT,WPARAM,LPARAM);
+LRESULT WINAPI DefWindowProcW(HWND,UINT,WPARAM,LPARAM);
+BOOL WINAPI DeleteMenu(HMENU,UINT,UINT);
+BOOL WINAPI DestroyAcceleratorTable(HACCEL);
+BOOL WINAPI DestroyCaret(void);
+BOOL WINAPI DestroyCursor(HCURSOR);
+BOOL WINAPI DestroyIcon(HICON);
+BOOL WINAPI DestroyMenu(HMENU);
+BOOL WINAPI DestroyWindow(HWND);
+#define DialogBoxA(i,t,p,f) DialogBoxParamA(i,t,p,f,0)
+#define DialogBoxW(i,t,p,f) DialogBoxParamW(i,t,p,f,0)
+#define DialogBoxIndirectA(i,t,p,f) DialogBoxIndirectParamA(i,t,p,f,0)
+#define DialogBoxIndirectW(i,t,p,f) DialogBoxIndirectParamW(i,t,p,f,0)
+int WINAPI DialogBoxIndirectParamA(HINSTANCE,LPCDLGTEMPLATE,HWND,DLGPROC,LPARAM);
+int WINAPI DialogBoxIndirectParamW(HINSTANCE,LPCDLGTEMPLATE,HWND,DLGPROC,LPARAM);
+int WINAPI DialogBoxParamA(HINSTANCE,LPCSTR,HWND,DLGPROC,LPARAM);
+int WINAPI DialogBoxParamW(HINSTANCE,LPCWSTR,HWND,DLGPROC,LPARAM);
+LONG WINAPI DispatchMessageA(const MSG*);
+LONG WINAPI DispatchMessageW(const MSG*);
+int WINAPI DlgDirListA(HWND,LPSTR,int,int,UINT);
+int WINAPI DlgDirListW(HWND,LPWSTR,int,int,UINT);
+int WINAPI DlgDirListComboBoxA(HWND,LPSTR,int,int,UINT);
+int WINAPI DlgDirListComboBoxW(HWND,LPWSTR,int,int,UINT);
+BOOL WINAPI DlgDirSelectComboBoxExA(HWND,LPSTR,int,int);
+BOOL WINAPI DlgDirSelectComboBoxExW(HWND,LPWSTR,int,int);
+BOOL WINAPI DlgDirSelectExA(HWND,LPSTR,int,int);
+BOOL WINAPI DlgDirSelectExW(HWND,LPWSTR,int,int);
+BOOL WINAPI DragDetect(HWND,POINT);
+DWORD WINAPI DragObject(HWND,HWND,UINT,DWORD,HCURSOR);
+BOOL WINAPI DrawAnimatedRects(HWND,int,LPCRECT,LPCRECT);
+BOOL WINAPI DrawCaption(HWND,HDC,LPCRECT,UINT);
+BOOL WINAPI DrawEdge(HDC,LPRECT,UINT,UINT);
+BOOL WINAPI DrawFocusRect(HDC,LPCRECT);
+BOOL WINAPI DrawFrameControl(HDC,LPRECT,UINT,UINT);
+BOOL WINAPI DrawIcon(HDC,int,int,HICON);
+BOOL WINAPI DrawIconEx(HDC,int,int,HICON,int,int,UINT,HBRUSH,UINT);
+BOOL WINAPI DrawMenuBar(HWND);
+BOOL WINAPI DrawStateA(HDC,HBRUSH,DRAWSTATEPROC,LPARAM,WPARAM,int,int,int,int,UINT);
+BOOL WINAPI DrawStateW(HDC,HBRUSH,DRAWSTATEPROC,LPARAM,WPARAM,int,int,int,int,UINT);
+int WINAPI DrawTextA(HDC,LPCSTR,int,LPRECT,UINT);
+int WINAPI DrawTextW(HDC,LPCWSTR,int,LPRECT,UINT);
+int WINAPI DrawTextExA(HDC,LPSTR,int,LPRECT,UINT,LPDRAWTEXTPARAMS);
+int WINAPI DrawTextExW(HDC,LPWSTR,int,LPRECT,UINT,LPDRAWTEXTPARAMS);
+BOOL WINAPI EmptyClipboard(void);
+BOOL WINAPI EnableMenuItem(HMENU,UINT,UINT);
+BOOL WINAPI EnableScrollBar(HWND,UINT,UINT);
+BOOL WINAPI EnableWindow(HWND,BOOL);
+BOOL WINAPI EndDeferWindowPos(HDWP);
+BOOL WINAPI EndDialog(HWND,int);
+BOOL WINAPI EndPaint(HWND,const PAINTSTRUCT*);
+BOOL WINAPI EnumChildWindows(HWND,ENUMWINDOWSPROC,LPARAM);
+UINT WINAPI EnumClipboardFormats(UINT);
+BOOL WINAPI EnumDesktopsA(HWINSTA,DESKTOPENUMPROCA,LPARAM);
+BOOL WINAPI EnumDesktopsW(HWINSTA,DESKTOPENUMPROCW,LPARAM);
+BOOL WINAPI EnumDesktopWindows(HDESK,ENUMWINDOWSPROC,LPARAM);
+BOOL WINAPI EnumDisplaySettingsA(LPCSTR,DWORD,PDEVMODEA);
+BOOL WINAPI EnumDisplaySettingsW(LPCWSTR,DWORD,PDEVMODEW);
+int WINAPI EnumPropsA(HWND,PROPENUMPROCA);
+int WINAPI EnumPropsW(HWND,PROPENUMPROCW);
+int WINAPI EnumPropsExA(HWND,PROPENUMPROCEXA,LPARAM);
+int WINAPI EnumPropsExW(HWND,PROPENUMPROCEXW,LPARAM);
+#define EnumTaskWindows(h,f,p) EnumThreadWindows((DWORD)h,f,p)
+BOOL WINAPI EnumThreadWindows(DWORD,WNDENUMPROC,LPARAM);
+BOOL WINAPI EnumWindows(WNDENUMPROC,LPARAM);
+BOOL WINAPI EnumWindowStationsA(WINSTAENUMPROCA,LPARAM);
+BOOL WINAPI EnumWindowStationsW(WINSTAENUMPROCW,LPARAM);
+BOOL WINAPI EqualRect(LPCRECT,LPCRECT);
+#define ExitWindows(r,c) ExitWindowsEx(EWX_LOGOFF,0)
+BOOL WINAPI ExitWindowsEx(UINT,DWORD);
+HWND WINAPI FindWindowA(LPCSTR,LPCSTR);
+HWND WINAPI FindWindowExA(HWND,HWND,LPCSTR,LPCSTR);
+HWND WINAPI FindWindowExW(HWND,HWND,LPCWSTR,LPCWSTR);
+HWND WINAPI FindWindowW(LPCWSTR,LPCWSTR);
+BOOL WINAPI FlashWindow(HWND,BOOL);
+int WINAPI FrameRect(HDC,LPCRECT,HBRUSH);
+BOOL WINAPI FrameRgn(HDC,HRGN,HBRUSH,int,int);
+HWND WINAPI GetActiveWindow(void);
+SHORT WINAPI GetAsyncKeyState(int);
+HWND WINAPI GetCapture(void);
+UINT WINAPI GetCaretBlinkTime(void);
+BOOL WINAPI GetCaretPos(LPPOINT);
+BOOL WINAPI GetClassInfoA(HINSTANCE,LPCSTR,PWNDCLASSA);
+BOOL WINAPI GetClassInfoExA(HINSTANCE,LPCSTR,PWNDCLASSEXA);
+BOOL WINAPI GetClassInfoW(HINSTANCE,LPCWSTR,PWNDCLASSW);
+BOOL WINAPI GetClassInfoExW(HINSTANCE,LPCWSTR,PWNDCLASSEXW);
+DWORD WINAPI GetClassLongA(HWND,int);
+DWORD WINAPI GetClassLongW(HWND,int);
+int WINAPI GetClassNameA(HWND,LPSTR,int);
+int WINAPI GetClassNameW(HWND,LPWSTR,int);
+WORD WINAPI GetClassWord(HWND,int);
+BOOL WINAPI GetClientRect(HWND,LPRECT);
+HANDLE WINAPI GetClipboardData(UINT);
+int WINAPI GetClipboardFormatNameA(UINT,LPSTR,int);
+int WINAPI GetClipboardFormatNameW(UINT,LPWSTR,int);
+HWND WINAPI GetClipboardOwner(void);
+HWND WINAPI GetClipboardViewer(void);
+BOOL WINAPI GetClipCursor(LPRECT);
+BOOL WINAPI GetCursorPos(LPPOINT);
+HDC WINAPI GetDC(HWND);
+HDC WINAPI GetDCEx(HWND,HRGN,DWORD);
+HWND WINAPI GetDesktopWindow(void);
+long WINAPI GetDialogBaseUnits(void);
+int WINAPI GetDlgCtrlID(HWND);
+HWND WINAPI GetDlgItem(HWND,int);
+UINT WINAPI GetDlgItemInt(HWND,int,PBOOL,BOOL);
+UINT WINAPI GetDlgItemTextA(HWND,int,LPSTR,int);
+UINT WINAPI GetDlgItemTextW(HWND,int,LPWSTR,int);
+UINT WINAPI GetDoubleClickTime(void);
+HWND WINAPI GetFocus(void);
+HWND WINAPI GetForegroundWindow(void);
+BOOL WINAPI GetIconInfo(HICON,PICONINFO);
+BOOL WINAPI GetInputState(void);
+UINT WINAPI GetKBCodePage(void);
+HKL WINAPI GetKeyboardLayout(DWORD);
+int WINAPI GetKeyboardLayoutList(int,HKL*);
+BOOL WINAPI GetKeyboardLayoutNameA(LPSTR);
+BOOL WINAPI GetKeyboardLayoutNameW(LPWSTR);
+BOOL WINAPI GetKeyboardState(PBYTE);
+int WINAPI GetKeyboardType(int);
+int WINAPI GetKeyNameTextA(LONG,LPSTR,int);
+int WINAPI GetKeyNameTextW(LONG,LPWSTR,int);
+SHORT WINAPI GetKeyState(int);
+HWND WINAPI GetLastActivePopup(HWND);
+DWORD WINAPI GetLastError(void);
+HMENU WINAPI GetMenu(HWND);
+LONG WINAPI GetMenuCheckMarkDimensions(void);
+DWORD WINAPI GetMenuContextHelpId(HMENU);
+UINT WINAPI GetMenuDefaultItem(HMENU,UINT,UINT);
+int WINAPI GetMenuItemCount(HMENU);
+UINT WINAPI GetMenuItemID(HMENU,int);
+BOOL WINAPI GetMenuItemInfoA(HMENU,UINT,BOOL,LPMENUITEMINFOA);
+BOOL WINAPI GetMenuItemInfoW(HMENU,UINT,BOOL,LPMENUITEMINFOW);
+BOOL WINAPI GetMenuItemRect(HWND,HMENU,UINT,LPRECT);
+UINT WINAPI GetMenuState(HMENU,UINT,UINT);
+int WINAPI GetMenuStringA(HMENU,UINT,LPSTR,int,UINT);
+int WINAPI GetMenuStringW(HMENU,UINT,LPWSTR,int,UINT);
+BOOL WINAPI GetMessageA(LPMSG,HWND,UINT,UINT);
+BOOL WINAPI GetMessageW(LPMSG,HWND,UINT,UINT);
+LONG WINAPI GetMessageExtraInfo(void);
+DWORD WINAPI GetMessagePos(void);
+LONG WINAPI GetMessageTime(void);
+HWND WINAPI GetNextDlgGroupItem(HWND,HWND,BOOL);
+HWND WINAPI GetNextDlgTabItem(HWND,HWND,BOOL);
+#define GetNextWindow(h,c) GetWindow(h,c)
+HWND WINAPI GetOpenClipboardWindow(void);
+HWND WINAPI GetParent(HWND);
+int WINAPI GetPriorityClipboardFormat(UINT*,int);
+HANDLE WINAPI GetPropA(HWND,LPCSTR);
+HANDLE WINAPI GetPropW(HWND,LPCWSTR);
+DWORD WINAPI GetQueueStatus(UINT);
+BOOL WINAPI GetScrollInfo(HWND,int,LPSCROLLINFO);
+int WINAPI GetScrollPos(HWND,int);
+BOOL WINAPI GetScrollRange(HWND,int,LPINT,LPINT);
+HMENU WINAPI GetSubMenu(HMENU,int);
+DWORD WINAPI GetSysColor(int);
+HBRUSH WINAPI GetSysColorBrush(int);
+#define GetSysModalWindow() (NULL)
+HMENU WINAPI GetSystemMenu(HWND,BOOL);
+int WINAPI GetSystemMetrics(int);
+DWORD WINAPI GetTabbedTextExtentA(HDC,LPCSTR,int,int,LPINT);
+DWORD WINAPI GetTabbedTextExtentW(HDC,LPCWSTR,int,int,LPINT);
+LONG WINAPI GetWindowLongA(HWND,int);
+LONG WINAPI GetWindowLongW(HWND,int);
+HDESK WINAPI GetThreadDesktop(DWORD);
+HWND WINAPI GetTopWindow(HWND);
+BOOL WINAPI GetUpdateRect(HWND,LPRECT,BOOL);
+int WINAPI GetUpdateRgn(HWND,HRGN,BOOL);
+BOOL WINAPI GetUserObjectInformationA(HANDLE,int,PVOID,DWORD,PDWORD);
+BOOL WINAPI GetUserObjectInformationW(HANDLE,int,PVOID,DWORD,PDWORD);
+BOOL WINAPI GetUserObjectSecurity(HANDLE,PSECURITY_INFORMATION,PSECURITY_DESCRIPTOR,DWORD,PDWORD);
+HWND WINAPI GetWindow(HWND,UINT);
+DWORD WINAPI GetWindowContextHelpId(HWND);
+HDC WINAPI GetWindowDC(HWND);
+BOOL WINAPI GetWindowExtEx(HDC,LPSIZE);
+BOOL WINAPI GetWindowPlacement(HWND,WINDOWPLACEMENT*);
+BOOL WINAPI GetWindowRect(HWND,LPRECT);
+int WINAPI GetWindowRgn(HWND,HRGN);
+#define GetWindowTask(hWnd) ((HANDLE)GetWindowThreadProcessId(hWnd, NULL))
+int WINAPI GetWindowTextA(HWND,LPSTR,int);
+int WINAPI GetWindowTextLengthA(HWND);
+int WINAPI GetWindowTextLengthW(HWND);
+int WINAPI GetWindowTextW(HWND,LPWSTR,int);
+WORD WINAPI GetWindowWord(HWND,int);
+BOOL WINAPI GrayStringA(HDC,HBRUSH,GRAYSTRINGPROC,LPARAM,int,int,int,int,int);
+BOOL WINAPI GrayStringW(HDC,HBRUSH,GRAYSTRINGPROC,LPARAM,int,int,int,int,int);
+BOOL WINAPI HideCaret(HWND);
+BOOL WINAPI HiliteMenuItem(HWND,HMENU,UINT,UINT);
+BOOL WINAPI InflateRect(LPRECT,int,int);
+BOOL WINAPI InSendMessage(VOID);
+BOOL WINAPI InsertMenuA(HMENU,UINT,UINT,UINT,LPCSTR);
+BOOL WINAPI InsertMenuW(HMENU,UINT,UINT,UINT,LPCWSTR);
+BOOL WINAPI InsertMenuItemA(HMENU,UINT,BOOL,LPCMENUITEMINFOA);
+BOOL WINAPI InsertMenuItemW(HMENU,UINT,BOOL,LPCMENUITEMINFOW);
+BOOL WINAPI IntersectRect(LPRECT,LPCRECT,LPCRECT);
+BOOL WINAPI InvalidateRect(HWND,LPCRECT,BOOL);
+BOOL WINAPI InvalidateRgn(HWND,HRGN,BOOL);
+BOOL WINAPI InvertRect(HDC,LPCRECT);
+BOOL WINAPI IsCharAlphaA(CHAR ch);
+BOOL WINAPI IsCharAlphaNumericA(CHAR);
+BOOL WINAPI IsCharAlphaNumericW(WCHAR);
+BOOL WINAPI IsCharAlphaW(WCHAR);
+BOOL WINAPI IsCharLowerA(CHAR);
+BOOL WINAPI IsCharLowerW(WCHAR);
+BOOL WINAPI IsCharUpperA(CHAR);
+BOOL WINAPI IsCharUpperW(WCHAR);
+BOOL WINAPI IsChild(HWND,HWND);
+BOOL WINAPI IsClipboardFormatAvailable(UINT);
+BOOL WINAPI IsDialogMessageA(HWND,LPMSG);
+BOOL WINAPI IsDialogMessageW(HWND,LPMSG);
+UINT WINAPI IsDlgButtonChecked(HWND,int);
+BOOL WINAPI IsIconic(HWND);
+BOOL WINAPI IsMenu(HMENU);
+BOOL WINAPI IsRectEmpty(LPCRECT);
+BOOL WINAPI IsWindow(HWND);
+BOOL WINAPI IsWindowEnabled(HWND);
+BOOL WINAPI IsWindowUnicode(HWND);
+BOOL WINAPI IsWindowVisible(HWND);
+BOOL WINAPI IsZoomed(HWND);
+VOID WINAPI keybd_event(BYTE,BYTE,DWORD,DWORD);
+BOOL WINAPI KillTimer(HWND,UINT);
+HACCEL WINAPI LoadAcceleratorsA(HINSTANCE,LPCSTR);
+HACCEL WINAPI LoadAcceleratorsW(HINSTANCE,LPCWSTR);
+HBITMAP WINAPI LoadBitmapA(HINSTANCE,LPCSTR);
+HBITMAP WINAPI LoadBitmapW(HINSTANCE,LPCWSTR);
+HCURSOR WINAPI LoadCursorA(HINSTANCE,LPCSTR);
+HCURSOR WINAPI LoadCursorFromFileA(LPCSTR);
+HCURSOR WINAPI LoadCursorFromFileW(LPCWSTR);
+HCURSOR WINAPI LoadCursorW(HINSTANCE,LPCWSTR);
+HICON WINAPI LoadIconA(HINSTANCE,LPCSTR);
+HICON WINAPI LoadIconW(HINSTANCE,LPCWSTR);
+HANDLE WINAPI LoadImageA(HINSTANCE,LPCSTR,UINT,int,int,UINT);
+HANDLE WINAPI LoadImageW(HINSTANCE,LPCWSTR,UINT,int,int,UINT);
+HKL WINAPI LoadKeyboardLayoutA(LPCSTR,UINT);
+HKL WINAPI LoadKeyboardLayoutW(LPCWSTR,UINT);
+HMENU WINAPI LoadMenuA(HINSTANCE,LPCSTR);
+HMENU WINAPI LoadMenuIndirectA(const MENUTEMPLATE*);
+HMENU WINAPI LoadMenuIndirectW(const MENUTEMPLATE*);
+HMENU WINAPI LoadMenuW(HINSTANCE,LPCWSTR);
+int WINAPI LoadStringA(HINSTANCE,UINT,LPSTR,int);
+int WINAPI LoadStringW(HINSTANCE,UINT,LPWSTR,int);
+BOOL WINAPI LockWindowUpdate(HWND);
+int WINAPI LookupIconIdFromDirectory(PBYTE,BOOL);
+int WINAPI LookupIconIdFromDirectoryEx(PBYTE,BOOL,int,int,UINT);
+BOOL WINAPI MapDialogRect(HWND,LPRECT);
+UINT WINAPI MapVirtualKeyA(UINT,UINT);
+UINT WINAPI MapVirtualKeyExA(UINT,UINT,HKL);
+UINT WINAPI MapVirtualKeyExW(UINT,UINT,HKL);
+UINT WINAPI MapVirtualKeyW(UINT,UINT);
+int WINAPI MapWindowPoints(HWND,HWND,LPPOINT,UINT);
+int WINAPI MenuItemFromPoint(HWND,HMENU,POINT);
+BOOL WINAPI MessageBeep(UINT);
+int WINAPI MessageBoxA(HWND,LPCSTR,LPCSTR,UINT);
+int WINAPI MessageBoxW(HWND,LPCWSTR,LPCWSTR,UINT);
+int WINAPI MessageBoxExA(HWND,LPCSTR,LPCSTR,UINT,WORD);
+int WINAPI MessageBoxExW(HWND,LPCWSTR,LPCWSTR,UINT,WORD);
+int WINAPI MessageBoxIndirectA(LPMSGBOXPARAMSA);
+int WINAPI MessageBoxIndirectW(LPMSGBOXPARAMSW);
+BOOL WINAPI ModifyMenuA(HMENU,UINT,UINT,UINT,LPCSTR);
+BOOL WINAPI ModifyMenuW(HMENU,UINT,UINT,UINT,LPCWSTR);
+void WINAPI mouse_event(DWORD,DWORD,DWORD,DWORD,DWORD);
+BOOL WINAPI MoveWindow(HWND,int,int,int,int,BOOL);
+DWORD WINAPI MsgWaitForMultipleObjects(DWORD,LPHANDLE,BOOL,DWORD,DWORD);
+DWORD WINAPI MsgWaitForMultipleObjectsEx(DWORD,LPHANDLE,DWORD,DWORD,DWORD);
+DWORD WINAPI OemKeyScan(WORD);
+BOOL WINAPI OemToCharA(LPCSTR,LPSTR);
+BOOL WINAPI OemToCharBuffA(LPCSTR,LPSTR,DWORD);
+BOOL WINAPI OemToCharBuffW(LPCSTR,LPWSTR,DWORD);
+BOOL WINAPI OemToCharW(LPCSTR,LPWSTR);
+BOOL WINAPI OffsetRect(LPRECT,int,int);
+BOOL WINAPI OpenClipboard(HWND);
+HDESK WINAPI OpenDesktopA(LPSTR,DWORD,BOOL,DWORD);
+HDESK WINAPI OpenDesktopW(LPWSTR,DWORD,BOOL,DWORD);
+BOOL WINAPI OpenIcon(HWND);
+HDESK WINAPI OpenInputDesktop(DWORD,BOOL,DWORD);
+HWINSTA WINAPI OpenWindowStationA(LPSTR,BOOL,DWORD);
+HWINSTA WINAPI OpenWindowStationW(LPWSTR,BOOL,DWORD);
+BOOL WINAPI PaintDesktop(HDC);
+BOOL WINAPI PeekMessageA(LPMSG,HWND,UINT,UINT,UINT);
+BOOL WINAPI PeekMessageW(LPMSG,HWND,UINT,UINT,UINT);
+#define PostAppMessageA(t,m,w,l) PostThreadMessageA((DWORD)t,m,w,l)
+#define PostAppMessageW(t,m,w,l) PostThreadMessageW((DWORD)t,m,w,l)
+BOOL WINAPI PostMessageA(HWND,UINT,WPARAM,LPARAM);
+BOOL WINAPI PostMessageW(HWND,UINT,WPARAM,LPARAM);
+void WINAPI PostQuitMessage(int);
+BOOL WINAPI PostThreadMessageA(DWORD,UINT,WPARAM,LPARAM);
+BOOL WINAPI PostThreadMessageW(DWORD,UINT,WPARAM,LPARAM);
+BOOL WINAPI PtInRect(LPCRECT,POINT);
+BOOL WINAPI RedrawWindow(HWND,LPCRECT,HRGN,UINT);
+ATOM WINAPI RegisterClassA(const WNDCLASSA*);
+ATOM WINAPI RegisterClassW(const WNDCLASSW*);
+ATOM WINAPI RegisterClassExA(const WNDCLASSEXA*);
+ATOM WINAPI RegisterClassExW(const WNDCLASSEXW*);
+UINT WINAPI RegisterClipboardFormatA(LPCSTR);
+UINT WINAPI RegisterClipboardFormatW(LPCWSTR);
+BOOL WINAPI RegisterHotKey(HWND,int,UINT,UINT);
+UINT WINAPI RegisterWindowMessageA(LPCSTR);
+UINT WINAPI RegisterWindowMessageW(LPCWSTR);
+BOOL WINAPI ReleaseCapture(void);
+int WINAPI ReleaseDC(HWND,HDC);
+BOOL WINAPI RemoveMenu(HMENU,UINT,UINT);
+HANDLE WINAPI RemovePropA(HWND,LPCSTR);
+HANDLE WINAPI RemovePropW(HWND,LPCWSTR);
+BOOL WINAPI ReplyMessage(LRESULT);
+BOOL WINAPI ScreenToClient(HWND,LPPOINT);
+BOOL WINAPI ScrollDC(HDC,int,int,LPCRECT,LPCRECT,HRGN,LPRECT);
+BOOL WINAPI ScrollWindow(HWND,int,int,LPCRECT,LPCRECT);
+int WINAPI ScrollWindowEx(HWND,int,int,LPCRECT,LPCRECT,HRGN,LPRECT,UINT);
+LONG WINAPI SendDlgItemMessageA(HWND,int,UINT,WPARAM,LPARAM);
+LONG WINAPI SendDlgItemMessageW(HWND,int,UINT,WPARAM,LPARAM);
+LRESULT WINAPI SendMessageA(HWND,UINT,WPARAM,LPARAM);
+BOOL WINAPI SendMessageCallbackA(HWND,UINT,WPARAM,LPARAM,SENDASYNCPROC,DWORD);
+BOOL WINAPI SendMessageCallbackW(HWND,UINT,WPARAM,LPARAM,SENDASYNCPROC,DWORD);
+LRESULT WINAPI SendMessageTimeoutA(HWND,UINT,WPARAM,LPARAM,UINT,UINT,PDWORD);
+LRESULT WINAPI SendMessageTimeoutW(HWND,UINT,WPARAM,LPARAM,UINT,UINT,PDWORD);
+LRESULT WINAPI SendMessageW(HWND,UINT,WPARAM,LPARAM);
+BOOL WINAPI SendNotifyMessageA(HWND,UINT,WPARAM,LPARAM);
+BOOL WINAPI SendNotifyMessageW(HWND,UINT,WPARAM,LPARAM);
+HWND WINAPI SetActiveWindow(HWND);
+HWND WINAPI SetCapture(HWND hWnd);
+BOOL WINAPI SetCaretBlinkTime(UINT);
+BOOL WINAPI SetCaretPos(int,int);
+DWORD WINAPI SetClassLongA(HWND,int,LONG);
+DWORD WINAPI SetClassLongW(HWND,int,LONG);
+WORD WINAPI SetClassWord(HWND,int,WORD);
+HANDLE WINAPI SetClipboardData(UINT,HANDLE);
+HWND WINAPI SetClipboardViewer(HWND);
+HCURSOR WINAPI SetCursor(HCURSOR);
+BOOL WINAPI SetCursorPos(int,int);
+VOID WINAPI SetDebugErrorLevel(DWORD);
+BOOL WINAPI SetDlgItemInt(HWND,int,UINT,BOOL);
+BOOL WINAPI SetDlgItemTextA(HWND,int,LPCSTR);
+BOOL WINAPI SetDlgItemTextW(HWND,int,LPCWSTR);
+BOOL WINAPI SetDoubleClickTime(UINT);
+HWND WINAPI SetFocus(HWND);
+BOOL WINAPI SetForegroundWindow(HWND);
+BOOL WINAPI SetKeyboardState(PBYTE);
+BOOL WINAPI SetMenu(HWND,HMENU);
+BOOL WINAPI SetMenuContextHelpId(HMENU,DWORD);
+BOOL WINAPI SetMenuDefaultItem(HMENU,UINT,UINT);
+BOOL WINAPI SetMenuItemBitmaps(HMENU,UINT,UINT,HBITMAP,HBITMAP);
+BOOL WINAPI SetMenuItemInfoA(HMENU,UINT,BOOL,LPCMENUITEMINFOA);
+BOOL WINAPI SetMenuItemInfoW( HMENU,UINT,BOOL,LPCMENUITEMINFOW);
+LPARAM WINAPI SetMessageExtraInfo(LPARAM);
+BOOL WINAPI SetMessageQueue(int);
+HWND WINAPI SetParent(HWND,HWND);
+BOOL WINAPI SetProcessWindowStation(HWINSTA);
+BOOL WINAPI SetPropA(HWND,LPCSTR,HANDLE);
+BOOL WINAPI SetPropW(HWND,LPCWSTR,HANDLE);
+BOOL WINAPI SetRect(LPRECT,int,int,int,int);
+BOOL WINAPI SetRectEmpty(LPRECT);
+int WINAPI SetScrollInfo(HWND,int,LPCSCROLLINFO,BOOL);
+int WINAPI SetScrollPos(HWND,int,int,BOOL);
+BOOL WINAPI SetScrollRange(HWND,int,int,int,BOOL);
+BOOL WINAPI SetSysColors(int,const INT *,const COLORREF *);
+#define SetSysModalWindow(h) (NULL)
+BOOL WINAPI SetSystemCursor(HCURSOR,DWORD);
+BOOL WINAPI SetThreadDesktop(HDESK);
+UINT WINAPI SetTimer(HWND,UINT,UINT,TIMERPROC);
+BOOL WINAPI SetUserObjectInformationA(HANDLE,int,PVOID,DWORD);
+BOOL WINAPI SetUserObjectInformationW(HANDLE,int,PVOID,DWORD);
+BOOL WINAPI SetUserObjectSecurity(HANDLE,PSECURITY_INFORMATION,PSECURITY_DESCRIPTOR);
+BOOL WINAPI SetWindowContextHelpId(HWND,DWORD);
+LONG WINAPI SetWindowLongA(HWND,int,LONG);
+LONG WINAPI SetWindowLongW(HWND,int,LONG);
+BOOL WINAPI SetWindowPlacement(HWND hWnd,const WINDOWPLACEMENT*);
+BOOL WINAPI SetWindowPos(HWND,HWND,int,int,int,int,UINT);
+int WINAPI SetWindowRgn(HWND,HRGN,BOOL);
+HOOKPROC WINAPI SetWindowsHookA(int,HOOKPROC);
+HHOOK WINAPI SetWindowsHookExA(int,HOOKPROC,HINSTANCE,DWORD);
+HHOOK WINAPI SetWindowsHookExW(int,HOOKPROC,HINSTANCE,DWORD);
+BOOL WINAPI SetWindowTextA(HWND,LPCSTR);
+BOOL WINAPI SetWindowTextW(HWND,LPCWSTR);
+WORD WINAPI SetWindowWord(HWND,int,WORD);
+BOOL WINAPI ShowCaret(HWND);
+int WINAPI ShowCursor(BOOL);
+BOOL WINAPI ShowOwnedPopups(HWND,BOOL);
+BOOL WINAPI ShowScrollBar(HWND,int,BOOL);
+BOOL WINAPI ShowWindow(HWND,int);
+BOOL WINAPI ShowWindowAsync(HWND,int);
+BOOL WINAPI SubtractRect(LPRECT,LPCRECT,LPCRECT);
+BOOL WINAPI SwapMouseButton(BOOL);
+BOOL WINAPI SwitchDesktop(HDESK);
+BOOL WINAPI SystemParametersInfoA(UINT,UINT,PVOID,UINT);
+BOOL WINAPI SystemParametersInfoW(UINT,UINT,PVOID,UINT);
+LONG WINAPI TabbedTextOutA(HDC,int,int,LPCSTR,int,int,LPINT,int);
+LONG WINAPI TabbedTextOutW(HDC,int,int,LPCWSTR,int,int,LPINT,int);
+WORD WINAPI TileWindows(HWND,UINT,LPCRECT,UINT,const HWND *);
+int WINAPI ToAscii(UINT,UINT,PBYTE,LPWORD,UINT);
+int WINAPI ToAsciiEx(UINT,UINT,PBYTE,LPWORD,UINT,HKL);
+int WINAPI ToUnicode(UINT,UINT,PBYTE,LPWSTR,int,UINT);
+int WINAPI ToUnicodeEx(UINT,UINT,PBYTE,LPWSTR,int,UINT,HKL);
+BOOL WINAPI TrackMouseEvent(LPTRACKMOUSEEVENT);
+BOOL WINAPI TrackPopupMenu(HMENU,UINT,int,int,int,HWND,LPCRECT);
+BOOL WINAPI TrackPopupMenuEx(HMENU,UINT,int,int,HWND,LPTPMPARAMS);
+int WINAPI TranslateAcceleratorA(HWND,HACCEL,LPMSG);
+int WINAPI TranslateAcceleratorW(HWND,HACCEL,LPMSG);
+BOOL WINAPI TranslateMDISysAccel(HWND,LPMSG);
+BOOL WINAPI TranslateMessage(const MSG*);
+BOOL WINAPI UnhookWindowsHook(int,HOOKPROC);
+BOOL WINAPI UnhookWindowsHookEx(HHOOK);
+BOOL WINAPI UnionRect(LPRECT,LPCRECT,LPCRECT);
+BOOL WINAPI UnloadKeyboardLayout(HKL);
+BOOL WINAPI UnregisterClassA(LPCSTR,HINSTANCE);
+BOOL WINAPI UnregisterClassW(LPCWSTR,HINSTANCE);
+BOOL WINAPI UnregisterHotKey(HWND,int);
+BOOL WINAPI UpdateWindow(HWND);
+BOOL WINAPI ValidateRect(HWND,LPCRECT);
+BOOL WINAPI ValidateRgn(HWND,HRGN);
+SHORT WINAPI VkKeyScanA(CHAR);
+SHORT WINAPI VkKeyScanExA(CHAR,HKL);
+SHORT WINAPI VkKeyScanExW(WCHAR,HKL);
+SHORT WINAPI VkKeyScanW(WCHAR);
+DWORD WINAPI WaitForInputIdle(HANDLE,DWORD);
+BOOL WINAPI WaitMessage(void);
+HWND WINAPI WindowFromDC(HDC hDC);
+HWND WINAPI WindowFromPoint(POINT);
+UINT WINAPI WinExec(LPCSTR,UINT);
+BOOL WINAPI WinHelpA(HWND,LPCSTR,UINT,DWORD);
+BOOL WINAPI WinHelpW(HWND,LPCWSTR,UINT,DWORD);
+int WINAPIV wsprintfA(LPSTR,LPCSTR,...);
+int WINAPIV wsprintfW(LPWSTR,LPCWSTR,...);
+int WINAPI wvsprintfA(LPSTR,LPCSTR,va_list arglist);
+int WINAPI wvsprintfW(LPWSTR,LPCWSTR,va_list arglist);
+
+#ifdef UNICODE
+#define EDITWORDBREAKPROC EDITWORDBREAKPROCW
+#define PROPENUMPROC PROPENUMPROCW
+#define PROPENUMPROCEX PROPENUMPROCEXW
+#define DEKSTOPENUMPROC DEKSTOPENUMPROCW
+#define WINSTAENUMPROC WINSTAENUMPROCW
+#define PROPENUMPROC PROPENUMPROCW
+#define PROPENUMPROCEX PROPENUMPROCEXW
+#define MAKEINTRESOURCE MAKEINTRESOURCEW
+typedef WNDCLASSW WNDCLASS,*LPWNDCLASS,*PWNDCLASS;
+typedef WNDCLASSEXW WNDCLASSEX,*LPWNDCLASSEX,*PWNDCLASSEX;
+typedef MENUITEMINFOW MENUITEMINFO,*LPMENUITEMINFO;
+typedef LPCMENUITEMINFOW LPCMENUITEMINFO;
+typedef MSGBOXPARAMSW MSGBOXPARAMS,*PMSGBOXPARAMS,*LPMSGBOXPARAMS;
+typedef HIGHCONTRASTW HIGHCONTRAST,*LPHIGHCONTRAST;
+typedef ICONMETRICSW ICONMETRICS,*LPICONMETRICS;
+typedef NONCLIENTMETRICSW NONCLIENTMETRICS,*LPNONCLIENTMETRICS;
+typedef SERIALKEYSW SERIALKEYS,*LPSERIALKEYS;
+typedef SOUNDSENTRYW SOUNDSENTRY,*LPSOUNDSENTRY;
+typedef MDICREATESTRUCTW MDICREATESTRUCT,*LPMDICREATESTRUCT;
+typedef MULTIKEYHELPW MULTIKEYHELP,*PMULTIKEYHELP,*LPMULTIKEYHELP;
+#define AppendMenu AppendMenuW
+#define CallWindowProc CallWindowProcW
+#define ChangeDisplaySettings ChangeDisplaySettingsW
+#define ChangeMenu ChangeMenuW
+#define CharLower CharLowerW
+#define CharLowerBuff CharLowerBuffW
+#define CharNext CharNextW
+#define CharNextEx CharNextExW
+#define CharPrev CharPrevW
+#define CharPrevEx CharPrevExW
+#define CharToOem CharToOemW
+#define CharToOemBuff CharToOemBuffW
+#define CharUpper CharUpperW
+#define CharUpperBuff CharUpperBuffW
+#define CopyAcceleratorTable CopyAcceleratorTableW
+#define CreateAcceleratorTable CreateAcceleratorTableW
+#define CreateDesktop CreateDesktopW
+#define CreateDialog CreateDialogW
+#define CreateDialogIndirect CreateDialogIndirectW
+#define CreateDialogIndirectParam CreateDialogIndirectParamW
+#define CreateDialogParam CreateDialogParamW
+#define CreateMDIWindow CreateMDIWindowW
+#define CreateWindow CreateWindowW
+#define CreateWindowEx CreateWindowExW
+#define CreateWindowStation CreateWindowStationW
+#define DefDlgProc DefDlgProcW
+#define DefFrameProc DefFrameProcW
+#define DefMDIChildProc DefMDIChildProcW
+#define DefWindowProc DefWindowProcW
+#define DialogBox DialogBoxW
+#define DialogBoxIndirect DialogBoxIndirectW
+#define DialogBoxIndirectParam DialogBoxIndirectParamW
+#define DialogBoxParam DialogBoxParamW
+#define DispatchMessage DispatchMessageW
+#define DlgDirList DlgDirListW
+#define DlgDirListComboBox DlgDirListComboBoxW
+#define DlgDirSelectComboBoxEx DlgDirSelectComboBoxExW
+#define DlgDirSelectEx DlgDirSelectExW
+#define DrawState DrawStateW
+#define DrawText DrawTextW
+#define DrawTextEx DrawTextExW
+#define EnumDesktops EnumDesktopsW
+#define EnumDisplaySettings EnumDisplaySettingsW
+#define EnumProps EnumPropsW
+#define EnumPropsEx EnumPropsExW
+#define EnumWindowStations EnumWindowStationsW
+#define FindWindow FindWindowW
+#define FindWindowEx FindWindowExW
+#define GetClassInfo GetClassInfoW
+#define GetClassInfoEx GetClassInfoExW
+#define GetClassLong GetClassLongW
+#define GetClassName GetClassNameW
+#define GetClipboardFormatName GetClipboardFormatNameW
+#define GetDlgItemText GetDlgItemTextW
+#define GetKeyboardLayoutName GetKeyboardLayoutNameW
+#define GetKeyNameText GetKeyNameTextW
+#define GetMenuItemInfo GetMenuItemInfoW
+#define GetMenuString GetMenuStringW
+#define GetMessage GetMessageW
+#define GetProp GetPropW
+#define GetTabbedTextExtent GetTabbedTextExtentW
+#define GetUserObjectInformation GetUserObjectInformationW
+#define GetWindowLong GetWindowLongW
+#define GetWindowText GetWindowTextW
+#define GetWindowTextLength GetWindowTextLengthW
+#define GrayString GrayStringW
+#define InsertMenu InsertMenuW
+#define InsertMenuItem InsertMenuItemW
+#define IsCharAlpha IsCharAlphaW
+#define IsCharAlphaNumeric IsCharAlphaNumericW
+#define IsCharLower IsCharLowerW
+#define IsCharUpper IsCharUpperW
+#define IsDialogMessage IsDialogMessageW
+#define LoadAccelerators LoadAcceleratorsW
+#define LoadBitmap LoadBitmapW
+#define LoadCursor LoadCursorW
+#define LoadCursorFromFile LoadCursorFromFileW
+#define LoadIcon LoadIconW
+#define LoadImage LoadImageW
+#define LoadKeyboardLayout LoadKeyboardLayoutW
+#define LoadMenu LoadMenuW
+#define LoadMenuIndirect LoadMenuIndirectW
+#define LoadString LoadStringW
+#define MapVirtualKey MapVirtualKeyW
+#define MapVirtualKeyEx MapVirtualKeyExW
+#define MessageBox MessageBoxW
+#define MessageBoxEx MessageBoxExW
+#define MessageBoxIndirect MessageBoxIndirectW
+#define ModifyMenu ModifyMenuW
+#define OemToChar OemToCharW
+#define OemToCharBuff OemToCharBuffW
+#define OpenDesktop OpenDesktopW
+#define OpenWindowStation OpenWindowStationW
+#define PeekMessage PeekMessageW
+#define PostAppMessage PostAppMessageW
+#define PostMessage PostMessageW
+#define PostThreadMessage PostThreadMessageW
+#define RegisterClass RegisterClassW
+#define RegisterClassEx RegisterClassExW
+#define RegisterClipboardFormat RegisterClipboardFormatW
+#define RegisterWindowMessage RegisterWindowMessageW
+#define RemoveProp RemovePropW
+#define SendDlgItemMessage SendDlgItemMessageW
+#define SendMessage SendMessageW
+#define SendMessageCallback SendMessageCallbackW
+#define SendMessageTimeout SendMessageTimeoutW
+#define SendNotifyMessage SendNotifyMessageW
+#define SetClassLong SetClassLongW
+#define SetDlgItemText SetDlgItemTextW
+#define SetMenuItemInfo SetMenuItemInfoW
+#define SetProp SetPropW
+#define SetUserObjectInformation SetUserObjectInformationW
+#define SetWindowLong SetWindowLongW
+#define SetWindowsHook SetWindowsHookW
+#define SetWindowsHookEx SetWindowsHookExW
+#define SetWindowText SetWindowTextW
+#define SystemParametersInfo SystemParametersInfoW
+#define TabbedTextOut TabbedTextOutW
+#define TranslateAccelerator TranslateAcceleratorW
+#define UnregisterClass UnregisterClassW
+#define VkKeyScan VkKeyScanW
+#define VkKeyScanEx VkKeyScanExW
+#define WinHelp WinHelpW
+#define wsprintf wsprintfW
+#define wvsprintf wvsprintfW
+#else
+#define EDITWORDBREAKPROC EDITWORDBREAKPROCA
+#define PROPENUMPROC PROPENUMPROCA
+#define PROPENUMPROCEX PROPENUMPROCEXA
+#define DEKSTOPENUMPROC DEKSTOPENUMPROCA
+#define WINSTAENUMPROC WINSTAENUMPROCA
+#define PROPENUMPROC PROPENUMPROCA
+#define PROPENUMPROCEX PROPENUMPROCEXA
+#define MAKEINTRESOURCE MAKEINTRESOURCEA
+typedef WNDCLASSA WNDCLASS,*LPWNDCLASS,*PWNDCLASS;
+typedef WNDCLASSEXA WNDCLASSEX,*LPWNDCLASSEX,*PWNDCLASSEX;
+typedef MENUITEMINFOA MENUITEMINFO,*LPMENUITEMINFO;
+typedef LPCMENUITEMINFOA LPCMENUITEMINFO;
+typedef MSGBOXPARAMSA MSGBOXPARAMS,*PMSGBOXPARAMS,*LPMSGBOXPARAMS;
+typedef HIGHCONTRASTA HIGHCONTRAST,*LPHIGHCONTRAST;
+typedef ICONMETRICSA ICONMETRICS,*LPICONMETRICS;
+typedef NONCLIENTMETRICSA NONCLIENTMETRICS,*LPNONCLIENTMETRICS;
+typedef SERIALKEYSA SERIALKEYS,*LPSERIALKEYS;
+typedef SOUNDSENTRYA SOUNDSENTRY,*LPSOUNDSENTRY;
+typedef MDICREATESTRUCTA MDICREATESTRUCT,*LPMDICREATESTRUCT;
+typedef MULTIKEYHELPA MULTIKEYHELP,*PMULTIKEYHELP,*LPMULTIKEYHELP;
+#define AppendMenu AppendMenuA
+#define CallWindowProc CallWindowProcA
+#define ChangeDisplaySettings ChangeDisplaySettingsA
+#define ChangeMenu ChangeMenuA
+#define CharLower CharLowerA
+#define CharLowerBuff CharLowerBuffA
+#define CharNext CharNextA
+#define CharNextEx CharNextExA
+#define CharPrev CharPrevA
+#define CharPrevEx CharPrevExA
+#define CharToOem CharToOemA
+#define CharToOemBuff CharToOemBuffA
+#define CharUpper CharUpperA
+#define CharUpperBuff CharUpperBuffA
+#define CopyAcceleratorTable CopyAcceleratorTableA
+#define CreateAcceleratorTable CreateAcceleratorTableA
+#define CreateDesktop CreateDesktopA
+#define CreateDialog CreateDialogA
+#define CreateDialogIndirect CreateDialogIndirectA
+#define CreateDialogIndirectParam CreateDialogIndirectParamA
+#define CreateDialogParam CreateDialogParamA
+#define CreateMDIWindow CreateMDIWindowA
+#define CreateWindow CreateWindowA
+#define CreateWindowEx CreateWindowExA
+#define CreateWindowStation CreateWindowStationA
+#define DefDlgProc DefDlgProcA
+#define DefFrameProc DefFrameProcA
+#define DefMDIChildProc DefMDIChildProcA
+#define DefWindowProc DefWindowProcA
+#define DialogBox DialogBoxA
+#define DialogBoxIndirect DialogBoxIndirectA
+#define DialogBoxIndirectParam DialogBoxIndirectParamA
+#define DialogBoxParam DialogBoxParamA
+#define DispatchMessage DispatchMessageA
+#define DlgDirList DlgDirListA
+#define DlgDirListComboBox DlgDirListComboBoxA
+#define DlgDirSelectComboBoxEx DlgDirSelectComboBoxExA
+#define DlgDirSelectEx DlgDirSelectExA
+#define DrawState DrawStateA
+#define DrawText DrawTextA
+#define DrawTextEx DrawTextExA
+#define EnumDesktops EnumDesktopsA
+#define EnumDisplaySettings EnumDisplaySettingsA
+#define EnumProps EnumPropsA
+#define EnumPropsEx EnumPropsExA
+#define EnumWindowStations EnumWindowStationsA
+#define FindWindow FindWindowA
+#define FindWindowEx FindWindowExA
+#define GetClassInfo GetClassInfoA
+#define GetClassInfoEx GetClassInfoExA
+#define GetClassLong GetClassLongA
+#define GetClassName GetClassNameA
+#define GetClipboardFormatName GetClipboardFormatNameA
+#define GetDlgItemText GetDlgItemTextA
+#define GetKeyboardLayoutName GetKeyboardLayoutNameA
+#define GetKeyNameText GetKeyNameTextA
+#define GetMenuItemInfo GetMenuItemInfoA
+#define GetMenuString GetMenuStringA
+#define GetMessage GetMessageA
+#define GetProp GetPropA
+#define GetTabbedTextExtent GetTabbedTextExtentA
+#define GetUserObjectInformation GetUserObjectInformationA
+#define GetWindowLong GetWindowLongA
+#define GetWindowText GetWindowTextA
+#define GetWindowTextLength GetWindowTextLengthA
+#define GrayString GrayStringA
+#define InsertMenu InsertMenuA
+#define InsertMenuItem InsertMenuItemA
+#define IsCharAlpha IsCharAlphaA
+#define IsCharAlphaNumeric IsCharAlphaNumericA
+#define IsCharLower IsCharLowerA
+#define IsCharUpper IsCharUpperA
+#define IsDialogMessage IsDialogMessageA
+#define LoadAccelerators LoadAcceleratorsA
+#define LoadBitmap LoadBitmapA
+#define LoadCursor LoadCursorA
+#define LoadIcon LoadIconA
+#define LoadCursorFromFile LoadCursorFromFileA
+#define LoadImage LoadImageA
+#define LoadKeyboardLayout LoadKeyboardLayoutA
+#define LoadMenu LoadMenuA
+#define LoadMenuIndirect LoadMenuIndirectA
+#define LoadString LoadStringA
+#define MapVirtualKey MapVirtualKeyA
+#define MapVirtualKeyEx MapVirtualKeyExA
+#define MessageBox MessageBoxA
+#define MessageBoxEx MessageBoxExA
+#define MessageBoxIndirect MessageBoxIndirectA
+#define ModifyMenu ModifyMenuA
+#define OemToChar OemToCharA
+#define OemToCharBuff OemToCharBuffA
+#define OpenDesktop OpenDesktopA
+#define OpenWindowStation OpenWindowStationA
+#define PeekMessage PeekMessageA
+#define PostAppMessage PostAppMessageA
+#define PostMessage PostMessageA
+#define PostThreadMessage PostThreadMessageA
+#define RegisterClass RegisterClassA
+#define RegisterClassEx RegisterClassExA
+#define RegisterClipboardFormat RegisterClipboardFormatA
+#define RegisterWindowMessage RegisterWindowMessageA
+#define RemoveProp RemovePropA
+#define SendDlgItemMessage SendDlgItemMessageA
+#define SendMessage SendMessageA
+#define SendMessageCallback SendMessageCallbackA
+#define SendMessageTimeout SendMessageTimeoutA
+#define SendNotifyMessage SendNotifyMessageA
+#define SetClassLong SetClassLongA
+#define SetDlgItemText SetDlgItemTextA
+#define SetMenuItemInfo SetMenuItemInfoA
+#define SetProp SetPropA
+#define SetUserObjectInformation SetUserObjectInformationA
+#define SetWindowLong SetWindowLongA
+#define SetWindowsHook SetWindowsHookA
+#define SetWindowsHookEx SetWindowsHookExA
+#define SetWindowText SetWindowTextA
+#define SystemParametersInfo SystemParametersInfoA
+#define TabbedTextOut TabbedTextOutA
+#define TranslateAccelerator TranslateAcceleratorA
+#define UnregisterClass UnregisterClassA
+#define VkKeyScan VkKeyScanA
+#define VkKeyScanEx VkKeyScanExA
+#define WinHelp WinHelpA
+#define wsprintf wsprintfA
+#define wvsprintf wvsprintfA
+#endif
+#endif
+#ifdef __cplusplus
+}
+#endif
+#endif /* _WINUSER_H */
diff --git a/winsup/w32api/include/winver.h b/winsup/w32api/include/winver.h
new file mode 100644
index 000000000..93f5e533d
--- /dev/null
+++ b/winsup/w32api/include/winver.h
@@ -0,0 +1,129 @@
+#ifndef _WINVER_H
+#define _WINVER_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+#define VS_FILE_INFO RT_VERSION
+#define VS_VERSION_INFO 1
+#define VS_USER_DEFINED 100
+#define VS_FFI_SIGNATURE 0xFEEF04BD
+#define VS_FFI_STRUCVERSION 0x10000
+#define VS_FFI_FILEFLAGSMASK 0x3F
+#define VS_FF_DEBUG 1
+#define VS_FF_PRERELEASE 2
+#define VS_FF_PATCHED 4
+#define VS_FF_PRIVATEBUILD 8
+#define VS_FF_INFOINFERRED 16
+#define VS_FF_SPECIALBUILD 32
+#define VOS_UNKNOWN 0
+#define VOS_DOS 0x10000
+#define VOS_OS216 0x20000
+#define VOS_OS232 0x30000
+#define VOS_NT 0x40000
+#define VOS__BASE 0
+#define VOS__WINDOWS16 1
+#define VOS__PM16 2
+#define VOS__PM32 3
+#define VOS__WINDOWS32 4
+#define VOS_DOS_WINDOWS16 0x10001
+#define VOS_DOS_WINDOWS32 0x10004
+#define VOS_OS216_PM16 0x20002
+#define VOS_OS232_PM32 0x30003
+#define VOS_NT_WINDOWS32 0x40004
+#define VFT_UNKNOWN 0
+#define VFT_APP 1
+#define VFT_DLL 2
+#define VFT_DRV 3
+#define VFT_FONT 4
+#define VFT_VXD 5
+#define VFT_STATIC_LIB 7
+#define VFT2_UNKNOWN 0
+#define VFT2_DRV_PRINTER 1
+#define VFT2_DRV_KEYBOARD 2
+#define VFT2_DRV_LANGUAGE 3
+#define VFT2_DRV_DISPLAY 4
+#define VFT2_DRV_MOUSE 5
+#define VFT2_DRV_NETWORK 6
+#define VFT2_DRV_SYSTEM 7
+#define VFT2_DRV_INSTALLABLE 8
+#define VFT2_DRV_SOUND 9
+#define VFT2_DRV_COMM 10
+#define VFT2_DRV_INPUTMETHOD 11
+#define VFT2_FONT_RASTER 1
+#define VFT2_FONT_VECTOR 2
+#define VFT2_FONT_TRUETYPE 3
+#define VFFF_ISSHAREDFILE 1
+#define VFF_CURNEDEST 1
+#define VFF_FILEINUSE 2
+#define VFF_BUFFTOOSMALL 4
+#define VIFF_FORCEINSTALL 1
+#define VIFF_DONTDELETEOLD 2
+#define VIF_TEMPFILE 1
+#define VIF_MISMATCH 2
+#define VIF_SRCOLD 4
+#define VIF_DIFFLANG 8
+#define VIF_DIFFCODEPG 16
+#define VIF_DIFFTYPE 32
+#define VIF_WRITEPROT 64
+#define VIF_FILEINUSE 128
+#define VIF_OUTOFSPACE 256
+#define VIF_ACCESSVIOLATION 512
+#define VIF_SHARINGVIOLATION 1024
+#define VIF_CANNOTCREATE 2048
+#define VIF_CANNOTDELETE 4096
+#define VIF_CANNOTRENAME 8192
+#define VIF_CANNOTDELETECUR 16384
+#define VIF_OUTOFMEMORY 32768
+#define VIF_CANNOTREADSRC 65536
+#define VIF_CANNOTREADDST 0x20000
+#define VIF_BUFFTOOSMALL 0x40000
+#ifndef RC_INVOKED
+typedef struct tagVS_FIXEDFILEINFO {
+ DWORD dwSignature;
+ DWORD dwStrucVersion;
+ DWORD dwFileVersionMS;
+ DWORD dwFileVersionLS;
+ DWORD dwProductVersionMS;
+ DWORD dwProductVersionLS;
+ DWORD dwFileFlagsMask;
+ DWORD dwFileFlags;
+ DWORD dwFileOS;
+ DWORD dwFileType;
+ DWORD dwFileSubtype;
+ DWORD dwFileDateMS;
+ DWORD dwFileDateLS;
+} VS_FIXEDFILEINFO;
+DWORD WINAPI VerFindFileA(DWORD,LPSTR,LPSTR,LPSTR,LPSTR,PUINT,LPSTR,PUINT);
+DWORD WINAPI VerFindFileW(DWORD,LPWSTR,LPWSTR,LPWSTR,LPWSTR,PUINT,LPWSTR,PUINT);
+DWORD WINAPI VerInstallFileA(DWORD,LPSTR,LPSTR,LPSTR,LPSTR,LPSTR,LPSTR,PUINT);
+DWORD WINAPI VerInstallFileW(DWORD,LPWSTR,LPWSTR,LPWSTR,LPWSTR,LPWSTR,LPWSTR,PUINT);
+DWORD WINAPI GetFileVersionInfoSizeA(LPSTR,PDWORD);
+DWORD WINAPI GetFileVersionInfoSizeW(LPWSTR,PDWORD);
+BOOL WINAPI GetFileVersionInfoA(LPSTR,DWORD,DWORD,PVOID);
+BOOL WINAPI GetFileVersionInfoW(LPWSTR,DWORD,DWORD,PVOID);
+DWORD WINAPI VerLanguageNameA(DWORD,LPSTR,DWORD);
+DWORD WINAPI VerLanguageNameW(DWORD,LPWSTR,DWORD);
+BOOL WINAPI VerQueryValueA(PCVOID,LPSTR,PVOID*,PUINT);
+BOOL WINAPI VerQueryValueW(PCVOID,LPWSTR,PVOID*,PUINT);
+#ifdef UNICODE
+#define VerFindFile VerFindFileW
+#define VerQueryValue VerQueryValueW
+#define VerInstallFile VerInstallFileW
+#define GetFileVersionInfoSize GetFileVersionInfoSizeW
+#define GetFileVersionInfo GetFileVersionInfoW
+#define VerLanguageName VerLanguageNameW
+#define VerQueryValue VerQueryValueW
+#else
+#define VerQueryValue VerQueryValueA
+#define VerFindFile VerFindFileA
+#define VerInstallFile VerInstallFileA
+#define GetFileVersionInfoSize GetFileVersionInfoSizeA
+#define GetFileVersionInfo GetFileVersionInfoA
+#define VerLanguageName VerLanguageNameA
+#define VerQueryValue VerQueryValueA
+#endif
+#endif
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/winsup/w32api/include/wtypes.h b/winsup/w32api/include/wtypes.h
new file mode 100644
index 000000000..2222f91af
--- /dev/null
+++ b/winsup/w32api/include/wtypes.h
@@ -0,0 +1,152 @@
+#ifndef _WTYPES_H
+#define _WTYPES_H
+#include <rpc.h>
+#include <rpcndr.h>
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define IID_NULL GUID_NULL
+#define CLSID_NULL GUID_NULL
+#define CBPCLIPDATA(d) ((d).cbSize-sizeof((d).ulClipFmt))
+#define DECIMAL_NEG ((BYTE)0x80)
+#define DECIMAL_SETZERO(d) {(dec).Lo64=(dec).Hi32=(dec).signscale=0;}
+typedef struct _BLOB {
+ ULONG cbSize;
+ BYTE *pBlobData;
+} BLOB;
+typedef enum tagDVASPECT {
+ DVASPECT_CONTENT=1,
+ DVASPECT_THUMBNAIL=2,
+ DVASPECT_ICON=4,
+ DVASPECT_DOCPRINT=8
+} DVASPECT;
+typedef enum tagDVASPECT2 {
+ DVASPECT_OPAQUE=16,
+ DVASPECT_TRANSPARENT=32
+} DVASPECT2;
+typedef enum tagSTATFLAG {
+ STATFLAG_DEFAULT=0,
+ STATFLAG_NONAME=1
+} STATFLAG;
+typedef enum tagMEMCTX {
+ MEMCTX_TASK=1,
+ MEMCTX_SHARED,
+ MEMCTX_MACSYSTEM,
+ MEMCTX_UNKNOWN=-1,
+ MEMCTX_SAME=-2
+} MEMCTX;
+typedef enum tagMSHCTX {
+ MSHCTX_LOCAL,
+ MSHCTX_NOSHAREDMEM,
+ MSHCTX_DIFFERENTMACHINE,
+ MSHCTX_INPROC
+} MSHCTX;
+typedef
+enum tagCLSCTX {
+ CLSCTX_INPROC_SERVER=1,CLSCTX_INPROC_HANDLER=2,CLSCTX_LOCAL_SERVER=4,
+ CLSCTX_INPROC_SERVER16=8,CLSCTX_REMOTE_SERVER=16
+} CLSCTX;
+typedef enum tagMSHLFLAGS {
+ MSHLFLAGS_NORMAL,MSHLFLAGS_TABLESTRONG,MSHLFLAGS_TABLEWEAK
+} MSHLFLAGS;
+typedef struct _FLAGGED_WORD_BLOB {
+ unsigned long fFlags;
+ unsigned long clSize;
+ unsigned short asData[1];
+}FLAGGED_WORD_BLOB;
+
+#ifndef OLE2ANSI
+typedef WCHAR OLECHAR;
+typedef LPWSTR LPOLESTR;
+typedef LPCWSTR LPCOLESTR;
+#define OLESTR(s) L##s
+#else
+typedef char OLECHAR;
+typedef LPSTR LPOLESTR;
+typedef LPCSTR LPCOLESTR;
+#define OLESTR(s) s
+#endif
+typedef unsigned short VARTYPE;
+typedef short VARIANT_BOOL;
+typedef VARIANT_BOOL _VARIANT_BOOL;
+#define VARIANT_TRUE ((VARIANT_BOOL)0xffff)
+#define VARIANT_FALSE ((VARIANT_BOOL)0)
+typedef OLECHAR *BSTR;
+typedef FLAGGED_WORD_BLOB *wireBSTR;
+typedef BSTR *LPBSTR;
+typedef LONG SCODE;
+typedef void *HCONTEXT;
+typedef union tagCY {
+ struct {
+ unsigned long Lo;
+ long Hi;
+ }_STRUCT_NAME(s);
+ LONGLONG int64;
+} CY;
+typedef double DATE;
+typedef struct tagBSTRBLOB {
+ ULONG cbSize;
+ PBYTE pData;
+}BSTRBLOB;
+typedef struct tagBSTRBLOB *LPBSTRBLOB;
+typedef struct tagCLIPDATA {
+ ULONG cbSize;
+ long ulClipFmt;
+ PBYTE pClipData;
+}CLIPDATA;
+typedef enum tagSTGC {
+ STGC_DEFAULT,STGC_OVERWRITE,STGC_ONLYIFCURRENT,
+ STGC_DANGEROUSLYCOMMITMERELYTODISKCACHE
+}STGC;
+typedef enum tagSTGMOVE {
+ STGMOVE_MOVE,STGMOVE_COPY,STGMOVE_SHALLOWCOPY
+}STGMOVE;
+enum VARENUM {
+ VT_EMPTY,VT_NULL,VT_I2,VT_I4,VT_R4,VT_R8,VT_CY,VT_DATE,VT_BSTR,VT_DISPATCH,
+ VT_ERROR,VT_BOOL,VT_VARIANT,VT_UNKNOWN,VT_DECIMAL,VT_I1=16,VT_UI1,VT_UI2,VT_UI4,VT_I8,
+ VT_UI8,VT_INT,VT_UINT,VT_VOID,VT_HRESULT,VT_PTR,VT_SAFEARRAY,VT_CARRAY,VT_USERDEFINED,
+ VT_LPSTR,VT_LPWSTR,VT_FILETIME=64,VT_BLOB,VT_STREAM,VT_STORAGE,VT_STREAMED_OBJECT,
+ VT_STORED_OBJECT,VT_BLOB_OBJECT,VT_CF,VT_CLSID,VT_BSTR_BLOB=0xfff,VT_VECTOR=0x1000,
+ VT_ARRAY=0x2000,VT_BYREF=0x4000,VT_RESERVED=0x8000,VT_ILLEGAL= 0xffff,VT_ILLEGALMASKED=0xfff,
+ VT_TYPEMASK=0xfff
+};
+typedef struct _BYTE_SIZEDARR {
+ unsigned long clSize;
+ byte *pData;
+}BYTE_SIZEDARR;
+typedef struct _SHORT_SIZEDARR {
+ unsigned long clSize;
+ unsigned short *pData;
+}WORD_SIZEDARR;
+typedef struct _LONG_SIZEDARR {
+ unsigned long clSize;
+ unsigned long *pData;
+}DWORD_SIZEDARR;
+typedef struct _HYPER_SIZEDARR {
+ unsigned long clSize;
+ hyper *pData;
+}HYPER_SIZEDARR;
+typedef double DOUBLE;
+typedef struct tagDEC {
+ USHORT wReserved;
+ union {
+ struct {
+ BYTE scale;
+ BYTE sign;
+ }_STRUCT_NAME(s);
+ USHORT signscale;
+ } DUMMYUNIONNAME;
+ ULONG Hi32;
+ union {
+ struct {
+ ULONG Lo32;
+ ULONG Mid32;
+ }_STRUCT_NAME(s2);
+ ULONGLONG Lo64;
+ } DUMMYUNIONNAME2;
+} DECIMAL;
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/winsup/w32api/include/zmouse.h b/winsup/w32api/include/zmouse.h
new file mode 100644
index 000000000..aa6073c7e
--- /dev/null
+++ b/winsup/w32api/include/zmouse.h
@@ -0,0 +1,24 @@
+/*
+ zmouse.h - Header for IntelliMouse.
+
+ This file is part of a free library for the Win32 API.
+
+ 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.
+
+ FIXME: This file is obviously horribly incomplete!
+
+*/
+
+#ifndef _ZMOUSE_H
+#define _ZMOUSE_H
+
+#ifndef WM_MOUSEWHEEL
+# define WM_MOUSEWHEEL (WM_MOUSELAST + 1)
+#endif
+
+#define WHEEL_DELTA 120
+#define WHEEL_PAGESCROLL UINT_MAX
+
+#endif /* _ZMOUSE_H */
diff --git a/winsup/w32api/install-sh b/winsup/w32api/install-sh
new file mode 100755
index 000000000..e9de23842
--- /dev/null
+++ b/winsup/w32api/install-sh
@@ -0,0 +1,251 @@
+#!/bin/sh
+#
+# install - install a program, script, or datafile
+# This comes from X11R5 (mit/util/scripts/install.sh).
+#
+# Copyright 1991 by the Massachusetts Institute of Technology
+#
+# Permission to use, copy, modify, distribute, and sell this software and its
+# documentation for any purpose is hereby granted without fee, provided that
+# the above copyright notice appear in all copies and that both that
+# copyright notice and this permission notice appear in supporting
+# documentation, and that the name of M.I.T. not be used in advertising or
+# publicity pertaining to distribution of the software without specific,
+# written prior permission. M.I.T. makes no representations about the
+# suitability of this software for any purpose. It is provided "as is"
+# without express or implied warranty.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# `make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch. It can only install one file at a time, a restriction
+# shared with many OS's install programs.
+
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit="${DOITPROG-}"
+
+
+# put in absolute paths if you don't have them in your path; or use env. vars.
+
+mvprog="${MVPROG-mv}"
+cpprog="${CPPROG-cp}"
+chmodprog="${CHMODPROG-chmod}"
+chownprog="${CHOWNPROG-chown}"
+chgrpprog="${CHGRPPROG-chgrp}"
+stripprog="${STRIPPROG-strip}"
+rmprog="${RMPROG-rm}"
+mkdirprog="${MKDIRPROG-mkdir}"
+
+transformbasename=""
+transform_arg=""
+instcmd="$mvprog"
+chmodcmd="$chmodprog 0755"
+chowncmd=""
+chgrpcmd=""
+stripcmd=""
+rmcmd="$rmprog -f"
+mvcmd="$mvprog"
+src=""
+dst=""
+dir_arg=""
+
+while [ x"$1" != x ]; do
+ case $1 in
+ -c) instcmd="$cpprog"
+ shift
+ continue;;
+
+ -d) dir_arg=true
+ shift
+ continue;;
+
+ -m) chmodcmd="$chmodprog $2"
+ shift
+ shift
+ continue;;
+
+ -o) chowncmd="$chownprog $2"
+ shift
+ shift
+ continue;;
+
+ -g) chgrpcmd="$chgrpprog $2"
+ shift
+ shift
+ continue;;
+
+ -s) stripcmd="$stripprog"
+ shift
+ continue;;
+
+ -t=*) transformarg=`echo $1 | sed 's/-t=//'`
+ shift
+ continue;;
+
+ -b=*) transformbasename=`echo $1 | sed 's/-b=//'`
+ shift
+ continue;;
+
+ *) if [ x"$src" = x ]
+ then
+ src=$1
+ else
+ # this colon is to work around a 386BSD /bin/sh bug
+ :
+ dst=$1
+ fi
+ shift
+ continue;;
+ esac
+done
+
+if [ x"$src" = x ]
+then
+ echo "install: no input file specified"
+ exit 1
+else
+ true
+fi
+
+if [ x"$dir_arg" != x ]; then
+ dst=$src
+ src=""
+
+ if [ -d $dst ]; then
+ instcmd=:
+ chmodcmd=""
+ else
+ instcmd=mkdir
+ fi
+else
+
+# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
+# might cause directories to be created, which would be especially bad
+# if $src (and thus $dsttmp) contains '*'.
+
+ if [ -f $src -o -d $src ]
+ then
+ true
+ else
+ echo "install: $src does not exist"
+ exit 1
+ fi
+
+ if [ x"$dst" = x ]
+ then
+ echo "install: no destination specified"
+ exit 1
+ else
+ true
+ fi
+
+# If destination is a directory, append the input filename; if your system
+# does not like double slashes in filenames, you may need to add some logic
+
+ if [ -d $dst ]
+ then
+ dst="$dst"/`basename $src`
+ else
+ true
+ fi
+fi
+
+## this sed command emulates the dirname command
+dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
+
+# Make sure that the destination directory exists.
+# this part is taken from Noah Friedman's mkinstalldirs script
+
+# Skip lots of stat calls in the usual case.
+if [ ! -d "$dstdir" ]; then
+defaultIFS='
+'
+IFS="${IFS-${defaultIFS}}"
+
+oIFS="${IFS}"
+# Some sh's can't handle IFS=/ for some reason.
+IFS='%'
+set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`
+IFS="${oIFS}"
+
+pathcomp=''
+
+while [ $# -ne 0 ] ; do
+ pathcomp="${pathcomp}${1}"
+ shift
+
+ if [ ! -d "${pathcomp}" ] ;
+ then
+ $mkdirprog "${pathcomp}"
+ else
+ true
+ fi
+
+ pathcomp="${pathcomp}/"
+done
+fi
+
+if [ x"$dir_arg" != x ]
+then
+ $doit $instcmd $dst &&
+
+ if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi &&
+ if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi &&
+ if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi &&
+ if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi
+else
+
+# If we're going to rename the final executable, determine the name now.
+
+ if [ x"$transformarg" = x ]
+ then
+ dstfile=`basename $dst`
+ else
+ dstfile=`basename $dst $transformbasename |
+ sed $transformarg`$transformbasename
+ fi
+
+# don't allow the sed command to completely eliminate the filename
+
+ if [ x"$dstfile" = x ]
+ then
+ dstfile=`basename $dst`
+ else
+ true
+ fi
+
+# Make a temp file name in the proper directory.
+
+ dsttmp=$dstdir/#inst.$$#
+
+# Move or copy the file name to the temp name
+
+ $doit $instcmd $src $dsttmp &&
+
+ trap "rm -f ${dsttmp}" 0 &&
+
+# and set any options; do chmod last to preserve setuid bits
+
+# If any of these fail, we abort the whole thing. If we want to
+# ignore errors from any of these, just make sure not to ignore
+# errors from the above "$doit $instcmd $src $dsttmp" command.
+
+ if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi &&
+ if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi &&
+ if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi &&
+ if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi &&
+
+# Now rename the file to the real destination.
+
+ $doit $rmcmd -f $dstdir/$dstfile &&
+ $doit $mvcmd $dsttmp $dstdir/$dstfile
+
+fi &&
+
+
+exit 0
diff --git a/winsup/w32api/lib/Makefile.in b/winsup/w32api/lib/Makefile.in
new file mode 100644
index 000000000..ffdb7ad71
--- /dev/null
+++ b/winsup/w32api/lib/Makefile.in
@@ -0,0 +1,181 @@
+#
+# Makefile.in
+#
+# This file is part of a free library for the Win32 API.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+
+# start config section
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+VPATH = @srcdir@
+
+target_alias = @target_alias@
+prefix = @prefix@
+
+program_transform_name = @program_transform_name@
+exec_prefix = @exec_prefix@
+bindir = @bindir@
+libdir = @libdir@
+tooldir = $(exec_prefix)/$(target_alias)
+datadir = @datadir@
+infodir = @infodir@
+includedir = @includedir@
+
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+mkinstalldirs = mkdir -p
+
+CC = @CC@
+CC_FOR_TARGET = $(CC)
+
+DLLTOOL = @DLLTOOL@
+DLLTOOL_FLAGS = --as=$(AS) -k
+AS = @AS@
+AS_FOR_TARGET = $(AS_FOR_TARGET)
+WINDRES = @WINDRES@
+
+# Depending on if we build as part of winsup or mingw we need to
+# add additional include paths in order to get the correct headers
+# from the C library.
+BUILDENV = @BUILDENV@
+
+ifeq ($(BUILDENV), cygwin)
+# winsup/include
+# winsup/../newlib/libc/include
+# winsup/../newlib/libc/sys/cygwin
+EXTRA_INCLUDES = -I$(srcdir)/../../include -I$(srcdir)/../../../newlib/libc/include -I$(srcdir)/../../../newlib/libc/sys/cygwin
+endif
+ifeq ($(BUILDENV), mingw)
+EXTRA_INCLUDES = -I$(srcdir)/../../mingw/include
+endif
+
+INCLUDES = -I$(srcdir)/../include $(EXTRA_INCLUDES)
+
+CFLAGS = @CFLAGS@
+ALL_CFLAGS = $(CFLAGS) $(INCLUDES)
+
+RANLIB = @RANLIB@
+AR = @AR@
+LD = @LD@
+
+# end config section
+
+# headers
+
+HEADERS = $(notdir $(wildcard $(srcdir)/../include/*.h))
+
+# libraries
+
+DEF_FILES = $(notdir $(wildcard $(srcdir)/*.def))
+IMPLIBS = $(addprefix lib,$(subst .def,.a,$(DEF_FILES)))
+EXTRA_LIBS=libuuid.a libscrnsave.a libscrnsavw.a libdxguid.a liblargeint.a
+LIBS = $(IMPLIBS) $(EXTRA_LIBS)
+EXTRA_OBJS=uuid.o shell32.o dxguid.o scrnsave.o scrnsavw.o largeint.o $(UUID_OBJS) dinput.o
+SOURCES = scrnsave.c shell32.c uuid.c largeint.c dinput.c dxguid.c \
+res.rc test.c
+
+DISTFILES = Makefile.in $(DEF_FILES) $(SOURCES)
+
+# targets
+all: $(LIBS) $(EXTRA_OBJS)
+
+TEST_OPTIONS = $(ALL_CFLAGS) -Wall -c $(srcdir)/test.c -o test.o
+.PHONY: test
+test:
+ @echo "Testing w32api..."
+ @for lang in c c++ objective-c ; do \
+ echo "$$lang..."; \
+ $(CC) -x$$lang $(TEST_OPTIONS) ; \
+ echo "$$lang UNICODE..."; \
+ $(CC) -x$$lang -DUNICODE $(TEST_OPTIONS) ; \
+ done
+ @echo "windres..."
+ @$(WINDRES) --include-dir $(INCDIR) -i $(srcdir)/res.rc -o test.o
+ @echo "windres UNICODE..."
+ @$(WINDRES) --define UNICODE --include-dir $(INCDIR) -i $(srcdir)/res.rc -o test.o
+ @rm -f test.o
+
+scrnsavw.o: scrnsave.c
+ $(CC) -c $(ALL_CFLAGS) -DUNICODE -o $@ $<
+
+# make rules
+
+.SUFFIXES: .c .o .def .a
+
+.c.o:
+ $(CC) -c $(ALL_CFLAGS) -o $@ $<
+
+lib%.a : %.def %.o
+ $(DLLTOOL) $(DLLTOOL_FLAGS) --output-lib $@ --def $(srcdir)/$*.def
+ $(AR) r $@ $*.o
+ $(RANLIB) $@
+
+lib%.a: %.def
+ $(DLLTOOL) $(DLLTOOL_FLAGS) --output-lib $@ --def $<
+
+lib%.a: %.o
+ $(AR) rc $@ $*.o
+ $(RANLIB) $@
+
+# install headers and libraries
+install: install-libraries install-headers
+
+install-libraries: all
+ $(mkinstalldirs) $(tooldir)/lib
+ for i in $(LIBS); do \
+ $(INSTALL_DATA) $$i $(tooldir)/lib/$$i ; \
+ done
+
+install-headers:
+ $(mkinstalldirs) $(tooldir)/include
+ for i in $(HEADERS); do \
+ $(INSTALL_DATA) $(srcdir)/../include/$$i $(tooldir)/include/$$i ; \
+ done
+
+# uninstall headers and libraries
+uninstall: uninstall-libraries uninstall-headers
+
+uninstall-libraries:
+ @for i in $(LIBS); do \
+ rm -f $(tooldir)/lib/$$i ; \
+ done
+
+uninstall-headers:
+ @for i in $(HEADERS); do \
+ rm -f $(tooldir)/include/$$i ; \
+ done
+
+dist:
+ mkdir $(distdir)/include
+ chmod 755 $(distdir)/include
+ @for i in $(HEADERS); do \
+ cp -p $(srcdir)/../include/$$i $(distdir)/include/$$i ; \
+ done
+ mkdir $(distdir)/lib
+ chmod 755 $(distdir)/lib
+ @for i in $(DISTFILES); do \
+ cp -p $(srcdir)/$$i $(distdir)/lib/$$i ; \
+ done
+
+Makefile: Makefile.in ../config.status ../configure
+ cd ..; $(SHELL) config.status
+
+# clean
+
+mostlyclean:
+ rm -f *~ *.o *.s
+
+clean:
+ rm -f *.o *.a *.s *~
+
+distclean: clean
+ rm -f config.cache config.status config.log Makefile
+
+maintainer-clean: distclean
diff --git a/winsup/w32api/lib/advapi32.def b/winsup/w32api/lib/advapi32.def
new file mode 100644
index 000000000..7cceaa1de
--- /dev/null
+++ b/winsup/w32api/lib/advapi32.def
@@ -0,0 +1,350 @@
+LIBRARY "ADVAPI32.DLL"
+EXPORTS
+AbortSystemShutdownA@4
+AbortSystemShutdownW@4
+AccessCheck@32
+AccessCheckAndAuditAlarmA@44
+AccessCheckAndAuditAlarmW@44
+AddAccessAllowedAce@16
+AddAccessDeniedAce@16
+AddAce@20
+AddAuditAccessAce@24
+AdjustTokenGroups@24
+AdjustTokenPrivileges@24
+AllocateAndInitializeSid@44
+AllocateLocallyUniqueId@4
+AreAllAccessesGranted@8
+AreAnyAccessesGranted@8
+BackupEventLogA@8
+BackupEventLogW@8
+BuildExplicitAccessWithName@20
+BuildSecurityDescriptor@36
+BuildTrusteeWithName@8
+BuildTrusteeWithSid@8
+ChangeServiceConfigA@44
+ChangeServiceConfigW@44
+ClearEventLogA@8
+ClearEventLogW@8
+CloseEventLog@4
+CloseServiceHandle@4
+ControlService@12
+CopySid@12
+CreatePrivateObjectSecurity@24
+CreateProcessAsUserA@44
+CreateProcessAsUserW@44
+CreateServiceA@52
+CreateServiceW@52
+CryptAcquireContextA@20
+CryptAcquireContextW@20
+CryptCreateHash@20
+CryptDecrypt@24
+CryptDeriveKey@20
+CryptDestroyHash@4
+CryptDestroyKey@4
+CryptEncrypt@28
+CryptExportKey@24
+CryptGenKey@16
+CryptGenRandom@12
+CryptGetHashParam@20
+CryptGetKeyParam@20
+CryptGetProvParam@20
+CryptGetUserKey@12
+CryptHashData@16
+CryptHashSessionKey@12
+CryptImportKey@24
+CryptReleaseContext@8
+CryptSetHashParam@16
+CryptSetKeyParam@16
+CryptSetProvParam@16
+CryptSetProviderA@8
+CryptSetProviderW@8
+CryptSignHashA@24
+CryptSignHashW@24
+CryptVerifySignatureA@24
+CryptVerifySignatureW@24
+DeleteAce@8
+DeleteService@4
+DeregisterEventSource@4
+DestroyPrivateObjectSecurity@4
+DuplicateToken@12
+DuplicateTokenEx@24
+ElfBackupEventLogFileA@8
+ElfBackupEventLogFileW@8
+ElfChangeNotify@8
+ElfClearEventLogFileA@8
+ElfClearEventLogFileW@8
+ElfCloseEventLog@4
+ElfDeregisterEventSource@4
+ElfNumberOfRecords@8
+ElfOldestRecord@8
+ElfOpenBackupEventLogA@12
+ElfOpenBackupEventLogW@12
+ElfOpenEventLogA@12
+ElfOpenEventLogW@12
+ElfReadEventLogA@28
+ElfReadEventLogW@28
+ElfRegisterEventSourceA@12
+ElfRegisterEventSourceW@12
+ElfReportEventA@48
+ElfReportEventW@48
+EnumDependentServicesA@24
+EnumDependentServicesW@24
+EnumServicesStatusA@32
+EnumServicesStatusW@32
+EqualPrefixSid@8
+EqualSid@8
+FindFirstFreeAce@8
+FreeSid@4
+GetAce@12
+GetAclInformation@16
+GetFileSecurityA@20
+GetFileSecurityW@20
+GetKernelObjectSecurity@20
+GetLengthSid@4
+GetNamedSecurityInfo@32
+GetNumberOfEventLogRecords@8
+GetOldestEventLogRecord@8
+GetPrivateObjectSecurity@20
+GetSecurityDescriptorControl@12
+GetSecurityDescriptorDacl@16
+GetSecurityDescriptorGroup@12
+GetSecurityDescriptorLength@4
+GetSecurityDescriptorOwner@12
+GetSecurityDescriptorSacl@16
+GetSecurityInfo@32
+GetServiceDisplayNameA@16
+GetServiceDisplayNameW@16
+GetServiceKeyNameA@16
+GetServiceKeyNameW@16
+GetSidIdentifierAuthority@4
+GetSidLengthRequired@4
+GetSidSubAuthority@8
+GetSidSubAuthorityCount@4
+GetTokenInformation@20
+GetTrusteeForm@4
+GetTrusteeName@4
+GetTrusteeType@4
+GetUserNameA@8
+GetUserNameW@8
+I_ScSetServiceBitsA@20
+I_ScSetServiceBitsW@20
+ImpersonateLoggedOnUser@4
+ImpersonateNamedPipeClient@4
+ImpersonateSelf@4
+InitializeAcl@12
+InitializeSecurityDescriptor@8
+InitializeSid@12
+InitiateSystemShutdownA@20
+InitiateSystemShutdownW@20
+IsTextUnicode@12
+IsValidAcl@4
+IsValidSecurityDescriptor@4
+IsValidSid@4
+LockServiceDatabase@4
+LogonUserA@24
+LogonUserW@24
+LookupAccountNameA@28
+LookupAccountNameW@28
+LookupAccountSidA@28
+LookupAccountSidW@28
+LookupPrivilegeDisplayNameA@20
+LookupPrivilegeDisplayNameW@20
+LookupPrivilegeNameA@16
+LookupPrivilegeNameW@16
+LookupPrivilegeValueA@12
+LookupPrivilegeValueW@12
+LookupSecurityDescriptorParts@28
+LsaAddAccountRights@16
+LsaAddPrivilegesToAccount@8
+LsaClearAuditLog@4
+LsaClose@4
+LsaCreateAccount@16
+LsaCreateSecret@16
+LsaCreateTrustedDomain@16
+LsaDelete@4
+LsaDeleteTrustedDomain@8
+LsaEnumerateAccountRights@16
+LsaEnumerateAccounts@20
+LsaEnumerateAccountsWithUserRight@16
+LsaEnumeratePrivileges@20
+LsaEnumeratePrivilegesOfAccount@8
+LsaEnumerateTrustedDomains@20
+LsaFreeMemory@4
+LsaGetQuotasForAccount@8
+LsaGetSystemAccessAccount@8
+LsaICLookupNames@28
+LsaICLookupSids@28
+LsaLookupNames@20
+LsaLookupPrivilegeDisplayName@16
+LsaLookupPrivilegeName@12
+LsaLookupPrivilegeValue@12
+LsaLookupSids@20
+LsaNtStatusToWinError@4
+LsaOpenAccount@16
+LsaOpenPolicy@16
+LsaOpenSecret@16
+LsaOpenTrustedDomain@16
+LsaQueryInfoTrustedDomain@12
+LsaQueryInformationPolicy@12
+LsaQuerySecret@20
+LsaQuerySecurityObject@12
+LsaQueryTrustedDomainInfo@16
+LsaRemoveAccountRights@20
+LsaRemovePrivilegesFromAccount@12
+LsaRetrievePrivateData@12
+LsaSetInformationPolicy@12
+LsaSetInformationTrustedDomain@12
+LsaSetQuotasForAccount@8
+LsaSetSecret@12
+LsaSetSecurityObject@12
+LsaSetSystemAccessAccount@8
+LsaSetTrustedDomainInformation@16
+LsaStorePrivateData@12
+MakeAbsoluteSD@44
+MakeSelfRelativeSD@12
+MapGenericMask@8
+NotifyBootConfigStatus@4
+NotifyChangeEventLog@8
+ObjectCloseAuditAlarmA@12
+ObjectCloseAuditAlarmW@12
+ObjectDeleteAuditAlarmA@12
+ObjectDeleteAuditAlarmW@12
+ObjectOpenAuditAlarmA@48
+ObjectOpenAuditAlarmW@48
+ObjectPrivilegeAuditAlarmA@24
+ObjectPrivilegeAuditAlarmW@24
+OpenBackupEventLogA@8
+OpenBackupEventLogW@8
+OpenEventLogA@8
+OpenEventLogW@8
+OpenProcessToken@12
+OpenSCManagerA@12
+OpenSCManagerW@12
+OpenServiceA@12
+OpenServiceW@12
+OpenThreadToken@16
+PrivilegeCheck@12
+PrivilegedServiceAuditAlarmA@20
+PrivilegedServiceAuditAlarmW@20
+QueryServiceConfigA@16
+QueryServiceConfigW@16
+QueryServiceLockStatusA@16
+QueryServiceLockStatusW@16
+QueryServiceObjectSecurity@20
+QueryServiceStatus@8
+QueryWindows31FilesMigration@4
+ReadEventLogA@28
+ReadEventLogW@28
+RegCloseKey@4
+RegConnectRegistryA@12
+RegConnectRegistryW@12
+RegCreateKeyA@12
+RegCreateKeyExA@36
+RegCreateKeyExW@36
+RegCreateKeyW@12
+RegDeleteKeyA@8
+RegDeleteKeyW@8
+RegDeleteValueA@8
+RegDeleteValueW@8
+RegEnumKeyA@16
+RegEnumKeyExA@32
+RegEnumKeyExW@32
+RegEnumKeyW@16
+RegEnumValueA@32
+RegEnumValueW@32
+RegFlushKey@4
+RegGetKeySecurity@16
+RegLoadKeyA@12
+RegLoadKeyW@12
+RegNotifyChangeKeyValue@20
+RegOpenKeyA@12
+RegOpenKeyExA@20
+RegOpenKeyExW@20
+RegOpenKeyW@12
+RegQueryInfoKeyA@48
+RegQueryInfoKeyW@48
+RegQueryMultipleValuesA@20
+RegQueryMultipleValuesW@20
+RegQueryValueA@16
+RegQueryValueExA@24
+RegQueryValueExW@24
+RegQueryValueW@16
+RegReplaceKeyA@16
+RegReplaceKeyW@16
+RegRestoreKeyA@12
+RegRestoreKeyW@12
+RegSaveKeyA@12
+RegSaveKeyW@12
+RegSetKeySecurity@12
+RegSetValueA@20
+RegSetValueExA@24
+RegSetValueExW@24
+RegSetValueW@20
+RegUnLoadKeyA@8
+RegUnLoadKeyW@8
+RegisterEventSourceA@8
+RegisterEventSourceW@8
+RegisterServiceCtrlHandlerA@8
+RegisterServiceCtrlHandlerW@8
+ReportEventA@36
+ReportEventW@36
+RevertToSelf@0
+SetAclInformation@16
+SetEntriesInAcl@16
+SetFileSecurityA@12
+SetFileSecurityW@12
+SetKernelObjectSecurity@12
+SetNamedSecurityInfo@28
+SetPrivateObjectSecurity@20
+SetSecurityDescriptorDacl@16
+SetSecurityDescriptorGroup@12
+SetSecurityDescriptorOwner@12
+SetSecurityDescriptorSacl@16
+SetSecurityInfo@@28
+SetServiceBits@16
+SetServiceObjectSecurity@12
+SetServiceStatus@8
+SetThreadToken@8
+SetTokenInformation@16
+StartServiceA@12
+StartServiceCtrlDispatcherA@4
+StartServiceCtrlDispatcherW@4
+StartServiceW@12
+SynchronizeWindows31FilesAndWindowsNTRegistry@16
+SystemFunction001@12
+SystemFunction002@12
+SystemFunction003@8
+SystemFunction004@12
+SystemFunction005@12
+SystemFunction006@8
+SystemFunction007@8
+SystemFunction008@12
+SystemFunction009@12
+SystemFunction010@12
+SystemFunction011@12
+SystemFunction012@12
+SystemFunction013@12
+SystemFunction014@12
+SystemFunction015@12
+SystemFunction016@12
+SystemFunction017@12
+SystemFunction018@12
+SystemFunction019@12
+SystemFunction020@12
+SystemFunction021@12
+SystemFunction022@12
+SystemFunction023@12
+SystemFunction024@12
+SystemFunction025@12
+SystemFunction026@12
+SystemFunction027@12
+SystemFunction028@8
+SystemFunction029@8
+SystemFunction030@8
+SystemFunction031@8
+SystemFunction032@8
+SystemFunction033@8
+UnlockServiceDatabase@4
+WinLoadTrustProvider@4
+WinSubmitCertificate@4
+WinVerifyTrust@12
diff --git a/winsup/w32api/lib/cap.def b/winsup/w32api/lib/cap.def
new file mode 100644
index 000000000..f34d9f7e7
--- /dev/null
+++ b/winsup/w32api/lib/cap.def
@@ -0,0 +1,6 @@
+LIBRARY "CAP.DLL"
+EXPORTS
+DumpCAP@0
+StartCAP@0
+StopCAP@0
+_penter
diff --git a/winsup/w32api/lib/comctl32.def b/winsup/w32api/lib/comctl32.def
new file mode 100644
index 000000000..f61ac3831
--- /dev/null
+++ b/winsup/w32api/lib/comctl32.def
@@ -0,0 +1,128 @@
+LIBRARY "COMCTL32.DLL"
+EXPORTS
+_TrackMouseEvent@4
+AddMRUData@12
+AddMRUStringA@8
+AddMRUStringW@8
+Alloc@4
+CreateMRUListA@4
+CreateMRUListW@4
+CreateMappedBitmap@20
+CreatePage@8
+CreatePropertySheetPage@4
+CreatePropertySheetPageA@4
+CreatePropertySheetPageW@4
+CreateProxyPage@8
+CreateStatusWindow@16
+CreateStatusWindowA@16
+CreateStatusWindowW@16
+CreateToolbar@32
+CreateToolbarEx@52
+CreateUpDownControl@48
+DPA_Clone@8
+DPA_Create@4
+DPA_CreateEx@8
+DPA_DeleteAllPtrs@4
+DPA_DeletePtr@8
+DPA_Destroy@4
+DPA_GetPtr@8
+DPA_GetPtrIndex@8
+DPA_Grow@8
+DPA_InsertPtr@12
+DPA_Search@24
+DPA_SetPtr@12
+DPA_Sort@12
+DSA_Create@8
+DSA_DeleteAllItems@4
+DSA_DeleteItem@8
+DSA_Destroy@4
+DSA_GetItem@12
+DSA_GetItemPtr@8
+DSA_InsertItem@12
+DSA_SetItem@12
+DelMRUString@8
+DestroyPropertySheetPage@4
+DrawInsert@12
+DrawStatusText@16
+DrawStatusTextA@16
+DrawStatusTextW@16
+EnumMRUListA@16
+EnumMRUListW@16
+FindMRUData@16
+FindMRUStringA@12
+FindMRUStringW@12
+Free@4
+FreeMRUList@4
+GetEffectiveClientRect@12
+GetSize@4
+ImageList_Add@12
+ImageList_AddIcon@8
+ImageList_AddMasked@12
+ImageList_BeginDrag@16
+ImageList_Create@20
+ImageList_Destroy@4
+ImageList_DragEnter@12
+ImageList_DragLeave@4
+ImageList_DragMove@8
+ImageList_DragShowNolock@4
+ImageList_Draw@24
+ImageList_DrawEx@40
+ImageList_EndDrag@0
+ImageList_GetBkColor@4
+ImageList_GetDragImage@8
+ImageList_GetIcon@12
+ImageList_GetIconSize@12
+ImageList_GetImageCount@4
+ImageList_GetImageInfo@12
+ImageList_GetImageRect@12
+ImageList_LoadImage@28
+ImageList_LoadImageA@28
+ImageList_LoadImageW@28
+ImageList_Merge@24
+ImageList_Read@4
+ImageList_Remove@8
+ImageList_Replace@16
+ImageList_ReplaceIcon@12
+ImageList_SetBkColor@8
+ImageList_SetDragCursorImage@16
+ImageList_SetIconSize@12
+ImageList_SetOverlayImage@12
+ImageList_Write@8
+InitCommonControls@0
+InitCommonControlsEx@4
+LBItemFromPt@16
+MakeDragList@4
+MenuHelp@28
+PropertySheet@4
+PropertySheetA@4
+PropertySheetW@4
+ReAlloc@8
+SendNotify@16
+SendNotifyEx@20
+ShowHideMenuCtl@12
+StrCSpnA@8
+StrCSpnIA@8
+StrCSpnW@8
+StrChrA@8
+StrChrIA@8
+StrChrIW@8
+StrChrW@8
+StrCmpNA@12
+StrCmpNIA@12
+StrCmpNIW@12
+StrCmpNW@12
+StrRChrA@12
+StrRChrIA@12
+StrRChrW@12
+StrRStrIA@12
+StrRStrIW@12
+StrStrA@8
+StrStrIA@8
+StrStrIW@8
+StrStrW@8
+StrToIntA@4
+StrToIntW@4
+Str_GetPtrA@12
+Str_GetPtrW@12
+Str_SetPtrA@8
+Str_SetPtrW@8
diff --git a/winsup/w32api/lib/comdlg32.def b/winsup/w32api/lib/comdlg32.def
new file mode 100644
index 000000000..49d94a79d
--- /dev/null
+++ b/winsup/w32api/lib/comdlg32.def
@@ -0,0 +1,25 @@
+LIBRARY "COMDLG32.DLL"
+EXPORTS
+ChooseColorA@4
+ChooseColorW@4
+ChooseFontA@4
+ChooseFontW@4
+CommDlgExtendedError@0
+FindTextA@4
+FindTextW@4
+GetFileTitleA@12
+GetFileTitleW@12
+GetOpenFileNameA@4
+GetOpenFileNameW@4
+GetSaveFileNameA@4
+GetSaveFileNameW@4
+LoadAlterBitmap@12
+PageSetupDlgA@4
+PageSetupDlgW@4
+PrintDlgA@4
+PrintDlgW@4
+ReplaceTextA@4
+ReplaceTextW@4
+WantArrows@16
+dwLBSubclass@16
+dwOKSubclass@16
diff --git a/winsup/w32api/lib/ctl3d32.def b/winsup/w32api/lib/ctl3d32.def
new file mode 100644
index 000000000..130c0a567
--- /dev/null
+++ b/winsup/w32api/lib/ctl3d32.def
@@ -0,0 +1,27 @@
+LIBRARY CTL3D32.DLL
+EXPORTS
+BtnWndProc3d@16
+ComboWndProc3d@16
+Ctl3dAutoSubclass@4
+Ctl3dAutoSubclassEx@8
+Ctl3dColorChange@0
+Ctl3dCtlColor@8
+Ctl3dCtlColorEx@12
+Ctl3dDlgFramePaint@16
+Ctl3dDlgProc@16
+Ctl3dEnabled@0
+Ctl3dGetVer@0
+Ctl3dIsAutoSubclass@0
+Ctl3dRegister@4
+Ctl3dSetStyle@12
+Ctl3dSubclassCtl@4
+Ctl3dSubclassCtlEx@8
+Ctl3dSubclassDlg@8
+Ctl3dSubclassDlgEx@8
+Ctl3dUnAutoSubclass@0
+Ctl3dUnregister@4
+Ctl3dUnsubclassCtl@4
+Ctl3dWinIniChange@0
+EditWndProc3d@16
+ListWndProc3d@16
+StaticWndProc3d@16
diff --git a/winsup/w32api/lib/d3dim.def b/winsup/w32api/lib/d3dim.def
new file mode 100644
index 000000000..3956d1552
--- /dev/null
+++ b/winsup/w32api/lib/d3dim.def
@@ -0,0 +1,8 @@
+; from DirectX 6.1
+LIBRARY "d3dim.dll"
+EXPORTS
+Direct3DCreate@12
+Direct3D_HALCleanUp@8
+SpanInit
+g_fOneMinusEps
+g_fTwoPow31
diff --git a/winsup/w32api/lib/d3drm.def b/winsup/w32api/lib/d3drm.def
new file mode 100644
index 000000000..f55c4fd63
--- /dev/null
+++ b/winsup/w32api/lib/d3drm.def
@@ -0,0 +1,24 @@
+; from DirectX 6.1
+LIBRARY "d3drm.dll"
+EXPORTS
+D3DRMColorGetAlpha@4
+D3DRMColorGetBlue@4
+D3DRMColorGetGreen@4
+D3DRMColorGetRed@4
+D3DRMCreateColorRGB@12
+D3DRMCreateColorRGBA@16
+D3DRMMatrixFromQuaternion@8
+D3DRMQuaternionFromRotation@12
+D3DRMQuaternionMultiply@12
+D3DRMQuaternionSlerp@16
+D3DRMVectorAdd@12
+D3DRMVectorCrossProduct@12
+D3DRMVectorDotProduct@8
+D3DRMVectorModulus@4
+D3DRMVectorNormalize@4
+D3DRMVectorRandom@4
+D3DRMVectorReflect@12
+D3DRMVectorRotate@16
+D3DRMVectorScale@12
+D3DRMVectorSubtract@12
+Direct3DRMCreate@4
diff --git a/winsup/w32api/lib/d3dxof.def b/winsup/w32api/lib/d3dxof.def
new file mode 100644
index 000000000..d12e2048b
--- /dev/null
+++ b/winsup/w32api/lib/d3dxof.def
@@ -0,0 +1,4 @@
+; from DirectX 6.1
+LIBRARY "d3dxof.dll"
+EXPORTS
+DirectXFileCreate@4
diff --git a/winsup/w32api/lib/ddraw.def b/winsup/w32api/lib/ddraw.def
new file mode 100644
index 000000000..ea49045c1
--- /dev/null
+++ b/winsup/w32api/lib/ddraw.def
@@ -0,0 +1,28 @@
+; from DirectX 6.1
+LIBRARY "DDRAW.dll"
+EXPORTS
+D3DParseUnknownCommand@8
+DDHAL32_VidMemAlloc@16
+DDHAL32_VidMemFree@12
+DDInternalLock@8
+DDInternalUnlock@4
+DSoundHelp@12
+DirectDrawCreate@12
+DirectDrawCreateClipper@12
+DirectDrawEnumerateA@8
+DirectDrawEnumerateExA@12
+DirectDrawEnumerateExW@12
+DirectDrawEnumerateW@8
+GetAliasedVidMem
+GetNextMipMap
+GetSurfaceFromDC@12
+HeapVidMemAllocAligned@20
+InternalLock
+InternalUnlock
+LateAllocateSurfaceMem@16
+VidMemAlloc@12
+VidMemAmountFree@4
+VidMemFini@4
+VidMemFree@8
+VidMemInit@20
+VidMemLargestFree@4
diff --git a/winsup/w32api/lib/dinput.c b/winsup/w32api/lib/dinput.c
new file mode 100644
index 000000000..16580fbd6
--- /dev/null
+++ b/winsup/w32api/lib/dinput.c
@@ -0,0 +1,2488 @@
+/*
+ DINPUT.C
+
+ Author: Daniel Guerrero Miralles (daguer@geocities.com)
+ Version: 1.1.2
+ Date: 12/98
+
+ ABSTRACT:
+ DirectInput library static data source code. For DirectX 6.1 and
+ earlier versions.
+
+ LEGAL INFORMATION:
+ This is PUBLIC DOMAIN source code. The source code in this file is
+ provided "as is", without any warranty, including but not limited to,
+ fitness for any particular purpose.
+
+ REMARKS:
+ - Fixed bug in c_dfDIMouse definition.
+
+ TODO:
+ Nothing.
+*/
+
+#if defined(__LCC__) || defined(__GNUC__)
+#include <windows.h>
+#include <objbase.h>
+#else
+#include <basetyps.h>
+#endif
+
+/* --- Types and constants --- */
+
+typedef struct DIOBJECTDATAFORMAT_TAG
+{
+ const GUID * pguid;
+ DWORD dwOfw;
+ DWORD dwType;
+ DWORD dwFlags;
+} DIOBJECTDATAFORMAT;
+
+typedef struct DIDATAFORMAT_TAG {
+ DWORD dwSize;
+ DWORD dwObjSize;
+ DWORD dwFlags;
+ DWORD dwDataSize;
+ DWORD dwNumObjs;
+ DIOBJECTDATAFORMAT * rgodf;
+} DIDATAFORMAT;
+
+#define DIDF_ABSAXIS 1L
+#define DIDF_RELAXIS 2L
+#define DIDFT_AXIS 3L
+#define DIDFT_BUTTON 12L
+#define DIDFT_POV 16L
+#define DIDFT_MAKEINSTANCE(x) ((WORD)(x)<<8)
+#define DIDFT_ANYINSTANCE (DIDFT_MAKEINSTANCE(-1))
+#define DIDOI_ASPECTPOSITION (1L<<8)
+#define DIDOI_ASPECTVELOCITY (2L<<8)
+#define DIDOI_ASPECTACCEL (3L<<8)
+#define DIDOI_ASPECTFORCE (4L<<8)
+
+extern GUID GUID_XAxis;
+extern GUID GUID_YAxis;
+extern GUID GUID_ZAxis;
+extern GUID GUID_RxAxis;
+extern GUID GUID_RyAxis;
+extern GUID GUID_RzAxis;
+extern GUID GUID_Slider;
+extern GUID GUID_Key;
+extern GUID GUID_POV;
+
+/* --- Static data --- */
+
+static DIOBJECTDATAFORMAT diodfKeyData[] =
+{
+ {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 0,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(0),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 1,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(1),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 2,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(2),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 3,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(3),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 4,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(4),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 5,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(5),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 6,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(6),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 7,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(7),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 8,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(8),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 9,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(9),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 10,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(10),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 11,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(11),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 12,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(12),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 13,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(13),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 14,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(14),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 15,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(15),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 16,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(16),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 17,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(17),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 18,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(18),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 19,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(19),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 20,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(20),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 21,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(21),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 22,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(22),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 23,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(23),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 24,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(24),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 25,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(25),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 26,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(26),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 27,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(27),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 28,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(28),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 29,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(29),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 30,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(30),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 31,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(31),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 32,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(32),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 33,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(33),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 34,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(34),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 35,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(35),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 36,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(36),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 37,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(37),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 38,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(38),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 39,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(39),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 40,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(40),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 41,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(41),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 42,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(42),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 43,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(43),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 44,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(44),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 45,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(45),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 46,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(46),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 47,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(47),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 48,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(48),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 49,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(49),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 50,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(50),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 51,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(51),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 52,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(52),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 53,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(53),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 54,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(54),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 55,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(55),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 56,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(56),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 57,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(57),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 58,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(58),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 59,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(59),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 60,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(60),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 61,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(61),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 62,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(62),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 63,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(63),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 64,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(64),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 65,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(65),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 66,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(66),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 67,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(67),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 68,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(68),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 69,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(69),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 70,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(70),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 71,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(71),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 72,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(72),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 73,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(73),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 74,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(74),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 75,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(75),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 76,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(76),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 77,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(77),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 78,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(78),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 79,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(79),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 80,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(80),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 81,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(81),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 82,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(82),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 83,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(83),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 84,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(84),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 85,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(85),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 86,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(86),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 87,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(87),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 88,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(88),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 89,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(89),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 90,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(90),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 91,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(91),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 92,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(92),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 93,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(93),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 94,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(94),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 95,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(95),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 96,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(96),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 97,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(97),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 98,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(98),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 99,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(99),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 100,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(100),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 101,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(101),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 102,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(102),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 103,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(103),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 104,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(104),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 105,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(105),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 106,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(106),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 107,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(107),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 108,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(108),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 109,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(109),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 110,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(110),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 111,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(111),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 112,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(112),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 113,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(113),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 114,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(114),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 115,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(115),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 116,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(116),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 117,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(117),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 118,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(118),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 119,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(119),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 120,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(120),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 121,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(121),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 122,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(122),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 123,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(123),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 124,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(124),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 125,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(125),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 126,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(126),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 127,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(127),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 128,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(128),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 129,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(129),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 130,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(130),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 131,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(131),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 132,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(132),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 133,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(133),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 134,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(134),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 135,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(135),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 136,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(136),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 137,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(137),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 138,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(138),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 139,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(139),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 140,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(140),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 141,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(141),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 142,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(142),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 143,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(143),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 144,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(144),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 145,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(145),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 146,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(146),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 147,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(147),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 148,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(148),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 149,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(149),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 150,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(150),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 151,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(151),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 152,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(152),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 153,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(153),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 154,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(154),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 155,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(155),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 156,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(156),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 157,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(157),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 158,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(158),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 159,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(159),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 160,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(160),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 161,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(161),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 162,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(162),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 163,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(163),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 164,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(164),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 165,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(165),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 166,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(166),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 167,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(167),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 168,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(168),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 169,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(169),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 170,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(170),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 171,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(171),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 172,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(172),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 173,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(173),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 174,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(174),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 175,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(175),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 176,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(176),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 177,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(177),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 178,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(178),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 179,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(179),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 180,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(180),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 181,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(181),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 182,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(182),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 183,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(183),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 184,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(184),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 185,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(185),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 186,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(186),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 187,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(187),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 188,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(188),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 189,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(189),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 190,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(190),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 191,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(191),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 192,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(192),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 193,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(193),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 194,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(194),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 195,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(195),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 196,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(196),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 197,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(197),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 198,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(198),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 199,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(199),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 200,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(200),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 201,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(201),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 202,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(202),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 203,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(203),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 204,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(204),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 205,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(205),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 206,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(206),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 207,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(207),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 208,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(208),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 209,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(209),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 210,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(210),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 211,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(211),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 212,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(212),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 213,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(213),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 214,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(214),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 215,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(215),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 216,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(216),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 217,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(217),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 218,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(218),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 219,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(219),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 220,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(220),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 221,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(221),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 222,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(222),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 223,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(223),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 224,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(224),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 225,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(225),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 226,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(226),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 227,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(227),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 228,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(228),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 229,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(229),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 230,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(230),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 231,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(231),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 232,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(232),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 233,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(233),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 234,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(234),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 235,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(235),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 236,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(236),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 237,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(237),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 238,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(238),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 239,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(239),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 240,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(240),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 241,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(241),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 242,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(242),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 243,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(243),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 244,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(244),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 245,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(245),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 246,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(246),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 247,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(247),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 248,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(248),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 249,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(249),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 250,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(250),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 251,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(251),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 252,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(252),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 253,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(253),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 254,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(254),
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_Key,
+ /* dwOfw = */ 255,
+ /* dwType = */ 0x80000000|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(255),
+ /* dwFlags = */ 0
+ }
+};
+
+static DIOBJECTDATAFORMAT diodfJoyData[] =
+{
+ {
+ /* pguid = */ &GUID_XAxis,
+ /* dwOfw = */ 0,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_AXIS,
+ /* dwFlags = */ DIDOI_ASPECTPOSITION
+ }, {
+ /* pguid = */ &GUID_YAxis,
+ /* dwOfw = */ 4,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_AXIS,
+ /* dwFlags = */ DIDOI_ASPECTPOSITION
+ }, {
+ /* pguid = */ &GUID_ZAxis,
+ /* dwOfw = */ 8,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_AXIS,
+ /* dwFlags = */ DIDOI_ASPECTPOSITION
+ }, {
+ /* pguid = */ &GUID_RxAxis,
+ /* dwOfw = */ 12,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_AXIS,
+ /* dwFlags = */ DIDOI_ASPECTPOSITION
+ }, {
+ /* pguid = */ &GUID_RyAxis,
+ /* dwOfw = */ 16,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_AXIS,
+ /* dwFlags = */ DIDOI_ASPECTPOSITION
+ }, {
+ /* pguid = */ &GUID_RzAxis,
+ /* dwOfw = */ 20,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_AXIS,
+ /* dwFlags = */ DIDOI_ASPECTPOSITION
+ }, {
+ /* pguid = */ &GUID_Slider,
+ /* dwOfw = */ 24,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_AXIS,
+ /* dwFlags = */ DIDOI_ASPECTPOSITION
+ }, {
+ /* pguid = */ &GUID_Slider,
+ /* dwOfw = */ 28,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_AXIS,
+ /* dwFlags = */ DIDOI_ASPECTPOSITION
+ }, {
+ /* pguid = */ &GUID_POV,
+ /* dwOfw = */ 32,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_POV,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_POV,
+ /* dwOfw = */ 36,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_POV,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_POV,
+ /* dwOfw = */ 40,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_POV,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_POV,
+ /* dwOfw = */ 44,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_POV,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 48,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 49,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 50,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 51,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 52,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 53,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 54,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 55,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 56,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 57,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 58,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 59,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 60,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 61,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 62,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 63,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 64,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 65,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 66,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 67,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 68,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 69,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 70,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 71,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 72,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 73,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 74,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 75,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 76,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 77,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 78,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 79,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }
+};
+
+static DIOBJECTDATAFORMAT diodfJoy2Data[] =
+{
+ {
+ /* pguid = */ &GUID_XAxis,
+ /* dwOfw = */ 0,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_AXIS,
+ /* dwFlags = */ DIDOI_ASPECTPOSITION
+ }, {
+ /* pguid = */ &GUID_YAxis,
+ /* dwOfw = */ 4,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_AXIS,
+ /* dwFlags = */ DIDOI_ASPECTPOSITION
+ }, {
+ /* pguid = */ &GUID_ZAxis,
+ /* dwOfw = */ 8,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_AXIS,
+ /* dwFlags = */ DIDOI_ASPECTPOSITION
+ }, {
+ /* pguid = */ &GUID_RxAxis,
+ /* dwOfw = */ 12,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_AXIS,
+ /* dwFlags = */ DIDOI_ASPECTPOSITION
+ }, {
+ /* pguid = */ &GUID_RyAxis,
+ /* dwOfw = */ 16,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_AXIS,
+ /* dwFlags = */ DIDOI_ASPECTPOSITION
+ }, {
+ /* pguid = */ &GUID_RzAxis,
+ /* dwOfw = */ 20,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_AXIS,
+ /* dwFlags = */ DIDOI_ASPECTPOSITION
+ }, {
+ /* pguid = */ &GUID_Slider,
+ /* dwOfw = */ 24,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_AXIS,
+ /* dwFlags = */ DIDOI_ASPECTPOSITION
+ }, {
+ /* pguid = */ &GUID_Slider,
+ /* dwOfw = */ 28,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_AXIS,
+ /* dwFlags = */ DIDOI_ASPECTPOSITION
+ }, {
+ /* pguid = */ &GUID_POV,
+ /* dwOfw = */ 32,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_POV,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_POV,
+ /* dwOfw = */ 36,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_POV,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_POV,
+ /* dwOfw = */ 40,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_POV,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_POV,
+ /* dwOfw = */ 44,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_POV,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 48,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 49,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 50,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 51,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 52,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 53,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 54,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 55,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 56,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 57,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 58,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 59,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 60,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 61,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 62,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 63,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 64,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 65,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 66,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 67,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 68,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 69,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 70,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 71,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 72,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 73,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 74,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 75,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 76,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 77,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 78,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 79,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 80,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 81,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 82,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 83,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 84,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 85,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 86,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 87,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 88,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 89,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 90,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 91,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 92,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 93,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 94,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 95,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 96,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 97,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 98,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 99,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 100,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 101,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 102,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 103,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 104,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 105,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 106,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 107,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 108,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 109,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 110,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 111,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 112,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 113,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 114,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 115,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 116,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 117,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 118,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 119,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 120,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 121,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 122,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 123,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 124,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 125,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 126,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 127,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 128,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 129,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 130,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 131,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 132,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 133,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 134,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 135,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 136,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 137,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 138,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 139,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 140,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 141,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 142,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 143,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 144,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 145,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 146,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 147,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 148,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 149,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 150,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 151,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 152,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 153,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 154,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 155,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 156,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 157,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 158,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 159,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 160,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 161,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 162,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 163,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 164,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 165,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 166,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 167,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 168,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 169,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 170,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 171,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 172,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 173,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 174,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 175,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_XAxis,
+ /* dwOfw = */ 176,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_AXIS,
+ /* dwFlags = */ DIDOI_ASPECTVELOCITY
+ }, {
+ /* pguid = */ &GUID_YAxis,
+ /* dwOfw = */ 180,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_AXIS,
+ /* dwFlags = */ DIDOI_ASPECTVELOCITY
+ }, {
+ /* pguid = */ &GUID_ZAxis,
+ /* dwOfw = */ 184,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_AXIS,
+ /* dwFlags = */ DIDOI_ASPECTVELOCITY
+ }, {
+ /* pguid = */ &GUID_RxAxis,
+ /* dwOfw = */ 188,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_AXIS,
+ /* dwFlags = */ DIDOI_ASPECTVELOCITY
+ }, {
+ /* pguid = */ &GUID_RyAxis,
+ /* dwOfw = */ 192,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_AXIS,
+ /* dwFlags = */ DIDOI_ASPECTVELOCITY
+ }, {
+ /* pguid = */ &GUID_RzAxis,
+ /* dwOfw = */ 196,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_AXIS,
+ /* dwFlags = */ DIDOI_ASPECTVELOCITY
+ }, {
+ /* pguid = */ &GUID_Slider,
+ /* dwOfw = */ 24,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_AXIS,
+ /* dwFlags = */ DIDOI_ASPECTVELOCITY
+ }, {
+ /* pguid = */ &GUID_Slider,
+ /* dwOfw = */ 28,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_AXIS,
+ /* dwFlags = */ DIDOI_ASPECTVELOCITY
+ }, {
+ /* pguid = */ &GUID_XAxis,
+ /* dwOfw = */ 208,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_AXIS,
+ /* dwFlags = */ DIDOI_ASPECTACCEL
+ }, {
+ /* pguid = */ &GUID_YAxis,
+ /* dwOfw = */ 212,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_AXIS,
+ /* dwFlags = */ DIDOI_ASPECTACCEL
+ }, {
+ /* pguid = */ &GUID_ZAxis,
+ /* dwOfw = */ 216,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_AXIS,
+ /* dwFlags = */ DIDOI_ASPECTACCEL
+ }, {
+ /* pguid = */ &GUID_RxAxis,
+ /* dwOfw = */ 220,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_AXIS,
+ /* dwFlags = */ DIDOI_ASPECTACCEL
+ }, {
+ /* pguid = */ &GUID_RyAxis,
+ /* dwOfw = */ 224,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_AXIS,
+ /* dwFlags = */ DIDOI_ASPECTACCEL
+ }, {
+ /* pguid = */ &GUID_RzAxis,
+ /* dwOfw = */ 228,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_AXIS,
+ /* dwFlags = */ DIDOI_ASPECTACCEL
+ }, {
+ /* pguid = */ &GUID_Slider,
+ /* dwOfw = */ 24,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_AXIS,
+ /* dwFlags = */ DIDOI_ASPECTACCEL
+ }, {
+ /* pguid = */ &GUID_Slider,
+ /* dwOfw = */ 28,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_AXIS,
+ /* dwFlags = */ DIDOI_ASPECTACCEL
+ }, {
+ /* pguid = */ &GUID_XAxis,
+ /* dwOfw = */ 240,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_AXIS,
+ /* dwFlags = */ DIDOI_ASPECTFORCE
+ }, {
+ /* pguid = */ &GUID_YAxis,
+ /* dwOfw = */ 244,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_AXIS,
+ /* dwFlags = */ DIDOI_ASPECTFORCE
+ }, {
+ /* pguid = */ &GUID_ZAxis,
+ /* dwOfw = */ 248,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_AXIS,
+ /* dwFlags = */ DIDOI_ASPECTFORCE
+ }, {
+ /* pguid = */ &GUID_RxAxis,
+ /* dwOfw = */ 252,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_AXIS,
+ /* dwFlags = */ DIDOI_ASPECTFORCE
+ }, {
+ /* pguid = */ &GUID_RyAxis,
+ /* dwOfw = */ 256,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_AXIS,
+ /* dwFlags = */ DIDOI_ASPECTFORCE
+ }, {
+ /* pguid = */ &GUID_RzAxis,
+ /* dwOfw = */ 260,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_AXIS,
+ /* dwFlags = */ DIDOI_ASPECTFORCE
+ }, {
+ /* pguid = */ &GUID_Slider,
+ /* dwOfw = */ 24,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_AXIS,
+ /* dwFlags = */ DIDOI_ASPECTFORCE
+ }, {
+ /* pguid = */ &GUID_Slider,
+ /* dwOfw = */ 28,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_AXIS,
+ /* dwFlags = */ DIDOI_ASPECTFORCE
+ }
+};
+
+static DIOBJECTDATAFORMAT diodfMouseData[] =
+{
+ {
+ /* pguid = */ &GUID_XAxis,
+ /* dwOfw = */ 0,
+ /* dwType = */ DIDFT_ANYINSTANCE|DIDFT_AXIS,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_YAxis,
+ /* dwOfw = */ 4,
+ /* dwType = */ DIDFT_ANYINSTANCE|DIDFT_AXIS,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ &GUID_ZAxis,
+ /* dwOfw = */ 8,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_AXIS,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 12,
+ /* dwType = */ DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 13,
+ /* dwType = */ DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 14,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }, {
+ /* pguid = */ NULL,
+ /* dwOfw = */ 15,
+ /* dwType = */ 0x80000000|DIDFT_ANYINSTANCE|DIDFT_BUTTON,
+ /* dwFlags = */ 0
+ }
+};
+
+/* --- Library global variables --- */
+
+const DIDATAFORMAT c_dfDIKeyboard =
+{
+ /* dwSize = */ 24,
+ /* dwObjSize = */ 16,
+ /* dwFlags = */ DIDF_RELAXIS,
+ /* dwDataSize = */ 256,
+ /* dwNumObjs = */ 256,
+ /* rgodf = */ &diodfKeyData[0]
+};
+
+const DIDATAFORMAT c_dfDIJoystick =
+{
+ /* dwSize = */ 24,
+ /* dwObjSize = */ 16,
+ /* dwFlags = */ DIDF_ABSAXIS,
+ /* dwDataSize = */ 80,
+ /* dwNumObjs = */ 44,
+ /* rgodf = */ &diodfJoyData[0]
+};
+
+const DIDATAFORMAT c_dfDIJoystick2 = {
+ /* dwSize = */ 24,
+ /* dwObjSize = */ 16,
+ /* dwFlags = */ DIDF_ABSAXIS,
+ /* dwDataSize = */ 272,
+ /* dwNumObjs = */ 164,
+ /* rgodf = */ &diodfJoy2Data[0]
+};
+
+const DIDATAFORMAT c_dfDIMouse =
+{
+ /* dwSize = */ 24,
+ /* dwObjSize = */ 16,
+ /* dwFlags = */ DIDF_RELAXIS,
+ /* dwDataSize = */ 16,
+ /* dwNumObjs = */ 7,
+ /* rgodf = */ &diodfMouseData[0]
+};
diff --git a/winsup/w32api/lib/dinput.def b/winsup/w32api/lib/dinput.def
new file mode 100644
index 000000000..fe7d2d498
--- /dev/null
+++ b/winsup/w32api/lib/dinput.def
@@ -0,0 +1,5 @@
+; from DirectX 6.1
+LIBRARY "DINPUT.dll"
+EXPORTS
+DirectInputCreateA@16
+DirectInputCreateW@16
diff --git a/winsup/w32api/lib/dlcapi.def b/winsup/w32api/lib/dlcapi.def
new file mode 100644
index 000000000..501ecd766
--- /dev/null
+++ b/winsup/w32api/lib/dlcapi.def
@@ -0,0 +1,5 @@
+LIBRARY DLCAPI.DLL
+EXPORTS
+AcsLan@8
+DlcCallDriver@24
+NtAcsLan@16
diff --git a/winsup/w32api/lib/dplayx.def b/winsup/w32api/lib/dplayx.def
new file mode 100644
index 000000000..058e00db7
--- /dev/null
+++ b/winsup/w32api/lib/dplayx.def
@@ -0,0 +1,10 @@
+; from DirectX 6.1
+LIBRARY "DPLAYX.dll"
+EXPORTS
+DirectPlayCreate@12
+DirectPlayEnumerate@8
+DirectPlayEnumerateA@8
+DirectPlayEnumerateW@8
+DirectPlayLobbyCreateA@20
+DirectPlayLobbyCreateW@20
+gdwDPlaySPRefCount
diff --git a/winsup/w32api/lib/dsetup.def b/winsup/w32api/lib/dsetup.def
new file mode 100644
index 000000000..b417432ca
--- /dev/null
+++ b/winsup/w32api/lib/dsetup.def
@@ -0,0 +1,18 @@
+; from DirectX 6.1
+LIBRARY "DSETUP.dll"
+EXPORTS
+DirectXDeviceDriverSetupA@16
+DirectXDeviceDriverSetupW@16
+DirectXLoadString@12
+DirectXRegisterApplicationA@8
+DirectXRegisterApplicationW@8
+DirectXSetupA@12
+DirectXSetupCallback@20
+DirectXSetupGetFileVersion
+DirectXSetupGetVersion@8
+DirectXSetupIsEng@0
+DirectXSetupIsJapan@0
+DirectXSetupIsJapanNec@0
+DirectXSetupSetCallback@4
+DirectXSetupW@12
+DirectXUnRegisterApplication@8
diff --git a/winsup/w32api/lib/dsound.def b/winsup/w32api/lib/dsound.def
new file mode 100644
index 000000000..68ebdf6f6
--- /dev/null
+++ b/winsup/w32api/lib/dsound.def
@@ -0,0 +1,9 @@
+; from DirectX 6.1
+LIBRARY "DSOUND.dll"
+EXPORTS
+DirectSoundCaptureCreate@12
+DirectSoundCaptureEnumerateA@8
+DirectSoundCaptureEnumerateW@8
+DirectSoundCreate@12
+DirectSoundEnumerateA@8
+DirectSoundEnumerateW@8
diff --git a/winsup/w32api/lib/dxguid.c b/winsup/w32api/lib/dxguid.c
new file mode 100644
index 000000000..5dd50328e
--- /dev/null
+++ b/winsup/w32api/lib/dxguid.c
@@ -0,0 +1,461 @@
+/*
+ DXGUID.C
+
+ Author: Daniel Guerrero Miralles (daguer@geocities.com)
+ Version: 1.0.0
+ Date: April 27, 1999
+
+ ABSTRACT:
+ Source code to generate a library with DirectX GUIDs. For DirectX 6.1
+ and earlier versions.
+
+ LEGAL INFORMATION:
+ This is PUBLIC DOMAIN source code. The source code in this file is
+ provided "as is", without any warranty, including but not limited to,
+ fitness for any particular purpose.
+
+ REMARKS:
+ - This file may have more GUIDs than the original one. It was made by
+ recollecting GUIDs defined in the DirectX header files.
+
+ TODO:
+ Nothing.
+*/
+
+#if defined(__LCC__) || defined(__GNUC__)
+#define INITGUID 1
+#include <windows.h>
+#include <objbase.h>
+#else
+#include <basetyps.h>
+#endif
+
+/////////////////////////////////////////////////////////////////////
+// File D3D.H:
+/////////////////////////////////////////////////////////////////////
+
+DEFINE_GUID(IID_IDirect3D,0x3BBA0080,0x2421,0x11CF,0xA3,0x1A,0x00,0xAA,0x00,0xB9,0x33,0x56);
+DEFINE_GUID(IID_IDirect3D2,0x6aae1ec1,0x662a,0x11d0,0x88,0x9d,0x00,0xaa,0x00,0xbb,0xb7,0x6a);
+DEFINE_GUID(IID_IDirect3D3,0xbb223240,0xe72b,0x11d0,0xa9,0xb4,0x00,0xaa,0x00,0xc0,0x99,0x3e);
+DEFINE_GUID(IID_IDirect3DRampDevice,0xF2086B20,0x259F,0x11CF,0xA3,0x1A,0x00,0xAA,0x00,0xB9,0x33,0x56);
+DEFINE_GUID(IID_IDirect3DRGBDevice,0xA4665C60,0x2673,0x11CF,0xA3,0x1A,0x00,0xAA,0x00,0xB9,0x33,0x56);
+DEFINE_GUID(IID_IDirect3DHALDevice,0x84E63dE0,0x46AA,0x11CF,0x81,0x6F,0x00,0x00,0xC0,0x20,0x15,0x6E);
+DEFINE_GUID(IID_IDirect3DMMXDevice,0x881949a1,0xd6f3,0x11d0,0x89,0xab,0x00,0xa0,0xc9,0x05,0x41,0x29);
+DEFINE_GUID(IID_IDirect3DRefDevice,0x50936643,0x13e9,0x11d1,0x89,0xaa,0x0,0xa0,0xc9,0x5,0x41,0x29);
+DEFINE_GUID(IID_IDirect3DNullDevice,0x8767df22,0xbacc,0x11d1,0x89,0x69,0x0,0xa0,0xc9,0x6,0x29,0xa8);
+DEFINE_GUID(IID_IDirect3DDevice,0x64108800,0x957d,0X11d0,0x89,0xab,0x00,0xa0,0xc9,0x05,0x41,0x29);
+DEFINE_GUID(IID_IDirect3DDevice2,0x93281501,0x8cf8,0x11d0,0x89,0xab,0x0,0xa0,0xc9,0x5,0x41,0x29);
+DEFINE_GUID(IID_IDirect3DDevice3,0xb0ab3b60,0x33d7,0x11d1,0xa9,0x81,0x0,0xc0,0x4f,0xd7,0xb1,0x74);
+DEFINE_GUID(IID_IDirect3DTexture,0x2CDCD9E0,0x25A0,0x11CF,0xA3,0x1A,0x00,0xAA,0x00,0xB9,0x33,0x56);
+DEFINE_GUID(IID_IDirect3DTexture2,0x93281502,0x8cf8,0x11d0,0x89,0xab,0x0,0xa0,0xc9,0x5,0x41,0x29);
+DEFINE_GUID(IID_IDirect3DLight,0x4417C142,0x33AD,0x11CF,0x81,0x6F,0x00,0x00,0xC0,0x20,0x15,0x6E);
+DEFINE_GUID(IID_IDirect3DMaterial,0x4417C144,0x33AD,0x11CF,0x81,0x6F,0x00,0x00,0xC0,0x20,0x15,0x6E);
+DEFINE_GUID(IID_IDirect3DMaterial2,0x93281503,0x8cf8,0x11d0,0x89,0xab,0x0,0xa0,0xc9,0x5,0x41,0x29);
+DEFINE_GUID(IID_IDirect3DMaterial3,0xca9c46f4,0xd3c5,0x11d1,0xb7,0x5a,0x0,0x60,0x8,0x52,0xb3,0x12);
+DEFINE_GUID(IID_IDirect3DExecuteBuffer,0x4417C145,0x33AD,0x11CF,0x81,0x6F,0x00,0x00,0xC0,0x20,0x15,0x6E);
+DEFINE_GUID(IID_IDirect3DViewport,0x4417C146,0x33AD,0x11CF,0x81,0x6F,0x00,0x00,0xC0,0x20,0x15,0x6E);
+DEFINE_GUID(IID_IDirect3DViewport2,0x93281500,0x8cf8,0x11d0,0x89,0xab,0x0,0xa0,0xc9,0x5,0x41,0x29);
+DEFINE_GUID(IID_IDirect3DViewport3,0xb0ab3b61,0x33d7,0x11d1,0xa9,0x81,0x0,0xc0,0x4f,0xd7,0xb1,0x74);
+DEFINE_GUID(IID_IDirect3DVertexBuffer,0x7a503555,0x4a83,0x11d1,0xa5,0xdb,0x0,0xa0,0xc9,0x3,0x67,0xf8);
+
+/////////////////////////////////////////////////////////////////////
+// File D3DRM.H:
+/////////////////////////////////////////////////////////////////////
+
+
+DEFINE_GUID(IID_IDirect3DRM,0x2bc49361,0x8327,0x11cf,0xac,0x4a,0x0,0x0,0xc0,0x38,0x25,0xa1);
+DEFINE_GUID(IID_IDirect3DRM2,0x4516ecc8,0x8f20,0x11d0,0x9b,0x6d,0x00,0x00,0xc0,0x78,0x1b,0xc3);
+DEFINE_GUID(IID_IDirect3DRM3,0x4516ec83,0x8f20,0x11d0,0x9b,0x6d,0x00,0x00,0xc0,0x78,0x1b,0xc3);
+DEFINE_GUID(CLSID_CDirect3DRM,0x4516ec41,0x8f20,0x11d0,0x9b,0x6d,0x00,0x00,0xc0,0x78,0x1b,0xc3);
+
+/////////////////////////////////////////////////////////////////////
+// File D3DRMOBJ.H:
+/////////////////////////////////////////////////////////////////////
+
+DEFINE_GUID(CLSID_CDirect3DRMDevice,0x4fa3568e,0x623f,0x11cf,0xac,0x4a,0x0,0x0,0xc0,0x38,0x25,0xa1);
+DEFINE_GUID(CLSID_CDirect3DRMViewport,0x4fa3568f,0x623f,0x11cf,0xac,0x4a,0x0,0x0,0xc0,0x38,0x25,0xa1);
+DEFINE_GUID(CLSID_CDirect3DRMFrame,0x4fa35690,0x623f,0x11cf,0xac,0x4a,0x0,0x0,0xc0,0x38,0x25,0xa1);
+DEFINE_GUID(CLSID_CDirect3DRMMesh,0x4fa35691,0x623f,0x11cf,0xac,0x4a,0x0,0x0,0xc0,0x38,0x25,0xa1);
+DEFINE_GUID(CLSID_CDirect3DRMMeshBuilder,0x4fa35692,0x623f,0x11cf,0xac,0x4a,0x0,0x0,0xc0,0x38,0x25,0xa1);
+DEFINE_GUID(CLSID_CDirect3DRMFace,0x4fa35693,0x623f,0x11cf,0xac,0x4a,0x0,0x0,0xc0,0x38,0x25,0xa1);
+DEFINE_GUID(CLSID_CDirect3DRMLight,0x4fa35694,0x623f,0x11cf,0xac,0x4a,0x0,0x0,0xc0,0x38,0x25,0xa1);
+DEFINE_GUID(CLSID_CDirect3DRMTexture,0x4fa35695,0x623f,0x11cf,0xac,0x4a,0x0,0x0,0xc0,0x38,0x25,0xa1);
+DEFINE_GUID(CLSID_CDirect3DRMWrap,0x4fa35696,0x623f,0x11cf,0xac,0x4a,0x0,0x0,0xc0,0x38,0x25,0xa1);
+DEFINE_GUID(CLSID_CDirect3DRMMaterial,0x4fa35697,0x623f,0x11cf,0xac,0x4a,0x0,0x0,0xc0,0x38,0x25,0xa1);
+DEFINE_GUID(CLSID_CDirect3DRMAnimation,0x4fa35698,0x623f,0x11cf,0xac,0x4a,0x0,0x0,0xc0,0x38,0x25,0xa1);
+DEFINE_GUID(CLSID_CDirect3DRMAnimationSet,0x4fa35699,0x623f,0x11cf,0xac,0x4a,0x0,0x0,0xc0,0x38,0x25,0xa1);
+DEFINE_GUID(CLSID_CDirect3DRMUserVisual,0x4fa3569a,0x623f,0x11cf,0xac,0x4a,0x0,0x0,0xc0,0x38,0x25,0xa1);
+DEFINE_GUID(CLSID_CDirect3DRMShadow,0x4fa3569b,0x623f,0x11cf,0xac,0x4a,0x0,0x0,0xc0,0x38,0x25,0xa1);
+DEFINE_GUID(CLSID_CDirect3DRMViewportInterpolator,0xde9eaa1,0x3b84,0x11d0,0x9b,0x6d,0x0,0x0,0xc0,0x78,0x1b,0xc3);
+DEFINE_GUID(CLSID_CDirect3DRMFrameInterpolator,0xde9eaa2,0x3b84,0x11d0,0x9b,0x6d,0x0,0x0,0xc0,0x78,0x1b,0xc3);
+DEFINE_GUID(CLSID_CDirect3DRMMeshInterpolator,0xde9eaa3,0x3b84,0x11d0,0x9b,0x6d,0x0,0x0,0xc0,0x78,0x1b,0xc3);
+DEFINE_GUID(CLSID_CDirect3DRMLightInterpolator,0xde9eaa6,0x3b84,0x11d0,0x9b,0x6d,0x0,0x0,0xc0,0x78,0x1b,0xc3);
+DEFINE_GUID(CLSID_CDirect3DRMMaterialInterpolator,0xde9eaa7,0x3b84,0x11d0,0x9b,0x6d,0x0,0x0,0xc0,0x78,0x1b,0xc3);
+DEFINE_GUID(CLSID_CDirect3DRMTextureInterpolator,0xde9eaa8,0x3b84,0x11d0,0x9b,0x6d,0x0,0x0,0xc0,0x78,0x1b,0xc3);
+DEFINE_GUID(CLSID_CDirect3DRMProgressiveMesh,0x4516ec40,0x8f20,0x11d0,0x9b,0x6d,0x00,0x00,0xc0,0x78,0x1b,0xc3);
+DEFINE_GUID(CLSID_CDirect3DRMClippedVisual,0x5434e72d,0x6d66,0x11d1,0xbb,0xb,0x0,0x0,0xf8,0x75,0x86,0x5a);
+DEFINE_GUID(IID_IDirect3DRMObject,0xeb16cb00,0xd271,0x11ce,0xac,0x48,0x0,0x0,0xc0,0x38,0x25,0xa1);
+DEFINE_GUID(IID_IDirect3DRMObject2,0x4516ec7c,0x8f20,0x11d0,0x9b,0x6d,0x00,0x00,0xc0,0x78,0x1b,0xc3);
+DEFINE_GUID(IID_IDirect3DRMDevice,0xe9e19280,0x6e05,0x11cf,0xac,0x4a,0x0,0x0,0xc0,0x38,0x25,0xa1);
+DEFINE_GUID(IID_IDirect3DRMDevice2,0x4516ec78,0x8f20,0x11d0,0x9b,0x6d,0x00,0x00,0xc0,0x78,0x1b,0xc3);
+DEFINE_GUID(IID_IDirect3DRMDevice3,0x549f498b,0xbfeb,0x11d1,0x8e,0xd8,0x0,0xa0,0xc9,0x67,0xa4,0x82);
+DEFINE_GUID(IID_IDirect3DRMViewport,0xeb16cb02,0xd271,0x11ce,0xac,0x48,0x0,0x0,0xc0,0x38,0x25,0xa1);
+DEFINE_GUID(IID_IDirect3DRMViewport2,0x4a1b1be6,0xbfed,0x11d1,0x8e,0xd8,0x0,0xa0,0xc9,0x67,0xa4,0x82);
+DEFINE_GUID(IID_IDirect3DRMFrame,0xeb16cb03,0xd271,0x11ce,0xac,0x48,0x0,0x0,0xc0,0x38,0x25,0xa1);
+DEFINE_GUID(IID_IDirect3DRMFrame2,0xc3dfbd60,0x3988,0x11d0,0x9e,0xc2,0x0,0x0,0xc0,0x29,0x1a,0xc3);
+DEFINE_GUID(IID_IDirect3DRMFrame3,0xff6b7f70,0xa40e,0x11d1,0x91,0xf9,0x0,0x0,0xf8,0x75,0x8e,0x66);
+DEFINE_GUID(IID_IDirect3DRMVisual,0xeb16cb04,0xd271,0x11ce,0xac,0x48,0x0,0x0,0xc0,0x38,0x25,0xa1);
+DEFINE_GUID(IID_IDirect3DRMMesh,0xa3a80d01,0x6e12,0x11cf,0xac,0x4a,0x0,0x0,0xc0,0x38,0x25,0xa1);
+DEFINE_GUID(IID_IDirect3DRMMeshBuilder,0xa3a80d02,0x6e12,0x11cf,0xac,0x4a,0x0,0x0,0xc0,0x38,0x25,0xa1);
+DEFINE_GUID(IID_IDirect3DRMMeshBuilder2,0x4516ec77,0x8f20,0x11d0,0x9b,0x6d,0x0,0x0,0xc0,0x78,0x1b,0xc3);
+DEFINE_GUID(IID_IDirect3DRMMeshBuilder3,0x4516ec82,0x8f20,0x11d0,0x9b,0x6d,0x00,0x00,0xc0,0x78,0x1b,0xc3);
+DEFINE_GUID(IID_IDirect3DRMFace,0xeb16cb07,0xd271,0x11ce,0xac,0x48,0x0,0x0,0xc0,0x38,0x25,0xa1);
+DEFINE_GUID(IID_IDirect3DRMFace2,0x4516ec81,0x8f20,0x11d0,0x9b,0x6d,0x00,0x00,0xc0,0x78,0x1b,0xc3);
+DEFINE_GUID(IID_IDirect3DRMLight,0xeb16cb08,0xd271,0x11ce,0xac,0x48,0x0,0x0,0xc0,0x38,0x25,0xa1);
+DEFINE_GUID(IID_IDirect3DRMTexture,0xeb16cb09,0xd271,0x11ce,0xac,0x48,0x0,0x0,0xc0,0x38,0x25,0xa1);
+DEFINE_GUID(IID_IDirect3DRMTexture2,0x120f30c0,0x1629,0x11d0,0x94,0x1c,0x0,0x80,0xc8,0xc,0xfa,0x7b);
+DEFINE_GUID(IID_IDirect3DRMTexture3,0xff6b7f73,0xa40e,0x11d1,0x91,0xf9,0x0,0x0,0xf8,0x75,0x8e,0x66);
+DEFINE_GUID(IID_IDirect3DRMWrap,0xeb16cb0a,0xd271,0x11ce,0xac,0x48,0x0,0x0,0xc0,0x38,0x25,0xa1);
+DEFINE_GUID(IID_IDirect3DRMMaterial,0xeb16cb0b,0xd271,0x11ce,0xac,0x48,0x0,0x0,0xc0,0x38,0x25,0xa1);
+DEFINE_GUID(IID_IDirect3DRMMaterial2,0xff6b7f75,0xa40e,0x11d1,0x91,0xf9,0x0,0x0,0xf8,0x75,0x8e,0x66);
+DEFINE_GUID(IID_IDirect3DRMAnimation,0xeb16cb0d,0xd271,0x11ce,0xac,0x48,0x0,0x0,0xc0,0x38,0x25,0xa1);
+DEFINE_GUID(IID_IDirect3DRMAnimation2,0xff6b7f77,0xa40e,0x11d1,0x91,0xf9,0x0,0x0,0xf8,0x75,0x8e,0x66);
+DEFINE_GUID(IID_IDirect3DRMAnimationSet,0xeb16cb0e,0xd271,0x11ce,0xac,0x48,0x0,0x0,0xc0,0x38,0x25,0xa1);
+DEFINE_GUID(IID_IDirect3DRMAnimationSet2,0xff6b7f79,0xa40e,0x11d1,0x91,0xf9,0x0,0x0,0xf8,0x75,0x8e,0x66);
+DEFINE_GUID(IID_IDirect3DRMObjectArray,0x242f6bc2,0x3849,0x11d0,0x9b,0x6d,0x0,0x0,0xc0,0x78,0x1b,0xc3);
+DEFINE_GUID(IID_IDirect3DRMDeviceArray,0xeb16cb10,0xd271,0x11ce,0xac,0x48,0x0,0x0,0xc0,0x38,0x25,0xa1);
+DEFINE_GUID(IID_IDirect3DRMViewportArray,0xeb16cb11,0xd271,0x11ce,0xac,0x48,0x0,0x0,0xc0,0x38,0x25,0xa1);
+DEFINE_GUID(IID_IDirect3DRMFrameArray,0xeb16cb12,0xd271,0x11ce,0xac,0x48,0x0,0x0,0xc0,0x38,0x25,0xa1);
+DEFINE_GUID(IID_IDirect3DRMVisualArray,0xeb16cb13,0xd271,0x11ce,0xac,0x48,0x0,0x0,0xc0,0x38,0x25,0xa1);
+DEFINE_GUID(IID_IDirect3DRMLightArray,0xeb16cb14,0xd271,0x11ce,0xac,0x48,0x0,0x0,0xc0,0x38,0x25,0xa1);
+DEFINE_GUID(IID_IDirect3DRMPickedArray,0xeb16cb16,0xd271,0x11ce,0xac,0x48,0x0,0x0,0xc0,0x38,0x25,0xa1);
+DEFINE_GUID(IID_IDirect3DRMFaceArray,0xeb16cb17,0xd271,0x11ce,0xac,0x48,0x0,0x0,0xc0,0x38,0x25,0xa1);
+DEFINE_GUID(IID_IDirect3DRMAnimationArray,0xd5f1cae0,0x4bd7,0x11d1,0xb9,0x74,0x0,0x60,0x8,0x3e,0x45,0xf3);
+DEFINE_GUID(IID_IDirect3DRMUserVisual,0x59163de0,0x6d43,0x11cf,0xac,0x4a,0x0,0x0,0xc0,0x38,0x25,0xa1);
+DEFINE_GUID(IID_IDirect3DRMShadow,0xaf359780,0x6ba3,0x11cf,0xac,0x4a,0x0,0x0,0xc0,0x38,0x25,0xa1);
+DEFINE_GUID(IID_IDirect3DRMShadow2,0x86b44e25,0x9c82,0x11d1,0xbb,0xb,0x0,0xa0,0xc9,0x81,0xa0,0xa6);
+DEFINE_GUID(IID_IDirect3DRMInterpolator,0x242f6bc1,0x3849,0x11d0,0x9b,0x6d,0x0,0x0,0xc0,0x78,0x1b,0xc3);
+DEFINE_GUID(IID_IDirect3DRMProgressiveMesh,0x4516ec79,0x8f20,0x11d0,0x9b,0x6d,0x0,0x0,0xc0,0x78,0x1b,0xc3);
+DEFINE_GUID(IID_IDirect3DRMPicked2Array,0x4516ec7b,0x8f20,0x11d0,0x9b,0x6d,0x0,0x0,0xc0,0x78,0x1b,0xc3);
+DEFINE_GUID(IID_IDirect3DRMClippedVisual,0x5434e733,0x6d66,0x11d1,0xbb,0xb,0x0,0x0,0xf8,0x75,0x86,0x5a);
+
+/////////////////////////////////////////////////////////////////////
+// File D3DRMWIN.H:
+/////////////////////////////////////////////////////////////////////
+
+DEFINE_GUID(IID_IDirect3DRMWinDevice,0xc5016cc0,0xd273,0x11ce,0xac,0x48,0x0,0x0,0xc0,0x38,0x25,0xa1);
+
+/////////////////////////////////////////////////////////////////////
+// File DDRAW.H:
+/////////////////////////////////////////////////////////////////////
+
+DEFINE_GUID(CLSID_DirectDraw,0xD7B70EE0,0x4340,0x11CF,0xB0,0x63,0x00,0x20,0xAF,0xC2,0xCD,0x35);
+DEFINE_GUID(CLSID_DirectDrawClipper,0x593817A0,0x7DB3,0x11CF,0xA2,0xDE,0x00,0xAA,0x00,0xb9,0x33,0x56);
+DEFINE_GUID(IID_IDirectDraw,0x6C14DB80,0xA733,0x11CE,0xA5,0x21,0x00,0x20,0xAF,0x0B,0xE5,0x60);
+DEFINE_GUID(IID_IDirectDraw2,0xB3A6F3E0,0x2B43,0x11CF,0xA2,0xDE,0x00,0xAA,0x00,0xB9,0x33,0x56);
+DEFINE_GUID(IID_IDirectDraw4,0x9c59509a,0x39bd,0x11d1,0x8c,0x4a,0x00,0xc0,0x4f,0xd9,0x30,0xc5);
+DEFINE_GUID(IID_IDirectDrawSurface,0x6C14DB81,0xA733,0x11CE,0xA5,0x21,0x00,0x20,0xAF,0x0B,0xE5,0x60);
+DEFINE_GUID(IID_IDirectDrawSurface2,0x57805885,0x6eec,0x11cf,0x94,0x41,0xa8,0x23,0x03,0xc1,0x0e,0x27);
+DEFINE_GUID(IID_IDirectDrawSurface3,0xDA044E00,0x69B2,0x11D0,0xA1,0xD5,0x00,0xAA,0x00,0xB8,0xDF,0xBB);
+DEFINE_GUID(IID_IDirectDrawSurface4,0x0B2B8630,0xAD35,0x11D0,0x8E,0xA6,0x00,0x60,0x97,0x97,0xEA,0x5B);
+DEFINE_GUID(IID_IDirectDrawPalette,0x6C14DB84,0xA733,0x11CE,0xA5,0x21,0x00,0x20,0xAF,0x0B,0xE5,0x60);
+DEFINE_GUID(IID_IDirectDrawClipper,0x6C14DB85,0xA733,0x11CE,0xA5,0x21,0x00,0x20,0xAF,0x0B,0xE5,0x60);
+DEFINE_GUID(IID_IDirectDrawColorControl,0x4B9F0EE0,0x0D7E,0x11D0,0x9B,0x06,0x00,0xA0,0xC9,0x03,0xA3,0xB8);
+DEFINE_GUID(IID_IDirectDrawGammaControl,0x69C11C3E,0xB46B,0x11D1,0xAD,0x7A,0x00,0xC0,0x4F,0xC2,0x9B,0x4E);
+
+/////////////////////////////////////////////////////////////////////
+// File DINPUT.H:
+/////////////////////////////////////////////////////////////////////
+
+DEFINE_GUID(CLSID_DirectInput,0x25E609E0,0xB259,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
+DEFINE_GUID(CLSID_DirectInputDevice,0x25E609E1,0xB259,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
+DEFINE_GUID(IID_IDirectInputA,0x89521360,0xAA8A,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
+DEFINE_GUID(IID_IDirectInputW,0x89521361,0xAA8A,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
+DEFINE_GUID(IID_IDirectInput2A,0x5944E662,0xAA8A,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
+DEFINE_GUID(IID_IDirectInput2W,0x5944E663,0xAA8A,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
+DEFINE_GUID(IID_IDirectInputDeviceA,0x5944E680,0xC92E,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
+DEFINE_GUID(IID_IDirectInputDeviceW,0x5944E681,0xC92E,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
+DEFINE_GUID(IID_IDirectInputDevice2A,0x5944E682,0xC92E,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
+DEFINE_GUID(IID_IDirectInputDevice2W,0x5944E683,0xC92E,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
+DEFINE_GUID(IID_IDirectInputEffect,0xE7E1F7C0,0x88D2,0x11D0,0x9A,0xD0,0x00,0xA0,0xC9,0xA0,0x6E,0x35);
+DEFINE_GUID(GUID_XAxis,0xA36D02E0,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
+DEFINE_GUID(GUID_YAxis,0xA36D02E1,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
+DEFINE_GUID(GUID_ZAxis,0xA36D02E2,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
+DEFINE_GUID(GUID_RxAxis,0xA36D02F4,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
+DEFINE_GUID(GUID_RyAxis,0xA36D02F5,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
+DEFINE_GUID(GUID_RzAxis,0xA36D02E3,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
+DEFINE_GUID(GUID_Slider,0xA36D02E4,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
+DEFINE_GUID(GUID_Button,0xA36D02F0,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
+DEFINE_GUID(GUID_Key,0x55728220,0xD33C,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
+DEFINE_GUID(GUID_POV,0xA36D02F2,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
+DEFINE_GUID(GUID_Unknown,0xA36D02F3,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
+DEFINE_GUID(GUID_SysMouse,0x6F1D2B60,0xD5A0,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
+DEFINE_GUID(GUID_SysKeyboard,0x6F1D2B61,0xD5A0,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
+DEFINE_GUID(GUID_Joystick,0x6F1D2B70,0xD5A0,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
+DEFINE_GUID(GUID_ConstantForce,0x13541C20,0x8E33,0x11D0,0x9A,0xD0,0x00,0xA0,0xC9,0xA0,0x6E,0x35);
+DEFINE_GUID(GUID_RampForce,0x13541C21,0x8E33,0x11D0,0x9A,0xD0,0x00,0xA0,0xC9,0xA0,0x6E,0x35);
+DEFINE_GUID(GUID_Square,0x13541C22,0x8E33,0x11D0,0x9A,0xD0,0x00,0xA0,0xC9,0xA0,0x6E,0x35);
+DEFINE_GUID(GUID_Sine,0x13541C23,0x8E33,0x11D0,0x9A,0xD0,0x00,0xA0,0xC9,0xA0,0x6E,0x35);
+DEFINE_GUID(GUID_Triangle,0x13541C24,0x8E33,0x11D0,0x9A,0xD0,0x00,0xA0,0xC9,0xA0,0x6E,0x35);
+DEFINE_GUID(GUID_SawtoothUp,0x13541C25,0x8E33,0x11D0,0x9A,0xD0,0x00,0xA0,0xC9,0xA0,0x6E,0x35);
+DEFINE_GUID(GUID_SawtoothDown,0x13541C26,0x8E33,0x11D0,0x9A,0xD0,0x00,0xA0,0xC9,0xA0,0x6E,0x35);
+DEFINE_GUID(GUID_Spring,0x13541C27,0x8E33,0x11D0,0x9A,0xD0,0x00,0xA0,0xC9,0xA0,0x6E,0x35);
+DEFINE_GUID(GUID_Damper,0x13541C28,0x8E33,0x11D0,0x9A,0xD0,0x00,0xA0,0xC9,0xA0,0x6E,0x35);
+DEFINE_GUID(GUID_Inertia,0x13541C29,0x8E33,0x11D0,0x9A,0xD0,0x00,0xA0,0xC9,0xA0,0x6E,0x35);
+DEFINE_GUID(GUID_Friction,0x13541C2A,0x8E33,0x11D0,0x9A,0xD0,0x00,0xA0,0xC9,0xA0,0x6E,0x35);
+DEFINE_GUID(GUID_CustomForce,0x13541C2B,0x8E33,0x11D0,0x9A,0xD0,0x00,0xA0,0xC9,0xA0,0x6E,0x35);
+
+/////////////////////////////////////////////////////////////////////
+// File DMKSCTRL.H:
+/////////////////////////////////////////////////////////////////////
+
+DEFINE_GUID(IID_IKsControl,0x28F54685,0x06FD,0x11D2,0xB2,0x7A,0x00,0xA0,0xC9,0x22,0x31,0x96);
+DEFINE_GUID(KSDATAFORMAT_SUBTYPE_MIDI,0x1D262760L,0xE957,0x11CF,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00);
+DEFINE_GUID(KSDATAFORMAT_SUBTYPE_DIRECTMUSIC,0x1a82f8bc,0x3f8b,0x11d2,0xb7,0x74,0x00,0x60,0x08,0x33,0x16,0xc1);
+
+/////////////////////////////////////////////////////////////////////
+// File DMUSICC.H:
+/////////////////////////////////////////////////////////////////////
+
+DEFINE_GUID(IID_IReferenceClock,0x56a86897,0x0ad4,0x11ce,0xb0,0x3a,0x00,0x20,0xaf,0x0b,0xa7,0x70);
+DEFINE_GUID(CLSID_DirectMusic,0x636b9f10,0x0c7d,0x11d1,0x95,0xb2,0x00,0x20,0xaf,0xdc,0x74,0x21);
+DEFINE_GUID(CLSID_DirectMusicCollection,0x480ff4b0,0x28b2,0x11d1,0xbe,0xf7,0x0,0xc0,0x4f,0xbf,0x8f,0xef);
+DEFINE_GUID(CLSID_DirectMusicSynth,0x58C2B4D0,0x46E7,0x11D1,0x89,0xAC,0x00,0xA0,0xC9,0x05,0x41,0x29);
+DEFINE_GUID(IID_IDirectMusic,0x6536115a,0x7b2d,0x11d2,0xba,0x18,0x00,0x00,0xf8,0x75,0xac,0x12);
+DEFINE_GUID(IID_IDirectMusicBuffer,0xd2ac2878,0xb39b,0x11d1,0x87,0x4,0x0,0x60,0x8,0x93,0xb1,0xbd);
+DEFINE_GUID(IID_IDirectMusicPort,0x08f2d8c9,0x37c2,0x11d2,0xb9,0xf9,0x00,0x00,0xf8,0x75,0xac,0x12);
+DEFINE_GUID(IID_IDirectMusicThru,0xced153e7,0x3606,0x11d2,0xb9,0xf9,0x00,0x00,0xf8,0x75,0xac,0x12);
+DEFINE_GUID(IID_IDirectMusicPortDownload,0xd2ac287a,0xb39b,0x11d1,0x87,0x4,0x0,0x60,0x8,0x93,0xb1,0xbd);
+DEFINE_GUID(IID_IDirectMusicDownload,0xd2ac287b,0xb39b,0x11d1,0x87,0x4,0x0,0x60,0x8,0x93,0xb1,0xbd);
+DEFINE_GUID(IID_IDirectMusicCollection,0xd2ac287c,0xb39b,0x11d1,0x87,0x4,0x0,0x60,0x8,0x93,0xb1,0xbd);
+DEFINE_GUID(IID_IDirectMusicInstrument,0xd2ac287d,0xb39b,0x11d1,0x87,0x4,0x0,0x60,0x8,0x93,0xb1,0xbd);
+DEFINE_GUID(IID_IDirectMusicDownloadedInstrument,0xd2ac287e,0xb39b,0x11d1,0x87,0x4,0x0,0x60,0x8,0x93,0xb1,0xbd);
+DEFINE_GUID(GUID_DMUS_PROP_GM_Hardware,0x178f2f24,0xc364,0x11d1,0xa7,0x60,0x00,0x00,0xf8,0x75,0xac,0x12);
+DEFINE_GUID(GUID_DMUS_PROP_GS_Hardware,0x178f2f25,0xc364,0x11d1,0xa7,0x60,0x00,0x00,0xf8,0x75,0xac,0x12);
+DEFINE_GUID(GUID_DMUS_PROP_XG_Hardware,0x178f2f26,0xc364,0x11d1,0xa7,0x60,0x00,0x00,0xf8,0x75,0xac,0x12);
+DEFINE_GUID(GUID_DMUS_PROP_XG_Capable,0x6496aba1,0x61b0,0x11d2,0xaf,0xa6,0x0,0xaa,0x0,0x24,0xd8,0xb6);
+DEFINE_GUID(GUID_DMUS_PROP_GS_Capable,0x6496aba2,0x61b0,0x11d2,0xaf,0xa6,0x0,0xaa,0x0,0x24,0xd8,0xb6);
+DEFINE_GUID(GUID_DMUS_PROP_DLS1,0x178f2f27,0xc364,0x11d1,0xa7,0x60,0x00,0x00,0xf8,0x75,0xac,0x12);
+DEFINE_GUID(GUID_DMUS_PROP_SynthSink_DSOUND,0xaa97844,0xc877,0x11d1,0x87,0xc,0x0,0x60,0x8,0x93,0xb1,0xbd);
+DEFINE_GUID(GUID_DMUS_PROP_SynthSink_WAVE,0xaa97845,0xc877,0x11d1,0x87,0xc,0x0,0x60,0x8,0x93,0xb1,0xbd);
+DEFINE_GUID(GUID_DMUS_PROP_WriteLatency,0x268a0fa0,0x60f2,0x11d2,0xaf,0xa6,0x0,0xaa,0x0,0x24,0xd8,0xb6);
+DEFINE_GUID(GUID_DMUS_PROP_WritePeriod,0x268a0fa1,0x60f2,0x11d2,0xaf,0xa6,0x0,0xaa,0x0,0x24,0xd8,0xb6);
+DEFINE_GUID(GUID_DMUS_PROP_MemorySize,0x178f2f28,0xc364,0x11d1,0xa7,0x60,0x00,0x00,0xf8,0x75,0xac,0x12);
+DEFINE_GUID(GUID_DMUS_PROP_WavesReverb,0x4cb5622,0x32e5,0x11d2,0xaf,0xa6,0x0,0xaa,0x0,0x24,0xd8,0xb6);
+DEFINE_GUID(GUID_DMUS_PROP_Effects,0xcda8d611,0x684a,0x11d2,0x87,0x1e,0x0,0x60,0x8,0x93,0xb1,0xbd);
+DEFINE_GUID(GUID_DMUS_PROP_LegacyCaps,0xcfa7cdc2,0x00a1,0x11d2,0xaa,0xd5,0x00,0x00,0xf8,0x75,0xac,0x12);
+DEFINE_GUID(GUID_DMUS_PROP_Volume,0xfedfae25L,0xe46e,0x11d1,0xaa,0xce,0x00,0x00,0xf8,0x75,0xac,0x12);
+
+/////////////////////////////////////////////////////////////////////
+// File DMUSICI.H:
+/////////////////////////////////////////////////////////////////////
+
+DEFINE_GUID(CLSID_DirectMusicPerformance,0xd2ac2881,0xb39b,0x11d1,0x87,0x4,0x0,0x60,0x8,0x93,0xb1,0xbd);
+DEFINE_GUID(CLSID_DirectMusicSegment,0xd2ac2882,0xb39b,0x11d1,0x87,0x4,0x0,0x60,0x8,0x93,0xb1,0xbd);
+DEFINE_GUID(CLSID_DirectMusicSegmentState,0xd2ac2883,0xb39b,0x11d1,0x87,0x4,0x0,0x60,0x8,0x93,0xb1,0xbd);
+DEFINE_GUID(CLSID_DirectMusicGraph,0xd2ac2884,0xb39b,0x11d1,0x87,0x4,0x0,0x60,0x8,0x93,0xb1,0xbd);
+DEFINE_GUID(CLSID_DirectMusicTempoTrack,0xd2ac2885,0xb39b,0x11d1,0x87,0x4,0x0,0x60,0x8,0x93,0xb1,0xbd);
+DEFINE_GUID(CLSID_DirectMusicSeqTrack,0xd2ac2886,0xb39b,0x11d1,0x87,0x4,0x0,0x60,0x8,0x93,0xb1,0xbd);
+DEFINE_GUID(CLSID_DirectMusicSysExTrack,0xd2ac2887,0xb39b,0x11d1,0x87,0x4,0x0,0x60,0x8,0x93,0xb1,0xbd);
+DEFINE_GUID(CLSID_DirectMusicTimeSigTrack,0xd2ac2888,0xb39b,0x11d1,0x87,0x4,0x0,0x60,0x8,0x93,0xb1,0xbd);
+DEFINE_GUID(CLSID_DirectMusicStyle,0xd2ac288a,0xb39b,0x11d1,0x87,0x4,0x0,0x60,0x8,0x93,0xb1,0xbd);
+DEFINE_GUID(CLSID_DirectMusicChordTrack,0xd2ac288b,0xb39b,0x11d1,0x87,0x4,0x0,0x60,0x8,0x93,0xb1,0xbd);
+DEFINE_GUID(CLSID_DirectMusicCommandTrack,0xd2ac288c,0xb39b,0x11d1,0x87,0x4,0x0,0x60,0x8,0x93,0xb1,0xbd);
+DEFINE_GUID(CLSID_DirectMusicStyleTrack,0xd2ac288d,0xb39b,0x11d1,0x87,0x4,0x0,0x60,0x8,0x93,0xb1,0xbd);
+DEFINE_GUID(CLSID_DirectMusicMotifTrack,0xd2ac288e,0xb39b,0x11d1,0x87,0x4,0x0,0x60,0x8,0x93,0xb1,0xbd);
+DEFINE_GUID(CLSID_DirectMusicChordMap,0xd2ac288f,0xb39b,0x11d1,0x87,0x4,0x0,0x60,0x8,0x93,0xb1,0xbd);
+DEFINE_GUID(CLSID_DirectMusicComposer,0xd2ac2890,0xb39b,0x11d1,0x87,0x4,0x0,0x60,0x8,0x93,0xb1,0xbd);
+DEFINE_GUID(CLSID_DirectMusicSignPostTrack,0xf17e8672,0xc3b4,0x11d1,0x87,0xb,0x0,0x60,0x8,0x93,0xb1,0xbd);
+DEFINE_GUID(CLSID_DirectMusicLoader,0xd2ac2892,0xb39b,0x11d1,0x87,0x4,0x0,0x60,0x8,0x93,0xb1,0xbd);
+DEFINE_GUID(CLSID_DirectMusicBandTrack,0xd2ac2894,0xb39b,0x11d1,0x87,0x4,0x0,0x60,0x8,0x93,0xb1,0xbd);
+DEFINE_GUID(CLSID_DirectMusicBand,0x79ba9e00,0xb6ee,0x11d1,0x86,0xbe,0x0,0xc0,0x4f,0xbf,0x8f,0xef);
+DEFINE_GUID(CLSID_DirectMusicChordMapTrack,0xd2ac2896,0xb39b,0x11d1,0x87,0x4,0x0,0x60,0x8,0x93,0xb1,0xbd);
+DEFINE_GUID(CLSID_DirectMusicMuteTrack,0xd2ac2898,0xb39b,0x11d1,0x87,0x4,0x0,0x60,0x8,0x93,0xb1,0xbd);
+DEFINE_GUID(GUID_DirectMusicAllTypes,0xd2ac2893,0xb39b,0x11d1,0x87,0x4,0x0,0x60,0x8,0x93,0xb1,0xbd);
+DEFINE_GUID(GUID_NOTIFICATION_SEGMENT,0xd2ac2899,0xb39b,0x11d1,0x87,0x4,0x0,0x60,0x8,0x93,0xb1,0xbd);
+DEFINE_GUID(GUID_NOTIFICATION_PERFORMANCE,0x81f75bc5,0x4e5d,0x11d2,0xbc,0xc7,0x0,0xa0,0xc9,0x22,0xe6,0xeb);
+DEFINE_GUID(GUID_NOTIFICATION_MEASUREANDBEAT,0xd2ac289a,0xb39b,0x11d1,0x87,0x4,0x0,0x60,0x8,0x93,0xb1,0xbd);
+DEFINE_GUID(GUID_NOTIFICATION_CHORD,0xd2ac289b,0xb39b,0x11d1,0x87,0x4,0x0,0x60,0x8,0x93,0xb1,0xbd);
+DEFINE_GUID(GUID_NOTIFICATION_COMMAND,0xd2ac289c,0xb39b,0x11d1,0x87,0x4,0x0,0x60,0x8,0x93,0xb1,0xbd);
+DEFINE_GUID(GUID_CommandParam,0xd2ac289d,0xb39b,0x11d1,0x87,0x4,0x0,0x60,0x8,0x93,0xb1,0xbd);
+DEFINE_GUID(GUID_ChordParam,0xd2ac289e,0xb39b,0x11d1,0x87,0x4,0x0,0x60,0x8,0x93,0xb1,0xbd);
+DEFINE_GUID(GUID_RhythmParam,0xd2ac289f,0xb39b,0x11d1,0x87,0x4,0x0,0x60,0x8,0x93,0xb1,0xbd);
+DEFINE_GUID(GUID_IDirectMusicStyle,0xd2ac28a1,0xb39b,0x11d1,0x87,0x4,0x0,0x60,0x8,0x93,0xb1,0xbd);
+DEFINE_GUID(GUID_TimeSignature,0xd2ac28a4,0xb39b,0x11d1,0x87,0x4,0x0,0x60,0x8,0x93,0xb1,0xbd);
+DEFINE_GUID(GUID_TempoParam,0xd2ac28a5,0xb39b,0x11d1,0x87,0x4,0x0,0x60,0x8,0x93,0xb1,0xbd);
+DEFINE_GUID(GUID_IDirectMusicBand,0xd2ac28ac,0xb39b,0x11d1,0x87,0x4,0x0,0x60,0x8,0x93,0xb1,0xbd);
+DEFINE_GUID(GUID_IDirectMusicChordMap,0xd2ac28ad,0xb39b,0x11d1,0x87,0x4,0x0,0x60,0x8,0x93,0xb1,0xbd);
+DEFINE_GUID(GUID_MuteParam,0xd2ac28af,0xb39b,0x11d1,0x87,0x4,0x0,0x60,0x8,0x93,0xb1,0xbd);
+DEFINE_GUID(GUID_Download,0xd2ac28a7,0xb39b,0x11d1,0x87,0x4,0x0,0x60,0x8,0x93,0xb1,0xbd);
+DEFINE_GUID(GUID_Unload,0xd2ac28a8,0xb39b,0x11d1,0x87,0x4,0x0,0x60,0x8,0x93,0xb1,0xbd);
+DEFINE_GUID(GUID_ConnectToDLSCollection,0x1db1ae6b,0xe92e,0x11d1,0xa8,0xc5,0x0,0xc0,0x4f,0xa3,0x72,0x6e);
+DEFINE_GUID(GUID_Enable_Auto_Download,0xd2ac28a9,0xb39b,0x11d1,0x87,0x4,0x0,0x60,0x8,0x93,0xb1,0xbd);
+DEFINE_GUID(GUID_Disable_Auto_Download,0xd2ac28aa,0xb39b,0x11d1,0x87,0x4,0x0,0x60,0x8,0x93,0xb1,0xbd);
+DEFINE_GUID(GUID_Clear_All_Bands,0xd2ac28ab,0xb39b,0x11d1,0x87,0x4,0x0,0x60,0x8,0x93,0xb1,0xbd);
+DEFINE_GUID(GUID_StandardMIDIFile,0x6621075,0xe92e,0x11d1,0xa8,0xc5,0x0,0xc0,0x4f,0xa3,0x72,0x6e);
+DEFINE_GUID(GUID_DisableTimeSig,0x45fc707b,0x1db4,0x11d2,0xbc,0xac,0x0,0xa0,0xc9,0x22,0xe6,0xeb);
+DEFINE_GUID(GUID_EnableTimeSig,0x45fc707c,0x1db4,0x11d2,0xbc,0xac,0x0,0xa0,0xc9,0x22,0xe6,0xeb);
+DEFINE_GUID(GUID_DisableTempo,0x45fc707d,0x1db4,0x11d2,0xbc,0xac,0x0,0xa0,0xc9,0x22,0xe6,0xeb);
+DEFINE_GUID(GUID_EnableTempo,0x45fc707e,0x1db4,0x11d2,0xbc,0xac,0x0,0xa0,0xc9,0x22,0xe6,0xeb);
+DEFINE_GUID(GUID_PerfMasterTempo,0xd2ac28b0,0xb39b,0x11d1,0x87,0x4,0x0,0x60,0x8,0x93,0xb1,0xbd);
+DEFINE_GUID(GUID_PerfMasterVolume,0xd2ac28b1,0xb39b,0x11d1,0x87,0x4,0x0,0x60,0x8,0x93,0xb1,0xbd);
+DEFINE_GUID(GUID_PerfMasterGrooveLevel,0xd2ac28b2,0xb39b,0x11d1,0x87,0x4,0x0,0x60,0x8,0x93,0xb1,0xbd);
+DEFINE_GUID(GUID_PerfAutoDownload,0xfb09565b,0x3631,0x11d2,0xbc,0xb8,0x0,0xa0,0xc9,0x22,0xe6,0xeb);
+DEFINE_GUID(GUID_DefaultGMCollection,0xf17e8673,0xc3b4,0x11d1,0x87,0xb,0x0,0x60,0x8,0x93,0xb1,0xbd);
+DEFINE_GUID(IID_IDirectMusicLoader,0x2ffaaca2,0x5dca,0x11d2,0xaf,0xa6,0x0,0xaa,0x0,0x24,0xd8,0xb6);
+DEFINE_GUID(IID_IDirectMusicGetLoader,0x68a04844,0xd13d,0x11d1,0xaf,0xa6,0x0,0xaa,0x0,0x24,0xd8,0xb6);
+DEFINE_GUID(IID_IDirectMusicObject,0xd2ac28b5,0xb39b,0x11d1,0x87,0x4,0x0,0x60,0x8,0x93,0xb1,0xbd);
+DEFINE_GUID(IID_IDirectMusicSegment,0xf96029a2,0x4282,0x11d2,0x87,0x17,0x0,0x60,0x8,0x93,0xb1,0xbd);
+DEFINE_GUID(IID_IDirectMusicSegmentState,0xa3afdcc7,0xd3ee,0x11d1,0xbc,0x8d,0x0,0xa0,0xc9,0x22,0xe6,0xeb);
+DEFINE_GUID(IID_IDirectMusicTrack,0xf96029a1,0x4282,0x11d2,0x87,0x17,0x0,0x60,0x8,0x93,0xb1,0xbd);
+DEFINE_GUID(IID_IDirectMusicPerformance,0x7d43d03,0x6523,0x11d2,0x87,0x1d,0x0,0x60,0x8,0x93,0xb1,0xbd);
+DEFINE_GUID(IID_IDirectMusicTool,0xd2ac28ba,0xb39b,0x11d1,0x87,0x4,0x0,0x60,0x8,0x93,0xb1,0xbd);
+DEFINE_GUID(IID_IDirectMusicGraph,0x2befc277,0x5497,0x11d2,0xbc,0xcb,0x0,0xa0,0xc9,0x22,0xe6,0xeb);
+DEFINE_GUID(IID_IDirectMusicStyle,0xd2ac28bd,0xb39b,0x11d1,0x87,0x4,0x0,0x60,0x8,0x93,0xb1,0xbd);
+DEFINE_GUID(IID_IDirectMusicChordMap,0xd2ac28be,0xb39b,0x11d1,0x87,0x4,0x0,0x60,0x8,0x93,0xb1,0xbd);
+DEFINE_GUID(IID_IDirectMusicComposer,0xd2ac28bf,0xb39b,0x11d1,0x87,0x4,0x0,0x60,0x8,0x93,0xb1,0xbd);
+DEFINE_GUID(IID_IDirectMusicBand,0xd2ac28c0,0xb39b,0x11d1,0x87,0x4,0x0,0x60,0x8,0x93,0xb1,0xbd);
+
+/////////////////////////////////////////////////////////////////////
+// File DPLAY.H:
+/////////////////////////////////////////////////////////////////////
+
+DEFINE_GUID(IID_IDirectPlay2,0x2b74f7c0,0x9154,0x11cf,0xa9,0xcd,0x0,0xaa,0x0,0x68,0x86,0xe3);
+DEFINE_GUID(IID_IDirectPlay2A,0x9d460580,0xa822,0x11cf,0x96,0xc,0x0,0x80,0xc7,0x53,0x4e,0x82);
+DEFINE_GUID(IID_IDirectPlay3,0x133efe40,0x32dc,0x11d0,0x9c,0xfb,0x0,0xa0,0xc9,0xa,0x43,0xcb);
+DEFINE_GUID(IID_IDirectPlay3A,0x133efe41,0x32dc,0x11d0,0x9c,0xfb,0x0,0xa0,0xc9,0xa,0x43,0xcb);
+DEFINE_GUID(IID_IDirectPlay4,0xab1c530,0x4745,0x11d1,0xa7,0xa1,0x0,0x0,0xf8,0x3,0xab,0xfc);
+DEFINE_GUID(IID_IDirectPlay4A,0xab1c531,0x4745,0x11d1,0xa7,0xa1,0x0,0x0,0xf8,0x3,0xab,0xfc);
+DEFINE_GUID(CLSID_DirectPlay,0xd1eb6d20,0x8923,0x11d0,0x9d,0x97,0x0,0xa0,0xc9,0xa,0x43,0xcb);
+DEFINE_GUID(DPSPGUID_IPX,0x685bc400,0x9d2c,0x11cf,0xa9,0xcd,0x0,0xaa,0x0,0x68,0x86,0xe3);
+DEFINE_GUID(DPSPGUID_TCPIP,0x36E95EE0,0x8577,0x11cf,0x96,0xc,0x0,0x80,0xc7,0x53,0x4e,0x82);
+DEFINE_GUID(DPSPGUID_SERIAL,0xf1d6860,0x88d9,0x11cf,0x9c,0x4e,0x0,0xa0,0xc9,0x5,0x42,0x5e);
+DEFINE_GUID(DPSPGUID_MODEM,0x44eaa760,0xcb68,0x11cf,0x9c,0x4e,0x0,0xa0,0xc9,0x5,0x42,0x5e);
+DEFINE_GUID(IID_IDirectPlay,0x5454e9a0,0xdb65,0x11ce,0x92,0x1c,0x00,0xaa,0x00,0x6c,0x49,0x72);
+
+/////////////////////////////////////////////////////////////////////
+// File DPLOBBY.H:
+/////////////////////////////////////////////////////////////////////
+
+DEFINE_GUID(IID_IDirectPlayLobby,0xaf465c71,0x9588,0x11cf,0xa0,0x20,0x0,0xaa,0x0,0x61,0x57,0xac);
+DEFINE_GUID(IID_IDirectPlayLobbyA,0x26c66a70,0xb367,0x11cf,0xa0,0x24,0x0,0xaa,0x0,0x61,0x57,0xac);
+DEFINE_GUID(IID_IDirectPlayLobby2,0x194c220,0xa303,0x11d0,0x9c,0x4f,0x0,0xa0,0xc9,0x5,0x42,0x5e);
+DEFINE_GUID(IID_IDirectPlayLobby2A,0x1bb4af80,0xa303,0x11d0,0x9c,0x4f,0x0,0xa0,0xc9,0x5,0x42,0x5e);
+DEFINE_GUID(IID_IDirectPlayLobby3,0x2db72490,0x652c,0x11d1,0xa7,0xa8,0x0,0x0,0xf8,0x3,0xab,0xfc);
+DEFINE_GUID(IID_IDirectPlayLobby3A,0x2db72491,0x652c,0x11d1,0xa7,0xa8,0x0,0x0,0xf8,0x3,0xab,0xfc);
+DEFINE_GUID(CLSID_DirectPlayLobby,0x2fe8f810,0xb2a5,0x11d0,0xa7,0x87,0x0,0x0,0xf8,0x3,0xab,0xfc);
+DEFINE_GUID(DPLPROPERTY_MessagesSupported,0x762ccda1,0xd916,0x11d0,0xba,0x39,0x0,0xc0,0x4f,0xd7,0xed,0x67);
+DEFINE_GUID(DPLPROPERTY_LobbyGuid,0xf56920a0,0xd218,0x11d0,0xba,0x39,0x0,0xc0,0x4f,0xd7,0xed,0x67);
+DEFINE_GUID(DPLPROPERTY_PlayerGuid,0xb4319322,0xd20d,0x11d0,0xba,0x39,0x0,0xc0,0x4f,0xd7,0xed,0x67);
+DEFINE_GUID(DPLPROPERTY_PlayerScore,0x48784000,0xd219,0x11d0,0xba,0x39,0x0,0xc0,0x4f,0xd7,0xed,0x67);
+DEFINE_GUID(DPAID_TotalSize,0x1318f560,0x912c,0x11d0,0x9d,0xaa,0x0,0xa0,0xc9,0xa,0x43,0xcb);
+DEFINE_GUID(DPAID_ServiceProvider,0x7d916c0,0xe0af,0x11cf,0x9c,0x4e,0x0,0xa0,0xc9,0x5,0x42,0x5e);
+DEFINE_GUID(DPAID_LobbyProvider,0x59b95640,0x9667,0x11d0,0xa7,0x7d,0x0,0x0,0xf8,0x3,0xab,0xfc);
+DEFINE_GUID(DPAID_Phone,0x78ec89a0,0xe0af,0x11cf,0x9c,0x4e,0x0,0xa0,0xc9,0x5,0x42,0x5e);
+DEFINE_GUID(DPAID_PhoneW,0xba5a7a70,0x9dbf,0x11d0,0x9c,0xc1,0x0,0xa0,0xc9,0x5,0x42,0x5e);
+DEFINE_GUID(DPAID_Modem,0xf6dcc200,0xa2fe,0x11d0,0x9c,0x4f,0x0,0xa0,0xc9,0x5,0x42,0x5e);
+DEFINE_GUID(DPAID_ModemW,0x1fd92e0,0xa2ff,0x11d0,0x9c,0x4f,0x0,0xa0,0xc9,0x5,0x42,0x5e);
+DEFINE_GUID(DPAID_INet,0xc4a54da0,0xe0af,0x11cf,0x9c,0x4e,0x0,0xa0,0xc9,0x5,0x42,0x5e);
+DEFINE_GUID(DPAID_INetW,0xe63232a0,0x9dbf,0x11d0,0x9c,0xc1,0x0,0xa0,0xc9,0x5,0x42,0x5e);
+DEFINE_GUID(DPAID_INetPort,0xe4524541,0x8ea5,0x11d1,0x8a,0x96,0x0,0x60,0x97,0xb0,0x14,0x11);
+DEFINE_GUID(DPAID_ComPort,0xf2f0ce00,0xe0af,0x11cf,0x9c,0x4e,0x0,0xa0,0xc9,0x5,0x42,0x5e);
+
+/////////////////////////////////////////////////////////////////////
+// File DSOUND.H:
+/////////////////////////////////////////////////////////////////////
+
+DEFINE_GUID(CLSID_DirectSound,0x47d4d946,0x62e8,0x11cf,0x93,0xbc,0x44,0x45,0x53,0x54,0x0,0x0);
+DEFINE_GUID(CLSID_DirectSoundCapture,0xb0210780,0x89cd,0x11d0,0xaf,0x8,0x0,0xa0,0xc9,0x25,0xcd,0x16);
+DEFINE_GUID(IID_IDirectSound,0x279AFA83,0x4981,0x11CE,0xA5,0x21,0x00,0x20,0xAF,0x0B,0xE5,0x60);
+DEFINE_GUID(IID_IDirectSoundBuffer,0x279AFA85,0x4981,0x11CE,0xA5,0x21,0x00,0x20,0xAF,0x0B,0xE5,0x60);
+DEFINE_GUID(IID_IDirectSound3DListener,0x279AFA84,0x4981,0x11CE,0xA5,0x21,0x00,0x20,0xAF,0x0B,0xE5,0x60);
+DEFINE_GUID(IID_IDirectSound3DBuffer,0x279AFA86,0x4981,0x11CE,0xA5,0x21,0x00,0x20,0xAF,0x0B,0xE5,0x60);
+DEFINE_GUID(IID_IDirectSoundCapture,0xb0210781,0x89cd,0x11d0,0xaf,0x8,0x0,0xa0,0xc9,0x25,0xcd,0x16);
+DEFINE_GUID(IID_IDirectSoundCaptureBuffer,0xb0210782,0x89cd,0x11d0,0xaf,0x8,0x0,0xa0,0xc9,0x25,0xcd,0x16);
+DEFINE_GUID(IID_IDirectSoundNotify,0xb0210783,0x89cd,0x11d0,0xaf,0x8,0x0,0xa0,0xc9,0x25,0xcd,0x16);
+DEFINE_GUID(IID_IKsPropertySet,0x31efac30,0x515c,0x11d0,0xa9,0xaa,0x00,0xaa,0x00,0x61,0xbe,0x93);
+
+/////////////////////////////////////////////////////////////////////
+// File DVP.H:
+/////////////////////////////////////////////////////////////////////
+
+DEFINE_GUID(IID_IDDVideoPortContainer,0x6C142760,0xA733,0x11CE,0xA5,0x21,0x00,0x20,0xAF,0x0B,0xE5,0x60);
+DEFINE_GUID(IID_IDirectDrawVideoPort,0xB36D93E0,0x2B43,0x11CF,0xA2,0xDE,0x00,0xAA,0x00,0xB9,0x33,0x56);
+DEFINE_GUID(DDVPTYPE_E_HREFH_VREFH,0x54F39980L,0xDA60,0x11CF,0x9B,0x06,0x00,0xA0,0xC9,0x03,0xA3,0xB8);
+DEFINE_GUID(DDVPTYPE_E_HREFH_VREFL,0x92783220L,0xDA60,0x11CF,0x9B,0x06,0x00,0xA0,0xC9,0x03,0xA3,0xB8);
+DEFINE_GUID(DDVPTYPE_E_HREFL_VREFH,0xA07A02E0L,0xDA60,0x11CF,0x9B,0x06,0x00,0xA0,0xC9,0x03,0xA3,0xB8);
+DEFINE_GUID(DDVPTYPE_E_HREFL_VREFL,0xE09C77E0L,0xDA60,0x11CF,0x9B,0x06,0x00,0xA0,0xC9,0x03,0xA3,0xB8);
+DEFINE_GUID(DDVPTYPE_CCIR656,0xFCA326A0L,0xDA60,0x11CF,0x9B,0x06,0x00,0xA0,0xC9,0x03,0xA3,0xB8);
+DEFINE_GUID(DDVPTYPE_BROOKTREE,0x1352A560L,0xDA61,0x11CF,0x9B,0x06,0x00,0xA0,0xC9,0x03,0xA3,0xB8);
+DEFINE_GUID(DDVPTYPE_PHILIPS,0x332CF160L,0xDA61,0x11CF,0x9B,0x06,0x00,0xA0,0xC9,0x03,0xA3,0xB8);
+
+/////////////////////////////////////////////////////////////////////
+// File DXFILE.H:
+/////////////////////////////////////////////////////////////////////
+
+DEFINE_GUID(CLSID_CDirectXFile,0x4516ec43,0x8f20,0x11d0,0x9b,0x6d,0x00,0x00,0xc0,0x78,0x1b,0xc3);
+DEFINE_GUID(IID_IDirectXFile,0x3d82ab40,0x62da,0x11cf,0xab,0x39,0x0,0x20,0xaf,0x71,0xe4,0x33);
+DEFINE_GUID(IID_IDirectXFileEnumObject,0x3d82ab41,0x62da,0x11cf,0xab,0x39,0x0,0x20,0xaf,0x71,0xe4,0x33);
+DEFINE_GUID(IID_IDirectXFileSaveObject,0x3d82ab42,0x62da,0x11cf,0xab,0x39,0x0,0x20,0xaf,0x71,0xe4,0x33);
+DEFINE_GUID(IID_IDirectXFileObject,0x3d82ab43,0x62da,0x11cf,0xab,0x39,0x0,0x20,0xaf,0x71,0xe4,0x33);
+DEFINE_GUID(IID_IDirectXFileData,0x3d82ab44,0x62da,0x11cf,0xab,0x39,0x0,0x20,0xaf,0x71,0xe4,0x33);
+DEFINE_GUID(IID_IDirectXFileDataReference,0x3d82ab45,0x62da,0x11cf,0xab,0x39,0x0,0x20,0xaf,0x71,0xe4,0x33);
+DEFINE_GUID(IID_IDirectXFileBinary,0x3d82ab46,0x62da,0x11cf,0xab,0x39,0x0,0x20,0xaf,0x71,0xe4,0x33);
+DEFINE_GUID(TID_DXFILEHeader,0x3d82ab43,0x62da,0x11cf,0xab,0x39,0x0,0x20,0xaf,0x71,0xe4,0x33);
+
+/////////////////////////////////////////////////////////////////////
+// File RMXFGUID.H:
+/////////////////////////////////////////////////////////////////////
+
+DEFINE_GUID(TID_D3DRMInfo,0x2b957100,0x9e9a,0x11cf,0xab,0x39,0x0,0x20,0xaf,0x71,0xe4,0x33);
+DEFINE_GUID(TID_D3DRMMesh,0x3d82ab44,0x62da,0x11cf,0xab,0x39,0x0,0x20,0xaf,0x71,0xe4,0x33);
+DEFINE_GUID(TID_D3DRMVector,0x3d82ab5e,0x62da,0x11cf,0xab,0x39,0x0,0x20,0xaf,0x71,0xe4,0x33);
+DEFINE_GUID(TID_D3DRMMeshFace,0x3d82ab5f,0x62da,0x11cf,0xab,0x39,0x0,0x20,0xaf,0x71,0xe4,0x33);
+DEFINE_GUID(TID_D3DRMMaterial,0x3d82ab4d,0x62da,0x11cf,0xab,0x39,0x0,0x20,0xaf,0x71,0xe4,0x33);
+DEFINE_GUID(TID_D3DRMMaterialArray,0x35ff44e1,0x6c7c,0x11cf,0x8F,0x52,0x0,0x40,0x33,0x35,0x94,0xa3);
+DEFINE_GUID(TID_D3DRMFrame,0x3d82ab46,0x62da,0x11cf,0xab,0x39,0x0,0x20,0xaf,0x71,0xe4,0x33);
+DEFINE_GUID(TID_D3DRMFrameTransformMatrix,0xf6f23f41,0x7686,0x11cf,0x8f,0x52,0x0,0x40,0x33,0x35,0x94,0xa3);
+DEFINE_GUID(TID_D3DRMMeshMaterialList,0xf6f23f42,0x7686,0x11cf,0x8f,0x52,0x0,0x40,0x33,0x35,0x94,0xa3);
+DEFINE_GUID(TID_D3DRMMeshTextureCoords,0xf6f23f40,0x7686,0x11cf,0x8f,0x52,0x0,0x40,0x33,0x35,0x94,0xa3);
+DEFINE_GUID(TID_D3DRMMeshNormals,0xf6f23f43,0x7686,0x11cf,0x8f,0x52,0x0,0x40,0x33,0x35,0x94,0xa3);
+DEFINE_GUID(TID_D3DRMCoords2d,0xf6f23f44,0x7686,0x11cf,0x8f,0x52,0x0,0x40,0x33,0x35,0x94,0xa3);
+DEFINE_GUID(TID_D3DRMMatrix4x4,0xf6f23f45,0x7686,0x11cf,0x8f,0x52,0x0,0x40,0x33,0x35,0x94,0xa3);
+DEFINE_GUID(TID_D3DRMAnimation,0x3d82ab4f,0x62da,0x11cf,0xab,0x39,0x0,0x20,0xaf,0x71,0xe4,0x33);
+DEFINE_GUID(TID_D3DRMAnimationSet,0x3d82ab50,0x62da,0x11cf,0xab,0x39,0x0,0x20,0xaf,0x71,0xe4,0x33);
+DEFINE_GUID(TID_D3DRMAnimationKey,0x10dd46a8,0x775b,0x11cf,0x8f,0x52,0x0,0x40,0x33,0x35,0x94,0xA3);
+DEFINE_GUID(TID_D3DRMFloatKeys,0x10dd46a9,0x775b,0x11cf,0x8f,0x52,0x0,0x40,0x33,0x35,0x94,0xA3);
+DEFINE_GUID(TID_D3DRMMaterialAmbientColor,0x01411840,0x7786,0x11cf,0x8f,0x52,0x0,0x40,0x33,0x35,0x94,0xA3);
+DEFINE_GUID(TID_D3DRMMaterialDiffuseColor,0x01411841,0x7786,0x11cf,0x8f,0x52,0x0,0x40,0x33,0x35,0x94,0xA3);
+DEFINE_GUID(TID_D3DRMMaterialSpecularColor,0x01411842,0x7786,0x11cf,0x8f,0x52,0x0,0x40,0x33,0x35,0x94,0xA3);
+DEFINE_GUID(TID_D3DRMMaterialEmissiveColor,0xd3e16e80,0x7835,0x11cf,0x8f,0x52,0x0,0x40,0x33,0x35,0x94,0xa3);
+DEFINE_GUID(TID_D3DRMMaterialPower,0x01411843,0x7786,0x11cf,0x8f,0x52,0x0,0x40,0x33,0x35,0x94,0xA3);
+DEFINE_GUID(TID_D3DRMColorRGBA,0x35ff44e0,0x6c7c,0x11cf,0x8f,0x52,0x0,0x40,0x33,0x35,0x94,0xA3);
+DEFINE_GUID(TID_D3DRMColorRGB,0xd3e16e81,0x7835,0x11cf,0x8f,0x52,0x0,0x40,0x33,0x35,0x94,0xa3);
+DEFINE_GUID(TID_D3DRMGuid,0xa42790e0,0x7810,0x11cf,0x8f,0x52,0x0,0x40,0x33,0x35,0x94,0xa3);
+DEFINE_GUID(TID_D3DRMTextureFilename,0xa42790e1,0x7810,0x11cf,0x8f,0x52,0x0,0x40,0x33,0x35,0x94,0xa3);
+DEFINE_GUID(TID_D3DRMTextureReference,0xa42790e2,0x7810,0x11cf,0x8f,0x52,0x0,0x40,0x33,0x35,0x94,0xa3);
+DEFINE_GUID(TID_D3DRMIndexedColor,0x1630b820,0x7842,0x11cf,0x8f,0x52,0x0,0x40,0x33,0x35,0x94,0xa3);
+DEFINE_GUID(TID_D3DRMMeshVertexColors,0x1630b821,0x7842,0x11cf,0x8f,0x52,0x0,0x40,0x33,0x35,0x94,0xa3);
+DEFINE_GUID(TID_D3DRMMaterialWrap,0x4885ae60,0x78e8,0x11cf,0x8f,0x52,0x0,0x40,0x33,0x35,0x94,0xa3);
+DEFINE_GUID(TID_D3DRMBoolean,0x537da6a0,0xca37,0x11d0,0x94,0x1c,0x0,0x80,0xc8,0xc,0xfa,0x7b);
+DEFINE_GUID(TID_D3DRMMeshFaceWraps,0xed1ec5c0,0xc0a8,0x11d0,0x94,0x1c,0x0,0x80,0xc8,0xc,0xfa,0x7b);
+DEFINE_GUID(TID_D3DRMBoolean2d,0x4885ae63,0x78e8,0x11cf,0x8f,0x52,0x0,0x40,0x33,0x35,0x94,0xa3);
+DEFINE_GUID(TID_D3DRMTimedFloatKeys,0xf406b180,0x7b3b,0x11cf,0x8f,0x52,0x0,0x40,0x33,0x35,0x94,0xa3);
+DEFINE_GUID(TID_D3DRMAnimationOptions,0xe2bf56c0,0x840f,0x11cf,0x8f,0x52,0x0,0x40,0x33,0x35,0x94,0xa3);
+DEFINE_GUID(TID_D3DRMFramePosition,0xe2bf56c1,0x840f,0x11cf,0x8f,0x52,0x0,0x40,0x33,0x35,0x94,0xa3);
+DEFINE_GUID(TID_D3DRMFrameVelocity,0xe2bf56c2,0x840f,0x11cf,0x8f,0x52,0x0,0x40,0x33,0x35,0x94,0xa3);
+DEFINE_GUID(TID_D3DRMFrameRotation,0xe2bf56c3,0x840f,0x11cf,0x8f,0x52,0x0,0x40,0x33,0x35,0x94,0xa3);
+DEFINE_GUID(TID_D3DRMLight,0x3d82ab4a,0x62da,0x11cf,0xab,0x39,0x0,0x20,0xaf,0x71,0xe4,0x33);
+DEFINE_GUID(TID_D3DRMCamera,0x3d82ab51,0x62da,0x11cf,0xab,0x39,0x0,0x20,0xaf,0x71,0xe4,0x33);
+DEFINE_GUID(TID_D3DRMAppData,0xe5745280,0xb24f,0x11cf,0x9d,0xd5,0x0,0xaa,0x0,0xa7,0x1a,0x2f);
+DEFINE_GUID(TID_D3DRMLightUmbra,0xaed22740,0xb31f,0x11cf,0x9d,0xd5,0x0,0xaa,0x0,0xa7,0x1a,0x2f);
+DEFINE_GUID(TID_D3DRMLightRange,0xaed22742,0xb31f,0x11cf,0x9d,0xd5,0x0,0xaa,0x0,0xa7,0x1a,0x2f);
+DEFINE_GUID(TID_D3DRMLightPenumbra,0xaed22741,0xb31f,0x11cf,0x9d,0xd5,0x0,0xaa,0x0,0xa7,0x1a,0x2f);
+DEFINE_GUID(TID_D3DRMLightAttenuation,0xa8a98ba0,0xc5e5,0x11cf,0xb9,0x41,0x0,0x80,0xc8,0xc,0xfa,0x7b);
+DEFINE_GUID(TID_D3DRMInlineData,0x3a23eea0,0x94b1,0x11d0,0xab,0x39,0x0,0x20,0xaf,0x71,0xe4,0x33);
+DEFINE_GUID(TID_D3DRMUrl,0x3a23eea1,0x94b1,0x11d0,0xab,0x39,0x0,0x20,0xaf,0x71,0xe4,0x33);
+DEFINE_GUID(TID_D3DRMProgressiveMesh,0x8A63C360,0x997D,0x11d0,0x94,0x1C,0x0,0x80,0xC8,0x0C,0xFA,0x7B);
+DEFINE_GUID(TID_D3DRMExternalVisual,0x98116AA0,0xBDBA,0x11d1,0x82,0xC0,0x00,0xA0,0xC9,0x69,0x72,0x71);
+DEFINE_GUID(TID_D3DRMStringProperty,0x7f0f21e0,0xbfe1,0x11d1,0x82,0xc0,0x0,0xa0,0xc9,0x69,0x72,0x71);
+DEFINE_GUID(TID_D3DRMPropertyBag,0x7f0f21e1,0xbfe1,0x11d1,0x82,0xc0,0x0,0xa0,0xc9,0x69,0x72,0x71);
+DEFINE_GUID(TID_D3DRMRightHanded,0x7f5d5ea0,0xd53a,0x11d1,0x82,0xc0,0x0,0xa0,0xc9,0x69,0x72,0x71);
diff --git a/winsup/w32api/lib/gdi32.def b/winsup/w32api/lib/gdi32.def
new file mode 100644
index 000000000..d3b3d9c35
--- /dev/null
+++ b/winsup/w32api/lib/gdi32.def
@@ -0,0 +1,334 @@
+LIBRARY GDI32.dll
+EXPORTS
+AbortDoc@4
+AbortPath@4
+AddFontResourceA@4
+AddFontResourceW@4
+AngleArc@24
+AnimatePalette@16
+Arc@36
+ArcTo@36
+BeginPath@4
+BitBlt@36
+CancelDC@4
+CheckColorsInGamut@16
+ChoosePixelFormat@8
+Chord@36
+CloseEnhMetaFile@4
+CloseFigure@4
+CloseMetaFile@4
+ColorMatchToTarget@12
+CombineRgn@16
+CombineTransform@12
+CopyEnhMetaFileA@8
+CopyEnhMetaFileW@8
+CopyMetaFileA@8
+CopyMetaFileW@8
+CreateBitmap@20
+CreateBitmapIndirect@4
+CreateBrushIndirect@4
+CreateColorSpaceA@4
+CreateColorSpaceW@4
+CreateCompatibleBitmap@12
+CreateCompatibleDC@4
+CreateDCA@16
+CreateDCW@16
+CreateDIBPatternBrush@8
+CreateDIBPatternBrushPt@8
+CreateDIBSection@24
+CreateDIBitmap@24
+CreateDiscardableBitmap@12
+CreateEllipticRgn@16
+CreateEllipticRgnIndirect@4
+CreateEnhMetaFileA@16
+CreateEnhMetaFileW@16
+CreateFontA@56
+CreateFontIndirectA@4
+CreateFontIndirectW@4
+CreateFontW@56
+CreateHalftonePalette@4
+CreateHatchBrush@8
+CreateICA@16
+CreateICW@16
+CreateMetaFileA@4
+CreateMetaFileW@4
+CreatePalette@4
+CreatePatternBrush@4
+CreatePen@12
+CreatePenIndirect@4
+CreatePolyPolygonRgn@16
+CreatePolygonRgn@12
+CreateRectRgn@16
+CreateRectRgnIndirect@4
+CreateRoundRectRgn@24
+CreateScalableFontResourceA@16
+CreateScalableFontResourceW@16
+CreateSolidBrush@4
+DPtoLP@12
+DeleteColorSpace@4
+DeleteDC@4
+DeleteEnhMetaFile@4
+DeleteMetaFile@4
+DeleteObject@4
+DescribePixelFormat@16
+DeviceCapabilitiesEx@24
+DeviceCapabilitiesExA@24
+DeviceCapabilitiesExW@24
+DrawEscape@16
+Ellipse@20
+EndDoc@4
+EndPage@4
+EndPath@4
+EnumEnhMetaFile@20
+EnumFontFamiliesA@16
+EnumFontFamiliesExA@20
+EnumFontFamiliesExW@20
+EnumFontFamiliesW@16
+EnumFontsA@16
+EnumFontsW@16
+EnumICMProfilesA@12
+EnumICMProfilesW@12
+EnumMetaFile@16
+EnumObjects@16
+EqualRgn@8
+Escape@20
+ExcludeClipRect@20
+ExtCreatePen@20
+ExtCreateRegion@12
+ExtEscape@24
+ExtFloodFill@20
+ExtSelectClipRgn@12
+ExtTextOutA@32
+ExtTextOutW@32
+FillPath@4
+FillRgn@12
+FixBrushOrgEx@16
+FlattenPath@4
+FloodFill@16
+FrameRgn@20
+GdiComment@12
+GdiFlush@0
+GdiGetBatchLimit@0
+GdiPlayDCScript@24
+GdiPlayJournal@20
+GdiPlayScript@28
+GdiSetBatchLimit@4
+GetArcDirection@4
+GetAspectRatioFilterEx@8
+GetBitmapBits@12
+GetBitmapDimensionEx@8
+GetBkColor@4
+GetBkMode@4
+GetBoundsRect@12
+GetBrushOrgEx@8
+GetCharABCWidthsA@16
+GetCharABCWidthsFloatA@16
+GetCharABCWidthsFloatW@16
+GetCharABCWidthsW@16
+GetCharWidth32A@16
+GetCharWidth32W@16
+GetCharWidthA@16
+GetCharWidthFloatA@16
+GetCharWidthFloatW@16
+GetCharWidthW@16
+GetCharacterPlacementA@24
+GetCharacterPlacementW@24
+GetClipBox@8
+GetClipRgn@8
+GetColorAdjustment@8
+GetColorSpace@4
+GetCurrentObject@8
+GetCurrentPositionEx@8
+GetDCOrgEx@8
+GetDIBColorTable@16
+GetDIBits@28
+GetDeviceCaps@8
+GetDeviceGammaRamp@8
+GetEnhMetaFileA@4
+GetEnhMetaFileBits@12
+GetEnhMetaFileDescriptionA@12
+GetEnhMetaFileDescriptionW@12
+GetEnhMetaFileHeader@12
+GetEnhMetaFilePaletteEntries@12
+GetEnhMetaFilePixelFormat@12
+GetEnhMetaFileW@4
+GetFontData@20
+GetFontLanguageInfo@4
+GetFontResourceInfo@16
+GetFontResourceInfoW@16
+GetGlyphOutline@28
+GetGlyphOutlineA@28
+GetGlyphOutlineW@28
+GetGlyphOutlineWow@28
+GetGraphicsMode@4
+GetICMProfileA@12
+GetICMProfileW@12
+GetKerningPairs@12
+GetKerningPairsA@12
+GetKerningPairsW@12
+GetLogColorSpaceA@12
+GetLogColorSpaceW@12
+GetMapMode@4
+GetMetaFileA@4
+GetMetaFileBitsEx@12
+GetMetaFileW@4
+GetMetaRgn@8
+GetMiterLimit@8
+GetNearestColor@8
+GetNearestPaletteIndex@8
+GetObjectA@12
+GetObjectType@4
+GetObjectW@12
+GetOutlineTextMetricsA@12
+GetOutlineTextMetricsW@12
+GetPaletteEntries@16
+GetPath@16
+GetPixel@12
+GetPixelFormat@4
+GetPolyFillMode@4
+GetROP2@4
+GetRandomRgn@12
+GetRasterizerCaps@8
+GetRegionData@12
+GetRelAbs@8
+GetRgnBox@8
+GetStockObject@4
+GetStretchBltMode@4
+GetSystemPaletteEntries@16
+GetSystemPaletteUse@4
+GetTextAlign@4
+GetTextCharacterExtra@4
+GetTextCharset@4
+GetTextCharsetInfo@12
+GetTextColor@4
+GetTextExtentExPointA@28
+GetTextExtentExPointW@28
+GetTextExtentPoint32A@16
+GetTextExtentPoint32W@16
+GetTextExtentPointA@16
+GetTextExtentPointW@16
+GetTextFaceA@12
+GetTextFaceW@12
+GetTextMetricsA@8
+GetTextMetricsW@8
+GetViewportExtEx@8
+GetViewportOrgEx@8
+GetWinMetaFileBits@20
+GetWindowExtEx@8
+GetWindowOrgEx@8
+GetWorldTransform@8
+IntersectClipRect@20
+InvertRgn@8
+LPtoDP@12
+LineDDA@24
+LineTo@12
+MaskBlt@48
+ModifyWorldTransform@12
+MoveToEx@16
+OffsetClipRgn@12
+OffsetRgn@12
+OffsetViewportOrgEx@16
+OffsetWindowOrgEx@16
+PaintRgn@8
+PatBlt@24
+PathToRegion@4
+Pie@36
+PlayEnhMetaFile@12
+PlayEnhMetaFileRecord@16
+PlayMetaFile@8
+PlayMetaFileRecord@16
+PlgBlt@40
+PolyBezier@12
+PolyBezierTo@12
+PolyDraw@16
+PolyPolygon@16
+PolyPolyline@16
+PolyTextOutA@12
+PolyTextOutW@12
+Polygon@12
+Polyline@12
+PolylineTo@12
+PtInRegion@12
+PtVisible@12
+RealizePalette@4
+RectInRegion@8
+RectVisible@8
+Rectangle@20
+RemoveFontResourceA@4
+RemoveFontResourceW@4
+ResetDCA@8
+ResetDCW@8
+ResizePalette@8
+RestoreDC@8
+RoundRect@28
+SaveDC@4
+ScaleViewportExtEx@24
+ScaleWindowExtEx@24
+SelectBrushLocal@8
+SelectClipPath@8
+SelectClipRgn@8
+SelectFontLocal@8
+SelectObject@8
+SelectPalette@12
+SetAbortProc@8
+SetArcDirection@8
+SetBitmapBits@12
+SetBitmapDimensionEx@16
+SetBkColor@8
+SetBkMode@8
+SetBoundsRect@12
+SetBrushOrgEx@16
+SetColorAdjustment@8
+SetColorSpace@8
+SetDIBColorTable@16
+SetDIBits@28
+SetDIBitsToDevice@48
+SetDeviceGammaRamp@8
+SetEnhMetaFileBits@8
+SetFontEnumeration@4
+SetGraphicsMode@8
+SetICMMode@8
+SetICMProfileA@8
+SetICMProfileW@8
+SetMapMode@8
+SetMapperFlags@8
+SetMetaFileBitsEx@8
+SetMetaRgn@4
+SetMiterLimit@12
+SetPaletteEntries@16
+SetPixel@16
+SetPixelFormat@12
+SetPixelV@16
+SetPolyFillMode@8
+SetROP2@8
+SetRectRgn@20
+SetRelAbs@8
+SetStretchBltMode@8
+SetSystemPaletteUse@8
+SetTextAlign@8
+SetTextCharacterExtra@8
+SetTextColor@8
+SetTextJustification@12
+SetViewportExtEx@16
+SetViewportOrgEx@16
+SetWinMetaFileBits@16
+SetWindowExtEx@16
+SetWindowOrgEx@16
+SetWorldTransform@8
+StartDocA@8
+StartDocW@8
+StartPage@4
+StretchBlt@44
+StretchDIBits@52
+StrokeAndFillPath@4
+StrokePath@4
+SwapBuffers@4
+TextOutA@20
+TextOutW@20
+TranslateCharsetInfo@12
+UnrealizeObject@4
+UpdateColors@4
+UpdateICMRegKeyA@16
+UpdateICMRegKeyW@16
+WidenPath@4
+gdiPlaySpoolStream@24
diff --git a/winsup/w32api/lib/glaux.def b/winsup/w32api/lib/glaux.def
new file mode 100644
index 000000000..87f72371e
--- /dev/null
+++ b/winsup/w32api/lib/glaux.def
@@ -0,0 +1,173 @@
+LIBRARY GLAUX.DLL
+EXPORTS
+AllocateMemory@4
+AllocateZeroedMemory@4
+CleanUp@0
+ComponentFromIndex@12
+CreateCIPalette@4
+CreateRGBPalette@4
+DelayPaletteRealization@0
+DestroyThisWindow@4
+FillRgbPaletteEntries@12
+FindBestPixelFormat@12
+FindExactPixelFormat@12
+FindPixelFormat@8
+FlushPalette@8
+ForceRedraw@4
+FreeMemory@4
+GetRegistrySysColors@8
+GrabStaticEntries@4
+IsPixelFormatValid@12
+PixelFormatDescriptorFromDc@8
+PrintMessage
+RealizePaletteNow@12
+ReleaseStaticEntries@4
+UpdateStaticMapping@4
+tkCloseWindow@0
+tkDisplayFunc@4
+tkErrorPopups@4
+tkExec@0
+tkExposeFunc@4
+tkGetColorMapSize@0
+tkGetDisplayMode@0
+tkGetDisplayModeID@0
+tkGetDisplayModePolicy@0
+tkGetHDC@0
+tkGetHRC@0
+tkGetHWND@0
+tkGetMouseLoc@8
+tkIdleFunc@4
+tkInitDisplayMode@4
+tkInitDisplayModeID@4
+tkInitDisplayModePolicy@4
+tkInitPosition@16
+tkInitWindow@4
+tkInitWindowAW@8
+tkKeyDownFunc@4
+tkMouseDownFunc@4
+tkMouseMoveFunc@4
+tkMouseUpFunc@4
+tkQuit@0
+tkReshapeFunc@4
+tkSetFogRamp@8
+tkSetGreyRamp@0
+tkSetOneColor@16
+tkSetRGBMap@8
+tkSwapBuffers@0
+tkWndProc@16
+RawImageClose@4
+RawImageGetData@8
+RawImageGetRow@16
+RawImageOpenAW@8
+tkRGBImageLoad@4
+tkRGBImageLoadAW@8
+tkCreateBitmapFont@4
+tkCreateFilledFont@4
+tkCreateOutlineFont@4
+tkCreateStrokeFont@4
+tkDrawStr@8
+DibNumColors@4
+tkDIBImageLoad@4
+tkDIBImageLoadAW@8
+m_popmatrix@0
+m_pushmatrix@0
+m_scale@24
+m_translate@24
+m_xformpt@16
+m_xformptonly@8
+add3@12
+copy3@8
+copymat3@8
+crossprod@12
+diff3@12
+dist3@8
+dot3@8
+error@4
+identifymat3@4
+length3@4
+normalize@4
+perpnorm@16
+samepoint@8
+scalarmult@16
+seterrorfunc@4
+xformvec3@12
+auxSolidTeapot@8
+auxWireTeapot@8
+solidTeapot@12
+wireTeapot@12
+auxSolidBox@24
+auxSolidCone@16
+auxSolidCube@8
+auxSolidCylinder@16
+auxSolidDodecahedron@8
+auxSolidIcosahedron@8
+auxSolidOctahedron@8
+auxSolidSphere@8
+auxSolidTetrahedron@8
+auxSolidTorus@16
+auxWireBox@24
+auxWireCone@16
+auxWireCube@8
+auxWireCylinder@16
+auxWireDodecahedron@8
+auxWireIcosahedron@8
+auxWireOctahedron@8
+auxWireSphere@8
+auxWireTetrahedron@8
+auxWireTorus@16
+compareParams@12
+dodecahedron@16
+doughnut@28
+drawbox@52
+drawtriangle@32
+findList@12
+icosahedron@16
+initdodec@0
+makeModelPtr@12
+octahedron@16
+pentagon@24
+recorditem@32
+subdivide@36
+tetrahedron@16
+auxDIBImageLoadA@4
+auxDIBImageLoadW@4
+auxRGBImageLoadA@4
+auxRGBImageLoadW@4
+auxCreateFont@0
+auxDrawStrA@4
+auxDrawStrAW@8
+auxDrawStrW@4
+DefaultHandleExpose@8
+DefaultHandleReshape@8
+KeyDown@8
+MouseDown@12
+MouseLoc@12
+MouseUp@12
+auxCloseWindow@0
+auxExposeFunc@4
+auxGetColorMapSize@0
+auxGetDisplayMode@0
+auxGetDisplayModeID@0
+auxGetDisplayModePolicy@0
+auxGetHDC@0
+auxGetHGLRC@0
+auxGetHWND@0
+auxGetMouseLoc@8
+auxIdleFunc@4
+auxInitDisplayMode@4
+auxInitDisplayModeID@4
+auxInitDisplayModePolicy@4
+auxInitPosition@16
+auxInitWindowA@4
+auxInitWindowAW@8
+auxInitWindowW@4
+auxKeyFunc@8
+auxMainLoop@4
+auxMouseFunc@12
+auxQuit@0
+auxReshapeFunc@4
+auxSetFogRamp@8
+auxSetGreyRamp@0
+auxSetOneColor@16
+auxSetRGBMap@8
+auxSwapBuffers@0
diff --git a/winsup/w32api/lib/glu32.def b/winsup/w32api/lib/glu32.def
new file mode 100644
index 000000000..d0f091fd1
--- /dev/null
+++ b/winsup/w32api/lib/glu32.def
@@ -0,0 +1,54 @@
+LIBRARY GLU32.DLL
+EXPORTS
+gluBeginCurve@4
+gluBeginPolygon@4
+gluBeginSurface@4
+gluBeginTrim@4
+gluBuild1DMipmaps@24
+gluBuild2DMipmaps@28
+gluCylinder@36
+gluDeleteNurbsRenderer@4
+gluDeleteQuadric@4
+gluDeleteTess@4
+gluDisk@28
+gluEndCurve@4
+gluEndPolygon@4
+gluEndSurface@4
+gluEndTrim@4
+gluErrorString@4
+gluErrorUnicodeStringEXT@4
+gluGetNurbsProperty@12
+gluGetString@4
+gluGetTessProperty@12
+gluLoadSamplingMatrices@16
+gluLookAt@72
+gluNewNurbsRenderer@0
+gluNewQuadric@0
+gluNewTess@0
+gluNextContour@8
+gluNurbsCallback@12
+gluNurbsCurve@28
+gluNurbsProperty@12
+gluNurbsSurface@44
+gluOrtho2D@32
+gluPartialDisk@44
+gluPerspective@32
+gluPickMatrix@36
+gluProject@48
+gluPwlCurve@20
+gluQuadricCallback@12
+gluQuadricDrawStyle@8
+gluQuadricNormals@8
+gluQuadricOrientation@8
+gluQuadricTexture@8
+gluScaleImage@36
+gluSphere@20
+gluTessBeginContour@4
+gluTessBeginPolygon@8
+gluTessCallback@12
+gluTessEndContour@4
+gluTessEndPolygon@4
+gluTessNormal@28
+gluTessProperty@16
+gluTessVertex@12
+gluUnProject@48
diff --git a/winsup/w32api/lib/glut.def b/winsup/w32api/lib/glut.def
new file mode 100644
index 000000000..369ca5d14
--- /dev/null
+++ b/winsup/w32api/lib/glut.def
@@ -0,0 +1,116 @@
+LIBRARY glut.dll
+EXPORTS
+glutAddMenuEntry@8
+glutAddSubMenu@8
+glutAttachMenu@4
+glutBitmapCharacter@8
+glutBitmapLength@8
+glutBitmapWidth@8
+glutButtonBoxFunc@4
+glutChangeToMenuEntry@12
+glutChangeToSubMenu@12
+glutCopyColormap@4
+glutCreateMenu@4
+glutCreateSubWindow@20
+glutCreateWindow@4
+glutDestroyMenu@4
+glutDestroyWindow@4
+glutDetachMenu@4
+glutDeviceGet@4
+glutDialsFunc@4
+glutDisplayFunc@4
+glutEnterGameMode@0
+glutEntryFunc@4
+glutEstablishOverlay@0
+glutExtensionSupported@4
+glutForceJoystickFunc@0
+glutFullScreen@0
+glutGameModeGet@4
+glutGameModeString@4
+glutGet@4
+glutGetColor@8
+glutGetMenu@0
+glutGetModifiers@0
+glutGetWindow@0
+glutHideOverlay@0
+glutHideWindow@0
+glutIconifyWindow@0
+glutIdleFunc@4
+glutIgnoreKeyRepeat@4
+glutInit@8
+glutInitDisplayMode@4
+glutInitDisplayString@4
+glutInitWindowPosition@8
+glutInitWindowSize@8
+glutJoystickFunc@8
+glutKeyboardFunc@4
+glutKeyboardUpFunc@4
+glutLayerGet@4
+glutLeaveGameMode@0
+glutMainLoop@0
+glutMenuStateFunc@4
+glutMenuStatusFunc@4
+glutMotionFunc@4
+glutMouseFunc@4
+glutOverlayDisplayFunc@4
+glutPassiveMotionFunc@4
+glutPopWindow@0
+glutPositionWindow@8
+glutPostOverlayRedisplay@0
+glutPostRedisplay@0
+glutPostWindowOverlayRedisplay@4
+glutPostWindowRedisplay@4
+glutPushWindow@0
+glutRemoveMenuItem@4
+glutRemoveOverlay@0
+glutReportErrors@0
+glutReshapeFunc@4
+glutReshapeWindow@8
+glutSetColor@16
+glutSetCursor@4
+glutSetIconTitle@4
+glutSetKeyRepeat@4
+glutSetMenu@4
+glutSetWindow@4
+glutSetWindowTitle@4
+glutSetupVideoResizing@0
+glutShowOverlay@0
+glutShowWindow@0
+glutSolidCone@24
+glutSolidCube@8
+glutSolidDodecahedron@0
+glutSolidIcosahedron@0
+glutSolidOctahedron@0
+glutSolidSphere@16
+glutSolidTeapot@8
+glutSolidTetrahedron@0
+glutSolidTorus@24
+glutSpaceballButtonFunc@4
+glutSpaceballMotionFunc@4
+glutSpaceballRotateFunc@4
+glutSpecialFunc@4
+glutSpecialUpFunc@4
+glutStopVideoResizing@0
+glutStrokeCharacter@8
+glutStrokeLength@8
+glutStrokeWidth@8
+glutSwapBuffers@0
+glutTabletButtonFunc@4
+glutTabletMotionFunc@4
+glutTimerFunc@12
+glutUseLayer@4
+glutVideoPan@16
+glutVideoResize@16
+glutVideoResizeGet@4
+glutVisibilityFunc@4
+glutWarpPointer@8
+glutWindowStatusFunc@4
+glutWireCone@24
+glutWireCube@8
+glutWireDodecahedron@0
+glutWireIcosahedron@0
+glutWireOctahedron@0
+glutWireSphere@16
+glutWireTeapot@8
+glutWireTetrahedron@0
+glutWireTorus@24
diff --git a/winsup/w32api/lib/glut32.def b/winsup/w32api/lib/glut32.def
new file mode 100644
index 000000000..427e32bc3
--- /dev/null
+++ b/winsup/w32api/lib/glut32.def
@@ -0,0 +1,116 @@
+LIBRARY glut32.dll
+EXPORTS
+glutAddMenuEntry@8
+glutAddSubMenu@8
+glutAttachMenu@4
+glutBitmapCharacter@8
+glutBitmapLength@8
+glutBitmapWidth@8
+glutButtonBoxFunc@4
+glutChangeToMenuEntry@12
+glutChangeToSubMenu@12
+glutCopyColormap@4
+glutCreateMenu@4
+glutCreateSubWindow@20
+glutCreateWindow@4
+glutDestroyMenu@4
+glutDestroyWindow@4
+glutDetachMenu@4
+glutDeviceGet@4
+glutDialsFunc@4
+glutDisplayFunc@4
+glutEnterGameMode@0
+glutEntryFunc@4
+glutEstablishOverlay@0
+glutExtensionSupported@4
+glutForceJoystickFunc@0
+glutFullScreen@0
+glutGameModeGet@4
+glutGameModeString@4
+glutGet@4
+glutGetColor@8
+glutGetMenu@0
+glutGetModifiers@0
+glutGetWindow@0
+glutHideOverlay@0
+glutHideWindow@0
+glutIconifyWindow@0
+glutIdleFunc@4
+glutIgnoreKeyRepeat@4
+glutInit@8
+glutInitDisplayMode@4
+glutInitDisplayString@4
+glutInitWindowPosition@8
+glutInitWindowSize@8
+glutJoystickFunc@8
+glutKeyboardFunc@4
+glutKeyboardUpFunc@4
+glutLayerGet@4
+glutLeaveGameMode@0
+glutMainLoop@0
+glutMenuStateFunc@4
+glutMenuStatusFunc@4
+glutMotionFunc@4
+glutMouseFunc@4
+glutOverlayDisplayFunc@4
+glutPassiveMotionFunc@4
+glutPopWindow@0
+glutPositionWindow@8
+glutPostOverlayRedisplay@0
+glutPostRedisplay@0
+glutPostWindowOverlayRedisplay@4
+glutPostWindowRedisplay@4
+glutPushWindow@0
+glutRemoveMenuItem@4
+glutRemoveOverlay@0
+glutReportErrors@0
+glutReshapeFunc@4
+glutReshapeWindow@8
+glutSetColor@16
+glutSetCursor@4
+glutSetIconTitle@4
+glutSetKeyRepeat@4
+glutSetMenu@4
+glutSetWindow@4
+glutSetWindowTitle@4
+glutSetupVideoResizing@0
+glutShowOverlay@0
+glutShowWindow@0
+glutSolidCone@24
+glutSolidCube@8
+glutSolidDodecahedron@0
+glutSolidIcosahedron@0
+glutSolidOctahedron@0
+glutSolidSphere@16
+glutSolidTeapot@8
+glutSolidTetrahedron@0
+glutSolidTorus@24
+glutSpaceballButtonFunc@4
+glutSpaceballMotionFunc@4
+glutSpaceballRotateFunc@4
+glutSpecialFunc@4
+glutSpecialUpFunc@4
+glutStopVideoResizing@0
+glutStrokeCharacter@8
+glutStrokeLength@8
+glutStrokeWidth@8
+glutSwapBuffers@0
+glutTabletButtonFunc@4
+glutTabletMotionFunc@4
+glutTimerFunc@12
+glutUseLayer@4
+glutVideoPan@16
+glutVideoResize@16
+glutVideoResizeGet@4
+glutVisibilityFunc@4
+glutWarpPointer@8
+glutWindowStatusFunc@4
+glutWireCone@24
+glutWireCube@8
+glutWireDodecahedron@0
+glutWireIcosahedron@0
+glutWireOctahedron@0
+glutWireSphere@16
+glutWireTeapot@8
+glutWireTetrahedron@0
+glutWireTorus@24
diff --git a/winsup/w32api/lib/imagehlp.def b/winsup/w32api/lib/imagehlp.def
new file mode 100644
index 000000000..411a360bd
--- /dev/null
+++ b/winsup/w32api/lib/imagehlp.def
@@ -0,0 +1,114 @@
+LIBRARY IMAGEHLP.DLL
+EXPORTS
+BindImage@12
+BindImageEx@20
+CheckSumMappedFile@16
+CopyPdb@12
+EnumerateLoadedModules32@12
+EnumerateLoadedModules64@12
+EnumerateLoadedModules@12
+FindDebugInfoFile@12
+FindDebugInfoFileEx@20
+FindExecutableImage@12
+GetImageConfigInformation@8
+GetImageUnusedHeaderBytes@8
+GetTimestampForLoadedLibrary@4
+ImageAddCertificate@12
+ImageDirectoryEntryToData@16
+ImageDirectoryEntryToDataEx@20
+ImageEnumerateCertificates@20
+ImageGetCertificateData@16
+ImageGetCertificateHeader@12
+ImageGetDigestStream@16
+ImageLoad@8
+ImageNtHeader@4
+ImageRemoveCertificate@8
+ImageRvaToSection@12
+ImageRvaToVa@16
+ImageUnload@4
+ImagehlpApiVersion@0
+ImagehlpApiVersionEx@4
+MakeSureDirectoryPathExists@4
+MapAndLoad@20
+MapDebugInformation32@16
+MapDebugInformation64@20
+MapDebugInformation@16
+MapFileAndCheckSumA@12
+MapFileAndCheckSumW@12
+MarkImageAsRunFromSwap@8
+ReBaseImage@44
+RemovePrivateCvSymbolic@12
+RemovePrivateCvSymbolicEx@16
+RemoveRelocations@4
+SearchTreeForFile@12
+SetImageConfigInformation@8
+SplitSymbols@16
+StackWalk32@36
+StackWalk64@36
+StackWalk@36
+SymCleanup@4
+SymEnumerateModules32@12
+SymEnumerateModules64@12
+SymEnumerateModules@12
+SymEnumerateSymbols32@16
+SymEnumerateSymbols64@20
+SymEnumerateSymbols@16
+SymFunctionTableAccess32@8
+SymFunctionTableAccess64@12
+SymFunctionTableAccess@8
+SymGetLineFromAddr32@16
+SymGetLineFromAddr64@20
+SymGetLineFromAddr@16
+SymGetLineFromName32@24
+SymGetLineFromName64@24
+SymGetLineFromName@24
+SymGetLineNext32@8
+SymGetLineNext64@8
+SymGetLineNext@8
+SymGetLinePrev32@8
+SymGetLinePrev64@8
+SymGetLinePrev@8
+SymGetModuleBase32@8
+SymGetModuleBase64@12
+SymGetModuleBase@8
+SymGetModuleInfo32@12
+SymGetModuleInfo64@16
+SymGetModuleInfo@12
+SymGetOptions@0
+SymGetSearchPath@12
+SymGetSymFromAddr32@16
+SymGetSymFromAddr64@20
+SymGetSymFromAddr@16
+SymGetSymFromName32@12
+SymGetSymFromName64@12
+SymGetSymFromName@12
+SymGetSymNext32@8
+SymGetSymNext64@8
+SymGetSymNext@8
+SymGetSymPrev32@8
+SymGetSymPrev64@8
+SymGetSymPrev@8
+SymInitialize@12
+SymLoadModule32@24
+SymLoadModule64@28
+SymLoadModule@24
+SymMatchFileName@16
+SymRegisterCallback32@12
+SymRegisterCallback64@16
+SymRegisterCallback@12
+SymSetOptions@4
+SymSetSearchPath@8
+SymUnDName32@12
+SymUnDName64@12
+SymUnDName@12
+SymUnloadModule32@8
+SymUnloadModule64@12
+SymUnloadModule@8
+TouchFileTimes@8
+UnDecorateSymbolName@16
+UnMapAndLoad@4
+UnmapDebugInformation32@4
+UnmapDebugInformation64@4
+UnmapDebugInformation@4
+UpdateDebugInfoFile@16
+UpdateDebugInfoFileEx@20
diff --git a/winsup/w32api/lib/imm32.def b/winsup/w32api/lib/imm32.def
new file mode 100644
index 000000000..1d8ee8fcc
--- /dev/null
+++ b/winsup/w32api/lib/imm32.def
@@ -0,0 +1,77 @@
+LIBRARY IMM32.DLL
+EXPORTS
+ImmAssociateContext@8
+ImmConfigureIMEA@16
+ImmConfigureIMEW@16
+ImmCreateContext@0
+ImmCreateIMCC@4
+ImmCreateSoftKeyboard@16
+ImmDestroyContext@4
+ImmDestroyIMCC@4
+ImmDestroySoftKeyboard@4
+ImmEnumRegisterWordA@24
+ImmEnumRegisterWordW@24
+ImmEscapeA@16
+ImmEscapeW@16
+ImmGenerateMessage@4
+ImmGetCandidateListA@16
+ImmGetCandidateListCountA@8
+ImmGetCandidateListCountW@8
+ImmGetCandidateListW@16
+ImmGetCandidateWindow@12
+ImmGetCompositionFontA@8
+ImmGetCompositionFontW@8
+ImmGetCompositionStringA@16
+ImmGetCompositionStringW@16
+ImmGetCompositionWindow@8
+ImmGetContext@4
+ImmGetConversionListA@24
+ImmGetConversionListW@24
+ImmGetConversionStatus@12
+ImmGetDefaultIMEWnd@4
+ImmGetDescriptionA@12
+ImmGetDescriptionW@12
+ImmGetGuideLineA@16
+ImmGetGuideLineW@16
+ImmGetHotKey@16
+ImmGetIMCCLockCount@4
+ImmGetIMCCSize@4
+ImmGetIMCLockCount@4
+ImmGetIMEFileNameA@12
+ImmGetIMEFileNameW@12
+ImmGetImeMenuItemsA@24
+ImmGetImeMenuItemsW@24
+ImmGetOpenStatus@4
+ImmGetProperty@8
+ImmGetRegisterWordStyleA@12
+ImmGetRegisterWordStyleW@12
+ImmGetStatusWindowPos@8
+ImmGetVirtualKey@4
+ImmInstallIMEA@8
+ImmInstallIMEW@8
+ImmIsIME@4
+ImmIsUIMessageA@16
+ImmIsUIMessageW@16
+ImmLockIMC@4
+ImmLockIMCC@4
+ImmNotifyIME@16
+ImmReSizeIMCC@8
+ImmRegisterWordA@16
+ImmRegisterWordW@16
+ImmReleaseContext@8
+ImmSetCandidateWindow@8
+ImmSetCompositionFontA@8
+ImmSetCompositionFontW@8
+ImmSetCompositionStringA@24
+ImmSetCompositionStringW@24
+ImmSetCompositionWindow@8
+ImmSetConversionStatus@12
+ImmSetHotKey@16
+ImmSetOpenStatus@8
+ImmSetStatusWindowPos@8
+ImmShowSoftKeyboard@8
+ImmSimulateHotKey@8
+ImmUnlockIMC@4
+ImmUnlockIMCC@4
+ImmUnregisterWordA@16
+ImmUnregisterWordW@16
diff --git a/winsup/w32api/lib/kernel32.def b/winsup/w32api/lib/kernel32.def
new file mode 100644
index 000000000..9b2ab892e
--- /dev/null
+++ b/winsup/w32api/lib/kernel32.def
@@ -0,0 +1,758 @@
+LIBRARY KERNEL32.dll
+EXPORTS
+AddAtomA@4
+AddAtomW@4
+AddConsoleAliasA@12
+AddConsoleAliasW@12
+AllocConsole@0
+AreFileApisANSI@0
+AssignProcessToJobObject@8
+BackupRead@28
+BackupSeek@24
+BackupWrite@28
+BaseAttachCompleteThunk@0
+Beep@8
+BeginUpdateResourceA@8
+BeginUpdateResourceW@8
+BuildCommDCBA@8
+BuildCommDCBAndTimeoutsA@12
+BuildCommDCBAndTimeoutsW@12
+BuildCommDCBW@8
+CallNamedPipeA@28
+CallNamedPipeW@28
+CancelIo@4
+CancelTimerQueueTimer@8
+CancelWaitableTimer@4
+ChangeTimerQueueTimer@16
+ClearCommBreak@4
+ClearCommError@12
+CloseConsoleHandle@4
+CloseHandle@4
+CloseProfileUserMapping@0
+CmdBatNotification@4
+CommConfigDialogA@12
+CommConfigDialogW@12
+CompareFileTime@8
+CompareStringA@24
+CompareStringW@24
+ConnectNamedPipe@8
+ConsoleMenuControl@12
+ContinueDebugEvent@12
+ConvertDefaultLocale@4
+ConvertThreadToFiber@4
+CopyFileA@12
+CopyFileW@12
+CopyFileExA@24
+CopyFileExW@24
+CreateConsoleScreenBuffer@20
+CreateDirectoryA@8
+CreateDirectoryExA@12
+CreateDirectoryExW@12
+CreateDirectoryW@8
+CreateEventA@16
+CreateEventW@16
+CreateFiber@12
+CreateFileA@28
+CreateFileMappingA@24
+CreateFileMappingW@24
+CreateFileW@28
+CreateHardLinkA@12
+CreateHardLinkW@12
+CreateIoCompletionPort@16
+CreateJobObjectA@8
+CreateJobObjectW@8
+CreateMailslotA@16
+CreateMailslotW@16
+CreateMutexA@12
+CreateMutexW@12
+CreateNamedPipeA@32
+CreateNamedPipeW@32
+CreatePipe@16
+CreateProcessA@40
+CreateProcessW@40
+CreateRemoteThread@28
+CreateSemaphoreA@16
+CreateSemaphoreW@16
+CreateTapePartition@16
+CreateThread@24
+CreateTimerQueue@0
+CreateToolhelp32Snapshot@8
+CreateVirtualBuffer@12
+CreateWaitableTimerA@12
+CreateWaitableTimerW@12
+DebugActiveProcess@4
+DebugBreak@0
+DefineDosDeviceA@12
+DefineDosDeviceW@12
+DeleteAtom@4
+DeleteCriticalSection@4
+DeleteFiber@4
+DeleteFileA@4
+DeleteFileW@4
+DeleteTimerQueue@4
+DeleteVolumeMountPointA@4
+DeleteVolumeMountPointW@4
+DeviceIoControl@32
+DisableThreadLibraryCalls@4
+DisconnectNamedPipe@4
+DosDateTimeToFileTime@12
+DuplicateConsoleHandle@16
+DuplicateHandle@28
+EndUpdateResourceA@8
+EndUpdateResourceW@8
+EnterCriticalSection@4
+EnumCalendarInfoA@16
+EnumCalendarInfoW@16
+EnumCalendarInfoExA@16
+EnumCalendarInfoExW@16
+EnumDateFormatsA@12
+EnumDateFormatsW@12
+EnumDateFormatsExA@12
+EnumDateFormatsExW@12
+EnumResourceLanguagesA@20
+EnumResourceLanguagesW@20
+EnumResourceNamesA@16
+EnumResourceNamesW@16
+EnumResourceTypesA@12
+EnumResourceTypesW@12
+EnumSystemCodePagesA@8
+EnumSystemCodePagesW@8
+EnumSystemLocalesA@8
+EnumSystemLocalesW@8
+EnumTimeFormatsA@12
+EnumTimeFormatsW@12
+EraseTape@12
+EscapeCommFunction@8
+ExitProcess@4
+ExitThread@4
+ExitVDM@8
+ExpandEnvironmentStringsA@12
+ExpandEnvironmentStringsW@12
+ExpungeConsoleCommandHistoryA@4
+ExpungeConsoleCommandHistoryW@4
+ExtendVirtualBuffer@8
+FatalAppExitA@8
+FatalAppExitW@8
+FatalExit@4
+FileTimeToDosDateTime@12
+FileTimeToLocalFileTime@8
+FileTimeToSystemTime@8
+FillConsoleOutputAttribute@20
+FillConsoleOutputCharacterA@20
+FillConsoleOutputCharacterW@20
+FindAtomA@4
+FindAtomW@4
+FindClose@4
+FindCloseChangeNotification@4
+FindFirstChangeNotificationA@12
+FindFirstChangeNotificationW@12
+FindFirstFileA@8
+FindFirstFileW@8
+FindFirstFileExA@24
+FindFirstFileExW@24
+FindFirstVolumeA@8
+FindFirstVolumeW@8
+FindFirstVolumeMountPointA@12
+FindFirstVolumeMountPointW@12
+FindNextChangeNotification@4
+FindNextFileA@8
+FindNextFileW@8
+FindNextVolumeA@12
+FindNextVolumeW@12
+FindNextVolumeMountPointA@12
+FindNextVolumeMountPointW@12
+FindResourceA@12
+FindResourceExA@16
+FindResourceExW@16
+FindResourceW@12
+FindVolumeClose@4
+FindVolumeMountPointClose@4
+FlushConsoleInputBuffer@4
+FlushFileBuffers@4
+FlushInstructionCache@12
+FlushViewOfFile@8
+FoldStringA@20
+FoldStringW@20
+FormatMessageA@28
+FormatMessageW@28
+FreeConsole@0
+FreeEnvironmentStringsA@4
+FreeEnvironmentStringsW@4
+FreeLibrary@4
+FreeLibraryAndExitThread@8
+FreeResource@4
+FreeVirtualBuffer@4
+GenerateConsoleCtrlEvent@8
+GetACP@0
+GetAtomNameA@12
+GetAtomNameW@12
+GetBinaryType@8
+GetBinaryTypeA@8
+GetBinaryTypeW@8
+GetCPInfo@8
+GetCPInfoExA@12
+GetCPInfoExW@12
+GetCalendarInfoA@24
+GetCalendarInfoW@24
+GetCommConfig@12
+GetCommMask@8
+GetCommModemStatus@8
+GetCommProperties@8
+GetCommState@8
+GetCommTimeouts@8
+GetCommandLineA@0
+GetCommandLineW@0
+GetCompressedFileSizeA@8
+GetCompressedFileSizeW@8
+GetComputerNameA@8
+GetComputerNameW@8
+GetConsoleAliasA@16
+GetConsoleAliasExesA@8
+GetConsoleAliasExesLengthA@0
+GetConsoleAliasExesLengthW@0
+GetConsoleAliasExesW@8
+GetConsoleAliasW@16
+GetConsoleAliasesA@12
+GetConsoleAliasesLengthA@4
+GetConsoleAliasesLengthW@4
+GetConsoleAliasesW@12
+GetConsoleCP@0
+GetConsoleCommandHistoryA@12
+GetConsoleCommandHistoryLengthA@4
+GetConsoleCommandHistoryLengthW@4
+GetConsoleCommandHistoryW@12
+GetConsoleCursorInfo@8
+GetConsoleDisplayMode@4
+GetConsoleFontInfo@16
+GetConsoleFontSize@8
+GetConsoleHardwareState@12
+GetConsoleInputExeNameA@8
+GetConsoleInputExeNameW@8
+GetConsoleInputWaitHandle@0
+GetConsoleKeyboardLayoutNameA@4
+GetConsoleKeyboardLayoutNameW@4
+GetConsoleMode@8
+GetConsoleOutputCP@0
+GetConsoleScreenBufferInfo@8
+GetConsoleTitleA@8
+GetConsoleTitleW@8
+GetConsoleWindow@0
+GetCurrencyFormatA@24
+GetCurrencyFormatW@24
+GetCurrentConsoleFont@12
+GetCurrentDirectoryA@8
+GetCurrentDirectoryW@8
+GetCurrentProcess@0
+GetCurrentProcessId@0
+GetCurrentThread@0
+GetCurrentThreadId@0
+GetDateFormatA@24
+GetDateFormatW@24
+GetDefaultCommConfigA@12
+GetDefaultCommConfigW@12
+GetDevicePowerState@4
+GetDiskFreeSpaceA@20
+GetDiskFreeSpaceW@20
+GetDiskFreeSpaceExA@16
+GetDiskFreeSpaceExW@16
+GetDriveTypeA@4
+GetDriveTypeW@4
+GetErrorMode@0
+GetEnvironmentStrings@0
+GetEnvironmentStringsA@0
+GetEnvironmentStringsW@0
+GetEnvironmentVariableA@12
+GetEnvironmentVariableW@12
+GetExitCodeProcess@8
+GetExitCodeThread@8
+GetFileAttributesA@4
+GetFileAttributesW@4
+GetFileAttributesExA@12
+GetFileAttributesExW@12
+GetFileInformationByHandle@8
+GetFileSize@8
+GetFileSizeEx@8
+GetFileTime@16
+GetFileType@4
+GetFullPathNameA@16
+GetFullPathNameW@16
+GetHandleInformation@8
+GetLargestConsoleWindowSize@4
+GetLastError@0
+GetLocalTime@4
+GetLocaleInfoA@16
+GetLocaleInfoW@16
+GetLogicalDriveStringsA@8
+GetLogicalDriveStringsW@8
+GetLogicalDrives@0
+GetLongPathNameA@12
+GetLongPathNameW@12
+GetMailslotInfo@20
+GetModuleFileNameA@12
+GetModuleFileNameW@12
+GetModuleHandleA@4
+GetModuleHandleW@4
+GetNamedPipeHandleStateA@28
+GetNamedPipeHandleStateW@28
+GetNamedPipeInfo@20
+GetNextVDMCommand@4
+GetNumberFormatA@24
+GetNumberFormatW@24
+GetNumberOfConsoleFonts@0
+GetNumberOfConsoleInputEvents@8
+GetNumberOfConsoleMouseButtons@4
+GetOEMCP@0
+GetOverlappedResult@16
+GetPriorityClass@4
+GetPrivateProfileIntA@16
+GetPrivateProfileIntW@16
+GetPrivateProfileSectionA@16
+GetPrivateProfileSectionNamesA@12
+GetPrivateProfileSectionNamesW@12
+GetPrivateProfileSectionW@16
+GetPrivateProfileStringA@24
+GetPrivateProfileStringW@24
+GetPrivateProfileStructA@20
+GetPrivateProfileStructW@20
+GetProcAddress@8
+GetProcessAffinityMask@12
+GetProcessHeap@0
+GetProcessHeaps@8
+GetProcessPriorityBoost@8
+GetProcessShutdownParameters@8
+GetProcessTimes@20
+GetProcessVersion@4
+GetProcessWorkingSetSize@12
+GetProductName@8
+GetProfileIntA@12
+GetProfileIntW@12
+GetProfileSectionA@12
+GetProfileSectionW@12
+GetProfileStringA@20
+GetProfileStringW@20
+GetQueuedCompletionStatus@20
+GetShortPathNameA@12
+GetShortPathNameW@12
+GetStartupInfoA@4
+GetStartupInfoW@4
+GetStdHandle@4
+GetStringTypeA@20
+GetStringTypeExA@20
+GetStringTypeExW@20
+GetStringTypeW@16
+GetSystemDefaultLCID@0
+GetSystemDefaultLangID@0
+GetSystemDirectoryA@8
+GetSystemDirectoryW@8
+GetSystemInfo@4
+GetSystemPowerStatus@4
+GetSystemTime@4
+GetSystemTimeAdjustment@12
+GetSystemTimeAsFileTime@4
+GetTapeParameters@16
+GetTapePosition@20
+GetTapeStatus@4
+GetTempFileNameA@16
+GetTempFileNameW@16
+GetTempPathA@8
+GetTempPathW@8
+GetThreadContext@8
+GetThreadLocale@0
+GetThreadPriority@4
+GetThreadPriorityBoost@8
+GetThreadSelectorEntry@12
+GetThreadTimes@20
+GetTickCount@0
+GetTimeFormatA@24
+GetTimeFormatW@24
+GetTimeZoneInformation@4
+GetUserDefaultLCID@0
+GetUserDefaultLangID@0
+GetVDMCurrentDirectories@8
+GetVersion@0
+GetVersionExA@4
+GetVersionExW@4
+GetVolumeInformationA@32
+GetVolumeInformationW@32
+GetVolumeNameForVolumeMountPointA@12
+GetVolumeNameForVolumeMountPointW@12
+GetVolumePathNameA@12
+GetVolumePathNameW@12
+GetWindowsDirectoryA@8
+GetWindowsDirectoryW@8
+GlobalAddAtomA@4
+GlobalAddAtomW@4
+GlobalAlloc@8
+GlobalCompact@4
+GlobalDeleteAtom@4
+GlobalFindAtomA@4
+GlobalFindAtomW@4
+GlobalFix@4
+GlobalFlags@4
+GlobalFree@4
+GlobalGetAtomNameA@12
+GlobalGetAtomNameW@12
+GlobalHandle@4
+GlobalLock@4
+GlobalMemoryStatus@4
+GlobalMemoryStatusVlm@4
+GlobalReAlloc@12
+GlobalSize@4
+GlobalUnWire@4
+GlobalUnfix@4
+GlobalUnlock@4
+GlobalWire@4
+Heap32First@12
+Heap32ListFirst@8
+Heap32ListNext@8
+Heap32Next@4
+HeapAlloc@12
+HeapCompact@8
+HeapCreate@12
+HeapCreateTagsW@16
+HeapDestroy@4
+HeapExtend@16
+HeapFree@12
+HeapLock@4
+HeapQueryTagW@20
+HeapReAlloc@16
+HeapSize@12
+HeapSummary@12
+HeapUnlock@4
+HeapUsage@20
+HeapValidate@12
+HeapWalk@8
+InitAtomTable@4
+InitializeCriticalSection@4
+InitializeCriticalSectionAndSpinCount@8
+InterlockedCompareExchange@12
+InterlockedDecrement@4
+InterlockedExchange@8
+InterlockedExchangeAdd@8
+InterlockedIncrement@4
+InvalidateConsoleDIBits@8
+IsBadCodePtr@4
+IsBadHugeReadPtr@8
+IsBadHugeWritePtr@8
+IsBadReadPtr@8
+IsBadStringPtrA@8
+IsBadStringPtrW@8
+IsBadWritePtr@8
+IsDBCSLeadByte@4
+IsDBCSLeadByteEx@8
+IsDebuggerPresent@0
+IsProcessorFeaturePresent@4
+IsValidCodePage@4
+IsValidLocale@8
+LCMapStringA@24
+LCMapStringW@24
+LeaveCriticalSection@4
+LoadLibraryA@4
+LoadLibraryExA@12
+LoadLibraryExW@12
+LoadLibraryW@4
+LoadModule@8
+LoadResource@8
+LocalAlloc@8
+LocalCompact@4
+LocalFileTimeToFileTime@8
+LocalFlags@4
+LocalFree@4
+LocalHandle@4
+LocalLock@4
+LocalReAlloc@12
+LocalShrink@8
+LocalSize@4
+LocalUnlock@4
+LockFile@20
+LockFileEx@24
+LockResource@4
+MapViewOfFile@20
+MapViewOfFileEx@24
+MapViewOfFileVlm@28
+MoveFileA@8
+MoveFileW@8
+MoveFileExA@12
+MoveFileExW@12
+MoveFileWithProgressA@20
+MoveFileWithProgressW@20
+MulDiv@12
+MultiByteToWideChar@24
+OpenConsoleW@16
+OpenEventA@12
+OpenEventW@12
+OpenFile@12
+OpenFileMappingA@12
+OpenFileMappingW@12
+OpenJobObjectA@12
+OpenJobObjectW@12
+OpenMutexA@12
+OpenMutexW@12
+OpenProcess@12
+OpenProfileUserMapping@0
+OpenSemaphoreA@12
+OpenSemaphoreW@12
+OpenWaitableTimerA@12
+OpenWaitableTimerW@12
+OutputDebugStringA@4
+OutputDebugStringW@4
+PeekConsoleInputA@16
+PeekConsoleInputW@16
+PeekNamedPipe@24
+PostQueuedCompletionStatus@16
+PrepareTape@12
+PulseEvent@4
+PurgeComm@8
+QueryDosDeviceA@12
+QueryDosDeviceW@12
+QueryInformationJobObject@20
+QueryPerformanceCounter@4
+QueryPerformanceFrequency@4
+QueryWin31IniFilesMappedToRegistry@16
+QueueUserAPC@12
+QueueUserWorkItem@12
+RaiseException@16
+ReadConsoleA@20
+ReadConsoleInputA@16
+ReadConsoleInputW@16
+ReadConsoleInputExA@20
+ReadConsoleInputExW@20
+ReadConsoleOutputA@20
+ReadConsoleOutputAttribute@20
+ReadConsoleOutputCharacterA@20
+ReadConsoleOutputCharacterW@20
+ReadConsoleOutputW@20
+ReadConsoleW@20
+ReadDirectoryChangesW@32
+ReadFile@20
+ReadFileEx@20
+ReadFileScatter@20
+ReadFileVlm@20
+ReadProcessMemory@20
+ReadProcessMemoryVlm@20
+RegisterConsoleVDM@44
+RegisterWaitForInputIdle@4
+RegisterWaitForSingleObject@16
+RegisterWowBaseHandlers@4
+RegisterWowExec@4
+ReleaseMutex@4
+ReleaseSemaphore@12
+RemoveDirectoryA@4
+RemoveDirectoryW@4
+ReplaceFile@24
+RequestWakeupLatency@4
+ResetEvent@4
+ResumeThread@4
+RtlFillMemory@12
+RtlMoveMemory@12
+RtlUnwind@16
+RtlZeroMemory@8
+ScrollConsoleScreenBufferA@20
+ScrollConsoleScreenBufferW@20
+SearchPathA@24
+SearchPathW@24
+SetCalendarInfoA@16
+SetCalendarInfoW@16
+SetCommBreak@4
+SetCommConfig@12
+SetCommMask@8
+SetCommState@8
+SetCommTimeouts@8
+SetComputerNameA@4
+SetComputerNameW@4
+SetConsoleActiveScreenBuffer@4
+SetConsoleCP@4
+SetConsoleCommandHistoryMode@4
+SetConsoleCtrlHandler@8
+SetConsoleCursor@8
+SetConsoleCursorInfo@8
+SetConsoleCursorPosition@8
+SetConsoleDisplayMode@12
+SetConsoleFont@8
+SetConsoleHardwareState@12
+SetConsoleIcon@4
+SetConsoleInputExeNameA@4
+SetConsoleInputExeNameW@4
+SetConsoleKeyShortcuts@16
+SetConsoleMaximumWindowSize@8
+SetConsoleMenuClose@4
+SetConsoleMode@8
+SetConsoleNumberOfCommandsA@8
+SetConsoleNumberOfCommandsW@8
+SetConsoleOutputCP@4
+SetConsolePalette@12
+SetConsoleScreenBufferSize@8
+SetConsoleTextAttribute@8
+SetConsoleTitleA@4
+SetConsoleTitleW@4
+SetConsoleWindowInfo@12
+SetCriticalSectionSpinCount@8
+SetCurrentDirectoryA@4
+SetCurrentDirectoryW@4
+SetDefaultCommConfigA@12
+SetDefaultCommConfigW@12
+SetEndOfFile@4
+SetEnvironmentVariableA@8
+SetEnvironmentVariableW@8
+SetErrorMode@4
+SetEvent@4
+SetFileApisToANSI@0
+SetFileApisToOEM@0
+SetFileAttributesA@8
+SetFileAttributesW@8
+SetFilePointer@16
+SetFilePointerEx@20
+SetFileTime@16
+SetHandleCount@4
+SetHandleInformation@12
+SetInformationJobObject@16
+SetLastConsoleEventActive@0
+SetLastError@4
+SetLocalTime@4
+SetLocaleInfoA@12
+SetLocaleInfoW@12
+SetMailslotInfo@8
+SetNamedPipeHandleState@16
+SetPriorityClass@8
+SetProcessAffinityMask@8
+SetProcessPriorityBoost@8
+SetProcessShutdownParameters@8
+SetProcessWorkingSetSize@12
+SetStdHandle@8
+SetSystemPowerState@8
+SetSystemTime@4
+SetSystemTimeAdjustment@8
+SetTapeParameters@12
+SetTapePosition@24
+SetThreadAffinityMask@8
+SetThreadContext@8
+SetThreadExecutionState@4
+SetThreadIdealProcessor@8
+SetThreadLocale@4
+SetThreadPriority@8
+SetThreadPriorityBoost@8
+SetTimeZoneInformation@4
+SetTimerQueueTimer@24
+SetUnhandledExceptionFilter@4
+SetVDMCurrentDirectories@8
+SetVolumeLabelA@8
+SetVolumeLabelW@8
+SetVolumeMountPointA@8
+SetVolumeMountPointW@8
+SetWaitableTimer@24
+SetupComm@12
+ShowConsoleCursor@8
+SignalObjectAndWait@16
+SizeofResource@8
+Sleep@4
+SleepEx@8
+SuspendThread@4
+SwitchToFiber@4
+SwitchToThread@0
+SystemTimeToFileTime@8
+SystemTimeToTzSpecificLocalTime@12
+TerminateJobObject@8
+TerminateProcess@8
+TerminateThread@8
+TlsAlloc@0
+TlsFree@4
+TlsGetValue@4
+TlsSetValue@8
+TransactNamedPipe@28
+TransmitCommChar@8
+TrimVirtualBuffer@4
+TryEnterCriticalSection@4
+UTRegister@28
+UTUnRegister@4
+UnhandledExceptionFilter@4
+UnlockFile@20
+UnlockFileEx@20
+UnmapViewOfFile@4
+UnmapViewOfFileVlm@4
+UnregisterWait@4
+UpdateResourceA@24
+UpdateResourceW@24
+VDMConsoleOperation@8
+VDMOperationStarted@4
+VerLanguageNameA@12
+VerLanguageNameW@12
+VerifyConsoleIoHandle@4
+VirtualAlloc@16
+VirtualAllocEx@20
+VirtualAllocVlm@24
+VirtualBufferExceptionHandler@12
+VirtualFree@12
+VirtualFreeEx@16
+VirtualFreeVlm@20
+VirtualLock@8
+VirtualProtect@16
+VirtualProtectEx@20
+VirtualProtectVlm@24
+VirtualQuery@12
+VirtualQueryEx@16
+VirtualQueryVlm@16
+VirtualUnlock@8
+WaitCommEvent@12
+WaitForDebugEvent@8
+WaitForMultipleObjects@16
+WaitForMultipleObjectsEx@20
+WaitForSingleObject@8
+WaitForSingleObjectEx@12
+WaitNamedPipeA@8
+WaitNamedPipeW@8
+WideCharToMultiByte@32
+WinExec@8
+WriteConsoleA@20
+WriteConsoleInputA@16
+WriteConsoleInputVDMA@16
+WriteConsoleInputVDMW@16
+WriteConsoleInputW@16
+WriteConsoleOutputA@20
+WriteConsoleOutputAttribute@20
+WriteConsoleOutputCharacterA@20
+WriteConsoleOutputCharacterW@20
+WriteConsoleOutputW@20
+WriteConsoleW@20
+WriteFile@20
+WriteFileEx@20
+WriteFileGather@20
+WriteFileVlm@20
+WritePrivateProfileSectionA@12
+WritePrivateProfileSectionW@12
+WritePrivateProfileStringA@16
+WritePrivateProfileStringW@16
+WritePrivateProfileStructA@20
+WritePrivateProfileStructW@20
+WriteProcessMemory@20
+WriteProcessMemoryVlm@20
+WriteProfileSectionA@8
+WriteProfileSectionW@8
+WriteProfileStringA@12
+WriteProfileStringW@12
+WriteTapemark@16
+_hread@12
+_hwrite@12
+_lclose@4
+_lcreat@8
+_llseek@12
+_lopen@8
+_lread@12
+_lwrite@12
+lstrcat@8
+lstrcatA@8
+lstrcatW@8
+lstrcmp@8
+lstrcmpA@8
+lstrcmpW@8
+lstrcmpi@8
+lstrcmpiA@8
+lstrcmpiW@8
+lstrcpy@8
+lstrcpyA@8
+lstrcpyW@8
+lstrcpyn@12
+lstrcpynA@12
+lstrcpynW@12
+lstrlen@4
+lstrlenA@4
+lstrlenW@4
diff --git a/winsup/w32api/lib/largeint.c b/winsup/w32api/lib/largeint.c
new file mode 100644
index 000000000..1761dd48f
--- /dev/null
+++ b/winsup/w32api/lib/largeint.c
@@ -0,0 +1,118 @@
+/*
+ largeint.c
+
+ Large (64 bits) integer arithmetics library
+
+ Written by Anders Norlander <anorland@hem2.passagen.se>
+
+ This file is part of a free library for the Win32 API.
+
+ 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.
+
+*/
+
+#define __COMPILING_LARGEINT
+
+#include <largeint.h>
+
+__int64 WINAPI
+LargeIntegerAdd (__int64 i1, __int64 i2)
+{
+ return i1 * i2;
+}
+
+__int64 WINAPI
+LargeIntegerSubtract (__int64 i1, __int64 i2)
+{
+ return i1 - i2;
+}
+
+__int64 WINAPI
+LargeIntegerArithmeticShift (__int64 i, int n)
+{
+ return i >> n;
+}
+
+__int64 WINAPI
+LargeIntegerShiftLeft (__int64 i, int n)
+{
+ return i << n;
+}
+
+__int64 WINAPI
+LargeIntegerShiftRight (__int64 i, int n)
+{
+ return i >> n;
+}
+
+__int64 WINAPI
+LargeIntegerNegate (__int64 i)
+{
+ return -i;
+}
+
+__int64 WINAPI
+ConvertLongToLargeInteger (LONG l)
+{
+ return (__int64) l;
+}
+
+__int64 WINAPI
+ConvertUlongToLargeInteger (ULONG ul)
+{
+ return _toi(_toui(ul));
+}
+
+__int64 WINAPI
+EnlargedIntegerMultiply (LONG l1, LONG l2)
+{
+ return _toi(l1) * _toi(l2);
+}
+
+__int64 WINAPI
+EnlargedUnsignedMultiply (ULONG ul1, ULONG ul2)
+{
+ return _toi(_toui(ul1) * _toui(ul2));
+}
+
+__int64 WINAPI
+ExtendedIntegerMultiply (__int64 i, LONG l)
+{
+ return i * _toi(l);
+}
+
+__int64 WINAPI
+LargeIntegerMultiply (__int64 i1, __int64 i2)
+{
+ return i1 * i2;
+}
+
+__int64 WINAPI LargeIntegerDivide (__int64 i1, __int64 i2, __int64 *remainder)
+{
+ if (remainder)
+ *remainder = i1 % i2;
+ return i1 / i2;
+}
+
+ULONG WINAPI
+EnlargedUnsignedDivide (unsigned __int64 i1, ULONG i2, PULONG remainder)
+{
+ if (remainder)
+ *remainder = i1 % _toi(i2);
+ return i1 / _toi(i2);
+}
+__int64 WINAPI
+ExtendedLargeIntegerDivide (__int64 i1, ULONG i2, PULONG remainder)
+{
+ if (remainder)
+ *remainder = i1 % _toi(i2);
+ return i1 / _toi(i2);
+}
+
+/* FIXME: what is this function supposed to do? */
+__int64 WINAPI ExtendedMagicDivide (__int64 i1, __int64 i2, int n)
+{
+ return 0;
+}
diff --git a/winsup/w32api/lib/lz32.def b/winsup/w32api/lib/lz32.def
new file mode 100644
index 000000000..7ea621312
--- /dev/null
+++ b/winsup/w32api/lib/lz32.def
@@ -0,0 +1,14 @@
+LIBRARY LZ32.DLL
+EXPORTS
+CopyLZFile@8
+GetExpandedNameA@8
+GetExpandedNameW@8
+LZClose@4
+LZCopy@8
+LZDone@0
+LZInit@4
+LZOpenFileA@12
+LZOpenFileW@12
+LZRead@12
+LZSeek@12
+LZStart@0
diff --git a/winsup/w32api/lib/mapi32.def b/winsup/w32api/lib/mapi32.def
new file mode 100644
index 000000000..38bff4740
--- /dev/null
+++ b/winsup/w32api/lib/mapi32.def
@@ -0,0 +1,150 @@
+LIBRARY MAPI32.DLL
+EXPORTS
+BuildDisplayTable@40
+CbOfEncoded@4
+CchOfEncoding@4
+ChangeIdleRoutine@28
+CloseIMsgSession@4
+CreateIProp@24
+CreateTable@36
+DeinitMapiUtil@0
+DeregisterIdleRoutine@4
+EnableIdleRoutine@8
+EncodeID@12
+FBadColumnSet@4
+FBadEntryList@4
+FBadProp@4
+FBadPropTag@4
+FBadRestriction@4
+FBadRglpNameID@8
+FBadRglpszA@8
+FBadRglpszW@8
+FBadRow@4
+FBadRowSet@4
+FBadSortOrderSet@4
+FBinFromHex@8
+FDecodeID@12
+FEqualNames@8
+FPropCompareProp@12
+FPropContainsProp@12
+FPropExists@8
+FreePadrlist@4
+FreeProws@4
+FtAdcFt@20
+FtAddFt@16
+FtDivFtBogus@20
+FtMulDw@12
+FtMulDwDw@8
+FtNegFt@8
+FtSubFt@16
+FtgRegisterIdleRoutine@20
+GetAttribIMsgOnIStg@12
+GetTnefStreamCodepage
+GetTnefStreamCodepage@12
+HexFromBin@12
+HrAddColumns@16
+HrAddColumnsEx@20
+HrAllocAdviseSink@12
+HrComposeEID@28
+HrComposeMsgID@24
+HrDecomposeEID@28
+HrDecomposeMsgID@24
+HrDispatchNotifications@4
+HrEntryIDFromSz@12
+HrGetOneProp@12
+HrIStorageFromStream@16
+HrQueryAllRows@24
+HrSetOneProp@8
+HrSzFromEntryID@12
+HrThisThreadAdviseSink@8
+HrValidateIPMSubtree@20
+HrValidateParameters@8
+InstallFilterHook@4
+IsBadBoundedStringPtr@8
+LAUNCHWIZARD
+LPropCompareProp@8
+LaunchWizard@20
+LpValFindProp@12
+MAPIAdminProfiles
+MAPIAdminProfiles@8
+MAPIAllocateBuffer
+MAPIAllocateBuffer@8
+MAPIAllocateMore
+MAPIAllocateMore@12
+MAPIDeinitIdle@0
+MAPIFreeBuffer
+MAPIFreeBuffer@4
+MAPIGetDefaultMalloc@0
+MAPIInitIdle@4
+MAPIInitialize
+MAPIInitialize@4
+MAPILogonEx
+MAPILogonEx@20
+MAPIOpenFormMgr
+MAPIOpenFormMgr@8
+MAPIOpenLocalFormContainer
+MAPIOpenLocalFormContainer@4
+MAPIUninitialize
+MAPIUninitialize@0
+MNLS_CompareStringW@24
+MNLS_IsBadStringPtrW@8
+MNLS_MultiByteToWideChar@24
+MNLS_WideCharToMultiByte@32
+MNLS_lstrcmpW@8
+MNLS_lstrcpyW@8
+MNLS_lstrlenW@4
+MapStorageSCode@4
+OpenIMsgOnIStg@44
+OpenIMsgSession@12
+OpenStreamOnFile
+OpenStreamOnFile@24
+OpenTnefStream
+OpenTnefStream@28
+OpenTnefStreamEx
+OpenTnefStreamEx@32
+PRProviderInit
+PpropFindProp@12
+PropCopyMore@16
+RTFSync
+RTFSync@12
+ScBinFromHexBounded@12
+ScCopyNotifications@16
+ScCopyProps@16
+ScCountNotifications@12
+ScCountProps@12
+ScCreateConversationIndex@16
+ScDupPropset@16
+ScGenerateMuid@4
+ScInitMapiUtil@4
+ScLocalPathFromUNC@12
+ScMAPIXFromCMC
+ScMAPIXFromSMAPI
+ScRelocNotifications@20
+ScRelocProps@20
+ScSplEntry
+ScUNCFromLocalPath@12
+SetAttribIMsgOnIStg@16
+SwapPlong@8
+SwapPword@8
+SzFindCh@8
+SzFindLastCh@8
+SzFindSz@8
+UFromSz@4
+UNKOBJ_COFree@8
+UNKOBJ_Free@8
+UNKOBJ_FreeRows@8
+UNKOBJ_ScAllocate@12
+UNKOBJ_ScAllocateMore@16
+UNKOBJ_ScCOAllocate@12
+UNKOBJ_ScCOReallocate@12
+UNKOBJ_ScSzFromIdsAlloc@20
+UlAddRef@4
+UlFromSzHex@4
+UlPropSize@4
+UlRelease@4
+WrapCompressedRTFStream
+WrapCompressedRTFStream@12
+WrapProgress@20
+WrapStoreEntryID@24
+__CPPValidateParameters@8
+__ValidateParameters@8
diff --git a/winsup/w32api/lib/mfcuia32.def b/winsup/w32api/lib/mfcuia32.def
new file mode 100644
index 000000000..fb954e367
--- /dev/null
+++ b/winsup/w32api/lib/mfcuia32.def
@@ -0,0 +1,12 @@
+LIBRARY MFCUIA32.DLL
+EXPORTS
+OleUIAddVerbMenu@36
+OleUIBusy@4
+OleUICanConvertOrActivateAs@12
+OleUIChangeIcon@4
+OleUIConvert@4
+OleUIEditLinks@4
+OleUIInsertObject@4
+OleUIPasteSpecial@4
+OleUIPromptUser
+OleUIUpdateLinks@16
diff --git a/winsup/w32api/lib/mgmtapi.def b/winsup/w32api/lib/mgmtapi.def
new file mode 100644
index 000000000..2e4619375
--- /dev/null
+++ b/winsup/w32api/lib/mgmtapi.def
@@ -0,0 +1,12 @@
+LIBRARY MGMTAPI.DLL
+EXPORTS
+SnmpMgrClose@4
+SnmpMgrGetTrap@24
+SnmpMgrMIB2Disk@8
+SnmpMgrOidToStr@8
+SnmpMgrOpen@16
+SnmpMgrRequest@20
+SnmpMgrStrToOid@8
+SnmpMgrTrapListen@4
+dbginit@8
+serverTrapThread@4
diff --git a/winsup/w32api/lib/mpr.def b/winsup/w32api/lib/mpr.def
new file mode 100644
index 000000000..f8dde41f7
--- /dev/null
+++ b/winsup/w32api/lib/mpr.def
@@ -0,0 +1,72 @@
+LIBRARY MPR.DLL
+EXPORTS
+MultinetGetConnectionPerformanceA@8
+MultinetGetConnectionPerformanceW@8
+RestoreConnectionA0@8
+WNetAddConnection2A@16
+WNetAddConnection2W@16
+WNetAddConnection3A@20
+WNetAddConnection3W@20
+WNetAddConnectionA@12
+WNetAddConnectionW@12
+WNetCancelConnection2A@12
+WNetCancelConnection2W@12
+WNetCancelConnectionA@8
+WNetCancelConnectionW@8
+WNetClearConnections@4
+WNetCloseEnum@4
+WNetConnectionDialog1A@4
+WNetConnectionDialog1W@4
+WNetConnectionDialog2@16
+WNetConnectionDialog@8
+WNetDirectoryNotifyA@12
+WNetDirectoryNotifyW@12
+WNetDisconnectDialog1A@4
+WNetDisconnectDialog1W@4
+WNetDisconnectDialog2@16
+WNetDisconnectDialog@8
+WNetEnumResourceA@16
+WNetEnumResourceW@16
+WNetFMXEditPerm@12
+WNetFMXGetPermCaps@4
+WNetFMXGetPermHelp@24
+WNetFormatNetworkNameA@24
+WNetFormatNetworkNameW@24
+WNetGetConnection2A@12
+WNetGetConnection2W@12
+WNetGetConnectionA@12
+WNetGetConnectionW@12
+WNetGetDirectoryTypeA@12
+WNetGetDirectoryTypeW@12
+WNetGetFormatNameProc@4
+WNetGetLastErrorA@20
+WNetGetLastErrorW@20
+WNetGetNetworkInformationA@8
+WNetGetNetworkInformationW@8
+WNetGetPropertyTextA@24
+WNetGetPropertyTextW@24
+WNetGetProviderNameA@12
+WNetGetProviderNameW@12
+WNetGetResourceInformationA@16
+WNetGetResourceInformationW@16
+WNetGetResourceParentA@12
+WNetGetResourceParentW@12
+WNetGetSearchDialog@4
+WNetGetUniversalNameA@16
+WNetGetUniversalNameW@16
+WNetGetUserA@12
+WNetGetUserW@12
+WNetLogonNotify@36
+WNetOpenEnumA@20
+WNetOpenEnumW@20
+WNetPasswordChangeNotify@32
+WNetPropertyDialogA@20
+WNetPropertyDialogW@20
+WNetRestoreConnection@8
+WNetSetConnectionA@12
+WNetSetConnectionW@12
+WNetSetLastErrorA@12
+WNetSetLastErrorW@12
+WNetSupportGlobalEnum@4
+WNetUseConnectionA@32
+WNetUseConnectionW@32
diff --git a/winsup/w32api/lib/msacm32.def b/winsup/w32api/lib/msacm32.def
new file mode 100644
index 000000000..356b3aff1
--- /dev/null
+++ b/winsup/w32api/lib/msacm32.def
@@ -0,0 +1,46 @@
+LIBRARY MSACM32.DLL
+EXPORTS
+XRegThunkEntry@36
+acmDriverAddA@20
+acmDriverAddW@20
+acmDriverClose@8
+acmDriverDetailsA@12
+acmDriverDetailsW@12
+acmDriverEnum@12
+acmDriverID@12
+acmDriverMessage@16
+acmDriverOpen@12
+acmDriverPriority@12
+acmDriverRemove@8
+acmFilterChooseA@4
+acmFilterChooseW@4
+acmFilterDetailsA@12
+acmFilterDetailsW@12
+acmFilterEnumA@20
+acmFilterEnumW@20
+acmFilterTagDetailsA@12
+acmFilterTagDetailsW@12
+acmFilterTagEnumA@20
+acmFilterTagEnumW@20
+acmFormatChooseA@4
+acmFormatChooseW@4
+acmFormatDetailsA@12
+acmFormatDetailsW@12
+acmFormatEnumA@20
+acmFormatEnumW@20
+acmFormatSuggest@20
+acmFormatTagDetailsA@12
+acmFormatTagDetailsW@12
+acmFormatTagEnumA@20
+acmFormatTagEnumW@20
+acmGetVersion@0
+acmMessage32@24
+acmMetrics@12
+acmStreamClose@8
+acmStreamConvert@12
+acmStreamMessage@16
+acmStreamOpen@32
+acmStreamPrepareHeader@12
+acmStreamReset@8
+acmStreamSize@16
+acmStreamUnprepareHeader@12
diff --git a/winsup/w32api/lib/mswsock.def b/winsup/w32api/lib/mswsock.def
new file mode 100644
index 000000000..318026e63
--- /dev/null
+++ b/winsup/w32api/lib/mswsock.def
@@ -0,0 +1,28 @@
+LIBRARY MSWSOCK.dll
+EXPORTS
+_AcceptEx@32
+_EnumProtocolsA@12
+_EnumProtocolsW@12
+_GetAcceptExSockaddrs@32
+_GetAddressByNameA@40
+_GetAddressByNameW@40
+_GetNameByTypeA@12
+_GetNameByTypeW@12
+_GetServiceA@28
+_GetServiceW@28
+_GetTypeByNameA@8
+_GetTypeByNameW@8
+_MigrateWinsockConfiguration@12
+_NPLoadNameSpaces@12
+_SetServiceA@24
+_SetServiceW@24
+_TransmitFile@28
+_WSARecvEx@16
+_dn_expand@20
+_getnetbyname@4
+_inet_network@4
+_rcmd@24
+_rexec@24
+_rresvport@4
+_s_perror@8
+_sethostname@8
diff --git a/winsup/w32api/lib/nddeapi.def b/winsup/w32api/lib/nddeapi.def
new file mode 100644
index 000000000..4016baf53
--- /dev/null
+++ b/winsup/w32api/lib/nddeapi.def
@@ -0,0 +1,30 @@
+LIBRARY NDDEAPI.DLL
+EXPORTS
+NDdeGetErrorStringA@12
+NDdeGetErrorStringW@12
+NDdeGetShareSecurityA@24
+NDdeGetShareSecurityW@24
+NDdeGetTrustedShareA@20
+NDdeGetTrustedShareW@20
+NDdeIsValidAppTopicListA@4
+NDdeIsValidAppTopicListW@4
+NDdeIsValidShareNameA@4
+NDdeIsValidShareNameW@4
+NDdeSetShareSecurityA@16
+NDdeSetShareSecurityW@16
+NDdeSetTrustedShareA@12
+NDdeSetTrustedShareW@12
+NDdeShareAddA@20
+NDdeShareAddW@20
+NDdeShareDelA@12
+NDdeShareDelW@12
+NDdeShareEnumA@24
+NDdeShareEnumW@24
+NDdeShareGetInfoA@28
+NDdeShareGetInfoW@28
+NDdeShareSetInfoA@24
+NDdeShareSetInfoW@24
+NDdeSpecialCommandA@24
+NDdeSpecialCommandW@24
+NDdeTrustedShareEnumA@24
+NDdeTrustedShareEnumW@24
diff --git a/winsup/w32api/lib/netapi32.def b/winsup/w32api/lib/netapi32.def
new file mode 100644
index 000000000..e8d0ef438
--- /dev/null
+++ b/winsup/w32api/lib/netapi32.def
@@ -0,0 +1,247 @@
+LIBRARY NETAPI32.DLL
+EXPORTS
+I_BrowserDebugCall@12
+I_BrowserDebugTrace@8
+I_BrowserQueryOtherDomains@16
+I_BrowserQueryStatistics@8
+I_BrowserResetNetlogonState@4
+I_BrowserResetStatistics@4
+I_BrowserServerEnum@44
+I_BrowserSetNetlogonState@16
+I_NetAccountDeltas@48
+I_NetAccountSync@48
+I_NetDatabaseDeltas@32
+I_NetDatabaseRedo@28
+I_NetDatabaseSync2@36
+I_NetDatabaseSync@32
+I_NetGetDCList@16
+I_NetListCanonicalize@36
+I_NetListTraverse@12
+I_NetLogonControl2@20
+I_NetLogonControl@16
+I_NetLogonSamLogoff@24
+I_NetLogonSamLogon@36
+I_NetLogonUasLogoff@12
+I_NetLogonUasLogon@12
+I_NetNameCanonicalize@24
+I_NetNameCompare@20
+I_NetNameValidate@16
+I_NetPathCanonicalize@28
+I_NetPathCompare@20
+I_NetPathType@16
+I_NetServerAuthenticate2@28
+I_NetServerAuthenticate@24
+I_NetServerPasswordSet@28
+I_NetServerReqChallenge@16
+I_NetServerSetServiceBits@16
+NetAlertRaise@12
+NetAlertRaiseEx@16
+NetApiBufferAllocate@8
+NetApiBufferFree@4
+NetApiBufferReallocate@12
+NetApiBufferSize@8
+NetAuditClear@12
+NetAuditRead@44
+NetAuditWrite@20
+NetBrowserStatisticsGet@12
+NetConfigGet@16
+NetConfigGetAll@12
+NetConfigSet@28
+NetConnectionEnum@32
+NetErrorLogClear@12
+NetErrorLogRead@44
+NetErrorLogWrite@32
+NetFileClose@8
+NetFileEnum@36
+NetFileGetInfo@16
+NetGetAnyDCName@12
+NetGetDCName@12
+NetGetDisplayInformationIndex@16
+NetGroupAdd@16
+NetGroupAddUser@12
+NetGroupDel@8
+NetGroupDelUser@12
+NetGroupEnum@28
+NetGroupGetInfo@16
+NetGroupGetUsers@32
+NetGroupSetInfo@20
+NetGroupSetUsers@20
+NetLocalGroupAdd@16
+NetLocalGroupAddMember@12
+NetLocalGroupAddMembers@20
+NetLocalGroupDel@8
+NetLocalGroupDelMember@12
+NetLocalGroupDelMembers@20
+NetLocalGroupEnum@28
+NetLocalGroupGetInfo@16
+NetLocalGroupGetMembers@32
+NetLocalGroupSetInfo@20
+NetLocalGroupSetMembers@20
+NetMessageBufferSend@20
+NetMessageNameAdd@8
+NetMessageNameDel@8
+NetMessageNameEnum@28
+NetMessageNameGetInfo@16
+NetQueryDisplayInformation@28
+NetRemoteComputerSupports@12
+NetRemoteTOD@8
+NetReplExportDirAdd@16
+NetReplExportDirDel@8
+NetReplExportDirEnum@28
+NetReplExportDirGetInfo@16
+NetReplExportDirLock@8
+NetReplExportDirSetInfo@20
+NetReplExportDirUnlock@12
+NetReplGetInfo@12
+NetReplImportDirAdd@16
+NetReplImportDirDel@8
+NetReplImportDirEnum@28
+NetReplImportDirGetInfo@16
+NetReplImportDirLock@8
+NetReplImportDirUnlock@12
+NetReplSetInfo@16
+NetRplAdapterAdd@16
+NetRplAdapterDel@8
+NetRplAdapterEnum@28
+NetRplBootAdd@16
+NetRplBootDel@12
+NetRplBootEnum@28
+NetRplClose@4
+NetRplConfigAdd@16
+NetRplConfigDel@8
+NetRplConfigEnum@32
+NetRplGetInfo@12
+NetRplOpen@8
+NetRplProfileAdd@16
+NetRplProfileClone@16
+NetRplProfileDel@8
+NetRplProfileEnum@32
+NetRplProfileGetInfo@16
+NetRplProfileSetInfo@20
+NetRplSetInfo@16
+NetRplSetSecurity@16
+NetRplVendorAdd@16
+NetRplVendorDel@8
+NetRplVendorEnum@28
+NetRplWkstaAdd@16
+NetRplWkstaClone@24
+NetRplWkstaDel@8
+NetRplWkstaEnum@32
+NetRplWkstaGetInfo@16
+NetRplWkstaSetInfo@20
+NetScheduleJobAdd@12
+NetScheduleJobDel@12
+NetScheduleJobEnum@24
+NetScheduleJobGetInfo@12
+NetServerDiskEnum@28
+NetServerEnum@36
+NetServerGetInfo@12
+NetServerSetInfo@16
+NetServerTransportAdd@12
+NetServerTransportDel@12
+NetServerTransportEnum@28
+NetServiceControl@20
+NetServiceEnum@28
+NetServiceGetInfo@16
+NetServiceInstall@20
+NetSessionDel@12
+NetSessionEnum@36
+NetSessionGetInfo@20
+NetShareAdd@16
+NetShareCheck@12
+NetShareDel@12
+NetShareDelSticky@12
+NetShareEnum@28
+NetShareEnumSticky@28
+NetShareGetInfo@16
+NetShareSetInfo@20
+NetStatisticsGet@20
+NetUseAdd@16
+NetUseDel@12
+NetUseEnum@28
+NetUseGetInfo@16
+NetUserAdd@16
+NetUserChangePassword@16
+NetUserDel@8
+NetUserEnum@32
+NetUserGetGroups@28
+NetUserGetInfo@16
+NetUserGetLocalGroups@32
+NetUserModalsGet@12
+NetUserModalsSet@16
+NetUserSetGroups@20
+NetUserSetInfo@20
+NetWkstaGetInfo@12
+NetWkstaSetInfo@16
+NetWkstaTransportAdd@16
+NetWkstaTransportDel@12
+NetWkstaTransportEnum@28
+NetWkstaUserEnum@28
+NetWkstaUserGetInfo@12
+NetWkstaUserSetInfo@16
+NetapipBufferAllocate@8
+Netbios@4
+NetpAccessCheckAndAudit@20
+NetpAllocConfigName@16
+NetpAllocStrFromWStr@4
+NetpAllocWStrFromStr@4
+NetpAllocWStrFromWStr@4
+NetpApiStatusToNtStatus@4
+NetpAssertFailed@16
+NetpCloseConfigData@4
+NetpCopyStringToBuffer@20
+NetpCreateSecurityObject@24
+NetpDbgDisplayServerInfo@8
+NetpDbgPrint
+NetpDeleteSecurityObject@4
+NetpGetComputerName@4
+NetpGetConfigBool@16
+NetpGetConfigDword@16
+NetpGetConfigTStrArray@12
+NetpGetConfigValue@12
+NetpGetDomainName@4
+NetpGetFileSecurity@16
+NetpGetPrivilege@8
+NetpHexDump@8
+NetpInitOemString@8
+NetpIsRemote@16
+NetpIsUncComputerNameValid@4
+NetpLocalTimeZoneOffset@0
+NetpLogonPutUnicodeString@12
+NetpNetBiosAddName@12
+NetpNetBiosCall@16
+NetpNetBiosDelName@8
+NetpNetBiosGetAdapterNumbers@8
+NetpNetBiosHangup@8
+NetpNetBiosReceive@24
+NetpNetBiosReset@4
+NetpNetBiosSend@16
+NetpNetBiosStatusToApiStatus@4
+NetpNtStatusToApiStatus@4
+NetpOpenConfigData@16
+NetpPackString@12
+NetpReleasePrivilege@0
+NetpSetConfigBool@12
+NetpSetConfigDword@12
+NetpSetConfigTStrArray@12
+NetpSetFileSecurity@12
+NetpSmbCheck@20
+NetpStringToNetBiosName@16
+NetpTStrArrayEntryCount@4
+NetpwNameCanonicalize@20
+NetpwNameCompare@16
+NetpwNameValidate@12
+NetpwPathCanonicalize@24
+NetpwPathCompare@16
+NetpwPathType@12
+NlBindingAddServerToCache@4
+NlBindingRemoveServerFromCache@4
+RxNetAccessAdd@16
+RxNetAccessDel@8
+RxNetAccessEnum@36
+RxNetAccessGetInfo@16
+RxNetAccessGetUserPerms@16
+RxNetAccessSetInfo@20
+RxNetServerEnum@40
+RxNetUserPasswordSet@16
+RxRemoteApi
diff --git a/winsup/w32api/lib/odbc32.def b/winsup/w32api/lib/odbc32.def
new file mode 100644
index 000000000..e10adc823
--- /dev/null
+++ b/winsup/w32api/lib/odbc32.def
@@ -0,0 +1,62 @@
+LIBRARY ODBC32.DLL
+EXPORTS
+ConnectDlg@16
+PostError@20
+PostODBCError@16
+SQLAllocConnect@8
+SQLAllocEnv@4
+SQLAllocStmt@8
+SQLBindCol@24
+SQLBindParameter@40
+SQLBrowseConnect@24
+SQLCancel@4
+SQLColAttributes@28
+SQLColumnPrivileges@36
+SQLColumns@36
+SQLConnect@28
+SQLDataSources@32
+SQLDescribeCol@36
+SQLDescribeParam@24
+SQLDisconnect@4
+SQLDriverConnect@32
+SQLDrivers@32
+SQLError@32
+SQLExecDirect@12
+SQLExecute@4
+SQLExtendedFetch@20
+SQLFetch@4
+SQLForeignKeys@52
+SQLFreeConnect@4
+SQLFreeEnv@4
+SQLFreeHandle@8
+SQLFreeStmt@8
+SQLGetConnectOption@12
+SQLGetCursorName@16
+SQLGetData@24
+SQLGetFunctions@12
+SQLGetInfo@20
+SQLGetStmtOption@12
+SQLGetTypeInfo@8
+SQLMoreResults@4
+SQLNativeSql@24
+SQLNumParams@8
+SQLNumResultCols@8
+SQLParamData@8
+SQLParamOptions@12
+SQLPrepare@12
+SQLPrimaryKeys@28
+SQLProcedureColumns@36
+SQLProcedures@28
+SQLPutData@12
+SQLRowCount@8
+SQLSetConnectOption@12
+SQLSetCursorName@12
+SQLSetParam@32
+SQLSetPos@16
+SQLSetScrollOptions@16
+SQLSetStmtOption@12
+SQLSpecialColumns@40
+SQLStatistics@36
+SQLTablePrivileges@28
+SQLTables@36
+SQLTransact@12
diff --git a/winsup/w32api/lib/ole32.def b/winsup/w32api/lib/ole32.def
new file mode 100644
index 000000000..e93f25c59
--- /dev/null
+++ b/winsup/w32api/lib/ole32.def
@@ -0,0 +1,163 @@
+LIBRARY OLE32.dll
+EXPORTS
+BindMoniker@16
+CLSIDFromProgID@8
+CLSIDFromString@8
+CoBuildVersion@0
+CoCreateFreeThreadedMarshaler@8
+CoCreateGuid@4
+CoCreateInstance@20
+CoDisconnectObject@8
+CoDosDateTimeToFileTime@12
+CoFileTimeNow@4
+CoFileTimeToDosDateTime@12
+CoFreeAllLibraries@0
+CoFreeLibrary@4
+CoFreeUnusedLibraries@0
+CoGetCallerTID@4
+CoGetClassObject@20
+CoGetCurrentLogicalThreadId@4
+CoGetCurrentProcess@0
+CoGetInterfaceAndReleaseStream@12
+CoGetMalloc@8
+CoGetMarshalSizeMax@24
+CoGetPSClsid@8
+CoGetStandardMarshal@24
+CoGetState@4
+CoGetTreatAsClass@8
+CoInitialize@4
+CoInitializeWOW@8
+CoIsHandlerConnected@4
+CoIsOle1Class@4
+CoLoadLibrary@8
+CoLockObjectExternal@12
+CoMarshalHresult@8
+CoMarshalInterThreadInterfaceInStream@12
+CoMarshalInterface@24
+CoQueryReleaseObject@4
+CoRegisterClassObject@20
+CoRegisterMallocSpy@4
+CoRegisterMessageFilter@8
+CoReleaseMarshalData@4
+CoRevokeClassObject@4
+CoRevokeMallocSpy@0
+CoSetState@4
+CoTaskMemAlloc@4
+CoTaskMemFree@4
+CoTaskMemRealloc@8
+CoTreatAsClass@8
+CoUninitialize@0
+CoUnloadingWOW@4
+CoUnmarshalHresult@8
+CoUnmarshalInterface@12
+CreateAntiMoniker@4
+CreateBindCtx@8
+CreateDataAdviseHolder@4
+CreateDataCache@16
+CreateFileMoniker@8
+CreateGenericComposite@12
+CreateILockBytesOnHGlobal@12
+CreateItemMoniker@12
+CreateOleAdviseHolder@4
+CreatePointerMoniker@8
+CreateStreamOnHGlobal@12
+DllDebugObjectRPCHook@8
+DllGetClassObjectWOW@12
+DoDragDrop@16
+EnableHookObject@8
+GetClassFile@8
+GetConvertStg@4
+GetDocumentBitStg@4
+GetHGlobalFromILockBytes@8
+GetHGlobalFromStream@8
+GetHookInterface@4
+GetRunningObjectTable@8
+IIDFromString@8
+IsAccelerator@16
+IsEqualGUID@8
+IsValidIid@4
+IsValidInterface@4
+IsValidPtrIn@8
+IsValidPtrOut@8
+MkParseDisplayName@16
+MonikerCommonPrefixWith@12
+MonikerRelativePathTo@16
+OleBuildVersion@0
+OleConvertIStorageToOLESTREAM@8
+OleConvertIStorageToOLESTREAMEx@28
+OleConvertOLESTREAMToIStorage@12
+OleConvertOLESTREAMToIStorageEx@28
+OleCreate@28
+OleCreateDefaultHandler@16
+OleCreateEmbeddingHelper@24
+OleCreateFromData@28
+OleCreateFromFile@32
+OleCreateLink@28
+OleCreateLinkFromData@28
+OleCreateLinkToFile@28
+OleCreateMenuDescriptor@8
+OleCreateStaticFromData@28
+OleDestroyMenuDescriptor@4
+OleDoAutoConvert@8
+OleDraw@16
+OleDuplicateData@12
+OleFlushClipboard@0
+OleGetAutoConvert@8
+OleGetClipboard@4
+OleGetIconOfClass@12
+OleGetIconOfFile@8
+OleInitialize@4
+OleInitializeWOW@8
+OleIsCurrentClipboard@4
+OleIsRunning@4
+OleLoad@16
+OleLoadFromStream@12
+OleLockRunning@12
+OleMetafilePictFromIconAndLabel@16
+OleNoteObjectVisible@8
+OleQueryCreateFromData@4
+OleQueryLinkFromData@4
+OleRegEnumFormatEtc@12
+OleRegEnumVerbs@8
+OleRegGetMiscStatus@12
+OleRegGetUserType@12
+OleRun@4
+OleSave@12
+OleSaveToStream@8
+OleSetAutoConvert@8
+OleSetClipboard@4
+OleSetContainedObject@8
+OleSetMenuDescriptor@20
+OleTranslateAccelerator@12
+OleUninitialize@0
+OpenOrCreateStream@12
+ProgIDFromCLSID@8
+ReadClassStg@8
+ReadClassStm@8
+ReadFmtUserTypeStg@12
+ReadOleStg@24
+ReadStringStream@8
+RegisterDragDrop@8
+ReleaseStgMedium@4
+RevokeDragDrop@4
+SetConvertStg@8
+SetDocumentBitStg@8
+StgCreateDocfile@16
+StgCreateDocfileOnILockBytes@16
+StgIsStorageFile@4
+StgIsStorageILockBytes@4
+StgOpenStorage@24
+StgOpenStorageOnILockBytes@24
+StgSetTimes@16
+StringFromCLSID@8
+StringFromGUID2@12
+StringFromIID@8
+UtConvertDvtd16toDvtd32@12
+UtConvertDvtd32toDvtd16@12
+UtGetDvtd16Info@8
+UtGetDvtd32Info@8
+WriteClassStg@8
+WriteClassStm@8
+WriteFmtUserTypeStg@12
+WriteOleStg@16
+WriteStringStream@8
diff --git a/winsup/w32api/lib/oleaut32.def b/winsup/w32api/lib/oleaut32.def
new file mode 100644
index 000000000..b43c0fd92
--- /dev/null
+++ b/winsup/w32api/lib/oleaut32.def
@@ -0,0 +1,146 @@
+LIBRARY OLEAUT32.DLL
+EXPORTS
+CreateDispTypeInfo@12
+CreateErrorInfo@4
+CreateStdDispatch@16
+CreateTypeLib@12
+DispGetIDsOfNames@16
+DispGetParam@20
+DispInvoke@32
+DllCanUnloadNow@0
+DllGetClassObject@12
+DosDateTimeToVariantTime@12
+GetActiveObject@12
+GetErrorInfo@8
+LHashValOfNameSys@12
+LHashValOfNameSysA@12
+LoadRegTypeLib@20
+LoadTypeLib@8
+LoadTypeLibEx@12
+OaBuildVersion@0
+QueryPathOfRegTypeLib@20
+RegisterActiveObject@16
+RegisterTypeLib@12
+RevokeActiveObject@8
+SafeArrayAccessData@8
+SafeArrayAllocData@4
+SafeArrayAllocDescriptor@8
+SafeArrayCopy@8
+SafeArrayCreate@12
+SafeArrayDestroy@4
+SafeArrayDestroyData@4
+SafeArrayDestroyDescriptor@4
+SafeArrayGetDim@4
+SafeArrayGetElement@12
+SafeArrayGetElemsize@4
+SafeArrayGetLBound@12
+SafeArrayGetUBound@12
+SafeArrayLock@4
+SafeArrayPtrOfIndex@12
+SafeArrayPutElement@12
+SafeArrayRedim@8
+SafeArrayUnaccessData@4
+SafeArrayUnlock@4
+SafeArrayCreateVector@12
+SetErrorInfo@8
+SysAllocString@4
+SysAllocStringByteLen@8
+SysAllocStringLen@8
+SysFreeString@4
+SysReAllocString@8
+SysReAllocStringLen@12
+SysStringByteLen@4
+SysStringLen@4
+VarBoolFromCy@12
+VarBoolFromDate@12
+VarBoolFromDisp@12
+VarBoolFromI2@8
+VarBoolFromI4@8
+VarBoolFromR4@8
+VarBoolFromR8@12
+VarBoolFromStr@16
+VarBoolFromUI1@8
+VarBstrFromBool@16
+VarBstrFromCy@20
+VarBstrFromDate@20
+VarBstrFromDisp@16
+VarBstrFromI2@16
+VarBstrFromI4@16
+VarBstrFromR4@16
+VarBstrFromR8@20
+VarBstrFromUI1@16
+VarCyFromBool@8
+VarCyFromDate@12
+VarCyFromDisp@12
+VarCyFromI2@8
+VarCyFromI4@8
+VarCyFromR4@8
+VarCyFromR8@12
+VarCyFromStr@16
+VarCyFromUI1@8
+VarDateFromBool@8
+VarDateFromCy@12
+VarDateFromDisp@12
+VarDateFromI2@8
+VarDateFromI4@8
+VarDateFromR4@8
+VarDateFromR8@12
+VarDateFromStr@16
+VarDateFromUI1@8
+VarI2FromBool@8
+VarI2FromCy@12
+VarI2FromDate@12
+VarI2FromDisp@12
+VarI2FromI4@8
+VarI2FromR4@8
+VarI2FromR8@12
+VarI2FromStr@16
+VarI2FromUI1@8
+VarI4FromBool@8
+VarI4FromCy@12
+VarI4FromDate@12
+VarI4FromDisp@12
+VarI4FromI2@8
+VarI4FromR4@8
+VarI4FromR8@12
+VarI4FromStr@16
+VarI4FromUI1@8
+VarR4FromBool@8
+VarR4FromCy@12
+VarR4FromDate@12
+VarR4FromDisp@12
+VarR4FromI2@8
+VarR4FromI4@8
+VarR4FromR8@12
+VarR4FromStr@16
+VarR4FromUI1@8
+VarR8FromBool@8
+VarR8FromCy@12
+VarR8FromDate@12
+VarR8FromDisp@12
+VarR8FromI2@8
+VarR8FromI4@8
+VarR8FromR4@8
+VarR8FromStr@16
+VarR8FromUI1@8
+VarUI1FromBool@8
+VarUI1FromCy@12
+VarUI1FromDate@12
+VarUI1FromDisp@12
+VarUI1FromI2@8
+VarUI1FromI4@8
+VarUI1FromR4@8
+VarUI1FromR8@12
+VarUI1FromStr@16
+VariantChangeType@16
+VariantChangeTypeEx@20
+VariantClear@4
+VariantCopy@8
+VariantCopyInd@8
+VariantInit@4
+VariantTimeToDosDateTime@16
+VariantTimeToSystemTime@12
+VarAdd@12
+VarSub@12
+VarMul@12
+VarDiv@12
diff --git a/winsup/w32api/lib/olecli32.def b/winsup/w32api/lib/olecli32.def
new file mode 100644
index 000000000..f02f35e00
--- /dev/null
+++ b/winsup/w32api/lib/olecli32.def
@@ -0,0 +1,57 @@
+LIBRARY OLECLI32.DLL
+EXPORTS
+OleActivate@24
+OleClone@20
+OleClose@4
+OleCopyFromLink@24
+OleCopyToClipboard@4
+OleCreate@32
+OleCreateFromClip@28
+OleCreateFromFile@36
+OleCreateFromTemplate@32
+OleCreateInvisible@36
+OleCreateLinkFromClip@28
+OleCreateLinkFromFile@40
+OleDelete@4
+OleDraw@20
+OleEnumFormats@8
+OleEnumObjects@8
+OleEqual@8
+OleExecute@12
+OleGetData@12
+OleGetLinkUpdateOptions@8
+OleIsDcMeta@4
+OleLoadFromStream@24
+OleLockServer@8
+OleObjectConvert@24
+OleQueryBounds@8
+OleQueryClientVersion@0
+OleQueryCreateFromClip@12
+OleQueryLinkFromClip@12
+OleQueryName@12
+OleQueryOpen@4
+OleQueryOutOfDate@4
+OleQueryProtocol@8
+OleQueryReleaseError@4
+OleQueryReleaseMethod@4
+OleQueryReleaseStatus@4
+OleQuerySize@8
+OleQueryType@8
+OleReconnect@4
+OleRegisterClientDoc@16
+OleRelease@4
+OleRename@8
+OleRenameClientDoc@8
+OleRequestData@8
+OleRevertClientDoc@4
+OleRevokeClientDoc@4
+OleSaveToStream@8
+OleSavedClientDoc@4
+OleSetBounds@8
+OleSetColorScheme@8
+OleSetData@12
+OleSetHostNames@12
+OleSetLinkUpdateOptions@8
+OleSetTargetDevice@8
+OleUnlockServer@4
+OleUpdate@4
diff --git a/winsup/w32api/lib/oledlg.def b/winsup/w32api/lib/oledlg.def
new file mode 100644
index 000000000..6ae8ace10
--- /dev/null
+++ b/winsup/w32api/lib/oledlg.def
@@ -0,0 +1,25 @@
+LIBRARY OLEDLG.DLL
+EXPORTS
+OleUIAddVerbMenuA@36
+OleUIAddVerbMenuW@36
+OleUIBusyA@4
+OleUIBusyW@4
+OleUICanConvertOrActivateAs@12
+OleUIChangeIconA@4
+OleUIChangeIconW@4
+OleUIChangeSourceA@4
+OleUIChangeSourceW@4
+OleUIConvertA@4
+OleUIConvertW@4
+OleUIEditLinksA@4
+OleUIEditLinksW@4
+OleUIInsertObjectA@4
+OleUIInsertObjectW@4
+OleUIObjectPropertiesA@4
+OleUIObjectPropertiesW@4
+OleUIPasteSpecialA@4
+OleUIPasteSpecialW@4
+OleUIPromptUserA
+OleUIPromptUserW
+OleUIUpdateLinksA@16
+OleUIUpdateLinksW@16
diff --git a/winsup/w32api/lib/olepro32.def b/winsup/w32api/lib/olepro32.def
new file mode 100644
index 000000000..ebfbbc588
--- /dev/null
+++ b/winsup/w32api/lib/olepro32.def
@@ -0,0 +1,9 @@
+LIBRARY OLEPRO32.DLL
+EXPORTS
+OleCreateFontIndirect@12
+OleCreatePictureIndirect@16
+OleCreatePropertyFrame@44
+OleCreatePropertyFrameIndirect@4
+OleIconToCursor@8
+OleLoadPicture@20
+OleTranslateColor@12
diff --git a/winsup/w32api/lib/olesvr32.def b/winsup/w32api/lib/olesvr32.def
new file mode 100644
index 000000000..04d5ba699
--- /dev/null
+++ b/winsup/w32api/lib/olesvr32.def
@@ -0,0 +1,13 @@
+LIBRARY OLESVR32.DLL
+EXPORTS
+OleBlockServer@4
+OleQueryServerVersion@0
+OleRegisterServer@20
+OleRegisterServerDoc@16
+OleRenameServerDoc@8
+OleRevertServerDoc@4
+OleRevokeObject@4
+OleRevokeServer@4
+OleRevokeServerDoc@4
+OleSavedServerDoc@4
+OleUnblockServer@8
diff --git a/winsup/w32api/lib/opengl32.def b/winsup/w32api/lib/opengl32.def
new file mode 100644
index 000000000..e612a5753
--- /dev/null
+++ b/winsup/w32api/lib/opengl32.def
@@ -0,0 +1,369 @@
+LIBRARY OPENGL32.DLL
+EXPORTS
+GlmfBeginGlsBlock@4
+GlmfCloseMetaFile@4
+GlmfEndGlsBlock@4
+GlmfEndPlayback@4
+GlmfInitPlayback@12
+GlmfPlayGlsRecord@16
+glAccum@8
+glAlphaFunc@8
+glAreTexturesResident@12
+glArrayElement@4
+glBegin@4
+glBindTexture@8
+glBitmap@28
+glBlendFunc@8
+glCallList@4
+glCallLists@12
+glClear@4
+glClearAccum@16
+glClearColor@16
+glClearDepth@8
+glClearIndex@4
+glClearStencil@4
+glClipPlane@8
+glColor3b@12
+glColor3bv@4
+glColor3d@24
+glColor3dv@4
+glColor3f@12
+glColor3fv@4
+glColor3i@12
+glColor3iv@4
+glColor3s@12
+glColor3sv@4
+glColor3ub@12
+glColor3ubv@4
+glColor3ui@12
+glColor3uiv@4
+glColor3us@12
+glColor3usv@4
+glColor4b@16
+glColor4bv@4
+glColor4d@32
+glColor4dv@4
+glColor4f@16
+glColor4fv@4
+glColor4i@16
+glColor4iv@4
+glColor4s@16
+glColor4sv@4
+glColor4ub@16
+glColor4ubv@4
+glColor4ui@16
+glColor4uiv@4
+glColor4us@16
+glColor4usv@4
+glColorMask@16
+glColorMaterial@8
+glColorPointer@16
+glCopyPixels@20
+glCopyTexImage1D@28
+glCopyTexImage2D@32
+glCopyTexSubImage1D@24
+glCopyTexSubImage2D@32
+glCullFace@4
+glDebugEntry@8
+glDeleteLists@8
+glDeleteTextures@8
+glDepthFunc@4
+glDepthMask@4
+glDepthRange@16
+glDisable@4
+glDisableClientState@4
+glDrawArrays@12
+glDrawBuffer@4
+glDrawElements@16
+glDrawPixels@20
+glEdgeFlag@4
+glEdgeFlagPointer@8
+glEdgeFlagv@4
+glEnable@4
+glEnableClientState@4
+glEnd@0
+glEndList@0
+glEvalCoord1d@8
+glEvalCoord1dv@4
+glEvalCoord1f@4
+glEvalCoord1fv@4
+glEvalCoord2d@16
+glEvalCoord2dv@4
+glEvalCoord2f@8
+glEvalCoord2fv@4
+glEvalMesh1@12
+glEvalMesh2@20
+glEvalPoint1@4
+glEvalPoint2@8
+glFeedbackBuffer@12
+glFinish@0
+glFlush@0
+glFogf@8
+glFogfv@8
+glFogi@8
+glFogiv@8
+glFrontFace@4
+glFrustum@48
+glGenLists@4
+glGenTextures@8
+glGetBooleanv@8
+glGetClipPlane@8
+glGetDoublev@8
+glGetError@0
+glGetFloatv@8
+glGetIntegerv@8
+glGetLightfv@12
+glGetLightiv@12
+glGetMapdv@12
+glGetMapfv@12
+glGetMapiv@12
+glGetMaterialfv@12
+glGetMaterialiv@12
+glGetPixelMapfv@8
+glGetPixelMapuiv@8
+glGetPixelMapusv@8
+glGetPointerv@8
+glGetPolygonStipple@4
+glGetString@4
+glGetTexEnvfv@12
+glGetTexEnviv@12
+glGetTexGendv@12
+glGetTexGenfv@12
+glGetTexGeniv@12
+glGetTexImage@20
+glGetTexLevelParameterfv@16
+glGetTexLevelParameteriv@16
+glGetTexParameterfv@12
+glGetTexParameteriv@12
+glHint@8
+glIndexMask@4
+glIndexPointer@12
+glIndexd@8
+glIndexdv@4
+glIndexf@4
+glIndexfv@4
+glIndexi@4
+glIndexiv@4
+glIndexs@4
+glIndexsv@4
+glIndexub@4
+glIndexubv@4
+glInitNames@0
+glInterleavedArrays@12
+glIsEnabled@4
+glIsList@4
+glIsTexture@4
+glLightModelf@8
+glLightModelfv@8
+glLightModeli@8
+glLightModeliv@8
+glLightf@12
+glLightfv@12
+glLighti@12
+glLightiv@12
+glLineStipple@8
+glLineWidth@4
+glListBase@4
+glLoadIdentity@0
+glLoadMatrixd@4
+glLoadMatrixf@4
+glLoadName@4
+glLogicOp@4
+glMap1d@32
+glMap1f@24
+glMap2d@56
+glMap2f@40
+glMapGrid1d@20
+glMapGrid1f@12
+glMapGrid2d@40
+glMapGrid2f@24
+glMaterialf@12
+glMaterialfv@12
+glMateriali@12
+glMaterialiv@12
+glMatrixMode@4
+glMultMatrixd@4
+glMultMatrixf@4
+glNewList@8
+glNormal3b@12
+glNormal3bv@4
+glNormal3d@24
+glNormal3dv@4
+glNormal3f@12
+glNormal3fv@4
+glNormal3i@12
+glNormal3iv@4
+glNormal3s@12
+glNormal3sv@4
+glNormalPointer@12
+glOrtho@48
+glPassThrough@4
+glPixelMapfv@12
+glPixelMapuiv@12
+glPixelMapusv@12
+glPixelStoref@8
+glPixelStorei@8
+glPixelTransferf@8
+glPixelTransferi@8
+glPixelZoom@8
+glPointSize@4
+glPolygonMode@8
+glPolygonOffset@8
+glPolygonStipple@4
+glPopAttrib@0
+glPopClientAttrib@0
+glPopMatrix@0
+glPopName@0
+glPrioritizeTextures@12
+glPushAttrib@4
+glPushClientAttrib@4
+glPushMatrix@0
+glPushName@4
+glRasterPos2d@16
+glRasterPos2dv@4
+glRasterPos2f@8
+glRasterPos2fv@4
+glRasterPos2i@8
+glRasterPos2iv@4
+glRasterPos2s@8
+glRasterPos2sv@4
+glRasterPos3d@24
+glRasterPos3dv@4
+glRasterPos3f@12
+glRasterPos3fv@4
+glRasterPos3i@12
+glRasterPos3iv@4
+glRasterPos3s@12
+glRasterPos3sv@4
+glRasterPos4d@32
+glRasterPos4dv@4
+glRasterPos4f@16
+glRasterPos4fv@4
+glRasterPos4i@16
+glRasterPos4iv@4
+glRasterPos4s@16
+glRasterPos4sv@4
+glReadBuffer@4
+glReadPixels@28
+glRectd@32
+glRectdv@8
+glRectf@16
+glRectfv@8
+glRecti@16
+glRectiv@8
+glRects@16
+glRectsv@8
+glRenderMode@4
+glRotated@32
+glRotatef@16
+glScaled@24
+glScalef@12
+glScissor@16
+glSelectBuffer@8
+glShadeModel@4
+glStencilFunc@12
+glStencilMask@4
+glStencilOp@12
+glTexCoord1d@8
+glTexCoord1dv@4
+glTexCoord1f@4
+glTexCoord1fv@4
+glTexCoord1i@4
+glTexCoord1iv@4
+glTexCoord1s@4
+glTexCoord1sv@4
+glTexCoord2d@16
+glTexCoord2dv@4
+glTexCoord2f@8
+glTexCoord2fv@4
+glTexCoord2i@8
+glTexCoord2iv@4
+glTexCoord2s@8
+glTexCoord2sv@4
+glTexCoord3d@24
+glTexCoord3dv@4
+glTexCoord3f@12
+glTexCoord3fv@4
+glTexCoord3i@12
+glTexCoord3iv@4
+glTexCoord3s@12
+glTexCoord3sv@4
+glTexCoord4d@32
+glTexCoord4dv@4
+glTexCoord4f@16
+glTexCoord4fv@4
+glTexCoord4i@16
+glTexCoord4iv@4
+glTexCoord4s@16
+glTexCoord4sv@4
+glTexCoordPointer@16
+glTexEnvf@12
+glTexEnvfv@12
+glTexEnvi@12
+glTexEnviv@12
+glTexGend@16
+glTexGendv@12
+glTexGenf@12
+glTexGenfv@12
+glTexGeni@12
+glTexGeniv@12
+glTexImage1D@32
+glTexImage2D@36
+glTexParameterf@12
+glTexParameterfv@12
+glTexParameteri@12
+glTexParameteriv@12
+glTexSubImage1D@28
+glTexSubImage2D@36
+glTranslated@24
+glTranslatef@12
+glVertex2d@16
+glVertex2dv@4
+glVertex2f@8
+glVertex2fv@4
+glVertex2i@8
+glVertex2iv@4
+glVertex2s@8
+glVertex2sv@4
+glVertex3d@24
+glVertex3dv@4
+glVertex3f@12
+glVertex3fv@4
+glVertex3i@12
+glVertex3iv@4
+glVertex3s@12
+glVertex3sv@4
+glVertex4d@32
+glVertex4dv@4
+glVertex4f@16
+glVertex4fv@4
+glVertex4i@16
+glVertex4iv@4
+glVertex4s@16
+glVertex4sv@4
+glVertexPointer@16
+glViewport@16
+wglChoosePixelFormat@8
+wglCopyContext@12
+wglCreateContext@4
+wglCreateLayerContext@8
+wglDeleteContext@4
+wglDescribeLayerPlane@20
+wglDescribePixelFormat@16
+wglGetCurrentContext@0
+wglGetCurrentDC@0
+wglGetDefaultProcAddress@4
+wglGetLayerPaletteEntries@20
+wglGetPixelFormat@4
+wglGetProcAddress@4
+wglMakeCurrent@8
+wglRealizeLayerPalette@12
+wglSetLayerPaletteEntries@20
+wglSetPixelFormat@12
+wglShareLists@8
+wglSwapBuffers@4
+wglSwapLayerBuffers@8
+wglUseFontBitmapsA@16
+wglUseFontBitmapsW@16
+wglUseFontOutlinesA@32
+wglUseFontOutlinesW@32
diff --git a/winsup/w32api/lib/penwin32.def b/winsup/w32api/lib/penwin32.def
new file mode 100644
index 000000000..0efc7f73a
--- /dev/null
+++ b/winsup/w32api/lib/penwin32.def
@@ -0,0 +1,101 @@
+LIBRARY PENWIN32.DLL
+EXPORTS
+AddInksetInterval@8
+AddPenDataHRC@8
+AddPenInputHRC@20
+AddPointsPenData@16
+AddWordsHWL@12
+BoundingRectFromPoints@12
+CharacterToSymbol@12
+CompressPenData@12
+ConfigHREC@16
+CorrectWriting@24
+CreateCompatibleHRC@8
+CreateHWL@16
+CreateInkset@4
+CreateInksetHRCRESULT@12
+CreatePenDataEx@16
+CreatePenDataHRC@4
+CreatePenDataRegion@8
+DPtoTP@8
+DestroyHRC@4
+DestroyHRCRESULT@4
+DestroyHWL@4
+DestroyInkset@4
+DestroyPenData@4
+DoDefaultPenInput@8
+DrawPenDataEx@40
+DuplicatePenData@8
+EnableGestureSetHRC@12
+EnableSystemDictionaryHRC@8
+EndPenInputHRC@4
+ExtractPenDataPoints@28
+ExtractPenDataStrokes@20
+GetAlphabetHRC@12
+GetAlphabetPriorityHRC@12
+GetAlternateWordsHRCRESULT@20
+GetBoxMappingHRCRESULT@16
+GetBoxResultsHRC@24
+GetGuideHRC@12
+GetHRECFromHRC@4
+GetHotspotsHRCRESULT@16
+GetInksetInterval@12
+GetInksetIntervalCount@4
+GetInternationalHRC@20
+GetMaxResultsHRC@4
+GetPenAppFlags@0
+GetPenAsyncState@4
+GetPenDataAttributes@12
+GetPenDataInfo@16
+GetPenInput@24
+GetPenMiscInfo@8
+GetPointsFromPenData@20
+GetResultsHRC@16
+GetStrokeAttributes@16
+GetStrokeTableAttributes@16
+GetSymbolCountHRCRESULT@4
+GetSymbolsHRCRESULT@16
+GetVersionPenWin@0
+GetWordlistCoercionHRC@4
+GetWordlistHRC@8
+HitTestPenData@20
+InsertPenData@12
+InsertPenDataPoints@24
+InsertPenDataStroke@20
+InstallRecognizer@4
+IsPenEvent@8
+MetricScalePenData@8
+OffsetPenData@12
+PeekPenInput@20
+PenDataFromBuffer@20
+PenDataToBuffer@16
+ProcessHRC@8
+ReadHWL@8
+RedisplayPenData@24
+RemovePenDataStrokes@12
+ResizePenData@8
+SetAlphabetHRC@12
+SetAlphabetPriorityHRC@12
+SetBoxAlphabetHRC@12
+SetGuideHRC@12
+SetInternationalHRC@20
+SetMaxResultsHRC@8
+SetPenAppFlags@8
+SetPenMiscInfo@8
+SetResultsHookHREC@8
+SetStrokeAttributes@16
+SetStrokeTableAttributes@16
+SetWordlistCoercionHRC@8
+SetWordlistHRC@8
+StartInking@12
+StartPenInput@16
+StopInking@4
+StopPenInput@12
+SymbolToCharacter@16
+TPtoDP@8
+TargetPoints@20
+TrainHREC@20
+TrimPenData@12
+UnhookResultsHookHREC@8
+UninstallRecognizer@4
+WriteHWL@8
diff --git a/winsup/w32api/lib/pkpd32.def b/winsup/w32api/lib/pkpd32.def
new file mode 100644
index 000000000..58fbc27ab
--- /dev/null
+++ b/winsup/w32api/lib/pkpd32.def
@@ -0,0 +1,36 @@
+LIBRARY PKPD32.DLL
+EXPORTS
+AddInksetInterval@8
+AddPointsPenData@16
+BoundingRectFromPoints@12
+CompressPenData@12
+CreateInkset@4
+CreatePenDataEx@16
+CreatePenDataRegion@8
+DestroyInkset@4
+DestroyPenData@4
+DrawPenDataEx@40
+DuplicatePenData@8
+ExtractPenDataPoints@28
+ExtractPenDataStrokes@20
+GetInksetInterval@12
+GetInksetIntervalCount@4
+GetPenDataAttributes@12
+GetPenDataInfo@16
+GetPointsFromPenData@20
+GetStrokeAttributes@16
+GetStrokeTableAttributes@16
+HitTestPenData@20
+InsertPenData@12
+InsertPenDataPoints@24
+InsertPenDataStroke@20
+MetricScalePenData@8
+OffsetPenData@12
+PenDataFromBuffer@20
+PenDataToBuffer@16
+RedisplayPenData@24
+RemovePenDataStrokes@12
+ResizePenData@8
+SetStrokeAttributes@16
+SetStrokeTableAttributes@16
+TrimPenData@12
diff --git a/winsup/w32api/lib/rapi.def b/winsup/w32api/lib/rapi.def
new file mode 100644
index 000000000..730faa294
--- /dev/null
+++ b/winsup/w32api/lib/rapi.def
@@ -0,0 +1,84 @@
+LIBRARY RAPI.DLL
+EXPORTS
+CeCheckPassword@4
+CeCloseHandle@4
+CeCopyFile@12
+CeCreateDatabase@16
+CeCreateDirectory@8
+CeCreateFile@28
+CeCreateProcess@40
+CeDeleteDatabase@4
+CeDeleteFile@4
+CeDeleteRecord@8
+CeFindAllDatabases@16
+CeFindAllFiles@16
+CeFindClose@4
+CeFindFirstDatabase@4
+CeFindFirstFile@8
+CeFindNextDatabase@4
+CeFindNextFile@8
+CeGetClassName@12
+CeGetDesktopDeviceCaps@4
+CeGetFileAttributes@4
+CeGetFileSize@8
+CeGetFileTime@16
+CeGetLastError@0
+CeGetSpecialFolderPath@12
+CeGetStoreInformation@4
+CeGetSystemInfo@4
+CeGetSystemMetrics@4
+CeGetSystemPowerStatusEx@8
+CeGetTempPath@8
+CeGetVersionEx@4
+CeGetWindow@8
+CeGetWindowLong@8
+CeGetWindowText@12
+CeGlobalMemoryStatus@4
+CeMoveFile@8
+CeOidGetInfo@8
+CeOpenDatabase@20
+CeRapiFreeBuffer@4
+CeRapiGetError@0
+CeRapiInit@0
+CeRapiInitEx@4
+CeRapiInvoke@32
+CeRapiUninit@0
+CeReadFile@20
+CeReadRecordProps@24
+CeRegCloseKey@4
+CeRegCreateKeyEx@36
+CeRegDeleteKey@8
+CeRegDeleteValue@8
+CeRegEnumKeyEx@32
+CeRegEnumValue@32
+CeRegOpenKeyEx@20
+CeRegQueryInfoKey@48
+CeRegQueryValueEx@24
+CeRegSetValueEx@24
+CeRemoveDirectory@4
+CeSHCreateShortcut@8
+CeSHGetShortcutTarget@12
+CeSeekDatabase@16
+CeSetDatabaseInfo@8
+CeSetEndOfFile@4
+CeSetFileAttributes@8
+CeSetFilePointer@16
+CeSetFileTime@16
+CeWriteFile@20
+CeWriteRecordProps@16
+GetRapiError@0
+RAPI_EXP_10@4
+RAPI_EXP_11@8
+RAPI_EXP_12@4
+RAPI_EXP_13@0
+RAPI_EXP_14@4
+RAPI_EXP_15@4
+RAPI_EXP_16@0
+RAPI_EXP_17@8
+RAPI_EXP_18@8
+RAPI_EXP_19@12
+RAPI_EXP_20@4
+RAPI_EXP_21@8
+RAPI_EXP_22@8
+RAPI_EXP_23@12
+RapiFreeBuffer@4
diff --git a/winsup/w32api/lib/rasapi32.def b/winsup/w32api/lib/rasapi32.def
new file mode 100644
index 000000000..289bc1c02
--- /dev/null
+++ b/winsup/w32api/lib/rasapi32.def
@@ -0,0 +1,33 @@
+LIBRARY RASAPI32.dll
+EXPORTS
+RasCreatePhonebookEntryA@8
+RasCreatePhonebookEntryW@8
+RasDialA@24
+RasDialW@24
+RasDialWow@20
+RasEditPhonebookEntryA@12
+RasEditPhonebookEntryW@12
+RasEnumConnectionsA@12
+RasEnumConnectionsW@12
+RasEnumConnectionsWow@12
+RasEnumEntriesA@20
+RasEnumEntriesW@20
+RasEnumEntriesWow@20
+RasGetConnectResponse@8
+RasGetConnectStatusA@8
+RasGetConnectStatusW@8
+RasGetConnectStatusWow@8
+RasGetEntryDialParamsA@12
+RasGetEntryDialParamsW@12
+RasGetErrorStringA@12
+RasGetErrorStringW@12
+RasGetErrorStringWow@12
+RasGetHport@4
+RasGetProjectionInfoA@16
+RasGetProjectionInfoW@16
+RasHangUpA@4
+RasHangUpW@4
+RasHangUpWow@4
+RasSetEntryDialParamsA@12
+RasSetEntryDialParamsW@12
+RasSetOldPassword@8
diff --git a/winsup/w32api/lib/res.rc b/winsup/w32api/lib/res.rc
new file mode 100644
index 000000000..1a3f751de
--- /dev/null
+++ b/winsup/w32api/lib/res.rc
@@ -0,0 +1,6 @@
+#include <windows.h>
+
+STRINGTABLE
+{
+ 100 "Dummy string"
+}
diff --git a/winsup/w32api/lib/rpcdce4.def b/winsup/w32api/lib/rpcdce4.def
new file mode 100644
index 000000000..43e96a7f3
--- /dev/null
+++ b/winsup/w32api/lib/rpcdce4.def
@@ -0,0 +1,26 @@
+LIBRARY RPCDCE4.dll
+EXPORTS
+DceErrorInqTextA@8
+DceErrorInqTextW@8
+MIDL_user_allocate@4
+MIDL_user_free@4
+RpcBindingToStringBindingA@8
+RpcBindingToStringBindingW@8
+RpcMgmtEpEltInqBegin@24
+RpcMgmtEpEltInqDone@4
+RpcMgmtEpEltInqNextA@20
+RpcMgmtEpEltInqNextW@20
+RpcMgmtEpUnregister@16
+RpcMgmtInqIfIds@8
+RpcMgmtInqServerPrincNameA@12
+RpcMgmtInqServerPrincNameW@12
+RpcMgmtInqStats@8
+RpcMgmtIsServerListening@4
+RpcMgmtSetAuthorizationFn@4
+RpcMgmtStopServerListening@4
+RpcServerListen@12
+UuidCompare@12
+UuidCreateNil@4
+UuidEqual@12
+UuidHash@8
+UuidIsNil@8
diff --git a/winsup/w32api/lib/rpcns4.def b/winsup/w32api/lib/rpcns4.def
new file mode 100644
index 000000000..7d005c365
--- /dev/null
+++ b/winsup/w32api/lib/rpcns4.def
@@ -0,0 +1,60 @@
+LIBRARY RPCNS4.dll
+EXPORTS
+I_GetDefaultEntrySyntax@0
+I_RpcNsGetBuffer@4
+I_RpcNsRaiseException@8
+I_RpcNsSendReceive@8
+I_RpcReBindBuffer@4
+RpcIfIdVectorFree@4
+RpcNsBindingExportA@20
+RpcNsBindingExportW@20
+RpcNsBindingImportBeginA@20
+RpcNsBindingImportBeginW@20
+RpcNsBindingImportDone@4
+RpcNsBindingImportNext@8
+RpcNsBindingLookupBeginA@24
+RpcNsBindingLookupBeginW@24
+RpcNsBindingLookupDone@4
+RpcNsBindingLookupNext@8
+RpcNsBindingSelect@8
+RpcNsBindingUnexportA@16
+RpcNsBindingUnexportW@16
+RpcNsEntryExpandNameA@12
+RpcNsEntryExpandNameW@12
+RpcNsEntryObjectInqBeginA@12
+RpcNsEntryObjectInqBeginW@12
+RpcNsEntryObjectInqDone@4
+RpcNsEntryObjectInqNext@8
+RpcNsGroupDeleteA@8
+RpcNsGroupDeleteW@8
+RpcNsGroupMbrAddA@16
+RpcNsGroupMbrAddW@16
+RpcNsGroupMbrInqBeginA@16
+RpcNsGroupMbrInqBeginW@16
+RpcNsGroupMbrInqDone@4
+RpcNsGroupMbrInqNextA@8
+RpcNsGroupMbrInqNextW@8
+RpcNsGroupMbrRemoveA@16
+RpcNsGroupMbrRemoveW@16
+RpcNsMgmtBindingUnexportA@20
+RpcNsMgmtBindingUnexportW@20
+RpcNsMgmtEntryCreateA@8
+RpcNsMgmtEntryCreateW@8
+RpcNsMgmtEntryDeleteA@8
+RpcNsMgmtEntryDeleteW@8
+RpcNsMgmtEntryInqIfIdsA@12
+RpcNsMgmtEntryInqIfIdsW@12
+RpcNsMgmtHandleSetExpAge@8
+RpcNsMgmtInqExpAge@4
+RpcNsMgmtSetExpAge@4
+RpcNsProfileDeleteA@8
+RpcNsProfileDeleteW@8
+RpcNsProfileEltAddA@28
+RpcNsProfileEltAddW@28
+RpcNsProfileEltInqBeginA@32
+RpcNsProfileEltInqBeginW@32
+RpcNsProfileEltInqDone@4
+RpcNsProfileEltInqNextA@20
+RpcNsProfileEltInqNextW@20
+RpcNsProfileEltRemoveA@20
+RpcNsProfileEltRemoveW@20
diff --git a/winsup/w32api/lib/rpcrt4.def b/winsup/w32api/lib/rpcrt4.def
new file mode 100644
index 000000000..d51bc723c
--- /dev/null
+++ b/winsup/w32api/lib/rpcrt4.def
@@ -0,0 +1,372 @@
+LIBRARY RPCRT4.dll
+EXPORTS
+CStdStubBuffer_AddRef@4
+CStdStubBuffer_Connect@8
+CStdStubBuffer_CountRefs@4
+CStdStubBuffer_DebugServerQueryInterface@8
+CStdStubBuffer_DebugServerRelease@8
+CStdStubBuffer_Disconnect@4
+CStdStubBuffer_Invoke@12
+CStdStubBuffer_IsIIDSupported@8
+CStdStubBuffer_QueryInterface@12
+DceErrorInqTextA@8
+DceErrorInqTextW@8
+IUnknown_AddRef_Proxy@4
+IUnknown_QueryInterface_Proxy@12
+IUnknown_Release_Proxy@4
+I_RpcAllocate@4
+I_RpcBindingCopy@8
+I_RpcBindingInqDynamicEndpoint@8
+I_RpcBindingInqTransportType@8
+I_RpcBindingIsClientLocal@8
+I_RpcClearMutex@4
+I_RpcConnectionInqSockBuffSize2@4
+I_RpcConnectionInqSockBuffSize@8
+I_RpcConnectionSetSockBuffSize@8
+I_RpcDeleteMutex@4
+I_RpcFree@4
+I_RpcFreeBuffer@4
+I_RpcGetAssociationContext@4
+_imp__I_RpcGetAssociationContext@4
+I_RpcGetBuffer@4
+I_RpcGetCurrentCallHandle@0
+I_RpcIOAlerted@4
+I_RpcIfInqTransferSyntaxes@16
+I_RpcMapWin32Status@4
+I_RpcMonitorAssociation@12
+I_RpcNsBindingSetEntryName@12
+I_RpcParseSecurity@8
+I_RpcPauseExecution@4
+I_RpcRequestMutex@4
+I_RpcSendReceive@4
+I_RpcServerRegisterForwardFunction@4
+I_RpcSetAssociationContext@4
+_imp__I_RpcSetAssociationContext@4
+I_RpcSsDontSerializeContext@0
+_imp__I_RpcSsDontSerializeContext@0
+I_RpcStopMonitorAssociation@4
+I_RpcTransClientMaxFrag@4
+I_RpcTransClientReallocBuffer@16
+I_RpcTransServerFindConnection@8
+I_RpcTransServerFreeBuffer@8
+I_RpcTransServerMaxFrag@4
+I_RpcTransServerNewConnection@12
+I_RpcTransServerProtectThread@0
+I_RpcTransServerReallocBuffer@16
+I_RpcTransServerReceiveDirectReady@4
+I_RpcTransServerUnprotectThread@4
+I_UuidCreate@4
+MIDL_wchar_strcpy@8
+MIDL_wchar_strlen@4
+MesBufferHandleReset@24
+MesDecodeBufferHandleCreate@12
+MesDecodeIncrementalHandleCreate@12
+MesEncodeDynBufferHandleCreate@12
+MesEncodeFixedBufferHandleCreate@16
+MesEncodeIncrementalHandleCreate@16
+MesHandleFree@4
+MesIncrementalHandleReset@24
+MesInqProcEncodingId@12
+NDRCContextBinding@4
+_imp__NDRCContextBinding@4
+NDRCContextMarshall@8
+_imp__NDRCContextMarshall@8
+NDRCContextUnmarshall@16
+_imp__NDRCContextUnmarshall@16
+NDRSContextMarshall@12
+_imp__NDRSContextMarshall@12
+NDRSContextUnmarshall@8
+_imp__NDRSContextUnmarshall@8
+NDRcopy@12
+NdrAllocate@8
+NdrByteCountPointerBufferSize@12
+NdrByteCountPointerFree@12
+NdrByteCountPointerMarshall@12
+NdrByteCountPointerUnmarshall@16
+NdrCStdStubBuffer2_Release@8
+NdrCStdStubBuffer_Release@8
+NdrClearOutParameters@12
+NdrClientCall
+NdrClientContextMarshall@12
+_imp__NdrClientContextMarshall@12
+NdrClientContextUnmarshall@12
+_imp__NdrClientContextUnmarshall@12
+NdrClientInitialize@16
+NdrClientInitializeNew@16
+NdrComplexArrayBufferSize@12
+NdrComplexArrayFree@12
+NdrComplexArrayMarshall@12
+NdrComplexArrayMemorySize@8
+NdrComplexArrayUnmarshall@16
+NdrComplexStructBufferSize@12
+NdrComplexStructFree@12
+NdrComplexStructMarshall@12
+NdrComplexStructMemorySize@8
+NdrComplexStructUnmarshall@16
+NdrConformantArrayBufferSize@12
+NdrConformantArrayFree@12
+NdrConformantArrayMarshall@12
+NdrConformantArrayMemorySize@8
+NdrConformantArrayUnmarshall@16
+NdrConformantStringBufferSize@12
+NdrConformantStringMarshall@12
+NdrConformantStringMemorySize@8
+NdrConformantStringUnmarshall@16
+NdrConformantStructBufferSize@12
+NdrConformantStructFree@12
+NdrConformantStructMarshall@12
+NdrConformantStructMemorySize@8
+NdrConformantStructUnmarshall@16
+NdrConformantVaryingArrayBufferSize@12
+NdrConformantVaryingArrayFree@12
+NdrConformantVaryingArrayMarshall@12
+NdrConformantVaryingArrayMemorySize@8
+NdrConformantVaryingArrayUnmarshall@16
+NdrConformantVaryingStructBufferSize@12
+NdrConformantVaryingStructFree@12
+NdrConformantVaryingStructMarshall@12
+NdrConformantVaryingStructMemorySize@8
+NdrConformantVaryingStructUnmarshall@16
+NdrContextHandleSize@12
+_imp__NdrContextHandleSize@12
+NdrConvert@8
+NdrDllCanUnloadNow@4
+NdrDllGetClassObject@24
+NdrDllRegisterProxy@12
+NdrDllUnregisterProxy@12
+NdrEncapsulatedUnionBufferSize@12
+NdrEncapsulatedUnionFree@12
+NdrEncapsulatedUnionMarshall@12
+NdrEncapsulatedUnionMemorySize@8
+NdrEncapsulatedUnionUnmarshall@16
+NdrFixedArrayBufferSize@12
+NdrFixedArrayFree@12
+NdrFixedArrayMarshall@12
+NdrFixedArrayMemorySize@8
+NdrFixedArrayUnmarshall@16
+NdrFreeBuffer@4
+NdrFullPointerFree@8
+NdrFullPointerInsertRefId@12
+NdrFullPointerQueryPointer@16
+NdrFullPointerQueryRefId@16
+NdrFullPointerXlatFree@4
+NdrFullPointerXlatInit@8
+NdrGetBuffer@12
+NdrHardStructBufferSize@12
+NdrHardStructFree@12
+NdrHardStructMarshall@12
+NdrHardStructMemorySize@8
+NdrHardStructUnmarshall@16
+NdrInterfacePointerBufferSize@12
+NdrInterfacePointerFree@12
+NdrInterfacePointerMarshall@12
+NdrInterfacePointerMemorySize@8
+NdrInterfacePointerUnmarshall@16
+NdrMapCommAndFaultStatus@16
+NdrMesProcEncodeDecode
+NdrMesSimpleTypeAlignSize@4
+NdrMesSimpleTypeDecode@12
+NdrMesSimpleTypeEncode@16
+NdrMesTypeAlignSize@16
+NdrMesTypeDecode@16
+NdrMesTypeEncode@16
+NdrNonConformantStringBufferSize@12
+NdrNonConformantStringMarshall@12
+NdrNonConformantStringMemorySize@8
+NdrNonConformantStringUnmarshall@16
+NdrNonEncapsulatedUnionBufferSize@12
+NdrNonEncapsulatedUnionFree@12
+NdrNonEncapsulatedUnionMarshall@12
+NdrNonEncapsulatedUnionMemorySize@8
+NdrNonEncapsulatedUnionUnmarshall@16
+NdrNsGetBuffer@12
+NdrNsSendReceive@12
+NdrOleAllocate@4
+NdrOleFree@4
+NdrPointerBufferSize@12
+NdrPointerFree@12
+NdrPointerMarshall@12
+NdrPointerMemorySize@8
+NdrPointerUnmarshall@16
+NdrProxyErrorHandler@4
+NdrProxyFreeBuffer@8
+NdrProxyGetBuffer@8
+NdrProxyInitialize@20
+NdrProxySendReceive@8
+NdrRpcSmClientAllocate@4
+NdrRpcSmClientFree@4
+NdrRpcSmSetClientToOsf@4
+NdrRpcSsDefaultAllocate@4
+NdrRpcSsDefaultFree@4
+NdrRpcSsDisableAllocate@4
+NdrRpcSsEnableAllocate@4
+NdrSendReceive@8
+NdrServerCall@4
+NdrServerContextMarshall@12
+_imp__NdrServerContextMarshall@12
+NdrServerContextUnmarshall@4
+_imp__NdrServerContextUnmarshall@4
+NdrServerInitialize@12
+NdrServerInitializeMarshall@8
+NdrServerInitializeNew@12
+NdrServerInitializeUnmarshall@12
+NdrServerMarshall@16
+NdrServerUnmarshall@24
+NdrSimpleStructBufferSize@12
+NdrSimpleStructFree@12
+NdrSimpleStructMarshall@12
+NdrSimpleStructMemorySize@8
+NdrSimpleStructUnmarshall@16
+NdrSimpleTypeMarshall@12
+NdrSimpleTypeUnmarshall@12
+NdrStubCall@16
+NdrStubForwardingFunction@16
+NdrStubGetBuffer@12
+NdrStubInitialize@16
+NdrStubInitializeMarshall@12
+NdrVaryingArrayBufferSize@12
+NdrVaryingArrayFree@12
+NdrVaryingArrayMarshall@12
+NdrVaryingArrayMemorySize@8
+NdrVaryingArrayUnmarshall@16
+NdrXmitOrRepAsBufferSize@12
+NdrXmitOrRepAsFree@12
+NdrXmitOrRepAsMarshall@12
+NdrXmitOrRepAsMemorySize@8
+NdrXmitOrRepAsUnmarshall@16
+RpcBindingCopy@8
+RpcBindingFree@4
+RpcBindingFromStringBindingA@8
+RpcBindingFromStringBindingW@8
+RpcBindingInqAuthClientA@24
+RpcBindingInqAuthClientW@24
+RpcBindingInqAuthInfoA@24
+RpcBindingInqAuthInfoW@24
+RpcBindingInqObject@8
+RpcBindingReset@4
+RpcBindingServerFromClient@8
+RpcBindingSetAuthInfoA@24
+RpcBindingSetAuthInfoW@24
+RpcBindingSetObject@8
+RpcBindingToStringBindingA@8
+RpcBindingToStringBindingW@8
+RpcBindingVectorFree@4
+RpcCancelThread@4
+RpcEpRegisterA@16
+RpcEpRegisterNoReplaceA@16
+RpcEpRegisterNoReplaceW@16
+RpcEpRegisterW@16
+RpcEpResolveBinding@8
+RpcEpUnregister@12
+RpcIfIdVectorFree@4
+RpcIfInqId@8
+RpcImpersonateClient@4
+RpcMgmtEnableIdleCleanup@0
+RpcMgmtEpEltInqBegin@24
+RpcMgmtEpEltInqDone@4
+RpcMgmtEpEltInqNextA@20
+RpcMgmtEpEltInqNextW@20
+RpcMgmtEpUnregister@16
+RpcMgmtInqComTimeout@8
+RpcMgmtInqDefaultProtectLevel@8
+RpcMgmtInqIfIds@8
+RpcMgmtInqServerPrincNameA@12
+RpcMgmtInqServerPrincNameW@12
+RpcMgmtInqStats@8
+RpcMgmtIsServerListening@4
+RpcMgmtSetAuthorizationFn@4
+RpcMgmtSetCancelTimeout@4
+RpcMgmtSetComTimeout@8
+RpcMgmtSetServerStackSize@4
+RpcMgmtStatsVectorFree@4
+RpcMgmtStopServerListening@4
+RpcMgmtWaitServerListen@0
+RpcNetworkInqProtseqsA@4
+RpcNetworkInqProtseqsW@4
+RpcNetworkIsProtseqValidA@4
+RpcNetworkIsProtseqValidW@4
+RpcNsBindingInqEntryNameA@12
+RpcNsBindingInqEntryNameW@12
+RpcObjectInqType@8
+RpcObjectSetInqFn@4
+RpcObjectSetType@8
+RpcProtseqVectorFreeA@4
+RpcProtseqVectorFreeW@4
+RpcRaiseException@4
+RpcRevertToSelf@0
+RpcServerInqBindings@4
+RpcServerInqDefaultPrincNameA@8
+RpcServerInqDefaultPrincNameW@8
+RpcServerInqIf@12
+RpcServerListen@12
+RpcServerRegisterAuthInfoA@16
+RpcServerRegisterAuthInfoW@16
+RpcServerRegisterIf@12
+RpcServerUnregisterIf@12
+RpcServerUseAllProtseqs@8
+RpcServerUseAllProtseqsIf@12
+RpcServerUseProtseqA@12
+RpcServerUseProtseqEpA@16
+RpcServerUseProtseqEpW@16
+RpcServerUseProtseqIfA@16
+RpcServerUseProtseqIfW@16
+RpcServerUseProtseqW@12
+RpcSmAllocate@8
+RpcSmClientFree@4
+RpcSmDestroyClientContext@4
+_imp__RpcSmDestroyClientContext@4
+RpcSmDisableAllocate@0
+RpcSmEnableAllocate@0
+RpcSmFree@4
+RpcSmGetThreadHandle@4
+RpcSmSetClientAllocFree@8
+RpcSmSetThreadHandle@4
+RpcSmSwapClientAllocFree@16
+RpcSsAllocate@4
+RpcSsDestroyClientContext@4
+_imp__RpcSsDestroyClientContext@4
+RpcSsDisableAllocate@0
+RpcSsEnableAllocate@0
+RpcSsFree@4
+RpcSsGetThreadHandle@0
+RpcSsSetClientAllocFree@8
+RpcSsSetThreadHandle@4
+RpcSsSwapClientAllocFree@16
+RpcStringBindingComposeA@24
+RpcStringBindingComposeW@24
+RpcStringBindingParseA@24
+RpcStringBindingParseW@24
+RpcStringFreeA@4
+RpcStringFreeW@4
+RpcTestCancel@0
+TowerConstruct@24
+TowerExplode@24
+UuidCompare@12
+UuidCreate@4
+UuidCreateNil@4
+UuidEqual@12
+UuidFromStringA@8
+UuidFromStringW@8
+UuidHash@8
+UuidIsNil@8
+UuidToStringA@8
+UuidToStringW@8
+char_array_from_ndr@16
+char_from_ndr@8
+data_from_ndr@16
+data_into_ndr@16
+data_size_ndr@16
+double_array_from_ndr@16
+double_from_ndr@8
+enum_from_ndr@8
+float_array_from_ndr@16
+float_from_ndr@8
+long_array_from_ndr@16
+long_from_ndr@8
+long_from_ndr_temp@12
+short_array_from_ndr@16
+short_from_ndr@8
+short_from_ndr_temp@12
+tree_into_ndr@16
+tree_peek_ndr@16
+tree_size_ndr@16
diff --git a/winsup/w32api/lib/scrnsave.c b/winsup/w32api/lib/scrnsave.c
new file mode 100644
index 000000000..ddad88409
--- /dev/null
+++ b/winsup/w32api/lib/scrnsave.c
@@ -0,0 +1,406 @@
+/*
+ Screen saver library by Anders Norlander <anorland@hem2.passagen.se>
+
+ This library is (hopefully) compatible with Microsoft's
+ screen saver library.
+
+ This is public domain software.
+
+ */
+#include <windows.h>
+#include <scrnsave.h>
+#include <regstr.h>
+
+/* screen saver window class */
+#define CLASS_SCRNSAVE TEXT("WindowsScreenSaverClass")
+
+/* globals */
+HWND hMainWindow = NULL;
+BOOL fChildPreview = FALSE;
+HINSTANCE hMainInstance;
+TCHAR szName[TITLEBARNAMELEN];
+TCHAR szAppName[APPNAMEBUFFERLEN];
+TCHAR szIniFile[MAXFILELEN];
+TCHAR szScreenSaver[22];
+TCHAR szHelpFile[MAXFILELEN];
+TCHAR szNoHelpMemory[BUFFLEN];
+UINT MyHelpMessage;
+
+/* local house keeping */
+static HINSTANCE hPwdLib = NULL;
+static POINT pt_orig;
+static BOOL checking_pwd = FALSE;
+static BOOL closing = FALSE;
+static BOOL w95 = FALSE;
+
+typedef BOOL (WINAPI *VERIFYPWDPROC)(HWND);
+typedef DWORD (WINAPI *CHPWDPROC)(LPCTSTR, HWND, DWORD, PVOID);
+static VERIFYPWDPROC VerifyScreenSavePwd = NULL;
+
+/* function names */
+#define szVerifyPassword "VerifyScreenSavePwd"
+
+#ifdef UNICODE
+#define szPwdChangePassword "PwdChangePasswordW"
+#else
+#define szPwdChangePassword "PwdChangePasswordA"
+#endif
+
+static void TerminateScreenSaver(HWND hWnd);
+static BOOL RegisterClasses(void);
+static LRESULT WINAPI SysScreenSaverProc(HWND,UINT,WPARAM,LPARAM);
+static int LaunchScreenSaver(HWND hParent);
+static void LaunchConfig(void);
+
+static int ISSPACE(char c)
+{
+ return (c == ' ' || c == '\t');
+}
+
+#define ISNUM(c) ((c) >= '0' && c <= '9')
+static unsigned long
+_toul(const char *s)
+{
+ unsigned long res;
+ unsigned long n;
+ const char *p;
+ for (p = s; *p; p++)
+ if (!ISNUM(*p)) break;
+ p--;
+ res = 0;
+ for (n = 1; p >= s; p--, n *= 10)
+ res += (*p - '0') * n;
+ return res;
+}
+
+/* screen saver entry point */
+int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE hPrevInst,
+ LPSTR CmdLine, int nCmdShow)
+{
+ LPSTR p;
+ OSVERSIONINFO vi;
+
+ /* initialize */
+ hMainInstance = hInst;
+
+ vi.dwOSVersionInfoSize = sizeof(vi);
+ GetVersionEx(&vi);
+ /* check if we are going to check for passwords */
+ if (vi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)
+ {
+ HKEY hKey;
+ /* we are using windows 95 */
+ w95 = TRUE;
+ if (RegOpenKey(HKEY_CURRENT_USER, REGSTR_PATH_SCREENSAVE ,&hKey) ==
+ ERROR_SUCCESS)
+ {
+ DWORD check_pwd;
+ DWORD size = sizeof(DWORD);
+ DWORD type;
+ LONG res;
+ res = RegQueryValueEx(hKey, REGSTR_VALUE_USESCRPASSWORD,
+ NULL, &type, (PBYTE) &check_pwd, &size);
+ if (check_pwd && res == ERROR_SUCCESS)
+ {
+ hPwdLib = LoadLibrary(TEXT("PASSWORD.CPL"));
+ if (hPwdLib)
+ VerifyScreenSavePwd = GetProcAddress(hPwdLib, szVerifyPassword);
+ }
+ RegCloseKey(hKey);
+ }
+ }
+
+ /* parse arguments */
+ for (p = CmdLine; *p; p++)
+ {
+ switch (*p)
+ {
+ case 'S':
+ case 's':
+ /* start screen saver */
+ return LaunchScreenSaver(NULL);
+
+ case 'P':
+ case 'p':
+ {
+ /* start screen saver in preview window */
+ HWND hParent;
+ fChildPreview = TRUE;
+ while (ISSPACE(*++p));
+ hParent = (HWND) _toul(p);
+ if (hParent && IsWindow(hParent))
+ return LaunchScreenSaver(hParent);
+ }
+ return 0;
+
+ case 'C':
+ case 'c':
+ /* display configure dialog */
+ LaunchConfig();
+ return 0;
+
+ case 'A':
+ case 'a':
+ {
+ /* change screen saver password */
+ HWND hParent;
+ while (ISSPACE(*++p));
+ hParent = (HWND) _toul(p);
+ if (!hParent || !IsWindow(hParent))
+ hParent = GetForegroundWindow();
+ ScreenSaverChangePassword(hParent);
+ }
+ return 0;
+
+ case '-':
+ case '/':
+ case ' ':
+ default:
+ }
+ }
+ LaunchConfig();
+ return 0;
+}
+
+static void LaunchConfig(void)
+{
+ /* FIXME: should this be called */
+ RegisterDialogClasses(hMainInstance);
+ /* display configure dialog */
+ DialogBox(hMainInstance, MAKEINTRESOURCE(DLG_SCRNSAVECONFIGURE),
+ GetForegroundWindow(), (DLGPROC) ScreenSaverConfigureDialog);
+}
+
+
+static int LaunchScreenSaver(HWND hParent)
+{
+ BOOL foo;
+ UINT style;
+ RECT rc;
+ MSG msg;
+
+ /* don't allow other tasks to get into the foreground */
+ if (w95 && !fChildPreview)
+ SystemParametersInfo(SPI_SCREENSAVERRUNNING, TRUE, &foo, 0);
+
+ msg.wParam = 0;
+
+ /* register classes, both user defined and classes used by screen saver
+ library */
+ if (!RegisterClasses())
+ {
+ MessageBox(NULL, TEXT("RegisterClasses() failed"), NULL, MB_ICONHAND);
+ goto restore;
+ }
+
+ /* a slightly different approach needs to be used when displaying
+ in a preview window */
+ if (hParent)
+ {
+ style = WS_CHILD;
+ GetClientRect(hParent, &rc);
+ }
+ else
+ {
+ style = WS_POPUP;
+ rc.right = GetSystemMetrics(SM_CXSCREEN);
+ rc.bottom = GetSystemMetrics(SM_CYSCREEN);
+ style |= WS_VISIBLE;
+ }
+
+ /* create main screen saver window */
+ hMainWindow = CreateWindowEx(hParent ? 0 : WS_EX_TOPMOST, CLASS_SCRNSAVE,
+ TEXT("SCREENSAVER"), style,
+ 0, 0, rc.right, rc.bottom, hParent, NULL,
+ hMainInstance, NULL);
+
+ /* display window and start pumping messages */
+ if (hMainWindow)
+ {
+ UpdateWindow(hMainWindow);
+ ShowWindow(hMainWindow, SW_SHOW);
+
+ while (GetMessage(&msg, NULL, 0, 0) == TRUE)
+ {
+ TranslateMessage(&msg);
+ DispatchMessage(&msg);
+ }
+ }
+
+restore:
+ /* restore system */
+ if (w95 && !fChildPreview)
+ SystemParametersInfo(SPI_SCREENSAVERRUNNING, FALSE, &foo, 0);
+ FreeLibrary(hPwdLib);
+ return msg.wParam;
+}
+
+/* this function takes care of *must* do tasks, like terminating
+ screen saver */
+static LRESULT WINAPI SysScreenSaverProc(HWND hWnd, UINT msg,
+ WPARAM wParam, LPARAM lParam)
+{
+ switch (msg)
+ {
+ case WM_CREATE:
+ if (!fChildPreview)
+ SetCursor(NULL);
+ /* mouse is not supposed to move from this position */
+ GetCursorPos(&pt_orig);
+ break;
+ case WM_DESTROY:
+ PostQuitMessage(0);
+ break;
+ case WM_TIMER:
+ if (closing)
+ return 0;
+ break;
+ case WM_PAINT:
+ if (closing)
+ return DefWindowProc(hWnd, msg, wParam, lParam);
+ break;
+ case WM_SYSCOMMAND:
+ if (!fChildPreview)
+ switch (wParam)
+ {
+ case SC_CLOSE:
+ case SC_SCREENSAVE:
+ case SC_NEXTWINDOW:
+ case SC_PREVWINDOW:
+ return FALSE;
+ }
+ break;
+ case WM_MOUSEMOVE:
+ case WM_LBUTTONDOWN:
+ case WM_RBUTTONDOWN:
+ case WM_MBUTTONDOWN:
+ case WM_KEYDOWN:
+ case WM_SYSKEYDOWN:
+ case WM_NCACTIVATE:
+ case WM_ACTIVATE:
+ case WM_ACTIVATEAPP:
+ if (closing)
+ return DefWindowProc(hWnd, msg, wParam, lParam);
+ break;
+ }
+ return ScreenSaverProc(hWnd, msg, wParam, lParam);
+}
+
+LONG WINAPI DefScreenSaverProc(HWND hWnd, UINT msg,
+ WPARAM wParam, LPARAM lParam)
+{
+ /* don't do any special processing when in preview mode */
+ if (fChildPreview || closing)
+ return DefWindowProc(hWnd, msg, wParam, lParam);
+
+ switch (msg)
+ {
+ case WM_CLOSE:
+ TerminateScreenSaver(hWnd);
+ /* do NOT pass this to DefWindowProc; it will terminate even if
+ an invalid password was given.
+ */
+ return 0;
+ case SCRM_VERIFYPW:
+ /* verify password or return TRUE if password checking is turned off */
+ if (VerifyScreenSavePwd)
+ return VerifyScreenSavePwd(hWnd);
+ else
+ return TRUE;
+ case WM_SETCURSOR:
+ if (checking_pwd)
+ break;
+ SetCursor(NULL);
+ return TRUE;
+ case WM_NCACTIVATE:
+ case WM_ACTIVATE:
+ case WM_ACTIVATEAPP:
+ if (wParam != FALSE)
+ break;
+ case WM_MOUSEMOVE:
+ {
+ POINT pt;
+ GetCursorPos(&pt);
+ if (pt.x == pt_orig.x && pt.y == pt_orig.y)
+ break;
+ }
+ case WM_LBUTTONDOWN:
+ case WM_RBUTTONDOWN:
+ case WM_MBUTTONDOWN:
+ case WM_KEYDOWN:
+ case WM_SYSKEYDOWN:
+ /* try to terminate screen saver */
+ if (!checking_pwd)
+ PostMessage(hWnd, WM_CLOSE, 0, 0);
+ break;
+ }
+ return DefWindowProc(hWnd, msg, wParam, lParam);
+}
+
+static void TerminateScreenSaver(HWND hWnd)
+{
+ /* don't allow recursion */
+ if (checking_pwd || closing)
+ return;
+
+ /* verify password */
+ if (VerifyScreenSavePwd)
+ {
+ checking_pwd = TRUE;
+ closing = SendMessage(hWnd, SCRM_VERIFYPW, 0, 0);
+ checking_pwd = FALSE;
+ }
+ else
+ closing = TRUE;
+
+ /* are we closing? */
+ if (closing)
+ {
+ DestroyWindow(hWnd);
+ }
+ else
+ GetCursorPos(&pt_orig); /* if not: get new mouse position */
+}
+
+/*
+ Register screen saver window class and call user
+ supplied hook.
+ */
+static BOOL RegisterClasses(void)
+{
+ WNDCLASS cls;
+
+ cls.hCursor = NULL;
+ cls.hIcon = LoadIcon(hMainInstance, MAKEINTATOM(ID_APP));
+ cls.lpszMenuName = NULL;
+ cls.lpszClassName = CLASS_SCRNSAVE;
+ cls.hbrBackground = GetStockObject(BLACK_BRUSH);
+ cls.hInstance = hMainInstance;
+ cls.style = CS_VREDRAW | CS_HREDRAW | CS_SAVEBITS | CS_PARENTDC;
+ cls.lpfnWndProc = (WNDPROC) SysScreenSaverProc;
+ cls.cbWndExtra = 0;
+ cls.cbClsExtra = 0;
+
+ if (!RegisterClass(&cls))
+ return FALSE;
+
+ return RegisterDialogClasses(hMainInstance);
+}
+
+void WINAPI ScreenSaverChangePassword(HWND hParent)
+{
+ /* load Master Password Router (MPR) */
+ HINSTANCE hMpr = LoadLibrary(TEXT("MPR.DLL"));
+
+ if (hMpr)
+ {
+ CHPWDPROC ChangePassword;
+ ChangePassword = (CHPWDPROC) GetProcAddress(hMpr, szPwdChangePassword);
+
+ /* change password for screen saver provider */
+ if (ChangePassword)
+ ChangePassword(TEXT("SCRSAVE"), hParent, 0, NULL);
+
+ FreeLibrary(hMpr);
+ }
+}
diff --git a/winsup/w32api/lib/shell32.c b/winsup/w32api/lib/shell32.c
new file mode 100644
index 000000000..3525ed9d7
--- /dev/null
+++ b/winsup/w32api/lib/shell32.c
@@ -0,0 +1,51 @@
+#define INITGUID
+#include <basetyps.h>
+#include <shlguid.h>
+
+DEFINE_SHLGUID(CLSID_ShellDesktop,0x00021400L,0,0);
+DEFINE_SHLGUID(CLSID_ShellLink,0x00021401L,0,0);
+DEFINE_SHLGUID(FMTID_Intshcut,0x000214A0L,0,0);
+DEFINE_SHLGUID(FMTID_InternetSite,0x000214A1L,0,0);
+DEFINE_SHLGUID(CGID_Explorer,0x000214D0L,0,0);
+DEFINE_SHLGUID(CGID_ShellDocView,0x000214D1L,0,0);
+DEFINE_SHLGUID(IID_INewShortcutHookA,0x000214E1L,0,0);
+DEFINE_SHLGUID(IID_IShellBrowser,0x000214E2L,0,0);
+DEFINE_SHLGUID(IID_IShellView,0x000214E3L,0,0);
+DEFINE_SHLGUID(IID_IContextMenu,0x000214E4L,0,0);
+DEFINE_SHLGUID(IID_IShellIcon,0x000214E5L,0,0);
+DEFINE_SHLGUID(IID_IShellFolder,0x000214E6L,0,0);
+DEFINE_SHLGUID(IID_IShellExtInit,0x000214E8L,0,0);
+DEFINE_SHLGUID(IID_IShellPropSheetExt,0x000214E9L,0,0);
+DEFINE_SHLGUID(IID_IPersistFolder,0x000214EAL,0,0);
+DEFINE_SHLGUID(IID_IExtractIconA,0x000214EBL,0,0);
+DEFINE_SHLGUID(IID_IShellLinkA,0x000214EEL,0,0);
+DEFINE_SHLGUID(IID_IShellCopyHookA,0x000214EFL,0,0);
+DEFINE_SHLGUID(IID_IFileViewerA,0x000214F0L,0,0);
+DEFINE_SHLGUID(IID_ICommDlgBrowser,0x000214F1L,0,0);
+DEFINE_SHLGUID(IID_IEnumIDList,0x000214F2L,0,0);
+DEFINE_SHLGUID(IID_IFileViewerSite,0x000214F3L,0,0);
+DEFINE_SHLGUID(IID_IContextMenu2,0x000214F4L,0,0);
+DEFINE_SHLGUID(IID_IShellExecuteHookA,0x000214F5L,0,0);
+DEFINE_SHLGUID(IID_IPropSheetPage,0x000214F6L,0,0);
+DEFINE_SHLGUID(IID_INewShortcutHookW,0x000214F7L,0,0);
+DEFINE_SHLGUID(IID_IFileViewerW,0x000214F8L,0,0);
+DEFINE_SHLGUID(IID_IShellLinkW,0x000214F9L,0,0);
+DEFINE_SHLGUID(IID_IExtractIconW,0x000214FAL,0,0);
+DEFINE_SHLGUID(IID_IShellExecuteHookW,0x000214FBL,0,0);
+DEFINE_SHLGUID(IID_IShellCopyHookW,0x000214FCL,0,0);
+DEFINE_GUID(IID_IShellView2,0x88E39E80L,0x3578,0x11CF,0xAE,0x69,0x08,0x00,0x2B,0x2E,0x12,0x62);
+DEFINE_GUID(LIBID_SHDocVw,0xEAB22AC0,0x30C1,0x11CF,0xA7,0xEB,0x00,0x00,0xC0,0x5B,0xAE,0x0B);
+DEFINE_GUID(IID_IShellExplorer,0xEAB22AC1,0x30C1,0x11CF,0xA7,0xEB,0x00,0x00,0xC0,0x5B,0xAE,0x0B);
+DEFINE_GUID(DIID_DShellExplorerEvents,0xEAB22AC2,0x30C1,0x11CF,0xA7,0xEB,0x00,0x00,0xC0,0x5B,0xAE,0x0B);
+DEFINE_GUID(CLSID_ShellExplorer,0xEAB22AC3,0x30C1,0x11CF,0xA7,0xEB,0x00,0x00,0xC0,0x5B,0xAE,0x0B);
+DEFINE_GUID(IID_ISHItemOC,0xEAB22AC4,0x30C1,0x11CF,0xA7,0xEB,0x00,0x00,0xC0,0x5B,0xAE,0x0B);
+DEFINE_GUID(DIID_DSHItemOCEvents,0xEAB22AC5,0x30C1,0x11CF,0xA7,0xEB,0x00,0x00,0xC0,0x5B,0xAE,0x0B);
+DEFINE_GUID(CLSID_SHItemOC,0xEAB22AC6,0x30C1,0x11CF,0xA7,0xEB,0x00,0x00,0xC0,0x5B,0xAE,0x0B);
+DEFINE_GUID(IID_DHyperLink,0x0002DF07,0x0000,0x0000,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46);
+DEFINE_GUID(IID_DIExplorer,0x0002DF05,0x0000,0x0000,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46);
+DEFINE_GUID(DIID_DExplorerEvents,0x0002DF06,0x0000,0x0000,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46);
+DEFINE_GUID(CLSID_InternetExplorer,0x0002DF01,0x0000,0x0000,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46);
+DEFINE_GUID(CLSID_StdHyperLink,0x0002DF09,0x0000,0x0000,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46);
+DEFINE_GUID(CLSID_FileTypes,0xB091E540,0x83E3,0x11CF,0xA7,0x13,0x00,0x20,0xAF,0xD7,0x97,0x62);
+DEFINE_GUID(CLSID_InternetShortcut,0xFBF23B40L,0xE3F0,0x101B,0x84,0x88,0x00,0xAA,0x00,0x3E,0x56,0xF8);
+DEFINE_GUID(IID_IUniformResourceLocator,0xFBF23B80L,0xE3F0,0x101B,0x84,0x88,0x00,0xAA,0x00,0x3E,0x56,0xF8);
diff --git a/winsup/w32api/lib/shell32.def b/winsup/w32api/lib/shell32.def
new file mode 100644
index 000000000..81e02387b
--- /dev/null
+++ b/winsup/w32api/lib/shell32.def
@@ -0,0 +1,123 @@
+LIBRARY SHELL32.DLL
+EXPORTS
+WOWShellExecute@28
+StrStrW@8
+StrStrIW@8
+StrStrIA@8
+StrStrA@8
+StrRStrW@12
+StrRStrIW@12
+StrRStrIA@12
+StrRStrA@12
+StrRChrW@12
+StrRChrIW@12
+StrRChrIA@12
+StrRChrA@12
+StrNCpyW@12
+StrNCpyA@12
+StrNCmpW@12
+StrNCmpIW@12
+StrNCmpIA@12
+StrNCmpA@12
+StrCpyNW@12
+StrCpyNA@12
+StrCmpNW@12
+StrCmpNIW@12
+StrCmpNIA@12
+StrCmpNA@12
+StrChrW@8
+StrChrIW@8
+StrChrIA@8
+StrChrA@8
+Shell_NotifyIconW@8
+Shell_NotifyIconA@8
+Shell_NotifyIcon@8
+ShellHookProc@12
+ShellExecuteW@24
+ShellExecuteExW@4
+ShellExecuteExA@4
+ShellExecuteEx@4
+ShellExecuteA@24
+ShellAboutW@16
+ShellAboutA@16
+SheShortenPathW@8
+SheShortenPathA@8
+SheSetCurDrive@4
+SheRemoveQuotesW@4
+SheRemoveQuotesA@4
+SheGetPathOffsetW@4
+SheGetDirW@8
+SheGetDirExW@12
+SheGetDirA@8
+SheGetCurDrive@0
+SheFullPathW@12
+SheFullPathA@12
+SheConvertPathW@12
+SheChangeDirW@4
+SheChangeDirExW@4
+SheChangeDirExA@4
+SheChangeDirA@4
+SHLoadInProc@4
+SHHelpShortcuts_RunDLL@16
+SHGetSpecialFolderLocation@12
+SHGetPathFromIDListW@8
+SHGetPathFromIDListA@8
+SHGetPathFromIDList@8
+SHGetMalloc@4
+SHGetInstanceExplorer@4
+SHGetFileInfoW@20
+SHGetFileInfoA@20
+SHGetFileInfo@20
+SHGetDesktopFolder@4
+SHFreeNameMappings@4
+SHFormatDrive@16
+SHFileOperationW@4
+SHFileOperationA@4
+SHFileOperation@4
+SHChangeNotify@16
+SHBrowseForFolderW@4
+SHBrowseForFolderA@4
+SHBrowseForFolder@4
+SHAppBarMessage@8
+SHAddToRecentDocs@8
+RegisterShellHook@8
+RegenerateUserEnvironment@8
+RealShellExecuteW@40
+RealShellExecuteExW@44
+RealShellExecuteExA@44
+RealShellExecuteA@40
+PrintersGetCommand_RunDLL@16
+OpenAs_RunDLL@16
+InternalExtractIconListW@12
+InternalExtractIconListA@12
+FreeIconList@8
+FindExecutableW@12
+FindExecutableA@12
+FindExeDlgProc@16
+ExtractVersionResource16W@8
+ExtractIconW@12
+ExtractIconResInfoW@20
+ExtractIconResInfoA@20
+ExtractIconExW@20
+ExtractIconExA@20
+ExtractIconEx@20
+ExtractIconA@12
+ExtractAssociatedIconW@12
+ExtractAssociatedIconExW@16
+ExtractAssociatedIconExA@16
+ExtractAssociatedIconA@12
+DuplicateIcon@8
+DragQueryPoint@8
+DragQueryFileW@16
+DragQueryFileAorW@24
+DragQueryFileA@16
+DragQueryFile@16
+DragFinish@4
+DragAcceptFiles@8
+DoEnvironmentSubstW@8
+DoEnvironmentSubstA@8
+Control_RunDLL@16
+Control_FillCache_RunDLL@16
+CommandLineToArgvW@8
+CheckEscapesW@8
+CheckEscapesA@8
diff --git a/winsup/w32api/lib/svrapi.def b/winsup/w32api/lib/svrapi.def
new file mode 100644
index 000000000..4a7b0dba6
--- /dev/null
+++ b/winsup/w32api/lib/svrapi.def
@@ -0,0 +1,22 @@
+LIBRARY SVRAPI.DLL
+EXPORTS
+NetAccessAdd@16
+NetAccessCheck@20
+NetAccessDel@8
+NetAccessEnum@32
+NetAccessGetInfo@24
+NetAccessGetUserPerms@16
+NetAccessSetInfo@24
+NetConnectionEnum@28
+NetFileClose2@8
+NetFileEnum@28
+NetSecurityGetInfo@20
+NetServerGetInfo@20
+NetSessionDel@12
+NetSessionEnum@24
+NetSessionGetInfo@24
+NetShareAdd@16
+NetShareDel@12
+NetShareEnum@24
+NetShareGetInfo@24
+NetShareSetInfo@24
diff --git a/winsup/w32api/lib/tapi32.def b/winsup/w32api/lib/tapi32.def
new file mode 100644
index 000000000..e4f0d9c8d
--- /dev/null
+++ b/winsup/w32api/lib/tapi32.def
@@ -0,0 +1,116 @@
+LIBRARY TAPI32.DLL
+EXPORTS
+lineAccept@12
+lineAddProvider@12
+lineAddToConference@8
+lineAnswer@12
+lineBlindTransfer@12
+lineClose@4
+lineCompleteCall@16
+lineCompleteTransfer@16
+lineConfigDialog@12
+lineConfigDialogEdit@24
+lineConfigProvider@8
+lineDeallocateCall@4
+lineDevSpecific@20
+lineDevSpecificFeature@16
+lineDial@12
+lineDrop@12
+lineForward@28
+lineGatherDigits@28
+lineGenerateDigits@16
+lineGenerateTone@20
+lineGetAddressCaps@24
+lineGetAddressID@20
+lineGetAddressStatus@12
+lineGetAppPriority@24
+lineGetCallInfo@8
+lineGetCallStatus@8
+lineGetConfRelatedCalls@8
+lineGetCountry@12
+lineGetDevCaps@20
+lineGetDevConfig@12
+lineGetID@24
+lineGetIcon@12
+lineGetLineDevStatus@8
+lineGetNewCalls@16
+lineGetNumRings@12
+lineGetProviderList@8
+lineGetRequest@12
+lineGetStatusMessages@12
+lineGetTranslateCaps@12
+lineHandoff@12
+lineHold@4
+lineInitialize@20
+lineMakeCall@20
+lineMonitorDigits@8
+lineMonitorMedia@8
+lineMonitorTones@12
+lineNegotiateAPIVersion@24
+lineNegotiateExtVersion@24
+lineOpen@36
+linePark@16
+linePickup@20
+linePrepareAddToConference@12
+lineRedirect@12
+lineRegisterRequestRecipient@16
+lineReleaseUserUserInfo@4
+lineRemoveFromConference@4
+lineRemoveProvider@8
+lineSecureCall@4
+lineSendUserUserInfo@12
+lineSetAppPriority@24
+lineSetAppSpecific@8
+lineSetCallParams@20
+lineSetCallPrivilege@8
+lineSetCurrentLocation@8
+lineSetDevConfig@16
+lineSetMediaControl@48
+lineSetMediaMode@8
+lineSetNumRings@12
+lineSetStatusMessages@12
+lineSetTerminal@28
+lineSetTollList@16
+lineSetupConference@24
+lineSetupTransfer@12
+lineShutdown@4
+lineSwapHold@8
+lineTranslateAddress@28
+lineTranslateDialog@20
+lineUncompleteCall@8
+lineUnhold@4
+lineUnpark@16
+phoneClose@4
+phoneConfigDialog@12
+phoneDevSpecific@12
+phoneGetButtonInfo@12
+phoneGetData@16
+phoneGetDevCaps@20
+phoneGetDisplay@8
+phoneGetGain@12
+phoneGetHookSwitch@8
+phoneGetID@12
+phoneGetIcon@12
+phoneGetLamp@12
+phoneGetRing@12
+phoneGetStatus@8
+phoneGetStatusMessages@16
+phoneGetVolume@12
+phoneInitialize@20
+phoneNegotiateAPIVersion@24
+phoneNegotiateExtVersion@24
+phoneOpen@28
+phoneSetButtonInfo@12
+phoneSetData@16
+phoneSetDisplay@20
+phoneSetGain@12
+phoneSetHookSwitch@12
+phoneSetLamp@12
+phoneSetRing@12
+phoneSetStatusMessages@16
+phoneSetVolume@12
+phoneShutdown@4
+tapiGetLocationInfo@8
+tapiRequestDrop@8
+tapiRequestMakeCall@16
+tapiRequestMediaCall@40
diff --git a/winsup/w32api/lib/test.c b/winsup/w32api/lib/test.c
new file mode 100644
index 000000000..9aa6dd978
--- /dev/null
+++ b/winsup/w32api/lib/test.c
@@ -0,0 +1,40 @@
+/* Perform simple test of headers to avoid typos and such */
+#define Win32_Winsock
+#include <windows.h>
+
+#ifdef __OBJC__
+#define BOOL WINBOOL
+#endif
+#include <windowsx.h>
+#include <commctrl.h>
+#include <largeint.h>
+#include <mmsystem.h>
+#include <mciavi.h>
+#include <mcx.h>
+#include <sql.h>
+#include <sqlext.h>
+#include <imm.h>
+#include <lm.h>
+#include <zmouse.h>
+#include <scrnsave.h>
+#include <cpl.h>
+#include <cplext.h>
+#include <wincrypt.h>
+#include <pbt.h>
+#include <wininet.h>
+#include <regstr.h>
+#include <custcntl.h>
+
+#ifndef __OBJC__
+#include <ole2.h>
+#include <shlobj.h>
+#else
+#undef BOOL
+#endif
+
+#include <stdio.h>
+
+int main()
+{
+ return 0;
+}
diff --git a/winsup/w32api/lib/th32.def b/winsup/w32api/lib/th32.def
new file mode 100644
index 000000000..33aa7e72e
--- /dev/null
+++ b/winsup/w32api/lib/th32.def
@@ -0,0 +1,14 @@
+LIBRARY TH32.DLL
+EXPORTS
+CreateToolhelp32Snapshot@8
+Heap32First@12
+Heap32ListFirst@8
+Heap32ListNext@8
+Heap32Next@4
+Module32First@8
+Module32Next@8
+Process32First@8
+Process32Next@8
+Thread32First@8
+Thread32Next@8
+Toolhelp32ReadProcessMemory@20
diff --git a/winsup/w32api/lib/thunk32.def b/winsup/w32api/lib/thunk32.def
new file mode 100644
index 000000000..6252ada42
--- /dev/null
+++ b/winsup/w32api/lib/thunk32.def
@@ -0,0 +1,68 @@
+LIBRARY THUNK32.DLL
+EXPORTS
+Callback12@12
+Callback16@16
+Callback20@20
+Callback24@24
+Callback28@28
+Callback32@32
+Callback36@36
+Callback40@40
+Callback44@44
+Callback48@48
+Callback4@4
+Callback52@52
+Callback56@56
+Callback60@60
+Callback64@64
+Callback8@8
+FT_Exit0
+FT_Exit12
+FT_Exit16
+FT_Exit20
+FT_Exit24
+FT_Exit28
+FT_Exit32
+FT_Exit36
+FT_Exit4
+FT_Exit40
+FT_Exit44
+FT_Exit48
+FT_Exit52
+FT_Exit56
+FT_Exit8
+FT_Prolog
+FT_Thunk
+K32Thk1632Epilog@0
+K32Thk1632Prolog@0
+MapHInstLS
+MapHInstLS_PN
+MapHInstSL
+MapHInstSL_PN
+MapLS@4
+MapSL@4
+MapSLFix@4
+QT_Thunk
+SMapLS
+SMapLS_IP_EBP_12
+SMapLS_IP_EBP_16
+SMapLS_IP_EBP_20
+SMapLS_IP_EBP_24
+SMapLS_IP_EBP_28
+SMapLS_IP_EBP_32
+SMapLS_IP_EBP_36
+SMapLS_IP_EBP_40
+SMapLS_IP_EBP_8
+SUnMapLS
+SUnMapLS_IP_EBP_12
+SUnMapLS_IP_EBP_16
+SUnMapLS_IP_EBP_20
+SUnMapLS_IP_EBP_24
+SUnMapLS_IP_EBP_28
+SUnMapLS_IP_EBP_32
+SUnMapLS_IP_EBP_36
+SUnMapLS_IP_EBP_40
+SUnMapLS_IP_EBP_8
+ThunkConnect32@24
+UnMapLS@4
+UnMapSLFixArray@8
diff --git a/winsup/w32api/lib/url.def b/winsup/w32api/lib/url.def
new file mode 100644
index 000000000..202073259
--- /dev/null
+++ b/winsup/w32api/lib/url.def
@@ -0,0 +1,9 @@
+LIBRARY URL.DLL
+EXPORTS
+URLAssociationDialogW@24
+URLAssociationDialogA@24
+TranslateURLW@12
+TranslateURLA@12
+MIMEAssociationDialogW@24
+MIMEAssociationDialogA@24
+InetIsOffline@4
diff --git a/winsup/w32api/lib/user32.def b/winsup/w32api/lib/user32.def
new file mode 100644
index 000000000..b5acc474d
--- /dev/null
+++ b/winsup/w32api/lib/user32.def
@@ -0,0 +1,561 @@
+LIBRARY USER32.dll
+EXPORTS
+ActivateKeyboardLayout@8
+AdjustWindowRect@12
+AdjustWindowRectEx@16
+AnyPopup@0
+AppendMenuA@16
+AppendMenuW@16
+ArrangeIconicWindows@4
+AttachThreadInput@12
+BeginDeferWindowPos@4
+BeginPaint@8
+BringWindowToTop@4
+BroadcastSystemMessage@20
+CalcChildScroll@8
+CallMsgFilter@8
+CallMsgFilterA@8
+CallMsgFilterW@8
+CallNextHookEx@16
+CallWindowProcA@20
+CallWindowProcW@20
+CascadeChildWindows@8
+CascadeWindows@20
+ChangeClipboardChain@8
+ChangeDisplaySettingsA@8
+ChangeDisplaySettingsW@8
+ChangeMenuA@20
+ChangeMenuW@20
+CharLowerA@4
+CharLowerBuffA@8
+CharLowerBuffW@8
+CharLowerW@4
+CharNextA@4
+CharNextExA@12
+CharNextW@4
+CharPrevA@8
+CharPrevExA@16
+CharPrevW@8
+CharToOemA@8
+CharToOemBuffA@12
+CharToOemBuffW@12
+CharToOemW@8
+CharUpperA@4
+CharUpperBuffA@8
+CharUpperBuffW@8
+CharUpperW@4
+CheckDlgButton@12
+CheckMenuItem@12
+CheckMenuRadioItem@20
+CheckRadioButton@16
+ChildWindowFromPoint@12
+ChildWindowFromPointEx@16
+ClientToScreen@8
+ClipCursor@4
+CloseClipboard@0
+CloseDesktop@4
+CloseWindow@4
+CloseWindowStation@4
+CopyAcceleratorTableA@12
+CopyAcceleratorTableW@12
+CopyIcon@4
+CopyImage@20
+CopyRect@8
+CountClipboardFormats@0
+CreateAcceleratorTableA@8
+CreateAcceleratorTableW@8
+CreateCaret@16
+CreateCursor@28
+CreateDesktopA@24
+CreateDesktopW@24
+CreateDialogIndirectParamA@20
+CreateDialogIndirectParamW@20
+CreateDialogParamA@20
+CreateDialogParamW@20
+CreateIcon@28
+CreateIconFromResource@16
+CreateIconFromResourceEx@28
+CreateIconIndirect@4
+CreateMDIWindowA@40
+CreateMDIWindowW@40
+CreateMenu@0
+CreatePopupMenu@0
+CreateWindowExA@48
+CreateWindowExW@48
+CreateWindowStationA@16
+CreateWindowStationW@16
+DdeAbandonTransaction@12
+DdeAccessData@8
+DdeAddData@16
+DdeClientTransaction@32
+DdeCmpStringHandles@8
+DdeConnect@16
+DdeConnectList@20
+DdeCreateDataHandle@28
+DdeCreateStringHandleA@12
+DdeCreateStringHandleW@12
+DdeDisconnect@4
+DdeDisconnectList@4
+DdeEnableCallback@12
+DdeFreeDataHandle@4
+DdeFreeStringHandle@8
+DdeGetData@16
+DdeGetLastError@4
+DdeGetQualityOfService@12
+DdeImpersonateClient@4
+DdeInitializeA@16
+DdeInitializeW@16
+DdeKeepStringHandle@8
+DdeNameService@16
+DdePostAdvise@12
+DdeQueryConvInfo@12
+DdeQueryNextServer@8
+DdeQueryStringA@20
+DdeQueryStringW@20
+DdeReconnect@4
+DdeSetQualityOfService@12
+DdeSetUserHandle@12
+DdeUnaccessData@4
+DdeUninitialize@4
+DefDlgProcA@16
+DefDlgProcW@16
+DefFrameProcA@20
+DefFrameProcW@20
+DefMDIChildProcA@16
+DefMDIChildProcW@16
+DefWindowProcA@16
+DefWindowProcW@16
+DeferWindowPos@32
+DeleteMenu@12
+DestroyAcceleratorTable@4
+DestroyCaret@0
+DestroyCursor@4
+DestroyIcon@4
+DestroyMenu@4
+DestroyWindow@4
+DialogBoxIndirectParamA@20
+DialogBoxIndirectParamW@20
+DialogBoxParamA@20
+DialogBoxParamW@20
+DispatchMessageA@4
+DispatchMessageW@4
+DlgDirListA@20
+DlgDirListComboBoxA@20
+DlgDirListComboBoxW@20
+DlgDirListW@20
+DlgDirSelectComboBoxExA@16
+DlgDirSelectComboBoxExW@16
+DlgDirSelectExA@16
+DlgDirSelectExW@16
+DragDetect@12
+DragObject@20
+DrawAnimatedRects@16
+DrawCaption@16
+DrawEdge@16
+DrawFocusRect@8
+DrawFrame@16
+DrawFrameControl@16
+DrawIcon@16
+DrawIconEx@36
+DrawMenuBar@4
+DrawStateA@40
+DrawStateW@40
+DrawTextA@20
+DrawTextExA@24
+DrawTextExW@24
+DrawTextW@20
+EditWndProc@16
+EmptyClipboard@0
+EnableMenuItem@12
+EnableScrollBar@12
+EnableWindow@8
+EndDeferWindowPos@4
+EndDialog@8
+EndPaint@8
+EnumChildWindows@12
+EnumClipboardFormats@4
+EnumDesktopWindows@12
+EnumDesktopsA@12
+EnumDesktopsW@12
+EnumDisplaySettingsA@12
+EnumDisplaySettingsW@12
+EnumPropsA@8
+EnumPropsExA@12
+EnumPropsExW@12
+EnumPropsW@8
+EnumThreadWindows@12
+EnumWindowStationsA@8
+EnumWindowStationsW@8
+EnumWindows@8
+EqualRect@8
+ExcludeUpdateRgn@8
+ExitWindowsEx@8
+FillRect@12
+FindWindowA@8
+FindWindowExA@16
+FindWindowExW@16
+FindWindowW@8
+FlashWindow@8
+FrameRect@12
+FreeDDElParam@8
+GetActiveWindow@0
+GetAsyncKeyState@4
+GetCapture@0
+GetCaretBlinkTime@0
+GetCaretPos@4
+GetClassInfoA@12
+GetClassInfoExA@12
+GetClassInfoExW@12
+GetClassInfoW@12
+GetClassLongA@8
+GetClassLongW@8
+GetClassNameA@12
+GetClassNameW@12
+GetClassWord@8
+GetClientRect@8
+GetClipCursor@4
+GetClipboardData@4
+GetClipboardFormatNameA@12
+GetClipboardFormatNameW@12
+GetClipboardOwner@0
+GetClipboardViewer@0
+GetCursor@0
+GetCursorPos@4
+GetDC@4
+GetDCEx@12
+GetDesktopWindow@0
+GetDialogBaseUnits@0
+GetDlgCtrlID@4
+GetDlgItem@8
+GetDlgItemInt@16
+GetDlgItemTextA@16
+GetDlgItemTextW@16
+GetDoubleClickTime@0
+GetFocus@0
+GetForegroundWindow@0
+GetIconInfo@8
+GetInputDesktop@0
+GetInputState@0
+GetKBCodePage@0
+GetKeyNameTextA@12
+GetKeyNameTextW@12
+GetKeyState@4
+GetKeyboardLayout@4
+GetKeyboardLayoutList@8
+GetKeyboardLayoutNameA@4
+GetKeyboardLayoutNameW@4
+GetKeyboardState@4
+GetKeyboardType@4
+GetLastActivePopup@4
+GetMenu@4
+GetMenuCheckMarkDimensions@0
+GetMenuContextHelpId@4
+GetMenuDefaultItem@12
+GetMenuItemCount@4
+GetMenuItemID@8
+GetMenuItemInfoA@16
+GetMenuItemInfoW@16
+GetMenuItemRect@16
+GetMenuState@12
+GetMenuStringA@20
+GetMenuStringW@20
+GetMessageA@16
+GetMessageExtraInfo@0
+GetMessagePos@0
+GetMessageTime@0
+GetMessageW@16
+GetNextDlgGroupItem@12
+GetNextDlgTabItem@12
+GetOpenClipboardWindow@0
+GetParent@4
+GetPriorityClipboardFormat@8
+GetProcessWindowStation@0
+GetPropA@8
+GetPropW@8
+GetQueueStatus@4
+GetScrollInfo@12
+GetScrollPos@8
+GetScrollRange@16
+GetShellWindow@0
+GetSubMenu@8
+GetSysColor@4
+GetSysColorBrush@4
+GetSystemMenu@8
+GetSystemMetrics@4
+GetTabbedTextExtentA@20
+GetTabbedTextExtentW@20
+GetThreadDesktop@4
+GetTopWindow@4
+GetUpdateRect@12
+GetUpdateRgn@12
+GetUserObjectInformationA@20
+GetUserObjectInformationW@20
+GetUserObjectSecurity@20
+GetWindow@8
+GetWindowContextHelpId@4
+_imp__GetWindowContextHelpId@4
+GetWindowDC@4
+GetWindowLongA@8
+GetWindowLongW@8
+GetWindowPlacement@8
+GetWindowRect@8
+GetWindowRgn@8
+GetWindowTextA@12
+GetWindowTextLengthA@4
+GetWindowTextLengthW@4
+GetWindowTextW@12
+GetWindowThreadProcessId@8
+GetWindowWord@8
+GrayStringA@36
+GrayStringW@36
+HideCaret@4
+HiliteMenuItem@16
+ImpersonateDdeClientWindow@8
+InSendMessage@0
+InflateRect@12
+InsertMenuA@20
+InsertMenuItemA@16
+InsertMenuItemW@16
+InsertMenuW@20
+IntersectRect@12
+InvalidateRect@12
+InvalidateRgn@12
+InvertRect@8
+IsCharAlphaA@4
+IsCharAlphaNumericA@4
+IsCharAlphaNumericW@4
+IsCharAlphaW@4
+IsCharLowerA@4
+IsCharLowerW@4
+IsCharUpperA@4
+IsCharUpperW@4
+IsChild@8
+IsClipboardFormatAvailable@4
+IsDialogMessage@8
+IsDialogMessageA@8
+IsDialogMessageW@8
+IsDlgButtonChecked@8
+IsIconic@4
+IsMenu@4
+IsRectEmpty@4
+IsWindow@4
+IsWindowEnabled@4
+IsWindowUnicode@4
+IsWindowVisible@4
+IsZoomed@4
+KillSystemTimer@8
+KillTimer@8
+LoadAcceleratorsA@8
+LoadAcceleratorsW@8
+LoadBitmapA@8
+LoadBitmapW@8
+LoadCursorA@8
+LoadCursorFromFileA@4
+LoadCursorFromFileW@4
+LoadCursorW@8
+LoadIconA@8
+LoadIconW@8
+LoadImageA@24
+LoadImageW@24
+LoadKeyboardLayoutA@8
+LoadKeyboardLayoutW@8
+LoadMenuA@8
+LoadMenuIndirectA@4
+LoadMenuIndirectW@4
+LoadMenuW@8
+LoadStringA@16
+LoadStringW@16
+LockWindowUpdate@4
+LookupIconIdFromDirectory@8
+LookupIconIdFromDirectoryEx@20
+MapDialogRect@8
+MapVirtualKeyA@8
+MapVirtualKeyExA@12
+MapVirtualKeyExW@12
+MapVirtualKeyW@8
+MapWindowPoints@16
+MenuItemFromPoint@16
+MessageBeep@4
+MessageBoxA@16
+MessageBoxExA@20
+MessageBoxExW@20
+MessageBoxIndirectA@4
+MessageBoxIndirectW@4
+MessageBoxW@16
+ModifyMenuA@20
+ModifyMenuW@20
+MoveWindow@24
+MsgWaitForMultipleObjects@20
+MsgWaitForMultipleObjectsEx@20
+OemKeyScan@4
+OemToCharA@8
+OemToCharBuffA@12
+OemToCharBuffW@12
+OemToCharW@8
+OffsetRect@12
+OpenClipboard@4
+OpenDesktopA@16
+OpenDesktopW@16
+OpenIcon@4
+OpenInputDesktop@12
+OpenWindowStationA@12
+OpenWindowStationW@12
+PackDDElParam@12
+PaintDesktop@4
+PeekMessageA@20
+PeekMessageW@20
+PostMessageA@16
+PostMessageW@16
+PostQuitMessage@4
+PostThreadMessageA@16
+PostThreadMessageW@16
+PtInRect@12
+RedrawWindow@16
+RegisterClassA@4
+RegisterClassExA@4
+RegisterClassExW@4
+RegisterClassW@4
+RegisterClipboardFormatA@4
+RegisterClipboardFormatW@4
+RegisterHotKey@16
+RegisterWindowMessageA@4
+RegisterWindowMessageW@4
+ReleaseCapture@0
+ReleaseDC@8
+RemoveMenu@12
+RemovePropA@8
+RemovePropW@8
+ReplyMessage@4
+ReuseDDElParam@20
+ScreenToClient@8
+ScrollChildren@12
+ScrollDC@28
+ScrollWindow@20
+ScrollWindowEx@32
+SendDlgItemMessageA@20
+SendDlgItemMessageW@20
+SendMessageA@16
+SendMessageCallbackA@24
+SendMessageCallbackW@24
+SendMessageTimeoutA@28
+SendMessageTimeoutW@28
+SendMessageW@16
+SendNotifyMessageA@16
+SendNotifyMessageW@16
+SetActiveWindow@4
+SetCapture@4
+SetCaretBlinkTime@4
+SetCaretPos@8
+SetClassLongA@12
+SetClassLongW@12
+SetClassWord@12
+SetClipboardData@8
+SetClipboardViewer@4
+SetCursor@4
+SetCursorPos@8
+SetDebugErrorLevel@4
+SetDeskWallpaper@4
+SetDlgItemInt@16
+SetDlgItemTextA@12
+SetDlgItemTextW@12
+SetDoubleClickTime@4
+SetFocus@4
+SetForegroundWindow@4
+SetKeyboardState@4
+SetLastErrorEx@8
+SetMenu@8
+SetMenuContextHelpId@8
+_imp__SetMenuContextHelpId@8
+SetMenuDefaultItem@12
+SetMenuItemBitmaps@20
+SetMenuItemInfoA@16
+SetMenuItemInfoW@16
+SetMessageExtraInfo@4
+SetMessageQueue@4
+SetParent@8
+SetProcessWindowStation@4
+SetPropA@12
+SetPropW@12
+SetRect@20
+SetRectEmpty@4
+SetScrollInfo@16
+SetScrollPos@16
+SetScrollRange@20
+SetShellWindow@4
+SetSysColors@12
+SetSystemCursor@8
+SetSystemMenu@8
+SetSystemTimer@16
+SetThreadDesktop@4
+SetTimer@16
+SetUserObjectInformationA@16
+SetUserObjectInformationW@16
+SetUserObjectSecurity@12
+SetWindowContextHelpId@8
+_imp__SetWindowContextHelpId@8
+SetWindowLongA@12
+SetWindowLongW@12
+SetWindowPlacement@8
+SetWindowPos@28
+SetWindowRgn@12
+SetWindowTextA@8
+SetWindowTextW@8
+SetWindowWord@12
+SetWindowsHookA@8
+SetWindowsHookExA@16
+SetWindowsHookExW@16
+SetWindowsHookW@8
+ShowCaret@4
+ShowCursor@4
+ShowOwnedPopups@8
+ShowScrollBar@12
+ShowWindow@8
+ShowWindowAsync@8
+SubtractRect@12
+SwapMouseButton@4
+SwitchDesktop@4
+SystemParametersInfoA@16
+SystemParametersInfoW@16
+TabbedTextOutA@32
+TabbedTextOutW@32
+TileChildWindows@8
+TileWindows@20
+ToAscii@20
+ToAsciiEx@24
+ToUnicode@24
+ToUnicodeEx@28
+TrackMouseEvent@4
+TrackPopupMenu@28
+TrackPopupMenuEx@24
+TranslateAccelerator@12
+TranslateAcceleratorA@12
+TranslateAcceleratorW@12
+TranslateMDISysAccel@8
+TranslateMessage@4
+UnhookWindowsHook@8
+UnhookWindowsHookEx@4
+UnionRect@12
+UnloadKeyboardLayout@4
+UnpackDDElParam@16
+UnregisterClassA@8
+UnregisterClassW@8
+UnregisterHotKey@8
+UpdateWindow@4
+ValidateRect@8
+ValidateRgn@8
+VkKeyScanA@4
+VkKeyScanExA@8
+VkKeyScanExW@8
+VkKeyScanW@4
+WaitForInputIdle@8
+WaitMessage@0
+WinHelpA@16
+WinHelpW@16
+WindowFromDC@4
+WindowFromPoint@8
+keybd_event@16
+mouse_event@20
+wsprintfA
+wsprintfW
+wvsprintfA@12
+wvsprintfW@12
diff --git a/winsup/w32api/lib/uuid.c b/winsup/w32api/lib/uuid.c
new file mode 100644
index 000000000..921887c1a
--- /dev/null
+++ b/winsup/w32api/lib/uuid.c
@@ -0,0 +1,331 @@
+/*
+ Generate GUIDs for OLE and other interfaces.
+
+ This file was generated by extracting the names of all GUIDs
+ from uuid.lib. The names were in turn processed by a script
+ to build a C program that when run generated this file.
+ Some definitions were added by hand afterwards.
+*/
+#define INITGUID
+#include <basetyps.h>
+DEFINE_GUID(ARRAYID_PathProperties,0x7ecbba04,0x2d97,0x11cf,0xa2,0x29,0,0xaa,0,0x3d,0x73,0x52);
+DEFINE_GUID(CATID_Control,0x40fc6ed4,0x2438,0x11cf,0xa3,0xdb,0x8,0,0x36,0xf1,0x25,0x2);
+DEFINE_GUID(CATID_DocObject,0x40fc6ed8,0x2438,0x11cf,0xa3,0xdb,0x8,0,0x36,0xf1,0x25,0x2);
+DEFINE_GUID(CATID_Insertable,0x40fc6ed3,0x2438,0x11cf,0xa3,0xdb,0x8,0,0x36,0xf1,0x25,0x2);
+DEFINE_GUID(CATID_InternetAware58,0xaa0de86a,0xcf2b,0xa211,0x29,0,0xaa,0,0x3d,0x73,0x52,0);
+DEFINE_GUID(CATID_IsShortcut,0x40fc6ed6,0x2438,0x11cf,0xa3,0xdb,0x8,0,0x36,0xf1,0x25,0x2);
+DEFINE_GUID(CATID_NeverShowExt,0x40fc6ed7,0x2438,0x11cf,0xa3,0xdb,0x8,0,0x36,0xf1,0x25,0x2);
+DEFINE_GUID(CATID_PersistsToFile,0xde86a56,0x2baa,0x11cf,0xa2,0x29,0,0xaa,0,0x3d,0x73,0x52);
+DEFINE_GUID(CATID_PersistsToMemory,0xde86a55,0x2baa,0x11cf,0xa2,0x29,0,0xaa,0,0x3d,0x73,0x52);
+DEFINE_GUID(CATID_PersistsToMoniker,0xde86a51,0x2baa,0x11cf,0xa2,0x29,0,0xaa,0,0x3d,0x73,0x52);
+DEFINE_GUID(CATID_PersistsToPropertyBag,0xde86a57,0x2baa,0x11cf,0xa2,0x29,0,0xaa,0,0x3d,0x73,0x52);
+DEFINE_GUID(CATID_PersistsToStorage,0xde86a52,0x2baa,0x11cf,0xa2,0x29,0,0xaa,0,0x3d,0x73,0x52);
+DEFINE_GUID(CATID_PersistsToStream,0xde86a54,0x2baa,0x11cf,0xa2,0x29,0,0xaa,0,0x3d,0x73,0x52);
+DEFINE_GUID(CATID_PersistsToStreamInit,0xde86a53,0x2baa,0x11cf,0xa2,0x29,0,0xaa,0,0x3d,0x73,0x52);
+DEFINE_GUID(CATID_Printable,0x40fc6ed9,0x2438,0x11cf,0xa3,0xdb,0x8,0,0x36,0xf1,0x25,0x2);
+DEFINE_GUID(CATID_Programmable,0x40fc6ed5,0x2438,0x11cf,0xa3,0xdb,0x8,0,0x36,0xf1,0x25,0x2);
+DEFINE_GUID(CATID_RequiresDataPathHost,0xde86a50,0x2baa,0x11cf,0xa2,0x29,0,0xaa,0,0x3d,0x73,0x52);
+DEFINE_GUID(CATID_SafeForInitializing,0x7dd95802,0x9882,0x11cf,0x9f,0xa9,0,0xaa,0,0x6c,0x42,0xc4);
+DEFINE_GUID(CATID_SafeForScripting,0x7dd95801,0x9882,0x11cf,0x9f,0xa9,0,0xaa,0,0x6c,0x42,0xc4);
+DEFINE_GUID(CLSID_AllClasses,0x330,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(CLSID_CColorPropPage,0xbe35201,0x8f91,0x11ce,0x9d,0xe3,0,0xaa,0,0x4b,0xb8,0x51);
+DEFINE_GUID(CLSID_CFontPropPage, 0x0be35200,0x8f91,0x11ce,0x9d,0xe3,0x00,0xaa,0x00,0x4b,0xb8,0x51);
+DEFINE_GUID(CLSID_CFontPropPage00,0x910be352,0xce8f,0x9d11,0xe3,0,0xaa,0,0x4b,0xb8,0x51,0);
+DEFINE_GUID(CLSID_CPicturePropPage,0xbe35202,0x8f91,0x11ce,0x9d,0xe3,0,0xaa,0,0x4b,0xb8,0x51);
+DEFINE_GUID(CLSID_ConvertVBX,0xfb8f0822,0x164,0x101b,0x84,0xed,0x8,0,0x2b,0x2e,0xc7,0x13);
+DEFINE_GUID(CLSID_CurrentUserClasses,0x332,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(CLSID_FileProtocol,0x79eac9e7,0xbaf9,0x11ce,0x8c,0x82,0,0xaa,0,0x4b,0xa9,0xb);
+DEFINE_GUID(CLSID_FtpProtocol,0x79eac9e3,0xbaf9,0x11ce,0x8c,0x82,0,0xaa,0,0x4b,0xa9,0xb);
+DEFINE_GUID(CLSID_GopherProtocol,0x79eac9e4,0xbaf9,0x11ce,0x8c,0x82,0,0xaa,0,0x4b,0xa9,0xb);
+DEFINE_GUID(CLSID_HttpProtocol,0x79eac9e2,0xbaf9,0x11ce,0x8c,0x82,0,0xaa,0,0x4b,0xa9,0xb);
+DEFINE_GUID(CLSID_HttpSProtocolE5,0xf979eac9,0xceba,0x8c11,0x82,0,0xaa,0,0x4b,0xa9,0xb,0);
+DEFINE_GUID(CLSID_IdentityUnmarshal,0x1b,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(CLSID_InProcFreeMarshaler,0x1c,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(CLSID_LocalMachineClasses,0x331,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(CLSID_MkProtocol,0x79eac9e6,0xbaf9,0x11ce,0x8c,0x82,0,0xaa,0,0x4b,0xa9,0xb);
+DEFINE_GUID(CLSID_PSBindCtx,0x312,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(CLSID_PSClassObject0E,0x3,0,0xc000,0,0,0,0,0,0,0x46,0);
+DEFINE_GUID(CLSID_PSClientSite,0x30d,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(CLSID_PSDragDrop,0x311,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(CLSID_PSEnumerators13,0x3,0,0xc000,0,0,0,0,0,0,0x46,0);
+DEFINE_GUID(CLSID_PSGenObject,0x30c,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(CLSID_PSInPlaceActive,0x30f,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(CLSID_PSInPlaceFrame,0x310,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(CLSID_PSUrlMonProxyF1,0xf979eac9,0xceba,0x8c11,0x82,0,0xaa,0,0x4b,0xa9,0xb,0);
+DEFINE_GUID(CLSID_PersistPropset,0xfb8f0821,0x164,0x101b,0x84,0xed,0x8,0,0x2b,0x2e,0xc7,0x13);
+DEFINE_GUID(CLSID_Picture_Dib,0x316,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(CLSID_Picture_EnhMetafile,0x319,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(CLSID_Picture_Metafile,0x315,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(CLSID_StaticDib,0x316,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(CLSID_StaticMetafile,0x315,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(CLSID_StdComponentCategoriesMgr,0x2e005,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(CLSID_StdFont,0xbe35203,0x8f91,0x11ce,0x9d,0xe3,0,0xaa,0,0x4b,0xb8,0x51);
+DEFINE_GUID(CLSID_StdHlink,0x79eac9d0,0xbaf9,0x11ce,0x8c,0x82,0,0xaa,0,0x4b,0xa9,0xb);
+DEFINE_GUID(CLSID_StdHlinkBrowseContext,0x79eac9d1,0xbaf9,0x11ce,0x8c,0x82,0,0xaa,0,0x4b,0xa9,0xb);
+DEFINE_GUID(CLSID_StdMarshal,0x17,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(CLSID_StdPicture,0xbe35204,0x8f91,0x11ce,0x9d,0xe3,0,0xaa,0,0x4b,0xb8,0x51);
+DEFINE_GUID(CLSID_StdURLMonikerE0,0xf979eac9,0xceba,0x8c11,0x82,0,0xaa,0,0x4b,0xa9,0xb,0);
+DEFINE_GUID(CLSID_StdURLProtocol,0x79eac9e1,0xbaf9,0x11ce,0x8c,0x82,0,0xaa,0,0x4b,0xa9,0xb);
+DEFINE_GUID(FLAGID_Internet,0x96300da0,0x2bab,0x11cf,0xa2,0x29,0,0xaa,0,0x3d,0x73,0x52);
+DEFINE_GUID(FMTID_DocSummaryInformation,0xd5cdd502,0x2e9c,0x101b,0x93,0x97,0x8,0,0x2b,0x2c,0xf9,0xae);
+DEFINE_GUID(FMTID_SummaryInformation,0xf29f85e0,0x4ff9,0x1068,0xab,0x91,0x8,0,0x2b,0x27,0xb3,0xd9);
+DEFINE_GUID(FMTID_UserDefinedProperties,0xd5cdd505,0x2e9c,0x101b,0x93,0x97,0x8,0,0x2b,0x2c,0xf9,0xae);
+DEFINE_GUID(GUID_CHECKVALUEEXCLUSIVE,0x6650430c,0xbe0f,0x101a,0x8b,0xbb,0,0xaa,0,0x30,0xc,0xab);
+DEFINE_GUID(GUID_COLOR,0x66504301,0xbe0f,0x101a,0x8b,0xbb,0,0xaa,0,0x30,0xc,0xab);
+DEFINE_GUID(GUID_FONTBOLD,0x6650430f,0xbe0f,0x101a,0x8b,0xbb,0,0xaa,0,0x30,0xc,0xab);
+DEFINE_GUID(GUID_FONTITALIC,0x66504310,0xbe0f,0x101a,0x8b,0xbb,0,0xaa,0,0x30,0xc,0xab);
+DEFINE_GUID(GUID_FONTNAME,0x6650430d,0xbe0f,0x101a,0x8b,0xbb,0,0xaa,0,0x30,0xc,0xab);
+DEFINE_GUID(GUID_FONTSIZE,0x6650430e,0xbe0f,0x101a,0x8b,0xbb,0,0xaa,0,0x30,0xc,0xab);
+DEFINE_GUID(GUID_FONTSTRIKETHROUGH,0x66504312,0xbe0f,0x101a,0x8b,0xbb,0,0xaa,0,0x30,0xc,0xab);
+DEFINE_GUID(GUID_FONTUNDERSCORE,0x66504311,0xBE0F,0x101A,0x8B,0xBB,0x00,0xAA,0x00,0x30,0x0C,0xAB);
+DEFINE_GUID(GUID_FONTUNDERSCORE11,0xf665043,0x1abe,0x8b10,0xbb,0,0xaa,0,0x30,0xc,0xab,0);
+DEFINE_GUID(GUID_HANDLE,0x66504313,0xbe0f,0x101a,0x8b,0xbb,0,0xaa,0,0x30,0xc,0xab);
+DEFINE_GUID(GUID_HIMETRIC,0x66504300,0xbe0f,0x101a,0x8b,0xbb,0,0xaa,0,0x30,0xc,0xab);
+DEFINE_GUID(GUID_HasPathProperties,0x2de81,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(GUID_NULL,0,0,0,0,0,0,0,0,0,0,0);
+DEFINE_GUID(GUID_OPTIONVALUEEXCLUSIVE,0x6650430b,0xbe0f,0x101a,0x8b,0xbb,0,0xaa,0,0x30,0xc,0xab);
+DEFINE_GUID(GUID_PathProperty,0x2de80,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(GUID_TRISTATE,0x6650430a,0xbe0f,0x101a,0x8b,0xbb,0,0xaa,0,0x30,0xc,0xab);
+DEFINE_GUID(GUID_XPOS,0x66504306,0xbe0f,0x101a,0x8b,0xbb,0,0xaa,0,0x30,0xc,0xab);
+DEFINE_GUID(GUID_XPOSPIXEL,0x66504302,0xbe0f,0x101a,0x8b,0xbb,0,0xaa,0,0x30,0xc,0xab);
+DEFINE_GUID(GUID_XSIZE,0x66504308,0xbe0f,0x101a,0x8b,0xbb,0,0xaa,0,0x30,0xc,0xab);
+DEFINE_GUID(GUID_XSIZEPIXEL,0x66504304,0xbe0f,0x101a,0x8b,0xbb,0,0xaa,0,0x30,0xc,0xab);
+DEFINE_GUID(GUID_YPOS,0x66504307,0xbe0f,0x101a,0x8b,0xbb,0,0xaa,0,0x30,0xc,0xab);
+DEFINE_GUID(GUID_YPOSPIXEL,0x66504303,0xbe0f,0x101a,0x8b,0xbb,0,0xaa,0,0x30,0xc,0xab);
+DEFINE_GUID(GUID_YSIZE,0x66504309,0xbe0f,0x101a,0x8b,0xbb,0,0xaa,0,0x30,0xc,0xab);
+DEFINE_GUID(GUID_YSIZEPIXEL,0x66504305,0xbe0f,0x101a,0x8b,0xbb,0,0xaa,0,0x30,0xc,0xab);
+DEFINE_GUID(IID_IActiveScript,0xbb1a2ae1,0xa4f9,0x11cf,0x8f,0x20,0,0x80,0x5f,0x2c,0xd0,0x64);
+DEFINE_GUID(IID_IActiveScriptError,0xeae1ba61,0xa4ed,0x11cf,0x8f,0x20,0,0x80,0x5f,0x2c,0xd0,0x64);
+DEFINE_GUID(IID_IActiveScriptParse,0xbb1a2ae2,0xa4f9,0x11cf,0x8f,0x20,0,0x80,0x5f,0x2c,0xd0,0x64);
+DEFINE_GUID(IID_IActiveScriptSite,0xdb01a1e3,0xa42b,0x11cf,0x8f,0x20,0,0x80,0x5f,0x2c,0xd0,0x64);
+DEFINE_GUID(IID_IActiveScriptSiteWindow,0xd10f6761,0x83e9,0x11cf,0x8f,0x20,0,0x80,0x5f,0x2c,0xd0,0x64);
+DEFINE_GUID(IID_IAdviseSink,0x10f,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(IID_IAdviseSink2,0x125,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(IID_IAdviseSinkEx,0x3af24290,0xc96,0x11ce,0xa0,0xcf,0,0xaa,0,0x60,0xa,0xb8);
+DEFINE_GUID(IID_IAsyncMoniker,0x79eac9d3,0xbaf9,0x11ce,0x8c,0x82,0,0xaa,0,0x4b,0xa9,0xb);
+DEFINE_GUID(IID_IAuthenticate,0x79eac9d0,0xbaf9,0x11ce,0x8c,0x82,0,0xaa,0,0x4b,0xa9,0xb);
+DEFINE_GUID(IID_IBindCtx,0xe,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(IID_IBindHost,0xfc4801a1,0x2ba9,0x11cf,0xa2,0x29,0,0xaa,0,0x3d,0x73,0x52);
+DEFINE_GUID(IID_IBindProtocol,0x79eac9cd,0xbaf9,0x11ce,0x8c,0x82,0,0xaa,0,0x4b,0xa9,0xb);
+DEFINE_GUID(IID_IBindStatusCallback,0x79eac9c1,0xbaf9,0x11ce,0x8c,0x82,0,0xaa,0,0x4b,0xa9,0xb);
+DEFINE_GUID(IID_IBindStatusCallbackMsg,0x79eac9cb,0xbaf9,0x11ce,0x8c,0x82,0,0xaa,0,0x4b,0xa9,0xb);
+DEFINE_GUID(IID_IBinding,0x79eac9c0,0xbaf9,0x11ce,0x8c,0x82,0,0xaa,0,0x4b,0xa9,0xb);
+DEFINE_GUID(IID_ICatInformation13,0x2e0,0,0xc000,0,0,0,0,0,0,0x46,0);
+DEFINE_GUID(IID_ICatRegister,0x2e012,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(IID_IChannelHook,0x1008c4a0,0x7613,0x11cf,0x9a,0xf1,0,0x20,0xaf,0x6e,0x72,0xf4);
+DEFINE_GUID(IID_IClassActivator40,0x1,0,0xc000,0,0,0,0,0,0,0x46,0);
+DEFINE_GUID(IID_IClassFactory,0x1,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(IID_IClassFactory2,0xb196b28f,0xbab4,0x101a,0xb6,0x9c,0,0xaa,0,0x34,0x1d,0x7);
+DEFINE_GUID(IID_IClientSecurity3D,0x1,0,0xc000,0,0,0,0,0,0,0x46,0);
+DEFINE_GUID(IID_IClientSiteHandler,0xf4f569d1,0x593b,0x101a,0xb5,0x69,0x8,0,0x2b,0x2d,0xbf,0x7a);
+DEFINE_GUID(IID_ICodeInstall,0x79eac9d1,0xbaf9,0x11ce,0x8c,0x82,0,0xaa,0,0x4b,0xa9,0xb);
+DEFINE_GUID(IID_IConnectionPoint,0xb196b286,0xbab4,0x101a,0xb6,0x9c,0,0xaa,0,0x34,0x1d,0x7);
+DEFINE_GUID(IID_IConnectionPointContainer,0xb196b284,0xbab4,0x101a,0xb6,0x9c,0,0xaa,0,0x34,0x1d,0x7);
+DEFINE_GUID(IID_IContinue,0x12a,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(IID_IContinueCallback,0xb722bcca,0x4e68,0x101b,0xa2,0xbc,0,0xaa,0,0x40,0x47,0x70);
+DEFINE_GUID(IID_ICreateErrorInfo,0x22f03340,0x547d,0x101b,0x8e,0x65,0x8,0,0x2b,0x2b,0xd1,0x19);
+DEFINE_GUID(IID_ICreateTypeInfo05,0x204,0,0xc000,0,0,0,0,0,0,0x46,0);
+DEFINE_GUID(IID_ICreateTypeInfo2,0x2040e,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(IID_ICreateTypeLib,0x20406,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(IID_ICreateTypeLib20F,0x204,0,0xc000,0,0,0,0,0,0,0x46,0);
+DEFINE_GUID(IID_IDataAdviseHolder,0x110,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(IID_IDataObject,0x10e,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(IID_IDebug,0x123,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(IID_IDebugStream,0x124,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(IID_IDfReserved1,0x13,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(IID_IDfReserved2,0x14,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(IID_IDfReserved3,0x15,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(IID_IDispatch,0x20400,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(IID_IDropSource,0x121,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(IID_IDropTarget,0x122,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(IID_IEnumCATEGORYINFO,0x2e011,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(IID_IEnumCallback,0x108,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(IID_IEnumConnectionPoints,0xb196b285,0xbab4,0x101a,0xb6,0x9c,0,0xaa,0,0x34,0x1d,0x7);
+DEFINE_GUID(IID_IEnumConnections,0xb196b287,0xbab4,0x101a,0xb6,0x9c,0,0xaa,0,0x34,0x1d,0x7);
+DEFINE_GUID(IID_IEnumFORMATETC,0x103,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(IID_IEnumGUID,0x2e000,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(IID_IEnumGeneric,0x106,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(IID_IEnumHLITEM,0x79eac9c6,0xbaf9,0x11ce,0x8c,0x82,0,0xaa,0,0x4b,0xa9,0xb);
+DEFINE_GUID(IID_IEnumHolder,0x107,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(IID_IEnumMoniker,0x102,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(IID_IEnumOLEVERB,0x104,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(IID_IEnumOleDocumentViews,0xb722bcc8,0x4e68,0x101b,0xa2,0xbc,0,0xaa,0,0x40,0x47,0x70);
+DEFINE_GUID(IID_IEnumOleUndoUnits,0xb3e7c340,0xef97,0x11ce,0x9b,0xc9,0,0xaa,0,0x60,0x8e,0x1);
+DEFINE_GUID(IID_IEnumSTATDATA,0x105,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(IID_IEnumSTATPROPSETSTG,0x13b,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(IID_IEnumSTATPROPSTG,0x139,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(IID_IEnumSTATSTG,0xd,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(IID_IEnumSTATURL,0x3c374a42,0xbae4,0x11cf,0xbf,0x7d,0,0xaa,0,0x69,0x46,0xee);
+DEFINE_GUID(IID_IEnumString,0x101,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(IID_IEnumUnknown,0x100,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(IID_IEnumVARIANT,0x20404,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(IID_IErrorInfo,0x1cf2b120,0x547d,0x101b,0x8e,0x65,0x8,0,0x2b,0x2b,0xd1,0x19);
+DEFINE_GUID(IID_IErrorLog,0x3127ca40,0x446e,0x11ce,0x81,0x35,0,0xaa,0,0x4b,0xb8,0x51);
+DEFINE_GUID(IID_IExternalConnection,0x19,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(IID_IFillLockBytes,0x99caf010,0x415e,0x11cf,0x88,0x14,0,0xaa,0,0xb5,0x69,0xf5);
+DEFINE_GUID(IID_IFilter,0x89bcb740,0x6119,0x101a,0xbc,0xb7,0,0xdd,0x1,0x6,0x55,0xaf);
+DEFINE_GUID(IID_IFont,0xbef6e002,0xa874,0x101a,0x8b,0xba,0,0xaa,0,0x30,0xc,0xab);
+DEFINE_GUID(IID_IFontDisp,0xbef6e003,0xa874,0x101a,0x8b,0xba,0,0xaa,0,0x30,0xc,0xab);
+DEFINE_GUID(IID_IHlink,0x79eac9c3,0xbaf9,0x11ce,0x8c,0x82,0,0xaa,0,0x4b,0xa9,0xb);
+DEFINE_GUID(IID_IHlinkBrowseContext,0x79eac9c7,0xbaf9,0x11ce,0x8c,0x82,0,0xaa,0,0x4b,0xa9,0xb);
+DEFINE_GUID(IID_IHlinkFrame,0x79eac9c5,0xbaf9,0x11ce,0x8c,0x82,0,0xaa,0,0x4b,0xa9,0xb);
+DEFINE_GUID(IID_IHlinkSite,0x79eac9c2,0xbaf9,0x11ce,0x8c,0x82,0,0xaa,0,0x4b,0xa9,0xb);
+DEFINE_GUID(IID_IHlinkTarget,0x79eac9c4,0xbaf9,0x11ce,0x8c,0x82,0,0xaa,0,0x4b,0xa9,0xb);
+DEFINE_GUID(IID_IHttpNegotiate,0x79eac9d2,0xbaf9,0x11ce,0x8c,0x82,0,0xaa,0,0x4b,0xa9,0xb);
+DEFINE_GUID(IID_IHttpSecurity,0x79eac9d7,0xbafa,0x11ce,0x8c,0x82,0,0xaa,0,0x4b,0xa9,0xb);
+DEFINE_GUID(IID_IInternalMoniker,0x11,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(IID_ILayoutStorage,0xe6d4d90,0x6738,0x11cf,0x96,0x8,0,0xaa,0,0x68,0xd,0xb4);
+DEFINE_GUID(IID_ILockBytes,0xa,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(IID_IMalloc,0x2,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(IID_IMallocSpy,0x1d,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(IID_IMarshal,0x3,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(IID_IMessageFilter,0x16,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(IID_IMimeInfo,0xf77459a0,0xbf9a,0x11cf,0xba,0x4e,0,0xc0,0x4f,0xd7,0x8,0x16);
+DEFINE_GUID(IID_IMoniker,0xf,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(IID_IMultiQI,0x20,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(IID_IObjectSafety,0xcb5bdc81,0x93c1,0x11cf,0x8f,0x20,0,0x80,0x5f,0x2c,0xd0,0x64);
+DEFINE_GUID(IID_IObjectWithSiteA3,0xa9fc4801,0xcf2b,0xa211,0x29,0,0xaa,0,0x3d,0x73,0x52,0);
+DEFINE_GUID(IID_IOleAdviseHolder,0x111,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(IID_IOleCache,0x11e,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(IID_IOleCache2,0x128,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(IID_IOleCacheControl,0x129,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(IID_IOleClientSite,0x118,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(IID_IOleCommandTarget,0xb722bccb,0x4e68,0x101b,0xa2,0xbc,0,0xaa,0,0x40,0x47,0x70);
+DEFINE_GUID(IID_IOleContainer,0x11b,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(IID_IOleControl,0xb196b288,0xbab4,0x101a,0xb6,0x9c,0,0xaa,0,0x34,0x1d,0x7);
+DEFINE_GUID(IID_IOleControlSite,0xB196B289,0xBAB4,0x101A,0xB6,0x9C,0x00,0xAA,0x00,0x34,0x1D,0x07);
+DEFINE_GUID(IID_IOleControlSite89,0xb4b196b2,0x1aba,0xb610,0x9c,0,0xaa,0,0x34,0x1d,0x7,0);
+DEFINE_GUID(IID_IOleDocument,0xb722bcc5,0x4e68,0x101b,0xa2,0xbc,0,0xaa,0,0x40,0x47,0x70);
+DEFINE_GUID(IID_IOleDocumentSite,0xb722bcc7,0x4e68,0x101b,0xa2,0xbc,0,0xaa,0,0x40,0x47,0x70);
+DEFINE_GUID(IID_IOleDocumentView,0xb722bcc6,0x4e68,0x101b,0xa2,0xbc,0,0xaa,0,0x40,0x47,0x70);
+DEFINE_GUID(IID_IOleInPlaceActiveObject,0x117,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(IID_IOleInPlaceFrame,0x116,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(IID_IOleInPlaceObject,0x113,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(IID_IOleInPlaceObjectWindowless,0x1c2056cc,0x5ef4,0x101b,0x8b,0xc8,0,0xaa,0,0x3e,0x3b,0x29);
+DEFINE_OLEGUID(IID_IOleInPlaceSite,0x00000119,0,0);
+DEFINE_GUID(IID_IOleInPlaceSite19,0x1,0,0xc000,0,0,0,0,0,0,0x46,0);
+DEFINE_GUID(IID_IOleInPlaceSiteEx,0x9c2cad80,0x3424,0x11cf,0xb6,0x70,0,0xaa,0,0x4c,0xd6,0xd8);
+DEFINE_GUID(IID_IOleInPlaceSiteWindowless,0x922eada0,0x3424,0x11cf,0xb6,0x70,0,0xaa,0,0x4c,0xd6,0xd8);
+DEFINE_GUID(IID_IOleInPlaceUIWindow,0x115,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(IID_IOleItemContainer,0x11c,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(IID_IOleLink,0x11d,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(IID_IOleManager,0x11f,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(IID_IOleObject,0x112,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(IID_IOleParentUndoUnit,0xa1faf330,0xef97,0x11ce,0x9b,0xc9,0,0xaa,0,0x60,0x8e,0x1);
+DEFINE_GUID(IID_IOlePresObj,0x120,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(IID_IOleUndoManager00,0x97d001f2,0xceef,0x9b11,0xc9,0,0xaa,0,0x60,0x8e,0x1,0);
+DEFINE_GUID(IID_IOleUndoUnit,0x894ad3b0,0xef97,0x11ce,0x9b,0xc9,0,0xaa,0,0x60,0x8e,0x1);
+DEFINE_GUID(IID_IOleWindow,0x114,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(IID_IOverlappedCompletion,0x521a28f0,0xe40b,0x11ce,0xb2,0xc9,0,0xaa,0,0x68,0x9,0x37);
+DEFINE_GUID(IID_IOverlappedStream,0x49384070,0xe40a,0x11ce,0xb2,0xc9,0,0xaa,0,0x68,0x9,0x37);
+DEFINE_GUID(IID_IPSFactory,0x9,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(IID_IPSFactoryBuffer,0xd5f569d0,0x593b,0x101a,0xb5,0x69,0x8,0,0x2b,0x2d,0xbf,0x7a);
+DEFINE_GUID(IID_IParseDisplayName,0x11a,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(IID_IPerPropertyBrowsing,0x376bd3aa,0x3845,0x101b,0x84,0xed,0x8,0,0x2b,0x2e,0xc7,0x13);
+DEFINE_GUID(IID_IPersist,0x10c,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(IID_IPersistFile,0x10b,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(IID_IPersistMemory,0xbd1ae5e0,0xa6ae,0x11ce,0xbd,0x37,0x50,0x42,0,0xc1,0,0);
+DEFINE_GUID(IID_IPersistMonikerC9,0xf979eac9,0xceba,0x8c11,0x82,0,0xaa,0,0x4b,0xa9,0xb,0);
+DEFINE_GUID(IID_IPersistPropertyBag,0x37d84f60,0x42cb,0x11ce,0x81,0x35,0,0xaa,0,0x4b,0xb8,0x51);
+DEFINE_OLEGUID(IID_IPersistStorage,0x0000010a,0,0);
+DEFINE_GUID(IID_IPersistStorage0A,0x1,0,0xc000,0,0,0,0,0,0,0x46,0);
+DEFINE_GUID(IID_IPersistStream,0x109,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(IID_IPersistStreamInit,0x7fd52380,0x4e07,0x101b,0xae,0x2d,0x8,0,0x2b,0x2e,0xc7,0x13);
+DEFINE_GUID(IID_IPicture,0x7bf80980,0xbf32,0x101a,0x8b,0xbb,0,0xaa,0,0x30,0xc,0xab);
+DEFINE_GUID(IID_IPictureDisp,0x7bf80981,0xbf32,0x101a,0x8b,0xbb,0,0xaa,0,0x30,0xc,0xab);
+DEFINE_GUID(IID_IPointerInactive,0x55980ba0,0x35aa,0x11cf,0xb6,0x71,0,0xaa,0,0x4c,0xd6,0xd8);
+DEFINE_GUID(IID_IPrint,0xb722bcc9,0x4e68,0x101b,0xa2,0xbc,0,0xaa,0,0x40,0x47,0x70);
+DEFINE_GUID(IID_IProgressNotifyA0,0x17a9d758,0xcf46,0x9511,0xfc,0,0xaa,0,0x68,0xd,0xb4,0);
+DEFINE_GUID(IID_IPropertyBag,0x55272a00,0x42cb,0x11ce,0x81,0x35,0,0xaa,0,0x4b,0xb8,0x51);
+DEFINE_GUID(IID_IPropertyFrame,0xb196b28a,0xbab4,0x101a,0xb6,0x9c,0,0xaa,0,0x34,0x1d,0x7);
+DEFINE_GUID(IID_IPropertyNotifySink,0x9bfbbc02,0xeff1,0x101a,0x84,0xed,0,0xaa,0,0x34,0x1d,0x7);
+DEFINE_GUID(IID_IPropertyPage,0xb196b28d,0xbab4,0x101a,0xb6,0x9c,0,0xaa,0,0x34,0x1d,0x7);
+DEFINE_GUID(IID_IPropertyPage2,0x1e44665,0x24ac,0x101b,0x84,0xed,0x8,0,0x2b,0x2e,0xc7,0x13);
+DEFINE_GUID(IID_IPropertyPageSite,0xb196b28c,0xbab4,0x101a,0xb6,0x9c,0,0xaa,0,0x34,0x1d,0x7);
+DEFINE_GUID(IID_IPropertySetStorage,0x13a,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(IID_IPropertyStorage,0x138,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(IID_IProvideClassInfo,0xb196b283,0xbab4,0x101a,0xb6,0x9c,0,0xaa,0,0x34,0x1d,0x7);
+DEFINE_GUID(IID_IProvideClassInfo2,0xa6bc3ac0,0xdbaa,0x11ce,0x9d,0xe3,0,0xaa,0,0x4b,0xb8,0x51);
+DEFINE_GUID(IID_IProxy,0x27,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(IID_IProxyManager,0x8,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(IID_IQuickActivate,0xcf51ed10,0x62fe,0x11cf,0xbf,0x86,0,0xa0,0xc9,0x3,0x48,0x36);
+DEFINE_GUID(IID_IROTData,0xf29f6bc0,0x5021,0x11ce,0xaa,0x15,0,0,0x69,0x1,0x29,0x3f);
+DEFINE_GUID(IID_IRichEditOle,0x20d00,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(IID_IRichEditOleCallback,0x20d03,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(IID_IRootStorage,0x12,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(IID_IRpcChannel,0x4,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(IID_IRpcChannelBuffer,0xd5f56b60,0x593b,0x101a,0xb5,0x69,0x8,0,0x2b,0x2d,0xbf,0x7a);
+DEFINE_GUID(IID_IRpcProxy,0x7,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(IID_IRpcProxyBuffer34,0x3bd5f56a,0x1a59,0xb510,0x69,0x8,0,0x2b,0x2d,0xbf,0x7a,0);
+DEFINE_GUID(IID_IRpcStub,0x5,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(IID_IRpcStubBuffer,0xd5f56afc,0x593b,0x101a,0xb5,0x69,0x8,0,0x2b,0x2d,0xbf,0x7a);
+DEFINE_OLEGUID(IID_IRunnableObject,0x00000126,0,0);
+DEFINE_GUID(IID_IRunnableObject26,0x1,0,0xc000,0,0,0,0,0,0,0x46,0);
+DEFINE_GUID(IID_IRunningObjectTable,0x10,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(IID_ISequentialStream,0xc733a30,0x2a1c,0x11ce,0xad,0xe5,0,0xaa,0,0x44,0x77,0x3d);
+DEFINE_GUID(IID_IServerHandler,0xf4f569d0,0x593b,0x101a,0xb5,0x69,0x8,0,0x2b,0x2d,0xbf,0x7a);
+DEFINE_GUID(IID_IServerSecurity3E,0x1,0,0xc000,0,0,0,0,0,0,0x46,0);
+DEFINE_GUID(IID_IServiceProvider,0x6d5140c1,0x7436,0x11ce,0x80,0x34,0,0xaa,0,0x60,0x9,0xfa);
+DEFINE_GUID(IID_ISimpleFrameSite,0x742b0e01,0x14e6,0x101b,0x91,0x4e,0,0xaa,0,0x30,0xc,0xab);
+DEFINE_GUID(IID_ISpecifyPropertyPages,0xb196b28b,0xbab4,0x101a,0xb6,0x9c,0,0xaa,0,0x34,0x1d,0x7);
+DEFINE_OLEGUID(IID_IStdMarshalInfo,24,0,0);
+DEFINE_GUID(IID_IStdMarshalInfo18,0,0,0xc000,0,0,0,0,0,0,0x46,0);
+DEFINE_GUID(IID_IStorage,0xb,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(IID_IStream,0xc,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(IID_IStub,0x26,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(IID_IStubManager,0x6,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(IID_ISupportErrorInfo,0xdf0b3d60,0x548f,0x101b,0x8e,0x65,0x8,0,0x2b,0x2b,0xd1,0x19);
+DEFINE_GUID(IID_ITargetEmbedding,0x548793c0,0x9e74,0x11cf,0x96,0x55,0,0xa0,0xc9,0x3,0x49,0x23);
+DEFINE_GUID(IID_ITargetFrame,0xd5f78c80,0x5252,0x11cf,0x90,0xfa,0,0xaa,0,0x42,0x10,0x6e);
+DEFINE_GUID(IID_ITypeChangeEvents,0x20410,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(IID_ITypeComp,0x20403,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(IID_ITypeInfo,0x20401,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(IID_ITypeInfo2,0x20412,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(IID_ITypeLib,0x20402,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(IID_ITypeLib2,0x20411,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(IID_IUnknown,0,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(IID_IUrlHistoryStg,0x3c374a41,0xbae4,0x11cf,0xbf,0x7d,0,0xaa,0,0x69,0x46,0xee);
+DEFINE_GUID(IID_IViewObject,0x10d,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(IID_IViewObject2,0x127,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(IID_IViewObjectEx,0x3af24292,0xc96,0x11ce,0xa0,0xcf,0,0xaa,0,0x60,0xa,0xb8);
+DEFINE_GUID(IID_IWinInetHttpInfo,0x79eac9d8,0xbafa,0x11ce,0x8c,0x82,0,0xaa,0,0x4b,0xa9,0xb);
+DEFINE_GUID(IID_IWinInetInfo,0x79eac9d6,0xbafa,0x11ce,0x8c,0x82,0,0xaa,0,0x4b,0xa9,0xb);
+DEFINE_GUID(IID_IWindowForBindingUI,0x79eac9d5,0xbafa,0x11ce,0x8c,0x82,0,0xaa,0,0x4b,0xa9,0xb);
+DEFINE_GUID(IID_StdOle,0x20430,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(OLE_DATAPATH_ALLIMAGE,0x2de0e,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(OLE_DATAPATH_ALLMM,0x2de18,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(OLE_DATAPATH_ALLTEXT,0x2de1e,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(OLE_DATAPATH_ANSITEXT,0x2de19,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(OLE_DATAPATH_AVI,0x2de0f,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(OLE_DATAPATH_BASICAUDIO,0x2de12,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(OLE_DATAPATH_BIFF,0x2de21,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(OLE_DATAPATH_BMP,0x2de01,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(OLE_DATAPATH_CGM,0x2de0b,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(OLE_DATAPATH_COMMONIMAGE,0x2de0d,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(OLE_DATAPATH_DIB,0x2de02,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(OLE_DATAPATH_DIF,0x2de1f,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(OLE_DATAPATH_ENHMF,0x2de04,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(OLE_DATAPATH_EPS,0x2de0c,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(OLE_DATAPATH_GIF,0x2de05,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(OLE_DATAPATH_HTML,0x2de1c,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(OLE_DATAPATH_JPEG,0x2de06,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(OLE_DATAPATH_MIDI,0x2de13,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(OLE_DATAPATH_MPEG,0x2de10,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(OLE_DATAPATH_PALETTE,0x2de22,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(OLE_DATAPATH_PCX,0x2de09,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(OLE_DATAPATH_PENDATA,0x2de23,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(OLE_DATAPATH_PICT,0x2de0a,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(OLE_DATAPATH_POSTSCRIPT,0x2de1d,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(OLE_DATAPATH_QUICKTIME,0x2de11,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(OLE_DATAPATH_RIFF,0x2de15,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(OLE_DATAPATH_RTF,0x2de1b,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(OLE_DATAPATH_SOUND,0x2de16,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(OLE_DATAPATH_SYLK,0x2de20,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(OLE_DATAPATH_TIFF,0x2de07,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(OLE_DATAPATH_UNICODE,0x2de1a,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(OLE_DATAPATH_VIDEO,0x2de17,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(OLE_DATAPATH_WAV,0x2de14,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(OLE_DATAPATH_WMF,0x2de03,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(OLE_DATAPATH_XBM,0x2de08,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(SID_SContainerDispatch,0xb722be00,0x4e68,0x101b,0xa2,0xbc,0,0xaa,0,0x40,0x47,0x70);
+DEFINE_GUID(SID_SDataPathBrowser,0xfc4801a5,0x2ba9,0x11cf,0xa2,0x29,0,0xaa,0,0x3d,0x73,0x52);
diff --git a/winsup/w32api/lib/vdmdbg.def b/winsup/w32api/lib/vdmdbg.def
new file mode 100644
index 000000000..fbd1b4fe6
--- /dev/null
+++ b/winsup/w32api/lib/vdmdbg.def
@@ -0,0 +1,18 @@
+LIBRARY VDMDBG.dll
+EXPORTS
+VDMBreakThread@8
+VDMDetectWOW@0
+VDMEnumProcessWOW@8
+VDMEnumTaskWOW@12
+VDMGetModuleSelector@20
+VDMGetPointer@20
+VDMGetSelectorModule@32
+VDMGetThreadContext@8
+VDMGetThreadSelectorEntry@16
+VDMGlobalFirst@24
+VDMGlobalNext@24
+VDMKillWOW@0
+VDMModuleFirst@20
+VDMModuleNext@20
+VDMProcessException@4
+VDMSetThreadContext@8
diff --git a/winsup/w32api/lib/version.def b/winsup/w32api/lib/version.def
new file mode 100644
index 000000000..35a087e5d
--- /dev/null
+++ b/winsup/w32api/lib/version.def
@@ -0,0 +1,16 @@
+LIBRARY "VERSION.dll"
+EXPORTS
+GetFileVersionInfoA@16
+GetFileVersionInfoSizeA@8
+GetFileVersionInfoSizeW@8
+GetFileVersionInfoW@16
+VerFindFileA@32
+VerFindFileW@32
+VerInstallFileA@32
+VerInstallFileW@32
+VerLanguageNameA@12
+VerLanguageNameW@12
+VerQueryValueA@16
+VerQueryValueIndexA@24
+VerQueryValueIndexW@24
+VerQueryValueW@16
diff --git a/winsup/w32api/lib/vfw32.def b/winsup/w32api/lib/vfw32.def
new file mode 100644
index 000000000..62c2ab4aa
--- /dev/null
+++ b/winsup/w32api/lib/vfw32.def
@@ -0,0 +1,131 @@
+LIBRARY VFW32.DLL
+EXPORTS
+VideoForWindowsVersion@0
+StretchDIB@48
+MCIWndRegisterClass
+MCIWndCreateW
+MCIWndCreateA
+MCIWndCreate
+ICSeqCompressFrameStart@8
+ICSeqCompressFrameEnd@4
+ICSeqCompressFrame@20
+ICSendMessage@16
+ICRemove@12
+ICOpenFunction@16
+ICOpen@12
+ICMThunk32@20
+ICLocate@20
+ICInstall@20
+ICInfo@12
+ICImageDecompress@20
+ICImageCompress@28
+ICGetInfo@12
+ICGetDisplayFormat@24
+ICDrawBegin
+ICDraw
+ICDecompress
+ICCompressorFree@4
+ICCompressorChoose@24
+ICCompress
+ICClose@4
+GetSaveFileNamePreviewW@4
+GetSaveFileNamePreviewA@4
+GetOpenFileNamePreviewW@4
+GetOpenFileNamePreviewA@4
+GetOpenFileNamePreview@4
+DrawDibTime@8
+DrawDibStop@4
+DrawDibStart@8
+DrawDibSetPalette@8
+DrawDibRealize@12
+DrawDibProfileDisplay@4
+DrawDibOpen@0
+DrawDibGetPalette@4
+DrawDibGetBuffer@16
+DrawDibEnd@4
+DrawDibDraw@52
+DrawDibClose@4
+DrawDibChangePalette@16
+DrawDibBegin@32
+IID_IGetFrame
+IID_IAVIStream
+IID_IAVIFile
+IID_IAVIEditStream
+EditStreamSetNameW@8
+EditStreamSetNameA@8
+EditStreamSetName@8
+EditStreamSetInfoW@12
+EditStreamSetInfoA@12
+EditStreamSetInfo@12
+EditStreamPaste@24
+EditStreamCut@16
+EditStreamCopy@16
+EditStreamClone@8
+DllGetClassObject@12
+DllCanUnloadNow@0
+CreateEditableStream@8
+AVIStreamWriteData@16
+AVIStreamWrite@32
+AVIStreamTimeToSample@8
+AVIStreamStart@4
+AVIStreamSetFormat@16
+AVIStreamSampleToTime@8
+AVIStreamRelease@4
+AVIStreamReadFormat@16
+AVIStreamReadData@16
+AVIStreamRead@28
+AVIStreamOpenFromFileW@24
+AVIStreamOpenFromFileA@24
+AVIStreamOpenFromFile@24
+AVIStreamLength@4
+AVIStreamInfoW@12
+AVIStreamInfoA@12
+AVIStreamInfo@12
+AVIStreamGetFrameOpen@8
+AVIStreamGetFrameClose@4
+AVIStreamGetFrame@8
+AVIStreamFindSample@12
+AVIStreamEndStreaming@4
+AVIStreamCreate@16
+AVIStreamBeginStreaming@16
+AVIStreamAddRef@4
+AVISaveW
+AVISaveVW@24
+AVISaveVA@24
+AVISaveV@24
+AVISaveOptionsFree@8
+AVISaveOptions@20
+AVISaveA
+AVISave
+AVIPutFileOnClipboard@4
+AVIMakeStreamFromClipboard@12
+AVIMakeFileFromStreams@12
+AVIMakeCompressedStream@16
+AVIGetFromClipboard@4
+AVIFileWriteData@16
+AVIFileRelease@4
+AVIFileReadData@16
+AVIFileOpenW@16
+AVIFileOpenA@16
+AVIFileOpen@16
+AVIFileInit@0
+AVIFileInfoW@12
+AVIFileInfoA@12
+AVIFileInfo@12
+AVIFileGetStream@16
+AVIFileExit@0
+AVIFileEndRecord@4
+AVIFileCreateStreamW@12
+AVIFileCreateStreamA@12
+AVIFileCreateStream@12
+AVIFileAddRef@4
+AVIClearClipboard@0
+AVIBuildFilterW@12
+AVIBuildFilterA@12
+AVIBuildFilter@12
+videoThunk32@20
+capGetDriverDescriptionW@20
+capGetDriverDescriptionA@20
+capCreateCaptureWindowW@32
+capCreateCaptureWindowA@32
+AppCleanup@4
diff --git a/winsup/w32api/lib/win32spl.def b/winsup/w32api/lib/win32spl.def
new file mode 100644
index 000000000..ea00cad1c
--- /dev/null
+++ b/winsup/w32api/lib/win32spl.def
@@ -0,0 +1,16 @@
+LIBRARY WIN32SPL.DLL
+EXPORTS
+AddPortExW@16
+AddPortW@12
+ClosePort@4
+ConfigurePortW@12
+DeletePortW@12
+EndDocPort@4
+EnumPortsW@24
+InitializeMonitor@4
+InitializePrintProvidor@12
+LibMain@12
+OpenPort@8
+ReadPort@16
+StartDocPort@20
+WritePort@16
diff --git a/winsup/w32api/lib/wininet.def b/winsup/w32api/lib/wininet.def
new file mode 100644
index 000000000..8ad4d06f0
--- /dev/null
+++ b/winsup/w32api/lib/wininet.def
@@ -0,0 +1,159 @@
+; Which header declares the functions not in wininet?
+LIBRARY WININET.DLL
+EXPORTS
+CommitUrlCacheEntryA@44
+CommitUrlCacheEntryW@44
+CreateUrlCacheContainerA@32
+CreateUrlCacheContainerW@32
+CreateUrlCacheEntryA@20
+CreateUrlCacheEntryW@20
+CreateUrlCacheGroup@8
+DeleteIE3Cache@16
+DeleteUrlCacheContainerA@8
+DeleteUrlCacheContainerW@8
+DeleteUrlCacheEntry@4
+DeleteUrlCacheGroup@16
+FindCloseUrlCache@4
+FindFirstUrlCacheContainerA@16
+FindFirstUrlCacheContainerW@16
+FindFirstUrlCacheEntryA@12
+FindFirstUrlCacheEntryExA@40
+FindFirstUrlCacheEntryExW@40
+FindFirstUrlCacheEntryW@12
+FindNextUrlCacheContainerA@12
+FindNextUrlCacheContainerW@12
+FindNextUrlCacheEntryA@12
+FindNextUrlCacheEntryExA@24
+FindNextUrlCacheEntryExW@24
+FindNextUrlCacheEntryW@12
+FreeUrlCacheSpaceA@12
+FreeUrlCacheSpaceW@12
+FtpCreateDirectoryA@8
+FtpCreateDirectoryW@8
+FtpDeleteFileA@8
+FtpDeleteFileW@8
+FtpFindFirstFileA@20
+FtpFindFirstFileW@20
+FtpGetCurrentDirectoryA@12
+FtpGetCurrentDirectoryW@12
+FtpGetFileA@28
+FtpGetFileW@28
+FtpOpenFileA@20
+FtpOpenFileW@20
+FtpPutFileA@20
+FtpPutFileW@20
+FtpRemoveDirectoryA@8
+FtpRemoveDirectoryW@8
+FtpRenameFileA@12
+FtpRenameFileW@12
+FtpSetCurrentDirectoryA@8
+FtpSetCurrentDirectoryW@8
+GetUrlCacheConfigInfoA@12
+GetUrlCacheConfigInfoW@12
+GetUrlCacheEntryInfoA@12
+GetUrlCacheEntryInfoExA@28
+GetUrlCacheEntryInfoExW@28
+GetUrlCacheEntryInfoW@12
+GetUrlCacheHeaderData@8
+GopherCreateLocatorA@28
+GopherCreateLocatorW@28
+GopherFindFirstFileA@24
+GopherFindFirstFileW@24
+GopherGetAttributeA@32
+GopherGetAttributeW@32
+GopherGetLocatorTypeA@8
+GopherGetLocatorTypeW@8
+GopherOpenFileA@20
+GopherOpenFileW@20
+HttpAddRequestHeadersA@16
+HttpAddRequestHeadersW@16
+HttpEndRequestA@16
+HttpEndRequestW@16
+HttpOpenRequestA@32
+HttpOpenRequestW@32
+HttpQueryInfoA@20
+HttpQueryInfoW@20
+HttpSendRequestA@20
+HttpSendRequestExA@20
+HttpSendRequestExW@20
+HttpSendRequestW@20
+IncrementUrlCacheHeaderData@8
+InternetAttemptConnect@4
+InternetAutodial@8
+InternetAutodialCallback@8
+InternetAutodialHangup@4
+InternetCanonicalizeUrlA@16
+InternetCanonicalizeUrlW@16
+InternetCheckConnectionA@12
+InternetCheckConnectionW@12
+InternetCloseHandle@4
+InternetCombineUrlA@20
+InternetCombineUrlW@20
+InternetConfirmZoneCrossing@16
+InternetConnectA@32
+InternetConnectW@32
+InternetCrackUrlA@16
+InternetCrackUrlW@16
+InternetCreateUrlA@16
+InternetCreateUrlW@16
+InternetDebugGetLocalTime@8
+InternetDial@20
+InternetErrorDlg@20
+InternetFindNextFileA@8
+InternetFindNextFileW@8
+InternetGetCertByURL@12
+InternetGetConnectedState@8
+InternetGetCookieA@16
+InternetGetCookieW@16
+InternetGetLastResponseInfoA@12
+InternetGetLastResponseInfoW@12
+InternetGoOnline@12
+InternetHangUp@8
+InternetLockRequestFile@8
+InternetOpenA@20
+InternetOpenUrlA@24
+InternetOpenUrlW@24
+InternetOpenW@20
+InternetQueryDataAvailable@16
+InternetQueryOptionA@16
+InternetQueryOptionW@16
+InternetReadFile@16
+InternetReadFileExA@16
+InternetReadFileExW@16
+InternetSetCookieA@12
+InternetSetCookieW@12
+InternetSetDialState@12
+InternetSetFilePointer@20
+InternetSetOptionA@16
+InternetSetOptionExA@20
+InternetSetOptionExW@20
+InternetSetOptionW@16
+InternetSetStatusCallback@8
+InternetShowSecurityInfoByURL@8
+InternetTimeFromSystemTime@16
+InternetTimeToSystemTime@12
+InternetUnlockRequestFile@4
+InternetWriteFile@16
+InternetWriteFileExA@16
+InternetWriteFileExW@16
+IsHostInProxyBypassList@12
+LoadUrlCacheContent@0
+ParseX509EncodedCertificateForListBoxEntry@16
+ReadUrlCacheEntryStream@20
+RetrieveUrlCacheEntryFileA@16
+RetrieveUrlCacheEntryFileW@16
+RetrieveUrlCacheEntryStreamA@20
+RetrieveUrlCacheEntryStreamW@20
+RunOnceUrlCache@16
+SetUrlCacheConfigInfoA@8
+SetUrlCacheConfigInfoW@8
+SetUrlCacheEntryGroup@28
+SetUrlCacheEntryInfoA@12
+SetUrlCacheEntryInfoW@12
+SetUrlCacheHeaderData@8
+ShowClientAuthCerts@4
+ShowSecurityInfo@8
+ShowX509EncodedCertificate@12
+UnlockUrlCacheEntryFile@8
+UnlockUrlCacheEntryStream@8
+UpdateUrlCacheContentPath@4
diff --git a/winsup/w32api/lib/winmm.def b/winsup/w32api/lib/winmm.def
new file mode 100644
index 000000000..4de3638e5
--- /dev/null
+++ b/winsup/w32api/lib/winmm.def
@@ -0,0 +1,196 @@
+LIBRARY WINMM.DLL
+EXPORTS
+CloseDriver@12
+DefDriverProc@20
+DriverCallback@28
+DrvGetModuleHandle@4
+GetDriverModuleHandle@4
+NotifyCallbackData@20
+OpenDriver@12
+PlaySound@12
+PlaySoundA@12
+PlaySoundW@12
+SendDriverMessage@16
+WOW32DriverCallback@28
+WOW32ResolveMultiMediaHandle@24
+WOWAppExit@4
+aux32Message@20
+auxGetDevCapsA@12
+auxGetDevCapsW@12
+auxGetNumDevs@0
+auxGetVolume@8
+auxOutMessage@16
+auxSetVolume@8
+joy32Message@20
+joyConfigChanged@4
+joyGetDevCapsA@12
+joyGetDevCapsW@12
+joyGetNumDevs@0
+joyGetPos@8
+joyGetPosEx@8
+joyGetThreshold@8
+joyReleaseCapture@4
+joySetCapture@16
+joySetThreshold@8
+mci32Message@20
+mciDriverNotify@12
+mciDriverYield@4
+mciExecute@4
+mciFreeCommandResource@4
+mciGetCreatorTask@4
+mciGetDeviceIDA@4
+mciGetDeviceIDFromElementIDA@8
+mciGetDeviceIDFromElementIDW@8
+mciGetDeviceIDW@4
+mciGetDriverData@4
+mciGetErrorStringA@12
+mciGetErrorStringW@12
+mciGetYieldProc@8
+mciLoadCommandResource@12
+mciSendCommandA@16
+mciSendCommandW@16
+mciSendStringA@16
+mciSendStringW@16
+mciSetDriverData@8
+mciSetYieldProc@12
+mid32Message@20
+midiConnect@12
+midiDisconnect@12
+midiInAddBuffer@12
+midiInClose@4
+midiInGetDevCapsA@12
+midiInGetDevCapsW@12
+midiInGetErrorTextA@12
+midiInGetErrorTextW@12
+midiInGetID@8
+midiInGetNumDevs@0
+midiInMessage@16
+midiInOpen@20
+midiInPrepareHeader@12
+midiInReset@4
+midiInStart@4
+midiInStop@4
+midiInUnprepareHeader@12
+midiOutCacheDrumPatches@16
+midiOutCachePatches@16
+midiOutClose@4
+midiOutGetDevCapsA@12
+midiOutGetDevCapsW@12
+midiOutGetErrorTextA@12
+midiOutGetErrorTextW@12
+midiOutGetID@8
+midiOutGetNumDevs@0
+midiOutGetVolume@8
+midiOutLongMsg@12
+midiOutMessage@16
+midiOutOpen@20
+midiOutPrepareHeader@12
+midiOutReset@4
+midiOutSetVolume@8
+midiOutShortMsg@8
+midiOutUnprepareHeader@12
+midiStreamClose@4
+midiStreamOpen@24
+midiStreamOut@12
+midiStreamPause@4
+midiStreamPosition@12
+midiStreamProperty@12
+midiStreamRestart@4
+midiStreamStop@4
+mixerClose@4
+mixerGetControlDetailsA@12
+mixerGetControlDetailsW@12
+mixerGetDevCapsA@12
+mixerGetDevCapsW@12
+mixerGetID@12
+mixerGetLineControlsA@12
+mixerGetLineControlsW@12
+mixerGetLineInfoA@12
+mixerGetLineInfoW@12
+mixerGetNumDevs@0
+mixerMessage@16
+mixerOpen@20
+mixerSetControlDetails@12
+mmDrvInstall@12
+mmGetCurrentTask@0
+mmTaskBlock@4
+mmTaskCreate@12
+mmTaskSignal@4
+mmTaskYield@0
+mmioAdvance@12
+mmioAscend@12
+mmioClose@8
+mmioCreateChunk@12
+mmioDescend@16
+mmioFlush@8
+mmioGetInfo@12
+mmioInstallIOProcA@12
+mmioInstallIOProcW@12
+mmioOpenA@12
+mmioOpenW@12
+mmioRead@12
+mmioRenameA@16
+mmioRenameW@16
+mmioSeek@12
+mmioSendMessage@16
+mmioSetBuffer@16
+mmioSetInfo@12
+mmioStringToFOURCCA@8
+mmioStringToFOURCCW@8
+mmioWrite@12
+mmsystemGetVersion@0
+mod32Message@20
+mxd32Message@20
+sndPlaySoundA@8
+sndPlaySoundW@8
+tid32Message@20
+timeBeginPeriod@4
+timeEndPeriod@4
+timeGetDevCaps@8
+timeGetSystemTime@8
+timeGetTime@0
+timeKillEvent@4
+timeSetEvent@20
+waveInAddBuffer@12
+waveInClose@4
+waveInGetDevCapsA@12
+waveInGetDevCapsW@12
+waveInGetErrorTextA@12
+waveInGetErrorTextW@12
+waveInGetID@8
+waveInGetNumDevs@0
+waveInGetPosition@12
+waveInMessage@16
+waveInOpen@24
+waveInPrepareHeader@12
+waveInReset@4
+waveInStart@4
+waveInStop@4
+waveInUnprepareHeader@12
+waveOutBreakLoop@4
+waveOutClose@4
+waveOutGetDevCapsA@12
+waveOutGetDevCapsW@12
+waveOutGetErrorTextA@12
+waveOutGetErrorTextW@12
+waveOutGetID@8
+waveOutGetNumDevs@0
+waveOutGetPitch@8
+waveOutGetPlaybackRate@8
+waveOutGetPosition@12
+waveOutGetVolume@8
+waveOutMessage@16
+waveOutOpen@24
+waveOutPause@4
+waveOutPrepareHeader@12
+waveOutReset@4
+waveOutRestart@4
+waveOutSetPitch@8
+waveOutSetPlaybackRate@8
+waveOutSetVolume@8
+waveOutUnprepareHeader@12
+waveOutWrite@12
+wid32Message@20
+winmmDbgOut
+winmmSetDebugLevel@4
+wod32Message@20
diff --git a/winsup/w32api/lib/winspool.def b/winsup/w32api/lib/winspool.def
new file mode 100644
index 000000000..367869c6a
--- /dev/null
+++ b/winsup/w32api/lib/winspool.def
@@ -0,0 +1,131 @@
+LIBRARY "WINSPOOL.DRV"
+EXPORTS
+ADVANCEDSETUPDIALOG@16
+AbortPrinter@4
+AddFormA@12
+AddFormW@12
+AddJobA@20
+AddJobW@20
+AddMonitorA@12
+AddMonitorW@12
+AddPortA@12
+AddPortExA@16
+AddPortExW@16
+AddPortW@12
+AddPrintProcessorA@16
+AddPrintProcessorW@16
+AddPrintProvidorA@12
+AddPrintProvidorW@12
+AddPrinterA@12
+AddPrinterConnectionA@4
+AddPrinterConnectionW@4
+AddPrinterDriverA@12
+AddPrinterDriverW@12
+AddPrinterW@12
+AdvancedDocumentPropertiesA@20
+AdvancedDocumentPropertiesW@20
+AdvancedSetupDialog@16
+ClosePrinter@4
+ConfigurePortA@12
+ConfigurePortW@12
+ConnectToPrinterDlg@8
+CreatePrinterIC@8
+DEVICECAPABILITIES@20
+DEVICEMODE@16
+DeleteFormA@8
+DeleteFormW@8
+DeleteMonitorA@12
+DeleteMonitorW@12
+DeletePortA@12
+DeletePortW@12
+DeletePrinterDataA@8
+DeletePrinterDataW@8
+DeletePrintProcessorA@12
+DeletePrintProcessorW@12
+DeletePrintProvidorA@12
+DeletePrintProvidorW@12
+DeletePrinter@4
+DeletePrinterConnectionA@4
+DeletePrinterConnectionW@4
+DeletePrinterDriverA@12
+DeletePrinterDriverW@12
+DeletePrinterIC@4
+DevQueryPrint@12
+DeviceCapabilities@20
+DeviceCapabilitiesA@20
+DeviceCapabilitiesW@20
+DeviceMode@16
+DocumentEvent@28
+DocumentPropertiesA@24
+DocumentPropertiesW@24
+EXTDEVICEMODE@32
+EndDocPrinter@4
+EndPagePrinter@4
+EnumFormsA@24
+EnumFormsW@24
+EnumJobsA@32
+EnumJobsW@32
+EnumMonitorsA@24
+EnumMonitorsW@24
+EnumPortsA@24
+EnumPortsW@24
+EnumPrintProcessorDatatypesA@28
+EnumPrintProcessorDatatypesW@28
+EnumPrintProcessorsA@28
+EnumPrintProcessorsW@28
+EnumPrinterDriversA@28
+EnumPrinterDriversW@28
+EnumPrinterPropertySheets@16
+EnumPrintersA@28
+EnumPrintersW@28
+EnumPrinterDataA@36
+EnumPrinterDataW@36
+ExtDeviceMode@32
+FindClosePrinterChangeNotification@4
+FindFirstPrinterChangeNotification@16
+FindNextPrinterChangeNotification@16
+FreePrinterNotifyInfo@4
+GetFormA@24
+GetFormW@24
+GetJobA@24
+GetJobW@24
+GetPrintProcessorDirectoryA@24
+GetPrintProcessorDirectoryW@24
+GetPrinterA@20
+GetPrinterDataA@24
+GetPrinterDataW@24
+GetPrinterDriverA@24
+GetPrinterDriverDirectoryA@24
+GetPrinterDriverDirectoryW@24
+GetPrinterDriverW@24
+GetPrinterW@20
+InitializeDll@12
+OpenPrinterA@12
+OpenPrinterW@12
+PlayGdiScriptOnPrinterIC@24
+PrinterMessageBoxA@24
+PrinterMessageBoxW@24
+PrinterProperties@8
+ReadPrinter@16
+ResetPrinterA@8
+ResetPrinterW@8
+ScheduleJob@8
+SetAllocFailCount@20
+SetFormA@16
+SetFormW@16
+SetJobA@20
+SetJobW@20
+SetPort@16
+SetPrinterA@16
+SetPrinterDataA@20
+SetPrinterDataW@20
+SetPrinterW@16
+SpoolerDevQueryPrintW@20
+SpoolerInit@0
+StartDocDlgA@8
+StartDocDlgW@8
+StartDocPrinterA@12
+StartDocPrinterW@12
+StartPagePrinter@4
+WaitForPrinterChange@8
+WritePrinter@16
diff --git a/winsup/w32api/lib/winstrm.def b/winsup/w32api/lib/winstrm.def
new file mode 100644
index 000000000..27531a0b9
--- /dev/null
+++ b/winsup/w32api/lib/winstrm.def
@@ -0,0 +1,9 @@
+LIBRARY WINSTRM.DLL
+EXPORTS
+OpenStream@4
+getmsg@16
+poll@12
+putmsg@16
+s_ioctl@12
+s_open@12
+s_perror@8
diff --git a/winsup/w32api/lib/wow32.def b/winsup/w32api/lib/wow32.def
new file mode 100644
index 000000000..cd814c633
--- /dev/null
+++ b/winsup/w32api/lib/wow32.def
@@ -0,0 +1,19 @@
+LIBRARY WOW32.DLL
+EXPORTS
+WOWCallback16@8
+WOWCallback16Ex@20
+WOWDirectedYield16@4
+WOWGetDescriptor@8
+WOWGetVDMPointer@12
+WOWGetVDMPointerFix@12
+WOWGetVDMPointerUnfix@4
+WOWGlobalAlloc16@8
+WOWGlobalAllocLock16@12
+WOWGlobalFree16@4
+WOWGlobalLock16@4
+WOWGlobalLockSize16@8
+WOWGlobalUnlock16@4
+WOWGlobalUnlockFree16@4
+WOWHandle16@8
+WOWHandle32@8
+WOWYield16@0
diff --git a/winsup/w32api/lib/ws2_32.def b/winsup/w32api/lib/ws2_32.def
new file mode 100644
index 000000000..f78313e21
--- /dev/null
+++ b/winsup/w32api/lib/ws2_32.def
@@ -0,0 +1,108 @@
+LIBRARY "WS2_32.DLL"
+EXPORTS
+WEP@0
+WPUCompleteOverlappedRequest@20
+WSAAccept@20
+WSAAddressToStringA@20
+WSAAddressToStringW@20
+WSAAsyncGetHostByAddr@28
+WSAAsyncGetHostByName@20
+WSAAsyncGetProtoByName@20
+WSAAsyncGetProtoByNumber@20
+WSAAsyncGetServByName@24
+WSAAsyncGetServByPort@24
+WSAAsyncSelect@16
+WSACancelAsyncRequest@4
+WSACancelBlockingCall@0
+WSACleanup@0
+WSACloseEvent@4
+WSAConnect@28
+WSACreateEvent@0
+WSADuplicateSocketA@12
+WSADuplicateSocketW@12
+WSAEnumNameSpaceProvidersA@8
+WSAEnumNameSpaceProvidersW@8
+WSAEnumNetworkEvents@12
+WSAEnumProtocolsA@12
+WSAEnumProtocolsW@12
+WSAEventSelect@12
+WSAGetLastError@0
+WSAGetOverlappedResult@20
+WSAGetQOSByName@12
+WSAGetServiceClassInfoA@16
+WSAGetServiceClassInfoW@16
+WSAGetServiceClassNameByClassIdA@12
+WSAGetServiceClassNameByClassIdW@12
+WSAHtonl@12
+WSAHtons@12
+WSAInstallServiceClassA@4
+WSAInstallServiceClassW@4
+WSAIoctl@36
+WSAIsBlocking@0
+WSAJoinLeaf@32
+WSALookupServiceBeginA@12
+WSALookupServiceBeginW@12
+WSALookupServiceEnd@4
+WSALookupServiceNextA@16
+WSALookupServiceNextW@16
+WSANtohl@12
+WSANtohs@12
+WSAProviderConfigChange@12
+WSARecv@28
+WSARecvDisconnect@8
+WSARecvFrom@36
+WSARemoveServiceClass@4
+WSAResetEvent@4
+WSASend@28
+WSASendDisconnect@8
+WSASendTo@36
+WSASetBlockingHook@4
+WSASetEvent@4
+WSASetLastError@4
+WSASetServiceA@12
+WSASetServiceW@12
+WSASocketA@24
+WSASocketW@24
+WSAStartup@8
+WSAStringToAddressA@20
+WSAStringToAddressW@20
+WSAUnhookBlockingHook@0
+WSAWaitForMultipleEvents@20
+WSCDeinstallProvider@8
+WSCEnableNSProvider@8
+WSCEnumProtocols@16
+WSCGetProviderPath@16
+WSCInstallNameSpace@20
+WSCInstallProvider@20
+WSCUnInstallNameSpace@4
+__WSAFDIsSet@8
+accept@12
+bind@12
+closesocket@4
+connect@12
+gethostbyaddr@12
+gethostbyname@4
+gethostname@8
+getpeername@12
+getprotobyname@4
+getprotobynumber@4
+getservbyname@8
+getservbyport@8
+getsockname@12
+getsockopt@20
+htonl@4
+htons@4
+inet_addr@4
+inet_ntoa@4
+ioctlsocket@12
+listen@8
+ntohl@4
+ntohs@4
+recv@16
+recvfrom@24
+select@20
+send@16
+sendto@24
+setsockopt@20
+shutdown@8
+socket@12
diff --git a/winsup/w32api/lib/wsock32.def b/winsup/w32api/lib/wsock32.def
new file mode 100644
index 000000000..67a8a750f
--- /dev/null
+++ b/winsup/w32api/lib/wsock32.def
@@ -0,0 +1,75 @@
+LIBRARY WSOCK32.DLL
+EXPORTS
+AcceptEx@32
+EnumProtocolsA@12
+EnumProtocolsW@12
+GetAcceptExSockaddrs@32
+GetAddressByNameA@40
+GetAddressByNameW@40
+GetNameByTypeA@12
+GetNameByTypeW@12
+GetServiceA@28
+GetServiceW@28
+GetTypeByNameA@8
+GetTypeByNameW@8
+NPLoadNameSpaces@12
+SetServiceA@24
+SetServiceW@24
+TransmitFile@28
+WSAAsyncGetHostByAddr@28
+WSAAsyncGetHostByName@20
+WSAAsyncGetProtoByName@20
+WSAAsyncGetProtoByNumber@20
+WSAAsyncGetServByName@24
+WSAAsyncGetServByPort@24
+WSAAsyncSelect@16
+WSACancelAsyncRequest@4
+WSACancelBlockingCall@0
+WSACleanup@0
+WSAGetLastError@0
+WSAIsBlocking@0
+WSARecvEx@16
+WSASetBlockingHook@4
+WSASetLastError@4
+WSAStartup@8
+WSAUnhookBlockingHook@0
+WSApSetPostRoutine@4
+__WSAFDIsSet@8
+accept@12
+bind@12
+closesocket@4
+connect@12
+dn_expand@20
+gethostbyaddr@12
+gethostbyname@4
+gethostname@8
+getnetbyname@4
+getpeername@12
+getprotobyname@4
+getprotobynumber@4
+getservbyname@8
+getservbyport@8
+getsockname@12
+getsockopt@20
+htonl@4
+htons@4
+inet_addr@4
+inet_network@4
+inet_ntoa@4
+ioctlsocket@12
+listen@8
+ntohl@4
+ntohs@4
+rcmd@24
+recv@16
+recvfrom@24
+rexec@24
+rresvport@4
+s_perror@8
+select@20
+send@16
+sendto@24
+sethostname@8
+setsockopt@20
+shutdown@8
+socket@12
diff --git a/winsup/w32api/lib/wst.def b/winsup/w32api/lib/wst.def
new file mode 100644
index 000000000..e80170ada
--- /dev/null
+++ b/winsup/w32api/lib/wst.def
@@ -0,0 +1,3 @@
+LIBRARY WST.DLL
+EXPORTS
+_penter