Enterprise Just Builder

Solution for Enterprise Software Architecture

未分类

Windows Process 内存组织结构及重要字段解析

Windows 操作系统中的进程,实际上是用位于内核管理层(Executive)的 _EPROCESS 进程块来表示的。_EPROCESS 中不仅包含了进程相关的一些重要的数据结构,同时还包含了进程的环境变量等等东西。_EPROCESS 块的大部分数据存储在操作系统的内核空间,不过进程环境块 PEB 则是位于用户空间。这是因为 PEB 包含了一些用户可能频繁修改的数据,放在内核空间中会导致频繁的模式切换,也不利于安全。

图1-1 源自《Windows Internal》第六章里,它显示了一个完整进程的不同部分,这些部分被分别存放在系统地址空间和进程地址空间之中,以适应不同的操作模式的需要。

在内核调试模式下,我们可以用 Windbg 的 dt 命令列出 _EPROCESS 的结构:(例子基于 Windows 10 Build 10240)

WINDBG>dt nt!_eprocess
   +0x000 Pcb              : _KPROCESS
   +0x2d8 ProcessLock      : _EX_PUSH_LOCK
   +0x2e0 RundownProtect   : _EX_RUNDOWN_REF
   +0x2e8 UniqueProcessId  : Ptr64 Void
   +0x2f0 ActiveProcessLinks : _LIST_ENTRY
   +0x300 Flags2           : Uint4B
   +0x300 JobNotReallyActive : Pos 0, 1 Bit
   +0x300 AccountingFolded : Pos 1, 1 Bit
   +0x300 NewProcessReported : Pos 2, 1 Bit
   +0x300 ExitProcessReported : Pos 3, 1 Bit
   +0x300 ReportCommitChanges : Pos 4, 1 Bit
   +0x300 LastReportMemory : Pos 5, 1 Bit
   +0x300 ForceWakeCharge  : Pos 6, 1 Bit
   +0x300 CrossSessionCreate : Pos 7, 1 Bit
   +0x300 NeedsHandleRundown : Pos 8, 1 Bit
   +0x300 RefTraceEnabled  : Pos 9, 1 Bit
   +0x300 DisableDynamicCode : Pos 10, 1 Bit
   +0x300 EmptyJobEvaluated : Pos 11, 1 Bit
   +0x300 DefaultPagePriority : Pos 12, 3 Bits
   +0x300 PrimaryTokenFrozen : Pos 15, 1 Bit
   +0x300 ProcessVerifierTarget : Pos 16, 1 Bit
   +0x300 StackRandomizationDisabled : Pos 17, 1 Bit
   +0x300 AffinityPermanent : Pos 18, 1 Bit
   +0x300 AffinityUpdateEnable : Pos 19, 1 Bit
   +0x300 PropagateNode    : Pos 20, 1 Bit
   +0x300 ExplicitAffinity : Pos 21, 1 Bit
   +0x300 ProcessExecutionState : Pos 22, 2 Bits
   +0x300 DisallowStrippedImages : Pos 24, 1 Bit
   +0x300 HighEntropyASLREnabled : Pos 25, 1 Bit
   +0x300 ExtensionPointDisable : Pos 26, 1 Bit
   +0x300 ForceRelocateImages : Pos 27, 1 Bit
   +0x300 ProcessStateChangeRequest : Pos 28, 2 Bits
   +0x300 ProcessStateChangeInProgress : Pos 30, 1 Bit
   +0x300 DisallowWin32kSystemCalls : Pos 31, 1 Bit
   +0x304 Flags            : Uint4B
   +0x304 CreateReported   : Pos 0, 1 Bit
   +0x304 NoDebugInherit   : Pos 1, 1 Bit
   +0x304 ProcessExiting   : Pos 2, 1 Bit
   +0x304 ProcessDelete    : Pos 3, 1 Bit
   +0x304 ControlFlowGuardEnabled : Pos 4, 1 Bit
   +0x304 VmDeleted        : Pos 5, 1 Bit
   +0x304 OutswapEnabled   : Pos 6, 1 Bit
   +0x304 Outswapped       : Pos 7, 1 Bit
   +0x304 FailFastOnCommitFail : Pos 8, 1 Bit
   +0x304 Wow64VaSpace4Gb  : Pos 9, 1 Bit
   +0x304 AddressSpaceInitialized : Pos 10, 2 Bits
   +0x304 SetTimerResolution : Pos 12, 1 Bit
   +0x304 BreakOnTermination : Pos 13, 1 Bit
   +0x304 DeprioritizeViews : Pos 14, 1 Bit
   +0x304 WriteWatch       : Pos 15, 1 Bit
   +0x304 ProcessInSession : Pos 16, 1 Bit
   +0x304 OverrideAddressSpace : Pos 17, 1 Bit
   +0x304 HasAddressSpace  : Pos 18, 1 Bit
   +0x304 LaunchPrefetched : Pos 19, 1 Bit
   +0x304 Background       : Pos 20, 1 Bit
   +0x304 VmTopDown        : Pos 21, 1 Bit
   +0x304 ImageNotifyDone  : Pos 22, 1 Bit
   +0x304 PdeUpdateNeeded  : Pos 23, 1 Bit
   +0x304 VdmAllowed       : Pos 24, 1 Bit
   +0x304 ProcessRundown   : Pos 25, 1 Bit
   +0x304 ProcessInserted  : Pos 26, 1 Bit
   +0x304 DefaultIoPriority : Pos 27, 3 Bits
   +0x304 ProcessSelfDelete : Pos 30, 1 Bit
   +0x304 SetTimerResolutionLink : Pos 31, 1 Bit
   +0x308 CreateTime       : _LARGE_INTEGER
   +0x310 ProcessQuotaUsage : [2] Uint8B
   +0x320 ProcessQuotaPeak : [2] Uint8B
   +0x330 PeakVirtualSize  : Uint8B
   +0x338 VirtualSize      : Uint8B
   +0x340 SessionProcessLinks : _LIST_ENTRY
   +0x350 ExceptionPortData : Ptr64 Void
   +0x350 ExceptionPortValue : Uint8B
   +0x350 ExceptionPortState : Pos 0, 3 Bits
   +0x358 Token            : _EX_FAST_REF
   +0x360 WorkingSetPage   : Uint8B
   +0x368 AddressCreationLock : _EX_PUSH_LOCK
   +0x370 PageTableCommitmentLock : _EX_PUSH_LOCK
   +0x378 RotateInProgress : Ptr64 _ETHREAD
   +0x380 ForkInProgress   : Ptr64 _ETHREAD
   +0x388 CommitChargeJob  : Ptr64 _EJOB
   +0x390 CloneRoot        : _RTL_AVL_TREE
   +0x398 NumberOfPrivatePages : Uint8B
   +0x3a0 NumberOfLockedPages : Uint8B
   +0x3a8 Win32Process     : Ptr64 Void
   +0x3b0 Job              : Ptr64 _EJOB
   +0x3b8 SectionObject    : Ptr64 Void
   +0x3c0 SectionBaseAddress : Ptr64 Void
   +0x3c8 Cookie           : Uint4B
   +0x3d0 WorkingSetWatch  : Ptr64 _PAGEFAULT_HISTORY
   +0x3d8 Win32WindowStation : Ptr64 Void
   +0x3e0 InheritedFromUniqueProcessId : Ptr64 Void
   +0x3e8 LdtInformation   : Ptr64 Void
   +0x3f0 OwnerProcessId   : Uint8B
   +0x3f8 Peb              : Ptr64 _PEB
   +0x400 Session          : Ptr64 Void
   +0x408 AweInfo          : Ptr64 Void
   +0x410 QuotaBlock       : Ptr64 _EPROCESS_QUOTA_BLOCK
   +0x418 ObjectTable      : Ptr64 _HANDLE_TABLE
   +0x420 DebugPort        : Ptr64 Void
   +0x428 Wow64Process     : Ptr64 Void
   +0x430 DeviceMap        : Ptr64 Void
   +0x438 EtwDataSource    : Ptr64 Void
   +0x440 PageDirectoryPte : Uint8B
   +0x448 ImageFileName    : [15] UChar
   +0x457 PriorityClass    : UChar
   +0x458 SecurityPort     : Ptr64 Void
   +0x460 SeAuditProcessCreationInfo : _SE_AUDIT_PROCESS_CREATION_INFO
   +0x468 JobLinks         : _LIST_ENTRY
   +0x478 HighestUserAddress : Ptr64 Void
   +0x480 ThreadListHead   : _LIST_ENTRY
   +0x490 ActiveThreads    : Uint4B
   +0x494 ImagePathHash    : Uint4B
   +0x498 DefaultHardErrorProcessing : Uint4B
   +0x49c LastThreadExitStatus : Int4B
   +0x4a0 PrefetchTrace    : _EX_FAST_REF
   +0x4a8 LockedPagesList  : Ptr64 Void
   +0x4b0 ReadOperationCount : _LARGE_INTEGER
   +0x4b8 WriteOperationCount : _LARGE_INTEGER
   +0x4c0 OtherOperationCount : _LARGE_INTEGER
   +0x4c8 ReadTransferCount : _LARGE_INTEGER
   +0x4d0 WriteTransferCount : _LARGE_INTEGER
   +0x4d8 OtherTransferCount : _LARGE_INTEGER
   +0x4e0 CommitChargeLimit : Uint8B
   +0x4e8 CommitCharge     : Uint8B
   +0x4f0 CommitChargePeak : Uint8B
   +0x4f8 Vm               : _MMSUPPORT
   +0x5f0 MmProcessLinks   : _LIST_ENTRY
   +0x600 ModifiedPageCount : Uint4B
   +0x604 ExitStatus       : Int4B
   +0x608 VadRoot          : _RTL_AVL_TREE
   +0x610 VadHint          : Ptr64 Void
   +0x618 VadCount         : Uint8B
   +0x620 VadPhysicalPages : Uint8B
   +0x628 VadPhysicalPagesLimit : Uint8B
   +0x630 AlpcContext      : _ALPC_PROCESS_CONTEXT
   +0x650 TimerResolutionLink : _LIST_ENTRY
   +0x660 TimerResolutionStackRecord : Ptr64 _PO_DIAG_STACK_RECORD
   +0x668 RequestedTimerResolution : Uint4B
   +0x66c SmallestTimerResolution : Uint4B
   +0x670 ExitTime         : _LARGE_INTEGER
   +0x678 InvertedFunctionTable : Ptr64 _INVERTED_FUNCTION_TABLE
   +0x680 InvertedFunctionTableLock : _EX_PUSH_LOCK
   +0x688 ActiveThreadsHighWatermark : Uint4B
   +0x68c LargePrivateVadCount : Uint4B
   +0x690 ThreadListLock   : _EX_PUSH_LOCK
   +0x698 WnfContext       : Ptr64 Void
   +0x6a0 Spare0           : Uint8B
   +0x6a8 SignatureLevel   : UChar
   +0x6a9 SectionSignatureLevel : UChar
   +0x6aa Protection       : _PS_PROTECTION
   +0x6ab HangCount        : UChar
   +0x6ac Flags3           : Uint4B
   +0x6ac Minimal          : Pos 0, 1 Bit
   +0x6ac ReplacingPageRoot : Pos 1, 1 Bit
   +0x6ac DisableNonSystemFonts : Pos 2, 1 Bit
   +0x6ac AuditNonSystemFontLoading : Pos 3, 1 Bit
   +0x6ac Crashed          : Pos 4, 1 Bit
   +0x6ac JobVadsAreTracked : Pos 5, 1 Bit
   +0x6ac VadTrackingDisabled : Pos 6, 1 Bit
   +0x6ac AuxiliaryProcess : Pos 7, 1 Bit
   +0x6ac SubsystemProcess : Pos 8, 1 Bit
   +0x6ac IndirectCpuSets  : Pos 9, 1 Bit
   +0x6ac InPrivate        : Pos 10, 1 Bit
   +0x6b0 DeviceAsid       : Int4B
   +0x6b8 SvmData          : Ptr64 Void
   +0x6c0 SvmProcessLock   : _EX_PUSH_LOCK
   +0x6c8 SvmLock          : Uint8B
   +0x6d0 SvmProcessDeviceListHead : _LIST_ENTRY
   +0x6e0 LastFreezeInterruptTime : Uint8B
   +0x6e8 DiskCounters     : Ptr64 _PROCESS_DISK_COUNTERS
   +0x6f0 PicoContext      : Ptr64 Void
   +0x6f8 TrustletIdentity : Uint8B
   +0x700 KeepAliveCounter : Uint4B
   +0x704 NoWakeKeepAliveCounter : Uint4B
   +0x708 HighPriorityFaultsAllowed : Uint4B
   +0x710 EnergyValues     : Ptr64 _PROCESS_ENERGY_VALUES
   +0x718 VmContext        : Ptr64 Void
   +0x720 Silo             : Ptr64 _ESILO
   +0x728 SiloEntry        : _LIST_ENTRY
   +0x738 SequenceNumber   : Uint8B
   +0x740 CreateInterruptTime : Uint8B
   +0x748 CreateUnbiasedInterruptTime : Uint8B
   +0x750 TotalUnbiasedFrozenTime : Uint8B
   +0x758 LastAppStateUpdateTime : Uint8B
   +0x760 LastAppStateUptime : Pos 0, 61 Bits
   +0x760 LastAppState     : Pos 61, 3 Bits
   +0x768 SharedCommitCharge : Uint8B
   +0x770 SharedCommitLock : _EX_PUSH_LOCK
   +0x778 SharedCommitLinks : _LIST_ENTRY
   +0x788 AllowedCpuSets   : Uint8B
   +0x790 DefaultCpuSets   : Uint8B
   +0x788 AllowedCpuSetsIndirect : Ptr64 Uint8B
   +0x790 DefaultCpuSetsIndirect : Ptr64 Uint8B

也可以用 dt nt!_eprocess –r1 命令来展开成为下一级的结构体的定义。

 

Windows 调试集锦 <1>

调试 WinLogon1
WinLogon 是一个用户模式进程,负责处理用户登入登出的交互任务,以及处理 CTRL+ALT+DELTE。要调试 Winlogon 最简单的办法是使用 NTSD 然后通过内核调试器来控制并调试。

首先要解决的是如何将用户态调试器 NTSD 的输出重定向到内核调试器,为此需先配置内核调试连接。详细可以参考[2. Controlling the User-Mode Debugger from the Kernel Debugger[

其次需要修改注册表,这样 Winlogon 进程一开始启动就可被调试。注册表键值如下:

[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\WinLogon.EXE]
"Debugger"="ntsd -d -x -g"

The -d option passes control to the kernel debugger. The -x option causes the debugger to capture access violations as second-chance exceptions. The -g option causes the WinLogon process to run after the attachment. Do not add the -g if you want to start debugging before Winlogon.exe begins (for example, if you want to set an initial breakpoint).

In addition, you should set the GlobalFlag value under the winlogon.exe key to REG_DWORD “0x000400F0”. This sets heap checking and FLG_ENABLE_KDEBUG_SYMBOL_LOAD. However, since this second flag only affects the kernel debugger, symbols must also be copied to the target computer before starting the debugger.

>>> 阅读全文

 

Linux环境下的图形系统和AMD R600显卡编程(6)——AMD显卡GPU命令格式

前面一篇blog里面描述了命令环缓冲区机制,在命令环机制下,驱动写入PM4(不知道为何会取这样一个名字)包格式的命令对显卡进行配置。这一篇blog将详细介绍命令包的格式。

  当前定义了4中命令包,分别是0型/1型/2型和3型命令包,命令包由两部分组成,第一部分是命令包头,第二部分是命令包主体,命令包头为请求GPU执行的具体操作,命令主体为执行该操作需要的数据。

•0型命令包

  0型命令包用于写连续N个寄存器。包主体部分是依次往这些寄存器写的值。包头各个部分的意义为:

 Linux内核代码./drivers/gpu/drm/radeon/r600.c r600\_fence\_ring\_emit函数有如下语句:

>>> 阅读全文

 

⚡Presentation ‘Windows Display Driver Model (WDDM) v2 And Beyond Steve Pronovost, Microsoft Henry Moreton, NVIDIA Tim Kelley, ATI.’

Windows Display Driver Model (WDDM) v2 And Beyond Steve Pronovost, Microsoft Henry Moreton, NVIDIA Tim Kelley, ATI.

来源: ⚡Presentation ‘Windows Display Driver Model (WDDM) v2 And Beyond Steve Pronovost, Microsoft Henry Moreton, NVIDIA Tim Kelley, ATI.’

 

ELF 对线程局部储存的处理 (一)

线程使用的增加使得开发者期望有更好的方式来处理线程局部数据 (read-local data)。 POSIX 线程接口的有关定义允许在每个线程中独立存储 void * 对象。不过使用该接口很麻烦。你需要在运行时为对象分配一个键(key),如果这个键不再使用就需要释放它。这项工作繁琐而且易出错。如果和动态加载代码(dynamically loaded code)一起使用,就真的成了个大麻烦。

应对这些问题的方法是扩展编程语言,让编译器接手这些工作。以 C/C++ 来说,可以在定义与声明变量时使用新关键字 __thread。这虽然不是个官方扩展,编译器开发者被鼓励实现它以支持新 ABI。用这个关键字定义及声明的变量会自动地局部分配到每个线程。

__thread int i;
__thread struct states;
extern __thread char *p;

不仅一般用户程序可以受益,运行时环境(runtime)亦能从中获得好处 (如全局变量 errno 必须是线程局部的),而且编译器可以执行构建非自动变量( non-autimatic variable)的优化。注意:用 __thread 来定义自动变量毫无意义也不被允许,这是因为自动变量总是线程局部的。而且,函数作用域中的静态变量应是首选。

 

, ,

Android程序设计 (十) 调试

 

Android程序设计 (八)多线程UI

 

Android程序设计 (五) Activity详解

 

MongoDB 开发手册 (三) 数据库

每个MongoDB服务器可以支持多个数据库,这些数据库彼此独立,为了安全和便于管理,每个数据库的数据是分开存储的。每个数据库包含三个单元:

  • 一个或多个集合
  • 这些集合里的文档(对象)
  • 可选的控制存取的安全验证
  • 常见用于操作数据库的命令如下:

    复制数据库
    作用:在服务器之间拷贝数据库。
    用法:
    如果是使用mongo shell ,那么在目的服务器上执行:

    db.copyDatabase(<from_dbname>, <to_dbname>, <from_hostname>);

    如果需要验证

    db.copyDatabase(<from_dbname>, <to_dbname>, <from_hostname>, <username>, <password>);

    如果是使用驱动程序,那么执行:

    >>> 阅读全文

     

    参考

    http://tech.it168.com/a2010/0506/882/000000882716.shtml
    http://database.51cto.com/art/201008/217153.htm
    http://tech.csai.cn/dbms/200604200915271801.htm
    http://tech.it168.com/a2009/1102/801/000000801528.shtml
    http://hi.baidu.com/sose2010/blog/item/e2e439629ec2dc48eaf8f8a4.html
    http://www.hudong.com/wiki/%E6%96%87%E6%A1%A3%E6%95%B0%E6%8D%AE%E5%BA%93
    http://www.west263.com/info/html/chengxusheji/VB/20080224/26197.html
    http://www.programmer.com.cn/4199/
    http://www.po-soft.com/hi/yongtree/blog/1897
    http://blog.chinaunix.net/u/26524/showart_2161608.html
    http://tech.ccidnet.com/art/1105/20100806/2145713_1.html
    http://www.162cm.com/p/tokyotyrant.html
    http://www.stulog.com/?post=70
    http://www.ltesting.net/html/81/n-162281.html
    http://tech.ddvip.com/2010-06/1277518992156287.html
    http://www.lslnet.com/linux/docs/1/linux-14353.htm
    http://database.51cto.com/art/201008/217153.htm