Microsoft MVP성태의 닷넷 이야기
VC++: 45. Winsock 2 Layered Service Provider - Visual Studio 2010용 프로젝트 [링크 복사], [링크+제목 복사]
조회: 33602
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
[Lsp.zip]    
(연관된 글이 2개 있습니다.)
Winsock 2 Layered Service Provider - Visual Studio 2010용 프로젝트

2001년도였군요. 처음 VC++ 6.0으로 빌드 가능한 예제를 올려놓았던 것이.

LSP 예제 (VC ++ 6.0) 2001.08.07 
; https://www.sysnet.pe.kr/2/2/28

위에서 공개한 VC++ 프로젝트는 그 당시 MSJ 기사에 실렸던 아래의 글에 공개된 소스 코드를 기반으로 한 것이었습니다.

Unraveling the Mysteries of Writing a Winsock 2 Layered Service Provider 
; http://www.microsoft.com/msj/0599/layeredservice/layeredservice.aspx

10년 가까운 세월이 흘렀으니 당연히 그 때의 소스 코드로는 Windows 7 64비트 운영체제에서 소화되지는 않습니다. 이러한 변화에 맞게, 마이크로소프트는 LSP 관련 예제를 connect 사이트를 통해서 업데이트했습니다.

Windows Networking Platform for Developers
; https://connect.microsoft.com/WNDP

Layered Service Provider (LSP) Best Practices Whitepaper 
; https://connect.microsoft.com/WNDP/Downloads/DownloadDetails.aspx?DownloadID=1540

WinSock LSP Sample 
; https://connect.microsoft.com/WNDP/Downloads/DownloadDetails.aspx?DownloadID=941

날짜상으로 보면, "Windows SDK"에 실린 예제 코드가 더욱 최신 버전임을 알 수 있습니다. 따라서 가능한 아래의 링크에서 "Windows SDK"를 다운로드 받고,

Microsoft Windows Software Development Kit 
; https://www.microsoft.com/en-us/download/details.aspx?id=8279

"C:\Program Files\Microsoft SDKs\Windows\v7.0\Samples\netds\winsock\lsp" 경로로 이동하면 곧바로 사용할 수 있는 동작 가능한 프로젝트가 폴더별로 실려 있습니다. 폴더의 의미는 각각 다음과 같습니다.

common - 설치 프로젝트와 LSP 예제에서 공통으로 사용하는 소스 코드
ifslsp - IFS LSP 예제
install - LSP DLL 설치/제거 프로젝트
nonifslsp - non-IFS LSP 예제




IFS와 non-IFS에 대한 차이는 지난번 글에서 간략하게 이미 설명드렸습니다.

개발자가 선택할 수 있는 윈도우에서의 네트워크 프로그래밍 기술
; https://www.sysnet.pe.kr/2/0/968

non-IFS가 IFS의 superset이라고 볼 수 있기 때문에 여기서는 non-IFS 프로젝트에 대한 것만 Visual Studio 2010에서 사용할 수 있도록 변환해서 공개합니다. 변환 과정에서 다음과 같은 변경이 있었습니다.

  • install 프로젝트 명을 LspInstall로 변경
  • nonifslsp 프로젝트 명을 LspProxy로 변경
  • LspInstall의 경우 MANIFEST_RESOURCE_ID 삭제하고 Visual Studio 2010에서 옵션으로 제공하는 /MANIFESTUAC:"level='requireAdministrator'로 대체
  • InitializeListHead와 같은 Macro 사용을 위해 Msputils.h 파일로 변경
  • 모든 cpp 파일에 stdafx.h 헤더 파일을 포함하도록 변경

참고로, 처음에는 의욕에 차서 ^^ Unicode용으로 소스 코드를 변경해서 빌드했는데 동작을 하지 않았습니다. 다시 "Multi-Byte Character Set"으로 변경하고 나서야 정상 동작을 했는데, 이유는 여전히 모르겠습니다. 직접적인 소스 코드의 변경은 Install 프로젝트의 "insllsp.cpp"에 "-d" 옵션을 처리하는 코드에서 버그를 수정하는 것만 있었습니다.

원본 코드는 아래인데,

case 'd':               // Full path and filename to LSP
    if ( i+1 >= argc )
        goto cleanup;
    if (_strnicmp(argv[i], "-d32", 4))
        lpszLspPathAndFile32 = argv[ ++i ];
    else
        lpszLspPathAndFile = argv[ ++i ];

    break;

_strnicmp 부분을 다음과 같이 변경해 줘야 합니다.

    if (_strnicmp(argv[i], "-d32", 4) == 0)

첨부된 build_script.bat 파일을 Visual Studio 2010 명령행에서 실행하면 다음과 같은 실행 파일들을 얻을 수 있습니다.

  • LspInstall32.exe
  • LspInstall64.exe
  • LspProxy32.dll
  • LspProxy64.dll




빌드 후 설치 과정은 간단합니다. 일단, 현재 설치되어 있는 LSP 목록을 확인해야 하는데, 아래는 LspInstall32.exe를 32비트 XP에서 실행한 예입니다.

D:\temp\lsp>LspInstall32.exe -p

Winsock 32-bit Catalog:
=======================
1001 - MSAFD Tcpip [TCP/IP]
1002 - MSAFD Tcpip [UDP/IP]
1003 - MSAFD Tcpip [RAW/IP]
1004 - RSVP UDP Service Provider
1005 - RSVP TCP Service Provider
1010 - MSAFD NetBIOS [\Device\NetBT_Tcpip_{6D8D37A9-B681-43CB-ABE9-965F541BB1BE}] SEQPACKET 0
1011 - MSAFD NetBIOS [\Device\NetBT_Tcpip_{6D8D37A9-B681-43CB-ABE9-965F541BB1BE}] DATAGRAM 0
1012 - MSAFD NetBIOS [\Device\NetBT_Tcpip_{6A1A9448-B2B2-42BC-9665-D9BDB7CF58CE}] SEQPACKET 1
1013 - MSAFD NetBIOS [\Device\NetBT_Tcpip_{6A1A9448-B2B2-42BC-9665-D9BDB7CF58CE}] DATAGRAM 1
1014 - MSAFD NetBIOS [\Device\NetBT_Tcpip_{4CD7A369-C12C-4BDC-AE7C-2807A4A2E0B8}] SEQPACKET 2
1015 - MSAFD NetBIOS [\Device\NetBT_Tcpip_{4CD7A369-C12C-4BDC-AE7C-2807A4A2E0B8}] DATAGRAM 2

64비트의 경우에는 옵션이 달라지는 데 아래는 Windows 7 64비트 운영체제에서 실행한 예입니다.

D:\Settings\desktop\lsp_build\Lsp\bin\Release>lspinstall64 -p -c b

Winsock 32-bit Catalog:
=======================
1001 - MSAFD Tcpip [TCP/IP]
1002 - MSAFD Tcpip [UDP/IP]
1003 - MSAFD Tcpip [RAW/IP]
1004 - MSAFD Tcpip [TCP/IPv6]
1005 - MSAFD Tcpip [UDP/IPv6]
1006 - MSAFD Tcpip [RAW/IPv6]
1007 - RSVP TCPv6 Service Provider
1008 - RSVP TCP Service Provider
1009 - RSVP UDPv6 Service Provider
1010 - RSVP UDP Service Provider
1011 - MSAFD RfComm [Bluetooth]

Winsock 64-bit Catalog:
=======================
1001 - MSAFD Tcpip [TCP/IP]
1002 - MSAFD Tcpip [UDP/IP]
1003 - MSAFD Tcpip [RAW/IP]
1004 - MSAFD Tcpip [TCP/IPv6]
1005 - MSAFD Tcpip [UDP/IPv6]
1006 - MSAFD Tcpip [RAW/IPv6]
1007 - RSVP TCPv6 Service Provider
1008 - RSVP TCP Service Provider
1009 - RSVP UDPv6 Service Provider
1010 - RSVP UDP Service Provider
1011 - MSAFD RfComm [Bluetooth]

만약, 여러분이 만든 ifslsp DLL을 TCP/IP, UDP/IP base provider 위에 올리고 싶다면 다음과 같이 Catalog ID를 적어주어서 실행하면 됩니다.

=== XP 32비트 ===
lspinstall32 -i -o 1001 -o 1002 -n "MyLsp" -d D:\bin\Release\LspProxy32.dll

마이크로소프트에서 제공한 ifslsp 예제는 모든 base provider 위에서도 실행이 가능한 소스 코드이기 때문에 특정 Base Provider의 Catalog ID를 지정할 필요 없이 다음과 같이 설치해 주어도 정상적으로 동작이 됩니다.

=== XP 32비트 ===
lspinstall32 -i -a -n "MyLsp" -d D:\bin\Release\LspProxy32.dll

제가 직접해보았는데, XP의 경우에는 특정 TCP/IP, UDP/IP 위에만 올리는 것이 가능했는데 Windows 7 64비트에서는 그렇게 올리는 경우 동작하지 않았습니다. 대신 -a 옵션으로 설정하니 정상적으로 동작을 했고!

x64 운영체제에 설치할 때는 32비트, 64비트 LSP를 아래에서처럼 모두 한꺼번에 지정해 주어야 합니다.

x64 운영체제에는 32비트에 대해서 개별적으로 설치하는 것이 가능하지만, 64비트를 설치하는 경우에는 아래와 같이 무조건 32비트 DLL과 함께 등록해 줘야 합니다.
lspinstall64 -c b -i -a  -n "MyLsp" -d D:\bin\Release\LspProxy64.dll -d32 D:\bin\Release\LspProxy32.dll

64비트 운영체제에서 32비트 단독 설치는 아래와 같이 해주면 되고!
lspinstall32 -i -a  -n "MyLsp" -d D:\bin\Release\LspProxy32.dll

정상적으로 설치되면 -p 옵션으로 확인하면 아래와 같이 출력되는 것을 확인할 수 있습니다.

=== XP 32비트 ===

D:\bin\Release>LspInstall32.exe -p Winsock 32-bit Catalog: ======================= 1017 - MyLsp over [MSAFD Tcpip [TCP/IP]] 1018 - MyLsp over [MSAFD Tcpip [UDP/IP]] 1001 - MSAFD Tcpip [TCP/IP] 1002 - MSAFD Tcpip [UDP/IP] 1003 - MSAFD Tcpip [RAW/IP] 1004 - RSVP UDP Service Provider 1005 - RSVP TCP Service Provider 1010 - MSAFD NetBIOS [\Device\NetBT_Tcpip_{6D8D37A9-B681-43CB-ABE9-965F541BB1BE}] SEQPACKET 0 1011 - MSAFD NetBIOS [\Device\NetBT_Tcpip_{6D8D37A9-B681-43CB-ABE9-965F541BB1BE}] DATAGRAM 0 1012 - MSAFD NetBIOS [\Device\NetBT_Tcpip_{6A1A9448-B2B2-42BC-9665-D9BDB7CF58CE}] SEQPACKET 1 1013 - MSAFD NetBIOS [\Device\NetBT_Tcpip_{6A1A9448-B2B2-42BC-9665-D9BDB7CF58CE}] DATAGRAM 1 1014 - MSAFD NetBIOS [\Device\NetBT_Tcpip_{4CD7A369-C12C-4BDC-AE7C-2807A4A2E0B8}] SEQPACKET 2 1015 - MSAFD NetBIOS [\Device\NetBT_Tcpip_{4CD7A369-C12C-4BDC-AE7C-2807A4A2E0B8}] DATAGRAM 2 1016 - MyLsp
=== Windows 7 64비트 ===

