天天看點

常用系統資訊API

1.視窗資訊

    MS為我們提供了打開特定桌面和枚舉桌面視窗的函數。

    hDesk=OpenDesktop(lpszDesktop,0,FALSE,DESKTOP_ENUMERATE);

    //打開我們預設的Default桌面;

    EnumDesktopWindows(hDesk,(WNDENUMPROC)EnumWindowProc,0);

    //枚舉打開桌面上的所有視窗,由回調函數實作。

    BOOL __stdcall EnumWindowProc(HWND, LPARAM);

    //在回調函數中,我們可以獲得視窗的标題和相關程序,線程資訊;

    GetWindowText(hWnd,szWindowText,dwMaxCount);

    GetWindowThreadProcessId(hWnd,&dwPID);

    2.裝置驅動器資訊(服務和裝置驅動器差不多,在此不做重複)

    裝置驅動資訊有服務控制管理器(SCM)來管理的,我要打開服務控制管理器,并枚舉所有的裝置驅動器。

    OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);

    //以所有權限打開服務控制管理器;

    EnumServicesStatus(schManager,dwDeviceType,dwDeviceState,

    EnumStatus,dwBufSize,&dwBytesNeeded,

   &dwDevicesReturned,&dwResumeHandle))

    //枚舉所有裝置的目前狀态;

    CloseServiceHandle(schManager);

    //記住,在結束通路後要關閉服務句柄;

    OpenService(schManager,szDeviceName,SERVICE_ALL_ACCESS);

    //打開特定的裝置驅動器;

    QueryServiceConfig(schDevice,lpDeviceConfig,

     1024*8,&dwBytesNeeded);

    //查詢驅動器的服務配置資訊;

    QueryServiceStatus(schDevice,&DeviceStatus);

    //查詢裝置驅動器的目前狀态;

    QueryServiceConfig2(schDevice,SERVICE_CONFIG_DESCRIPTION,

    (LPBYTE)lpDeviceDescription,8*1024,&dwBytesNeeded)

    //查詢裝置的描述資訊;

    StartService(schDevice,0,NULL);

    //啟動裝置;

    ControlService(schDevice,SERVICE_CONTROL_STOP,&DeviceStatus);

    //停止裝置;

    DeleteService(schDevice);

    //删除裝置;

    3.磁盤資訊

    我們希望獲得系統所有磁盤的資訊,包括軟碟,硬碟,CD光牒等等;

    GetLogicalDriveStrings(dwBufferLength,lpBuffer);

    //獲得邏輯裝置的資訊;

    GetVolumeInformation(lpRootPathName,lpVolumeNameBuffer,

     dwVolumeNameSize,&dwVolumeSerialNumber,

     &dwMaximumComponentLength,&dwFileSystemFlags,

     lpFileSystemNameBuffer,dwFileSystemNameSize);

    //獲得磁盤卷資訊,包括卷名稱和格式類型;

    GetDiskFreeSpaceEx(lpRootPathName,&FreeBytesAvailable,

     &TotalNumberOfBytes,&TotalNumberOfFreeBytes);

    //探測磁盤的空間使用情況;

    4.環境變量

    我們可以從系統資料庫中獲得環境塊的資訊:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment,當然要使用系統資料庫的函數。

    RegOpenKeyEx(HKEY_LOCAL_MACHINE,RegKey,0,KEY_QUERY_VALUE,&hKey);

    //打開系統資料庫的鍵;

    RegEnumValue(hKey,dwIndex,EnvironVariable,

    &dwVariableLength,NULL,NULL,NULL,NULL);

    //查詢我們需要的資訊值;

    GetEnvironmentVariable(EnvironVariable,EnvironString,1024);

    //獲得環境變量的字元串資訊;

    5.事件記錄資訊

    OpenEventLog(NULL,szLog);

    //打開時間日志記錄;

    GetOldestEventLogRecord(hEvent,&dwThisRecord);

    //獲得最新的日志資訊,以便繼續查找;

    ReadEventLog(hEvent,EVENTLOG_FORWARDS_READ │ EVENTLOG_SEQUENTIAL_READ,

   0,pEventLogRecord,1024*32,&dwRead,&dwNeeded)

    //讀去日志資訊;

    LookupAccountSid(NULL,pSid,szName,&dwName,szDomain,&dwDomain,&SNU);

    //擷取賬戶的SID,以便獲得賬戶的使用者名稱;

    GetNumberOfEventLogRecords(hEvent,&dwTotal);

    //獲得事件日志的總數;

    CloseEventLog(hEvent);

    //不要忘記關閉事件句柄;

    6.網絡共享

    我們使用第二等級的網絡共享搜尋;

    NetShareEnum(NULL,dwLevel,(PBYTE *)&pBuf,MAX_PREFERRED_LENGTH,&entriesread,&totalentries,&resume);

    //列舉所有的共享目錄及相關資訊;

    NetApiBufferFree(pBuf);

    //釋放緩沖區;

    NetShareDel(NULL,(char *)lpShareNameW,0);

    //删除網絡共享目錄;

    7.網絡擴充卡資訊

    我們要探測NIC的資訊和網絡流量;

    GetAdaptersInfo(&AdapterInfo,&OutBufLen);

    //擷取擴充卡資訊;

    8.系統性能

    擷取系統的存儲器使用情況;

    GetPerformanceInfo(&PerfInfo,sizeof(PERFORMACE_INFORMATION))

    //擷取系統性能資訊;

    9.程序/線程/子產品資訊

    在此我們使用工具幫助函數(ToolHelp32)和系統

    OpenProcessToken(GetCurrentProcess(),TOKEN_QUERY │ TOKEN_ADJUST_PRIVILEGES,&hToken);

    //打開程序的令牌,提升權限;

    AdjustTokenPrivileges(hToken,FALSE,&TokenPrivileges,sizeof(TOKEN_PRIVILEGES),NULL,NULL);

    //将程序的權限提升到支援調試(Debug);

    CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);

    //建立程序的快照;

    Process32First(hProcessSnap,&ProcessEntry32);

    //枚舉所有程序;

    OpenProcess(PROCESS_QUERY_INFORMATION,FALSE,ProcessEntry32.th32ProcessID);

    //打開特定程序,以查詢程序相關資訊;

    GetProcessTimes(hProcess,&CreateTime,&ExitTime,&KernelTime,&UserTime);

    //擷取程序的時間資訊; 

    GetProcessMemoryInfo(hProcess,&PMCounter,sizeof(PMCounter));

    //擷取程序的存儲區資訊;

    GetPriorityClass(hProcess);

    //擷取程序的優先權;

    GetProcessIoCounters(hProcess,&IoCounters);

    //擷取程序的IO使用情況;

    CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwProcessID);

    //建立子產品快照;

    Module32First(hModuleSnap, &ModuleEntry32);

    Module32Next(hModuleSnap, &ModuleEntry32);

    //枚舉程序子產品資訊;

    CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);

    //建立線程快照;

    Thread32First(hThreadSnap, &ThreadEntry32);

    Thread32Next(hThreadSnap, &ThreadEntry32);

    //枚舉線程資訊;

    OpenThread(THREAD_ALL_ACCESS,FALSE,ThreadEntry32.th32ThreadID);

    //打開線程,須自己獲得此函數位址;

    TerminateProcess(hProcess,0);

    //終止程序;

    SuspendThread(hThread);

    //懸挂線程;

    ResumeThread(hThread);

    //激活線程;

    10.關機

    //調整程序令牌,使其支援關機;

    ExitWindowsEx(EWX_LOGOFF,0);

    //登出系統;

    LockWorkStation();

    //鎖定系統;

    InitiateSystemShutdown(NULL,szMessage,dwTimeout,FALSE,bSig);

    //支援到記時和消息顯示的關機/重新開機;

    SetSystemPowerState(bSig,FALSE);

    //系統休眠/冬眠;

    11.使用者資訊

    NetUserEnum(NULL,dwLevel,FILTER_NORMAL_ACCOUNT,(LPBYTE*)&pBuf,

                dwPrefMaxLen,&dwEntriesRead,&dwTotalEntries,&dwResumeHandle);

    //枚舉系統使用者資訊;

    NetUserDel(NULL,lpUserNameW); 

    //删除指定使用者;

    12.系統版本資訊

    GetVersionEx((LPOSVERSIONINFO)&osviex);

    //擷取作業系統的版本資訊;

    我們也可以通過系統資料庫(HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion)擷取相關資訊:

    GetTickCount();

    //擷取開機時間;

    GetComputerName(szInfo,&dwInfo);

    //擷取計算機名稱;

    GetUserName(szInfo,&dwInfo);

    //擷取計算機使用者名;

    GetWindowsDirectory(szInfo,MAX_PATH+1);

    //擷取Windows目錄;

    GetSystemDirectory(szInfo,MAX_PATH+1);

    //擷取系統目錄;

繼續閱讀