1 /* $NetBSD: ntfs_compr.c,v 1.4 2008/01/29 18:21:10 pooka Exp $ */
4 * Copyright (c) 1998, 1999 Semen Ustimenko
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
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.
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
28 * Id: ntfs_compr.c,v 1.4 1999/05/12 09:42:54 semenu Exp
31 #include <sys/cdefs.h>
32 __KERNEL_RCSID(0, "$NetBSD: ntfs_compr.c,v 1.4 2008/01/29 18:21:10 pooka Exp $");
34 #include <sys/param.h>
35 #include <sys/systm.h>
36 #include <sys/namei.h>
38 #include <sys/kernel.h>
39 #include <sys/vnode.h>
40 #include <sys/mount.h>
43 #include <sys/malloc.h>
45 #include <miscfs/specfs/specdev.h>
47 #include <fs/ntfs/ntfs.h>
48 #include <fs/ntfs/ntfs_compr.h>
50 #define GET_UINT16(addr) (*((u_int16_t *)(addr)))
58 int len
, dshift
, lmask
;
63 len
= GET_UINT16(cbuf
) & 0xFFF;
64 dprintf(("ntfs_uncompblock: block length: %d + 3, 0x%x,0x%04x\n",
65 len
, len
, GET_UINT16(cbuf
)));
67 if (!(GET_UINT16(cbuf
) & 0x8000)) {
68 if ((len
+ 1) != NTFS_COMPBLOCK_SIZE
) {
69 dprintf(("ntfs_uncompblock: len: %x instead of %d\n",
72 memcpy(dbuf
, cbuf
+ 2, len
+ 1);
73 memset(dbuf
+ len
+ 1, 0, NTFS_COMPBLOCK_SIZE
- 1 - len
);
78 while ((cpos
< len
+ 3) && (pos
< NTFS_COMPBLOCK_SIZE
)) {
80 for (i
= 0; (i
< 8) && (pos
< NTFS_COMPBLOCK_SIZE
); i
++) {
82 for (j
= pos
- 1, lmask
= 0xFFF, dshift
= 12;
87 boff
= -1 - (GET_UINT16(cbuf
+ cpos
) >> dshift
);
88 blen
= 3 + (GET_UINT16(cbuf
+ cpos
) & lmask
);
89 for (j
= 0; (j
< blen
) && (pos
< NTFS_COMPBLOCK_SIZE
); j
++) {
90 dbuf
[pos
] = dbuf
[pos
+ boff
];
95 dbuf
[pos
++] = cbuf
[cpos
++];
105 struct ntfsmount
* ntmp
,
113 for (i
= 0; i
* NTFS_COMPBLOCK_SIZE
< ntfs_cntob(NTFS_COMPUNIT_CL
); i
++) {
114 new = ntfs_uncompblock(uup
+ i
* NTFS_COMPBLOCK_SIZE
, cup
+ off
);