PDA

View Full Version : کاربرد تابع DeviceIoControl



f.falahati
دوشنبه 23 آذر 1394, 10:59 صبح
سلام به همه.
من دارم روی درایور tap tun کار میکنم،برای همین یک کدی رو از github دانلود کردم، یک قسمت از کد هست که متوجه نمیشم. توی این کد با استفاده از registry key ها میتونم آداپتر tap رو پیدا میکنه، بعد با crateFile یک handle براش ایجاد میکنه، بعد از اون با DeviceIoControl تنظیماتی رو روی اون انجام میده که مشکل من دقیقا همینجاست. من نمیتونم مفهوم درست DeviceIoControl رو درک کنم و همینطور کدهای CTL_CODE رو !یک قسمت از کد اینه:


#define TAP_CONTROL_CODE( request, method ) ( \
CTL_CODE( (FILE_DEVICE_UNKNOWN), (request), (method), 0) \
)
//*****************
if (DeviceIoControl (handle, TAP_CONTROL_CODE(3, 0),//TAP_WIN_IOCTL_GET_MTU,
&mtu, sizeof (mtu),
&mtu, sizeof (mtu), &len, NULL))
printf ("TAP-Windows MTU=%d\n", (int) mtu);

من حالا میخوام بدونم این عدد 3 در قسمت TAP_CONTROL_CODE(3, 0) کاربردش چیه؟ این اعداد یا بهتر بگم این کدها رو از کجا میشه پیدا کرد؟راسیتش نمیدونم چی باید سرچ کنم!!!
البته یک کد دیگه هم دانلود کردم که این موارد رو داشت:

#define TAP_CONTROL_CODE(request,method) \
CTL_CODE (FILE_DEVICE_UNKNOWN, request, method, FILE_ANY_ACCESS)


#define TAP_IOCTL_GET_MAC TAP_CONTROL_CODE (1, METHOD_BUFFERED)
#define TAP_IOCTL_GET_VERSION TAP_CONTROL_CODE (2, METHOD_BUFFERED)
#define TAP_IOCTL_GET_MTU TAP_CONTROL_CODE (3, METHOD_BUFFERED)
#define TAP_IOCTL_GET_INFO TAP_CONTROL_CODE (4, METHOD_BUFFERED)
#define TAP_IOCTL_CONFIG_POINT_TO_POINT TAP_CONTROL_CODE (5, METHOD_BUFFERED)
#define TAP_IOCTL_SET_MEDIA_STATUS TAP_CONTROL_CODE (6, METHOD_BUFFERED)
#define TAP_IOCTL_CONFIG_DHCP_MASQ TAP_CONTROL_CODE (7, METHOD_BUFFERED)
#define TAP_IOCTL_GET_LOG_LINE TAP_CONTROL_CODE (8, METHOD_BUFFERED)
#define TAP_IOCTL_CONFIG_DHCP_SET_OPT TAP_CONTROL_CODE (9, METHOD_BUFFERED)

negative60
دوشنبه 23 آذر 1394, 14:18 عصر
DeviceIoControl (https://msdn.microsoft.com/en-us/library/windows/desktop/aa363216%28v=vs.85%29.aspx) یک تابع API در ویندوز هست که کاربرد‌های مختلفی‌ داره
TAP_CONTROL_CODE همینطور که از رو اسمش مشخص هست تعیین می‌کنه که تابع DeviceIoControl چه کاربردی داشته باشه, این شماره‌ها هم ماهیت هر کدوم از کد کنترل‌ها رو مشخص می‌کنه که از پیش توسط نویسنده تابع API تعیین شدن

به عنوان مثال اگه آرگومان دوم تابع DeviceIoControl رو TAP_IOCTL_GET_MAC مشخص کنید خروجی‌ تابع DeviceIoControl آدرس مک (https://fa.wikipedia.org/wiki/%D8%A2%D8%AF%D8%B1%D8%B3_%D9%85%DA%A9) کارت شبکه خواهد بود و اگر TAP_IOCTL_GET_MTUبفرستید مقدار MTU (https://fa.wikipedia.org/wiki/%D9%88%D8%A7%D8%AD%D8%AF_%D8%A7%D9%86%D8%AA%D9%82% D8%A7%D9%84_%D8%AD%D8%AF%D8%A7%DA%A9%D8%AB%D8%B1) رو برمیگردونه.

قسمت آخر سوالتون هم مربوط به ماکروها (http://www.hpkclasses.ir/Courses/cpp/cpp1600.html) می‌شه

f.falahati
دوشنبه 23 آذر 1394, 15:43 عصر
DeviceIoControl (https://msdn.microsoft.com/en-us/library/windows/desktop/aa363216%28v=vs.85%29.aspx) یک تابع API در ویندوز هست که کاربرد‌های مختلفی‌ داره
TAP_CONTROL_CODE همینطور که از رو اسمش مشخص هست تعیین می‌کنه که تابع DeviceIoControl چه کاربردی داشته باشه, این شماره‌ها هم ماهیت هر کدوم از کد کنترل‌ها رو مشخص می‌کنه که از پیش توسط نویسنده تابع API تعیین شدن

به عنوان مثال اگه آرگومان دوم تابع DeviceIoControl رو TAP_IOCTL_GET_MAC مشخص کنید خروجی‌ تابع DeviceIoControl آدرس مک (https://fa.wikipedia.org/wiki/%D8%A2%D8%AF%D8%B1%D8%B3_%D9%85%DA%A9) کارت شبکه خواهد بود و اگر TAP_IOCTL_GET_MTUبفرستید مقدار MTU (https://fa.wikipedia.org/wiki/%D9%88%D8%A7%D8%AD%D8%AF_%D8%A7%D9%86%D8%AA%D9%82% D8%A7%D9%84_%D8%AD%D8%AF%D8%A7%DA%A9%D8%AB%D8%B1) رو برمیگردونه.

قسمت آخر سوالتون هم مربوط به ماکروها (http://www.hpkclasses.ir/Courses/cpp/cpp1600.html) می‌شه
متوجه شدم اما الان میخوام بدونم که این شماره ها که ماهیت تابع رو مشخص میکنن چطوری میشه متوجه شد؟
آخه این کد بعد از اینکه set media status انجام داد میخواد به tap یک ip بده من چندتا کد رو بررسی کردم،تابع DeviceIoControl مقدار 1 برمیگردونه و با موفقیت اجرا میشه ولی ip کارت tap من تغییری نمیکنه!!!!میخوام بدونم قسمت TAP_CONTROL_CODE(10, 0) کد زیر با در نظر گرفتن #define TAP_IOCTL_CONFIG_TUN TAP_CONTROL_CODE (10, METHOD_BUFFERED)داره چکاری رو انجام میده دقیقا!!!شاید بتونم مشکل رو حل کنم.

اینم کد:

int configtun[3] = {0};
configtun[0] = inet_addr(ip);
configtun[1] = inet_addr(ip);
char *p = (char*)(configtun+1);
*(p+3) = 0;
configtun[2] = inet_addr(netmask);
for(int i = 0; i < sizeof(configtun); i++)
{
printf("%02x ", (uint8)*((char*)configtun+i));
}
printf("\n");

status = DeviceIoControl(handle,
TAP_CONTROL_CODE(10, 0), // TAP_IOCTL_CONFIG_TUN
configtun,
sizeof(configtun),
configtun,
sizeof(active),
&len,
NULL
);

من حتی سرچ کردم که چطور برای tap میشه ipv4 ست کرد ولی جواب ها درمورد لینوکسه من در محیط ویندوز میخوام با این درایور کار کنم!

rahnema1
دوشنبه 23 آذر 1394, 22:52 عصر
سلام
به صفحه Defining I-O Control Codes (https://msdn.microsoft.com/en-us/library/windows/hardware/ff543023(v=vs.85).aspx) مراجعه کنید فکر کنم جواب بگیرید