Example #1
0
        private void ThreadMainEnumDB()
        {
            if (m_bVolume) // Enumerate volumes.
            {
                Guid   guid = new Guid("ffffffffffffffffffffffffffffffff");
                int    cch  = 32;
                string str  = new String('\0', cch);
                while (Rapi.CeEnumDBVolumes(ref guid, str, cch) ==
                       Rapi.RAPI_TRUE && m_bContinue)
                {
                    strBuffer = str;
                    itReason  = INVOKE_ENUMDB.ENUMDB_NEWVOLUME;
                    m_ctlInvokeTarget.Invoke(m_deleCallback);
                }
            }
            else         // Enumerate databases.
            {
                short  cRecords = 0;
                IntPtr pfdbAll  = IntPtr.Zero;
                Rapi.CeFindAllDatabases(0,
                                        Rapi.FAD.FAD_NAME | Rapi.FAD.FAD_NUM_RECORDS,
                                        ref cRecords,
                                        ref pfdbAll);

                IntPtr pfdb = pfdbAll;
                while (cRecords > 0)
                {
                    // Set pointer to next record.
                    Rapi.CEDB_FIND_DATA dbfd =
                        (Rapi.CEDB_FIND_DATA)
                        Marshal.PtrToStructure(
                            pfdb, typeof(Rapi.CEDB_FIND_DATA));

                    // Post name to listbox.
                    strBuffer = dbfd.DbInfo.szDbaseName + " (" +
                                dbfd.DbInfo.wNumRecords + " records)";
                    itReason = INVOKE_ENUMDB.ENUMDB_NEWDATABASE;
                    m_ctlInvokeTarget.Invoke(m_deleCallback);

                    // Get ready for next loop.
                    pfdb = (IntPtr)((int)pfdb + Marshal.SizeOf(dbfd));
                    cRecords--;
                } // while

                // Free memory returned by CeFindAllDatabases.
                Rapi.CeRapiFreeBuffer(pfdbAll);
            } // if

            // Notify main thread that we are done.
            itReason = INVOKE_ENUMDB.ENUMDB_COMPLETE;
            m_ctlInvokeTarget.Invoke(m_deleCallback);

            // Mark thread as done.
            m_thrd = null;
        }
Example #2
0
        /// <summary>
        /// AddProgramsInDirectory - Recursive function to search
        /// into directory tree.
        /// </summary>
        /// <param name="strDir">Starting directory</param>
        /// <returns></returns>
        private bool AddProgramsInDirectory(string strDir)
        {
            Trace.WriteLine("FindPrograms: " +
                            "AddProgramsInDirectory (" + strDir + ")");

            // Update status bar through delegate function.
            strBuffer = "Searching in " + strDir + "...";
            itReason  = INVOKE_FINDFILES.STATUS_MESSAGE;
            m_ctlInvokeTarget.Invoke(m_deleCallback);

            // As we add programs, store directory names.
            ArrayList alDirectories = new ArrayList();

            // Start our search.
            string strSearch = strDir + "*.*";

            IntPtr pfdAllFiles = IntPtr.Zero; // Return pointer.
            int    cFound      = 0;           // Return count of files.

            // Call looking for all files in current directory.
            Rapi.CeFindAllFiles(strSearch,
                                Rapi.FAF.FAF_ATTRIBUTES |
                                Rapi.FAF.FAF_NAME,
                                ref cFound,
                                ref pfdAllFiles);

            // Loop through all files found.
            IntPtr pfd = pfdAllFiles;

            while (cFound > 0)
            {
                //
                // Here is the secret sauce. This function uses a
                // Win32 pointer to create a .NET object
                //
                Rapi.CE_FIND_DATA fd =                         // Output .NET object
                                       (Rapi.CE_FIND_DATA)     // Always cast this
                                       Marshal.PtrToStructure( // The function
                    pfd,                                       // Input Win32 ptr
                    typeof(Rapi.CE_FIND_DATA));                // Output type

                string strFileName = fd.cFileName;
                int    iFlag       = (int)
                                     Rapi.FILE_ATTRIBUTE.FILE_ATTRIBUTE_DIRECTORY;
                if ((fd.dwFileAttributes & iFlag) == iFlag)
                {
                    alDirectories.Add(strDir + fd.cFileName);
                }
                else
                {
                    if (strFileName.EndsWith(".EXE") ||
                        strFileName.EndsWith(".exe"))
                    {
                        m_cFiles++;

                        strBuffer = strDir + fd.cFileName;
                        itReason  = INVOKE_FINDFILES.FINDFILE_NEWFILE;
                        m_ctlInvokeTarget.Invoke(m_deleCallback);
                    }
                }

                // Get ready for next loop.
                pfd = (IntPtr)((int)pfd + Marshal.SizeOf(fd));
                cFound--;
            }

            // Free memory returned by CeFindAllFiles.
            Rapi.CeRapiFreeBuffer(pfdAllFiles);

            if (bThreadContinue && m_bIncludeSubDirs)
            {
                foreach (string str in alDirectories)
                {
                    AddProgramsInDirectory(str + "\\");
                }
            }

            return(true);
        }