コード例 #1
0
ファイル: poclink.c プロジェクト: ysangkok/pgp-win32-6.5.8
NDIS_STATUS PolicyManagerInitialize(
    IN PDRIVER_OBJECT	DriverObject,
    IN PUNICODE_STRING	RegistryPath,
    OUT PNDIS_HANDLE	PolicyManagerHandle
)
{
    DBG_FUNC("PolicyManagerInitialize")
    NDIS_STATUS         status;
    PGPnetPMContext *pContext = 0;
    PGPError err = kPGPError_NoErr;

    NDIS_PHYSICAL_ADDRESS HighestAcceptableAddress = NDIS_PHYSICAL_ADDRESS_CONST(-1, -1);

#ifdef PM_EMULATION
    PDummySA dummySA;
#endif

    DBG_ENTER();

    status = NdisAllocateMemory(PolicyManagerHandle,
                                sizeof(PGPnetPMContext),
                                0,
                                HighestAcceptableAddress
                               );

#ifndef PM_EMULATION

    if (status != NDIS_STATUS_SUCCESS)
    {
        DBG_PRINT(("!!!!! NdisAllocateMemory failed status=%Xh\n", status););
コード例 #2
0
ファイル: epacket.c プロジェクト: OPSF/uClinux
NTSTATUS NDIS_API DriverEntry(IN PDRIVER_OBJECT  DriverObject,
                              IN PUNICODE_STRING RegistryPath)

{
  // initialiae the driver

  NDIS_PROTOCOL_CHARACTERISTICS ProtocolChar;
  NDIS_STRING ProtoName = NDIS_STRING_CONST("EPACKET");
  NDIS_STATUS Status;


  // Because the driver can be loaded once for each Netcard on the system,
  // and because DriverEntry is called each time, we must ensure that
  // initialization is performed only once.
  if (GlobalDeviceExtension != NULL)
    return NDIS_STATUS_SUCCESS;
        
  NdisAllocateMemory((PVOID *)&GlobalDeviceExtension, sizeof(DEVICE_EXTENSION), 0, -1 );
  if (GlobalDeviceExtension == NULL)
    return NDIS_STATUS_RESOURCES;

  NdisZeroMemory((UCHAR*)GlobalDeviceExtension, sizeof(DEVICE_EXTENSION));
  NdisZeroMemory((UCHAR*)&ProtocolChar, sizeof(NDIS_PROTOCOL_CHARACTERISTICS));
  ProtocolChar.MajorNdisVersion            = 0x03;
  ProtocolChar.MinorNdisVersion            = 0x0a;
  ProtocolChar.Reserved                    = 0;
  ProtocolChar.OpenAdapterCompleteHandler  = PacketBindAdapterComplete;
  ProtocolChar.CloseAdapterCompleteHandler = PacketUnbindAdapterComplete;
  ProtocolChar.SendCompleteHandler         = PacketSendComplete;
  ProtocolChar.TransferDataCompleteHandler = PacketTransferDataComplete;
  ProtocolChar.ResetCompleteHandler        = PacketResetComplete;
  ProtocolChar.RequestCompleteHandler      = PacketRequestComplete;
  ProtocolChar.ReceiveHandler              = PacketReceiveIndicate;
  ProtocolChar.ReceiveCompleteHandler      = PacketReceiveComplete;
  ProtocolChar.StatusHandler               = PacketStatus;
  ProtocolChar.StatusCompleteHandler       = PacketStatusComplete;
  ProtocolChar.BindAdapterHandler          = PacketBindAdapter;
  ProtocolChar.UnbindAdapterHandler        = PacketUnbindAdapter;
  ProtocolChar.UnloadProtocolHandler       = PacketUnload;
  ProtocolChar.Name                        = ProtoName;
  
  NdisRegisterProtocol(&Status,
                       &GlobalDeviceExtension->NdisProtocolHandle,
                       &ProtocolChar,
                       sizeof(NDIS_PROTOCOL_CHARACTERISTICS));
  
  if (Status != NDIS_STATUS_SUCCESS) {
    NdisFreeMemory(GlobalDeviceExtension, sizeof(DEVICE_EXTENSION), 0);
    return Status;
  }
  
  // initialize open list
  InitializeListHead(&GlobalDeviceExtension->OpenList);
  
  // initialize global device extension
  GlobalDeviceExtension->DriverObject = DriverObject;
  
  return Status;
}
コード例 #3
0
ファイル: afilter.c プロジェクト: BillTheBest/WinNT4
NDIS_STATUS
ArcAllocatePackets(
    IN PARC_FILTER Filter
    )
/*++

Routine Description:

    This routine allocates Receive packets for the filter database.

Arguments:

    Filter - The filter db to allocate for.

Returns:

    NDIS_STATUS_SUCCESS if any packet was allocated.

--*/
{
    ULONG i;
    PARC_PACKET Packet;

    for (i = ARC_PACKET_ALLOCATION_UNIT; i != 0 ; i--) {

        NdisAllocateMemory((PVOID)&Packet,
                           sizeof(ARC_PACKET),
                           0,
                           HighestAcceptableMax
                          );

        if (Packet == NULL) {

            if (i == ARC_BUFFER_ALLOCATION_UNIT) {
                return(NDIS_STATUS_FAILURE);
            }

            return(NDIS_STATUS_SUCCESS);

        }

        NdisZeroMemory(Packet, sizeof(ARC_PACKET));

        NdisReinitializePacket(&(Packet->TmpNdisPacket));

        Packet->Next = Filter->FreePackets;
        Filter->FreePackets = Packet;

    }

    return(NDIS_STATUS_SUCCESS);
}
コード例 #4
0
ファイル: trc_core.c プロジェクト: BillTheBest/WinNT4
/* create a trace object */
INT
trc_create(VOID **trc_1, ULONG depth)
{
	TRC	**ret_trc = (TRC**)trc_1;
    NDIS_PHYSICAL_ADDRESS   pa = NDIS_PHYSICAL_ADDRESS_CONST(0xffffffff, 0xffffffff);
    TRC                     *trc;

    D_LOG(D_ENTRY, ("trc_create: entry, ret_trc: 0x%lx, depth: %ld", ret_trc, depth));

    /* allocate memory object */
    NdisAllocateMemory((PVOID*)&trc, sizeof(*trc), 0, pa);
    if ( !trc )
    {
        mem_alloc_failed:
        D_LOG(D_ALWAYS, ("trc_create: memory allocate failed!")); 
        return(TRC_E_NOMEM);
    }
    D_LOG(D_ALWAYS, ("trc_create: trc: 0x%lx", trc));
    NdisZeroMemory(trc, sizeof(*trc));

    /* allocate buffer memory */
    NdisAllocateMemory((PVOID*)&trc->ent_tbl, sizeof(TRC_ENTRY) * depth,
                                                        0, pa);
    if ( !trc->ent_tbl )
        goto mem_alloc_failed;                                         
    D_LOG(D_ALWAYS, ("trc_create: trc->ent_tbl: 0x%lx", trc->ent_tbl));
    NdisZeroMemory(trc->ent_tbl, sizeof(TRC_ENTRY) * depth);
    
    /* setup initial field values */
    trc->stat.state = TRC_ST_STOP;
    trc->stat.filter = TRC_FT_NONE;
    trc->stat.depth = depth;
    
    /* return succ */
    *ret_trc = trc;
	return(TRC_E_SUCC);
}
コード例 #5
0
ファイル: init.c プロジェクト: BillTheBest/WinNT4
VOID
NdisOpenConfiguration(
	OUT PNDIS_STATUS				Status,
	OUT PNDIS_HANDLE				ConfigurationHandle,
	IN	NDIS_HANDLE					WrapperConfigurationContext
	)
/*++

Routine Description:

	This routine is used to open the parameter subkey of the
	adapter registry tree.

Arguments:

	Status - Returns the status of the request.

	ConfigurationHandle - Returns a handle which is used in calls to
							NdisReadConfiguration and NdisCloseConfiguration.

	WrapperConfigurationContext - a handle pointing to an RTL_QUERY_REGISTRY_TABLE
							that is set up for this driver's parameters.

Return Value:

	None.

--*/
{
	//
	// Handle to be returned
	//
	PNDIS_CONFIGURATION_HANDLE HandleToReturn;

	//
	// Allocate the configuration handle
	//
	*Status = NdisAllocateMemory((PVOID*)&HandleToReturn,
								 sizeof(NDIS_CONFIGURATION_HANDLE),
								 0,
								 HighestAcceptableMax);

	if (*Status == NDIS_STATUS_SUCCESS)
	{
		HandleToReturn->KeyQueryTable = ((PNDIS_WRAPPER_CONFIGURATION_HANDLE)WrapperConfigurationContext)->ParametersQueryTable;
		HandleToReturn->ParameterList = NULL;
		*ConfigurationHandle = (NDIS_HANDLE)HandleToReturn;
	}
}
コード例 #6
0
ファイル: cm_chan.c プロジェクト: BillTheBest/WinNT4
//
// Allocate free channel pool
//
VOID
ChannelInit(VOID)
{
    NDIS_PHYSICAL_ADDRESS	pa = NDIS_PHYSICAL_ADDRESS_CONST(-1, -1);

	/* allocate memory object */
    NdisAllocateMemory((PVOID*)&chan_tbl, sizeof(CM_CHAN) * MAX_CHAN_IN_SYSTEM, 0, pa);
    if ( chan_tbl == NULL )
    {
        D_LOG(D_ALWAYS, ("ChannelInit: memory allocate failed!"));
		return;
    }
    D_LOG(D_ALWAYS, ("ChannelInit: chan_tbl: 0x%x", chan_tbl));
	NdisZeroMemory (chan_tbl, sizeof(CM_CHAN) * MAX_CHAN_IN_SYSTEM);
	NdisZeroMemory (chan_used, sizeof(chan_used));
}
コード例 #7
0
ファイル: cmini.cpp プロジェクト: NemProjects/WLAN
PVOID
CMiniport::MemoryAllocate(
    IN UINT cbMemory)
//
//  Allocate a block of memory Length bytes long.
//
{
    PVOID       pMemory = NULL;
    NDIS_STATUS Status;

    Status = NdisAllocateMemory(&pMemory, cbMemory, 0, g_HighestAcceptableAddress);
    if (Status == NDIS_STATUS_FAILURE) {
        NDIS_DEBUG_PRINTF(ATH_LOG_ERR, "AR6K: ERROR - NdisAllocateMemory for %d bytes failed error = %x\n", cbMemory, Status);
    }

    return pMemory;
}
コード例 #8
0
ファイル: res_core.c プロジェクト: BillTheBest/WinNT4
/* initialize support */
INT
res_init(VOID)
{
    NDIS_PHYSICAL_ADDRESS   pa = NDIS_PHYSICAL_ADDRESS_CONST(-1, -1);

    /* allocate memory object */
    NdisAllocateMemory((PVOID*)&res__tbl, (sizeof(RES) * MAX_RES), 0, pa);
    if ( !res__tbl )
    {
        D_LOG(D_ALWAYS, ("res_init: memory allocate failed!"));
        return(RES_E_NOMEM);
    }
    D_LOG(D_ALWAYS, ("res_init: res__tbl: 0x%lx", res__tbl));

    NdisZeroMemory (res__tbl, sizeof(RES) * MAX_RES);
//	NdisAllocateSpinLock(&res__lock);
    return(RES_E_SUCC);
}
コード例 #9
0
ファイル: configm.c プロジェクト: BillTheBest/WinNT4
VOID
NdisMFreeSharedMemory(
	IN	NDIS_HANDLE				MiniportAdapterHandle,
	IN	ULONG					Length,
	IN	BOOLEAN					Cached,
	IN	PVOID					VirtualAddress,
	IN	NDIS_PHYSICAL_ADDRESS	PhysicalAddress
	)
{
	PNDIS_MINIPORT_BLOCK	Miniport = (PNDIS_MINIPORT_BLOCK)MiniportAdapterHandle;

	if (CURRENT_IRQL < DISPATCH_LEVEL)
	{
		NdisFreeSharedMemory(MiniportAdapterHandle,
							Length,
							Cached,
							VirtualAddress,
							PhysicalAddress);
	}
	else if (ndisReferenceMiniport(Miniport))
	{
		PASYNC_WORKITEM	pWorkItem = NULL;

		// Allocate a work-item and queue it up to a worker thread
		NdisAllocateMemory(&pWorkItem,
						   sizeof(ASYNC_WORKITEM),
						   0,
						   HighestAcceptableMax);

		if (pWorkItem != NULL)
		{
			// Initialize the workitem and queue it up to a worker thread
			pWorkItem->Miniport = Miniport;
			pWorkItem->Length = Length;
			pWorkItem->Cached = Cached;
			pWorkItem->VAddr = VirtualAddress;
			pWorkItem->PhyAddr = PhysicalAddress;
			INITIALIZE_WORK_ITEM(&pWorkItem->ExWorkItem, ndisMQueuedFreeSharedHandler, pWorkItem);
			QUEUE_WORK_ITEM(&pWorkItem->ExWorkItem, CriticalWorkQueue);
		}

		// What do we do now ?
	}
}
コード例 #10
0
ファイル: cmini.cpp プロジェクト: NemProjects/WLAN
PVOID
CMiniport::MemoryAllocate(
    IN UINT cbMemory)
//
//  Allocate a block of memory Length bytes long.
//
{
    PVOID       pMemory = NULL;
    NDIS_STATUS Status;

    Status = NdisAllocateMemory(&pMemory, cbMemory, 0, g_HighestAcceptableAddress);
    if (Status == NDIS_STATUS_FAILURE) {
        NDIS_DEBUG_PRINTF(ATH_LOG_ERR, "AR6K: ERROR - NdisAllocateMemory for %d bytes failed error = %x\n", cbMemory, Status);
	logPrintf( (debugFileLog && debugErrorLog), "NdisAllocateMemory for %d bytes failed\r\n", cbMemory );
    }
//RETAILMSG(1, (TEXT("builderd:ar6k2:MemoryAllocate = %x, %d\r\n"), (A_UINT32)pMemory, cbMemory));

    return pMemory;
}
コード例 #11
0
ファイル: configm.c プロジェクト: BillTheBest/WinNT4
NDIS_STATUS
NdisMAllocateSharedMemoryAsync(
	IN	NDIS_HANDLE				MiniportAdapterHandle,
	IN	ULONG					Length,
	IN	BOOLEAN					Cached,
	IN	PVOID					Context
	)
{
	//
	// Convert the handle to our internal structure.
	//
	PNDIS_MINIPORT_BLOCK	Miniport = (PNDIS_MINIPORT_BLOCK) MiniportAdapterHandle;
	PASYNC_WORKITEM			pWorkItem = NULL;

	// Allocate a workitem
	if ((Miniport->SystemAdapterObject != NULL) &&
		(Miniport->DriverHandle->MiniportCharacteristics.AllocateCompleteHandler != NULL))
	{
		NdisAllocateMemory(&pWorkItem,
						   sizeof(ASYNC_WORKITEM),
						   0,
						   HighestAcceptableMax);
	}

	if ((pWorkItem == NULL) ||
		!ndisReferenceMiniport(Miniport))
	{
		if (pWorkItem != NULL)
			NdisFreeMemory(pWorkItem, sizeof(ASYNC_WORKITEM), 0);
		return NDIS_STATUS_FAILURE;
	}

	// Initialize the workitem and queue it up to a worker thread
	pWorkItem->Miniport = Miniport;
	pWorkItem->Length = Length;
	pWorkItem->Cached = Cached;
	pWorkItem->Context = Context;
	INITIALIZE_WORK_ITEM(&pWorkItem->ExWorkItem, ndisMQueuedAllocateSharedHandler, pWorkItem);
	QUEUE_WORK_ITEM(&pWorkItem->ExWorkItem, CriticalWorkQueue);

	return NDIS_STATUS_PENDING;
}
コード例 #12
0
PGPError
PMAddConfig(NDIS_HANDLE handle, PGPnetKernelConfig *pConfig)
{
	PGPnetPMContext		*pContext = (PGPnetPMContext*) handle;
	NDIS_STATUS			status;

	DBG_FUNC("PMAddConfig")

    DBG_ENTER();

	/* if config doesn't exist, create memory for it */
	if (!pContext->pConfig) {

#ifndef USERLAND_TEST
		status = NdisAllocateMemory(&(pContext->pConfig), 
			sizeof(PGPnetKernelConfig),
			0, 
			HighestAcceptableAddress);

			if (status != NDIS_STATUS_SUCCESS)
				return kPGPError_OutOfMemory;
#else
		pContext->pConfig = malloc(sizeof(PGPnetKernelConfig));
		if (!pContext->pConfig)
			return kPGPError_OutOfMemory;
#endif /* USERLAND_TEST */

	}

	/* clear out anything there */
	pgpClearMemory(pContext->pConfig, sizeof(PGPnetKernelConfig));

	/* copy configuration values */
	pContext->pConfig->bPGPnetEnabled = pConfig->bPGPnetEnabled;
	pContext->pConfig->bAllowUnconfigHost = pConfig->bAllowUnconfigHost;
	pContext->pConfig->bAttemptUnconfigHost = pConfig->bAttemptUnconfigHost;

	DBG_LEAVE(kPGPError_NoErr);

	return kPGPError_NoErr;
}
コード例 #13
0
ファイル: cm_init.c プロジェクト: BillTheBest/WinNT4
/* create a new cm object */
cm_create(VOID **ret_cm, NDIS_HANDLE AdapterHandle)
{
    NDIS_PHYSICAL_ADDRESS   pa = NDIS_PHYSICAL_ADDRESS_CONST(-1, -1);
    INT     n;

    D_LOG(D_ENTRY, ("cm_create: entry, ret_cm: 0x%p", ret_cm));

	/* allocate memory object */
    NdisAllocateMemory((PVOID*)ret_cm, sizeof(CM), 0, pa);
    if ( *ret_cm == NULL )
    {
        D_LOG(D_ALWAYS, ("cm_create: memory allocate failed!"));
		NdisWriteErrorLogEntry (AdapterHandle,
		                        NDIS_ERROR_CODE_OUT_OF_RESOURCES,
								0);
        return(CM_E_NOMEM);
    }
    D_LOG(D_ALWAYS, ("cm_create: cm: 0x%x", *ret_cm));
	NdisZeroMemory(*ret_cm, sizeof(CM));

    /* allocate connection out of local table */
    for ( n = 0 ; n < MAX_CM_IN_SYSTEM ; n++ )
        if ( !cm_used[n] )
            break;
    if ( n >= MAX_CM_IN_SYSTEM )
	{
		/* free memory */
		NdisFreeMemory(*ret_cm, sizeof(CM), 0);
        return(CM_E_NOSLOT);
	}


    /* initialize */
    cm_used[n] = 1;
	cm_tbl[n] = *ret_cm;
	((CM*)*ret_cm)->local_conn_index = n;

    /* return */
    return(CM_E_SUCC);
}
コード例 #14
0
ファイル: afilter.c プロジェクト: BillTheBest/WinNT4
BOOLEAN
ArcCreateFilter(
    IN PNDIS_MINIPORT_BLOCK Miniport,
    IN ARC_FILTER_CHANGE FilterChangeAction,
    IN ARC_DEFERRED_CLOSE CloseAction,
    UCHAR AdapterAddress,
    IN PNDIS_SPIN_LOCK Lock,
    OUT PARC_FILTER *Filter
    )

/*++

Routine Description:

    This routine is used to create and initialize the Arcnet filter database.

Arguments:

    Miniport - Pointer to the mini-port object.

    ChangeAction - Action routine to call when a binding sets or clears
    a particular filter class and it is the first or only binding using
    the filter class.

    CloseAction - This routine is called if a binding closes while
    it is being indicated to via NdisIndicateReceive.  It will be
    called upon return from NdisIndicateReceive.

    AdapterAddress - the address of the adapter associated with this filter
    database.

    Lock - Pointer to the lock that should be held when mutual exclusion
    is required.

    Filter - A pointer to an ARC_FILTER.  This is what is allocated and
    created by this routine.

Return Value:

    If the function returns false then one of the parameters exceeded
    what the filter was willing to support.

--*/

{

    PARC_FILTER LocalFilter;
    NDIS_STATUS AllocStatus;

    //
    // Allocate the database and it's associated arrays.
    //

    AllocStatus = NdisAllocateMemory(&LocalFilter, sizeof(ARC_FILTER), 0, HighestAcceptableMax);
    *Filter = LocalFilter;

    if (AllocStatus != NDIS_STATUS_SUCCESS) {
        return FALSE;
    }

    NdisZeroMemory(
        LocalFilter,
        sizeof(ARC_FILTER)
        );

    LocalFilter->Miniport = Miniport;
    LocalFilter->FreeBindingMask = (ULONG)(-1);
    LocalFilter->OpenList = NULL;
    LocalFilter->AdapterAddress = AdapterAddress ;
    LocalFilter->Lock = Lock;
    LocalFilter->FilterChangeAction = FilterChangeAction;
    LocalFilter->CloseAction = CloseAction;

    NdisAllocateBufferPool(
        &AllocStatus,
        (PNDIS_HANDLE)(&LocalFilter->ReceiveBufferPool),
        ARC_RECEIVE_BUFFERS
        );

    if (AllocStatus != NDIS_STATUS_SUCCESS) {

        NdisFreeMemory(LocalFilter, sizeof(ARC_FILTER), 0);
        return(FALSE);
    }

    ArcReferencePackage();

    return TRUE;

}
コード例 #15
0
ファイル: LpxPacket.c プロジェクト: yzx65/ndas4windows
NTSTATUS
PacketAllocate(
    IN	PSERVICE_POINT		ServicePoint,
    IN	ULONG				PacketLength,
    IN	PDEVICE_CONTEXT		DeviceContext,
    IN	UCHAR				Type,
    IN	PUCHAR				CopyData,
    IN	ULONG				CopyDataLength,
    IN	PIO_STACK_LOCATION	IrpSp,
    OUT	PNDIS_PACKET		*Packet
)
{
    NTSTATUS		status;
    PUCHAR			packetData;
    PNDIS_BUFFER	pNdisBuffer;
    PNDIS_BUFFER	pNdisBufferData;
    PNDIS_PACKET	packet;
    USHORT			port;

    DebugPrint(3, ("PacketAllocate, PacketLength = %d, Numberofpackets = %d\n", PacketLength, NumberOfPackets));

    //	if(ServicePoint && ServicePoint->SmpState == SMP_SYN_RECV)
    //		return STATUS_INSUFFICIENT_RESOURCES;

    if(DeviceContext == NULL) {
        DebugPrint(1, ("[LPX]PacketAllocate: DeviceContext is NULL!!!\n"));
        return STATUS_INVALID_PARAMETER;
    }

    if(DeviceContext->LpxPacketPool == NULL) {
        DebugPrint(1, ("[LPX]PacketAllocate: DeviceContext->LpxPacketPool is NULL!!!\n"));
        return STATUS_INVALID_PARAMETER;
    }

    NdisAllocatePacket(&status,	&packet, DeviceContext->LpxPacketPool);

    if(status != NDIS_STATUS_SUCCESS) {
        DebugPrint(1, ("[LPX]PacketAllocate: NdisAllocatePacket Failed!!!\n"));
        return STATUS_INSUFFICIENT_RESOURCES;
    }

    status = NdisAllocateMemory(
                 &packetData,
                 PacketLength
             );
    if(status != NDIS_STATUS_SUCCESS) {
        DebugPrint(1, ("[LpxSmp]PacketAllocate: Can't Allocate Memory packet.\n"));

        NdisFreePacket(packet);
        *Packet = NULL;

        return status;
    }

    NdisAllocateBuffer(
        &status,
        &pNdisBuffer,
        DeviceContext->LpxBufferPool,
        packetData,
        PacketLength
    );
    if(!NT_SUCCESS(status)) {
        NdisFreePacket(packet);
        *Packet = NULL;
        NdisFreeMemory(packetData);
        DebugPrint(1, ("[LPX]PacketAllocate: Can't Allocate Buffer!!!\n"));

        return status;
    }

    switch(Type) {

    case SEND_TYPE:

        if(ServicePoint && &ServicePoint->SmpContext) {
            RtlCopyMemory(&packetData[0],
                          ServicePoint->DestinationAddress.Node,
                          ETHERNET_ADDRESS_LENGTH
                         );
            RtlCopyMemory(&packetData[ETHERNET_ADDRESS_LENGTH],
                          ServicePoint->SourceAddress.Node,
                          ETHERNET_ADDRESS_LENGTH
                         );
            port = HTONS(ETH_P_LPX);
            RtlCopyMemory(&packetData[ETHERNET_ADDRESS_LENGTH*2],
                          &port, //&ServicePoint->DestinationAddress.Port,
                          2
                         );
        }

        if(CopyDataLength) {

            NdisAllocateBuffer(
                &status,
                &pNdisBufferData,
                DeviceContext->LpxBufferPool,
                CopyData,
                CopyDataLength
            );
            if(!NT_SUCCESS(status)) {
                NdisFreePacket(packet);
                *Packet = NULL;
                NdisFreeMemory(packetData);
                DebugPrint(1, ("[LPX]PacketAllocate: Can't Allocate Buffer For CopyData!!!\n"));

                return status;
            }

            NdisChainBufferAtFront(packet, pNdisBufferData);
        }
        break;

    case RECEIVE_TYPE:

        NdisMoveMappedMemory(
            packetData,
            CopyData,
            CopyDataLength
        );

        break;
    }

    //	RESERVED(packet)->ServicePoint = ServicePoint;
    RESERVED(packet)->Cloned = 0;
    RESERVED(packet)->IrpSp = IrpSp;
    RESERVED(packet)->Type = Type;
    RESERVED(packet)->LpxSmpHeader = NULL;

    if(IrpSp == NULL) {
        DebugPrint(2, ("[LPX] PacketAllocate: No IrpSp\n")) ;
    }

    NdisChainBufferAtFront(packet, pNdisBuffer);

    InterlockedIncrement(&NumberOfPackets);

    *Packet = packet;
    return STATUS_SUCCESS;
}
コード例 #16
0
ファイル: Packet.c プロジェクト: 469306621/Languages
/* 
 * This function add the adapter names to the list
 * 
 */
NDIS_STATUS PKTBindNames () 
{
	HKEY	hKeyComm;
	HKEY	hKeyAdap;
	HKEY	hKeyLink;
	DWORD	dwCnt = 0;
	DWORD	dwIndex = 0;
	WCHAR	chName[512];
	DWORD	dwName = 512;
	PADAPTER_NAME	pADName;


	// open the comm key
	if (ERROR_SUCCESS != RegOpenKeyEx (HKEY_LOCAL_MACHINE, L"Comm", 0,
		0, &hKeyComm)) {
		return NDIS_STATUS_FAILURE;
	}


	// enumerate all the sub keys in the comm
	while (ERROR_SUCCESS == RegEnumKeyEx (hKeyComm, dwIndex++, chName,
		&dwName, NULL, NULL, NULL, NULL)) {

		// open the adapter key
		if (ERROR_SUCCESS == RegOpenKeyEx (hKeyComm, chName, 0,
			0, &hKeyAdap)) {

			// open the linkage key
			if (ERROR_SUCCESS == RegOpenKeyEx (hKeyAdap, L"Linkage", 0,
				0, &hKeyLink)) 
			{
				dwName = 512;

				// query the route value
				if (ERROR_SUCCESS == RegQueryValueEx (hKeyLink, L"Route", NULL, 
					NULL, (LPBYTE) chName, &dwName)) 
				{
					// store the name in the list
					// we can also get the detailed name here
					// may be in next version
					
					// allocate the memory that describes the adapter
					NdisAllocateMemory ((PVOID*) &pADName, sizeof (ADAPTER_NAME), 0 , NDIS_ADDR_M1);
					if (pADName == NULL) {
						return NDIS_STATUS_FAILURE;
					}
					
					// copy the device name in the adapter name structure
					pADName->ndstrDeviceName.Length			= wcslen (chName) * 2;
					pADName->ndstrDeviceName.MaximumLength	= wcslen (chName) * 2 + 2;
					pADName->ndstrDeviceName.Buffer			= pADName->chDeviceName;
					wcsncpy (pADName->chDeviceName, chName, 32);
					
					// insert the adapter name in the global data structure
					InsertTailList (&g_pDeviceExtension->listAdapterNames, &pADName->ListElement);
					dwCnt++;

				}

				// close linkage
				RegCloseKey (hKeyLink);
			}

			// close the adapter key
			RegCloseKey (hKeyAdap);
		}
		dwName = 512;
	}

	// close the comms key
	RegCloseKey (hKeyComm);

	if (dwCnt == 0)	{
		SetLastError (ERROR_BAD_NET_NAME);
		return NDIS_STATUS_FAILURE;
	}


	return NDIS_STATUS_SUCCESS;
}
コード例 #17
0
ファイル: Packet.c プロジェクト: 469306621/Languages
BOOL PKT_IOControl (DWORD dwContext, DWORD dwCode, PBYTE pBufIn,
					DWORD dwLenIn, PBYTE pBufOut, DWORD dwLenOut, PDWORD pdwActualOut)
{
	BOOL			bRet = TRUE;
	PWCHAR			bpf_prog;
	PNDIS_STRING	pstrAName;
	POPEN_INSTANCE	pOpenInst = NULL;
	PUCHAR			pTempBuf;
	ULONG			nValue;

	// if the context is different then return false
	if (dwContext != PKT_FILE_HANDLE) {
		SAFE_SET (pdwActualOut, 0);
		return FALSE;
	}

	// if the code is not to open the adapter then there
	// should be an open instance of the adapter
	if (dwCode != PIOC_OPEN_ADAPTER &&
		dwCode != PIOC_GET_MACNAME) {

		// get the open instance handle
		pOpenInst = g_pDeviceExtension->pOpenInstance;
		if (pOpenInst == NULL) {
			return FALSE;
		}
	}

	switch (dwCode) {

	// open the adapter message
	case PIOC_OPEN_ADAPTER:

		// get the adapter NDIS name
		pstrAName = PKTGetNDISAdapterName ((PWCHAR)pBufIn, dwLenIn);
		if (pstrAName == NULL) {
			return FALSE;
		}

		// open the adapter
		if (! PKTOpenAdapter (pstrAName)) {
			bRet = FALSE;
		}
	break;

	// close the adapter message
	case PIOC_CLOSE_ADAPTER:
		bRet = PKTCloseAdapter (pOpenInst);
	break;

	// function to set new bpf filter
	case PIOC_SETF:

		// free the previous buffer if selected
		if (pOpenInst->bpfprogram != NULL) {
			NdisFreeMemory (pOpenInst->bpfprogram, pOpenInst->bpfprogramlen, 0);
			pOpenInst->bpfprogram = NULL;
			pOpenInst->bpfprogramlen = 0;
		}


		// get the pointer to the new program
		bpf_prog = (PWCHAR) pBufIn;

		// before accepting the program we must check that it's valid
		// otherwise, a bogus program could easily crash the driver
		pOpenInst->bpfprogramlen = dwLenIn;
		if (bpf_validate ((struct bpf_insn*)bpf_prog, 
			pOpenInst->bpfprogramlen/sizeof(struct bpf_insn)) == 0) {
			pOpenInst->bpfprogramlen = 0;
			pOpenInst->bpfprogram = NULL; 
			return FALSE; // filter not accepted
		}

		// allocate the memory to contain the new filter program*/
		if (NdisAllocateMemory(&pOpenInst->bpfprogram, pOpenInst->bpfprogramlen,
			0, NDIS_ADDR_M1) == NDIS_STATUS_FAILURE) {
			pOpenInst->bpfprogramlen = 0;
			pOpenInst->bpfprogram = NULL; 
			return FALSE;
		}

		// copy the program in the new buffer
		NdisMoveMemory (pOpenInst->bpfprogram, bpf_prog, pOpenInst->bpfprogramlen);

		// reset the buffer that could contain packets that don't match the filter
		pOpenInst->Bhead	= 0;
		pOpenInst->Btail	= 0;
		pOpenInst->BLastByte= 0;

		// return the accepted buffer len
		SAFE_SET(pdwActualOut, pOpenInst->bpfprogramlen);
	break;


	// function to set the internal buffer size
	case PIOC_SET_BUFFER_SIZE:

		// get the size to allocate
		nValue = ((PULONG)pBufIn)[0];

		// free the old buffer
		if (pOpenInst->Buffer != NULL) {
			NdisFreeMemory (pOpenInst->Buffer, pOpenInst->BufSize, 0);
		}

		pOpenInst->Buffer = NULL;

		// allocate the new buffer
		if (nValue > 0) {
			NdisAllocateMemory ((PVOID*)&pTempBuf, nValue, 0, NDIS_ADDR_M1);
			if (pTempBuf == NULL) {
				pOpenInst->BufSize = 0;
				return FALSE;
			}
			
			pOpenInst->Buffer = pTempBuf;
		}
			
		pOpenInst->Bhead	= 0;
		pOpenInst->Btail	= 0;
		pOpenInst->BLastByte= 0;
		pOpenInst->BufSize	= (UINT)nValue;

		SAFE_SET(pdwActualOut, nValue);
		
	break;


	// for sharing the event from the user
	case PIOC_EVNAME:
		if (pBufOut == NULL || dwLenOut < 32) {
			SAFE_SET(pdwActualOut, 0);
			bRet = FALSE;
		} else {
			wcscpy ((PWCHAR)pBufOut, SH_EVENT_NAME);
			SAFE_SET (pdwActualOut, wcslen (SH_EVENT_NAME));
		}

	break;


	// set read timeout function
	case PIOC_SRTIMEOUT:
		pOpenInst->TimeOut = ((PULONG)pBufIn)[0];
		SAFE_SET(pdwActualOut, pOpenInst->TimeOut);
	break;

	
	// resets the adapter instance
	case PIOC_RESET:
		bRet = PKTReset (pOpenInst);
	break;


	// requests of different type
	case PIOC_SETOID:
	case PIOC_QUERYOID:
		return PKTRequest (pOpenInst, dwCode, pBufIn, dwLenIn, pBufOut, dwLenOut, pdwActualOut);
	break;


	// read packets
	case PIOC_READ_PACKET:
		return PKTRead (pOpenInst, pBufOut, dwLenOut, pdwActualOut);
	break;


	// write packets
	case PIOC_WRITE_PACKET:
		return PKTWrite (pOpenInst, pBufIn, dwLenIn, pdwActualOut);
	break;


	// read mac name
	case PIOC_GET_MACNAME:
		*pdwActualOut = PKTGetMacNameList ((PWCHAR)pBufOut, dwLenOut);
	break;


	// minimum number of bytes to copy
	case PIOC_SMINTOCOPY:
		pOpenInst->MinToCopy = ((PULONG)pBufIn)[0];
		SAFE_SET(pdwActualOut, 0);
	break;


	// unknown function code. set out length to 0 and return true
	default:
		bRet = FALSE;
		SAFE_SET(pdwActualOut, 0);
	break;
	}

	return bRet;
}
コード例 #18
0
ファイル: Packet.c プロジェクト: 469306621/Languages
/*
 * This routine initializes the packet driver. The function is called by the 
 * driver manager automatically when RegisterDevice function is called.
 *
 * Arguments
 *		dwContext		-	Specifies a pointer to a string containing the 
 *							registry path to the active key for the stream 
 *							interface driver.
 *
 * Return Value
 *		The function return the device context to be called with other stream
 *		function like _Open, _Close, etc. If the initialization fails then the
 *		function returns NULL. If the function returns 0 then the driver is not 
 *		loaded by the device manager.
 *
 */
DWORD PKT_Init(DWORD dwContext)
{
	NDIS_PROTOCOL_CHARACTERISTICS	ProtocolChar;
	NDIS_STRING						ProtoName = PROTOCOL_NAME;
	NDIS_STATUS						Status;
	
	// Allocate memory for the global device extension
	NdisAllocateMemory ((PVOID*) &g_pDeviceExtension, sizeof (DEVICE_EXTENSION), 
		0, NDIS_ADDR_M1);
	if (g_pDeviceExtension == NULL) {
		return 0;
	}
	
	// reset the global device extension object
	NdisZeroMemory (g_pDeviceExtension, sizeof (DEVICE_EXTENSION));
	
	// reset the protocol characteristics object
	NdisZeroMemory (&ProtocolChar, sizeof (NDIS_PROTOCOL_CHARACTERISTICS));
	
	// Initialize the protocol char structure
	ProtocolChar.MajorNdisVersion            = 0x03;
	ProtocolChar.MinorNdisVersion            = 0x00;
	ProtocolChar.Reserved                    = 0;
	ProtocolChar.Name                        = ProtoName;

	ProtocolChar.BindAdapterHandler			 = PacketBindAdapter;
	ProtocolChar.CloseAdapterCompleteHandler = PacketCloseAdapterComplete;
	ProtocolChar.OpenAdapterCompleteHandler  = PacketOpenAdapterComplete;
	ProtocolChar.ReceiveHandler              = PacketReceive;
	ProtocolChar.ReceiveCompleteHandler      = PacketReceiveComplete;
	ProtocolChar.RequestCompleteHandler      = PacketRequestComplete;
	ProtocolChar.ResetCompleteHandler        = PacketResetComplete;
	ProtocolChar.StatusHandler               = PacketStatus;
	ProtocolChar.StatusCompleteHandler       = PacketStatusComplete;
	ProtocolChar.TransferDataCompleteHandler = PacketTransferDataComplete;
	ProtocolChar.UnbindAdapterHandler        = PacketUnbindAdapter;
	ProtocolChar.SendCompleteHandler         = PacketWriteComplete;
	
	// Registed the protocol handler
	NdisRegisterProtocol (&Status, &g_pDeviceExtension->NdisProtocolHandle,
		&ProtocolChar, sizeof(NDIS_PROTOCOL_CHARACTERISTICS));
	
	// Check the return value
	if (Status != NDIS_STATUS_SUCCESS) {
		NdisFreeMemory (g_pDeviceExtension, sizeof (DEVICE_EXTENSION),  0);
		return 0;
	}
	
	// Initialize the list headers
	InitializeListHead (&g_pDeviceExtension->listAdapterNames);

	// Initialize the open instance pointer
	g_pDeviceExtension->pOpenInstance = NULL;
	
	// Check for the available adapters to bind with
	// not reqd for win ce. the os call packet bind adapter for 
	// every adapters installed in the system
	if (PKTBindNames () != NDIS_STATUS_SUCCESS) {
		NdisFreeMemory (g_pDeviceExtension, sizeof (DEVICE_EXTENSION),  0);
		g_pDeviceExtension = NULL;
		return 0;
	}
	
	// Status is generally succes`s over here
	return PKT_DEVICE_CONTEXT;
}
コード例 #19
0
ファイル: epacket.c プロジェクト: OPSF/uClinux
VOID NDIS_API PacketBindAdapter(OUT PNDIS_STATUS pStatus,
                                IN  NDIS_HANDLE  BindAdapterContext,
                                IN  PNDIS_STRING pAdapterName,
                                IN  PVOID        SystemSpecific1,
                                IN  PVOID        SystemSpecific2)
{
  //   bind this driver to a NIC
  
  POPEN_INSTANCE    oiNew;
  NDIS_STATUS	    ErrorStatus, AllocStatus;
  UINT              Medium;
  NDIS_MEDIUM       MediumArray = NdisMedium802_3;
  UINT              i;


  //  allocate some memory for the open structure
  NdisAllocateMemory((PVOID *)&oiNew, sizeof(OPEN_INSTANCE), 0, -1);
  if (oiNew == NULL) { // not enough memory
    *pStatus = NDIS_STATUS_RESOURCES;
    return;
  }
  
  NdisZeroMemory((PVOID)oiNew, sizeof(OPEN_INSTANCE));
  
  // Save Binding Context
  oiNew->BindAdapterContext = BindAdapterContext;
  
  // Save the device handle
  oiNew->hDevice = (DWORD)SystemSpecific1;
  
  // Allocate a packet pool for our xmit and receive packets
  NdisAllocatePacketPool(&AllocStatus,
                         &(oiNew->PacketPool),
                         TRANSMIT_PACKETS,
                         sizeof(PACKET_RESERVED));
  if (AllocStatus != NDIS_STATUS_SUCCESS) { // not enough memory
    NdisFreeMemory(oiNew, sizeof(OPEN_INSTANCE), 0);
    *pStatus = NDIS_STATUS_RESOURCES;
    return;
  }
  
  // Allocate a buffer pool for our xmit and receive buffers
  NdisAllocateBufferPool(&AllocStatus, &(oiNew->BufferPool), TRANSMIT_PACKETS);
  if (AllocStatus != NDIS_STATUS_SUCCESS) { // not enough memory
    NdisFreeMemory(oiNew, sizeof(OPEN_INSTANCE), 0);
    *pStatus = NDIS_STATUS_RESOURCES;
    return;
  }

  //  list to hold irp's that want to reset the adapter
  NdisAllocateSpinLock(&oiNew->ResetSpinLock);
  InitializeListHead(&oiNew->ResetIrpList);

  //  Initialize list for holding pending read requests
  NdisAllocateSpinLock(&oiNew->RcvQSpinLock);
  InitializeListHead(&oiNew->RcvList);
  
  //  Initialize the request list
  NdisAllocateSpinLock(&oiNew->RequestSpinLock);
  InitializeListHead(&oiNew->RequestList);
  
  //  link up the request stored in our open block
  for (i = 0; i < MAX_REQUESTS; i++) {
    // Braces are required as InsertTailList macro has multiple statements in it
    InsertTailList(&oiNew->RequestList, &oiNew->Requests[i].Reserved.ListElement);
  }
  
  //  Try to open the MAC
  NdisOpenAdapter(pStatus, &ErrorStatus, &oiNew->AdapterHandle, &Medium, &MediumArray, 1,
                  GlobalDeviceExtension->NdisProtocolHandle, oiNew, pAdapterName, 0, NULL);
  
  //  Save the status returned by NdisOpenAdapter for completion routine
  oiNew->Status = *pStatus;
  
  switch (*pStatus) {
    case NDIS_STATUS_PENDING:
      break;
    
    case NDIS_STATUS_SUCCESS:
      ErrorStatus = NDIS_STATUS_SUCCESS;
    
      // fall through to completion routine with oiNew->Status 
      // set to !NDIS_STATUS_PENDING
    
    default:
      PacketBindAdapterComplete(oiNew, *pStatus, ErrorStatus);
      break;
  }
}
コード例 #20
0
ファイル: lpc3250_NDIS_Init.c プロジェクト: blueskycoco/d5
/*
 Function Name : 	LPC3xxx_MiniportInitialize
 Description   :	
					Called by the NDIS Wrapper to initialize the adapter. 
						0. Verify the Adapter v/s the driver
						1. Create and initilize the adapter structure
						2. Read and load the registry settings
						3. Initialize the chip
						4. Establish the link
 Parameters    :
					PNDIS_STATUS OpenErrorStatus - Additional error status, if return value is error
					       PUINT MediumIndex	 - specifies the medium type the driver or its network adapter uses
					PNDIS_MEDIUM MediumArray	 - Specifies an array of NdisMediumXXX values from which 
													MiniportInitialize selects one that its network adapter supports 
													or that the driver supports as an interface to higher-level drivers. 

						    UINT MediumArraySize - Specifies the number of elements at MediumArray
					 NDIS_HANDLE AdapterHandle   - Specifies a handle identifying the miniport’s network adapter, 
													which is assigned by the NDIS library
					 NDIS_HANDLE ConfigurationContext - Specifies a handle used only during initialization for 
														 calls to NdisXXX configuration and initialization functions

 Return Value  :
					NDIS_STATUS		Status
			
*/
NDIS_STATUS LPC3xxx_MiniportInitialize(	PNDIS_STATUS	pOpenErrorStatus,
										PUINT			pMediumIndex,
										PNDIS_MEDIUM	pMediumArray,
										UINT			nMediumArraySize,
										NDIS_HANDLE		hAdapterHandle,
										NDIS_HANDLE		hConfigurationContext)
{
	NDIS_STATUS         Status = NDIS_STATUS_SUCCESS;
	UINT                nArrayIndex;
	PMINIPORT_ADAPTER   pAdapter;
	PHYSICAL_ADDRESS pa;

	DEBUGMSG(ZONE_INIT, (TEXT("LPC3xxx NDIS ==> MiniportInitialize\r\n")));

	//Check for the supported 802.3 media
	for(nArrayIndex = 0; nArrayIndex < nMediumArraySize; nArrayIndex++)
	{
		if(NdisMedium802_3 == pMediumArray[nArrayIndex])
			break;
	}

    if(nArrayIndex == nMediumArraySize)
    {
		DEBUGMSG(ZONE_INIT | ZONE_ERROR, (TEXT("LPC3xxx NDIS :  ERROR - No Supported Media types \r\n")));
        DEBUGMSG(ZONE_INIT | ZONE_ERROR, (TEXT("LPC3xxx NDIS <== MiniportInitialize  \r\n")));
        return(NDIS_STATUS_UNSUPPORTED_MEDIA);
    }

    *pMediumIndex = nArrayIndex;

	//Allocate memory for the adapter structure
	Status = NdisAllocateMemory((PVOID *) &pAdapter, MINIPORT_ADAPTER_SIZE, 0, HighestAcceptedMax);

    if(Status != NDIS_STATUS_SUCCESS)
    {
        DEBUGMSG(ZONE_INIT | ZONE_ERROR, (TEXT("LPC3xxx NDIS:   ERROR - No Memory for Adapter Structure!\r\n")));
		DEBUGMSG(ZONE_INIT | ZONE_ERROR, (TEXT("LPC3xxx NDIS <== MiniPort Initialize\r\n")));
        return(NDIS_STATUS_RESOURCES);
    }
    NdisZeroMemory(pAdapter, MINIPORT_ADAPTER_SIZE); //Clean it up

//Set up the default values
	pAdapter->hAdapter			= hAdapterHandle;
	pAdapter->eState			= INITIALIZING_STATE;
	pAdapter->IsInterruptSet	= FALSE;
	pAdapter->IsPortRegistered	= FALSE;

	pAdapter->dwIRQNumber		= -1;
	pAdapter->bMediaConnected	= FALSE;
	pAdapter->bAutoNeg			= TRUE;		//	Autoneg per default (overriden by registry settings)
	pAdapter->bFullDuplex		= TRUE;		//	Full duplex per default
	pAdapter->b100Mbps			= TRUE;		//	100 Mbps per default
	pAdapter->bRMII				= TRUE;		//	RMII interface per default

	//Setup Receive control Register
	pAdapter->bPerfectMatch		= TRUE;		//	We want to receive the frames for this station
	pAdapter->bPromiscuous		= FALSE;	//	Not in Promescuous mode per default
	pAdapter->bRxBroadcast		= TRUE;		//	We do forward the broadcasted frames (DHCP required at least)
	pAdapter->bRxMulticastHash	= TRUE;		//	We forward matched multicast frames
	pAdapter->bRxMulticastAll	= FALSE;	//	We do not forward all multicast frames
	pAdapter->bRxUnicastHash	= TRUE;	//	We do not forward matched unicast frames
	pAdapter->bRxUnicastAll		= TRUE;	//	We do not forward all unicast frames

	pAdapter->dwBufferPhyAddr	= 0;
	pAdapter->dwTxStrides		= 0;
	pAdapter->dwRxStrides		= 0;
	pAdapter->dwControllerAddress	= 0;

	pAdapter->pEMACRegs		= NULL;
	pAdapter->dwEMACBuffersSize = 0;
	pAdapter->pPATXDesc		= 0;
	pAdapter->pPARXDesc		= 0;
	pAdapter->pPATXBuffer	= 0;
	pAdapter->pPARXBuffer	= 0;
	pAdapter->pPATXStatus	= 0;
	pAdapter->pPARXStatus	= 0;
	pAdapter->pVAEMACBuffers= NULL;
	pAdapter->pVATXDesc		= NULL;
	pAdapter->pVARXDesc		= NULL;
	pAdapter->pVATXStatus	= NULL;
	pAdapter->pVARXStatus	= NULL;

	//Allocate memory for the LookAhead buffer
	pAdapter->dwLookAheadBufferSize = MAX_FRAME_SIZE;
	Status = NdisAllocateMemory((PVOID *) &pAdapter->pVALookAheadBuffer, pAdapter->dwLookAheadBufferSize, 0, HighestAcceptedMax);

    if(Status != NDIS_STATUS_SUCCESS)
    {
		DEBUGMSG(ZONE_INIT, (TEXT("LPC3xxx NDIS: ERROR - No Memory for LookAhead buffer!\r\n")));
		DEBUGMSG(ZONE_INIT, (TEXT("LPC3xxx NDIS <== MiniPort Initialize\r\n")));
        BackOut(pAdapter);
        return(NDIS_STATUS_RESOURCES);
    }
    NdisZeroMemory(pAdapter->pVALookAheadBuffer, pAdapter->dwLookAheadBufferSize); //Clean it up

	pAdapter->MACAddress[0]	= 0x02;
	pAdapter->MACAddress[1]	= 0x03;
	pAdapter->MACAddress[2]	= 0x04;
	pAdapter->MACAddress[3]	= 0x06;
	pAdapter->MACAddress[4]	= 0x06;
	pAdapter->MACAddress[5]	= 0x08;

	//Get the adapter information from the registry
	Status = GetRegistrySettings(pAdapter, hConfigurationContext);
	if(Status != NDIS_STATUS_SUCCESS)
    {
        DEBUGMSG(ZONE_INIT, (TEXT("LPC3xxx NDIS: ERROR - Configure Adapter failed!\r\n")));
		DEBUGMSG(ZONE_INIT, (TEXT("LPC3xxx NDIS <== MiniPort Initialize\r\n")));
        BackOut(pAdapter);
        return(NDIS_STATUS_FAILURE);
    }

	//	Allocate the memory for Buffers

	//		Computing required space
	pAdapter->dwEMACBuffersSize = pAdapter->dwRxStrides * (	  sizeof(LPCS_ETH_DESC)
															+ sizeof(LPCS_ETH_RX_STATUS)
															+ MAX_FRAME_SIZE)
								+ pAdapter->dwTxStrides * (	  sizeof(LPCS_ETH_DESC) 
															+ sizeof(LPCS_ETH_TX_STATUS)
															+ MAX_FRAME_SIZE);

	//		Allocating space
	pAdapter->pVAEMACBuffers = MapRegisters (pAdapter->dwBufferPhyAddr,
											pAdapter->dwEMACBuffersSize);

	if(pAdapter->pVAEMACBuffers == NULL)
    {
        RETAILMSG(1, (TEXT("LPC3xxx NDIS:ERROR : Can't Allocate Buffer!\r\n")));
		BackOut(pAdapter);
		DEBUGMSG(ZONE_INIT, (TEXT("LPC3xxx NDIS:<== MiniPort Initialize FAILED !!\r\n")));
        return(NDIS_STATUS_RESOURCES);
    }

	DEBUGMSG(ZONE_INIT, (TEXT("LPC3xxx NDIS:Allocated DMA Buffers Successfully!\r\n")));

	//		Splitting allocated buffers into smaller areas
	//			Physical Addresses
	pAdapter->pPARXDesc		= pAdapter->dwBufferPhyAddr;
	pAdapter->pPARXStatus	= pAdapter->pPARXDesc	+ pAdapter->dwRxStrides * sizeof(LPCS_ETH_DESC);
	pAdapter->pPATXDesc		= pAdapter->pPARXStatus + pAdapter->dwRxStrides * sizeof(LPCS_ETH_RX_STATUS);
	pAdapter->pPATXStatus	= pAdapter->pPATXDesc	+ pAdapter->dwTxStrides * sizeof(LPCS_ETH_DESC);
	pAdapter->pPARXBuffer	= pAdapter->pPATXStatus	+ pAdapter->dwTxStrides * sizeof(LPCS_ETH_TX_STATUS);
	pAdapter->pPATXBuffer	= pAdapter->pPARXBuffer	+ pAdapter->dwRxStrides * MAX_FRAME_SIZE;
	//			Virtual Addresses
	pAdapter->pVARXDesc		= pAdapter->pVAEMACBuffers;
	pAdapter->pVARXStatus	= (PVOID)((DWORD)pAdapter->pVARXDesc	+ pAdapter->dwRxStrides * sizeof(LPCS_ETH_DESC));
	pAdapter->pVATXDesc		= (PVOID)((DWORD)pAdapter->pVARXStatus	+ pAdapter->dwRxStrides * sizeof(LPCS_ETH_RX_STATUS));
	pAdapter->pVATXStatus	= (PVOID)((DWORD)pAdapter->pVATXDesc	+ pAdapter->dwTxStrides * sizeof(LPCS_ETH_DESC));
	pAdapter->pVARXBuffer	= (PVOID)((DWORD)pAdapter->pVATXStatus	+ pAdapter->dwTxStrides * sizeof(LPCS_ETH_TX_STATUS));
	pAdapter->pVATXBuffer	= (PVOID)((DWORD)pAdapter->pVARXBuffer	+ pAdapter->dwRxStrides * MAX_FRAME_SIZE);

	//	Allocating the TX Packet buffer
	Status = NdisAllocateMemory((PVOID *) &pAdapter->pTXPackets, sizeof(TX_PACKET) * pAdapter->dwTxStrides, 0, HighestAcceptedMax);
    if(Status != NDIS_STATUS_SUCCESS)
    {
		DEBUGMSG(ZONE_INIT, (TEXT("LPC3xxx NDIS: ERROR - No Memory for TXBuffers buffer!\r\n")));
		DEBUGMSG(ZONE_INIT, (TEXT("LPC3xxx NDIS <== MiniPort Initialize\r\n")));
        BackOut(pAdapter);
        return(NDIS_STATUS_RESOURCES);
    }
	NdisZeroMemory(pAdapter->pTXPackets, sizeof(TX_PACKET) * pAdapter->dwTxStrides); //Clean it up

	//Register the interrupt
	NdisMSetAttributes(pAdapter->hAdapter, (NDIS_HANDLE) pAdapter, TRUE, NdisInterfaceInternal);
	Status = NdisMRegisterInterrupt(&pAdapter->InterruptInfo,
									pAdapter->hAdapter,
									pAdapter->dwIRQNumber,
									0,
									TRUE,
									FALSE,
									NdisInterruptLatched);

	if(Status != NDIS_STATUS_SUCCESS)
    {
        DEBUGMSG(ZONE_INIT, (TEXT("LPC3xxx NDIS : ERROR - Can't Attach to Interrupt!\r\n")));
		BackOut(pAdapter);
		DEBUGMSG(ZONE_INIT, (TEXT("LPC3xxx NDIS:<== MiniPort Initialize\r\n")));
        return(Status);
    }
	else
		DEBUGMSG(ZONE_INIT, (TEXT("LPC3xxx NDIS: Interrupt Registered !!! \r\n")));

	pAdapter->IsInterruptSet = TRUE;

	//Register the IOBase address. Modify this code according to the platform
	Status = NdisMRegisterIoPortRange((PVOID *) &(pAdapter->pEMACRegs),
			pAdapter->hAdapter,
			pAdapter->dwControllerAddress,
			sizeof(ETHERNET_REGS_T));
	if(Status != NDIS_STATUS_SUCCESS)
	{
		RETAILMSG(1, (TEXT("LAN91C9111 : ERROR - Can't Register I/O Port Range!\r\n")));
		DEBUGMSG(ZONE_INIT, (TEXT("LAN91C9111 <== MiniPort Initialize\r\n")));
        BackOut(pAdapter);
		return(NDIS_STATUS_RESOURCES);
	}

	pAdapter->IsPortRegistered = TRUE;

	//EnablePeriphClock(ETHERNET);
	pa.QuadPart = CLK_PM_BASE;
	n_pCLKPWRRegs = (CLKPWR_REGS_T *)
		MmMapIoSpace(pa, sizeof (CLKPWR_REGS_T), FALSE);
	
	if (n_pCLKPWRRegs == NULL)
	{
		RETAILMSG(1, (_T("LCD: lpc32xx_hw_init: Critcal error: cannot map registers!\r\n")));
		MmUnmapIoSpace(n_pCLKPWRRegs, sizeof(CLKPWR_REGS_T));
		return;
	}

	n_pCLKPWRRegs->clkpwr_macclk_ctrl = CLKPWR_MACCTRL_HRCCLK_EN|
										CLKPWR_MACCTRL_MMIOCLK_EN|
										CLKPWR_MACCTRL_DMACLK_EN|
										CLKPWR_MACCTRL_USE_RMII_PINS;
	//	//	Initialize Tx and Rx DMA Descriptors
	//DEBUGMSG(ZONE_INIT, (L"LPC_EthInit: Initializing Descriptor engine\r\n"));
	//EMAC_InitEngine(pAdapter);

	if(!HardReset(pAdapter))
	{
		return NDIS_STATUS_FAILURE;
	}

	DEBUGMSG(ZONE_INIT, (TEXT("LPC3xxx NDIS <== MiniportInitialize  \r\n")));

	//Ready

	return NDIS_STATUS_SUCCESS;
}
コード例 #21
0
ファイル: ltinit.c プロジェクト: BillTheBest/WinNT4
NDIS_STATUS
LtInitOpenAdapter(
	OUT PNDIS_STATUS 	OperErrorStatus,
	OUT NDIS_HANDLE 	*MacBindingHandle,
	OUT PUINT 			SelectedMediumIndex,
	IN 	PNDIS_MEDIUM 	MediumArray,
	IN 	UINT 			MediumArraySize,
	IN 	NDIS_HANDLE 	NdisBindingContext,
	IN 	NDIS_HANDLE 	MacAdapterContext,
	IN 	UINT 			OpenOptions,
	IN 	PSTRING 		AddressingInformation
	)
/*++

Routine Description:

	Called by ndis when a protocol attempts to bind to us.

Arguments:

	As described in the NDIS 3.0 Spec.

Return Value:

	NDIS_STATUS_SUCCESSFUL	: If ok, error otherwise

--*/
{

	UINT 		i;
	PLT_OPEN 	NewOpen;

	PLT_ADAPTER Adapter 		= (PLT_ADAPTER)MacAdapterContext;
	NDIS_STATUS StatusToReturn 	= NDIS_STATUS_SUCCESS;

	// if the adapter is being closed, then do not allow the open
	LtReferenceAdapter(Adapter, &StatusToReturn);
	if (StatusToReturn != NDIS_STATUS_SUCCESS)
	{
		ASSERTMSG("LtInitOpenAdapter: Adapter is closing down!\n", 0);
		return(StatusToReturn);
	}

	do
	{
		DBGPRINT(DBG_COMP_INIT, DBG_LEVEL_INFO,
				("LtInitOpenAdapter Entered:\n"));
	
		// Search thru the supplied MediumArray for NdisMediumLocalTalk
		for (i = 0; i < MediumArraySize; i++)
		{
			if (MediumArray[i] == NdisMediumLocalTalk)
			{
				break;
			}
		}
	
		if (i == MediumArraySize)
		{
			StatusToReturn = NDIS_STATUS_UNSUPPORTED_MEDIA;
			break;
		}
	
		*SelectedMediumIndex = i;

		// Allocate some space for the open binding.
		NdisAllocateMemory(
			(PVOID)&NewOpen,
			(UINT)sizeof(LT_OPEN),
			(UINT)0,
			LtNdisPhyAddr);
	
		if (NewOpen == NULL)
		{
			StatusToReturn = NDIS_STATUS_RESOURCES;

			//	NdisWriteErrorLogEntry();
			TMPLOGERR();
			break;
		}
	
		NdisZeroMemory(
			NewOpen,
			sizeof(LT_OPEN));
		
		*MacBindingHandle 				= (NDIS_HANDLE)NewOpen;
		NewOpen->NdisBindingContext 	= NdisBindingContext;
		NewOpen->Flags 					|= BINDING_OPEN;
		NewOpen->LtAdapter 				= Adapter;

		//	Set the creation reference
		NewOpen->RefCount 		= 1;
		InitializeListHead(&NewOpen->Linkage);

		//	Insert into adapter list and increment adapter open count.
		NdisAcquireSpinLock(&Adapter->Lock);
		InsertTailList(&Adapter->OpenBindings, &NewOpen->Linkage);
		Adapter->OpenCount++;
		NdisReleaseSpinLock(&Adapter->Lock);
		
	} while (FALSE);

	if (StatusToReturn != NDIS_STATUS_SUCCESS)
	{
		LtDeReferenceAdapter(Adapter);
	}

	return StatusToReturn;
}
コード例 #22
0
ファイル: ltinit.c プロジェクト: BillTheBest/WinNT4
NDIS_STATUS
LtInitRegisterAdapter(
	IN NDIS_HANDLE 			LtMacHandle,
	IN NDIS_HANDLE 			WrapperConfigurationContext,
	IN PNDIS_STRING 		AdapterName,
	IN NDIS_INTERFACE_TYPE 	BusType,
	IN UCHAR				SuggestedNodeId,
	IN UINT 				IoBaseAddress,
	IN UINT 				MaxAdapters,
	IN NDIS_STATUS			ConfigError
	)
/*++

Routine Description:

	This routine (and its interface) are not portable.  They are
	defined by the OS, the architecture, and the particular Lt
	implementation.

	This routine is responsible for the allocation of the datastructures
	for the driver as well as any hardware specific details necessary
	to talk with the device.

Arguments:

	LtMacHandle		:	The handle given back to the mac from ndis when
						the mac registered itself.

	WrapperConfigurationContext
					:	configuration context passed in by NDIS in the AddAdapter
						call.

	AdapterName		:	The string containing the name to give to the device adapter.
	BusType 		:	The type of bus in use. (MCA, ISA, EISA ...)
	IoBaseAddress 	:	The base IO address of the card.
	MaxAdapters 	:	The maximum number of opens at any one time.
	ConfigError		:	Error with the Config parameters if any.

Return Value:

	NDIS_STATUS_SUCCESS	: 	If successful, error otherwise.

--*/
{
	// Pointer for the adapter root.
	PLT_ADAPTER 	Adapter;
	NDIS_STATUS 	Status, RefStatus;
	NDIS_ERROR_CODE	LogErrorCode;

	// Holds information needed when registering the adapter.
	NDIS_ADAPTER_INFORMATION AdapterInformation;

	// Allocate the Adapter block.
	NdisAllocateMemory(
		(PVOID)&Adapter,
		sizeof(LT_ADAPTER),
		0,
		LtNdisPhyAddr);

	if (Adapter == NULL)
	{
		return(NDIS_STATUS_RESOURCES);
	}

	NdisZeroMemory(
		Adapter,
		sizeof(LT_ADAPTER));

	Adapter->NdisMacHandle = LtMacHandle;

	// Set up the AdapterInformation structure.
	NdisZeroMemory (&AdapterInformation, sizeof(NDIS_ADAPTER_INFORMATION));

	AdapterInformation.DmaChannel 						= 0;
	AdapterInformation.Master 							= FALSE ;
	AdapterInformation.Dma32BitAddresses 				= FALSE ;
	AdapterInformation.AdapterType 						= BusType ;
	AdapterInformation.PhysicalMapRegistersNeeded 		= 0;
	AdapterInformation.MaximumPhysicalMapping 			= 0;
	AdapterInformation.NumberOfPortDescriptors 			= 1 ;
	AdapterInformation.PortDescriptors[0].InitialPort 	= IoBaseAddress;
	AdapterInformation.PortDescriptors[0].NumberOfPorts	= 4;
	AdapterInformation.PortDescriptors[0].PortOffset	= (PVOID *)(&(Adapter->MappedIoBaseAddr));

	DBGPRINT(DBG_COMP_INIT, DBG_LEVEL_ERR,
			("LtInitRegisterAdapter: IoBaseAddr %lx\n", IoBaseAddress));

	// Register the adapter with NDIS.
	if ((Status = NdisRegisterAdapter(
						&Adapter->NdisAdapterHandle,
						Adapter->NdisMacHandle,
						Adapter,
						WrapperConfigurationContext,
						AdapterName,
						&AdapterInformation)) != NDIS_STATUS_SUCCESS)
	{
		//	Could not register the adapter, so we cannot log any errors
		//	either.
		DBGPRINT(DBG_COMP_INIT, DBG_LEVEL_FATAL,
				("LtInitRegisterAdapter: Failed %lx\n", Status));

		//	Free up the memory allocated.
		NdisFreeMemory(
			Adapter,
			sizeof(LT_ADAPTER),
			0);

		return(Status);
	}

	DBGPRINT(DBG_COMP_INIT, DBG_LEVEL_ERR,
			("LtInitRegisterAdapter: MappedIoBaseAddr %lx\n", Adapter->MappedIoBaseAddr));

	do
	{
		//	Ok. We are all set.
		Adapter->BusType 		= BusType;

		InitializeListHead(&Adapter->Request);
		InitializeListHead(&Adapter->OpenBindings);

		InitializeListHead(&Adapter->LoopBack);
		InitializeListHead(&Adapter->Transmit);
		InitializeListHead(&Adapter->Receive);

		NdisAllocateSpinLock(&Adapter->Lock);

		Adapter->OpenCount 	= 0;

		//	Set refcount to 1 - creation
		Adapter->RefCount	= 1;	

		NdisInitializeTimer(
			&Adapter->PollingTimer,
			LtTimerPoll,
			(PVOID)Adapter);

		//	If there were no configuration errors, then go ahead with the
		//	initialize.

		if (ConfigError == NDIS_STATUS_SUCCESS)
		{
			// Start the card up. This writes an error
			// log entry if it fails.
			if (LtFirmInitialize(Adapter, SuggestedNodeId))
			{
				//	Ok, the firmware code has been downloaded to the card.
				//	Start the poll timer. We should do this before we call
				//	GetAddress. Add a reference for the timer.
				NdisAcquireSpinLock(&Adapter->Lock);
				LtReferenceAdapterNonInterlock(Adapter, &RefStatus);

				ASSERTMSG("LtInitRegisterAdapter: RefAdater Failed!\n",
						 (RefStatus == NDIS_STATUS_SUCCESS));

				Adapter->Flags |= ADAPTER_TIMER_QUEUED;
				NdisSetTimer(&Adapter->PollingTimer, LT_POLLING_TIME);
				NdisReleaseSpinLock(&Adapter->Lock);
				break;
			}

			LogErrorCode = NDIS_ERROR_CODE_HARDWARE_FAILURE;

		}
		else
		{
			LogErrorCode = NDIS_ERROR_CODE_MISSING_CONFIGURATION_PARAMETER;
		}


		//	We either could not initialize the hardware or get the node
		//	address. OR there was a config error. Log it and deregister
		//	the adapter.
		LOGERROR(Adapter->NdisAdapterHandle, LogErrorCode);

		//	Deregister the adapter. This calls LtInitRemoveAdapter which
		//	will do all necessary cleanup.
		NdisDeregisterAdapter(Adapter->NdisAdapterHandle);
				
		Status = NDIS_STATUS_FAILURE;
		break;

	} while (FALSE);

	return(Status);
}
コード例 #23
0
ファイル: afilter.c プロジェクト: BillTheBest/WinNT4
BOOLEAN
ArcNoteFilterOpenAdapter(
    IN PARC_FILTER Filter,
    IN NDIS_HANDLE MacBindingHandle,
    IN NDIS_HANDLE NdisBindingContext,
    OUT PNDIS_HANDLE NdisFilterHandle
    )

/*++

Routine Description:

    This routine is used to add a new binding to the filter database.

    NOTE: THIS ROUTINE ASSUMES THAT THE DATABASE IS LOCKED WHEN
    IT IS CALLED.

Arguments:

    Filter - A pointer to the previously created and initialized filter
    database.

    MacBindingHandle - The MAC supplied value to the protocol in response
    to a call to NdisOpenAdapter.

    NdisBindingContext - An NDIS supplied value to the call to NdisOpenAdapter.

    NdisFilterHandle - A pointer to this open.

Return Value:

    Will return false if creating a new filter index will cause the maximum
    number of filter indexes to be exceeded.

--*/

{

    //
    // Will hold the value of the filter index so that we
    // need not indirectly address through pointer parameter.
    //
    UINT LocalIndex;

    NDIS_STATUS AllocStatus;

    //
    // Pointer to new open block.
    //
    PARC_BINDING_INFO LocalOpen;


    //
    // Get the first free binding slot and remove that slot from
    // the free list.  We check to see if the list is empty.
    //


    if (Filter->FreeBindingMask == 0) {

        return FALSE;

    }

    AllocStatus = NdisAllocateMemory(
        &LocalOpen,
        sizeof(ARC_BINDING_INFO),
        0,
        HighestAcceptableMax
        );

    if (AllocStatus != NDIS_STATUS_SUCCESS) {

        return FALSE;

    }

    //
    // Get place for the open and insert it.
    //

    ARC_FILTER_ALLOC_OPEN(Filter, &LocalIndex);

    LocalOpen->NextOpen = Filter->OpenList;

    if (Filter->OpenList != NULL) {
        Filter->OpenList->PrevOpen = LocalOpen;
    }

    LocalOpen->PrevOpen = NULL;

    Filter->OpenList = LocalOpen;

    LocalOpen->FilterIndex = (UCHAR)LocalIndex;
    LocalOpen->References = 1;
    LocalOpen->MacBindingHandle = MacBindingHandle;
    LocalOpen->NdisBindingContext = NdisBindingContext;
    LocalOpen->PacketFilters = 0;
    LocalOpen->ReceivedAPacket = FALSE;

    *NdisFilterHandle = (NDIS_HANDLE)LocalOpen;

    return TRUE;

}
コード例 #24
0
ファイル: init.c プロジェクト: BillTheBest/WinNT4
VOID
NdisOpenGlobalConfiguration(
	OUT PNDIS_STATUS				Status,
	IN	PNDIS_HANDLE				NdisWrapperHandle,
	OUT PNDIS_HANDLE				ConfigurationHandle
	)
/*++

Routine Description:

	This routine is used to open global (as opposed to per-adapter) configuration key for an adapter.

Arguments:

	Status - Returns the status of the request.

	WrapperHandle - Handle returned by NdisInitializeWrapper.

	ConfigurationHandle - Handle returned. Points to the global parameter subkey.

Return Value:

	None.

--*/
{
	PNDIS_WRAPPER_HANDLE WrapperHandle = (PNDIS_WRAPPER_HANDLE)NdisWrapperHandle;
	PNDIS_CONFIGURATION_HANDLE HandleToReturn;
	PNDIS_WRAPPER_CONFIGURATION_HANDLE ConfigHandle;
	UNICODE_STRING	Us, Params;
	PWSTR pWch;
	USHORT i;

	//
	// Extract the base name from the reg path and setup for open config handle
	//
	Us = *(PUNICODE_STRING)(WrapperHandle->NdisWrapperConfigurationHandle);
	RtlInitUnicodeString(&Params, L"\\Parameters");
	for (i = Us.Length/sizeof(WCHAR), pWch = Us.Buffer + i - 1;
		 i > 0;
		 pWch --, i--)
	{
		if (*pWch == L'\\')
		{
			Us.Buffer = pWch + 1;
			Us.Length -= i*sizeof(WCHAR);
			Us.MaximumLength = Us.Length + Params.Length + sizeof(WCHAR);
			break;
		}
	}

	//
	// Allocate the configuration handle
	//
	*Status = NdisAllocateMemory((PVOID *)&HandleToReturn,
								 sizeof(NDIS_CONFIGURATION_HANDLE) +
									sizeof(NDIS_WRAPPER_CONFIGURATION_HANDLE) +
									Us.MaximumLength,
								 0,
								 HighestAcceptableMax);

	if (*Status == NDIS_STATUS_SUCCESS)
	{
#define	PQueryTable	ConfigHandle->ParametersQueryTable
		NdisZeroMemory(HandleToReturn,
					   sizeof(NDIS_CONFIGURATION_HANDLE) + sizeof(NDIS_WRAPPER_CONFIGURATION_HANDLE) + Us.MaximumLength);
		ConfigHandle = (PNDIS_WRAPPER_CONFIGURATION_HANDLE)((PUCHAR)HandleToReturn + sizeof(NDIS_CONFIGURATION_HANDLE));
		pWch = (PWSTR)((PUCHAR)ConfigHandle + sizeof(NDIS_WRAPPER_CONFIGURATION_HANDLE));
		NdisMoveMemory(pWch, Us.Buffer, Us.Length);
		Us.Buffer = pWch;
		RtlAppendUnicodeStringToString(&Us, &Params);
		HandleToReturn->KeyQueryTable = ConfigHandle->ParametersQueryTable;
		HandleToReturn->ParameterList = NULL;

		//
		// Setup the query-table appropriately
		//
		PQueryTable[0].QueryRoutine = ndisSaveParameters;
		PQueryTable[0].Flags = RTL_QUERY_REGISTRY_REQUIRED | RTL_QUERY_REGISTRY_NOEXPAND;
		PQueryTable[0].DefaultType = REG_NONE;

		//
		// The following fields are filled in during NdisReadConfiguration
		//
		// PQueryTable[0].Name = KeywordBuffer;
		// PQueryTable[0].EntryContext = ParameterValue;

		//
		// NOTE: Some fields in ParametersQueryTable[3 & 4] are used to
		// store information for later retrieval.
		//
		PQueryTable[3].Name = pWch;

		*ConfigurationHandle = (NDIS_HANDLE)HandleToReturn;
#undef	PQueryTable
	}
}
コード例 #25
0
ファイル: init.c プロジェクト: BillTheBest/WinNT4
NTSTATUS
ndisSaveParameters(
	IN PWSTR						ValueName,
	IN ULONG						ValueType,
	IN PVOID 						ValueData,
	IN ULONG						ValueLength,
	IN PVOID						Context,
	IN PVOID						EntryContext
	)
/*++

Routine Description:

	This routine is a callback routine for RtlQueryRegistryValues
	It is called with the value for a specified parameter. It allocates
	memory to hold the data and copies it over.

Arguments:

	ValueName - The name of the value (ignored).

	ValueType - The type of the value.

	ValueData - The null-terminated data for the value.

	ValueLength - The length of ValueData.

	Context - Points to the head of the parameter chain.

	EntryContext - A pointer to

Return Value:

	STATUS_SUCCESS

--*/
{
	NDIS_STATUS Status;

	//
	// Obtain the actual configuration handle structure
	//
	PNDIS_CONFIGURATION_HANDLE NdisConfigHandle = (PNDIS_CONFIGURATION_HANDLE)Context;

	//
	// Where the user wants a pointer returned to the data.
	//
	PNDIS_CONFIGURATION_PARAMETER *ParameterValue = (PNDIS_CONFIGURATION_PARAMETER *)EntryContext;

	//
	// Use this to link parameters allocated to this open
	//
	PNDIS_CONFIGURATION_PARAMETER_QUEUE ParameterNode;

	//
	// Size of memory to allocate for parameter node
	//
	UINT	Size;

	//
	// Allocate our parameter node
	//
	Size = sizeof(NDIS_CONFIGURATION_PARAMETER_QUEUE);
	if ((ValueType == REG_SZ) || (ValueType == REG_MULTI_SZ) || (ValueType == REG_BINARY))
	{
		Size += ValueLength;
	}
	Status = NdisAllocateMemory((PVOID*)&ParameterNode,
								Size,
								0,
								HighestAcceptableMax);

	if (Status != NDIS_STATUS_SUCCESS)
	{
		return (NTSTATUS)Status;
	}


	*ParameterValue = &ParameterNode->Parameter;

	//
	// Map registry datatypes to ndis data types
	//
	if (ValueType == REG_DWORD)
	{
		//
		// The registry says that the data is in a dword boundary.
		//
		(*ParameterValue)->ParameterType = NdisParameterInteger;
		(*ParameterValue)->ParameterData.IntegerData = *((PULONG) ValueData);
	}
	else if ((ValueType == REG_SZ) || (ValueType == REG_MULTI_SZ))
	{
		(*ParameterValue)->ParameterType =
			(ValueType == REG_SZ) ? NdisParameterString : NdisParameterMultiString;

		(*ParameterValue)->ParameterData.StringData.Buffer = (PWSTR)((PUCHAR)ParameterNode + sizeof(NDIS_CONFIGURATION_PARAMETER_QUEUE));

		CopyMemory((*ParameterValue)->ParameterData.StringData.Buffer,
				   ValueData,
				   ValueLength);
		(*ParameterValue)->ParameterData.StringData.Length = (USHORT)ValueLength;
		(*ParameterValue)->ParameterData.StringData.MaximumLength = (USHORT)ValueLength;

		//
		// Special fix; if a string ends in a NULL and that is included
		// in the length, remove it.
		//
		if (ValueType == REG_SZ)
		{
			if ((((PUCHAR)ValueData)[ValueLength-1] == 0) &&
				(((PUCHAR)ValueData)[ValueLength-2] == 0))
			{
				(*ParameterValue)->ParameterData.StringData.Length -= 2;
			}
		}
	}
	else if (ValueType == REG_BINARY)
	{
		(*ParameterValue)->ParameterType = NdisParameterBinary;
		(*ParameterValue)->ParameterData.BinaryData.Buffer = ValueData;
		(*ParameterValue)->ParameterData.BinaryData.Length = (USHORT)ValueLength;
	}
	else
	{
		NdisFreeMemory(ParameterNode,
					   sizeof(NDIS_CONFIGURATION_PARAMETER_QUEUE),
					   0);

		return STATUS_OBJECT_NAME_NOT_FOUND;
	}

	//
	// Queue this parameter node
	//
	ParameterNode->Next = NdisConfigHandle->ParameterList;
	NdisConfigHandle->ParameterList = ParameterNode;

	return STATUS_SUCCESS;
}
コード例 #26
0
ファイル: init.c プロジェクト: BillTheBest/WinNT4
VOID
NdisReadBindingInformation(
	OUT PNDIS_STATUS				Status,
	OUT PNDIS_STRING *				Binding,
	IN NDIS_HANDLE					ConfigurationHandle
	)
/*++

Routine Description:

	This routine is used to read the binding information for
	this adapter from the configuration database. The value
	returned is a pointer to a string containing the bind
	that matches the export for the current AddAdapter call.

	This function is meant for NDIS drivers that are layered
	on top of other NDIS drivers. Binding would be passed to
	NdisOpenAdapter as the AdapterName.

Arguments:

	Status - Returns the status of the request.

	Binding - Returns the binding data.

	ConfigurationHandle - Handle returned by NdisOpenConfiguration. Points
	to the parameter subkey.

Return Value:

	None.

--*/
{
	//
	// Convert the handle to its real value
	//
	PNDIS_CONFIGURATION_HANDLE NdisConfigHandle = (PNDIS_CONFIGURATION_HANDLE)ConfigurationHandle;

	//
	// Use this to link parameters allocated to this open
	//
	PNDIS_CONFIGURATION_PARAMETER_QUEUE ParameterNode;

	//
	// For layered drivers, this points to the binding. For
	// non-layered drivers, it is NULL. This is set up before
	// the call to AddAdapter.
	//

	do
	{
		if (NdisConfigHandle->KeyQueryTable[3].EntryContext == NULL)
		{
			*Status = NDIS_STATUS_FAILURE;
			break;
		}

		//
		// Allocate our parameter node
		//
		*Status = NdisAllocateMemory((PVOID*)&ParameterNode,
									 sizeof(NDIS_CONFIGURATION_PARAMETER_QUEUE),
									 0,
									 HighestAcceptableMax);

		if (*Status != NDIS_STATUS_SUCCESS)
		{
			break;
		}

		//
		// We set this to Integer because if we set it to String
		// then CloseConfiguration would try to free the string,
		// which we don't want.
		//

		ParameterNode->Parameter.ParameterType = NdisParameterInteger;

		RtlInitUnicodeString(&ParameterNode->Parameter.ParameterData.StringData,
							 NdisConfigHandle->KeyQueryTable[3].EntryContext);

		//
		// Queue this parameter node
		//

		ParameterNode->Next = NdisConfigHandle->ParameterList;
		NdisConfigHandle->ParameterList = ParameterNode;

		*Binding = &ParameterNode->Parameter.ParameterData.StringData;
		*Status = NDIS_STATUS_SUCCESS;
	} while (FALSE);
}
コード例 #27
0
ファイル: afilter.c プロジェクト: BillTheBest/WinNT4
NDIS_STATUS
ArcAllocateBuffers(
    IN PARC_FILTER Filter
    )
/*++

Routine Description:

    This routine allocates Receive buffers for the filter database.

Arguments:

    Filter - The filter db to allocate for.

Returns:

    NDIS_STATUS_SUCCESS if any buffer was allocated.

--*/
{
    ULONG i;
    PARC_BUFFER_LIST Buffer;
    PVOID DataBuffer;

    for (i = ARC_BUFFER_ALLOCATION_UNIT; i != 0 ; i--) {

        NdisAllocateMemory((PVOID)&Buffer,
                           sizeof(ARC_BUFFER_LIST),
                           0,
                           HighestAcceptableMax
                          );

        if (Buffer == NULL) {

            if (i == ARC_BUFFER_ALLOCATION_UNIT) {
                return(NDIS_STATUS_FAILURE);
            }

            return(NDIS_STATUS_SUCCESS);

        }

        NdisAllocateMemory((PVOID)&DataBuffer,
                           ARC_BUFFER_SIZE,
                           0,
                           HighestAcceptableMax
                          );

        if (DataBuffer == NULL) {

            NdisFreeMemory(Buffer, sizeof(ARC_BUFFER_LIST), 0);

            if (i == ARC_BUFFER_ALLOCATION_UNIT) {
                return(NDIS_STATUS_FAILURE);
            }

            //
            // We allocated some packets, that is good enough for now
            //
            return(NDIS_STATUS_SUCCESS);

        }

        Buffer->BytesLeft = Buffer->Size = ARC_BUFFER_SIZE;
        Buffer->Buffer = DataBuffer;
        Buffer->Next = Filter->FreeBufferList;
        Filter->FreeBufferList = Buffer;

    }

    return(NDIS_STATUS_SUCCESS);

}
コード例 #28
0
ファイル: init.c プロジェクト: BillTheBest/WinNT4
VOID
NdisOpenConfigurationKeyByName(
	OUT PNDIS_STATUS				Status,
	IN	PNDIS_HANDLE				ConfigurationHandle,
	IN	PNDIS_STRING				KeyName,
	OUT PNDIS_HANDLE				KeyHandle
	)
/*++

Routine Description:

	This routine is used to open a subkey relative to the configuration handle.

Arguments:

	Status - Returns the status of the request.

	ConfigurationHandle - Handle to an already open section of the registry

	KeyName - Name of the subkey to open

	KeyHandle - Placeholder for the handle to the sub-key.

Return Value:

	None.

--*/
{
	//
	// Handle to be returned
	//
	PNDIS_CONFIGURATION_HANDLE			SKHandle, ConfigHandle = (PNDIS_CONFIGURATION_HANDLE)ConfigurationHandle;
	PNDIS_WRAPPER_CONFIGURATION_HANDLE	WConfigHandle;
	UNICODE_STRING						Parent, Child, Sep;
#define	PQueryTable						WConfigHandle->ParametersQueryTable

	ASSERT (KeGetCurrentIrql() < DISPATCH_LEVEL);

	//
	// Allocate the configuration handle
	//
	RtlInitUnicodeString(&Parent, ConfigHandle->KeyQueryTable[3].Name);
	RtlInitUnicodeString(&Sep, L"\\");
	Child.Length = 0;
	Child.MaximumLength = KeyName->Length + Parent.Length + Sep.Length + sizeof(WCHAR);
	*Status = NdisAllocateMemory((PVOID*)&SKHandle,
								 sizeof(NDIS_CONFIGURATION_HANDLE) +
									sizeof(NDIS_WRAPPER_CONFIGURATION_HANDLE) +
									Child.MaximumLength,
								 0,
								 HighestAcceptableMax);

	if (*Status != NDIS_STATUS_SUCCESS)
	{
		*KeyHandle = (NDIS_HANDLE)NULL;
		return;
	}

	WConfigHandle = (PNDIS_WRAPPER_CONFIGURATION_HANDLE)((PUCHAR)SKHandle + sizeof(NDIS_CONFIGURATION_HANDLE));
	Child.Buffer = (PWSTR)((PUCHAR)WConfigHandle + sizeof(NDIS_WRAPPER_CONFIGURATION_HANDLE));

	RtlCopyUnicodeString(&Child, &Parent);
	RtlAppendUnicodeStringToString(&Child, &Sep);
	RtlAppendUnicodeStringToString(&Child, KeyName);

	SKHandle->KeyQueryTable = WConfigHandle->ParametersQueryTable;


	//
	// 1.
	// Call ndisSaveParameter for a parameter, which will allocate storage for it.
	//
	PQueryTable[0].QueryRoutine = ndisSaveParameters;
	PQueryTable[0].Flags = RTL_QUERY_REGISTRY_REQUIRED | RTL_QUERY_REGISTRY_NOEXPAND;
	PQueryTable[0].DefaultType = REG_NONE;

	//
	// PQueryTable[0].Name and PQueryTable[0].EntryContext
	// are filled in inside ReadConfiguration, in preparation
	// for the callback.
	//
	// PQueryTable[0].Name = KeywordBuffer;
	// PQueryTable[0].EntryContext = ParameterValue;

	//
	// 2.
	// Stop
	//
	PQueryTable[1].QueryRoutine = NULL;
	PQueryTable[1].Flags = 0;
	PQueryTable[1].Name = NULL;

	//
	// NOTE: Some fields in ParametersQueryTable[3] are used to store information for later retrieval.
	//
	PQueryTable[3].QueryRoutine = NULL;
	PQueryTable[3].Name = Child.Buffer;
	PQueryTable[3].EntryContext = NULL;
	PQueryTable[3].DefaultData = NULL;

	SKHandle->ParameterList = NULL;
	*KeyHandle = (NDIS_HANDLE)SKHandle;
#undef	PQueryTable
}
コード例 #29
0
ファイル: ndis.c プロジェクト: svn2github/ndiswrapper
/*
 * Allocate mem.
 *
 * Debug version?
 */
STDCALL unsigned int NdisAllocateMemoryWithTag(void **dest,
	                                       unsigned int length,
					       unsigned int tag)
{
	return NdisAllocateMemory(dest, length, 0, 0);
}
コード例 #30
0
ファイル: Openclos.c プロジェクト: dot-Sean/winpcap
DWORD PacketOpen(PNDIS_STRING AdapterName,DWORD dwDDB,DWORD hDevice,PDIOCPARAMETERS pDiocParms)
{

    LARGE_INTEGER		SystemTime;
    __int64				ltime1;
    PDEVICE_EXTENSION	pde;
    POPEN_INSTANCE 		oiNew;
    NDIS_STATUS			nsErrorStatus, nsOpenStatus;
    UINT           	i;
    UINT           	uiMedium;
    NDIS_STRING		NameStr;
    NDIS_STATUS	Status;


    pde = GlobalDeviceExtension;
    /*Allocate an element that describe an adapter*/
    NdisAllocateMemory( (PVOID *)&oiNew, sizeof( OPEN_INSTANCE ), 0, -1 );
    if ( oiNew == NULL )
    {
        return NDIS_STATUS_FAILURE;
    }
    NdisZeroMemory( (PVOID)oiNew, sizeof( OPEN_INSTANCE ) );
    /*allocate a pool for the packet headers*/

    NdisAllocatePacketPool( &nsErrorStatus,
                            &(oiNew->PacketPool),
                            TRANSMIT_PACKETS,
                            sizeof(PACKET_RESERVED) );

    IF_TRACE_MSG( "PACKET_RESERVED_a :%lx",sizeof(PACKET_RESERVED));
    if ( nsErrorStatus != NDIS_STATUS_SUCCESS )
    {
        IF_TRACE_MSG( "Failed to allocate packet pool AllocStatus=%x", nsErrorStatus );
        NdisFreeMemory( oiNew, sizeof( OPEN_INSTANCE ) ,  0 );
        TRACE_LEAVE( "BindAdapter" );
        return NDIS_STATUS_FAILURE;
    }


    /*allocate a buffer pool for the packet data*/
    NdisAllocateBufferPool( &nsErrorStatus,
                            &(oiNew->BufferPool),
                            TRANSMIT_PACKETS );
    if ( nsErrorStatus != NDIS_STATUS_SUCCESS )
    {
        IF_TRACE_MSG( "Failed to allocate packet pool AllocStatus=%x", nsErrorStatus );
        NdisFreePacketPool( oiNew->PacketPool );
        NdisFreeMemory( oiNew, sizeof( OPEN_INSTANCE ) ,  0 );
        TRACE_LEAVE( "BindAdapter" );
        return NDIS_STATUS_FAILURE;
    }
    NdisAllocateSpinLock( &(oiNew->ResetSpinLock) );
    InitializeListHead( &(oiNew->ResetIrpList) );
    NdisAllocateSpinLock( &(oiNew->RcvQSpinLock) );
    InitializeListHead( &(oiNew->RcvList) );
    NdisAllocateSpinLock( &(oiNew->RequestSpinLock) );
    InitializeListHead( &(oiNew->RequestList) );

    for ( i=0; i<MAX_REQUESTS; i++ )
    {
        InsertTailList( &(oiNew->RequestList), &(oiNew->Requests[i].Reserved.ListElement) );
    }

    oiNew->Status = NDIS_STATUS_PENDING;

    /*initialize the timer variables for this session*/

    SystemTime=GetDate();

    ltime1=((__int64)SystemTime.HighPart*86400);
    ltime1+=(__int64)(SystemTime.LowPart/1000);	//current time from 1980 in seconds
    ltime1+=(__int64)315532800;	//current time from 1970 (Unix format) in seconds
    ltime1*=1193182;
    ltime1+=(SystemTime.LowPart%1000)*1193182/1000; //current time from 1970 in ticks
    ltime1-=QuerySystemTime();	//boot time from 1970 in ticks
    oiNew->StartTime=ltime1;


    oiNew->Dropped=0;		//reset the dropped packets counter
    oiNew->Received=0;		//reset the received packets counter
    oiNew->bpfprogram=NULL;	//set an accept-all filter
    oiNew->bpfprogramlen=0;
    oiNew->BufSize=0;		//set an empty buffer
    oiNew->Buffer=NULL;		//reset the buffer
    oiNew->Bhead=0;
    oiNew->Btail=0;
    oiNew->BLastByte=0;
    oiNew->TimeOut=0;		//reset the timeouts
    oiNew->ReadTimeoutTimer=0;
    oiNew->mode=0;			//set capture mode
    oiNew->Nbytes=0;		//reset the counters
    oiNew->Npackets=0;
    oiNew->hDevice=hDevice;
    oiNew->tagProcess=pDiocParms->tagProcess;
    oiNew->ReadEvent=0;		//reset the read event

    NdisAllocateSpinLock( &(oiNew->CountersLock) );
    /*open the MAC driver calling NDIS*/
    NdisOpenAdapter( &nsOpenStatus,
                     &nsErrorStatus,
                     &oiNew->AdapterHandle,
                     &uiMedium,
                     MediumArray,
                     NUM_NDIS_MEDIA,
                     pde->NdisProtocolHandle,
                     oiNew,
                     AdapterName,
                     0,
                     NULL );

    IF_TRACE_MSG( "Open Status                   : %lx", nsOpenStatus );
    IF_TRACE_MSG( "Error Status                  : %lx", nsErrorStatus );
    IF_TRACE_MSG( "Completion Status             : %lx", oiNew->Status );

    if ( nsOpenStatus == NDIS_STATUS_PENDING )
    {
        while ( oiNew->Status == NDIS_STATUS_PENDING )
            YieldExecution();
    }
    else
    {
        PacketOpenAdapterComplete( oiNew, nsOpenStatus, nsErrorStatus );
    }

    Status = oiNew->Status;
    if ( Status != NDIS_STATUS_SUCCESS )
    {
        NdisFreeMemory( oiNew, sizeof( OPEN_INSTANCE ) ,  0 );
        return NDIS_STATUS_FAILURE;
    }
    else
    {

    }

    TRACE_LEAVE( "BindAdapter" );

    /*return succesfully*/
    return STATUS_SUCCESS;

}