diff --git a/hook/iobuf.c b/hook/iobuf.c index cdad287..d100274 100644 --- a/hook/iobuf.c +++ b/hook/iobuf.c @@ -124,6 +124,31 @@ HRESULT iobuf_read_be32(struct const_iobuf *src, uint32_t *out) return S_OK; } +HRESULT iobuf_read_be64(struct const_iobuf *src, uint64_t *out) +{ + uint64_t value; + + assert(src != NULL); + assert(out != NULL); + + if (src->pos + sizeof(uint64_t) > src->nbytes) { + return HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER); + } + + value = ((uint64_t) src->bytes[src->pos++]) << 56; + value |= ((uint64_t) src->bytes[src->pos++]) << 48; + value |= ((uint64_t) src->bytes[src->pos++]) << 40; + value |= ((uint64_t) src->bytes[src->pos++]) << 32; + value |= ((uint64_t) src->bytes[src->pos++]) << 24; + value |= ((uint64_t) src->bytes[src->pos++]) << 16; + value |= ((uint64_t) src->bytes[src->pos++]) << 8; + value |= ((uint64_t) src->bytes[src->pos++]); + + *out = value; + + return S_OK; +} + HRESULT iobuf_read_le16(struct const_iobuf *src, uint16_t *out) { uint16_t value; @@ -164,6 +189,31 @@ HRESULT iobuf_read_le32(struct const_iobuf *src, uint32_t *out) return S_OK; } +HRESULT iobuf_read_le64(struct const_iobuf *src, uint64_t *out) +{ + uint64_t value; + + assert(src != NULL); + assert(out != NULL); + + if (src->pos + sizeof(uint64_t) > src->nbytes) { + return HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER); + } + + value = ((uint64_t) src->bytes[src->pos++]); + value |= ((uint64_t) src->bytes[src->pos++]) << 8; + value |= ((uint64_t) src->bytes[src->pos++]) << 16; + value |= ((uint64_t) src->bytes[src->pos++]) << 24; + value |= ((uint64_t) src->bytes[src->pos++]) << 32; + value |= ((uint64_t) src->bytes[src->pos++]) << 40; + value |= ((uint64_t) src->bytes[src->pos++]) << 48; + value |= ((uint64_t) src->bytes[src->pos++]) << 56; + + *out = value; + + return S_OK; +} + HRESULT iobuf_write(struct iobuf *dest, const void *bytes, size_t nbytes) { assert(dest != NULL); @@ -222,6 +272,26 @@ HRESULT iobuf_write_be32(struct iobuf *dest, uint32_t value) return S_OK; } +HRESULT iobuf_write_be64(struct iobuf *dest, uint64_t value) +{ + assert(dest != NULL); + + if (dest->pos + sizeof(uint64_t) > dest->nbytes) { + return HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER); + } + + dest->bytes[dest->pos++] = value >> 56; + dest->bytes[dest->pos++] = value >> 48; + dest->bytes[dest->pos++] = value >> 40; + dest->bytes[dest->pos++] = value >> 32; + dest->bytes[dest->pos++] = value >> 24; + dest->bytes[dest->pos++] = value >> 16; + dest->bytes[dest->pos++] = value >> 8; + dest->bytes[dest->pos++] = value; + + return S_OK; +} + HRESULT iobuf_write_le16(struct iobuf *dest, uint16_t value) { assert(dest != NULL); @@ -251,3 +321,23 @@ HRESULT iobuf_write_le32(struct iobuf *dest, uint32_t value) return S_OK; } + +HRESULT iobuf_write_le64(struct iobuf *dest, uint64_t value) +{ + assert(dest != NULL); + + if (dest->pos + sizeof(uint64_t) > dest->nbytes) { + return HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER); + } + + dest->bytes[dest->pos++] = value; + dest->bytes[dest->pos++] = value >> 8; + dest->bytes[dest->pos++] = value >> 16; + dest->bytes[dest->pos++] = value >> 24; + dest->bytes[dest->pos++] = value >> 32; + dest->bytes[dest->pos++] = value >> 40; + dest->bytes[dest->pos++] = value >> 48; + dest->bytes[dest->pos++] = value >> 56; + + return S_OK; +} diff --git a/hook/iobuf.h b/hook/iobuf.h index 0a78ea5..02b726c 100644 --- a/hook/iobuf.h +++ b/hook/iobuf.h @@ -25,12 +25,16 @@ HRESULT iobuf_read(struct const_iobuf *src, void *bytes, size_t nbytes); HRESULT iobuf_read_8(struct const_iobuf *src, uint8_t *value); HRESULT iobuf_read_be16(struct const_iobuf *src, uint16_t *value); HRESULT iobuf_read_be32(struct const_iobuf *src, uint32_t *value); +HRESULT iobuf_read_be64(struct const_iobuf *src, uint64_t *value); HRESULT iobuf_read_le16(struct const_iobuf *src, uint16_t *value); HRESULT iobuf_read_le32(struct const_iobuf *src, uint32_t *value); +HRESULT iobuf_read_le64(struct const_iobuf *src, uint64_t *value); HRESULT iobuf_write(struct iobuf *dest, const void *bytes, size_t nbytes); HRESULT iobuf_write_8(struct iobuf *dest, uint8_t value); HRESULT iobuf_write_be16(struct iobuf *dest, uint16_t value); HRESULT iobuf_write_be32(struct iobuf *dest, uint32_t value); +HRESULT iobuf_write_be64(struct iobuf *dest, uint64_t value); HRESULT iobuf_write_le16(struct iobuf *dest, uint16_t value); HRESULT iobuf_write_le32(struct iobuf *dest, uint32_t value); +HRESULT iobuf_write_le64(struct iobuf *dest, uint64_t value);