/******************************************************************** * IInternetZoneManager_CreateZoneEnumerator */ static HRESULT WINAPI ZoneMgrImpl_CreateZoneEnumerator(IInternetZoneManagerEx2* iface, DWORD* pdwEnum, DWORD* pdwCount, DWORD dwFlags) { ZoneMgrImpl* This = impl_from_IInternetZoneManagerEx2(iface); LPDWORD * new_maps; LPDWORD data; DWORD i; TRACE("(%p)->(%p, %p, 0x%08x)\n", This, pdwEnum, pdwCount, dwFlags); if (!pdwEnum || !pdwCount || (dwFlags != 0)) return E_INVALIDARG; data = build_zonemap_from_reg(); TRACE("found %d zones\n", data ? data[0] : -1); if (!data) return E_FAIL; for (i = 0; i < This->zonemap_count; i++) { if (This->zonemaps && !This->zonemaps[i]) { This->zonemaps[i] = data; *pdwEnum = i; *pdwCount = data[0]; return S_OK; } } if (This->zonemaps) { /* try to double the nr. of pointers in the array */ new_maps = heap_realloc_zero(This->zonemaps, This->zonemap_count * 2 * sizeof(LPDWORD)); if (new_maps) This->zonemap_count *= 2; } else { This->zonemap_count = 2; new_maps = heap_alloc_zero(This->zonemap_count * sizeof(LPDWORD)); } if (!new_maps) { heap_free(data); return E_FAIL; } This->zonemaps = new_maps; This->zonemaps[i] = data; *pdwEnum = i; *pdwCount = data[0]; return S_OK; }
/*********************************************************************** * build_zonemap_from_reg [internal] * * Enumerate the Zones in the Registry and return the Zones in a DWORD-array * The number of the Zones is returned in data[0] */ static LPDWORD build_zonemap_from_reg(void) { WCHAR name[32]; HKEY hkey; LPDWORD data = NULL; DWORD allocated = 6; /* space for the zonecount and Zone "0" up to Zone "4" */ DWORD used = 0; DWORD res; DWORD len; res = RegOpenKeyW(HKEY_CURRENT_USER, wszZonesKey, &hkey); if (res) return NULL; data = heap_alloc(allocated * sizeof(DWORD)); if (!data) goto cleanup; while (!res) { name[0] = '\0'; len = sizeof(name) / sizeof(name[0]); res = RegEnumKeyExW(hkey, used, name, &len, NULL, NULL, NULL, NULL); if (!res) { used++; if (used == allocated) { LPDWORD new_data; allocated *= 2; new_data = heap_realloc_zero(data, allocated * sizeof(DWORD)); if (!new_data) goto cleanup; data = new_data; } data[used] = atoiW(name); } } if (used) { RegCloseKey(hkey); data[0] = used; return data; } cleanup: /* something failed */ RegCloseKey(hkey); heap_free(data); return NULL; }
static HRESULT WINAPI rowpos_cp_Advise(IConnectionPoint *iface, IUnknown *unksink, DWORD *cookie) { rowpos_cp *This = impl_from_IConnectionPoint(iface); IRowPositionChange *sink; HRESULT hr; DWORD i; TRACE("(%p)->(%p %p)\n", This, unksink, cookie); if (!cookie) return E_POINTER; hr = IUnknown_QueryInterface(unksink, &IID_IRowPositionChange, (void**)&sink); if (FAILED(hr)) { FIXME("sink doesn't support IRowPositionChange\n"); return CONNECT_E_CANNOTCONNECT; } if (This->sinks) { for (i = 0; i < This->sinks_size; i++) { if (!This->sinks[i]) break; } if (i == This->sinks_size) { This->sinks_size *= 2; This->sinks = heap_realloc_zero(This->sinks, This->sinks_size*sizeof(*This->sinks)); } } else { This->sinks_size = 10; This->sinks = heap_alloc_zero(This->sinks_size*sizeof(*This->sinks)); i = 0; } This->sinks[i] = sink; if (cookie) *cookie = i + 1; return S_OK; }
static BOOL alloc_handler_vector(event_target_t *event_target, eventid_t eid, int cnt) { handler_vector_t *new_vector, *handler_vector = event_target->event_table[eid]; if(handler_vector) { if(cnt <= handler_vector->handler_cnt) return TRUE; new_vector = heap_realloc_zero(handler_vector, sizeof(handler_vector_t) + sizeof(IDispatch*)*cnt); }else { new_vector = heap_alloc_zero(sizeof(handler_vector_t) + sizeof(IDispatch*)*cnt); } if(!new_vector) return FALSE; new_vector->handler_cnt = cnt; event_target->event_table[eid] = new_vector; return TRUE; }
static void add_func_info(dispex_data_t *data, DWORD *size, tid_t tid, const FUNCDESC *desc, ITypeInfo *dti) { func_info_t *info; HRESULT hres; for(info = data->funcs; info < data->funcs+data->func_cnt; info++) { if(info->id == desc->memid) { if(info->tid != tid) return; /* Duplicated in other interface */ break; } } if(info == data->funcs+data->func_cnt) { if(data->func_cnt == *size) data->funcs = heap_realloc_zero(data->funcs, (*size <<= 1)*sizeof(func_info_t)); info = data->funcs+data->func_cnt; hres = ITypeInfo_GetDocumentation(dti, desc->memid, &info->name, NULL, NULL, NULL); if(FAILED(hres)) return; data->func_cnt++; info->id = desc->memid; info->tid = tid; info->func_disp_idx = -1; info->prop_vt = VT_EMPTY; } if(desc->invkind & DISPATCH_METHOD) { unsigned i; info->func_disp_idx = data->func_disp_cnt++; info->argc = desc->cParams; assert(info->argc < MAX_ARGS); assert(desc->funckind == FUNC_DISPATCH); info->arg_types = heap_alloc(sizeof(*info->arg_types) * info->argc); if(!info->arg_types) return; /* FIXME: real error instead of fallback */ for(i=0; i < info->argc; i++) info->arg_types[i] = desc->lprgelemdescParam[i].tdesc.vt; info->prop_vt = desc->elemdescFunc.tdesc.vt; if(info->prop_vt != VT_VOID && !is_arg_type_supported(info->prop_vt)) { TRACE("%s: return type %d\n", debugstr_w(info->name), info->prop_vt); return; /* Fallback to ITypeInfo::Invoke */ } if(desc->cParamsOpt) { TRACE("%s: optional params\n", debugstr_w(info->name)); return; /* Fallback to ITypeInfo::Invoke */ } for(i=0; i < info->argc; i++) { if(!is_arg_type_supported(info->arg_types[i])) { return; /* Fallback to ITypeInfo for unsupported arg types */ } if(desc->lprgelemdescParam[i].u.paramdesc.wParamFlags & PARAMFLAG_FHASDEFAULT) { TRACE("%s param %d: default value\n", debugstr_w(info->name), i); return; /* Fallback to ITypeInfo::Invoke */ } } assert(info->argc <= MAX_ARGS); assert(desc->callconv == CC_STDCALL); info->call_vtbl_off = desc->oVft/sizeof(void*); }else if(desc->invkind & (DISPATCH_PROPERTYPUT|DISPATCH_PROPERTYGET)) { VARTYPE vt = VT_EMPTY; if(desc->invkind & DISPATCH_PROPERTYGET) { vt = desc->elemdescFunc.tdesc.vt; info->get_vtbl_off = desc->oVft/sizeof(void*); } if(desc->invkind & DISPATCH_PROPERTYPUT) { assert(desc->cParams == 1); vt = desc->lprgelemdescParam->tdesc.vt; info->put_vtbl_off = desc->oVft/sizeof(void*); } assert(info->prop_vt == VT_EMPTY || vt == info->prop_vt); info->prop_vt = vt; } }