📄 dlgmain.cpp
字号:
MAKEFILE_FNAME, NULL);
FMessageBox(hWnd, MB_ICONERROR, _T("WDMbuild"),
_T("创建 \"%s\" 文件失败:%s"), caFileName, caBuffer);
return FALSE;
}
if ( !CreateSourcesFile(g_Sys.Option.caDriverName,
g_Sys.Option.caSourcePath) ){
GetErrorMessage(caBuffer, MAX_STRING, GetLastError());
MakeFileName(caFileName, g_Sys.Option.caSourcePath,
SOURCES_FNAME, NULL);
FMessageBox(hWnd, MB_ICONERROR, _T("WDMbuild"),
_T("创建 \"%s\" 文件失败:%s"), caFileName, caBuffer);
return FALSE;
}
if ( !CallDDK(lpVersion) ){
GetErrorMessage(caBuffer, MAX_STRING, GetLastError());
FMessageBox(hWnd, MB_ICONERROR, _T("WDMbuild"),
_T("调用 DDK 构造驱动程序失败:%s"), caBuffer);
return FALSE;
}
if ( !GetDDKResult(&bErrOccur, caBuffer,lpVersion) ){
GetErrorMessage(caBuffer, MAX_STRING, GetLastError());
FMessageBox(hWnd, MB_ICONERROR, _T("WDMbuild"),
_T("读取 DDK 编译结果失败: %s"), caBuffer);
return FALSE;
}
else if ( bErrOccur ){
FMessageBox(hWnd, MB_ICONERROR, _T("WDMbuild"),
_T("构造驱动程序失败:\n\n%s\n"), caBuffer);
return FALSE;
}
if ( !CopyDrivers(lpVersion) ){
GetErrorMessage(caBuffer, MAX_STRING, GetLastError());
FMessageBox(hWnd, MB_ICONERROR, _T("WDMbuild"),
_T("拷贝 %s.sys 文件到 %s 目录失败: %s"),
g_Sys.Option.caDriverName, g_Sys.Option.caCopyToPath,
caBuffer);
return FALSE;
}
return TRUE;
}
BOOL CreateMakefileFile(LPCTSTR lpDestPath)
{ TCHAR caFileName[_MAX_PATH];
MakeFileName(caFileName, lpDestPath, MAKEFILE_FNAME, NULL);
return WriteResourceToFile(caFileName,
g_Sys.hModule,
LPTSTR(IDR_MAKEFILE),
_T("FILE"));
}
BOOL CreateSourcesFile(LPCTSTR lpDriverName, LPCTSTR lpDestPath)
{ TCHAR caPart1[_MAX_PATH] = _T("TARGETNAME=");
TCHAR caPart2[ ] = _T("TARGETTYPE=DRIVER\r\n"
"TARGETPATH=OBJ\r\n"
"\r\n"
"INCLUDES=$(BASEDIR)\\inc\r\n"
"\r\n");
TCHAR caPart3[MAX_STRING] = _T("SOURCES=");
TCHAR caPart4[MAX_STRING] = _T("i386_SOURCES=");
LPCTSTR saCFile[] = {_T("*.c" ), _T("*.cpp"), _T("*.rc"), NULL};
LPCTSTR saAsmFile[] = {_T("*.asm"), NULL};
LPCTSTR saIncFile[] = {_T("*.inc"), NULL};
LPTSTR lpPlace = NULL;
TCHAR caFName[_MAX_PATH];
TCHAR caSubDir[_MAX_PATH];
HANDLE hFile = NULL;
INT iStrLen = 0L;
DWORD dwWritten = 0L;
INT i = 0;
/////////////Create i386 directory/////////////////////////////////////////
wsprintf(caSubDir, _T("%s\\i386"), lpDestPath);
if ( (!DirectoryExist(caSubDir))&&(!CreateDirectory(caSubDir, NULL)) ){
return FALSE;
}
/////////////Copy *.asm files to i386 directory////////////////////////////
for (i = 0; NULL != saAsmFile[i]; i++){
wsprintf(caFName, _T("%s\\%s"), lpDestPath, saAsmFile[i]);
if ( FileExist(caFName)&&(!CopyFilesTo(caFName, caSubDir, FALSE)) ){
return FALSE;
}
}
/////////////Copy *.inc files to i386 directory////////////////////////////
for (i = 0; NULL != saIncFile[i]; i++){
wsprintf(caFName, _T("%s\\%s"), lpDestPath, saIncFile[i]);
if ( FileExist(caFName)&&(!CopyFilesTo(caFName, caSubDir, FALSE)) ){
return FALSE;
}
}
////////////Make 'TARGETNAME' section//////////////////////////////////////
lstrcat(caPart1, lpDriverName);
lstrcat(caPart1, _T("\r\n"));
////////////Make 'SOURCES' section////////////////////////////////////////
for (i = 0; NULL != saCFile[i]; i++){
wsprintf(caFName, _T("%s\\%s"), lpDestPath, saCFile[i]);
iStrLen = lstrlen(caPart3);
GetFilesName(
caPart3 + iStrLen,
MAX_STRING - iStrLen,
caFName,
NULL,
_T("\\\r\n "),
NULL);
}
lpPlace = _tcsrchr(caPart3, '\\');
if ( NULL != lpPlace ){
*lpPlace = '\r';
*(lpPlace+1) = '\n';
*(lpPlace+2) = '\0';
}
////////////Make 'i386_SOURCES' section////////////////////////////////////
for (i = 0; NULL != saAsmFile[i]; i++){
wsprintf(caFName, _T("%s\\%s"), lpDestPath, saAsmFile[i]);
iStrLen = lstrlen(caPart4);
GetFilesName(
caPart4 + iStrLen,
MAX_STRING - iStrLen,
caFName,
NULL,
_T("\\\r\n "),
NULL);
}
lpPlace = _tcsrchr(caPart4, '\\');
if ( NULL != lpPlace ){
*lpPlace = '\0';
}
////////////Create 'SOURCES' file//////////////////////////////////////////
wsprintf(caFName, _T("%s\\%s"), lpDestPath, SOURCES_FNAME);
hFile = CreateFile(
caFName,
GENERIC_WRITE,
0,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_WRITE_THROUGH,
NULL);
if (INVALID_HANDLE_VALUE == hFile){
return FALSE;
}
if ( WriteFile(hFile, caPart1, lstrlen(caPart1), &dwWritten, NULL) &&
WriteFile(hFile, caPart2, lstrlen(caPart2), &dwWritten, NULL) &&
WriteFile(hFile, caPart3, lstrlen(caPart3), &dwWritten, NULL) &&
WriteFile(hFile, caPart4, lstrlen(caPart4), &dwWritten, NULL) ){
return CloseHandle(hFile);
}
CloseHandle(hFile);
return FALSE;
}
BOOL CallDDK(LPCTSTR lpVersion)
{ LPCTSTR lpChecked = _T("checked");
LPCTSTR lpFree = _T("free");
TCHAR caFileName[_MAX_PATH];
TCHAR caCmdLine[_MAX_PATH];
STARTUPINFO SI = {0};
PROCESS_INFORMATION PI = {0};
if ( (lstrcmpi(lpChecked, lpVersion) != 0) &&
(lstrcmpi(lpFree, lpVersion) != 0) ){
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
MakeFileName(caFileName, g_Sys.caPath, CALLDDK_FNAME, NULL);
wsprintf(
caCmdLine,
_T("%s %s %s %s"),
caFileName,
g_Sys.Option.caDDKPath,
lpVersion,
g_Sys.Option.caSourcePath);
if ( CreateProcess(NULL, caCmdLine, NULL, NULL, FALSE, CREATE_NO_WINDOW,
NULL, g_Sys.caPath, &SI, &PI) ){
CloseHandle(PI.hThread);
if (WaitForSingleObject(PI.hProcess, TIMEOUT_ELAPSE) == WAIT_TIMEOUT){
return FALSE;
}
CloseHandle(PI.hProcess);
return TRUE;
}
return FALSE;
}
BOOL GetDDKResult(BOOL *pbErrOccur, VOID *pvErrMsg, LPCTSTR lpVersion)
{ LPCTSTR lpChecked = _T("checked");
LPCTSTR lpFree = _T("free");
LPCTSTR lpErrFileName = NULL;
TCHAR caFileName[_MAX_PATH];
HANDLE hFile = NULL;
DWORD dwSize = 0L;
DWORD dwReaded = 0L;
lpErrFileName = (lstrcmp(lpChecked, lpVersion) == 0) ? CHK_ERR_FNAME :
(lstrcmp(lpFree, lpVersion) == 0) ? FRE_ERR_FNAME :
NULL;
if ( NULL == lpErrFileName ){
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
MakeFileName(caFileName, g_Sys.Option.caSourcePath, lpErrFileName, NULL);
if ( FileExist(caFileName) ){
*pbErrOccur = TRUE;
if ( NULL != pvErrMsg ){
hFile = CreateFile(
caFileName,
GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
if ( INVALID_HANDLE_VALUE == hFile ){
return FALSE;
}
dwSize = GetFileSize(hFile, NULL);
if ( !ReadFile(hFile, pvErrMsg, dwSize, &dwReaded, NULL) ){
CloseHandle(hFile);
return FALSE;
}
*(LPTSTR(pvErrMsg) + dwSize) = '\0';
CloseHandle(hFile);
return TRUE;
}
}
*pbErrOccur = FALSE;
return TRUE;
}
BOOL CopyDrivers(LPCTSTR lpVersion)
{ TCHAR caObjPath[_MAX_PATH];
TCHAR caObjFile[_MAX_PATH];
TCHAR caDstFile[_MAX_PATH];
if (lstrcmp(_T("checked"), lpVersion) == 0){
MakeFileName(caObjPath, g_Sys.Option.caSourcePath,
_T("objchk\\i386"), NULL);
}
else if (lstrcmp(_T("free"), lpVersion) == 0){
MakeFileName(caObjPath, g_Sys.Option.caSourcePath,
_T("objfre\\i386"), NULL);
}
else{
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
MakeFileName(caObjFile, caObjPath, g_Sys.Option.caDriverName, _T(".sys"));
MakeFileName(caDstFile, g_Sys.Option.caCopyToPath,
g_Sys.Option.caDriverName, _T(".sys"));
return CopyFile(caObjFile, caDstFile, FALSE);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -