📄 ndis.c
字号:
return -1; } DBGTRACE2("setting changed %s='%s', %d", setting->name, setting->value, ansi.length); return 0;}wstdcall void WIN_FUNC(NdisReadConfiguration,5) (NDIS_STATUS *status, struct ndis_configuration_parameter **param, struct ndis_miniport_block *nmb, struct unicode_string *key, enum ndis_parameter_type type){ struct wrap_device_setting *setting; struct ansi_string ansi; char *keyname; int ret; TRACEENTER2("nmb: %p", nmb); ret = RtlUnicodeStringToAnsiString(&ansi, key, TRUE); if (ret || ansi.buf == NULL) { *param = NULL; *status = NDIS_STATUS_FAILURE; RtlFreeAnsiString(&ansi); TRACEEXIT2(return); } DBGTRACE3("%d, %s", type, ansi.buf); keyname = ansi.buf; if (down_interruptible(&loader_mutex)) WARNING("couldn't obtain loader_mutex"); nt_list_for_each_entry(setting, &nmb->wnd->wd->settings, list) { if (strnicmp(keyname, setting->name, ansi.length) == 0) { DBGTRACE2("setting %s='%s'", keyname, setting->value); up(&loader_mutex); *param = ndis_encode_setting(setting, type); if (*param) *status = NDIS_STATUS_SUCCESS; else *status = NDIS_STATUS_FAILURE; RtlFreeAnsiString(&ansi); DBGTRACE2("%d", *status); TRACEEXIT2(return); } } up(&loader_mutex); DBGTRACE2("setting %s not found (type:%d)", keyname, type); *status = NDIS_STATUS_FAILURE; RtlFreeAnsiString(&ansi); TRACEEXIT2(return);}wstdcall void WIN_FUNC(NdisWriteConfiguration,4) (NDIS_STATUS *status, struct ndis_miniport_block *nmb, struct unicode_string *key, struct ndis_configuration_parameter *param){ struct ansi_string ansi; char *keyname; struct wrap_device_setting *setting; TRACEENTER2("nmb: %p", nmb); if (RtlUnicodeStringToAnsiString(&ansi, key, TRUE)) { *status = NDIS_STATUS_FAILURE; TRACEEXIT2(return); } keyname = ansi.buf; DBGTRACE2("%s", keyname); if (down_interruptible(&loader_mutex)) WARNING("couldn't obtain loader_mutex"); nt_list_for_each_entry(setting, &nmb->wnd->wd->settings, list) { if (strnicmp(keyname, setting->name, ansi.length) == 0) { up(&loader_mutex); if (ndis_decode_setting(setting, param)) *status = NDIS_STATUS_FAILURE; else *status = NDIS_STATUS_SUCCESS; RtlFreeAnsiString(&ansi); TRACEEXIT2(return); } } up(&loader_mutex); setting = kmalloc(sizeof(*setting), GFP_KERNEL); if (setting) { memset(setting, 0, sizeof(*setting)); if (ansi.length == ansi.max_length) ansi.length--; memcpy(setting->name, keyname, ansi.length); setting->name[ansi.length] = 0; if (ndis_decode_setting(setting, param)) *status = NDIS_STATUS_FAILURE; else { *status = NDIS_STATUS_SUCCESS; if (down_interruptible(&loader_mutex)) WARNING("couldn't obtain loader_mutex"); InsertTailList(&nmb->wnd->wd->settings, &setting->list); up(&loader_mutex); } } else *status = NDIS_STATUS_RESOURCES; RtlFreeAnsiString(&ansi); TRACEEXIT2(return);}wstdcall void WIN_FUNC(NdisInitializeString,2) (struct unicode_string *dest, UCHAR *src){ struct ansi_string ansi; TRACEENTER2(""); if (src == NULL) { dest->length = dest->max_length = 0; dest->buf = NULL; } else { RtlInitAnsiString(&ansi, src); RtlAnsiStringToUnicodeString(dest, &ansi, TRUE); } TRACEEXIT2(return);}wstdcall void WIN_FUNC(NdisInitAnsiString,2) (struct ansi_string *dst, CHAR *src){ RtlInitAnsiString(dst, src); TRACEEXIT2(return);}wstdcall void WIN_FUNC(NdisInitUnicodeString,2) (struct unicode_string *dest, const wchar_t *src){ RtlInitUnicodeString(dest, src); return;}wstdcall NDIS_STATUS WIN_FUNC(NdisAnsiStringToUnicodeString,2) (struct unicode_string *dst, struct ansi_string *src){ TRACEENTER2(""); if (dst == NULL || src == NULL) TRACEEXIT2(return NDIS_STATUS_FAILURE); if (RtlAnsiStringToUnicodeString(dst, src, FALSE) == STATUS_SUCCESS) return NDIS_STATUS_SUCCESS; else return NDIS_STATUS_FAILURE;}wstdcall NDIS_STATUS WIN_FUNC(NdisUnicodeStringToAnsiString,2) (struct ansi_string *dst, struct unicode_string *src){ TRACEENTER2(""); if (dst == NULL || src == NULL) TRACEEXIT2(return NDIS_STATUS_FAILURE); if (RtlUnicodeStringToAnsiString(dst, src, FALSE) == STATUS_SUCCESS) return NDIS_STATUS_SUCCESS; else return NDIS_STATUS_FAILURE;}wstdcall void WIN_FUNC(NdisMSetAttributesEx,5) (struct ndis_miniport_block *nmb, void *adapter_ctx, UINT hangcheck_interval, UINT attributes, ULONG adaptortype){ struct wrap_ndis_device *wnd; TRACEENTER2("%p, %p %d %08x, %d", nmb, adapter_ctx, hangcheck_interval, attributes, adaptortype); wnd = nmb->wnd; nmb->adapter_ctx = adapter_ctx; if (attributes & NDIS_ATTRIBUTE_BUS_MASTER) pci_set_master(wnd->wd->pci.pdev); wnd->attributes = attributes; if (hangcheck_interval > 0) wnd->hangcheck_interval = 2 * hangcheck_interval * HZ; else wnd->hangcheck_interval = 2 * HZ; TRACEEXIT2(return);}wstdcall ULONG WIN_FUNC(NdisReadPciSlotInformation,5) (struct ndis_miniport_block *nmb, ULONG slot, ULONG offset, char *buf, ULONG len){ struct wrap_device *wd = nmb->wnd->wd; ULONG i; TRACEENTER4("%d", len); for (i = 0; i < len; i++) if (pci_read_config_byte(wd->pci.pdev, offset + i, &buf[i]) != PCIBIOS_SUCCESSFUL) break; TRACEEXIT4(return i);}wstdcall ULONG WIN_FUNC(NdisImmediateReadPciSlotInformation,5) (struct ndis_miniport_block *nmb, ULONG slot, ULONG offset, char *buf, ULONG len){ return NdisReadPciSlotInformation(nmb, slot, offset, buf, len);}wstdcall ULONG WIN_FUNC(NdisWritePciSlotInformation,5) (struct ndis_miniport_block *nmb, ULONG slot, ULONG offset, char *buf, ULONG len){ struct wrap_device *wd = nmb->wnd->wd; ULONG i; TRACEENTER4("%d", len); for (i = 0; i < len; i++) if (pci_write_config_byte(wd->pci.pdev, offset + i, buf[i]) != PCIBIOS_SUCCESSFUL) break; TRACEEXIT4(return i);}wstdcall void WIN_FUNC(NdisReadPortUchar,3) (struct ndis_miniport_block *nmb, ULONG port, char *data){ *data = inb(port);}wstdcall void WIN_FUNC(NdisImmediateReadPortUchar,3) (struct ndis_miniport_block *nmb, ULONG port, char *data){ *data = inb(port);}wstdcall void WIN_FUNC(NdisWritePortUchar,3) (struct ndis_miniport_block *nmb, ULONG port, char data){ outb(data, port);}wstdcall void WIN_FUNC(NdisImmediateWritePortUchar,3) (struct ndis_miniport_block *nmb, ULONG port, char data){ outb(data, port);}wstdcall void WIN_FUNC(NdisMQueryAdapterResources,4) (NDIS_STATUS *status, struct ndis_miniport_block *nmb, NDIS_RESOURCE_LIST *resource_list, UINT *size){ struct wrap_ndis_device *wnd = nmb->wnd; NDIS_RESOURCE_LIST *list; UINT resource_length; list = &wnd->wd->resource_list->list->partial_resource_list; resource_length = sizeof(struct cm_partial_resource_list) + sizeof(struct cm_partial_resource_descriptor) * (list->count - 1); DBGTRACE2("%p, %p,%d (%d), %p %d %d", wnd, resource_list, *size, resource_length, &list->partial_descriptors[list->count-1], list->partial_descriptors[list->count-1].u.interrupt.level, list->partial_descriptors[list->count-1].u.interrupt.vector); if (*size < sizeof(*list)) { *size = resource_length; *status = NDIS_STATUS_BUFFER_TOO_SHORT; } else { ULONG count; if (*size >= resource_length) { *size = resource_length; count = list->count; } else { UINT n = sizeof(*list); count = 1; while (count++ < list->count && n < *size) n += sizeof(list->partial_descriptors); *size = n; } memcpy(resource_list, list, *size); resource_list->count = count; *status = NDIS_STATUS_SUCCESS; } TRACEEXIT2(return);}wstdcall NDIS_STATUS WIN_FUNC(NdisMPciAssignResources,3) (struct ndis_miniport_block *nmb, ULONG slot_number, NDIS_RESOURCE_LIST **resources){ struct wrap_ndis_device *wnd = nmb->wnd; TRACEENTER2("%p, %p", wnd, wnd->wd->resource_list); *resources = &wnd->wd->resource_list->list->partial_resource_list; TRACEEXIT2(return NDIS_STATUS_SUCCESS);}wstdcall NDIS_STATUS WIN_FUNC(NdisMMapIoSpace,4) (void **virt, struct ndis_miniport_block *nmb, NDIS_PHY_ADDRESS phy_addr, UINT len){ struct wrap_ndis_device *wnd = nmb->wnd; TRACEENTER2("%016llx, %d", phy_addr, len); *virt = MmMapIoSpace(phy_addr, len, MmCached); if (*virt == NULL) { ERROR("ioremap failed"); TRACEEXIT2(return NDIS_STATUS_FAILURE); } wnd->mem_start = phy_addr; wnd->mem_end = phy_addr + len; DBGTRACE2("%p", *virt); TRACEEXIT2(return NDIS_STATUS_SUCCESS);}wstdcall void WIN_FUNC(NdisMUnmapIoSpace,3) (struct ndis_miniport_block *nmb, void *virt, UINT len){ TRACEENTER2("%p, %d", virt, len); MmUnmapIoSpace(virt, len); TRACEEXIT2(return);}wstdcall void WIN_FUNC(NdisAllocateSpinLock,1) (struct ndis_spinlock *lock){ DBGTRACE4("lock %p, %lu", lock, lock->klock); KeInitializeSpinLock(&lock->klock); lock->irql = PASSIVE_LEVEL; TRACEEXIT4(return);}wstdcall void WIN_FUNC(NdisFreeSpinLock,1) (struct ndis_spinlock *lock){ DBGTRACE4("lock %p, %lu", lock, lock->klock); TRACEEXIT4(return);}wstdcall void WIN_FUNC(NdisAcquireSpinLock,1) (struct ndis_spinlock *lock){ DBGTRACE6("lock %p, %lu", lock, lock->klock); lock->irql = nt_spin_lock_irql(&lock->klock, DISPATCH_LEVEL); TRACEEXIT6(return);}wstdcall void WIN_FUNC(NdisReleaseSpinLock,1) (struct ndis_spinlock *lock){ DBGTRACE6("lock %p, %lu", lock, lock->klock); nt_spin_unlock_irql(&lock->klock, lock->irql); TRACEEXIT6(return);}wstdcall void WIN_FUNC(NdisDprAcquireSpinLock,1) (struct ndis_spinlock *lock){ TRACEENTER6("lock %p", lock); nt_spin_lock(&lock->klock); TRACEEXIT6(return);}wstdcall void WIN_FUNC(NdisDprReleaseSpinLock,1) (struct ndis_spinlock *lock){ TRACEENTER6("lock %p", lock); nt_spin_unlock(&lock->klock); TRACEEXIT6(return);}wstdcall void WIN_FUNC(NdisInitializeReadWriteLock,1) (struct ndis_rw_lock *rw_lock){ TRACEENTER3("%p", rw_lock); memset(rw_lock, 0, sizeof(*rw_lock)); KeInitializeSpinLock(&rw_lock->u.s.klock); TRACEEXIT3(return);}wstdcall NDIS_STATUS WIN_FUNC(NdisMAllocateMapRegisters,5) (struct ndis_miniport_block *nmb, UINT dmachan, NDIS_DMA_SIZE dmasize, ULONG basemap, ULONG max_buf_size){ struct wrap_ndis_device *wnd = nmb->wnd; TRACEENTER2("%d %d %d %d", dmachan, dmasize, basemap, max_buf_size); if (basemap > 64) { WARNING("invalid request: %d", basemap); TRACEEXIT1(return NDIS_STATUS_RESOURCES); } /* TODO: should we allocate max_buf_size % PAGE_SIZE + 1 * entries for each map? */ if (max_buf_size > PAGE_SIZE) WARNING("buffer size too big: %u", max_buf_size); if (wnd->tx_dma_count > 0) { DBGTRACE2("%s: map registers already allocated: %u", wnd->net_dev->name, wnd->tx_dma_count); TRACEEXIT2(return NDIS_STATUS_RESOURCES); } wnd->tx_dma_count = basemap; wnd->tx_dma_addr = kmalloc(basemap * sizeof(dma_addr_t), GFP_KERNEL); if (!wnd->tx_dma_addr) TRACEEXIT2(return NDIS_STATUS_RESOURCES); memset(wnd->tx_dma_addr, 0, basemap * sizeof(dma_addr_t)); TRACEEXIT2(return NDIS_STATUS_SUCCESS);}wstdcall void WIN_FUNC(NdisMFreeMapRegisters,1) (struct ndis_miniport_block *nmb){ struct wrap_ndis_device *wnd = nmb->wnd; TRACEENTER2("wnd: %p", wnd); if (wnd->tx_dma_addr) { u8 i; for (i = 0; i < wnd->tx_dma_count; i++) { if (wnd->tx_dma_addr[i]) WARNING("%s: dma addr %p not freed by " "Windows driver", wnd->net_dev->name, (void *)wnd->tx_dma_addr[i]); } kfree(wnd->tx_dma_addr); wnd->tx_dma_addr = NULL; } wnd->tx_dma_count = 0; TRACEEXIT2(return);}wstdcall void WIN_FUNC(NdisMStartBufferPhysicalMapping,6) (struct ndis_miniport_block *nmb, ndis_buffer *buf, ULONG index, BOOLEAN write_to_dev, struct ndis_phy_addr_unit *phy_addr_array, UINT *array_size){ struct wrap_ndis_device *wnd = nmb->wnd; TRACEENTER3("index: %u", index); if (wnd->use_sg_dma) WARNING("buffer %p must have been mapped already", buf); if (!write_to_dev) { ERROR("invalid dma direction (%d)", write_to_dev); *array_size = 0; return; } if (index >= wnd->tx_dma_count) { ERROR("invalid map register (%u >= %u)", index, wnd->tx_dma_count); *array_size = 0; return; } if (wnd->tx_dma_addr[index] != 0) { *array_size = 1; return; } DBGTRACE3("%p, %p, %u", buf, MmGetSystemAddressForMdl(buf), MmGetMdlByteCount(buf)); DBG_BLOCK(4) { dump_bytes(__FUNCTION__, MmGetSystemAddressForMdl(buf), MmGetMdlByteCount(buf)); } phy_addr_array[0].phy_addr = PCI_DMA_MAP_SINGLE(wnd->wd->pci.pdev, MmGetSystemAddressForMdl(buf), MmGetMdlByteCount(buf), PCI_DMA_TODEVICE); phy_addr_array[0].length = MmGetMdlByteCount(buf); *array_size = 1; DBGTRACE4("%Lx, %d, %d", phy_addr_array[0].phy_addr, phy_addr_array[0].length, index); wnd->tx_dma_addr[index] = phy_addr_array[0].phy_addr;}wstdcall void WIN_FUNC(NdisMCompleteBufferPhysicalMapping,3) (struct ndis_miniport_block *nmb, ndis_buffer *buf, ULONG index){ struct wrap_ndis_device *wnd = nmb->wnd;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -