From: SMTP%"DSJ@WKUVX1.WKU.EDU" 9-APR-1994 15:24:58.90 To: EVERHART CC: Subj: APRIL94.W32API Message-Id: <9404091922.AA24066@uu7.psi.com> X-Fileserver: Digital Systems Journal File Server Date: Sat, 09 Apr 1994 14:22:57 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: APRIL94.W32API To: EVERHART@arisia.gce.com $! ------------------ CUT HERE ----------------------- $ v='f$verify(f$trnlnm("SHARE_UNPACK_VERIFY"))' $! $! This archive created: $! Name : W32API $! By : @WKUVX1.BITNET $! Date : 8-APR-1994 05:09:46.78 $! 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. W32API.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`20*`20pipesrvr.c`20-`20a`20server`20that`20talks X`20*`20to`20its`20clients`20via`20named`20pipes X`20*/ X X#include`20 X#include`20 X#include`20 X#include`20 X X#define`20MAX_PIPES`204 X#define`20BUFSIZE`20255 X#define`20PIPE_TIMEOUT`2060000`09/*`20milliseconds`20*/ X Xstruct`20thread_ctx_s`20`7B X`09HANDLE`09pipe; X`09DWORD`09threadId; X`7D; X X/*`20forward`20definitions`20of`20functions`20*/ X XVOID`20server_thread(struct`20thread_ctx_s`20*ctx); XDWORD`20get_answer(CHAR`20*bffr); X Xlong Xmain() X`7B X`09BOOL`09`20connected; X`09HANDLE`09`20pipe,`20thread; X`09char`09*pipename`20=`20"`5C`5C`5C`5C.`5C`5Cpipe`5C`5Cdsj_demo_pipe"; X`09struct`20thread_ctx_s`20*ctx; X X`20`20`20/*`20main`20loop`20*/ X X`09while`20(TRUE)`20`7B`09`09`09`09`09/*`20loop`20forever`20*/ X X`09`09/*`20creat`20an`20instance`20of`20the`20named`20pipe`20*/ X X`09`09pipe`20=`20CreateNamedPipe( X`20`20`20`20`20`20`20`20`09pipename, X`09`09`09PIPE_ACCESS_DUPLEX,`20`20`20`20`20/*`20read/write`20access`20`20*/ X`09`09`09PIPE_TYPE_MESSAGE`20`7C`09`09/*`20data`20is`20written`20in`20msgs`20* V/ X`09`09`09`20PIPE_READMODE_MESSAGE`20`7C`20`20`20/*`20read`20in`20msgs`20too`20 V*/ X`09`09`09PIPE_WAIT,`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20/*`20i/o`20 Vto`20pipe`20will`20block X`09`09`09`09`09`09`09`09`09if`20can't`20complete`20*/ X`09`09`09MAX_PIPES,`09`09`09`09/*`20max.`20instances`20*/ X`09`09`09BUFSIZE,`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20/*`20ou Vtput`20buffer`20size`20*/ X`09`09`09BUFSIZE,`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20/*`20in Vput`20buffer`20size`20`20*/ X`09`09`09PIPE_TIMEOUT,`20`20`20`20`20`20`20`20`20`20`20`20`20/*`20client`20tim Ve-out`20`20`20`20*/ X`09`09`09NULL);`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20/* V`20no`20security`20attr.`20`20*/ X X`09`09if`20(pipe`20==`20INVALID_HANDLE_VALUE) X`20`20`20`20`20`20`20`20`09return`20GetLastError(); X X`09`09/*`20wait`20for`20a`20client`20to`20show`20up`20*/ X X`09`09connected`20=`20ConnectNamedPipe(pipe,`20NULL); X X`09`09/*`20it`20is`20possible`20for`20the`20client`20to`20connect`20during X`09`09`20*`20the`20period`20between`20the`20CreateNamedPipe`20and X`09`09`20*`20ConnectNamedPipe`20calls.`20`20In`20this`20case`20ConnectNamedPip Ve X`09`09`20*`20will`20return`200,`20but`20GetLastError`20will`20return X`09`09`20*`20ERROR_PIPE_CONNECTED.`20`20This`20is`20actually`20a`20successful V X`09`09`20*`20connection`20now`20that`20we've`20gotten`20around`20to`20calling V X`09`09`20*`20ConnectNamedPipe,`20so`20treat`20it`20as`20such.`20*/ X X`09`09if`20(!connected) X`09`09`09connected`20=`20(GetLastError()`20==`20ERROR_PIPE_CONNECTED); X X`09`09if`20(!connected)`20`7B X X`09`09`09/*`20client`20couldn't`20connect,`20so`20close`20this`20handle`20*/ X`09`09`09CloseHandle(pipe); X X`09`09`7D X`09`09else`20`7B X X`09`09`09/*`20create`20a`20thread`20to`20service`20the`20new`20client`20*/ X`09`09`09 X`09`09`09ctx`20=`20malloc(sizeof(struct`20thread_ctx_s)); X`09`09`09ctx->pipe`20=`20pipe; X X`09`09`09thread`20=`20CreateThread( X`20`20`20`20`20`20`20`20`20`20`20`20`20`20NULL,`20`20`20`20`20`20`20`20`20`20 V`20/*`20no`20security`20attr.`20`20`20`20*/ X`20`20`20`20`20`20`20`20`20`20`20`20`20`200,`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20/*`20default`20stack`20size`20`20`20*/ X`20`20`20`20`20`20`20`20`20`20`20`20`20`20(LPTHREAD_START_ROUTINE)`20server_th Vread, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20(LPVOID)ctx,`09/*`20thread`20paramet Ver`20=context`20block`20*/ X`20`20`20`20`20`20`20`20`20`20`20`20`20`200,`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20/*`20not`20suspended`20`20`20`20`20`20`20`20*/ X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`26(ctx->threadId));`09/*`20returns V`20thread`20ID`20`20`20`20*/ X X`09`09`09if`20(thread`20==`20INVALID_HANDLE_VALUE) X`09`09`09`09return`20GetLastError(); X`20`20`20`20`09`7D X`09`7D X`09return`20EXIT_SUCCESS; X`7D X X/*`20this`20function`20is`20run`20in`20a`20thread`20created`20for`20each`20cli Vent`20*/ X XVOID Xserver_thread(struct`20thread_ctx_s`20*ctx) X`7B X`09CHAR`09buffer`5BBUFSIZE`5D; X`09DWORD`20nbytes_in,`20nbytes_out,`20nbytes_written; X`09BOOL`20sts; X X`09printf("started`20server`20thread`20id`20%d`5Cn",`20ctx->threadId); X X`09while`20(TRUE)`20`7B`09`09/*`20loop`20until`20we`20break`20*/ X X`09`09/*`20read`20a`20"buffer"`20from`20the`20pipe`20*/ X X`09`09sts`20=`20ReadFile( X`20`20`20`20`20`20`20`20`09ctx->pipe,`20`20`20`20`20`20`20/*`20handle`20to`20" Vfile"`20(pipe)`20*/ X`20`20`20`20`20`20`20`20`20`20`09buffer,`20`20`20`20`09/*`20buffer`20to`20rece Vive`20data`20*/ X`09`09`09BUFSIZE,`20`20`20`20`20`20`09/*`20size`20of`20buffer`20`20`20`20`20 V`20`20`20`20*/ X`20`09`09`09`26nbytes_in,`20`09/*`20number`20of`20bytes`20we`20got`20*/ X`20`20`20`20`20`20`20`20`20`09NULL);`20`20`20`20`20`20`20`20`09/*`20not`20over Vlapped`20I/O`20`20`20`20`20*/ X X`09`09/*`20terminate`20on`20a`20zero-length`20message`20*/ X X`09`09if`20(!sts`20`7C`7C`20nbytes_in`20==`200) X`09`09`09break; X X`09`09/*`20service`20the`20buffer`20*/ X X`09`09printf("thread`20id`20%d`20input`20was`20<%s>`5Cn",`20ctx->threadId,`20b Vuffer); X`09`09get_answer(buffer); X`09`09printf("thread`20id`20%d`20output`20is`20<%s>`5Cn",`20ctx->threadId,`20b Vuffer); X`09`09nbytes_out`20=`20strlen(buffer)`20+`201; X X`09`09/*`20send`20the`20answer`20*/ X X`09`09sts`20=`20WriteFile( X`09`09`09ctx->pipe,`20`20`20`20`20`20/*`20handle`20to`20"file"`20(pipe)`20*/ X`09`09`09buffer,`09`09`09/*`20buffer`20to`20write`20from`20`20`20`20`20*/ X`20`20`20`09`09`09nbytes_out,`20`09/*`20number`20of`20bytes`20to`20write`20*/ V X`20`20`20`20`20`20`20`20`20`09`26nbytes_written,/*`20nbytes`20actually`20writt Ven`20*/ X`09`09`09NULL);`09`09`09/*`20not`20overlapped`20I/O`20`20`20`20`20`20`20*/ X X`09`09/*`20terminate`20on`20error`20or`20if`20we`20didn't X`09`09`20*`20write`20all`20we`20wanted`20to`20*/ X X`09`09if`20(!sts`20`7C`7C`20nbytes_out`20!=`20nbytes_written) X`09`09`09break; X`09`7D X X`09/*`20flush`20lets`20the`20client`20read`20the`20last`20message`20before`20w Ve X`09`20*`20disconnect`20*/ X X`09FlushFileBuffers(ctx->pipe); X`09DisconnectNamedPipe(ctx->pipe); X`09CloseHandle(ctx->pipe); X`09printf("thread`20id`20%d`20ending`5Cn",`20ctx->threadId); X`7D X XDWORD Xget_answer(CHAR`20*bffr) X`7B X`09/*`20a`20mostly-dummy`20procedure`20to`20demonstrate`20doing`20something X`09`20*`20with`20the`20data`20read`20from`20the`20pipe...`20*/ X X`09char`09*cpin`20=`20bffr; X`09DWORD`09`20n`20=`200; X X`09while`20(*cpin)`20`7B X`09`09*cpin`20=`20tolower(*cpin); X`09`09cpin++; X`09`09n++; X`09`7D X`09return`20n; X`7D X X X X(((((end))))) X X X`0C X X#include`20 X#include`20 X#include`20 X#include`20 X X X#define`20BUFSIZE`20255 X XDWORD`20open_the_console(HANDLE`20*write_handle,`20HANDLE`20*read_handle); X Xvoid Xmain() X`7B X`09HANDLE`09`20pipe,`20console_in,`20console_out; X`09CHAR`09`20buffer`5BBUFSIZE`5D; X`09BOOL`09`20sts,`20done; X`09DWORD`09`20nbytes_in,`20nbytes_out,`20lasterr,`20pipemode; X`09char`09*pipename`20=`20"`5C`5C`5C`5C.`5C`5Cpipe`5C`5Cdsj_demo_pipe"; X X`09/*`20open`20a`20handle`20to`20the`20console`20*/ X X`09lasterr`20=`20open_the_console(`26console_out,`20`26console_in); X`09if`20(lasterr`20!=`20NO_ERROR)`20`7B X`09`09printf("Error`20opening`20console`5Cn"); X`09`09exit(EXIT_FAILURE); X`09`7D`09`09 X X`09/*`20open`20a`20pipe`20to`20the`20server`20*/ X X`09pipe`20=`20CreateFile( X`20`20`20`20`20`20`20`09pipename, X`09`09GENERIC_READ`20`7C`20`20/*`20read/write`20access`20`20`20*/ X`20`20`20`20`20`20`20`09GENERIC_WRITE, X`20`20`20`20`20`20`20`090,`20`20`20`20`20`20`20`20`20`20`20`20`20`20/*`20no`20 Vsharing`20`20`20`20`20`20`20`20`20`20*/ X`09`09NULL,`20`20`20`20`20`20`20`20`20`20`20/*`20no`20security`20attr.`20`20 V`20*/ X`20`20`20`20`20`20`20`09OPEN_EXISTING,`20`20/*`20opens`20existing`20pipe`20*/ V X`20`20`20`20`20`20`20`090,`20`20`20`20`20`20`20`20`20`20`20`20`20`20/*`20defau Vlt`20attributes`20`20*/ X`20`20`20`20`20`20`20`09NULL);`20`20`20`20`20`20`20`20`20`20/*`20no`20template V`20file`20`20`20`20*/ X X`09/*`20give`20up`20on`20error`20*/ X`09`09 X`20`20`20`09if`20(pipe`20==`20INVALID_HANDLE_VALUE)`20`7B X`09`09printf("Error`20connecting`20to`20pipe`5Cn"); X`09`09exit(EXIT_FAILURE); X`09`7D X X`09/*`20The`20pipe`20connected.`20`20Set`20its`20read`20mode`20to`20message`20 V*/ X X`09pipemode`20=`20PIPE_READMODE_MESSAGE; X`09sts`20=`20SetNamedPipeHandleState( X`09`09pipe,`20`20`20`20/*`20pipe`20handle`20`20`20`20`20`20`20`20`20`20*/ X`20`20`20`20`20`20`09`26pipemode,`20/*`20new`20pipe`20mode`20`20`20`20`20`20 V`20`20*/ X`20`20`20`20`20`20`09NULL,`20`20`20`20`20/*`20don't`20change`20max`20bytes`20* V/ X`20`20`20`20`20`20`09NULL);`20`20`20`20/*`20`20`20or`20max`20time`20`20*/ X X`09if`20(!sts)`20`7B X`09`09printf("Error`20setting`20pipe`20mode`5Cn"); X`09`09exit(EXIT_FAILURE); X`09`7D X`20`20`20 X`09done`20=`20FALSE; X`09while`20(!`20done)`20`7B X X`09`09/*`20get`20a`20line`20of`20text`20from`20the`20console`20and`20send X`09`09`20*`20it`20to`20the`20server`20*/ X X`09`09sts`20=`20ReadConsole( X`09`09`09console_in,`20buffer,`20BUFSIZE,`20`26nbytes_in,`20NULL); X X`09`09if`20(!sts)`20`7B X`09`09`09printf("Error`20reading`20console`5Cn"); X`09`09`09exit(EXIT_FAILURE); X`09`09`7D X X`09`09nbytes_in`20=`20nbytes_in`20-`202;`09/*`20account`20for`20CRLF`20*/ X`09`09if`20(nbytes_in`20==`200)`20`7B X`09`09`09done`20=`20TRUE; X`09`09`09continue; X`09`09`7D X X`09`09buffer`5Bnbytes_in`5D`20=`20'`5C0';`09/*`20terminate`20the`20string`20*/ V X X`09`09printf("Input`20string`20is`20%s`5Cn",`20buffer); X X`09`09sts`20=`20WriteFile( X`09`09`09pipe,`20`20`20`20`20`20`20`20`20`20`20`09/*`20pipe`20handle`20`20`20 V`20`20*/ X`09`09`09buffer,`09`09`09`09/*`20message`20`20`20`20`20`20`20`20`20*/ X`09`09`09strlen(buffer)`20+`201,`20/*`20length`20(incl`20the`20null`20byte)`20 V*/ X`09`09`09`26nbytes_out,`20`20`20`20`20`20`20`20/*`20bytes`20written`20`20`20*/ V X`09`09`09NULL);`20`20`20`20`20`20`20`20`20`20`20`20`20`20/*`20not`20overlapped V`20`20*/ X X`09`09if`20(!sts)`20`7B X`09`20`20`20`20`09`09printf("Error`20writing`20to`20pipe`5Cn"); X`09`09`09exit(EXIT_FAILURE); X`09`09`7D X X`09`09/*`20read`20the`20server's`20response`20and`20write`20it`20to`20the`20co Vnsole`20*/ X X`09`09sts`20=`20ReadFile( X`09`20`20`20`20`20`20`20`20pipe,`20buffer,`20BUFSIZE,`20`26nbytes_in,`20NULL); V X X`09`20`20`20`20if`20(!sts)`20`7B X`09`09`09printf("Error`20reading`20from`20pipe`5Cn"); X`09`09`09exit(EXIT_FAILURE); X`09`09`7D X X`09`09printf("returned`20string`20is`20<%s>`5Cn",`20buffer); X`09`7D X X`09CloseHandle(pipe); X X`09exit(EXIT_SUCCESS); X`7D X XDWORD Xopen_the_console(HANDLE`20*write_handle,`20HANDLE`20*read_handle) X`7B X`09*write_handle`20=`20GetStdHandle(STD_OUTPUT_HANDLE); X`09if`20(*write_handle`20==`20INVALID_HANDLE_VALUE) X`09`09return`20GetLastError(); X X`09*read_handle`20=`20GetStdHandle(STD_INPUT_HANDLE); X`09if`20(*read_handle`20==`20INVALID_HANDLE_VALUE) X`09`09return`20GetLastError(); X X`09return`20NO_ERROR; X`7D X X(((((`20end`20))))) X X`0C X X/* X`20*`20shrmem1`20-`20demonstrate`20shared`20memory`20via`20a`20mapped`20file X`20*/ X X#include`20 X#include`20 X#include`20 X#include`20 X X#define`20SETFILEPTR_BADSTS`200xFFFFFFFF X#define`20MAPSIZ`20512 X#define`20LOOPCOUNT`20100000 X XDWORD Xmain() X`7B X`09DWORD`09sts,`20i,`20start,`20end; X`09HANDLE`09thefile,`20write_evt,`20read_evt,`20file_map; X`09char`09*buffer; X`09PROCESS_INFORMATION`20procinfo; X`09STARTUPINFO`20startinfo; X X`09/*`20first`20create`20a`20pair`20of`20event`20objects`20*/ X X`09write_evt`20=`20CreateEvent( X`09`09NULL,`09`09`09`09/*`20default`20security`20*/ X`09`09FALSE,`09`09`09`09/*`20not`20manual`20reset`20=`20auto-reset`20*/ X`09`09FALSE,`09`09`09`09/*`20initial`20state`20nonsignalled`20*/ X`09`09"ShMemWriteDone");`09/*`20the`20name`20*/ X X`09if`20(write_evt`20==`20NULL) X`09`09return(GetLastError()); X X`09read_evt`20=`20CreateEvent( X`09`09NULL, X`09`09FALSE, X`09`09TRUE,`09`09`09`09/*`20initial`20state`20signalled`20*/ X`09`09"ShMemReadDone");`09/*`20the`20name`20*/ X X`09if`20(read_evt`20==`20NULL) X`09`09return(GetLastError()); X X`09/*`20now`20set`20up`20the`20file`20mapping: X`09`20*`20first`20create`20a`20handle`20to`20the`20file`20*/ X X`09thefile`20=`20CreateFile("MEMMAP.DAT", X`09`09GENERIC_READ`20`7C`20GENERIC_WRITE,`20`09`09/*`20access`20allowed`20*/ X`09`09FILE_SHARE_WRITE,`09/*`20sharing`20allowed`20*/ X`09`09NULL,`09`09`09`09/*`20default`20security`20*/ X`09`09OPEN_ALWAYS,`09`09/*`20open`20if`20exists,`20create`20if`20not`20*/ X`09`090,`09`09`09`09`09/*`20no`20file`20options`20*/ X`09`09NULL);`09`09`09`09/*`20no`20template`20file`20*/ X X`09if`20(thefile`20==`20INVALID_HANDLE_VALUE) X`09`09return(GetLastError()); X X`09/*`20make`20sure`20the`20file`20is`20big`20enough`20*/ X X`09sts`20=`20SetFilePointer(thefile, X`09`09MAPSIZ,`09/*`20set`20file`20pointer`20ahead`20by`20MAPSIZ`20bytes`20*/ X`09`09NULL,`09`09/*`20no`20high`20dword`20of`20distance`20to`20move`20*/ X`09`09FILE_BEGIN);`09/*`20starting`20point`20is`20begin`20of`20file`20*/ X X`09if`20(sts`20==`20SETFILEPTR_BADSTS) X`09`09return`20GetLastError(); X X`09/*`20now`20extend`20the`20file`20to`20reach`20the`20new`20pointer`20locatio Vn`20*/ X X`09sts`20=`20SetEndOfFile(thefile); X`09if`20(!sts) X`09`09return`20GetLastError(); X X`09/*`20create`20the`20mapping`20of`20the`20file`20*/ X X`09file_map`20=`20CreateFileMapping(thefile, X`09`09NULL,`09`09/*`20default`20security`20*/ X`09`09PAGE_READWRITE,`09/*`20shared`20r/w`20access`20*/ X`09`090,`20MAPSIZ,`09`09/*`20size`20of`20mapping`20object`20*/ X`09`09"MyMap"); X`09if`20(file_map`20==`20NULL) X`09`09return`20GetLastError(); X X`09/*`20finally,`20map`20our`20v.a.s.`20to`20the`20file`20*/ X X`09buffer`20=`20MapViewOfFile( X`09`09file_map,`09`09/*`20the`20mapping`20object`20*/ X`09`09FILE_MAP_WRITE,`09/*`20read/write`20access`20*/ X`09`090,`200,`20`09`09`09/*`20high,`20low`20of`20file`20offset`20*/ X`09`09MAPSIZ);`09`09`09/*`20size`20of`20region`20to`20map`20*/ X`09if`20(buffer`20==`20NULL) X`09`09return`20GetLastError(); X X`09/*`20now`20create`20another`20process`20which`20will`20access X`09`20*`20the`20same`20mapping`20object`20and`20the`20same`20events`20*/ X X`09GetStartupInfo(`26startinfo); X`09sts`20=`20CreateProcess( X`09`09"SHRMEM2.EXE",`09`09`09/*`20image`20name`20*/ X`09`09NULL,`20`09`09`09`09/*`20command`20line`20*/ X`09`09NULL,`20NULL,`09/*`20default`20proc`20and`20thread`20sec'y`20*/ X`09`09FALSE,`20`09`09`09`09/*`20don't`20inherit`20handles`20*/ X`09`090,`20`09`09`09`09`09/*`20default`20flags`20*/ X`09`09NULL,`09`09`09`09/*`20use`20caller's`20env`20block`20*/ X`09`09NULL,`09`09`09`09/*`20use`20existing`20drive`20and`20direc`20*/ X`09`09`26startinfo,`09`09`09/*`20startup`20info`20structure`20*/ X`09`09`26procinfo); X X`09if`20(!sts) X`09`09return`20GetLastError(); X X`09time(`26start); X X`09for`20(i`20=`200;`20i`20<`20LOOPCOUNT;`20i++)`20`7B X`09`09WaitForSingleObject(read_evt,`20INFINITE); X`09`09time((long`20*)buffer); X`09`09SetEvent(write_evt); X`09`7D X X`09time(`26end); X`09printf("End`20of`20test,`20%d`20iterations`20in`20%d`20seconds`5Cn",`20LOOP VCOUNT,`20end-start); X`09TerminateProcess(procinfo.hProcess,`20EXIT_SUCCESS); X`09printf("done`5Cn"); X`7D X X(((((`20end`20))))) X X`0C X X/* X`20*`20shrmem2`20-`20slave`20for`20shrmem1 X`20*/ X X#include`20 X#include`20 X#include`20 X#include`20 X X#define`20MAPSIZ`20512 X XDWORD Xmain() X`7B X`09HANDLE`09write_evt,`20read_evt,`20file_map; X`09char`09*buffer; X X`09/*`20open`20handles`20to`20the`20event`20objects`20*/ X X`09write_evt`20=`20OpenEvent( X`09`09EVENT_ALL_ACCESS, X`09`09FALSE,`09`09`09`09/*`20not`20inheritable`20handle`20*/ X`09`09"ShMemWriteDone");`09/*`20the`20name`20*/ X X`09if`20(write_evt`20==`20NULL) X`09`09return(GetLastError()); X X`09read_evt`20=`20OpenEvent( X`09`09EVENT_ALL_ACCESS, X`09`09FALSE,`09`09`09`09/*`20not`20inheritable`20handle`20*/ X`09`09"ShMemReadDone");`09/*`20the`20name`20*/ X X`09if`20(read_evt`20==`20NULL) X`09`09return(GetLastError()); X X`09/*`20now`20set`20up`20the`20file`20mapping`20*/ X X`09file_map`20=`20OpenFileMapping( X`09`09FILE_MAP_WRITE, X`09`09FALSE,`09`09`09/*`20handle`20is`20not`20inheritable`20*/ X`09`09"MyMap"); X`09if`20(file_map`20==`20NULL) X`09`09return`20GetLastError(); X X`09buffer`20=`20MapViewOfFile( X`09`09file_map,`09`09/*`20the`20mapping`20object`20*/ X`09`09FILE_MAP_WRITE,`09/*`20read/write`20access`20*/ X`09`090,`200,`20`09`09`09/*`20high,`20low`20of`20file`20offset`20*/ X`09`09MAPSIZ);`09`09`09/*`20size`20of`20region`20to`20map`20*/ X X`09if`20(buffer`20==`20NULL) X`09`09return`20GetLastError(); X X`09/*`20here`20we`20go`20*/ X`09`09 X`09while`20(TRUE)`20`7B X`09`09WaitForSingleObject(write_evt,`20INFINITE); X`09`09*buffer`20=`202*(*buffer); X`09`09SetEvent(read_evt); X`09`7D X X`7D X X(((((`20end`20))))) X X $ call unpack W32API.DSJ;1 1415925467 "" 23 1 1 $ v=f$verify(v) $ exit