📄 apis.c
字号:
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 + -