Seite 1 von 1

Gibt es einen Befehl um direkt auf die HD zuzugreifen?

Verfasst: 08.02.2006 20:15
von willy-billy
Hi,
gibt es einen Befehl, um auf eine Festplatte / Speichermedium clustermässig zuzugreifen? Ich möchte zusätzlich zu meinem HD-freie-Bereiche-Überschreibtool (naja, es läuft so recht und schlecht, aber ziemlich schnell) ganze Festplatten wipen können.

Welche Befehle gibt es, um:
a) dieFestplattennummer zu ermitteln,
b) die Anzahl der Sektoren bzw. der Cluster auf der Platte zu ermitteln,
c) auf die Sektoren bzw. Cluster zu schreiben,
d) die Festplattengrösse zu ermitteln
e) die Clustergrösse (variiert je nach OS und Filesystem) zu ermitteln
f)was brauche ich ggfs. noch?

Zu meinem jetzigen Tool:
a) Mit welchem Befehl kann ich den freien Speicher ermitteln?
b) Windoof hat die seltsame Eigenschaft, kurz vor dem Ende des freien Speichers den restlichen freien Speicher nicht mehr "hergeben" zu wollen.
Woran liegt das und wie kann man das ggfs. austricksen?

Bitte einfache Erläuterungen.

Vielen Dank
Willy-Billy

Verfasst: 08.02.2006 21:09
von Ja!
Hi,


a) und d) gibt es, AFAIK, als Befehle in der PBOSL (PureBasicOpenSourceLibrary).
Die kannst Du auf www.PureArea.de saugen. Dort gibt es noch eine menge mehr
an Librarys, schau Dich doch dort mal um.



Evtl. gibt die WinAPI noch mehr her. Hab Dir mal ne Kleinigkeit
rausgesucht, kannst ja selbst in der Win32Help weiterforschen..

Win32 Help:

Code: Alles auswählen

BOOL GetDiskFreeSpace(

    LPCTSTR lpRootPathName,	// address of root path 
    LPDWORD lpSectorsPerCluster,	// address of sectors per cluster 
    LPDWORD lpBytesPerSector,	// address of bytes per sector 
    LPDWORD lpNumberOfFreeClusters,	// address of number of free clusters  
    LPDWORD lpTotalNumberOfClusters 	// address of total number of clusters  
   );	


oder:

Code: Alles auswählen


The DISK_GEOMETRY structure describes the geometry of disk devices and media. 

typedef struct _DISK_GEOMETRY {  
   LARGE_INTEGER  Cylinders; 
   MEDIA_TYPE  MediaType; 
   DWORD  TracksPerCylinder; 
   DWORD  SectorsPerTrack; 
   DWORD  BytesPerSector; 
} DISK_GEOMETRY ; 
 

Members

Cylinders

The number of cylinders. 

MediaType

The type of media. See MEDIA_TYPE. 

TracksPerCylinder

The number of tracks per cylinder. 

SectorsPerTrack

The number of sectors per track. 

BytesPerSector

The number of bytes per sector 

Gruß

Verfasst: 08.02.2006 22:11
von uweb
Ich habe selbst noch nicht damit gearbeitet.

Code: Alles auswählen

; German forum: http://robsite.de/php/pureboard/viewtopic.php?t=1387&highlight=
; Author: Rings
; Date: 17. June 2003, Updated 23.2.2005 for PB 3.92

; *** Hexviewer for Hardisks and files ***

#Window_0 = 0

#MenuBar_2 = 0
#MENU_FileOpen = 1
#MENU_Save  = 2
#MENU_HDISK_C  = 3
#MENU_Search  = 4
#MENU_Replace  = 5
#MENU_Back  = 6
#MENU_Forward  = 7
#MENU_HELP=8

#PositionText=9
#StatusText=10

#DriveGadgets=100
#HexGadget=200
#AsciiGadget=62
#AdressGadget=30

#Suchen=14
#Filtern=15


Global Filename.s
Global LIHwnd.l
Global FHandle.l
Global Buffer.l
Global Offset.l
Global FLen.l

Procedure SROpenFile(AFilename.s)
Fhandle=CreateFile_(@AFilename.s,#GENERIC_READ|#GENERIC_WRITE ,#FILE_SHARE_READ|#FILE_SHARE_WRITE,#NULL,#OPEN_EXISTING,#FILE_ATTRIBUTE_NORMAL,0 )
If FHandle
Buffer=AllocateMemory(512)
Offset=0
ProcedureReturn fHandle
EndIf
EndProcedure

Procedure SRGetData(NewPosition)
Count=0
Result=SetFilePointer_(Fhandle,Newposition,0,#FILE_BEGIN )
Result=ReadFile_(FHandle,Buffer,512,@count,0)
ProcedureReturn Count
EndProcedure
Procedure SRGetDataNext()
Count=0
Result=ReadFile_(FHandle,Buffer,512,@count,0)
ProcedureReturn Count
EndProcedure

Procedure SRGetFilepointer()
ProcedureReturn SetFilePointer_(Fhandle,0,0,#FILE_CURRENT  )
EndProcedure

Procedure SRGetDataPrevious()
Count=0
Result=SetFilePointer_(Fhandle,-1024,0,#FILE_CURRENT )
Result=ReadFile_(FHandle,Buffer,512,@count,0)
ProcedureReturn Count
EndProcedure

Procedure SRCloseFile(FHandle1)
If FHandle1<>0
  FreeMemory(0)
  CloseHandle_(FHandle1)
  FHandle=0
  ProcedureReturn fHandle1
Else
  ProcedureReturn -1
EndIf   
EndProcedure


Procedure Open_Window_0()
  hwnd=OpenWindow(#Window_0, 252, 113, 620, 580,  #PB_Window_SystemMenu | #PB_Window_TitleBar , "PB Hexeditor")
  ;hWnd = OpenWindow(0,100,100,0,0,#WS_POPUP,"Icon-Show")
  If hwnd
    If CreateGadgetList(WindowID())

    AnfangYLabels=36

    If CreateToolBar(0, hwnd)
     ToolBarStandardButton(#MENU_FileOpen , #PB_ToolBarIcon_New)
     ToolBarStandardButton(#MENU_HDISK_C , #PB_ToolBarIcon_Open)
     ToolBarStandardButton(#MENU_Save, #PB_ToolBarIcon_Save)
   
     ToolBarSeparator()

     ToolBarStandardButton(#MENU_Back, #PB_ToolBarIcon_undo)
     ToolBarStandardButton(#MENU_Forward , #PB_ToolBarIcon_redo)
     ToolBarStandardButton(#MENU_Search, #PB_ToolBarIcon_Find)
     ToolBarSeparator()

     ToolBarStandardButton(#MENU_HELP, #PB_ToolBarIcon_Help )
     hGadget=TextGadget(#StatusText,200,3,300,30,"Status:OKay!")

    EndIf
    ;hGadget=TextGadget(#StatusText,150,3,300,30,"Status:OKay!")
   
   If CreatePopupMenu(0)
    For I=1 To 26
     Parameter.s=Chr(64+I)+":"
     Select GetDriveType_(Parameter)
      Case 0;      Result = Translator("Unknown")
      Case 1;      Result = Translator("No root dir")
      Case 2      ;Result = Translator("Removable")
        MenuItem(#DriveGadgets+I, Parameter)
      Case 3  ;Result = Translator("Drive Fixed")
        MenuItem(#DriveGadgets+I, Parameter)
      Case 4    ;  Result = Translator("Remote")
      Case 5    ;  Result = Translator("CDROM")
        MenuItem(#DriveGadgets+I, Parameter)
      Case 6     ; Result = Translator("Ram disk")
      Default     ; Result = Translator("Unknown")
     EndSelect
    Next I
   EndIf
   
   
      Abstand=80
      AnfangY=20+AnfangYLabels
      YSize=15
      HexBreite=22
   
     
      LoadFont(1,"Times New Roman",8)
      LoadFont(1,"Courier New",12)
     
      SetGadgetFont(#PB_Default ,UseFont(1))

      TextGadget(0,1,AnfangYLabels,Abstand-5,YSize,"Adress", #PB_Text_RIGHT);|#PB_Text_Border)
      TextGadget(0,Abstand+20,AnfangYLabels,336,YSize,"HEX-DATA", 0);|#PB_Text_Border)
      TextGadget(#PositionText,300,AnfangYLabels,80,YSize,"")
   
      TextGadget(0,420,AnfangYLabels,180,YSize,"ASCII-DATA", #PB_Text_Center);|#PB_Text_Border)
     
      P=#HexGadget
      S=#AsciiGadget
      StartDrawing(WindowOutput()  )
      For I=0 To 31
       StringGadget(#AdressGadget+I,0,I*(YSize+1)+AnfangY,Abstand-5,YSize,Hex((P-100)), #PB_String_BorderLess|#PB_Text_RIGHT|#PB_String_Readonly)
       For T=0 To 15
        P+1
       ; hwnd=StringGadget(P, Abstand + (T*HexBreite),I*(YSize+1)+AnfangY,20,YSize,"FF",#PB_String_BorderLess |#PB_String_UpperCase  )
        ;hwnd=TextGadget(P, Abstand + (T*HexBreite),I*(YSize+1)+AnfangY,20,YSize,"",0)
        Locate( Abstand + (T*HexBreite),I*(YSize+1)+AnfangY)
        DrawText("FF")

       Next T
       StringGadget(#AsciiGadget+I,435,I*(YSize+1)+AnfangY,165,YSize,"", #PB_String_BorderLess)
      Next I   
      StopDrawing()
      AddKeyboardShortcut(#Window_0, 1,     #PB_Shortcut_Up )
      AddKeyboardShortcut(#Window_0, 2,     #PB_Shortcut_Down )
   
     EndIf
  EndIf
EndProcedure

Procedure FillHex(Startadress,Anzahl)
Shared Buffer
P=#HexGadget

    AnfangYLabels=36
    Abstand=80
    AnfangY=20+AnfangYLabels
    YSize=15
    HexBreite=22
   


  StartDrawing(WindowOutput()  )
  DrawingMode(0)
  Box(Abstand,AnfangY,(16*HexBreite),32*(YSize+1),$FFFFFF)
  DrawingMode(1)
  FrontColor(0,0,0)
For I=0 To 31
  SetGadgetText(#AdressGadget+I,Hex(Startadress+(I*16)))
   ascii.s=""
   For T=0 To 15
    Newoffset= P - #Hexgadget
    P+1
    Locate( Abstand + (T*HexBreite),I*(YSize+1)+AnfangY)

    If Buffer<>0 And p <=Anzahl+#HexGadget
     Wert=PeekB(Buffer + Newoffset)
;    SetGadgetText(P,Right("00"+Hex(Wert),2))
     DrawText(Right("00"+Hex(Wert),2))
    Else
     
;     SetGadgetText(P," ")
   DrawText("  ")


     Wert=-1;Random(255)
    EndIf

    If Wert>-1 And Wert<256
     ascii.s=ascii.s+Chr(Wert)
    Else
     ascii.s=ascii.s+" "
    EndIf
   Next T
  SetGadgetText(#AsciiGadget+I,ascii)
Next I   
StopDrawing()
If FHandle<>0
  SetGadgetText(#PositionText, "Pos="+StrU(SRGetFilepointer()-512,2) )
EndIf
EndProcedure


Open_Window_0()
FillHex(0,0)
Repeat
;-MAINEVENT
  Event = WaitWindowEvent()
  EM= EventMenuID()
  EVT=EventType()
  GD=EventGadgetID()

  ;Debug Str(Event)+":"+Str(EVT)+":"+Str(EM)

  If Event=#PB_Event_Menu
   Debug EM
   If EM>#DriveGadgets And EM <#DriveGadgets+26
    Beep_(100,100)
    SRCloseFile(FHandle)
   
    Filename.s="\\.\"+Chr(EM-36)+":"
    If SROpenFile(Filename.s)
     Offset=0
     FLen.l=-2
     SRGetData(Offset)
     Beep_(100,100)
     FillHex(Offset,512)
     SetGadgetText(#StatusText,"HardDisk drive C:")
    EndIf
    EM=0
   EndIf
  EndIf
  If Event=#PB_Event_Menu
   Select GD
   Case #MENU_HELP
    MessageRequester("Info about","PureBasic-Hexeditor(viewer) by Siegfried Rings",0)
   Case #MENU_Search
    Search.s=InputRequester("PB-Hexeditor","Type in String To search For",Search.s)
    Beep_(100,100)
   Case #MENU_FileOpen
    Filename.s=OpenFileRequester("Choose File to examine", DefaultFile$, "*.*",0 )
    If Filename<>""
     DefaultFile$=Filename
     SRCloseFile(FHandle)
     If SROpenFile(Filename.s)
      FLen.l=FileSize(Filename.s)
      Offset=0
      SRGetData(Offset)
      Beep_(100,100)
      FillHex(Offset,FLEN)
      SetGadgetText(#StatusText,"File="+Filename.s)
     EndIf
    EndIf
    EM=0
   Case #MENU_HDISK_C 
    DisplayPopupMenu(0, WindowID())
   
   Case #MENU_Back 
    If FHandle<>0
     If Offset<= 512
      Offset=0
      FillHex(Offset,Result)
     Else
      Result=SRGetDataPrevious()
      If Result<>0
       Offset=SRGetFilepointer();-512
       FillHex(Offset-512,Result)
      EndIf 
     EndIf
    EndIf 
   Case #MENU_Forward 
   
    If FHandle<>0
     Result=SRGetDataNext()
     If Result>0
      Offset=SRGetFilepointer();-512
      FillHex(Offset-512,Result)
     EndIf
    EndIf
   EndSelect
   If GD>=#HexGadget And GD<=#HexGadget+512
    If EVT=#PB_EventType_Change         
     Len=Len(GetGadgetText(GD))
     If Len>2
      Beep_(100,100)
      SetGadgetText(GD,Left(GetGadgetText(GD),2))
     EndIf
    EndIf
   EndIf
  EndIf

Until Event = #PB_EventCloseWindow
SRCloseFile(FHandle)
End
; ExecutableFormat=Windows
; CursorPosition=4
; FirstLine=1
; EOF