代码:
/*++ Module Name: ListDrvCon.cpp Enviroment: All Windows NT Platfrom;GUI Abstract: List all the driver's name & baseaddr & fileaddr Note: (1) Using documented API in psapi and ListView control to show the result (2) Wanted upgraded: + ListView control sort functionality(IMPORTANT) + Item should can be selected + Support the right click menu Revision: 23-Nov-2008 Created. Author: benyanwk --*/ ////////////////////////////////////////////////// // directives ///////////////////////////////////////////////// #define MAXNUM 255 #define UNICODE // to support chinese #include <windows.h> #include <commctrl.h> #include <psapi.h> #include <stdio.h> #define C_COLUMNS 4 // 4 columns to be added #include "resource.h" // the resource file #pragma comment(lib,"psapi.lib") #pragma comment(lib,"comctl32.lib") //////////////////////////////////////////////// // strcut defintion ///////////////////////////////////////////////// typedef struct _DRIVER_INFO { WCHAR BaseName[MAX_PATH]; WCHAR FileName[MAX_PATH]; DWORD BaseAddr; } DRIVER_INFO,*PDRIVER_INFO ; typedef struct _ALL_DRIVER_INFO { DWORD cnNum; DRIVER_INFO DrvInfo[1]; // define variable length structure } ALL_DRIVER_INFO,*PALL_DRIVER_INFO; //////////////////////////////////////////////// // function declaration /////////////////////////////////////////////// INT_PTR CALLBACK DlgProc( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ); int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ); int myGetDriverInfo( IN PVOID &pDrvInfo, IN BOOLEAN bAlloc ); BOOLEAN SetListView( IN HWND hListView ); BOOLEAN InitListView( IN HWND hListView ); ////////////////////////////////////////////// // Global variable declaration //////////////////////////////////////////// PALL_DRIVER_INFO g_pDrvInfo = NULL; // the global variable used to store the driver information HWND g_hInst = NULL; HWND g_hListView = NULL; /////////////////////////////////////////////// // function definition ////////////////////////////////////////////// int myGetDriverInfo( IN PALL_DRIVER_INFO* pDrvInfo, IN BOOLEAN bAlloc ) { /*++ Arguments: pDrvInfo-->the buffer to store the driver information bAlloc-->alloc the global memory by the function or not return 0 indicate success otherwise error --*/ DWORD cbNum = 0; PDWORD pBaseAddr = NULL ; PWCHAR pFileName = NULL; PWCHAR pBaseName = NULL; PALL_DRIVER_INFO pAllDrvInfo = NULL; pBaseAddr = (PDWORD)GlobalAlloc( GMEM_FIXED, sizeof(DWORD)*MAXNUM ); if( EnumDeviceDrivers( (LPVOID*)pBaseAddr, sizeof(DWORD)*MAXNUM, &cbNum ) != TRUE ) { // // indicate EnumDeviceDriver failed! // wprintf( L"EnumDeviceDriver failed! ErrorCode = %8x\n", GetLastError() ); return 1; } cbNum /=4; // cbNum return the bytes if( bAlloc == TRUE ) pAllDrvInfo = (PALL_DRIVER_INFO)GlobalAlloc( GMEM_FIXED, sizeof(DRIVER_INFO)*cbNum + 4 ); else pAllDrvInfo = (PALL_DRIVER_INFO)pDrvInfo; pAllDrvInfo->cnNum = cbNum; for( int i = 0; i < cbNum; i++ ) { pAllDrvInfo->DrvInfo[i].BaseAddr = *pBaseAddr; GetDeviceDriverBaseName( (LPVOID)*pBaseAddr, (LPWSTR)&pAllDrvInfo->DrvInfo[i].BaseName, MAX_PATH ); GetDeviceDriverFileName( (LPVOID)*pBaseAddr, (LPWSTR)&pAllDrvInfo->DrvInfo[i].FileName, MAX_PATH ); pBaseAddr++; } GlobalFree( pBaseAddr ); *pDrvInfo = pAllDrvInfo; // return the drv info buffer pointer return 0; // indicate success } int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { g_hInst = (HWND)GetModuleHandle( NULL ); InitCommonControls(); // // Create the main dialog // DialogBoxParam( (HINSTANCE)g_hInst, // hinstance MAKEINTRESOURCE(IDD_DIALOGBAR), // temple name NULL, // parent hwnd DlgProc, // dialog functoin NULL // initialize parameter ); ExitProcess(0); } INT_PTR CALLBACK DlgProc( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ) { RECT rect; HWND hwndOwner; RECT rc,rcDlg,rcOwner; int iSelCol; HICON hIcon; switch( uMsg ) { case WM_CLOSE: GlobalFree( g_pDrvInfo); EndDialog( hwndDlg, NULL ); break; case WM_INITDIALOG: // // set the icon // hIcon = LoadIcon( (HINSTANCE)g_hInst, (LPCWSTR)IDI_ICON1 ); SendMessage( hwndDlg, WM_SETICON, ICON_BIG, (LPARAM)hIcon ); SendMessage( hwndDlg, WM_SETICON, ICON_SMALL, (LPARAM)hIcon ); // // centre the dialog // g_hListView = GetDlgItem( hwndDlg, IDC_LIST2 ); hwndOwner = GetDesktopWindow(); GetWindowRect( hwndOwner, &rcOwner ); GetWindowRect( hwndDlg, &rcDlg ); CopyRect( &rc, &rcOwner ); // Offset the owner and dialog box rectangle so that // right and bottom values represent the width and // height, and then offset the owner again to discard // space taken up by the dialog OffsetRect( &rcDlg, -rcDlg.left, -rcDlg.top ); OffsetRect( &rc, -rc.left, -rc.top ); OffsetRect( &rc, -rcDlg.right, -rcDlg.bottom ); SetWindowPos( hwndDlg, HWND_TOP, rcOwner.left + ( rc.right / 2 ), rcOwner.top + ( rc.bottom / 2 ), rcDlg.right, rcDlg.bottom, SWP_NOSIZE ); // // set the default control to the refresh button // SetFocus( GetDlgItem( hwndDlg, IDC_REFRESH ) ); // // set the listview control // SetWindowPos( g_hListView, HWND_TOP, LOWORD(lParam)*0.5/10, HIWORD(lParam)*0.5/10, LOWORD(lParam)*9/10, HIWORD(lParam)*8.5/10, SWP_SHOWWINDOW ); InitListView( g_hListView ); SetListView( g_hListView ); break; case WM_COMMAND: if( wParam == IDC_REFRESH ) { // // indicate push refresh button // SetListView( g_hListView ); } else if( wParam == IDC_EXIT ) { // // indicate exit // GlobalFree( g_pDrvInfo); EndDialog( hwndDlg, NULL ); } break; case WM_SIZE: // // reset the button control // SetWindowPos( GetDlgItem( hwndDlg, IDC_REFRESH ), HWND_TOP, LOWORD(lParam)*1/8, HIWORD(lParam)*9.2/10, LOWORD(lParam)*1/8, HIWORD(lParam)*0.5/10, SWP_SHOWWINDOW ); SetWindowPos( GetDlgItem( hwndDlg, IDC_EXIT ), HWND_TOP, LOWORD(lParam)*5/8, HIWORD(lParam)*9.2/10, LOWORD(lParam)*1/8, HIWORD(lParam)*0.5/10, SWP_SHOWWINDOW ); // // reset the listview control // SetWindowPos( g_hListView, HWND_TOP, LOWORD(lParam)*0.5/10, HIWORD(lParam)*0.5/10, LOWORD(lParam)*9/10, HIWORD(lParam)*8.5/10, SWP_SHOWWINDOW ); //InitListView( g_hListView ); SetListView( g_hListView ); return FALSE; default: return FALSE; } return TRUE; } BOOLEAN InitListView( IN HWND hListView ) /*++ Note: this routine totally copy from MSDN --*/ { LVCOLUMN lvc = {0}; int iCol; WCHAR szText[256]; lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; for( iCol = 0; iCol < C_COLUMNS; iCol++ ) { lvc.iSubItem = 0; lvc.pszText = szText; switch( iCol ) { case 0: lvc.cx = 60; break; case 1: lvc.cx = 100; break; case 2: lvc.cx = 150; break; case 3: lvc.cx = 450; break; } LoadString((HINSTANCE)g_hInst, IDS_FIRSTCOLUMN + iCol, szText, sizeof(szText)/sizeof(szText[0])); if (ListView_InsertColumn( hListView, iCol, &lvc) == -1 ) return FALSE; } return TRUE; } BOOLEAN SetListView( IN HWND hListView ) { LVITEM lvi = {0}; int iItem; WCHAR temp[13] = {0}; // // get the driver information // myGetDriverInfo( &g_pDrvInfo, TRUE ); // // first clean the orignal text // ListView_DeleteAllItems( g_hListView ); // // now insert the subitems // lvi.mask = LVIF_TEXT; lvi.cchTextMax = MAX_PATH; for( iItem = 0; iItem < g_pDrvInfo->cnNum; iItem++ ) { lvi.iItem = iItem; // insert the odrer lvi.iSubItem = 0; wsprintf( temp, L"%d", iItem ); lvi.pszText = temp; ListView_InsertItem( hListView, &lvi ); // insert the base addr lvi.iSubItem = 1; wsprintf( temp, L"0x%8x", g_pDrvInfo->DrvInfo[iItem].BaseAddr ); lvi.pszText = temp; ListView_SetItem( hListView, &lvi ); // insert the base name lvi.iSubItem = 2; lvi.pszText = (LPWSTR)g_pDrvInfo->DrvInfo[iItem].BaseName; ListView_SetItem( hListView, &lvi ); // insert the file name lvi.iSubItem = 3; lvi.pszText = (LPWSTR)g_pDrvInfo->DrvInfo[iItem].FileName; ListView_SetItem( hListView, &lvi ); } return TRUE; }