Смекни!
smekni.com

Характеристика Win32 (стр. 2 из 4)

Подробное рассмотрение данных производительности выходит за рамки данной статьи, отметим лишь, что система подсчета производительности в Windows NT определяет понятие объекта, для которого осуществляется подсчет производительности. Примерами объектов являются процессор и жесткий диск. Каждый объект может иметь один или более экземпляров, и для каждого объекта существует свой набор счетчиков производительности. Наша задача состоит в перечислении всех экземпляров объекта с именем «Process» и получении для каждого из них значения счетчика с именем «ID Process».

1.6 Использование Windows Management Instrumentation

Windows Management Instrumentation (WMI) являетсяреализацией Mircrosoft длятакназываемойтехнологии Web-Based Enterprise Management (WBEM). WBEM определяет унифицированную архитектуру, которая позволяет получать данные от различных источников, построенных с помощью различных технологий и платформ, и единообразно представлять эти данные. WBEM основана на схеме общей информационной модели (Common Information Model, CIM), которая является индустриальным стандартом, управляемым Distributed Management Task Force (DMTF). WMI поставляется в составе Windows 2000, но также может быть установлен на Windows 95/98/Me и Windows NT 4.0

Поскольку WMI основана на технологии COM, это избавляет от необходимости явно загружать требуемые библиотеки, как это делалось в предыдущих примерах. Этот же факт требует инициализации библиотеки COM прежде чем будет вызвана функция перечисления процессов. В приложении, созданном с использованием MFC, это можно сделать с помощью функции AfxOleInit, в остальных случаях следует пользоваться функциями CoInitialize или CoInitializeEx.

Кроме того, использование WMI требует инициализации безопасности COM с помощью функции CoInitializeSecurity

Заметим, что как и метод с использованием счетчиков производительности, этот метод позволяет перечислить процессы на другом компьютере, для чего нужно указать имя компьютера в вызове IWbemLocator: ConnectServer.


2. Описание программы

2.1 Описание алгоритма

Программа была написана на MicrosoftVisualStudio 2005, на языке С++, с использованием библиотек классов MFC, и функций Win32API.

При запуске программы открывается окно:

Рисунок 2.1 – Окно программы

Сразу отображается список запущенных процес сов, построенный с помощью функциии EnumProcesses_NtApi, реализующей перечисление процессов с использованием функции ZwQuerySystemInformation.

Определение времени запуска процесса осуществляется с помощью функции CreateTime_str.

При нажатии левой кнопкой мыши на поля «ID» или «Name» осуществляется сортировка при помощи функции CMainFrame: OnList_ColumnClick, и функции сортировки CMainFrame: SortCallback.


Рисунок 2.2 – Пример сортировки по названию

С помощью кнопки Exit программа закрывается.


3. Инструкция пользователя

3.1 Назначение продукта

Эта программа предназначена для частного пользования, для определения процессов, запущенных на компьютере, и времени их запуска.

3.2 Системные требования

Рекомендованные системные требования для компьютера:

Процессор: IntelPentiumIII 0.8Ггц или выше;

ОЗУ: 128 Мб;

ПЗУ: 10 МБ;

Видео адаптер: Поддерживающий Directx 6.0 и выше;

ОС: WindowsXPи выше

3.3 Запуск программы

Клиентское приложение состоит из файла «pview.exe». При запуске этого файла открывается окно. Автоматически загружается список запущенных приложений. При нажатии левой кнопкой мыши на «ID», список процессов, сортируется по коду. При нажатии левой кнопкой мыши на «Name», список сортируется по названию. Сортировать можно как по возрастанию, так и по убыванию.

В строке меню находится кнопка «Exit», при нажатии на которую, программа закроется.


Выводы

В ходе выполнения данного курсового проекта была разработана программа на языке высокого уровня VisualC++. А также изучены возможности данного языка.

Систематизированы и закреплены практические навыки использования ПК, программного обеспечения, существующих средств обслуживания системных программистов, а также теоретические знания по основным разделам курса «Операционные системы». Основное внимание уделено изучению современных операционных систем.

