📄 ssl.c
字号:
Return Value:
Success/Failure.
--***************************************************************************/
int DoSslQuery(
IN PWCHAR pIp
)
{
DWORD Status;
PUCHAR pOutput = NULL;
DWORD OutputLength = 0;
DWORD ReturnLength = 0;
HTTP_SERVICE_CONFIG_SSL_QUERY QueryParam;
SOCKADDR_STORAGE TempSockAddr;
ZeroMemory(&QueryParam, sizeof(QueryParam));
if(pIp)
{
// if an IP address is specified, we'll covert it to a SOCKADDR
// and do an exact query.
QueryParam.QueryDesc = HttpServiceConfigQueryExact;
QueryParam.KeyDesc.pIpPort = (LPSOCKADDR)&TempSockAddr;
if((Status = GetAddress(pIp,
QueryParam.KeyDesc.pIpPort,
sizeof(TempSockAddr)
)) != NO_ERROR)
{
NlsPutMsg(HTTPCFG_INVALID_IP, pIp);
return Status;
}
}
else
{
// We are enumerating all the records in the SSL store.
QueryParam.QueryDesc = HttpServiceConfigQueryNext;
}
for(;;)
{
//
// First, compute the bytes required to enumerate an entry.
//
Status = HttpQueryServiceConfiguration(
NULL,
HttpServiceConfigSSLCertInfo,
&QueryParam,
sizeof(QueryParam),
pOutput,
OutputLength,
&ReturnLength,
NULL
);
if(Status == ERROR_INSUFFICIENT_BUFFER)
{
// If the API completes with ERROR_INSUFFICIENT_BUFFER, we'll
// allocate memory for it & continue with the loop where we'll
// call it again.
if(pOutput)
{
// If there was an existing buffer, free it.
LocalFree(pOutput);
}
// Allocate a new buffer
pOutput = LocalAlloc(LMEM_FIXED, ReturnLength);
if(!pOutput)
{
return ERROR_NOT_ENOUGH_MEMORY;
}
OutputLength = ReturnLength;
}
else if(Status == NO_ERROR)
{
// The query succeeded! We'll print the record that we just
// queried.
//
PrintSslRecord(pOutput);
if(pIp != NULL)
{
//
// If we are not enumerating, we are done.
//
break;
}
else
{
//
// Since we are enumerating, we'll move on to the next
// record. This is done by incrementing the cursor, till
// we get ERROR_NO_MORE_ITEMS.
//
QueryParam.dwToken ++;
}
}
else if(ERROR_NO_MORE_ITEMS == Status && !pIp)
{
// We are enumerating and we have reached the end. This is
// indicated by a ERROR_NO_MORE_ITEMS error code.
// This is not a real error, since it is used to indicate that
// we've finished enumeration.
Status = NO_ERROR;
break;
}
else
{
//
// Some other error, so we are done
//
NlsPutMsg(HTTPCFG_QUERYSERVICE_STATUS, Status);
break;
}
}
if(pOutput)
{
LocalFree(pOutput);
}
return Status;
}
/***************************************************************************++
Routine Description:
Deletes a SSL entry.
Arguments:
pIP - The IP address of entry to be deleted.
Return Value:
Success/Failure.
--***************************************************************************/
int DoSslDelete(
IN PWCHAR pIp
)
{
HTTP_SERVICE_CONFIG_SSL_SET SetParam;
DWORD Status;
SOCKADDR_STORAGE TempSockAddr;
SetParam.KeyDesc.pIpPort = (LPSOCKADDR)&TempSockAddr;
// Convert string IP address to a SOCKADDR structure
Status = GetAddress(pIp,
SetParam.KeyDesc.pIpPort,
sizeof(TempSockAddr)
);
if(Status != NO_ERROR)
{
NlsPutMsg(HTTPCFG_INVALID_IP, pIp);
return Status;
}
// Call the API.
Status = HttpDeleteServiceConfiguration(
NULL,
HttpServiceConfigSSLCertInfo,
&SetParam,
sizeof(SetParam),
NULL
);
NlsPutMsg(HTTPCFG_DELETESERVICE_STATUS, Status);
return Status;
}
//
// Public functions.
//
/***************************************************************************++
Routine Description:
The function that parses parameters specific to SSL
calls Set, Query or Delete.
Arguments:
argc - Count of arguments.
argv - Pointer to command line arguments.
Type - Type of operation to be performed.
Return Value:
Success/Failure.
--***************************************************************************/
int DoSsl(
int argc,
WCHAR **argv,
HTTPCFG_TYPE type
)
{
PWCHAR pGuid = NULL;
PWCHAR pHash = NULL;
PWCHAR pCertStoreName = NULL;
PWCHAR pCtlIdentifier = NULL;
PWCHAR pCtlStoreName = NULL;
DWORD CertCheckMode = 0;
DWORD Freshness = 0;
DWORD Timeout = 0;
DWORD Flags = 0;
PWCHAR pIp = NULL;
while(argc >= 2 && (argv[0][0] == L'-' || argv[0][0] == L'/'))
{
switch(toupper(argv[0][1]))
{
case 'I':
pIp = argv[1];
break;
case 'C':
pCertStoreName = argv[1];
break;
case 'N':
pCtlStoreName = argv[1];
break;
case 'T':
pCtlIdentifier = argv[1];
break;
case 'M':
CertCheckMode = _wtoi(argv[1]);
break;
case 'R':
Freshness = _wtoi(argv[1]);
break;
case 'X':
Timeout = _wtoi(argv[1]);
break;
case 'F':
Flags = _wtoi(argv[1]);
break;
case 'G':
pGuid = argv[1];
break;
case 'H':
pHash = argv[1];
break;
default:
NlsPutMsg(HTTPCFG_INVALID_SWITCH, argv[0]);
return ERROR_INVALID_PARAMETER;
}
argc -=2;
argv +=2;
}
switch(type)
{
case HttpCfgTypeSet:
return DoSslSet(
pIp,
pGuid,
pHash,
CertCheckMode,
Freshness,
Timeout,
Flags,
pCtlIdentifier,
pCtlStoreName,
pCertStoreName
);
case HttpCfgTypeQuery:
return DoSslQuery(pIp);
case HttpCfgTypeDelete:
return DoSslDelete(pIp);
default:
NlsPutMsg(HTTPCFG_INVALID_SWITCH, argv[0]);
return ERROR_INVALID_PARAMETER;
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -