Dump2Wave v1.2.1 source code
Since the first release of Dump2Wave I was under pressure to publish its source code and today I released it under GPL. I have to apologize that it doesn’t always use secure string manipulation functions, error handling is copy/pasted several times and there are no comments. I promise better code in the next version. ![]()
If you plan to make changes and improvements please let me know so I could enjoy your versions of memory sounds too. I used ancient Visual C++ 6.0 to compile and build the project.
// Dump2Wave version 1.2.1 (c) Dmitry Vostokov
// GNU GENERAL PUBLIC LICENSE
// http://www.gnu.org/licenses/gpl-3.0.txt
#include <iostream>
#include <process.h>
#include <windows.h>
#pragma pack(1)
typedef struct {
unsigned int riff; // 'RIFF'
unsigned int length; // dump size + sizeof(WAVEFILEHDR) - 8
unsigned int wave; // 'WAVE'
unsigned int fmt; // 'fmt '
unsigned int fmtlen; // 16
unsigned short code; // 1
unsigned short channels; // 2
unsigned int sps; // 44100
unsigned int avgbps; // sps*channels*(sbits/8)
unsigned short alignment; // 4
unsigned short sbits; // 16
unsigned int data; // 'data'
unsigned int datalen;
} WAVEFILEHDR;
#pragma pack()
WAVEFILEHDR hdr = {'FFIR', sizeof(WAVEFILEHDR) - 8, 'EVAW',
' tmf', 16, 1, 2, 44100, 44100*4, 4, 16, 'atad', 0};
void DisplayError (LPCSTR szPrefix)
{
LPSTR errMsg;
CHAR szMsg[256];
strncpy(szMsg, szPrefix, 128);
DWORD gle = GetLastError();
if (gle && FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|
FORMAT_MESSAGE_FROM_SYSTEM, NULL, gle, 0,
(LPSTR)&errMsg, 0, NULL))
{
strcat(szMsg, ": ");
strncat(szMsg, errMsg, 120);
}
std::cout << szMsg << std::endl;
LocalFree(errMsg);
}
int main(int argc, char* argv[])
{
std::cout << std::endl << "Dump2Wave version 1.2.1" <<
std::endl << "Written by Dmitry Vostokov, 2006" <<
std::endl << std::endl;
if (argc < 3)
{
std::cout << "Usage: Dump2Wave dumpfile wavefile [44100|22050|11025|8000 16|8 2|1]" << std::endl;
return -1;
}
HANDLE hFile = CreateFile(argv[1],
GENERIC_READ, FILE_SHARE_READ, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
DisplayError("Cannot read dump file");
return -1;
}
DWORD dwDumpSizeHigh = 0;
DWORD dwDumpSizeLow = GetFileSize(hFile, &dwDumpSizeHigh);
CloseHandle(hFile);
if (dwDumpSizeHigh)
{
std::cout << "The dump file must be less than 4Gb" <<
std::endl;
return -1;
}
if (argc == 6)
{
hdr.channels = atoi(argv[5]);
hdr.sps = atoi(argv[3]);
hdr.sbits = atoi(argv[4]);
hdr.avgbps = hdr.sps*hdr.channels*(hdr.sbits/8);
hdr.alignment = hdr.channels*(hdr.sbits/8);
}
dwDumpSizeLow = (dwDumpSizeLow/hdr.alignment)*(hdr.alignment);
hdr.length += dwDumpSizeLow;
hdr.datalen = dwDumpSizeLow;
hFile = CreateFile(argv[2], GENERIC_WRITE, 0,
NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
DisplayError("Cannot create wave header file");
return -1;
}
DWORD dwWritten;
if (!WriteFile(hFile, &hdr, sizeof(hdr), &dwWritten, NULL))
{
DisplayError("Cannot write wave header file");
CloseHandle(hFile);
return -1;
}
CloseHandle(hFile);
std::string str = "copy \"";
str += argv[2];
str += "\" /B + \"";
str += argv[1];
str += "\" /B \"";
str += argv[2];
str += "\" /B";
system(str.c_str());
return 0;
}
- Dmitry Vostokov @ DumpAnalysis.org -