1 #include <stdarg.h> 2 #include <string.h> 3 #include <stdio.h> 4 #include <windows.h> 5 #include <ddk/ntddk.h> 6 #include <rosrtl/string.h> 7 8 HANDLE OutputHandle; 9 HANDLE InputHandle; 10 11 void dprintf(char* fmt, ...) 12 { 13 va_list args; 14 char buffer[255]; 15 16 va_start(args,fmt); 17 vsprintf(buffer,fmt,args); 18 WriteConsoleA(OutputHandle, buffer, strlen(buffer), NULL, NULL); 19 va_end(args); 20 } 21 22 void do_enumeratekey(PWSTR Name) 23 { 24 ULONG Index,Length,i; 25 KEY_BASIC_INFORMATION KeyInformation[5]; 26 NTSTATUS Status; 27 OBJECT_ATTRIBUTES ObjectAttributes; 28 HANDLE hKey1; 29 UNICODE_STRING KeyName; 30 31 RtlInitUnicodeString(&KeyName, Name); 32 InitializeObjectAttributes(&ObjectAttributes, &KeyName, OBJ_CASE_INSENSITIVE 33 , NULL, NULL); 34 Status=NtOpenKey( &hKey1, MAXIMUM_ALLOWED, &ObjectAttributes); 35 dprintf("NtEnumerateKey : \n"); 36 Index=0; 37 while(Status == STATUS_SUCCESS) 38 { 39 Status=NtEnumerateKey(hKey1,Index++,KeyBasicInformation 40 ,&KeyInformation[0], sizeof(KeyInformation) 41 ,&Length); 42 if(Status== STATUS_SUCCESS) 43 { 44 dprintf("\tSubKey Name = "); 45 for (i=0;i<KeyInformation[0].NameLength/2;i++) 46 dprintf("%C",KeyInformation[0].Name[i]); 47 dprintf("\n"); 48 } 49 } 50 NtClose(hKey1); 51 } 52 53 void test1(void) 54 { 55 HKEY hKey = NULL, hKey1; 56 OBJECT_ATTRIBUTES ObjectAttributes; 57 NTSTATUS Status; 58 UNICODE_STRING KeyName = ROS_STRING_INITIALIZER(L"\\Registry"); 59 ULONG Index,Length,i; 60 KEY_BASIC_INFORMATION KeyInformation[5]; 61 KEY_VALUE_FULL_INFORMATION KeyValueInformation[5]; 62 63 dprintf("NtOpenKey \\Registry : "); 64 InitializeObjectAttributes(&ObjectAttributes, 65 &KeyName, 66 OBJ_CASE_INSENSITIVE, 67 NULL, 68 NULL); 69 Status=NtOpenKey( &hKey1, MAXIMUM_ALLOWED, &ObjectAttributes); 70 dprintf("\t\t\t\tStatus =%x\n",Status); 71 if(Status==0) 72 { 73 dprintf("NtQueryKey : "); 74 Status=NtQueryKey(hKey1,KeyBasicInformation 75 ,&KeyInformation[0], sizeof(KeyInformation) 76 ,&Length); 77 dprintf("\t\t\t\t\tStatus =%x\n",Status); 78 if (Status == STATUS_SUCCESS) 79 { 80 dprintf("\tKey Name = "); 81 for (i=0;i<KeyInformation[0].NameLength/2;i++) 82 dprintf("%C",KeyInformation[0].Name[i]); 83 dprintf("\n"); 84 } 85 dprintf("NtEnumerateKey : \n"); 86 Index=0; 87 while(Status == STATUS_SUCCESS) 88 { 89 Status=NtEnumerateKey(hKey1,Index++,KeyBasicInformation 90 ,&KeyInformation[0], sizeof(KeyInformation) 91 ,&Length); 92 if(Status== STATUS_SUCCESS) 93 { 94 dprintf("\tSubKey Name = "); 95 for (i=0;i<KeyInformation[0].NameLength/2;i++) 96 dprintf("%C",KeyInformation[0].Name[i]); 97 dprintf("\n"); 98 } 99 } 100 dprintf("NtClose : "); 101 Status = NtClose( hKey1 ); 102 dprintf("\t\t\t\t\tStatus =%x\n",Status); 103 } 104 NtClose(hKey); 105 106 dprintf("NtOpenKey \\Registry\\Machine : "); 107 RtlRosInitUnicodeStringFromLiteral(&KeyName, L"\\Registry\\Machine"); 108 InitializeObjectAttributes(&ObjectAttributes, 109 &KeyName, 110 OBJ_CASE_INSENSITIVE, 111 NULL, 112 NULL); 113 Status=NtOpenKey( &hKey1, MAXIMUM_ALLOWED, &ObjectAttributes); 114 dprintf("\t\t\tStatus =%x\n",Status); 115 116 dprintf("NtOpenKey System\\Setup : "); 117 RtlRosInitUnicodeStringFromLiteral(&KeyName, L"System\\Setup"); 118 InitializeObjectAttributes(&ObjectAttributes, &KeyName, OBJ_CASE_INSENSITIVE 119 , hKey1 , NULL); 120 Status = NtOpenKey ( &hKey, KEY_READ , &ObjectAttributes); 121 dprintf("\t\t\tStatus =%x\n",Status); 122 if(Status==0) 123 { 124 dprintf("NtQueryValueKey : "); 125 RtlRosInitUnicodeStringFromLiteral(&KeyName, L"CmdLine"); 126 Status=NtQueryValueKey(hKey,&KeyName,KeyValueFullInformation 127 ,&KeyValueInformation[0], sizeof(KeyValueInformation) 128 ,&Length); 129 dprintf("\t\t\t\tStatus =%x\n",Status); 130 if (Status == STATUS_SUCCESS) 131 { 132 dprintf("\tValue:DO=%d, DL=%d, NL=%d, Name = " 133 ,KeyValueInformation[0].DataOffset 134 ,KeyValueInformation[0].DataLength 135 ,KeyValueInformation[0].NameLength); 136 for (i=0;i<10 && i<KeyValueInformation[0].NameLength/2;i++) 137 dprintf("%C",KeyValueInformation[0].Name[i]); 138 dprintf("\n"); 139 dprintf("\t\tType = %d\n",KeyValueInformation[0].Type); 140 if (KeyValueInformation[0].Type == REG_SZ) 141 dprintf("\t\tValue = %S\n", 142 (PWCHAR)((PCHAR)&KeyValueInformation[0] + KeyValueInformation[0].DataOffset)); 143 } 144 dprintf("NtEnumerateValueKey : \n"); 145 Index=0; 146 while(Status == STATUS_SUCCESS) 147 { 148 Status=NtEnumerateValueKey(hKey,Index++,KeyValueFullInformation 149 ,&KeyValueInformation[0], sizeof(KeyValueInformation) 150 ,&Length); 151 if(Status== STATUS_SUCCESS) 152 { 153 dprintf("\tValue:DO=%d, DL=%d, NL=%d, Name = " 154 ,KeyValueInformation[0].DataOffset 155 ,KeyValueInformation[0].DataLength 156 ,KeyValueInformation[0].NameLength); 157 for (i=0;i<KeyValueInformation[0].NameLength/2;i++) 158 dprintf("%C",KeyValueInformation[0].Name[i]); 159 dprintf(", Type = %d\n",KeyValueInformation[0].Type); 160 if (KeyValueInformation[0].Type == REG_SZ) 161 dprintf("\t\tValue = %S\n",((char*)&KeyValueInformation[0] 162 +KeyValueInformation[0].DataOffset)); 163 } 164 } 165 dprintf("NtClose : "); 166 Status = NtClose( hKey ); 167 dprintf("\t\t\t\t\tStatus =%x\n",Status); 168 } 169 NtClose( hKey1 ); 170 } 171 172 173 void test2(void) 174 { 175 HKEY hKey,hKey1; 176 OBJECT_ATTRIBUTES ObjectAttributes; 177 UNICODE_STRING KeyName,ValueName; 178 NTSTATUS Status; 179 KEY_VALUE_FULL_INFORMATION KeyValueInformation[5]; 180 ULONG Index,Length,i; 181 char Buffer[10]; 182 DWORD Result; 183 dprintf("NtCreateKey volatile: \n"); 184 dprintf(" \\Registry\\Machine\\Software\\test2reactos: "); 185 RtlRosInitUnicodeStringFromLiteral(&KeyName, L"\\Registry\\Machine\\Software\\test2reactos"); 186 InitializeObjectAttributes(&ObjectAttributes, &KeyName, OBJ_CASE_INSENSITIVE 187 , NULL, NULL); 188 Status = NtCreateKey ( &hKey, KEY_ALL_ACCESS , &ObjectAttributes 189 ,0,NULL,REG_OPTION_VOLATILE,NULL); 190 dprintf("\t\tStatus=%x\n",Status); 191 NtClose(hKey); 192 do_enumeratekey(L"\\Registry\\Machine\\Software"); 193 dprintf(" ...\\test2 :"); 194 RtlRosInitUnicodeStringFromLiteral(&KeyName, L"\\Registry\\Machine\\Software\\test2reactos\\test2"); 195 InitializeObjectAttributes(&ObjectAttributes, &KeyName, OBJ_CASE_INSENSITIVE 196 , NULL, NULL); 197 Status = NtCreateKey ( &hKey1, KEY_ALL_ACCESS , &ObjectAttributes 198 ,0,NULL,REG_OPTION_VOLATILE,NULL); 199 dprintf("\t\t\t\t\tStatus=%x\n",Status); 200 dprintf(" ...\\TestVolatile :"); 201 RtlRosInitUnicodeStringFromLiteral(&KeyName, L"TestVolatile"); 202 InitializeObjectAttributes(&ObjectAttributes, &KeyName, OBJ_CASE_INSENSITIVE 203 , hKey1, NULL); 204 Status = NtCreateKey ( &hKey, KEY_ALL_ACCESS , &ObjectAttributes 205 ,0,NULL,REG_OPTION_VOLATILE,NULL); 206 dprintf("\t\t\t\tStatus=%x\n",Status); 207 NtClose(hKey1); 208 RtlRosInitUnicodeStringFromLiteral(&ValueName, L"TestREG_SZ"); 209 dprintf("NtSetValueKey reg_sz: "); 210 Status=NtSetValueKey(hKey,&ValueName,0,REG_SZ,(PVOID)L"Test Reg_sz",24); 211 dprintf("\t\t\t\tStatus=%x\n",Status); 212 RtlRosInitUnicodeStringFromLiteral(&ValueName, L"TestDWORD"); 213 dprintf("NtSetValueKey reg_dword: "); 214 Status=NtSetValueKey(hKey,&ValueName,0,REG_DWORD,(PVOID)"reac",4); 215 dprintf("\t\t\tStatus=%x\n",Status); 216 NtClose(hKey); 217 dprintf("NtOpenKey \\Registry\\Machine\\Software\\test2reactos\\test2\\TestVolatile : "); 218 RtlRosInitUnicodeStringFromLiteral(&KeyName, L"\\Registry\\Machine\\Software\\test2reactos\\test2\\TestVolatile"); 219 InitializeObjectAttributes(&ObjectAttributes, 220 &KeyName, 221 OBJ_CASE_INSENSITIVE, 222 NULL, 223 NULL); 224 Status=NtOpenKey( &hKey, MAXIMUM_ALLOWED, &ObjectAttributes); 225 dprintf("\t\t\t\tStatus =%x\n",Status); 226 if(Status==0) 227 { 228 dprintf("NtEnumerateValueKey : \n"); 229 Index=0; 230 while(Status == STATUS_SUCCESS) 231 { 232 Status=NtEnumerateValueKey(hKey,Index++,KeyValueFullInformation 233 ,&KeyValueInformation[0], sizeof(KeyValueInformation) 234 ,&Length); 235 if(Status== STATUS_SUCCESS) 236 { 237 dprintf("\tValue:DO=%d, DL=%d, NL=%d, Name = " 238 ,KeyValueInformation[0].DataOffset 239 ,KeyValueInformation[0].DataLength 240 ,KeyValueInformation[0].NameLength); 241 for (i=0;i<KeyValueInformation[0].NameLength/2;i++) 242 dprintf("%C",KeyValueInformation[0].Name[i]); 243 dprintf(", Type = %d\n",KeyValueInformation[0].Type); 244 if (KeyValueInformation[0].Type == REG_SZ) 245 dprintf("\t\tValue = %S\n",((char*)&KeyValueInformation[0] 246 +KeyValueInformation[0].DataOffset)); 247 } 248 } 249 } 250 NtClose(hKey); 251 dprintf("delete \\Registry\\Machine\\software\\test2reactos ?"); 252 ReadConsoleA(InputHandle, Buffer, 3, &Result, NULL) ; 253 if (Buffer[0] != 'y' && Buffer[0] != 'Y') return; 254 RtlRosInitUnicodeStringFromLiteral(&KeyName, L"\\Registry\\Machine\\Software\\test2reactos\\test2\\TestVolatile"); 255 InitializeObjectAttributes(&ObjectAttributes, 256 &KeyName, 257 OBJ_CASE_INSENSITIVE, 258 NULL, 259 NULL); 260 dprintf("NtOpenKey : "); 261 Status=NtOpenKey( &hKey, KEY_ALL_ACCESS, &ObjectAttributes); 262 dprintf("\t\t\t\tStatus =%x\n",Status); 263 dprintf("NtDeleteKey : "); 264 Status=NtDeleteKey(hKey); 265 dprintf("\t\t\t\tStatus =%x\n",Status); 266 NtClose(hKey); 267 RtlRosInitUnicodeStringFromLiteral(&KeyName, L"\\Registry\\Machine\\Software\\test2reactos\\test2"); 268 InitializeObjectAttributes(&ObjectAttributes, 269 &KeyName, 270 OBJ_CASE_INSENSITIVE, 271 NULL, 272 NULL); 273 dprintf("NtOpenKey : "); 274 Status=NtOpenKey( &hKey, KEY_ALL_ACCESS, &ObjectAttributes); 275 dprintf("\t\t\t\tStatus =%x\n",Status); 276 dprintf("NtDeleteKey : "); 277 Status=NtDeleteKey(hKey); 278 dprintf("\t\t\t\tStatus =%x\n",Status); 279 NtClose(hKey); 280 RtlRosInitUnicodeStringFromLiteral(&KeyName, L"\\Registry\\Machine\\Software\\test2reactos"); 281 InitializeObjectAttributes(&ObjectAttributes, 282 &KeyName, 283 OBJ_CASE_INSENSITIVE, 284 NULL, 285 NULL); 286 dprintf("NtOpenKey : "); 287 Status=NtOpenKey( &hKey, KEY_ALL_ACCESS, &ObjectAttributes); 288 dprintf("\t\t\t\tStatus =%x\n",Status); 289 dprintf("NtDeleteKey : "); 290 Status=NtDeleteKey(hKey); 291 dprintf("\t\t\t\tStatus =%x\n",Status); 292 NtClose(hKey); 293 } 294 295 void test3(void) 296 { 297 HKEY hKey,hKey1; 298 OBJECT_ATTRIBUTES ObjectAttributes; 299 UNICODE_STRING KeyName,ValueName; 300 NTSTATUS Status; 301 KEY_VALUE_FULL_INFORMATION KeyValueInformation[5]; 302 ULONG Index,Length,i; 303 char Buffer[10]; 304 DWORD Result; 305 dprintf("NtCreateKey non volatile: \n"); 306 dprintf(" \\Registry\\Machine\\Software\\test3reactos: "); 307 RtlRosInitUnicodeStringFromLiteral(&KeyName, L"\\Registry\\Machine\\Software\\test3reactos"); 308 InitializeObjectAttributes(&ObjectAttributes, &KeyName, OBJ_CASE_INSENSITIVE 309 , NULL, NULL); 310 Status = NtCreateKey ( &hKey, KEY_ALL_ACCESS , &ObjectAttributes 311 ,0,NULL,REG_OPTION_NON_VOLATILE,NULL); 312 dprintf("\t\tStatus=%x\n",Status); 313 NtClose(hKey); 314 do_enumeratekey(L"\\Registry\\Machine\\Software"); 315 dprintf("NtOpenKey: "); 316 Status=NtOpenKey( &hKey, MAXIMUM_ALLOWED, &ObjectAttributes); 317 dprintf("\t\tStatus=%x\n",Status); 318 NtClose(hKey); 319 dprintf(" ...\\test3 :"); 320 RtlRosInitUnicodeStringFromLiteral(&KeyName, L"\\Registry\\Machine\\Software\\test3reactos\\test3"); 321 InitializeObjectAttributes(&ObjectAttributes, &KeyName, OBJ_CASE_INSENSITIVE 322 , NULL, NULL); 323 Status = NtCreateKey ( &hKey, KEY_ALL_ACCESS , &ObjectAttributes 324 ,0,NULL,REG_OPTION_NON_VOLATILE,NULL); 325 dprintf("\t\t\t\t\tStatus=%x\n",Status); 326 dprintf("NtOpenKey: "); 327 Status=NtOpenKey( &hKey1, MAXIMUM_ALLOWED, &ObjectAttributes); 328 dprintf("\t\tStatus=%x\n",Status); 329 NtClose(hKey); 330 dprintf(" ...\\testNonVolatile :"); 331 RtlRosInitUnicodeStringFromLiteral(&KeyName, L"TestNonVolatile"); 332 InitializeObjectAttributes(&ObjectAttributes, &KeyName, OBJ_CASE_INSENSITIVE 333 , hKey1, NULL); 334 Status = NtCreateKey ( &hKey, KEY_ALL_ACCESS , &ObjectAttributes 335 ,0,NULL,REG_OPTION_NON_VOLATILE,NULL); 336 dprintf("\t\t\t\tStatus=%x\n",Status); 337 NtClose(hKey1); 338 RtlRosInitUnicodeStringFromLiteral(&ValueName, L"TestREG_SZ"); 339 dprintf("NtSetValueKey reg_sz: "); 340 Status=NtSetValueKey(hKey,&ValueName,0,REG_SZ,(PVOID)L"Test Reg_sz",24); 341 dprintf("\t\t\t\tStatus=%x\n",Status); 342 RtlRosInitUnicodeStringFromLiteral(&ValueName, L"TestDWORD"); 343 dprintf("NtSetValueKey reg_dword: "); 344 Status=NtSetValueKey(hKey,&ValueName,0,REG_DWORD,(PVOID)"reac",4); 345 dprintf("\t\t\tStatus=%x\n",Status); 346 NtClose(hKey); 347 dprintf("NtOpenKey \\Registry\\Machine\\Software\\test3reactos\\test3\\testNonVolatile : "); 348 RtlRosInitUnicodeStringFromLiteral(&KeyName, L"\\Registry\\Machine\\Software\\test3reactos\\test3\\testNonVolatile"); 349 InitializeObjectAttributes(&ObjectAttributes, 350 &KeyName, 351 OBJ_CASE_INSENSITIVE, 352 NULL, 353 NULL); 354 Status=NtOpenKey( &hKey, MAXIMUM_ALLOWED, &ObjectAttributes); 355 dprintf("\t\t\t\tStatus =%x\n",Status); 356 if(Status==0) 357 { 358 dprintf("NtEnumerateValueKey : \n"); 359 Index=0; 360 while(Status == STATUS_SUCCESS) 361 { 362 Status=NtEnumerateValueKey(hKey,Index++,KeyValueFullInformation 363 ,&KeyValueInformation[0], sizeof(KeyValueInformation) 364 ,&Length); 365 if(Status== STATUS_SUCCESS) 366 { 367 dprintf("\tValue:DO=%d, DL=%d, NL=%d, Name = " 368 ,KeyValueInformation[0].DataOffset 369 ,KeyValueInformation[0].DataLength 370 ,KeyValueInformation[0].NameLength); 371 for (i=0;i<KeyValueInformation[0].NameLength/2;i++) 372 dprintf("%C",KeyValueInformation[0].Name[i]); 373 dprintf(", Type = %d\n",KeyValueInformation[0].Type); 374 if (KeyValueInformation[0].Type == REG_SZ) 375 dprintf("\t\tValue = %S\n",((char*)&KeyValueInformation[0] 376 +KeyValueInformation[0].DataOffset)); 377 } 378 } 379 } 380 NtClose(hKey); 381 dprintf("delete \\Registry\\Machine\\software\\test3reactos ?"); 382 ReadConsoleA(InputHandle, Buffer, 3, &Result, NULL) ; 383 if (Buffer[0] != 'y' && Buffer[0] != 'Y') return; 384 RtlRosInitUnicodeStringFromLiteral(&KeyName, L"\\Registry\\Machine\\Software\\test3reactos\\test3\\testNonvolatile"); 385 InitializeObjectAttributes(&ObjectAttributes, 386 &KeyName, 387 OBJ_CASE_INSENSITIVE, 388 NULL, 389 NULL); 390 dprintf("NtOpenKey : "); 391 Status=NtOpenKey( &hKey, KEY_ALL_ACCESS, &ObjectAttributes); 392 dprintf("\t\t\t\tStatus =%x\n",Status); 393 dprintf("NtDeleteKey : "); 394 Status=NtDeleteKey(hKey); 395 dprintf("\t\t\t\tStatus =%x\n",Status); 396 RtlRosInitUnicodeStringFromLiteral(&KeyName, L"\\Registry\\Machine\\Software\\test3reactos\\test3"); 397 InitializeObjectAttributes(&ObjectAttributes, 398 &KeyName, 399 OBJ_CASE_INSENSITIVE, 400 NULL, 401 NULL); 402 dprintf("NtOpenKey : "); 403 Status=NtOpenKey( &hKey, KEY_ALL_ACCESS, &ObjectAttributes); 404 dprintf("\t\t\t\tStatus =%x\n",Status); 405 dprintf("NtDeleteKey : "); 406 Status=NtDeleteKey(hKey); 407 dprintf("\t\t\t\tStatus =%x\n",Status); 408 NtClose(hKey); 409 RtlRosInitUnicodeStringFromLiteral(&KeyName, L"\\Registry\\Machine\\Software\\test3reactos"); 410 InitializeObjectAttributes(&ObjectAttributes, 411 &KeyName, 412 OBJ_CASE_INSENSITIVE, 413 NULL, 414 NULL); 415 dprintf("NtOpenKey : "); 416 Status=NtOpenKey( &hKey, KEY_ALL_ACCESS, &ObjectAttributes); 417 dprintf("\t\t\t\tStatus =%x\n",Status); 418 dprintf("NtDeleteKey : "); 419 Status=NtDeleteKey(hKey); 420 dprintf("\t\t\t\tStatus =%x\n",Status); 421 NtClose(hKey); 422 } 423 424 void test4(void) 425 { 426 HKEY hKey = NULL,hKey1; 427 DWORD dwDisposition; 428 DWORD dwError; 429 DWORD RegDataType, RegDataSize; 430 BOOL GlobalFifoEnable; 431 HKEY hPortKey; 432 DWORD RegDisposition; 433 WCHAR szClass[260]; 434 DWORD cchClass; 435 DWORD cSubKeys; 436 DWORD cchMaxSubkey; 437 DWORD cchMaxClass; 438 DWORD cValues; 439 DWORD cchMaxValueName; 440 DWORD cbMaxValueData; 441 DWORD cbSecurityDescriptor; 442 FILETIME ftLastWriteTime; 443 SYSTEMTIME LastWriteTime; 444 445 dprintf ("RegOpenKeyExW HKLM\\System\\Setup: "); 446 dwError = RegOpenKeyExW(HKEY_LOCAL_MACHINE, 447 L"System\\Setup", 448 0, 449 KEY_ALL_ACCESS, 450 &hKey1); 451 dprintf("\t\tdwError =%x\n",dwError); 452 if (dwError == ERROR_SUCCESS) 453 { 454 dprintf("RegQueryInfoKeyW: "); 455 cchClass=260; 456 dwError = RegQueryInfoKeyW(hKey1 457 , szClass, &cchClass, NULL, &cSubKeys 458 , &cchMaxSubkey, &cchMaxClass, &cValues, &cchMaxValueName 459 , &cbMaxValueData, &cbSecurityDescriptor, &ftLastWriteTime); 460 dprintf ("\t\t\t\tdwError %x\n", dwError); 461 FileTimeToSystemTime(&ftLastWriteTime,&LastWriteTime); 462 dprintf ("\tnb of subkeys=%d,last write : %d/%d/%d %d:%02.2d'%02.2d''%03.3d\n",cSubKeys 463 ,LastWriteTime.wMonth 464 ,LastWriteTime.wDay 465 ,LastWriteTime.wYear 466 ,LastWriteTime.wHour 467 ,LastWriteTime.wMinute 468 ,LastWriteTime.wSecond 469 ,LastWriteTime.wMilliseconds 470 ); 471 } 472 473 474 dprintf ("RegOpenKeyExW: "); 475 dwError = RegOpenKeyExW(HKEY_LOCAL_MACHINE, 476 L"System\\ControlSet001\\Services\\Serial", 477 0, 478 KEY_ALL_ACCESS, 479 &hKey); 480 dprintf ("\t\t\t\t\tdwError %x\n", dwError); 481 RegDataSize = sizeof(GlobalFifoEnable); 482 if (dwError == ERROR_SUCCESS) 483 { 484 dprintf ("RegQueryValueExW: "); 485 dwError = RegQueryValueExW(hKey, 486 L"ForceFifoEnable", 487 NULL, 488 &RegDataType, 489 (PBYTE)&GlobalFifoEnable, 490 &RegDataSize); 491 dprintf("\t\t\t\tdwError =%x\n",dwError); 492 if (dwError == 0) 493 { 494 dprintf("\tValue:DT=%d, DS=%d, Value=%d\n" 495 ,RegDataType 496 ,RegDataSize 497 ,GlobalFifoEnable); 498 } 499 } 500 dprintf ("RegCreateKeyExW: "); 501 dwError = RegCreateKeyExW(hKey, 502 L"Parameters\\Serial001", 503 0, 504 NULL, 505 0, 506 KEY_ALL_ACCESS, 507 NULL, 508 &hPortKey, 509 &RegDisposition 510 ); 511 dprintf ("\t\t\t\tdwError %x\n", dwError); 512 513 dprintf ("RegCreateKeyExW: "); 514 dwError = RegCreateKeyExW (HKEY_LOCAL_MACHINE, 515 L"Software\\test4reactos\\test", 516 0, 517 NULL, 518 REG_OPTION_NON_VOLATILE, 519 KEY_ALL_ACCESS, 520 NULL, 521 &hKey, 522 &dwDisposition); 523 524 dprintf ("\t\t\t\tdwError %x ", dwError); 525 dprintf ("dwDisposition %x\n", dwDisposition); 526 if (dwError == ERROR_SUCCESS) 527 { 528 dprintf ("RegSetValueExW: "); 529 dwError = RegSetValueExW (hKey, 530 L"TestValue", 531 0, 532 REG_SZ, 533 (BYTE*)L"TestString", 534 20); 535 536 dprintf ("\t\t\t\tdwError %x\n", dwError); 537 dprintf ("RegCloseKey: "); 538 dwError = RegCloseKey (hKey); 539 dprintf ("\t\t\t\t\tdwError %x\n", dwError); 540 } 541 dprintf ("\n\n"); 542 543 hKey = NULL; 544 545 dprintf ("RegCreateKeyExW: "); 546 dwError = RegCreateKeyExW (HKEY_LOCAL_MACHINE, 547 L"software\\Test", 548 0, 549 NULL, 550 REG_OPTION_VOLATILE, 551 KEY_ALL_ACCESS, 552 NULL, 553 &hKey, 554 &dwDisposition); 555 556 dprintf ("\t\t\t\tdwError %x ", dwError); 557 dprintf ("dwDisposition %x\n", dwDisposition); 558 559 560 if (dwError == ERROR_SUCCESS) 561 { 562 dprintf("RegQueryInfoKeyW: "); 563 cchClass=260; 564 dwError = RegQueryInfoKeyW(hKey 565 , szClass, &cchClass, NULL, &cSubKeys 566 , &cchMaxSubkey, &cchMaxClass, &cValues, &cchMaxValueName 567 , &cbMaxValueData, &cbSecurityDescriptor, &ftLastWriteTime); 568 dprintf ("\t\t\t\tdwError %x\n", dwError); 569 FileTimeToSystemTime(&ftLastWriteTime,&LastWriteTime); 570 dprintf ("\tnb of subkeys=%d,last write : %d/%d/%d %d:%02.2d'%02.2d''%03.3d\n",cSubKeys 571 ,LastWriteTime.wMonth 572 ,LastWriteTime.wDay 573 ,LastWriteTime.wYear 574 ,LastWriteTime.wHour 575 ,LastWriteTime.wMinute 576 ,LastWriteTime.wSecond 577 ,LastWriteTime.wMilliseconds 578 ); 579 dprintf ("RegCloseKey: "); 580 dwError = RegCloseKey (hKey); 581 dprintf ("\t\t\t\t\tdwError %x\n", dwError); 582 } 583 dprintf ("\nTests done...\n"); 584 } 585 586 void test5(void) 587 { 588 HKEY hKey; 589 OBJECT_ATTRIBUTES ObjectAttributes; 590 UNICODE_STRING KeyName; 591 NTSTATUS Status; 592 593 dprintf("NtOpenKey : \n"); 594 dprintf(" \\Registry\\Machine\\Software\\reactos : "); 595 RtlRosInitUnicodeStringFromLiteral(&KeyName,L"\\Registry\\Machine\\Software\\reactos"); 596 InitializeObjectAttributes(&ObjectAttributes, &KeyName, OBJ_CASE_INSENSITIVE 597 , NULL, NULL); 598 Status=NtOpenKey( &hKey, KEY_ALL_ACCESS, &ObjectAttributes); 599 dprintf("\t\tStatus=%x\n",Status); 600 dprintf("NtFlushKey : \n"); 601 Status = NtFlushKey(hKey); 602 dprintf("\t\tStatus=%x\n",Status); 603 dprintf("NtCloseKey : \n"); 604 Status=NtClose(hKey); 605 dprintf("\t\tStatus=%x\n",Status); 606 } 607 608 /* registry link create test */ 609 void test6(void) 610 { 611 HKEY hKey; 612 OBJECT_ATTRIBUTES ObjectAttributes; 613 UNICODE_STRING KeyName,ValueName; 614 NTSTATUS Status; 615 KEY_VALUE_FULL_INFORMATION KeyValueInformation[5]; 616 ULONG Length,i; 617 618 dprintf("Create target key\n"); 619 dprintf(" Key: \\Registry\\Machine\\SOFTWARE\\Reactos\n"); 620 RtlRosInitUnicodeStringFromLiteral(&KeyName, L"\\Registry\\Machine\\SOFTWARE\\Reactos"); 621 InitializeObjectAttributes(&ObjectAttributes, &KeyName, OBJ_CASE_INSENSITIVE 622 , NULL, NULL); 623 Status = NtCreateKey(&hKey, KEY_ALL_ACCESS , &ObjectAttributes 624 ,0,NULL, REG_OPTION_VOLATILE,NULL); 625 dprintf(" NtCreateKey() called (Status %lx)\n",Status); 626 if (!NT_SUCCESS(Status)) 627 return; 628 629 dprintf("Create target value\n"); 630 dprintf(" Value: TestValue = 'Test String'\n"); 631 RtlRosInitUnicodeStringFromLiteral(&ValueName, L"TestValue"); 632 Status=NtSetValueKey(hKey,&ValueName,0,REG_SZ,(PVOID)L"TestString",22); 633 dprintf(" NtSetValueKey() called (Status %lx)\n",Status); 634 if (!NT_SUCCESS(Status)) 635 return; 636 637 dprintf("Close target key\n"); 638 NtClose(hKey); 639 640 641 dprintf("Create link key\n"); 642 dprintf(" Key: \\Registry\\Machine\\SOFTWARE\\Test\n"); 643 RtlRosInitUnicodeStringFromLiteral(&KeyName, L"\\Registry\\Machine\\SOFTWARE\\Test"); 644 InitializeObjectAttributes(&ObjectAttributes, 645 &KeyName, 646 OBJ_CASE_INSENSITIVE | OBJ_OPENLINK, 647 NULL, 648 NULL); 649 Status = NtCreateKey(&hKey, 650 KEY_ALL_ACCESS | KEY_CREATE_LINK, 651 &ObjectAttributes, 652 0, 653 NULL, 654 REG_OPTION_VOLATILE | REG_OPTION_CREATE_LINK, 655 NULL); 656 dprintf(" NtCreateKey() called (Status %lx)\n",Status); 657 if (!NT_SUCCESS(Status)) 658 return; 659 660 dprintf("Create link value\n"); 661 dprintf(" Value: SymbolicLinkValue = '\\Registry\\Machine\\SOFTWARE\\Reactos'\n"); 662 RtlRosInitUnicodeStringFromLiteral(&ValueName, L"SymbolicLinkValue"); 663 Status=NtSetValueKey(hKey,&ValueName,0,REG_LINK,(PVOID)L"\\Registry\\Machine\\SOFTWARE\\Reactos",68); 664 dprintf(" NtSetValueKey() called (Status %lx)\n",Status); 665 if (!NT_SUCCESS(Status)) 666 { 667 dprintf("Creating link value failed! Test failed!\n"); 668 NtClose(hKey); 669 return; 670 } 671 672 dprintf("Close link key\n"); 673 NtClose(hKey); 674 675 dprintf("Open link key\n"); 676 dprintf(" Key: \\Registry\\Machine\\SOFTWARE\\Test\n"); 677 RtlRosInitUnicodeStringFromLiteral(&KeyName, L"\\Registry\\Machine\\SOFTWARE\\Test"); 678 InitializeObjectAttributes(&ObjectAttributes, &KeyName, OBJ_CASE_INSENSITIVE | OBJ_OPENIF 679 , NULL, NULL); 680 Status = NtCreateKey(&hKey, KEY_ALL_ACCESS , &ObjectAttributes 681 ,0,NULL, REG_OPTION_VOLATILE, NULL); 682 dprintf(" NtCreateKey() called (Status %lx)\n",Status); 683 if (!NT_SUCCESS(Status)) 684 return; 685 686 dprintf("Query value\n"); 687 dprintf(" Value: TestValue\n"); 688 RtlRosInitUnicodeStringFromLiteral(&ValueName, L"TestValue"); 689 Status=NtQueryValueKey(hKey, 690 &ValueName, 691 KeyValueFullInformation, 692 &KeyValueInformation[0], 693 sizeof(KeyValueInformation), 694 &Length); 695 dprintf(" NtQueryValueKey() called (Status %lx)\n",Status); 696 if (Status == STATUS_SUCCESS) 697 { 698 dprintf(" Value: Type %d DataLength %d NameLength %d Name '", 699 KeyValueInformation[0].Type, 700 KeyValueInformation[0].DataLength, 701 KeyValueInformation[0].NameLength); 702 for (i=0; i < KeyValueInformation[0].NameLength / sizeof(WCHAR); i++) 703 dprintf("%C",KeyValueInformation[0].Name[i]); 704 dprintf("'\n"); 705 if (KeyValueInformation[0].Type == REG_SZ) 706 dprintf(" Value '%S'\n", 707 KeyValueInformation[0].Name+1 708 +KeyValueInformation[0].NameLength/2); 709 } 710 711 dprintf("Close link key\n"); 712 NtClose(hKey); 713 714 dprintf("Test successful!\n"); 715 } 716 717 /* registry link delete test */ 718 void test7(void) 719 { 720 HKEY hKey; 721 OBJECT_ATTRIBUTES ObjectAttributes; 722 UNICODE_STRING KeyName,ValueName; 723 NTSTATUS Status; 724 725 dprintf("Open link key\n"); 726 dprintf(" Key: \\Registry\\Machine\\SOFTWARE\\Test\n"); 727 RtlRosInitUnicodeStringFromLiteral(&KeyName, L"\\Registry\\Machine\\SOFTWARE\\Test"); 728 InitializeObjectAttributes(&ObjectAttributes, 729 &KeyName, 730 OBJ_CASE_INSENSITIVE | OBJ_OPENIF | OBJ_OPENLINK, 731 NULL, 732 NULL); 733 Status = NtCreateKey(&hKey, 734 KEY_ALL_ACCESS, 735 &ObjectAttributes, 736 0, 737 NULL, 738 REG_OPTION_VOLATILE | REG_OPTION_OPEN_LINK, 739 NULL); 740 dprintf(" NtCreateKey() called (Status %lx)\n",Status); 741 if (!NT_SUCCESS(Status)) 742 { 743 dprintf("Could not open the link key. Please run the link create test first!\n"); 744 return; 745 } 746 747 dprintf("Delete link value\n"); 748 RtlRosInitUnicodeStringFromLiteral(&ValueName, L"SymbolicLinkValue"); 749 Status = NtDeleteValueKey(hKey, 750 &ValueName); 751 dprintf(" NtDeleteValueKey() called (Status %lx)\n",Status); 752 753 dprintf("Delete link key\n"); 754 Status=NtDeleteKey(hKey); 755 dprintf(" NtDeleteKey() called (Status %lx)\n",Status); 756 757 dprintf("Close link key\n"); 758 NtClose(hKey); 759 } 760 761 762 void test8(void) 763 { 764 OBJECT_ATTRIBUTES ObjectAttributes; 765 UNICODE_STRING KeyName; 766 NTSTATUS Status; 767 LONG dwError; 768 TOKEN_PRIVILEGES NewPrivileges; 769 HANDLE Token,hKey; 770 LUID Luid; 771 BOOLEAN bRes; 772 Status=NtOpenProcessToken(GetCurrentProcess() 773 ,TOKEN_ADJUST_PRIVILEGES,&Token); 774 // ,TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,&Token); 775 dprintf("\t\t\t\tStatus =%x\n",Status); 776 // bRes=LookupPrivilegeValueA(NULL,SE_RESTORE_NAME,&Luid); 777 // dprintf("\t\t\t\tbRes =%x\n",bRes); 778 NewPrivileges.PrivilegeCount = 1; 779 NewPrivileges.Privileges[0].Luid = Luid; 780 // NewPrivileges.Privileges[0].Luid.u.LowPart=18; 781 // NewPrivileges.Privileges[0].Luid.u.HighPart=0; 782 NewPrivileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; 783 784 // Status = NtAdjustPrivilegesToken( 785 bRes = AdjustTokenPrivileges( 786 Token, 787 FALSE, 788 &NewPrivileges, 789 0, 790 NULL, 791 NULL 792 ); 793 dprintf("\t\t\t\tbRes =%x\n",bRes); 794 795 // Status=NtClose(Token); 796 // dprintf("\t\t\t\tStatus =%x\n",Status); 797 798 799 RtlRosInitUnicodeStringFromLiteral(&KeyName,L"test5"); 800 InitializeObjectAttributes(&ObjectAttributes, &KeyName, OBJ_CASE_INSENSITIVE 801 , NULL, NULL); 802 Status = NtLoadKey(HKEY_LOCAL_MACHINE,&ObjectAttributes); 803 dprintf("\t\t\t\tStatus =%x\n",Status); 804 dwError=RegLoadKey(HKEY_LOCAL_MACHINE,"def" 805 ,"test5"); 806 dprintf("\t\t\t\tdwError =%x\n",dwError); 807 808 dprintf("NtOpenKey \\Registry\\Machine : "); 809 RtlRosInitUnicodeStringFromLiteral(&KeyName, L"\\Registry\\Machine"); 810 InitializeObjectAttributes(&ObjectAttributes, 811 &KeyName, 812 OBJ_CASE_INSENSITIVE, 813 NULL, 814 NULL); 815 Status=NtOpenKey( &hKey, MAXIMUM_ALLOWED, &ObjectAttributes); 816 dprintf("\t\t\tStatus =%x\n",Status); 817 RtlRosInitUnicodeStringFromLiteral(&KeyName,L"test5"); 818 InitializeObjectAttributes(&ObjectAttributes, &KeyName, OBJ_CASE_INSENSITIVE 819 , NULL, NULL); 820 Status = NtLoadKey(hKey,&ObjectAttributes); 821 dprintf("\t\t\t\tStatus =%x\n",Status); 822 } 823 824 void test9(void) 825 { 826 HKEY hKey = NULL, hKey1; 827 OBJECT_ATTRIBUTES ObjectAttributes; 828 NTSTATUS Status; 829 UNICODE_STRING KeyName = ROS_STRING_INITIALIZER(L"\\Registry"); 830 ULONG Index,Length,i; 831 KEY_BASIC_INFORMATION KeyInformation[5]; 832 KEY_VALUE_FULL_INFORMATION KeyValueInformation[5]; 833 834 dprintf("NtOpenKey \\Registry : "); 835 InitializeObjectAttributes(&ObjectAttributes, 836 &KeyName, 837 OBJ_CASE_INSENSITIVE, 838 NULL, 839 NULL); 840 Status=NtOpenKey( &hKey1, MAXIMUM_ALLOWED, &ObjectAttributes); 841 dprintf("\t\t\t\tStatus =%x\n",Status); 842 if (Status == 0) { 843 dprintf("NtQueryKey : "); 844 Status = NtQueryKey(hKey1, KeyBasicInformation, &KeyInformation[0], sizeof(KeyInformation), &Length); 845 dprintf("\t\t\t\t\tStatus =%x\n",Status); 846 if (Status == STATUS_SUCCESS) { 847 dprintf("\tKey Name = "); 848 for (i=0;i<KeyInformation[0].NameLength/2;i++) 849 dprintf("%C",KeyInformation[0].Name[i]); 850 dprintf("\n"); 851 } 852 dprintf("NtEnumerateKey : \n"); 853 Index = 0; 854 while (Status == STATUS_SUCCESS) { 855 Status = NtEnumerateKey(hKey1,Index++,KeyBasicInformation,&KeyInformation[0], sizeof(KeyInformation),&Length); 856 if (Status == STATUS_SUCCESS) { 857 dprintf("\tSubKey Name = "); 858 for (i = 0; i < KeyInformation[0].NameLength / 2; i++) 859 dprintf("%C",KeyInformation[0].Name[i]); 860 dprintf("\n"); 861 } 862 } 863 dprintf("NtClose : "); 864 Status = NtClose( hKey1 ); 865 dprintf("\t\t\t\t\tStatus =%x\n",Status); 866 } 867 NtClose(hKey); // RobD - hKey unused so-far, should this have been hKey1 ??? 868 869 dprintf("NtOpenKey \\Registry\\Machine : "); 870 RtlRosInitUnicodeStringFromLiteral(&KeyName, L"\\Registry\\Machine"); 871 InitializeObjectAttributes(&ObjectAttributes, 872 &KeyName, 873 OBJ_CASE_INSENSITIVE, 874 NULL, 875 NULL); 876 Status = NtOpenKey(&hKey1, MAXIMUM_ALLOWED, &ObjectAttributes); 877 dprintf("\t\t\tStatus =%x\n",Status); 878 879 //Status of c0000001 opening \Registry\Machine\System\CurrentControlSet\Services\Tcpip\Linkage 880 881 // dprintf("NtOpenKey System\\CurrentControlSet\\Services\\Tcpip : "); 882 // RtlRosInitUnicodeStringFromLiteral(&KeyName, L"System\\CurrentControlSet\\Services\\Tcpip"); 883 #if 1 884 dprintf("NtOpenKey System\\ControlSet001\\Services\\Tcpip\\Parameters : "); 885 RtlRosInitUnicodeStringFromLiteral(&KeyName, L"System\\ControlSet001\\Services\\Tcpip\\Parameters"); 886 #else 887 dprintf("NtOpenKey System\\CurrentControlSet\\Services\\Tcpip : "); 888 RtlRosInitUnicodeStringFromLiteral(&KeyName, L"System\\CurrentControlSet\\Services\\Tcpip"); 889 #endif 890 InitializeObjectAttributes(&ObjectAttributes, &KeyName, OBJ_CASE_INSENSITIVE, hKey1 , NULL); 891 Status = NtOpenKey(&hKey, KEY_READ , &ObjectAttributes); 892 dprintf("\t\t\tStatus =%x\n",Status); 893 if (Status == 0) { 894 dprintf("NtQueryValueKey : "); 895 RtlRosInitUnicodeStringFromLiteral(&KeyName, L"NameServer"); 896 Status = NtQueryValueKey(hKey, &KeyName, KeyValueFullInformation, &KeyValueInformation[0], sizeof(KeyValueInformation), &Length); 897 dprintf("\t\t\t\tStatus =%x\n",Status); 898 if (Status == STATUS_SUCCESS) { 899 dprintf("\tValue:DO=%d, DL=%d, NL=%d, Name = " 900 ,KeyValueInformation[0].DataOffset 901 ,KeyValueInformation[0].DataLength 902 ,KeyValueInformation[0].NameLength); 903 for (i = 0; i < 10 && i < KeyValueInformation[0].NameLength / 2; i++) 904 dprintf("%C", KeyValueInformation[0].Name[i]); 905 dprintf("\n"); 906 dprintf("\t\tType = %d\n", KeyValueInformation[0].Type); 907 if (KeyValueInformation[0].Type == REG_SZ) 908 //dprintf("\t\tValue = %S\n", KeyValueInformation[0].Name + 1 + KeyValueInformation[0].NameLength / 2); 909 dprintf("\t\tValue = %S\n", KeyValueInformation[0].Name + KeyValueInformation[0].NameLength / 2); 910 } 911 dprintf("NtEnumerateValueKey : \n"); 912 Index = 0; 913 while (Status == STATUS_SUCCESS) { 914 Status = NtEnumerateValueKey(hKey, Index++, KeyValueFullInformation, &KeyValueInformation[0], sizeof(KeyValueInformation), &Length); 915 if (Status == STATUS_SUCCESS) { 916 dprintf("\tValue:DO=%d, DL=%d, NL=%d, Name = " 917 ,KeyValueInformation[0].DataOffset 918 ,KeyValueInformation[0].DataLength 919 ,KeyValueInformation[0].NameLength); 920 for (i = 0; i < KeyValueInformation[0].NameLength / 2; i++) 921 dprintf("%C", KeyValueInformation[0].Name[i]); 922 dprintf(", Type = %d\n", KeyValueInformation[0].Type); 923 if (KeyValueInformation[0].Type == REG_SZ) 924 dprintf("\t\tValue = %S\n", ((char*)&KeyValueInformation[0]+KeyValueInformation[0].DataOffset)); 925 if (KeyValueInformation[0].Type == REG_DWORD) 926 dprintf("\t\tValue = %X\n", *((DWORD*)((char*)&KeyValueInformation[0]+KeyValueInformation[0].DataOffset))); 927 } 928 } 929 dprintf("NtClose : "); 930 Status = NtClose(hKey); 931 dprintf("\t\t\t\t\tStatus =%x\n", Status); 932 } 933 NtClose(hKey1); 934 } 935 936 937 int main(int argc, char* argv[]) 938 { 939 char Buffer[10]; 940 DWORD Result; 941 942 AllocConsole(); 943 InputHandle = GetStdHandle(STD_INPUT_HANDLE); 944 OutputHandle = GetStdHandle(STD_OUTPUT_HANDLE); 945 while(1) 946 { 947 dprintf("choose test :\n"); 948 dprintf(" 0=Exit\n"); 949 dprintf(" 1=Ntxxx read functions\n"); 950 dprintf(" 2=Ntxxx write functions : volatile keys\n"); 951 dprintf(" 3=Ntxxx write functions : non volatile keys\n"); 952 dprintf(" 4=Regxxx functions\n"); 953 dprintf(" 5=FlushKey \n"); 954 dprintf(" 6=Registry link create test\n"); 955 dprintf(" 7=Registry link delete test\n"); 956 dprintf(" 8=Not available\n"); 957 dprintf(" 9=Ntxx read tcp/ip key test\n"); 958 ReadConsoleA(InputHandle, Buffer, 3, &Result, NULL) ; 959 switch (Buffer[0]) 960 { 961 case '0': 962 return(0); 963 case '1': 964 test1(); 965 break; 966 case '2': 967 test2(); 968 break; 969 case '3': 970 test3(); 971 break; 972 case '4': 973 test4(); 974 break; 975 case '5': 976 test5(); 977 break; 978 case '6': 979 test6(); 980 break; 981 case '7': 982 test7(); 983 break; 984 #if 0 985 case '8': 986 test8(); 987 break; 988 #endif 989 case '9': 990 test9(); 991 break; 992 } 993 } 994 return 0; 995 } 996