static DWORD WINAPI WinConsole_ReceiverThread(LPVOID param) { SIOPCB * cb = (SIOPCB *)param; DWORD work; HANDLE stdin; INPUT_RECORD input_record; assert(cb != NULL); assert(cb->Handle != NULL && cb->Handle != 0); stdin = GetStdHandle(STD_INPUT_HANDLE); FatalAssertion(stdin != 0, "WinConsole_ReceiverThread failed to acquire the handle of standard input."); while((work = WaitForSingleObject(cb->Handle, INFINITE)) != WAIT_FAILED) { assert(work == WAIT_OBJECT_0); /* オブジェクトはシグナル状態になった */ ReadConsoleInput(stdin, &input_record, 1, &work); if(input_record.EventType == KEY_EVENT && input_record.Event.KeyEvent.bKeyDown == TRUE) { cb->ReceiveBuffer = (char)input_record.Event.KeyEvent.uChar.AsciiChar; BITSET(cb->Flag, SIO_STA_INTRCV); HALInterruptRequest(INHNO_SERIAL); } } return 0; }
static void CreateSerialConsole(SIOPCB * cb) { struct tagSerialConsoleParameters * param; param = GlobalAlloc(GMEM_FIXED, sizeof(struct tagSerialConsoleParameters)); FatalAssertion(param != NULL, "CreateSerialConsole: GlobalAlloc reported NULL."); param->position = 0; InitializeCriticalSection(¶m->cs); cb->versatile = param; cb->Handle = CreateDialog(ProcessInstance, MAKEINTRESOURCE(CONSOLEDIALOG), 0, ConsoleProc); FatalAssertion(cb->Handle != 0, "CreateSerialConsole could not create its dialog."); PostMessage(cb->Handle,SERMSG_CREATE,0,(LPARAM)cb); UpdateWindow(cb->Handle); HALAddDestructionProcedure(SerialConsole_FinalRelease,cb); }
static void RawSerial_CreatePort(SIOPCB * cb) { cb->Handle = CreateFile("COM1", GENERIC_READ|GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0); FatalAssertion( cb->Handle != INVALID_HANDLE_VALUE && cb->Handle != NULL, "RawSerial_CreatePort failed to open the port 'COM1'."); /* 受信バッファ監視用スレッドを作成 */ CreateThread(NULL, 0, RawSerial_ReceiverThread, (LPVOID)cb, 0, NULL); }
static void WinConsole_CreatePort(SIOPCB * cb) { BOOL result; result = AllocConsole(); FatalAssertion(result != 0, "WinConsole_CreatePort failed to allocate its own console."); cb->Handle = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleTitle("TOPPERS/JSP SerialConsole"); /* 受信バッファ監視用スレッドを作成 */ CreateThread(NULL,0,WinConsole_ReceiverThread,(LPVOID)cb,0,NULL); }
BOOL def_exc(DWORD exc, void * routine) { int j; int i; /* 解除ルーチン */ if(routine == 0l) { kprintf(("def_exc : [UNREG] 0x%08x\n", exc)); for(i=0;i<EXC_MAXITEMS;i++) if(ExceptionLevel[i].ExceptionCode == exc) { ExceptionLevel[i].ExceptionCode = 0; ExceptionLevel[i].Routine = 0; return TRUE; } return FALSE; } /* 登録ルーチン */ kprintf(("def_exc : [REG] 0x%08x\n", exc)); j = EXC_MAXITEMS; for(i=0;i<EXC_MAXITEMS;i++) { if(ExceptionLevel[i].ExceptionCode != 0) { /* 登録しようとしている番号が既に登録されていないかどうか調べる */ if(ExceptionLevel[i].ExceptionCode == exc) return FALSE; }else { /* 空き番号の最小を覚える */ if(j > i) j = i; /* 既登録チェックがあるので、ここでbreakしてはダメ */ } } FatalAssertion(i == EXC_MAXITEMS, "No available exception slots left."); //This sequence will never change ExceptionLevel[j].Routine = routine; ExceptionLevel[j].ExceptionCode = exc; return TRUE; }
static void ScreenBuffer_CreatePort(SIOPCB * cb) { cb->Handle = CreateConsoleScreenBuffer(GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, CONSOLE_TEXTMODE_BUFFER, NULL); /* cb->Handle should not be compared with NULL because CreateConsoleScreenBuffer returns INVALID_HANDLE_VALUE if it failed */ FatalAssertion(cb->Handle != INVALID_HANDLE_VALUE && cb->Handle != NULL, "ScreenBuffer_CreatePort failed to allocate its own console."); SetConsoleActiveScreenBuffer(cb->Handle); SetConsoleTitle("TOPPERS/JSP SerialConsole"); /* 受信バッファ監視用スレッドを作成 */ CreateThread(NULL,0,ScreenBuffer_ReceiverThread,(LPVOID)cb,0,NULL); }
/* 管理スレッドが実行するウィンドウ作成ルーチン */ static void _initializeDebugServices(void * _param) { struct tagInitializeDebugServicesParam * param = (struct tagInitializeDebugServicesParam *)_param; DialogHandle = CreateDialog(param->hInstance, MAKEINTRESOURCE(DEBUGOUTDIALOG), param->hDlg, DebugOutDialogProc); FatalAssertion(DialogHandle != NULL, "DebugService could not create its own dialog."); }