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


    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位执行代码r...

    2个月前   
    159    0

    $GetMessage-PeekMessage-SendMessage内核解析

    最近忙公司的项目(或是毕设吧),发现很长时间没有总结了。是该换换脑子了。“为什么没有SendThreadMessage呢?”这个问题,就来自自己平时实现的一些程序逻辑中。在一些具体的场景中,对...

    3年前   
    290    0

    linux与windows 编程区别

    linux windows 编程的区别 如果一个程序员从来没有在linux,unix下开发过程序,一直在windows下面开发程序, 同样是工作10年, 大部分情况下与在linux,unix...

    7年前   
    2605    0

    windows实训报告

    实训是教学工作的重要环节,是课堂理论教学的检验和延续,是培养学生实践技能的重要场所。通过实训,使学生能够完成企业windows服务器的配置、管理与维护。通过实际操作,使学生掌握一定的操作技能,能...

    3年前   
    2024    0

    情景领导

    简单的一句话就是,在领导或管理公司、团队时,不能用一成不变的方法,而要随情况或环境的改变而不断调整。核心是领导者的管理模式或风格一定要因人而宜,最终要适应跟随者的行为,强调变化下的管理创新。 ...

    13年前   
    12289    0

    学习笔记

    日期:2014-4-23 笔记内容: 《关于加强“五一”节日期间廉洁自律工作的通知》 一、抓好节日廉洁自律教育。各支部要加强党风廉政建设形势任务教育,引导党员干部绷紧廉洁自律这根弦,严格...

    10年前   
    8438    0

    学习笔记

    学习笔记 六五普法的内容、指导思想和主要目标 2011年5月23日国家发展改革委今天在北京召开;国家发展改革委主任张平说,“五五”普法期间,各级;张平强调,国家发展改革委已经根据全国“六五...

    5年前   
    1190    0

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

    情景教学在初中语文写作教学中的运用分析摘要:写作是语文教学中重要的环节,运用情景教学模式可以有效的提高写作教学的质量,提高学生的写作能力。本文基于情景教学在初中语文写作教学中的运用进行分析,首...

    3年前   
    691    0

    Windows操作系统及其应用

    Windows操作系统及其应用一. Windows操作系统的若干常识1、 Windows操作系统的主要功能是_B_____。A.实现软、硬件转换B.管理系统所有的软、硬件C.把源程序转换为目标...

    4年前   
    790    0

    博客情景剧

    诙谐幽默版情景剧(自编、想导、无人演,自演又怕丢人现眼。话不多说,马上呈现!) 开场温情提醒:患有严重“进行性腹肌功能不全者”莫入!笑点低者备足“特效药物”后方入!!爱美人士者慎入,皱纹增生...

    12年前   
    11476    0

    java学习笔记

    java学习笔记  jdk(java development kit)  有如下公司或组织开发jdk  sun jdk  ibm jdk  bea jrocket  gun jdk  其中ib...

    10年前   
    571    0

    论语学习笔记

    论语学习笔记  子谓公冶长:“可妻也。虽在缧绁之中,非其罪也。”以其子妻之。  孔子在这段话中,谈到了看待他人的标准。这里的“缧绁”原来意思是捆绑犯人的绳子,在此代指监狱。传说公冶长虽然家庭并...

    10年前   
    649    0

    党章学习笔记

    党章学习笔记——**支部 *** 党章是我们党“最根本的党规党法“,是我们党全部活动的总章程,是每一名党员必须遵守的基本准则。每一名党员都要认真学习贯彻党章,要做学习贯彻党章的模范。一、学...

    4年前   
    897    0

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

    创设有效问题情景  促进学生自主学习 _数学教学论文                      数学问题情景是学生掌握知识、形成能力的重要源泉,它能促使学生积极主动地去想象、思考、探索...

    13年前   
    13766    0

    老党员发挥余热 提升偏坡文化内核

    “老主席,区委组织部到你家来采访了,请问你现在在家不?”,“我还在下院村参加老年协会活动,今天恐怕要忙到下午才能回来,你请他们明天来吧。”

    3年前   
    491    0

    献血情景剧

    献血情景剧     献血情景剧场景:献血站内,工作人员都在忙碌着。一个小女孩和她的妈妈出现了。女孩:妈妈,今天是我18岁的生日,我想做一件有意义的事情来作为我的成人礼物。妈妈:孩子,你的想法很...

    11年前   
    868    0

    校园情景剧(转弯)

      校园情景剧-----转弯 故事大纲   本剧讲述的是一位大家公认的好学生,遭受到学习上的挫折,信心发生动摇,由于害怕成绩退步,失去老师和同学的喜爱,于是想借考试作弊,继续维持好学生的...

    9年前   
    7267    0

    高三英语情景写作指南

    高三英语情景写作指南书面表达Good Writers:1. 2. 3. 4.TIPS:●多动笔●多做审题审图训练,●背诵范文●积累一定量的短语、习惯表达法和精彩句式高考情景作文(集体活动类)一...

    11年前   
    467    0

    十九大报告学习笔记

    国特色社会主义进入新时代 我国社会主要矛盾变化 ★ 新时代五个定位 ★ 1、是承前启后、继往开来、在新的历史条件下继续夺取中国特色社会主义伟大胜利的时代。 2、是决胜全面建成小康社会、进而全面建...

    5年前   
    2216    0

    机关党员学习笔记

    机关党员学习笔记 学习时间:2016年1月29日 学习地点:中心会议室 参与人员:中心机关党员 学习内容:中共中央关于全面深化改革若干重大问题的决定 九、推进法治中国建设 1、维护...

    6年前   
    5213    0

    文档贡献者

    奋斗不止500年

    贡献于2021-07-11

    下载需要 10 香币 [香币充值 ]
    亲,您也可以通过 分享原创文档 来获得香币奖励!
    下载文档

    该用户的其他文档