put it on hold til your life gets less busy, prioritize things 

//From ppjoy "http://ppjoy.bossstation.dnsalias.org/Docs/Diagrams/Virtual/IOCTL.htm"
#pragma pack(push,1) /* All fields in structure must be byte aligned. */
struct VirtualControllerState
{
unsigned long Signature; /* Signature to identify packet to PPJoy IOCTL */
char NumAnalog; /* Num of analog values we pass */
long Analog[VIRTCTRL_NUM_ANALOG]; /* Analog values */
char NumDigital; /* Num of digital values we pass */
char Digital[VIRTCTRL_NUM_DIGITAL]; /* Digital values */
};
#pragma pack(pop)
#include <windows.h>
#include <winioctl.h>
#include "PPJIOCTL.h"
VirtualControllerState ctrlState;
HANDLE ctrlHandle;
//Initialization Stuff
ctrlHandle = CreateFile(L"\\\\.\\PPJoyIOCTL1", GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
if (INVALID_HANDLE_VALUE == ctrlHandle)
{
printf("Init() Failed to create controller with code; %d\n", GetLastError());
return false;
}
memset(&ctrlState, 0, sizeof(VirtualControllerState));
ctrlState.NumAnalog = VIRTCTRL_NUM_ANALOG;
ctrlState.NumDigital = VIRTCTRL_NUM_DIGITAL;
ctrlState.Signature = JOYSTICK_STATE_V1;
//Updating things -
ctrlState.Digital[ulButtonID] = ButtonPos;
ctrlState.Analog[ulAxisID] = lAxisPos;
DWORD retSize = 0;
if (!DeviceIoControl(ctrlHandle, IOCTL_PPORTJOY_SET_STATE, &ctrlState, sizeof(VirtualControllerState), NULL, 0, &retSize, NULL))
{
//Device is disconnected if GetLastError() == 2;
}
//Clean-up
if (NULL != ctrlHandle)
CloseHandle(ctrlHandle);
main
{
//Initialize Here
while (!quitCondition)
{
//Update the status of your virtual controller.
Sleep(16); //Don't waste _all_ cpu cycles. (unless desired?)
}
//Perform clean-up here
}