windows-nt/Source/XPSP1/NT/inetsrv/iis/ui/admin/certmap
..
res
addcert.cpp
amapctl.bmp
amapctl.h
amapppg.h
authctl.bmp
authctl.cpp
authctl.h
authppg.cpp
authppg.h
brwsdlg.cpp
brwsdlg.h
cauthctl.bmp
cauthctl.h
cauthdlg.h
cauthppg.h
certctl.bmp
certctl.cpp
certctl.h
certmap.cpp
certmap.def
certmap.h
certmap.hm
certmap.mak
certmap.odl
certmap.rc
certppg.cpp
certppg.h
check.bmp
chklstct.cpp
chklstct.h
cnfrmpsd.cpp
cnfrmpsd.h
crackcrt.cpp
crackcrt.h
crtmapd.h
ed11maps.cpp
ed11maps.h
editruld.h
edtone11.cpp
edtone11.h
edtrulel.cpp
edtrulel.h
edwldrul.cpp
edwldrul.h
helpmap.h
hotlink.cpp
hotlink.h
keyring.h
listrow.cpp
listrow.h
makefile
makehelp.bat
map11pge.cpp
map11pge.h
mapwpge.cpp
mapwpge.h
readme.txt
resource.h
sources
stdafx.cpp
stdafx.h
wrapmaps.cpp
wrapmaps.h
wrpmbwrp.cpp
wrpmbwrp.h
wwzone.cpp
wwzone.h
wwzthree.cpp
wwzthree.h
wwztwo.cpp
wwztwo.h

CERT_KEY_PROV_INFO_PROP_ID is needed by boyd's code
typedef struct _CRYPT_KEY_PROV_INFO {
    LPWSTR                  pwszContainerName;
    LPWSTR                  pwszProvName;
    DWORD                   dwProvType;
    DWORD                   dwFlags;
    DWORD                   cProvParam;
    PCRYPT_KEY_PROV_PARAM   rgProvParam;
    DWORD                   dwKeySpec;
} CRYPT_KEY_PROV_INFO, *PCRYPT_KEY_PROV_INFO;
the above comes from WinCrypt.h.


// This section covers how we interact with the Xenroll and CertServer
// COM objects.  It shows a line of action [documenting ALL interaction
// with have with these COM objects]  Main action is in nLocEnrl.cpp 
// and if any line numbers are given they refer to check in date 4-12-98 v14 in Slim]

    hr = spICertGetConfig->GetConfig(0, &ConfigString) ;
Invoke_GetConfig(CComBSTR & {...}, ADMIN_INFO & {...}, IPtr<ICertGetConfig,IID_ICertGetConfig> & {...}) line 2361 + 19 bytes
callXenroll(char * 0x0233ab5c, char * 0x0012dcf0, int 1, TAGCertStates MD_CERT_ENROLL_ENTERING_DATA, ADMIN_INFO & {...}) line 830 + 17 bytes
Finish_NewCertWiz(ADMIN_INFO & {...}, CString & {""}) line 701 + 34 bytes

	==> it will retrieve a ConfigString like "TPOP_DELL\Your Name" <== strange name...



    hr = x->put_GenKeyFlags( (DWORD) CRYPT_EXPORTABLE);  // in VB use '1' its value see wincrypt.h
&
    hr = x->put_ProviderType( pdwType ); // we need PROV_RSA_SCHANNEL but use PROV_RSA_FULL
	in the code there is a popup that will ask which to use
&
    hr = x->put_HashAlgorithmWStr(L"MD5");

SeeIf_keysExport_or_MD5(ADMIN_INFO & {...}, int 1, IPtr<IEnroll,IID_IEnroll> & {...}) line 2430 + 10 bytes
callXenroll(char * 0x0233ab5c, char * 0x0012dcf0, int 1, TAGCertStates MD_CERT_ENROLL_ENTERING_DATA, ADMIN_INFO & {...}) line 924 + 20 bytes
Finish_NewCertWiz(ADMIN_INFO & {...}, CString & {""}) line 701 + 34 bytes

    DWORD  dwFlags = 0;
    hr = x->get_MyStoreFlags( &dwFlags);

    dwFlags &= ~CERT_SYSTEM_STORE_LOCATION_MASK ;
    dwFlags |= CERT_SYSTEM_STORE_LOCAL_MACHINE  ;

     hr = x->put_MyStoreFlags( dwFlags);
ForceCertIntoLocalMachineMyStore(ADMIN_INFO & {...}, IPtr<IEnroll,IID_IEnroll> & {...}) line 230 + 12 bytes
callXenroll(char * 0x0233ab5c, char * 0x0012dcf0, int 1, TAGCertStates MD_CERT_ENROLL_ENTERING_DATA, ADMIN_INFO & {...}) line 975 + 16 bytes
Finish_NewCertWiz(ADMIN_INFO & {...}, CString & {""}) line 701 + 34 bytes


      hr = x->createPKCS10WStr(IN BSTR2LPCWSTR(DN), IN BSTR2LPCWSTR(Usage), OUT &PKCS10Blob);
		// line: 1178 in nLocEnrl.cpp [as of date 4-12-98 v14 in Slim]
		DN="CN=localhost.explorer.TPOP.microsoft.com;O=tjpExploration Air;OU=IIS;C=US;S=Washington;L=Seattle"
	  Usage="1.3.6.1.5.5.7.3.1,1.3.6.1.4.1.311.10.3.1"