В ходе выполнения курсовой работы были использованы не только учебные средства, но и исходники различных программ.

Получены практические навыки работы в среде MicrosoftVisualStudio.


Список литературы

1. Дейтел Х. Дейтел П. Как программировать на С++. «Бином» – Моква, 2004. – 1018 с.

2. Бондарев М.Ф. Липанов А.В. Путятин Е.П. Синельникова Т.Ф. Системное программирование в современных операционных системах «Компания СМИТ» – Харьков, 2005. – 432 с.

3. Холзнер С. Visual С++. «Питер» – Санкт Петербург, 2006. – 580 с.

4. Павловская Т.А. С/С++. Программирование на языке высокого уровня – СПб: Издательство «Питер», 2001. –464 с.

5. Саймон Р. Microsoft Windows API. Справочник системного программиста. «DiaSoft» – Киев, 2004. – 1216 с.

6.http://rsdn.ru/

7. http://www.source-code.ru

8. http://www.codeguru.com


Приложение

Тексты файлов программы

· enumproc.cpp

#include «stdafx.h»

#include «enumproc.h»

#include <tlhelp32.h>

#include <pdh.h>

#include <pdhmsg.h>

#include <comdef.h>

#include «SshWbemHelpers.h»

// Some definitions from NTDDK and other sources

//

typedef LONG NTSTATUS;

typedef LONG KPRIORITY;

#define NT_SUCCESS(Status) ((NTSTATUS) (Status) >= 0)

#define STATUS_INFO_LENGTH_MISMATCH ((NTSTATUS) 0xC0000004L)

#define SystemProcessesAndThreadsInformation 5

typedef struct _CLIENT_ID {

DWORD UniqueProcess;

DWORD UniqueThread;

} CLIENT_ID;

typedef struct _UNICODE_STRING {

USHORT Length;

USHORT MaximumLength;

PWSTR Buffer;

} UNICODE_STRING;

typedef struct _VM_COUNTERS {

SIZE_T PeakVirtualSize;

SIZE_T VirtualSize;

ULONG PageFaultCount;

SIZE_T PeakWorkingSetSize;

SIZE_T WorkingSetSize;

SIZE_T QuotaPeakPagedPoolUsage;

SIZE_T QuotaPagedPoolUsage;

SIZE_T QuotaPeakNonPagedPoolUsage;

SIZE_T QuotaNonPagedPoolUsage;

SIZE_T PagefileUsage;

SIZE_T PeakPagefileUsage;

} VM_COUNTERS;

typedef struct _SYSTEM_THREADS {

LARGE_INTEGER KernelTime;

LARGE_INTEGER UserTime;

LARGE_INTEGER CreateTime;

ULONG WaitTime;

PVOID StartAddress;

CLIENT_ID ClientId;

KPRIORITY Priority;

KPRIORITY BasePriority;

ULONG ContextSwitchCount;

LONG State;

LONG WaitReason;

} SYSTEM_THREADS, * PSYSTEM_THREADS;

// Note that the size of the SYSTEM_PROCESSES structure is different on

// NT 4 and Win2K, but we don't care about it, since we don't access neither

// IoCounters member nor Threads array

typedef struct _SYSTEM_PROCESSES {

ULONG NextEntryDelta;

ULONG ThreadCount;

ULONG Reserved1 [6];

LARGE_INTEGER CreateTime;

LARGE_INTEGER UserTime;

LARGE_INTEGER KernelTime;

UNICODE_STRING ProcessName;

KPRIORITY BasePriority;

ULONG ProcessId;

ULONG InheritedFromProcessId;

ULONG HandleCount;

ULONG Reserved2 [2];

VM_COUNTERS VmCounters;

#if _WIN32_WINNT >= 0x500

IO_COUNTERS IoCounters;

#endif

SYSTEM_THREADS Threads[1];

} SYSTEM_PROCESSES, * PSYSTEM_PROCESSES;

// –

