www.pudn.com > AcquireEthernetCode.rar > Packet32.c


/**************************************************************************** 
 * Written by Sang-Eun Han (seh@brabo1.korea.ac.kr). 
 *  
 * Date : 
 * 
 * Filename : Packet32.c 
 * 
 * PERMISSION IS GRANTED TO USE, COPY AND DISTRIBUTE THIS SOFTWARE FOR ANY  
 * PURPOSE EXCEPT FOR A BUSINESS OR COMMERCIAL PURPOSE, AND WITHOUT FEE, PROVIDED,  
 * THAT THE ABOVE COPYRIGHT NOTICE AND THIS STATEMENT APPEAR IN ALL COPIES. 
 * I MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THIS 
 * SOFTWARE FOR ANY PURPOSE.  THIS SOFTWARE IS PROVIDED "AS IS." 
 * 
 */ 
 
#include  
#include  
 
#include  
 
//from NT 
#include "ntddndis.h" 
#include "ntddpack.h" 
// 
#include "packet32.h" 
#include "ZPacket.h" 
 
 
CHAR	szWindowTitle[] = "PACKET32.DLL"; 
HANDLE	hInstance; 
 
BOOLEAN	 WINAPI 
PacketInit (HANDLE hInst,  
			ULONG ul_reason_for_call, 
			LPVOID lpReserved) 
{ 
	switch(ul_reason_for_call) { 
	case DLL_PROCESS_ATTACH: 
		hInstance = hInst; 
		break; 
	case DLL_PROCESS_DETACH: 
		break; 
	default: 
		break; 
	} 
 
	return TRUE; 
} 
 
//////////////////////////////////////////////////////////////////////////////////////////////////////////// 
// PacketOpenAdapter 
// 
PVOID  WINAPI 
PacketOpenAdapter( 
	LPTSTR   AdapterName	// 0000, 0001, etc. 
	) 
{ 
	LPADAPTER	lpAdapter; 
	BOOLEAN		Result; 
	DWORD		dwReturn; 
 
	lpAdapter=(LPADAPTER)GlobalAllocPtr(GMEM_MOVEABLE | GMEM_ZEROINIT, sizeof(ADAPTER)); 
	if(lpAdapter==NULL) { 
		return NULL; 
	} 
 
	lstrcpy(lpAdapter->SymbolicLink,_T("\\\\.\\ZPACKET.VXD")); 
	wsprintf(lpAdapter->szAdapterName,_T("%s"), AdapterName); 
	lpAdapter->hFile= CreateFile(lpAdapter->SymbolicLink, GENERIC_READ | GENERIC_WRITE, 
								0, NULL, OPEN_EXISTING, 
								FILE_ATTRIBUTE_NORMAL | FILE_FLAG_DELETE_ON_CLOSE | FILE_FLAG_OVERLAPPED, 
								NULL); 
 
	if(lpAdapter->hFile != INVALID_HANDLE_VALUE) { 
		HANDLE		hEvent; 
		OVERLAPPED	Ovrlapped = {0, 0, 0, 0, 0 }; 
	 
		hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); 
		if(hEvent == NULL) { 
			CloseHandle(lpAdapter->hFile); 
		} else { 
			Ovrlapped.hEvent = hEvent; 
			Result = DeviceIoControl( lpAdapter->hFile, IOCTL_ZPACKET_BIND, 
										AdapterName, strlen(AdapterName), NULL, 0, 
										&dwReturn, &Ovrlapped); 
			if(Result == FALSE) {	 
				// pending... 
				Result = GetOverlappedResult(lpAdapter->hFile, &Ovrlapped, &dwReturn,TRUE); 
			} 
			if(Result == FALSE) { 
				CloseHandle(lpAdapter->hFile); 
				GlobalFreePtr(lpAdapter); 
				return NULL; 
			} 
		} 
		//flush receive queue 
		//DeviceIoControl(lpAdapter->hFile, IOCTL_ZPACKET_FLUSH, NULL, 0, NULL, 0, NULL, NULL); 
	} else { 
		GlobalFreePtr(lpAdapter); 
		return NULL; 
	} 
 
	return (lpAdapter); 
} 
 
 
//////////////////////////////////////////////////////////////////////////////////////////////////////////// 
// PacketCloseAdapter 
// 
VOID WINAPI 
PacketCloseAdapter( 
	LPADAPTER   lpAdapter 
	) 
{ 
	HANDLE		hEvent; 
	OVERLAPPED	Ovrlapped = {0, 0, 0, 0, 0 }; 
	BOOLEAN		Result; 
	DWORD		dwReturn; 
	 
	 
	hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); 
	if(hEvent != NULL) { 
		Ovrlapped.hEvent = hEvent; 
		Result = DeviceIoControl(	lpAdapter->hFile,  
						  			IOCTL_ZPACKET_UNBIND, 
									NULL, 0, NULL, 0, 
									&dwReturn, &Ovrlapped); 
		if(Result == FALSE) {	 
			// pending... 
			Result = GetOverlappedResult(lpAdapter->hFile,&Ovrlapped, &dwReturn,TRUE); 
		} 
	} 
 
	CloseHandle(lpAdapter->hFile); 
	GlobalFreePtr(lpAdapter); 
} 
 
 
//////////////////////////////////////////////////////////////////////////////////////////////////////////// 
// PacketAllocatePacket 
// 
PVOID  WINAPI 
PacketAllocatePacket( 
	LPADAPTER   AdapterObject 
	) 
{ 
	LPPACKET	lpPacket; 
	 
	lpPacket= (LPPACKET)GlobalAllocPtr(GMEM_MOVEABLE | GMEM_ZEROINIT, sizeof(PACKET)); 
 
	if (lpPacket==NULL) { 
		return NULL; 
	} 
 
	lpPacket->OverLapped.hEvent=CreateEvent(NULL, FALSE, FALSE, NULL); 
 
	if (lpPacket->OverLapped.hEvent==NULL) {  
		GlobalFreePtr(lpPacket); 
		return NULL; 
	} 
 
	return lpPacket; 
} 
 
//////////////////////////////////////////////////////////////////////////////////////////////////////////// 
// PacketFreePacket 
// 
VOID WINAPI 
PacketFreePacket( 
	LPPACKET    lpPacket 
	) 
{ 
	CloseHandle(lpPacket->OverLapped.hEvent); 
	GlobalFreePtr(lpPacket); 
} 
 
 
//////////////////////////////////////////////////////////////////////////////////////////////////////////// 
// PacketInitPacket 
// 
VOID WINAPI 
PacketInitPacket( 
	LPPACKET	lpPacket, 
	PVOID		Buffer, 
	UINT		Length 
	) 
{ 
	if(lpPacket==NULL) { 
		// panic! 
		return; 
	} 
 
    lpPacket->Buffer=Buffer; 
    lpPacket->Length=Length; 
} 
 
 
 
//////////////////////////////////////////////////////////////////////////////////////////////////////////// 
// PacketSendPacket 
// 
// NOTE: Sync information is ignored. 
BOOLEAN	WINAPI 
PacketSendPacket( 
	LPADAPTER	AdapterObject, 
	LPPACKET	lpPacket, 
	BOOLEAN		Sync 
	) 
{ 
	BOOLEAN		Result; 
	DWORD		BytesTransfered; 
 
	lpPacket->OverLapped.Offset=0; 
	lpPacket->OverLapped.OffsetHigh=0; 
 
	if(!ResetEvent(lpPacket->OverLapped.hEvent)) { 
		return FALSE; 
	} 
 
	Result = DeviceIoControl(AdapterObject->hFile, IOCTL_ZPACKET_SEND, 
							lpPacket->Buffer, lpPacket->Length,	NULL, 0,  
							&BytesTransfered, &lpPacket->OverLapped); 
 
	if(Result == FALSE) { 
		//pending 
		Result = GetOverlappedResult(AdapterObject->hFile, &lpPacket->OverLapped, 
										&BytesTransfered, TRUE); 
	}  
	 
	return Result; 
} 
 
 
//////////////////////////////////////////////////////////////////////////////////////////////////////////// 
// PacketReceivePacket 
// 
BOOLEAN	 WINAPI 
PacketReceivePacket( 
	LPADAPTER	AdapterObject, 
	LPPACKET	lpPacket, 
	BOOLEAN		Sync, 
	PULONG		BytesReceived 
	) 
{ 
	BOOLEAN      Result; 
 
	lpPacket->OverLapped.Offset=0; 
	lpPacket->OverLapped.OffsetHigh=0; 
 
	if (!ResetEvent(lpPacket->OverLapped.hEvent)) { 
		return FALSE; 
	} 
 
	Result = DeviceIoControl(	AdapterObject->hFile, IOCTL_ZPACKET_RECEIVE, 
								NULL, 0, lpPacket->Buffer, lpPacket->Length, 
								BytesReceived,&lpPacket->OverLapped); 
	if((Result == FALSE) && (Sync == TRUE)) { 
		Result = GetOverlappedResult(AdapterObject->hFile, &lpPacket->OverLapped, 
										BytesReceived, TRUE); 
	}  
 
	return Result; 
 
} 
 
 
//////////////////////////////////////////////////////////////////////////////////////////////////////////// 
// PacketWaitPacket 
// 
BOOLEAN	 WINAPI 
PacketWaitPacket( 
	LPADAPTER	AdapterObject, 
	LPPACKET	lpPacket, 
	PULONG		BytesReceived 
	) 
{ 
    return GetOverlappedResult(AdapterObject->hFile, &lpPacket->OverLapped,  
								BytesReceived, TRUE); 
} 
 
//////////////////////////////////////////////////////////////////////////////////////////////////////////// 
// PacketResetAdapter 
// 
BOOLEAN	WINAPI 
PacketResetAdapter( 
	LPADAPTER	AdapterObject 
	) 
{ 
	//just flush 
	//if pending, clear this pending 
	DeviceIoControl(AdapterObject->hFile, IOCTL_ZPACKET_FLUSH,  
					NULL, 0, NULL, 0, NULL, NULL); 
 
	DeviceIoControl(AdapterObject->hFile, IOCTL_ZPACKET_CLEAR_PEND, 
					NULL, 0, NULL, 0, NULL, NULL); 
 
    return TRUE; 
} 
 
 
//////////////////////////////////////////////////////////////////////////////////////////////////////////// 
// PacketSetFilter 
// 
BOOLEAN	WINAPI 
PacketSetFilter( 
	LPADAPTER	AdapterObject, 
	ULONG		Filter 
	) 
{ 
	HANDLE		hEvent; 
	OVERLAPPED	Ovrlapped = {0, 0, 0, 0, 0 }; 
	BOOLEAN		Result; 
	DWORD		dwReturn; 
	DWORD		dwMode = Filter; 
	 
	 
	hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);	// must be manual-reset 
	if(hEvent == NULL) { 
		return FALSE; 
	} 
 
	Ovrlapped.hEvent = hEvent; 
 
	Result = DeviceIoControl(	AdapterObject->hFile, IOCTL_ZPACKET_SET_PACKET_FILTER, 
								&dwMode, sizeof(DWORD), NULL, 0, 
								&dwReturn,	&Ovrlapped); 
 
	if(Result == FALSE) { 
		// pending... 
		Result = GetOverlappedResult(AdapterObject->hFile, &Ovrlapped, &dwReturn, TRUE); 
	} 
 
	return TRUE; 
} 
 
//////////////////////////////////////////////////////////////////////////////////////////////////////////// 
// PacketGetAddress 
// 
BOOLEAN	 WINAPI 
PacketGetAddress( 
	LPADAPTER  AdapterObject, 
	PUCHAR     AddressBuffer, 
	DWORD		cbBytes,  
	LPDWORD		lpcbBytes 
	) 
{ 
	 
	HANDLE		hEvent; 
	OVERLAPPED	Ovrlapped = {0, 0, 0, 0, 0 }; 
	BOOLEAN		Result; 
 
	if(AddressBuffer == NULL) { 
		return FALSE; 
	} 
 
	if((lpcbBytes==NULL) || (cbBytes < 6)) { 
		return FALSE; 
	} 
 
	hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);	// must be manual-reset 
	if(hEvent == NULL)	{ 
		return FALSE; 
	} 
 
	Ovrlapped.hEvent = hEvent; 
	Result = DeviceIoControl(	AdapterObject->hFile, IOCTL_ZPACKET_MAC_ADDRESS, 
								NULL, 0, AddressBuffer, cbBytes, 
								lpcbBytes, &Ovrlapped); 
 
	if(Result == FALSE) {	// pending... 
		Result = GetOverlappedResult( AdapterObject->hFile,&Ovrlapped,lpcbBytes,TRUE); 
	} 
 
    return Result; 
} 
 
 
//////////////////////////////////////////////////////////////////////////////////////////////////////////// 
// PacketAdapterDesc 
// 
BOOLEAN WINAPI 
PacketAdapterDesc( 
		LPADAPTER	AdapterObject, 
		LPSTR		lpszVendorSays,  
		DWORD		cbBytes,  
		LPDWORD		lpcbBytes 
		) 
{ 
	HANDLE		hEvent; 
	OVERLAPPED	Ovrlapped = {0, 0, 0, 0, 0 }; 
	BOOL		Result; 
	 
	*lpcbBytes = 0; 
	hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);	// must be manual-reset 
	if(hEvent == NULL) { 
		return FALSE; 
	} 
 
	Ovrlapped.hEvent = hEvent; 
 
	Result = DeviceIoControl(	AdapterObject->hFile, IOCTL_ZPACKET_VENDOR_DESCRIPTION, 
								NULL, 0, lpszVendorSays, cbBytes, 
								lpcbBytes, &Ovrlapped); 
 
	if(Result == FALSE) { 
		// pending... 
		Result = GetOverlappedResult(AdapterObject->hFile, &Ovrlapped, lpcbBytes, TRUE); 
	} 
 
	return Result; 
} 
//////////////////////////////////////////////////////////////////////////////////////////////////////////// 
// PacketGetAdapterNames 
// 
ULONG  WINAPI 
PacketGetAdapterNames( 
	PVOID	pAdapterDescs, 
	UINT	nAdapterDescs, 
	PUINT	pnAdapterDescsMax 
	) 
{ 
	HKEY	Key, SubKey; 
	CHAR	KeyPath[256], SubKeyPath[256]; 
	LONG	Status; 
	DWORD	dwSubKeys, Index; 
	DWORD	cbBytes; 
	LPADAPTER_DESC	pAdapterDesc = (LPADAPTER_DESC)pAdapterDescs; 
 
	FILETIME ft; 
 
	lstrcpy(KeyPath,"System\\CurrentControlSet\\Services\\Class\\Net"); 
	Status=RegOpenKeyEx( 
			HKEY_LOCAL_MACHINE, 
			KeyPath, 
			0, 
			KEY_READ, 
			&Key); 
 
	if(Status == ERROR_SUCCESS) { 
		dwSubKeys = 0; 
		Status = RegQueryInfoKey ( Key, NULL, NULL, NULL, 
					&dwSubKeys,	NULL, NULL, NULL, 
					NULL, NULL, NULL, &ft); 
		if(dwSubKeys == 0 || Status != ERROR_SUCCESS) { 
			RegCloseKey(Key); 
			return FALSE; 
		} 
		 
		//enumerate 
		for(Index = 0; Index < dwSubKeys; Index++) { 
			if(nAdapterDescs <= Index) break; 
 
			cbBytes = sizeof(pAdapterDesc[Index].szAdapterName); 
			Status = RegEnumKeyEx(Key, Index, 
						pAdapterDesc[Index].szAdapterName, &cbBytes, 
						NULL, NULL, NULL, &ft); 
			if(Status != ERROR_SUCCESS) break; 
 
			wsprintf(SubKeyPath,"%s\\%s", KeyPath, pAdapterDesc[Index].szAdapterName); 
			Status=RegOpenKeyEx(HKEY_LOCAL_MACHINE, SubKeyPath, 0,KEY_READ,&SubKey); 
			if(Status != ERROR_SUCCESS) continue; 
 
			cbBytes = sizeof(pAdapterDesc[Index].szAdapterDesc); 
			(void)RegQueryValueEx(SubKey,_T("DriverDesc"), 
						NULL,NULL, pAdapterDesc[Index].szAdapterDesc, &cbBytes); 
			RegCloseKey(SubKey); 
		} 
	} 
 
	*pnAdapterDescsMax = Index; 
	RegCloseKey(Key); 
	if(Index == 0) { 
		return FALSE; 
	} else { 
		return TRUE; 
	} 
}