Document probing samples

This commit is contained in:
Lucian Petrut
2026-09-08 14:41:24 +00:00
parent f70a1d485e
commit 14ed40548e
7 changed files with 853 additions and 1 deletions
+139
View File
@@ -0,0 +1,139 @@
#!/usr/bin/env python3
"""Trace VDDK Read at several offsets/sizes for NFC IO capture."""
import ctypes
import os
VDDK_DIR = "/home/ubuntu/workspace/vmware_nbd_tests/vddk"
lib = ctypes.CDLL(os.path.join(VDDK_DIR, "libvixDiskLib.so"))
VIXDISKLIB_CRED_UID = 1
VIXDISKLIB_FLAG_OPEN_READ_ONLY = 4
SECTOR = 512
class VixDiskLibUidPasswdCreds(ctypes.Structure):
_fields_ = [
("userName", ctypes.c_char_p),
("password", ctypes.c_char_p),
]
class VixDiskLibSessionIdCreds(ctypes.Structure):
_fields_ = [
("cookie", ctypes.c_char_p),
("userName", ctypes.c_char_p),
("key", ctypes.c_char_p),
]
class VixDiskLibCreds(ctypes.Union):
_fields_ = [
("uid", VixDiskLibUidPasswdCreds),
("sessionId", VixDiskLibSessionIdCreds),
]
class VixDiskLibConnectParams(ctypes.Structure):
_fields_ = [
("vmxSpec", ctypes.c_char_p),
("serverName", ctypes.c_char_p),
("thumbPrint", ctypes.c_char_p),
("privateUse", ctypes.c_longlong),
("credType", ctypes.c_uint32),
("creds", VixDiskLibCreds),
("port", ctypes.c_uint32),
("nfcHostPort", ctypes.c_uint32),
("vimApiVer", ctypes.c_char_p),
]
def check(err, what):
if err != 0:
lib.VixDiskLib_GetErrorText.restype = ctypes.c_void_p
lib.VixDiskLib_GetErrorText.argtypes = [ctypes.c_uint64, ctypes.c_char_p]
msg = lib.VixDiskLib_GetErrorText(err, None)
text = ctypes.cast(msg, ctypes.c_char_p).value
lib.VixDiskLib_FreeErrorText.argtypes = [ctypes.c_char_p]
lib.VixDiskLib_FreeErrorText(ctypes.cast(msg, ctypes.c_char_p))
raise SystemExit(f"{what} failed: {err} {text}")
def main():
os.makedirs("/tmp/vddk-read-trace", exist_ok=True)
config_path = "/tmp/vddk-read-trace/vddk.config"
with open(config_path, "w") as f:
f.write("tmpDirectory=/tmp/vddk-read-trace\n")
f.write("log.fileName=/tmp/vddk-read-trace/vddk.log\n")
f.write("log.fileLevel=verbose\n")
f.write("vixDiskLib.nfc.LogLevel=4\n")
f.write("vixDiskLib.transport.LogLevel=4\n")
lib.VixDiskLib_InitEx.argtypes = [
ctypes.c_uint32, ctypes.c_uint32, ctypes.c_void_p, ctypes.c_void_p,
ctypes.c_void_p, ctypes.c_char_p, ctypes.c_char_p]
lib.VixDiskLib_InitEx.restype = ctypes.c_uint64
check(lib.VixDiskLib_InitEx(
8, 0, None, None, None, VDDK_DIR.encode(), config_path.encode()),
"InitEx")
params = VixDiskLibConnectParams()
params.vmxSpec = b"<sanitized>"
params.serverName = b"<sanitized>"
params.thumbPrint = b"<sanitized>"
params.credType = VIXDISKLIB_CRED_UID
params.creds.uid.userName = b"<sanitized>"
params.creds.uid.password = b"<sanitized>"
params.port = 443
lib.VixDiskLib_ConnectEx.argtypes = [
ctypes.POINTER(VixDiskLibConnectParams), ctypes.c_char,
ctypes.c_char_p, ctypes.c_char_p, ctypes.POINTER(ctypes.c_void_p)]
lib.VixDiskLib_ConnectEx.restype = ctypes.c_uint64
conn = ctypes.c_void_p()
check(lib.VixDiskLib_ConnectEx(
params, True, b"snapshot-13442", b"nbd", ctypes.byref(conn)),
"ConnectEx")
print("ConnectEx ok", flush=True)
lib.VixDiskLib_Open.argtypes = [
ctypes.c_void_p, ctypes.c_char_p, ctypes.c_uint32,
ctypes.POINTER(ctypes.c_void_p)]
lib.VixDiskLib_Open.restype = ctypes.c_uint64
disk = ctypes.c_void_p()
path = b"[datastore0] test-coriolis-jenkins-rocky9/test-coriolis-jenkins-rocky9-000007.vmdk"
check(lib.VixDiskLib_Open(conn, path, VIXDISKLIB_FLAG_OPEN_READ_ONLY, ctypes.byref(disk)),
"Open")
print("Open ok", flush=True)
lib.VixDiskLib_Read.argtypes = [
ctypes.c_void_p, ctypes.c_uint64, ctypes.c_uint64, ctypes.c_char_p]
lib.VixDiskLib_Read.restype = ctypes.c_uint64
reads = [
(0, 1),
(0, 2),
(1, 1),
(8, 8),
(0, 128),
(0, 129),
(256, 64),
]
for start, n in reads:
buf = ctypes.create_string_buffer(n * SECTOR)
check(lib.VixDiskLib_Read(disk, start, n, buf), f"Read {start}+{n}")
nz = sum(1 for b in buf.raw if b)
print(f"Read start={start} n={n} first16={buf.raw[:16].hex()} nonzero={nz}",
flush=True)
lib.VixDiskLib_Close.argtypes = [ctypes.c_void_p]
lib.VixDiskLib_Close.restype = ctypes.c_uint64
lib.VixDiskLib_Disconnect.argtypes = [ctypes.c_void_p]
lib.VixDiskLib_Disconnect.restype = ctypes.c_uint64
lib.VixDiskLib_Close(disk)
lib.VixDiskLib_Disconnect(conn)
lib.VixDiskLib_Exit()
if __name__ == "__main__":
main()