You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
255 lines
7.7 KiB
255 lines
7.7 KiB
/****************************************************************************/
|
|
// Directory Integrity Service
|
|
//
|
|
// Utility functions
|
|
//
|
|
// Copyright (C) 2000, Microsoft Corporation
|
|
/****************************************************************************/
|
|
|
|
#include "dis.h"
|
|
|
|
|
|
|
|
extern ADOConnection *g_pConnection;
|
|
|
|
|
|
|
|
/****************************************************************************/
|
|
// AddADOInputStringParam
|
|
//
|
|
// Creates and adds to the given ADOParameters object a WSTR-initialized
|
|
// parameter value.
|
|
/****************************************************************************/
|
|
HRESULT AddADOInputStringParam(
|
|
PWSTR Param,
|
|
PWSTR ParamName,
|
|
ADOCommand *pCommand,
|
|
ADOParameters *pParameters,
|
|
BOOL bNullOnNull)
|
|
{
|
|
HRESULT hr;
|
|
CVar varParam;
|
|
BSTR ParamStr;
|
|
ADOParameter *pParam;
|
|
int Len;
|
|
|
|
ParamStr = SysAllocString(ParamName);
|
|
if (ParamStr != NULL) {
|
|
// ADO does not seem to like accepting string params that are zero
|
|
// length. So, if the string we have is zero length and bNullOnNull says
|
|
// we can, we send a null VARIANT type, resulting in a null value at
|
|
// the SQL server.
|
|
if (wcslen(Param) > 0 || !bNullOnNull) {
|
|
hr = varParam.InitFromWSTR(Param);
|
|
Len = wcslen(Param);
|
|
}
|
|
else {
|
|
varParam.vt = VT_NULL;
|
|
varParam.bstrVal = NULL;
|
|
Len = -1;
|
|
hr = S_OK;
|
|
}
|
|
|
|
if (SUCCEEDED(hr)) {
|
|
hr = pCommand->CreateParameter(ParamStr, adVarWChar, adParamInput,
|
|
Len, varParam, &pParam);
|
|
if (SUCCEEDED(hr)) {
|
|
hr = pParameters->Append(pParam);
|
|
if (FAILED(hr)) {
|
|
ERR((TB,"InStrParam: Failed append param %S, hr=0x%X",
|
|
ParamName, hr));
|
|
}
|
|
|
|
// ADO will have its own ref for the param.
|
|
pParam->Release();
|
|
}
|
|
else {
|
|
ERR((TB,"InStrParam: Failed CreateParam %S, hr=0x%X",
|
|
ParamName, hr));
|
|
}
|
|
}
|
|
else {
|
|
ERR((TB,"InStrParam: Failed alloc variant bstr, "
|
|
"param %S, hr=0x%X", ParamName, hr));
|
|
}
|
|
|
|
SysFreeString(ParamStr);
|
|
}
|
|
else {
|
|
ERR((TB,"InStrParam: Failed alloc paramname"));
|
|
hr = E_OUTOFMEMORY;
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
|
|
/****************************************************************************/
|
|
// GetRowArrayStringField
|
|
//
|
|
// Retrieves a WSTR from a specified row and field of the given SafeArray.
|
|
// Returns failure if the target field is not a string. MaxOutStr is max
|
|
// WCHARs not including NULL.
|
|
/****************************************************************************/
|
|
HRESULT GetRowArrayStringField(
|
|
SAFEARRAY *pSA,
|
|
unsigned RowIndex,
|
|
unsigned FieldIndex,
|
|
WCHAR *OutStr,
|
|
unsigned MaxOutStr)
|
|
{
|
|
HRESULT hr;
|
|
CVar varField;
|
|
long DimIndices[2];
|
|
|
|
DimIndices[0] = FieldIndex;
|
|
DimIndices[1] = RowIndex;
|
|
SafeArrayGetElement(pSA, DimIndices, &varField);
|
|
|
|
if (varField.vt == VT_BSTR) {
|
|
wcsncpy(OutStr, varField.bstrVal, MaxOutStr);
|
|
hr = S_OK;
|
|
}
|
|
else if (varField.vt == VT_NULL) {
|
|
OutStr[0] = L'\0';
|
|
hr = S_OK;
|
|
}
|
|
else {
|
|
ERR((TB,"GetRowStrField: Row %u Col %u value %d is not a string",
|
|
RowIndex, FieldIndex, varField.vt));
|
|
hr = E_FAIL;
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
/****************************************************************************/
|
|
// CreateADOStoredProcCommand
|
|
//
|
|
// Creates and returns a stored proc ADOCommand, plus a ref to its
|
|
// associated Parameters.
|
|
/****************************************************************************/
|
|
HRESULT CreateADOStoredProcCommand(
|
|
PWSTR CmdName,
|
|
ADOCommand **ppCommand,
|
|
ADOParameters **ppParameters)
|
|
{
|
|
HRESULT hr;
|
|
BSTR CmdStr;
|
|
ADOCommand *pCommand;
|
|
ADOParameters *pParameters;
|
|
|
|
CmdStr = SysAllocString(CmdName);
|
|
if (CmdStr != NULL) {
|
|
hr = CoCreateInstance(CLSID_CADOCommand, NULL, CLSCTX_INPROC_SERVER,
|
|
IID_IADOCommand25, (LPVOID *)&pCommand);
|
|
if (SUCCEEDED(hr)) {
|
|
// Set the connection.
|
|
hr = pCommand->putref_ActiveConnection(g_pConnection);
|
|
if (SUCCEEDED(hr)) {
|
|
// Set the command text.
|
|
hr = pCommand->put_CommandText(CmdStr);
|
|
if (SUCCEEDED(hr)) {
|
|
// Set the command type.
|
|
hr = pCommand->put_CommandType(adCmdStoredProc);
|
|
if (SUCCEEDED(hr)) {
|
|
// Get the Parameters pointer from the Command to
|
|
// allow appending params.
|
|
hr = pCommand->get_Parameters(&pParameters);
|
|
if (FAILED(hr)) {
|
|
ERR((TB,"Failed getParams for command, "
|
|
"hr=0x%X", hr));
|
|
goto PostCreateCommand;
|
|
}
|
|
}
|
|
else {
|
|
ERR((TB,"Failed set cmdtype for command, hr=0x%X",
|
|
hr));
|
|
goto PostCreateCommand;
|
|
}
|
|
}
|
|
else {
|
|
ERR((TB,"Failed set cmdtext for command, hr=0x%X", hr));
|
|
goto PostCreateCommand;
|
|
}
|
|
}
|
|
else {
|
|
ERR((TB,"Command::putref_ActiveConnection hr=0x%X", hr));
|
|
goto PostCreateCommand;
|
|
}
|
|
}
|
|
else {
|
|
ERR((TB,"CoCreate(Command) returned 0x%X", hr));
|
|
goto PostAllocCmdStr;
|
|
}
|
|
|
|
SysFreeString(CmdStr);
|
|
}
|
|
else {
|
|
ERR((TB,"Failed to alloc cmd str"));
|
|
hr = E_OUTOFMEMORY;
|
|
goto ExitFunc;
|
|
}
|
|
|
|
*ppCommand = pCommand;
|
|
*ppParameters = pParameters;
|
|
return hr;
|
|
|
|
// Error handling.
|
|
|
|
PostCreateCommand:
|
|
pCommand->Release();
|
|
|
|
PostAllocCmdStr:
|
|
SysFreeString(CmdStr);
|
|
|
|
ExitFunc:
|
|
*ppCommand = NULL;
|
|
*ppParameters = NULL;
|
|
return hr;
|
|
}
|
|
|
|
|
|
|
|
/****************************************************************************/
|
|
// CheckRPCClientProtoSeq
|
|
//
|
|
// Check if the client uses the expected RPC protocol sequence or not
|
|
//
|
|
// Parameters:
|
|
// ClientBinding: The client binding handle
|
|
// SeqExpected: Protocol sequence expected
|
|
//
|
|
// Return:
|
|
// True on getting the expected seq, False otherwise
|
|
/****************************************************************************/
|
|
BOOL CheckRPCClientProtoSeq(void *ClientBinding, WCHAR *SeqExpected) {
|
|
BOOL fAllowProtocol = FALSE;
|
|
WCHAR *pBinding = NULL;
|
|
WCHAR *pProtSeq = NULL;
|
|
|
|
if (RpcBindingToStringBinding(ClientBinding,&pBinding) == RPC_S_OK) {
|
|
|
|
if (RpcStringBindingParse(pBinding,
|
|
NULL,
|
|
&pProtSeq,
|
|
NULL,
|
|
NULL,
|
|
NULL) == RPC_S_OK) {
|
|
|
|
// Check that the client request was made using expected protoal seq.
|
|
if (lstrcmpi(pProtSeq, SeqExpected) == 0)
|
|
fAllowProtocol = TRUE;
|
|
|
|
if (pProtSeq)
|
|
RpcStringFree(&pProtSeq);
|
|
}
|
|
|
|
if (pBinding)
|
|
RpcStringFree(&pBinding);
|
|
}
|
|
return fAllowProtocol;
|
|
}
|
|
|