<div dir="ltr"><div style>It there any way to implement creating RAW vmdk images using the vbox API only? At the moment I have the following code that attempts to create a raw VMDK disk from a raw image file. The resulting vmdk image is useless, no partitions visible to the guest and wrong file system size.</div>

<div style><br></div><div style>My next step is to strip down CmdCreateRawVMDK from vboxmange code and use it directly. However, I really don't want to do that because that's what I was doing originally.... using vboxmanage's code in a DLL (I know now it is bad)<br>

</div><div style><br></div><div style>My code below.</div><div style><br></div><div style>Thanks,</div><div style>Ribhi</div><div><br></div><div><div><div>HRESULT CVboxMgr::CreateHDFromRaw(LPCTSTR rawImage, LPCTSTR diskFile)</div>

<div>{</div><div><span class="" style="white-space:pre">    </span>HRESULT rc = NO_ERROR;</div><div><span class="" style="white-space:pre">     </span>if (!m_bInit) {</div><div><span class="" style="white-space:pre">            </span>_tprintf(_T("CreateHDFromRaw: not initialized!\n"));</div>

<div><span class="" style="white-space:pre">            </span>rc = -1;</div><div><span class="" style="white-space:pre">   </span>}</div><div><br></div><div><span class="" style="white-space:pre"> </span>// Validate the parameters</div>

<div><span class="" style="white-space:pre">    </span>if (rc == NO_ERROR)</div><div><span class="" style="white-space:pre">        </span>if (rawImage == NULL) {</div><div><span class="" style="white-space:pre">            </span>_ftprintf_s(m_pOutput, _T("CreateHDFromRaw: Incorrect parameter (rawImage=NULL)\n"));</div>

<div><span class="" style="white-space:pre">            </span>rc = -2;</div><div><span class="" style="white-space:pre">   </span>}</div><div><br></div><div><span class="" style="white-space:pre"> </span>if (rc == NO_ERROR)</div><div>

<span class="" style="white-space:pre">       </span>if (diskFile == NULL) {</div><div><span class="" style="white-space:pre">            </span>_ftprintf_s(m_pOutput, _T("CreateHDFromRaw: Incorrect parameter (diskFile=NULL)\n"));</div>

<div><span class="" style="white-space:pre">            </span>rc = -3;</div><div><span class="" style="white-space:pre">   </span>}</div><div><br></div><div><span class="" style="white-space:pre"> </span>// Do an early return for parameter/initialization failures</div>

<div><span class="" style="white-space:pre">    </span>if (rc != NO_ERROR) {</div><div><span class="" style="white-space:pre">              </span>return rc;</div><div><span class="" style="white-space:pre"> </span>}</div><div><br></div>

<div><span class="" style="white-space:pre">    </span>_ftprintf_s(m_pOutput, _T("CreateHDFromRaw: Converting raw image '%s' to '%s'\n"), rawImage, diskFile);</div><div><br></div><div><span class="" style="white-space:pre"> </span>// Before anything get all the information that we need from the raw image</div>

<div><span class="" style="white-space:pre">    </span>LARGE_INTEGER nFSize;</div><div><span class="" style="white-space:pre">      </span>HANDLE hRaw = NULL;</div><div><span class="" style="white-space:pre">        </span></div><div><span class="" style="white-space:pre">   </span>hRaw = CreateFile( rawImage,</div>

<div><span class="" style="white-space:pre">                            </span>FILE_GENERIC_READ,</div><div><span class="" style="white-space:pre">                         </span>FILE_SHARE_READ,</div><div><span class="" style="white-space:pre">                           </span>NULL,</div>

<div><span class="" style="white-space:pre">                            </span>OPEN_ALWAYS,</div><div><span class="" style="white-space:pre">                               </span>FILE_ATTRIBUTE_NORMAL,</div><div><span class="" style="white-space:pre">                             </span>NULL);</div>

<div><span class="" style="white-space:pre">    </span>if (hRaw == INVALID_HANDLE_VALUE) {</div><div><span class="" style="white-space:pre">                </span>_ftprintf_s(m_pOutput, _T("CreateHDFromRaw: Failed to open the raw image. %s\n"),  GetLastErrorString().GetBuffer());</div>

<div><span class="" style="white-space:pre">            </span>rc = -4;</div><div><span class="" style="white-space:pre">   </span>} else {</div><div><span class="" style="white-space:pre">           </span>if (GetFileSizeEx(hRaw, &nFSize) == 0) {</div>

<div><span class="" style="white-space:pre">                    </span>_ftprintf_s(m_pOutput, _T("ConvertFromRaw: Failed to get file size of raw image %s\n"), GetLastErrorString().GetBuffer());</div><div><span class="" style="white-space:pre">                       </span>rc = -5;</div>

<div><span class="" style="white-space:pre">            </span>}</div><div><span class="" style="white-space:pre">  </span>}</div><div><br></div><div><span class="" style="white-space:pre"> </span>IMedium * pMedium = NULL;</div><div>

<span class="" style="white-space:pre">       </span>IProgress * pProgress = NULL;</div><div><span class="" style="white-space:pre">      </span></div><div><span class="" style="white-space:pre">   </span>BSTR bsType = SysAllocString(_T("vmdk"));</div>

<div><span class="" style="white-space:pre">    </span>BSTR bsDst = SysAllocString(diskFile);</div><div><br></div><div><span class="" style="white-space:pre">    </span>if (rc == NO_ERROR) {</div><div><span class="" style="white-space:pre">              </span>rc = m_VirtualBox->CreateHardDisk(bsType, bsDst, &pMedium);</div>

<div><span class="" style="white-space:pre">            </span>if (rc != NO_ERROR) {</div><div><span class="" style="white-space:pre">                      </span>_ftprintf_s(m_pOutput, _T("ConvertFromRaw: CreateHardDisk failed %s\n"), GetLastErrorString(rc).GetBuffer());</div>

<div><span class="" style="white-space:pre">            </span>}</div><div><span class="" style="white-space:pre">  </span>}</div><div><span class="" style="white-space:pre">  </span></div><div><span class="" style="white-space:pre">   </span>if (rc == NO_ERROR) {</div>

<div><span class="" style="white-space:pre">            </span>_ftprintf_s(m_pOutput, _T("ConvertFromRaw: Creating base storage with size %ld\n"), nFSize.QuadPart);</div><div><span class="" style="white-space:pre">            </span>rc = pMedium->CreateBaseStorage(nFSize.QuadPart, MediumVariant_VmdkRawDisk, &pProgress);</div>

<div><span class="" style="white-space:pre">            </span>if (rc != NO_ERROR) {</div><div><span class="" style="white-space:pre">                      </span>_ftprintf_s(m_pOutput, _T("CreateBaseStorage failed %s\n"), GetLastErrorString(rc).GetBuffer());</div>

<div><span class="" style="white-space:pre">            </span>}</div><div><span class="" style="white-space:pre">  </span>}</div><div><br></div><div><span class="" style="white-space:pre"> </span>if (rc == NO_ERROR) {</div><div><span class="" style="white-space:pre">              </span>pProgress->WaitForCompletion(0);</div>

<div><span class="" style="white-space:pre">    </span>}</div><div><br></div><div><span class="" style="white-space:pre"> </span>SAFE_RELEASE(pProgress);</div><div><span class="" style="white-space:pre">   </span>SAFE_RELEASE(pMedium);</div>

<div><br></div><div><span class="" style="white-space:pre">   </span>if (bsType)</div><div><span class="" style="white-space:pre">                </span>SysFreeString(bsType);</div><div><br></div><div><span class="" style="white-space:pre">    </span>if (bsDst)</div>

<div><span class="" style="white-space:pre">            </span>SysFreeString(bsDst);</div><div><span class="" style="white-space:pre">      </span></div><div><span class="" style="white-space:pre">   </span>return rc;</div><div>}</div></div>

</div></div>