📄 pciscc.c
字号:
#define STRICT#include <windows.h>#pragma hdrstop#include <winioctl.h>
#include <windowsx.h>
#include <stdio.h>
#include <stdlib.h>
#include "flexdrv.h"#include "drv32.h"#include "pciscc.h"
#include "pciscc_ioctl.h"
#include "resource.h"
#define DriverName "PCISCCNT.SYS"
#define DriverVer "0.2b"
#define ServiceName "PCISCC"
#define DeviceName "\\\\.\\PCISCC"
/* global variables */
pciscc_state state;
pciscc_config config[4];
/* driver callback function list */__declspec(dllexport) u32 flexnet_driver(int func, int chan, int arg1, int arg2){ switch (func) { case drv_interfaceversion: return DRIVER_INTERFACE_VERSION;
case drv_ident:
return (u32)l1_ident((byte)(chan - state.base_chan)); case drv_version:
return (u32)l1_version((byte)(chan - state.base_chan)); case drv_config:
return config_device((byte)(chan), (HWND)arg1, (byte)(arg2 - state.base_chan)); case drv_confinfo:
return (u32)config_info((byte)(chan - state.base_chan));
case drv_init_device:
state.base_chan = chan; return init_device((HKEY)arg2); case drv_get_ch_cnt:
return l1_get_ch_cnt(); case drv_exit:
l1_exit((HKEY)arg1);
break; case drv_ch_active:
return l1_ch_active((byte)(chan - state.base_chan)); case drv_init_kanal:
return l1_init_kanal((byte)(chan - state.base_chan), (u16)arg1, (u16)arg2); case drv_stat:
return (u32)l1_stat((byte)(chan - state.base_chan), (byte)arg1); case drv_ch_state:
return l1_ch_state((byte)(chan - state.base_chan)); case drv_scale:
return config[chan - state.base_chan].scale;
case drv_tx_calib:
l1_tx_calib((byte)(chan - state.base_chan), (byte)arg1);
break; case drv_set_led:
break; case drv_rx_frame:
return (u32)l1_rx_frame();
case drv_get_framebuf:
return (u32)l1_get_framebuf((byte)(chan - state.base_chan));
case drv_tx_frame:
return l1_tx_frame(); case drv_get_txdelay:
return config[chan - state.base_chan].txdelay / 10; case drv_get_mode:
return config[chan - state.base_chan].mode; case drv_get_baud:
return config[chan - state.base_chan].baud / 100; case drv_set_txdelay:
config[chan - state.base_chan].txdelay = arg1 * 10;
break;
default: return 0; }
return 0;}BOOL WINAPI DllMain (HANDLE hModule, DWORD dwFunction, LPVOID lpNot){ switch(dwFunction) { case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH:
state.hInst = hModule;
break; case DLL_PROCESS_DETACH: case DLL_THREAD_DETACH: break; } return 1;}
static BOOL CALLBACK EdParmDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
char buf[32];
int i,idx;
int value;
switch (uMsg)
{
case WM_INITDIALOG:
idx = 0;
for (i = 1200; i <= 1228800; i *= 2)
{
sprintf(buf,"%d",i);
SendMessage(GetDlgItem(hDlg,IDC_BAUDRATE_0),CB_ADDSTRING,0,(LPARAM)buf);
SendMessage(GetDlgItem(hDlg,IDC_BAUDRATE_1),CB_ADDSTRING,0,(LPARAM)buf);
SendMessage(GetDlgItem(hDlg,IDC_BAUDRATE_2),CB_ADDSTRING,0,(LPARAM)buf);
SendMessage(GetDlgItem(hDlg,IDC_BAUDRATE_3),CB_ADDSTRING,0,(LPARAM)buf);
if (config[0].baud == i)
ComboBox_SetCurSel(GetDlgItem(hDlg,IDC_BAUDRATE_0),idx);
if (config[1].baud == i)
ComboBox_SetCurSel(GetDlgItem(hDlg,IDC_BAUDRATE_1),idx);
if (config[2].baud == i)
ComboBox_SetCurSel(GetDlgItem(hDlg,IDC_BAUDRATE_2),idx);
if (config[3].baud == i)
ComboBox_SetCurSel(GetDlgItem(hDlg,IDC_BAUDRATE_3),idx);
idx++;
}
sprintf(buf,"%d",config[0].txdelay);
SetDlgItemText(hDlg,IDC_TXDELAY_0,buf);
sprintf(buf, "%d", config[1].txdelay);
SetDlgItemText(hDlg,IDC_TXDELAY_1,buf);
sprintf(buf,"%d",config[2].txdelay);
SetDlgItemText(hDlg,IDC_TXDELAY_2,buf);
sprintf(buf,"%d",config[3].txdelay);
SetDlgItemText(hDlg,IDC_TXDELAY_3,buf);
CheckDlgButton(hDlg,IDC_DUPLEX_0,config[0].mode & MODE_d ? BST_CHECKED : BST_UNCHECKED);
CheckDlgButton(hDlg,IDC_DUPLEX_1,config[1].mode & MODE_d ? BST_CHECKED : BST_UNCHECKED);
CheckDlgButton(hDlg,IDC_DUPLEX_2,config[2].mode & MODE_d ? BST_CHECKED : BST_UNCHECKED);
CheckDlgButton(hDlg,IDC_DUPLEX_3,config[3].mode & MODE_d ? BST_CHECKED : BST_UNCHECKED);
CheckDlgButton(hDlg,IDC_RXCLOCK_0,config[0].mode & MODE_r ? BST_CHECKED : BST_UNCHECKED);
CheckDlgButton(hDlg,IDC_RXCLOCK_1,config[1].mode & MODE_r ? BST_CHECKED : BST_UNCHECKED);
CheckDlgButton(hDlg,IDC_RXCLOCK_2,config[2].mode & MODE_r ? BST_CHECKED : BST_UNCHECKED);
CheckDlgButton(hDlg,IDC_RXCLOCK_3,config[3].mode & MODE_r ? BST_CHECKED : BST_UNCHECKED);
CheckDlgButton(hDlg,IDC_TXCLOCK_0,config[0].mode & MODE_t ? BST_CHECKED : BST_UNCHECKED);
CheckDlgButton(hDlg,IDC_TXCLOCK_1,config[1].mode & MODE_t ? BST_CHECKED : BST_UNCHECKED);
CheckDlgButton(hDlg,IDC_TXCLOCK_2,config[2].mode & MODE_t ? BST_CHECKED : BST_UNCHECKED);
CheckDlgButton(hDlg,IDC_TXCLOCK_3,config[3].mode & MODE_t ? BST_CHECKED : BST_UNCHECKED);
CheckDlgButton(hDlg,IDC_NRZCODE_0,config[0].mode & MODE_z ? BST_CHECKED : BST_UNCHECKED);
CheckDlgButton(hDlg,IDC_NRZCODE_1,config[1].mode & MODE_z ? BST_CHECKED : BST_UNCHECKED);
CheckDlgButton(hDlg,IDC_NRZCODE_2,config[2].mode & MODE_z ? BST_CHECKED : BST_UNCHECKED);
CheckDlgButton(hDlg,IDC_NRZCODE_3,config[3].mode & MODE_z ? BST_CHECKED : BST_UNCHECKED);
break;
case WM_COMMAND:
switch (GET_WM_COMMAND_ID(wParam, lParam))
{
case IDC_TXD_UP_0:
GetDlgItemText(hDlg,IDC_TXDELAY_0,buf,sizeof(buf));
value = strtol(buf,NULL,0);
if (value < 2550)
value += 10;
sprintf(buf,"%d",value);
SetDlgItemText(hDlg,IDC_TXDELAY_0,buf);
break;
case IDC_TXD_DOWN_0:
GetDlgItemText(hDlg,IDC_TXDELAY_0,buf,sizeof(buf));
value = strtol(buf,NULL,0);
if (value >= 10)
value -= 10;
sprintf(buf,"%d",value);
SetDlgItemText(hDlg,IDC_TXDELAY_0,buf);
break;
case IDC_TXD_UP_1:
GetDlgItemText(hDlg,IDC_TXDELAY_1,buf,sizeof(buf));
value = strtol(buf,NULL,0);
if (value < 2550)
value += 10;
sprintf(buf,"%d",value);
SetDlgItemText(hDlg,IDC_TXDELAY_1,buf);
break;
case IDC_TXD_DOWN_1:
GetDlgItemText(hDlg,IDC_TXDELAY_1,buf,sizeof(buf));
value = strtol(buf,NULL,0);
if (value >= 10)
value -= 10;
sprintf(buf,"%d",value);
SetDlgItemText(hDlg,IDC_TXDELAY_1,buf);
break;
case IDC_TXD_UP_2:
GetDlgItemText(hDlg,IDC_TXDELAY_2,buf,sizeof(buf));
value = strtol(buf,NULL,0);
if (value < 2550)
value += 10;
sprintf(buf,"%d",value);
SetDlgItemText(hDlg,IDC_TXDELAY_2,buf);
break;
case IDC_TXD_DOWN_2:
GetDlgItemText(hDlg,IDC_TXDELAY_2,buf,sizeof(buf));
value = strtol(buf,NULL,0);
if (value >= 10)
value -= 10;
sprintf(buf,"%d",value);
SetDlgItemText(hDlg,IDC_TXDELAY_2,buf);
break;
case IDC_TXD_UP_3:
GetDlgItemText(hDlg,IDC_TXDELAY_3,buf,sizeof(buf));
value = strtol(buf,NULL,0);
if (value < 2550)
value += 10;
sprintf(buf,"%d",value);
SetDlgItemText(hDlg,IDC_TXDELAY_3,buf);
break;
case IDC_TXD_DOWN_3:
GetDlgItemText(hDlg,IDC_TXDELAY_3,buf,sizeof(buf));
value = strtol(buf,NULL,0);
if (value >= 10)
value -= 10;
sprintf(buf,"%d",value);
SetDlgItemText(hDlg,IDC_TXDELAY_3,buf);
break;
case IDCANCEL:
EndDialog(hDlg, 0);
break;
case IDOK:
config[0].mode = 0;
config[0].mode |= (IsDlgButtonChecked(hDlg, IDC_DUPLEX_0) == BST_CHECKED) ? MODE_d : 0;
config[0].mode |= (IsDlgButtonChecked(hDlg, IDC_NRZCODE_0) == BST_CHECKED) ? MODE_z : 0;
config[0].mode |= (IsDlgButtonChecked(hDlg, IDC_RXCLOCK_0) == BST_CHECKED) ? MODE_r : 0;
config[0].mode |= (IsDlgButtonChecked(hDlg, IDC_TXCLOCK_0) == BST_CHECKED) ? MODE_t : 0;
config[1].mode = 0;
config[1].mode |= (IsDlgButtonChecked(hDlg, IDC_DUPLEX_1) == BST_CHECKED) ? MODE_d : 0;
config[1].mode |= (IsDlgButtonChecked(hDlg, IDC_NRZCODE_1) == BST_CHECKED) ? MODE_z : 0;
config[1].mode |= (IsDlgButtonChecked(hDlg, IDC_RXCLOCK_1) == BST_CHECKED) ? MODE_r : 0;
config[1].mode |= (IsDlgButtonChecked(hDlg, IDC_TXCLOCK_1) == BST_CHECKED) ? MODE_t : 0;
config[2].mode = 0;
config[2].mode |= (IsDlgButtonChecked(hDlg, IDC_DUPLEX_2) == BST_CHECKED) ? MODE_d : 0;
config[2].mode |= (IsDlgButtonChecked(hDlg, IDC_NRZCODE_2) == BST_CHECKED) ? MODE_z : 0;
config[2].mode |= (IsDlgButtonChecked(hDlg, IDC_RXCLOCK_2) == BST_CHECKED) ? MODE_r : 0;
config[2].mode |= (IsDlgButtonChecked(hDlg, IDC_TXCLOCK_2) == BST_CHECKED) ? MODE_t : 0;
config[3].mode = 0;
config[3].mode |= (IsDlgButtonChecked(hDlg, IDC_DUPLEX_3) == BST_CHECKED) ? MODE_d : 0;
config[3].mode |= (IsDlgButtonChecked(hDlg, IDC_NRZCODE_3) == BST_CHECKED) ? MODE_z : 0;
config[3].mode |= (IsDlgButtonChecked(hDlg, IDC_RXCLOCK_3) == BST_CHECKED) ? MODE_r : 0;
config[3].mode |= (IsDlgButtonChecked(hDlg, IDC_TXCLOCK_3) == BST_CHECKED) ? MODE_t : 0;
GetDlgItemText(hDlg,IDC_TXDELAY_0,buf,sizeof(buf));
config[0].txdelay = strtol(buf,NULL,0);
GetDlgItemText(hDlg,IDC_TXDELAY_1,buf,sizeof(buf));
config[1].txdelay = strtol(buf,NULL,0);
GetDlgItemText(hDlg,IDC_TXDELAY_2,buf,sizeof(buf));
config[2].txdelay = strtol(buf,NULL,0);
GetDlgItemText(hDlg,IDC_TXDELAY_3,buf,sizeof(buf));
config[3].txdelay = strtol(buf,NULL,0);
config[0].baud = (1 << ComboBox_GetCurSel(GetDlgItem(hDlg,IDC_BAUDRATE_0))) * 1200;
config[1].baud = (1 << ComboBox_GetCurSel(GetDlgItem(hDlg,IDC_BAUDRATE_1))) * 1200;
config[2].baud = (1 << ComboBox_GetCurSel(GetDlgItem(hDlg,IDC_BAUDRATE_2))) * 1200;
config[3].baud = (1 << ComboBox_GetCurSel(GetDlgItem(hDlg,IDC_BAUDRATE_3))) * 1200;
EndDialog(hDlg, 1);
break;
}
break;
default:
return FALSE;
}
return TRUE;
}
int system_isnt4(void)
{
OSVERSIONINFO OsVer;
OsVer.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
if (!GetVersionEx((OSVERSIONINFO *)&OsVer))
return 0;
if (OsVer.dwPlatformId != VER_PLATFORM_WIN32_NT)
return 0;
if (OsVer.dwMajorVersion != 4)
return 0;
return 1;
}
int flex_home(char *Path, int Len)
{
HKEY hKeyFlex;
long Status;
Status = RegOpenKeyEx( HKEY_LOCAL_MACHINE,TEXT("SOFTWARE\\FlexNet"),0L,
KEY_READ,&hKeyFlex);
if (Status != ERROR_SUCCESS)
return 0;
Status = RegQueryValueEx(hKeyFlex,TEXT("Home"),NULL,NULL,Path,&Len);
RegCloseKey(hKeyFlex);
if (Status != ERROR_SUCCESS)
return 0;
return strlen(Path);
}
int create_service(char *Name, char *Path)
{
SC_HANDLE scm;
SC_HANDLE scs;
int ret = 0;
scm = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
if (!scm)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -