2017-02-20 25 views
-1

Есть ли способ получить доступ к API netsh (например, WIN32 API, WDK)?
Например, я пытаюсь получить мобильную широкополосную информацию через netsh с помощью следующей команды:Как программно получить доступ к API 'netsh' через Windows SDK

netsh mbn show interfaces 

Так что я думаю, реальный вопрос: что фактическое программное представление netsh mbn show interfaces с использованием методов Windows SDK?

Пример в псевдокоде:

MBN_DEVICE mbn; 
GetMbnDev(&mbn); 
char* Name = mbn.Name; 
char* IMEI = mbn.IMEI; 
char* DeviceId = mbn.DevId; 
float signal = mbn.Signal; 

Какие интерфейсы API (Win32/.Net/.Core) бы я должен позвонить, чтобы получить тот же результат в структуреданных как с помощью команды выше?

+0

Да, есть способ использовать тот же API, как 'netsh'. –

+0

'netsh.exe' является исполняемым файлом и не предоставляет прямой C++ API. Возможно, вы можете использовать канал для взаимодействия с исполняемым файлом из программы C++. Более обычным способом является прямой доступ к API-интерфейсам winsocks (или через некоторую абстракцию, например 'boost :: asio'). –

+0

@ πάνταῥεῖ В этом случае netsh.exe фактически экспортирует функции C, и эти функции вызывают NAPMONTR.DLL – Anders

ответ

0

Некоторые из инструментов Microsoft используют внутренние/недокументированные API для выполнения своей работы, поэтому их клонирование часто требует небольшого количества исследований.

Первым шагом является загрузка Dependency Walker и ознакомление с функциями импорта netsh. В этом случае не похоже, что он импортирует много связанных с сетью материалов (на моей машине с Windows 8), но он импортирует CoCreateInstance и GetProcAddress, поэтому вы можете установить точку останова как на вашем отладчике, это должно позволить вам определить функции/интерфейсы в конечном итоге заканчиваются вызовом.

Еще до того, как вы доберетесь до этого, вы можете просто Google «Мобильный широкополосный API», он должен привести вас к this MSDN page. Вы должны смотреть на эти интерфейсы и посмотреть, если они предоставляют информацию вы после ...

+0

Установка точки останова на 'CoCreateInstance' рядом с бесполезной. Конечно, он вернет указатель интерфейса. В * некоторый * интерфейс. И затем переходит к вызову * некоторых * неизвестных методов, определенных индексами только в v-таблице. – IInspectable

+0

Первое, что он должен вызывать, это 'IUnknown :: QueryInterface', и вы знаете, где это находится в vtable (потому что иначе COM не будет работать), поэтому вы можете хотя бы выяснить, использует ли он документированные COM-интерфейсы (или интерфейсы, для которых, по крайней мере, имеется информация о сортировке). –

+0

@Inspectable Это, конечно, не бесполезно, вы можете найти CLSID из первого параметра. Если вам повезет, отладчик знает этот CLSID, и если нет, вы можете попытаться найти его в реестре или в Интернете.Если это не поможет, вы можете следить за тем, что он делает с возвращенным интерфейсом. В начальном расследовании вы просто пытаетесь выяснить, использует ли он документированные материалы. – Anders

0

я нашел правильный ответ на эту ссылку: https://social.msdn.microsoft.com/Forums/vstudio/en-US/2d810752-f647-41f6-9299-27b6adddd536/how-to-get-the-signal-strength-from-a-mobile-broadband-network-adapter-in-windows-7-using-c?forum=csharpgeneral

  • Добавить в mbnapi_uuid.lib к вашему Проект C++ (Linker-> Input-> Additional Зависимости).
  • Добавить ссылку на COM Tab для проекта C#: «Определение: ЦСМ Расширение API для MBN Type Library»