Здравствуйте, Аноним, Вы писали:
А>Как мне внутри BindAdapterHandler получить инфу о карте, т.е адрес, шлюз и т.п? NdisReadConfiguration может прочитать "UpperBindings", через который, в принципе, можно получить нужную инфу. Это так и надо делать, или это решение через задницу?
Это нормальный путь. Есть еще вариант — узнать информацию динамически, через драйвер tcpip. Например, так можно узнать действующую таблицу маршоутизации:
NTSTATUS ntStatus;
HANDLE hFile = NULL;
OBJECT_ATTRIBUTES ObjAttr;
UNICODE_STRING ObjName;
IO_STATUS_BLOCK IoStatus;
TCP_REQUEST_QUERY_INFORMATION_EX tcp_req = { 0 };
IPRouteEntry *route_table = NULL;
ULONG route_size = sizeof(IPRouteEntry) * MAX_TABLE_ROUTE;
ULONG i;
do {
RtlInitUnicodeString(&ObjName, L"\\Device\\RawIp");
InitializeObjectAttributes(&ObjAttr, &ObjName, OBJ_CASE_INSENSITIVE,
NULL, NULL );
ntStatus = ZwCreateFile( &hFile,
0,
&ObjAttr,
&IoStatus,
NULL,
FILE_ATTRIBUTE_NORMAL,
FILE_SHARE_READ | FILE_SHARE_WRITE,
FILE_OPEN,
0,
NULL,
0 );
if ( ntStatus != STATUS_SUCCESS )
break;
tcp_req.ID.toi_entity.tei_entity = CL_NL_ENTITY;
tcp_req.ID.toi_entity.tei_instance = 0;
tcp_req.ID.toi_class = INFO_CLASS_PROTOCOL;
tcp_req.ID.toi_type = INFO_TYPE_PROVIDER;
tcp_req.ID.toi_id = IP_MIB_RTTABLE_ENTRY_ID;
route_table = ExAllocatePool( PagedPool, route_size );
if ( !route_table )
break;
ZwDeviceIoControlFile( hFile,
NULL,
NULL,
NULL,
&IoStatus,
IOCTL_TCP_QUERY_INFORMATION_EX,
&tcp_req,
sizeof(tcp_req),
route_table,
route_size );
KdPrint(("\nRoute table:\n"));
KdPrint(("Interfcae Dest Mask Gate\n" ));
KdPrint(("============================================\n"));
for ( i = 0; i < IoStatus.Information/sizeof(IPRouteEntry); ++i )
{
//тут был вывод информации - опущено ....
}
} while( 0 );
if ( route_table )
ExFreePool( route_table );
if ( hFile )
ZwClose( hFile );
тут не хватает некоторых объявлений, но идея прослеживается...
А>И ещё в догонку: NdisAcquireReadWriteLock блочит все данные? Можно ли использовать для выборочной блокировки другие средства синхронизации?
NdisAcquireReadWriteLock позволяет реализовать алгоритм "один писатель — много читателей". Такая схема эффективна, когда несколько потоков часто обращаются для чтения некоторых защищаемых данных, а один поток изредка их меняет. Упомянутый объект синхронизации позволяет одновременно нескольким потокм осуществлять чтение — в отличии от обычного спинлока ( схема "экслюзивный доступ" ).
Если Вам нужен эксклюзивный доступ к ресурсу — используйте спинлок.