#include <stdio.h> #define INITGUID // must be before guid stuff #include "iisdebug.h" #include "certobj.h" // Interface header #include "certobj_i.c" BOOL TestCertObj(void); LPSTR StripWhitespace( LPSTR pszString ) { LPSTR pszTemp = NULL; if ( pszString == NULL ) { return NULL; } while ( *pszString == ' ' || *pszString == '\t' ) { pszString += 1; } // Catch case where string consists entirely of whitespace or empty string. if ( *pszString == '\0' ) { return pszString; } pszTemp = pszString; pszString += lstrlenA(pszString) - 1; while ( *pszString == ' ' || *pszString == '\t' ) { *pszString = '\0'; pszString -= 1; } return pszTemp; } void ShowHelp() { wprintf(L"tests the CertObj control\n\n"); return; } int __cdecl main( int argc, char *argv[] ) { BOOL fRet = FALSE; int argno; char * pArg = NULL; char * pCmdStart = NULL; char szTempString[MAX_PATH]; int iGotParamS = FALSE; int iGotParamP = FALSE; int iDoA = FALSE; WCHAR wszDirPath[MAX_PATH]; WCHAR wszTempString_S[MAX_PATH]; WCHAR wszTempString_P[MAX_PATH]; wszDirPath[0] = '\0'; wszTempString_S[0] = '\0'; wszTempString_P[0] = '\0'; for(argno=1; argno<argc; argno++) { if ( argv[argno][0] == '-' || argv[argno][0] == '/' ) { switch (argv[argno][1]) { case 'a': case 'A': iDoA = TRUE; break; case 's': case 'S': // Get the string for this flag pArg = CharNextA(argv[argno]); pArg = CharNextA(pArg); if (*pArg == ':') { pArg = CharNextA(pArg); // Check if it's quoted if (*pArg == '\"') { pArg = CharNextA(pArg); pCmdStart = pArg; while ((*pArg) && (*pArg != '\"')){pArg = CharNextA(pArg);} } else { pCmdStart = pArg; while (*pArg){pArg = CharNextA(pArg);} } *pArg = '\0'; lstrcpyA(szTempString, StripWhitespace(pCmdStart)); // Convert to unicode MultiByteToWideChar(CP_ACP, 0, (LPCSTR)szTempString, -1, (LPWSTR) wszTempString_S, 50); iGotParamS = TRUE; } break; case 'p': case 'P': // Get the string for this flag pArg = CharNextA(argv[argno]); pArg = CharNextA(pArg); if (*pArg == ':') { pArg = CharNextA(pArg); // Check if it's quoted if (*pArg == '\"') { pArg = CharNextA(pArg); pCmdStart = pArg; while ((*pArg) && (*pArg != '\"')){pArg = CharNextA(pArg);} } else { pCmdStart = pArg; while (*pArg){pArg = CharNextA(pArg);} } *pArg = '\0'; lstrcpyA(szTempString, StripWhitespace(pCmdStart)); // Convert to unicode MultiByteToWideChar(CP_ACP, 0, (LPCSTR)szTempString, -1, (LPWSTR) wszTempString_P, 50); iGotParamP = TRUE; } break; case '?': goto main_exit_with_help; break; } } else { if ( *wszDirPath == '\0' ) { // if no arguments, then get the filename portion MultiByteToWideChar(CP_ACP, 0, argv[argno], -1, (LPWSTR) wszDirPath, 50); } } } fRet = TestCertObj(); goto main_exit_gracefully; main_exit_gracefully: exit(fRet); main_exit_with_help: ShowHelp(); exit(fRet); } HRESULT HereIsVtArrayGimmieBinary( VARIANT * lpVarSrcObject, DWORD * cbBinaryBufferSize, char **pbBinaryBuffer, BOOL bReturnBinaryAsVT_VARIANT ) { HRESULT hr = S_OK; LONG dwSLBound = 0; LONG dwSUBound = 0; CHAR HUGEP *pArray = NULL; if (NULL == cbBinaryBufferSize || NULL == pbBinaryBuffer) { hr = E_INVALIDARG; goto HereIsVtArrayGimmieBinary_Exit; } if (bReturnBinaryAsVT_VARIANT) { hr = VariantChangeType(lpVarSrcObject,lpVarSrcObject,0,VT_ARRAY | VT_VARIANT); } else { hr = VariantChangeType(lpVarSrcObject,lpVarSrcObject,0,VT_ARRAY | VT_UI1); } if (FAILED(hr)) { if (hr != E_OUTOFMEMORY) { IISDebugOutput(_T("OLE_E_CANTCONVERT 1,hr=0x%x\n"),hr); hr = OLE_E_CANTCONVERT; } goto HereIsVtArrayGimmieBinary_Exit; } if (bReturnBinaryAsVT_VARIANT) { if( lpVarSrcObject->vt != (VT_ARRAY | VT_VARIANT)) { hr = OLE_E_CANTCONVERT; goto HereIsVtArrayGimmieBinary_Exit; } } else { if( lpVarSrcObject->vt != (VT_ARRAY | VT_UI1)) { hr = OLE_E_CANTCONVERT; IISDebugOutput(_T("OLE_E_CANTCONVERT 2\n")); goto HereIsVtArrayGimmieBinary_Exit; } } hr = SafeArrayGetLBound(V_ARRAY(lpVarSrcObject),1,(long FAR *) &dwSLBound ); if (FAILED(hr)) {goto HereIsVtArrayGimmieBinary_Exit;} hr = SafeArrayGetUBound(V_ARRAY(lpVarSrcObject),1,(long FAR *) &dwSUBound ); if (FAILED(hr)) {goto HereIsVtArrayGimmieBinary_Exit;} //*pbBinaryBuffer = (LPBYTE) AllocADsMem(dwSUBound - dwSLBound + 1); *pbBinaryBuffer = (char *) ::CoTaskMemAlloc(dwSUBound - dwSLBound + 1); if (*pbBinaryBuffer == NULL) { hr = E_OUTOFMEMORY; goto HereIsVtArrayGimmieBinary_Exit; } *cbBinaryBufferSize = dwSUBound - dwSLBound + 1; hr = SafeArrayAccessData( V_ARRAY(lpVarSrcObject),(void HUGEP * FAR *) &pArray ); if (FAILED(hr)) {goto HereIsVtArrayGimmieBinary_Exit;} memcpy(*pbBinaryBuffer,pArray,dwSUBound-dwSLBound+1); SafeArrayUnaccessData( V_ARRAY(lpVarSrcObject) ); HereIsVtArrayGimmieBinary_Exit: return hr; } BOOL TestCertObj(void) { BOOL fRet = FALSE; HRESULT hr; IIISCertObj *pTheObject = NULL; BSTR bstrFileName = SysAllocString(L"c:\\test.pfx"); BSTR bstrFilePassword = SysAllocString(L"www"); VARIANT VtArray; DWORD cbBinaryBufferSize = 0; char * pbBinaryBuffer = NULL; IISDebugOutput(_T("TestCertObj: Start\n")); if( FAILED (CoInitializeEx( NULL, COINIT_MULTITHREADED ))) { return FALSE; } // Try to instantiante the object on the remote server... // with the supplied authentication info (pcsiName) //#define CLSCTX_SERVER (CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER | CLSCTX_REMOTE_SERVER) //#define CLSCTX_ALL (CLSCTX_INPROC_HANDLER | CLSCTX_SERVER) // this one seems to work with surrogates.. hr = CoCreateInstance(CLSID_IISCertObj,NULL,CLSCTX_SERVER,IID_IIISCertObj,(void **)&pTheObject); if (FAILED(hr)) { IISDebugOutput(_T("CoCreateInstanceEx on CLSID_IISCertObj failed! code=0x%x\n"),hr); goto TestCertObj_Exit; } // at this point we were able to instantiate the com object on the server (local or remote) hr = pTheObject->ImportToCertStore(bstrFileName, bstrFilePassword,&VtArray); IISDebugOutput(_T("returned ImportToCertStore, code=0x%x\n"),hr); // we have a VtArray now. // change it back to a binary blob hr = HereIsVtArrayGimmieBinary(&VtArray,&cbBinaryBufferSize,&pbBinaryBuffer,FALSE); IISDebugOutput(_T("returned HereIsVtArrayGimmieBinary, code=0x%x\n"),hr); IISDebugOutput(_T("Blob=%d,%p\n"),cbBinaryBufferSize,pbBinaryBuffer); DebugBreak(); TestCertObj_Exit: if (pTheObject) { pTheObject->Release(); pTheObject = NULL; } CoUninitialize(); IISDebugOutput(_T("TestCertObj: End\n")); return fRet; }