2011-08-17 19 views
9

मैं एक सी # .Net ऐप लिख रहा हूं जो विंडोज़ पर चलाने के लिए है जिसे हटाने योग्य डिस्क की एक छवि लेने और इसे लिनक्स लाइव यूएसबी पर चक करने की आवश्यकता है। लाइव USB लक्ष्य मशीन और जूते में डाला जाता है, शुरू पर यह एक स्क्रिप्ट जो की तरह dd कमांड का उपयोग करता है चलाता है तो एक और ड्राइव पर इसे फ्लैश करने के लिए:विंडोज सी # लिनक्स डीडी कमांड का कार्यान्वयन

dd अगर =/path/to/फ़ाइल/से/csharp/प्रोग्राम =/dev/sdX

मेरी समस्या यह है कि मैं विंडोज़ पक्ष पर छवि बना रहा हूं। मैंने अपने लाइव लिनक्स को डीडी का उपयोग करके लिनक्स सिस्टम पर बनाई गई फ़ाइलों के साथ बाहर करने की कोशिश की है और यह ठीक काम करता है, लेकिन मुझे इन फ़ाइलों को सी # के भीतर से बनाने में सक्षम होना चाहिए। विंडोज़ पर एप्लिकेशन। मुझे सिग्विन या कुछ अन्य निर्भरता पर भरोसा नहीं करना पड़ेगा इसलिए भौतिक डिवाइस को खोलने के लिए Win32 CreateFile फ़ंक्शन का उपयोग करने का प्रयास किया।

CreateFile पहले आर्ग सेट के साथ करने के लिए कहा जाता है "\ \ एफ:।"

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(); 

लेकिन जब आउटपुट फ़ाइल dd है: है, तो तरह (अगर एफ ड्राइव मैं छवि चाहते हैं) लाइव लिनक्स यूएसबी का उपयोग कर डिस्क पर वापस आना परिणाम अपेक्षित नहीं है (डिस्क बूट करने योग्य नहीं है आदि, लेकिन एक हेक्स संपादक में आउटपुट फ़ाइल की जांच करने से, ऐसा लगता है कि शुरुआत में एमबीआर है आदि)।

क्या यह अंतहीनता के साथ एक समस्या है या मुझे फ़ाइल में डेटा की प्रतिलिपि बनाने के लिए फ़ाइलस्ट्रीम के अलावा कुछ और उपयोग करना चाहिए।

