코딩 질문이라곤 했지만 딱히 논리적으로 어려운 부분에 대한 질문은 아니고요..
제가 코딩에 기초가 없다보니 글을 못읽어서 생기는 문제인것 같은데요...
최근에 WOL 관련으로 삽질을 좀 하고 있습니다.
WOL match pattern 의 수행이 맘대로 되지 않아서 그러는데요.
검색을 했더니 NDIS 필터드라이버 셈플을 수정해서 드라이버 단위에서 성정되는 WOL match pattern 을 따거나 설정할 수 있을것 같더군요.
그래서 일단은 기본적인 설정에서 어떤 패턴을 기록하는지 따 보려고 대충 해보고 있는데요..
https://msdn.microsoft.com/en-us/library/windows/hardware/ff566768(v=vs.85).aspx
이 구조체에 관해서 이해가 안되는 부분이 있습니다.
typedef struct _NDIS_PM_WOL_PATTERN {
NDIS_OBJECT_HEADER Header;
ULONG Flags;
ULONG Priority;
NDIS_PM_WOL_PACKET WoLPacketType;
NDIS_PM_COUNTED_STRING FriendlyName;
ULONG PatternId;
ULONG NextWoLPatternOffset;
union _WOL_PATTERN {
struct _IPV4_TCP_SYN_WOL_PACKET_PARAMETERS {
ULONG Flags;
UCHAR IPv4SourceAddress[4];
UCHAR IPv4DestAddress[4];
USHORT TCPSourcePortNumber;
USHORT TCPDestPortNumber;
} IPv4TcpSynParameters;
struct _IPV6_TCP_SYN_WOL_PACKET_PARAMETERS {
ULONG Flags;
UCHAR IPv6SourceAddress[16];
UCHAR IPv6DestAddress[16];
USHORT TCPSourcePortNumber;
USHORT TCPDestPortNumber;
} IPv6TcpSynParameters;
struct _EAPOL_REQUEST_ID_MESSAGE_WOL_PACKET_PARAMETERS {
ULONG Flags;
} EapolRequestIdMessageParameters;
struct _WOL_BITMAP_PATTERN {
ULONG Flags;
ULONG MaskOffset;
ULONG MaskSize;
ULONG PatternOffset;
ULONG PatternSize;
} WoLBitMapPattern;
} WoLPattern;
} NDIS_PM_WOL_PATTERN, *PNDIS_PM_WOL_PATTERN;
제 내트워크 환경에서 프로토콜 드라이버가 네트워크 미니포트 드라이버로 내려보네는 WOL 패턴 설정 요청은 단 하나고.
그 요청의 인포메이션 버퍼가 지시하는 NDIS_PM_WOL_PATTERN 내의 WoLPacketType; 변수를 까 봤더니 비트맵 패턴이였습니다.
비트맵 패턴은 union _WOL_PATTERN 공용체에서
struct _WOL_BITMAP_PATTERN {
ULONG Flags;
ULONG MaskOffset;
ULONG MaskSize;
ULONG PatternOffset;
ULONG PatternSize;
} WoLBitMapPattern;
이부분을 이용한다고 하는데 해당 공용체의 다른 구조체 항목들은 쉽게 이해가 가는데 이건 잘 안되더라고요.. 설명을 읽어 봐도 말이죠..
각각의 값은
MaskOffset 208
PatternOffset 196
PatternOffset 85
PatternSize 12
로 찎혀 있던데.. 설명은 아래와 같았습니다..
WoLBitMapPattern
A structure that specifies a WOL bitmap pattern. For more information about bitmap patterns, see the Remarks section. The structure has the following members:
- Flags
A ULONG value that contains a bitwise OR of flags. This member is reserved for NDIS.
- MaskOffset
The offset, in bytes, for a mask buffer from the beginning of the NDIS_PM_WOL_PATTERN structure.
The mask specifies which bytes in incoming packets should be matched against the bitmap pattern. Each bit in the bitmask corresponds to a byte in the pattern. If a bit is zero, the corresponding byte in the incoming packet should not be pattern-matched. If the bit is one, the network adapter compares the byte to the incoming packet with the byte specified in the pattern.
- MaskSize
The size, in bytes, of the mask.
- PatternOffset
The offset, in bytes, for a pattern buffer from the beginning of the NDIS_PM_WOL_PATTERN structure.
- PatternSize
The size, in bytes, of the pattern.
이것이 NDIS_PM_WOL_PATTERN 구조체의 처음으로 부터 208번쨰 바이트에서 부터 시작해서 85바이트 만큼 분량이 mask 이고 이걸 변수로는 접근 못한다는 소리인가요?
패턴은 196 바이트에서 부터 시작해서 12바이트 분량이고요?
만약에 그렇다면 해당 정보를 string으로 따 네려면 어떻게 해야 할까요?
PNDIS_PM_WOL_PATTERN myPattern;
//mypattern ¿¡ ¸Þ¸ð¸® ÇÒ´çÀÌ µÇ°í ÆÐŶÀ¸·Î ¾²¿©Áö°Å³ª ¿øÇÏ´Â ÆÐŶÀÇ ¸Þ¸ð¸® assignÀÌ µÇ¸é
char* src = (char*) myPattern;
char desMask[85 + 1]; // string À¸·Î µý´Ù±æ·¡ ³Îij¸¯ÅÍ ÀÚ¸® 1°³ Ãß°¡ÇÑ °ÍÀÔ´Ï´Ù.
char desPettern[12 + 1]; // string À¸·Î µý´Ù±æ·¡ ³Îij¸¯ÅÍ ÀÚ¸® 1°³ Ãß°¡ÇÑ °ÍÀÔ´Ï´Ù.
strncpy(desMask, src + 208, 85);
strncpy(desPettern, src + 196, 12);
desMask[85] = 0; // string À¸·Î µý´Ù±æ·¡ ³Îij¸¯ÅÍ Ãß°¡ÇÑ °ÍÀÔ´Ï´Ù.
desPettern[12] = 0; // string À¸·Î µý´Ù±æ·¡ ³Îij¸¯ÅÍ Ãß°¡ÇÑ °ÍÀÔ´Ï´Ù.
¾Æ´Ï¸é »ç¿ëÇÒ¶§ Å©±â¸¦ ¿°µÎÇصΰí Àß ¾µ °ÍÀ̸é
char* desMask = ((char*)myPattern) + 208;
char* desPettern = ((char*)myPattern) + 196;
À¸·Î µÎ°í ½áµµ µÉ °Ì´Ï´Ù.