Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
What's new
7
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Open sidebar
Steve Lhomme
VLC
Commits
051ce627
Commit
051ce627
authored
Jan 05, 2004
by
Jon Lech Johansen
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
* ./modules/demux/mp4: DRMS support.
parent
d7dce911
Changes
9
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
1703 additions
and
5 deletions
+1703
-5
AUTHORS
AUTHORS
+2
-1
modules/demux/mp4/Modules.am
modules/demux/mp4/Modules.am
+3
-0
modules/demux/mp4/drms.c
modules/demux/mp4/drms.c
+1014
-0
modules/demux/mp4/drms.h
modules/demux/mp4/drms.h
+39
-0
modules/demux/mp4/drmstables.h
modules/demux/mp4/drmstables.h
+448
-0
modules/demux/mp4/libmp4.c
modules/demux/mp4/libmp4.c
+169
-1
modules/demux/mp4/libmp4.h
modules/demux/mp4/libmp4.h
+10
-1
modules/demux/mp4/mp4.c
modules/demux/mp4/mp4.c
+15
-1
modules/demux/mp4/mp4.h
modules/demux/mp4/mp4.h
+3
-1
No files found.
AUTHORS
View file @
051ce627
# $Id: AUTHORS,v 1.10
0
2004/01/05 12:
24
:5
1
jlj Exp $
# $Id: AUTHORS,v 1.10
1
2004/01/05 12:
37
:5
2
jlj Exp $
#
# The format of this file was inspired by the Linux kernel CREDITS file.
# Authors are listed alphabetically.
...
...
@@ -198,6 +198,7 @@ D: Win32 DVD input port
D: QNX RTOS plug-in
D: MacOS X port
D: norwegian translation
D: MP4 DRMS support
S: France
N: Michel Kaempf
...
...
modules/demux/mp4/Modules.am
View file @
051ce627
...
...
@@ -3,4 +3,7 @@ SOURCES_mp4 = \
mp4.h \
libmp4.c \
libmp4.h \
drms.c \
drms.h \
drmstables.h \
$(NULL)
modules/demux/mp4/drms.c
0 → 100644
View file @
051ce627
/*****************************************************************************
* drms.c : DRMS
*****************************************************************************
* Copyright (C) 2004 VideoLAN
* $Id: drms.c,v 1.1 2004/01/05 12:37:52 jlj Exp $
*
* Author: Jon Lech Johansen <jon-vl@nanocrew.net>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
*****************************************************************************/
#include <stdlib.h>
/* malloc(), free() */
#include <vlc/vlc.h>
#ifdef WIN32
#include <tchar.h>
#include <shlobj.h>
#include <windows.h>
#endif
#include "drms.h"
#include "drmstables.h"
#define TAOS_INIT( tmp, i ) \
memset( tmp, 0, sizeof(tmp) ); \
tmp[ i + 0 ] = 0x67452301; \
tmp[ i + 1 ] = 0xEFCDAB89; \
tmp[ i + 2 ] = 0x98BADCFE; \
tmp[ i + 3 ] = 0x10325476;
#define ROR( x, n ) (((x) << (32-(n))) | ((x) >> (n)))
static
void
init_ctx
(
uint32_t
*
p_ctx
,
uint32_t
*
p_input
)
{
uint32_t
i
;
uint32_t
p_tmp
[
6
];
p_ctx
[
0
]
=
sizeof
(
*
p_input
);
memset
(
&
p_ctx
[
1
+
4
],
0
,
sizeof
(
*
p_input
)
*
4
);
memcpy
(
&
p_ctx
[
1
+
0
],
p_input
,
sizeof
(
*
p_input
)
*
4
);
p_tmp
[
0
]
=
p_ctx
[
1
+
3
];
for
(
i
=
0
;
i
<
sizeof
(
p_drms_tab1
)
/
sizeof
(
p_drms_tab1
[
0
]);
i
++
)
{
p_tmp
[
0
]
=
ROR
(
p_tmp
[
0
],
8
);
p_tmp
[
5
]
=
p_drms_tab2
[
(
p_tmp
[
0
]
>>
24
)
&
0xFF
]
^
ROR
(
p_drms_tab2
[
(
p_tmp
[
0
]
>>
16
)
&
0xFF
],
8
)
^
ROR
(
p_drms_tab2
[
(
p_tmp
[
0
]
>>
8
)
&
0xFF
],
16
)
^
ROR
(
p_drms_tab2
[
p_tmp
[
0
]
&
0xFF
],
24
)
^
p_drms_tab1
[
i
]
^
p_ctx
[
1
+
((
i
+
1
)
*
4
)
-
4
];
p_ctx
[
1
+
((
i
+
1
)
*
4
)
+
0
]
=
p_tmp
[
5
];
p_tmp
[
5
]
^=
p_ctx
[
1
+
((
i
+
1
)
*
4
)
-
3
];
p_ctx
[
1
+
((
i
+
1
)
*
4
)
+
1
]
=
p_tmp
[
5
];
p_tmp
[
5
]
^=
p_ctx
[
1
+
((
i
+
1
)
*
4
)
-
2
];
p_ctx
[
1
+
((
i
+
1
)
*
4
)
+
2
]
=
p_tmp
[
5
];
p_tmp
[
5
]
^=
p_ctx
[
1
+
((
i
+
1
)
*
4
)
-
1
];
p_ctx
[
1
+
((
i
+
1
)
*
4
)
+
3
]
=
p_tmp
[
5
];
p_tmp
[
0
]
=
p_tmp
[
5
];
}
memcpy
(
&
p_ctx
[
1
+
64
],
&
p_ctx
[
1
],
sizeof
(
*
p_ctx
)
*
4
);
for
(
i
=
4
;
i
<
sizeof
(
p_drms_tab1
);
i
++
)
{
p_tmp
[
2
]
=
p_ctx
[
1
+
4
+
(
i
-
4
)
];
p_tmp
[
0
]
=
(((
p_tmp
[
2
]
>>
7
)
&
0x01010101
)
*
27
)
^
((
p_tmp
[
2
]
&
0xFF7F7F7F
)
<<
1
);
p_tmp
[
1
]
=
(((
p_tmp
[
0
]
>>
7
)
&
0x01010101
)
*
27
)
^
((
p_tmp
[
0
]
&
0xFF7F7F7F
)
<<
1
);
p_tmp
[
4
]
=
(((
p_tmp
[
1
]
>>
7
)
&
0x01010101
)
*
27
)
^
((
p_tmp
[
1
]
&
0xFF7F7F7F
)
<<
1
);
p_tmp
[
2
]
^=
p_tmp
[
4
];
p_tmp
[
3
]
=
ROR
(
p_tmp
[
1
]
^
p_tmp
[
2
],
16
)
^
ROR
(
p_tmp
[
0
]
^
p_tmp
[
2
],
8
)
^
ROR
(
p_tmp
[
2
],
24
);
p_ctx
[
1
+
4
+
64
+
(
i
-
4
)
]
=
p_tmp
[
3
]
^
p_tmp
[
4
]
^
p_tmp
[
1
]
^
p_tmp
[
0
];
}
}
static
void
ctx_xor
(
uint32_t
*
p_ctx
,
uint32_t
*
p_in
,
uint32_t
*
p_out
,
uint32_t
p_table1
[
256
],
uint32_t
p_table2
[
256
]
)
{
uint32_t
i
,
x
,
y
;
uint32_t
p_tmp1
[
4
];
uint32_t
p_tmp2
[
4
];
i
=
p_ctx
[
0
]
*
4
;
p_tmp1
[
0
]
=
p_ctx
[
1
+
i
+
24
]
^
p_in
[
0
];
p_tmp1
[
1
]
=
p_ctx
[
1
+
i
+
25
]
^
p_in
[
1
];
p_tmp1
[
2
]
=
p_ctx
[
1
+
i
+
26
]
^
p_in
[
2
];
p_tmp1
[
3
]
=
p_ctx
[
1
+
i
+
27
]
^
p_in
[
3
];
i
+=
84
;
#define XOR_ROR( p_table, p_tmp, i_ctx ) \
p_table[ (p_tmp[ y > 2 ? y - 3 : y + 1 ] >> 24) & 0xFF ] \
^ ROR( p_table[ (p_tmp[ y > 1 ? y - 2 : y + 2 ] >> 16) & 0xFF ], 8 ) \
^ ROR( p_table[ (p_tmp[ y > 0 ? y - 1 : y + 3 ] >> 8) & 0xFF ], 16 ) \
^ ROR( p_table[ p_tmp[ y ] & 0xFF ], 24 ) \
^ p_ctx[ i_ctx ]
for
(
x
=
0
;
x
<
1
;
x
++
)
{
memcpy
(
p_tmp2
,
p_tmp1
,
sizeof
(
p_tmp1
)
);
for
(
y
=
0
;
y
<
4
;
y
++
)
{
p_tmp1
[
y
]
=
XOR_ROR
(
p_table1
,
p_tmp2
,
1
+
i
-
x
+
y
);
}
}
for
(
;
x
<
9
;
x
++
)
{
memcpy
(
p_tmp2
,
p_tmp1
,
sizeof
(
p_tmp1
)
);
for
(
y
=
0
;
y
<
4
;
y
++
)
{
p_tmp1
[
y
]
=
XOR_ROR
(
p_table1
,
p_tmp2
,
1
+
i
-
x
-
((
x
*
3
)
-
y
)
);
}
}
for
(
y
=
0
;
y
<
4
;
y
++
)
{
p_out
[
y
]
=
XOR_ROR
(
p_table2
,
p_tmp1
,
1
+
i
-
x
-
((
x
*
3
)
-
y
)
);
}
#undef XOR_ROR
}
static
void
taos
(
uint32_t
*
p_buffer
,
uint32_t
*
p_input
)
{
uint32_t
i
;
uint32_t
x
=
0
;
uint32_t
p_tmp1
[
4
];
uint32_t
p_tmp2
[
4
];
memcpy
(
p_tmp1
,
p_buffer
,
sizeof
(
p_tmp1
)
);
p_tmp2
[
0
]
=
((
~
p_tmp1
[
1
]
&
p_tmp1
[
3
])
|
(
p_tmp1
[
2
]
&
p_tmp1
[
1
]))
+
p_input
[
x
];
p_tmp1
[
0
]
=
p_tmp2
[
0
]
+
p_tmp1
[
0
]
+
p_drms_tab_taos
[
x
++
];
for
(
i
=
0
;
i
<
4
;
i
++
)
{
p_tmp2
[
0
]
=
((
p_tmp1
[
0
]
>>
0x19
)
|
(
p_tmp1
[
0
]
<<
0x7
))
+
p_tmp1
[
1
];
p_tmp2
[
1
]
=
((
~
p_tmp2
[
0
]
&
p_tmp1
[
2
])
|
(
p_tmp1
[
1
]
&
p_tmp2
[
0
]))
+
p_input
[
x
];
p_tmp2
[
1
]
+=
p_tmp1
[
3
]
+
p_drms_tab_taos
[
x
++
];
p_tmp1
[
3
]
=
((
p_tmp2
[
1
]
>>
0x14
)
|
(
p_tmp2
[
1
]
<<
0xC
))
+
p_tmp2
[
0
];
p_tmp2
[
1
]
=
((
~
p_tmp1
[
3
]
&
p_tmp1
[
1
])
|
(
p_tmp1
[
3
]
&
p_tmp2
[
0
]))
+
p_input
[
x
];
p_tmp2
[
1
]
+=
p_tmp1
[
2
]
+
p_drms_tab_taos
[
x
++
];
p_tmp1
[
2
]
=
((
p_tmp2
[
1
]
>>
0xF
)
|
(
p_tmp2
[
1
]
<<
0x11
))
+
p_tmp1
[
3
];
p_tmp2
[
1
]
=
((
~
p_tmp1
[
2
]
&
p_tmp2
[
0
])
|
(
p_tmp1
[
3
]
&
p_tmp1
[
2
]))
+
p_input
[
x
];
p_tmp2
[
2
]
=
p_tmp2
[
1
]
+
p_tmp1
[
1
]
+
p_drms_tab_taos
[
x
++
];
p_tmp1
[
1
]
=
((
p_tmp2
[
2
]
<<
0x16
)
|
(
p_tmp2
[
2
]
>>
0xA
))
+
p_tmp1
[
2
];
if
(
i
==
3
)
{
p_tmp2
[
1
]
=
((
~
p_tmp1
[
3
]
&
p_tmp1
[
2
])
|
(
p_tmp1
[
3
]
&
p_tmp1
[
1
]))
+
p_input
[
1
];
}
else
{
p_tmp2
[
1
]
=
((
~
p_tmp1
[
1
]
&
p_tmp1
[
3
])
|
(
p_tmp1
[
2
]
&
p_tmp1
[
1
]))
+
p_input
[
x
];
}
p_tmp1
[
0
]
=
p_tmp2
[
0
]
+
p_tmp2
[
1
]
+
p_drms_tab_taos
[
x
++
];
}
for
(
i
=
0
;
i
<
4
;
i
++
)
{
uint8_t
p_table
[
4
][
4
]
=
{
{
6
,
11
,
0
,
5
},
{
10
,
15
,
4
,
9
},
{
14
,
3
,
8
,
13
},
{
2
,
7
,
12
,
5
}
};
p_tmp2
[
0
]
=
((
p_tmp1
[
0
]
>>
0x1B
)
|
(
p_tmp1
[
0
]
<<
0x5
))
+
p_tmp1
[
1
];
p_tmp2
[
1
]
=
((
~
p_tmp1
[
2
]
&
p_tmp1
[
1
])
|
(
p_tmp1
[
2
]
&
p_tmp2
[
0
]))
+
p_input
[
p_table
[
i
][
0
]
];
p_tmp2
[
1
]
+=
p_tmp1
[
3
]
+
p_drms_tab_taos
[
x
++
];
p_tmp1
[
3
]
=
((
p_tmp2
[
1
]
>>
0x17
)
|
(
p_tmp2
[
1
]
<<
0x9
))
+
p_tmp2
[
0
];
p_tmp2
[
1
]
=
((
~
p_tmp1
[
1
]
&
p_tmp2
[
0
])
|
(
p_tmp1
[
3
]
&
p_tmp1
[
1
]))
+
p_input
[
p_table
[
i
][
1
]
];
p_tmp2
[
1
]
+=
p_tmp1
[
2
]
+
p_drms_tab_taos
[
x
++
];
p_tmp1
[
2
]
=
((
p_tmp2
[
1
]
>>
0x12
)
|
(
p_tmp2
[
1
]
<<
0xE
))
+
p_tmp1
[
3
];
p_tmp2
[
1
]
=
((
~
p_tmp2
[
0
]
&
p_tmp1
[
3
])
|
(
p_tmp1
[
2
]
&
p_tmp2
[
0
]))
+
p_input
[
p_table
[
i
][
2
]
];
p_tmp2
[
1
]
+=
p_tmp1
[
1
]
+
p_drms_tab_taos
[
x
++
];
p_tmp1
[
1
]
=
((
p_tmp2
[
1
]
<<
0x14
)
|
(
p_tmp2
[
1
]
>>
0xC
))
+
p_tmp1
[
2
];
if
(
i
==
3
)
{
p_tmp2
[
1
]
=
(
p_tmp1
[
3
]
^
p_tmp1
[
2
]
^
p_tmp1
[
1
])
+
p_input
[
p_table
[
i
][
3
]
];
}
else
{
p_tmp2
[
1
]
=
((
~
p_tmp1
[
3
]
&
p_tmp1
[
2
])
|
(
p_tmp1
[
3
]
&
p_tmp1
[
1
]))
+
p_input
[
p_table
[
i
][
3
]
];
}
p_tmp1
[
0
]
=
p_tmp2
[
0
]
+
p_tmp2
[
1
]
+
p_drms_tab_taos
[
x
++
];
}
for
(
i
=
0
;
i
<
4
;
i
++
)
{
uint8_t
p_table
[
4
][
4
]
=
{
{
8
,
11
,
14
,
1
},
{
4
,
7
,
10
,
13
},
{
0
,
3
,
6
,
9
},
{
12
,
15
,
2
,
0
}
};
p_tmp2
[
0
]
=
((
p_tmp1
[
0
]
>>
0x1C
)
|
(
p_tmp1
[
0
]
<<
0x4
))
+
p_tmp1
[
1
];
p_tmp2
[
1
]
=
(
p_tmp1
[
2
]
^
p_tmp1
[
1
]
^
p_tmp2
[
0
])
+
p_input
[
p_table
[
i
][
0
]
];
p_tmp2
[
1
]
+=
p_tmp1
[
3
]
+
p_drms_tab_taos
[
x
++
];
p_tmp1
[
3
]
=
((
p_tmp2
[
1
]
>>
0x15
)
|
(
p_tmp2
[
1
]
<<
0xB
))
+
p_tmp2
[
0
];
p_tmp2
[
1
]
=
(
p_tmp1
[
3
]
^
p_tmp1
[
1
]
^
p_tmp2
[
0
])
+
p_input
[
p_table
[
i
][
1
]
];
p_tmp2
[
1
]
+=
p_tmp1
[
2
]
+
p_drms_tab_taos
[
x
++
];
p_tmp1
[
2
]
=
((
p_tmp2
[
1
]
>>
0x10
)
|
(
p_tmp2
[
1
]
<<
0x10
))
+
p_tmp1
[
3
];
p_tmp2
[
1
]
=
(
p_tmp1
[
3
]
^
p_tmp1
[
2
]
^
p_tmp2
[
0
])
+
p_input
[
p_table
[
i
][
2
]
];
p_tmp2
[
1
]
+=
p_tmp1
[
1
]
+
p_drms_tab_taos
[
x
++
];
p_tmp1
[
1
]
=
((
p_tmp2
[
1
]
<<
0x17
)
|
(
p_tmp2
[
1
]
>>
0x9
))
+
p_tmp1
[
2
];
if
(
i
==
3
)
{
p_tmp2
[
1
]
=
((
~
p_tmp1
[
3
]
|
p_tmp1
[
1
])
^
p_tmp1
[
2
])
+
p_input
[
p_table
[
i
][
3
]
];
}
else
{
p_tmp2
[
1
]
=
(
p_tmp1
[
3
]
^
p_tmp1
[
2
]
^
p_tmp1
[
1
])
+
p_input
[
p_table
[
i
][
3
]
];
}
p_tmp1
[
0
]
=
p_tmp2
[
0
]
+
p_tmp2
[
1
]
+
p_drms_tab_taos
[
x
++
];
}
for
(
i
=
0
;
i
<
4
;
i
++
)
{
uint8_t
p_table
[
4
][
4
]
=
{
{
7
,
14
,
5
,
12
},
{
3
,
10
,
1
,
8
},
{
15
,
6
,
13
,
4
},
{
11
,
2
,
9
,
0
}
};
p_tmp2
[
0
]
=
((
p_tmp1
[
0
]
>>
0x1A
)
|
(
p_tmp1
[
0
]
<<
0x6
))
+
p_tmp1
[
1
];
p_tmp2
[
1
]
=
((
~
p_tmp1
[
2
]
|
p_tmp2
[
0
])
^
p_tmp1
[
1
])
+
p_input
[
p_table
[
i
][
0
]
];
p_tmp2
[
1
]
+=
p_tmp1
[
3
]
+
p_drms_tab_taos
[
x
++
];
p_tmp1
[
3
]
=
((
p_tmp2
[
1
]
>>
0x16
)
|
(
p_tmp2
[
1
]
<<
0xA
))
+
p_tmp2
[
0
];
p_tmp2
[
1
]
=
((
~
p_tmp1
[
1
]
|
p_tmp1
[
3
])
^
p_tmp2
[
0
])
+
p_input
[
p_table
[
i
][
1
]
];
p_tmp2
[
1
]
+=
p_tmp1
[
2
]
+
p_drms_tab_taos
[
x
++
];
p_tmp1
[
2
]
=
((
p_tmp2
[
1
]
>>
0x11
)
|
(
p_tmp2
[
1
]
<<
0xF
))
+
p_tmp1
[
3
];
p_tmp2
[
1
]
=
((
~
p_tmp2
[
0
]
|
p_tmp1
[
2
])
^
p_tmp1
[
3
])
+
p_input
[
p_table
[
i
][
2
]
];
p_tmp2
[
1
]
+=
p_tmp1
[
1
]
+
p_drms_tab_taos
[
x
++
];
p_tmp1
[
1
]
=
((
p_tmp2
[
1
]
<<
0x15
)
|
(
p_tmp2
[
1
]
>>
0xB
))
+
p_tmp1
[
2
];
if
(
i
<
3
)
{
p_tmp2
[
1
]
=
((
~
p_tmp1
[
3
]
|
p_tmp1
[
1
])
^
p_tmp1
[
2
])
+
p_input
[
p_table
[
i
][
3
]
];
p_tmp1
[
0
]
=
p_tmp2
[
0
]
+
p_tmp2
[
1
]
+
p_drms_tab_taos
[
x
++
];
}
}
p_buffer
[
0
]
+=
p_tmp2
[
0
];
p_buffer
[
1
]
+=
p_tmp1
[
1
];
p_buffer
[
2
]
+=
p_tmp1
[
2
];
p_buffer
[
3
]
+=
p_tmp1
[
3
];
}
static
void
taos_add1
(
uint32_t
*
p_buffer
,
uint8_t
*
p_in
,
uint32_t
i_len
)
{
uint32_t
i
;
uint32_t
x
,
y
;
uint32_t
p_tmp
[
16
];
uint32_t
i_offset
=
0
;
x
=
p_buffer
[
6
]
&
63
;
y
=
64
-
x
;
p_buffer
[
6
]
+=
i_len
;
if
(
i_len
<
y
)
{
memcpy
(
&
((
uint8_t
*
)
p_buffer
)[
48
+
x
],
p_in
,
i_len
);
}
else
{
if
(
x
)
{
memcpy
(
&
((
uint8_t
*
)
p_buffer
)[
48
+
x
],
p_in
,
y
);
taos
(
&
p_buffer
[
8
],
&
p_buffer
[
12
]
);
i_offset
=
y
;
i_len
-=
y
;
}
if
(
i_len
>=
64
)
{
for
(
i
=
0
;
i
<
i_len
/
64
;
i
++
)
{
memcpy
(
p_tmp
,
&
p_in
[
i_offset
],
sizeof
(
p_tmp
)
);
taos
(
&
p_buffer
[
8
],
p_tmp
);
i_offset
+=
64
;
i_len
-=
64
;
}
}
if
(
i_len
)
{
memcpy
(
&
p_buffer
[
12
],
&
p_in
[
i_offset
],
i_len
);
}
}
}
static
void
taos_end1
(
uint32_t
*
p_buffer
,
uint32_t
*
p_out
)
{
uint32_t
x
,
y
;
x
=
p_buffer
[
6
]
&
63
;
y
=
63
-
x
;
((
uint8_t
*
)
p_buffer
)[
48
+
x
++
]
=
128
;
if
(
y
<
8
)
{
memset
(
&
((
uint8_t
*
)
p_buffer
)[
48
+
x
],
0
,
y
);
taos
(
&
p_buffer
[
8
],
&
p_buffer
[
12
]
);
y
=
64
;
x
=
0
;
}
memset
(
&
((
uint8_t
*
)
p_buffer
)[
48
+
x
],
0
,
y
);
p_buffer
[
26
]
=
p_buffer
[
6
]
*
8
;
p_buffer
[
27
]
=
p_buffer
[
6
]
>>
29
;
taos
(
&
p_buffer
[
8
],
&
p_buffer
[
12
]
);
memcpy
(
p_out
,
&
p_buffer
[
8
],
sizeof
(
*
p_out
)
*
4
);
}
static
void
taos_add2
(
uint32_t
*
p_buffer
,
uint8_t
*
p_in
,
uint32_t
i_len
)
{
uint32_t
i
,
x
;
uint32_t
p_tmp
[
16
];
x
=
(
p_buffer
[
0
]
/
8
)
&
63
;
i
=
p_buffer
[
0
]
+
i_len
*
8
;
if
(
i
<
p_buffer
[
0
]
)
{
p_buffer
[
1
]
+=
1
;
}
p_buffer
[
0
]
=
i
;
p_buffer
[
1
]
+=
i_len
>>
29
;
for
(
i
=
0
;
i
<
i_len
;
i
++
)
{
((
uint8_t
*
)
p_buffer
)[
24
+
x
++
]
=
p_in
[
i
];
if
(
x
!=
64
)
continue
;
memcpy
(
p_tmp
,
&
p_buffer
[
6
],
sizeof
(
p_tmp
)
);
taos
(
&
p_buffer
[
2
],
p_tmp
);
}
}
static
void
taos_add2e
(
uint32_t
*
p_buffer
,
uint32_t
*
p_in
,
uint32_t
i_len
)
{
uint32_t
i
,
x
,
y
;
uint32_t
p_tmp
[
32
];
if
(
i_len
)
{
for
(
x
=
i_len
;
x
;
x
-=
y
)
{
y
=
x
>
32
?
32
:
x
;
for
(
i
=
0
;
i
<
y
;
i
++
)
{
p_tmp
[
i
]
=
U32_AT
(
&
p_in
[
i
]);
}
}
}
taos_add2
(
p_buffer
,
(
uint8_t
*
)
p_tmp
,
i_len
*
sizeof
(
p_tmp
[
0
])
);
}
static
void
taos_end2
(
uint32_t
*
p_buffer
)
{
uint32_t
x
;
uint32_t
p_tmp
[
16
];
p_tmp
[
14
]
=
p_buffer
[
0
];
p_tmp
[
15
]
=
p_buffer
[
1
];
x
=
(
p_buffer
[
0
]
/
8
)
&
63
;
taos_add2
(
p_buffer
,
p_drms_tab_tend
,
56
-
x
);
memcpy
(
p_tmp
,
&
p_buffer
[
6
],
56
);
taos
(
&
p_buffer
[
2
],
p_tmp
);
memcpy
(
&
p_buffer
[
22
],
&
p_buffer
[
2
],
sizeof
(
*
p_buffer
)
*
4
);
}
static
void
taos_add3
(
uint32_t
*
p_buffer
,
uint8_t
*
p_key
,
uint32_t
i_len
)
{
uint32_t
x
,
y
;
uint32_t
i
=
0
;
x
=
(
p_buffer
[
4
]
/
8
)
&
63
;
p_buffer
[
4
]
+=
i_len
*
8
;
if
(
p_buffer
[
4
]
<
i_len
*
8
)
p_buffer
[
5
]
+=
1
;
p_buffer
[
5
]
+=
i_len
>>
29
;
y
=
64
-
x
;
if
(
i_len
>=
y
)
{
memcpy
(
&
((
uint8_t
*
)
p_buffer
)[
24
+
x
],
p_key
,
y
);
taos
(
p_buffer
,
&
p_buffer
[
6
]
);
i
=
y
;
y
+=
63
;
if
(
y
<
i_len
)
{
for
(
;
y
<
i_len
;
y
+=
64
,
i
+=
64
)
{
taos
(
p_buffer
,
(
uint32_t
*
)
&
p_key
[
y
-
63
]
);
}
}
else
{
x
=
0
;
}
}
memcpy
(
&
((
uint8_t
*
)
p_buffer
)[
24
+
x
],
&
p_key
[
i
],
i_len
-
i
);
}
static
int
taos_osi
(
uint32_t
*
p_buffer
)
{
int
i_ret
=
0
;
#ifdef WIN32
HKEY
i_key
;
uint32_t
i
;
DWORD
i_size
;
DWORD
i_serial
;
LPBYTE
p_reg_buf
;
static
LPCTSTR
p_reg_keys
[
3
][
2
]
=
{
{
_T
(
"HARDWARE
\\
DESCRIPTION
\\
System"
),
_T
(
"SystemBiosVersion"
)
},
{
_T
(
"HARDWARE
\\
DESCRIPTION
\\
System
\\
CentralProcessor
\\
0"
),
_T
(
"ProcessorNameString"
)
},
{
_T
(
"SOFTWARE
\\
Microsoft
\\
Windows
\\
CurrentVersion"
),
_T
(
"ProductId"
)
}
};
taos_add1
(
p_buffer
,
"cache-control"
,
13
);
taos_add1
(
p_buffer
,
"Ethernet"
,
8
);
GetVolumeInformation
(
_T
(
"C:
\\
"
),
NULL
,
0
,
&
i_serial
,
NULL
,
NULL
,
NULL
,
0
);
taos_add1
(
p_buffer
,
(
uint8_t
*
)
&
i_serial
,
4
);
for
(
i
=
0
;
i
<
sizeof
(
p_reg_keys
)
/
sizeof
(
p_reg_keys
[
0
]);
i
++
)
{
if
(
RegOpenKeyEx
(
HKEY_LOCAL_MACHINE
,
p_reg_keys
[
i
][
0
],
0
,
KEY_READ
,
&
i_key
)
==
ERROR_SUCCESS
)
{
if
(
RegQueryValueEx
(
i_key
,
p_reg_keys
[
i
][
1
],
NULL
,
NULL
,
NULL
,
&
i_size
)
==
ERROR_SUCCESS
)
{
p_reg_buf
=
malloc
(
i_size
);
if
(
p_reg_buf
!=
NULL
)
{
if
(
RegQueryValueEx
(
i_key
,
p_reg_keys
[
i
][
1
],
NULL
,
NULL
,
p_reg_buf
,
&
i_size
)
==
ERROR_SUCCESS
)
{
taos_add1
(
p_buffer
,
(
uint8_t
*
)
p_reg_buf
,
i_size
);
}
free
(
p_reg_buf
);
}
}
RegCloseKey
(
i_key
);
}
}