Будь умным!


У вас вопросы?
У нас ответы:) SamZan.net

Отчет по курсовой работе По дисциплине- Организация и функционирование ОС Разработка консольной прогр.

Работа добавлена на сайт samzan.net: 2016-03-13

Поможем написать учебную работу

Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.

Предоплата всего

от 25%

Подписываем

договор

Выберите тип работы:

Скидка 25% при заказе до 18.5.2024

Федеральное агентство по образованию

Государственное образовательное учреждение

высшего профессионального образования

«Омский государственный технический университет»

Отчет по курсовой работе

По дисциплине: «Организация и функционирование ОС»

«Разработка консольной программы выдачи информации о процессах и нитей»

Омск – 2009


Содержание

  1.  Задание         3
  2.  Введение         4
  3.  Описание программы       5
  4.  Текст программы        8
  5.  Список литературы        17


Задание

Разработка консольной программы выдачи информации о процессах и нитей.

Разработать для ОС Windows программу, аналогичную программе ps из Unix. Для процессов кроме идентификаторов требуется выдавать число нитей и текущие состояния этих нитей. Использовать только функции Win32 API или Native API.


Введение

Windows API (application programming interfaces) — общее наименование целого набора базовых функций интерфейсов программирования приложений операционных систем семейств Windows и Windows NT корпорации «Майкрософт». Является самым прямым способом взаимодействия приложений с Windows. Для создания программ, использующих Windows API, «Майкрософт» выпускает SDK, который называется Platform SDK и содержит документацию, набор библиотек, утилит и других инструментальных средств.

Native API

Для прикладных программ системой Windows NT предоставляется несколько наборов API. Самый основной из них — так называемый «родной» API (NT Native API), реализованный в динамически подключаемой библиотеке ntdll и состоящий из двух частей: системные вызовы ядра NT (функции с префиксами Nt и Zw, передающие выполнение функциям ядра ntoskrnl с теми же названиями) и функции, реализованные в пользовательском режиме (с префиксом Rtl). Часть функций второй группы используют внутри себя системные вызовы; остальные целиком состоят из непривилегированного кода, и могут вызываться не только из кода пользовательского режима, но и из драйверов. Кроме функций Native API, в ntdll также включены функции стандартной библиотеки языка Си.

Официальная документация на Native API весьма скудна, но сообществам энтузиастов удалось методом проб и ошибок собрать достаточно обширные сведения об этом интерфейсе. В частности, в феврале 2000 года опубликована книга Гэри Неббета «Справочник по базовым функциям API Windows NT/2000» (ISBN 1-57870-199-6); в 2002 году она была переведена на русский язык (ISBN 5-8459-0238-X). Источником информации о Native API может служить Windows DDK, где описаны некоторые функции ядра, доступные посредством Native API, а также изучение кода Windows (обратный инжиниринг) — посредством дизассемблирования, либо используя исходные тексты Windows 2000, ставшие доступными в результате утечки, либо используя исходные тексты Windows 2003, доступные в рамках программы Windows Research Kernel.

Программы, выполняющиеся до загрузки подсистем, обеспечивающих работу остальных API ОС Windows NT, ограничены использованием Native API. Например, программа autochk, проверяющая диски при загрузке ОС после некорректного завершения работы, использует только Native API.


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

Получение списка процессов осуществляется с помощью функции NtQuerySystemInformation.

NTSTATUS NtQuerySystemInformation (SYSTEM_INFORMATION_CLASS class,  PVOID info, ULONG len, PULONG actlen)

Где class – параметр, определяющий тип информации, получаемый от системы (для получения списка процессов SystemProcessInformation), второй параметр – указатель на требуемую информацию, третий – требуемый размер, четвертый – полученный размер данных.

Если функция возвращает 0, ошибок не произошло, иначе код ошибки.

При получении информации о процессе возвращается указатель на список.

struct _SYSTEM_PROCESS_INFORMATION {

 ULONG NextEntryOffset;

 ULONG NumberOfThreads;

 LARGE_INTEGER Reserved[3];

 LARGE_INTEGER CreateTime;

 LARGE_INTEGER UserTime;

 LARGE_INTEGER KernelTime;

 UNICODE_STRING Name;

 KPRIORITY BasePriority;

 HANDLE ProcessId;

 HANDLE InheritedFromProcessId;

 ULONG HandleCount;

 ULONG Reserved2[2];

 ULONG PrivatePageCount;

 VM_COUNTERS VirtualMemoryCounters;

 IO_COUNTERS IoCounters;

 SYSTEM_THREAD Threads[];

} SYSTEM_PROCESS_INFORMATION, *PSYSTEM_PROCESS_INFORMATION

NextEntryOffset -  приращение к указателю для получения следующей записи, ProcessId – идентификатор процесса, Name – имя процесса, NumberOfThreads – количество нитей, Threads – массив, содержащий информацию по нитям.

struct _SYSTEM_THREAD {

 LARGE_INTEGER KernelTime;

 LARGE_INTEGER UserTime;

 LARGE_INTEGER CreateTime;

 ULONG WaitTime;

 PVOID StartAddress;

 CLIENT_ID ClientId;

 KPRIORITY Priority;

 LONG BasePriority;

 ULONG ContextSwitchCount;

 ULONG State;

 KWAIT_REASON WaitReason;

} SYSTEM_THREAD, *PSYSTEM_THREAD

Параметр ClientId – структура, она содержит 2 поля UniqueProcess – идентификатор процесса и UniqueThread – идентификатор нити. Параметр State – определяет состояние нити, WaitTime – причину ожидания

enum _KWAIT_REASON {

 Executive = 0,

 FreePage = 1,

 PageIn = 2,

 PoolAllocation = 3,

 DelayExecution = 4,

 Suspended = 5,

 UserRequest = 6,

 WrExecutive = 7,

 WrFreePage = 8,

 WrPageIn = 9,

 WrPoolAllocation = 10,

 WrDelayExecution = 11,

 WrSuspended = 12,

 WrUserRequest = 13,

 WrEventPair = 14,

 WrQueue = 15,

 WrLpcReceive = 16,

 WrLpcReply = 17,

 WrVirtualMemory = 18,

 WrPageOut = 19,

 WrRendezvous = 20,

 Spare2 = 21,

 Spare3 = 22,

 Spare4 = 23,

 Spare5 = 24,

 WrCalloutStack = 25,

 WrKernel = 26,

 WrResource = 27,

 WrPushLock = 28,

 WrMutex = 29,

 WrQuantumEnd = 30,

 WrDispatchInt = 31,

 WrPreempted = 32,

 WrYieldExecution = 33,

 WrFastMutex = 34,

 WrGuardedMutex = 35,

 WrRundown = 36,

 MaximumWaitReason = 37

} KWAIT_REASON

Для уничтожения процессов или изменение их приоритета необходимо получить хэндл процесса, например, функцией

HANDLE OpenProcess(DWORD dwDesiredAccess, BOOL bInheritHandle,  DWORD dwProcessId )

Первый параметр определяет желаемые права получения хэндла (PROCESS_TERMINATE – для уничтожения, PROCESS_ALL_ACCESS – для смены приоритета). Второй показывает, будет ли хэндл наследоваться, третий – идентификатор процесса.

Функция, уничтожающая процесс

BOOL TerminateProcess(HANDLE hProcess, UINT uExitCode )

Первый параметр – хэндл процесса, второй – код завершения. Возвращает true, если действие удалось.

Функция, при помощи которой можно поменять приоритет процесса

NTSTATUS NtSetSystemInformation (SYSTEM_INFORMATION_CLASS class,  PVOID info, ULONG len)

При параметре class равном ProcessBasePriority, третий параметр – указатель на требуемый приоритет типа KPRIORITY или LONG.

Если функция возвращает 0, ошибок не произошло, иначе код ошибки.


Текст программы

#include <stdio.h>

#include <windows.h>

#include <winuser.h>

#include <winbase.h>

#include <alloc.h>

#include <stdlib.h>

#include "ntquery.h"

#include <string.h>

#include <conio.h>

HINSTANCE hdll;                                                                  //дескриптор загружаемой ntdll.dll

PFN_NTQUERYSYSTEMINFORMATION SystemInfo;    //NtQuerySystemInforamtion

PFN_NTSETINFORMATIONPROCESS SetProcInfo;        // NtSetSystemInforamtion

NTSTATUS status;

int help = 0;

int list = 0;

int process = 0;

int type = 0; //0-id, 1-name, 2-user

int pid = 0;

int priority = 8;

int terminate = 0;

wchar_t *procname ;

wchar_t *username ;

PSYSTEM_PROCESS_INFORMATION get_process_list()   //получение указателя на начало                                                                                                                        //списка

{

LPBYTE *pBuffer;

ULONG  bufferSize, actlen;

PSYSTEM_PROCESS_INFORMATION info;  

hdll = LoadLibrary(L"ntdll.dll");         //загрузка ntdll.dll

if (hdll == NULL) {

 printf("Cannot load library\n");

 return 0;

}

       //получение функций

SystemInfo = (HANDLE)GetProcAddress(hdll, "NtQuerySystemInformation");

 

if (SystemInfo == NULL) {

 printf("Cannot get procedure\n");

 FreeLibrary(hdll);

 return 0;

}

 

SetProcInfo = (HANDLE)GetProcAddress(hdll, "NtSetInformationProcess");

if (SetProcInfo == NULL)

{

 printf("Cannot get procedure SetProcInfo\n");

 FreeLibrary(hdll);

 return 0;

}

 //получение указателя на начало списка

bufferSize = 0;

do {

 bufferSize += 0x10000;

 pBuffer =(LPBYTE *)malloc(bufferSize);

status = SystemInfo(SystemProcessInformation, pBuffer, bufferSize, &actlen);

if (status == 0xC0000004 /*STATUS_INFO_LENGTH_MISMATCH*/) {

 free(pBuffer);

 }

} while (status == 0xC0000004 /*STATUS_INFO_LENGTH_MISMATCH*/);

info = (PSYSTEM_PROCESS_INFORMATION)pBuffer;

return info;

}

void strtolower(wchar_t *str)       //перевод строки в нижний регистр

{

int i = 0;

while((str[i]!='\0')&&(str[i]))

{

 if ((str[i] >= 65)&&(str[i] <= 90)) str[i] = str[i]+32;

 i++;

}

}

int print_mem_info()                 //вывод на экран данных о памяти

{

BOOL fResult;

MEMORYSTATUS memBuffer;

 

GlobalMemoryStatus(&memBuffer);

//printf("dwLength %u\n",memBuffer.dwLength);

printf("Загрузка памяти: %u%\n",memBuffer.dwMemoryLoad);

printf("Максимальное количество физической памяти: %ldKB (%u B)\n",memBuffer.dwTotalPhys/1024,memBuffer.dwTotalPhys);

printf("Свободное количество физической памяти: %ldKB (%u B)\n",memBuffer.dwAvailPhys/1024,memBuffer.dwAvailPhys);

printf("Макс. количество памяти для программ: %ldKB (%u B)\n",memBuffer.dwTotalPageFile/1024,memBuffer.dwTotalPageFile);

printf("Свободное количество памяти для программ: %ldKB (%u B)\n",memBuffer.dwAvailPageFile/1024,memBuffer.dwAvailPageFile);

printf("Максимальное количество виртуальной памяти: %ldKB (%u B)\n",memBuffer.dwTotalVirtual/1024,memBuffer.dwTotalVirtual);

printf("Свободное количество виртуальной памяти: %ldKB (%u B)\n",memBuffer.dwAvailVirtual/1024,memBuffer.dwAvailVirtual);

return 1;

}

 //вывод на экран списка процессов

int printlist(PSYSTEM_PROCESS_INFORMATION head) {

PSYSTEM_PROCESS_INFORMATION current = head;

LPBYTE pBuffer;

ULONG actlen;

UCHAR InfoBuffer[1024];

UCHAR szAccountName[1024];

UCHAR szDomainName[1024];

 

DWORD dwInfoBufferSize,dwAccountSize = 200, dwDomainSize = 200;

HANDLE hAccessToken;

PTOKEN_USER pTokenUser;

SID_NAME_USE snu;

HANDLE hproc;

DWORD needed;

int getname=0;

int find=0;

//заголовок

printf(" Id\t\tНазвание\t\t\tПользователь\n",current->ProcessId,current->Name.Buffer);

while (current != NULL)

{

 getname=0;

 find=0;

//получение имени пользователя, запустившего процесс

 hproc = (HANDLE)OpenProcess(PROCESS_QUERY_INFORMATION,FALSE,(ULONG)current->ProcessId);

 

  if (hproc)

 {

  if (OpenProcessToken(hproc,TOKEN_QUERY,&hAccessToken))

   if ( GetTokenInformation(hAccessToken,TokenUser,InfoBuffer, 1024, &actlen))

   {

pTokenUser = (PTOKEN_USER)InfoBuffer;

   LookupAccountSid(NULL, pTokenUser->User.Sid, szAccountName, &dwAccountSize,

    szDomainName, &dwDomainSize, &snu);

   getname = 1;

   if (type == 2)  // если поиск по имени пользователя

   {

    strtolower((wchar_t *)szAccountName);

    strtolower(username);

    if (wcscmp((wchar_t *)szAccountName,username)==0)

    find = 1;

   }

   }

  }

 }

 if ((type != 2)||((type == 2)&&(find == 1)))

 {

  //вывод информации

  printf(" %-8d\t%-25S\t",current->ProcessId,current->Name.Buffer);

  if (getname) printf("%-10S\t%-10S\n",szAccountName,szDomainName); else printf("\n");

 }

 //приращение

 if(current->NextEntryOffset == 0) {

  current = NULL;

 } else {

  current = (PSYSTEM_PROCESS_INFORMATION)((LPBYTE)current + current->NextEntryOffset);

 }

}

