#include #include #include #include "pe_var.h" #define __stdcall __attribute__((__stdcall__)) __stdcall void NdisInitializeWrapper(arg1, arg2, arg3, arg4) void *arg1; void *arg2; void *arg3; void *arg4; { printf ("NdisInitializeWrapper() called...\n"); printf ("arg1: %p\n", arg1); printf ("arg2: %p\n", arg2); printf ("arg3: %p\n", arg3); printf ("arg4: %p\n", arg4); return; } __stdcall int NdisMRegisterMiniport(ndis_handle, characteristics, len) void *ndis_handle; void *characteristics; int len; { printf ("NdisMRegisterMiniport called...\n"); return(0); } __stdcall void dummy() { printf ("dummy called...\n"); } image_patch_table ndis_functbl[] = { { "NdisInitializeWrapper", (void(*)())NdisInitializeWrapper }, { "NdisMRegisterMiniport", (void(*)())NdisMRegisterMiniport }, { "NdisFreeBufferPool", (void(*)())dummy }, { "NdisFreePacketPool", (void(*)())dummy }, { "NdisMFreeMapRegisters", (void(*)())dummy }, { "NdisMUnmapIoSpace", (void(*)())dummy }, { "NdisMDeregisterIoPortRange", (void(*)())dummy }, { "NdisMFreeSharedMemory", (void(*)())dummy }, { "NdisFreeMemory", (void(*)())dummy }, { "NdisFreePacket", (void(*)())dummy }, { "NdisFreeBuffer", (void(*)())dummy }, { "NdisReleaseSpinLock", (void(*)())dummy }, { "NdisAcquireSpinLock", (void(*)())dummy }, { "NdisAllocateMemoryWithTag", (void(*)())dummy }, { "NdisMRegisterAdapterShutdownHandler", (void(*)())dummy }, { "NdisMDeregisterAdapterShutdownHandler", (void(*)())dummy }, { "NdisMRegisterInterrupt", (void(*)())dummy }, { "NdisMDeregisterInterrupt", (void(*)())dummy }, { "NdisMAllocateMapRegisters", (void(*)())dummy }, { "NdisAllocateSpinLock", (void(*)())dummy }, { "NdisCloseConfiguration", (void(*)())dummy }, { "NdisReadConfiguration", (void(*)())dummy }, { "NdisOpenConfiguration", (void(*)())dummy }, { "NdisMSetAttributesEx", (void(*)())dummy }, { "NdisFreeSpinLock", (void(*)())dummy }, { "NdisReadPciSlotInformation", (void(*)())dummy }, { "NdisWritePciSlotInformation", (void(*)())dummy }, { "NdisMRegisterIoPortRange", (void(*)())dummy }, { "NdisMAllocateSharedMemory", (void(*)())dummy }, { "NdisAllocateBuffer", (void(*)())dummy }, { "NdisAllocatePacket", (void(*)())dummy }, { "NdisAllocateBufferPool", (void(*)())dummy }, { "NdisAllocatePacketPool", (void(*)())dummy }, { "NdisAdjustBufferLength", (void(*)())dummy }, { "NdisUnchainBufferAtFront", (void(*)())dummy }, { "NdisQueryBuffer", (void(*)())dummy }, { "NdisMStartBufferPhysicalMapping", (void(*)())dummy }, { "NDIS_BUFFER_TO_SPAN_PAGES", (void(*)())dummy }, { "NdisQueryBufferOffset", (void(*)())dummy }, { "NdisMCompleteBufferPhysicalMapping", (void(*)())dummy }, { "NdisReadNetworkAddress", (void(*)())dummy }, { "NdisMQueryAdapterResources", (void(*)())dummy }, { NULL, NULL }, }; int moo; main() { FILE *fp; void *img; int n, fsize, status; __stdcall int (*foo)(); image_optional_header opt_hdr; /* Open the .SYS file and load it into memory */ fp = fopen("mn120-50.sys", "r"); fseek (fp, 0L, SEEK_END); fsize = ftell (fp); rewind (fp); img = calloc(fsize, 1); n = fread (img, fsize, 1, fp); /* Perform text relocation */ pe_relocate((vm_offset_t)img); /* Fix up the import jump table */ if (pe_patch_imports((vm_offset_t)img, "NDIS", ndis_functbl)) { printf ("patching imported symbols failed\n"); fclose(fp); free(img); exit(1); } /* Call the driver entry point */ pe_get_optional_header((vm_offset_t)img, &opt_hdr); foo = img + opt_hdr.ioh_entryaddr; status = foo(&moo, &moo); printf ("status: %d\n", status); free(img); fclose(fp); }