示例#1
0
// Open the adapter
SU_ADAPTER *SuOpenAdapter(SU *u, char *adapter_id)
{
    char filename[MAX_PATH];
    void *h;
    SU_ADAPTER *a;
    SL_IOCTL_EVENT_NAME t;
    UINT read_size;
    // Validate arguments
    if (u == NULL || adapter_id == NULL)
    {
        return NULL;
    }

    Format(filename, sizeof(filename), SL_ADAPTER_DEVICE_FILENAME_WIN32, adapter_id);

    h = CreateFileA(filename, GENERIC_READ | GENERIC_WRITE,
                    FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);

    if (h == INVALID_HANDLE_VALUE)
    {
        Debug("Create File %s failed. %u\n", filename, GetLastError());
        return NULL;
    }
    else
    {
        Debug("Create File %s ok.\n", filename);
    }

    a = ZeroMalloc(sizeof(SU_ADAPTER));

    StrCpy(a->AdapterId, sizeof(a->AdapterId), adapter_id);
    StrCpy(a->DeviceName, sizeof(a->DeviceName), filename);

    a->hFile = h;

    Zero(&t, sizeof(t));

    // Get the event name
    if (DeviceIoControl(h, SL_IOCTL_GET_EVENT_NAME, &t, sizeof(t), &t, sizeof(t), &read_size, NULL) == false)
    {
        // Acquisition failure
        SuCloseAdapter(a);
        return NULL;
    }

    Debug("Event Name: %s\n", t.EventNameWin32);

    // Get the event
    a->hEvent = OpenEvent(EVENT_ALL_ACCESS, FALSE, t.EventNameWin32);

    if (a->hEvent == NULL)
    {
        // Acquisition failure
        SuCloseAdapter(a);
        return NULL;
    }

    return a;
}
// Close adapter
void CloseEth(ETH *e)
{
	BLOCK *b;
	// Validate arguments
	if (e == NULL)
	{
		return;
	}

	ReleaseCancel(e->Cancel);

	if (e->SuAdapter != NULL)
	{
		// Close SeLow adapter
		SuCloseAdapter(e->SuAdapter);
		SuFree(e->Su);
	}
	else
	{
		// Close SEE adapter
		wp->PacketCloseAdapter(e->Adapter);
		wp->PacketFreePacket(e->Packet);
		wp->PacketFreePacket(e->PutPacket);
	}

	while (b = GetNext(e->PacketQueue))
	{
		FreeBlock(b);
	}
	ReleaseQueue(e->PacketQueue);

	Free(e->Name);
	Free(e->Title);
	Free(e->Buffer);

	Free(e);
}