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

📄 loadndisdriver.c

📁 改文件可以安装无线网卡在linux下的驱动,大家可以在网站上查找一下用法
💻 C
📖 第 1 页 / 共 2 页
字号:
	}	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 + -