वैकल्पिक रूप से विंडोज स्रोत कोड (सी # या सी ++ के लिए डीडी का एक उदाहरण है, मैंने http://www.chrysocome.net/dd के लिए डेल्फी को देखा है और इसे पूरी तरह से समझ नहीं पाया है या कोड को अलग करने के लिए एक सभ्य डेल्फी आईडीई है) तो मैं देख सकते हैं कि यह कैसे काम करता है?

अद्यतन/संपादित करें:

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 

और यहाँ क्या मेरी कोड का उत्पादन किया जाता है::

यहाँ पहले 512 बाइट्स कि dd उत्पादन होता है की एक हेक्स स्ट्रिंग है

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 

यह किसी भी संपादन/लेखन इत्यादि के बिना बिल्कुल उसी सीएफ कार्ड से लिया गया था, इसलिए मैं उलझन में हूं कि वे इतने अलग क्यों हैं, लेकिन दोनों ई सही 55 एए बाइट्स के साथ भी। क्या विंडोज़ एमबीआर के कार्ड पर उलझन में हैं जब उन्हें इस तरह से पहुंचाया जा सकता है या हुड सामान के तहत कुछ अजीब है जो मुझे पता नहीं है?

+0

मुझे लगता है कि आपके सी # कोड से सिग्विन से "डीडी" कॉलिंग का उपयोग कर सवाल है? – Greg

+0

यह एक आखिरी उपाय होगा, मुझे लगता है कि समस्या // ///F: पथ को परिवर्तित कर रही है जो कि सिगविन के तहत डीडी समझती है। तो समस्या (मेरे लिए) तब सी # एप्लिकेशन के भीतर कैसे बनती है, // ///एफ: पथ को/dev/sdX में साइगविन में परिवर्तित करें। –

+1

@ क्रैगेन मुझे लगता है कि यहां क्या हो रहा है यह है कि विंडोज संस्करण वॉल्यूम बूट रिकॉर्ड को मास्टर बूट रिकॉर्ड नहीं मिला है। ऐसा शायद इसलिए है क्योंकि मैं इसे पास कर रहा हूं // ///F: और F: केवल पहला विभाजन है, भौतिक डिस्क नहीं।अच्छा होगा अगर कोई और पुष्टि कर सकता है कि मैं सही हूं या नहीं, इससे पहले कि मैं भौतिक डिस्क (विभाजन/वॉल्यूम के बजाय) तक पहुंचने के बारे में अगले प्रश्न में शामिल हूं। नमूना इनपुट और आउटपुट समेत अच्छी तरह से शोध किए गए, स्पष्ट प्रश्न के लिए –

उत्तर

4

मुझे लगता है कि आपको क्या काम करना चाहिए - मैंने इसे बूट करने योग्य फ्लॉपी डिस्क छवि (ImDisk का उपयोग करके वर्चुअल ड्राइव के रूप में घुड़सवार) का उपयोग करके स्वयं की कोशिश की है और परिणामी फ़ाइल मूल छवि के समान बाइनरी है।

पूर्णता यहाँ के लिए कोड मैं प्रयोग किया जाता है (इसकी entirity में) है:

using System; 
using System.IO; 
using System.Runtime.InteropServices; 
using Microsoft.Win32.SafeHandles; 

namespace ConsoleApplication1 
{ 
    public class Program 
    { 
     const int FILE_ATTRIBUTE_SYSTEM = 0x4; 
     const int FILE_FLAG_SEQUENTIAL_SCAN = 0x8; 

     [DllImport("Kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)] 
     public static extern SafeFileHandle CreateFile(string fileName, [MarshalAs(UnmanagedType.U4)] FileAccess fileAccess, [MarshalAs(UnmanagedType.U4)] FileShare fileShare, IntPtr securityAttributes, [MarshalAs(UnmanagedType.U4)] FileMode creationDisposition, int flags, IntPtr template); 

     [STAThread] 
     static void Main() 
     { 
      using (SafeFileHandle device = CreateFile(@"\\.\E:", FileAccess.Read, FileShare.Write | FileShare.Read | FileShare.Delete, IntPtr.Zero, FileMode.Open, FILE_ATTRIBUTE_SYSTEM | FILE_FLAG_SEQUENTIAL_SCAN, IntPtr.Zero)) 
      { 
       if (device.IsInvalid) 
       { 
        throw new IOException("Unable to access drive. Win32 Error Code " + Marshal.GetLastWin32Error()); 
       } 
       using (FileStream dest = File.Open("TempFile.bin", FileMode.Create)) 
       { 
        using (FileStream src = new FileStream(device, FileAccess.Read)) 
        { 
         src.CopyTo(dest); 
        } 
       } 
      } 
     } 
    } 
} 

अगर यह काम नहीं करता है यह है कि इंगित करता है:

  1. के साथ एक समस्या है मूल छवि।
  2. समस्या जो भी आपने लिखा है डिस्क छवि का उपयोग कर रहा है।
  3. विशिष्ट डिवाइस आप तक पहुँच रहे हैं के साथ काम कर (हालांकि मुझे लगता है कि नहीं कर सकता)

सबसे अधिक संभावना अपराधी कदम 2. क्या वास्तव में यह है कि आप के साथ कर रहे हैं है में कुछ सूक्ष्म अंतर नहीं है परिणामस्वरूप डिस्क छवि?


अद्यतन: इस टिप्पणी में लिखा है, लेकिन पूर्णता के लिए मैंने सोचा था कि मैं अपने जवाब में जोड़ने चाहते हैं - ऐसा लगता है कि क्या हो रहा क्या है कि डिस्क के पहले विभाजन की सामग्री को किया जा रहा है है लिखा, जब वांछित है तो पूरी डिस्क की सामग्री है।

जब आप HxD की तरह दूसरी हेक्स स्ट्रिंग (नमूना कोड द्वारा उत्पादित एक) कुछ में पर एक नज़र हम इस देखें:

ëv.MSDOS5.0..........øò.?.ÿ.?...aÈ..€.)zè!.NO NAME FAT16 .. 
........................................................é..´.S3Û 
Í.[Ê.<.t.èîÿCëôÃ.No BPB: Can't boot using CHS functions.P°.è¼ÿX 
3ÛŽ.ä.ö.Ü..uBö.Ü..u.€>è.€r4SSRP.SUj.‹ôRPŠ.è.¸.BùÍ.ŠìXZ.d.r.€ý.u. 
.ŃÒ.û‘.èxÿôëýƒ>...tðRP‹Í÷6..‹ò.Ñ;...v.‹...+Î3Ò÷6..ˆ.é.‹ø‹×QŠÁ. 
L.Àæ..Ίê‹.è.´.Í.Ys.€ü.u.IëÞŠÄ.0è.ÿ´.Í.ëÑXZ.ÁƒÒ.+ét.Áá..Ùë”Ã.... 
úüè..^.î…..‹„ä.ŽØŽÀŽÐ.Ç„|.¯..‰„~.¹..¿..ó.¥.ÿ¬|ÿ¼..û€>è.ÿu.ˆ.è.ƒ. 
ä. ¡à.‹.â.½..èéþPRët............Ó ...0€.ÿ[email protected]ÿ@Z¬...¬.......Uª 

यह boot sector of a FAT16 partition की तरह मुझे लग रहा है - तार की उपस्थिति शुरुआत के करीब "एमएसडीओएस 5.0", "नो NAME" और "एफएटी 16" एक मृत देरी है।

पहले हेक्स स्ट्रिंग (dd द्वारा उत्पादित एक) के उत्पादन को यह तुलना करें:

3ÀúŽØŽÐ¼.|‰æ.WŽÀûü¿..¹..ó¥ê....RR´A»ªU1É0öùÍ.r..ûUªu.Ñés.fÇ...´B 
ë.Z´.Í.ƒá?Q.¶Æ@÷áRPf1Àf™èf.è!.Missing operating system...f`f1Ò». 
|fRfP.Sj.j.‰æf÷6ô{Àä.ˆáˆÅ’ö6ø{ˆÆ.áA¸..Š.ú{Í..d.faÃèÄÿ¾¾}¿¾.¹ .ó¥ 
Ãf`‰å»¾.¹..1ÀSQö.€[email protected]‰ÞƒÃ.âóHt[y9Y[ŠG.<.t.$.<.u"f‹G.f‹V.f.Ðf!Òu. 
f‰Âè¬ÿr.è¶ÿf‹F.è ÿƒÃ.âÌfaÃèb.Multiple active partitions...f‹D.f. 
F.f‰D.è0ÿr..>þ}Uª.….ÿ¼ú{Z_.úÿäè..Operating system load error...^ 
¬´.Š>b.³.Í.<.uñÍ.ôëý......................................Ÿ)..€. 
...þ?.?...aÈ..................................................Uª 

और हम कुछ है कि मेरे लिए एक master boot record की तरह एक बहुत लग रहा है देखते हैं। क्यूं कर? चूंकि एमबीआर में पहले 440 बाइट्स बूट कोड हैं, एफएटी बूट सेक्टर के विपरीत जिसमें विशिष्ट बायोस पैरामीटर ब्लॉक होता है (यह ऊपर कचरा जैसा दिखता है, लेकिन यदि आप इसे डिस्सेबलर के माध्यम से डालते हैं तो आपको कुछ ऐसा लगता है जो वैध 16 बिट जैसा दिखता है कोड)।

इसके अलावा, वे दोनों वैध और पूरी तरह से अलग बूट क्षेत्रों (त्रुटि संदेशों के साथ पूर्ण) की तरह दिखते हैं। ऐसा कोई तरीका नहीं है कि एक प्रोग्रामिंग त्रुटि दूसरे की तरह दिखने के लिए "उलझन" हो सकती है - यह सिर्फ गलत बात पढ़ी जा रही है।


आदेश विभाजन की तरह तुम सिर्फ यह एक अलग स्ट्रिंग पारित करने के लिए की जरूरत है यह लग रहा है के बजाय डिस्क वापस जाने के लिए, उदाहरण के @"\\.\PhysicalDrive0" के लिए CreateFile पाने के लिए पहले भौतिक डिस्क खोलता है।

देखें:

+0

कुछ पृष्ठभूमि जानकारी, जो बताएगी कि मैं और अधिक विस्तार से क्या कर रहा हूं। हमारे पुराने सिस्टम एक एफएटी स्वरूपित सीएफ कार्ड से बूट करने के लिए प्रयुक्त होते थे, ताकि सिस्टम पर सॉफ़्टवेयर अपडेट करने के लिए, आप केवल विंडोज ऐप का उपयोग करके सीएफ कार्ड को रिफ्लैश करेंगे। सीएफ कार्ड से बूट करने के लिए नई प्रणाली का कोई समर्थन नहीं है, लेकिन इसमें हार्ड ड्राइव और यूएसबी पोर्ट है। तो योजना सीएफ कार्ड को फ्लैश करने के लिए पहले विंडोज ऐप का उपयोग करने की तरह थी, फिर उस सीएफ कार्ड की एक छवि लें (मेरे सी # ऐप वाले विंडोज़ में) इसे लाइव यूएसबी पर कॉपी करें जो हार्ड ड्राइव को फ्लैश करेगा, सीएफ कार्ड छवि –

+0

के साथ डीडी का उपयोग कर लाइव लिनक्स पर्यावरण मुझे नहीं लगता कि यह चरण 2 है जैसे कि मैंने एक छवि डाल दी है जिसे मैंने लिनक्स वीएम और डीडी का उपयोग करके सीएफ से बनाया है, यह काम करता है। –

+0

@rb_ 7 आह मैं देखता हूं - इसलिए अंततः छवि को हार्ड डिस्क पर लिखा जाता है। उस स्थिति में मुझे यकीन नहीं है कि यह क्यों काम नहीं कर रहा है - जब तक कि पहले सेक्टर (512 बाइट्स) "वैध बूटसेक्टर" हस्ताक्षर बाइट्स (0x55, 0xAA) के साथ समाप्त होता है, तब तक BIOS को आगे बढ़ना चाहिए और उस बूट सेक्टर का उपयोग करके बूट करना चाहिए। मेरा ** अनुमान ** यह होगा कि BIOS वास्तव में उस बूट सेक्टर का उपयोग कर रहा है, लेकिन हार्डवेयर अंतर का मतलब है कि बूट लोडर (जो पहले आपके पुराने सिस्टम पर काम करता था) नई प्रणाली पर असफल रहा है। – Justin

1

यह क्या मैं \ प्राप्त करने के लिए लिखा है किसी दिए गए ड्राइव अक्षर के लिए PhysicalDriveX मार्ग है \।। यदि इसमें ड्राइव अक्षर पास करें और रिटर्न वैल्यू लें और पहले पैराम के रूप में CreateFile में पास करें तो मुझे अब लिनक्स के तहत डीडी के समान कुछ मिलना चाहिए।

using System.Management; //Add in a reference to this as well in the project settings 
public static string GetPhysicalDevicePath(char DriveLetter) 
{ 
    ManagementClass devs = new ManagementClass(@"Win32_Diskdrive"); 
    { 
     ManagementObjectCollection moc = devs.GetInstances(); 
     foreach(ManagementObject mo in moc) 
     { 
      foreach (ManagementObject b in mo.GetRelated("Win32_DiskPartition")) 
      { 
       foreach (ManagementBaseObject c in b.GetRelated("Win32_LogicalDisk")) 
       { 
        string DevName = string.Format("{0}", c["Name"]); 
        if (DevName[0] == DriveLetter) 
         return string.Format("{0}", mo["DeviceId"]); 
       } 
      } 
     } 
    } 
    return ""; 
} 
संबंधित मुद्दे