From: SMTP%"DSJ@WKUVX1.WKU.EDU" 9-APR-1994 15:19:52.26 To: EVERHART CC: Subj: DECEMBER93.NT-IO X-FileServer: Digital Systems Journal File Server Date: Sat, 09 Apr 1994 14:21:51 CDT Sender: DSJ-Mgr@WKUVX1.WKU.EDU Errors-To: DSJ-Mgr@WKUVX1.WKU.EDU Warnings-To: <> From: DSJ-Mgr@WKUVX1.WKU.EDU Reply-To: DSJ@WKUVX1.WKU.EDU Subject: DECEMBER93.NT-IO To: EVERHART@arisia.gce.com $! ------------------ CUT HERE ----------------------- $ v='f$verify(f$trnlnm("SHARE_UNPACK_VERIFY"))' $! $! This archive created: $! Name : NT-IO $! By : Hunter Goatley $! Date : 4-FEB-1994 11:36:00.66 $! Using: VMS_SHARE 8.4, (C) 1993 Andy Harper, Kings College London UK $! $! Credit is due to these people for their original ideas: $! James Gray, Michael Bednarek $! $! TO UNPACK THIS SHARE FILE, CONCATENATE ALL PARTS IN ORDER $! AND EXECUTE AS A COMMAND PROCEDURE ( @name ) $! $! THE FOLLOWING FILE(S) WILL BE CREATED AFTER UNPACKING: $! 1. NT-IO.DSJ;1 $! $ set="set" $ set symbol/scope=(nolocal,noglobal) $ f=f$parse("SHARE_UNPACK_TEMP","SYS$SCRATCH:."+f$getjpi("","PID")) $ e="write sys$error ""%UNPACK"", " $ w="write sys$output ""%UNPACK"", " $ if .not. f$trnlnm("SHARE_UNPACK_LOG") then $ w = "!" $ if f$getsyi("CPU") .gt. 127 then $ goto start $ ve=f$getsyi("version") $ if ve-f$extract(0,1,ve) .ges. "4.4" then $ goto start $ e "-E-OLDVER, Must run at least VMS 4.4" $ v=f$verify(v) $ exit 44 $unpack: subroutine ! P1=filename, P2=checksum, P3=attributes,P4=size $ if f$parse(P1) .nes. "" then $ goto dirok $ dn=f$parse(P1,,,"DIRECTORY") $ w "-I-CREDIR, Creating directory ''dn'" $ create/dir 'dn' $ if $status then $ goto dirok $ e "-E-CREDIRFAIL, Unable to create ''dn' File skipped" $ delete 'f'* $ exit $dirok: $ x=f$search(P1) $ if x .eqs. "" then $ goto file_absent $ e "-W-EXISTS, File ''P1' exists. Skipped" $ delete 'f'* $ exit $file_absent: $ w "-I-UNPACK, Unpacking ", P5, " of ", P6, " - ", P1, " - ", P4, " Blocks" $ n=P1 $ if P3 .nes. "" then $ n=f $ if .not. f$verify() then $ define/user sys$output nl: $ EDIT/TPU/NOSEC/NODIS/COM=SYS$INPUT/NOJOURNAL 'f'/OUT='n' PROCEDURE GetHex(s,p)LOCAL x1,x2;x1:=INDEX(t,SUBSTR(s,p,1))-1;x2:=INDEX(t, SUBSTR(s,p+1,1))-1;RETURN 16*x1+x2;ENDPROCEDURE;PROCEDURE SkipPartsep LOCAL m; LOOP m:=MARK(NONE);EXITIF m=END_OF(b);DELETE(m);EXITIF INDEX(ERASE_LINE, "-+-+-+-+-+-+-+-+")=1;ENDLOOP;ENDPROCEDURE;PROCEDURE ProcessLine LOCAL c,s,l,b, n,p;c := ERASE_CHARACTER(1);s := ERASE_LINE;IF c = "X" THEN SPLIT_LINE; ENDIF; MOVE_HORIZONTAL(-1);l := LENGTH(s);p := 1;LOOP EXITIF p > l;c := SUBSTR(s,p,1); p := p+1;CASE c FROM ' ' TO '`' ['`']: COPY_TEXT(ASCII(GetHex(s,p))); p:=p+2;[ ' ']: p:=p+1;[INRANGE,OUTRANGE]: COPY_TEXT(c);ENDCASE;ENDLOOP;ENDPROCEDURE; PROCEDURE Decode LOCAL m;POSITION(BEGINNING_OF(b));LOOP m:=MARK(NONE);EXITIF m= END_OF(b);DELETE(m);IF INDEX(CURRENT_LINE,"+-+-+-+-+-+-+-+-")= 1 THEN SkipPartSep;ELSE ProcessLine;MOVE_HORIZONTAL(1);ENDIF;ENDLOOP; ENDPROCEDURE;SET(FACILITY_NAME,"UNPACK");SET(SUCCESS,OFF);SET(INFORMATIONAL, OFF);t:="0123456789ABCDEF";f:=GET_INFO(COMMAND_LINE,"file_name");b:= CREATE_BUFFER(f,f);Decode;WRITE_FILE(b,GET_INFO(COMMAND_LINE,"output_file")); QUIT; $ if p3 .eqs. "" then $ goto dl $ open/write fdl &f $ write fdl "RECORD" $ write fdl P3 $ close fdl $ w "-I-CONVRFM, Converting record format to ", P3 $ convert/fdl=&f &f-1 &P1 $dl: delete 'f'* $ checksum 'P1' $ if checksum$checksum .nes. P2 then $ - e "-E-CHKSMFAIL, Checksum of ''P1' failed." $ exit $ endsubroutine $start: $! $ create 'f' X X X/* X`20*`20async_openvms.c`20-`20demonstrate`20output`20to`20serial`20port`20 X`20*`20`20`20`20`20`20`20`20`20`20`20`20`20`20using`20async`20I/O`20under`20Op VenVMS X`20*/ X X#include`20descrip X#include`20iodef X#include`20ssdef X#include`20stdio X X#define`20SS_FAIL(sts)`20((0`20==`20((sts)`20`26`201))) X#define`20NLINES`20200 X#define`20SUCCESS`20SS$_NORMAL X X/*`20global`20storage`20*/ X Xunsigned`20long`20My_flag; Xunsigned`20short`20Ttchan; Xstruct`20`7B X`20`20unsigned`20short`20status; X`20`20unsigned`20short`20bytcnt; X`20`20unsigned`20long`20devdep; X`7D`20Ttiosb; X X/*`20forward`20function`20declarations`20*/ X Xvoid`20start_a_write(unsigned`20long`20n); Xvoid`20write_ast(unsigned`20long`20n); X Xmain() X`7B X`20`20$DESCRIPTOR(ttname_dsc,`20"TERMINAL"); X`20`20unsigned`20long`20openvmssts; X X`20`20/*`20assign`20a`20channel`20to`20the`20terminal`20port`20*/ X X`20`20openvmssts`20=`20SYS$ASSIGN(`26ttname_dsc,`20`26Ttchan,`200,`200,`200); V X X X X`20`20if`20(SS_FAIL(openvmssts)) X`20`20`20`20`20`20`20`20LIB$STOP(openvmssts); X X`20`20/*`20set`20up`20a`20local`20event`20flag`20*/ X X`20`20openvmssts`20=`20LIB$GET_EF(`26My_flag);`20`20`20`20/*`20allocate`20it V`20*/ X`20`20if`20(SS_FAIL(openvmssts)) X`20`20`20`20`20`20`20`20LIB$STOP(openvmssts); X X`20`20openvmssts`20=`20SYS$CLREF(My_flag);`20`20`20`20`20`20/*`20and`20clear V`20it`20*/ X`20`20if`20(SS_FAIL(openvmssts)) X`20`20`20`20`20`20`20`20LIB$STOP(openvmssts); X X`20`20/*`20start`20the`20first`20write`20*/ X X`20`20start_a_write(1); X X`20`20/*`20wait`20until`20done`20*/ X X`20`20openvmssts`20=`20SYS$WAITFR(My_flag); X`20`20if`20(SS_FAIL(openvmssts)) X`20`20`20`20`20`20`20`20LIB$STOP(openvmssts); X X`20`20return`20SUCCESS; X`7D X Xvoid Xstart_a_write(unsigned`20long`20n) X`7B X`20`20char`20outstr`5B80`5D; X`20`20unsigned`20long`20openvmssts; X X`20`20sprintf(outstr,`20"This`20is`20line`20%d`5Cr`5Cn",`20n); X`20`20openvmssts`20=`20SYS$QIO(0,`20Ttchan,`20IO$_WRITEVBLK,`20`26Ttiosb,`20 X`20`20`20`20`20`20`20`20`26write_ast,`20n,`20outstr,`20strlen(outstr),`200,`20 V0,`200,`200); X X`20`20if`20(SS_FAIL(openvmssts)) X`20`20`20`20`20`20`20`20LIB$STOP(openvmssts); X X`20`20return; X`7D X Xvoid Xwrite_ast(unsigned`20long`20n) X`7B X`20`20unsigned`20long`20openvmssts; X X`20`20if`20(n`20>=`20NLINES)`20`7B X`20`20`20`20`20`20`20`20openvmssts`20=`20SYS$SETEF(My_flag); X`20`20`20`20`20`20`20`20if`20(SS_FAIL(openvmssts)) X`20`20`20`20`20`20`20`20`20`20LIB$STOP(openvmssts); X X X X`20`20`7D X`20`20else`20`7B X`20`20`20`20`20`20`20`20start_a_write(n+1); X`20`20`7D X`7D X X(end) X X X`0C X X X#include`20 X#include`20 X Xvoid`20main`20() X`7B X`20`20`20`20`20`20`20`20printf("Hello,`20world.`5Cn"); X`20`20`20`20`20`20`20`20printf("hit`20any`20key`20to`20continue...`20"); X`20`20`20`20`20`20`20`20getch(); X`20`20`20`20`20`20`20`20return; X`7D X X`0C X X/* X`20*`20serio.c`20-`20demonstrate`20output`20to`20serial`20port X`20*`20using`20"with-wait"`20WriteFile`20call.`20 X`20*`20Jamie`20Hanrahan,`20jeh@cmkrnl.com,`2001-Oct-1993 X`20*/ X X#include`20 X#include`20 X#include`20 X#include`20 X#include`20 X X#define`20NLINES`20200 X Xint`20main`20() X`7B X`20`20`20`20`20`20`20`20DCB`20`20`20`20`20`20`20`20`20`20`20`20`20`20dcb_old, V`20dcb_new;`20`20`20`20`20`20/*`20device`20control`20blocks`20-`20see`20Vol`20 V3 Xpg`20523`20*/ X`20`20`20`20`20`20`20`20HANDLE`20`20`20port_handle; X`20`20`20`20`20`20`20`20DWORD`20`20`20`20the_error; X`20`20`20`20`20`20`20`20BOOL`20`20`20`20`20status; X`20`20`20`20`20`20`20`20char`20`20`20`20`20write_buffer`5B80`5D; X`20`20`20`20`20`20`20`20DWORD`20`20`20`20nbytes; X`20`20`20`20`20`20`20`20DWORD`20`20`20`20nbytes_actual; X`20`20`20`20`20`20`20`20int`20`20`20`20`20`20`20`20`20`20`20`20`20`20i; X X X X X`20`20`20`20`20`20`20`20port_handle`20=`20CreateFile( X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20"COM2", X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20GENERIC_READ`20`7C`20GENERIC_W VRITE,`20`20`20`20`20`20`20`20`20`20`20/*`20required`20for`20comm`20dvcs`20*/ X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`200,`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20 X`20`20`20`20`20`20`20`20/*`20exclusive`20access`20-`20req'd`20*/ X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20NULL,`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20/*`20no Xsecurity`20attributes`20*/ X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20OPEN_EXISTING,`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20/*`20required Xfor`20comm`20dvcs`20*/ X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`200,`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20 X`20`20`20`20`20`20`20`20/*`20not`20overlapped`20I/O`20*/ X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20NULL);`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20/*`20required Xfor`20comm`20dvcs`20*/ X X`20`20`20`20`20`20`20`20if`20(port_handle`20==`20INVALID_HANDLE_VALUE)`20`7B X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20the_error`20=`20GetLastError() V; X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20return`20the_error; X`20`20`20`20`20`20`20`20`7D X X`20`20`20`20`20`20`20`20/*`20get`20the`20current`20state`20of`20the`20port`20s Vo`20we`20can`20modify`20it`20and`20 X`20`20`20`20`20`20`20`20`20*`20restore`20it`20*/ X X`20`20`20`20`20`20`20`20status`20=`20GetCommState(port_handle,`20`26dcb_old); V X`20`20`20`20`20`20`20`20if`20(!status)`20`7B X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20printf("Error`20from`20GetComm VState()`5Cn"); X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20return`20EXIT_FAILURE; X`20`20`20`20`20`20`20`20`7D X X`20`20`20`20`20`20`20`20/*`20specify`20our`20changes`20*/ X X`20`20`20`20`20`20`20`20dcb_new`20=`20dcb_old; X`20`20`20`20`20`20`20`20dcb_new.BaudRate`20=`209600; X`20`20`20`20`20`20`20`20dcb_new.ByteSize`20=`208; X`20`20`20`20`20`20`20`20dcb_new.Parity`20=`20NOPARITY; X`20`20`20`20`20`20`20`20dcb_new.StopBits`20=`20ONESTOPBIT; X X`20`20`20`20`20`20`20`20status`20=`20SetCommState(port_handle,`20`26dcb_new); V X X`20`20`20`20`20`20`20`20if`20(!status)`20`7B X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20printf("Error`20from`20SetComm VState()`5Cn"); X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20return`20EXIT_FAILURE; X`20`20`20`20`20`20`20`20`7D X X`20`20`20`20`20`20`20`20/*`20do`20some`20output`20*/ X X`20`20`20`20`20`20`20`20for`20(i`20=`201;`20i`20<=`20NLINES;`20i++)`20`7B X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20sprintf(write_buffer,`20"This V`20is`20line`20%d`5Cr`5Cn",`20i); X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20nbytes`20=`20strlen(write_buff Ver); X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20status`20=`20WriteFile( X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20port_h Vandle, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20write_ Vbuffer, X X X X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20nbytes V,`20 X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`26nby Vtes_actual, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20NULL); V X`20`20`20`20`20`20`20`20`7D X X`20`20`20`20`20`20`20`20/*`20restore`20the`20port`20*/ X X`20`20`20`20`20`20`20`20status`20=`20SetCommState(port_handle,`20`26dcb_old); V X X`20`20`20`20`20`20`20`20if`20(!status)`20`7B X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20printf("Error`20from`20SetComm VState()`5Cn"); X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20return`20EXIT_FAILURE; X`20`20`20`20`20`20`20`20`7D X X`20`20`20`20`20`20`20`20return`20EXIT_SUCCESS; X`7D X X X`0C X X/* X`20*`20serio_nw.c`20-`20demonstrate`20output`20to`20serial`20port X`20*`20using`20"overlapped"`20WriteFile`20call.`20 X`20*`20Jamie`20Hanrahan,`20jeh@cmkrnl.com,`2001-Oct-1993 X`20*/ X X#include`20 X#include`20 X#include`20 X#include`20 X#include`20 X#include`20 X X#define`20NLINES`20200 X#define`20TIMEOUT`201000`20`20`20`20/*`20one`20second`20*/ X Xint`20main`20() X`7B X`20`20`20`20`20`20`20`20DCB`20`20`20`20`20`20`20`20`20`20`20`20`20`20dcb_old, V`20dcb_new;`20`20`20`20`20`20/*`20device`20control`20blocks`20-`20see`20Vol`20 V3 Xpg`20523`20*/ X`20`20`20`20`20`20`20`20HANDLE`20`20`20port_handle; X`20`20`20`20`20`20`20`20DWORD`20`20`20`20the_error; X`20`20`20`20`20`20`20`20BOOL`20`20`20`20`20status; X`20`20`20`20`20`20`20`20OVERLAPPED`20port_olap; X`20`20`20`20`20`20`20`20char`20`20`20`20`20write_buffer`5B80`5D; X`20`20`20`20`20`20`20`20DWORD`20`20`20`20nbytes; X`20`20`20`20`20`20`20`20DWORD`20`20`20`20nbytes_actual; X`20`20`20`20`20`20`20`20int`20`20`20`20`20`20`20`20`20`20`20`20`20`20i; X`20`20`20`20`20`20`20`20DWORD`20`20`20`20wait_status; X X`20`20`20`20`20`20`20`20port_handle`20=`20CreateFile( X X X X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20"COM2", X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20GENERIC_READ`20`7C`20GENERIC_W VRITE,`20`20`20`20`20`20`20`20`20`20`20/*`20required`20for`20comm`20dvcs`20*/ X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`200,`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20 X`20`20`20`20`20`20`20`20/*`20exclusive`20access`20-`20req'd`20*/ X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20NULL,`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20/*`20no Xsecurity`20attributes`20*/ X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20OPEN_EXISTING,`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20/*`20required Xfor`20comm`20dvcs`20*/ X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20FILE_FLAG_OVERLAPPED, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20NULL);`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20/*`20required Xfor`20comm`20dvcs`20*/ X X`20`20`20`20`20`20`20`20if`20(port_handle`20==`20INVALID_HANDLE_VALUE)`20`7B X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20the_error`20=`20GetLastError() V; X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20return`20the_error; X`20`20`20`20`20`20`20`20`7D X X`20`20`20`20`20`20`20`20/*`20create`20an`20event`20object`20for`20use`20with V`20the`20overlapped`20IO`20*/ X X`20`20`20`20`20`20`20`20port_olap.hEvent`20=`20CreateEvent(NULL,`20TRUE,`20FAL VSE,`20NULL); X`20`20`20`20`20`20`20`20assert(port_olap.hEvent); X`20`20`20`20`20`20`20`20assert(ResetEvent(port_olap.hEvent)); X`20`20`20`20`20`20`20`20 X`20`20`20`20`20`20`20`20/*`20get`20the`20current`20state`20of`20the`20port`20s Vo`20we`20can`20modify`20it`20and`20 X`20`20`20`20`20`20`20`20`20*`20restore`20it`20*/ X X`20`20`20`20`20`20`20`20status`20=`20GetCommState(port_handle,`20`26dcb_old); V X`20`20`20`20`20`20`20`20if`20(!status)`20`7B X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20printf("Error`20from`20GetComm VState()`5Cn"); X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20return`20EXIT_FAILURE; X`20`20`20`20`20`20`20`20`7D X X`20`20`20`20`20`20`20`20/*`20specify`20our`20changes`20*/ X X`20`20`20`20`20`20`20`20dcb_new`20=`20dcb_old; X`20`20`20`20`20`20`20`20dcb_new.BaudRate`20=`209600; X`20`20`20`20`20`20`20`20dcb_new.ByteSize`20=`208; X`20`20`20`20`20`20`20`20dcb_new.Parity`20=`20NOPARITY; X`20`20`20`20`20`20`20`20dcb_new.StopBits`20=`20ONESTOPBIT; X X`20`20`20`20`20`20`20`20status`20=`20SetCommState(port_handle,`20`26dcb_new); V X X`20`20`20`20`20`20`20`20if`20(!status)`20`7B X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20printf("Error`20from`20SetComm VState()`5Cn"); X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20return`20EXIT_FAILURE; X`20`20`20`20`20`20`20`20`7D X X`20`20`20`20`20`20`20`20/*`20do`20some`20output`20*/ X X`20`20`20`20`20`20`20`20for`20(i`20=`201;`20i`20<=`20NLINES;`20i++)`20`7B X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20sprintf(write_buffer,`20"This V`20is`20line`20%d`5Cr`5Cn",`20i); X X X X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20nbytes`20=`20strlen(write_buff Ver); X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20status`20=`20WriteFile( X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20port_h Vandle, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20write_ Vbuffer, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20nbytes V,`20 X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`26nbytes_actual, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`26por Vt_olap); X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20 X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20wait_status`20=`20WaitForSingl VeObject(port_olap.hEvent,`20TIMEOUT); X X`20`20`20`20`20`20`20`20`7D X X`20`20`20`20`20`20`20`20/*`20restore`20the`20port`20*/ X X`20`20`20`20`20`20`20`20status`20=`20SetCommState(port_handle,`20`26dcb_old); V X X`20`20`20`20`20`20`20`20if`20(!status)`20`7B X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20printf("Error`20from`20SetComm VState()`5Cn"); X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20return`20EXIT_FAILURE; X`20`20`20`20`20`20`20`20`7D X X`20`20`20`20`20`20`20`20return`20EXIT_SUCCESS; X`7D X X X`0C X X/* X`20*`20serio_as.c`20-`20demonstrate`20output`20to`20serial`20port X`20*`20using`20"overlapped"`20WriteFileEx`20call,`20with`20async`20thread.`20 V X`20*`20Jamie`20Hanrahan,`20jeh@cmkrnl.com,`2001-Oct-1993 X`20*/ X X#include`20 X#include`20 X#include`20 X#include`20 X#include`20 X X#define`20NLINES`20200 X XHANDLE`20`20`20port_handle,`20done_event; XOVERLAPPED`20port_olap; X XVOID`20WINAPI`20`20`20`20`20write_compl_rtn(DWORD`20fileError,`20DWORD`20bytec Vount,`20OVERLAPPED`20*olap); Xvoid`20`20`20`20start_a_write(); X Xint`20main`20() X`7B X`20`20`20`20`20`20`20`20DCB`20`20`20`20`20`20`20`20`20`20`20`20`20`20dcb_old, V`20dcb_new;`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20/*`20device Xcontrol`20blocks`20*/ X X X X`20`20`20`20`20`20`20`20BOOL`20`20`20`20`20status; X X`20`20`20`20`20`20`20`20port_handle`20=`20CreateFile( X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20"COM2", X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20GENERIC_READ`20`7C`20GENERIC_W VRITE,`20`20`20`20`20`20`20`20`20`20`20/*`20required`20for`20comm`20dvcs`20*/ X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`200,`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20 X`20`20`20`20`20`20`20`20/*`20exclusive`20access`20-`20req'd`20*/ X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20NULL,`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20/*`20no Xsecurity`20attributes`20*/ X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20OPEN_EXISTING,`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20/*`20required Xfor`20comm`20dvcs`20*/ X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20FILE_FLAG_OVERLAPPED, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20NULL);`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20/*`20required Xfor`20comm`20dvcs`20*/ X X`20`20`20`20`20`20`20`20if`20(port_handle`20==`20INVALID_HANDLE_VALUE) X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20return`20GetLastError(); X X`20`20`20`20`20`20`20`20/*`20create`20an`20event`20object`20for`20use`20with V`20the`20overlapped`20IO`20*/ X X`20`20`20`20`20`20`20`20port_olap.hEvent`20=`20CreateEvent(NULL,`20TRUE,`20FAL VSE,`20NULL); X`20`20`20`20`20`20`20`20if`20(port_olap.hEvent`20==`20NULL) X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20return`20GetLastError(); X X`20`20`20`20`20`20`20`20/*`20create`20an`20event`20object`20for`20the`20overal Vl`20wait-for-done`20*/ X X`20`20`20`20`20`20`20`20done_event`20=`20CreateEvent(NULL,`20TRUE,`20FALSE,`20 VNULL); X`20`20`20`20`20`20`20`20if`20(done_event`20==`20NULL) X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20return`20GetLastError(); X X`20`20`20`20`20`20`20`20/*`20get`20the`20current`20state`20of`20the`20port`20s Vo`20we`20can`20modify`20it`20and`20 X`20`20`20`20`20`20`20`20`20*`20restore`20it`20*/ X X`20`20`20`20`20`20`20`20status`20=`20GetCommState(port_handle,`20`26dcb_old); V X`20`20`20`20`20`20`20`20if`20(!status)`20`7B X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20printf("Error`20from`20GetComm VState()`5Cn"); X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20return`20EXIT_FAILURE; X`20`20`20`20`20`20`20`20`7D X X`20`20`20`20`20`20`20`20/*`20specify`20our`20changes`20*/ X X`20`20`20`20`20`20`20`20dcb_new`20=`20dcb_old; X`20`20`20`20`20`20`20`20dcb_new.BaudRate`20=`209600; X`20`20`20`20`20`20`20`20dcb_new.ByteSize`20=`208; X`20`20`20`20`20`20`20`20dcb_new.Parity`20=`20NOPARITY; X`20`20`20`20`20`20`20`20dcb_new.StopBits`20=`20ONESTOPBIT; X X`20`20`20`20`20`20`20`20status`20=`20SetCommState(port_handle,`20`26dcb_new); V X X`20`20`20`20`20`20`20`20if`20(!status)`20`7B X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20printf("Error`20from`20SetComm VState()`5Cn"); X X X X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20return`20EXIT_FAILURE; X`20`20`20`20`20`20`20`20`7D X X`20`20`20`20`20`20`20`20/*`20call`20the`20output`20routine`20for`20the`20first V`20time`20*/ X X`20`20`20`20`20`20`20`20start_a_write(1); X X`20`20`20`20`20`20`20`20/*`20wait`20until`20all`20done`20*/ X X`20`20`20`20`20`20`20`20while`20(WAIT_OBJECT_0`20!=`20 X`20`20`20`20`20`20`20`20`20WaitForSingleObjectEx(done_event,`20INFINITE,`20TRU VE)) X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20contin Vue; X X`20`20`20`20`20`20`20`20/*`20restore`20the`20port`20*/ X X`20`20`20`20`20`20`20`20status`20=`20SetCommState(port_handle,`20`26dcb_old); V X X`20`20`20`20`20`20`20`20if`20(!status)`20`7B X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20printf("Error`20from`20SetComm VState()`5Cn"); X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20return`20EXIT_FAILURE; X`20`20`20`20`20`20`20`20`7D X X`20`20`20`20`20`20`20`20return`20EXIT_SUCCESS; X`7D X Xvoid Xstart_a_write(DWORD`20n) X`7B X`20`20`20`20`20`20`20`20char`20`20`20`20`20write_buffer`5B80`5D; X`20`20`20`20`20`20`20`20DWORD`20`20`20`20nbytes; X`20`20`20`20`20`20`20`20BOOL`20`20`20`20`20status; X X`20`20`20`20`20`20`20`20/*`20do`20a`20line`20of`20output`20*/ X X`20`20`20`20`20`20`20`20sprintf(write_buffer,`20"This`20is`20line`20%d`5Cr`5Cn V",`20n); X`20`20`20`20`20`20`20`20nbytes`20=`20strlen(write_buffer); X`20`20`20`20`20`20`20`20(DWORD)port_olap.hEvent`20=`20n; X`20`20`20`20`20`20`20`20status`20=`20WriteFileEx( X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20port_handle, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20write_buffer, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20nbytes,`20 X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`26port_olap, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`26write_compl_rtn); X`7D X XVOID`20WINAPI Xwrite_compl_rtn(DWORD`20fileError,`20DWORD`20bytecount,`20OVERLAPPED`20*olap) V X`7B X`20`20`20`20`20`20`20`20DWORD`20i; X X`20`20`20`20`20`20`20`20i`20=`20(DWORD)olap->hEvent; X X X X`20`20`20`20`20`20`20`20if`20(i`20>=`20NLINES) X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20SetEvent(done_event); X`20`20`20`20`20`20`20`20else X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20start_a_write(i+1); X`7D $ call unpack NT-IO.DSJ;1 2130783049 "" 23 1 1 $ v=f$verify(v) $ exit