⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 oid.c

📁 NDIS 实现pppoe例子
💻 C
📖 第 1 页 / 共 2 页
字号:
    i->LineCallInfo.hLine = (ULONG)a;
//    i->LineCallInfo.ulLineDeviceID = a->miniUlDeviceID;
    i->LineCallInfo.ulLineDeviceID = 0;
    i->LineCallInfo.ulAddressID = 0;

    i->LineCallInfo.ulBearerMode = LINEBEARERMODE_DATA;
	i->LineCallInfo.ulRate = a->protoLinkSpeed / 100;
	i->LineCallInfo.ulMediaMode = LINEMEDIAMODE_DIGITALDATA;

    i->LineCallInfo.ulCallParamFlags = LINECALLPARAMFLAGS_IDLE;
    i->LineCallInfo.ulCallStates = a->miniSupportedCallStates;

	FLEAVE("queryTapiGetCallInfo");
	return NDIS_STATUS_SUCCESS;
}

// OID_TAPI_GET_ADDRESS_CAPS
static NDIS_STATUS queryTapiGetAddressCaps(PADAPT a, PDATABUF_DESCR buf) {
	NDIS_TAPI_GET_ADDRESS_CAPS *i;
	static char addr_str[] = "0 1 0";

	FENTER("queryTapiGetAddressCaps");

	i = (NDIS_TAPI_GET_ADDRESS_CAPS *)buf->data;
	DbgPrint("DeviceId : 0x%x, AddressId : 0x%x, extvers: %d\n",
			 i->ulDeviceID, i->ulAddressID, i->ulExtVersion);

	if (i->ulDeviceID != a->miniUlDeviceID) {
		DbgPrint("wrong ulDeviceID\n");

		FLEAVE("queryTapiGetAddressCaps");
		return NDIS_STATUS_TAPI_NODRIVER;
	}

	if (i->ulAddressID != 0) {
		DbgPrint("wrong ulAddressID\n");

		FLEAVE("queryTapiGetAddressCaps");
		return NDIS_STATUS_TAPI_INVALADDRESSID;
	}

	i->LineAddressCaps.ulNeededSize = sizeof(i->LineAddressCaps);
	i->LineAddressCaps.ulUsedSize = sizeof(i->LineAddressCaps);

    i->LineAddressCaps.ulLineDeviceID = i->ulDeviceID;

    // RASTAPI requires the "I L A" be placed in the Address field at the end
    // of this structure.  Where:
    // I = The device intance assigned to this adapter in the registry
    //     \LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkCards\I
    // L = The device line number associated with this line (1..NumLines)
    // A = The address (channel) to be used on this line (0..NumAddresses-1)
    i->LineAddressCaps.ulNeededSize += 5;
    if (i->LineAddressCaps.ulNeededSize <= i->LineAddressCaps.ulTotalSize)
    {
        i->LineAddressCaps.ulAddressSize = 5;
        i->LineAddressCaps.ulAddressOffset = sizeof(i->LineAddressCaps);
        NdisMoveMemory((PUCHAR) &i->LineAddressCaps +
                                 i->LineAddressCaps.ulAddressOffset,
					   addr_str, 5);
        i->LineAddressCaps.ulUsedSize += 5;
    }

    // Return the various address capabilites for the adapter.
    i->LineAddressCaps.ulAddressSharing = LINEADDRESSSHARING_PRIVATE;
    i->LineAddressCaps.ulAddressStates = 0;
    i->LineAddressCaps.ulCallStates = a->miniSupportedCallStates;

    i->LineAddressCaps.ulDialToneModes = LINEDIALTONEMODE_UNAVAIL;
    i->LineAddressCaps.ulSpecialInfo = LINESPECIALINFO_UNAVAIL;
    i->LineAddressCaps.ulDisconnectModes =
			LINEDISCONNECTMODE_BUSY |
            LINEDISCONNECTMODE_NORMAL |
            LINEDISCONNECTMODE_UNKNOWN |
            LINEDISCONNECTMODE_NOANSWER;

	// This device does not support conference calls, transfers, or holds.
    i->LineAddressCaps.ulMaxNumActiveCalls = 1;
    i->LineAddressCaps.ulMaxNumTransConf = 1;
    i->LineAddressCaps.ulAddrCapFlags = LINEADDRCAPFLAGS_DIALED;
    i->LineAddressCaps.ulCallFeatures =
            LINECALLFEATURE_DIAL |
            LINECALLFEATURE_DROP;

	FLEAVE("queryTapiGetAddressCaps");
	return NDIS_STATUS_SUCCESS;
}

