Code:
#COMPILE EXE '#CC 4.03# #INCLUDE "Win32Api.Inc" '2003-03-27 GLOBAL hDlg AS DWORD GLOBAL hList AS DWORD %Listbox1 = 101 GLOBAL pick AS STRING, entry AS STRING, fileref AS STRING, pause AS LONG GLOBAL cBack AS LONG '______________________________________________________________________________ 'Registry Element Size Limits 'The following table identifies the size limits for the various registry elements. 'Key name ' 255 characters 'Value name ' 95/98/Me 255 characters ' 2000 260 characters ANSI ' 2000 16,383 characters Unicode ' other 16,383 characters 'Value ' Available memory (latest format) ' 1MB (standard format) ' Me/98/95: 16,300 bytes. 'For Windows 95, there is a 64K limit for the total size of all values of a key. '______________________________________________________________________________ 'REG_NONE No defined value type.(0) 'REG_SZ A null-terminated string. It will be a Unicode or ANSI string, ' depending on whether you use the Unicode or ANSI functions.(1) 'REG_EXPAND_SZ A null-terminated string that contains unexpanded references to ' environment variables (for example, "%PATH%"). ' It will be a Unicode or ANSI string depending on whether you use ' the Unicode or ANSI functions.(2) 'REG_BINARY Binary data in any form. (3) 'REG_DWORD A 32-bit number.(4) 'REG_DWORD_LITTLE_ENDIAN A 32-bit number in little-endian format (same as REG_DWORD). ' In little-endian format, the most significant byte of a word ' is the high-order byte. This is the most common format for ' computers running Windows NT and Windows 95.(4) 'REG_DWORD_BIG_ENDIAN A 32-bit number in big-endian format. In big-endian format, ' the most significant byte of a word is the low-order byte.(5) 'REG_LINK A Unicode symbolic link.(6) 'REG_MULTI_SZ An array of null-terminated strings, terminated by two null characters.(7) 'REG_RESOURCE_LIST A device-driver resource list.(8) '______________________________________________________________________________ FUNCTION GetSizeOfFile(FileSpec AS ASCIIZ, DateTime AS STRING) AS DOUBLE LOCAL FindData AS WIN32_FIND_DATA LOCAL systime AS SYSTEMTIME LOCAL ft AS FILETIME LOCAL szModifyDate AS ASCIIZ *36 LOCAL szModifyTime AS ASCIIZ * 36 LOCAL szSizeFormat AS ASCIIZ * 16 LOCAL szDF AS ASCIIZ * 36 LOCAL szTF AS ASCIIZ * 36 LOCAL l_hFindFile AS DWORD ' the formats in which dates and times are returned szDF = "MM'/'dd'/'yy" szTF = "hh':'mm':'ss tt" szSizeFormat = "###,###,###" FileSpec = TRIM$(FileSpec) l_hFindFile = FindFirstFile(FileSpec, FindData) IF l_hFindFile = %INVALID_HANDLE_VALUE THEN FUNCTION = -1 ELSE FUNCTION = FindData.nFileSizeHigh * &H100000000 + FindData.nFileSizeLow FileTimeToLocalFileTime FindData.ftLastWriteTime, ft FileTimeToSystemTime ft, SysTime GetDateFormat BYVAL %NULL, BYVAL %NULL, SysTime, szDf, szModifyDate, SIZEOF (szModifyDate) GetTimeFormat BYVAL %NULL, BYVAL %NULL, SysTime, szTF, szModifyTime, SIZEOF (szModifyTime) DateTime = szModifyDate & " " & szModifyTime FindClose l_hFindFile END IF END FUNCTION FUNCTION EnumValue(MainKey AS LONG, zStartHere AS ASCIIZ) AS LONG LOCAL zValueName AS ASCIIZ * 16384 LOCAL sData AS STRING * 16384 'Can be bigger LOCAL Buffer AS STRING LOCAL hKey AS DWORD LOCAL dwIndex AS DWORD LOCAL dwType AS DWORD LOCAL ListCount AS DWORD LOCAL ValueNameSize AS LONG LOCAL DataSize AS LONG LOCAL Retval AS LONG LOCAL Counter AS LONG IF pick=$ESC THEN EXIT FUNCTION IF RegOpenKeyEx(MainKey, zStartHere, 0, %KEY_READ, hKey) = %ERROR_SUCCESS THEN 'IF RegOpenKey(Key, zStartHere, hKey) = %ERROR_SUCCESS THEN dwIndex = 0 DO WHILE pick<>$ESC SLEEP 0 ValueNameSize = SIZEOF(zValueName) DataSize = SIZEOF(sData) Retval = RegEnumValue(hKey, dwIndex, zValueName, ValueNameSize, _ BYVAL %NULL,dwType, sData, DataSize) IF Retval <> %ERROR_SUCCESS THEN EXIT DO Buffer = LEFT$(zValueName, ValueNameSize) IF Buffer = "" THEN Buffer = "(Default)" SELECT CASE dwType CASE %REG_SZ Buffer = Buffer & " = " & LEFT$(sData, DataSize - 1) & " (REG_SZ)" CASE %REG_EXPAND_SZ Buffer = Buffer & " = " & LEFT$(sData, DataSize - 1) & " (REG_EXPAND_SZ)" CASE %REG_BINARY Buffer = Buffer & " = " FOR Counter = 1 TO DataSize Buffer = Buffer & " " & HEX$(ASC(sData, Counter),2) NEXT Buffer = Buffer & " (REG_BINARY " & FORMAT$(DataSize) & " bytes) CASE %REG_DWORD Buffer = Buffer & " = " & STR$(CVDWD(sData)) & " (REG_DWORD)" CASE %REG_MULTI_SZ REPLACE $NUL WITH ", " IN sData Buffer = Buffer & " = " & LEFT$(sData, DataSize - 2) & " (REG_MULTI_SZ)" CASE ELSE Buffer = Buffer & " (REG Data type is" & STR$(dwType) & ")" END SELECT entry=entry & " " & Buffer INCR dwIndex LOOP RegCloseKey hKey END IF END FUNCTION '______________________________________________________________________________ FUNCTION EnumKey(MainKey AS LONG, zStartHere AS ASCIIZ) AS LONG LOCAL zBuf AS ASCIIZ * 256 LOCAL zClass AS ASCIIZ * 256 LOCAL LastWriteTime AS FILETIME LOCAL ListCount AS DWORD LOCAL dwIndex AS LONG LOCAL BufLen AS LONG LOCAL ClassLen AS LONG LOCAL RetVal AS LONG LOCAL hKey AS LONG STATIC fault AS LONG STATIC dtg AS STRING STATIC Temp1 AS LONG STATIC Temp2 AS LONG IF pick=$ESC THEN EXIT FUNCTION IF RegOpenKeyEx(MainKey, zStartHere, 0, %KEY_ENUMERATE_SUB_KEYS, hKey) = %ERROR_SUCCESS THEN EnumValue MainKey, zStartHere 'Search for ValueName and Data DO WHILE pick<>$ESC SLEEP 0 BufLen = 256 ClassLen = 256 Retval = RegEnumKeyEx(hKey, dwIndex, zBuf, BufLen, 0, zClass, ClassLen, LastWriteTime) IF Retval <> %ERROR_SUCCESS THEN EXIT DO IF RIGHT$(entry,1)<>$LF THEN entry=RTRIM$(entry & $LF & " " & zBuf) EnumKey MainKey, TRIM$(zStartHere & "\" & zBuf,"\") 'Do a recursive search for more entry.. INCR dwIndex LOOP RegCloseKey hKey entry=TRIM$(entry,ANY "\ ") IF LEN(entry) THEN IF pick<>$ESC AND cBack=0 THEN COLOR 15,1-cBack PRINT entry END IF BufLen=0 DO WHILE pick<>$ESC SLEEP 0 REGEXPR "[a-z]:\\" IN entry AT BufLen+1 TO BufLen IF BufLen=0 THEN EXIT DO IF ASC(entry,BufLen-1)=34 THEN RetVal=INSTR(BufLen,entry,CHR$(34)) ELSE RetVal=INSTR(BufLen,entry," (REG") IF RetVal=0 THEN RetVal=LEN(entry)+1 ClassLen=BufLen+2 IF INSTR(entry,"+Silent") THEN BufLen=BufLen END IF DO temp1=INSTR(ClassLen+1,entry,"\") IF Temp1>RetVal THEN Temp1=0 IF Temp1 THEN ClassLen=Temp1 ELSE DO Temp1=INSTR(ClassLen,entry, ".") IF Temp1 AND Temp1<RetVal THEN ClassLen=Temp1+1 ELSE Temp1=INSTR(ClassLen,entry, ANY " ,+;:") IF Temp1 AND Temp1<RetVal THEN ClassLen=Temp1-1 EXIT DO END IF LOOP EXIT DO END IF LOOP IF ClassLen>BufLen THEN REGEXPR " [%\-/\q=\^]" IN entry AT BufLen TO ClassLen IF ClassLen AND ClassLen<RetVal THEN RetVal=ClassLen ClassLen=INSTR(BufLen, entry, ",") END IF IF ClassLen AND ClassLen<RetVal THEN RetVal=ClassLen END IF fault=0 IF RetVal>BufLen+3 THEN fileref=RTRIM$(MID$(entry,BufLen,RetVal-BufLen),"\") fault=DIR$(fileref,23)="" IF fault THEN IF cBack THEN COLOR 15,1-cBack PRINT entry END IF COLOR 14,4 'Yellow on Red means path\file not found ELSE COLOR 14,1-cBack 'Yellow on Blue just marks where a path\file reference is END IF PRINT fileref;SPACE$(SCREENX-CURSORX); COLOR 15,1-cBack PRINT END IF IF fault THEN FOR Temp1=ASC("C") TO ASC("Z") MID$(fileref,1)=CHR$(Temp1) IF DIR$(fileref,23)>"" THEN COLOR 14,2 'Yellow on Green means file found, different drive PRINT fileref; PRINT TAB(64)USING$("###,###,###,### ",GetSizeOfFile((fileref),dtg))dtg; COLOR 15,1-cBack PRINT END IF NEXT IF pick<>$ESC THEN pick=WAITKEY$ SELECT CASE pick CASE $TAB pause=NOT pause CASE $CR cBack=1-cBack CASE $ESC EXIT FUNCTION END SELECT ELSE ' SLEEP 200 END IF BufLen=RetVal LOOP entry="" END IF END IF DO IF pick<>$ESC THEN pick=INKEY$ SELECT CASE pick CASE $TAB pause=NOT pause CASE $CR cBack=1-cBack CASE $ESC EXIT FUNCTION END SELECT LOOP WHILE pause END FUNCTION '______________________________________________________________________________ FUNCTION PBMAIN LOCAL zStartHere AS ASCIIZ * 256 LOCAL HKey AS LONG, NKey AS INTEGER, KeyName AS STRING,label AS STRING COLOR 15,1 CONSOLE SCREEN 45,100 CLS CONSOLE NAME "Registry walk - Please wait..." FOR NKey = 1 TO 9 pick="" SELECT CASE NKey CASE 1 HKey=%HKEY_CLASSES_ROOT KeyName="HKEY_CLASSES_ROOT" CASE 2 HKey=%HKEY_CURRENT_USER KeyName="HKEY_CURRENT_USER" CASE 3 HKey=%HKEY_LOCAL_MACHINE KeyName="HKEY_LOCAL_MACHINE" CASE 4 HKey=%HKEY_USERS KeyName="HKEY_USERS" CASE 5 HKEY=%HKEY_PERFORMANCE_DATA KeyName="HKEY_PERFORMANCE_DATA" CASE 6 HKey=%HKEY_PERFORMANCE_TEXT KeyName="HKEY_PERFORMANCE_TEXT" CASE 7 HKey=%HKEY_PERFORMANCE_NLSTEXT KeyName="HKEY_PERFORMANCE_NLSTEXT" CASE 8 HKey=%HKEY_CURRENT_CONFIG KeyName="HKEY_CURRENT_CONFIG" CASE 9 HKey=%HKEY_DYN_DATA KeyName="HKEY_DYN_DATA" END SELECT label=STRING$(SCREENX, "-") MID$(label,(LEN(label)-LEN(KeyName))\2)=KeyName PRINT LEFT$(label,LEN(label)-1) zStartHere = "" 'Change to your need CONSOLE NAME "Registry Walk & Check of Path References - " & KeyName PRINT "zStartHere = " zStartHere entry="" EnumKey HKey, zStartHere NEXT PRINT PRINT "Press any key or click to continue..." MOUSE ON MOUSE 3, UP END FUNCTION
Comment