NTSTATUS DispatchReadWriteFlush(PDEVICE_OBJECT fdo, PIRP Irp) { KIRQL OldIrql; ULONG count; PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) fdo->DeviceExtension; PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation( Irp ); if(stack->MajorFunction == IRP_MJ_WRITE) { if(stack->Parameters.Write.Length == 0) { return CompleteRequest( Irp, STATUS_SUCCESS, 0 ); } // write IoMarkIrpPending(Irp); StartPacket( &pdx->dqWrite, fdo, Irp, OnCancelWrite ); } else if(stack->MajorFunction == IRP_MJ_READ) { if(stack->Parameters.Read.Length == 0) { return CompleteRequest( Irp, STATUS_SUCCESS, 0 ); } // read IoAcquireRemoveLock( &pdx->RemoveLock, Irp ); IoMarkIrpPending ( Irp ); IoSetCancelRoutine ( Irp, OnCancelQueuedRead ); KeAcquireSpinLock( &pdx->ReadIrpLock, &OldIrql ); InsertTailList ( &pdx->ReadIrpList, &Irp->Tail.Overlay.ListEntry ); KeReleaseSpinLock( &pdx->ReadIrpLock, OldIrql ); CompleteQueuedReads(pdx); } else { // flush IoMarkIrpPending( Irp ); StartPacket ( &pdx->dqWrite, fdo, Irp, OnCancelWrite ); } return STATUS_PENDING; }
static unsigned DoAccess( void ) { unsigned left; unsigned len; unsigned i; unsigned piece; _DBG_EnterFunc( "DoAccess()" ); _DBG_Writeln( "StartPacket" ); StartPacket(); if( Out_Mx_Num == 0 ) { /* Tell the server we're not expecting anything back */ *(access_req *)In_Mx_Ptr[0].ptr |= 0x80; } for( i = 0; i < In_Mx_Num; ++i ) { _DBG_Writeln( "AddPacket" ); AddPacket( In_Mx_Ptr[i].len, In_Mx_Ptr[i].ptr ); } *(access_req *)In_Mx_Ptr[0].ptr &= ~0x80; _DBG_Writeln( "PutPacket" ); PutPacket(); if( Out_Mx_Num != 0 ) { _DBG_Writeln( "GetPacket" ); len = GetPacket(); left = len; for( i = 0; i < Out_Mx_Num && left > 0; ++i ) { if( left > Out_Mx_Ptr[i].len ) { piece = Out_Mx_Ptr[i].len; } else { piece = left; } _DBG_Writeln( "RemovePacket" ); RemovePacket( piece, Out_Mx_Ptr[i].ptr ); left -= piece; } } else { len = 0; left = 0; } _DBG_ExitFunc( "DoAccess()" ); return( len - left ); }
static trap_elen DoAccess( void ) { trap_elen left; trap_elen len; trap_elen i; trap_elen piece; _DBG_EnterFunc( "DoAccess()" ); _DBG_Writeln( "StartPacket" ); StartPacket(); if( Out_Mx_Num == 0 ) { /* Tell the server we're not expecting anything back */ TRP_REQUEST( In_Mx_Ptr ) |= 0x80; } for( i = 0; i < In_Mx_Num; ++i ) { _DBG_Writeln( "AddPacket" ); AddPacket( In_Mx_Ptr[i].ptr, In_Mx_Ptr[i].len ); } TRP_REQUEST( In_Mx_Ptr ) &= ~0x80; _DBG_Writeln( "PutPacket" ); PutPacket(); if( Out_Mx_Num != 0 ) { _DBG_Writeln( "GetPacket" ); len = GetPacket(); left = len; for( i = 0; i < Out_Mx_Num && left > 0; ++i ) { if( left > Out_Mx_Ptr[i].len ) { piece = Out_Mx_Ptr[i].len; } else { piece = left; } _DBG_Writeln( "RemovePacket" ); RemovePacket( Out_Mx_Ptr[i].ptr, piece ); left -= piece; } } else { len = 0; left = 0; } _DBG_ExitFunc( "DoAccess()" ); return( len - left ); }
static void StuffSample(BAROMETER *bp, ISIDL_TIMESTAMP *ttag, INT32 value) { char timestring[32]; static char *fid = "qdplus:StuffSample"; /* Since there are some startup delays in the barometer reading thread, * we will discard all "missed" samples until we've seen one valid * sample come through here. That will prevent the first packet from * having a couple of unwarrented "missed" samples at the front. */ if (!bp->ValidSampleSeen) { if (value == MISSED_BAROMETER_SAMPLE) { return; } else { bp->ValidSampleSeen = TRUE; } } if (bp->nsamp == 0) { InsertQdplusSerialno(&bp->local.raw, bp->format.qdplus.serialno); bp->out = StartPacket(&bp->local.raw, ttag, bp); } bp->out[bp->nsamp++] = htonl(value); if (BarometerDebugEnabled()) { utilLttostr(ttag->sys, 0, timestring); LogMsg(LOG_INFO, "%s %3d/%d: %s %ld\n", bp->param.sn, bp->nsamp, bp->maxsamp, timestring, value); } if (bp->nsamp == bp->maxsamp) { FinishPacket(&bp->local.raw, (UINT16) bp->nsamp, ttag); bp->nsamp = 0; ProcessLocalData(&bp->local); } }
static BOOL BuildUncompressed(QDP_LCQ *lcq, QDP_LC *lc) { int i; UINT8 *ptr; UINT64 tofs; INT64 errsec; REAL64 errsmp; QDP_HLP *hlp; QDP_HLP_RULES *rules; static char *fid = "qdpBuildHLP:BuildHLP:Uncompressed"; rules = &lcq->par.rules; hlp = lc->hlp; /* Flush packet early if the next sample time doesn't match exactly what is expected */ tofs = qdpDelayCorrectedTime(&lcq->mn232, hlp->delay); if (hlp->nsamp != 0 && (errsec = TimeIncrError(hlp->tols, tofs, hlp->nsint)) != 0) { errsmp = utilNsToS(errsec) / utilNsToS(hlp->nsint); qdpLcqWarn(lcq, "WARNING: %s: incoming %s time tear of %.5lf seconds (%.5lf samples) [sint=%.5lf]\n", fid, hlp->ident, utilNsToS(errsec), errsmp, utilNsToS(hlp->nsint)); qdpFlushHLP(lcq, lc); } /* Append the sample(s) to the packet */ for (ptr = &hlp->data[hlp->nbyte], i = 0; i < lc->nsamp; i++) { if (hlp->nsamp == 0) ptr = StartPacket(hlp, &lcq->mn232, tofs, lcq->qual, i, lcq->state.seqno); ptr += utilPackINT32(ptr, lc->data[i]); hlp->nbyte += sizeof(INT32); hlp->nsamp += 1; hlp->tols += hlp->nsint; if (rules->maxbyte - hlp->nbyte < sizeof(INT32)) qdpFlushHLP(lcq, lc); } return TRUE; }
unsigned ReqProg_load( void ) { char buffer[160]; char *src; char *dst; char *name; char *endparm; char *err; tiny_ret_t rc; prog_load_ret *ret; unsigned_16 len; SaveVectors( OrigVectors ); _DBG_EnterFunc( "AccLoadProg()" ); ret = GetOutPtr( 0 ); src = name = GetInPtr( sizeof( prog_load_req ) ); rc = FindFilePath( src, buffer, DosXExtList ); endparm = LinkParm; while( *endparm++ != '\0' ) {} // skip program name strcpy( endparm, buffer ); err = RemoteLink( LinkParm, 0 ); if( err != NULL ) { _DBG_Writeln( "Can't RemoteLink" ); TinyWrite( TINY_ERR, err, strlen( err ) ); LoadError = err; ret->err = 1; len = 0; } else { if( TINY_OK( rc ) ) { while( *src++ != '\0' ) {} len = GetTotalSize() - ( src - name ) - sizeof( prog_load_req ); dst = (char *)buffer; while( *dst++ != '\0' ) {}; memcpy( dst, src, len ); dst += len; _DBG_Writeln( "StartPacket" ); StartPacket(); _DBG_Writeln( "AddPacket" ); AddPacket( sizeof( prog_load_req ), In_Mx_Ptr[0].ptr ); _DBG_Writeln( "AddPacket" ); AddPacket( dst - buffer, buffer ); _DBG_Writeln( "PutPacket" ); PutPacket(); _DBG_Writeln( "GetPacket" ); len = GetPacket(); _DBG_Writeln( "RemovePacket" ); RemovePacket( sizeof( *ret ), ret ); } else { len = DoAccess(); } _DBG_Writeln( "Linked --" ); if( ret->err != 0 ) { get_err_text_req erracc; prog_kill_req killacc; int msg_len; _DBG_Writeln( "loadret->errcode != 0" ); if( LoadError == NULL ) { _DBG_Writeln( "making a REQ_GET_ERR_TEXT request" ); erracc.req = REQ_GET_ERR_TEXT; erracc.err = ret->err; _DBG_Writeln( "StartPacket" ); StartPacket(); _DBG_Writeln( "AddPacket" ); AddPacket( sizeof( erracc ), &erracc ); _DBG_Writeln( "PutPacket" ); PutPacket(); _DBG_Writeln( "GetPacket" ); msg_len = GetPacket(); _DBG_Writeln( "RemovePacket" ); RemovePacket( msg_len, FailMsg ); _DBG_Write( "FailMsg : " ); _DBG_NoTabWriteln( FailMsg ); LoadError = FailMsg; } _DBG_Writeln( "making a REQ_PROG_KILL request" ); killacc.req = REQ_PROG_KILL; _DBG_Writeln( "StartPacket" ); StartPacket(); _DBG_Writeln( "AddPacket" ); AddPacket( sizeof( killacc ), &killacc ); _DBG_Writeln( "PutPacket" ); PutPacket(); _DBG_Writeln( "GetPacket" ); GetPacket(); //RemovePacket( msg_len, &erracc ); RemoteUnLink(); TaskLoaded = FALSE; } } if( ret->err == 0 ) { _DBG_Writeln( "loadret->error_code == 0" ); TaskLoaded = TRUE; } SaveVectors( LoadVectors ); SaveVectors( CurrVectors ); _DBG_ExitFunc( "AccLoadProg()" ); return( len ); }
trap_retval ReqProg_load( void ) { char buffer[160]; char *src; char *dst; char *name; char *endparm; const char *err; tiny_ret_t rc; prog_load_ret *ret; trap_elen len; SaveVectors( OrigVectors ); _DBG_EnterFunc( "AccLoadProg()" ); ret = GetOutPtr( 0 ); src = name = GetInPtr( sizeof( prog_load_req ) ); rc = FindProgFile( src, buffer, DosExtList ); endparm = LinkParms; while( *endparm++ != '\0' ) {} // skip trap parameters strcpy( endparm, buffer ); // add command line // result is as follow // "trap parameters string"+"\0"+"command line string"+"\0" err = RemoteLink( LinkParms, false ); if( err != NULL ) { _DBG_Writeln( "Can't RemoteLink" ); TinyWrite( TINY_ERR, err, strlen( err ) ); LoadError = err; ret->err = 1; len = 0; } else { if( TINY_OK( rc ) ) { while( *src++ != '\0' ) {} len = GetTotalSize() - ( src - name ) - sizeof( prog_load_req ); dst = (char *)buffer; while( *dst++ != '\0' ) {}; memcpy( dst, src, len ); dst += len; _DBG_Writeln( "StartPacket" ); StartPacket(); _DBG_Writeln( "AddPacket" ); AddPacket( In_Mx_Ptr[0].ptr, sizeof( prog_load_req ) ); _DBG_Writeln( "AddPacket" ); AddPacket( buffer, dst - buffer ); _DBG_Writeln( "PutPacket" ); PutPacket(); _DBG_Writeln( "GetPacket" ); len = GetPacket(); _DBG_Writeln( "RemovePacket" ); RemovePacket( ret, sizeof( *ret ) ); } else { len = DoAccess(); } _DBG_Writeln( "Linked --" ); if( ret->err != 0 ) { get_err_text_req erracc; prog_kill_req killacc; trap_elen msg_len; _DBG_Writeln( "loadret->errcode != 0" ); if( LoadError == NULL ) { _DBG_Writeln( "making a REQ_GET_ERR_TEXT request" ); erracc.req = REQ_GET_ERR_TEXT; erracc.err = ret->err; _DBG_Writeln( "StartPacket" ); StartPacket(); _DBG_Writeln( "AddPacket" ); AddPacket( &erracc, sizeof( erracc ) ); _DBG_Writeln( "PutPacket" ); PutPacket(); _DBG_Writeln( "GetPacket" ); msg_len = GetPacket(); _DBG_Writeln( "RemovePacket" ); RemovePacket( FailMsg, msg_len ); _DBG_Write( "FailMsg : " ); _DBG_NoTabWriteln( FailMsg ); LoadError = FailMsg; } _DBG_Writeln( "making a REQ_PROG_KILL request" ); killacc.req = REQ_PROG_KILL; _DBG_Writeln( "StartPacket" ); StartPacket(); _DBG_Writeln( "AddPacket" ); AddPacket( &killacc, sizeof( killacc ) ); _DBG_Writeln( "PutPacket" ); PutPacket(); _DBG_Writeln( "GetPacket" ); GetPacket(); //RemovePacket( &erracc, msg_len ); RemoteUnLink(); TaskLoaded = false; } } if( ret->err == 0 ) { _DBG_Writeln( "loadret->error_code == 0" ); TaskLoaded = true; } SaveVectors( LoadVectors ); SaveVectors( CurrVectors ); _DBG_ExitFunc( "AccLoadProg()" ); return( len ); }