@@ -57,6 +57,7 @@ struct token_enum
5757 WCHAR * req , * opt ;
5858 ULONG count ;
5959 HKEY key ;
60+ DWORD index ;
6061};
6162
6263static struct token_enum * impl_from_ISpObjectTokenEnumBuilder ( ISpObjectTokenEnumBuilder * iface )
@@ -705,6 +706,12 @@ static HRESULT WINAPI token_enum_Next( ISpObjectTokenEnumBuilder *iface,
705706 ULONG * fetched )
706707{
707708 struct token_enum * This = impl_from_ISpObjectTokenEnumBuilder ( iface );
709+ struct object_token * object ;
710+ HRESULT hr ;
711+ DWORD retCode ;
712+ WCHAR subKeyName [128 ];
713+ DWORD size_sub = sizeof (subKeyName );
714+ HKEY sub_key ;
708715
709716 TRACE ( "(%p)->(%lu %p %p)\n" , This , num , tokens , fetched );
710717
@@ -713,7 +720,27 @@ static HRESULT WINAPI token_enum_Next( ISpObjectTokenEnumBuilder *iface,
713720 FIXME ( "semi-stub: Returning an empty enumerator\n" );
714721
715722 if (fetched ) * fetched = 0 ;
716- return S_FALSE ;
723+ * tokens = NULL ;
724+
725+ retCode = RegEnumKeyExW (This -> key , This -> index , subKeyName , & size_sub , NULL , NULL , NULL , NULL );
726+ if (retCode != ERROR_SUCCESS )
727+ return S_FALSE ;
728+
729+ This -> index ++ ;
730+
731+ if ( RegOpenKeyExW ( This -> key , subKeyName , 0 , KEY_READ , & sub_key ) != ERROR_SUCCESS )
732+ return E_FAIL ;
733+
734+ hr = token_create ( NULL , & IID_ISpObjectToken , (void * * )tokens );
735+ if (FAILED (hr ))
736+ return hr ;
737+
738+ object = impl_from_ISpObjectToken ( * tokens );
739+ object -> token_key = sub_key ;
740+ object -> token_id = heap_strdupW ( subKeyName );
741+
742+ if (fetched ) * fetched = 1 ;
743+ return hr ;
717744}
718745
719746static HRESULT WINAPI token_enum_Skip ( ISpObjectTokenEnumBuilder * iface ,
@@ -882,6 +909,7 @@ HRESULT token_enum_create( IUnknown *outer, REFIID iid, void **obj )
882909 This -> init = FALSE;
883910 This -> count = 0 ;
884911 This -> key = NULL ;
912+ This -> index = 0 ;
885913
886914 hr = ISpObjectTokenEnumBuilder_QueryInterface ( & This -> ISpObjectTokenEnumBuilder_iface , iid , obj );
887915
0 commit comments