D:\bin\Release>lspinstall64 -p -c b Winsock 32-bit Catalog: ======================= 1057 - MyLsp over [MSAFD Tcpip [TCP/IP]] 1058 - MyLsp over [MSAFD Tcpip [UDP/IP]] 1059 - MyLsp over [MSAFD Tcpip [RAW/IP]] 1060 - MyLsp over [MSAFD Tcpip [TCP/IPv6]] 1061 - MyLsp over [MSAFD Tcpip [UDP/IPv6]] 1062 - MyLsp over [MSAFD Tcpip [RAW/IPv6]] 1063 - MyLsp over [RSVP TCPv6 Service Provider] 1064 - MyLsp over [RSVP TCP Service Provider] 1065 - MyLsp over [RSVP UDPv6 Service Provider] 1066 - MyLsp over [RSVP UDP Service Provider] 1067 - MyLsp over [MSAFD RfComm [Bluetooth]] 1001 - MSAFD Tcpip [TCP/IP] 1002 - MSAFD Tcpip [UDP/IP] 1003 - MSAFD Tcpip [RAW/IP] 1004 - MSAFD Tcpip [TCP/IPv6] 1005 - MSAFD Tcpip [UDP/IPv6] 1006 - MSAFD Tcpip [RAW/IPv6] 1007 - RSVP TCPv6 Service Provider 1008 - RSVP TCP Service Provider 1009 - RSVP UDPv6 Service Provider 1010 - RSVP UDP Service Provider 1011 - MSAFD RfComm [Bluetooth] 1045 - MyLsp Winsock 64-bit Catalog: ======================= 1046 - MyLsp over [MSAFD Tcpip [TCP/IP]] 1047 - MyLsp over [MSAFD Tcpip [UDP/IP]] 1048 - MyLsp over [MSAFD Tcpip [RAW/IP]] 1049 - MyLsp over [MSAFD Tcpip [TCP/IPv6]] 1050 - MyLsp over [MSAFD Tcpip [UDP/IPv6]] 1051 - MyLsp over [MSAFD Tcpip [RAW/IPv6]] 1052 - MyLsp over [RSVP TCPv6 Service Provider] 1053 - MyLsp over [RSVP TCP Service Provider] 1054 - MyLsp over [RSVP UDPv6 Service Provider] 1055 - MyLsp over [RSVP UDP Service Provider] 1056 - MyLsp over [MSAFD RfComm [Bluetooth]] 1001 - MSAFD Tcpip [TCP/IP] 1002 - MSAFD Tcpip [UDP/IP] 1003 - MSAFD Tcpip [RAW/IP] 1004 - MSAFD Tcpip [TCP/IPv6] 1005 - MSAFD Tcpip [UDP/IPv6] 1006 - MSAFD Tcpip [RAW/IPv6] 1007 - RSVP TCPv6 Service Provider 1008 - RSVP TCP Service Provider 1009 - RSVP UDPv6 Service Provider 1010 - RSVP UDP Service Provider 1011 - MSAFD RfComm [Bluetooth] 1044 - MyLsp

여기서 잠깐 용어를 살펴보고 지나가겠습니다.

기존에 있던 "1001 - MSFAD Tcpip [TCP/IP]" 등을 "Base Provider"라고 하고, 마지막에 새로 생성된 "1044 - MyLsp"를 "Layered Provider", 그리고 "over"라는 단어가 붙은 "1047 - MyLsp over [MSAFD Tcpip [UDP/IP]]"와 같은 항목을 "Protocol Chain"이라고 합니다.

이 때문에 "Protocol Chain"은 LSP 간의 로드 순서를 지칭하는 것일 뿐 실제 "LSP"를 가리키는 것이 아니므로 삭제 시에는 "Layered Provider"의 Catalog ID를 지정해 주면 자동적으로 "Protocol Chain"들까지 모두 해제됩니다.

따라서, 다음과 같이 실행해 주면 삭제가 됩니다.

