#include <wdm.h>

#include <windef.h>
#include <winerror.h>
#include <wingdi.h>
#include <winddi.h>

#include <ddkmapi.h>

/* Prototypes */
VOID DxGetVersionNumber(PVOID lpvInBuffer, LPDDGETVERSIONNUMBER lpvOutBuffer);
VOID DxCloseHandle(PVOID lpvInBuffer, PVOID lpvOutBuffer);
VOID DxOpenDirectDraw(PVOID lpvInBuffer, PVOID lpvOutBuffer);
VOID DxOpenSurface(PVOID lpvInBuffer, PVOID lpvOutBuffer);
VOID DxOpenVideoPort(PVOID lpvInBuffer, PVOID lpvOutBuffer);
VOID DxGetKernelCaps(PVOID lpvInBuffer, PVOID lpvOutBuffer);
VOID DxGetFieldNumber(PVOID lpvInBuffer, PVOID lpvOutBuffer);
VOID DxSetFieldNumber(PVOID lpvInBuffer, PVOID lpvOutBuffer);
VOID DxSetSkipPattern(PVOID lpvInBuffer, PVOID lpvOutBuffer);
VOID DxGetSurfaceState(PVOID lpvInBuffer, PVOID lpvOutBuffer);
VOID DxSetSurfaceState(PVOID lpvInBuffer, PVOID lpvOutBuffer);
VOID DxLock(PVOID lpvInBuffer, PVOID lpvOutBuffer);
VOID DxFlipOverlay(PVOID lpvInBuffer, PVOID lpvOutBuffer);
VOID DxFlipVideoPort(PVOID lpvInBuffer, PVOID lpvOutBuffer);
VOID DxGetCurrentAutoflip(PVOID lpvInBuffer, PVOID lpvOutBuffer);
VOID DxGetPreviousAutoflip(PVOID lpvInBuffer, PVOID lpvOutBuffer);
VOID DxRegisterEvent(PVOID lpvInBuffer, PVOID lpvOutBuffer);
VOID DxUnregisterEvent(PVOID lpvInBuffer, PVOID lpvOutBuffer);
VOID DxGetPolarity(PVOID lpvInBuffer, PVOID lpvOutBuffer);
VOID DxOpenVpCatureDevice(PVOID lpvInBuffer, PVOID lpvOutBuffer);
VOID DxAddVpCaptureBuffer(PVOID lpvInBuffer, PVOID lpvOutBuffer);
VOID DxFlushVpCaptureBuffs(PVOID lpvInBuffer, PVOID lpvOutBuffer);

/* Internal driver table being use as looking up table for correct size of structs */
DWORD tblCheckInBuffer [] =
{
    /* DD_DXAPI_GETVERSIONNUMBER */
    0,
    /* DD_DXAPI_CLOSEHANDLE */
    sizeof(DDCLOSEHANDLE),
    0, // DD_DXAPI_OPENDIRECTDRAW
    0, // DD_DXAPI_OPENSURFACE
    0, // DD_DXAPI_OPENVIDEOPORT
    /* DD_DXAPI_GETKERNELCAPS */
    sizeof(HANDLE),
    /* DD_DXAPI_GET_VP_FIELD_NUMBER */
    sizeof(DDGETFIELDNUMIN),
    0, // DD_DXAPI_SET_VP_FIELD_NUMBER
    0, // DD_DXAPI_SET_VP_SKIP_FIELD
    0, // DD_DXAPI_GET_SURFACE_STATE
    0, // DD_DXAPI_SET_SURFACE_STATE
    0, // DD_DXAPI_LOCK
    /* DD_DXAPI_FLIP_OVERLAY */
    sizeof(DDFLIPOVERLAY),
    /* DD_DXAPI_FLIP_VP */
    sizeof(DDFLIPVIDEOPORT),
    /* DD_DXAPI_GET_CURRENT_VP_AUTOFLIP_SURFACE */
    sizeof(DDGETAUTOFLIPIN),
    /* DD_DXAPI_GET_LAST_VP_AUTOFLIP_SURFACE */
    sizeof(DDGETAUTOFLIPIN),
    /* DD_DXAPI_REGISTER_CALLBACK */
    sizeof(DDREGISTERCALLBACK),
    /* DD_DXAPI_UNREGISTER_CALLBACK */
    sizeof(DDREGISTERCALLBACK),
    /* DD_DXAPI_GET_POLARITY */
    sizeof(DDGETPOLARITYIN),
    /* DD_DXAPI_OPENVPCAPTUREDEVICE */
    sizeof(DDOPENVPCAPTUREDEVICEIN),
    /* DD_DXAPI_ADDVPCAPTUREBUFFER */
    sizeof(DDADDVPCAPTUREBUFF),
    /* DD_DXAPI_FLUSHVPCAPTUREBUFFERS */
    sizeof(HANDLE)
};

DWORD tblCheckOutBuffer [] =
{
    /* DD_DXAPI_GETVERSIONNUMBER */
    sizeof(DDGETVERSIONNUMBER),
    /* DD_DXAPI_CLOSEHANDLE */
    sizeof(DWORD),
    0, // DD_DXAPI_OPENDIRECTDRAW
    0, // DD_DXAPI_OPENSURFACE
    0, // DD_DXAPI_OPENVIDEOPORT
    /* DD_DXAPI_GETKERNELCAPS */
    sizeof(DDGETKERNELCAPSOUT),
    /* DD_DXAPI_GET_VP_FIELD_NUMBER */
    sizeof(DDGETFIELDNUMOUT),
    0, // DD_DXAPI_SET_VP_FIELD_NUMBER
    0, // DD_DXAPI_SET_VP_SKIP_FIELD
    0, // DD_DXAPI_GET_SURFACE_STATE
    0, // DD_DXAPI_SET_SURFACE_STATE
    0, // DD_DXAPI_LOCK
    /* DD_DXAPI_FLIP_OVERLAY */
    sizeof(DWORD),
    /* DD_DXAPI_FLIP_VP */
    sizeof(DWORD),
    /* DD_DXAPI_GET_CURRENT_VP_AUTOFLIP_SURFACE */
    sizeof(DDGETAUTOFLIPOUT),
    /* DD_DXAPI_GET_LAST_VP_AUTOFLIP_SURFACE */
    sizeof(DDGETAUTOFLIPOUT),
    /* DD_DXAPI_REGISTER_CALLBACK */
    sizeof(DWORD),
    /* DD_DXAPI_UNREGISTER_CALLBACK */
    sizeof(DWORD),
    /* DD_DXAPI_GET_POLARITY */
    sizeof(DDGETPOLARITYOUT),
    /* DD_DXAPI_OPENVPCAPTUREDEVICE */
    sizeof(DDOPENVPCAPTUREDEVICEOUT),
    /* DD_DXAPI_ADDVPCAPTUREBUFFER */
    sizeof(DWORD),
    /* DD_DXAPI_FLUSHVPCAPTUREBUFFERS */
    sizeof(DWORD)
};

/* Internal driver function */
DRVFN gDxApiEntryPoint [] = 
{
    {DD_DXAPI_GETVERSIONNUMBER - DD_FIRST_DXAPI, (PFN) DxGetVersionNumber},
    {DD_DXAPI_CLOSEHANDLE - DD_FIRST_DXAPI, (PFN) DxCloseHandle},
    {DD_DXAPI_OPENDIRECTDRAW - DD_FIRST_DXAPI, (PFN) DxOpenDirectDraw},
    {DD_DXAPI_OPENSURFACE - DD_FIRST_DXAPI, (PFN) DxOpenSurface},
    {DD_DXAPI_OPENVIDEOPORT - DD_FIRST_DXAPI, (PFN) DxOpenVideoPort},
    {DD_DXAPI_GETKERNELCAPS - DD_FIRST_DXAPI, (PFN) DxGetKernelCaps},
    {DD_DXAPI_GET_VP_FIELD_NUMBER - DD_FIRST_DXAPI, (PFN) DxGetFieldNumber},
    {DD_DXAPI_SET_VP_FIELD_NUMBER - DD_FIRST_DXAPI, (PFN) DxSetFieldNumber},
    {DD_DXAPI_SET_VP_SKIP_FIELD - DD_FIRST_DXAPI, (PFN) DxSetSkipPattern},
    {DD_DXAPI_GET_SURFACE_STATE - DD_FIRST_DXAPI, (PFN) DxGetSurfaceState},
    {DD_DXAPI_SET_SURFACE_STATE - DD_FIRST_DXAPI, (PFN) DxSetSurfaceState},
    {DD_DXAPI_LOCK - DD_FIRST_DXAPI, (PFN) DxLock},
    {DD_DXAPI_FLIP_OVERLAY - DD_FIRST_DXAPI, (PFN) DxFlipOverlay},
    {DD_DXAPI_FLIP_VP - DD_FIRST_DXAPI, (PFN) DxFlipVideoPort},
    {DD_DXAPI_GET_CURRENT_VP_AUTOFLIP_SURFACE - DD_FIRST_DXAPI, (PFN) DxGetCurrentAutoflip},
    {DD_DXAPI_GET_LAST_VP_AUTOFLIP_SURFACE - DD_FIRST_DXAPI, (PFN) DxGetPreviousAutoflip},
    {DD_DXAPI_REGISTER_CALLBACK - DD_FIRST_DXAPI, (PFN) DxRegisterEvent},
    {DD_DXAPI_UNREGISTER_CALLBACK - DD_FIRST_DXAPI, (PFN) DxUnregisterEvent},
    {DD_DXAPI_GET_POLARITY - DD_FIRST_DXAPI, (PFN) DxGetPolarity},
    {DD_DXAPI_OPENVPCAPTUREDEVICE - DD_FIRST_DXAPI, (PFN) DxOpenVpCatureDevice},
    {DD_DXAPI_ADDVPCAPTUREBUFFER - DD_FIRST_DXAPI, (PFN) DxAddVpCaptureBuffer},
    {DD_DXAPI_FLUSHVPCAPTUREBUFFERS - DD_FIRST_DXAPI, (PFN) DxFlushVpCaptureBuffs}
};