//private int GetCertificateCount(string storeName, StoreLocation storeLocation)
            //{
            //    return Do(store => store.Certificates.Count, storeName, storeLocation);
            //    //var store = Capi32.GetCertificateStore(storeName, storeLocation);
            //    //var x509Store = store.GetX509Store();

            //    //x509Store.Open(OpenFlags.ReadOnly);
            //    //var count = x509Store.Certificates.Count;
            //    //x509Store.Close();

            //    //return count;
            //}

            private T Do <T>(Func <X509Store, T> function, string storeName, StoreLocation storeLocation)
            {
                var store     = Capi32.GetCertificateStore(storeName, storeLocation);
                var x509Store = store.GetX509Store();

                x509Store.Open(OpenFlags.ReadOnly);
                var result = default(T);

                try
                {
                    result = function(x509Store);
                }
                finally { x509Store.Close(); }

                return(result);
            }
        public static void Test()
        {
            var systemStore = Capi32.GetSystemStores(CertificateStoreLocation.FromStoreLocation(StoreLocation.LocalMachine)).First();
            var store       = systemStore.GetX509Store();

            // See http://msdn.microsoft.com/en-us/library/aa376559%28VS.85%29.aspx : CERT_STORE_PROV_PHYSICAL
            //var store = new X509Store(systemStore.Name + "\\.Default", systemStore.Location.ToStoreLocation());

            store.Open(OpenFlags.ReadOnly);

            var certificates = store.Certificates;
            var crls         = store.GetCertificateRevocationLists();

            store.Close();

            MessageBox.Show(string.Format("Certificates Count = {0}\r\nCrls Count = {1}", certificates.Count, crls.Count()));
        }
        /// <summary>
        /// Fills the nodes of the treeview.
        /// </summary>
        private void FillNodes()
        {
            // The nodes
            rootNode                    = new TreeNodeEx(SR.CertificateStores);
            rootNode.ImageIndex         = STORES_IMAGE;
            rootNode.SelectedImageIndex = STORES_IMAGE;
            tvStores.Nodes.Add(rootNode);

            // 1st level: locations
            IEnumerable <CertificateStoreLocation> locations = null;

            if (ShowOtherLocations)
            {
                locations = Capi32.GetSystemStoreLocations();
            }
            else
            {
                locations = new StoreLocation[]
                {
                    StoreLocation.LocalMachine,
                    StoreLocation.CurrentUser
                }
            }.Select(l => CertificateStoreLocation.FromStoreLocation(l));