// EnumProcesses_NtApi

BOOL

WINAPI

EnumProcesses_NtApi (

IN LPCTSTR pszMachineName,

IN PFNENUMPROC pfnEnumProc,

IN LPARAM lParam

)

{

_UNUSED(pszMachineName);

_ASSERTE (pfnEnumProc!= NULL);

_ASSERTE (pszMachineName == NULL);

HINSTANCE hNtDll;

NTSTATUS (WINAPI * _ZwQuerySystemInformation) (UINT, PVOID, ULONG, PULONG);

// get handle to NTDLL.DLL

hNtDll = GetModuleHandle (_T(«ntdll.dll»));

_ASSERTE (hNtDll!= NULL);

// find the address of ZwQuerySystemInformation

*(FARPROC *)&_ZwQuerySystemInformation =

GetProcAddress (hNtDll, «ZwQuerySystemInformation»);

if (_ZwQuerySystemInformation == NULL)

return SetLastError (ERROR_PROC_NOT_FOUND), FALSE;

// obtain a handle to the default process heap

HANDLE hHeap = GetProcessHeap();

FILETIME Local_CreateTime, MyCreateTime;

SYSTEMTIME System_CreateTime;

char CreateTime_str[55];

NTSTATUS Status;

ULONG cbBuffer = 0x8000;

PVOID pBuffer = NULL;

do

{

pBuffer = HeapAlloc (hHeap, 0, cbBuffer);

if (pBuffer == NULL)

return SetLastError (ERROR_NOT_ENOUGH_MEMORY), FALSE;

Status = _ZwQuerySystemInformation (

SystemProcessesAndThreadsInformation,

pBuffer, cbBuffer, NULL);

if (Status == STATUS_INFO_LENGTH_MISMATCH)

{

HeapFree (hHeap, 0, pBuffer);

cbBuffer *= 2;

}

else if (! NT_SUCCESS(Status))

{

HeapFree (hHeap, 0, pBuffer);

return SetLastError(Status), FALSE;

}

}

while (Status == STATUS_INFO_LENGTH_MISMATCH);

PSYSTEM_PROCESSES pProcesses = (PSYSTEM_PROCESSES) pBuffer;

for (;)

{

PCWSTR pszProcessName = pProcesses->ProcessName. Buffer;

MyCreateTime.dwHighDateTime = pProcesses->CreateTime. HighPart;

MyCreateTime.dwLowDateTime = pProcesses->CreateTime. LowPart;

if (MyCreateTime.dwLowDateTime!= 0 && MyCreateTime.dwHighDateTime!= 0)

{

FileTimeToLocalFileTime (&MyCreateTime,&Local_CreateTime);

FileTimeToSystemTime (&Local_CreateTime,&System_CreateTime);

sprintf (CreateTime_str, «%02u:%02u:%02u:%03u&bsol;0», System_CreateTime.wHour, System_CreateTime.wMinute, System_CreateTime.wSecond, System_CreateTime.wMilliseconds);

}

else

{

sprintf (CreateTime_str, «00:00:00:000&bsol;0»);

}

if (pszProcessName == NULL)

pszProcessName = L «Idle»;

#ifdef _UNICODE

if (! pfnEnumProc (pProcesses->ProcessId, pszProcessName, CreateTime_str, lParam))

break;

#else

CHAR szProcessName [MAX_PATH];

WideCharToMultiByte (CP_ACP, 0, pszProcessName, -1,

szProcessName, MAX_PATH, NULL, NULL);

if (! pfnEnumProc (pProcesses->ProcessId, szProcessName, CreateTime_str, lParam))

break;

#endif

if (pProcesses->NextEntryDelta == 0)

break;

// find the address of the next process structure

pProcesses = (PSYSTEM_PROCESSES) (((LPBYTE) pProcesses)

+ pProcesses->NextEntryDelta);

}

HeapFree (hHeap, 0, pBuffer);

return TRUE;

}

· mainfrm.cpp

#include «stdafx.h»

#include «pview.h»

#include «mainfrm.h»

