void System::runEdit(const char *startupBas) { logEntered(); _mainBas = false; _loadPath = startupBas; while (true) { if (loadSource(_loadPath)) { setupPath(_loadPath); editSource(_loadPath); if (isBack() || isClosing()) { break; } else { do { execute(_loadPath); } while (isRestart()); } } else { FILE *fp = fopen(_loadPath, "w"); if (fp) { fprintf(fp, "rem Welcome to SmallBASIC\n"); fclose(fp); } else { alert("Failed to load file", strerror(errno)); break; } } } }
void System::waitForBack() { while (!isBack() && !isClosing() && !isRestart()) { MAEvent event = getNextEvent(); if (event.type == EVENT_TYPE_KEY_PRESSED && event.key == SB_KEY_BACKSPACE) { break; } } }
BOOL AP_Win32Dialog_HdrFtr::_onCommand(HWND hWnd, WPARAM wParam, LPARAM /*lParam*/) { WORD wNotifyCode = HIWORD(wParam); WORD wId = LOWORD(wParam); switch (wId) { case AP_RID_DIALOG_HDRFTR_BTN_CANCEL: setAnswer( a_CANCEL ); EndDialog(hWnd,0); return 1; case AP_RID_DIALOG_HDRFTR_BTN_OK: { bool bHdrEven = _win32Dialog.isChecked(AP_RID_DIALOG_HDRFTR_CHK_HDRFACING) != 0; bool bHdrFirst = _win32Dialog.isChecked(AP_RID_DIALOG_HDRFTR_CHK_HDRFIRST) != 0; bool bHdrLast = _win32Dialog.isChecked(AP_RID_DIALOG_HDRFTR_CHK_HDRLAST) != 0; bool bFtrEven = _win32Dialog.isChecked(AP_RID_DIALOG_HDRFTR_CHK_FTRFACING) != 0; bool bFtrFirst = _win32Dialog.isChecked(AP_RID_DIALOG_HDRFTR_CHK_FTRFIRST) != 0; bool bFtrLast = _win32Dialog.isChecked(AP_RID_DIALOG_HDRFTR_CHK_FTRLAST) != 0; bool bRestart = _win32Dialog.isChecked(AP_RID_DIALOG_HDRFTR_CHK_SECTION) != 0; UT_sint32 val = _win32Dialog.getControlInt(AP_RID_DIALOG_HDRFTR_EBX_SECTION); setValue( HdrEven, bHdrEven, bHdrEven != getValue(HdrEven) ); setValue( HdrFirst, bHdrFirst, bHdrFirst != getValue(HdrFirst) ); setValue( HdrLast, bHdrLast, bHdrLast != getValue(HdrLast) ); setValue( FtrEven, bFtrEven, bFtrEven != getValue(FtrEven) ); setValue( FtrFirst, bFtrFirst, bFtrFirst != getValue(FtrFirst) ); setValue( FtrLast, bFtrLast, bFtrLast != getValue(FtrLast) ); setRestart( bRestart, val, (bRestart != isRestart() || val != getRestartValue()) ); } setAnswer( a_OK ); EndDialog(hWnd,0); return 1; case AP_RID_DIALOG_HDRFTR_CHK_SECTION: _win32Dialog.enableControl(AP_RID_DIALOG_HDRFTR_LBL_SECTION, _win32Dialog.isChecked(wId)!=0); _win32Dialog.enableControl(AP_RID_DIALOG_HDRFTR_EBX_SECTION, _win32Dialog.isChecked(wId)!=0); _win32Dialog.enableControl(AP_RID_DIALOG_HDRFTR_SPN_SECTION, _win32Dialog.isChecked(wId)!=0); return 1; case AP_RID_DIALOG_HDRFTR_EBX_SECTION: if( wNotifyCode == EN_KILLFOCUS ) { UT_sint32 value = _win32Dialog.getControlInt(AP_RID_DIALOG_HDRFTR_EBX_SECTION); _win32Dialog.setControlInt(AP_RID_DIALOG_HDRFTR_EBX_SECTION, value ); } return 1; default: // we did not handle this notification UT_DEBUGMSG(("WM_Command for id %ld\n",wId)); return 0; // return zero to let windows take care of it. } }
void System::runOnce(const char *startupBas) { // startupBas must not be _loadPath.c_str() logEntered(); _mainBas = false; bool restart = true; while (restart) { bool success = execute(startupBas); if (_state == kActiveState) { showCompletion(success); } waitForBack(); restart = isRestart(); } }
BOOL AP_Win32Dialog_HdrFtr::_onInitDialog(HWND hWnd, WPARAM /*wParam*/, LPARAM /*lParam*/) { XAP_Win32App * app = static_cast<XAP_Win32App *> (m_pApp); UT_return_val_if_fail (app,0); m_hThisDlg = hWnd; const XAP_StringSet * pSS = m_pApp->getStringSet(); // localize dialog title _win32Dialog.setDialogTitle( pSS->getValue(AP_STRING_ID_DLG_HdrFtr_Title) ); // localize controls _DSX(HDRFTR_BTN_OK, DLG_OK); _DSX(HDRFTR_BTN_CANCEL, DLG_Cancel); _DS(HDRFTR_GBX_HDR, DLG_HdrFtr_HeaderFrame); _DS(HDRFTR_CHK_HDRFACING, DLG_HdrFtr_HeaderEven); _DS(HDRFTR_CHK_HDRFIRST, DLG_HdrFtr_HeaderFirst); _DS(HDRFTR_CHK_HDRLAST, DLG_HdrFtr_HeaderLast); _DS(HDRFTR_GBX_FTR, DLG_HdrFtr_FooterFrame); _DS(HDRFTR_CHK_FTRFACING, DLG_HdrFtr_FooterEven); _DS(HDRFTR_CHK_FTRFIRST, DLG_HdrFtr_FooterFirst); _DS(HDRFTR_CHK_FTRLAST, DLG_HdrFtr_FooterLast); _DS(HDRFTR_CHK_SECTION, DLG_HdrFtr_RestartCheck); _DS(HDRFTR_LBL_SECTION, DLG_HdrFtr_RestartNumbers); // set initial state _win32Dialog.checkButton(AP_RID_DIALOG_HDRFTR_CHK_HDRFACING, getValue(HdrEven)); _win32Dialog.checkButton(AP_RID_DIALOG_HDRFTR_CHK_HDRFIRST, getValue(HdrFirst)); _win32Dialog.checkButton(AP_RID_DIALOG_HDRFTR_CHK_HDRLAST, getValue(HdrLast)); _win32Dialog.checkButton(AP_RID_DIALOG_HDRFTR_CHK_FTRFACING, getValue(FtrEven)); _win32Dialog.checkButton(AP_RID_DIALOG_HDRFTR_CHK_FTRFIRST, getValue(FtrFirst)); _win32Dialog.checkButton(AP_RID_DIALOG_HDRFTR_CHK_FTRLAST, getValue(FtrLast)); _win32Dialog.setControlInt(AP_RID_DIALOG_HDRFTR_EBX_SECTION, getRestartValue()); bool bRestart = isRestart(); _win32Dialog.checkButton(AP_RID_DIALOG_HDRFTR_CHK_SECTION, bRestart); _win32Dialog.enableControl(AP_RID_DIALOG_HDRFTR_LBL_SECTION, bRestart); _win32Dialog.enableControl(AP_RID_DIALOG_HDRFTR_EBX_SECTION, bRestart); _win32Dialog.enableControl(AP_RID_DIALOG_HDRFTR_SPN_SECTION, bRestart); XAP_Win32DialogHelper::s_centerDialog(hWnd); return 1; }
void System::setRunning(bool running) { if (running) { dev_fgcolor = -DEFAULT_FOREGROUND; dev_bgcolor = -DEFAULT_BACKGROUND; setDimensions(); dev_clrkb(); _output->setAutoflush(!opt_show_page); if (_mainBas || isNetworkLoad() || !isEditEnabled()) { _loadPath.clear(); } _userScreenId = -1; } else { osd_clear_sound_queue(); if (!isClosing() && !isRestart() && !isBack()) { _state = kActiveState; _output->setAutoflush(true); } } }
/*! * construct the dialog window. */ GtkWidget * AP_UnixDialog_HdrFtr::_constructWindow (void) { GtkWidget * window; const XAP_StringSet * pSS = m_pApp->getStringSet(); const char * uiFileName; #if defined(EMBEDDED_TARGET) && EMBEDDED_TARGET == EMBEDDED_TARGET_HILDON uiFileName = "ap_UnixHildonDialog_HdrFtr.ui"; #else #if GTK_CHECK_VERSION(3,0,0) uiFileName = "ap_UnixDialog_HdrFtr.ui"; #else uiFileName = "ap_UnixDialog_HdrFtr-2.ui"; #endif #endif GtkBuilder * builder = newDialogBuilder(uiFileName); // Update our member variables with the important widgets that // might need to be queried or altered later window = GTK_WIDGET(gtk_builder_get_object(builder, "ap_UnixDialog_HdrFtr")); m_wHdrFtrCheck[HdrEven] = GTK_WIDGET(gtk_builder_get_object(builder, "cbHeaderFacingPages")); m_wHdrFtrCheck[HdrFirst] = GTK_WIDGET(gtk_builder_get_object(builder, "cbHeaderFirstPage")); m_wHdrFtrCheck[HdrLast] = GTK_WIDGET(gtk_builder_get_object(builder, "cbHeaderLastPage")); m_wHdrFtrCheck[FtrEven] = GTK_WIDGET(gtk_builder_get_object(builder, "cbFooterFacingPages")); m_wHdrFtrCheck[FtrFirst] = GTK_WIDGET(gtk_builder_get_object(builder, "cbFooterFirstPage")); m_wHdrFtrCheck[FtrLast] = GTK_WIDGET(gtk_builder_get_object(builder, "cbFooterLastPage")); m_wRestartLabel = GTK_WIDGET(gtk_builder_get_object(builder, "lbRestartNumbering")); m_wRestartButton = GTK_WIDGET(gtk_builder_get_object(builder, "lbRestartPageNumbers")); m_wSpin = GTK_WIDGET(gtk_builder_get_object(builder, "sbRestartNumberingAt")); m_spinAdj = gtk_spin_button_get_adjustment( GTK_SPIN_BUTTON(m_wSpin) ); // set the dialog title std::string s; pSS->getValueUTF8(AP_STRING_ID_DLG_HdrFtr_Title,s); abiDialogSetTitle(window, "%s", s.c_str()); // localize the strings in our dialog localizeLabelMarkup(GTK_WIDGET(gtk_builder_get_object(builder, "lbHeaderProperties")), pSS, AP_STRING_ID_DLG_HdrFtr_HeaderFrame); localizeButton(m_wHdrFtrCheck[HdrEven], pSS, AP_STRING_ID_DLG_HdrFtr_HeaderEven); localizeButton(m_wHdrFtrCheck[HdrFirst], pSS, AP_STRING_ID_DLG_HdrFtr_HeaderFirst); localizeButton(m_wHdrFtrCheck[HdrLast], pSS, AP_STRING_ID_DLG_HdrFtr_HeaderLast); localizeLabelMarkup(GTK_WIDGET(gtk_builder_get_object(builder, "lbFooterProperties")), pSS, AP_STRING_ID_DLG_HdrFtr_FooterFrame); localizeButton(m_wHdrFtrCheck[FtrEven], pSS, AP_STRING_ID_DLG_HdrFtr_FooterEven); localizeButton(m_wHdrFtrCheck[FtrFirst], pSS, AP_STRING_ID_DLG_HdrFtr_FooterFirst); localizeButton(m_wHdrFtrCheck[FtrLast], pSS, AP_STRING_ID_DLG_HdrFtr_FooterLast); localizeLabelMarkup(GTK_WIDGET(gtk_builder_get_object(builder, "lbPageNumberProperties")), pSS, AP_STRING_ID_DLG_HdrFtr_PageNumberProperties); localizeButton(m_wRestartButton, pSS, AP_STRING_ID_DLG_HdrFtr_RestartCheck); localizeLabel(GTK_WIDGET(gtk_builder_get_object(builder, "lbRestartNumbering")), pSS, AP_STRING_ID_DLG_HdrFtr_RestartNumbers); // Now set initial state of the dialog gtk_spin_button_set_value(GTK_SPIN_BUTTON(m_wSpin),static_cast<gfloat>(getRestartValue())); if(isRestart()) { gtk_widget_set_sensitive(m_wSpin,TRUE); gtk_widget_set_sensitive(m_wRestartLabel,TRUE); gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(m_wRestartButton),TRUE); } else { gtk_widget_set_sensitive(m_wSpin,FALSE); gtk_widget_set_sensitive(m_wRestartLabel,FALSE); } UT_sint32 j = static_cast<UT_sint32>(HdrEven); for(j = static_cast<UT_sint32>(HdrEven) ; j<= static_cast<UT_sint32>(FtrLast); j++) { bool value = getValue( static_cast<HdrFtr_Control>(j)); if(value) { gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(m_wHdrFtrCheck[j]),TRUE); } else { gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(m_wHdrFtrCheck[j]),FALSE); } } _connectSignals(); g_object_unref(G_OBJECT(builder)); return window; }
void System::runMain(const char *mainBasPath) { logEntered(); // activePath provides the program name after termination String activePath = mainBasPath; _loadPath = mainBasPath; _mainBas = true; strcpy(opt_command, "welcome"); bool started = execute(_loadPath); if (!started) { alert("Error", gsb_last_errmsg); _state = kClosingState; } while (!isClosing() && started) { if (isRestart()) { _loadPath = activePath; _state = kActiveState; } else { if (fileExists(_loadPath)) { _mainBas = false; activePath = _loadPath; if (!isEditReady()) { setupPath(_loadPath); } } else { _mainBas = true; _loadPath = mainBasPath; activePath = mainBasPath; } } if (!_mainBas && isEditReady() && loadSource(_loadPath)) { editSource(_loadPath); if (isBack()) { _loadPath.clear(); _state = kActiveState; continue; } else if (isClosing()) { break; } } bool success = execute(_loadPath); bool networkFile = isNetworkLoad(); if (!isBack() && !isClosing() && (success || networkFile || !isEditEnabled())) { // when editing, only pause here when successful, otherwise the editor shows // the error. load the next network file without displaying the previous result if (!_mainBas && !networkFile) { // display an indication the program has completed showCompletion(success); } if (!success) { if (_mainBas) { // unexpected error in main.bas alert("", gsb_last_errmsg); _state = kClosingState; } else { // don't reload _loadPath.clear(); _state = kActiveState; } } if (!_mainBas && !networkFile) { waitForBack(); } } } }
void Runtime::pollEvents(bool blocking) { if (isActive() && !isRestart()) { SDL_Event ev; SDL_Keymod mod; if (blocking ? SDL_WaitEvent(&ev) : SDL_PollEvent(&ev)) { MAEvent *maEvent = NULL; switch (ev.type) { case SDL_TEXTINPUT: // pre-transformed/composted text mod = SDL_GetModState(); if (!mod || (mod & (KMOD_SHIFT|KMOD_CAPS))) { // ALT + CTRL keys handled in SDL_KEYDOWN for (int i = 0; ev.text.text[i] != 0; i++) { MAEvent *keyEvent = new MAEvent(); keyEvent->type = EVENT_TYPE_KEY_PRESSED; keyEvent->key = ev.text.text[i]; keyEvent->nativeKey = 0; pushEvent(keyEvent); } } break; case SDL_QUIT: setExit(true); break; case SDL_KEYDOWN: if (!isEditing() && ev.key.keysym.sym == SDLK_c && (ev.key.keysym.mod & KMOD_CTRL)) { setExit(true); } else if (ev.key.keysym.sym == SDLK_m && (ev.key.keysym.mod & KMOD_CTRL)) { showMenu(); } else if (ev.key.keysym.sym == SDLK_b && (ev.key.keysym.mod & KMOD_CTRL)) { setBack(); } else if (ev.key.keysym.sym == SDLK_BACKSPACE && get_focus_edit() == NULL && ((ev.key.keysym.mod & KMOD_CTRL) || !isRunning())) { setBack(); } else if (!isEditing() && ev.key.keysym.sym == SDLK_PAGEUP && (ev.key.keysym.mod & KMOD_CTRL)) { _output->scroll(true, true); } else if (!isEditing() && ev.key.keysym.sym == SDLK_PAGEDOWN && (ev.key.keysym.mod & KMOD_CTRL)) { _output->scroll(false, true); } else if (!isEditing() && ev.key.keysym.sym == SDLK_UP && (ev.key.keysym.mod & KMOD_CTRL)) { _output->scroll(true, false); } else if (!isEditing() && ev.key.keysym.sym == SDLK_DOWN && (ev.key.keysym.mod & KMOD_CTRL)) { _output->scroll(false, false); } else if (ev.key.keysym.sym == SDLK_p && (ev.key.keysym.mod & KMOD_CTRL)) { ::screen_dump(); } else { int lenMap = sizeof(keymap) / sizeof(keymap[0]); for (int i = 0; i < lenMap; i++) { if (ev.key.keysym.sym == keymap[i][0]) { maEvent = new MAEvent(); maEvent->type = EVENT_TYPE_KEY_PRESSED; maEvent->key = keymap[i][1]; maEvent->nativeKey = ev.key.keysym.mod; break; } } if (maEvent == NULL && ((ev.key.keysym.sym >= SDLK_KP_1 && ev.key.keysym.sym <= SDLK_KP_9) || ((ev.key.keysym.mod & KMOD_CTRL) && ev.key.keysym.sym != SDLK_LSHIFT && ev.key.keysym.sym != SDLK_RSHIFT && ev.key.keysym.sym != SDLK_LCTRL && ev.key.keysym.sym != SDLK_RCTRL) || (ev.key.keysym.mod & KMOD_ALT))) { maEvent = new MAEvent(); maEvent->type = EVENT_TYPE_KEY_PRESSED; maEvent->key = ev.key.keysym.sym; maEvent->nativeKey = ev.key.keysym.mod; } } break; case SDL_MOUSEBUTTONDOWN: if (ev.button.button == SDL_BUTTON_RIGHT) { _menuX = ev.motion.x; _menuY = ev.motion.y; showMenu(); } else if (ev.motion.x != 0 && ev.motion.y != 0) { // avoid phantom down message when launching in windows maEvent = getMotionEvent(EVENT_TYPE_POINTER_PRESSED, &ev); } break; case SDL_MOUSEMOTION: maEvent = getMotionEvent(EVENT_TYPE_POINTER_DRAGGED, &ev); break; case SDL_MOUSEBUTTONUP: SDL_SetCursor(_cursorArrow); maEvent = getMotionEvent(EVENT_TYPE_POINTER_RELEASED, &ev); break; case SDL_WINDOWEVENT: switch (ev.window.event) { case SDL_WINDOWEVENT_FOCUS_GAINED: SDL_SetModState(KMOD_NONE); break; case SDL_WINDOWEVENT_RESIZED: onResize(ev.window.data1, ev.window.data2); break; case SDL_WINDOWEVENT_EXPOSED: _graphics->redraw(); break; case SDL_WINDOWEVENT_LEAVE: _output->removeHover(); break; } break; case SDL_DROPFILE: setLoadPath(ev.drop.file); setExit(false); SDL_free(ev.drop.file); break; case SDL_MOUSEWHEEL: if (!_output->scroll(ev.wheel.y == 1, false)) { maEvent = new MAEvent(); maEvent->type = EVENT_TYPE_KEY_PRESSED; maEvent->key = ev.wheel.y == 1 ? SB_KEY_UP : SB_KEY_DN; maEvent->nativeKey = KMOD_CTRL; } break; } if (maEvent != NULL) { pushEvent(maEvent); } } } }
/** * 驱动分发函数,相应上层应用的各种操作命令 * */ NTSTATUS DispatchDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP IRP) { ::KeWaitForSingleObject(&g_DispatchMutex,Executive,KernelMode,FALSE,NULL); NTSTATUS ntStatus = STATUS_UNSUCCESSFUL; ULONG tmpLen = 0; PIO_STACK_LOCATION pIoStackIrp = IoGetCurrentIrpStackLocation(IRP); switch (pIoStackIrp->Parameters.DeviceIoControl.IoControlCode) { case IOCTL_SET_PROTECT_PID://设置保护PID KdPrint(("IOCTL_SET_PROTECT_PID\n")); { unsigned char pUnPack[256]; int unPackLength; unPackLength = DownloadUnPack((unsigned char *)IRP->AssociatedIrp.SystemBuffer,pIoStackIrp->Parameters.DeviceIoControl.InputBufferLength,pUnPack); if (unPackLength > 0) { PPID_INFO pInputBuffer = (PPID_INFO)pUnPack; int iStringLength = unPackLength; if(iStringLength != sizeof(PID_INFO)) break; __int64 elapsedTime = __rdtsc() - pInputBuffer->currentTime; KdPrint(("IOCTL_SET_PROTECT_PID elapsed time: %I64d.\n", elapsedTime)); if((elapsedTime > COMMUNICATE_TIME_LIMIT)||(elapsedTime <=COMMUNICATE_TIME_DOWN)) { KdPrint(("IOCTL_SET_PROTECT_PID exceeds time limit.\n")); } else { // 加入进程 ID AddProtectPID(pInputBuffer->PID[0]); } ntStatus = STATUS_SUCCESS; } } break; case IOCTL_GET_PROTECT_PIDS:///判断驱动是否在正常工作 KdPrint(("IOCTL_GET_PROTECT_PIDS\n")); if (IRP->MdlAddress) { PPID_INFO pUserBuffer = (PPID_INFO)MmGetSystemAddressForMdlSafe(IRP->MdlAddress, NormalPagePriority); if(pUserBuffer == NULL) return ntStatus; ULONG OutputLength = pIoStackIrp->Parameters.DeviceIoControl.OutputBufferLength; ULONG PIDLength = OutputLength - sizeof(PID_INFO) + sizeof(UINT32); PPID_INFO tmpBuf=(PPID_INFO)ExAllocatePoolWithTag(PagedPool,OutputLength-sizeof(UINT32),'bak'); if(!tmpBuf) return ntStatus; KdPrint(("entry check hook safe!\n")); if(checkHookSafe()) { tmpBuf->count = GetKernelPIDs(tmpBuf->PID, PIDLength / sizeof(UINT32)); tmpBuf->currentTime = __rdtsc(); ULONG bufLength = sizeof(PID_INFO) + tmpBuf->count*sizeof(UINT32); tmpLen = UploadPack((PUCHAR)tmpBuf , bufLength , (PUCHAR)pUserBuffer); } else { RtlZeroMemory(tmpBuf,OutputLength-sizeof(UINT32)); tmpLen = 0; } ExFreePoolWithTag(tmpBuf,'bak'); ntStatus = STATUS_SUCCESS; } break; case IOCTL_SET_SECU_PATHS://无效 KdPrint(("IOCTL_SET_SECU_PATHS\n")); { ntStatus = STATUS_SUCCESS; } break; case IOCTL_SET_SECU_MD5://设置白名单哈希列表 KdPrint(("IOCTL_SET_SECU_MD5\n")); { PUCHAR pInputBuffer; int iStringLength = pIoStackIrp->Parameters.DeviceIoControl.InputBufferLength; unsigned char * pUnPack=(UCHAR *)ExAllocatePoolWithTag(PagedPool,iStringLength,'knab'); int unPackLength; unPackLength = DownloadUnPack((unsigned char *)IRP->AssociatedIrp.SystemBuffer,pIoStackIrp->Parameters.DeviceIoControl.InputBufferLength,pUnPack); RtlCopyBytes((PVOID)&iStringLength,(PVOID)pUnPack,sizeof(ULONG) ); pInputBuffer = pUnPack + sizeof(ULONG); RtlCopyBytes((PVOID)&g_globalTime,(PVOID)(pInputBuffer + iStringLength),8 ); __int64 elapseTime = __rdtsc() - g_globalTime; if( (elapseTime < COMMUNICATE_TIME_LIMIT) && (elapseTime >= COMMUNICATE_TIME_DOWN) ) { if (unPackLength > 0) { for(int i = 0; i <= iStringLength - HASH_SIZE; i += HASH_SIZE) AddSecureHash(pInputBuffer + i); getSecuTable(); ClearHash(); ntStatus = STATUS_SUCCESS; } } ExFreePoolWithTag(pUnPack,'knab'); // } break; ///////////// case IOCTL_SET_BLACK_MD5://设置黑名单哈希列表 KdPrint(("IOCTL_SET_SECU_MD5\n")); { PUCHAR pInputBuffer; int iStringLength = pIoStackIrp->Parameters.DeviceIoControl.InputBufferLength; unsigned char * pUnPack=(UCHAR *)ExAllocatePoolWithTag(PagedPool,iStringLength,'knab'); int unPackLength; unPackLength = DownloadUnPack((unsigned char *)IRP->AssociatedIrp.SystemBuffer,pIoStackIrp->Parameters.DeviceIoControl.InputBufferLength,pUnPack); RtlCopyBytes((PVOID)&iStringLength,(PVOID)pUnPack,sizeof(ULONG) ); pInputBuffer = pUnPack + sizeof(ULONG); RtlCopyBytes((PVOID)&g_globalTime,(PVOID)(pInputBuffer + iStringLength),8 ); __int64 elapseTime = __rdtsc() - g_globalTime; if( (elapseTime < COMMUNICATE_TIME_LIMIT) && (elapseTime >= COMMUNICATE_TIME_DOWN) ) { if (unPackLength > 0) { for(int i = 0; i <= iStringLength - HASH_SIZE; i += HASH_SIZE) AddBlackHash(pInputBuffer + i); getBlackTable(); ClearBlackHash(); ntStatus = STATUS_SUCCESS; } } ExFreePoolWithTag(pUnPack,'knab'); // } break; ///////////// case IOCTL_SET_UP_UNLOAD://设置卸载驱动函数 KdPrint(("IOCTL_SET_UP_UNLOAD\n")); while(g_bBusy) { LARGE_INTEGER interval; interval.QuadPart = -3 * 1000 * 1000;//滞后3秒进行卸载 KeDelayExecutionThread(KernelMode, FALSE, &interval); } DeviceObject->DriverObject->DriverUnload= DDKUnload; ntStatus = STATUS_SUCCESS; break; case IOCTL_GET_DRIVER_STATUS://得到驱动接受白名单状态 { ////////////////////////////////////////////////////// unsigned char pUnPack[256]; int unPackLength; unPackLength = DownloadUnPack((unsigned char *)IRP->AssociatedIrp.SystemBuffer,pIoStackIrp->Parameters.DeviceIoControl.InputBufferLength,pUnPack); if (unPackLength > 0) { MYDRIVERSTATUS type = *(MYDRIVERSTATUS *)pUnPack; PUCHAR pUserBuffer = (PUCHAR)MmGetSystemAddressForMdlSafe(IRP->MdlAddress, NormalPagePriority);// 在虚拟内存紧张时会返回NULL if(pUserBuffer == NULL) return ntStatus; ULONG OutputLength = pIoStackIrp->Parameters.DeviceIoControl.OutputBufferLength; ULONG * tmpBuf=(ULONG *)ExAllocatePoolWithTag(PagedPool,4,'bnak'); if(!tmpBuf) return ntStatus; if(type == DRIVER_RECEIVED)//是否接受到白名单 { if(!isRestart()) g_isReceive=false; *tmpBuf = g_isReceive ? 1 : 0; tmpLen = UploadPack((PUCHAR)tmpBuf , 4 , (PUCHAR)pUserBuffer); } ExFreePoolWithTag(tmpBuf,'bnak'); } ntStatus = STATUS_SUCCESS; ////////////////////////////////////////////////////// } break; case IOCTL_SET_HANDLE://得到同步句柄 { if(pEvent) ObDereferenceObject(pEvent); HANDLE hEvent = NULL; int unPackLength; unPackLength=DownloadUnPack((unsigned char *)IRP->AssociatedIrp.SystemBuffer,pIoStackIrp->Parameters.DeviceIoControl.InputBufferLength,(unsigned char *)&hEvent); if (unPackLength>0) { ObReferenceObjectByHandle(hEvent , EVENT_MODIFY_STATE, *ExEventObjectType, KernelMode, (PVOID *)&pEvent, NULL); ntStatus = STATUS_SUCCESS; } } break; case IOCTL_RETURN_DATA://返回灰名单 { if (IRP->MdlAddress) { wchar_t fName[260] = {0}; unsigned char cHash[16] = {0}; getData(fName,cHash); unsigned char dataBuf[260*sizeof(wchar_t) + 16 + 4*4] = {0}; *(DWORD*)(dataBuf) = 1; RtlCopyMemory(dataBuf+4,fName,DATAPATHLEN); *(wchar_t*)(dataBuf + DATAPATHLEN -2) = L'\0'; RtlCopyMemory(dataBuf+4+DATAPATHLEN,cHash,DATAHASHLEN); wchar_t * pUserBuffer = (wchar_t *)MmGetSystemAddressForMdlSafe(IRP->MdlAddress, NormalPagePriority); ULONG OutputLength = pIoStackIrp->Parameters.DeviceIoControl.OutputBufferLength; tmpLen = UploadPack((PUCHAR)dataBuf, 260*sizeof(wchar_t) + 16 + 4*4, (PUCHAR)pUserBuffer); } ntStatus = STATUS_SUCCESS; } break; case IOCTL_SET_FILTERRESULT://验证结果 { char rResult; //bool bResult = false; //rResult = (*(unsigned char *)(IRP->AssociatedIrp.SystemBuffer)); WriteSysLog(LOG_TYPE_INFO,L" IOCTL GET"); int unPackLength=DownloadUnPack((unsigned char *)IRP->AssociatedIrp.SystemBuffer,pIoStackIrp->Parameters.DeviceIoControl.InputBufferLength,(unsigned char *)&rResult); //g_bPassFilter = (rResult == 1) ? true : false; if (unPackLength>0) { g_bPassFilter = (rResult == 1) ? true : false; } else { WriteSysLog(LOG_TYPE_INFO,L" IOCTL LError"); g_bPassFilter = false; } WriteSysLog(LOG_TYPE_INFO,L" IOCTL SET"); KeSetEvent(g_pEventFilterGo, IO_NO_INCREMENT, FALSE); ntStatus = STATUS_SUCCESS; } break; } IRP->IoStatus.Status = 0; IRP->IoStatus.Information = tmpLen ; IoCompleteRequest(IRP, IO_NO_INCREMENT); ::KeReleaseMutex(&g_DispatchMutex,FALSE); return ntStatus; }