WlanApi w Asemblerze

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++)

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

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ę

typedef struct _WLAN_INTERFACE_INFO {
  GUID                 InterfaceGuid;
  WCHAR                strInterfaceDescription[256];
  WLAN_INTERFACE_STATE isState;
} WLAN_INTERFACE_INFO, *PWLAN_INTERFACE_INFO;
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

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

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

0

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

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 ? ;)

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?

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

1 użytkowników online, w tym zalogowanych: 0, gości: 1