////////////////////////////////////////////////////////////////////////// // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - BOOL SBBSExec::OnCreateVM(VMHANDLE hVM) { DBTRACExd(0,"CreateVM, handle, time",hVM,Get_System_Time()); DBTRACEx(0,"Current Thread Handle",Get_Cur_Thread_Handle()); if(start.event) { new_vm=find_vm(NULL); if(new_vm==NULL) { DBTRACE(0,"!NO AVAILABLE VM structures"); return(FALSE); } new_vm->handle=hVM; new_vm->mode=start.mode; new_vm->online = true; new_vm->overrun = false; new_vm->input_sem = NULL; new_vm->output_sem = NULL; if(RingBufInit(&new_vm->in, RINGBUF_SIZE_IN)!=0 || RingBufInit(&new_vm->out, RINGBUF_SIZE_OUT)!=0) { DBTRACE(0,"!FAILED to create I/O buffers"); return(FALSE); } if(!VWIN32_SetWin32Event(start.event)) { DBTRACEx(0,"!FAILED TO SET EVENT handle", start.event); return(FALSE); } if(!VWIN32_CloseVxDHandle(start.event)) { DBTRACEx(0,"!FAILED TO CLOSE EVENT handle", start.event); return(FALSE); } start.event=0; } return(TRUE); }
DWORD SBBSExec::OnW32DeviceIoControl(PIOCTLPARAMS pIOCTL) { DWORD rd; DWORD wr; DWORD avail; vm_t* vm; // DBTRACEd(0,"SBBSEXEC ioctl" //,pIOCTL->dioc_IOCtlCode); switch(pIOCTL->dioc_IOCtlCode) { case DIOC_OPEN: DBTRACEd(0,"IOCTL: OPEN",Get_System_Time()); break; case DIOC_CLOSEHANDLE: DBTRACEd(0,"IOCTL: CLOSE",Get_System_Time()); break; case SBBSEXEC_IOCTL_START: DBTRACEd(0,"IOCTL: START",Get_System_Time()); DBTRACEx(0,"Current Thread Handle",Get_Cur_Thread_Handle()); if(start.event) { DBTRACE(0,"Exec already started!"); return(SBBSEXEC_ERROR_INUSE); } if (pIOCTL->dioc_InBuf==NULL || pIOCTL->dioc_cbInBuf!=sizeof(start)) { return(SBBSEXEC_ERROR_INBUF); } start=*(sbbsexec_start_t*)pIOCTL->dioc_InBuf; break; case SBBSEXEC_IOCTL_COMPLETE: DBTRACEd(0,"IOCTL: COMPLETE",Get_System_Time()); if(start.event || new_vm==NULL) { DBTRACE(0,"!VM never created"); start.event=0; return(SBBSEXEC_ERROR_INUSE); } if(pIOCTL->dioc_OutBuf==NULL || pIOCTL->dioc_cbOutBuf<sizeof(VMHANDLE)) { DBTRACE(0,"!Invalid OUTBUF"); return(SBBSEXEC_ERROR_OUTBUF); } *(VMHANDLE*)pIOCTL->dioc_OutBuf=new_vm->handle; DBTRACEx(0,"CREATED VM HANDLE", new_vm->handle); new_vm=NULL; if(pIOCTL->dioc_bytesret!=NULL) *pIOCTL->dioc_bytesret = sizeof(VMHANDLE); break; case SBBSEXEC_IOCTL_READ: if (pIOCTL->dioc_InBuf==NULL || pIOCTL->dioc_cbInBuf!=sizeof(VMHANDLE)) { DBTRACE(0,"!INVALID INBUF"); return(SBBSEXEC_ERROR_INBUF); } if (pIOCTL->dioc_OutBuf==NULL || pIOCTL->dioc_cbOutBuf==0) { DBTRACE(0,"!INVALID OUTBUF"); return(SBBSEXEC_ERROR_OUTBUF); } vm = find_vm(*(VMHANDLE*)pIOCTL->dioc_InBuf); if(vm==NULL) { DBTRACE(0,"!NO VM LIST"); return(SBBSEXEC_ERROR_INDATA); } rd = RingBufFull(&vm->out); if(rd>pIOCTL->dioc_cbOutBuf) { DBTRACEdd(0,"Reducing read size" ,rd, pIOCTL->dioc_cbOutBuf); rd=pIOCTL->dioc_cbOutBuf; } RingBufRead(&vm->out, (BYTE*)pIOCTL->dioc_OutBuf, rd); if(pIOCTL->dioc_bytesret!=NULL) *pIOCTL->dioc_bytesret = rd; if(vm->output_sem!=NULL) // Wake up int14 handler Signal_Semaphore(vm->output_sem); if(rd>1) { DBTRACEd(1,"IOCTL_READ bytes", rd); } break; case SBBSEXEC_IOCTL_WRITE: if (pIOCTL->dioc_InBuf==NULL || pIOCTL->dioc_cbInBuf<sizeof(VMHANDLE)+1) { DBTRACE(0,"!INVALID INBUF"); return(SBBSEXEC_ERROR_INBUF); } if (pIOCTL->dioc_OutBuf==NULL || pIOCTL->dioc_cbOutBuf!=sizeof(DWORD)) { DBTRACE(0,"!INVALID OUTBUF"); return(SBBSEXEC_ERROR_OUTBUF); } vm = find_vm(*(VMHANDLE*)pIOCTL->dioc_InBuf); if(vm==NULL) { DBTRACE(0,"!NO VM LIST"); return(SBBSEXEC_ERROR_INDATA); } wr = pIOCTL->dioc_cbInBuf-sizeof(VMHANDLE); avail = RingBufFree(&vm->in); if(wr>avail) { DBTRACEdd(0,"Reducing write size", wr, avail); wr=avail; } RingBufWrite(&vm->in, (BYTE*)pIOCTL->dioc_InBuf+sizeof(VMHANDLE), wr); *(DWORD *)pIOCTL->dioc_OutBuf = wr; if(pIOCTL->dioc_bytesret!=NULL) *pIOCTL->dioc_bytesret = sizeof(DWORD); if(vm->input_sem!=NULL) // Wake up int14 handler Signal_Semaphore(vm->input_sem); // Wake up the VDM (improves keyboard response - dramatically!) Wake_Up_VM(vm->handle); break; case SBBSEXEC_IOCTL_DISCONNECT: DBTRACEd(0,"IOCTL: DISCONNECT",Get_System_Time()); if (pIOCTL->dioc_InBuf==NULL || pIOCTL->dioc_cbInBuf!=sizeof(VMHANDLE)) { DBTRACE(0,"!INVALID INBUF"); return(SBBSEXEC_ERROR_INBUF); } vm = find_vm(*(VMHANDLE*)pIOCTL->dioc_InBuf); if(vm==NULL) { DBTRACE(0,"!NO VM LIST"); return(SBBSEXEC_ERROR_INDATA); } vm->online=false; if(vm->input_sem!=NULL) // Wake up int14 handler Signal_Semaphore(vm->input_sem); if(vm->output_sem!=NULL) // Wake up int14 handler Signal_Semaphore(vm->output_sem); break; case SBBSEXEC_IOCTL_STOP: DBTRACEd(0,"IOCTL: STOP",Get_System_Time()); if (pIOCTL->dioc_InBuf==NULL || pIOCTL->dioc_cbInBuf!=sizeof(VMHANDLE)) { DBTRACE(0,"!INVALID INBUF"); return(SBBSEXEC_ERROR_INBUF); } vm = find_vm(*(VMHANDLE*)pIOCTL->dioc_InBuf); if(vm==NULL) { DBTRACE(0,"!NO VM LIST"); return(SBBSEXEC_ERROR_INDATA); } DBTRACEx(0,"CLOSING VM HANDLE", vm->handle); vm->handle=NULL; // Mark as available RingBufDispose(&vm->in); RingBufDispose(&vm->out); if(vm->input_sem!=NULL) // Wake up int14 handler Signal_Semaphore(vm->input_sem); if(vm->output_sem!=NULL) // Wake up int14 handler Signal_Semaphore(vm->output_sem); vm->input_sem=NULL; vm->output_sem=NULL; break; default: DBTRACEdx(0,"!UNKNOWN IOCTL" ,pIOCTL->dioc_IOCtlCode,pIOCTL->dioc_IOCtlCode); return(SBBSEXEC_ERROR_IOCTL); } return (0); // DEVIOCTL_NOERROR); }
void Form_DateSet_Proc(LPWindow pWindow, LPGuiMsgInfo pGuiMsgInfo) { CControl* pControl; GuiMsgInfo guiMsgInfo; // static CSysTime time; static CSysTime time = {0}; static CSysTime *SetDate = NULL; switch(pGuiMsgInfo->ID) { case WM_LOAD: ClearScreen(); SysTimeDly(15); // GetSysTime(&time); SetDate = Get_System_Time(); time.year = SetDate->year; time.mon = SetDate->mon; time.day = SetDate->day; time.week = SetDate->week; time.hour = SetDate->hour; time.min = SetDate->min; time.sec = SetDate->sec; //CreateWindowTimerEx(pWindow, 1); //StartWindowTimer(pWindow); //Æô¶¯Ö÷´°Ì嶨ʱÆ÷ case WM_SHOW: sprintf(year, "%02d", time.year); sprintf(month, "%02d", time.mon); sprintf(day, "%02d", time.day); pWindow->DrawFunc(pWindow); break; case WM_UPDATECTRL: pControl = (CControl*)(pGuiMsgInfo->wParam); if(pControl != NULL) { pControl->DrawFunc(pControl); } break; case WM_TIMEUPDATE: PostWindowMsg(pWindow, WM_UPDATECTRL, (uint32)&gStatusBar, 0); break; case WM_KEYDOWN: switch(pGuiMsgInfo->wParam) { case KEY_UP: if(mDateYY.state & CTRL_FOCUS) { time.year++; if (time.year > YEARMAX) { time.year = YEARMIN; } if((time.mon == 2)&&(time.day > 28)) { if (time.day > 29) { time.day = 29; }else if(time.year % 100) { if(time.year % 4) { time.day=28;//·ÇÈòÄê } } else if(time.year % 400){ time.day=28;//·ÇÈòÄê } } } else if(mDateMM.state & CTRL_FOCUS) { time.mon++; if (time.mon > 12) { time.mon = 1; } switch(time.mon) { case 2: if(time.day > 28) { if (time.day > 29) { time.day = 29; }else if(time.year % 100) { if(time.year % 4) { time.day=28;//·ÇÈòÄê } } else if(time.year % 400){ time.day=28;//·ÇÈòÄê } } break; case 4: case 6: case 9: case 11: if(time.day > 30) { time.day = 30; } break; default : break; } } else if(mDateDD.state & CTRL_FOCUS) { time.day++; switch(time.mon) { case 2: if(time.day > 28) { if (time.day > 29) { time.day = 1; }else if(time.year % 100) { if(time.year % 4) { time.day=1;//·ÇÈòÄê } } else if(time.year % 400){ time.day=1;//·ÇÈòÄê } } break; case 4: case 6: case 9: case 11: if(time.day > 30) { time.day = 1; } break; default : if (time.day > 31) { time.day = 1; } break; } } guiMsgInfo.pWindow = pWindow; guiMsgInfo.ID = WM_SHOW; GuiMsgQueuePost(&guiMsgInfo); break; case KEY_DOWN: if(mDateYY.state & CTRL_FOCUS) { if (time.year > YEARMIN) { time.year--; } else { time.year = YEARMAX; } if((time.mon == 2)&&(time.day > 28)) { if (time.day > 29) { time.day = 29; }else if(time.year % 100) { if(time.year % 4) { time.day=28;//·ÇÈòÄê } } else if(time.year % 400){ time.day=28;//·ÇÈòÄê } } } else if(mDateMM.state & CTRL_FOCUS) { if (time.mon > 1) { time.mon--; } else { time.mon = 12; } switch(time.mon) { case 2: if(time.day > 28) { if (time.day > 29) { time.day = 29; }else if(time.year % 100) { if(time.year % 4) { time.day=28;//·ÇÈòÄê } } else if(time.year % 400){ time.day=28;//·ÇÈòÄê } } break; case 4: case 6: case 9: case 11: if(time.day > 30) { time.day = 30; } break; default : break; } } else if(mDateDD.state & CTRL_FOCUS) { if (time.day > 1) { time.day--; } else { time.day = 31; } switch(time.mon) { case 2: if(time.day > 28) { time.day=28; if(time.year % 100) { if(!(time.year % 4)) { time.day=29;//ÈòÄê } } else if(!(time.year % 400)){ time.day=29;//ÈòÄê } } break; case 4: case 6: case 9: case 11: if(time.day > 30) { time.day = 30; } break; default : break; } } guiMsgInfo.pWindow = pWindow; guiMsgInfo.ID = WM_SHOW; GuiMsgQueuePost(&guiMsgInfo); break; case KEY_LEFT: if(mDateDD.state & CTRL_FOCUS) { mDateDD.state &=~CTRL_FOCUS; mDateMM.state |= CTRL_FOCUS; }else if(mDateMM.state & CTRL_FOCUS) { mDateMM.state &=~CTRL_FOCUS; mDateYY.state |= CTRL_FOCUS; } guiMsgInfo.pWindow = pWindow; guiMsgInfo.ID = WM_SHOW; GuiMsgQueuePost(&guiMsgInfo); break; case KEY_OK: // SetSysDate(time.Year, time.Month, time.Day); Set_System_Time(&time); SysTimeDly(100); if(pWindow->pParentWindow != NULL) { g_pCurWindow = pWindow->pParentWindow; } else { g_pCurWindow = &gWD_Main; } guiMsgInfo.pWindow = g_pCurWindow; guiMsgInfo.ID = WM_LOAD; GuiMsgQueuePost(&guiMsgInfo); break; case KEY_RIGHT: if(mDateYY.state & CTRL_FOCUS) { mDateYY.state &=~CTRL_FOCUS; mDateMM.state |= CTRL_FOCUS; } else if(mDateMM.state & CTRL_FOCUS) { mDateMM.state &=~CTRL_FOCUS; mDateDD.state |= CTRL_FOCUS; } guiMsgInfo.pWindow = pWindow; guiMsgInfo.ID = WM_SHOW; GuiMsgQueuePost(&guiMsgInfo); break; case KEY_BACK: if(pWindow->pParentWindow != NULL) { g_pCurWindow = pWindow->pParentWindow; } else { g_pCurWindow = &gWD_Main; } PostWindowMsg(g_pCurWindow, WM_LOAD,0,0); break; default: break; } break; default: break; } }