/*******************************************************************************
*
*   函 数 名 : DispatchDeviceControl
*  功能描述 : 
*  参数列表 : pDriverObj    --  
*                  pIrp
*   说      明 : 
*  返回结果 :  成功返回 STATUS_SUCCESS
*
*******************************************************************************/
NTSTATUS DispatchDeviceControl(IN PDEVICE_OBJECT pDevObj, 
                                                     IN PIRP pIrp)
{
        NTSTATUS status               = STATUS_INVALID_DEVICE_REQUEST;	 // STATUS_UNSUCCESSFUL
        PIO_STACK_LOCATION pIrpStack  = IoGetCurrentIrpStackLocation(pIrp);
        ULONG uIoControlCode         = 0;
        PVOID pIoBuffer                     = NULL;
        ULONG uInSize                       = 0;
        ULONG uOutSize                    = 0;
        PHIDE_INFO pHi                      = NULL ;
        PPROTECT_PID_INFO pPi         = NULL ;
        PPROTECT_NAME_INFO  pNi  = NULL ;
        PDEVICE_EXTENSION pde = (PDEVICE_EXTENSION)pDevObj->DeviceExtension ;

        // Get the IoCtrl Code
        uIoControlCode = pIrpStack->Parameters.DeviceIoControl.IoControlCode;

        // Get the buffer info
        pIoBuffer = pIrp->AssociatedIrp.SystemBuffer;
        uInSize = pIrpStack->Parameters.DeviceIoControl.InputBufferLength;
        uOutSize = pIrpStack->Parameters.DeviceIoControl.OutputBufferLength;


        KdBreakPoint() ;
        KeWaitForSingleObject(&pde->DeviceIoControlMutex, 
                                                Executive,
                                                KernelMode,
                                                FALSE,
                                                NULL) ;

        switch(uIoControlCode)
        {
        // 添加要保护的进程名
        case IOCTRL_ADD_PROTECT_NAME:
                {
                        pNi = (PPROTECT_NAME_INFO)pIoBuffer ;
                        if (sizeof(PROTECT_NAME_INFO) != uInSize || NULL == pNi)
                        {
                                break ;
                        }
                        // 这里可以判断一下返回值
                        if(AddProtectProcessName(pNi->ProcessName))
                        {
                                status = STATUS_SUCCESS ;
                        }
                }
                break ;
        case IOCTRL_ADD_PROTECT_PID:
                {
                        pPi = (PPROTECT_PID_INFO)pIoBuffer ;
                        if (sizeof(PROTECT_PID_INFO) != uInSize || NULL == pPi)
                        {
                                break ;
                        }
                        // 这里可以判断一下返回值
                        if( AddProtectProcessPID(pPi->uPID))
                        {
                                status = STATUS_SUCCESS ;
                        }
                }
                break ;
                // 处理隐藏进程
                case IOCTRL_HIDE:
                        {
                                // Receive data form Application
                                //dprintf("IOCTRL_HIDE\r\n");

                                // Do we have any data?
                                // 判断传进来的参数是否正确
                                pHi = (PHIDE_INFO)pIoBuffer ;
                                if (sizeof(HIDE_INFO) != uInSize || NULL == pHi)
                                {
                                        break ;
                                }
                                // 这里可以判断一下返回值
                                if( HideProcess(pDevObj, pHi->uPID) )
                                {
                                        status = STATUS_SUCCESS ;
                                }
                        }
                        break ;
                case IOCTRL_START_FILTER:
                        {
                                if (! pde->bIsFiltrateProcess)
                                {
                                        pde->bIsFiltrateProcess = true ;
                                        status = STATUS_SUCCESS ;
                                }
                        }
                        break ;
                case IOCTRL_STOP_FILTER:
                        {
                                if (pde->bIsFiltrateProcess)
                                {
                                        pde->bIsFiltrateProcess = false ;
                                        status = STATUS_SUCCESS ;
                                }
                        }
                        break ;
                //
                // TODO: Add execute code here.
                //

                default:
                        {
                                // Invalid code sent
                                dprintf("Unknown IOCTL: 0x%X (%04X,%04X)\r\n", 
                                          uIoControlCode,
                                          DEVICE_TYPE_FROM_CTL_CODE(uIoControlCode),
                                          IoGetFunctionCodeFromCtlCode(uIoControlCode));
                                status = STATUS_INVALID_PARAMETER;	
                        }
                        break;
        }

        if(status == STATUS_SUCCESS)
        {
                pIrp->IoStatus.Information = uOutSize;
        }
        else
        {
                pIrp->IoStatus.Information = 0;
        }

        // Complete the I/O Request
        pIrp->IoStatus.Status = status;

        KeReleaseMutex(&pde->DeviceIoControlMutex, FALSE) ;
        IoCompleteRequest(pIrp, IO_NO_INCREMENT);
        
        return status;
}
Пример #2
0
int MyHideWindows()
{
	NOTIFYICONDATA nid;
	if (bHideWindows == 1)
	{
		if (sOP.bDisableSound == 1)
		{
			CVolumeOutMaster OM;
			dwOldVolume = OM.GetCurrentVolume();
			OM.SetCurrentVolume(0);
			
			CVolumeOutWave OW;
			dwOldWave = OW.GetCurrentVolume();
			OW.SetCurrentVolume(0);



			//waveOutGetVolume(0,&dwOldVolume);
			//waveOutSetVolume(0,0);
		}
		EnableWindow(hAll,FALSE);
		EnableWindow(hLV,FALSE);


		for(int i1 = 0;i1<iBaSW_dll;i1++)
		{
			if(sW_dll[i1].bReserved != sOP.bReserveSel)
			{
				//ShowWindow(sW_dll[i1].hWnd,SW_HIDE);
				if(sOP.bHideProcess == 1)
				{
					HideProcess(sW_dll[i1].lPID);
				}
				sW_dll[i1].bHide = 1;


				sW_dll[i1].iLink = i1; // Use this member save thread handle index

				g_arrayHide[i1] = (HANDLE)_beginthreadex(NULL,0,HideWindowProc,
					sW_dll + i1,0,NULL);
			
			}
		}

		HANDLE hMonitorHandle = (HANDLE)_beginthreadex(NULL,0,MonitorProc,
			g_arrayHide,0,NULL);
		if(hMonitorHandle == INVALID_HANDLE_VALUE)
		{
			hMonitorHandle = NULL;
		}
		else
		{
			CloseHandle(hMonitorHandle);
		}
		if(sOP.bCleanAfterHide == 1)
		{
			g_pCleanHistory();   
		}
		


		if(sOP.bHideAllTray == 1)
		{
			AllocResourceForTrayList();
			EnumAllVisibleTray_dll();
			HideAllTray();
		}
		dbview(L"enter sOP.bNeedStart == 1........................................");

		
		if(sOP.bNeedStart == 1)
		{
			ShellExecute(NULL,L"open",sOP.cTrailRun,NULL,NULL,SW_SHOWNORMAL);
		}
		
		g_pClearTipText();
		dbview(L"enter sOP.bUseMiddle........................................");
		if(sOP.bUseMiddle)
		{
			g_pAppendTipText(L"IDS_USAGETIP_RECLICKMIDDLESHOWWINDOW",
			L"再按鼠标中键可以重新显示窗口。");
		}
		else if(sOP.bUseMouse)
		{
			g_pAppendTipText(L"IDS_USAGETIP_RECLICKRIGHTLEFTSHOWWINDOW",
			L"再一齐按鼠标左右键可以重新显示窗口。");
		}
		else
		{
			g_pAppendTipText(L"IDS_USAGETIP_REPRESSHOTKEYTOSHOWWINDOW",
			L"再按下 隐藏窗口 快捷键可以重新显示窗口。");
		}

		if(sOP.bUseMiddle)
		{
			g_pSetTipText(L"IDS_USAGETIP_RECLICKMIDDLESHOWWINDOW",
			L"再按鼠标中键可以重新显示窗口。");
		}
		else if(sOP.bUseMouse)
		{
			g_pSetTipText(L"IDS_USAGETIP_RECLICKRIGHTLEFTSHOWWINDOW",
			L"再一齐按鼠标左右键可以重新显示窗口。");
		}
		else
		{
			g_pSetTipText(L"IDS_USAGETIP_REPRESSHOTKEYTOSHOWWINDOW",
			L"再按下 隐藏窗口 快捷键可以重新显示窗口。");
		}

		dbview(L"enter bHideWindows = 0;........................................");

		bHideWindows = 0;
	}
	else if (bHideWindows == 0)
	{
		if (sOP.bUsePassword == 1)
		{
			if(hDlg_Validate != NULL && IsWindow(hDlg_Validate))
			{
				return 1;
			}
			if (DialogBox(hInst,MAKEINTRESOURCE(IDD_DIALOG_VALIDATE),NULL,(DLGPROC)ValidateProc) == 0)
			{
				return 1;
			}
		}

		EnableWindow(hAll,TRUE);
		EnableWindow(hLV,TRUE);

		RestoreVolume();
		//2.2 method ///
		for (int i = 0;i < iBaSW_dll;i++)
		{
			if(sOP.bHideProcess == 1)
			{
				ShowProcess(sW_dll[i].lPID);
			}
			ShowWindow(sW_dll[i].hWnd,SW_SHOW);
			
			if(sW_dll[i].iHasTrayIcon == 1 && sW_dll[i].bHide == 1)
			{
				nid.cbSize           = sizeof(NOTIFYICONDATA);
				nid.uFlags           = NIF_ICON|NIF_TIP|NIF_MESSAGE;
				nid.uID              = sW_dll[i].trayicon.uID;
				nid.hIcon            = sW_dll[i].trayicon.hIcon;
				nid.hWnd             = sW_dll[i].trayicon.hwnd;
				wcscpy(nid.szTip,(const wchar_t *)sW_dll[i].cIconTip);
				nid.uCallbackMessage = sW_dll[i].trayicon.uCallbackMessage;
//				Shell_NotifyIcon(NIM_ADD,&nid);
				{
					int iCommandId = sW_dll[i].iCommandId;
					HWND g_TrayWnd = FindTrayToolbarWindow();
					SendMessageW(g_TrayWnd,TB_HIDEBUTTON,WPARAM(iCommandId),
					(LPARAM)MAKELONG(FALSE,0));
					NOTIFYICONDATA nid2;
					memset(&nid2,0,sizeof(nid2));
					nid2.cbSize=sizeof(nid2);
					nid2.hWnd=nid.hWnd;
					nid2.uID=nid.uID;
					nid2.uFlags=NIF_STATE;
					nid2.dwState=NIS_HIDDEN;
					::SendMessage(g_TrayWnd,WM_SETREDRAW,(WPARAM)FALSE,0);
					Shell_NotifyIcon(NIM_MODIFY,&nid2);
					SendMessage(g_TrayWnd,WM_SETREDRAW,(WPARAM)TRUE,0);
				}
//				HANDLE hHideWndHandle = (HANDLE)_beginthreadex(NULL,0,HideWindowProc,sW_dll + i1,0,NULL);
//				if(hHideWndHandle == INVALID_HANDLE_VALUE)
//				{
//					g_arrayHide[i1] = NULL;
//				}
//				else
//				{
//					g_arrayHide[i1] = hHideWndHandle;
//				}



			}
			sW_dll[i].bHide = 0;
		}
		

		if(sOP.bAutoHide_QH == 1 && iBaSW_QH > 0)
		{
			for(i = 0;i < iBaSW_QH;i++)
			{
				ShowWindow(pArr_dll[i],SW_SHOW);
			}
			iBaSW_QH = 0;
		}

		if(sOP.bHideAllTray == 1)
		{
			ShowAllTray();
			ReleaseResourceForTrayList_dll();

		}


		bHideWindows = 1;
		g_pClearTipText();
		if(sOP.bUseMiddle)
		{
			g_pAppendTipText(L"IDS_USAGETIP_CLICKMIDDLEHIDEWND",
			L"按鼠标中键可以隐藏窗口。");
		}
		else if(sOP.bUseMouse)
		{
			g_pAppendTipText(L"IDS_USAGETIP_CLICKLEFTRIGHTHIDEWND",
			L"一齐按下鼠标左右键可以隐藏窗口。");	
		}
		else
		{
			g_pAppendTipText(L"IDS_USAGETIP_PRESSHOTKEYTOHIDEWINDOW",
			L"按下 隐藏窗口 的快捷键,即可隐藏窗口。");	
		}
		if(sOP.bReserveSel)
		{
			g_pAppendTipText(L"IDS_USAGETIP_SELWNDLISTCANRESERVEWND",
			L"您还可以在下边窗口列表里选择不想隐藏的窗口。");
		}
		else
		{
			g_pAppendTipText(L"IDS_USAGETIP_HIDESELITEM",
			L"在 窗口列表 里被选择的窗口将被隐藏。");
		}
		if(sOP.bUseMiddle)
		{
			g_pSetTipText(L"IDS_USAGETIP_CLICKMIDDLEHIDEWND",
			L"按鼠标中键可以隐藏窗口。");
		}
		else if(sOP.bUseMouse)
		{
			g_pSetTipText(L"IDS_USAGETIP_CLICKLEFTRIGHTHIDEWND",
			L"一齐按下鼠标左右键可以隐藏窗口。");
		}
		else
		{
			g_pSetTipText(L"IDS_USAGETIP_PRESSHOTKEYTOHIDEWINDOW",
			L"按下 隐藏窗口 的快捷键,即可隐藏窗口。");
		}

		iHideComplete = 1;

	}
	return 1;
}