|
>ご存知かとは思いますが、K7の倍率は不規則に並んでいるのではなく、倍率テーブルをそのままの順番で表示しております。
>
>この部分を変更してしまうと、コマンドラインオプションの FID, VID 部分も相当見直さなければならないためご了承ください。
>
>ちなみに、C3 は複数の FID が同じ倍率に割り振られていたり、リビジョンによって FID と倍率のマッピングが変わっていたりします。
返答ありがとうございます。上記ご指摘の内容すべて承知しております。
倍率変更の順不同は実際非常に不便なので、自分で直して使ってましたが
バージョン変更の度に作りなすのも手間なので、
手直した古いバージョンを 暫く使っておりました。
本家の作者の方に対応頂ければと思い お願いして見た次第です。
また暫くは、自前で手直した古いバージョンで行かせてもらいます。
---
話は変わりますが、ドライバロード部分で以下の様なコーディングすると、
同一実行ファイル(32Bit版)のみで32/64Bitの両環境での動作ができます。
(SysInfoX64.sys/SysInfoX.sysを環境に応じて切り替えるだけです。
厳密には SysInfoX64.sysコーディングの際 ポインタサイズに十分注意する
必要があると思いますが、試した限りは大丈夫のようです。)
----
横文字数の制限で、改行表示されているかも知れません。
"Pcidll.c"
#include <stdio.h>
#include <windows.h>
#include <winioctl.h>
#include <stddef.h>
#include <assert.h>
#include "Pcidebug.h"
#include "driverload.h"
int GetFileInternalName(const char *file,char *name);
#include "resource.h"
int initialize(HMODULE ghInst);
int initialize_vxd(HMODULE ghInst);
void close(void);
extern void init_isr(void);
char DRIVERID[MAX_PATH]; // "CrystalSysInfo"
char DRIVERFILENAME[MAX_PATH]; // "SysInfo.sys" or SysInfoX64.sys
char DRIVERNAME[MAX_PATH]; // "CrystalSysInfo"
#define DRIVERFILENAME95 "SysInfo.vxd"
HANDLE handle = NULL;
int drivertype = 0;
// DLLの状態を保存する変数
static DLLSTATUS status = DLLSTATUS_OTHERERROR;
//char DRIVERID[MAX_PATH];
//
// OSの種類を調べる。
//
// 戻り値 0: 取得できなかった
// 1: windows 3.1
// 2: windows 95
// 3: windows NT
// 4: windows NT x64
// -1:その他
typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE hProcess,PBOOL Wow64Process);
BOOL IsWow64(VOID)
{
BOOL bIsWow64 = FALSE;
LPFN_ISWOW64PROCESS fnIsWow64Process = (LPFN_ISWOW64PROCESS)GetProcAddress(GetModuleHandle("kernel32"),"IsWow64Process");
if (NULL != fnIsWow64Process)
{
if (!fnIsWow64Process(GetCurrentProcess(),&bIsWow64))
{
// handle error
bIsWow64 = FALSE;
}
}
return bIsWow64;
}
//--------------------------
int oscheck()
{
OSVERSIONINFO os;
os.dwOSVersionInfoSize = sizeof(os);
if(GetVersionEx(&os) == 0){
assert(0);
return 0;
}
switch(os.dwPlatformId){
case VER_PLATFORM_WIN32s:
return 1;
case VER_PLATFORM_WIN32_WINDOWS:
return 2;
case VER_PLATFORM_WIN32_NT:
return IsWow64() ? 4 : 3; // Windowx XP 64Bit Edition or Windows NT
default:
return -1;
}
}
///////////////////////////////////////////////////////////
//
// DLLがLOADされたときにデバイスドライバーを登録、開始する
// DLLがUNLOADされたときにデバイスドライバーを停止取り外す
//
///////////////////////////////////////////////////////////
BOOL APIENTRY DllMain(HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved)
{
char str[MAX_PATH];
char name[64];
int ostype, res;
drivertype = 0;
ostype = oscheck();
if(!(ostype >= 2 && ostype <= 4)) return TRUE;
GetModuleFileName(NULL,str,MAX_PATH);
GetFileInternalName(str,name);
switch(ostype)
{
case 4:// NT x64
case 3:// NT
strcpy(DRIVERID,"CrystalSysInfo");
strcpy(DRIVERFILENAME, (ostype==4) ? "SysInfoX64.sys" : "SysInfo.sys");
strcpy(DRIVERNAME,"\\\\.\\CrystalSysInfo");
drivertype |= SYS_DRIVER_USE;
status = DLLSTATUS_NOERROR;
break;
case 2:// 95 98の場合
drivertype |= VXD_DRIVER_USE;
drivertype |= PCIBIOS_READY;
drivertype |= LIB_IO_FUNC_USE;
status = DLLSTATUS_NOERROR;
break;
default:// NT 95/98以外の場合
status = DLLSTATUS_NOTSUPPORTEDPLATFORM;
break;
}
if(status == DLLSTATUS_NOTSUPPORTEDPLATFORM) return TRUE;
switch( ul_reason_for_call ) {
case DLL_PROCESS_ATTACH:
init_isr();
if(drivertype & SYS_DRIVER_USE) {
res = initialize(hModule);
} else if(drivertype & VXD_DRIVER_USE) {
res = initialize_vxd(hModule);
} else {
res = 3;
}
switch ( res ){
case 0:
status = DLLSTATUS_NOERROR;
break;
case 2:
handle = NULL;
status = DLLSTATUS_DRIVERNOTLOADED;
break;
default:
handle = NULL;
status = DLLSTATUS_OTHERERROR;
break;
}
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
close();
status = DLLSTATUS_OTHERERROR;
break;
}
return TRUE;
}
以下同一内容なので、略
|
|