diff --git a/library/bootstrap/boot-stage2.factor b/library/bootstrap/boot-stage2.factor index 14aa3b40d0..65ea33d409 100644 --- a/library/bootstrap/boot-stage2.factor +++ b/library/bootstrap/boot-stage2.factor @@ -154,6 +154,20 @@ USE: stdio dup print run-resource ] each + +os "win32" = [ + [ + "/library/io/buffer.factor" + "/library/win32/win32-io.factor" + "/library/win32/win32-errors.factor" + "/library/io/win32-io-internals.factor" + "/library/io/win32-stream.factor" + "/library/io/win32-console.factor" + ] [ + dup print + run-resource + ] each +] when cpu "x86" = [ [ diff --git a/library/bootstrap/init-stage2.factor b/library/bootstrap/init-stage2.factor index dc89ac815b..e40c7f23d1 100644 --- a/library/bootstrap/init-stage2.factor +++ b/library/bootstrap/init-stage2.factor @@ -27,6 +27,8 @@ IN: kernel USE: ansi +USE: win32-console +USE: alien USE: compiler USE: errors USE: inference @@ -67,8 +69,19 @@ USE: unparser "ansi" get [ stdio [ ] change ] when + os "win32" = "compile" get and [ + "kernel32" "kernel32.dll" "stdcall" add-library + "user32" "user32.dll" "stdcall" add-library + "gdi32" "gdi32.dll" "stdcall" add-library + "libc" "msvcrt.dll" "cdecl" add-library + ] when + "compile" get [ compile-all ] when + os "win32" = "compile" get and [ + stdio [ ] change + ] when + run-user-init ; : auto-inline-count 5 ; diff --git a/library/compiler/alien.factor b/library/compiler/alien.factor index 54ab18c060..d54389a6bc 100644 --- a/library/compiler/alien.factor +++ b/library/compiler/alien.factor @@ -63,7 +63,15 @@ M: alien = ( obj obj -- ? ) "dll" get dup [ drop "name" get dlopen dup "dll" set ] unless ; - + +: add-library ( library name abi -- ) + "libraries" get [ + [ + "abi" set + "name" set + ] extend put + ] bind ; + SYMBOL: #c-invoke ( C ABI -- Unix and some Windows libs ) SYMBOL: #cleanup ( unwind stack by parameter ) @@ -148,3 +156,4 @@ SYMBOL: alien-parameters global [ "libraries" get [ "libraries" set ] unless ] bind + diff --git a/library/io/buffer.factor b/library/io/buffer.factor new file mode 100644 index 0000000000..20092ea5a3 --- /dev/null +++ b/library/io/buffer.factor @@ -0,0 +1,104 @@ +! :folding=indent:collapseFolds=1: + +! $Id$ +! +! Copyright (C) 2004 Slava Pestov. +! +! 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. +! +! THIS SOFTWARE IS PROVIDED ``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 +! DEVELOPERS AND 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. + +IN: buffer + +USE: alien +USE: errors +USE: kernel +USE: kernel-internals +USE: math +USE: namespaces +USE: strings +USE: win32-api + +: imalloc ( size -- address ) + "int" "libc" "malloc" [ "int" ] alien-invoke ; + +: ifree ( address -- ) + "void" "libc" "free" [ "int" ] alien-invoke ; + +: ( size -- buffer ) + #! Allocates and returns a new buffer. + [ + dup "size" set + imalloc "buffer" set + 0 "fill" set + 0 "pos" set + ] extend ; + +: buffer-free ( buffer -- ) + #! Frees the C memory associated with the buffer. + [ "buffer" get ifree ] bind ; + +: buffer-contents ( buffer -- string ) + #! Returns the current contents of the buffer. + [ + "buffer" get "pos" get + + "fill" get "pos" get - + memory>string + ] bind ; + +: buffer-reset ( count buffer -- ) + #! Reset the position to 0 and the fill pointer to count. + [ 0 "pos" set "fill" set ] bind ; + +: buffer-consume ( count buffer -- ) + #! Consume count characters from the beginning of the buffer. + [ "pos" [ + "fill" get min ] change ] bind ; + +: buffer-length ( buffer -- length ) + #! Returns the amount of unconsumed input in the buffer. + [ "fill" get "pos" get - max ] bind ; + +: buffer-set ( string buffer -- ) + #! Set the contents of a buffer to string. + [ + dup "buffer" get string>memory + str-length namespace buffer-reset + ] bind ; + +: buffer-append ( string buffer -- ) + #! Appends a string to the end of the buffer. If it doesn't fit, + #! an error is thrown. + [ + dup "size" get "fill" get - swap str-length < [ + "Buffer overflow" throw + ] when + dup "buffer" get "fill" get + string>memory + "fill" [ swap str-length + ] change + ] bind ; + +: buffer-fill ( buffer quot -- ) + #! Execute quot with buffer as its argument, passing its result to + #! buffer-reset. + swap dup >r swap call r> buffer-reset ; inline + +: buffer-ptr ( buffer -- pointer ) + #! Returns the memory address of the buffer area. + [ "buffer" get ] bind ; + diff --git a/library/io/win32-console.factor b/library/io/win32-console.factor new file mode 100644 index 0000000000..9d55898db8 --- /dev/null +++ b/library/io/win32-console.factor @@ -0,0 +1,86 @@ +! :folding=indent:collapseFolds=1: + +! $Id$ +! +! Copyright (C) 2004 Slava Pestov. +! +! 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. +! +! THIS SOFTWARE IS PROVIDED ``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 +! DEVELOPERS AND 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. + +IN: win32-console + +USE: lists +USE: vectors +USE: math +USE: kernel +USE: namespaces +USE: stdio +USE: streams +USE: presentation +USE: generic +USE: parser +USE: compiler +USE: win32-api + +TRAITS: win32-console-stream +SYMBOL: handle + +: reset ( -- ) + handle get 7 SetConsoleTextAttribute drop ; + +: ansi>win32 ( ansi-attr -- win32-attr ) + #! Converts an ANSI color (0-based) to a combination of + #! _RED, _BLUE, and _GREEN bit flags. + { 0 4 2 6 1 5 3 7 } vector-nth ; + +: set-bold ( attr ? -- attr ) + #! Set or unset the bold bit (bit 3). + [ 8 bitor ] [ 8 bitnot bitand ] ifte ; + +: set-fg ( attr n -- attr ) + #! Set the foreground field (bits 0..2). + swap 7 bitnot bitand bitor ; + +: set-bg ( attr n -- attr ) + #! Set the background field (bits 4..6). + 4 shift swap 112 bitnot bitand bitor ; + +: char-attrs ( style -- attrs ) + #! Converts a style into a win32 text attribute bitfield. + 7 ! Default style is white FG, black BG, no extra bits + "bold" pick assoc [ set-bold ] when* + "ansi-fg" pick assoc [ str>number ansi>win32 set-fg ] when* + "ansi-bg" pick assoc [ str>number ansi>win32 set-bg ] when* + nip ; + +: set-attrs ( style -- ) + char-attrs handle get swap SetConsoleTextAttribute drop ; + +M: win32-console-stream fwrite-attr ( string style stream -- ) + [ + [ default-style ] unless* set-attrs + delegate get fwrite + reset + ] bind ; + +C: win32-console-stream ( stream -- stream ) + [ delegate set -11 GetStdHandle handle set ] extend ; + diff --git a/library/io/win32-io-internals.factor b/library/io/win32-io-internals.factor new file mode 100644 index 0000000000..1d75e98cfb --- /dev/null +++ b/library/io/win32-io-internals.factor @@ -0,0 +1,62 @@ +! :folding=indent:collapseFolds=1: + +! $Id$ +! +! Copyright (C) 2004 Slava Pestov. +! +! 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. +! +! THIS SOFTWARE IS PROVIDED ``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 +! DEVELOPERS AND 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. + +IN: win32-io-internals +USE: alien +USE: kernel +USE: lists +USE: math +USE: namespaces +USE: win32-api + +: win32-init-stdio ( -- ) + INVALID_HANDLE_VALUE NULL NULL 1 CreateIoCompletionPort + "completion-port" set ; + +: get-access ( -- file-mode ) + 0 "file-mode" get uncons >r + [ GENERIC_WRITE ] [ 0 ] ifte bitor r> + [ GENERIC_READ ] [ 0 ] ifte bitor ; + +: get-sharemode ( -- share-mode ) + FILE_SHARE_READ FILE_SHARE_WRITE bitor FILE_SHARE_DELETE bitor ; + +: get-create ( -- creation-disposition ) + "file-mode" get uncons [ + [ OPEN_ALWAYS ] [ CREATE_ALWAYS ] ifte + ] [ + [ OPEN_EXISTING ] [ 0 ] ifte + ] ifte ; + +: win32-open-file ( file r w -- handle ) + [ + cons "file-mode" set + get-access get-sharemode NULL get-create FILE_FLAG_OVERLAPPED NULL + CreateFile dup INVALID_HANDLE_VALUE = [ win32-throw-error ] when + dup "completion-port" get NULL 1 CreateIoCompletionPort drop + ] with-scope ; + diff --git a/library/io/win32-stream.factor b/library/io/win32-stream.factor new file mode 100644 index 0000000000..230b75f435 --- /dev/null +++ b/library/io/win32-stream.factor @@ -0,0 +1,64 @@ +! :folding=indent:collapseFolds=1: + +! $Id$ +! +! Copyright (C) 2004 Slava Pestov. +! +! 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. +! +! THIS SOFTWARE IS PROVIDED ``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 +! DEVELOPERS AND 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. + +IN: win32-stream +USE: alien +USE: buffer +USE: generic +USE: kernel +USE: lists +USE: math +USE: namespaces +USE: stdio +USE: streams +USE: win32-api +USE: win32-io-internals + +TRAITS: win32-stream +GENERIC: update-file-pointer + +M: win32-stream fwrite-attr ( str style stream -- ) + nip fwrite ; + +M: win32-stream freadln ( stream -- str ) + drop f ; + +M: win32-stream fread# ( count stream -- str ) + drop f ; + +M: win32-stream fflush ( stream -- ) + drop ; + +M: win32-stream fclose ( stream -- ) + [ "handle" get CloseHandle drop "buffer" get buffer-free ] bind ; + +C: win32-stream ( handle -- stream ) + [ "handle" set 4096 "buffer" set 0 "fp" set ] extend ; + +: ( path -- stream ) + t f win32-open-file ; + diff --git a/library/win32/win32-errors.factor b/library/win32/win32-errors.factor new file mode 100644 index 0000000000..e1c957a205 --- /dev/null +++ b/library/win32/win32-errors.factor @@ -0,0 +1,66 @@ +! :folding=indent:collapseFolds=1: + +! $Id$ +! +! Copyright (C) 2004 Slava Pestov. +! +! 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. +! +! THIS SOFTWARE IS PROVIDED ``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 +! DEVELOPERS AND 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. + +IN: win32-api +USE: buffer +USE: errors +USE: kernel +USE: math +USE: alien + +: FORMAT_MESSAGE_ALLOCATE_BUFFER HEX: 00000100 ; +: FORMAT_MESSAGE_IGNORE_INSERTS HEX: 00000200 ; +: FORMAT_MESSAGE_FROM_STRING HEX: 00000400 ; +: FORMAT_MESSAGE_FROM_HMODULE HEX: 00000800 ; +: FORMAT_MESSAGE_FROM_SYSTEM HEX: 00001000 ; +: FORMAT_MESSAGE_ARGUMENT_ARRAY HEX: 00002000 ; +: FORMAT_MESSAGE_MAX_WIDTH_MASK HEX: 000000FF ; + +: MAKELANGID ( primary sub -- lang ) + 10 shift bitor ; + +: LANG_NEUTRAL 0 ; +: SUBLANG_DEFAULT 1 ; + +: GetLastError ( -- int ) + "int" "kernel32" "GetLastError" [ ] alien-invoke ; + +: FormatMessage ( flags source messageid langid buf size args -- int ) + "int" "kernel32" "FormatMessageA" + [ "int" "void*" "int" "int" "void*" "int" "void*" ] + alien-invoke ; + +: win32-error-message ( id -- string ) + 4096 dup >r >r >r + FORMAT_MESSAGE_FROM_SYSTEM NULL r> + LANG_NEUTRAL SUBLANG_DEFAULT MAKELANGID r> buffer-ptr 4096 NULL + FormatMessage r> 2dup buffer-reset nip dup buffer-contents + swap buffer-free ; + +: win32-throw-error ( -- ) + GetLastError win32-error-message throw ; + diff --git a/library/win32/win32-io.factor b/library/win32/win32-io.factor new file mode 100644 index 0000000000..b9957af9b8 --- /dev/null +++ b/library/win32/win32-io.factor @@ -0,0 +1,109 @@ +! :folding=indent:collapseFolds=1: + +! $Id$ +! +! Copyright (C) 2004 Slava Pestov. +! +! 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. +! +! THIS SOFTWARE IS PROVIDED ``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 +! DEVELOPERS AND 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. + +IN: win32-api +USE: kernel +USE: alien + +BEGIN-STRUCT: overlapped-ext + FIELD: int internal + FIELD: int internal-high + FIELD: int offset + FIELD: int offset-high + FIELD: void* event + FIELD: int user-data +END-STRUCT + +: GENERIC_READ HEX: 80000000 ; +: GENERIC_WRITE HEX: 40000000 ; +: GENERIC_EXECUTE HEX: 20000000 ; +: GENERIC_ALL HEX: 10000000 ; + +: CREATE_NEW 1 ; +: CREATE_ALWAYS 2 ; +: OPEN_EXISTING 3 ; +: OPEN_ALWAYS 4 ; +: TRUNCATE_EXISTING 5 ; + +: FILE_SHARE_READ 1 ; +: FILE_SHARE_WRITE 2 ; +: FILE_SHARE_DELETE 4 ; + +: FILE_FLAG_WRITE_THROUGH HEX: 80000000 ; +: FILE_FLAG_OVERLAPPED HEX: 40000000 ; +: FILE_FLAG_NO_BUFFERING HEX: 20000000 ; +: FILE_FLAG_RANDOM_ACCESS HEX: 10000000 ; +: FILE_FLAG_SEQUENTIAL_SCAN HEX: 08000000 ; +: FILE_FLAG_DELETE_ON_CLOSE HEX: 04000000 ; +: FILE_FLAG_BACKUP_SEMANTICS HEX: 02000000 ; +: FILE_FLAG_POSIX_SEMANTICS HEX: 01000000 ; +: FILE_FLAG_OPEN_REPARSE_POINT HEX: 00200000 ; +: FILE_FLAG_OPEN_NO_RECALL HEX: 00100000 ; +: FILE_FLAG_FIRST_PIPE_INSTANCE HEX: 00080000 ; + +: STD_INPUT_HANDLE -10 ; +: STD_OUTPUT_HANDLE -11 ; +: STD_ERROR_HANDLE -12 ; + +: INVALID_HANDLE_VALUE -1 ; + +: GetStdHandle ( id -- handle ) + "void*" "kernel32" "GetStdHandle" [ "int" ] alien-invoke ; + +: SetConsoleTextAttribute ( handle attrs -- ? ) + "bool" "kernel32" "SetConsoleTextAttribute" [ "void*" "int" ] + alien-invoke ; + +: GetConsoleTitle ( buf size -- len ) + "int" "kernel32" "GetConsoleTitleA" [ "int" "int" ] alien-invoke ; + +: SetConsoleTitle ( str -- ? ) + "bool" "kernel32" "SetConsoleTitleA" [ "char*" ] alien-invoke ; + +: ReadFile ( handle buffer len out-len overlapped -- ? ) + "bool" "kernel32" "ReadFile" + [ "void*" "int" "int" "void*" "overlapped-ext*" ] + alien-invoke ; + +: WriteFile ( handle buffer len out-len overlapped -- ? ) + "bool" "kernel32" "WriteFile" + [ "void*" "int" "int" "void*" "overlapped-ext*" ] + alien-invoke ; + +: CreateIoCompletionPort ( handle existing-port key numthreads -- ) + "void*" "kernel32" "CreateIoCompletionPort" + [ "void*" "void*" "void*" "int" ] + alien-invoke ; + +: CreateFile ( name access sharemode security create flags template -- handle ) + "void*" "kernel32" "CreateFileA" + [ "char*" "int" "int" "void*" "int" "int" "void*" ] + alien-invoke ; + +: CloseHandle ( handle -- ? ) + "bool" "kernel32" "CloseHandle" [ "void*" ] alien-invoke ; +