Skip to content

Commit

Permalink
[safehook] Alignment for WvSafeHookDefaultDummyIds
Browse files Browse the repository at this point in the history
A future call to WvDummyAdd should have an aligned ExtraDataOffset
argument, so calculate it ahead of time.
  • Loading branch information
Shao Miller committed Dec 10, 2012
1 parent db6dd99 commit 623e8ef
Showing 1 changed file with 38 additions and 17 deletions.
55 changes: 38 additions & 17 deletions src/winvblock/safehook/probe.c
Original file line number Diff line number Diff line change
Expand Up @@ -58,12 +58,44 @@
M_WV_SAFE_HOOK_VENDOR_ID M_WV_SAFE_HOOK_HARDWARE_ID
#define M_WV_SAFE_HOOK_DEVICE_TEXT_DESC L"Safe INT 0x13 Hook Bus"

/** Default dummy IDs for a safe hook PDO */
WV_M_DUMMY_ID_GEN(
static,
WvSafeHookDefaultDummyIds,
M_WV_SAFE_HOOK_HARDWARE_ID,
M_WV_SAFE_HOOK_INSTANCE_ID,
M_WV_SAFE_HOOK_VENDOR_ID,
M_WV_SAFE_HOOK_COMPAT_ID,
M_WV_SAFE_HOOK_DEVICE_TEXT_DESC,
FILE_DEVICE_CONTROLLER,
FILE_DEVICE_SECURE_OPEN
);

/** Object types */

typedef UCHAR
A_WV_SAFE_HOOK_VENDOR_STRING[sizeof M_WV_SAFE_HOOK_SIGNATURE];
typedef WCHAR
A_WV_SAFE_HOOK_WIDE_VENDOR_STRING[sizeof M_WV_SAFE_HOOK_SIGNATURE];

/** This type is used for an alignment calculation */
typedef struct S_WV_SAFE_HOOK_DUMMY_WRAPPER {
/** The type of this member was produced by WV_M_DUMMY_ID_GEN */
struct WvSafeHookDefaultDummyIdsStruct_ DummyIdsWrapper[1];

/** The associated safe hook */
S_X86_SEG16OFF16 Whence[1];
} S_WV_SAFE_HOOK_DUMMY_WRAPPER;

/** Constants */

static const ULONG CvWvSafeHookDummyIdsSize =
sizeof (struct WvSafeHookDefaultDummyIdsStruct_);

/** An alignment calculation */
static const ULONG CvWvSafeHookDummyIdsExtraDataOffset =
FIELD_OFFSET(S_WV_SAFE_HOOK_DUMMY_WRAPPER, Whence);

/** Public function declarations */
DRIVER_INITIALIZE WvSafeHookDriverEntry;

Expand Down Expand Up @@ -379,19 +411,6 @@ static WV_S_DUMMY_IDS * WvSafeHookDummyIds(
IN A_WV_SAFE_HOOK_VENDOR_STRING * vendor,
IN S_X86_SEG16OFF16 * whence
) {
/* Default dummy IDs for a safe hook PDO */
WV_M_DUMMY_ID_GEN(
static,
safe_hook_dummy_ids,
M_WV_SAFE_HOOK_HARDWARE_ID,
M_WV_SAFE_HOOK_INSTANCE_ID,
M_WV_SAFE_HOOK_VENDOR_ID,
M_WV_SAFE_HOOK_COMPAT_ID,
M_WV_SAFE_HOOK_DEVICE_TEXT_DESC,
FILE_DEVICE_CONTROLLER,
FILE_DEVICE_SECURE_OPEN
);
SIZE_T dummy_ids_sz;
UCHAR * ptr;
WV_S_DUMMY_IDS * dummy_ids;
WCHAR * dest;
Expand All @@ -401,15 +420,17 @@ static WV_S_DUMMY_IDS * WvSafeHookDummyIds(
/* Generate the safe hook vendor string */
WvSafeHookVendorString(&wide_vendor, vendor);

/* The struct type on the next line was generated by the macro above */
dummy_ids_sz = sizeof (struct safe_hook_dummy_idsStruct_);
ptr = wv_malloc(dummy_ids_sz);
ptr = wv_malloc(CvWvSafeHookDummyIdsSize);
if (!ptr)
goto err_dummy_ids;

/* Populate with defaults */
dummy_ids = (VOID *) ptr;
RtlCopyMemory(dummy_ids, safe_hook_dummy_ids, dummy_ids_sz);
RtlCopyMemory(
dummy_ids,
WvSafeHookDefaultDummyIds,
CvWvSafeHookDummyIdsSize
);

/* Generate the specific details */
ptr += dummy_ids->Offset;
Expand Down

0 comments on commit 623e8ef

Please sign in to comment.