2011-07-15 21 views
0

にコンパイルされた.NETアプリケーションからIMSAdminBaseを通してバイト配列を渡すときは、.NETコードの次の部分を考慮してくださいアクセス違反AnyCPU

byte[] hash = { 0x60, 0x2B, 0x45, 0x9D, 0xA0, 0x6D, 0xD5, 0x02, 0x43, 0x86, 0xC1, 0xBA, 0x6B, 0x14, 0x37, 0x88, 0x63, 0x08, 0x39, 0xA0 }; 
using (var adminBase = TemporaryComObject.Wrap(new MSAdminBase_W())) 
using (var ptrHash = new AllocHGlobal(hash)) 
{ 
    using (var siteKey = new AdminBaseKey(adminBase.Com, adminBase.Com.OpenKey(METADATA_MASTER_ROOT_HANDLE, "/LM/W3SVC/1", METADATA_PERMISSION_READ | METADATA_PERMISSION_WRITE, 10000))) 
    { 
    var record = new METADATA_RECORD 
    { 
     dwMDIdentifier = 5506, 
     dwMDAttributes = METADATA_INHERIT, 
     dwMDUserType = IIS_MD_UT_SERVER, 
     dwMDDataType = BINARY_METADATA, 
     pbMDData = ptrHash.Buffer, 
     dwMDDataLen = hash.Length 
    }; 
    adminBase.Com.SetData(siteKey.Handle, string.Empty, ref record); 
    } 
    adminBase.Com.SaveData(); 
} 

このコードからSSLCertHash IIS6メタベースプロパティを設定しようとし。ネット。

.NETアプリケーションは、次の行は、それぞれの.csprojファイル内で発見された意味、x86用にコンパイルされた場合、それは絶対に正常に動作:

<PlatformTarget>x86</PlatformTarget> 

私はこの行を省略し、用にコンパイルする場合しかし、ドラゴンが来ますAnyCPU。つまり、inetinfo.exeがアクセス違反でクラッシュすることがあります。以下は、windbg出力ウィンドウの関連するスナップショットです:

(24f0.cbc): Access violation - code c0000005 (first chance) 
First chance exceptions are reported before any exception handling. 
This exception may be expected and handled. 
msvcrt!memmove+0x1e5: 
000007fe`fe371111 8b040a   mov  eax,dword ptr [rdx+rcx] ds:00000000`00000010=???????? 
0:001> k 
Child-SP   RetAddr   Call Site 
00000000`008ee1f8 000007fe`f5a64e71 msvcrt!memmove+0x1e5 
00000000`008ee200 000007fe`f5a64da0 abocomp!PROPERTY_ENTRY::Create+0x79 
00000000`008ee230 000007fe`f5a5c21b abocomp!PROPERTY_BAG::SetData+0xbc 
00000000`008ee270 000007fe`f5a6088a abocomp!ABO_NODE::SetData+0xa3 
00000000`008ee2a0 000007fe`f5a9456f abocomp!ABO_WRAPPER::SetData+0x1ca 
00000000`008ee580 000007fe`f5ad3e54 COADMIN!CADMCOMW::SetData+0x127 
00000000`008ee630 000007fe`fdfd51d0 ADMWPROX!IMSAdminBaseW_R_SetData_Thunk+0xb4 
00000000`008ee6b0 000007fe`fdedf16e RPCRT4!NdrStubCall2+0xa36 
00000000`008eecd0 000007fe`fdee0ccd ole32!CStdStubBuffer_Invoke+0x8b 
00000000`008eed00 000007fe`fdee0c43 ole32!SyncStubInvoke+0x5d 
00000000`008eed70 000007fe`fdd9a4f0 ole32!StubInvoke+0xdb 
00000000`008eee20 000007fe`fdee14d6 ole32!CCtxComChnl::ContextInvoke+0x190 
00000000`008eefb0 000007fe`fdee122b ole32!AppInvoke+0xc2 
00000000`008ef020 000007fe`fdedfd6d ole32!ComInvokeWithLockAndIPID+0x52b 
00000000`008ef1b0 000007fe`fdfa50f4 ole32!ThreadInvoke+0x30d 
00000000`008ef250 000007fe`fdfa4f56 RPCRT4!DispatchToStubInCNoAvrf+0x14 
00000000`008ef280 000007fe`fdfa775b RPCRT4!RPC_INTERFACE::DispatchToStubWorker+0x146 
00000000`008ef3a0 000007fe`fdfa769b RPCRT4!RPC_INTERFACE::DispatchToStub+0x9b 
00000000`008ef3e0 000007fe`fdfa7632 RPCRT4!RPC_INTERFACE::DispatchToStubWithObject+0x5b 
00000000`008ef460 000007fe`fdfa532d RPCRT4!LRPC_SCALL::DispatchRequest+0x422 
00000000`008ef540 000007fe`fdfc2e7f RPCRT4!LRPC_SCALL::HandleRequest+0x20d 
00000000`008ef670 000007fe`fdfc2a35 RPCRT4!LRPC_ADDRESS::ProcessIO+0x3bf 
00000000`008ef7b0 00000000`7753b68b RPCRT4!LrpcIoComplete+0xa5 
00000000`008ef840 00000000`7753feff ntdll!TppAlpcpExecuteCallback+0x26b 
00000000`008ef8d0 00000000`76e5652d ntdll!TppWorkerThread+0x3f8 
00000000`008efbd0 00000000`7754c521 kernel32!BaseThreadInitThunk+0xd 
00000000`008efc00 00000000`00000000 ntdll!RtlUserThreadStart+0x1d 
0:001> g 
(24f0.cbc): Access violation - code c0000005 (!!! second chance !!!) 
msvcrt!memmove+0x1e5: 
000007fe`fe371111 8b040a   mov  eax,dword ptr [rdx+rcx] ds:00000000`00000010=???????? 

私は絶対に何が起こっているのかわかりません。あなたは?

追加情報

  1. 私はIIS6メタベースとIIS 7.5を、それが不可能であるため、私は、SSLCertHashメタベースプロパティを変更するためにSystem.DirectoryServicesを使用していない
  2. を有効にし、Windows 7の64ビットを実行しています - http://support.microsoft.com/kb/313624それを説明します。 This articleには、より多くの有益な情報が含まれています。
  3. タイプTemporaryComObject,AllocHGlobalAdminBaseKeyは、COMオブジェクト、管理されていないメモリ、および管理ベースキーがリリース/クローズのプロパティであることを確認します。
  4. MSAdminBase COMオブジェクトのinteropアセンブリは、http://www.moserware.com/2009/04/using-obscure-windows-com-apis-in-net.htmlに記載されている方法のバリエーションを使用して取得されました。それぞれのIDLファイルではなく、interopコードを再作成しませんでした。次に、MIDLでコンパイルしてそれぞれのTLBファイルを作成しました。これをTlbImpに渡してinteropアセンブリを作成しました。

METADATA_RECORD型のC定義がSDKからファイルmddefw.hに見出される:Iを生成していること、相互運用アセンブリで

typedef struct _METADATA_RECORD 
{ 
    DWORD dwMDIdentifier; 
    DWORD dwMDAttributes; 
    DWORD dwMDUserType; 
    DWORD dwMDDataType; 
    DWORD dwMDDataLen; 
    unsigned char *pbMDData; 
    DWORD dwMDDataTag; 
} METADATA_RECORD; 

、タイプはそうように宣言される:

[StructLayout(LayoutKind.Sequential, Pack=4), ComConversionLoss] 
public struct METADATA_RECORD 
{ 
    public int dwMDIdentifier; 
    public int dwMDAttributes; 
    public int dwMDUserType; 
    public int dwMDDataType; 
    public int dwMDDataLen; 
    [ComConversionLoss] 
    public IntPtr pbMDData; 
    public int dwMDDataTag; 
} 

ComConversionLoss属性が存在することに注意してください。それが重要かどうかはわからないが、私は相互運用機能アセンブリを作成したとき、私は次の警告だ:

TlbImp : warning TI3016: The type library importer could not convert the signature for the member 'MSAdminBaseLib.METADATA_RECORD.pbMDData'. [C:\Work\IISCertObj\SimpleNCServerSecurity.csproj] 

まさにこの問題を扱っている(まだ未回答)another post of mineがありますが。

ありがとうございました。

EDIT

私はそれがStructLayout.Pack = 4に関係している感覚を持っています。私はまだTlbImpに挿入しないようにする方法を学ぶ...

EDIT2

そして実際、それが問題です。 TlbImpによって生成される出力には、さらに微調整が必​​要です。 Reflector.NETで逆アセンブルして明示的なPack文を削除しなければならなかった。今はすべて正常に動作します。

答えて

0

私は問題を発見しました。実際にはPack = 4が問題を起こしました。

関連する問題