Backup für das System erstellen

Hallo

ich möchte gerne ein Backup-Programm schreiben, welches mir das ganze System (nur Windows mit dem zugehörigen Programmen) vom Laufwerk C: wiederherstellen kann.

Meine Idee ist, das komplette Laufwerk C: samt Dateien auf der leeren Festplatte E: zu kopieren.
Noch keine Probleme. Boot-Sektor ist nicht so wichtig, da immer wieder das gleiche System wiederhergestellt werden soll.
Ich verwende WinME.

Mein Problem: Wie kann ich eine Wiederherstellung vornehmen? Wenn Windows läuft, es sind einige Datei geschützt und können nicht überschrieben werden. (Registrierung usw.).

Aber unter DOS (QuickBasic) gehen mir die langen Dateinamen verloren.
Hat jemand ne Idee, wie ich die langen Dateiname unter DOS behalten kann?

Weiss jemand ne Lösung??

PS: Ich benutze kein fertiges IMAGE-Programm. Ich bin Programmierer und kein Anwender. Benutze nur meine eigenen Programme! Also fang nicht so an und sagt: „Benutze doch dieses Programm…!“

Ich benutze VB5 und kenne mich auch ein wenig in QB aus!

Danke euch im vorraus!

Gruß Basti

Hallo Basti,

das kannst du nur mit Laufwerken machen, die gerade nicht verwendet werden sonst bekommst du Probleme, weil Du nicht auf jede Datei uneingeschränkt zugreifen kannst. Wenn das Image nicht so groß wie die Partition werden soll, brauchst Du Packverfahren.

Wie man mit VB6 die Sektoren der Festplatte lesen kann weiß ich, den Quellcode könntest Du bekommen, wenn Du magst. Aber C:\ kannst Du damit nicht sichern und wiederherstellen, weil ja Windows benötigt wird.

Der Kern:

hFile = CreateFile("\\.\C:\", GENERIC\_WRITE Or GENERIC\_READ, FILE\_SHARE\_READ \_
 Or FILE\_SHARE\_WRITE, 0, OPEN\_ALWAYS, FILE\_ATTRIBUTE\_NORMAL, 0)

Öffnet die Partition C: als File … Bei NTFS. für Wi98/SE:
„\\.\vwin32“ … das ist aber nicht getestet ich habe keinen entsprechenden Rechner.

In Kombination mit einem Packer und BartPE könnte das etwas werden …

Gruß, Rainer
PS. da hast Du Dir aber etwas vorgenommen …

Danke für den Tipp. Werde da mal noch etwas herumtüfteln. Gruß Basti

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

O.T. Festplattensektoren auslesen

Wie man mit VB6 die Sektoren der Festplatte lesen kann weiß
ich, den Quellcode könntest Du bekommen, wenn Du magst. Aber
C:\ kannst Du damit nicht sichern und wiederherstellen, weil
ja Windows benötigt wird.

Hallo Rainer,
ich wäre an dem Quellcode interessiert.
Ich hoffe e ist VBA-tauglich :smile:
Danke und Gruß
Reinhard

Hi Basti,

damit Dus nicht zu schwer hast, wenigstens die Klasse, ich ich mir bei Planetsourcecode besorgt habe. Ich habe gegenüber dem Original nicht sehr viel verändert, nur übersichtlicher gemacht und ‚eingedeutscht‘. Das Original war italienisch … :smile:

Gruß, Rainer

Option Explicit
Public Enum W32F\_Errors
 W32F\_UNKNOWN\_ERROR = 45600
 W32F\_FILE\_ALREADY\_OPEN
 W32F\_PROBLEM\_OPENING\_FILE
 W32F\_FILE\_ALREADY\_CLOSED
 W32F\_PROBLEM\_SEEKING
End Enum

Private Const W32F\_SOURCE = "Clase: Win32File Object"

Private Const FILE\_SHARE\_READ As Long = &H1
Private Const FILE\_SHARE\_WRITE As Long = &H2

Private Const GENERIC\_WRITE As Long = &H40000000
Private Const GENERIC\_READ As Long = &H80000000
Private Const FILE\_ATTRIBUTE\_NORMAL As Long = &H80
Private Const CREATE\_ALWAYS As Long = 2
Private Const OPEN\_ALWAYS As Long = 4
Private Const INVALID\_HANDLE\_VALUE As Long = -1

Private Const FILE\_BEGIN As Long = 0
Private Const FILE\_CURRENT As Long = 1
Private Const FILE\_END As Long = 2

Private Const FORMAT\_MESSAGE\_FROM\_SYSTEM = &H1000

Private Declare Function FormatMessage Lib "kernel32" \_
 Alias "FormatMessageA" (ByVal dwFlags As Long, \_
 lpSource As Long, \_
 ByVal dwMessageId As Long, \_
 ByVal dwLanguageId As Long, \_
 ByVal lpBuffer As String, \_
 ByVal nSize As Long, \_
 Arguments As Any) As Long

Private Declare Function ReadFile Lib "kernel32" \_
 (ByVal hFile As Long, \_
 lpBuffer As Any, \_
 ByVal nNumberOfBytesToRead As Long, \_
 lpNumberOfBytesRead As Long, \_
 ByVal lpOverlapped As Long) As Long

Private Declare Function CloseHandle Lib "kernel32" \_
 (ByVal hObject As Long) As Long

Private Declare Function WriteFile Lib "kernel32" \_
 (ByVal hFile As Long, \_
 lpBuffer As Any, \_
 ByVal nNumberOfBytesToWrite As Long, \_
 lpNumberOfBytesWritten As Long, \_
 ByVal lpOverlapped As Long) As Long

Private Declare Function CreateFile Lib "kernel32" \_
 Alias "CreateFileA" (ByVal lpFileName As String, \_
 ByVal dwDesiredAccess As Long, \_
 ByVal dwShareMode As Long, \_
 ByVal lpSecurityAttributes As Long, \_
 ByVal dwCreationDisposition As Long, \_
 ByVal dwFlagsAndAttributes As Long, \_
 ByVal hTemplateFile As Long) As Long

Private Declare Function SetFilePointer Lib "kernel32" \_
 (ByVal hFile As Long, \_
 ByVal lDistanceToMove As Long, \_
 lpDistanceToMoveHigh As Long, \_
 ByVal dwMoveMethod As Long) As Long

Private Declare Function FlushFileBuffers Lib "kernel32" \_
 (ByVal hFile As Long) As Long

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" \_
 (pDst As Any, pSrc As Any, ByVal ByteLen As Long)


Private hFile As Long
Private sFName As String
Private fAutoFlush As Boolean
Private iPos As Long

Public Property Get FileHandle() As Long
 If hFile = INVALID\_HANDLE\_VALUE Then
 RaiseError W32F\_FILE\_ALREADY\_CLOSED
 End If
 FileHandle = hFile
End Property

Public Property Get FileName() As String
 If hFile = INVALID\_HANDLE\_VALUE Then
 RaiseError W32F\_FILE\_ALREADY\_CLOSED
 End If
 FileName = sFName
End Property

Public Property Get IsOpen() As Boolean
 IsOpen = hFile INVALID\_HANDLE\_VALUE
End Property

Public Property Get AutoFlush() As Boolean
 If hFile = INVALID\_HANDLE\_VALUE Then
 RaiseError W32F\_FILE\_ALREADY\_CLOSED
 End If
 AutoFlush = fAutoFlush
End Property

Public Property Let AutoFlush(ByVal NewVal As Boolean)
 If hFile = INVALID\_HANDLE\_VALUE Then
 RaiseError W32F\_FILE\_ALREADY\_CLOSED
 End If
 fAutoFlush = NewVal
End Property

Public Sub OpenFile(ByVal sFileName As String)
 If hFile INVALID\_HANDLE\_VALUE Then
 RaiseError W32F\_FILE\_ALREADY\_OPEN, sFName
 Exit Sub
 End If
 hFile = CreateFile(sFileName, GENERIC\_WRITE Or GENERIC\_READ, FILE\_SHARE\_READ \_
 Or FILE\_SHARE\_WRITE, 0, OPEN\_ALWAYS, FILE\_ATTRIBUTE\_NORMAL, 0)
 If hFile = INVALID\_HANDLE\_VALUE Then
 RaiseError W32F\_PROBLEM\_OPENING\_FILE, sFileName
 Exit Sub
 End If
 sFName = sFileName
End Sub

Public Sub CloseFile()
 If hFile = INVALID\_HANDLE\_VALUE Then
 RaiseError W32F\_FILE\_ALREADY\_CLOSED
 Exit Sub
 End If
 CloseHandle hFile
 sFName = ""
 fAutoFlush = False
 hFile = INVALID\_HANDLE\_VALUE
End Sub

Public Function ReadBytes(ByVal ByteCount As Long, Bytes() As Byte) As String
Dim BytesRead As Long
Dim asB As String

 If hFile = INVALID\_HANDLE\_VALUE Then
 RaiseError W32F\_FILE\_ALREADY\_CLOSED
 Exit Function
 End If
 ReDim Bytes(0 To ByteCount - 1) As Byte

 ReadFile hFile, Bytes(0), ByteCount, BytesRead, 0

 Dim i&
 For i = 0 To ByteCount - 1
 If Bytes(i) INVALID\_HANDLE\_VALUE Then CloseHandle hFile
End Sub

Private Sub RaiseError(ByVal ErrorCode As W32F\_Errors, \_
 Optional sExtra)
Dim Win32Err As Long, Win32Text As String
 Win32Err = Err.LastDllError
 If Win32Err Then
 Win32Text = vbCrLf & "Error " & Win32Err & vbCrLf & \_
 DecodeAPIErrors(Win32Err)
 End If
 Select Case ErrorCode
 Case W32F\_FILE\_ALREADY\_OPEN
 Err.Raise W32F\_FILE\_ALREADY\_OPEN, W32F\_SOURCE, \_
 "Das Laufwerk'" & sExtra & "' ist bereits geöffnet." & Win32Text
 Case W32F\_PROBLEM\_OPENING\_FILE
 Err.Raise W32F\_PROBLEM\_OPENING\_FILE, W32F\_SOURCE, \_
 "Fehler beim öffnen '" & sExtra & "'." & Win32Text
 Case W32F\_FILE\_ALREADY\_CLOSED
 Err.Raise W32F\_FILE\_ALREADY\_CLOSED, W32F\_SOURCE, \_
 "Laufwerk ist geschlossen."
 Case W32F\_PROBLEM\_SEEKING
 Err.Raise W32F\_PROBLEM\_SEEKING, W32F\_SOURCE, \_
 "Laufwerk nicht gefunden." & vbCrLf & sExtra
 Case Else
 Err.Raise W32F\_UNKNOWN\_ERROR, W32F\_SOURCE, \_
 "Unbekannter Fehler." & Win32Text
 End Select
End Sub

