2 * ASSOC.C - assoc internal command.
7 * 14-Mar-2009 Lee C. Baker
8 * - initial implementation.
10 * 15-Mar-2009 Lee C. Baker
11 * - Don't write to (or use) HKEY_CLASSES_ROOT directly.
12 * - Externalize strings.
15 * - PrintAllAssociations could be optimized to not fetch all registry subkeys under 'Classes', just the ones that start with '.'
20 #ifdef INCLUDE_CMD_ASSOC
25 IN PCTSTR pszExtension
)
29 DWORD dwFileTypeLen
= 0;
32 lRet
= RegOpenKeyEx(hKeyClasses
, pszExtension
, 0, KEY_QUERY_VALUE
, &hKey
);
33 if (lRet
!= ERROR_SUCCESS
)
35 if (lRet
!= ERROR_FILE_NOT_FOUND
)
36 ErrorMessage(lRet
, NULL
);
40 /* Obtain the string length */
41 lRet
= RegQueryValueEx(hKey
, NULL
, NULL
, NULL
, NULL
, &dwFileTypeLen
);
43 /* If there is no default value, don't display it */
44 if (lRet
== ERROR_FILE_NOT_FOUND
)
49 if (lRet
!= ERROR_SUCCESS
)
51 ErrorMessage(lRet
, NULL
);
57 pszFileType
= cmd_alloc(dwFileTypeLen
* sizeof(TCHAR
));
60 WARN("Cannot allocate memory for pszFileType!\n");
62 return ERROR_NOT_ENOUGH_MEMORY
;
65 /* Obtain the actual file type */
66 lRet
= RegQueryValueEx(hKey
, NULL
, NULL
, NULL
, (LPBYTE
)pszFileType
, &dwFileTypeLen
);
69 if (lRet
!= ERROR_SUCCESS
)
71 ErrorMessage(lRet
, NULL
);
72 cmd_free(pszFileType
);
76 /* If there is a default key, display the relevant information */
77 if (dwFileTypeLen
!= 0)
79 ConOutPrintf(_T("%s=%s\n"), pszExtension
, pszFileType
);
82 cmd_free(pszFileType
);
88 IN PCTSTR pszExtension
)
93 lRet
= RegOpenKeyEx(HKEY_LOCAL_MACHINE
, _T("SOFTWARE\\Classes"), 0,
94 KEY_ENUMERATE_SUB_KEYS
, &hKeyClasses
);
95 if (lRet
!= ERROR_SUCCESS
)
97 ErrorMessage(lRet
, NULL
);
101 lRet
= PrintAssociationEx(hKeyClasses
, pszExtension
);
103 RegCloseKey(hKeyClasses
);
108 PrintAllAssociations(VOID
)
117 lRet
= RegOpenKeyEx(HKEY_LOCAL_MACHINE
, _T("SOFTWARE\\Classes"), 0,
118 KEY_QUERY_VALUE
| KEY_ENUMERATE_SUB_KEYS
, &hKeyClasses
);
119 if (lRet
!= ERROR_SUCCESS
)
121 ErrorMessage(lRet
, NULL
);
125 lRet
= RegQueryInfoKey(hKeyClasses
, NULL
, NULL
, NULL
, &dwNumKeys
, &dwExtLen
,
126 NULL
, NULL
, NULL
, NULL
, NULL
, NULL
);
127 if (lRet
!= ERROR_SUCCESS
)
129 ErrorMessage(lRet
, NULL
);
130 RegCloseKey(hKeyClasses
);
135 pszExtName
= cmd_alloc(dwExtLen
* sizeof(TCHAR
));
138 WARN("Cannot allocate memory for pszExtName!\n");
139 RegCloseKey(hKeyClasses
);
140 return ERROR_NOT_ENOUGH_MEMORY
;
143 for (dwKeyCtr
= 0; dwKeyCtr
< dwNumKeys
; ++dwKeyCtr
)
145 DWORD dwBufSize
= dwExtLen
;
146 lRet
= RegEnumKeyEx(hKeyClasses
, dwKeyCtr
, pszExtName
, &dwBufSize
,
147 NULL
, NULL
, NULL
, NULL
);
149 if (lRet
== ERROR_SUCCESS
|| lRet
== ERROR_MORE_DATA
)
151 /* Name starts with '.': this is an extension */
152 if (*pszExtName
== _T('.'))
153 PrintAssociationEx(hKeyClasses
, pszExtName
);
157 ErrorMessage(lRet
, NULL
);
158 cmd_free(pszExtName
);
159 RegCloseKey(hKeyClasses
);
164 RegCloseKey(hKeyClasses
);
166 cmd_free(pszExtName
);
167 return ERROR_SUCCESS
;
172 IN PCTSTR pszExtension
,
176 HKEY hKeyClasses
, hKey
;
178 lRet
= RegOpenKeyEx(HKEY_LOCAL_MACHINE
, _T("SOFTWARE\\Classes"), 0,
179 KEY_CREATE_SUB_KEY
, &hKeyClasses
);
180 if (lRet
!= ERROR_SUCCESS
)
182 ErrorMessage(lRet
, NULL
);
186 lRet
= RegCreateKeyEx(hKeyClasses
, pszExtension
, 0, NULL
, REG_OPTION_NON_VOLATILE
,
187 KEY_SET_VALUE
, NULL
, &hKey
, NULL
);
188 RegCloseKey(hKeyClasses
);
190 if (lRet
!= ERROR_SUCCESS
)
192 ErrorMessage(lRet
, NULL
);
196 lRet
= RegSetValueEx(hKey
, NULL
, 0, REG_SZ
,
197 (LPBYTE
)pszType
, (DWORD
)(_tcslen(pszType
) + 1) * sizeof(TCHAR
));
200 if (lRet
!= ERROR_SUCCESS
)
202 ErrorMessage(lRet
, NULL
);
206 return ERROR_SUCCESS
;
211 IN PCTSTR pszExtension
)
216 lRet
= RegOpenKeyEx(HKEY_LOCAL_MACHINE
, _T("SOFTWARE\\Classes"), 0,
217 KEY_QUERY_VALUE
, &hKeyClasses
);
218 if (lRet
!= ERROR_SUCCESS
)
220 ErrorMessage(lRet
, NULL
);
224 lRet
= RegDeleteKey(hKeyClasses
, pszExtension
);
225 RegCloseKey(hKeyClasses
);
227 if (lRet
!= ERROR_SUCCESS
)
229 if (lRet
!= ERROR_FILE_NOT_FOUND
)
230 ErrorMessage(lRet
, NULL
);
234 return ERROR_SUCCESS
;
238 INT
CommandAssoc(LPTSTR param
)
244 if (!_tcsncmp(param
, _T("/?"), 2))
246 ConOutResPaging(TRUE
, STRING_ASSOC_HELP
);
250 /* Print all associations if no parameter has been specified */
253 PrintAllAssociations();
257 pEqualSign
= _tcschr(param
, _T('='));
258 if (pEqualSign
!= NULL
)
260 PTSTR pszFileType
= pEqualSign
+ 1;
262 /* NULL-terminate at the equals sign */
265 /* If the equals sign is the last character
266 * in the string, delete the association. */
267 if (*pszFileType
== 0)
269 retval
= RemoveAssociation(param
);
272 /* Otherwise, add the association and print it out */
274 retval
= AddAssociation(param
, pszFileType
);
275 PrintAssociation(param
);
278 if (retval
!= ERROR_SUCCESS
)
280 if (retval
!= ERROR_FILE_NOT_FOUND
)
283 ConErrPrintf(_T("Error occurred while processing: %s.\n"), param
);
285 // retval = 1; /* Fixup the error value */
290 /* No equals sign, print the association */
291 retval
= PrintAssociation(param
);
292 if (retval
!= ERROR_SUCCESS
)
294 ConErrResPrintf(STRING_ASSOC_ERROR
, param
);
295 retval
= 1; /* Fixup the error value */
300 if (BatType
!= CMD_TYPE
)
303 nErrorLevel
= retval
;
307 nErrorLevel
= retval
;
313 #endif /* INCLUDE_CMD_ASSOC */