Code:
'Requirements - PB9.0, PBforms.inc 'This program will examine a file and show each byte as hex and ascii. 'It is similar in appearance to the old PC Tools DOS program 'It covers 100 bytes at a time. This can be screen by screen in 100 increments, 'or it can scan through at 1 sec intervals (cannot see how to stop this - the 'Stop button is there in case anyone else can! 'It will search for a string and display this at the location (only once). 'It is not possible to alter values in the file, as you are not actually 'looking at the file, but a copy in memory. 'The slide bar can be used for crude positioning, but jumps in 1% of the file 'size. 'It does what I wanted it to do, but no doubt others will improve on this - 'please post your developments (so that I can learn). ' 'Iain Johnstone 'iain at mstdrain dot co dot uk #PBFORMS CREATED V1.51 '------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ ' The first line in this file is a PB/Forms metastatement. ' It should ALWAYS be the first line of the file. Other ' PB/Forms metastatements are placed at the beginning and ' end of "Named Blocks" of code that should be edited ' with PBForms only. Do not manually edit or delete these ' metastatements or PB/Forms will not be able to reread ' the file correctly. See the PB/Forms documentation for ' more information. ' Named blocks begin like this: #PBFORMS BEGIN ... ' Named blocks end like this: #PBFORMS END ... ' Other PB/Forms metastatements such as: ' #PBFORMS DECLARATIONS ' are used by PB/Forms to insert additional code. ' Feel free to make changes anywhere else in the file. '------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ #COMPILE EXE #DIM ALL '------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ ' ** Includes ** '------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ #PBFORMS BEGIN INCLUDES #IF NOT %DEF(%WINAPI) #INCLUDE "WIN32API.INC" #ENDIF #IF NOT %DEF(%COMMCTRL_INC) #INCLUDE "COMMCTRL.INC" #ENDIF #INCLUDE "PBForms.INC" #PBFORMS END INCLUDES '------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ '------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ ' ** Constants ** '------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ #PBFORMS BEGIN CONSTANTS %IDC_BUTTON1 = 1003 %IDC_BUTTON2 = 1004 %IDC_BUTTON3 = 1005 %IDC_BUTTON4 = 1008 %IDC_BUTTON5 = 1009 %IDC_BUTTON6 = 1013 %IDC_FRAME1 = 1010 %IDC_FRAME2 = 1011 %IDC_GRAPHIC1 = 1001 %IDC_GRAPHIC2 = 1002 %IDC_LABEL1 = 1006 %IDC_LABEL10 = 1022 %IDC_LABEL11 = 1023 %IDC_LABEL12 = 1024 %IDC_LABEL13 = 1025 %IDC_LABEL2 = 1007 %IDC_LABEL3 = 1015 %IDC_LABEL4 = 1016 %IDC_LABEL5 = 1017 %IDC_LABEL6 = 1018 %IDC_LABEL7 = 1019 %IDC_LABEL8 = 1020 %IDC_LABEL9 = 1021 %IDC_MSCTLS_TRACKBAR32_1 = 1027 %IDC_TEXTBOX1 = 1014 %IDD_DIALOG1 = 101 #PBFORMS END CONSTANTS GLOBAL wholefile AS STRING GLOBAL counter, fonthndl, filesize AS LONG '------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ '------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ ' ** Declarations ** '------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ DECLARE CALLBACK FUNCTION ShowDIALOG1Proc() DECLARE FUNCTION ShowDIALOG1(BYVAL hParent AS DWORD,NameOfFile AS STRING,filesize AS LONG) AS LONG #PBFORMS DECLARATIONS DECLARE SUB FillHex (hDlg AS LONG) DECLARE SUB FillAscii(hDlg AS LONG) DECLARE SUB FillLabels (hDlg AS LONG) DECLARE FUNCTION RangeTrack(BYVAL hDlg AS DWORD, BYVAL lID AS LONG) AS LONG DECLARE FUNCTION GetTrack(BYVAL hDlg AS DWORD, BYVAL lID AS LONG) AS LONG '------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ '------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ ' ** Main Application Entry Point ** '------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ FUNCTION PBMAIN() PBFormsInitComCtls (%ICC_WIN95_CLASSES OR %ICC_DATE_CLASSES OR %ICC_INTERNET_CLASSES) LOCAL Filter, Dext, zfile, NameOfFile AS STRING LOCAL flags AS DWORD LOCAL templong AS LONG FONT NEW "Courier New" ,10, 0, 1, 0, 0 TO fonthndl NameOfFile="" DExt="" Filter="All files" + CHR$(0) + "*.*" + CHR$(0) flags=0 DISPLAY OPENFILE 0, , ,"Select file","",Filter,"",Dext,Flags TO NameOfFile '%hwnd_desktop OPEN NameOfFile FOR BINARY AS #6 filesize=LOF(#6) GET$ #6, filesize, wholefile 'copy file into string CLOSE #6 ShowDIALOG1 %HWND_DESKTOP,NameOfFile,filesize END FUNCTION '------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ '------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ ' ** CallBacks ** '------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ CALLBACK FUNCTION ShowDIALOG1Proc() LOCAL stopflag, n, newpos AS LONG LOCAL tempstring AS STRING SELECT CASE AS LONG CBMSG CASE %WM_INITDIALOG ' Initialization handler counter=1 FillHex CB.HNDL FillAscii CB.HNDL FillLabels CB.HNDL counter=counter+100 CASE %WM_NCACTIVATE STATIC hWndSaveFocus AS DWORD IF ISFALSE CBWPARAM THEN ' Save control focus hWndSaveFocus = GetFocus() ELSEIF hWndSaveFocus THEN ' Restore control focus SetFocus(hWndSaveFocus) hWndSaveFocus = 0 END IF CASE %WM_HSCROLL IF CB.LPARAM = GetDlgItem(CBHNDL, %IDC_MSCTLS_TRACKBAR32_1) THEN newpos=GetTrack (CBHNDL, %IDC_MSCTLS_TRACKBAR32_1) counter= (NewPos/100)*filesize FillHex CB.HNDL FillAscii CB.HNDL FillLabels CB.HNDL END IF CASE %WM_COMMAND ' Process control notifications SELECT CASE AS LONG CB.CTL CASE %IDC_BUTTON1 'next IF CB.CTLMSG = %BN_CLICKED OR CB.CTLMSG = 1 THEN FillHex CB.HNDL FillAscii CB.HNDL FillLabels CB.HNDL IF counter<LEN(wholefile) THEN counter=counter+100 END IF CASE %IDC_BUTTON2 'back IF CB.CTLMSG = %BN_CLICKED OR CB.CTLMSG = 1 THEN counter=counter-100:IF counter<1 THEN counter=1 FillHex CB.HNDL FillAscii CB.HNDL FillLabels CB.HNDL END IF CASE %IDC_BUTTON3 'quit IF CB.CTLMSG = %BN_CLICKED OR CB.CTLMSG = 1 THEN DIALOG END CB.HNDL END IF CASE %IDC_BUTTON4 'scan IF CB.CTLMSG = %BN_CLICKED OR CB.CTLMSG = 1 THEN FOR counter=1 TO LEN(wholefile) STEP 100 FillHex CB.HNDL FillAscii CB.HNDL FillLabels CB.HNDL SLEEP 1000 IF stopflag=1 THEN EXIT FOR NEXT END IF CASE %IDC_BUTTON5 'stop IF CB.CTLMSG = %BN_CLICKED OR CB.CTLMSG = 1 THEN stopflag=1 END IF CASE %IDC_BUTTON6 'search IF CB.CTLMSG = %BN_CLICKED OR CB.CTLMSG = 1 THEN CONTROL GET TEXT CB.HNDL,%IDC_TEXTBOX1 TO tempstring n=INSTR(wholefile,tempstring) counter=n FillHex CB.HNDL FillAscii CB.HNDL FillLabels CB.HNDL END IF END SELECT END SELECT END FUNCTION '------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ '------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ ' ** Dialogs ** '------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ FUNCTION ShowDIALOG1(BYVAL hParent AS DWORD,NameOfFile AS STRING,filesize AS LONG) AS LONG LOCAL lRslt AS LONG LOCAL labels AS STRING labels="File - "+NameOfFile+"("+STR$(filesize)+" bytes)." #PBFORMS BEGIN DIALOG %IDD_DIALOG1->-> LOCAL hDlg AS DWORD DIALOG NEW hParent, labels, 343, 223, 475, 227, %WS_POPUP OR %WS_BORDER OR %WS_DLGFRAME OR %WS_SYSMENU OR %WS_CLIPSIBLINGS OR %WS_VISIBLE OR %DS_MODALFRAME OR %DS_3DLOOK OR %DS_NOFAILCREATE _ OR %DS_SETFONT, %WS_EX_CONTROLPARENT OR %WS_EX_LEFT OR %WS_EX_LTRREADING OR %WS_EX_RIGHTSCROLLBAR, TO hDlg CONTROL ADD GRAPHIC, hDlg, %IDC_GRAPHIC1, "", 50, 15, 180, 160 GRAPHIC ATTACH hDlg, %IDC_GRAPHIC1 GRAPHIC COLOR -1, %BLACK GRAPHIC CLEAR CONTROL ADD GRAPHIC, hDlg, %IDC_GRAPHIC2, "", 235, 15, 180, 160 GRAPHIC ATTACH hDlg, %IDC_GRAPHIC2 GRAPHIC COLOR -1, %BLACK GRAPHIC CLEAR CONTROL ADD FRAME, hDlg, %IDC_FRAME1, "", 420, 9, 48, 54 CONTROL SET COLOR hDlg, %IDC_FRAME1, %BLACK, %BLACK CONTROL ADD FRAME, hDlg, %IDC_FRAME2, "", 420, 66, 48, 54 CONTROL SET COLOR hDlg, %IDC_FRAME2, %BLACK, %BLACK CONTROL ADD TEXTBOX, hDlg, %IDC_TEXTBOX1, "", 156, 201, 243, 12 CONTROL ADD LABEL, hDlg, %IDC_LABEL1, "Hexadecimal", 51, 3, 177, 12, %WS_CHILD OR %WS_VISIBLE OR %SS_CENTER, %WS_EX_LEFT OR %WS_EX_LTRREADING CONTROL SET COLOR hDlg, %IDC_LABEL1, %BLUE, -1 CONTROL ADD LABEL, hDlg, %IDC_LABEL2, "ASCII", 234, 3, 177, 12, %WS_CHILD OR %WS_VISIBLE OR %SS_CENTER, %WS_EX_LEFT OR %WS_EX_LTRREADING CONTROL SET COLOR hDlg, %IDC_LABEL2, %BLUE, -1 CONTROL ADD LABEL, hDlg, %IDC_LABEL3, "Search string (case sensitive)", 57, 201, 96, 12 CONTROL ADD LABEL, hDlg, %IDC_LABEL4, "", 3, 18, 45, 12 CONTROL ADD LABEL, hDlg, %IDC_LABEL5, "", 3, 32, 45, 12 CONTROL ADD LABEL, hDlg, %IDC_LABEL6, "", 3, 48, 45, 12 CONTROL ADD LABEL, hDlg, %IDC_LABEL7, "", 3, 64, 45, 12 CONTROL ADD LABEL, hDlg, %IDC_LABEL8, "", 3, 80, 45, 12 CONTROL ADD LABEL, hDlg, %IDC_LABEL9, "", 3, 96, 45, 12 CONTROL ADD LABEL, hDlg, %IDC_LABEL10, "", 3, 112, 45, 12 CONTROL ADD LABEL, hDlg, %IDC_LABEL11, "", 3, 128, 45, 12 CONTROL ADD LABEL, hDlg, %IDC_LABEL12, "", 3, 144, 45, 12 CONTROL ADD LABEL, hDlg, %IDC_LABEL13, "", 3, 160, 45, 12 CONTROL ADD BUTTON, hDlg, %IDC_BUTTON1, "Next", 426, 18, 36, 18 CONTROL ADD BUTTON, hDlg, %IDC_BUTTON2, "Back", 426, 39, 36, 18 CONTROL ADD BUTTON, hDlg, %IDC_BUTTON3, "Quit", 426, 156, 36, 18 CONTROL ADD BUTTON, hDlg, %IDC_BUTTON4, "Scan", 426, 75, 36, 18 CONTROL ADD BUTTON, hDlg, %IDC_BUTTON5, "Stop", 426, 96, 36, 18 CONTROL ADD BUTTON, hDlg, %IDC_BUTTON6, "Search", 426, 126, 36, 18 CONTROL ADD "msctls_trackbar32", hDlg, %IDC_MSCTLS_TRACKBAR32_1, "msctls_trackbar32_1", 51, 183, 363, 12, %WS_CHILD OR %WS_VISIBLE OR %TBS_HORZ OR %TBS_BOTTOM OR %TBS_AUTOTICKS #PBFORMS END DIALOG RangeTrack hDlg, %IDC_MSCTLS_TRACKBAR32_1 DIALOG SHOW MODAL hDlg, CALL ShowDIALOG1Proc TO lRslt #PBFORMS BEGIN CLEANUP %IDD_DIALOG1 #PBFORMS END CLEANUP FUNCTION = lRslt END FUNCTION '------------------------------------------------------------------------------ SUB FillLabels (hDlg AS LONG) LOCAL w, n, t AS LONG w=counter t=16 FOR n=1 TO 160 STEP 16 CONTROL SET TEXT hDlg, 1000+t,FORMAT$(w,"0000000000"): w =w+10:INCR t GRAPHIC SET POS (3,n) NEXT END SUB '============================================================================== SUB FillHex (hDlg AS LONG) LOCAL n, q, w AS LONG LOCAL a AS STRING GRAPHIC ATTACH hDlg, %IDC_GRAPHIC1, REDRAW GRAPHIC SET POS (0,0) GRAPHIC CLEAR %BLACK,0 GRAPHIC SET FONT fonthndl GRAPHIC COLOR %GREEN, %BLACK w=counter FOR n=1 TO 160 STEP 16 '160=width of graphic window FOR q=1 TO 180 STEP 18 '180=height of graphic window GRAPHIC SET POS (q,n) a=HEX$(ASC(wholefile,w)):IF LEN(a)=1 THEN a="0"+a GRAPHIC PRINT a:INCR w NEXT NEXT GRAPHIC REDRAW GRAPHIC DETACH END SUB '============================================================================== SUB FillASCII (hDlg AS LONG) LOCAL n, q, w, z AS LONG LOCAL a AS STRING GRAPHIC ATTACH hDlg, %IDC_GRAPHIC2, REDRAW GRAPHIC SET POS (0,0) GRAPHIC CLEAR %BLACK,0 GRAPHIC SET FONT fonthndl GRAPHIC COLOR %GREEN, %BLACK w=counter FOR n=1 TO 160 STEP 16 FOR q=1 TO 180 STEP 18 z=(ASC(wholefile,w)):INCR w GRAPHIC SET POS (q,n) IF z < 32 THEN GRAPHIC PRINT "." ELSE GRAPHIC PRINT CHR$(z) END IF NEXT NEXT GRAPHIC REDRAW GRAPHIC DETACH END SUB '============================================================================== FUNCTION RangeTrack(BYVAL hDlg AS DWORD, BYVAL lID AS LONG) AS LONG CONTROL SEND hDlg,lID, %PBM_SETSTEP,1,0 CONTROL SEND hDlg,lID, %TBM_SETRANGE,0, MAKDWD(1,100) CONTROL SEND hDlg,lID, %TBM_SETTICFREQ, 10, 1 CONTROL SEND hDlg,lID, %TBM_SETPOS,1, 1 END FUNCTION '------------------------------------------------------------------------------ FUNCTION GetTrack(BYVAL hDlg AS DWORD, BYVAL lID AS LONG) AS LONG LOCAL ThumbPos AS LONG CONTROL SEND hDlg, lID, %TBM_GETPOS, 0, 0 TO ThumbPos ThumbPos = LOWRD(ThumbPos) FUNCTION=ThumbPos END FUNCTION '------------------------------------------------------------------------------