certopensystemstore (crypt32)
Last changed: -67.152.152.11

.
Summary

C# Signature:

[DllImport("crypt32.dll", CharSet=CharSet.Auto, SetLastError=true)]
static extern IntPtr CertOpenSystemStore(IntPtr hCryptProv, string storename);

VB .NET Signature:

    <DllImport("Crypt32.dll", CharSet:=CharSet.Auto, SetLastError:=True)> _
    Private Shared Function CertOpenSystemStore( _
    ByVal hCryptProv As IntPtr, _
    ByVal storename As String) As IntPtr
    End Function

User-Defined Types:

None.

Notes:

Try MSDN: http://msdn.microsoft.com/en-us/library/ms867087.aspx

The sample code below seems to be taken from this.

Tips & Tricks:

Please add some!

Sample Code:

    using System;
    using System.Runtime.InteropServices;
    using System.Security.Cryptography.X509Certificates;
    using System.ComponentModel;

    public class WinCapi
    {

    /*
    HCERTSTORE   WINAPI CertOpenSystemStore(HCRYPTPROV hprov, LPTCSTR szSubsystemProtocol);
    BOOL      WINAPI CertCloseStore(HCERTSTORE hCertStore, DWORD dwFlags);

    PCCERT_CONTEXT WINAPI CertFindCertificateInStore(
     HCERTSTORE hCertStore,
     DWORD dwCertEncodingType,
     DWORD dwFindFlags,
     DWORD dwFindType,
     const void* pvFindPara,
     PCCERT_CONTEXT pPrevCertContext);

    BOOL WINAPI CertFreeCertificateContext(
      PCCERT_CONTEXT pCertContext
    ); */


    [DllImport("crypt32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    public static extern IntPtr CertOpenSystemStore(
       IntPtr hCryptProv,
       string storename);

    [DllImport("crypt32.dll", SetLastError = true)]
    public static extern bool CertCloseStore(
       IntPtr hCertStore,
       uint dwFlags);

    [DllImport("crypt32.dll", SetLastError = true)]
    public static extern IntPtr CertFindCertificateInStore(
       IntPtr hCertStore,
       uint dwCertEncodingType,
       uint dwFindFlags,
       uint dwFindType,
       [In, MarshalAs(UnmanagedType.LPWStr)]String pszFindString,
       IntPtr pPrevCertCntxt);

    [DllImport("crypt32.dll", SetLastError = true)]
    public static extern bool CertFreeCertificateContext(
       IntPtr hCertStore);
    }

    public class SimpleCert
    {
    const string MY = "MY";
    const string OTHERS = "AddressBook";
    const uint PKCS_7_ASN_ENCODING = 0x00010000;
    const uint X509_ASN_ENCODING = 0x00000001;
    const uint CERT_FIND_SUBJECT_STR = 0x00080007;

    static uint MY_ENCODING_TYPE = PKCS_7_ASN_ENCODING | X509_ASN_ENCODING;

    static string lpszCertSubject = "searched name";

    public static void Main()
    {
        IntPtr hSysStore = IntPtr.Zero;
        IntPtr hCertCntxt = IntPtr.Zero;

        hSysStore = WinCapi.CertOpenSystemStore(IntPtr.Zero, MY);
        Console.WriteLine("Store Handle:\t0x{0:X}", hSysStore.ToInt32());

        if (hSysStore != IntPtr.Zero)
        {
        hCertCntxt = WinCapi.CertFindCertificateInStore(
           hSysStore,
           MY_ENCODING_TYPE,
           0,
           CERT_FIND_SUBJECT_STR,
           lpszCertSubject,
           IntPtr.Zero);

        if (hCertCntxt != IntPtr.Zero)
        {  //use certcontext from managed code
            Console.WriteLine("CertContext:\t0x{0:X}", hCertCntxt.ToInt32());
            X509Certificate foundcert = new X509Certificate(hCertCntxt);
            Console.WriteLine("\nFound certificate with SubjectName string \"{0}\"", lpszCertSubject);
            Console.WriteLine("SubjectName:\t{0}", foundcert.GetName());
            Console.WriteLine("Serial No:\t{0}", foundcert.GetSerialNumberString());
            Console.WriteLine("HashString:\t{0}", foundcert.GetCertHashString());
        }
        else
            Console.WriteLine("Could not find SubjectName containing string \"{0}\"", lpszCertSubject);
        }
        //-------  Clean Up  -----------
        if (hCertCntxt != IntPtr.Zero)
        WinCapi.CertFreeCertificateContext(hCertCntxt);
        if (hSysStore != IntPtr.Zero)
        WinCapi.CertCloseStore(hSysStore, 0);
    }
    }

Alternative Managed API:

TODO

Documentation