加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

reactos操作系统实现(82)

发布时间:2020-12-15 05:00:49 所属栏目:百科 来源:网络整理
导读:在 I/O 管理最后阶段,就是加载系统所有动态连接库,比如加载 NTDLL 动态连接库,具体实现代码如下: #001 NTSTATUS #002 NTAPI #003 PsLocateSystemDll(VOID) #004 { #005 OBJECT_ATTRIBUTES ObjectAttributes; #006 IO_STATUS_BLOCK IoStatusBlock; #007 H

I/O管理最后阶段,就是加载系统所有动态连接库,比如加载NTDLL动态连接库,具体实现代码如下:

#001 NTSTATUS

#002 NTAPI

#003 PsLocateSystemDll(VOID)

#004 {

#005 OBJECT_ATTRIBUTES ObjectAttributes;

#006 IO_STATUS_BLOCK IoStatusBlock;

#007 HANDLE FileHandle,SectionHandle;

#008 NTSTATUS Status;

#009 ULONG_PTR HardErrorParameters;

#010 ULONG HardErrorResponse;

#011

加载NTDLL动态连接库。

#012 /* Locate and open NTDLL to determine ImageBase and LdrStartup */

#013 InitializeObjectAttributes(&ObjectAttributes,

#014 &PsNtDllPathName,

#015 0,

#016 NULL,

#017 NULL);

打开NTDLL动态连接库文件。

#018 Status = ZwOpenFile(&FileHandle,

#019 FILE_READ_ACCESS,

#020 &ObjectAttributes,

#021 &IoStatusBlock,

#022 FILE_SHARE_READ,

#023 0);

#024 if (!NT_SUCCESS(Status))

#025 {

#026 /* Failed,bugcheck */

#027 KeBugCheckEx(PROCESS1_INITIALIZATION_FAILED,Status,2,0);

#028 }

#029

检查这个文件映射是否有效。

#030 /* Check if the image is valid */

#031 Status = MmCheckSystemImage(FileHandle,TRUE);

#032 if (Status == STATUS_IMAGE_CHECKSUM_MISMATCH)

#033 {

#034 /* Raise a hard error */

#035 HardErrorParameters = (ULONG_PTR)&PsNtDllPathName;

#036 NtRaiseHardError(Status,

#037 1,

#038 1,

#039 &HardErrorParameters,

#040 OptionOk,

#041 &HardErrorResponse);

#042 return Status;

#043 }

#044

NTDLL创建一段空间。

#045 /* Create a section for NTDLL */

#046 Status = ZwCreateSection(&SectionHandle,

#047 SECTION_ALL_ACCESS,

#048 NULL,

#049 NULL,

#050 PAGE_EXECUTE,

#051 SEC_IMAGE,

#052 FileHandle);

#053 ZwClose(FileHandle);

#054 if (!NT_SUCCESS(Status))

#055 {

#056 /* Failed,bugcheck */

#057 KeBugCheckEx(PROCESS1_INITIALIZATION_FAILED,3,0);

#058 }

#059

增加这个段引用。

#060 /* Reference the Section */

#061 Status = ObReferenceObjectByHandle(SectionHandle,

#062 SECTION_ALL_ACCESS,

#063 MmSectionObjectType,

#064 KernelMode,

#065 (PVOID*)&PspSystemDllSection,

#066 NULL);

#067 ZwClose(SectionHandle);

#068 if (!NT_SUCCESS(Status))

#069 {

#070 /* Failed,bugcheck */

#071 KeBugCheckEx(PROCESS1_INITIALIZATION_FAILED,4,0);

#072 }

#073

调用函数PspMapSystemDll来映射这个DLL到内核里。

#074 /* Map it */

#075 Status = PspMapSystemDll(PsGetCurrentProcess(),&PspSystemDllBase,FALSE);

#076 if (!NT_SUCCESS(Status))

#077 {

#078 /* Failed,bugcheck */

#079 KeBugCheckEx(PROCESS1_INITIALIZATION_FAILED,5,0);

#080 }

#081

#082 /* Return status */

#083 return Status;

#084}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读