ACE初始化

 

ACE初始化

ACE_Init_ACE

 

class ACE_Export ACE_Init_ACE

{

public:

  /**

   * 这个类实现了初始化和关闭ACE,每个ACE程序只需调用一次

   * @return Returns 0 on success, -1 on failure, and 1 if it had already been

   * called.

   */

  static int init (void);

 

  /**

l       关闭ACE库服务,每个ACE程序只需调用一次

l          * @return Returns 0 on success, -1 on failure, and 1 if it had already been

   * called.

   */

  static int fini (void);

 

private:

  /** 引用记数

   * Counter to match <init()>/<fini()> calls.  <init()> must increment it;

   * <fini()> must decrement it.  <fini()> then does nothing until it

   * reaches 0.

   */

  static unsigned int init_fini_count_;

};

 

 

CPP实现文件

 

int

ACE_Init_ACE::init (void)

{

  // 不要使用ACE_TRACE, 因为Object_Manager 还没有实例化

  // ACE_TRACE ("ACE_Init_ACE::init");

 

  ++init_fini_count_;

 // 使用ACE_Object_Manager静态实例对象初始化

  return ACE_Object_Manager::instance ()->init ();

}

 

int

ACE_Init_ACE::fini (void)

{

  ACE_TRACE ("ACE_Init_ACE::fini");

 

  if (init_fini_count_ > 0)

    {

if (--init_fini_count_ == 0)

// 当记数为0,使用ACE_Object_Manager静态实例对象清除

        return ACE_Object_Manager::instance ()->fini ();

      else

        // Wait for remaining fini () calls.

        return 1;

    }

  else

    // More ACE_Init_ACE::fini () calls than ACE_Init_ACE::init () calls.  Bad

    // application!

    return -1;

}

 

 

ACE的静态对象管理宏定义

ACE_HAS_NONSTATIC_OBJECT_MANAGER

 

 

 

看看宏静态宏定义,一开始是没有定义非静态对象管理的宏,接下来是定义ACE_MAIN_OBJECT_MANAGER宏,他是只是为了简化而已。

# if defined (ACE_HAS_NONSTATIC_OBJECT_MANAGER) && !defined (ACE_DOESNT_INSTANTIATE_NONSTATIC_OBJECT_MANAGER)

 

#   if !defined (ACE_HAS_MINIMAL_ACE_OS)

#     include "ace/Object_Manager.h"

#   endif /* ! ACE_HAS_MINIMAL_ACE_OS */

 

// Rename "main ()" on platforms that don't allow it to be called "main ()".

//这里说道ACE_Object_Managermain函数里的栈上实例化。

// Also, create ACE_Object_Manager static instance(s) in "main ()".

// ACE_MAIN_OBJECT_MANAGER defines the ACE_Object_Manager(s) that will

// be instantiated on the stack of main ().  Note that it is only used

// when compiling main ():  its value does not affect the contents of

// ace/OS.o.

// 如果没有定义ACE_MAIN_OBJECT_MANAGER,那么定义它

#   if !defined (ACE_MAIN_OBJECT_MANAGER)

// 这里的宏是定义两个静态对象实例

#     define ACE_MAIN_OBJECT_MANAGER /

        ACE_OS_Object_Manager ace_os_object_manager; /

        ACE_Object_Manager ace_object_manager;

#   endif /* ! ACE_MAIN_OBJECT_MANAGER */

 

// 这下面的是另一个针对PSOS操作系统的宏,不理它

#   if defined (ACE_PSOSIM)

// PSOSIM root lacks the standard argc, argv command line parameters,

// create dummy argc and argv in the "real" main  and pass to "user" main.

// NOTE: ACE_MAIN must be defined to give the return type as well as the

// name of the entry point.

#     define main /

ace_main_i (int, char *[]);                /* forward declaration */ /

ACE_MAIN ()   /* user's entry point, e.g., "main" w/out argc, argv */ /

{ /

  int argc = 1;                            /* dummy arg count */ /

  char *argv[] = {"psosim"};               /* dummy arg list */ /

  ACE_MAIN_OBJECT_MANAGER /

  int ret_val = -1; /* assume the worst */ /

  if (ACE_PSOS_Time_t::init_simulator_time ()) /* init simulator time */ /

  { /

    ACE_ERROR((LM_ERROR, "init_simulator_time failed/n"));  /* report */ /

  } /

  else /

  { /

    ret_val = ace_main_i (argc, argv);   /* call user main, save result */ /

  } /

  ACE_OS::exit (ret_val);                /* pass code to simulator exit */ /

} /

 

 

其他的宏定义WIN23

#     define main /

ace_main_i (int, char *[]);                  /* forward declaration */ /

int /

ACE_MAIN (int argc, char *argv[]) /* user's entry point, e.g., main */ /

{ /

  ACE_MAIN_OBJECT_MANAGER /

  return ace_main_i (argc, argv);           /* what the user calls "main" */ /

} /

int /

ace_main_i

#     if defined (ACE_WIN32)

#     define wmain /

ace_main_i (int, ACE_TCHAR *[]);                  /* forward declaration */ /

int /

ACE_WMAIN (int argc, ACE_TCHAR *argv[]) /* user's entry point, e.g., main */ /

{ /

  ACE_MAIN_OBJECT_MANAGER /

  return ace_main_i (argc, argv);           /* what the user calls "main" */ /

} /

 

 

 

所以console的程序里main函数

嵌入了下面两个对象

main()

{

ACE_OS_Object_Manager ace_os_object_manager;

ACE_Object_Manager ace_object_manager;

….

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Windows 操作系统中,安全描述符(Security Descriptor,简称 SD)是一种用于描述系统对象(如文件、文件夹、注册表项等)安全属性的数据结构。它包括了许多信息,如所有者、组、访问控制列表(Access Control List,简称 ACL)等。在使用 SD 时,需要先初始化一个 PSECURITY_DESCRIPTOR 结构体。 下面是一个 PSECURITY_DESCRIPTOR 结构体的定义: ```c typedef struct _SECURITY_DESCRIPTOR { UCHAR Revision; UCHAR Sbz1; SECURITY_DESCRIPTOR_CONTROL Control; PSID Owner; PSID Group; PACL Sacl; PACL Dacl; } SECURITY_DESCRIPTOR, *PSECURITY_DESCRIPTOR; ``` 其中,`Revision` 字段用于指定 SECURITY_DESCRIPTOR 结构体的版本号;`Control` 字段包含了一些标志位,例如是否启用了自相交的 ACL 等;`Owner` 和 `Group` 字段分别指定了对象的所有者和所属组;`Sacl` 和 `Dacl` 字段分别指定了系统访问控制列表和离散访问控制列表。 初始化一个 PSECURITY_DESCRIPTOR 结构体可以通过以下步骤: 1. 调用 `InitializeSecurityDescriptor` 函数初始化结构体: ```c PSECURITY_DESCRIPTOR pSD = (PSECURITY_DESCRIPTOR)LocalAlloc(LPTR, SECURITY_DESCRIPTOR_MIN_LENGTH); InitializeSecurityDescriptor(pSD, SECURITY_DESCRIPTOR_REVISION); ``` `InitializeSecurityDescriptor` 函数会初始化一个空的 SECURITY_DESCRIPTOR 结构体,其中 `SECURITY_DESCRIPTOR_REVISION` 是版本号。 2. 指定所有者和所属组。可以使用 `AllocateAndInitializeSid` 函数创建一个新的 SID 对象,并将其分配给所有者和所属组: ```c PSID pSidOwner = NULL; PSID pSidGroup = NULL; SID_IDENTIFIER_AUTHORITY sidAuth = SECURITY_NT_AUTHORITY; if (!AllocateAndInitializeSid(&sidAuth, 2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, &pSidOwner) || !AllocateAndInitializeSid(&sidAuth, 2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_USERS, 0, 0, 0, 0, 0, 0, &pSidGroup)) { LocalFree(pSD); return FALSE; } SetSecurityDescriptorOwner(pSD, pSidOwner, FALSE); SetSecurityDescriptorGroup(pSD, pSidGroup, FALSE); ``` 首先,使用 `AllocateAndInitializeSid` 函数创建了两个 SID,一个是管理员组的 SID,另一个是用户组的 SID。然后使用 `SetSecurityDescriptorOwner` 和 `SetSecurityDescriptorGroup` 分别将它们赋值给 SECURITY_DESCRIPTOR 结构体的 `Owner` 和 `Group` 字段。 3. 添加 ACL。可以使用 `InitializeAcl` 函数初始化 ACL,再使用 `AddAccessAllowedAce` 函数向 ACL 中添加 ACE: ```c PACL pAcl = NULL; EXPLICIT_ACCESS ea; DWORD dwRes = 0; if (AllocateAndInitializeSid(&sidAuth, 1, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_GUESTS, 0, 0, 0, 0, 0, 0, &ea.Trustee.ptstrName)) { ea.grfAccessPermissions = FILE_GENERIC_READ | FILE_GENERIC_WRITE; ea.grfAccessMode = SET_ACCESS; ea.grfInheritance = SUB_CONTAINERS_AND_OBJECTS_INHERIT; ea.Trustee.TrusteeForm = TRUSTEE_IS_SID; ea.Trustee.TrusteeType = TRUSTEE_IS_GROUP; dwRes = SetEntriesInAcl(1, &ea, NULL, &pAcl); if (dwRes != ERROR_SUCCESS) { LocalFree(pSD); FreeSid(pSidOwner); FreeSid(pSidGroup); return FALSE; } SetSecurityDescriptorDacl(pSD, TRUE, pAcl, FALSE); FreeSid(ea.Trustee.ptstrName); } ``` 这里使用了一个 `EXPLICIT_ACCESS` 结构体来描述 ACE。`Trustee` 字段是一个 TRUSTEE 结构体,用于指定 ACE 的主体。这里将它设置为了访客组的 SID。`grfAccessPermissions` 字段指定了 ACE 的访问权限,这里设置了读写权限。`grfAccessMode` 字段指定了 ACL 的修改方式,这里设置为了 SET_ACCESS,表示覆盖原有 ACE。`grfInheritance` 字段指定了 ACE 是否应该被继承到子对象。最后,使用 `SetEntriesInAcl` 函数将 ACE 添加到 ACL 中,然后使用 `SetSecurityDescriptorDacl` 函数将 ACL 赋值给 SECURITY_DESCRIPTOR 结构体的 `Dacl` 字段。 4. 释放资源。完成后需要释放先前分配的资源: ```c LocalFree(pSD); FreeSid(pSidOwner); FreeSid(pSidGroup); ``` 这里使用了 `LocalFree` 函数释放 SECURITY_DESCRIPTOR 对象,和 `FreeSid` 函数释放所有者、所属组和 ACE 的 SID。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值