ntfs_compr.c 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. /* $OpenBSD: ntfs_compr.c,v 1.7 2013/11/24 16:02:30 jsing Exp $ */
  2. /* $NetBSD: ntfs_compr.c,v 1.1 2002/12/23 17:38:31 jdolecek Exp $ */
  3. /*-
  4. * Copyright (c) 1998, 1999 Semen Ustimenko
  5. * All rights reserved.
  6. *
  7. * Redistribution and use in source and binary forms, with or without
  8. * modification, are permitted provided that the following conditions
  9. * are met:
  10. * 1. Redistributions of source code must retain the above copyright
  11. * notice, this list of conditions and the following disclaimer.
  12. * 2. Redistributions in binary form must reproduce the above copyright
  13. * notice, this list of conditions and the following disclaimer in the
  14. * documentation and/or other materials provided with the distribution.
  15. *
  16. * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
  17. * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  18. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  19. * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
  20. * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  21. * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  22. * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  23. * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  24. * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  25. * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  26. * SUCH DAMAGE.
  27. *
  28. * Id: ntfs_compr.c,v 1.4 1999/05/12 09:42:54 semenu Exp
  29. */
  30. #include <sys/param.h>
  31. #include <sys/systm.h>
  32. #include <sys/mount.h>
  33. #include <ntfs/ntfs.h>
  34. #include <ntfs/ntfs_compr.h>
  35. #define GET_UINT16(addr) (*((u_int16_t *)(addr)))
  36. int
  37. ntfs_uncompblock(u_int8_t *buf, u_int8_t *cbuf)
  38. {
  39. u_int32_t ctag;
  40. int len, dshift, lmask;
  41. int blen, boff;
  42. int i, j;
  43. int pos, cpos;
  44. len = GET_UINT16(cbuf) & 0xFFF;
  45. DPRINTF("ntfs_uncompblock: block length: %d + 3, 0x%x,0x%04x\n",
  46. len, len, GET_UINT16(cbuf));
  47. if (!(GET_UINT16(cbuf) & 0x8000)) {
  48. if ((len + 1) != NTFS_COMPBLOCK_SIZE) {
  49. DPRINTF("ntfs_uncompblock: len: %x instead of %d\n",
  50. len, 0xfff);
  51. }
  52. memcpy(buf, cbuf + 2, len + 1);
  53. bzero(buf + len + 1, NTFS_COMPBLOCK_SIZE - 1 - len);
  54. return (len + 3);
  55. }
  56. cpos = 2;
  57. pos = 0;
  58. while ((cpos < len + 3) && (pos < NTFS_COMPBLOCK_SIZE)) {
  59. ctag = cbuf[cpos++];
  60. for (i = 0; (i < 8) && (pos < NTFS_COMPBLOCK_SIZE); i++) {
  61. if (ctag & 1) {
  62. for (j = pos - 1, lmask = 0xFFF, dshift = 12;
  63. j >= 0x10; j >>= 1) {
  64. dshift--;
  65. lmask >>= 1;
  66. }
  67. boff = -1 - (GET_UINT16(cbuf + cpos) >> dshift);
  68. blen = 3 + (GET_UINT16(cbuf + cpos) & lmask);
  69. for (j = 0; (j < blen) &&
  70. (pos < NTFS_COMPBLOCK_SIZE); j++) {
  71. buf[pos] = buf[pos + boff];
  72. pos++;
  73. }
  74. cpos += 2;
  75. } else {
  76. buf[pos++] = cbuf[cpos++];
  77. }
  78. ctag >>= 1;
  79. }
  80. }
  81. return (len + 3);
  82. }
  83. int
  84. ntfs_uncompunit(struct ntfsmount *ntmp, u_int8_t *uup, u_int8_t *cup)
  85. {
  86. int i;
  87. int off = 0;
  88. int new;
  89. for (i = 0; i * NTFS_COMPBLOCK_SIZE < ntfs_cntob(NTFS_COMPUNIT_CL);
  90. i++) {
  91. new = ntfs_uncompblock(uup + i * NTFS_COMPBLOCK_SIZE,
  92. cup + off);
  93. if (new == 0)
  94. return (EINVAL);
  95. off += new;
  96. }
  97. return (0);
  98. }