=== XP 32비트 ===
lspinstall32 -r 1016

=== Windows 7 64비트 ===
lspinstall64 -r 1045
lspinstall64 -c 3 -r 1044

보는 것처럼, "-r" 옵션 다음에 지정하는 Catalog Id 값은 시스템 상황에 따라, LSP를 설치할 때마다 변경되므로 그때그때 번호를 확인해서 지정해 줘야 합니다. 게다가 64비트의 경우에는 LSP 32비트/64비트에 할당된 번호도 다르고 개별적으로 2번 실행해서 각각 삭제를 해줘야 합니다.

물론, 코드를 추가하면 이름 기반으로 삭제를 해주는 것도 가능합니다. 그 부분은 현재 마이크로소프트 예제 코드에서 제공이 안되고 있지만, LspInstall 프로젝트의 내부 코드를 보면 쉽게 만들 수 있습니다.




"-p" 옵션과 함께 "-v" 옵션을 함께 주면 상세 보기 화면이 제공됩니다. 아래는 MyLsp에 대한 정보를 보여줍니다.

Protocol: MyLsp

    Path: c:\...[생략]...\LspProxy32.dll
           Address Family: AF_INET
                 Protocol: IPROTO_IP
              Socket Type:            Connectionless: NO
      Guaranteed Delivery: YES
         Guaranteed Order: YES
         Message Oriented: NO
            Pseudo Stream: NO
           Graceful Close: YES
           Expedited Data: YES
             Connect Data: NO
          Disconnect Data: NO
       Supports Broadcast: NO
      Supports Multipoint: NO
 Multipoint Control Plane: NON-ROOTED
    Multipoint Data Plane: NON-ROOTED
            QoS Supported: NO
     Unidirectional Sends: NO
    Unidirection Receives: NO
              IFS Handles: NO
         Partial Messages: NO
           Provider Flags: PFL_HIDDEN 
              Provider Id: {C5FABBD0-9736-11D1-937F-00C04FAD860D}
         Catalog Entry Id: 1070
  Number of Chain Entries: 0   {}
                  Version: 2
Max Socket Address Length: 16
Min Socket Address Length: 16
      Protocol Max Offset: 0
       Network Byte Order: BIG-ENDIAN
          Security Scheme: NONE
             Message Size: N/A (Stream Oriented)
        Provider Reserved: 0

위에서 보면, "Number of Chain Entries"의 값에 0이 할당되어 있는데요. 이 값이 0인 것들이 바로 "Layered Provider"입니다. "Protocol Chain"은 "Number of Chain Entries" 값에 2 이상의 값이 옵니다.

Protocol: MyLsp over [MSAFD Tcpip [TCP/IP]]

    Path: c:\...[생략]...\LspProxy32.dll
           Address Family: AF_INET
                 Protocol: IPROTO_TCP
              Socket Type: SOCK_STREAM
           Connectionless: NO
      Guaranteed Delivery: YES
         Guaranteed Order: YES
         Message Oriented: NO
            Pseudo Stream: NO
           Graceful Close: YES
           Expedited Data: YES
             Connect Data: NO
          Disconnect Data: NO
       Supports Broadcast: NO
      Supports Multipoint: NO
 Multipoint Control Plane: NON-ROOTED
    Multipoint Data Plane: NON-ROOTED
            QoS Supported: NO
     Unidirectional Sends: NO
    Unidirection Receives: NO
              IFS Handles: NO
         Partial Messages: NO
           Provider Flags: PFL_MATCHES_PROTOCOL_ZERO 
              Provider Id: {3FD421CE-060A-425F-B49B-AB03E763FD2E}
         Catalog Entry Id: 1071
  Number of Chain Entries: 2   {1070 1001 }
                  Version: 2
Max Socket Address Length: 16
Min Socket Address Length: 16
      Protocol Max Offset: 0
       Network Byte Order: BIG-ENDIAN
          Security Scheme: NONE
             Message Size: N/A (Stream Oriented)
        Provider Reserved: 0

Base Provider는 아래에서처럼 "1" 값이고.

Protocol: MSAFD Tcpip [TCP/IP]

    Path: %SystemRoot%\system32\mswsock.dll
           Address Family: AF_INET
                 Protocol: IPROTO_TCP
              Socket Type: SOCK_STREAM
           Connectionless: NO
      Guaranteed Delivery: YES
         Guaranteed Order: YES
         Message Oriented: NO
            Pseudo Stream: NO
           Graceful Close: YES
           Expedited Data: YES
             Connect Data: NO
          Disconnect Data: NO
       Supports Broadcast: NO
      Supports Multipoint: NO
 Multipoint Control Plane: NON-ROOTED
    Multipoint Data Plane: NON-ROOTED
            QoS Supported: NO
     Unidirectional Sends: NO
    Unidirection Receives: NO
              IFS Handles: YES
         Partial Messages: NO
           Provider Flags: PFL_MATCHES_PROTOCOL_ZERO 
              Provider Id: {E70F1AA0-AB8B-11CF-8CA3-00805F48A192}
         Catalog Entry Id: 1001
  Number of Chain Entries: 1   {0 }
                  Version: 2
Max Socket Address Length: 16
Min Socket Address Length: 16
      Protocol Max Offset: 0
       Network Byte Order: BIG-ENDIAN
          Security Scheme: NONE
             Message Size: N/A (Stream Oriented)
        Provider Reserved: 0

위의 값들은 코드에서 ChainLen 값으로도 알아낼 수 있습니다.

typedef struct _WSAPROTOCOLCHAIN {
    int ChainLen;                                 /* the length of the chain,     */
                                                  /* length = 0 means layered protocol, */
                                                  /* length = 1 means base protocol, */
                                                  /* length > 1 means protocol chain */
    DWORD ChainEntries[MAX_PROTOCOL_CHAIN];       /* a list of dwCatalogEntryIds */
} WSAPROTOCOLCHAIN, FAR * LPWSAPROTOCOLCHAIN;




정리를 한번 해볼까요?

첨부한 프로젝트는 Visual Studio 2010에서 빌드가능한 프로젝트이니 다운로드해서 컴파일을 하거나, build_script.bat를 실행해줍니다. 빌드된 DLL들로 위에서 설명한 설치 방법에 따르면 정상적으로 로컬에 설치가 될 것입니다. 사실, 설치 이후에 달라진 점을 확인할 수가 없는데, 첨부된 프로젝트의 경우 다음과 같이 WSPSocket에 로그를 남겨두었기 때문에 DebugView를 실행하고 Internet Explorer를 실행한 후 웹 사이트를 방문해서 확인해 볼 수 있습니다.

SOCKET WSPAPI WSPSocket(int af, int type, int protocol, __in LPWSAPROTOCOL_INFOW lpProtocolInfo, GROUP g, DWORD dwFlags, LPINT lpErrno)
{
    ... [생략]...
    ::OutputDebugStringW(L"WSPSocket");

자... 이제 하나씩 업무 로직을 추가해주면 되는데요. 문제는 디버깅이 힘들다는 것! 왜냐하면 설치하자마자, 소켓 사용을 하는 모든 프로그램들에서 DLL을 로드해버리기 때문에 잠겨버려 다시 덮어쓸 수가 없습니다. 어쩔 수 없이 LSP 등록 해제 후에 시스템을 재부팅해야 하는 불편함이 있는데요. 제가 주로 사용하는 팁을 알려드리면,

IE BHO 개체를 개발할 때, 인터넷 익스플로러가 아닌 탐색기에서 활성화되는 문제 해결 
; https://www.sysnet.pe.kr/2/0/40

위와 같은 방식을 따라서, DllMain에서 원치 않는 프로세스인 경우 그냥 "return FALSE"를 해버립니다.

#if _DEBUG
    char fileName[MAX_PATH];
    if (GetModuleFileName(NULL, fileName, MAX_PATH) == 0)
    {
        return FALSE;
    }

    char fileNamePart[MAX_PATH] = { 0 };
    if (GetFileNamePart(fileName, fileNamePart, MAX_PATH) != 0)
    {
        return FALSE;
    }

    if (strcmp(fileNamePart, "LspInstall32") != 0
        && strcmp(fileNamePart, "iexplore") != 0)
    {
        return FALSE;
    }
#endif

애석하게도 LSP DLL의 DllMain에서 "return FALSE;"를 하면 그 프로세스에서는 소켓이 동작하지 않습니다. 하지만, 제한된 프로세스에서만 소켓을 동작시키고 테스트 후 그 프로그램만 종료하면 다시 빌드된 DLL을 적용할 수 있기 때문에 디버깅이 매우 용이합니다. 제 경우에는, 위의 트릭과 함께 가상 PC에 LSP를 설치하니 크게는 불편함 없이 개발을 할 수 있었습니다.

마지막으로... 위와 같은 작업들이 너무 불편하다 싶으면 신뢰할 수 있을 법한 3rd-party 기술을 구매하는 것도 방법입니다.

Komodia - 사용자 정의 LSP 솔루션 판매
; http://www.komodia.com/

위의 업체에서는 제가 이 글에서 설명한 "이름 기반으로 LSP 등록해제"와 같은 코드 등을 이미 구현한 LSP Installer를 제품화해서 판매하고 있습니다.

Komodia's advanvced LSP installer
; http://www.komodia.com/index.php?page=rlsp.html

물론, LSP 기반의 다양한 솔루션 제품 개발을 할 수 있는 템플릿 형식의 제품들을 같이 판매하고 있으니 시간이 촉박한 분들은 이런 회사의 제품을 구매하는 것이 더 현명할 수도 있겠습니다. 소스 코드 버전의 가격이 웬만한 개발자 1달 월급 정도뿐이 안되기 때문에 충분히 구매할 만한 매력은 있는 것 같습니다. ^^

참고로, 위의 개발사에서 제공하는 LSP Sample 코드는 다운로드하지 마세요. ^^ 마이크로소프트에서 제공한 예전 소스 코드 기반이라서 문제가 있습니다.

그 외 참고 자료 몇 가지 링크!

Categorizing LSPs and Applications
; https://learn.microsoft.com/en-us/windows/win32/winsock/categorizing-layered-service-providers-and-applications

Layered Service Providers in Vista/64-bit 
; http://winprogger.com/?p=74



[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]

[연관 글]






[최초 등록일: ]
[최종 수정일: 6/28/2023]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 



2013-08-20 01시52분
[나종식] 우선 좋은 소스 감사합니다.
하지만 win 7 에서 LSP 을 등록하였습니다.
그리고 cmd 창에서 ping www.hani.co.kr 을 치면 도메인에 해당되는 IP 을 얻기 위해 DNS Server 에게 요청을 합니다.
이때 UDP 통신이기 때문에 WSPSendTo 가 발생을 합니다.
하지만 win xp 에서는 잘되나 win 7 에서는 잘되지를 않습니다.

처음 cmd 창에서 ping www.hani.co.kr 을 치면 DNS Server 에게 묻기 전에 윈도우에 내장되어 있는 DNS Client 에게 먼저 묻습니다.
이때 LSP(Layerd Socket Provider) 모듈이 DNS Client 에 인젝션되어서 관여를 해야 하나 win 7 에서는 관여를 못하는 것 같습니다. win xp 에서는 잘되고요.
혹시 이런 문제에 대해서 고민을 하셨거나 해결방법을 알고 계신지요?
[guest]

1  2  3  4  5  6  [7]  8  9  10  11  12  13  14  15  ...
NoWriterDateCnt.TitleFile(s)
13455정성태11/25/20232452닷넷: 2168. C# - Azure.AI.OpenAI 패키지로 OpenAI 사용파일 다운로드1
13454정성태11/23/20232809닷넷: 2167. C# - Qdrant Vector DB를 이용한 Embedding 벡터 값 보관/조회 (Azure OpenAI) [1]파일 다운로드1
13453정성태11/23/20232312오류 유형: 879. docker desktop 설치 시 "Invalid JSON string. (Exception from HRESULT: 0x83750007)"
13452정성태11/22/20232417닷넷: 2166. C# - Azure OpenAI API를 이용해 사용자가 제공하는 정보를 대상으로 검색하는 방법파일 다운로드1
13451정성태11/21/20232547닷넷: 2165. C# - Azure OpenAI API를 이용해 ChatGPT처럼 동작하는 콘솔 응용 프로그램 제작파일 다운로드1
13450정성태11/21/20232355닷넷: 2164. C# - Octokit을 이용한 GitHub Issue 검색파일 다운로드1
13449정성태11/21/20232422개발 환경 구성: 688. Azure OpenAI 서비스 신청 방법
13448정성태11/20/20232666닷넷: 2163. .NET 8 - Dynamic PGO를 결합한 성능 향상파일 다운로드1
13447정성태11/16/20232549닷넷: 2162. ASP.NET Core 웹 사이트의 SSL 설정을 코드로 하는 방법
13446정성태11/16/20232479닷넷: 2161. .NET Conf 2023 - Day 1 Blazor 개요 정리
13445정성태11/15/20232802Linux: 62. 리눅스/WSL에서 CA 인증서를 저장하는 방법
13444정성태11/15/20232549닷넷: 2160. C# 12 - Experimental 특성 지원
13443정성태11/14/20232600개발 환경 구성: 687. OpenSSL로 생성한 사용자 인증서를 ASP.NET Core 웹 사이트에 적용하는 방법
13442정성태11/13/20232421개발 환경 구성: 686. 비주얼 스튜디오로 실행한 ASP.NET Core 사이트를 WSL 2 인스턴스에서 https로 접속하는 방법
13441정성태11/12/20232728닷넷: 2159. C# - ASP.NET Core 프로젝트에서 서버 Socket을 직접 생성하는 방법파일 다운로드1
13440정성태11/11/20232408Windows: 253. 소켓 Listen 시 방화벽의 Public/Private 제어 기능이 비활성화된 경우
13439정성태11/10/20232911닷넷: 2158. C# - 소켓 포트를 미리 시스템에 등록/예약해 사용하는 방법(Port Exclusion Ranges)파일 다운로드1
13438정성태11/9/20232511닷넷: 2157. C# - WinRT 기능을 이용해 윈도우에서 실행 중인 Media App 제어
13437정성태11/8/20232705닷넷: 2156. .NET 7 이상의 콘솔 프로그램을 (dockerfile 없이) 로컬 docker에 배포하는 방법
13436정성태11/7/20232960닷넷: 2155. C# - .NET 8 런타임부터 (Reflection 없이) 특성을 이용해 public이 아닌 멤버 호출 가능
13435정성태11/6/20232887닷넷: 2154. C# - 네이티브 자원을 포함한 관리 개체(예: 스레드)의 GC 정리
13434정성태11/1/20232655스크립트: 62. 파이썬 - class의 정적 함수를 동적으로 교체
13433정성태11/1/20232370스크립트: 61. 파이썬 - 함수 오버로딩 미지원
13432정성태10/31/20232439오류 유형: 878. 탐색기의 WSL 디렉터리 접근 시 "Attempt to access invalid address." 오류 발생
13431정성태10/31/20232770스크립트: 60. 파이썬 - 비동기 FastAPI 앱을 gunicorn으로 호스팅
13430정성태10/30/20232666닷넷: 2153. C# - 사용자가 빌드한 ICU dll 파일을 사용하는 방법
1  2  3  4  5  6  [7]  8  9  10  11  12  13  14  15  ...