#include «enumproc.h»

#include «secedit.h»

BEGIN_MESSAGE_MAP (CMainFrame, CFrameWnd)

ON_WM_CONTEXTMENU()

ON_WM_CREATE()

ON_WM_DESTROY()

ON_WM_SETFOCUS()

ON_COMMAND (ID_VIEW_REFRESH, OnViewRefresh)

ON_COMMAND (ID_VIEW_APPLICATIONS, OnViewApplications)

ON_UPDATE_COMMAND_UI (ID_VIEW_APPLICATIONS, OnViewApplications_Update)

ON_COMMAND (ID_VIEW_PROCESSES, OnViewProcesses)

ON_UPDATE_COMMAND_UI (ID_VIEW_PROCESSES, OnViewProcesses_Update)

ON_COMMAND (ID_OPTIONS_ENUMPROC_TOOLHELP, OnOptionsEnumprocToolhelp)

ON_UPDATE_COMMAND_UI (ID_OPTIONS_ENUMPROC_TOOLHELP, OnOptionsEnumprocToolhelp_Update)

ON_COMMAND (ID_OPTIONS_ENUMPROC_NTAPI, OnOptionsEnumprocNtapi)

ON_UPDATE_COMMAND_UI (ID_OPTIONS_ENUMPROC_NTAPI, OnOptionsEnumprocNtapi_Update)

ON_COMMAND (ID_OPTIONS_ENUMPROC_PERFDATA, OnOptionsEnumprocPerfdata)

ON_UPDATE_COMMAND_UI (ID_OPTIONS_ENUMPROC_PERFDATA, OnOptionsEnumprocPerfdata_Update)

ON_UPDATE_COMMAND_UI (ID_OPTIONS_DEBUG, OnOptionsDebug_Update)

ON_COMMAND (ID_OPTIONS_DEBUG, OnOptionsDebug)

ON_COMMAND (ID_OPTIONS_ENUMPROC_WMI, OnOptionsEnumprocWmi)

ON_UPDATE_COMMAND_UI (ID_OPTIONS_ENUMPROC_WMI, OnOptionsEnumprocWmi_Update)

ON_WM_TIMER()

ON_COMMAND (ID_ACTION_SECURITY, OnActionSecurity)

ON_UPDATE_COMMAND_UI (ID_ACTION_SECURITY, OnActionSecurity_Update)

ON_WM_SYSCOLORCHANGE()

ON_NOTIFY (LVN_COLUMNCLICK, AFX_IDW_PANE_FIRST, OnList_ColumnClick)

ON_NOTIFY (LVN_DELETEITEM, AFX_IDW_PANE_FIRST, OnList_DeleteItem)

ON_COMMAND (ID_ABOUT, &CMainFrame: OnAbout)

END_MESSAGE_MAP()

// –

// CMainFrame

CMainFrame:CMainFrame()

{

m_bProcesses = -1;

m_nSortOrder = -1;

m_nAppsSortOrder = -1;

m_bShow16Bit = FALSE;

m_hVdmDbg = NULL;

m_pfnVDMEnumTaskWOWEx = NULL;

m_pfnVDMTerminateTaskWOW = NULL;

m_hPDH = NULL;

m_hPSAPI = NULL;

m_bWmiAvailable = NULL;

m_nRefreshPeriod = UPDATE_PERIOD_NORMAL;

m_bSedAvailable = FALSE;

//m_pfnIsAppHung = IsAppHung_SMTO;

m_dwWaitStart = 0;

m_osvi.dwOSVersionInfoSize = sizeof (m_osvi);

_VERIFY (GetVersionEx(&m_osvi));

}

// –

// ~CMainFrame

CMainFrame:~CMainFrame()

{

}

// –

// PreCreateWindow

BOOL

CMainFrame: PreCreateWindow (

CREATESTRUCT& cs

)

{

if (! CFrameWnd: PreCreateWindow(cs))

return FALSE;

cs.dwExStyle &= ~WS_EX_CLIENTEDGE;