- #include "windows.h"
- #include "stdafx.h"
- #include "math.h"
- DWORD dwCount;
- HANDLE fHnd;
- static HANDLE fHnd_Write;
- static HANDLE fHnd_Read;
- typedef DWORD (CALLBACK* LPFNDLL_WAVInit) ( LPCTSTR pContext, LPCVOID lpvBusContext);
- typedef DWORD (CALLBACK* LPFNDLL_WAV_Init)(LPCTSTR pContext, LPCVOID lpvBusContext);
- typedef BOOL (CALLBACK* LPFNDLL_WAV_Deinit)( DWORD hDeviceContext );
- typedef DWORD (CALLBACK* LPFNDLL_WAV_Open)( DWORD hDeviceContext, DWORD AccessCode, DWORD ShareMode );
- typedef BOOL (CALLBACK* LPFNDLL_WAV_Close)( DWORD hOpenContext );
- typedef BOOL (CALLBACK* LPFNDLL_WAV_IOControl)( DWORD hOpenContext, DWORD dwCode, PBYTE pBufIn,
- DWORD dwLenIn, PBYTE pBufOut, DWORD dwLenOut, PDWORD pdwActualOut );
- typedef void (CALLBACK* LPFNDLL_WAV_PowerUp)( DWORD hDeviceContext );
- typedef void (CALLBACK* LPFNDLL_WAV_PowerDown)( DWORD hDeviceContext );
- typedef DWORD (CALLBACK* LPFNDLL_WAV_Read)( DWORD hOpenContext, LPVOID pBuffer, DWORD Count );
- typedef DWORD (CALLBACK* LPFNDLL_WAV_Write)( DWORD hOpenContext, LPCVOID pBuffer, DWORD Count );
- typedef DWORD (CALLBACK* LPFNDLL_WAV_Seek)( DWORD hOpenContext, long Amount, WORD Type );
- HANDLE hActualDriver = NULL;
- LPFNDLL_WAV_Init fptr_init;
- LPFNDLL_WAV_Deinit fptr_deinit;
- LPFNDLL_WAV_Open fptr_open;
- LPFNDLL_WAV_Close fptr_close;
- LPFNDLL_WAV_IOControl fptr_iocontrol;
- FILE* f;
- typedef struct {
- unsigned int uDeviceId;
- unsigned int uMsg;
- unsigned int dwUser;
- unsigned int dwParam1;
- unsigned int dwParam2;
- } MMMDRV_MESSAGE_PARAMS;
- typedef struct {
- char* lpData;
- unsigned int dwBufferLength;
- unsigned int dwBytesRecorded;
- unsigned int dwUser;
- unsigned int dwFlags;
- unsigned int dwLoops;
- void* lpNext;
- unsigned int reserved;
- } MWAVEHDR;
- typedef struct {
- unsigned int hWave;
- void* lpFormat;
- void* dwCallback;
- unsigned int dwInstance;
- unsigned int uMappedDeviceID;
- } MWAVEOPENDESC;
- typedef struct {
- unsigned short wFormatTag;
- unsigned short nChannels;
- unsigned int nSamplesPerSec;
- unsigned int nAvgBytesPerSec;
- unsigned short nBlockAlign;
- unsigned short wBitsPerSample;
- unsigned short cbSize;
- }MWAVEFORMATEX;
- void* WAV_Init(char* key, unsigned int otherthing)
- {
- return (void*)fptr_init((LPCTSTR)key,(LPCVOID)otherthing);
- }
- void* WAV_Open(void* handle, unsigned int access, unsigned int mode)
- {
- return (void*)fptr_open((DWORD)handle,(DWORD)access,(DWORD)mode);
- }
- void* WAV_IOControl(void* handle, unsigned int code, void *pdata, unsigned int datasize, void* pout, unsigned int outsz, unsigned int*poutsz)
- {
- return (void*)fptr_iocontrol((DWORD)handle,(DWORD)code,(PBYTE)pdata,(DWORD)datasize,(PBYTE)pout,(DWORD)outsz,(PDWORD)poutsz);
- }
- unsigned int WODM_Open(void* handle, unsigned int hWave, void *lpFormat,void*dwCallback,unsigned int dwInstance, unsigned int uMappedDeviceID)
- {
- unsigned int deviceinstance=0;
- MWAVEOPENDESC open;
- open.hWave=hWave;
- open.lpFormat=lpFormat;
- open.dwCallback=dwCallback;
- open.dwInstance=dwInstance;
- open.uMappedDeviceID=uMappedDeviceID;
- MMMDRV_MESSAGE_PARAMS parms;
- parms.dwUser = (unsigned int)&deviceinstance;
- parms.uMsg = 0x5;
- parms.dwParam1 = (unsigned int)&open;
- parms.dwParam2 = 0x00030000;
- unsigned int bytes;
- unsigned int result;
- WAV_IOControl(handle,0x001d000c,&parms,sizeof(MMMDRV_MESSAGE_PARAMS),&bytes,0x04,&result);
- return deviceinstance;
- }
- void opencallback()
- {
- fprintf(f,"WODM_OPEN: Callback\n");
- }
- int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nShowCmd )
- {
- HINSTANCE jh = NULL;
- f = fopen("wav.log","w+");
- fprintf(f,"Init: \n");
- hActualDriver = LoadLibrary(_T("wavedev.dlo"));//(HANDLE)
- GetModuleHandle(_T("wavedev.dlo"));
- fptr_init = (LPFNDLL_WAV_Init)GetProcAddress((HMODULE)hActualDriver, _T("WAV_Init"));
- fptr_deinit = (LPFNDLL_WAV_Deinit)GetProcAddress((HMODULE)hActualDriver, _T("WAV_DeInit"));
- fptr_open = (LPFNDLL_WAV_Open)GetProcAddress((HMODULE)hActualDriver, _T("WAV_Open"));
- fptr_close = (LPFNDLL_WAV_Close)GetProcAddress((HMODULE)hActualDriver, _T("WAV_Close"));
- fptr_iocontrol = (LPFNDLL_WAV_IOControl)GetProcAddress((HMODULE)hActualDriver, _T("WAV_IOControl"));
- void* whandle = WAV_Init("someregistrykey",0);
- fprintf(f,"WAV handle: %x\n", whandle);
- void* dhandle = WAV_Open(whandle,0,3);
- fprintf(f,"Device handle: %x\n", dhandle);
- MWAVEHDR wavehdr;
- wavehdr.lpData = (char*)malloc(6138*64);
- wavehdr.dwBufferLength = 6138*64;
- wavehdr.dwBytesRecorded = 0;
- wavehdr.dwLoops = 0;
- wavehdr.dwFlags = 0;
- wavehdr.lpNext = 0;
- wavehdr.reserved = 0;
- MMMDRV_MESSAGE_PARAMS parms;
- unsigned int result;
- unsigned int bytes[0x30];
- WAV_IOControl(dhandle,0x00321000,0,0,bytes,0x30,&result); //??
- //Open
- //Close
- parms.dwUser = 0;
- parms.uMsg = 0x32;
- parms.dwParam2 = 0;
- parms.dwParam1 = 0;
- WAV_IOControl(dhandle,0x001d000c,&parms,sizeof(MMMDRV_MESSAGE_PARAMS),bytes,0x04,&result); //??
- parms.dwUser = 0;
- parms.uMsg = 0x3;
- parms.dwParam2 = 0;
- parms.dwParam1 = 0;
- WAV_IOControl(dhandle,0x001d000c,&parms,sizeof(MMMDRV_MESSAGE_PARAMS),bytes,0x04,&result); //??
- //0x16
- //0x16
- fptr_close((DWORD)dhandle);
- dhandle = WAV_Open(whandle,0xc0000000,3);
- fptr_close((DWORD)dhandle);
- dhandle = WAV_Open(whandle,0,3);
- MWAVEFORMATEX format;
- format.wFormatTag=1;
- format.nChannels=1;
- format.nSamplesPerSec=0x2B11;
- format.nAvgBytesPerSec=0x5622;
- format.nBlockAlign=2;
- format.wBitsPerSample=0x10;
- format.cbSize=0;
- result = 0x50;
- unsigned int dinstance = WODM_Open(dhandle,(unsigned int)&result,&format, (void*)opencallback, 0x00000000, 0x00000000);
- parms.dwUser = dinstance;
- parms.uDeviceId = 0; //1?
- parms.uMsg = 17;//set volume
- parms.dwParam2 = 0;
- parms.dwParam1 = 5;
- WAV_IOControl(dhandle,0x001d000c,&parms,sizeof(MMMDRV_MESSAGE_PARAMS),&result,4,0);
- short* sound = (short*)wavehdr.lpData;
- unsigned int sidx=0;
- for(sidx=0; sidx<6138*64/2; sidx++)
- {
- //sound[sidx] = (short)((sidx%12>6)?4000:-4000);
- }
- parms.uMsg = 7; //WODM_PREPARE
- parms.dwParam2 = sizeof(WAVEHDR);
- parms.dwParam1 = (unsigned int)&wavehdr;
- WAV_IOControl(dhandle,0x001d000c,&parms,sizeof(MMMDRV_MESSAGE_PARAMS),&result,4,0);
- parms.uMsg = 9; //WODM_WRITE
- wavehdr.dwFlags = 2;
- WAV_IOControl(dhandle,0x001d000c,&parms,sizeof(MMMDRV_MESSAGE_PARAMS),&result,4,0);
- fprintf(f,"Done: \n");
- fclose(f);
- return 0;
- }
