windows程序员进阶系列:《软件调试》之五:Windows操作系统概要
操作系统是计算机系统中的基本软件。它负责管理系统中的软硬件资源。通常都包括文件管理、内存管理、进程管理、打印管理、 络管理等基本功能。除此之外,支持调试也是操作系统设计的一项根本任务。
从被调试对象的角度来看,可以把操作系统的调试支持分为以下三个方面:
一:对应用程序的调试。即如何简单高效的调试运行在系统中的应用程序。
二:对设备驱动程序的调试。
三:对操作系统自身调试的支持。
Windows是个典型的多任务操作系统,它允许有多个进程在系统中同时运行。
进程是资源分配和保护的基本单位。每个进程都有自己的虚拟地址空间。这保证了每个进程相互隔离互不干扰。
除了地址空间之外每个进程还包括:
一:一个全局唯一的进程ID 。
二:一个可执行映像(可执行文件)。
三:一个或多个线程。
四:一个位于内核空间中的名为_EPROCESS数据结构。用以记录该进程的关键信息,包括进程创建时间、映像文件名称等。
五:一个位于内核空间的句柄表。用以记录和索引该进程所创建的或打开的内核对象。句柄只是句柄表的索引,操作系统根据句柄表来得到指向内核对象的指针。
六:一个用于描述内存页目录表起始位置的基地址。简称页目录基地址。当cpu切换任务时会将该地址加载到CR3寄存器中。
七:一个位于用户空间中的环境块(Process Environment block)PEB。
八:一个访问权限令牌。用以表示该进程的用户 、安全组以及优先级别。
为了更好的理解以上列出的每个项目。我们可以结合Windbg使用dt命令来观察_EPROCESS的每个字段。
在windbg中可以输入命令:dt _EPROCESS。该命令会显示_EPROCESS结构的各个字段。如果你通过其他方法,如!process 0 0 可得到了某个进程的_ERPCESS结构的地址,你可以为上面的命令加上_EPROCESS结构地址。如输入dt _EPROCESS EPROCESS结构地址。该命令会在显示_EPROCESS结构的同时,显示该地址处各个字段的取值。
以下为_EPROCESS结构:
-
typedef struct _EPROCESS {
- KPROCESS Pcb;
- NTSTATUS ExitStatus;
- KEVENT LockEvent;
- ULONG LockCount;
- LARGE_INTEGER CreateTime;
- LARGE_INTEGER ExitTime;
- PKTHREAD LockOwner;
- HANDLE UniqueProcessId;
- LIST_ENTRY ActiveProcessLinks;
- SIZE_T QuotaPeakPoolUsage[2];
- SIZE_T QuotaPoolUsage[2];
- SIZE_T PagefileUsage;
- SIZE_T CommitCharge;
- SIZE_T PeakPagefileUsage;
- SIZE_T PeakVirtualSize;
- SIZE_T VirtualSize;
- MMSUPPORT Vm;
- LIST_ENTRY SessionProcessLinks;
- PVOID DebugPort;
- PVOID ExceptionPort;
- PHANDLE_TABLE ObjectTable;
- PACCESS_TOKEN Token;
-
- FAST_MUTEX WorkingSetLock;
- PFN_NUMBER WorkingSetPage;
- BOOLEAN ProcessOutswapEnabled;
- BOOLEAN ProcessOutswapped;
- UCHAR AddressSpaceInitialized;
- BOOLEAN AddressSpaceDeleted;
- FAST_MUTEX AddressCreationLock;
- KSPIN_LOCK HyperSpaceLock;
- struct _ETHREAD *ForkInProgress;
- USHORT VmOperation;
- UCHAR ForkWasSuccessful;
- UCHAR MmAgressiveWsTrimMask;
- PKEVENT VmOperationEvent;
- PVOID PaeTop;
- ULONG LastFaultCount;
- ULONG ModifiedPageCount;
- PVOID VadRoot;
- PVOID VadHint;
- PVOID CloneRoot;
- PFN_NUMBER NumberOfPrivatePages;
- PFN_NUMBER NumberOfLockedPages;
- USHORT NextPageColor;
- BOOLEAN ExitProcessCalled;
- BOOLEAN CreateProcessReported;
- HANDLE SectionHandle;
- PPEB Peb;
- PVOID SectionBaseAddress;
- PEPROCESS_QUOTA_BLOCK QuotaBlock;
- NTSTATUS LastThreadExitStatus;
- PPAGEFAULT_HISTORY WorkingSetWatch;
- HANDLE Win32WindowStation;
- HANDLE InheritedFromUniqueProcessId;
- ACCESS_MASK GrantedAccess;
- ULONG DefaultHardErrorProcessing;
- PVOID LdtInformation;
- PVOID VadFreeHint;
- PVOID VdmObjects;
- PVOID DeviceMap;
- ULONG SessionId;
- LIST_ENTRY PhysicalVadList;
- union {
- HARDWARE_PTE PageDirectoryPte;
- ULONGLONG Filler;
- };
- ULONG PaePageDirectoryPage;
- UCHAR ImageFileName[ 16 ];
- ULONG VmTrimFaultValue;
- BOOLEAN SetTimerResolution;
- UCHAR PriorityClass;
- union {
- struct {
- UCHAR SubSystemMinorVersion;
- UCHAR SubSystemMajorVersion;
- };
- USHORT SubSystemVersion;
- };
- PVOID Win32Process;
- struct _EJOB *Job;
- ULONG JobStatus;
- LIST_ENTRY JobLinks;
- PVOID LockedPagesList;
- PVOID SecurityPort ;
- PWOW64_PROCESS Wow64Process;
- LARGE_INTEGER ReadOperationCount;
- LARGE_INTEGER WriteOperationCount;
- LARGE_INTEGER OtherOperationCount;
- LARGE_INTEGER ReadTransferCount;
- LARGE_INTEGER WriteTransferCount;
- LARGE_INTEGER
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!