/lwreg/client/regclient.c

https://github.com/BeyondTrust/pbis-open · C · 868 lines · 782 code · 41 blank · 45 comment · 1 complexity · a9f5f96ceae8c7804c2a2c079379c4fb MD5 · raw file

  1. /* Editor Settings: expandtabs and use 4 spaces for indentation
  2. * ex: set softtabstop=4 tabstop=8 expandtab shiftwidth=4: *
  3. * -*- mode: c, c-basic-offset: 4 -*- */
  4. /*
  5. * Copyright © BeyondTrust Software 2004 - 2019
  6. * All rights reserved.
  7. *
  8. * Licensed under the Apache License, Version 2.0 (the "License");
  9. * you may not use this file except in compliance with the License.
  10. * You may obtain a copy of the License at
  11. *
  12. * http://www.apache.org/licenses/LICENSE-2.0
  13. *
  14. * Unless required by applicable law or agreed to in writing, software
  15. * distributed under the License is distributed on an "AS IS" BASIS,
  16. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  17. * See the License for the specific language governing permissions and
  18. * limitations under the License.
  19. *
  20. * BEYONDTRUST MAKES THIS SOFTWARE AVAILABLE UNDER OTHER LICENSING TERMS AS
  21. * WELL. IF YOU HAVE ENTERED INTO A SEPARATE LICENSE AGREEMENT WITH
  22. * BEYONDTRUST, THEN YOU MAY ELECT TO USE THE SOFTWARE UNDER THE TERMS OF THAT
  23. * SOFTWARE LICENSE AGREEMENT INSTEAD OF THE TERMS OF THE APACHE LICENSE,
  24. * NOTWITHSTANDING THE ABOVE NOTICE. IF YOU HAVE QUESTIONS, OR WISH TO REQUEST
  25. * A COPY OF THE ALTERNATE LICENSING TERMS OFFERED BY BEYONDTRUST, PLEASE CONTACT
  26. * BEYONDTRUST AT beyondtrust.com/contact
  27. */
  28. /*
  29. * Copyright (C) BeyondTrust Software. All rights reserved.
  30. *
  31. * Module Name:
  32. *
  33. * registry.c
  34. *
  35. * Abstract:
  36. *
  37. * Registry
  38. *
  39. * Client wrapper API
  40. *
  41. * Authors: Krishna Ganugapati (krishnag@likewisesoftware.com)
  42. * Sriram Nambakam (snambakam@likewisesoftware.com)
  43. * Wei Fu (wfu@likewise.com)
  44. * Marc Guy (mguy@likewisesoftware.com)
  45. */
  46. #include "client.h"
  47. REG_API
  48. DWORD
  49. RegEnumRootKeysA(
  50. IN HANDLE hRegConnection,
  51. OUT PSTR** pppszRootKeyNames,
  52. OUT PDWORD pdwNumRootKeys
  53. )
  54. {
  55. return RegNtStatusToWin32Error(
  56. NtRegEnumRootKeysA(hRegConnection,
  57. pppszRootKeyNames,
  58. pdwNumRootKeys)
  59. );
  60. }
  61. REG_API
  62. DWORD
  63. RegEnumRootKeysW(
  64. IN HANDLE hRegConnection,
  65. OUT PWSTR** pppwszRootKeyNames,
  66. OUT PDWORD pdwNumRootKeys
  67. )
  68. {
  69. return RegNtStatusToWin32Error(
  70. NtRegEnumRootKeysW(hRegConnection,
  71. pppwszRootKeyNames,
  72. pdwNumRootKeys)
  73. );
  74. }
  75. REG_API
  76. DWORD
  77. RegCreateKeyExA(
  78. IN HANDLE hRegConnection,
  79. IN HKEY hKey,
  80. IN PCSTR pszSubKey,
  81. IN DWORD Reserved,
  82. IN OPTIONAL PWSTR pClass,
  83. IN DWORD dwOptions,
  84. IN ACCESS_MASK AccessDesired,
  85. IN OPTIONAL PSECURITY_DESCRIPTOR_ABSOLUTE pSecDescAbs,
  86. OUT PHKEY phkResult,
  87. OUT OPTIONAL PDWORD pdwDisposition
  88. )
  89. {
  90. return RegNtStatusToWin32Error(
  91. NtRegCreateKeyExA(
  92. hRegConnection,
  93. hKey,
  94. pszSubKey,
  95. Reserved,
  96. pClass,
  97. dwOptions,
  98. AccessDesired,
  99. pSecDescAbs,
  100. phkResult,
  101. pdwDisposition
  102. )
  103. );
  104. }
  105. REG_API
  106. DWORD
  107. RegCreateKeyExW(
  108. IN HANDLE hRegConnection,
  109. IN HKEY hKey,
  110. IN PCWSTR pSubKey,
  111. IN DWORD Reserved,
  112. IN OPTIONAL PWSTR pClass,
  113. IN DWORD dwOptions,
  114. IN ACCESS_MASK AccessDesired,
  115. IN OPTIONAL PSECURITY_DESCRIPTOR_ABSOLUTE pSecDescAbs,
  116. OUT PHKEY phkResult,
  117. OUT OPTIONAL PDWORD pdwDisposition
  118. )
  119. {
  120. return RegNtStatusToWin32Error(
  121. NtRegCreateKeyExW(
  122. hRegConnection,
  123. hKey,
  124. pSubKey,
  125. Reserved,
  126. pClass,
  127. dwOptions,
  128. AccessDesired,
  129. pSecDescAbs,
  130. phkResult,
  131. pdwDisposition
  132. )
  133. );
  134. }
  135. REG_API
  136. DWORD
  137. RegCloseKey(
  138. IN HANDLE hRegConnection,
  139. IN HKEY hKey
  140. )
  141. {
  142. if (!hRegConnection)
  143. {
  144. return RegNtStatusToWin32Error(STATUS_INVALID_PARAMETER);
  145. }
  146. return RegNtStatusToWin32Error(
  147. NtRegCloseKey(
  148. hRegConnection,
  149. hKey
  150. )
  151. );
  152. }
  153. REG_API
  154. DWORD
  155. RegDeleteKeyA(
  156. IN HANDLE hRegConnection,
  157. IN HKEY hKey,
  158. IN PCSTR pszSubKey
  159. )
  160. {
  161. return RegNtStatusToWin32Error(
  162. NtRegDeleteKeyA(
  163. hRegConnection,
  164. hKey,
  165. pszSubKey
  166. )
  167. );
  168. }
  169. REG_API
  170. DWORD
  171. RegDeleteKeyW(
  172. IN HANDLE hRegConnection,
  173. IN HKEY hKey,
  174. IN PCWSTR pSubKey
  175. )
  176. {
  177. return RegNtStatusToWin32Error(
  178. NtRegDeleteKeyW(
  179. hRegConnection,
  180. hKey,
  181. pSubKey
  182. )
  183. );
  184. }
  185. REG_API
  186. DWORD
  187. RegDeleteKeyValueA(
  188. IN HANDLE hRegConnection,
  189. IN HKEY hKey,
  190. IN OPTIONAL PCSTR pszSubKey,
  191. IN OPTIONAL PCSTR pszValueName
  192. )
  193. {
  194. return RegNtStatusToWin32Error(
  195. NtRegDeleteKeyValueA(
  196. hRegConnection,
  197. hKey,
  198. pszSubKey,
  199. pszValueName
  200. )
  201. );
  202. }
  203. REG_API
  204. DWORD
  205. RegDeleteKeyValueW(
  206. IN HANDLE hRegConnection,
  207. IN HKEY hKey,
  208. IN OPTIONAL PCWSTR pSubKey,
  209. IN OPTIONAL PCWSTR pValueName
  210. )
  211. {
  212. return RegNtStatusToWin32Error(
  213. NtRegDeleteKeyValueW(
  214. hRegConnection,
  215. hKey,
  216. pSubKey,
  217. pValueName
  218. )
  219. );
  220. }
  221. REG_API
  222. DWORD
  223. RegDeleteTreeA(
  224. IN HANDLE hRegConnection,
  225. IN HKEY hKey,
  226. IN OPTIONAL PCSTR pszSubKey
  227. )
  228. {
  229. return RegNtStatusToWin32Error(
  230. NtRegDeleteTreeA(
  231. hRegConnection,
  232. hKey,
  233. pszSubKey
  234. )
  235. );
  236. }
  237. REG_API
  238. DWORD
  239. RegDeleteTreeW(
  240. IN HANDLE hRegConnection,
  241. IN HKEY hKey,
  242. IN OPTIONAL PCWSTR pSubKey
  243. )
  244. {
  245. return RegNtStatusToWin32Error(
  246. NtRegDeleteTreeW(
  247. hRegConnection,
  248. hKey,
  249. pSubKey
  250. )
  251. );
  252. }
  253. REG_API
  254. DWORD
  255. RegDeleteValueA(
  256. IN HANDLE hRegConnection,
  257. IN HKEY hKey,
  258. IN PCSTR pszValueName
  259. )
  260. {
  261. return RegNtStatusToWin32Error(
  262. NtRegDeleteValueA(
  263. hRegConnection,
  264. hKey,
  265. pszValueName
  266. )
  267. );
  268. }
  269. REG_API
  270. DWORD
  271. RegDeleteValueW(
  272. IN HANDLE hRegConnection,
  273. IN HKEY hKey,
  274. IN PCWSTR pValueName
  275. )
  276. {
  277. return RegNtStatusToWin32Error(
  278. NtRegDeleteValueW(
  279. hRegConnection,
  280. hKey,
  281. pValueName
  282. )
  283. );
  284. }
  285. REG_API
  286. DWORD
  287. RegEnumKeyExA(
  288. IN HANDLE hRegConnection,
  289. IN HKEY hKey,
  290. IN DWORD dwIndex,
  291. IN OUT PSTR pszName,
  292. IN OUT PDWORD pcName,
  293. IN PDWORD pReserved,
  294. IN OUT OPTIONAL PSTR pszClass,
  295. IN OUT OPTIONAL PDWORD pcClass,
  296. OUT OPTIONAL PFILETIME pftLastWriteTime
  297. )
  298. {
  299. return RegNtStatusToWin32Error(
  300. NtRegEnumKeyExA(
  301. hRegConnection,
  302. hKey,
  303. dwIndex,
  304. pszName,
  305. pcName,
  306. pReserved,
  307. pszClass,
  308. pcClass,
  309. pftLastWriteTime
  310. )
  311. );
  312. }
  313. REG_API
  314. DWORD
  315. RegEnumKeyExW(
  316. IN HANDLE hRegConnection,
  317. IN HKEY hKey,
  318. IN DWORD dwIndex,
  319. IN OUT PWSTR pName,
  320. IN OUT PDWORD pcName,
  321. IN PDWORD pReserved,
  322. IN OUT PWSTR pClass,
  323. IN OUT OPTIONAL PDWORD pcClass,
  324. OUT OPTIONAL PFILETIME pftLastWriteTime
  325. )
  326. {
  327. return RegNtStatusToWin32Error(
  328. NtRegEnumKeyExW(
  329. hRegConnection,
  330. hKey,
  331. dwIndex,
  332. pName,
  333. pcName,
  334. pReserved,
  335. pClass,
  336. pcClass,
  337. pftLastWriteTime
  338. )
  339. );
  340. }
  341. REG_API
  342. DWORD
  343. RegEnumValueA(
  344. IN HANDLE hRegConnection,
  345. IN HKEY hKey,
  346. IN DWORD dwIndex,
  347. OUT PSTR pszValueName,
  348. IN OUT PDWORD pcchValueName,
  349. IN OPTIONAL PDWORD pReserved,
  350. OUT OPTIONAL PDWORD pdwType,
  351. OUT OPTIONAL PBYTE pData,
  352. IN OUT OPTIONAL PDWORD pcbData
  353. )
  354. {
  355. return RegNtStatusToWin32Error(
  356. NtRegEnumValueA(
  357. hRegConnection,
  358. hKey,
  359. dwIndex,
  360. pszValueName,
  361. pcchValueName,
  362. pReserved,
  363. pdwType,
  364. pData,
  365. pcbData)
  366. );
  367. }
  368. REG_API
  369. DWORD
  370. RegEnumValueW(
  371. IN HANDLE hRegConnection,
  372. IN HKEY hKey,
  373. IN DWORD dwIndex,
  374. OUT PWSTR pValueName,
  375. IN OUT PDWORD pcchValueName,
  376. IN PDWORD pReserved,
  377. OUT OPTIONAL PDWORD pType,
  378. OUT OPTIONAL PBYTE pData,
  379. IN OUT OPTIONAL PDWORD pcbData
  380. )
  381. {
  382. return RegNtStatusToWin32Error(
  383. NtRegEnumValueW(
  384. hRegConnection,
  385. hKey,
  386. dwIndex,
  387. pValueName,
  388. pcchValueName,
  389. pReserved,
  390. pType,
  391. pData,
  392. pcbData)
  393. );
  394. }
  395. REG_API
  396. DWORD
  397. RegGetValueA(
  398. IN HANDLE hRegConnection,
  399. IN HKEY hKey,
  400. IN OPTIONAL PCSTR pszSubKey,
  401. IN OPTIONAL PCSTR pszValueName,
  402. IN OPTIONAL REG_DATA_TYPE_FLAGS Flags,
  403. OUT OPTIONAL PDWORD pdwType,
  404. OUT OPTIONAL PVOID pvData,
  405. IN OUT OPTIONAL PDWORD pcbData
  406. )
  407. {
  408. return RegNtStatusToWin32Error(
  409. NtRegGetValueA(
  410. hRegConnection,
  411. hKey,
  412. pszSubKey,
  413. pszValueName,
  414. Flags,
  415. pdwType,
  416. pvData,
  417. pcbData)
  418. );
  419. }
  420. REG_API
  421. DWORD
  422. RegGetValueW(
  423. IN HANDLE hRegConnection,
  424. IN HKEY hKey,
  425. IN OPTIONAL PCWSTR pSubKey,
  426. IN OPTIONAL PCWSTR pValueName,
  427. IN OPTIONAL REG_DATA_TYPE_FLAGS Flags,
  428. OUT OPTIONAL PDWORD pdwType,
  429. OUT OPTIONAL PVOID pvData,
  430. IN OUT OPTIONAL PDWORD pcbData
  431. )
  432. {
  433. return RegNtStatusToWin32Error(
  434. NtRegGetValueW(
  435. hRegConnection,
  436. hKey,
  437. pSubKey,
  438. pValueName,
  439. Flags,
  440. pdwType,
  441. pvData,
  442. pcbData)
  443. );
  444. }
  445. REG_API
  446. DWORD
  447. RegOpenKeyExA(
  448. IN HANDLE hRegConnection,
  449. IN HKEY hKey,
  450. IN OPTIONAL PCSTR pszSubKey,
  451. IN DWORD ulOptions,
  452. IN ACCESS_MASK AccessDesired,
  453. OUT PHKEY phkResult
  454. )
  455. {
  456. return RegNtStatusToWin32Error(
  457. NtRegOpenKeyExA(
  458. hRegConnection,
  459. hKey,
  460. pszSubKey,
  461. ulOptions,
  462. AccessDesired,
  463. phkResult)
  464. );
  465. }
  466. REG_API
  467. DWORD
  468. RegOpenKeyExW(
  469. IN HANDLE hRegConnection,
  470. IN HKEY hKey,
  471. IN OPTIONAL PCWSTR pSubKey,
  472. IN DWORD ulOptions,
  473. IN ACCESS_MASK AccessDesired,
  474. OUT PHKEY phkResult
  475. )
  476. {
  477. return RegNtStatusToWin32Error(
  478. NtRegOpenKeyExW(
  479. hRegConnection,
  480. hKey,
  481. pSubKey,
  482. ulOptions,
  483. AccessDesired,
  484. phkResult)
  485. );
  486. }
  487. REG_API
  488. DWORD
  489. RegQueryInfoKeyA(
  490. IN HANDLE hRegConnection,
  491. IN HKEY hKey,
  492. OUT OPTIONAL PSTR pszClass,
  493. IN OUT OPTIONAL PDWORD pcClass,
  494. IN PDWORD pReserved,
  495. OUT OPTIONAL PDWORD pcSubKeys,
  496. OUT OPTIONAL PDWORD pcMaxSubKeyLen,
  497. OUT OPTIONAL PDWORD pcMaxClassLen,
  498. OUT OPTIONAL PDWORD pcValues,
  499. OUT OPTIONAL PDWORD pcMaxValueNameLen,
  500. OUT OPTIONAL PDWORD pcMaxValueLen,
  501. OUT OPTIONAL PULONG pulSecDescLen,
  502. OUT OPTIONAL PFILETIME pftLastWriteTime
  503. )
  504. {
  505. return RegNtStatusToWin32Error(
  506. NtRegQueryInfoKeyA(
  507. hRegConnection,
  508. hKey,
  509. pszClass,
  510. pcClass,
  511. pReserved,
  512. pcSubKeys,
  513. pcMaxSubKeyLen,
  514. pcMaxClassLen,
  515. pcValues,
  516. pcMaxValueNameLen,
  517. pcMaxValueLen,
  518. pulSecDescLen,
  519. pftLastWriteTime)
  520. );
  521. }
  522. REG_API
  523. DWORD
  524. RegQueryInfoKeyW(
  525. IN HANDLE hRegConnection,
  526. IN HKEY hKey,
  527. OUT PWSTR pClass,
  528. IN OUT OPTIONAL PDWORD pcClass,
  529. IN PDWORD pReserved,
  530. OUT OPTIONAL PDWORD pcSubKeys,
  531. OUT OPTIONAL PDWORD pcMaxSubKeyLen,
  532. OUT OPTIONAL PDWORD pcMaxClassLen,
  533. OUT OPTIONAL PDWORD pcValues,
  534. OUT OPTIONAL PDWORD pcMaxValueNameLen,
  535. OUT OPTIONAL PDWORD pcMaxValueLen,
  536. OUT OPTIONAL PULONG pulSecDescLen,
  537. OUT OPTIONAL PFILETIME pftLastWriteTime
  538. )
  539. {
  540. return RegNtStatusToWin32Error(
  541. NtRegQueryInfoKeyW(
  542. hRegConnection,
  543. hKey,
  544. pClass,
  545. pcClass,
  546. pReserved,
  547. pcSubKeys,
  548. pcMaxSubKeyLen,
  549. pcMaxClassLen,
  550. pcValues,
  551. pcMaxValueNameLen,
  552. pcMaxValueLen,
  553. pulSecDescLen,
  554. pftLastWriteTime)
  555. );
  556. }
  557. REG_API
  558. DWORD
  559. RegQueryMultipleValues(
  560. IN HANDLE hRegConnection,
  561. IN HKEY hKey,
  562. OUT PVALENT val_list,
  563. IN DWORD num_vals,
  564. OUT OPTIONAL PWSTR pValueBuf,
  565. IN OUT OPTIONAL PDWORD dwTotsize
  566. )
  567. {
  568. return RegNtStatusToWin32Error(
  569. NtRegQueryMultipleValues(
  570. hRegConnection,
  571. hKey,
  572. val_list,
  573. num_vals,
  574. pValueBuf,
  575. dwTotsize)
  576. );
  577. }
  578. REG_API
  579. DWORD
  580. RegQueryValueExA(
  581. IN HANDLE hRegConnection,
  582. IN HKEY hKey,
  583. IN OPTIONAL PCSTR pszValueName,
  584. IN PDWORD pReserved,
  585. OUT OPTIONAL PDWORD pType,
  586. OUT OPTIONAL PBYTE pData,
  587. IN OUT OPTIONAL PDWORD pcbData
  588. )
  589. {
  590. return RegNtStatusToWin32Error(
  591. NtRegQueryValueExA(
  592. hRegConnection,
  593. hKey,
  594. pszValueName,
  595. pReserved,
  596. pType,
  597. pData,
  598. pcbData)
  599. );
  600. }
  601. REG_API
  602. DWORD
  603. RegQueryValueExW(
  604. IN HANDLE hRegConnection,
  605. IN HKEY hKey,
  606. IN OPTIONAL PCWSTR pValueName,
  607. IN PDWORD pReserved,
  608. OUT OPTIONAL PDWORD pType,
  609. OUT OPTIONAL PBYTE pData,
  610. IN OUT OPTIONAL PDWORD pcbData
  611. )
  612. {
  613. return RegNtStatusToWin32Error(
  614. NtRegQueryValueExW(
  615. hRegConnection,
  616. hKey,
  617. pValueName,
  618. pReserved,
  619. pType,
  620. pData,
  621. pcbData)
  622. );
  623. }
  624. REG_API
  625. DWORD
  626. RegSetValueExA(
  627. IN HANDLE hRegConnection,
  628. IN HKEY hKey,
  629. IN OPTIONAL PCSTR pszValueName,
  630. IN DWORD Reserved,
  631. IN DWORD dwType,
  632. IN OPTIONAL const BYTE *pData,
  633. IN DWORD cbData
  634. )
  635. {
  636. return RegNtStatusToWin32Error(
  637. NtRegSetValueExA(
  638. hRegConnection,
  639. hKey,
  640. pszValueName,
  641. Reserved,
  642. dwType,
  643. pData,
  644. cbData)
  645. );
  646. }
  647. REG_API
  648. DWORD
  649. RegSetValueExW(
  650. IN HANDLE hRegConnection,
  651. IN HKEY hKey,
  652. IN OPTIONAL PCWSTR pValueName,
  653. IN DWORD Reserved,
  654. IN DWORD dwType,
  655. IN OPTIONAL const BYTE *pData,
  656. IN DWORD cbData
  657. )
  658. {
  659. return RegNtStatusToWin32Error(
  660. NtRegSetValueExW(
  661. hRegConnection,
  662. hKey,
  663. pValueName,
  664. Reserved,
  665. dwType,
  666. pData,
  667. cbData)
  668. );
  669. }
  670. REG_API
  671. DWORD
  672. RegSetKeySecurity(
  673. IN HANDLE hRegConnection,
  674. IN HKEY hKey,
  675. IN SECURITY_INFORMATION SecurityInformation,
  676. IN PSECURITY_DESCRIPTOR_RELATIVE pSecDescRel,
  677. IN ULONG ulSecDescLen
  678. )
  679. {
  680. return RegNtStatusToWin32Error(
  681. NtRegSetKeySecurity(
  682. hRegConnection,
  683. hKey,
  684. SecurityInformation,
  685. pSecDescRel,
  686. ulSecDescLen)
  687. );
  688. }
  689. REG_API
  690. DWORD
  691. RegGetKeySecurity(
  692. IN HANDLE hRegConnection,
  693. IN HKEY hKey,
  694. IN SECURITY_INFORMATION SecurityInformation,
  695. OUT OPTIONAL PSECURITY_DESCRIPTOR_RELATIVE pSecDescRel,
  696. IN OUT PULONG pulSecDescLen
  697. )
  698. {
  699. return RegNtStatusToWin32Error(
  700. NtRegGetKeySecurity(
  701. hRegConnection,
  702. hKey,
  703. SecurityInformation,
  704. pSecDescRel,
  705. pulSecDescLen)
  706. );
  707. }
  708. REG_API
  709. DWORD
  710. LwRegSetValueAttributesA(
  711. IN HANDLE hRegConnection,
  712. IN HKEY hKey,
  713. IN OPTIONAL PCSTR pszSubKey,
  714. IN PCSTR pszValueName,
  715. IN PLWREG_VALUE_ATTRIBUTES_A pValueAttributes
  716. )
  717. {
  718. return RegNtStatusToWin32Error(
  719. NtRegSetValueAttributesA(
  720. hRegConnection,
  721. hKey,
  722. pszSubKey,
  723. pszValueName,
  724. pValueAttributes
  725. )
  726. );
  727. }
  728. REG_API
  729. DWORD
  730. LwRegSetValueAttributesW(
  731. IN HANDLE hRegConnection,
  732. IN HKEY hKey,
  733. IN OPTIONAL PCWSTR pwszSubKey,
  734. IN PCWSTR pwszValueName,
  735. IN PLWREG_VALUE_ATTRIBUTES pValueAttributes
  736. )
  737. {
  738. return RegNtStatusToWin32Error(
  739. NtRegSetValueAttributesW(
  740. hRegConnection,
  741. hKey,
  742. pwszSubKey,
  743. pwszValueName,
  744. pValueAttributes
  745. )
  746. );
  747. }
  748. REG_API
  749. DWORD
  750. LwRegGetValueAttributesA(
  751. IN HANDLE hRegConnection,
  752. IN HKEY hKey,
  753. IN OPTIONAL PCSTR pszSubKey,
  754. IN PCSTR pszValueName,
  755. OUT OPTIONAL PLWREG_CURRENT_VALUEINFO* ppCurrentValue,
  756. OUT OPTIONAL PLWREG_VALUE_ATTRIBUTES_A* ppValueAttributes
  757. )
  758. {
  759. return RegNtStatusToWin32Error(
  760. NtRegGetValueAttributesA(
  761. hRegConnection,
  762. hKey,
  763. pszSubKey,
  764. pszValueName,
  765. ppCurrentValue,
  766. ppValueAttributes
  767. )
  768. );
  769. }
  770. REG_API
  771. DWORD
  772. LwRegGetValueAttributesW(
  773. IN HANDLE hRegConnection,
  774. IN HKEY hKey,
  775. IN OPTIONAL PCWSTR pwszSubKey,
  776. IN PCWSTR pwszValueName,
  777. OUT OPTIONAL PLWREG_CURRENT_VALUEINFO* ppCurrentValue,
  778. OUT OPTIONAL PLWREG_VALUE_ATTRIBUTES* ppValueAttributes
  779. )
  780. {
  781. return RegNtStatusToWin32Error(
  782. NtRegGetValueAttributesW(
  783. hRegConnection,
  784. hKey,
  785. pwszSubKey,
  786. pwszValueName,
  787. ppCurrentValue,
  788. ppValueAttributes
  789. )
  790. );
  791. }
  792. REG_API
  793. DWORD
  794. LwRegDeleteValueAttributesA(
  795. IN HANDLE hRegConnection,
  796. IN HKEY hKey,
  797. IN OPTIONAL PCSTR pszSubKey,
  798. IN PCSTR pszValueName
  799. )
  800. {
  801. return RegNtStatusToWin32Error(
  802. NtRegDeleteValueAttributesA(
  803. hRegConnection,
  804. hKey,
  805. pszSubKey,
  806. pszValueName
  807. )
  808. );
  809. }
  810. REG_API
  811. DWORD
  812. LwRegDeleteValueAttributesW(
  813. IN HANDLE hRegConnection,
  814. IN HKEY hKey,
  815. IN OPTIONAL PCWSTR pwszSubKey,
  816. IN PCWSTR pwszValueName
  817. )
  818. {
  819. return RegNtStatusToWin32Error(
  820. NtRegDeleteValueAttributesW(
  821. hRegConnection,
  822. hKey,
  823. pwszSubKey,
  824. pwszValueName
  825. )
  826. );
  827. }