return 1;

}

//вывод информации о процессе

int printprocess(PSYSTEM_PROCESS_INFORMATION head)

{

PSYSTEM_PROCESS_INFORMATION current = head;

LPBYTE pBuffer;

ULONG actlen;

UCHAR InfoBuffer[1024];

UCHAR szAccountName[1024];

UCHAR szDomainName[1024];

 

DWORD dwInfoBufferSize,dwAccountSize = 200, dwDomainSize = 200;

HANDLE hAccessToken;

PTOKEN_USER pTokenUser;

SID_NAME_USE snu;

HANDLE hproc;

HMODULE hmodule;

PROCESS_BASIC_INFORMATION pbi;

PEB peb;

PROCESS_PARAMETERS params;

int i;

int findp = 0;

wchar_t *reasons[27] = {L"Executeve",L"FreePage",L"PageIn",L"PoolAllocation",L"DelayExecution",L"Suspended",  L"UserRequest",L"WrExecutive",L"WrFreePage",L"WrPageIn",L"WrPoolAllocation",L"WrDelayExecution",L"WrSuspended",L"WrUserRequest",L"WrEventPair",L"WrQueue",L"WrLpcReceive",L"WrLpcReply",L"WrVirtualMemory",L"WrPageOut",L"WrRendezvous",L"Spare2",L"Spare3",L"Spare4",L"Spare5", L"Spare6",L"WrKernel"}; //причины ожидания нити

while (current != NULL)

{

 if (type == 0) //поиск по идентификатору

 {

  if (current->ProcessId != (HANDLE) pid)

  {

   if(current->NextEntryOffset == 0) {

    current = NULL;

   } else {

    current = (PSYSTEM_PROCESS_INFORMATION)((LPBYTE)current + current->NextEntryOffset);

   }

   continue;

  }

 }

 if (type == 1)  //поиск по имени

 {

  if (current->Name.Buffer==NULL)

  {

   current = (PSYSTEM_PROCESS_INFORMATION)((LPBYTE)current + current->NextEntryOffset);

   continue;

  }

  

  strtolower(current->Name.Buffer);

  strtolower(procname);

  if (wcscmp(current->Name.Buffer,procname)!=0)

  {

   if(current->NextEntryOffset == 0) {

    current = NULL;

   } else {

    current = (PSYSTEM_PROCESS_INFORMATION)((LPBYTE)current + current->NextEntryOffset);

   }

   continue;

  }

 }

 findp = 1;

 //вывод информации

 printf("Id - %d\nНазвание - %S\n",current->ProcessId,current->Name.Buffer);

 printf("Количество нитей - %d\nПриоритет - %d\n",current->NumberOfThreads,current->BasePriority);

 printf("Наследован от процесса с Id - %d\nЧисло хэндлов - %d\n",current->InheritedFromProcessId,current->HandleCount);

 for (i = 0; I < (int)current->NumberOfThreads; i++)

 {

  printf ("Поток %d\n",i+1);

  printf ("\tId потока: %u\n",current->Threads[i].ClientId.UniqueThread);

  printf ("\tСостояние: %u\n",current->Threads[i].State);

  printf ("\tПричина ожидания: %u - %S\n",current->Threads[i].WaitReason,reasons[current->Threads[i].WaitReason]);

 }

 // получение имени пользователя, запустившего процесс

 hproc = (HANDLE)OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ,FALSE,(ULONG)current->ProcessId);

 

 if (hproc)

 {

  if (OpenProcessToken(hproc,TOKEN_QUERY,&hAccessToken))

  {

   if ( GetTokenInformation(hAccessToken,TokenUser,InfoBuffer, 1024, &actlen))

   {

   pTokenUser = (PTOKEN_USER)InfoBuffer;

   LookupAccountSid(NULL, pTokenUser->User.Sid, szAccountName, &dwAccountSize,

    szDomainName, &dwDomainSize, &snu);

   

   printf("Пользователь - %S:%S\n",szAccountName,szDomainName);

   }

  }

 }

 

 break;

}

if (!findp)

{

 printf("Процесс не найден\n");

}

return 1;

}

//уничтожение процесса

void terminate_process (int pid)

{

     HANDLE hTerm;

     hTerm = (HANDLE)OpenProcess(PROCESS_TERMINATE,FALSE,pid);

     if (hTerm==0)

     {

 printf ("Не могу получить хэндл процесса\n");

     }

     else

     {

 TerminateProcess(hTerm,0);

     }

}

//изменение приоритета

void change_priority (int pid,KPRIORITY priority)

{

HANDLE hproc;

 hproc = (HANDLE)OpenProcess(PROCESS_ALL_ACCESS,FALSE,pid);

if (hproc==0)

        printf ("Не могу получить хэндл процесса");

 else

       {

 if (SetProcInfo (hproc, ProcessBasePriority, &priority, sizeof(priority))!=0)

        printf ("Приоритет изменен\n");

       }

}

//разбор командной строки

int parse(int argc, wchar_t *argv[])

{

 wchar_t *a;

 int i;

 if (argc < 2)

 {

   help = 1;

   printf("Main menu\n");

   return 2;

 }

 //ps –a   - список процессов

 if ((argc == 2) && (wcscmp(argv[1],L"-a")==0) && (wcslen(argv[1])==2))

 {

   list = 1;

   return 1;

 }

   //psn   name – поиск по имени процесса

 if ((argc == 3) && (wcscmp(argv[1],L"-n")==0) && (wcslen(argv[1])==2))

 {

   process = 1;

   type = 1;

   procname = argv[2];

   return 1;

 }

   //psu   name – поиск по имени gjkmpjdftnkz

 if ((argc == 3) && (wcscmp(argv[1],L"-u")==0) && (wcslen(argv[1])==2))

 {

   list = 1;

   type = 2;

   username = argv[2];

   return 1;

 }

   //psi   id – поиск по идентификатору

 if ((argc == 3) && (wcscmp(argv[1],L"-i")==0) && (wcslen(argv[1])==2))

 {

   process = 1;

   type = 0;

   a = argv[2];

   for (i = 0; i < wcslen(argv[2]); i++)

   {

     pid = 10*pid + atoi(a++);

     printf("pid = %d\n",pid);

   }

         

   if (pid < 0 )

     return 0;

   return 1;

 }

// pst   id  уничтожение процесса  

if ((argc == 3) && (wcscmp(argv[1],L"-t")==0) && (wcslen(argv[1])==2))

 {

//    process = 1;

   type = 0;

   a = argv[2];

   for (i = 0; i < wcslen(argv[2]); i++)

   {

     pid = 10*pid + atoi(a++);

     printf("pid = %d\n",pid);

   }

         

   if (pid < 0 )

     return 0;

terminate_process(pid);

   return 1;

 }

//psp   id priority изменение приоритета

 if ((argc == 4) && (wcscmp(argv[1],L"-p")==0) && (wcslen(argv[1])==2))

 {

   type = 0;

   a = argv[2];

   for (i = 0; i < wcslen(argv[2]); i++)

   {

     pid = 10*pid + atoi(a++);

   }

   a = argv[3];

   for (i = 0; i < wcslen(argv[3]); i++)

   {

     priority = 10*priority + atoi(a++);

   }

   if (pid < 0 )

     return 0;

   if (priority < 0 )

     return 0;

change_priority(pid,priority);

   return 1;

 }

 return 0;

}

//меню

void menu()

{

 int operation = -1;

 PSYSTEM_PROCESS_INFORMATION pinfo;

 HANDLE hTerm;

 HANDLE hproc;

 help = 0;

 list = 0;

 process = 0;

 

 type = 0; //0-id, 1-name, 2-user

 pid = 0;

 terminate = 0;

procname = (wchar_t *)malloc(100);

username = (wchar_t *)malloc(100);

 while (1)

 {

help = 0;

list = 0;

process = 0;

username = L"\0";

procname = L"\0";

type = 0; //0-id, 1-name, 2-user

pid = 0;

terminate = 0;

   printf("Выберите тип операции:\n");

   printf("1. Получение списка процессов\n");

   printf("2. Поиск по имени процесса\n");

   printf("3. Поиск по ID процесса\n");

   printf("4. Прерывание по ID процесса\n");

   printf("5. Изменение приоритета по ID процесса\n");

   printf("6. Информация о памяти\n");

   printf("7. Выход\n");

   scanf("%d",&operation);

   if (operation == 1)

     list = 1;

   if (operation == 2)

   {

     process = 1;

     type = 1;

     printf("Введите имя процесса\n");

     scanf("%S",procname);

     

   }

   if (operation == 3)

   {

     process = 1;

     type = 0;

     printf("Введите ID процесса\n");

     scanf("%d",&pid);

   }

   if (operation == 4)

   {

     printf("Введите ID процесса\n");

     scanf("%d",&pid);

terminate_process(pid);

   }

   if (operation == 5)

   {

     printf("Введите ID процесса\n");

     scanf("%d",&pid);

     printf("Введите новый приоритет\n");

     scanf("%d",&priority);

change_priority ( pid, priority);

   }

   if (operation == 6)

   {

     print_mem_info();

   }

   if (operation == 7)

     break;

   pinfo = get_process_list();

   if (list)

     printlist(pinfo);

   if (process)

     printprocess(pinfo);

   getch();

  }

}

int wmain(int argc, wchar_t *argv[])

{

 PSYSTEM_PROCESS_INFORMATION pinfo;

 int cmd  = parse(argc, argv);

 if (!cmd)

 {

   printf("Invalid format\n");

   return 0;

 }

 if (cmd==2)

 {

 menu();

 }

 else

 {

   pinfo = get_process_list();

   if (list)

     printlist(pinfo);

   if (process)

     printprocess(pinfo);

 }

 return 0;

}


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

1. КоберниченкоА.В. Недокументированные возможности Windows NT. Нолидж - 1998

2. Prasad Dabak, Sandeep Phadke, Milind Borate. UNDOCUMENTED WINDOWS NT. M&T Books

3. Как получить список запущенных процессов? [Электронный ресурс]:- Режим доступа:   http://www.rsdn.ru/article/qna/baseserv/enumproc.xml –  Заглавие с экрана.

4. NtQuerySystemInformation Function (Windows) [Электронный ресурс]:- Режим доступа:  http://msdn.microsoft.com/en-us/library/ms724509(VS.85).aspx –  Заглавие с экрана.

5. NtSetSystemInformation [Электронный ресурс]: - Режим доступа:  http://undocumented.ntinternals.net/UserMode/Undocumented%20Functions/System%20Information/NtSetSystemInformation.html –  Заглавие с экрана.

6. SYSTEM_INFORMATION_CLASS – [Электронный ресурс]: -Режим доступ:  http://undocumented.ntinternals.net/UserMode/Undocumented%20Functions/System%20Information/SYSTEM_INFORMATION_CLASS.html –  Заглавие с экрана.




1. вскричала девушка я убила его
2. Мораль форма общественного сознания в которой находят свое отражение взгляды и представления нормы и о
3. среда обитанияrdquo;
4. Электроосвещение столярного цеха
5. реферат дисертації на здобуття наукового ступеня кандидата технічних наук Київ
6. 9043к П~н- Байланыс желілері ж~не коммутация ж~йелері 1 Телефон трактісімен берілген хабарды~ сапас
7. дата приоритета22 МПК51 Страна заявитель Ф
8. Право на пенсию по случаю потери кормильца имеют нетрудоспособные члены семьи умерших погибших лиц проход
9. Глазова по скалолазанию 14 ~ 15 декабря 2013 года ПРОТОКОЛ результат сложность группа М ~ 11
10. Использование интерактивной доски на уроках истории
11. .0 20041002 создание fb2 irmin1
12. Перепишите текст проанализировав его с логической стороны Сейчас наша политика ~ даже теоретически ~ н
13. РАБОЧерноземье.html
14. реферат дисертації на здобуття наукового ступеня кандидата наук з фізичного виховання і спорту
15. реферату- Аналіз показників ліквідності підприємстваРозділ- Економіка підприємства Аналіз показників лік
16. история государственного управления Формирование основ государственного управления Древнерусско
17. Разработка печатного узла
18. Лекция 03 Операционные системы
19. Социальная природа агрессии
20. Образовательный кредит целевой кредит для оплаты обучения в вузах России и Италии 1 июля 2013 года Моск