?? vdiskvmdk.cpp
字號:
/* VDiskVmdk.cpp VMDK class Copyright (c) 2003 Ken Kato*/#include "vdkbase.h"#include "vdkutil.h"#include "vmdisk.h"#include "VDiskVmdk.h"#include "VDiskExtRaw.h"#include "VDiskExtVmdk.h"#include "VDiskUtil.h"#include "VDiskFile.h"//// Constructor -- set default member values//VDiskVmdk::VDiskVmdk(){ m_nVMwareVer = 4; m_nHardwareVer = VMDK_HARDWARE_VMWARE4;}//// Destructor//VDiskVmdk::~VDiskVmdk(){}//// Initialize instance from a VMware 4.x descriptor file//VDKSTAT VDiskVmdk::Initialize(PCHAR pPath){ VDiskFile file; CHAR buf[MAX_PATH + 40]; CHAR path[MAX_PATH]; PVOID cbparams[2]; PCHAR current; ULONG signature; ULONG len; VDKSTAT ret; // // parameter check // if (!pPath || !*pPath) { return VDK_PARAM; } // // store path // if ((ret = StorePath(pPath)) != VDK_OK) { return ret; } // // open file // if ((ret = file.Open(pPath)) != VDK_OK) { return ret; } // // initialize members // cbparams[0] = pPath; // // read first 4 bytes // signature = 0; ret = file.ReadByte((PUCHAR)&signature, sizeof(signature), &len); if (ret != VDK_OK) { return ret; } if (len != sizeof(signature)) { return VDK_EOF; } if (signature == VMDK_SIGNATURE) { // // it's a monolithic sparse file // -- descriptor offset is stored in header // VMDK_HEADER vmdk; ret = file.ReadByte((PUCHAR)&vmdk + sizeof(signature), sizeof(vmdk) - sizeof(signature), &len); if (ret != VDK_OK) { return ret; } if (len != sizeof(vmdk) - sizeof(signature)) { return VDK_DATA; } if (vmdk.DescOffsetLow == 0 || vmdk.DescOffsetHigh != 0 || vmdk.DescSizeLow == 0 || vmdk.DescSizeHigh != 0) { VDiskCallBack(VDISK_CB_VMDK_NODESC, cbparams); return VDK_DATA; } ret = VdkSeekFile(file.Handle(), vmdk.DescOffsetLow << VDK_BYTE_SHIFT_TO_SECTOR); if (ret != VDK_OK) { return ret; } } else { ret = VdkSeekFile(file.Handle(), 0); if (ret != VDK_OK) { return ret; } } while ((ret = file.ReadText(buf, sizeof(buf), NULL)) == VDK_OK) { // // replace tabs with blanks // current = buf; while (*current) { if (*current == '\t' || *current == '\n') { *current = ' '; } current++; } // // remove trailing blanks // while (current > buf && *(--current) == ' ') { *current = '\0'; } // // skip leading blanks // current = buf; while (*current == ' ') { current++; } // // blank line? // if (!*current) { continue; } cbparams[1] = current; // // parse current line // if (!VdkCmpNoCaseN(current, "RW ", 3) || !VdkCmpNoCaseN(current, "RDONLY", 6)) { VDiskExt *ext; PCHAR top, tail, p; ULONG capacity; CHAR delim; BOOL sparse; ULONG offset; HANDLE hFile; // // search capacity field // p = current + 3; while (*p == ' ') { p++; } capacity = atol(p); if (!capacity) { capacity = VDiskCallBack( VDISK_CB_DESC_CAPACITY, cbparams); if (!capacity) { return VDK_DATA; } SetFlag(VDISK_FLAG_DIRTY); } // // search extent type field // while (isdigit(*p)) { p++; } while (*p == ' ') { p++; } if (!VdkCmpNoCaseN(p, "flat ", 5)) { sparse = FALSE; } else if (!VdkCmpNoCaseN(p, "sparse ", 7)) { sparse = TRUE; } else { ULONG type = VDiskCallBack( VDISK_CB_DESC_FILETYPE, cbparams); if (type == VDK_FILETYPE_FLAT) { sparse = FALSE; } else if (type == VDK_FILETYPE_VMDK) { sparse = TRUE; } else { return VDK_DATA; } SetFlag(VDISK_FLAG_DIRTY); } // // search extent path field // top = p; while (*top && *top != ' ') { top++; } while (*top == ' ') { top++; } if (*top == '\"') { delim = '\"'; top++; } else { delim = ' '; } tail = top; while (*tail && *tail != delim) { tail++; } if (!*tail || tail - top >= MAX_PATH) { if (!VDiskCallBack(VDISK_CB_DESC_BADENTRY, cbparams)) { return VDK_CANCEL; } SetFlag(VDISK_FLAG_DIRTY); continue; } if ((isalpha(*top) && *(top + 1) == ':') || *top == PATH_SEPARATOR_CHAR || *top == ALT_SEPARATOR_CHAR) { SetFlag(VDISK_FLAG_ABSPATH); } else { ClrFlag(VDISK_FLAG_ABSPATH); } VdkCopyMem(path, top, tail - top); path[tail - top] = '\0'; if (sparse) { offset = 0; } else { // // search "backing offset" field // p = tail + 1; while (*p == ' ') { p++; } if (isdigit(*p)) { offset = atol(p); } else { offset = 0; } } // open the extent file *tail = '\0'; ret = VDiskSearchFile(&hFile, path, m_pPath); if (ret != VDK_OK) { return ret; } // // create an extent object // if (sparse) { ext = new VDiskExtVmdk; } else { ext = new VDiskExtRaw; } if (ext == NULL) { ret = VdkLastError(); VdkCloseFile(hFile); return ret; } ret = AddExtent(ext); if (ret != VDK_OK) { VdkCloseFile(hFile); delete ext; return ret; } ret = ext->SetPath(path); if (ret != VDK_OK) { VdkCloseFile(hFile); return ret; } ret = ext->Load(hFile); VdkCloseFile(hFile); if (ret != VDK_OK) { return ret; } ext->SetCapacity(capacity); if (!sparse) { ((VDiskExtRaw *)ext)->SetBackOffset(offset); } } else if (!VdkCmpNoCaseN(current, "ddb.geometry.sectors", 20)) { PCHAR p = current + 20; while (*p == ' ' || *p == '=' || *p == '\"') { p++; } m_nSectors = atol(p); if (!m_nSectors) { m_nSectors = VDiskCallBack( VDISK_CB_DESC_GEOMETRY, cbparams); if (!m_nSectors) { return VDK_DATA; } SetFlag(VDISK_FLAG_DIRTY); } } else if (!VdkCmpNoCaseN(current, "ddb.geometry.heads", 18)) { PCHAR p = current + 18; while (*p == ' ' || *p == '=' || *p == '\"') { p++; } m_nTracks = atol(p); if (!m_nTracks) { m_nTracks = VDiskCallBack( VDISK_CB_DESC_GEOMETRY, cbparams); if (!m_nTracks) { return VDK_DATA; } SetFlag(VDISK_FLAG_DIRTY); } } else if (!VdkCmpNoCaseN(current, "ddb.geometry.cylinders", 22)) { PCHAR p = current + 22; while (*p == ' ' || *p == '=' || *p == '\"') { p++; } m_nCylinders = atol(p); if (!m_nCylinders) { m_nCylinders = VDiskCallBack( VDISK_CB_DESC_GEOMETRY, cbparams); if (!m_nCylinders) { return VDK_DATA; } SetFlag(VDISK_FLAG_DIRTY); } } else if (!VdkCmpNoCaseN(current, "CID", 3)) { PCHAR p = current + 3; while (*p == ' ' || *p == '=' || *p == '\"') { p++; } if (!sscanf(p, "%lx", &m_nTimeStamp)) { if (!VDiskCallBack(VDISK_CB_DESC_TIMESTAMP, cbparams)) { return VDK_CANCEL; } m_nTimeStamp = (ULONG)-1; SetFlag(VDISK_FLAG_DIRTY); } } else if (!VdkCmpNoCaseN(current, "parentCID", 9)) { PCHAR p = current + 9; while (*p == ' ' || *p == '=' || *p == '\"') { p++; } if (!sscanf(p, "%lx", &m_nParentTS)) { if (!VDiskCallBack(VDISK_CB_DESC_TIMESTAMP, cbparams)) { return VDK_CANCEL; } m_nParentTS = (ULONG)-1; SetFlag(VDISK_FLAG_DIRTY); } if (m_nParentTS != (ULONG)-1) { SetFlag(VDISK_FLAG_CHILD); } } else if (!VdkCmpNoCaseN(current, "ddb.virtualHWVersion", 20)) { PCHAR p = current + 20; while (*p == ' ' || *p == '=' || *p == '\"') { p++; } m_nHardwareVer = atol(p); } else if (!VdkCmpNoCaseN(current, "ddb.adapterType", 15)) { PCHAR p = current + 15; while (*p == ' ' || *p == '=' || *p == '\"') { p++; } if (!VdkCmpNoCaseN(p, "ide", 3)) { m_nController = VDISK_CONTROLLER_IDE; } else if (!VdkCmpNoCaseN(p, "buslogic", 8)) { m_nController = VDISK_CONTROLLER_SCSI; } else { m_nController = VDiskCallBack( VDISK_CB_CONTROLLER, cbparams); if (m_nController != VDISK_CONTROLLER_SCSI && m_nController != VDISK_CONTROLLER_IDE) { return VDK_CANCEL; } SetFlag(VDISK_FLAG_DIRTY); } } else if (!VdkCmpNoCaseN(current, "createType", 10)) { PCHAR p = current + 10; ULONG type; while (*p == ' ' || *p == '=' || *p == '\"') {
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -