Piszę aplikację C# .Net do uruchomienia w oknach, które muszą zrobić zdjęcie dysku wymiennego i przenieść go do Linux Live USB. Live USB jest włożona do urządzenia docelowego i buty, na rozruchu uruchamia skrypt, który używa komendy dd jak tak migać go na innym dysku:Windows C# implementacja polecenia linux dd
dd if =/ścieżka/plik// z/csharp/program =/dev/sdX
Problemem jest tworzenie obrazu po stronie systemu Windows. Wypróbowałem mój Live Linux z plikami, które utworzyłem na systemie Linux przy użyciu dd i działa dobrze, ale muszę mieć możliwość tworzenia tych plików z poziomu aplikacji C# .Net w systemie Windows. Wolałbym nie polegać na cygwin lub jakiejś innej zależności, więc spróbowałem użyć funkcji Win32 CreateFile, aby otworzyć fizyczne urządzenie.
CreateFile nazywany jest z pierwszym arg ustawiony na "\ \ F:." (Jeżeli F: to dysk Chcę obrazu), tak jak poniżej:
SafeFileHandle TheDevice = CreateFile(_DevicePath, (uint)FileAccess.Read, (uint)(FileShare.Write | FileShare.Read | FileShare.Delete), IntPtr.Zero, (uint)FileMode.Open, (uint)FILE_ATTRIBUTE_SYSTEM | FILE_FLAG_SEQUENTIAL_SCAN, IntPtr.Zero);
if (TheDevice.IsInvalid)
{
throw new IOException("Unable to access drive. Win32 Error Code " + Marshal.GetLastWin32Error());
}
FileStream Dest = System.IO.File.Open(_SaveFile, FileMode.Create);
FileStream Src = new FileStream(TheDevice, FileAccess.Read);
Src.CopyTo(Dest);
Dest.Flush();
Src.Close();
Dest.Close();
Ale gdy plik wyjściowy jest dd Z powrotem na dysk za pomocą Live Linux USB wynik nie jest taki, jak oczekiwano (dysk nie jest bootowalny itp., ale od sprawdzenia pliku wyjściowego w edytorze szesnastkowym, wygląda na to, że istnieje MBR na początku itd.).
Czy to jest problem z endianessą, czy też powinienem użyć czegoś innego niż FileStream do skopiowania danych do pliku.
Alternatywnie istnieje przykład dd dla kodu źródłowego Windows (C# lub C++, patrzyłem na Delphi dla http://www.chrysocome.net/dd i nie rozumiem go całkowicie lub nie mam przyzwoitego IDE Delphi, aby wybrać kod), więc widzisz, jak to działa?
UPDATE/EDIT:
Oto ciąg hex z pierwszych 512 bajtów, że wyjście dd zawiera:
33 C0 FA 8E D8 8E D0 BC 00 7C 89 E6 06 57 8E C0 FB FC BF 00 06 B9 00 01 F3 A5 EA 1F 06
00 00 52 52 B4 41 BB AA 55 31 C9 30 F6 F9 CD 13 72 13 81 FB 55 AA 75 0D D1 E9 73 09 66
C7 06 8D 06 B4 42 EB 15 5A B4 08 CD 13 83 E1 3F 51 0F B6 C6 40 F7 E1 52 50 66 31 C0 66
99 E8 66 00 E8 21 01 4D 69 73 73 69 6E 67 20 6F 70 65 72 61 74 69 6E 67 20 73 79 73 74
65 6D 2E 0D 0A 66 60 66 31 D2 BB 00 7C 66 52 66 50 06 53 6A 01 6A 10 89 E6 66 F7 36 F4
7B C0 E4 06 88 E1 88 C5 92 F6 36 F8 7B 88 C6 08 E1 41 B8 01 02 8A 16 FA 7B CD 13 8D 64
10 66 61 C3 E8 C4 FF BE BE 7D BF BE 07 B9 20 00 F3 A5 C3 66 60 89 E5 BB BE 07 B9 04 00
31 C0 53 51 F6 07 80 74 03 40 89 DE 83 C3 10 E2 F3 48 74 5B 79 39 59 5B 8A 47 04 3C 0F
74 06 24 7F 3C 05 75 22 66 8B 47 08 66 8B 56 14 66 01 D0 66 21 D2 75 03 66 89 C2 E8 AC
FF 72 03 E8 B6 FF 66 8B 46 1C E8 A0 FF 83 C3 10 E2 CC 66 61 C3 E8 62 00 4D 75 6C 74 69
70 6C 65 20 61 63 74 69 76 65 20 70 61 72 74 69 74 69 6F 6E 73 2E 0D 0A 66 8B 44 08 66
03 46 1C 66 89 44 08 E8 30 FF 72 13 81 3E FE 7D 55 AA 0F 85 06 FF BC FA 7B 5A 5F 07 FA
FF E4 E8 1E 00 4F 70 65 72 61 74 69 6E 67 20 73 79 73 74 65 6D 20 6C 6F 61 64 20 65 72
72 6F 72 2E 0D 0A 5E AC B4 0E 8A 3E 62 04 B3 07 CD 10 3C 0A 75 F1 CD 18 F4 EB FD 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 19 16 9F 29 00 00 80 01 01 00 06 FE 3F 0E 3F 00 00 00 61 C8 03 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 AA
i tutaj jest to, co mój kod produkuje:
EB 76 90 4D 53 44 4F 53 35 2E 30 00 02 04 04 00 02 00 02 00 00 F8 F2 00 3F 00 FF 00 3F
00 00 00 61 C8 03 00 80 00 29 7A E8 21 04 4E 4F 20 4E 41 4D 45 20 20 20 20 46 41 54 31
36 20 20 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 E9 05 01 B4 0E 53 33 DB CD 10 5B C3 8A 07 3C 00 74 06 E8 EE FF 43 EB F4 C3
0D 4E 6F 20 42 50 42 3A 20 43 61 6E 27 74 20 62 6F 6F 74 20 75 73 69 6E 67 20 43 48 53
20 66 75 6E 63 74 69 6F 6E 73 00 50 B0 2E E8 BC FF 58 33 DB 8E 06 E4 01 F6 06 DC 01 02
75 42 F6 06 DC 01 04 75 07 80 3E E8 01 80 72 34 53 53 52 50 06 53 55 6A 10 8B F4 52 50
8A 16 E8 01 B8 00 42 F9 CD 13 8A EC 58 5A 8D 64 10 72 14 80 FD 00 75 0F 03 C5 83 D2 00
C3 BB 91 00 E8 78 FF F4 EB FD 83 3E 18 00 00 74 F0 52 50 8B CD F7 36 18 00 8B F2 03 D1
3B 16 18 00 76 06 8B 0E 18 00 2B CE 33 D2 F7 36 1A 00 88 16 E9 01 8B F8 8B D7 51 8A C1
8D 4C 01 C0 E6 06 0A CE 8A EA 8B 16 E8 01 B4 02 CD 13 59 73 15 80 FC 09 75 0A 49 EB DE
8A C4 04 30 E8 18 FF B4 00 CD 13 EB D1 58 5A 03 C1 83 D2 00 2B E9 74 07 C1 E1 09 03 D9
EB 94 C3 00 00 00 00 FA FC E8 00 00 5E 81 EE 85 01 2E 8B 84 E4 01 8E D8 8E C0 8E D0 2E
C7 84 7C 01 AF 01 2E 89 84 7E 01 B9 00 01 BF 00 00 F3 2E A5 2E FF AC 7C FF BC 00 0A FB
80 3E E8 01 FF 75 04 88 16 E8 01 83 06 E4 01 20 A1 E0 01 8B 16 E2 01 BD 02 00 E8 E9 FE
50 52 EB 74 90 00 00 00 00 00 00 00 00 00 00 00 D3 20 00 00 00 30 80 00 FF 00 68 41 00
40 09 FF 40 5A AC 04 00 00 AC 04 00 00 00 00 12 00 55 AA
Zostało to zrobione z dokładnie tej samej karty CF bez edytowania/pisania itp., Więc jestem zdezorientowany, dlaczego są tak różne, ale oba także z poprawnymi 55 bajtami AA. Czy system Windows maskuje MBR na kartach, gdy są one dostępne w ten sposób, czy też inne dziwne rzeczy, których nie znam?
Zakładam, że używanie funkcji "dd" z cygwin z kodu C# jest wykluczone? – Greg
To byłaby ostatnia deska ratunku, problem, który moim zdaniem przekształca //./F: path w coś, co dd pod cygwinem rozumie. Więc problem (dla mnie) staje się wtedy, jak w aplikacji C# przekonwertować moją //./F: ścieżkę do/dev/sdX w cygwin. –
@Kragen Myślę, że to, co się tutaj dzieje, to że wersja systemu Windows uzyskuje rekord rozruchowy woluminu, a nie Master Boot Record. Jest tak prawdopodobnie dlatego, że przechodzę do niego //./F: i F: jest po prostu pierwszą partycją, a nie dyskiem fizycznym.Byłoby miło, gdyby ktoś inny mógł potwierdzić, czy mam rację, czy nie, zanim przejdę do następnego pytania o to, jak uzyskać dostęp do dysku fizycznego (zamiast partycji/woluminu). –