// OID_TAPI_PROVIDER_INITIALIZE
static NDIS_STATUS queryTapiProviderInitialize(PADAPT a, PDATABUF_DESCR buf) {
	NDIS_TAPI_PROVIDER_INITIALIZE *i;

	FENTER("queryTapiProviderInitialize");

	i = (NDIS_TAPI_PROVIDER_INITIALIZE *)buf->data;

	// we have only one device so DeviceID = DeviceIDBase
	a->miniUlDeviceIDBase = i->ulDeviceIDBase;
	a->miniUlDeviceID = i->ulDeviceIDBase; 

	DbgPrint("ulDeviceIDBase: 0x%x\n", a->miniUlDeviceIDBase);

	i->ulNumLineDevs = 1;
	i->ulProviderID = (ULONG)a;

	FLEAVE("queryTapiProviderInitialize");
	return NDIS_STATUS_SUCCESS;
}

// OID_WAN_GET_INFO
static NDIS_STATUS queryWanGetInfo(PADAPT a, PDATABUF_DESCR buf) {
	NDIS_WAN_INFO *i;

	FENTER("queryWanGetInfo");

	i = (NDIS_WAN_INFO *)buf->data;
//	i->MaxFrameSize = 1492;
	i->MaxFrameSize = 1460;
	i->MaxTransmit = 10;
	i->HeaderPadding = 6 + 14 - 2; // - 2 because we will overwrite ADDRESS CONTROL field of PPP packet
	i->TailPadding = 0;
	i->Endpoints = 1;
	i->MemoryFlags = 0;
	i->HighestAcceptableAddress = MaxAddress;
	i->FramingBits = PPP_FRAMING | TAPI_PROVIDER;
	i->DesiredACCM = 0;

	FLEAVE("queryWanGetInfo");
	return NDIS_STATUS_SUCCESS;
}

// OID_WAN_CURRENT_ADDRESS
static NDIS_STATUS queryWanCurrentAddress(PADAPT a, PDATABUF_DESCR buf) {
	FENTER("queryWanCurrentAddress");

	NdisMoveMemory(buf->data, a->protoMacAddr, 6);
	((PUCHAR)buf->data)[2] = ~((PUCHAR)buf->data)[2];

	FLEAVE("queryWanCurrentAddress");
	return NDIS_STATUS_SUCCESS;
}

// OID_GEN_SUPPORTED_LIST
static NDIS_STATUS queryGenSupportedList(PADAPT a, PDATABUF_DESCR buf) {
	NDIS_OID prev = 0;
	NDIS_OID smallest = (ULONG)-1;
	PULONG ptr;
	ULONG c = 0;
	POID_HANDLER h;

	FENTER("queryGenSupportedList");

	// count OIDs
	for (h = queryOids; h->handler != NULL; h++) ++c;
	for (h = setOids; h->handler != NULL; h++) ++c;

	if (buf->len < c * 4) {
		DbgPrint("not enough buffer space: %d, needed: %d\n", buf->len, c * 4);
		*(buf->bytesNeeded) = c * 4;

		FLEAVE("queryGenSupportedList");
		return NDIS_STATUS_INVALID_LENGTH;
	}

	// sort and report oids;
	ptr = (PULONG)buf->data;
	c = 0;

	DbgPrint("supported list: ");

	while (1) {
		int found = 0;
		for (h = queryOids; h->handler != NULL; h++) {
			if (h->oid < smallest && h->oid > prev) {
				smallest = h->oid;
				found = 1;
			}
		}
		for (h = setOids; h->handler != NULL; h++) {
			if (h->oid < smallest && h->oid > prev) {
				smallest = h->oid;
				found = 1;
			}
		}
		if (found == 0) break;
		DbgPrint("0x%x ", smallest);
		*ptr = smallest;
		++ptr;
		c += 4;
		prev = smallest;
		smallest = (ULONG)-1;
	}
	DbgPrint("\n");

	*(buf->bytesUsed) = c;
	*(buf->bytesNeeded) = c;

	FLEAVE("queryGenSupportedList");
	return NDIS_STATUS_SUCCESS;
}

// OID_WAN_MEDIUM_SUBTYPE
static NDIS_STATUS queryWanMediumSubtype(PADAPT a, PDATABUF_DESCR buf) {
	FENTER("queryWanMediumSubtype");
	*((PULONG)(buf->data)) = NdisWanMediumIsdn;
	FLEAVE("queryWanMediumSubtype");
	return NDIS_STATUS_SUCCESS;
}

// OID_GEN_MAC_OPTIONS
static NDIS_STATUS queryGenMacOptions(PADAPT a, PDATABUF_DESCR buf) {
	FENTER("queryGenMacOptions");
	*((PULONG)(buf->data)) = NDIS_MAC_OPTION_COPY_LOOKAHEAD_DATA | NDIS_MAC_OPTION_NO_LOOPBACK;
	FLEAVE("queryGenMacOptions");
	return NDIS_STATUS_SUCCESS;
}

static NDIS_STATUS queryAnyNewOid(PADAPT a, PDATABUF_DESCR buf) {
	FENTER("queryAnyNewOid");
	DbgPrint("BLAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n");
	FLEAVE("queryAnyNewOid");
	return NDIS_STATUS_SUCCESS;
}

static NDIS_STATUS queryAnyNewWanOid(PADAPT a, PDATABUF_DESCR buf) {
	FENTER("queryAnyNewWanOid");
	DbgPrint("BLAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n");
	FLEAVE("queryAnyNewWanOid");
	return NDIS_STATUS_SUCCESS;
}

static NDIS_STATUS queryAnyNewTapiOid(PADAPT a, PDATABUF_DESCR buf) {
	FENTER("queryAnyNewTapiOid");
	DbgPrint("BLAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n");
	FLEAVE("queryAnyNewTapiOid");
	return NDIS_STATUS_SUCCESS;
}

static NDIS_STATUS setAnyNewOid(PADAPT a, PDATABUF_DESCR buf) {
	FENTER("setAnyNewOid");
	DbgPrint("BLAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n");
	FLEAVE("setAnyNewOid");
	return NDIS_STATUS_SUCCESS;
}

static NDIS_STATUS setAnyNewWanOid(PADAPT a, PDATABUF_DESCR buf) {
	FENTER("setAnyNewWanOid");
	DbgPrint("BLAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n");
	FLEAVE("setAnyNewWanOid");
	return NDIS_STATUS_SUCCESS;
}

static NDIS_STATUS setAnyNewTapiOid(PADAPT a, PDATABUF_DESCR buf) {
	FENTER("setAnyNewTapiOid");
	DbgPrint("BLAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n");
	FLEAVE("setAnyNewTapiOid");
	return NDIS_STATUS_SUCCESS;
}
static NDIS_STATUS queryVendorId(PADAPT a, PDATABUF_DESCR buf) {
	FENTER("queryVendorId");
	*((PULONG)(buf->data)) = 0xffffff;
	FLEAVE("queryVendorId");
	return NDIS_STATUS_SUCCESS;
}

OID_HANDLER queryOids[] = {
	{OID_GEN_SUPPORTED_LIST,    0, &queryGenSupportedList},
	{OID_GEN_MAC_OPTIONS,       4, &queryGenMacOptions},

	{OID_WAN_GET_INFO,          sizeof(NDIS_WAN_INFO), &queryWanGetInfo},
	{OID_WAN_CURRENT_ADDRESS,   6, &queryWanCurrentAddress},
	{OID_WAN_MEDIUM_SUBTYPE,    4, &queryWanMediumSubtype},

	{OID_TAPI_GET_ADDRESS_CAPS, sizeof(NDIS_TAPI_GET_ADDRESS_CAPS) + 6, &queryTapiGetAddressCaps},
	{OID_TAPI_GET_CALL_INFO,	sizeof(NDIS_TAPI_GET_CALL_INFO), &queryTapiGetCallInfo},
	{OID_TAPI_MAKE_CALL,		sizeof(NDIS_TAPI_MAKE_CALL), &queryTapiMakeCall},
	{OID_TAPI_OPEN,				sizeof(NDIS_TAPI_OPEN), &queryTapiOpen},
	{OID_TAPI_SECURE_CALL,		0, &queryTapiSecureCall},
//	{OID_TAPI_NEGOTIATE_EXT_VERSION, sizeof (NDIS_TAPI_NEGOTIATE_EXT_VERSION), &queryTapiNegotiateExtVersion},
//	{OID_TAPI_GET_EXTENSION_ID, sizeof(NDIS_TAPI_GET_EXTENSION_ID), &queryTapiGetExtensionId},

//	Todo: Uncomment for Windows2000
	{OID_TAPI_GET_DEV_CAPS,		sizeof(NDIS_TAPI_GET_DEV_CAPS) /*+ 19*/, &queryTapiGetDevCaps},
	{OID_TAPI_PROVIDER_INITIALIZE, sizeof(NDIS_TAPI_PROVIDER_INITIALIZE), &queryTapiProviderInitialize},

	{OID_GEN_HARDWARE_STATUS, 4, &queryAnyNewOid},
	{OID_GEN_MEDIA_SUPPORTED, 0, &queryAnyNewOid},
	{OID_GEN_MEDIA_IN_USE, 0, &queryAnyNewOid},
	{OID_GEN_MAXIMUM_LOOKAHEAD, 4, &queryAnyNewOid},
	{OID_GEN_MAXIMUM_FRAME_SIZE, 4, &queryAnyNewOid},
	{OID_GEN_LINK_SPEED, 4, &queryAnyNewOid},
	{OID_GEN_TRANSMIT_BUFFER_SPACE, 4, &queryAnyNewOid},
	{OID_GEN_RECEIVE_BUFFER_SPACE, 4, &queryAnyNewOid},
	{OID_GEN_TRANSMIT_BLOCK_SIZE, 4, &queryAnyNewOid},
	{OID_GEN_RECEIVE_BLOCK_SIZE, 4, &queryAnyNewOid},
	{OID_GEN_VENDOR_ID, 4, &queryVendorId},
	{OID_GEN_VENDOR_DESCRIPTION, 0, &queryAnyNewOid},
	{OID_GEN_VENDOR_DRIVER_VERSION, 4, &queryAnyNewOid},
	{OID_GEN_CURRENT_PACKET_FILTER, 4, &queryAnyNewOid},
	{OID_GEN_CURRENT_LOOKAHEAD, 4, &queryAnyNewOid},
	{OID_GEN_DRIVER_VERSION, 2, &queryAnyNewOid},
	{OID_GEN_MAXIMUM_TOTAL_SIZE, 4, &queryAnyNewOid},
	{OID_GEN_MEDIA_CONNECT_STATUS, 4, &queryAnyNewOid},
	{OID_GEN_MAXIMUM_SEND_PACKETS, 4, &queryAnyNewOid},

	// Hack or sviesc?
	{OID_WAN_PERMANENT_ADDRESS, 6, &queryWanCurrentAddress},

	{OID_WAN_QUALITY_OF_SERVICE, 4, &queryAnyNewWanOid},
	{OID_WAN_GET_LINK_INFO, 4, &queryAnyNewWanOid},
	{OID_WAN_LINE_COUNT, 4, &queryAnyNewWanOid},

	{OID_TAPI_GET_ADDRESS_ID, 0, &queryAnyNewTapiOid},
	{OID_TAPI_GET_ADDRESS_STATUS, 0, &queryAnyNewTapiOid},
	{OID_TAPI_GET_CALL_ADDRESS_ID, 0, &queryAnyNewTapiOid},
	{OID_TAPI_GET_CALL_STATUS,	sizeof(NDIS_TAPI_GET_CALL_STATUS), &queryTapiGetCallStatus},
	{OID_TAPI_GET_ID,			sizeof(NDIS_TAPI_GET_ID), &queryTapiGetId},
	{OID_TAPI_GET_LINE_DEV_STATUS, 0, &queryAnyNewTapiOid},

	{0, 0, NULL} // final - NULL oid handler
};

OID_HANDLER setOids[] = {
	{OID_TAPI_CLOSE_CALL,		sizeof(NDIS_TAPI_CLOSE_CALL), &setTapiCloseCall},
	{OID_TAPI_CLOSE,			sizeof(NDIS_TAPI_CLOSE), &setTapiClose},
	{OID_TAPI_DROP,				sizeof(NDIS_TAPI_DROP), &setTapiDrop},
	{OID_TAPI_SET_STATUS_MESSAGES, sizeof(NDIS_TAPI_SET_STATUS_MESSAGES), &setTapiSetStatusMessages},
	{OID_TAPI_SET_DEFAULT_MEDIA_DETECTION, sizeof(NDIS_TAPI_SET_DEFAULT_MEDIA_DETECTION), &setTapiSetDefaultMediaDetection},

	{OID_TAPI_CONDITIONAL_MEDIA_DETECTION, 0, &setAnyNewTapiOid},
	{OID_TAPI_ANSWER, 0, &setAnyNewTapiOid},
	{OID_TAPI_PROVIDER_SHUTDOWN, 0, &setAnyNewTapiOid},
	{OID_TAPI_SET_APP_SPECIFIC, 0, &setAnyNewTapiOid},
	{OID_TAPI_SET_CALL_PARAMS, 0, &setAnyNewTapiOid},
	{OID_TAPI_SET_MEDIA_MODE, 0, &setAnyNewTapiOid},

	{OID_WAN_PROTOCOL_TYPE, 0, &setAnyNewWanOid},
	{OID_WAN_HEADER_FORMAT, 4, &setAnyNewWanOid},
	{OID_WAN_SET_LINK_INFO,		sizeof(NDIS_WAN_SET_LINK_INFO), &setWanSetLinkInfo},

	{OID_GEN_CURRENT_PACKET_FILTER, 4, &setAnyNewOid},
	{OID_GEN_CURRENT_LOOKAHEAD, 4, &setAnyNewOid},
	{OID_GEN_PROTOCOL_OPTIONS, 4, &setAnyNewOid},

	{0, 0, NULL} // final - NULL oid handler
};

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -