创建实例

179 篇文章 0 订阅
86 篇文章 0 订阅
这篇博客详细介绍了如何创建CDirectory对象以及IRtlDirectoryTearoff实例的过程,包括内存分配、构造函数调用、接口初始化等步骤。通过对CRtlObjectTypeDescription和CRtlOneShotTypeDescriptionInit函数的分析,揭示了对象创建和接口实现的内部机制。
摘要由CSDN通过智能技术生成

创建实例


创建实例,CreateInstance 完成了所有构件的装配工作。当然,还有一个更高层的函数,CRtlOneShotTypeDescriptionInit,即100F2350不过,在那个函数中已经看不到任何有用的内容,只是对这个函数进行了进一步的封装。

//----- (100F2202)--------------------------------------------------------
int __thiscall CRtlObjectTypeDescription<CDirectory>::

CreateInstance<CDirectory_IRtlDirectoryTearoff,CreateFileSource,IRtlDirectory>(volatilesigned __int32 *this,

// a2 用于 CDirectory 初始化

const structCreateFileSource *a2,

_DWORD *a3

)
{

  v3 =this;
  v15 =this;
  v21 =C00000E5;

  v4 = CRtlObjectTypeDescription<CDirectory>::Initialize(this);

  v5 = 0;
  v16 =0;
// CDirectory 对象分配了 13 个字段

  v6 = (CDirectory*)operatornew((void *)0x34);

// 构造函数 100F337D
// 就是 CDirectory 对象的地址

  v5 = CDirectory::CDirectory(v6);

// 初始化,就是用 CreateXXXSource 作为第一个参数,创建接口,见101156E6

// 因此,创建源就是虚函数地址对象。

// 在这一步还要进行基类 CSystemObject 的初始化

// 对象的初始化,完成创建接口IRtlFileSystemProvider 和 IRtlObjectProvider,从创// 建源中复制路径,并保证路径是以 \ 结尾,没有则加上。

  v4 = CDirectory::Initialize( (CDirectory *)v5,  a2);

// 把 CDirectory对象的地址放到 +2 处

  *(_DWORD *)(v5 + 8) = v5;

 

// 把 CRtlObjectTypeDescription的值放到 +3 处,就是 2

  *(_DWORD *)(v5 + 12) = v3;

// 创建 IRtlDirectoryTearoff 对象

//  有三个字段

  Auto<CRtlTearoffObject<CDirectory_IRtlDirectoryTearoff> *>::Allocate(&v16)
  v10 =v16;

 

//把 CDirectory对象的地址放到 +1 处
  *(_DWORD *)(v16 + 4) = v5;

// 这一步是干什么,是释放,还是增加计数?
  v11 =*(void(__thiscall **)(int))(*(_DWORD *)v5 + 4);
  __guard_check_icall_fptr(*(_DWORD *)(*(_DWORD *)v5 + 4));
  v11(v5);

// IRtlDirectory Tearoff 对象 +2 的地址返回

  *a3 =v10 + 8;
  CBaseFrame<

CVoidRaiseFrame>::SetCanonicalSuccess(&v21);
  return v21;
}

 

 


//----- (100F2350)--------------------------------------------------------
int __stdcallCRtlOneShotTypeDescriptionInit<CDirectory>::CreateInstance<

CDirectory_IRtlDirectoryTearoff,CreateFileSource,IRtlDirectory>(

const struct CreateFileSource *a1,

volatile signed __int32 *a2)
{

  result =CRtlOneShotTypeDescriptionInit<CDirectory>::Initialize(a2);
  v3 =(volatile signed __int32*)CRtlOneShotTypeDescriptionInit<CDirectory>::TypeDescription();
  result =CRtlObjectTypeDescription<CDirectory>::CreateInstance

<CDirectory_IRtlDirectoryTearoff,CreateFileSource,IRtlDirectory>(
               v3,
               a1,
               a2);
  return result;
}

0056be78 cccccccc c6d729b1

 

+1 是 CDirectory 对象

+2 的值有问题。那么,是否要有先决条件,初始化 IRtlDirectory::`vftable' 虚函数地址。

因此,直接调用

 

创建IRtlDirectory Tearoff 对象

//----- (100F386D)--------------------------------------------------------
_DWORD *__thiscall Auto<CRtlTearoffObject<CDirectory_IRtlDirectoryTearoff> *>::Allocate(_DWORD *this)
{

  v1 =this;
  result =RtlAllocateHeap(*(HANDLE *)(__readfsdword(48) + 24), 0, 0xCu);

// 10004724: int (__thiscall *CRtlTearoffObject<CCdfGenericTableEnumeratorTearoff<CCdfDefIdTableEnumerator>>::`vftable'{for`CRtlTearoffBase<CCdfDefIdTableEnumerator>'})(PVOID Address, char);
    *result= &CRtlTearoffObject<

CCdfGenericTableEnumeratorTearoff<CCdfDefIdTableEnumerator>>

::`vftable'{for`CRtlTearoffBase<CCdfDefIdTableEnumerator>'};


// 100044FC: void *IRtlDirectory::`vftable';
    result[2] = &IRtlDirectory::`vftable';


// 100044B0: int(*CRtlTearoffObject<CDirectory_IRtlDirectoryTearoff>::`vftable'{for`IRtlDirectory'})();
    result[2] = &CRtlTearoffObject<CDirectory_IRtlDirectoryTearoff>

::`vftable'{for `IRtlDirectory'};

  *v1= result;
  return result;
}

//----- (100FCE80)--------------------------------------------------------
int__thiscall CRtlTearoffObject<CDirectory_IRtlDirectoryTearoff>

::Release(_DWORD *this)
{
  return
CRtlObjectTypeDescription<CDirectory>

::ReleaseTearoff<CRtlInnerObjectTearoffImpl<CDirectory>>(
           *(_DWORD **)(*(this -1) + 12),
           (_DWORD**)this- 2,
           (_DWORD**)*(this- 1));
}

 

//----- (10113B91)--------------------------------------------------------
signed int__stdcall CRtlObjectTypeDescription<CDirectory>

::CreateTearoff<CDirectory_IRtlDirectoryTearoff,IRtlObject>(

int a1,

int *a2)
{

  v2 =0;
  v12 =C00000E5;
  v7 =0;
  Auto<CRtlTearoffObject<CDirectory_IRtlDirectoryTearoff>*>::Allocate(&v7)
 
    v4 =v7;
    *(_DWORD *)(v7 + 4) = a1;
    v5 =*(void(__thiscall **)(int))(*(_DWORD *)a1 + 4);
    __guard_check_icall_fptr(v5);
    v5(a1);
    v7 =0;
    if (v4 )
      v2 =v4 + 8;
    *a2= v2;
    CBaseFrame<CVoidRaiseFrame>::SetCanonicalSuccess(&v12);
    Auto<CRtlTearoffObject<CRtlInnerObjectTearoffImpl<CUserProfile>>*>::~Auto<CRtlTearoffObject<CRtlInnerObjectTearoffImpl<CUserProfile>>*>(&v7);
    v3 =v12;

  returnv3;
}

Oracle创建实例的步骤如下: 1. 安装Oracle数据库软件。 2. 创建Oracle实例的参数文件(init.ora)。 3. 启动Oracle实例。 4. 创建数据库。 5. 修改数据库参数。 6. 创建表空间和用户。 7. 创建表和索引。 下面是每个步骤的详细说明: 1. 安装Oracle数据库软件 首先需要下载并安装Oracle数据库软件。安装过程中需要选择安装类型(如标准版、企业版等)和安装路径等选项。 2. 创建Oracle实例的参数文件(init.ora) 参数文件包含了Oracle实例的配置信息,如数据库名称、监听端口号、内存大小、日志文件路径等。可以手动创建参数文件,也可以使用Oracle提供的模板文件进行修改。 3. 启动Oracle实例 启动Oracle实例需要使用Oracle提供的启动脚本(如startup.sh或startup.bat)。在启动过程中会读取参数文件,初始化实例创建必要的进程。 4. 创建数据库 创建数据库需要使用Oracle提供的创建数据库脚本(如createdb.sql)。在创建过程中需要指定数据库名称、字符集、语言等选项。 5. 修改数据库参数 修改数据库参数可以通过修改参数文件或使用Oracle提供的动态修改命令(如ALTER SYSTEM SET)来实现。修改的参数包括数据库缓存大小、日志文件大小、最大连接数等。 6. 创建表空间和用户 创建表空间用于存储数据表和索引,创建用户用于访问数据库。可以使用Oracle提供的CREATE TABLESPACE和CREATE USER命令来创建表空间和用户。 7. 创建表和索引 创建表和索引需要使用CREATE TABLE和CREATE INDEX命令。在创建表和索引时需要指定表空间、列名、数据类型等信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值