⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 apis.c

📁 WinCE5.0部分核心源码
💻 C
📖 第 1 页 / 共 2 页
字号:
DestroyIniInterfaceHandleList(
    PINI_INTERFACE_HANDLE pIniInterfaceHandleList
    )
{
    PINI_INTERFACE_HANDLE pIniInterfaceHandle = NULL;
    PINI_INTERFACE_HANDLE pTemp = NULL;

    pIniInterfaceHandle = pIniInterfaceHandleList;

    while (pIniInterfaceHandle) {

        pTemp = pIniInterfaceHandle;
        pIniInterfaceHandle = pIniInterfaceHandle->pNext;

        (VOID) IniCloseDhcpV6InterfaceHandle(pTemp);
        FreeIniInterfaceHandle(pTemp);

    }
}


DWORD
CloseDhcpV6InterfaceHandle(
    HANDLE hInterface
    )
{
    DWORD dwError = 0;
    PINI_INTERFACE_HANDLE pIniInterfaceHandle = NULL;


    DhcpV6Trace(DHCPV6_IOCTL, DHCPV6_LOG_LEVEL_TRACE, ("Begin Closing Interfaces: Handle: %p", hInterface));

    ENTER_DHCPV6_SECTION();
    dwError = ValidateSecurity(
                  DHCPV6_OBJECT_SERVER,
                  SERVER_ACCESS_ADMINISTER,
                  NULL,
                  NULL
                  );
    LEAVE_DHCPV6_SECTION();
    BAIL_ON_WIN32_ERROR(dwError);

    AcquireExclusiveLock(gpDhcpV6IniInterfaceTblRWLock);

    dwError = GetIniInterfaceHandle(hInterface, &pIniInterfaceHandle);
    BAIL_ON_LOCK_ERROR(dwError);

    dwError = IniCloseDhcpV6InterfaceHandle(pIniInterfaceHandle);
    BAIL_ON_LOCK_ERROR(dwError);

    RemoveIniInterfaceHandle(
        pIniInterfaceHandle
        );

    FreeIniInterfaceHandle(pIniInterfaceHandle);

    ReleaseExclusiveLock(gpDhcpV6IniInterfaceTblRWLock);

    DhcpV6Trace(DHCPV6_IOCTL, DHCPV6_LOG_LEVEL_TRACE, ("End Closing Interfaces"));

    return (dwError);

lock:

    ReleaseExclusiveLock(gpDhcpV6IniInterfaceTblRWLock);

error:

    DhcpV6Trace(DHCPV6_IOCTL, DHCPV6_LOG_LEVEL_ERROR, ("FAILED Closing Interfaces"));

    return (dwError);
}


DWORD
PerformDhcpV6Refresh(
    HANDLE hInterface,
    DWORD dwVersion,
    LPVOID pvReserved
    )
{
    DWORD dwError = 0;
    PINI_INTERFACE_HANDLE pIniInterfaceHandle = NULL;
    PDHCPV6_ADAPT pDhcpV6Adapt = NULL;


    DhcpV6Trace(DHCPV6_IOCTL, DHCPV6_LOG_LEVEL_TRACE, ("Begin Refreshing Interface: Handle: %p", hInterface));

    ENTER_DHCPV6_SECTION();
    dwError = ValidateSecurity(
                  DHCPV6_OBJECT_SERVER,
                  SERVER_ACCESS_ADMINISTER,
                  NULL,
                  NULL
                  );
    LEAVE_DHCPV6_SECTION();
    BAIL_ON_WIN32_ERROR(dwError);

    AcquireExclusiveLock(gpDhcpV6IniInterfaceTblRWLock);

    dwError = GetIniInterfaceHandle(hInterface, &pIniInterfaceHandle);
    BAIL_ON_LOCK_ERROR(dwError);

    dwError = DHCPV6AdaptFindAndReference(
                    pIniInterfaceHandle->dwInterfaceID,
                    &pDhcpV6Adapt
                    );
    BAIL_ON_LOCK_ERROR(dwError);

    dwError = DHCPV6MessageMgrPerformRefresh(
                    pDhcpV6Adapt
                    );
    BAIL_ON_LOCK_ERROR(dwError);

    ReleaseExclusiveLock(gpDhcpV6IniInterfaceTblRWLock);
    DereferenceDHCPV6Adapt(pDhcpV6Adapt);

    DhcpV6Trace(DHCPV6_IOCTL, DHCPV6_LOG_LEVEL_TRACE, ("End Refreshing Interface"));

    return (dwError);

lock:

    if (pDhcpV6Adapt) {
        DereferenceDHCPV6Adapt(pDhcpV6Adapt);
    }

    ReleaseExclusiveLock(gpDhcpV6IniInterfaceTblRWLock);

error:

    DhcpV6Trace(DHCPV6_IOCTL, DHCPV6_LOG_LEVEL_ERROR, ("FAILED Refreshing Interface: Handle: %p with Error: %!status!", hInterface, dwError));

    return (dwError);
}


DWORD
GetDhcpV6DNSList(
    HANDLE hInterface,
    DWORD dwVersion,
    PDHCPV6_DNS_LIST * ppDhcpV6DNSList,
    LPVOID pvReserved
    )
{
    DWORD dwError = 0;
    PINI_INTERFACE_HANDLE pIniInterfaceHandle = NULL;
    PDHCPV6_ADAPT pDhcpV6Adapt = NULL;
    PDHCPV6_DNS_LIST pDhcpV6DNSList = NULL;


    DhcpV6Trace(DHCPV6_IOCTL, DHCPV6_LOG_LEVEL_TRACE, ("Begin Fetching DNS Information: Handle: %p", hInterface));

    ENTER_DHCPV6_SECTION();
    dwError = ValidateSecurity(
                  DHCPV6_OBJECT_SERVER,
                  SERVER_ACCESS_ADMINISTER,
                  NULL,
                  NULL
                  );
    LEAVE_DHCPV6_SECTION();
    BAIL_ON_WIN32_ERROR(dwError);

    AcquireExclusiveLock(gpDhcpV6IniInterfaceTblRWLock);

    dwError = GetIniInterfaceHandle(hInterface, &pIniInterfaceHandle);
    BAIL_ON_LOCK_ERROR(dwError);

    dwError = DHCPV6AdaptFindAndReference(
                    pIniInterfaceHandle->dwInterfaceID,
                    &pDhcpV6Adapt
                    );
    BAIL_ON_LOCK_ERROR(dwError);

    AcquireSharedLock(&pDhcpV6Adapt->RWLock);

    DhcpV6Trace(DHCPV6_IOCTL, DHCPV6_LOG_LEVEL_INFO, ("Fetching DNS Information for Interface: %d", pDhcpV6Adapt->dwIPv6IfIndex));

    if (pDhcpV6Adapt->uNumOfDNSServers == 0) {
        dwError = ERROR_NOT_FOUND;
        BAIL_ON_LOCK_ERROR(dwError);
    }

    dwError = DHCPv6AllocateBuffer(
                  sizeof(DHCPV6_DNS_LIST),
                  &pDhcpV6DNSList
                  );
    BAIL_ON_LOCK_ERROR(dwError);

    dwError = DHCPv6AllocateBuffer(
              sizeof(DHCPV6_DNS) * (pDhcpV6Adapt->uNumOfDNSServers),
              &(pDhcpV6DNSList->pDhcpV6DNS)
              );
    BAIL_ON_LOCK_ERROR(dwError);

    pDhcpV6DNSList->uNumOfEntries = pDhcpV6Adapt->uNumOfDNSServers;
    memcpy(
        pDhcpV6DNSList->pDhcpV6DNS,
        pDhcpV6Adapt->pIpv6DNSServers,
        sizeof(DHCPV6_DNS) * (pDhcpV6Adapt->uNumOfDNSServers)
        );

    *ppDhcpV6DNSList = pDhcpV6DNSList;

    ReleaseSharedLock(&pDhcpV6Adapt->RWLock);
    DereferenceDHCPV6Adapt(pDhcpV6Adapt);

    ReleaseExclusiveLock(gpDhcpV6IniInterfaceTblRWLock);

    DhcpV6Trace(DHCPV6_IOCTL, DHCPV6_LOG_LEVEL_TRACE, ("End Fetching DNS Information"));

    return (dwError);

lock:

    if (pDhcpV6Adapt) {
        ReleaseSharedLock(&pDhcpV6Adapt->RWLock);
        DereferenceDHCPV6Adapt(pDhcpV6Adapt);
    }

    ReleaseExclusiveLock(gpDhcpV6IniInterfaceTblRWLock);

error:

    if (pDhcpV6DNSList) {
        if (pDhcpV6DNSList->pDhcpV6DNS) {
            DHCPv6FreeBuffer(pDhcpV6DNSList->pDhcpV6DNS);
        }
        DHCPv6FreeBuffer(pDhcpV6DNSList);
    }

    *ppDhcpV6DNSList = NULL;

    DhcpV6Trace(DHCPV6_IOCTL, DHCPV6_LOG_LEVEL_ERROR, ("FAILED Fetching DNS Information: Handle: %p with Error: %!status!", hInterface, dwError));

    return (dwError);
}


DWORD
GetDhcpV6PDList(
    HANDLE hInterface,
    DWORD dwVersion,
    DHCPV6_PD_OPTION ** ppDhcpV6PDList,
    LPVOID pvReserved
    )
{
    DWORD dwError = 0;
    PINI_INTERFACE_HANDLE pIniInterfaceHandle = NULL;
    PDHCPV6_ADAPT pDhcpV6Adapt = NULL;
    DHCPV6_PD_OPTION *pDhcpV6PDList = NULL;


    DhcpV6Trace(DHCPV6_IOCTL, DHCPV6_LOG_LEVEL_TRACE, ("Begin Fetching DNS Information: Handle: %p", hInterface));

    ENTER_DHCPV6_SECTION();
    dwError = ValidateSecurity(
                  DHCPV6_OBJECT_SERVER,
                  SERVER_ACCESS_ADMINISTER,
                  NULL,
                  NULL
                  );
    LEAVE_DHCPV6_SECTION();
    BAIL_ON_WIN32_ERROR(dwError);

    AcquireExclusiveLock(gpDhcpV6IniInterfaceTblRWLock);

    dwError = GetIniInterfaceHandle(hInterface, &pIniInterfaceHandle);
    BAIL_ON_LOCK_ERROR(dwError);

    dwError = DHCPV6AdaptFindAndReference(
                    pIniInterfaceHandle->dwInterfaceID,
                    &pDhcpV6Adapt
                    );
    BAIL_ON_LOCK_ERROR(dwError);

    AcquireSharedLock(&pDhcpV6Adapt->RWLock);

    DhcpV6Trace(DHCPV6_IOCTL, DHCPV6_LOG_LEVEL_INFO, ("Fetching DNS Information for Interface: %d", pDhcpV6Adapt->dwIPv6IfIndex));

    if (! pDhcpV6Adapt->pPdOption) {
        dwError = ERROR_NOT_FOUND;
        BAIL_ON_LOCK_ERROR(dwError);
    }

    dwError = DHCPv6AllocateBuffer(
              sizeof(DHCPV6_PD_OPTION),
              &pDhcpV6PDList);
    
    BAIL_ON_LOCK_ERROR(dwError);

    memcpy(pDhcpV6PDList, pDhcpV6Adapt->pPdOption, sizeof(DHCPV6_PD_OPTION));

    *ppDhcpV6PDList = pDhcpV6PDList;

    ReleaseSharedLock(&pDhcpV6Adapt->RWLock);
    DereferenceDHCPV6Adapt(pDhcpV6Adapt);

    ReleaseExclusiveLock(gpDhcpV6IniInterfaceTblRWLock);

    DhcpV6Trace(DHCPV6_IOCTL, DHCPV6_LOG_LEVEL_TRACE, ("End Fetching DNS Information"));

    return (dwError);

lock:

    if (pDhcpV6Adapt) {
        ReleaseSharedLock(&pDhcpV6Adapt->RWLock);
        DereferenceDHCPV6Adapt(pDhcpV6Adapt);
    }

    ReleaseExclusiveLock(gpDhcpV6IniInterfaceTblRWLock);

error:

    if (pDhcpV6PDList) {
        DHCPv6FreeBuffer(pDhcpV6PDList);
    }

    *ppDhcpV6PDList = NULL;

    DhcpV6Trace(DHCPV6_IOCTL, DHCPV6_LOG_LEVEL_ERROR, ("FAILED Fetching DNS Information: Handle: %p with Error: %!status!", hInterface, dwError));

    return (dwError);
}


DWORD
GetDhcpV6DomainList(
    HANDLE hInterface,
    DWORD dwVersion,
    char ** ppDhcpV6DomainList,
    LPVOID pvReserved
    )
{
    DWORD dwError = 0;
    PINI_INTERFACE_HANDLE pIniInterfaceHandle = NULL;
    PDHCPV6_ADAPT pDhcpV6Adapt = NULL;
    char * pDhcpV6DomainList = NULL;
    DWORD cLen, cAdd;


    DhcpV6Trace(DHCPV6_IOCTL, DHCPV6_LOG_LEVEL_TRACE, ("Begin Fetching DNS Information: Handle: %p", hInterface));

    ENTER_DHCPV6_SECTION();
    dwError = ValidateSecurity(
                  DHCPV6_OBJECT_SERVER,
                  SERVER_ACCESS_ADMINISTER,
                  NULL,
                  NULL
                  );
    LEAVE_DHCPV6_SECTION();
    BAIL_ON_WIN32_ERROR(dwError);

    AcquireExclusiveLock(gpDhcpV6IniInterfaceTblRWLock);

    dwError = GetIniInterfaceHandle(hInterface, &pIniInterfaceHandle);
    BAIL_ON_LOCK_ERROR(dwError);

    dwError = DHCPV6AdaptFindAndReference(
                    pIniInterfaceHandle->dwInterfaceID,
                    &pDhcpV6Adapt
                    );
    BAIL_ON_LOCK_ERROR(dwError);

    AcquireSharedLock(&pDhcpV6Adapt->RWLock);

    DhcpV6Trace(DHCPV6_IOCTL, DHCPV6_LOG_LEVEL_INFO, ("Fetching DNS Information for Interface: %d", pDhcpV6Adapt->dwIPv6IfIndex));

    cLen = pDhcpV6Adapt->cDomainList;
    if ((0 == cLen) || (! pDhcpV6Adapt->pDomainList)) {
        dwError = ERROR_NOT_FOUND;
        BAIL_ON_LOCK_ERROR(dwError);
    }

    if (pDhcpV6Adapt->pDomainList[cLen-1] != '\0')
        cAdd = 2;
    else if ((1 == cLen) || (pDhcpV6Adapt->pDomainList[cLen-2] != '\0'))
        cAdd = 1;
    else
        cAdd = 0;

    dwError = DHCPv6AllocateBuffer(cLen + cAdd, &pDhcpV6DomainList);
    
    BAIL_ON_LOCK_ERROR(dwError);

    memcpy(pDhcpV6DomainList, pDhcpV6Adapt->pDomainList, cLen);

    while (cAdd) {
        pDhcpV6DomainList[cLen + --cAdd] = '\0';
    }

    *ppDhcpV6DomainList = pDhcpV6DomainList;

    ReleaseSharedLock(&pDhcpV6Adapt->RWLock);
    DereferenceDHCPV6Adapt(pDhcpV6Adapt);

    ReleaseExclusiveLock(gpDhcpV6IniInterfaceTblRWLock);

    DhcpV6Trace(DHCPV6_IOCTL, DHCPV6_LOG_LEVEL_TRACE, ("End Fetching DNS Information"));

    return (dwError);

lock:

    if (pDhcpV6Adapt) {
        ReleaseSharedLock(&pDhcpV6Adapt->RWLock);
        DereferenceDHCPV6Adapt(pDhcpV6Adapt);
    }

    ReleaseExclusiveLock(gpDhcpV6IniInterfaceTblRWLock);

error:

    if (pDhcpV6DomainList) {
        DHCPv6FreeBuffer(pDhcpV6DomainList);
    }

    *ppDhcpV6DomainList = NULL;

    DhcpV6Trace(DHCPV6_IOCTL, DHCPV6_LOG_LEVEL_ERROR, ("FAILED Fetching DNS Information: Handle: %p with Error: %!status!", hInterface, dwError));

    return (dwError);
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -