성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] Java - How to use the Foreign Funct...
[정성태] 제가 큰 실수를 했군요. ^^; Delegate를 통한 Bein...
[정성태] Working with Rust Libraries from C#...
[정성태] Detecting blocking calls using asyn...
[정성태] 아쉽게도, 커뮤니티는 아니고 개인 블로그입니다. ^^
[정성태] 질문이 잘 이해가 안 됩니다. 우선, 해당 소스코드에서 ILis...
[양승조
] var대신 dinamic으로 선언해서 해결은 했습니다. 맞는 해...
[양승조
] 또 막혔습니다. ㅠㅠ var list = props[i].Ge...
[양승조
] 아. 감사합니다. 어제는 안됐던것 같은데....정신을 차려야겠네...
[정성태] "props[i].GetValue(props[i])" 코드에서 ...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<div style='display: inline'> <div style='font-family: 맑은 고딕, Consolas; font-size: 20pt; color: #006699; text-align: center; font-weight: bold'>Winsock 2 Layered Service Provider - Visual Studio 2010용 프로젝트</div> <br /> 2001년도였군요. 처음 VC++ 6.0으로 빌드 가능한 예제를 올려놓았던 것이.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > LSP 예제 (VC ++ 6.0) 2001.08.07 ; <a target='_tab' href='http://www.sysnet.pe.kr/2/2/28'>http://www.sysnet.pe.kr/2/2/28</a> </pre> <br /> 위에서 공개한 VC++ 프로젝트는 그 당시 MSJ 기사에 실렸던 아래의 글에 공개된 소스 코드를 기반으로 한 것이었습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > Unraveling the Mysteries of Writing a Winsock 2 Layered Service Provider ; <a target='_tab' href='http://www.microsoft.com/msj/0599/layeredservice/layeredservice.aspx'>http://www.microsoft.com/msj/0599/layeredservice/layeredservice.aspx</a> </pre> <br /> 10년 가까운 세월이 흘렀으니 당연히 그 때의 소스 코드로는 Windows 7 64비트 운영체제에서 소화되지는 않습니다. 이러한 변화에 맞게, 마이크로소프트는 LSP 관련 예제를 connect 사이트를 통해서 업데이트했습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > Windows Networking Platform for Developers ; <a target='_tab' href='https://connect.microsoft.com/WNDP'>https://connect.microsoft.com/WNDP</a> Layered Service Provider (LSP) Best Practices Whitepaper ; <a target='_tab' href='https://connect.microsoft.com/WNDP/Downloads/DownloadDetails.aspx?DownloadID=1540'>https://connect.microsoft.com/WNDP/Downloads/DownloadDetails.aspx?DownloadID=1540</a> WinSock LSP Sample ; <a target='_tab' href='https://connect.microsoft.com/WNDP/Downloads/DownloadDetails.aspx?DownloadID=941'>https://connect.microsoft.com/WNDP/Downloads/DownloadDetails.aspx?DownloadID=941</a> </pre> <br /> 날짜상으로 보면, "Windows SDK"에 실린 예제 코드가 더욱 최신 버전임을 알 수 있습니다. 따라서 가능한 아래의 링크에서 "Windows SDK"를 다운로드 받고,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > Microsoft Windows Software Development Kit ; <a target='_tab' href='https://www.microsoft.com/en-us/download/details.aspx?id=8279'>https://www.microsoft.com/en-us/download/details.aspx?id=8279</a> </pre> <br /> "C:\Program Files\Microsoft SDKs\Windows\v7.0\Samples\netds\winsock\lsp" 경로로 이동하면 곧바로 사용할 수 있는 동작 가능한 프로젝트가 폴더별로 실려 있습니다. 폴더의 의미는 각각 다음과 같습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > common - 설치 프로젝트와 LSP 예제에서 공통으로 사용하는 소스 코드 ifslsp - IFS LSP 예제 install - LSP DLL 설치/제거 프로젝트 nonifslsp - non-IFS LSP 예제 </pre> <br /> <hr style='width: 50%' /><br /> <br /> IFS와 non-IFS에 대한 차이는 지난번 글에서 간략하게 이미 설명드렸습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > 개발자가 선택할 수 있는 윈도우에서의 네트워크 프로그래밍 기술 ; <a target='_tab' href='http://www.sysnet.pe.kr/2/0/968'>http://www.sysnet.pe.kr/2/0/968</a> </pre> <br /> non-IFS가 IFS의 superset이라고 볼 수 있기 때문에 여기서는 non-IFS 프로젝트에 대한 것만 Visual Studio 2010에서 사용할 수 있도록 변환해서 공개합니다. 변환 과정에서 다음과 같은 변경이 있었습니다.<br /> <br /> <ul> <li>install 프로젝트 명을 LspInstall로 변경</li> <li>nonifslsp 프로젝트 명을 LspProxy로 변경</li> <li>LspInstall의 경우 MANIFEST_RESOURCE_ID 삭제하고 Visual Studio 2010에서 옵션으로 제공하는 /MANIFESTUAC:"level='requireAdministrator'로 대체</li> <li>InitializeListHead와 같은 Macro 사용을 위해 Msputils.h 파일로 변경</li> <li>모든 cpp 파일에 stdafx.h 헤더 파일을 포함하도록 변경</li> </ul> <br /> 참고로, 처음에는 의욕에 차서 ^^ Unicode용으로 소스 코드를 변경해서 빌드했는데 동작을 하지 않았습니다. 다시 "Multi-Byte Character Set"으로 변경하고 나서야 정상 동작을 했는데, 이유는 여전히 모르겠습니다. 직접적인 소스 코드의 변경은 Install 프로젝트의 "insllsp.cpp"에 "-d" 옵션을 처리하는 코드에서 버그를 수정하는 것만 있었습니다.<br /> <br /> 원본 코드는 아래인데,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > 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; </pre> <br /> _strnicmp 부분을 다음과 같이 변경해 줘야 합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > if (_strnicmp(argv[i], "-d32", 4)<b style='COLOR: blue'> == 0</b>) </pre> <br /> 첨부된 build_script.bat 파일을 Visual Studio 2010 명령행에서 실행하면 다음과 같은 실행 파일들을 얻을 수 있습니다.<br /> <br /> <ul> <li>LspInstall32.exe</li> <li>LspInstall64.exe</li> <li>LspProxy32.dll</li> <li>LspProxy64.dll</li> </ul> <br /> <hr style='width: 50%' /><br /> <br /> 빌드 후 설치 과정은 간단합니다. 일단, 현재 설치되어 있는 LSP 목록을 확인해야 하는데, 아래는 LspInstall32.exe를 32비트 XP에서 실행한 예입니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > D:\temp\lsp><b style='COLOR: blue'>LspInstall32.exe -p</b> Winsock 32-bit Catalog: ======================= <b style='COLOR: blue'>1001 - MSAFD Tcpip [TCP/IP] 1002 - MSAFD Tcpip [UDP/IP] </b>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 </pre> <br /> 64비트의 경우에는 옵션이 달라지는 데 아래는 Windows 7 64비트 운영체제에서 실행한 예입니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > D:\Settings\desktop\lsp_build\Lsp\bin\Release><b style='COLOR: blue'>lspinstall64 -p -c b</b> Winsock 32-bit Catalog: ======================= <b style='COLOR: blue'>1001 - MSAFD Tcpip [TCP/IP] 1002 - MSAFD Tcpip [UDP/IP] </b>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: ======================= <b style='COLOR: blue'>1001 - MSAFD Tcpip [TCP/IP] 1002 - MSAFD Tcpip [UDP/IP] </b>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] </pre> <br /> 만약, 여러분이 만든 ifslsp DLL을 TCP/IP, UDP/IP base provider 위에 올리고 싶다면 다음과 같이 Catalog ID를 적어주어서 실행하면 됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > === XP 32비트 === lspinstall32 -i <b style='COLOR: blue'>-o 1001 -o 1002</b> -n "MyLsp" -d D:\bin\Release\LspProxy32.dll </pre> <br /> 마이크로소프트에서 제공한 ifslsp 예제는 모든 base provider 위에서도 실행이 가능한 소스 코드이기 때문에 특정 Base Provider의 Catalog ID를 지정할 필요 없이 다음과 같이 설치해 주어도 정상적으로 동작이 됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > === XP 32비트 === lspinstall32 -i <b style='COLOR: blue'>-a</b> -n "MyLsp" -d D:\bin\Release\LspProxy32.dll </pre> <br /> <span style='text-decoration: line-through'>제가 직접해보았는데, XP의 경우에는 특정 TCP/IP, UDP/IP 위에만 올리는 것이 가능했는데 Windows 7 64비트에서는 그렇게 올리는 경우 동작하지 않았습니다. 대신 -a 옵션으로 설정하니 정상적으로 동작을 했고!<br /> <br /> x64 운영체제에 설치할 때는 32비트, 64비트 LSP를 아래에서처럼 모두 한꺼번에 지정해 주어야 합니다. </span><br /> x64 운영체제에는 32비트에 대해서 개별적으로 설치하는 것이 가능하지만, 64비트를 설치하는 경우에는 아래와 같이 무조건 32비트 DLL과 함께 등록해 줘야 합니다.<br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > lspinstall64 <b style='COLOR: blue'>-c b</b> -i -a -n "MyLsp" <b style='COLOR: blue'>-d</b> D:\bin\Release\LspProxy64.dll <b style='COLOR: blue'>-d32</b> D:\bin\Release\LspProxy32.dll </pre> <br /> 64비트 운영체제에서 32비트 단독 설치는 아래와 같이 해주면 되고!<br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > lspinstall32 -i -a -n "MyLsp" <b style='COLOR: blue'>-d</b> D:\bin\Release\LspProxy32.dll </pre> <br /> 정상적으로 설치되면 -p 옵션으로 확인하면 아래와 같이 출력되는 것을 확인할 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > <div style='font-family: 맑은 고딕, Consolas; font-size: 12pt; color: #2211AA; text-align: left; font-weight: bold'>=== XP 32비트 ===</div><br /> D:\bin\Release>LspInstall32.exe <b style='COLOR: blue'>-p</b> Winsock 32-bit Catalog: ======================= <b style='COLOR: blue'>1017 - MyLsp over [MSAFD Tcpip [TCP/IP]] 1018 - MyLsp over [MSAFD Tcpip [UDP/IP]] </b>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 <b style='COLOR: blue'>1016 - MyLsp</b> <div style='font-family: 맑은 고딕, Consolas; font-size: 12pt; color: #2211AA; text-align: left; font-weight: bold'>=== Windows 7 64비트 ===</div><br /> D:\bin\Release>lspinstall64 <b style='COLOR: blue'>-p -c b</b> Winsock 32-bit Catalog: ======================= <b style='COLOR: blue'>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]] </b>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] <b style='COLOR: blue'>1045 - MyLsp</b> Winsock 64-bit Catalog: ======================= <b style='COLOR: blue'>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]] </b>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] <b style='COLOR: blue'>1044 - MyLsp</b> </pre> <br /> 여기서 잠깐 용어를 살펴보고 지나가겠습니다.<br /> <br /> 기존에 있던 "1001 - MSFAD Tcpip [TCP/IP]" 등을 "Base Provider"라고 하고, 마지막에 새로 생성된 "1044 - MyLsp"를 "Layered Provider", 그리고 "over"라는 단어가 붙은 "1047 - MyLsp over [MSAFD Tcpip [UDP/IP]]"와 같은 항목을 "Protocol Chain"이라고 합니다.<br /> <br /> 이 때문에 "Protocol Chain"은 LSP 간의 로드 순서를 지칭하는 것일 뿐 실제 "LSP"를 가리키는 것이 아니므로 삭제 시에는 "Layered Provider"의 Catalog ID를 지정해 주면 자동적으로 "Protocol Chain"들까지 모두 해제됩니다.<br /> <br /> 따라서, 다음과 같이 실행해 주면 삭제가 됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > === XP 32비트 === lspinstall32 <b style='COLOR: blue'>-r 1016</b> === Windows 7 64비트 === lspinstall64 <b style='COLOR: blue'>-r 1045</b> lspinstall64 <b style='COLOR: blue'>-c 3 -r 1044</b> </pre> <br /> 보는 것처럼, "-r" 옵션 다음에 지정하는 Catalog Id 값은 시스템 상황에 따라, LSP를 설치할 때마다 변경되므로 그때그때 번호를 확인해서 지정해 줘야 합니다. 게다가 64비트의 경우에는 LSP 32비트/64비트에 할당된 번호도 다르고 개별적으로 2번 실행해서 각각 삭제를 해줘야 합니다.<br /> <br /> 물론, 코드를 추가하면 이름 기반으로 삭제를 해주는 것도 가능합니다. 그 부분은 현재 마이크로소프트 예제 코드에서 제공이 안되고 있지만, LspInstall 프로젝트의 내부 코드를 보면 쉽게 만들 수 있습니다.<br /> <br /> <hr style='width: 50%' /><br /> <br /> "-p" 옵션과 함께 "-v" 옵션을 함께 주면 상세 보기 화면이 제공됩니다. 아래는 MyLsp에 대한 정보를 보여줍니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > 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 <b style='COLOR: blue'>Number of Chain Entries: 0 {}</b> 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 </pre> <br /> 위에서 보면, "Number of Chain Entries"의 값에 0이 할당되어 있는데요. 이 값이 0인 것들이 바로 "Layered Provider"입니다. "Protocol Chain"은 "Number of Chain Entries" 값에 2 이상의 값이 옵니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > 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 <b style='COLOR: blue'>Number of Chain Entries: 2 {1070 1001 }</b> 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 </pre> <br /> Base Provider는 아래에서처럼 "1" 값이고.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > 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 <b style='COLOR: blue'>Number of Chain Entries: 1 {0 }</b> 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 </pre> <br /> 위의 값들은 코드에서 ChainLen 값으로도 알아낼 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > 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; </pre> <br /> <hr style='width: 50%' /><br /> <br /> 정리를 한번 해볼까요?<br /> <br /> <a target='_tab' href='http://www.sysnet.pe.kr/bbs/DownloadAttachment.aspx?fid=567&boardid=331301885'>첨부한 프로젝트는 Visual Studio 2010에서 빌드가능한 프로젝트</a>이니 다운로드해서 컴파일을 하거나, build_script.bat를 실행해줍니다. 빌드된 DLL들로 위에서 설명한 설치 방법에 따르면 정상적으로 로컬에 설치가 될 것입니다. 사실, 설치 이후에 달라진 점을 확인할 수가 없는데, 첨부된 프로젝트의 경우 다음과 같이 WSPSocket에 로그를 남겨두었기 때문에 DebugView를 실행하고 Internet Explorer를 실행한 후 웹 사이트를 방문해서 확인해 볼 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > SOCKET WSPAPI WSPSocket(int af, int type, int protocol, __in LPWSAPROTOCOL_INFOW lpProtocolInfo, GROUP g, DWORD dwFlags, LPINT lpErrno) { ... [생략]... ::OutputDebugStringW(L"WSPSocket"); </pre> <br /> 자... 이제 하나씩 업무 로직을 추가해주면 되는데요. 문제는 디버깅이 힘들다는 것! 왜냐하면 설치하자마자, 소켓 사용을 하는 모든 프로그램들에서 DLL을 로드해버리기 때문에 잠겨버려 다시 덮어쓸 수가 없습니다. 어쩔 수 없이 LSP 등록 해제 후에 시스템을 재부팅해야 하는 불편함이 있는데요. 제가 주로 사용하는 팁을 알려드리면,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > IE BHO 개체를 개발할 때, 인터넷 익스플로러가 아닌 탐색기에서 활성화되는 문제 해결 ; <a target='_tab' href='http://www.sysnet.pe.kr/2/0/40'>http://www.sysnet.pe.kr/2/0/40</a> </pre> <br /> 위와 같은 방식을 따라서, DllMain에서 원치 않는 프로세스인 경우 그냥 "return FALSE"를 해버립니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > #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; } <b style='COLOR: blue'>if (strcmp(fileNamePart, "LspInstall32") != 0 && strcmp(fileNamePart, "iexplore") != 0) { return FALSE; }</b> #endif </pre> <br /> 애석하게도 LSP DLL의 DllMain에서 "return FALSE;"를 하면 그 프로세스에서는 소켓이 동작하지 않습니다. 하지만, 제한된 프로세스에서만 소켓을 동작시키고 테스트 후 그 프로그램만 종료하면 다시 빌드된 DLL을 적용할 수 있기 때문에 디버깅이 매우 용이합니다. 제 경우에는, 위의 트릭과 함께 가상 PC에 LSP를 설치하니 크게는 불편함 없이 개발을 할 수 있었습니다.<br /> <br /> 마지막으로... 위와 같은 작업들이 너무 불편하다 싶으면 신뢰할 수 있을 법한 3rd-party 기술을 구매하는 것도 방법입니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > Komodia - 사용자 정의 LSP 솔루션 판매 ; <a target='_tab' href='http://www.komodia.com/'>http://www.komodia.com/</a> </pre> <br /> 위의 업체에서는 제가 이 글에서 설명한 "이름 기반으로 LSP 등록해제"와 같은 코드 등을 이미 구현한 LSP Installer를 제품화해서 판매하고 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > Komodia's advanvced LSP installer ; <a target='_tab' href='http://www.komodia.com/index.php?page=rlsp.html'>http://www.komodia.com/index.php?page=rlsp.html</a> </pre> <br /> 물론, LSP 기반의 다양한 솔루션 제품 개발을 할 수 있는 템플릿 형식의 제품들을 같이 판매하고 있으니 시간이 촉박한 분들은 이런 회사의 제품을 구매하는 것이 더 현명할 수도 있겠습니다. 소스 코드 버전의 가격이 웬만한 개발자 1달 월급 정도뿐이 안되기 때문에 충분히 구매할 만한 매력은 있는 것 같습니다. ^^<br /> <br /> 참고로, 위의 개발사에서 제공하는 LSP Sample 코드는 다운로드하지 마세요. ^^ 마이크로소프트에서 제공한 예전 소스 코드 기반이라서 문제가 있습니다.<br /> <br /> 그 외 참고 자료 몇 가지 링크!<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > Categorizing LSPs and Applications ; <a target='_tab' href='https://learn.microsoft.com/en-us/windows/win32/winsock/categorizing-layered-service-providers-and-applications'>https://learn.microsoft.com/en-us/windows/win32/winsock/categorizing-layered-service-providers-and-applications</a> Layered Service Providers in Vista/64-bit ; <a target='_tab' href='http://winprogger.com/?p=74'>http://winprogger.com/?p=74</a> </pre> <br /><br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
1141
(왼쪽의 숫자를 입력해야 합니다.)