繁体   English   中英

指针分配将指针从64位截断为32位

[英]Pointer assignment truncates the pointer from 64bit to 32bit

我一直在尝试以likewise-open方式修改一段代码,并且在这里完全陷入了困境。

一些背景

处理此文件 ,尝试围绕一些LDAP查询进行编码:

typedef void *MYH;
typedef MYH HANDLE;

HANDLE hDirectory = NULL;     
hDirectory = LsaDmpGetLdapHandle(pConn);

LsaDmpGetLdapHandle() 在这里定义

typedef void *MYH;
typedef MYH HANDLE;

HANDLE
LsaDmpGetLdapHandle(
    IN PLSA_DM_LDAP_CONNECTION pConn
    )
  {
    return pConn->hLdapConnection;
  }

其中PLSA_DM_LDAP_CONNECTION是以下struct typedef

struct _LSA_DM_LDAP_CONNECTION
  {
  ...
    // NULL if not connected
    HANDLE hLdapConnection;
  ...
  };

基本上,到处都有HANDLE类型。

注意 :为了避免各种*.h文件定义不同,我添加了typedef void *MYH; 在两个文件中

麻烦

LsaDmpGetLdapHandle返回的LsaDmpGetLdapHandle分配hDirectory的行之后,代码将崩溃,而我尝试进一步使用hDirectory

到目前为止,我已调试的内容

在GDB连接, hLdapConnectionpConn是:

(gdb) p pConn->hLdapConnection
$5 = (void *) 0x7feb939d6390

但是, hDirectory是:

(gdb) p hDirectory
$6 = (void *) 0xffffffff939d6390

分配后,我不明白为什么会有所不同?

另外,需要注意的939d6390 ,两个指针地址中的939d6390是通用的。

有趣的是,这两种方法都有效

// If I pass hDirectory reference
LsaDmLdapGetHandle(pConn, &hDirectory);

// where this function is defined as, in the other file:
DWORD
LsaDmLdapGetHandle(
    IN PLSA_DM_LDAP_CONNECTION pConn,
    OUT HANDLE* phDirectory)
{
  HANDLE hDirectory = NULL;
  hDirectory = LsaDmpGetLdapHandle(pConn);
  *phDirectory = hDirectory;
  return ERROR_SUCCESS;
}

// Or I call another function, which then call LsaDmpGetLdapHandle(), in the other file
hDirectory = LsaDmLdapGetHandleCopy(pConn);
HANDLE
LsaDmLdapGetHandleCopy(
    IN PLSA_DM_LDAP_CONNECTION pConn)
{
  HANDLE hDirectory = NULL;
  hDirectory = LsaDmpGetLdapHandle(pConn);
  return hDirectory;
}

我认为,可能与这两个文件中的HANDLE定义不同有关,因此我在两个文件中都添加了自己的void *定义

看起来像这个

默认情况下,所有返回值均为int。 因此,如果缺少函数原型,则编译器会将返回值视为32位,并为32位返回值生成代码。 那就是当您的高4个字节被截断时。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM