internal static uint Create(Guid guid, Guid iid, string serverName, ref object COMObj) { uint num = 0U; MULTI_QI[] array = new MULTI_QI[1]; array[0].SetIID(iid); try { COAUTHINFO authInfo = new COAUTHINFO(Authn.Winnt, Authz.None, AuthnLevel.Default, ImpLevel.Impersonate); COSERVERINFO coserverinfo = new COSERVERINFO(serverName); coserverinfo.SetAuthInfo(authInfo); try { ClsCtx dwClsContext = ClsCtx.InprocServer | ClsCtx.LocalServer | ClsCtx.RemoteServer; num = COMHelper.CoCreateInstanceEx(guid, null, (uint)dwClsContext, ref coserverinfo, (uint)array.Length, array); if (num != 0U) { return(num); } try { num = COMHelper.CoSetProxyBlanket(array[0].pItf, (int)authInfo.dwAuthnSvc, (int)authInfo.dwAuthzSvc, authInfo.pwszServerPrincName, (int)authInfo.dwAuthnLevel, (int)authInfo.dwImpersonationLevel, authInfo.pAuthIdentityData, authInfo.dwCapabilities); if (num != 0U) { return(num); } COMObj = Marshal.GetObjectForIUnknown(array[0].pItf); } finally { Marshal.Release(array[0].pItf); } } finally { coserverinfo.Dispose(); } } finally { array[0].Dispose(); } return(num); }
public static object[] CoCreateInstanceEx(Guid clsid, ClsCtx ctx, string servername, Guid[] iids, RpcAuthnSrv authent, RpcAuthzSrv author, string serverprinc, RpcAuthnLevel level, RpcImpersLevel impers, string domain, string user, string password) { int num = iids.Length; MULTI_QI[] amqi = new MULTI_QI[num]; IntPtr guidbuf = Marshal.AllocCoTaskMem(num * 16); // allocate memory for IIDs for (int i = 0; i < num; i++) { IntPtr piid = (IntPtr)((int)guidbuf + (i * 16)); Marshal.StructureToPtr(iids[i], piid, false); amqi[i] = new MULTI_QI(piid); } COAUTHIDENTITY ci = new COAUTHIDENTITY(user, domain, password); IntPtr ciptr = Marshal.AllocCoTaskMem(Marshal.SizeOf(ci)); Marshal.StructureToPtr(ci, ciptr, false); COAUTHINFO ca; if (string.IsNullOrEmpty(user)) { ca = new COAUTHINFO(authent, author, serverprinc, level, impers, IntPtr.Zero /* ptr to coauth*/); } else { ca = new COAUTHINFO(authent, author, serverprinc, level, impers, ciptr); } IntPtr captr = Marshal.AllocCoTaskMem(Marshal.SizeOf(ca)); Marshal.StructureToPtr(ca, captr, false); COSERVERINFO cs = new COSERVERINFO(servername, captr); int hr = CoCreateInstanceEx(ref clsid, IntPtr.Zero, (int)ctx, cs, num, amqi); Marshal.DestroyStructure(captr, typeof(COAUTHINFO)); Marshal.FreeCoTaskMem(captr); Marshal.FreeCoTaskMem(guidbuf); if (hr < 0) // FAILED() { Marshal.DestroyStructure(ciptr, typeof(COAUTHIDENTITY)); Marshal.FreeCoTaskMem(ciptr); return(null); } int refcount; object[] ifret = new object[num]; for (int i = 0; i < num; i++) { if (amqi[i].hr != 0) { ifret[i] = (int)amqi[i].hr; continue; } IntPtr ip = amqi[i].pItf; amqi[i].pItf = IntPtr.Zero; ifret[i] = Marshal.GetObjectForIUnknown(ip); refcount = Marshal.Release(ip); continue; #if COMPROXY hr = CoSetProxyBlanket(ip, authent, author, serverprinc, level, impers, ciptr, 0); if (hr < 0) // FAILED() { ifret[i] = (int)hr; } else { ifret[i] = Marshal.GetObjectForIUnknown(ip); } refcount = Marshal.Release(ip); #endif } Marshal.DestroyStructure(ciptr, typeof(COAUTHIDENTITY)); Marshal.FreeCoTaskMem(ciptr); return(ifret); }
public static object[] CoCreateInstanceEx(Guid clsid, ClsCtx ctx, string servername, Guid[] iids, RpcAuthnSrv authent, RpcAuthzSrv author, string serverprinc, RpcAuthnLevel level, RpcImpersLevel impers, string domain, string user, string password) { int num = iids.Length; MULTI_QI[] amqi = new MULTI_QI[num]; IntPtr guidbuf = Marshal.AllocCoTaskMem(num * 16); // allocate memory for IIDs for (int i = 0; i < num; i++) { IntPtr piid = (IntPtr)((int)guidbuf + (i * 16)); Marshal.StructureToPtr(iids[i], piid, false); amqi[i] = new MULTI_QI(piid); } COAUTHIDENTITY ci = new COAUTHIDENTITY(user, domain, password); IntPtr ciptr = Marshal.AllocCoTaskMem(Marshal.SizeOf(ci)); Marshal.StructureToPtr(ci, ciptr, false); COAUTHINFO ca; if (string.IsNullOrEmpty(user)) { ca = new COAUTHINFO(authent, author, serverprinc, level, impers, IntPtr.Zero /* ptr to coauth*/); } else { ca = new COAUTHINFO(authent, author, serverprinc, level, impers, ciptr); } IntPtr captr = Marshal.AllocCoTaskMem(Marshal.SizeOf(ca)); Marshal.StructureToPtr(ca, captr, false); COSERVERINFO cs = new COSERVERINFO(servername, captr); int hr = CoCreateInstanceEx(ref clsid, IntPtr.Zero, (int)ctx, cs, num, amqi); Marshal.DestroyStructure(captr, typeof(COAUTHINFO)); Marshal.FreeCoTaskMem(captr); Marshal.FreeCoTaskMem(guidbuf); if (hr < 0) // FAILED() { Marshal.DestroyStructure(ciptr, typeof(COAUTHIDENTITY)); Marshal.FreeCoTaskMem(ciptr); return null; } int refcount; object[] ifret = new object[num]; for (int i = 0; i < num; i++) { if (amqi[i].hr != 0) { ifret[i] = (int)amqi[i].hr; continue; } IntPtr ip = amqi[i].pItf; amqi[i].pItf = IntPtr.Zero; ifret[i] = Marshal.GetObjectForIUnknown(ip); refcount = Marshal.Release(ip); continue; #if COMPROXY hr = CoSetProxyBlanket(ip, authent, author, serverprinc, level, impers, ciptr, 0); if (hr < 0) // FAILED() ifret[i] = (int)hr; else ifret[i] = Marshal.GetObjectForIUnknown(ip); refcount = Marshal.Release(ip); #endif } Marshal.DestroyStructure(ciptr, typeof(COAUTHIDENTITY)); Marshal.FreeCoTaskMem(ciptr); return ifret; }