callXenroll(char * 0x0233ab5c, char * 0x0012dcf0, int 1, TAGCertStates MD_CERT_ENROLL_ENTERING_DATA, ADMIN_INFO & {...}) line 1178 + 36 bytes
Finish_NewCertWiz(ADMIN_INFO & {...}, CString & {""}) line 701 + 34 bytes
DoWizardFinish(ADMIN_INFO & {...}) line 282 + 14 bytes

    WCHAR*  wszContainerName=0;
    hr = x->get_ContainerNameWStr( &wszContainerName );
	// after this call wszContainerName is: "f6d013e1-d269-11d1-8ac9-00c04fd42c51"
GetContainerName_fromXenroll_storeInMetabase(ADMIN_INFO & {...}, IPtr<IEnroll,IID_IEnroll> & {...}) line 2525 + 12 bytes
callXenroll(char * 0x0233ab5c, char * 0x0012dcf0, int 1, TAGCertStates MD_CERT_ENROLL_ENTERING_DATA, ADMIN_INFO & {...}) line 1184 + 16 bytes
Finish_NewCertWiz(ADMIN_INFO & {...}, CString & {""}) line 701 + 34 bytes

    //////////////////////////////////////////////////////////////////
    // The following will free the blob and set the byte count
    // to Zero for safety (if the upper layer still has a ptr to it).
    //////////////////////////////////////////////////////////////////
    if(PKCS10Blob.pbData) {
        if (bWeAllocated_PKCS10Blob_pbData) // if we allocate it, call XFree
                XFree(PKCS10Blob.pbData);   //  otherwise Xenroll allocated
        else                                //  it so call 'freeRequestInfoBlob'
                x->freeRequestInfoBlob(PKCS10Blob);

AddBeginEndWrappers(_CRYPTOAPI_BLOB & {...}, int 0, CComBSTR & {...}, unsigned long & 258, ADMIN_INFO & {...}, IPtr<IEnroll,IID_IEnroll> & {...}) line 2908 + 18 bytes
callXenroll(char * 0x0233ab5c, char * 0x0012dcf0, int 1, TAGCertStates MD_CERT_ENROLL_ENTERING_DATA, ADMIN_INFO & {...}) line 1247 + 44 bytes
Finish_NewCertWiz(ADMIN_INFO & {...}, CString & {""}) line 701 + 34 bytes

   hr = spICertRequest->Submit(SubmitFlag, bstrPKCS10, Attributes, ConfigString,
                                OUT &DispositionCode );
   //SubmitFlag=258,for binary data in BSTR bstrPKCS10
   //Attributes=""
   //ConfigString="TPOP_DELL\Your Name"  [the string we queried earlier]
   //DispositionCode=3 after the successful operation
Send2CA(CComBSTR & {...}, CComBSTR & {...}, unsigned long & 258, CComBSTR & {...}, ADMIN_INFO & {...}, IPtr<ICertRequest,IID_ICertRequest> & {...}) line 3272 + 45 bytes
callXenroll(char * 0x0233ab5c, char * 0x0012dcf0, int 1, TAGCertStates MD_CERT_ENROLL_ENTERING_DATA, ADMIN_INFO & {...}) line 1353 + 38 bytes
Finish_NewCertWiz(ADMIN_INFO & {...}, CString & {""}) line 701 + 34 bytes


    hr = spICertRequest->GetCertificate(GetCertFlag, OUT &bstrPKCS7Certificate);
	//GetCertFlag=257,because we want a base64 string output
Send2CA(CComBSTR & {...}, CComBSTR & {...}, unsigned long & 258, CComBSTR & {...}, ADMIN_INFO & {...}, IPtr<ICertRequest,IID_ICertRequest> & {...}) line 3355 + 21 bytes
callXenroll(char * 0x0233ab5c, char * 0x0012dcf0, int 1, TAGCertStates MD_CERT_ENROLL_ENTERING_DATA, ADMIN_INFO & {...}) line 1353 + 38 bytes
Finish_NewCertWiz(ADMIN_INFO & {...}, CString & {""}) line 701 + 34 bytes


            hr = x->put_RootStoreNameWStr (wszName);
			//wszName="CA"
callXenroll(char * 0x0233ab5c, char * 0x0012dcf0, int 1, TAGCertStates MD_CERT_ENROLL_ENTERING_DATA, ADMIN_INFO & {...}) line 1414 + 18 bytes
Finish_NewCertWiz(ADMIN_INFO & {...}, CString & {""}) line 701 + 34 bytes
DoWizardFinish(ADMIN_INFO & {...}) line 282 + 14 bytes

        hr = x->acceptPKCS7Blob( &PKCS7Blob );
callXenroll(char * 0x0233ab5c, char * 0x0012dcf0, int 1, TAGCertStates MD_CERT_ENROLL_ENTERING_DATA, ADMIN_INFO & {...}) line 1822 + 15 bytes
Finish_NewCertWiz(ADMIN_INFO & {...}, CString & {""}) line 701 + 34 bytes
DoWizardFinish(ADMIN_INFO & {...}) line 282 + 14 bytes

    if (  (PKCS7Blob.cbData == 0)
          || ((pCertContext = x->getCertContextFromPKCS7( 
                        	IN /*PCRYPT_DATA_BLOB*/ &PKCS7Blob )) == 0))
callXenroll(char * 0x0233ab5c, char * 0x0012dcf0, int 1, TAGCertStates MD_CERT_ENROLL_ENTERING_DATA, ADMIN_INFO & {...}) line 1845 + 21 bytes
Finish_NewCertWiz(ADMIN_INFO & {...}, CString & {""}) line 701 + 34 bytes
DoWizardFinish(ADMIN_INFO & {...}) line 282 + 14 bytes


Now I am trying:  http://pkstl1/CertSrv/CertEnroll/krenroll.asp
===  its another cert server.  We get the same error 0x80093005


==For this CertServer:  http://certsrv/CertSrv/CertEnroll/ceaccept.asp
==This is what we get back from createPKCS10 when doing a renewal request
==its pretty big: >4098 chars.  When I give this to CertServer I get an error code
==of 0x80093005

-----BEGIN NEW CERTIFICATE REQUEST-----
MIIMHQYJKoZIhvcNAQcCoIIMDjCCDAoCAQExCzAJBgUrDgMCGgUAMIIGngYJKoZI
hvcNAQcBoIIGjwSCBoswggaHMIIGNQIBADAAMFwwDQYJKoZIhvcNAQEBBQADSwAw
SAJBALSnpRBe3rvyzH7fFaNYhI/bm8jhFX5/Fy5ySGqJoVlVAG1eW2EiGhhITW46
bKSZFvmItHw7s/U5q6NRiMvHpLcCAwEAAaCCBc4wIAYKKwYBBAGCNwIBDjESMBAw
DgYDVR0PAQH/BAQDAgHAMIIBSwYKKwYBBAGCNw0CAjGCATswggE3HoGoAE0AaQBj
AHIAbwBzAG8AZgB0ACAAQgBhAHMAZQAgAEMAcgB5AHAAdABvAGcAcgBhAHAAaABp
AGMAIABQAHIAbwB2AGkAZABlAHIAIAB2ADEALgAwAAAAAAAFAAwBAAAIAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAFAAAAFADQABTcoAAgAGQAbABs
AAAADQADAQAADFNSMUEASAAAA4GJAIhSraSWBd0MUKT+LrIzrFo677g6+iRcJlNu
EpqWe/lKpcYBMgqHfTYjHqqLQpYPLgEkQXOlaUB1HJQbQQl0qjNXrYC+NMsqxb4I
vx/bfglMC0tj2niAkpKZxmgE9K+OYIRvHn5DNu0FKSr+fOd9MpEstUFNCqSoyslZ
3tEnCM9WAAAAAAAAAAAwggRZBgkrBgEEAYI3DQExggRKMIIERjCCA/CgAwIBAgII
Gb0Z4QAABrEwDQYJKoZIhvcNAQEEBQAwgZMxCzAJBgNVBAYTAlVTMQswCQYDVQQI
EwJXQTEQMA4GA1UEBxMHUmVkbW9uZDETMBEGA1UEChMKV2luZG93cyBOVDEbMBkG
A1UECxMSRGlzdHJpYnV0ZWQgU3lzdGVtMTMwMQYDVQQDEypNaWNyb3NvZnQgQ2Vy
dGlmaWNhdGUgU2VydmVyIFRlc3QgR3JvdXAgQ0EwHhcNOTgwNDA2MjE0MTIwWhcN
OTgxMDE0MTgxMTI4WjBzMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3Rv
bjEQMA4GA1UEBxMHUmVkbW9uZDESMBAGA1UEChMJTWljcm9zb2Z0MQwwCgYDVQQL
EwNJSVMxGzAZBgNVBAMTEmJveWQubWljcm9zb2Z0LmNvbTBcMA0GCSqGSIb3DQEB
AQUAA0sAMEgCQQD+vFXGy/7SkbMUdugDhptekRIT4n6Dw5OKUygYgC6w7IcWcxUk
SAYO4QZVbuMoCzN2OAuoGqIQ3i/k/n0T+cvbAgMBAAGjggJFMIICQTALBgNVHQ8E
BAMCADgwHwYDVR0lBBgwFgYIKwYBBQUHAwEGCisGAQQBgjcKAwEwgc8GA1UdIwSB
xzCBxIAUt4UyEbgWWjom4bdQ2Y501IPyIkWhgZmkgZYwgZMxCzAJBgNVBAYTAlVT
MQswCQYDVQQIEwJXQTEQMA4GA1UEBxMHUmVkbW9uZDETMBEGA1UEChMKV2luZG93
cyBOVDEbMBkGA1UECxMSRGlzdHJpYnV0ZWQgU3lzdGVtMTMwMQYDVQQDEypNaWNy
b3NvZnQgQ2VydGlmaWNhdGUgU2VydmVyIFRlc3QgR3JvdXAgQ0GCEBETYQCqAP6F
EdFEueIoFGMwgb0GA1UdHwSBtTCBsjBWoFSgUoZQaHR0cDovL0NFUlRTUlYvQ2Vy
dFNydi9DZXJ0RW5yb2xsL01pY3Jvc29mdCBDZXJ0aWZpY2F0ZSBTZXJ2ZXIgVGVz
dCBHcm91cCBDQS5jcmwwWKBWoFSGUmZpbGU6Ly9cXENFUlRTUlZcQ2VydFNydlxD
ZXJ0RW5yb2xsXE1pY3Jvc29mdCBDZXJ0aWZpY2F0ZSBTZXJ2ZXIgVGVzdCBHcm91
cCBDQS5jcmwwCQYDVR0TBAIwADB0BggrBgEFBQcBAQRoMGYwZAYIKwYBBQUHMAKG
WGh0dHA6Ly9DRVJUU1JWL0NlcnRTcnYvQ2VydEVucm9sbC9DRVJUU1JWX01pY3Jv
c29mdCBDZXJ0aWZpY2F0ZSBTZXJ2ZXIgVGVzdCBHcm91cCBDQS5jcnQwDQYJKoZI
hvcNAQEEBQADQQAMUda1ACOj+imFQF3z/7ThA+LEB3Inhy6wX5Dn7gK4+lDXiijo
qWZOD29ahmYQ+z+Lx6TO0zeVK4SBBbGm6h6fMAkGBSsOAwIdBQADQQCUpydHmmrC
ukAadubMOJzboBM7fhn0Ip4ketWSOmkZ15Vp39VFMcfXkwupuKe//6WGfqBo4eX5
f8cpOZ7QDdB+oIIESjCCBEYwggPwoAMCAQICCBm9GeEAAAaxMA0GCSqGSIb3DQEB
BAUAMIGTMQswCQYDVQQGEwJVUzELMAkGA1UECBMCV0ExEDAOBgNVBAcTB1JlZG1v
bmQxEzARBgNVBAoTCldpbmRvd3MgTlQxGzAZBgNVBAsTEkRpc3RyaWJ1dGVkIFN5
c3RlbTEzMDEGA1UEAxMqTWljcm9zb2Z0IENlcnRpZmljYXRlIFNlcnZlciBUZXN0
IEdyb3VwIENBMB4XDTk4MDQwNjIxNDEyMFoXDTk4MTAxNDE4MTEyOFowczELMAkG
A1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQx
EjAQBgNVBAoTCU1pY3Jvc29mdDEMMAoGA1UECxMDSUlTMRswGQYDVQQDExJib3lk
Lm1pY3Jvc29mdC5jb20wXDANBgkqhkiG9w0BAQEFAANLADBIAkEA/rxVxsv+0pGz
FHboA4abXpESE+J+g8OTilMoGIAusOyHFnMVJEgGDuEGVW7jKAszdjgLqBqiEN4v
5P59E/nL2wIDAQABo4ICRTCCAkEwCwYDVR0PBAQDAgA4MB8GA1UdJQQYMBYGCCsG
AQUFBwMBBgorBgEEAYI3CgMBMIHPBgNVHSMEgccwgcSAFLeFMhG4Flo6JuG3UNmO
dNSD8iJFoYGZpIGWMIGTMQswCQYDVQQGEwJVUzELMAkGA1UECBMCV0ExEDAOBgNV
BAcTB1JlZG1vbmQxEzARBgNVBAoTCldpbmRvd3MgTlQxGzAZBgNVBAsTEkRpc3Ry
aWJ1dGVkIFN5c3RlbTEzMDEGA1UEAxMqTWljcm9zb2Z0IENlcnRpZmljYXRlIFNl
cnZlciBUZXN0IEdyb3VwIENBghARE2EAqgD+hRHRRLniKBRjMIG9BgNVHR8EgbUw
gbIwVqBUoFKGUGh0dHA6Ly9DRVJUU1JWL0NlcnRTcnYvQ2VydEVucm9sbC9NaWNy
b3NvZnQgQ2VydGlmaWNhdGUgU2VydmVyIFRlc3QgR3JvdXAgQ0EuY3JsMFigVqBU
hlJmaWxlOi8vXFxDRVJUU1JWXENlcnRTcnZcQ2VydEVucm9sbFxNaWNyb3NvZnQg
Q2VydGlmaWNhdGUgU2VydmVyIFRlc3QgR3JvdXAgQ0EuY3JsMAkGA1UdEwQCMAAw
dAYIKwYBBQUHAQEEaDBmMGQGCCsGAQUFBzAChlhodHRwOi8vQ0VSVFNSVi9DZXJ0
U3J2L0NlcnRFbnJvbGwvQ0VSVFNSVl9NaWNyb3NvZnQgQ2VydGlmaWNhdGUgU2Vy
dmVyIFRlc3QgR3JvdXAgQ0EuY3J0MA0GCSqGSIb3DQEBBAUAA0EADFHWtQAjo/op
hUBd8/+04QPixAdyJ4cusF+Q5+4CuPpQ14oo6KlmTg9vWoZmEPs/i8ekztM3lSuE
gQWxpuoenzGCAQYwggECAgEBMIGgMIGTMQswCQYDVQQGEwJVUzELMAkGA1UECBMC
V0ExEDAOBgNVBAcTB1JlZG1vbmQxEzARBgNVBAoTCldpbmRvd3MgTlQxGzAZBgNV
BAsTEkRpc3RyaWJ1dGVkIFN5c3RlbTEzMDEGA1UEAxMqTWljcm9zb2Z0IENlcnRp
ZmljYXRlIFNlcnZlciBUZXN0IEdyb3VwIENBAggZvRnhAAAGsTAJBgUrDgMCGgUA
MA0GCSqGSIb3DQEBAQUABEDMqxiFfAXZ11mtHC2/qRlbB2jtU4bW8EKOWpzOCkig
wsztKwHdqXT0fznLWG790nGfFk9IJ440dAnBSGy4P6J0

-----END NEW CERTIFICATE REQUEST-----

REM Enabling debug
REM
REM If using the NT command shell use:
\\tpophp\public\registry -s -k"HKEY_CURRENT_USER\Software\Microsoft\CertMap\Debug" -n Enabled  -v "TRUE"
\\tpophp\public\registry -s -k"HKEY_CURRENT_USER\Software\Microsoft\CertMap\Debug" -n Mode  -v "Aging"

REM
REM  If you use mks shell use
REM    registry -s -k"HKEY_CURRENT_USER\\Software\\Microsoft\\CertMap\\Debug" -n Enabled  -v "TRUE"
REM    registry -s -k"HKEY_CURRENT_USER\\Software\\Microsoft\\CertMap\\Debug" -n Mode  -v "Aging"

[D:/work/test] ./mdutil enum w3svc/info
  MajorVersion                  : [S]     (DWORD)  0x4={4}
  MinorVersion                  : [S]     (DWORD)  0x0={0}
  ServerPlatform                : [S]     (DWORD)  0x1={1}
  Capabilities                  : [S]     (DWORD)  0xfbf={4031} <<===
  ServerConfigurationInfo       : [S]     (DWORD)  0xe={14}
  KeyType                       : [S]     (STRING) "IIsWebInfo"

The Capabilities setting will give us the answer to whether this
web server is International or Domestic and allow us to Fix the #Bits
in the key.

After running CertWiz you can expect to see this with MDutil.  The lines
with ==>  are added by CertWiz

D:\work\test>mdutil enum w3svc\1
  ServerSize                    : [IS]    (DWORD)  0x1={Medium}
  Win32Error                    : [S]     (DWORD)  0x0={0}
  6269                          : [F]     (DWORD)  0x1234={4660}
  ServerState                   : [S]     (DWORD)  0x4={Stopped}
  5534                          : [IS]    (DWORD)  0x0={0}
  5532                          : [IS]    (DWORD)  0x352742d0={891765456}
  5533                          : [IS]    (DWORD)  0xd={13}
  5531                          : [IS]    (DWORD)  0xd0ddd00d={-790769651}
  ServerComment                 : [IS]    (STRING) "Default Web Site"
  KeyType                       : [S]     (STRING) "IIsWebServer"
  5513                          : [IS]    (STRING) "Tom"
  5507               ==>        : [IS]    (STRING) "{9D11875D-D144-E285-0F78-C6732D7E1483}"
  5511               ==>        : [IS]    (STRING) "MY"
  5506               ==>        : [IS]    (BINARY) 0xa1 32 6e 8d 3e 4c ea 5c c6 c2 d0 18 65 17 d7 de 3e a3 ed 53
  ServerBindings                : [IS]    (MULTISZ) ":80:"
  SecureBindings                : [IS]    (MULTISZ) ":443:"



SysAllocStringLen can have embedded nulls use:

BSTR SysAllocStringLen( OLECHAR FAR* pch, unsigned int cch )
 



This version of MsgBox uses the string resource with the ID [nIDPrompt] to
display a message in the message box. The associated Help page is found
through the value of nIDHelp. If the default value of nIDHelp is
used (<28> 1), the string resource ID, nIDPrompt, is used for the Help context.
For more information about defining Help contexts, see the article Help
Topics in Visual C++ Programmer's Guide and Technical Note 28.

This version of MsgBox uses the string resource with the ID [nIDPrompt] to
// when doing key ring import we ran into trouble when we tried to do a ViewCert
// and passed in the cert pointer:  here is the code from NKMuxPg.cpp near ln 1258
    if (pCertContext!=0)
    {

        if (YesNoMsgBox( 

            Easy::Load(szResourceStr,
             IDS_WOULD_YOU_LIKE_TO_VIEW_THE_CERTIFICATE_THAT_YOU_JUST_IMPORTED
             // "Would you like to view the Certificate that you just imported?"
            )))
        {
            
            ViewACert( pCertContext );
// after hitting break in the debugger we get the following stack dump
NTDLL! 77f98bb3()
MSAFD! 77514dd7()
WS2_32! 7756357b()
WSOCK32! 775811d7()


// as we call FinCertImport::OnWizardFinish() that will take the filename
// c:/tmp/newcert318.cer and process it in Xenroll to finalize the OOB
// this is the stack

CFinCertImport::OnWizardFinish() line 212
MFC42! 5f46f278()
MFC42! 5f40230b()
MFC42! 5f402294()
MFC42! 5f40221f()
AfxWndProcDllStatic(HWND__ * 0x000c0a0c, unsigned int 78, unsigned int 0, long 1237948) line 57 + 21 bytes
USER32! 77e753d0()
USER32! 77e762d5()
COMCTL32! 779f709a()
COMCTL32! 77a035a6()
COMCTL32! 77a30fd1()
COMCTL32! 77a31e74()
USER32! 77e87983()
USER32! 77e8be30()
USER32! 77e75bc1()
MFC42! 5f402783()
MFC42! 5f402322()
MFC42! 5f402294()
MFC42! 5f40221f()
AfxWndProcDllStatic(HWND__ * 0x00350812, unsigned int 273, unsigned int 12325, long 3213652) line 57 + 21 bytes
USER32! 77e753d0()
USER32! 77e762d5()
USER32! 77e8f3d1()
USER32! 77e91486()
USER32! 77e7387f()
USER32! 77e79704()
USER32! 77e8ddab()


// when we run xenroll to finish an OOB and we get a error this is typically
// what the call stack will be

DisplayError_ErrorReturn(long -2146885628, ADMIN_INFO & {...}, char * 0x00c43854) line 3796
DisplayError_ErrorReturn(long -2146885628, ADMIN_INFO & {...}, unsigned int 4068, TAGCertStates MD_CERT_ENROLL_RECVED_ERR_FROM_ENROLL) line 3879 + 17 bytes
callXenroll(char * 0x5f4c86bc, char * 0x0012e0f4, int 4, TAGCertStates MD_CERT_ENROLL_PROCESSING_PKCS7_OUTOFBAND, ADMIN_INFO & {...}) line 1652 + 23 bytes
Finish_FinishOOBCertWiz(ADMIN_INFO & {...}, CString & {""}) line 519 + 34 bytes
CFinCertImport::OnWizardFinish() line 263 + 26 bytes
MFC42! 5f46f278()
MFC42! 5f40230b()
MFC42! 5f402294()
MFC42! 5f40221f()
AfxWndProcDllStatic(HWND__ * 0x000c0a24, unsigned int 78, unsigned int 0, long 1238152) line 57 + 21 bytes
USER32! 77e753d0()
USER32! 77e762d5()
COMCTL32! 779f709a()
COMCTL32! 77a035a6()
COMCTL32! 77a30fd1()
COMCTL32! 77a31e74()
USER32! 77e87983()
USER32! 77e8be30()



The second form of the function uses the string resource with the ID nIDPrompt to display a message in the message box. The associated Help page is found through the value of nIDHelp. If the default value of nIDHelp is used (<28> 1), the string resource ID, nIDPrompt, is used for the Help context. For more information about defining Help contexts, see the article Help Topics in Visual C++ Programmer's Guide and Technical Note 28. 





00125DCC  30 82 04 2D 30 82 03 D7 A0  0<>.-0<>.נ
00125DD5  03 02 01 02 02 08 06 A6 C6  .......<2E><>
00125DDE  5C 00 00 05 BD 30 0D 06 09  \...<2E>0..	
00125DE7  2A 86 48 86 F7 0D 01 01 04  *<2A>H<86><48>....
00125DF0  05 00 30 81 93 31 0B 30 09  ..0.<2E>1.0	
00125DF9  06 03 55 04 06 13 02 55 53  ..U....US
00125E02  31 0B 30 09 06 03 55 04 08  1.0	..U..
00125E0B  13 02 57 41 31 10 30 0E 06  ..WA1.0..
00125E14  03 55 04 07 13 07 52 65 64  .U....Red
00125E1D  6D 6F 6E 64 31 13 30 11 06  mond1.0..
00125E26  03 55 04 0A 13 0A 57 69 6E  .U....Win
00125E2F  64 6F 77 73 20 4E 54 31 1B  dows NT1.
00125E38  30 19 06 03 55 04 0B 13 12  0...U....
00125E41  44 69 73 74 72 69 62 75 74  Distribut
00125E4A  65 64 20 53 79 73 74 65 6D  ed System
00125E53  31 33 30 31 06 03 55 04 03  1301..U..
00125E5C  13 2A 4D 69 63 72 6F 73 6F  .*Microso
00125E65  66 74 20 43 65 72 74 69 66  ft Certif
00125E6E  69 63 61 74 65 20 53 65 72  icate Ser
00125E77  76 65 72 20 54 65 73 74 20  ver Test 
00125E80  47 72 6F 75 70 20 43 41 30  Group CA0

"CertificateAuthority.Request"  is the request object that we use in VB
0012D5E8  F0 F3 AF 98 24 55 D0 11 88 12 00
0012D5F3  A0 C9 03 B8 3C

Using this code:
            if (Util::PeekBool(++cStepCnt > 0)    // a failure here will have cnt=1
                && (hr=E_FAIL) // trick so that we get a nice error code if the bstr extract fails
                && bstr 
                
                && Util::PeekBool(++cStepCnt > 0)   // a failure here will have cnt=2, etc...
                && SUCCEEDED( hr=convertPKCS7_BSTR2Blob( IN  /*CComBSTR& */ bstrPKCS7Contents,
                                        OUT /*CRYPT_DATA_BLOB&*/  PKCS7Blob) )

                && Util::PeekBool(++cStepCnt > 0)
                && SUCCEEDED( hr = x->acceptPKCS7Blob( IN /*PCRYPT_DATA_BLOB*/  &PKCS7Blob))


I am getting a HR of 0x80093009   <-- a failure from the acceptPKCS7Blob
									   any ideas?  I believe that I imported and decoded
									   it properly, I will show the cert below also
									   as an attachment.
						>> I think that the code is sound but the Cert Server gave
						>> me a bad cert file.  BECAUSE if I click on the pkcs7.cer
						>> file under NT's fileExplorer it says "Invalid Security Cert File"


PKCS7Blob.cbData = 1748  The PKCS7Blob.pbData = 0x00128864
Here is the first part of my PKCS7Blob:

00128864  50 44 FC 77 D8 D1 18 00 00 00 14  PD<50>w<FC><77>.....
0012886F  00 E0 D1 18 00 E8 88 12 00 2B E8  .<2E><>..<2E><>..+<2B>
0012887A  FB 77 81 E8 FB 77 48 05 14 00 00  <20>w.<2E><>wH....
00128885  00 14 00 E0 D1 18 00 50 10 4B 00  ...<2E><>..P.K.
00128890  38 00 00 00 48 88 12 00 C0 D6 18  8...H<>..<2E><>.
0012889B  00 3C 89 12 00 50 44 FC 77 68 2D  .<<3C>..PD<50>wh-
001288A6  F9 77 FF FF FF FF 4C 89 12 00 37  <20>w<F9><77><FF><FF>L<FF>..7
001288B1  FF FA 77 00 00 14 00 61 00 00 50  <20><>w....a..P
001288BC  01 D6 18 00 00 00 14 00 70 F3 14  .<2E>......p<>.
001288C7  00 00 00 00 00 70 89 12 00 00 00  .....p<>....
001288D2  14 00 AD 00 FB 77 80 F3 14 00 F8  ..<2E>.<2E>w<FB><77>..<2E>





0018CAD0  30 82 01 74 30 82 01 22 02 01 00  0<>.t0<74>."...
0018CADB  30 81 85 31 28 30 26 06 03 55 04  0.<2E>1(0&..U.
0018CAE6  03 13 1F 77 77 77 2E 32 54 50 4F  ...www.2TPO
0018CAF1  50 44 45 4C 4C 2E 64 6E 73 2E 6D  PDELL.dns.m
0018CAFC  69 63 72 6F 73 6F 66 74 2E 63 6F  icrosoft.co
0018CB07  6D 31 12 30 10 06 03 55 04 0A 13  m1.0...U...
0018CB12  09 4D 69 63 72 6F 73 6F 66 74 31  	Microsoft1
0018CB1D  11 30 0F 06 03 55 04 0B 13 08 49  .0...U....I
0018CB28  49 53 44 65 76 32 32 31 0B 30 09  ISDev221.0	
0018CB33  06 03 55 04 06 13 02 55 53 31 13  ..U....US1.
0018CB3E  30 11 06 03 55 04 08 13 0A 57 61  0...U....Wa
0018CB49  73 68 69 6E 67 74 6F 6E 31 10 30  shington1.0
0018CB54  0E 06 03 55 04 07 13 07 52 65 64  ...U....Red
0018CB5F  6D 6F 6E 64 30 5C 30 0D 06 09 2A  mond0\0..	*
0018CB6A  86 48 86 F7 0D 01 01 01 05 00 03  <20>H<86><48>.......
0018CB75  4B 00 30 48 02 41 00 DF 81 A8 A9  K.0H.A.<2E>.<2E><>
0018CB80  7A 1A E6 0F A9 66 49 6E 6A 65 A1  z.<2E>.<2E>fInje<6A>
0018CB8B  E2 2E A5 8E 89 D5 4D E0 91 3D 6C  <20>.<2E><><A5><8E>M<D5><4D>=l
0018CB96  EE 0B E7 52 43 9E CD 2C 15 E7 48  <20>.<2E>RC<52><43>,.<2E>H
0018CBA1  85 64 A5 2E BD 14 A7 12 D4 56 90  <20>d<85>.<2E>.<2E>.<2E>V.
0018CBAC  40 98 A9 BB 47 09 77 F2 96 FB 33  @<40><><98>G	w<><77><F2>3
0018CBB7  11 40 B0 A2 B1 02 03 01 00 01 A0  .@<40><><B0>.....<2E>
0018CBC2  37 30 35 06 0A 2B 06 01 04 01 82  705..+....<2E>
0018CBCD  37 02 01 0E 31 27 30 25 30 0E 06  7...1'0%0..
========================================================================
		ActiveX CertWizard Control DLL : CERTMAP
========================================================================

1. Enabling Debugging

	/////////////////////////////////////////////////////////////////////
	//
	//   If using the NT command shell use:
	// registry -s -k"HKEY_CURRENT_USER\Software\Microsoft\CertMap\Debug" -n Enabled  -v "TRUE"
	//
	//
	//  All you MKS shell users can enable it by doing:
	// registry -s -k"HKEY_CURRENT_USER\\Software\\Microsoft\\CertMap\\Debug" -n Enabled  -v "TRUE"
	//
	//   [if you want the aging feature that rescans every 12 calls, then
	//    you also need to set MODE=Aging]
	//
	//    If using the NT command shell use:
	//    registry -s -k"HKEY_CURRENT_USER\Software\Microsoft\CertMap\Debug" -n Mode  -v "Aging"
	//    All you MKS shell users can enable it by doing:
	//    registry -s -k"HKEY_CURRENT_USER\\Software\\Microsoft\\CertMap\\Debug"-n Mode  -v "Aging"
	//
	//  Similarly for you MKS'sh-ers you can use the following command to test if its enabled:
	// registry -p -k"HKEY_CURRENT_USER\\Software\\Microsoft\\CertMap\\Debug"
	//  If it says:
	//
	//  HKEY_CURRENT_USER\Software\Microsoft\CertMap\Debug      Enabled "TRUE"
	//
	//  Its enabled!
	/////////////////////////////////////////////////////////////////////
//
//
//  Similarly for you MKS'sh-ers you can use the following command to test if its enabled:
// registry -p -k"HKEY_CURRENT_USER\\Software\\Microsoft\\CertMap\\Debug"
//  If it says:
//
//  HKEY_CURRENT_USER\Software\Microsoft\CertMap\Debug      Enabled "TRUE"

	If you dont have MKS just use the command regEdt32 to do it.

2. Testing the MS Cert Server Online CA
	You need to install at least a stub in the registry.  I do it
	with MKS ksh doing the following operations:  We need a Reg Key
	named "${CA}\\${MS}" to exist under HKEY_LOCAL_MACHINE.  The following
	code will just create it and install a {name=Enabled  value=True} setting
	
	MS="Microsoft Certificate Server"
	CA="Software\\Microsoft\\CertMap\\Parameters\\Certificate Authorities"
	registry -s -k"HKEY_LOCAL_MACHINE\\${CA}\\${MS}" -n Enabled -v True

	If you dont have MKS just use the command regEdt32 to do it.


3. What if CertServer is suspected of having problems or is not running?

Here is what we do:   ReInstall it by:
[C:/WINNT50/system32] sysocmgr -i:certmast.inf -n
Then check if it works by running -- this just prints out the config info
[C:/WINNT50/system32] ./certutil
Entry 0:
  Name:                         `Your Name'
  OrgUnit:                      `Your Unit'
  Organization:                 `Your Organization'
  Locality:                     `Your Locality'
  State:                        `Your State'
  Country:                      `US'
  Config:                       `TPOP_DELL\Your Name'
  SignatureCertificate:         `TPOP_DELL_Your Name.crt'
  Description:                  `Your Description.'
  Server:                       `TPOP_DELL'
  Authority:                    `Your Name'

For debugging you can fire up a testing tool that starts up a shell
window so that you can watch CertServer requests/tasks while it works:
[C:/WINNT50/system32] start certsrv -z

Note that if you want to run the above command YOU MUST MAKE SURE THAT
CERT SERVER IS STOPED FIRST SINCE IT WILL START IT AS A SERVICE AND
YOU CAN ONLY HAVE 1 CERT SERV SERVICE.  	Use the following to do it:
[C:/WINNT50/system32] net stop certsvc  
You might notice that we say certSVC not certSVR as in 'start certsrv -z'

========================================================================
		ActiveX Control DLL : CERTMAP
========================================================================

ControlWizard has created this project for your CERTMAP OLE Control DLL,
which contains 1 control.

This skeleton project not only demonstrates the basics of writing an OLE
Control, but is also a starting point for writing the specific features
of your control.

This file contains a summary of what you will find in each of the files
that make up your CERTMAP OLE Control DLL.

certmap.mak
	The Visual C++ project makefile for building your OLE Control.

certmap.h
	This is the main include file for the OLE Control DLL.  It
	includes other project-specific includes such as resource.h.

certmap.cpp
	This is the main source file that contains code for DLL initialization,
	termination and other bookkeeping.

certmap.rc
	This is a listing of the Microsoft Windows resources that the project
	uses.  This file can be directly edited with the Visual C++ resource
	editor.

certmap.def
	This file contains information about the OLE Control DLL that
	must be provided to run with Microsoft Windows.

certmap.clw
	This file contains information used by ClassWizard to edit existing
	classes or add new classes.  ClassWizard also uses this file to store
	information needed to generate and edit message maps and dialog data
	maps and to generate prototype member functions.

certmap.odl
	This file contains the Object Description Language source code for the
	type library of your control.

/////////////////////////////////////////////////////////////////////////////
Certmap control:

CertCtl.h
	This file contains the declaration of the CCertmapCtrl C++ class.

CertCtl.cpp
	This file contains the implementation of the CCertmapCtrl C++ class.

CertPpg.h
	This file contains the declaration of the CCertmapPropPage C++ class.

CertPpg.cpp
	This file contains the implementation of the CCertmapPropPage C++ class.

CertCtl.bmp
	This file contains a bitmap that a container will use to represent the
	CCertmapCtrl control when it appears on a tool palette.  This bitmap
	is included by the main resource file certmap.rc.

/////////////////////////////////////////////////////////////////////////////
Other standard files:

stdafx.h, stdafx.cpp
	These files are used to build a precompiled header (PCH) file
	named stdafx.pch and a precompiled types (PCT) file named stdafx.obj.

resource.h
	This is the standard header file, which defines new resource IDs.
	The Visual C++ resource editor reads and updates this file.

/////////////////////////////////////////////////////////////////////////////
Other notes:

ControlWizard uses "TODO:" to indicate parts of the source code you
should add to or customize.

/////////////////////////////////////////////////////////////////////////////