📄 zdwlanadapter.cpp
字号:
W32N_Request.NdisRequest.RequestType = NdisRequestQueryInformation;
W32N_Request.NdisRequest.DATA.QUERY_INFORMATION.InformationBuffer = pInfoBuf;
W32N_Request.NdisRequest.DATA.QUERY_INFORMATION.InformationBufferLength = nInfoBufLen;
W32N_Request.NdisRequest.DATA.QUERY_INFORMATION.BytesWritten = 0;
W32N_Request.NdisRequest.DATA.QUERY_INFORMATION.BytesNeeded = 0;
W32N_Request.NdisRequest.DATA.QUERY_INFORMATION.Oid = oid;
nNdisStatus = W32N_MakeNdisRequest(
pWLAdapterInfoIn->hNICAdapterDevice,
&W32N_Request,
&ovRidOverlap,
TRUE // Synchronous
);
if( nNdisStatus )
{
char szBuffer[200];
sprintf(szBuffer, "MakeNdisRequest fails!! The nNdisStatus = %8X\n", nNdisStatus);
TRACE( szBuffer );
pWLAdapterInfoIn->nFailCount++;
if( (pWLAdapterInfoIn->nFailAvoidCount) > 0 ) {
if( (pWLAdapterInfoIn->nFailCount) > (pWLAdapterInfoIn->nFailAvoidCount) ) {
pWLAdapterInfoIn->bAdapterOK = 0;
}
}
CloseHandle(ovRidOverlap.hEvent);
return ZDNDIS_FAIL;
}
if( (pWLAdapterInfoIn->nFailCount) > 0 )
pWLAdapterInfoIn->nFailCount--;
dBytes = W32N_Request.NdisRequest.DATA.QUERY_INFORMATION.BytesWritten;
// Close some handles
CloseHandle(ovRidOverlap.hEvent);
return dBytes;
}
INT CZDWlanAdapter::SetWin32NDISOid(PWLADAPTERINFO pWLAdapterInfoIn, DWORD oid, PVOID pInfoBuf, DWORD nInfoBufLen)
{
W32N_REQUEST W32N_Request;
NDIS_STATUS nNdisStatus;
OVERLAPPED ovRidOverlap;
DWORD dBytes;
ovRidOverlap.hEvent = CreateEvent(
NULL, // Security Attributes
FALSE, // Auto-Reset
FALSE, // Initial State Signaled
NULL // Event-object Name
);
if( !ovRidOverlap.hEvent ) {
return ZDNDIS_FAIL;
}
W32N_Request.NdisRequest.RequestType = NdisRequestSetInformation;
W32N_Request.NdisRequest.DATA.SET_INFORMATION.InformationBuffer = pInfoBuf;
W32N_Request.NdisRequest.DATA.SET_INFORMATION.InformationBufferLength = nInfoBufLen;
W32N_Request.NdisRequest.DATA.SET_INFORMATION.BytesRead = 0;
W32N_Request.NdisRequest.DATA.SET_INFORMATION.BytesNeeded = 0;
W32N_Request.NdisRequest.DATA.SET_INFORMATION.Oid = oid;
nNdisStatus = W32N_MakeNdisRequest(
pWLAdapterInfoIn->hNICAdapterDevice,
&W32N_Request,
&ovRidOverlap,
TRUE // Synchronous
);
if( nNdisStatus ) {
char szBuffer[100];
sprintf(szBuffer, "MakeNdisRequest fails!! The nNdisStatus = %8X\n", nNdisStatus);
TRACE( szBuffer );
pWLAdapterInfoIn->nFailCount++;
if( (pWLAdapterInfoIn->nFailAvoidCount) > 0 ) {
if( (pWLAdapterInfoIn->nFailCount) > (pWLAdapterInfoIn->nFailAvoidCount) ) {
pWLAdapterInfoIn->bAdapterOK = 0;
}
}
CloseHandle( ovRidOverlap.hEvent);
return ZDNDIS_FAIL;
}
if( (pWLAdapterInfoIn->nFailCount) > 0 )
pWLAdapterInfoIn->nFailCount--;
dBytes = W32N_Request.NdisRequest.DATA.SET_INFORMATION.BytesRead;
// Close some handles
CloseHandle(ovRidOverlap.hEvent);
return (int)dBytes;
}
BOOL CZDWlanAdapter::QueryWL_IsWindows95(void)
{
return W32N_IsWindows95();
}
BOOL CZDWlanAdapter::QueryWL_IsWindows2000(void)
{
return W32N_IsWindows2000();
}
// This function translate the string "[1]..." to "0001"
// "[7]..." to "0007"
// "[15]..." to "0015"
// "[256]..." to "0256"
// "[9876]..." to "9876"
VOID CZDWlanAdapter::GetNICNumber(char* InStr,char *OutStr)
{
int i;
int position = 3;
for(i=0; i<4; i++)
OutStr[i] = '0';
OutStr[4] = NULL;
while(*InStr != NULL)
{
if(*InStr == ']')
{
InStr--;
position = 3;
while( (*InStr >= '0') && (*InStr <= '9') && (position >= 0) )
{
OutStr[position--] = *InStr;
InStr--;
}
break;
}
InStr++;
}
}
INT CZDWlanAdapter::CreateAllNICAdapterList(PWLADAPTERLIST pWLAdapterList, int nBufferSize)
{
W32N_ADAPTER_INFO AdapterInfo;
int i; // Number of adapter.
DWORD nResult;
char szBuffer[_MAX_PATH];
i = 0;
nResult = W32N_GetFirstAdapterRegistryInfo( &AdapterInfo );
while( !nResult ) {
if( QueryWL_IsWindows95() ) {
sprintf( szBuffer, "%s" , AdapterInfo.cServiceName );
} else {
sprintf( szBuffer, "\\Device\\%s" , AdapterInfo.cServiceName );
}
lstrcpy( pWLAdapterList[i].csNICAdapterServiceName, szBuffer );
lstrcpy( pWLAdapterList[i].csNICAdapterDescription, AdapterInfo.cDescription);
sprintf(szBuffer, "%s", AdapterInfo.cTitle);
GetNICNumber(szBuffer, pWLAdapterList[i].csNICAdapterNumber);
i++;
if(i >= nBufferSize)
break;
nResult = W32N_GetNextAdapterRegistryInfo( &AdapterInfo );
}
return i;
}
INT CZDWlanAdapter::CreateNICAdapterList(PWLADAPTERLIST pWLAdapterList, int nBufferSize)
{
W32N_ADAPTER_INFO AdapterInfo;
HANDLE CardAdapter;
int i; // Number of adapter.
DWORD nResult;
char szBuffer[_MAX_PATH];
i = 0;
nResult = W32N_GetFirstAdapterRegistryInfo( &AdapterInfo );
while( !nResult ) {
if( QueryWL_IsWindows95() ) {
sprintf( szBuffer, "%s" , AdapterInfo.cServiceName );
} else {
sprintf( szBuffer, "\\Device\\%s" , AdapterInfo.cServiceName );
}
CardAdapter = W32N_OpenAdapter(szBuffer); // Try to open the adapter
if(CardAdapter != INVALID_HANDLE_VALUE) {
lstrcpy( pWLAdapterList[i].csNICAdapterServiceName, szBuffer );
lstrcpy( pWLAdapterList[i].csNICAdapterDescription, AdapterInfo.cDescription);
sprintf(szBuffer, "%s", AdapterInfo.cTitle);
GetNICNumber(szBuffer, pWLAdapterList[i].csNICAdapterNumber);
W32N_CloseAdapter( CardAdapter ); // Close adapter
i++;
if(i >= nBufferSize)
break;
}
nResult = W32N_GetNextAdapterRegistryInfo( &AdapterInfo );
}
return i;
}
INT CZDWlanAdapter::ScanZDAdapter()
{
int nTempInt1, nTempInt2;
CString sTempString1, sTempString2;
char szBuffer[256];
char szBuffer1[256];
int i, j;
DWORD dwTemp;
int AdapterNum=0;
//----------------------------------------------------------------
// Create Combo box list item.
nTempInt1 = sizeof(tempWLAdapterList) / sizeof(WLADAPTERLIST);
nTempInt2 = CreateAllNICAdapterList(tempWLAdapterList, nTempInt1); //add
if (nTempInt2 <= 0) return 0;
for(i=0; i<nTempInt2; i++) {
//get Adapter matching device ID within register
sprintf(szBuffer, tempWLAdapterList[i].csNICAdapterNumber);
if( QueryWL_IsWindows95() ) {
sprintf(szBuffer1,
"System\\CurrentControlSet\\Services\\Class\\Net\\%s",
szBuffer);
} else {
sprintf(szBuffer1,
"SYSTEM\\CurrentControlSet\\Control\\Class\\{4D36E972-E325-11CE-BFC1-08002BE10318}\\%s",
szBuffer);
}
dwTemp = sizeof(szBuffer);
if(QueryHLMReg(szBuffer1, "MatchingDeviceId", (char*)szBuffer, &dwTemp) == 0) {
sTempString1 = szBuffer;
j=0;
while(1) {
sTempString2 = g_sMatchingDeviceId[j];
if(sTempString2 == "") {
break;
}
sTempString1.MakeUpper();
sTempString2.MakeUpper();
if(sTempString1 == sTempString2) {
AdapterNumberIndes[AdapterNum] = i;
AdapterNum++;
}
j++;
}
} // End of if(QueryHLMReg(szBuffer1,...
} // End of for(i=0; i<nTempInt2; i++)
return AdapterNum;
}
VOID CZDWlanAdapter::CloseAdapter(PWLADAPTERINFO pWLAdapterInfoIn)
{
if (pWLAdapterInfoIn->hNICAdapterDevice != INVALID_HANDLE_VALUE) {
W32N_CloseAdapter( pWLAdapterInfoIn->hNICAdapterDevice );
pWLAdapterInfoIn->hNICAdapterDevice = INVALID_HANDLE_VALUE;
}
return;
}
BOOL CZDWlanAdapter::OpenAdapter(PWLADAPTERINFO pWLAdapterInfoIn, int indes)
{
memcpy(pWLAdapterInfoIn->csNICAdapterServiceName, tempWLAdapterList[indes].csNICAdapterServiceName,
sizeof(tempWLAdapterList[indes].csNICAdapterServiceName));
memcpy(pWLAdapterInfoIn->csNICAdapterDescription, tempWLAdapterList[indes].csNICAdapterDescription,
sizeof(tempWLAdapterList[indes].csNICAdapterDescription));
memcpy(pWLAdapterInfoIn->csNICAdapterNumber, tempWLAdapterList[indes].csNICAdapterNumber,
sizeof(tempWLAdapterList[indes].csNICAdapterNumber));
pWLAdapterInfoIn->hNICAdapterDevice = INVALID_HANDLE_VALUE; //Must be set before open adapter
pWLAdapterInfoIn->bAdapterOK = 1;
pWLAdapterInfoIn->nFailAvoidCount = 15; //15 is depend on ZDConfig.INI file
pWLAdapterInfoIn->hNICAdapterDevice = W32N_OpenAdapter(pWLAdapterInfoIn->csNICAdapterServiceName);
if( pWLAdapterInfoIn->hNICAdapterDevice == INVALID_HANDLE_VALUE ) {
pWLAdapterInfoIn->bAdapterOK = 0;
return FALSE;
}
return TRUE;
}
UINT CZDWlanAdapter::Query_ZDDLLVersion()
{
return (UINT)ZD12APP_DLL_VER;
}
//---------------------------------------------------------------------------
// uRegisterNo
// [in] The PHY register number. (CR0...CRxxx)
// Specified by integer 0...xxx
//
// uDataOut
// [in/out] Specified the UINT buffer to store the return value.
// Note: The PHY register data is 8-bit.
INT CZDWlanAdapter::ReadPHYRegister(PWLADAPTERINFO pWLAdapterInfoIn, UINT uRegisterNo, UINT *uDataOut)
{
ZD_CMD_STRUCT CmdStruct;
CmdStruct.u.send.cmd = 0x0030; // MSB field =0 Least significant bit transfer first.
CmdStruct.u.send.param0 = (USHORT)(uRegisterNo * 2);
if(QueryWin32NDISOid(pWLAdapterInfoIn, OID_ZD_CMD,(PVOID)&CmdStruct, sizeof(ZD_CMD_STRUCT)) == ZDNDIS_FAIL)
return ZDNDIS_FAIL;
*uDataOut = (BYTE)(CmdStruct.u.rsp.resp0 & 0x00FF);
return ZDNDIS_SUCCESS;
}
//---------------------------------------------------------------------------
// uRegisterNo
// [in] The PHY register number. (CR0...CRxxx)
// Specified by integer 0...xxx
//
// uDataIn
// [out] The data to be write to the specified PHY register.
// Note: The PHY register data is 8-bit.
INT CZDWlanAdapter::WritePHYRegister(PWLADAPTERINFO pWLAdapterInfoIn, UINT uRegisterNo, UINT uDataIn)
{
ZD_CMD_STRUCT CmdStruct;
CmdStruct.u.send.cmd = 0x0031; // MSB field =0 Least significant bit transfer first.
CmdStruct.u.send.param0 = (USHORT)(uRegisterNo * 2);
CmdStruct.u.send.param1 = (USHORT)uDataIn;
if(SetWin32NDISOid(pWLAdapterInfoIn, OID_ZD_CMD, (PVOID)&CmdStruct, sizeof(ZD_CMD_STRUCT)) == ZDNDIS_FAIL)
return ZDNDIS_FAIL;
return ZDNDIS_SUCCESS;
}
//---------------------------------------------------------------------------
// uRegisterAddr
// [in] The MAC memory mapped register address.
// Note: The MAC memory mapped register address is 32-bit.
//
// uDataOut
// [in/out] Specified the UINT buffer to store the return value.
// Note: The MAC memory mapped register data is 32-bit.
INT CZDWlanAdapter::ReadMACRegister(PWLADAPTERINFO pWLAdapterInfoIn, UINT uRegisterAddr, UINT *uDataOut)
{
ZD_CMD_STRUCT CmdStruct;
CmdStruct.u.send.cmd = 0x0032; // MSB field =0 Least significant bit transfer first.
CmdStruct.u.send.param0 = (USHORT)( uRegisterAddr & 0x0000FFFF);
CmdStruct.u.send.param1 = (USHORT)((uRegisterAddr >> 16) & 0x0000FFFF);
if(QueryWin32NDISOid(pWLAdapterInfoIn, OID_ZD_CMD,(PVOID)&CmdStruct, sizeof(ZD_CMD_STRUCT)) == ZDNDIS_FAIL)
return ZDNDIS_FAIL;
*uDataOut = (UINT)(CmdStruct.u.rsp.resp0) + (((UINT)(CmdStruct.u.rsp.resp1) << 16) & 0xFFFF0000);
return ZDNDIS_SUCCESS;
}
//---------------------------------------------------------------------------
// uRegisterAddr
// [in] The MAC memory mapped register address.
// Note: The MAC memory mapped register address is 32-bit.
// The valid MAC register address to be write is:
// 0000xxxxh
// 0001xxxxh
// 0040xxxxh
// 0060xxxxh
//
// uDataIn
// [in] The data to be write to the specified MAC register address.
// Note: The MAC memory mapped register data is 32-bit.
INT CZDWlanAdapter::WriteMACRegister(PWLADAPTERINFO pWLAdapterInfoIn, UINT uRegisterAddr, UINT uDataIn)
{
ZD_CMD_STRUCT CmdStruct;
UINT uTemp;
uTemp = (uRegisterAddr >> 16) & 0x0000FFFF;
if( (uTemp == 0x00) || (uTemp == 0x01) || (uTemp == 0x40) || (uTemp == 0x60) ) {
uRegisterAddr = uRegisterAddr & 0x0000FFFC;
switch(uTemp) {
case 0x00:
uRegisterAddr = uRegisterAddr + 0;
break;
case 0x01:
uRegisterAddr = uRegisterAddr + 1;
break;
case 0x40:
uRegisterAddr = uRegisterAddr + 2;
break;
case 0x60:
uRegisterAddr = uRegisterAddr + 3;
break;
}
} else {
return ZDNDIS_FAIL;
}
CmdStruct.u.send.cmd = 0x0033; // MSB field =0 Least significant bit transfer first.
CmdStruct.u.send.param0 = (USHORT)( uRegisterAddr & 0x0000FFFF);
CmdStruct.u.send.param1 = (USHORT)( uDataIn & 0x0000FFFF);
CmdStruct.u.send.param2 = (USHORT)((uDataIn >> 16) & 0x0000FFFF);
if(SetWin32NDISOid(pWLAdapterInfoIn, OID_ZD_CMD,(PVOID)&CmdStruct, sizeof(ZD_CMD_STRUCT)) == ZDNDIS_FAIL)
return ZDNDIS_FAIL;
return ZDNDIS_SUCCESS;
}
INT CZDWlanAdapter::SetWL_InitializeNIC(PWLADAPTERINFO pWLAdapterInfoIn)
{
ZD_CMD_STRUCT CmdStruct;
CmdStruct.u.send.cmd = 0;
if(SetWin32NDISOid(pWLAdapterInfoIn, OID_ZD_CMD, (PVOID)&CmdStruct, sizeof(ZD_CMD_STRUCT)) == ZDNDIS_FAIL)
return ZDNDIS_FAIL;
return ZDNDIS_SUCCESS;
}
INT CZDWlanAdapter::SetWL_EnableNIC(PWLADAPTERINFO pWLAdapterInfoIn)
{
ZD_CMD_STRUCT CmdStruct;
CmdStruct.u.send.cmd = 1;
if(SetWin32NDISOid(pWLAdapterInfoIn, OID_ZD_CMD, (PVOID)&CmdStruct, sizeof(ZD_CMD_STRUCT)) == ZDNDIS_FAIL)
return ZDNDIS_FAIL;
return ZDNDIS_SUCCESS;
}
INT CZDWlanAdapter::SetWL_DisableNIC(PWLADAPTERINFO pWLAdapterInfoIn)
{
ZD_CMD_STRUCT CmdStruct;
CmdStruct.u.send.cmd = 2;
if(SetWin32NDISOid(pWLAdapterInfoIn, OID_ZD_CMD, (PVOID)&CmdStruct, sizeof(ZD_CMD_STRUCT)) == ZDNDIS_FAIL)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -