breeze916
驱动牛犊
驱动牛犊
  • 注册日期2009-01-14
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分35分
  • 威望271点
  • 贡献值1点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1237回复:1

socket函数为什么是 "return -(int)s;"

楼主#
更多 发布于:2009-02-17 17:26
httpdisk source code中的socket函数:

int __cdecl socket(int af, int type, int protocol)
{
    PSOCKET s;
    if (af != AF_INET ||
       (type != SOCK_DGRAM && type != SOCK_STREAM) ||
       (type == SOCK_DGRAM && protocol != IPPROTO_UDP && protocol != 0) ||
       (type == SOCK_STREAM && protocol != IPPROTO_TCP && protocol != 0)
       )
    {
        return STATUS_INVALID_PARAMETER;
    }
    s = (PSOCKET) ExAllocatePool(NonPagedPool, sizeof(SOCKET));
    if (!s)
    {
        return STATUS_INSUFFICIENT_RESOURCES;
    }
    RtlZeroMemory(s, sizeof(SOCKET));
    s->type = type;
    s->addressHandle = (HANDLE) -1;
    return -(int)s; //why -s ?
}

申请了一块非分页的buffer, size为sizeof(SOCKET),
buffer的地址s应该是在kernel 空间, 也就是s >= 0x80000000

但为什么返回是 - (int) s, 那么此时s < =0x80000000, 也就是s位于user 空间。

可是此时s的新地址上并不是我们分配的空间啊?

难道是在调用ExAllocatePool(NonPagedPool, sizeof(SOCKET))时,系统实际上是映射向user空间的?

请高手解释!
学好驱动
breeze916
驱动牛犊
驱动牛犊
  • 注册日期2009-01-14
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分35分
  • 威望271点
  • 贡献值1点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2009-02-17 18:00
期待强人解答。
学好驱动
游客

返回顶部