Private Function DecodeAPIErrors(ByVal ErrorCode As Long) As String
Dim sMessage As String, MessageLength As Long
 sMessage = Space$(256)
 MessageLength = FormatMessage(FORMAT\_MESSAGE\_FROM\_SYSTEM, 0&, \_
 ErrorCode, 0&, sMessage, 256&, 0&amp:wink:
 If MessageLength \> 0 Then
 DecodeAPIErrors = Left(sMessage, MessageLength)
 Else
 DecodeAPIErrors = "Unbekannter Fehler"
 End If
End Function

Hallo Reinhard,

keine Ahnung, ich kenne mich mit VBA nicht aus. Ist VB6, ein Klassenmaodul mit etlichen API-Aufrufen und eine Form auf der nichts wichtiges passiert. Das know how steckt in der Klasse, die ich mir aus einem Beispiel auf Planatsorcecode extrahiert und angepasst habe. So wie die Klasse jetzt ist, ist sie universell einsetzbar.

Wie möchtest du das Programm? Nur den Quellcode als Text (Mailm Copy and paste friendly :smile:) oder das Projekt? Ob Du das Projekt mit VBA laden kannst weiß ich nicht.

Gruß, Rainer

keine Ahnung, ich kenne mich mit VBA nicht aus. Ist VB6, ein
Klassenmaodul mit etlichen API-Aufrufen und eine Form auf der
nichts wichtiges passiert. Das know how steckt in der Klasse,
die ich mir aus einem Beispiel auf Planatsorcecode extrahiert
und angepasst habe. So wie die Klasse jetzt ist, ist sie
universell einsetzbar.

Wie möchtest du das Programm? Nur den Quellcode als Text
(Mailm Copy and paste friendly :smile:) oder das Projekt? Ob Du
das Projekt mit VBA laden kannst weiß ich nicht.

Hallo Rainer,
nur den Quellcode bitte. Dein Code in deinem letzten Posting an Sebastian ist noch nihct kompett? habe ihn nur kurz überflogen.

Was bedeutet denn „Mailm Copy and paste friendly“? Scheinbar ist mailm ein Mailprogramm…
Gruß
Reinhard

Gruß, Rainer

Hallo Reinhard,

Was bedeutet denn „Mailm Copy and paste friendly“?

Das ist ein Tippfehler, das ‚m‘ sollte ein Komma werden, die Taste ist daneben. :smile:

Du hast Post.

Gruß, Rainer

Dankeschön Rainer,
das Mehl kam an :smile:
Gruß
Reinhard

Hallo Reinhard,

das Mehl kam an :smile:

OKI. Schreib mal, ob Du das mit VBA zum arbeiten überreden konntest. Mit VB6 klappt’s Bestens.

Gruß, Rainer

Hallo Rainer,

auch ich waere an der Klasse bzw. dem Project interessiert. Koenntest du es mir bitte auch auf Mail zukommen lassen?

MfG Alex

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hi Anno,

auch ich waere an der Klasse bzw. dem Project interessiert.
Koenntest du es mir bitte auch auf Mail zukommen lassen?

ist mir ein Vergnügen. :smile: Du hast Post.

Gruß, Rainer

Danke Rainer :smile:
Aber wie ich so deine Beitraege lese, merke ich das du rel. Freizeit derzeit hast *zwinker* Ich hatte dich mal vor geraumer Zeit gefragt ob du ne Idee hast mit ner Webcam Übertragung. Du wolltest dir das mal anschauen, aber scheinbar hast du das vergessen, was auch nicht weiter schlimm ist.
Ich habe glaube 3 oder 4 Artikel weiter unten nochmal ein thema angefangen „leidiges Thema Webcam“ oder so :s Könntest du mal bitte schauen ob du da eine Idee hast. Es geht um 2 Bilder zu vergleichen.

MfG Alex

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hi Anno,

Danke Rainer :smile:

gern. :smile:

Aber wie ich so deine Beitraege lese, merke ich das du rel.
Freizeit derzeit hast *zwinker*

Das täuscht, das waren ja nur Kleinigkeiten. Etwas größeres habe ich schon länger nicht mehr angefangen.

Ich hatte dich mal vor
geraumer Zeit gefragt ob du ne Idee hast mit ner Webcam
Übertragung. Du wolltest dir das mal anschauen, aber scheinbar
hast du das vergessen, was auch nicht weiter schlimm ist.

Nein, nicht vergessen, keine Idee gehabt.

Ich habe glaube 3 oder 4 Artikel weiter unten nochmal ein
thema angefangen „leidiges Thema Webcam“ oder so :s Könntest
du mal bitte schauen ob du da eine Idee hast. Es geht um 2
Bilder zu vergleichen.

??? Zwei Bilder vergleichen? Ich hab gerade mal da hin gescrollt, stimmt. Den Beitrag hatte ich noch gar nicht gelesen, von dem Thema hast Du mehr Ahnung als ich, ich dachte, ich kann Dir eh nicht helfen. ich bin davon ausgegangen, daß Du ein Problem mit dem Streaming hast, das verstehe ich nicht, kann ich mangels Hardware auch nicht testen.

Hmmmm, Du willst zwei Bilder vergleichen? Wie groß sind die Bilder (Pixel)? Wie viele Bits per Pixel? Dir geht es darum, nur die Veränderung zu übertragen?
Was hast Du denn schon? Ich stelle mir von, jeden Pixel einzeln auszuwerten, und dabei festzulegen ab wie viel % Abweichung die Veränderung übertragen werden soll. Das Bild in ein Array zu schieben geht ja schnell, aber wie stellst Du bei der Übertragung fest, wo der Pixel hin gehört? Das ist mir irgendwie unklar.

Wie ich Dir helfen kann ist mir noch unklar. Du verrätst mir die Größe und ich baue Dir aus zwei ähnlichen Bildern ein Differenzbild? Das sollte recht schnell gehen … das Programmieren auch, ich meine die Rechnung. :smile:

Gruß, Rainer

Hi Alex,

Thema Bilder vergleichen.

ich habe mal etwas gebastelt … hilft das?

Option Explicit

Private Declare Function GetBitmapBits Lib "gdi32" (ByVal hBitmap As Long, ByVal dwCount As Long, lpBits As Any) As Long
Private Declare Function SetBitmapBits Lib "gdi32" (ByVal hBitmap As Long, ByVal dwCount As Long, lpBits As Any) As Long

Dim PicBits1() As Byte
Dim PicBits2() As Byte
Dim PicBits3() As Byte
Dim PicBits4() As Byte

Private Sub Command1\_Click()
 Dim i As Long
 ReDim PicBits1(1 To Picture1(0).ScaleWidth \* Picture1(0).ScaleHeight \* 3) As Byte
 ReDim PicBits2(1 To Picture1(0).ScaleWidth \* Picture1(0).ScaleHeight \* 3) As Byte
 ReDim PicBits3(1 To Picture1(0).ScaleWidth \* Picture1(0).ScaleHeight \* 3) As Byte
 ReDim PicBits4(1 To Picture1(0).ScaleWidth \* Picture1(0).ScaleHeight \* 3) As Byte

 GetBitmapBits Picture1(0).Image, UBound(PicBits1), PicBits1(1)
 GetBitmapBits Picture1(1).Image, UBound(PicBits2), PicBits2(1)
 For i = 1 To UBound(PicBits1)
 PicBits4(i) = PicBits1(i) And 252 'die letzten drei Bits ignorieren
 PicBits2(i) = PicBits2(i) And 252
 PicBits3(i) = PicBits4(i) Xor PicBits2(i)
 If PicBits3(i) 0 Then PicBits3(i) = PicBits1(i)
 Next
 SetBitmapBits Picture1(2).Image, UBound(PicBits3), PicBits3(1)
 Picture1(2).Refresh
End Sub

Gruß, Rainer

Hallo Alex,

Du antwortest nicht? Dann nehme ich an, es hat geholfen. Mir ist aufgefallen, daß der Code suboptimal ist. :smile:

statt …

 For i = 1 To UBound(PicBits1)
 PicBits4(i) = PicBits1(i) And 252 'die letzten drei Bits ignorieren
 PicBits2(i) = PicBits2(i) And 252
 PicBits3(i) = PicBits4(i) Xor PicBits2(i)
 If PicBits3(i) 0 Then PicBits3(i) = PicBits1(i)
 Next

ist das sicher besser:

 For i = 1 To UBound(PicBits1)
 PicBits3(i) = PicBits1(i) Xor PicBits2(i)
 Picbits3(i) = PicBits3(i) And 252
 If PicBits3(i) 0 Then PicBits3(i) = PicBits1(i)
 Next

Das macht das selbe, es sind statt drei aber nur zwei Operationen.

Gruß, Rainer