📄 loadndisdriver.c
字号:
} if (nr_sys_files == 0) { error("coudln't find valid drivers files for driver %s", driver_name); goto err; } driver->nr_sys_files = nr_sys_files; driver->nr_bin_files = nr_bin_files; strncpy(driver->conf_file_name, conf_file_name, sizeof(driver->conf_file_name));#ifndef DEBUG if (ioctl(ioctl_device, NDIS_LOAD_DRIVER, driver)) goto err;#endif closedir(driver_dir); dbg("driver %s loaded", driver_name); free(driver); return 0;err: if (driver_dir) closedir(driver_dir); for (i = 0; i < nr_sys_files; i++) free(driver->sys_files[i].data); for (i = 0; i < nr_bin_files; i++) free(driver->bin_files[i].data); error("couldn't load driver %s", driver_name); free(driver); return -1;}/* check if a device is already in devices */static int duplicate_device(struct load_device *device, int n, struct load_device devices[]){ int i; for (i = 0; i < n; i++) if (device->vendor == devices[i].vendor && device->device == devices[i].device && device->subvendor == devices[i].subvendor && device->subdevice == devices[i].subdevice) return 1; return 0;}/* add all devices (based on conf files) for a given driver */static int add_driver_devices(DIR *dir, char *driver_name, int from, struct load_device devices[]){ struct dirent *dirent; int n; n = from; if (!dir || !driver_name) { error("invalid driver"); return n; } dbg("adding devices for driver %s", driver_name); while ((dirent = readdir(dir))) { int len; if (strcmp(dirent->d_name, ".") == 0 || strcmp(dirent->d_name, "..") == 0) continue; len = strlen(dirent->d_name); if (len > 5 && strcmp(&dirent->d_name[len-5], ".conf") == 0) { struct stat statbuf; char *s; struct load_device *device; if (lstat(dirent->d_name, &statbuf)) { error("unable to open config file: %s", strerror(errno)); continue; } s = basename(dirent->d_name); /* remove ".conf" */ s[strlen(s)-5] = 0; device = &devices[n]; if (strlen(s) == 11 && sscanf(s, "%04x:%04x.%1d", &device->vendor, &device->device, &device->bustype) == 3) { device->subvendor = DEV_ANY_ID; device->subdevice = DEV_ANY_ID; } else if (strlen(s) == 21 && sscanf(s, "%04x:%04x:%04x:%04x.%1d", &device->vendor, &device->device, &device->subvendor, &device->subdevice, &device->bustype) == 5) { ; } else { error("file %s is not valid - ignored", dirent->d_name); continue; } if (device->bustype != NDIS_PCI_BUS && device->bustype != NDIS_USB_BUS) { error("incorrect bus type %d", device->bustype); continue; } if (duplicate_device(device, n, devices)) dbg("device %04X:%04X is duplicate - ignored", device->vendor, device->device); else { strncpy(device->driver_name, driver_name, sizeof(device->driver_name)); strncpy(device->conf_file_name, dirent->d_name, sizeof(device->conf_file_name)); strncat(device->conf_file_name, ".conf", sizeof(device->conf_file_name) - strlen(device->conf_file_name)); dbg("device %04X:%04X:%04X:%04X is added", device->vendor, device->device, device->subvendor, device->subdevice); n++; } } } dbg("total number of devices added: %d", n); return n;}/* * load all installed drivers * returns: number of drivers loadeed successfully */static int load_all_devices(int ioctl_device){ struct stat statbuf; struct dirent *dirent; DIR *dir, *driver; int loaded, res; struct load_device *devices; struct load_devices load_devices; if (chdir(confdir)) { error("directory %s is not valid: %s", confdir, strerror(errno)); return -EINVAL; } if ((dir = opendir(confdir)) == NULL) { error("directory %s is not valid: %s", confdir, strerror(errno)); return -EINVAL; } devices = malloc(sizeof(*devices) * MAX_DEVICES); if (!devices) { error("couldn't allocate memory"); return -EINVAL; } loaded = 0; while((dirent = readdir(dir))) { if (strcmp(dirent->d_name, ".") == 0 || strcmp(dirent->d_name, "..") == 0) continue; if (stat(dirent->d_name, &statbuf) || (!S_ISDIR(statbuf.st_mode))) continue; if ((driver = opendir(dirent->d_name)) == NULL) { error("directory %s is not valid: %s", dirent->d_name, strerror(errno)); continue; } if (chdir(dirent->d_name)) { error("directory %s is not valid: %s", dirent->d_name, strerror(errno)); closedir(driver); continue; } loaded = add_driver_devices(driver, dirent->d_name, loaded, devices); chdir(".."); closedir(driver); } closedir(dir); if (loaded == 0) { error("no valid NDIS drives found in %s; you may need to" " reinstall Windows drivers", confdir); free(devices); return -1; } load_devices.count = loaded; load_devices.devices = devices;#ifndef DEBUG res = ioctl(ioctl_device, NDIS_REGISTER_DEVICES, &load_devices);#endif free(devices); if (res) { error("couldn't load devices"); return -1; } return 0;}/* * we need a device to use ioctl to communicate with ndiswrapper module * we create a device in /dev instead of /tmp as some distributions don't * allow creation of devices in /tmp */static int get_ioctl_device(){ int fd, minor_dev; char line[64]; FILE *proc_misc; /* get minor device number used by ndiswrapper driver */ proc_misc = fopen("/proc/misc", "r"); if (!proc_misc) return -1; minor_dev = -1; while (fgets(line, sizeof(line), proc_misc)) { if (strstr(line, DRIVER_NAME)) { long i = strtol(line, 0, 10); if (i != LONG_MAX && i != LONG_MIN) { minor_dev = i; break; } } } fclose(proc_misc); if (minor_dev == -1) { error("couldn't find ndiswrapper in /proc/misc; " "is ndiswrapper module loaded?"); return -1; } unlink(ioctl_file); if (mknod(ioctl_file, S_IFCHR | 0600, 10 << 8 | minor_dev) == -1) { error("couldn't create file %s: %s", ioctl_file, strerror(errno)); return -1; } fd = open(ioctl_file, O_RDONLY); unlink(ioctl_file); if (fd == -1) { error("couldn't open file %s: %s", ioctl_file, strerror(errno)); return -1; } return fd;}/* two ways to call this program: * first, to load all devices, use "-a" argument * later, load a specific driver and device (i.e., conf file) with * arguments driver name, vendor, device, subvendor, subdevice*/int main(int argc, char *argv[0]){ int i, ioctl_device, res; openlog(PROG_NAME, LOG_PERROR | LOG_CONS, LOG_KERN | LOG_DEBUG); if (argc < 4) { res = 1; goto out; } i = -1; i = atoi(argv[1]); if (i < 0) { error("invalid debug value %d", i); res = 2; goto out; } else debug = i;#ifndef DEBUG ioctl_device = get_ioctl_device(); if (ioctl_device == -1) { error("unable to open ioctl device %s", ioctl_file); res = 5; goto out; }#endif if (strcmp(argv[2], NDISWRAPPER_VERSION)) { error("version %s doesn't match driver version %s", NDISWRAPPER_VERSION, argv[2]); res = 6; goto out; } if (strcmp(argv[3], "-a") == 0) { if (load_all_devices(ioctl_device)) res = 7; else res = 0; } else { /* load specific driver and conf file */ if (argc != 5) { error("incorrect usage of %s (%d)", argv[0], argc); res = 11; goto out; } res = load_driver(ioctl_device, argv[3], argv[4]); }out: if (ioctl_device != -1) close(ioctl_device); closelog(); return res;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -