WlanApi w Asemblerze

MonkiKong
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 26
0

Hej!
Żeby zgarnąć 5 na studiach z programowania niskopoziomowego muszę napisać skomplikowany program a assemblerze. Używam RadAsm, GoAsm i OllyDBG.
Padło, że chce napisać program obsługujący kilka funkcji z WlanApi.
Problem mam z WlanEnumInterfaces na stronie dokładny opis
http://msdn.microsoft.com/en-us/library/windows/desktop/ms706716%28v=vs.85%29.aspx
Mianowicie muszę jako argumenty podać strukturę (to wszystko podane w c++)

Kopiuj
typedef struct _WLAN_INTERFACE_INFO_LIST {
  DWORD               dwNumberOfItems;
  DWORD               dwIndex;
  WLAN_INTERFACE_INFO InterfaceInfo[];
} WLAN_INTERFACE_INFO_LIST, *PWLAN_INTERFACE_INFO_LIST;

U mnie wygląda tak

Kopiuj
WLAN_INTERFACE_INFO_LIST struct
    NumberOfItem DW ?
    Index DW ?
   InterfaceInfo WLAN_INTERFACE_INFO  ;z ego co mi się wydaję muszę podać zmienna o typie WLAN_INTERFACE_INFO czyli kolejnej struktury
WLAN_INTERFACE_INFO_LIST ENDS

Muszę utworzyć kolejną strukturę

Kopiuj
typedef struct _WLAN_INTERFACE_INFO {
  GUID                 InterfaceGuid;
  WCHAR                strInterfaceDescription[256];
  WLAN_INTERFACE_STATE isState;
} WLAN_INTERFACE_INFO, *PWLAN_INTERFACE_INFO;
Kopiuj
WLAN_INTERFACE_INFO struct 
    InterfaceGuid DB ? ; tu nie wiem za bardzo jaki rodzaj utworzyć wiem że te guid to bardzo długi ciąg liczb hex
    InterfaceDescription DB ?
    WlanState WLAN_INTERFACE_STATE ; a tu odwołuje się do zmiennej typu WLAN_INTERFACE_STATE
WLAN_INTERFACE_INFO ENDs

No i teraz zaczynają się schody, bo jak w miarę rozumiem jak się robi struktury, chociaż nie wiem czy dobrze odwołuje się do struktury w sktrukturze to muszę teraz stworzyć typ enum

Kopiuj
typedef enum _WLAN_INTERFACE_STATE { 
  wlan_interface_state_not_ready              = 0,
  wlan_interface_state_connected              = 1,
  wlan_interface_state_ad_hoc_network_formed  = 2,
  wlan_interface_state_disconnecting          = 3,
  wlan_interface_state_disconnected           = 4,
  wlan_interface_state_associating            = 5,
  wlan_interface_state_discovering            = 6,
  wlan_interface_state_authenticating         = 7
} WLAN_INTERFACE_STATE, *PWLAN_INTERFACE_STATE;

I za cholerę nie wiem jak to zrobić. Ma ktoś jakieś podpowiedzi co do struktury w strukturze i typu enum?

mój program wygląda tak

Kopiuj
DATA 
Version DW 2 dup 0
Handle DB 2 dup 0
InterfaceList WLAN_INTERFACE_INFO_LIST <>
NetworkList DQ 100 dup 0
CODE
START:
invoke WlanOpenHandle,2,0,addr Version,addr Handle ;Wywoluje uchwyt do wlan

invoke WlanEnumInterfaces,[Handle],0,addr InterfaceList

ret

Po uruchomieniu bez utworzonego typu enum _WLAN_INTERFACE_STATE i uruchomieniu w ollyDBG coś się niby dzieje ale na pewno nie dostaje guid.
scren z pamięci to co zaznaczone, wskakuje mi w strukturę po wywołaniu WlanEnumInterface
user image

n0name_l
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2412
0

Enum to zwykly int. http://ideone.com/hhoBh8

Bartosz Wójcik
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 439
0

DW to potocznie deklaracja wartości WORD, a nie DWORD, więc masz źle struktury przełożone, użyj DD, GUID to zapewne też 16 bajtowy ciąg, a nie db ? ;)

MonkiKong
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 26
0

@Bartosz Wójcik

Dzięki już to poprawiłem, niestety nadal nie mogę dojść czy muszę tworzyć te struktury czy jak to ma działać. Może ktoś pokazać jak powinno to działać? Jak będę widział przykład będzie mi to na pewno lepiej zroumieć

Więc poradziłem już sobie, z tym. Po prostu liczba którą dostawałem zwrotnie to po prostu adres w pamięci pod którym zapisane są wszystkie informacje.
Co do tych struktur, to niestety nie znalazłem plików nagłówkowych wlanapi.h pod GoAsm, więc musiałem napisać go sam. Teraz struktury działają, szkoda, że wcześniej nie wpadłem na pomysł, żeby zajrzeć do pliku z listingiem programu. Było by jasne.
Dobra teraz mam pytanie. Czy jest możliwość, żeby automatycznie przy wywoływaniu funkcji dostać dane do structury?
Czy koniecznie muszę robić tak?

Kopiuj
invoke WlanGetNetworkBssList,[phClientHandle],edi,0,3,0,0,esi
MOV ESI,[Wlan]
mov EDI,Addr Wlan
mov ecx,SIZEOF Wlan
rep movsb

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.