| 注册
home doc ppt pdf
请输入搜索内容

热门搜索

年终总结个人简历事迹材料租赁合同演讲稿项目管理职场社交

$windows内核情景分析学习笔记

奋斗不止500年

贡献于2021-07-11

字数:36394

windows核情景分析学笔记6
分类: windows MFC20101019 1137226阅读评(0)收藏举报
1数存储存区间分类
①全局数占空间编译器编译链接时静态分配整进程存亡分配释放见
②局部数占空间调函数时动堆栈动态分配寿命取决函数作域分配释放隐含
③通malloc类函数动态分配存会直存直通free类函数加释放(进程终止运行)
2核户空间理
windows说户空间虚存址00x7fffffff范围2GB进程2GB户空间
般说真正中部分虚存址区间需物理映射
事实前正受访问页面必须映射物理存页面暂时受访问页面映射外设(硬盘)页面交换文件里实际时倒换回物理存页面中

原理说空间中已分配区间作节点然组成链表需时头扫描链表知道区间(实际应中组成成AVL树)

进程进程控制块中指针VadRoot指代表着户空间数结构中指针指颗AVL树颗树节点已分配区间信息节点定义:
[cpp]view plaincopyprint
1 typedef struct _MEMORY_AREA
2 {
3 PVOID StartingAddress
4 PVOID EndingAddress
5 struct _MEMORY_AREA *Parent
6 struct _MEMORY_AREA *LeftChild
7 struct _MEMORY_AREA *RightChild
8 ULONG Type
9 ULONG Protect
10 ULONG Flags
11 BOOLEAN DeleteInProgress
12 ULONG PageOpCount
13 union
14 {
15 struct
16 {
17 ROS_SECTION_OBJECT* Section
18 ULONG ViewOffset
19 PMM_SECTION_SEGMENT Segment
20 BOOLEAN WriteCopyView
21 LIST_ENTRY RegionListHead
22 } SectionData
23 struct
24 {
25 LIST_ENTRY RegionListHead
26 } VirtualMemoryData
27 } Data
28 } MEMORY_AREA *PMEMORY_AREA


颗MEMORY_AREA数结构节点AVL树代表户空间

结构图:

3核户空间理相关函数
AVL树操作应便接踵典型莫MmLocateMemoryAreaByAddress()
[cpp]view plaincopyprint
29 PMEMORY_AREA NTAPI
30 MmLocateMemoryAreaByAddress(
31 PMMSUPPORT AddressSpace
32 PVOID Address)
33 {
34 PMEMORY_AREA Node (PMEMORY_AREA)AddressSpace>WorkingSetExpansionLinksFlink
35
36 DPRINT(MmLocateMemoryAreaByAddress(AddressSpace p Address p)n
37 AddressSpace Address)
38
39 MmVerifyMemoryAreas(AddressSpace)
40
41 while (Node NULL)
42 {
43 if (Address < Node>StartingAddress)
44 Node Node>LeftChild
45 else if (Address > Node>EndingAddress)
46 Node Node>RightChild
47 else
48 {
49 DPRINT(MmLocateMemoryAreaByAddress(p) p [p p]n
50 Address Node Node>StartingAddress Node>EndingAddress)
51 return Node
52 }
53 }
54
55 DPRINT(MmLocateMemoryAreaByAddress(p) 0n Address)
56 return NULL
57 }


函数作定目标址果目标址(存AVL树中)返回节点否返回NULL
典型操作MmFindGap()函数作址空间中寻找定长度空闲址区间
需空间中分配址区间时通MmCreateMemoryArea()AVL树种创建节点函数致执行步骤:
①AVL树中搜索块指定区域(利MmFindGap)
②区域建立MEMORY_AREA结构
③AVL树种插入MEMORY_AREA结构
里虚存区间分配意味着物理页面分配意味着页面映射建立仅仅虚存址资源占
4存理中层次
MEMORY_AREA结构中成分Data枚举类型结构取两种类型SectionDataVirtualMemoryData前者代表文件映射区享存区者代表普通已分配存区间(部分情况)
VirtualMemoryData唯成分RegionListHead值区块链表头
谓区块?
已分配区间指示址连续范围定映射定拥样类型保护模式区块址连续拥相类型保护模式子区间
中区间包含干区块需链表维护链表节点类型_MM_REGION
定义:
[cpp]view plaincopyprint
58 typedef struct _MM_REGION
59 {
60 ULONG Type
61 ULONG Protect
62 ULONG Length
63 LIST_ENTRY RegionListEntry
64 } MM_REGION *PMM_REGION


区块组虚存页面组成页面着相保护模式
综述存中着样层次:空间区间区块页面示意图:

windows核情景分析学笔记7
分类: windows MFC20101019 1934301阅读评(0)收藏举报
1核物理页面理
物理存理页面单位物理存理实际物理页面理
核中物理页面数结构PHYSICAL_PAGE代表定义:
[cpp]view plaincopyprint
1 typedef struct _PHYSICAL_PAGE
2 {
3 union
4 {
5 struct
6 {
7 ULONG Type 2
8 ULONG Consumer 3
9 ULONG Zero 1
10 }
11 Flags
12 ULONG AllFlags
13 }
14
15 LIST_ENTRY ListEntry
16 ULONG ReferenceCount
17 SWAPENTRY SavedSwapEntry
18 ULONG LockCount
19 ULONG MapCount
20 struct _MM_RMAP_ENTRY* RmapListHead
21 }
22 PHYSICAL_PAGE *PPHYSICAL_PAGE


PHYSICAL_PAGE代表物理页面系统初始化时会构建起元素PHYSICAL_PAGE数组MmPageArray全局变量系统中少物理页面数组
样物理页面页面号(pfn)标找物理页面应PHYSICAL_PAGE(MmPageArray[pfn])
物理址页面页面号着固定关系页面4KB定义
[cpp]view plaincopyprint
23 #define PaToPfn(p) ((p)>>12)


PHYSICAL_PAGE中Type字段标示物理页面性质:
[cpp]view plaincopyprint
24 #define MM_PHYSICAL_PAGE_FREE (0x1)
25 #define MM_PHYSICAL_PAGE_USED (0x2)
26 #define MM_PHYSICAL_PAGE_BIOS (0x3)


显然物理页面三种空闲页面中页面BIOS页面
ListEntry字段PHYSICAL_PAGE链入某队列核中定义物理页面队列:
[cpp]view plaincopyprint
27 static LIST_ENTRY UsedPageListHeads[MC_MAXIMUM]
28 static LIST_ENTRY FreeZeroedPageListHead
29 static LIST_ENTRY FreeUnzeroedPageListHead
30 static LIST_ENTRY BiosPageListHead


①物理址0x100000低1MB范围中页面BIOSBiosPageListHead队列中
空闲队列两:
②FreeZeroedPageListHead已清零页面
③FreeUnzeroedPageListHead未清零页面刚释放物理页面时未清0处理
核线程MmZeroPageThreadMain受调度运行会FreeUnzeroedPageListHead队列中摘取物理页面清零挂入FreeZeroedPageListHead队列
④中页面队列UsedPageListHeads队列数组MC_MAXIMUM定义4实物理页面途分4队列
四途定义:
[cpp]view plaincopyprint
31 #define MC_CACHE (0) 磁盘容缓存
32 #define MC_USER (1) 户空间映射
33 #define MC_PPOOL (2) 标示倒换外存页面池
34 #define MC_NPPOOL (3) 标示倒换外存页面池


典型物理页面周转程:
①FreeZeroedPageListHead队列开始
②分配某户空间虚存页面映射该物理页面进入UsedPageListHeads[MC_USER]队列
③释放该物理页面进入FreeUnzeroedPageListHead队列
④核线程MmZeroPageThreadMain受调度运行该页面回FreeZeroedPageListHead队列
2常函数
物理页面分配MmAllocPage()函数函数实现:
[cpp]view plaincopyprint
35 PFN_TYPE
36 NTAPI
37 MmAllocPage(ULONG Consumer SWAPENTRY SavedSwapEntry)
38 {
39 PFN_TYPE PfnOffset
40 PLIST_ENTRY ListEntry
41 PPHYSICAL_PAGE PageDescriptor
42 KIRQL oldIrql
43 BOOLEAN NeedClear FALSE
44
45 KeAcquireSpinLock(&PageListLock &oldIrql)旋转锁操作原子操作
46 if (IsListEmpty(&FreeZeroedPageListHead))
47 {
48 FreeZeroedPageListHead中没页面FreeUnzeroedPageListHead中分配
49 if (IsListEmpty(&FreeUnzeroedPageListHead))
50 {
51 果两队列没页面返回空法分配
52 KeReleaseSpinLock(&PageListLock oldIrql)
53 return 0
54 }
55 ListEntry RemoveTailList(&FreeUnzeroedPageListHead)
56 UnzeroedPageCount
57
58 PageDescriptor CONTAINING_RECORD(ListEntry PHYSICAL_PAGE ListEntry)
59
60 NeedClear TRUE 需重新初始化0
61 }
62 else
63 {
64 优先选择FreeZeroedPageListHead队列中页面
65 ListEntry RemoveTailList(&FreeZeroedPageListHead)
66
67 PageDescriptor CONTAINING_RECORD(ListEntry PHYSICAL_PAGE ListEntry)
68 }
69
70 错误处理
71 if (PageDescriptor>FlagsType MM_PHYSICAL_PAGE_FREE)
72 {
73 KEBUGCHECK(0)
74 }
75 if (PageDescriptor>MapCount 0)
76 {
77 KEBUGCHECK(0)
78 }
79 if (PageDescriptor>ReferenceCount 0)
80 {
81 KEBUGCHECK(0)
82 }
83
84 分配成功初始化PPHYSICAL_PAGE参数
85 PageDescriptor>FlagsType MM_PHYSICAL_PAGE_USED
86 PageDescriptor>FlagsConsumer Consumer
87 PageDescriptor>ReferenceCount 1
88 PageDescriptor>LockCount 0
89 PageDescriptor>MapCount 0
90 PageDescriptor>SavedSwapEntry SavedSwapEntry
91 InsertTailList(&UsedPageListHeads[Consumer] ListEntry)
92
93 MmStatsNrSystemPages++
94 MmStatsNrFreePages
95
96 KeReleaseSpinLock(&PageListLock oldIrql)释放旋转锁原子操作结束
97
98 PfnOffset PageDescriptor MmPageArray
99 if (NeedClear)
100 {
101 FreeUnzeroedPageListHead队列中分配物理页面需初始化0
102 MiZeroPage(PfnOffset)
103 }
104 if (PageDescriptor>MapCount 0)
105 {
106 KEBUGCHECK(0)
107 }
108 return PfnOffset
109 }


参数Consumer表明页面途决定分配成功物理页面挂入队列SavedSwapEntry标示页面交换文件位置取0标示没倒换文件

windows核情景分析学笔记8
分类: windows MFC20101020 1108404阅读评(0)收藏举报
1页面映射
页面映射指虚存页面物理页面映射
虚存页面映射物理页面时间物理页面应空间虚存页面
示意图:
虚存页面虚必须通映射落实物理存储介质物理存储第选择物理存备般选择磁盘页面交换文件(物理存成较高般会做)样需前正受访问受访问页面保存物理存中暂时受访问页面保存页面交换文件中
页面映射示意图
进程页面映射表页面映射表采二级映射方式页面映射表结构

PTE容决定该虚拟页面映射虚拟页面映射列种:
①物理映射
②物理映射映射页面交换文件
③物理映射映射物理存某页面
针第三种情况PTE高20位代表映射物理页面页面号次4位预留程序员低8位定义:
[cpp]view plaincopyprint
1 #define PA_BIT_PRESENT (0)1表示映射页面存中
2 #define PA_BIT_READWRITE (1)1标示写0标示读
3 #define PA_BIT_USER (2)1标示户空间页面
4 #define PA_BIT_WT (3)
5 #define PA_BIT_CD (4)
6 #define PA_BIT_ACCESSED (5)访问该页面MMU动置1
7 #define PA_BIT_DIRTY (6)写入该页面MMU动置1
8 #define PA_BIT_GLOBAL (8)


示意图:

第0位PA_BIT_PRESENT需注意果0映射页面物理存中时操作系统会PTE指示页面页面交换文件中位置windows言高8位标示页面交换文件号低24位标示页面交换文件部页面号加1
2常函数

[cpp]view plaincopyprint
9 NTSTATUS
10 NTAPI
11 MmCreateVirtualMapping(PEPROCESS Process
12 PVOID Address
13 ULONG flProtect
14 PPFN_TYPE Pages
15 ULONG PageCount)


函数作:定组物理页面号(Pages)定进程(Process)虚拟址Address开始区块映射组物理页面

[cpp]view plaincopyprint
16 VOID
17 NTAPI
18 MmDeleteVirtualMapping(
19 struct _EPROCESS *Process
20 PVOID Address
21 BOOLEAN FreePage
22 BOOLEAN* WasDirty
23 PPFN_TYPE Page
24 )


函数作:删某虚拟址页面映射

[cpp]view plaincopyprint
25 NTSTATUS
26 NTAPI
27 MmPageOutVirtualMemory(
28 PMMSUPPORT AddressSpace
29 PMEMORY_AREA MemoryArea
30 PVOID Address
31 struct _MM_PAGEOP* PageOp
32 )


函数作:虚拟页面容倒出页面交换文件
3附加说明
核调度进程运行时需控制寄存器CR3容设置进程页面映射表址时页面映射表物理址样MMU找进PTE装入高速缓存TLB中
CPU需访问访问前进程页面映射表时虚拟址什进程页面映射表虚拟空间位置固定0xc0000000然进程页面映射表物理页面
4系统空间映射
进程系统空间基公PAGETABLE_MAP(页面映射表)HYPERSPACE两块方例外进程页面映射表实际分两部分
①系统空间映射部分容全局核映射表部分页面映射时常驻受进程切换影响
②户空间映射部分特定进程进程切换部分映射受刷
创建进程时核通MmCreateProcessAddressSpace()核映射表复制系统空间映射代码:
[cpp]view plaincopyprint
33 BOOLEAN
34 NTAPI
35 MmCreateProcessAddressSpace(IN ULONG MinWs
36 IN PEPROCESS Process
37 IN PULONG DirectoryTableBase)
38 {
39 NTSTATUS Status
40 ULONG i j
41 PFN_TYPE Pfn[2]
42 PULONG PageDirectory
43
44 分配两物理页面分PAGETABLE_MAPHYPERSPACE
45 for (i 0 i < 2 i++)
46 {
47 MC_NPPOOL允许倒换出物理存
48 Status MmRequestPageMemoryConsumer(MC_NPPOOL FALSE &Pfn[i])
49 if (NT_SUCCESS(Status))
50 {
51 for (j 0 j < i j++)
52 {
53 MmReleasePageMemoryConsumer(MC_NPPOOL Pfn[j])
54 }
55
56 return FALSE
57 }
58 }
59
60 分配第页面Hyperspace映射
61 PageDirectory MmCreateHyperspaceMapping(Pfn[0])
62
63 核映射表复制系统空间映射
64 memcpy(PageDirectory + ADDR_TO_PDE_OFFSET(MmSystemRangeStart)
65 MmGlobalKernelPageDirectory + ADDR_TO_PDE_OFFSET(MmSystemRangeStart)
66 (1024 ADDR_TO_PDE_OFFSET(MmSystemRangeStart)) * sizeof(ULONG))
67
68 PAGETABLE_MAPHYPERSPACE目录项进程变需更改
69 PageDirectory[ADDR_TO_PDE_OFFSET(PAGETABLE_MAP)] PFN_TO_PTE(Pfn[0]) | PA_PRESENT | PA_READWRITE
70 PageDirectory[ADDR_TO_PDE_OFFSET(HYPERSPACE)] PFN_TO_PTE(Pfn[1]) | PA_PRESENT | PA_READWRITE
71
72 MmDeleteHyperspaceMapping(PageDirectory)
73
74 DirectoryTableBase[0] PFN_TO_PTE(Pfn[0])
75 DirectoryTableBase[1] 0
76
77 return TRUE
78 }


函数表明系统空间映射MmGlobalKernelPageDirectory核映射表MmGlobalKernelPageDirectory中信息系统初始化时候创建
[cpp]view plaincopyprint
79 VOID
80 INIT_FUNCTION
81 NTAPI
82 MmInitGlobalKernelPageDirectory(VOID)
83 {
84 ULONG i
85 PAGEDIRECTORY_MAP值0xc0300000PDE基址
86 PULONG CurrentPageDirectory (PULONG)PAGEDIRECTORY_MAP
87
88
89 Setup template
90
91 HyperTemplatePteuLong (PA_PRESENT | PA_READWRITE | PA_DIRTY | PA_ACCESSED)
92 if (Ke386GlobalPagesEnabled) HyperTemplatePteuLong | PA_GLOBAL
93
94 for (i ADDR_TO_PDE_OFFSET(MmSystemRangeStart) i < 1024 i++)
95 {
96 if (i ADDR_TO_PDE_OFFSET(PAGETABLE_MAP) &&
97 i ADDR_TO_PDE_OFFSET(HYPERSPACE) &&
98 0 MmGlobalKernelPageDirectory[i] && 0 CurrentPageDirectory[i])
99 {
100 初始化完全抄CurrentPageDirectory相初始化PDE
101 MmGlobalKernelPageDirectory[i] CurrentPageDirectory[i]
102 if (Ke386GlobalPagesEnabled)
103 {
104 MmGlobalKernelPageDirectory[i] | PA_GLOBAL
105 CurrentPageDirectory[i] | PA_GLOBAL
106 }
107 }
108 }
109 }




windows核情景分析学笔记9
分类: windows MFC20101020 1955257阅读评(0)收藏举报
1系统调NtAllocateVirtualMemory
户空间程序求分配空间求预订块虚拟址区间求兑现预订虚拟址(映射物理址)二者兼NtAllocateVirtualMemory实现
实际熟知windowsAPI中VirtualAlloc调函数实现功
函数声明:
[cpp]view plaincopyprint
1 NTSTATUS NTAPI
2 NtAllocateVirtualMemory(IN HANDLE ProcessHandle
3 IN OUT PVOID* UBaseAddress
4 IN ULONG_PTR ZeroBits
5 IN OUT PSIZE_T URegionSize
6 IN ULONG AllocationType
7 IN ULONG Protect)


参数说明:
①标示欲分配空间进程windows支持进程分配空间
②标示欲分配空间基址
③果参数20核参数分配空间参数表示实际分配址必须少0作前导例参数10表示应分配低4M
④标示欲分配空间长度
⑤标示分配类型组标示位中重MEM_RESERVEMEM_COMMIT前者标示预订虚拟空间真正分配物理页面者标示分配物理页面两者起标示预订落实次位
⑥标示该区间访问权限例:读写执行等
重代码摘录:
[cpp]view plaincopyprint
8 NTSTATUS NTAPI
9 NtAllocateVirtualMemory(IN HANDLE ProcessHandle
10 IN OUT PVOID* UBaseAddress
11 IN ULONG_PTR ZeroBits
12 IN OUT PSIZE_T URegionSize
13 IN ULONG AllocationType
14 IN ULONG Protect)
15 {
16 PEPROCESS Process
17 MEMORY_AREA* MemoryArea
18 ULONG_PTR MemoryAreaLength
19 ULONG Type
20 NTSTATUS Status
21 PMMSUPPORT AddressSpace
22 PVOID BaseAddress
23 ULONG RegionSize
24 PVOID PBaseAddress
25 ULONG PRegionSize
26 ULONG MemProtection
27 PHYSICAL_ADDRESS BoundaryAddressMultiple
28 KPROCESSOR_MODE PreviousMode
29
30 PAGED_CODE()
31
32 参数合理性检查
33
34
35 获取定进程数结构类型:PEPROCESS
36 Status ObReferenceObjectByHandle(ProcessHandle
37 PROCESS_VM_OPERATION
38 PsProcessType
39 PreviousMode
40 (PVOID*)(&Process)
41 NULL)
42 if (NT_SUCCESS(Status))
43 {
44 DPRINT(NtAllocateVirtualMemory() xnStatus)
45 return(Status)
46 }
47
48 Type (AllocationType & MEM_COMMIT) MEM_COMMIT MEM_RESERVE
49 DPRINT(Type xn Type)
50
51 获取AVL树
52 AddressSpace &Process>Vm
53 需互斥进行互斥锁
54 MmLockAddressSpace(AddressSpace)
55
56 if (PBaseAddress 0)
57 {
58 果指定基址直接分配
59 MemoryArea MmLocateMemoryAreaByAddress(AddressSpace BaseAddress)
60
61 if (MemoryArea NULL)
62 {
63 MemoryAreaLength (ULONG_PTR)MemoryArea>EndingAddress
64 (ULONG_PTR)MemoryArea>StartingAddress
65
66 if (MemoryArea>Type MEMORY_AREA_VIRTUAL_MEMORY &&
67 MemoryAreaLength > RegionSize)
68 {
69 类型普通虚存空间合适根参数改变目标区块类型属性
70 Status
71 MmAlterRegion(AddressSpace
72 MemoryArea>StartingAddress
73 &MemoryArea>DataVirtualMemoryDataRegionListHead
74 BaseAddress RegionSize
75 Type Protect MmModifyAttributes)
76 互斥操作结束
77 MmUnlockAddressSpace(AddressSpace)
78 ObDereferenceObject(Process)
79
80 * Give the caller rounded BaseAddress and area length *
81 if (NT_SUCCESS(Status))
82 {
83 *UBaseAddress BaseAddress
84 *URegionSize RegionSize
85 DPRINT(*UBaseAddress x *URegionSize xn BaseAddress RegionSize)
86 }
87 分配成功
88 return(Status)
89 }
90 else if (MemoryAreaLength > RegionSize)
91 {
92 长度符合求区间类型section
93 * Region list initialized *
94 if (MemoryArea>DataSectionDataRegionListHeadFlink)
95 {
96 改变区间类型保护模式
97 Status
98 MmAlterRegion(AddressSpace
99 MemoryArea>StartingAddress
100 &MemoryArea>DataSectionDataRegionListHead
101 BaseAddress RegionSize
102 Type Protect MmModifyAttributes)
103 }
104 else
105 {
106 Status STATUS_ACCESS_VIOLATION
107 }
108
109 MmUnlockAddressSpace(AddressSpace)
110 ObDereferenceObject(Process)
111
112 * Give the caller rounded BaseAddress and area length *
113 if (NT_SUCCESS(Status))
114 {
115 *UBaseAddress BaseAddress
116 *URegionSize RegionSize
117 DPRINT(*UBaseAddress x *URegionSize xn BaseAddress RegionSize)
118 }
119 分配成功
120 return(Status)
121 }
122 else
123 {
124 区间长度够分配失败
125 MmUnlockAddressSpace(AddressSpace)
126 ObDereferenceObject(Process)
127 return(STATUS_UNSUCCESSFUL)
128 }
129 }end if(MemoryArea NULL)
130 }end if(PBaseAddress 0)
131
132 PBaseAddress 0核分配块合适区间
133 Status MmCreateMemoryArea(AddressSpace
134 MEMORY_AREA_VIRTUAL_MEMORY
135 &BaseAddress
136 RegionSize
137 Protect
138 &MemoryArea
139 PBaseAddress 0
140 AllocationType & MEM_TOP_DOWN
141 BoundaryAddressMultiple)
142 if (NT_SUCCESS(Status))
143 {
144 失败
145 MmUnlockAddressSpace(AddressSpace)
146 ObDereferenceObject(Process)
147 return(Status)
148 }
149
150 MemoryAreaLength (ULONG_PTR)MemoryArea>EndingAddress
151 (ULONG_PTR)MemoryArea>StartingAddress
152
153 设置区块类型(刚建立区间中唯区块)
154 MmInitializeRegion(&MemoryArea>DataVirtualMemoryDataRegionListHead
155 MemoryAreaLength Type Protect)
156
157 if ((AllocationType & MEM_COMMIT) &&
158 (Protect & (PAGE_READWRITE | PAGE_EXECUTE_READWRITE)))
159 {
160 const ULONG nPages PAGE_ROUND_UP(MemoryAreaLength) >> PAGE_SHIFT
161 预留页面交换文件中页面
162 MmReserveSwapPages(nPages)
163 }
164
165 *UBaseAddress BaseAddress 返回实际分配址
166 *URegionSize MemoryAreaLength 返回实际分配长度
167
168 MmUnlockAddressSpace(AddressSpace)
169 ObDereferenceObject(Process)
170 return(STATUS_SUCCESS)
171 }


2页面异常
通传递MEM_COMMIT调NtAllocateVirtualMemory成功系统会分配指定虚存区间标志置MEM_COMMIT实际映射物理页面户需访问块已分配区间时会发生页面异常(缺页异常)异常处理中虚存区间建立物理页面映射
样做考虑某情况户求分配空间定会立样物理页面占没意义物理页面映射操作延迟访问时进步提高物理存利率
页面发生异常时核会调异常处理函数MmAccessFault()函数底层异常响应程序调发生某种异常时CPU首先进入相应异常响应程序里根具体情况调处理程序
MmAccessFault代码:
[cpp]view plaincopyprint
172 NTSTATUS
173 NTAPI
174 MmAccessFault(IN BOOLEAN StoreInstruction
175 IN PVOID Address
176 IN KPROCESSOR_MODE Mode
177 IN PVOID TrapInformation)
178 {
179 PMEMORY_AREA MemoryArea
180
181
182
183 StoreInstruction0标示缺页非0标示越权
184 if (StoreInstruction)
185 {
186 * Call access fault * 越权访问引起
187 return MmpAccessFault(Mode (ULONG_PTR)Address TrapInformation FALSE TRUE)
188 }
189 else
190 {
191 * Call not present * 缺页引起(未建立物理页面映射)
192 return MmNotPresentFault(Mode (ULONG_PTR)Address TrapInformation FALSE TRUE)
193 }
194 }


缺页异常处理代码:
[cpp]view plaincopyprint
195 NTSTATUS
196 NTAPI
197 MmNotPresentFault(KPROCESSOR_MODE Mode
198 ULONG_PTR Address
199 BOOLEAN FromMdl)
200 {
201 PMMSUPPORT AddressSpace
202 MEMORY_AREA* MemoryArea
203 NTSTATUS Status
204 BOOLEAN Locked FromMdl
205 extern PMMPTE MmSharedUserDataPte
206
207 if (KeGetCurrentIrql() > DISPATCH_LEVEL)
208 {
209 return(STATUS_UNSUCCESSFUL)
210 }
211
212 if (Address > (ULONG_PTR)MmSystemRangeStart)
213 {
214 异常发生系统空间
215 if (Mode KernelMode)
216 {
217 DPRINT1(Address xn Address)
218 return(STATUS_ACCESS_VIOLATION)
219 }
220 AddressSpace MmGetKernelAddressSpace()
221 }
222 else 异常发生户空间
223 {
224 获取AVL树
225 AddressSpace &PsGetCurrentProcess()>Vm
226 }
227
228 if (FromMdl)
229 {
230 MmLockAddressSpace(AddressSpace)
231 }
232
233 do
234 {
235 AVL树中搜寻异常区间
236 MemoryArea MmLocateMemoryAreaByAddress(AddressSpace (PVOID)Address)
237 if (MemoryArea NULL || MemoryArea>DeleteInProgress)
238 {
239 区间尚未分配正删
240 if (FromMdl)
241 {
242 MmUnlockAddressSpace(AddressSpace)
243 }
244 return (STATUS_ACCESS_VIOLATION)
245 }
246
247 搜索成功根区间类型处理
248 switch (MemoryArea>Type)
249 {
250 case MEMORY_AREA_PAGED_POOL
251 {
252 Status MmCommitPagedPoolAddress((PVOID)Address Locked)
253 break
254 }
255
256 case MEMORY_AREA_SYSTEM
257 Status STATUS_ACCESS_VIOLATION
258 break
259
260 case MEMORY_AREA_SECTION_VIEW
261 Status MmNotPresentFaultSectionView(AddressSpace
262 MemoryArea
263 (PVOID)Address
264 Locked)
265 break
266
267 般虚存区间
268 case MEMORY_AREA_VIRTUAL_MEMORY
269 case MEMORY_AREA_PEB_OR_TEB
270 Status MmNotPresentFaultVirtualMemory(AddressSpace
271 MemoryArea
272 (PVOID)Address
273 Locked)
274 break
275
276 case MEMORY_AREA_SHARED_DATA
277 *MiAddressToPte(USER_SHARED_DATA) *MmSharedUserDataPte
278 Status STATUS_SUCCESS
279 break
280
281 default
282 Status STATUS_ACCESS_VIOLATION
283 break
284 }
285 }
286 while (Status STATUS_MM_RESTART_OPERATION)
287
288 if (FromMdl)
289 {
290 MmUnlockAddressSpace(AddressSpace)
291 }
292 return(Status)
293 }


般虚存区间MmNotPresentFaultVirtualMemory处理函数处理程致:
①MmRequestPageMemoryConsumer申请空闲物理页面
②MmCreateVirtualMapping建立物理页面虚存区块映射

windows核情景分析学笔记10
分类: windows MFC20101023 0939362阅读评(1)收藏举报
1享映射区
户空间映射物理页面通常映射进程户空间
系统空间映射进程享
物理页面映射进程户空间映射虚拟址相样物理页面映射进程虚存空间形成连续区间称享映射区
2享映射区存原
①系统享映射区载入运行exeDLL文件量节约页交换文件空间程序启动时间
②户享映射区访问磁盘数文件避免直接文件进行IO操作文件容进行缓存
③通享映射区台机器进程间享数效率高
3创建享映射区
创建享影射区需执行三步骤:
①创建享映射区象
②分配虚存空间
③建立映射
31创建享映射区象
首先创建享映射区象NtCreateSection
[cpp]view plaincopyprint
1 NtCreateSection (OUT PHANDLE SectionHandle
2 IN ACCESS_MASK DesiredAccess
3 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL
4 IN PLARGE_INTEGER MaximumSize OPTIONAL
5 IN ULONG SectionPageProtection OPTIONAL
6 IN ULONG AllocationAttributes
7 IN HANDLE FileHandle OPTIONAL)


参数FileHandle创建文件映射区应该首先开文件获取文件句柄填入填入NULL创建享映射区
实现:
[cpp]view plaincopyprint
8 NTSTATUS NTAPI
9 NtCreateSection (OUT PHANDLE SectionHandle
10 IN ACCESS_MASK DesiredAccess
11 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL
12 IN PLARGE_INTEGER MaximumSize OPTIONAL
13 IN ULONG SectionPageProtection OPTIONAL
14 IN ULONG AllocationAttributes
15 IN HANDLE FileHandle OPTIONAL)
16 {
17 LARGE_INTEGER SafeMaximumSize
18 PVOID SectionObject
19 KPROCESSOR_MODE PreviousMode
20 NTSTATUS Status
21
22 Status MmCreateSection(&SectionObject
23 DesiredAccess
24 ObjectAttributes
25 MaximumSize
26 SectionPageProtection
27 AllocationAttributes
28 FileHandle
29 NULL)
30
31 return Status
32 }


显然函数体MmCreateSection
实现:
[cpp]view plaincopyprint
33 NTSTATUS NTAPI
34 MmCreateSection (OUT PVOID * Section
35 IN ACCESS_MASK DesiredAccess
36 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL
37 IN PLARGE_INTEGER MaximumSize
38 IN ULONG SectionPageProtection
39 IN ULONG AllocationAttributes
40 IN HANDLE FileHandle OPTIONAL
41 IN PFILE_OBJECT File OPTIONAL)
42 {
43 ULONG Protection
44 PROS_SECTION_OBJECT *SectionObject (PROS_SECTION_OBJECT *)Section
45 *
46 * Check the protection
47 *
48 Protection SectionPageProtection & ~(PAGE_GUARD|PAGE_NOCACHE)
49 if (Protection PAGE_READONLY &&
50 Protection PAGE_READWRITE &&
51 Protection PAGE_WRITECOPY &&
52 Protection PAGE_EXECUTE &&
53 Protection PAGE_EXECUTE_READ &&
54 Protection PAGE_EXECUTE_READWRITE &&
55 Protection PAGE_EXECUTE_WRITECOPY)
56 {
57 return STATUS_INVALID_PAGE_PROTECTION
58 }
59 执行文件
60 if (AllocationAttributes & SEC_IMAGE)
61 {
62 return(MmCreateImageSection(SectionObject
63 DesiredAccess
64 ObjectAttributes
65 MaximumSize
66 SectionPageProtection
67 AllocationAttributes
68 FileHandle))
69 }
70 普通数文件
71 if (FileHandle NULL)
72 {
73 return(MmCreateDataFileSection(SectionObject
74 DesiredAccess
75 ObjectAttributes
76 MaximumSize
77 SectionPageProtection
78 AllocationAttributes
79 FileHandle))
80 }
81 享映射区(没文件句柄)
82 return(MmCreatePageFileSection(SectionObject
83 DesiredAccess
84 ObjectAttributes
85 MaximumSize
86 SectionPageProtection
87 AllocationAttributes))
88 }


函数开始进行页面保护模式合理性检查检查根目标文件性质进行处理:
①果执行文件通MmCreateImageSection处理执行文件着特殊结构做特例处理
②果普通数文件MmCreateDataFileSection创建文件映射区
③果没定目标文件创建享存区(实页面交换文件目标文件)
MmCreateDataFileSection例分析创建文件映射区程
函数中做件事情:
①创建映射区象ObCreateObject完成
②获取数文件象ObReferenceObjectByHandle完成获取数文件FILE_OBJECT结构指针
③构造映射段MM_SECTION_SEGMENT数结构(ExAllocatePoolWithTag完成)映射区象数文件象中相关指针指映射段
④映射区象中FileObject字段指数文件象
关键代码:
[csharp]view plaincopyprint
89 NTSTATUS
90 NTAPI
91 MmCreateDataFileSection(PROS_SECTION_OBJECT *SectionObject
92 ACCESS_MASK DesiredAccess
93 POBJECT_ATTRIBUTES ObjectAttributes
94 PLARGE_INTEGER UMaximumSize
95 ULONG SectionPageProtection
96 ULONG AllocationAttributes
97 HANDLE FileHandle)
98 {
99 PROS_SECTION_OBJECT Section
100 NTSTATUS Status
101 LARGE_INTEGER MaximumSize
102 PFILE_OBJECT FileObject
103 PMM_SECTION_SEGMENT Segment
104 ULONG FileAccess
105 IO_STATUS_BLOCK Iosb
106 LARGE_INTEGER Offset
107 CHAR Buffer
108 FILE_STANDARD_INFORMATION FileInfo
109 *
110 * 创建映射区象Section
111 *
112 Status ObCreateObject(ExGetPreviousMode()
113 MmSectionObjectType
114 ObjectAttributes
115 ExGetPreviousMode()
116 NULL
117 sizeof(ROS_SECTION_OBJECT)
118 0
119 0
120 (PVOID*)(PVOID)&Section)
121 *
122 * 初始化映射区象Section
123 *
124 RtlZeroMemory(Section sizeof(ROS_SECTION_OBJECT))
125 Section>SectionPageProtection SectionPageProtection
126 Section>AllocationAttributes AllocationAttributes
127
128 *
129 * 获取数文件象FileObject
130 *
131 Status ObReferenceObjectByHandle(FileHandle
132 FileAccess
133 IoFileObjectType
134 ExGetPreviousMode()
135 (PVOID*)(PVOID)&FileObject
136 NULL)
137
138 * 果数文件前尚未作文件映射区盾
139 * 构造映射段MM_SECTION_SEGMENT结构
140 *
141 if (FileObject>SectionObjectPointer>DataSectionObject NULL)
142 {
143 Segment ExAllocatePoolWithTag(NonPagedPool sizeof(MM_SECTION_SEGMENT)
144 TAG_MM_SECTION_SEGMENT)
145 映射区象中相关指针指映射段
146 Section>Segment Segment
147 Segment>ReferenceCount 1
148 ExInitializeFastMutex(&Segment>Lock)
149 *
150 * Set the lock before assigning the segment to the file object
151 *
152 ExAcquireFastMutex(&Segment>Lock)
153 数文件象中相关指针指映射段
154 FileObject>SectionObjectPointer>DataSectionObject (PVOID)Segment
155 映射段初始化
156 Segment>FileOffset 0
157 Segment>Protection SectionPageProtection
158 Segment>Flags MM_DATAFILE_SEGMENT
159 Segment>Characteristics 0
160 Segment>WriteCopy FALSE
161 if (AllocationAttributes & SEC_RESERVE)
162 {
163 Segment>Length Segment>RawLength 0
164 }
165 else
166 {
167 Segment>RawLength MaximumSizeuLowPart
168 Segment>Length PAGE_ROUND_UP(Segment>RawLength)
169 }
170 Segment>VirtualAddress 0
171 RtlZeroMemory(&Segment>PageDirectory sizeof(SECTION_PAGE_DIRECTORY))
172 }
173 else
174 {
175 果数文件已映射某映射段需扩展映射段(果需)
176 Segment
177 (PMM_SECTION_SEGMENT)FileObject>SectionObjectPointer>
178 DataSectionObject
179 Section>Segment Segment
180 (void)InterlockedIncrementUL(&Segment>ReferenceCount)
181 MmLockSectionSegment(Segment)
182 if (MaximumSizeuLowPart > Segment>RawLength &&
183 (AllocationAttributes & SEC_RESERVE))
184 {
185 Segment>RawLength MaximumSizeuLowPart
186 Segment>Length PAGE_ROUND_UP(Segment>RawLength)
187 }
188 }
189 MmUnlockSectionSegment(Segment)
190 映射区象中FileObject字段指数文件象
191 Section>FileObject FileObject
192 Section>MaximumSize MaximumSize
193 CcRosReferenceCache(FileObject)
194 *SectionObject Section
195 return(STATUS_SUCCESS)
196 }


32 映射区映射段区
映射区映射段组成映射执行文件文件身分段例代码段数段等映射区分成干映射段映射数文件映射段
映射区象结构
[cpp]view plaincopyprint
197 typedef struct _ROS_SECTION_OBJECT
198 {
199 CSHORT Type
200 CSHORT Size
201 LARGE_INTEGER MaximumSize
202 ULONG SectionPageProtection
203 ULONG AllocationAttributes
204 PFILE_OBJECT FileObject 指文件象
205 union
206 {
207 PMM_IMAGE_SECTION_OBJECT ImageSection 执行文件
208 PMM_SECTION_SEGMENT Segment 数文件(单映射段)
209 }
210 } ROS_SECTION_OBJECT *PROS_SECTION_OBJECT


映射段象结构
[cpp]view plaincopyprint
211 typedef struct _MM_SECTION_SEGMENT
212 {
213 LONG FileOffset * 映射段起点应文件部位移*
214 ULONG_PTR VirtualAddress * Start offset into the address range for image sections *
215 ULONG RawLength * length of the segment which is part of the mapped file *
216 ULONG Length * absolute length of the segment *
217 ULONG Protection
218 FAST_MUTEX Lock * lock which protects the page directory *
219 ULONG ReferenceCount
220 SECTION_PAGE_DIRECTORY PageDirectory 页面目录(指映射段页面表)
221 ULONG Flags
222 ULONG Characteristics
223 BOOLEAN WriteCopy
224 } MM_SECTION_SEGMENT *PMM_SECTION_SEGMENT


33分配虚存空间建立映射
时映射区象建立完毕未实际建立映射实际映射通系统调NtMapViewOfSection完成
系统调作映射区象部分全部映射某进程户空间
数文件终调MmMapViewOfSegment(数文件段)
[cpp]view plaincopyprint
225 static NTSTATUS
226 MmMapViewOfSegment(PMMSUPPORT AddressSpace
227 PROS_SECTION_OBJECT Section
228 PMM_SECTION_SEGMENT Segment
229 PVOID* BaseAddress
230 SIZE_T ViewSize
231 ULONG Protect
232 ULONG ViewOffset
233 ULONG AllocationType)
234 {
235 PMEMORY_AREA MArea
236 NTSTATUS Status
237 PHYSICAL_ADDRESS BoundaryAddressMultiple
238
239 BoundaryAddressMultipleQuadPart 0
240
241 Status MmCreateMemoryArea(AddressSpace
242 MEMORY_AREA_SECTION_VIEW
243 BaseAddress
244 ViewSize
245 Protect
246 &MArea
247 FALSE
248 AllocationType
249 BoundaryAddressMultiple)
250 if (NT_SUCCESS(Status))
251 {
252 return(Status)
253 }
254
255 ObReferenceObject((PVOID)Section)
256
257 MArea>DataSectionDataSegment Segment
258 MArea>DataSectionDataSection Section
259 MArea>DataSectionDataViewOffset ViewOffset
260 MArea>DataSectionDataWriteCopyView FALSE
261 MmInitializeRegion(&MArea>DataSectionDataRegionListHead
262 ViewSize 0 Protect)
263
264 return(STATUS_SUCCESS)
265 }


函数简单申请块虚存空间应MEMORY_AREA结构分量设置成指映射区完事


windows核情景分析学笔记11
分类: windows MFC20101025 1945373阅读评(1)收藏举报
1windows进程线程相关函数
win32API中创建进程CreateProcess函数
CreateProcess完成两件事:
①NtCreateProcess创建进程
②果NtCreateProcess成功NtCreateThread创建进程第线程(线程)
声明:
[cpp]view plaincopyprint
1 NTSTATUS
2 NTAPI
3 NtCreateProcess(OUT PHANDLE ProcessHandle 返回进程句柄(前进程中)
4 IN ACCESS_MASK DesiredAccess 进程访问权限
5 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL 执行执行文件路径名
6 IN HANDLE ParentProcess 指定进程父进程
7 IN BOOLEAN InheritObjectTable 否继承父进程象句柄表
8 IN HANDLE SectionHandle OPTIONAL
9 IN HANDLE DebugPort OPTIONAL
10 IN HANDLE ExceptionPort OPTIONAL)


[cpp]view plaincopyprint
11 NTSTATUS
12 NTAPI
13 NtCreateThread(OUT PHANDLE ThreadHandle 返回线程句柄
14 IN ACCESS_MASK DesiredAccess 访问权限
15 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL
16 IN HANDLE ProcessHandle 指定线程属进程
17 OUT PCLIENT_ID ClientId
18 IN PCONTEXT ThreadContext 寄存器值(运行文)
19 IN PINITIAL_TEB InitialTeb 线程环境块
20 IN BOOLEAN CreateSuspended) 线程创建否挂起(立刻运行)


CreateProcessAPI提供CreateThread创建线程函数系统调NtCreateThread
2windows进程相关数结构
系统空间中:
①EPROCESS:理层 进程控制块代表着windows进程
②KPROCESS:核心层 进程控制块EPROCESS分量
③W32PROCESS:窗口进程独
KPROCESS隶属EPROCESS核中进程相关数结构两种EPROCESSW32PROCESS前者进程者窗口进程(通窗口户交互)
户空间中:
①进程环境块PEB:PEB记录进程运行参数映装入址等位置处0x7ffdf000
面定义:
EPROCESS(部分):
[csharp]view plaincopyprint
21 typedef struct _EPROCESS
22 {
23 KPROCESS Pcb 进程KPROCESS
24
25 PHANDLE_TABLE ObjectTable 象句柄表
26
27 PVOID *Win32Process 指进程W32PROCESS结构
28 struct _EJOB *Job
29 PVOID SectionObject 指执行程序创建文件映射区象
30 PVOID SectionBaseAddress
31
32 PVOID DeviceMap 指进程磁盘设备位图
33
34 CHAR ImageFileName[16] 程序文件名
35 LIST_ENTRY JobLinks
36 PVOID LockedPagesList
37 LIST_ENTRY ThreadListHead 进程线程队列
38
39 ACCESS_MASK GrantedAccess 允许访问方式
40
41 struct _PEB* Peb 指户空间PEB
42
43 UCHAR PriorityClass 优先级
44 MM_AVL_TABLE VadRoot 进程户空间AVL树
45 ULONG Cookie
46 } EPROCESS


KPROCESS(部分)
[cpp]view plaincopyprint
47 typedef struct _KPROCESS
48 {
49 DISPATCHER_HEADER Header
50 LIST_ENTRY ProfileListHead
51 ULONG DirectoryTableBase 进程页面映射表物理址
52
53 LIST_ENTRY ReadyListHead 进程绪线程队列
54 SINGLE_LIST_ENTRY SwapListEntry
55 PVOID VdmTrapcHandler
56 LIST_ENTRY ThreadListHead 进程线程队列(节点KTHREAD)
57 KSPIN_LOCK ProcessLock
58
59 SCHAR BasePriority 线程优先级
60
61 ULONG StackCount
62 LIST_ENTRY ProcessListEntry 挂入核进程队列
63 } KPROCESS


PEB(部分):
[cpp]view plaincopyprint
64 typedef struct _PEB
65 {
66 BOOLEAN InheritedAddressSpace
67 BOOLEAN ReadImageFileExecOptions
68 BOOLEAN BeingDebugged
69
70 HANDLE Mutant
71 PVOID ImageBaseAddress 程序镜起点
72 PPEB_LDR_DATA Ldr
73 struct _RTL_USER_PROCESS_PARAMETERS *ProcessParameters 指进程参数块(中参数信息前文件目录等)
74
75 PVOID FastPebLock
76 PPEBLOCKROUTINE FastPebLockRoutine
77 PPEBLOCKROUTINE FastPebUnlockRoutine
78 ULONG EnvironmentUpdateCount
79 PVOID* KernelCallbackTable 核回调户空间函数
80 PVOID EventLogSection
81 PVOID EventLog
82
83 } PEB *PPEB


3windows线程相关数结构
进程数结构应线程ETHREADKTHREADW32THREADTEB
ETHREAD:
[cpp]view plaincopyprint
84 typedef struct _ETHREAD
85 {
86 KTHREAD Tcb 线程KTHREAD结构
87
88 LIST_ENTRY ThreadListEntry 挂入EPROCESS中线程队列
89
90 } ETHREAD


KTHREAD
[cppnogutter]view plaincopyprint
91 typedef struct _KTHREAD
92 {
93 DISPATCHER_HEADER DispatcherHeader
94
95 PVOID KernelStack 线程系统空间堆栈
96 KSPIN_LOCK ThreadLock
97 union
98 {
99 KAPC_STATE ApcState 线程ACP状态
100
101 }
102
103 struct _TEB *Teb 户空间线程环境块(TEB)
104
105 PKTRAP_FRAME TrapFrame 系统空间堆栈陷框架
106
107 struct _KPROCESS *Process 属进程KPROCESS结构
108
109 PVOID Win32Thread 指线程W32THREAD结构
110 PVOID StackBase
111
112 LIST_ENTRY ThreadListEntry 挂入KPROCESS中线程队列
113
114 } KTHREAD




windows核情景分析学笔记12
分类: windows MFC20101025 1957298阅读评(0)收藏举报
1windows进程户空间
windows户空间系统空间分界线0x80000000
应软件户空间访问高址0x7ffeffff0x7fff0000访问分界线留64KB隔离区
应软件户空间访问低址0x000100000开始64KB访问
特殊空间:
系统空间0xffdf0000处存放着_KUSER_SHARED_DATA结构(4KB)结构进程享结构字段系统信息NtSystemRoot字段存放系统根目录路径名
户空间中格局安排:
户空间创建格局核函数MmInitializeProcessAddressSpace()实现
[cpp]view plaincopyprint
1 NtCreateProcess>NtCreateProcessEx>PspCreateProcess>MmInitializeProcessAddressSpace
2
3 NTSTATUS
4 NTAPI
5 MmInitializeProcessAddressSpace(IN PEPROCESS Process
6 IN PEPROCESS ProcessClone OPTIONAL
7 IN PVOID Section OPTIONAL
8 IN OUT PULONG Flags
9 IN POBJECT_NAME_INFORMATION *AuditName OPTIONAL)
10 {
11 NTSTATUS Status
12 PMMSUPPORT ProcessAddressSpace &Process>Vm
13 PVOID BaseAddress
14 PMEMORY_AREA MemoryArea
15 PHYSICAL_ADDRESS BoundaryAddressMultiple
16 SIZE_T ViewSize 0
17 PVOID ImageBase 0
18 PROS_SECTION_OBJECT SectionObject Section
19 BoundaryAddressMultipleQuadPart 0
20
21 初始化户空间设置禁区
22 * Initialize the Addresss Space lock *
23 KeInitializeGuardedMutex(&Process>AddressCreationLock)
24 Process>VmWorkingSetExpansionLinksFlink NULL
25
26 * Initialize AVL tree *
27 ASSERT(Process>VadRootNumberGenericTableElements 0)
28 Process>VadRootBalancedRootu1Parent &Process>VadRootBalancedRoot
29
30 * Acquire the Lock *
31 MmLockAddressSpace(ProcessAddressSpace)
32
33 * Protect the highest 64KB of the process address space *
34 BaseAddress (PVOID)MmUserProbeAddress MmSystemRangeStart0x10000
35 Status MmCreateMemoryArea(ProcessAddressSpace
36 MEMORY_AREA_NO_ACCESS
37 &BaseAddress
38 0x10000
39 PAGE_NOACCESS 禁止访问
40 &MemoryArea
41 FALSE
42 0
43 BoundaryAddressMultiple)
44 if (NT_SUCCESS(Status))
45 {
46 goto exit
47 }
48
49 * Protect the 60KB above the shared user page *
50 BaseAddress (char*)USER_SHARED_DATA + PAGE_SIZE 0x7FFE0000+0x1000
51 Status MmCreateMemoryArea(ProcessAddressSpace
52 MEMORY_AREA_NO_ACCESS
53 &BaseAddress
54 0x10000 PAGE_SIZE 0x100000x1000
55 PAGE_NOACCESS 禁止访问
56 &MemoryArea
57 FALSE
58 0
59 BoundaryAddressMultiple)
60 if (NT_SUCCESS(Status))
61 {
62 goto exit
63 }
64
65 * Create the shared data page *
66 BaseAddress (PVOID)USER_SHARED_DATA 0x7FFE0000
67 Status MmCreateMemoryArea(ProcessAddressSpace
68 MEMORY_AREA_SHARED_DATA
69 &BaseAddress
70 PAGE_SIZE 0x1000(4K)
71 PAGE_EXECUTE_READ 读执行
72 &MemoryArea
73 FALSE
74 0
75 BoundaryAddressMultiple)
76 if (NT_SUCCESS(Status))
77 {
78 goto exit
79 }
80
81 * The process now has an address space *
82 Process>HasAddressSpace TRUE
83
84 开始分配户空间
85 * Check if there's a Section Object *
86 if (SectionObject)
87 {已建立执行文件文件映射区
88 UNICODE_STRING FileName
89 PWCHAR szSrc
90 PCHAR szDest
91 USHORT lnFName 0
92
93 * Unlock the Address Space *
94 执行文件分配虚存空间建立映射
95 MmUnlockAddressSpace(ProcessAddressSpace)
96 Status MmMapViewOfSection(Section
97 (PEPROCESS)Process
98 (PVOID*)&ImageBase
99 0
100 0
101 NULL
102 &ViewSize
103 0
104 MEM_COMMIT
105 PAGE_READWRITE)
106 if (NT_SUCCESS(Status))
107 {
108 return Status
109 }
110
111 * Save the pointer *
112 Process>SectionBaseAddress ImageBase 指执行文件起点
113
114 * Determine the image file name and save it to EPROCESS *
115 Getting Image name
116 FileName SectionObject>FileObject>FileName
117 szSrc (PWCHAR)((PCHAR)FileNameBuffer + FileNameLength)
118 if (FileNameBuffer)
119 {
120 * Loop the file name*
121 while (szSrc > FileNameBuffer)
122 {
123 * Make sure this isn't a backslash *
124 if (*szSrc OBJ_NAME_PATH_SEPARATOR)
125 {
126 * If so stop it here *
127 szSrc++
128 break
129 }
130 else
131 {
132 * Otherwise keep going *
133 lnFName++
134 }
135 }
136 }
137
138 * Copy the to the process and truncate it to 15 characters if necessary *
139 szDest Process>ImageFileName
140 lnFName min(lnFName sizeof(Process>ImageFileName) 1)
141 while (lnFName) *szDest++ (UCHAR)*szSrc++
142 *szDest ANSI_NULL
143
144 * Check if caller wants an audit name *
145 if (AuditName)
146 {
147 * Setup the audit name *
148 SeInitializeProcessAuditName(SectionObject>FileObject
149 FALSE
150 AuditName)
151 }
152
153 * Return status to caller *
154 return Status
155 }
156
157 exit
158 * Unlock the Address Space *
159 DPRINT(Unlockingn)
160 MmUnlockAddressSpace(ProcessAddressSpace)
161
162 * Return status to caller *
163 return Status
164 }


EXE文件DLL装入映射户空间中ntdlldll特殊DLL核初始化时候系统创建文件映射区象全局指针PspSystemDllSection指该象数结构
MmInitializeProcessAddressSpacePspMapSystemDll建立ntdlldll映射
[cpp]view plaincopyprint
165 NtCreateProcess>NtCreateProcessEx>PspCreateProcess>PspMapSystemDll
166 NTSTATUS
167 NTAPI
168 PspMapSystemDll(IN PEPROCESS Process
169 IN PVOID *DllBase
170 IN BOOLEAN UseLargePages)
171 {
172 NTSTATUS Status
173 LARGE_INTEGER Offset {{0 0}}
174 SIZE_T ViewSize 0
175 PVOID ImageBase 0
176
177 * Map the System DLL *
178 Status MmMapViewOfSection(PspSystemDllSection ntdlldll
179 Process
180 (PVOID*)&ImageBase
181 0
182 0
183 &Offset
184 &ViewSize
185 ViewShare
186 0
187 PAGE_READWRITE)
188 if (Status STATUS_SUCCESS)
189 {
190 * Normalize status code *
191 Status STATUS_CONFLICTING_ADDRESSES
192 }
193
194 * Write the image base and return status *
195 if (DllBase) *DllBase ImageBase
196 return Status
197 }


进程环境块PEB建立MmCreatePeb完成
[cpp]view plaincopyprint
198 NtCreateProcess>NtCreateProcessEx>PspCreateProcess>MmCreatePeb
199 NTSTATUS
200 NTAPI
201 MmCreatePeb(IN PEPROCESS Process
202 IN PINITIAL_PEB InitialPeb
203 OUT PPEB *BasePeb)
204 {
205 PPEB Peb NULL
206 LARGE_INTEGER SectionOffset
207 SIZE_T ViewSize 0
208 PVOID TableBase NULL
209 PIMAGE_NT_HEADERS NtHeaders
210 PIMAGE_LOAD_CONFIG_DIRECTORY ImageConfigData
211 NTSTATUS Status
212 USHORT Characteristics
213 KAFFINITY ProcessAffinityMask 0
214 SectionOffsetQuadPart (ULONGLONG)0
215 *BasePeb NULL
216
217 Attach to Process
218 挂新进程
219 KeAttachProcess(&Process>Pcb)
220
221 Allocate the PEB
222 址MM_HIGHEST_USER_ADDRESS (16 * PAGE_SIZE)+1
223 0x7ffeffff(16 * PAGE_SIZE)+1
224 0x7ffdffff+1
225 0x7ffe0000
226 0x7ffe0000取0x1000区间存放peb
227 peb首址0x7FFDF0000x1000
228 Peb MiCreatePebOrTeb(Process
229 (PVOID)((ULONG_PTR)MM_HIGHEST_VAD_ADDRESS + 1))
230 ASSERT(Peb (PVOID)0x7FFDF000)
231
232
233
234 Use SEH in case we can't load the PEB
235 _SEH2_TRY
236 {
237 Initialize the PEB
238 RtlZeroMemory(Peb sizeof(PEB))
239
240 Set up data
241 Peb>ImageBaseAddress Process>SectionBaseAddress
242 Peb>InheritedAddressSpace InitialPeb>InheritedAddressSpace
243 Peb>Mutant InitialPeb>Mutant
244 Peb>ImageUsesLargePages InitialPeb>ImageUsesLargePages
245
246 NLS
247 Peb>AnsiCodePageData (PCHAR)TableBase + ExpAnsiCodePageDataOffset
248 Peb>OemCodePageData (PCHAR)TableBase + ExpOemCodePageDataOffset
249 Peb>UnicodeCaseTableData (PCHAR)TableBase + ExpUnicodeCaseTableDataOffset
250
251 Default Version Data (could get changed below)
252 Peb>OSMajorVersion NtMajorVersion
253 Peb>OSMinorVersion NtMinorVersion
254 Peb>OSBuildNumber (USHORT)(NtBuildNumber & 0x3FFF)
255 Peb>OSPlatformId 2 * VER_PLATFORM_WIN32_NT *
256 Peb>OSCSDVersion (USHORT)CmNtCSDVersion
257
258 Heap and Debug Data
259 Peb>NumberOfProcessors KeNumberProcessors
260 Peb>BeingDebugged (BOOLEAN)(Process>DebugPort NULL TRUE FALSE)
261 Peb>NtGlobalFlag NtGlobalFlag
262 Peb>MaximumNumberOfHeaps (PAGE_SIZE sizeof(PEB)) sizeof(PVOID) peb身剩余空间存储堆指针数组堆数量算出
263 Peb>ProcessHeaps (PVOID*)(Peb + 1) 指堆指针数组起点
264
265 Session ID
266 if (Process>Session) Peb>SessionId 0 MmGetSessionId(Process)
267 }
268 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
269 {
270 Fail
271 KeDetachProcess()
272 _SEH2_YIELD(return _SEH2_GetExceptionCode())
273 }
274 _SEH2_END
275
276
277
278 Detach from the Process
279 KeDetachProcess()
280 *BasePeb Peb
281 return STATUS_SUCCESS
282 }





文档香网(httpswwwxiangdangnet)户传

《香当网》用户分享的内容,不代表《香当网》观点或立场,请自行判断内容的真实性和可靠性!
该内容是文档的文本内容,更好的格式请下载文档

下载文档,方便阅读与编辑

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 10 香币 [ 分享文档获得香币 ]

该文档为用户出售和定价!

购买文档

相关文档

2021年reactos仿windows系统内核源代码研究

引导序号引导过程引导执行代码位数目标文件名称1.         主引导代码(Master Boot Record (MBR)code),主要寻找活动分区,然后读入引导扇区代码16位执行代码reactos/boot/freeldr/bootsect/dosmbr.asm2.         引导扇区代码,主要寻找根据的引导程序,这里主要寻找freeldr.sys。16位执行代

奋斗不止500年 3个月前 上传183   0

$GetMessage-PeekMessage-SendMessage内核解析

最近忙公司的项目(或是毕设吧),发现很长时间没有总结了。是该换换脑子了。“为什么没有SendThreadMessage呢?”这个问题,就来自自己平时实现的一些程序逻辑中。在一些具体的场景中,对像我这样的初学者来说,往往喜欢通过windwos的消息机制来完成UI线程和worker线程之间的同步,而不是去通过信号量或其他的去做。所以,这个问题一直困惑了自己很久。而现在,就来搞明白这个、googl

奋斗不止500年 3年前 上传296   0

linux与windows 编程区别

linux windows 编程的区别 如果一个程序员从来没有在linux,unix下开发过程序,一直在windows下面开发程序, 同样是工作10年, 大部分情况下与在linux,unix下面开发10年的程序员水平会差别很大。我写这篇文章并不是想贬低windows下面开发的人,做windows开发的人看了可能会感觉不舒服,我并不是这个意思,我只是说说我自己的感受,我最早开始学习编程也是在wi

g***7 7年前 上传2610   0

windows实训报告

实训是教学工作的重要环节,是课堂理论教学的检验和延续,是培养学生实践技能的重要场所。通过实训,使学生能够完成企业windows服务器的配置、管理与维护。通过实际操作,使学生掌握一定的操作技能,能认真、细致、准确的操作。通过实践过程,培养学生独立思考、独立工作的能力及团队协作精神。

带***识 3年前 上传2055   0

情景领导

简单的一句话就是,在领导或管理公司、团队时,不能用一成不变的方法,而要随情况或环境的改变而不断调整。核心是领导者的管理模式或风格一定要因人而宜,最终要适应跟随者的行为,强调变化下的管理创新。   那么具体如何执行呢?就是准确判断下属在执行某一项任务时所表现出的能力及意愿(包括信心和动力),通常叫做状态,进而选择最适合下属的的领导模式。特别一提的是,状态是一个变量,不同的员工即便同一员工,在执

z***n 13年前 上传12297   0

学习笔记

日期:2014-4-23 笔记内容: 《关于加强“五一”节日期间廉洁自律工作的通知》 一、抓好节日廉洁自律教育。各支部要加强党风廉政建设形势任务教育,引导党员干部绷紧廉洁自律这根弦,严格落实中央八项规定精神。 二、严格执行廉洁自律规定。领导干部要以身作则、率先垂范,严格执行企业各项规定。 三、加强监督检查。对顶风违纪的领导干部,一经发现,从严查处,并按照党风廉政建设责任制的规定,追究有

z***8 10年前 上传8443   0

学习笔记

学习笔记 六五普法的内容、指导思想和主要目标 2011年5月23日国家发展改革委今天在北京召开;国家发展改革委主任张平说,“五五”普法期间,各级;张平强调,国家发展改革委已经根据全国“六五”普法;中央宣传部副部长申维辰,司法部副部长、全国普法办;六五普法内容是什么;“六五”普法规划中加强社会主义法治理念教育,继续;六五普法的指导思想和主要目标;根据全面落实依法治国基本 五普法的内容、指导思

1***阳 5年前 上传1197   0

情景教学在初中语文写作教学中的运用分析

情景教学在初中语文写作教学中的运用分析摘要:写作是语文教学中重要的环节,运用情景教学模式可以有效的提高写作教学的质量,提高学生的写作能力。本文基于情景教学在初中语文写作教学中的运用进行分析,首先分析了情景教学的含义,然后分析了情景教学在初中语文写作教学中的误区,最后分析了情景教学在初中语文写作教学中的实施策略,从课堂导入,激发学生的学习兴趣、创设生活情景,贴近学生的生活、注重联想,展开讨论三

橘子小小 3年前 上传701   0

Windows操作系统及其应用

Windows操作系统及其应用一. Windows操作系统的若干常识1、 Windows操作系统的主要功能是_B_____。A.实现软、硬件转换B.管理系统所有的软、硬件C.把源程序转换为目标程序D.进行数据处理 [解析]操作系统属于系统软件,它的主要功能是:管理系统所有的软件和硬件资源。2、 Windows XP 系统是___C___。(请看解析)

豆***2 4年前 上传801   0

博客情景剧

诙谐幽默版情景剧(自编、想导、无人演,自演又怕丢人现眼。话不多说,马上呈现!) 开场温情提醒:患有严重“进行性腹肌功能不全者”莫入!笑点低者备足“特效药物”后方入!!爱美人士者慎入,皱纹增生不负担青春损失费!!! 温馨提示:愈看此剧者,请先自备“舒筋止痛”药物,如不幸突发“腹肌痉挛”请速拨打“120”!所支付相关费用暂挂“暂付款项”,完全康复后由本姑娘清理结算一次性“冲账”。不好!本姑娘“职

默***版 12年前 上传11489   0

论语学习笔记

论语学习笔记  子谓公冶长:“可妻也。虽在缧绁之中,非其罪也。”以其子妻之。  孔子在这段话中,谈到了看待他人的标准。这里的“缧绁”原来意思是捆绑犯人的绳子,在此代指监狱。传说公冶长虽然家庭并不富裕,却十分有才能,甚至懂得鸟语。这样一个身负奇才的能人,却不知为什么锒铛入狱。作为公冶长的老师,孔子了解他的为人,认为这黑锅并不应该由他来背,“非其罪也”。但别说是古代,就算是现在,人们只要一得

c***1 10年前 上传670   0

java学习笔记

java学习笔记  jdk(java development kit)  有如下公司或组织开发jdk  sun jdk  ibm jdk  bea jrocket  gun jdk  其中ibm的jdk包含的jvm(java virtual machine)运行效率要比sun jdk包含的jvm高出许多。而专门运行在x86平台的jrocket在服务端运行效率也要比su

4***3 10年前 上传577   0

党章学习笔记

党章学习笔记——**支部 *** 党章是我们党“最根本的党规党法“,是我们党全部活动的总章程,是每一名党员必须遵守的基本准则。每一名党员都要认真学习贯彻党章,要做学习贯彻党章的模范。一、学习贯彻党章,做理论武装头脑的模范。没有先进理论武装的党,就不是先进的政党;没有先进理论武装的共产党员,也不可能发挥先锋战士的作用。党要保持先进性,就必须不断加强理论建设。作为一名共产党员,只有坚持用科

文***2 4年前 上传915   0

数学教学:创设有效问题情景 促进学生自主学习

创设有效问题情景  促进学生自主学习 _数学教学论文                      数学问题情景是学生掌握知识、形成能力的重要源泉,它能促使学生积极主动地去想象、思考、探索,去解决问题或发现规律,并可伴随一种积极的情感体验。我们在数学教学中,应该联系实际,运用多种方式创设有效的问题情景,激发学生的学习兴趣,促进学生自主学习。    一、创设趣味性问题情景,引发学生学习的兴趣

Z***3 13年前 上传13775   0

献血情景剧

献血情景剧     献血情景剧场景:献血站内,工作人员都在忙碌着。一个小女孩和她的妈妈出现了。女孩:妈妈,今天是我18岁的生日,我想做一件有意义的事情来作为我的成人礼物。妈妈:孩子,你的想法很好,我非常支持,那什么事情最有意义呢?女孩:妈妈,您看,那边有个献血站,我想献血。妈妈:孩子,一袋血有可能拯救一个人的生命,没有什么比这更有意义了。我支持你。妈妈陪同孩子来登上爱

粒***丽 11年前 上传878   0

校园情景剧(转弯)

  校园情景剧-----转弯 故事大纲   本剧讲述的是一位大家公认的好学生,遭受到学习上的挫折,信心发生动摇,由于害怕成绩退步,失去老师和同学的喜爱,于是想借考试作弊,继续维持好学生的假象,幸好老师及时发现,在老师和同学们的帮助下,终于使主人公的错误观念发生了转变…… 角色 :班长:男,相貌堂堂,郝小明        副班长:女,乖巧听话        学习委员:男,绰号四眼田鸡

情***剧 9年前 上传7279   0

高三英语情景写作指南

高三英语情景写作指南书面表达Good Writers:1. 2. 3. 4.TIPS:●多动笔●多做审题审图训练,●背诵范文●积累一定量的短语、习惯表达法和精彩句式高考情景作文(集体活动类)一、审题1.确定时态。通常以过去时为主,过去进行时为辅。感言部分用现在时态。2.把握基本信息:时间、地点、人物、事件、目的/原因3.确定每图的主要内容:先用

x***i 11年前 上传471   0

java学习心得笔记

java学习心得笔记  j2ee学习笔记   注:框架可以用word菜单中的 “视图/文档结构图” 看到   j2ee模式   value object(值对象) 用于把数据从某个对象/层传递到其他对象/层的任意java对象。   通常不包含任何业务方法。   也许设计有公共属性,或者提供可以获取属性值的get方法。   jsp   1.jsp的基础知识   

旺***5 9年前 上传501   0

十九大报告学习笔记

国特色社会主义进入新时代 我国社会主要矛盾变化 ★ 新时代五个定位 ★ 1、是承前启后、继往开来、在新的历史条件下继续夺取中国特色社会主义伟大胜利的时代。 2、是决胜全面建成小康社会、进而全面建设社会主义现代化强国的时代。 3、是全国各族人民团结奋斗、不断创造美好生活、逐步实现全体人民共同富裕的时代。 4、是全体中华儿女勠力同心、奋力实现中华民族伟大复兴中国梦的时代。 5、是我国日益走近世界舞台中央、不断为人类作出更大贡献的时代。

q***0 5年前 上传2225   0

机关党员学习笔记

机关党员学习笔记 学习时间:2016年1月29日 学习地点:中心会议室 参与人员:中心机关党员 学习内容:中共中央关于全面深化改革若干重大问题的决定 九、推进法治中国建设 1、维护宪法法律权威。宪法是保证党和国家兴旺发达、长治久安的根本法,具有最高权威。普遍建立法律顾问制度。完善规范性文件、重大决策合法性审查机制。 2、深化行政执法体制改革。 3、确保依法独立公正行使审判权检察权

a***5 6年前 上传5219   0

电气试验工学习笔记

电气试验工学习笔记 师傅姓名 姚秀丽 时间 月  日  点  分--   月  日  点  分 课题   地点   一、我公司四个总降变电所电网进线共9台主变。一总降两台,主变容量都是31500KVA,一台压降从11万伏降至6KV,另一台从11万伏降至18.2KV。二总降两台主变,主变容量都是31500KVA,压降都是从11万伏降至6KV。三总降两台主变,一台主变容量12万

y***3 11年前 上传11342   0

C#学习笔记

虚方法的重写用override ,普通方法的重写(也叫重载)用new。2.静态方法通过类来使用。3.用对象调用虚方法

张***1 6年前 上传1257   0

数学教学学习笔记

数学教学学习笔记  既然把老师做为自己的终身职业,就要努力成为一名好的教师。树立以人为本的教育理念,关注学生的全面成长,站在受教育者的立场思考教育,让孩子愿意学习,凸现尊重学生的教育思想。让学生主动探索答案,注重学生探究的过程、思考的过程,让学生在学习活动中积累经验、提升认识、增长智慧。课堂教学因为有学生参与,重点是要处理好预设与生成的关系帮助学生理清思路;培养学生的归纳能力和帮助学生积累活

c***1 12年前 上传567   0

党员教师学习笔记

党员教师学习笔记  党中央坚持以邓小平理论和“xxxx”思想为指导,根据新的发展要求,集中全党智慧,提出了“以人为本、全面协调”可持续发展的科学发展观。xx大一致同意将科学发展观纳入党章。体现了全党的意志,更体现了民心、民意。作为一名党员,刚刚走上教学岗位,如何在本职岗位践行科学发展观,体现共产党员的先进性呢?本人认为应该从以下几方面做起:  1.要不断学习政治理论和教育教学理念、技术,

话***子 11年前 上传444   0

理论学习笔记

时间:2014年10月28日 内容:关于进一步加强廉政教育防控工作的通知 一、积极推进廉政宣传教育工作。要深入贯彻公安部纪委《关于进一步加强公安机关反腐倡廉宣传教育工作的通知》,结合深入开展的“增强党性、严守纪律、廉洁从政”专题教育,突出教育引导广大民警严守政治纪律,严守组织纪律,严守法律法规,严守人民警察的各项纪律规定,坚决做到服从命令、听从指挥、令行禁止,确保政令、警令畅通。要突出抓

车***1 9年前 上传7970   0